// File: acliusBackHome[P]kamaya/dist/IR.cpp
// Function: IR::exprEmit(ParseExpression const&, ParseType const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, ParseTree&, unsigned long, unsigned long)
void IR::exprEmit(const ParseExpression &init_expr, const ParseType &this_type,
                  const string &symbol, ParseTree &tree, size_t node_id,
                  size_t scope_id) {
  if (init_expr.is_const()) {
    string arg1 = getConstValueStr(init_expr);
    string result = address2pointer(init_expr.get_address());
    if (scope_id == 0) {
      // 在静态数据段生成，字符串(TODO)也在此生成
      dataEmit(symbol, this_type.get_size(), arg1, node_id);
    } else {
      // 在栈中分配
      gen(":=", arg1, "_", result, node_id);
    }
  } else {
    ExpressionType exp_type = init_expr.get_expr_type();
    string op = "_", arg1 = "_", arg2 = "_", result = "_";
    switch (exp_type) {
    // 双目运算符
    case ExpressionType::E_ADD:
      op = "+";
      break;
    case ExpressionType::E_SUB:
      op = "-";
      break;
    case ExpressionType::E_MUL:
      op = "*";
      break;
    case ExpressionType::E_DIV:
      op = "/";
      break;
    case ExpressionType::E_MOD:
      op = "%";
      break;
    case ExpressionType::E_POW:
      op = "^";
      break;
    case ExpressionType::E_LOGIC_OR:
      op = "||";
      break;
    case ExpressionType::E_LOGIC_AND:
      op = "&&";
      break;
    case ExpressionType::E_G:
      op = ">";
      break;
    case ExpressionType::E_GE:
      op = ">=";
      break;
    case ExpressionType::E_EQUAL:
      op = "==";
      break;
    case ExpressionType::E_NE:
      op = "!=";
      break;
    case ExpressionType::E_L:
      op = "<";
      break;
    case ExpressionType::E_LE:
      op = "<=";
      break;
    case ExpressionType::E_GET_ITEM: {
      getItemEmit(init_expr, this_type, symbol, tree, node_id, scope_id);
      return;
    }
    default:
      break;
    }
    if (op != "_") {
      const ParseExpression &right =
          ParseExpression::get_expression(init_expr.get_child(1));
      if (right.is_const()) {
        arg2 = getConstValueStr(right);
      } else {
        arg2 = address2pointer(right.get_address());
      }
    }
    switch (exp_type) {
    case ExpressionType::E_VAR: {
      return;
    }
    case ExpressionType::E_FUN: {
      gen("call", "_", "_", (init_expr.get_functions()[0])->get_symbol(),
          node_id);
      gen(":=", "eax", "_", address2pointer(init_expr.get_address()), node_id);
      return;
    }
    case ExpressionType::E_NOT:
      op = "!";
      break;
    case ExpressionType::E_ASSIGN: {
      // 赋值表达式
      assignEmit(init_expr.get_child(0), init_expr.get_child(1));
      const ParseExpression &left =
          ParseExpression::get_expression(init_expr.get_child(0));
      const ParseExpression &right =
          ParseExpression::get_expression(init_expr.get_child(1));
      string arg1, result;
      result = address2pointer(left.get_address());
      if (right.is_const()) {
        arg1 = getConstValueStr(right);
      } else {
        arg1 = address2pointer(right.get_address());
      }
      gen(":=", arg1, "_", result, node_id);
      return;
    }
    case ExpressionType::E_UNDEFINED: // 应该不会跑到这里
      if (scope_id == 0) {
        dataUndefinedEmit(symbol, this_type.get_size(), node_id);
      }
      // 这个表达式非常特别
      return;
    default:

      break;
    }
    if (op != "_") {
      const ParseExpression &left =
          ParseExpression::get_expression(init_expr.get_child(0));
      if (left.is_const()) {
        arg1 = getConstValueStr(left);
      } else {
        arg1 = address2pointer(left.get_address());
      }
    }
    result = address2pointer(init_expr.get_address());
    if (op != "_") {
      gen(op, arg1, arg2, result, node_id);
    } else {
      throw ParseException(ExceptionCode::EX_NOT_IMPLEMENTED,
                           "other exp type " + to_string(exp_type));
    }
  }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x620, %rsp            # imm = 0x620
movq 0x10(%rbp), %rax
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq %r8, -0x28(%rbp)
movq %r9, -0x30(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x4a0(%rbp)
movq -0x10(%rbp), %rdi
callq 0x61790
testb $0x1, %al
jne 0x859a4
jmp 0x85b8b
movq -0x10(%rbp), %rsi
leaq -0x50(%rbp), %rdi
callq 0x84d60
movq -0x10(%rbp), %rdi
callq 0x61e00
movq %rax, -0x4a8(%rbp)
jmp 0x859c3
movq -0x4a8(%rbp), %rdx
movq -0x4a0(%rbp), %rsi
leaq -0x70(%rbp), %rdi
callq 0x180c0
jmp 0x859dc
cmpq $0x0, 0x10(%rbp)
jne 0x85a4b
movq -0x20(%rbp), %rax
movq %rax, -0x4b8(%rbp)
movq -0x18(%rbp), %rdi
callq 0x57260
movq %rax, -0x4b0(%rbp)
jmp 0x85a00
movq -0x4b0(%rbp), %rdx
movq -0x4b8(%rbp), %rsi
movq -0x4a0(%rbp), %rdi
movq -0x30(%rbp), %r8
leaq -0x50(%rbp), %rcx
callq 0x84ff0
jmp 0x85a24
jmp 0x85b5d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
jmp 0x85b7d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
jmp 0x85b74
leaq -0xa1(%rbp), %rdi
movq %rdi, -0x4c0(%rbp)
callq 0x45f0
movq -0x4c0(%rbp), %rdx
leaq 0x9908(%rip), %rsi      # 0x8f374
leaq -0xa0(%rbp), %rdi
callq 0x4450
jmp 0x85a7a
leaq -0xc9(%rbp), %rdi
movq %rdi, -0x4c8(%rbp)
callq 0x45f0
movq -0x4c8(%rbp), %rdx
leaq 0x9c1e(%rip), %rsi      # 0x8f6b9
leaq -0xc8(%rbp), %rdi
callq 0x4450
jmp 0x85aa9
movq -0x4a0(%rbp), %rdi
movq -0x30(%rbp), %r9
leaq -0xa0(%rbp), %rsi
leaq -0x50(%rbp), %rdx
leaq -0xc8(%rbp), %rcx
leaq -0x70(%rbp), %r8
callq 0x84430
jmp 0x85ad1
leaq -0xc8(%rbp), %rdi
callq 0x4688
leaq -0xc9(%rbp), %rdi
callq 0x4380
leaq -0xa0(%rbp), %rdi
callq 0x4688
leaq -0xa1(%rbp), %rdi
callq 0x4380
jmp 0x85b5d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
jmp 0x85b4f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
jmp 0x85b37
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
leaq -0xc8(%rbp), %rdi
callq 0x4688
leaq -0xc9(%rbp), %rdi
callq 0x4380
leaq -0xa0(%rbp), %rdi
callq 0x4688
leaq -0xa1(%rbp), %rdi
callq 0x4380
jmp 0x85b74
leaq -0x70(%rbp), %rdi
callq 0x4688
leaq -0x50(%rbp), %rdi
callq 0x4688
jmp 0x86aaf
leaq -0x70(%rbp), %rdi
callq 0x4688
leaq -0x50(%rbp), %rdi
callq 0x4688
jmp 0x86ab8
movq -0x10(%rbp), %rdi
callq 0x64ab0
movl %eax, -0xd0(%rbp)
leaq -0xf1(%rbp), %rdi
movq %rdi, -0x4d0(%rbp)
callq 0x45f0
movq -0x4d0(%rbp), %rdx
leaq 0x9afe(%rip), %rsi      # 0x8f6b9
leaq -0xf0(%rbp), %rdi
callq 0x4450
jmp 0x85bc9
leaq -0xf1(%rbp), %rdi
callq 0x4380
leaq -0x119(%rbp), %rdi
movq %rdi, -0x4d8(%rbp)
callq 0x45f0
movq -0x4d8(%rbp), %rdx
leaq 0x9ac3(%rip), %rsi      # 0x8f6b9
leaq -0x118(%rbp), %rdi
callq 0x4450
jmp 0x85c04
leaq -0x119(%rbp), %rdi
callq 0x4380
leaq -0x141(%rbp), %rdi
movq %rdi, -0x4e0(%rbp)
callq 0x45f0
movq -0x4e0(%rbp), %rdx
leaq 0x9a88(%rip), %rsi      # 0x8f6b9
leaq -0x140(%rbp), %rdi
callq 0x4450
jmp 0x85c3f
leaq -0x141(%rbp), %rdi
callq 0x4380
leaq -0x169(%rbp), %rdi
movq %rdi, -0x4e8(%rbp)
callq 0x45f0
movq -0x4e8(%rbp), %rdx
leaq 0x9a4d(%rip), %rsi      # 0x8f6b9
leaq -0x168(%rbp), %rdi
callq 0x4450
jmp 0x85c7a
leaq -0x169(%rbp), %rdi
callq 0x4380
movl -0xd0(%rbp), %eax
addl $-0x4, %eax
movl %eax, %ecx
movq %rcx, -0x4f0(%rbp)
subl $0x14, %eax
ja 0x85edb
movq -0x4f0(%rbp), %rax
leaq 0xbd29(%rip), %rcx      # 0x919d8
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
leaq -0xf1(%rbp), %rdi
callq 0x4380
jmp 0x86ab8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
leaq -0x119(%rbp), %rdi
callq 0x4380
jmp 0x86aa1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
leaq -0x141(%rbp), %rdi
callq 0x4380
jmp 0x86a95
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
leaq -0x169(%rbp), %rdi
callq 0x4380
jmp 0x86a89
leaq 0x814e(%rip), %rsi      # 0x8de81
leaq -0xf0(%rbp), %rdi
callq 0x4440
jmp 0x85d41
jmp 0x85edd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
jmp 0x86a7d
leaq 0xa4fa(%rip), %rsi      # 0x90258
leaq -0xf0(%rbp), %rdi
callq 0x4440
jmp 0x85d6c
jmp 0x85edd
leaq 0x95f6(%rip), %rsi      # 0x8f36e
leaq -0xf0(%rbp), %rdi
callq 0x4440
jmp 0x85d86
jmp 0x85edd
leaq 0x95de(%rip), %rsi      # 0x8f370
leaq -0xf0(%rbp), %rdi
callq 0x4440
jmp 0x85da0
jmp 0x85edd
leaq 0x95c6(%rip), %rsi      # 0x8f372
leaq -0xf0(%rbp), %rdi
callq 0x4440
jmp 0x85dba
jmp 0x85edd
leaq 0x79ad(%rip), %rsi      # 0x8d773
leaq -0xf0(%rbp), %rdi
callq 0x4440
jmp 0x85dd4
jmp 0x85edd
leaq 0x95aa(%rip), %rsi      # 0x8f38a
leaq -0xf0(%rbp), %rdi
callq 0x4440
jmp 0x85dee
jmp 0x85edd
leaq 0x958d(%rip), %rsi      # 0x8f387
leaq -0xf0(%rbp), %rdi
callq 0x4440
jmp 0x85e08
jmp 0x85edd
leaq 0x7160(%rip), %rsi      # 0x8cf74
leaq -0xf0(%rbp), %rdi
callq 0x4440
jmp 0x85e22
jmp 0x85edd
leaq 0x71f4(%rip), %rsi      # 0x8d022
leaq -0xf0(%rbp), %rdi
callq 0x4440
jmp 0x85e3c
jmp 0x85edd
leaq 0x71de(%rip), %rsi      # 0x8d026
leaq -0xf0(%rbp), %rdi
callq 0x4440
jmp 0x85e56
jmp 0x85edd
leaq 0x71c8(%rip), %rsi      # 0x8d02a
leaq -0xf0(%rbp), %rdi
callq 0x4440
jmp 0x85e70
jmp 0x85edd
leaq 0x719f(%rip), %rsi      # 0x8d018
leaq -0xf0(%rbp), %rdi
callq 0x4440
jmp 0x85e87
jmp 0x85edd
leaq 0x718b(%rip), %rsi      # 0x8d01b
leaq -0xf0(%rbp), %rdi
callq 0x4440
jmp 0x85e9e
jmp 0x85edd
movq -0x4a0(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x30(%rbp), %r9
movq 0x10(%rbp), %r10
movq %rsp, %rax
movq %r10, (%rax)
callq 0x85620
jmp 0x85ecc
movl $0x1, -0x170(%rbp)
jmp 0x86a3d
jmp 0x85edd
leaq 0x97d5(%rip), %rsi      # 0x8f6b9
leaq -0xf0(%rbp), %rdi
callq 0x81f10
movb %al, -0x4f1(%rbp)
jmp 0x85ef8
movb -0x4f1(%rbp), %al
testb $0x1, %al
jne 0x85f07
jmp 0x85fe9
movq -0x10(%rbp), %rdi
movl $0x1, %esi
callq 0x64230
movq %rax, -0x500(%rbp)
jmp 0x85f1e
movq -0x500(%rbp), %rdi
callq 0x60f30
movq %rax, -0x508(%rbp)
jmp 0x85f33
movq -0x508(%rbp), %rax
movq %rax, -0x178(%rbp)
movq -0x178(%rbp), %rdi
callq 0x61790
movb %al, -0x509(%rbp)
jmp 0x85f55
movb -0x509(%rbp), %al
testb $0x1, %al
jne 0x85f61
jmp 0x85f97
movq -0x178(%rbp), %rsi
leaq -0x198(%rbp), %rdi
callq 0x84d60
jmp 0x85f76
leaq -0x140(%rbp), %rdi
leaq -0x198(%rbp), %rsi
callq 0x43e0
leaq -0x198(%rbp), %rdi
callq 0x4688
jmp 0x85fe7
movq -0x178(%rbp), %rdi
callq 0x61e00
movq %rax, -0x518(%rbp)
jmp 0x85fac
movq -0x518(%rbp), %rdx
movq -0x4a0(%rbp), %rsi
leaq -0x1b8(%rbp), %rdi
callq 0x180c0
jmp 0x85fc8
leaq -0x140(%rbp), %rdi
leaq -0x1b8(%rbp), %rsi
callq 0x43e0
leaq -0x1b8(%rbp), %rdi
callq 0x4688
jmp 0x85fe9
movl -0xd0(%rbp), %eax
movq %rax, -0x520(%rbp)
subq $0x19, %rax
ja 0x86797
movq -0x520(%rbp), %rax
leaq 0xba1e(%rip), %rcx      # 0x91a2c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movl $0x1, -0x170(%rbp)
jmp 0x86a3d
leaq -0x1d9(%rbp), %rdi
movq %rdi, -0x528(%rbp)
callq 0x45f0
movq -0x528(%rbp), %rdx
leaq 0x99c4(%rip), %rsi      # 0x8fa0b
leaq -0x1d8(%rbp), %rdi
callq 0x4450
jmp 0x86055
leaq -0x201(%rbp), %rdi
movq %rdi, -0x530(%rbp)
callq 0x45f0
movq -0x530(%rbp), %rdx
leaq 0x9643(%rip), %rsi      # 0x8f6b9
leaq -0x200(%rbp), %rdi
callq 0x4450
jmp 0x86084
leaq -0x229(%rbp), %rdi
movq %rdi, -0x538(%rbp)
callq 0x45f0
movq -0x538(%rbp), %rdx
leaq 0x9614(%rip), %rsi      # 0x8f6b9
leaq -0x228(%rbp), %rdi
callq 0x4450
jmp 0x860b3
movq -0x10(%rbp), %rdi
callq 0x640e0
movq %rax, -0x540(%rbp)
jmp 0x860c5
movq -0x540(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x16550
movq (%rax), %rsi
leaq -0x250(%rbp), %rdi
callq 0x68bc0
jmp 0x860e6
movq -0x4a0(%rbp), %rdi
movq -0x30(%rbp), %r9
leaq -0x1d8(%rbp), %rsi
leaq -0x200(%rbp), %rdx
leaq -0x228(%rbp), %rcx
leaq -0x250(%rbp), %r8
callq 0x84430
jmp 0x86114
leaq -0x250(%rbp), %rdi
callq 0x4688
leaq -0x228(%rbp), %rdi
callq 0x4688
leaq -0x229(%rbp), %rdi
callq 0x4380
leaq -0x200(%rbp), %rdi
callq 0x4688
leaq -0x201(%rbp), %rdi
callq 0x4380
leaq -0x1d8(%rbp), %rdi
callq 0x4688
leaq -0x1d9(%rbp), %rdi
callq 0x4380
leaq -0x271(%rbp), %rdi
movq %rdi, -0x548(%rbp)
callq 0x45f0
movq -0x548(%rbp), %rdx
leaq 0x91eb(%rip), %rsi      # 0x8f374
leaq -0x270(%rbp), %rdi
callq 0x4450
jmp 0x86197
leaq -0x299(%rbp), %rdi
movq %rdi, -0x550(%rbp)
callq 0x45f0
movq -0x550(%rbp), %rdx
leaq 0xb68f(%rip), %rsi      # 0x91847
leaq -0x298(%rbp), %rdi
callq 0x4450
jmp 0x861c6
leaq -0x2c1(%rbp), %rdi
movq %rdi, -0x558(%rbp)
callq 0x45f0
movq -0x558(%rbp), %rdx
leaq 0x94d2(%rip), %rsi      # 0x8f6b9
leaq -0x2c0(%rbp), %rdi
callq 0x4450
jmp 0x861f5
movq -0x10(%rbp), %rdi
callq 0x61e00
movq %rax, -0x560(%rbp)
jmp 0x86207
movq -0x560(%rbp), %rdx
movq -0x4a0(%rbp), %rsi
leaq -0x2e8(%rbp), %rdi
callq 0x180c0
jmp 0x86223
movq -0x4a0(%rbp), %rdi
movq -0x30(%rbp), %r9
leaq -0x270(%rbp), %rsi
leaq -0x298(%rbp), %rdx
leaq -0x2c0(%rbp), %rcx
leaq -0x2e8(%rbp), %r8
callq 0x84430
jmp 0x86251
leaq -0x2e8(%rbp), %rdi
callq 0x4688
leaq -0x2c0(%rbp), %rdi
callq 0x4688
leaq -0x2c1(%rbp), %rdi
callq 0x4380
leaq -0x298(%rbp), %rdi
callq 0x4688
leaq -0x299(%rbp), %rdi
callq 0x4380
leaq -0x270(%rbp), %rdi
callq 0x4688
leaq -0x271(%rbp), %rdi
callq 0x4380
movl $0x1, -0x170(%rbp)
jmp 0x86a3d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
jmp 0x86340
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
jmp 0x86328
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
jmp 0x86310
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
jmp 0x86304
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
leaq -0x250(%rbp), %rdi
callq 0x4688
leaq -0x228(%rbp), %rdi
callq 0x4688
leaq -0x229(%rbp), %rdi
callq 0x4380
leaq -0x200(%rbp), %rdi
callq 0x4688
leaq -0x201(%rbp), %rdi
callq 0x4380
leaq -0x1d8(%rbp), %rdi
callq 0x4688
leaq -0x1d9(%rbp), %rdi
callq 0x4380
jmp 0x86a7d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
jmp 0x863dd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
jmp 0x863c5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
jmp 0x863ad
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
jmp 0x863a1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
leaq -0x2e8(%rbp), %rdi
callq 0x4688
leaq -0x2c0(%rbp), %rdi
callq 0x4688
leaq -0x2c1(%rbp), %rdi
callq 0x4380
leaq -0x298(%rbp), %rdi
callq 0x4688
leaq -0x299(%rbp), %rdi
callq 0x4380
leaq -0x270(%rbp), %rdi
callq 0x4688
leaq -0x271(%rbp), %rdi
callq 0x4380
jmp 0x86a7d
leaq 0x8f98(%rip), %rsi      # 0x8f38d
leaq -0xf0(%rbp), %rdi
callq 0x4440
jmp 0x86403
jmp 0x86799
movq -0x10(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x64230
movq %rax, -0x568(%rbp)
jmp 0x8641e
movq -0x10(%rbp), %rdi
movl $0x1, %esi
callq 0x64230
movq %rax, -0x570(%rbp)
jmp 0x86435
movq -0x570(%rbp), %rdx
movq -0x568(%rbp), %rsi
movq -0x4a0(%rbp), %rdi
callq 0x87bb0
jmp 0x86451
movq -0x10(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x64230
movq %rax, -0x578(%rbp)
jmp 0x86467
movq -0x578(%rbp), %rdi
callq 0x60f30
movq %rax, -0x580(%rbp)
jmp 0x8647c
movq -0x580(%rbp), %rax
movq %rax, -0x2f0(%rbp)
movq -0x10(%rbp), %rdi
movl $0x1, %esi
callq 0x64230
movq %rax, -0x588(%rbp)
jmp 0x864a1
movq -0x588(%rbp), %rdi
callq 0x60f30
movq %rax, -0x590(%rbp)
jmp 0x864b6
movq -0x590(%rbp), %rax
movq %rax, -0x2f8(%rbp)
leaq -0x318(%rbp), %rdi
callq 0x4460
leaq -0x338(%rbp), %rdi
callq 0x4460
movq -0x2f0(%rbp), %rdi
callq 0x61e00
movq %rax, -0x598(%rbp)
jmp 0x864f1
movq -0x598(%rbp), %rdx
movq -0x4a0(%rbp), %rsi
leaq -0x358(%rbp), %rdi
callq 0x180c0
jmp 0x8650d
leaq -0x338(%rbp), %rdi
leaq -0x358(%rbp), %rsi
movq %rsi, -0x5a8(%rbp)
callq 0x43e0
movq -0x5a8(%rbp), %rdi
callq 0x4688
movq -0x2f8(%rbp), %rdi
callq 0x61790
movb %al, -0x599(%rbp)
jmp 0x86547
movb -0x599(%rbp), %al
testb $0x1, %al
jne 0x86553
jmp 0x8659a
movq -0x2f8(%rbp), %rsi
leaq -0x378(%rbp), %rdi
callq 0x84d60
jmp 0x86568
leaq -0x318(%rbp), %rdi
leaq -0x378(%rbp), %rsi
callq 0x43e0
leaq -0x378(%rbp), %rdi
callq 0x4688
jmp 0x865ea
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
jmp 0x86725
movq -0x2f8(%rbp), %rdi
callq 0x61e00
movq %rax, -0x5b0(%rbp)
jmp 0x865af
movq -0x5b0(%rbp), %rdx
movq -0x4a0(%rbp), %rsi
leaq -0x398(%rbp), %rdi
callq 0x180c0
jmp 0x865cb
leaq -0x318(%rbp), %rdi
leaq -0x398(%rbp), %rsi
callq 0x43e0
leaq -0x398(%rbp), %rdi
callq 0x4688
leaq -0x3b9(%rbp), %rdi
movq %rdi, -0x5b8(%rbp)
callq 0x45f0
movq -0x5b8(%rbp), %rdx
leaq 0x8d69(%rip), %rsi      # 0x8f374
leaq -0x3b8(%rbp), %rdi
callq 0x4450
jmp 0x86619
leaq -0x3e1(%rbp), %rdi
movq %rdi, -0x5c0(%rbp)
callq 0x45f0
movq -0x5c0(%rbp), %rdx
leaq 0x907f(%rip), %rsi      # 0x8f6b9
leaq -0x3e0(%rbp), %rdi
callq 0x4450
jmp 0x86648
movq -0x4a0(%rbp), %rdi
movq -0x30(%rbp), %r9
leaq -0x3b8(%rbp), %rsi
leaq -0x318(%rbp), %rdx
leaq -0x3e0(%rbp), %rcx
leaq -0x338(%rbp), %r8
callq 0x84430
jmp 0x86676
leaq -0x3e0(%rbp), %rdi
callq 0x4688
leaq -0x3e1(%rbp), %rdi
callq 0x4380
leaq -0x3b8(%rbp), %rdi
callq 0x4688
leaq -0x3b9(%rbp), %rdi
callq 0x4380
movl $0x1, -0x170(%rbp)
leaq -0x338(%rbp), %rdi
callq 0x4688
leaq -0x318(%rbp), %rdi
callq 0x4688
jmp 0x86a3d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
jmp 0x86719
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
jmp 0x86701
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
leaq -0x3e0(%rbp), %rdi
callq 0x4688
leaq -0x3e1(%rbp), %rdi
callq 0x4380
leaq -0x3b8(%rbp), %rdi
callq 0x4688
leaq -0x3b9(%rbp), %rdi
callq 0x4380
leaq -0x338(%rbp), %rdi
callq 0x4688
leaq -0x318(%rbp), %rdi
callq 0x4688
jmp 0x86a7d
cmpq $0x0, 0x10(%rbp)
jne 0x86788
movq -0x20(%rbp), %rax
movq %rax, -0x5d0(%rbp)
movq -0x18(%rbp), %rdi
callq 0x57260
movq %rax, -0x5c8(%rbp)
jmp 0x86766
movq -0x5c8(%rbp), %rdx
movq -0x5d0(%rbp), %rsi
movq -0x4a0(%rbp), %rdi
movq -0x30(%rbp), %rcx
callq 0x85210
jmp 0x86786
jmp 0x86788
movl $0x1, -0x170(%rbp)
jmp 0x86a3d
jmp 0x86799
leaq 0x8f19(%rip), %rsi      # 0x8f6b9
leaq -0xf0(%rbp), %rdi
callq 0x81f10
movb %al, -0x5d1(%rbp)
jmp 0x867b4
movb -0x5d1(%rbp), %al
testb $0x1, %al
jne 0x867c3
jmp 0x868a4
movq -0x10(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x64230
movq %rax, -0x5e0(%rbp)
jmp 0x867d9
movq -0x5e0(%rbp), %rdi
callq 0x60f30
movq %rax, -0x5e8(%rbp)
jmp 0x867ee
movq -0x5e8(%rbp), %rax
movq %rax, -0x3f0(%rbp)
movq -0x3f0(%rbp), %rdi
callq 0x61790
movb %al, -0x5e9(%rbp)
jmp 0x86810
movb -0x5e9(%rbp), %al
testb $0x1, %al
jne 0x8681c
jmp 0x86852
movq -0x3f0(%rbp), %rsi
leaq -0x410(%rbp), %rdi
callq 0x84d60
jmp 0x86831
leaq -0x118(%rbp), %rdi
leaq -0x410(%rbp), %rsi
callq 0x43e0
leaq -0x410(%rbp), %rdi
callq 0x4688
jmp 0x868a2
movq -0x3f0(%rbp), %rdi
callq 0x61e00
movq %rax, -0x5f8(%rbp)
jmp 0x86867
movq -0x5f8(%rbp), %rdx
movq -0x4a0(%rbp), %rsi
leaq -0x430(%rbp), %rdi
callq 0x180c0
jmp 0x86883
leaq -0x118(%rbp), %rdi
leaq -0x430(%rbp), %rsi
callq 0x43e0
leaq -0x430(%rbp), %rdi
callq 0x4688
jmp 0x868a4
movq -0x10(%rbp), %rdi
callq 0x61e00
movq %rax, -0x600(%rbp)
jmp 0x868b6
movq -0x600(%rbp), %rdx
movq -0x4a0(%rbp), %rsi
leaq -0x450(%rbp), %rdi
callq 0x180c0
jmp 0x868d2
leaq -0x168(%rbp), %rdi
leaq -0x450(%rbp), %rsi
movq %rsi, -0x610(%rbp)
callq 0x43e0
movq -0x610(%rbp), %rdi
callq 0x4688
leaq 0x8dba(%rip), %rsi      # 0x8f6b9
leaq -0xf0(%rbp), %rdi
callq 0x81f10
movb %al, -0x601(%rbp)
jmp 0x86913
movb -0x601(%rbp), %al
testb $0x1, %al
jne 0x8691f
jmp 0x86952
movq -0x4a0(%rbp), %rdi
movq -0x30(%rbp), %r9
leaq -0xf0(%rbp), %rsi
leaq -0x118(%rbp), %rdx
leaq -0x140(%rbp), %rcx
leaq -0x168(%rbp), %r8
callq 0x84430
jmp 0x8694d
jmp 0x86a33
movb $0x1, -0x491(%rbp)
movl $0x28, %edi
callq 0x41c0
movq %rax, -0x618(%rbp)
movl -0xd0(%rbp), %esi
leaq -0x490(%rbp), %rdi
callq 0x15f20
jmp 0x8697e
leaq 0xb1f5(%rip), %rsi      # 0x91b7a
leaq -0x470(%rbp), %rdi
leaq -0x490(%rbp), %rdx
callq 0x15d60
jmp 0x8699a
movq -0x618(%rbp), %rdi
movl $0x13, %esi
leaq -0x470(%rbp), %rdx
callq 0x73a90
jmp 0x869b4
movq -0x618(%rbp), %rdi
movb $0x0, -0x491(%rbp)
leaq 0x3f387(%rip), %rsi     # 0xc5d50
leaq -0x70b40(%rip), %rdx    # 0x15e90
callq 0x45b0
jmp 0x86ac1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
jmp 0x86a1a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
jmp 0x86a0e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
leaq -0x470(%rbp), %rdi
callq 0x4688
leaq -0x490(%rbp), %rdi
callq 0x4688
testb $0x1, -0x491(%rbp)
jne 0x86a25
jmp 0x86a31
movq -0x618(%rbp), %rdi
callq 0x4280
jmp 0x86a7d
movl $0x0, -0x170(%rbp)
leaq -0x168(%rbp), %rdi
callq 0x4688
leaq -0x140(%rbp), %rdi
callq 0x4688
leaq -0x118(%rbp), %rdi
callq 0x4688
leaq -0xf0(%rbp), %rdi
callq 0x4688
movl -0x170(%rbp), %eax
testl %eax, %eax
je 0x86a7b
jmp 0x86a79
jmp 0x86aaf
jmp 0x86aaf
leaq -0x168(%rbp), %rdi
callq 0x4688
leaq -0x140(%rbp), %rdi
callq 0x4688
leaq -0x118(%rbp), %rdi
callq 0x4688
leaq -0xf0(%rbp), %rdi
callq 0x4688
jmp 0x86ab8
addq $0x620, %rsp            # imm = 0x620
popq %rbp
retq
movq -0x78(%rbp), %rdi
callq 0x45e0
nopw %cs:(%rax,%rax)