// File: Razakhel[P]RaZonogram/main.cpp
// Function: main
int main(int argc, char* argv[]) {
  Game game;
  Grid grid;

  if (argc == 2) {
    if (!grid.loadFromFile(argv[1]))
      std::cerr << "Error while opening the file." << std::endl;
  } else {
    std::cerr << "No input file provided, exiting." << std::endl;
    return 1;
  }

  std::cout << "Original grid:" << std::endl;
  std::cout << grid << std::endl;
  game.setGrid(grid);

  int choice = 0;

  do {
    std::cout << std::endl;
    std::cout << "1 - Play" << std::endl;
    std::cout << "2 - How to play" << std::endl;
    std::cout << "3 - Solve" << std::endl;
    std::cout << "4 - Quit" << std::endl;
    std::cin >> choice;

    if (choice == 1) { // Playing the game
      std::cout << "Implementation in progress." << std::endl;
      game.play();
    } else if (choice == 2) { // Printing the game explanations
      std::cout << "Implementation in progress." << std::endl;
    } else if (choice == 3) { // Solving the grid
      std::cout << "Solved grid:" << std::endl << grid.solve() << std::endl;
    } else if (choice == 4) { // Exiting the game
      std::cout << "Bye then!" << std::endl;
    } else { // Number entered nonexistant
      std::cout << "Wrong choice, try again." << std::endl;
    }
  } while (choice != 4);

  return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x190, %rsp            # imm = 0x190
movl $0x0, -0x4(%rbp)
movl %edi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
leaq -0x60(%rbp), %rdi
callq 0x2510
leaq -0xb0(%rbp), %rdi
callq 0x2750
jmp 0x8ac0
cmpl $0x2, -0x8(%rbp)
jne 0x8bfe
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x100(%rbp)
leaq -0xe1(%rbp), %rdi
movq %rdi, -0xf8(%rbp)
callq 0x2300
movq -0x100(%rbp), %rsi
movq -0xf8(%rbp), %rdx
leaq -0xe0(%rbp), %rdi
callq 0x8fa0
jmp 0x8b08
leaq -0xb0(%rbp), %rdi
leaq -0xe0(%rbp), %rsi
callq 0x2790
movb %al, -0x101(%rbp)
jmp 0x8b23
movb -0x101(%rbp), %al
xorb $-0x1, %al
movb %al, -0x102(%rbp)
leaq -0xe0(%rbp), %rdi
callq 0x2100
leaq -0xe1(%rbp), %rdi
callq 0x21e0
movb -0x102(%rbp), %al
testb $0x1, %al
jne 0x8b58
jmp 0x8bfc
movq 0xb491(%rip), %rdi      # 0x13ff0
leaq 0x45ac(%rip), %rsi      # 0xd112
callq 0x2190
movq %rax, -0x110(%rbp)
jmp 0x8b74
movq -0x110(%rbp), %rdi
movq 0xb436(%rip), %rsi      # 0x13fb8
callq 0x21c0
jmp 0x8b89
jmp 0x8bfc
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xb8(%rbp)
movl %eax, -0xbc(%rbp)
jmp 0x8f89
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xb8(%rbp)
movl %eax, -0xbc(%rbp)
jmp 0x8bd4
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xb8(%rbp)
movl %eax, -0xbc(%rbp)
leaq -0xe0(%rbp), %rdi
callq 0x2100
leaq -0xe1(%rbp), %rdi
callq 0x21e0
jmp 0x8f7d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xb8(%rbp)
movl %eax, -0xbc(%rbp)
jmp 0x8f7d
jmp 0x8c45
movq 0xb3eb(%rip), %rdi      # 0x13ff0
leaq 0x4524(%rip), %rsi      # 0xd130
callq 0x2190
movq %rax, -0x118(%rbp)
jmp 0x8c1a
movq -0x118(%rbp), %rdi
movq 0xb390(%rip), %rsi      # 0x13fb8
callq 0x21c0
jmp 0x8c2f
movl $0x1, -0x4(%rbp)
movl $0x1, -0xe8(%rbp)
jmp 0x8f5c
movq 0xb37c(%rip), %rdi      # 0x13fc8
leaq 0x44fe(%rip), %rsi      # 0xd151
callq 0x2190
movq %rax, -0x120(%rbp)
jmp 0x8c61
movq -0x120(%rbp), %rdi
movq 0xb349(%rip), %rsi      # 0x13fb8
callq 0x21c0
jmp 0x8c76
movq 0xb34b(%rip), %rdi      # 0x13fc8
leaq -0xb0(%rbp), %rsi
callq 0x34c0
movq %rax, -0x128(%rbp)
jmp 0x8c92
movq -0x128(%rbp), %rdi
movq 0xb318(%rip), %rsi      # 0x13fb8
callq 0x21c0
jmp 0x8ca7
leaq -0x60(%rbp), %rdi
leaq -0xb0(%rbp), %rsi
callq 0x9050
jmp 0x8cb9
movl $0x0, -0xec(%rbp)
movq 0xb2fe(%rip), %rdi      # 0x13fc8
movq 0xb2e7(%rip), %rsi      # 0x13fb8
callq 0x21c0
jmp 0x8cd8
movq 0xb2e9(%rip), %rdi      # 0x13fc8
leaq 0x447a(%rip), %rsi      # 0xd160
callq 0x2190
movq %rax, -0x130(%rbp)
jmp 0x8cf4
movq -0x130(%rbp), %rdi
movq 0xb2b6(%rip), %rsi      # 0x13fb8
callq 0x21c0
jmp 0x8d09
movq 0xb2b8(%rip), %rdi      # 0x13fc8
leaq 0x4452(%rip), %rsi      # 0xd169
callq 0x2190
movq %rax, -0x138(%rbp)
jmp 0x8d25
movq -0x138(%rbp), %rdi
movq 0xb285(%rip), %rsi      # 0x13fb8
callq 0x21c0
jmp 0x8d3a
movq 0xb287(%rip), %rdi      # 0x13fc8
leaq 0x4431(%rip), %rsi      # 0xd179
callq 0x2190
movq %rax, -0x140(%rbp)
jmp 0x8d56
movq -0x140(%rbp), %rdi
movq 0xb254(%rip), %rsi      # 0x13fb8
callq 0x21c0
jmp 0x8d6b
movq 0xb256(%rip), %rdi      # 0x13fc8
leaq 0x440a(%rip), %rsi      # 0xd183
callq 0x2190
movq %rax, -0x148(%rbp)
jmp 0x8d87
movq -0x148(%rbp), %rdi
movq 0xb223(%rip), %rsi      # 0x13fb8
callq 0x21c0
jmp 0x8d9c
movq 0xb235(%rip), %rdi      # 0x13fd8
leaq -0xec(%rbp), %rsi
callq 0x20f0
jmp 0x8db1
cmpl $0x1, -0xec(%rbp)
jne 0x8dfb
movq 0xb207(%rip), %rdi      # 0x13fc8
leaq 0x43c4(%rip), %rsi      # 0xd18c
callq 0x2190
movq %rax, -0x150(%rbp)
jmp 0x8dd6
movq -0x150(%rbp), %rdi
movq 0xb1d4(%rip), %rsi      # 0x13fb8
callq 0x21c0
jmp 0x8deb
leaq -0x60(%rbp), %rdi
callq 0x2530
jmp 0x8df6
jmp 0x8f3c
cmpl $0x2, -0xec(%rbp)
jne 0x8e3a
movq 0xb1bd(%rip), %rdi      # 0x13fc8
leaq 0x437a(%rip), %rsi      # 0xd18c
callq 0x2190
movq %rax, -0x158(%rbp)
jmp 0x8e20
movq -0x158(%rbp), %rdi
movq 0xb18a(%rip), %rsi      # 0x13fb8
callq 0x21c0
jmp 0x8e35
jmp 0x8f3a
cmpl $0x3, -0xec(%rbp)
jne 0x8ec7
movq 0xb17a(%rip), %rdi      # 0x13fc8
leaq 0x4353(%rip), %rsi      # 0xd1a8
callq 0x2190
movq %rax, -0x160(%rbp)
jmp 0x8e63
movq -0x160(%rbp), %rdi
movq 0xb147(%rip), %rsi      # 0x13fb8
callq 0x21c0
movq %rax, -0x168(%rbp)
jmp 0x8e7f
leaq -0xb0(%rbp), %rdi
callq 0x2e40
movq %rax, -0x170(%rbp)
jmp 0x8e94
movq -0x170(%rbp), %rsi
movq -0x168(%rbp), %rdi
callq 0x34c0
movq %rax, -0x178(%rbp)
jmp 0x8eb0
movq -0x178(%rbp), %rdi
movq 0xb0fa(%rip), %rsi      # 0x13fb8
callq 0x21c0
jmp 0x8ec5
jmp 0x8f38
cmpl $0x4, -0xec(%rbp)
jne 0x8f03
movq 0xb0f1(%rip), %rdi      # 0x13fc8
leaq 0x42d7(%rip), %rsi      # 0xd1b5
callq 0x2190
movq %rax, -0x180(%rbp)
jmp 0x8eec
movq -0x180(%rbp), %rdi
movq 0xb0be(%rip), %rsi      # 0x13fb8
callq 0x21c0
jmp 0x8f01
jmp 0x8f36
movq 0xb0be(%rip), %rdi      # 0x13fc8
leaq 0x42ae(%rip), %rsi      # 0xd1bf
callq 0x2190
movq %rax, -0x188(%rbp)
jmp 0x8f1f
movq -0x188(%rbp), %rdi
movq 0xb08b(%rip), %rsi      # 0x13fb8
callq 0x21c0
jmp 0x8f34
jmp 0x8f36
jmp 0x8f38
jmp 0x8f3a
jmp 0x8f3c
jmp 0x8f3e
cmpl $0x4, -0xec(%rbp)
jne 0x8cc3
movl $0x0, -0x4(%rbp)
movl $0x1, -0xe8(%rbp)
leaq -0xb0(%rbp), %rdi
callq 0x9080
leaq -0x60(%rbp), %rdi
callq 0x90c0
movl -0x4(%rbp), %eax
addq $0x190, %rsp            # imm = 0x190
popq %rbp
retq
leaq -0xb0(%rbp), %rdi
callq 0x9080
leaq -0x60(%rbp), %rdi
callq 0x90c0
movq -0xb8(%rbp), %rdi
callq 0x22f0
nop