// File: andrakis[P]alisp/eval_simple.cpp
// Function: ALisp::Eval::Simple::eval(ALisp::Cell const&, ALisp::Cell const&)
Cell eval(const Cell &_x, const Cell &_env) {
				Cell x = _x;
				Cell env = _env;
			recurse:
				switch (x.type()) {
					case CellType::Atom:
						return env.env()->get(x.atomId());
					case CellType::String:
					case CellType::Integer:
					case CellType::Float:
						return x;
				}
				if (x.empty()) return Nil;

				const Cell sym = x.head();
				if (sym.type() == CellType::Atom) {
					const AtomType id = sym.atomId();
					if (id == _quote) {				// (quote exp)
						return x.index(1);
					} else if (id == _if) {			// (if test conseq [alt])
						const Cell test = x.index(1);
						const Cell conseq = x.index(2);
						const Cell alt = x.index(3); // default: Nil
						const Cell result = eval(test, env);
						x = (result == False) ? alt : conseq;
						goto recurse;
					} else if (id == _define) {		// (define var exp) - create new variable
						AtomType newid = x.index(1).atomId();
						x = eval(x.index(2), env);
						env.env()->create(newid, x);
						return x;
					} else if (id == _set) {		// (set! var exp) - update existing variable
						AtomType newid = x.index(1).atomId();
						x = eval(x.index(2), env);
						env.env()->set(newid, x);
						return x;
					} else if (id == _lambda) {		// (lambda (var*) exp)
						LambdaCell lambda;
						lambda.lambda_ptr(env);
						lambda.lambda_args(x.index(1));
						lambda.lambda_body(x.index(2));
						return lambda;
					} else if (id == _macro) {		// (macro (var*) exp)
						MacroCell macro;
						macro.lambda_ptr(env);
						macro.lambda_args(x.index(1));
						macro.lambda_body(x.index(2));
						return macro;
					} else if (id == _begin) {		// (begin exp*)
						auto it = x.cbegin() + 1;
						for (; it != x.cend() - 1; ++it) {
							eval(*it, env);
						}
						x = *it;
						goto recurse;
					}
				}

				// (proc exp*)
				const Cell proc = eval(x.index(0), env);
				ListType exps;
				if (proc.type() == CellType::Macro) {
					const Cell tail = x.tail();
					exps = ListType(tail.cbegin(), tail.cend());
				}  else {
					// (map (tail x) (lambda (y) (eval y env)))
					for (auto it = x.cbegin() + 1; it != x.cend(); ++it)
						exps.push_back(eval(*it, env));
				}
				switch (proc.type()) {
					case CellType::Lambda: {
						EnvironmentType env_shared = std::make_shared<Environment>(proc.lambda_args(), exps, proc.lambda_ptr().env());
						env = EnvironmentCell(env_shared); // swap environments
						x = proc.lambda_body();
						goto recurse;
					}
					case CellType::Macro: {
						EnvironmentType env_shared = std::make_shared<Environment>(proc.lambda_args(), exps, proc.lambda_ptr().env());
						EnvironmentCell env2(env_shared); // short life
						x = eval(proc.lambda_body(), env2);
						// env2 should deallocate here
						goto recurse;
					}
					case CellType::Proc:
						return proc.proc()(exps);
					case CellType::ProcEnv:
						return proc.proc_env()(exps, env.env());
					default:
						throw Exception("Not an executable cell");
				}
			}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x3c0, %rsp            # imm = 0x3C0
movq %rdi, -0x2b8(%rbp)
movq %rdi, %rax
movq %rax, -0x2b0(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq -0x10(%rbp), %rsi
leaq -0x20(%rbp), %rdi
callq 0xb900
movq -0x18(%rbp), %rsi
leaq -0x28(%rbp), %rdi
callq 0xb900
jmp 0x270c4
jmp 0x270c6
leaq -0x20(%rbp), %rdi
callq 0xd3a0
movl %eax, -0x2bc(%rbp)
jmp 0x270d7
movl -0x2bc(%rbp), %eax
subl $0x1, %eax
je 0x2711d
jmp 0x270e4
movl -0x2bc(%rbp), %eax
addl $-0x2, %eax
subl $0x3, %eax
jb 0x27199
jmp 0x271b5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x282f9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x282f0
leaq -0x48(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0xb9f0
jmp 0x2712c
leaq -0x48(%rbp), %rdi
callq 0xba80
movq %rax, -0x2d0(%rbp)
leaq -0x20(%rbp), %rdi
callq 0xd430
movq %rax, -0x2c8(%rbp)
jmp 0x2714e
movq -0x2c8(%rbp), %rdx
movq -0x2d0(%rbp), %rsi
movq -0x2b8(%rbp), %rdi
callq 0x28310
jmp 0x2716a
leaq -0x48(%rbp), %rdi
callq 0xb8e0
movl $0x1, -0x4c(%rbp)
jmp 0x282ce
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x48(%rbp), %rdi
callq 0xb8e0
jmp 0x282f0
movq -0x2b8(%rbp), %rdi
leaq -0x20(%rbp), %rsi
callq 0xbd50
movl $0x1, -0x4c(%rbp)
jmp 0x282ce
leaq -0x20(%rbp), %rdi
callq 0x1bc10
movb %al, -0x2d1(%rbp)
jmp 0x271c6
movb -0x2d1(%rbp), %al
testb $0x1, %al
jne 0x271d2
jmp 0x271f3
movq -0x2b8(%rbp), %rdi
leaq 0x30978(%rip), %rsi     # 0x57b58
callq 0xb900
jmp 0x271e7
movl $0x1, -0x4c(%rbp)
jmp 0x282ce
leaq -0x58(%rbp), %rdi
leaq -0x20(%rbp), %rsi
callq 0x1baf0
jmp 0x27202
leaq -0x58(%rbp), %rdi
callq 0xd3a0
movl %eax, -0x2d8(%rbp)
jmp 0x27213
movl -0x2d8(%rbp), %eax
cmpl $0x1, %eax
jne 0x27a92
leaq -0x58(%rbp), %rdi
callq 0xd430
movq %rax, -0x2e0(%rbp)
jmp 0x27234
movq -0x2e0(%rbp), %rax
movq %rax, -0x60(%rbp)
movq -0x60(%rbp), %rax
leaq 0x3092e(%rip), %rcx     # 0x57b78
cmpq (%rcx), %rax
jne 0x27283
movq -0x2b8(%rbp), %rdi
leaq -0x20(%rbp), %rsi
movl $0x1, %edx
callq 0x1bda0
jmp 0x27266
movl $0x1, -0x4c(%rbp)
jmp 0x282ac
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x282c3
movq -0x60(%rbp), %rax
leaq 0x308e2(%rip), %rcx     # 0x57b70
cmpq (%rcx), %rax
jne 0x273c5
leaq -0x68(%rbp), %rdi
leaq -0x20(%rbp), %rsi
movl $0x1, %edx
callq 0x1bda0
jmp 0x272ab
leaq -0x70(%rbp), %rdi
leaq -0x20(%rbp), %rsi
movl $0x2, %edx
callq 0x1bda0
jmp 0x272bf
leaq -0x78(%rbp), %rdi
leaq -0x20(%rbp), %rsi
movl $0x3, %edx
callq 0x1bda0
jmp 0x272d3
leaq -0x80(%rbp), %rdi
leaq -0x68(%rbp), %rsi
leaq -0x28(%rbp), %rdx
callq 0x27080
jmp 0x272e6
leaq 0x3087b(%rip), %rsi     # 0x57b68
leaq -0x80(%rbp), %rdi
callq 0xbf80
movb %al, -0x2e1(%rbp)
jmp 0x272fe
movb -0x2e1(%rbp), %al
testb $0x1, %al
jne 0x2730a
jmp 0x27317
leaq -0x78(%rbp), %rax
movq %rax, -0x2f0(%rbp)
jmp 0x27324
leaq -0x70(%rbp), %rax
movq %rax, -0x2f0(%rbp)
jmp 0x27324
movq -0x2f0(%rbp), %rsi
leaq -0x20(%rbp), %rdi
callq 0xd650
jmp 0x27336
movl $0x2, -0x4c(%rbp)
leaq -0x80(%rbp), %rdi
callq 0xb9d0
leaq -0x78(%rbp), %rdi
callq 0xb9d0
leaq -0x70(%rbp), %rdi
callq 0xb9d0
leaq -0x68(%rbp), %rdi
callq 0xb9d0
jmp 0x282ac
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x273b7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x273ae
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x273a5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x80(%rbp), %rdi
callq 0xb9d0
leaq -0x78(%rbp), %rdi
callq 0xb9d0
leaq -0x70(%rbp), %rdi
callq 0xb9d0
leaq -0x68(%rbp), %rdi
callq 0xb9d0
jmp 0x282c3
movq -0x60(%rbp), %rax
leaq 0x307b0(%rip), %rcx     # 0x57b80
cmpq (%rcx), %rax
jne 0x27584
leaq -0x90(%rbp), %rdi
leaq -0x20(%rbp), %rsi
movl $0x1, %edx
callq 0x1bda0
jmp 0x273f0
leaq -0x90(%rbp), %rdi
callq 0xd430
movq %rax, -0x2f8(%rbp)
jmp 0x27405
leaq -0x90(%rbp), %rdi
callq 0xb9d0
movq -0x2f8(%rbp), %rax
movq %rax, -0x88(%rbp)
leaq -0xa0(%rbp), %rdi
leaq -0x20(%rbp), %rsi
movl $0x2, %edx
callq 0x1bda0
jmp 0x27436
leaq -0x98(%rbp), %rdi
leaq -0xa0(%rbp), %rsi
leaq -0x28(%rbp), %rdx
callq 0x27080
jmp 0x2744f
leaq -0x20(%rbp), %rdi
leaq -0x98(%rbp), %rsi
movq %rsi, -0x300(%rbp)
callq 0x13810
movq -0x300(%rbp), %rdi
callq 0xb9d0
leaq -0xa0(%rbp), %rdi
callq 0xb9d0
leaq -0xb0(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0xb9f0
jmp 0x27490
leaq -0xb0(%rbp), %rdi
callq 0xba80
movq %rax, -0x310(%rbp)
movq -0x88(%rbp), %rax
movq %rax, -0x308(%rbp)
leaq -0xb8(%rbp), %rdi
leaq -0x20(%rbp), %rsi
callq 0xb900
jmp 0x274c3
movq -0x308(%rbp), %rsi
movq -0x310(%rbp), %rdi
leaq -0xb8(%rbp), %rdx
callq 0xd3f0
jmp 0x274df
leaq -0xb8(%rbp), %rdi
callq 0xb9d0
leaq -0xb0(%rbp), %rdi
callq 0xb8e0
movq -0x2b8(%rbp), %rdi
leaq -0x20(%rbp), %rsi
callq 0xbd50
movl $0x1, -0x4c(%rbp)
jmp 0x282ac
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x90(%rbp), %rdi
callq 0xb9d0
jmp 0x282c3
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0xa0(%rbp), %rdi
callq 0xb9d0
jmp 0x282c3
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x27573
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0xb8(%rbp), %rdi
callq 0xb9d0
leaq -0xb0(%rbp), %rdi
callq 0xb8e0
jmp 0x282c3
movq -0x60(%rbp), %rax
leaq 0x305f9(%rip), %rcx     # 0x57b88
cmpq (%rcx), %rax
jne 0x27743
leaq -0xc8(%rbp), %rdi
leaq -0x20(%rbp), %rsi
movl $0x1, %edx
callq 0x1bda0
jmp 0x275af
leaq -0xc8(%rbp), %rdi
callq 0xd430
movq %rax, -0x318(%rbp)
jmp 0x275c4
leaq -0xc8(%rbp), %rdi
callq 0xb9d0
movq -0x318(%rbp), %rax
movq %rax, -0xc0(%rbp)
leaq -0xd8(%rbp), %rdi
leaq -0x20(%rbp), %rsi
movl $0x2, %edx
callq 0x1bda0
jmp 0x275f5
leaq -0xd0(%rbp), %rdi
leaq -0xd8(%rbp), %rsi
leaq -0x28(%rbp), %rdx
callq 0x27080
jmp 0x2760e
leaq -0x20(%rbp), %rdi
leaq -0xd0(%rbp), %rsi
movq %rsi, -0x320(%rbp)
callq 0x13810
movq -0x320(%rbp), %rdi
callq 0xb9d0
leaq -0xd8(%rbp), %rdi
callq 0xb9d0
leaq -0xe8(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0xb9f0
jmp 0x2764f
leaq -0xe8(%rbp), %rdi
callq 0xba80
movq %rax, -0x330(%rbp)
movq -0xc0(%rbp), %rax
movq %rax, -0x328(%rbp)
leaq -0xf0(%rbp), %rdi
leaq -0x20(%rbp), %rsi
callq 0xb900
jmp 0x27682
movq -0x328(%rbp), %rsi
movq -0x330(%rbp), %rdi
leaq -0xf0(%rbp), %rdx
callq 0x28460
jmp 0x2769e
leaq -0xf0(%rbp), %rdi
callq 0xb9d0
leaq -0xe8(%rbp), %rdi
callq 0xb8e0
movq -0x2b8(%rbp), %rdi
leaq -0x20(%rbp), %rsi
callq 0xbd50
movl $0x1, -0x4c(%rbp)
jmp 0x282ac
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0xc8(%rbp), %rdi
callq 0xb9d0
jmp 0x282c3
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0xd8(%rbp), %rdi
callq 0xb9d0
jmp 0x282c3
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x27732
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0xf0(%rbp), %rdi
callq 0xb9d0
leaq -0xe8(%rbp), %rdi
callq 0xb8e0
jmp 0x282c3
movq -0x60(%rbp), %rax
leaq 0x30442(%rip), %rcx     # 0x57b90
cmpq (%rcx), %rax
jne 0x27863
leaq -0xf8(%rbp), %rdi
callq 0x285e0
jmp 0x27765
leaq -0xf8(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0x1bed0
jmp 0x27777
leaq -0x100(%rbp), %rdi
leaq -0x20(%rbp), %rsi
movl $0x1, %edx
callq 0x1bda0
jmp 0x2778e
leaq -0xf8(%rbp), %rdi
leaq -0x100(%rbp), %rsi
callq 0x1bfd0
jmp 0x277a3
leaq -0x100(%rbp), %rdi
callq 0xb9d0
leaq -0x108(%rbp), %rdi
leaq -0x20(%rbp), %rsi
movl $0x2, %edx
callq 0x1bda0
jmp 0x277c6
leaq -0xf8(%rbp), %rdi
leaq -0x108(%rbp), %rsi
callq 0x1c0d0
jmp 0x277db
leaq -0x108(%rbp), %rdi
callq 0xb9d0
movq -0x2b8(%rbp), %rdi
leaq -0xf8(%rbp), %rsi
callq 0xbd50
movl $0x1, -0x4c(%rbp)
leaq -0xf8(%rbp), %rdi
callq 0x28630
jmp 0x282ac
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x27852
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x100(%rbp), %rdi
callq 0xb9d0
jmp 0x27852
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x108(%rbp), %rdi
callq 0xb9d0
leaq -0xf8(%rbp), %rdi
callq 0x28630
jmp 0x282c3
movq -0x60(%rbp), %rax
leaq 0x3032a(%rip), %rcx     # 0x57b98
cmpq (%rcx), %rax
jne 0x27983
leaq -0x110(%rbp), %rdi
callq 0x28650
jmp 0x27885
leaq -0x110(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0x1bed0
jmp 0x27897
leaq -0x118(%rbp), %rdi
leaq -0x20(%rbp), %rsi
movl $0x1, %edx
callq 0x1bda0
jmp 0x278ae
leaq -0x110(%rbp), %rdi
leaq -0x118(%rbp), %rsi
callq 0x1bfd0
jmp 0x278c3
leaq -0x118(%rbp), %rdi
callq 0xb9d0
leaq -0x120(%rbp), %rdi
leaq -0x20(%rbp), %rsi
movl $0x2, %edx
callq 0x1bda0
jmp 0x278e6
leaq -0x110(%rbp), %rdi
leaq -0x120(%rbp), %rsi
callq 0x1c0d0
jmp 0x278fb
leaq -0x120(%rbp), %rdi
callq 0xb9d0
movq -0x2b8(%rbp), %rdi
leaq -0x110(%rbp), %rsi
callq 0xbd50
movl $0x1, -0x4c(%rbp)
leaq -0x110(%rbp), %rdi
callq 0x286a0
jmp 0x282ac
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x27972
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x118(%rbp), %rdi
callq 0xb9d0
jmp 0x27972
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x120(%rbp), %rdi
callq 0xb9d0
leaq -0x110(%rbp), %rdi
callq 0x286a0
jmp 0x282c3
movq -0x60(%rbp), %rax
leaq 0x30212(%rip), %rcx     # 0x57ba0
cmpq (%rcx), %rax
jne 0x27a84
leaq -0x20(%rbp), %rdi
callq 0x139a0
movq %rax, -0x338(%rbp)
jmp 0x279a9
movq -0x338(%rbp), %rax
movq %rax, -0x130(%rbp)
leaq -0x130(%rbp), %rdi
movl $0x1, %esi
callq 0x15050
movq %rax, -0x128(%rbp)
leaq -0x20(%rbp), %rdi
callq 0x13ac0
movq %rax, -0x340(%rbp)
jmp 0x279e1
movq -0x340(%rbp), %rax
movq %rax, -0x140(%rbp)
leaq -0x140(%rbp), %rdi
movl $0x1, %esi
callq 0x286c0
movq %rax, -0x138(%rbp)
leaq -0x128(%rbp), %rdi
leaq -0x138(%rbp), %rsi
callq 0x12d80
testb $0x1, %al
jne 0x27a20
jmp 0x27a5e
leaq -0x128(%rbp), %rdi
callq 0x12df0
movq %rax, %rsi
leaq -0x148(%rbp), %rdi
leaq -0x28(%rbp), %rdx
callq 0x27080
jmp 0x27a41
leaq -0x148(%rbp), %rdi
callq 0xb9d0
leaq -0x128(%rbp), %rdi
callq 0x12e10
jmp 0x279cf
leaq -0x128(%rbp), %rdi
callq 0x12df0
movq %rax, %rsi
leaq -0x20(%rbp), %rdi
callq 0xd650
jmp 0x27a78
movl $0x2, -0x4c(%rbp)
jmp 0x282ac
jmp 0x27a86
jmp 0x27a88
jmp 0x27a8a
jmp 0x27a8c
jmp 0x27a8e
jmp 0x27a90
jmp 0x27a92
xorl %eax, %eax
movl %eax, %edx
leaq -0x158(%rbp), %rdi
leaq -0x20(%rbp), %rsi
callq 0x1bda0
jmp 0x27aa8
leaq -0x150(%rbp), %rdi
leaq -0x158(%rbp), %rsi
leaq -0x28(%rbp), %rdx
callq 0x27080
jmp 0x27ac1
leaq -0x158(%rbp), %rdi
callq 0xb9d0
leaq -0x170(%rbp), %rdi
callq 0xc080
leaq -0x150(%rbp), %rdi
callq 0xd3a0
movl %eax, -0x344(%rbp)
jmp 0x27aed
movl -0x344(%rbp), %eax
cmpl $0x7, %eax
jne 0x27c2b
leaq -0x178(%rbp), %rdi
leaq -0x20(%rbp), %rsi
callq 0x1bb80
jmp 0x27b0e
leaq -0x178(%rbp), %rdi
callq 0x139a0
movq %rax, -0x350(%rbp)
jmp 0x27b23
movq -0x350(%rbp), %rax
movq %rax, -0x198(%rbp)
leaq -0x178(%rbp), %rdi
callq 0x13ac0
movq %rax, -0x358(%rbp)
jmp 0x27b46
movq -0x358(%rbp), %rax
movq %rax, -0x1a0(%rbp)
leaq -0x1a1(%rbp), %rdi
movq %rdi, -0x360(%rbp)
callq 0x13010
movq -0x360(%rbp), %rcx
movq -0x198(%rbp), %rsi
movq -0x1a0(%rbp), %rdx
leaq -0x190(%rbp), %rdi
callq 0x13030
jmp 0x27b8a
leaq -0x170(%rbp), %rdi
leaq -0x190(%rbp), %rsi
callq 0x28700
leaq -0x190(%rbp), %rdi
callq 0xc130
leaq -0x1a1(%rbp), %rdi
callq 0x12ac0
leaq -0x178(%rbp), %rdi
callq 0xb9d0
jmp 0x27d0e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x158(%rbp), %rdi
callq 0xb9d0
jmp 0x282c3
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x28292
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x27c1a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x1a1(%rbp), %rdi
callq 0x12ac0
leaq -0x178(%rbp), %rdi
callq 0xb9d0
jmp 0x28292
leaq -0x20(%rbp), %rdi
callq 0x139a0
movq %rax, -0x368(%rbp)
jmp 0x27c3d
movq -0x368(%rbp), %rax
movq %rax, -0x1b8(%rbp)
leaq -0x1b8(%rbp), %rdi
movl $0x1, %esi
callq 0x15050
movq %rax, -0x1b0(%rbp)
leaq -0x20(%rbp), %rdi
callq 0x13ac0
movq %rax, -0x370(%rbp)
jmp 0x27c75
movq -0x370(%rbp), %rax
movq %rax, -0x1c0(%rbp)
leaq -0x1b0(%rbp), %rdi
leaq -0x1c0(%rbp), %rsi
callq 0x12d80
testb $0x1, %al
jne 0x27c9c
jmp 0x27d0c
leaq -0x1b0(%rbp), %rdi
callq 0x12df0
movq %rax, %rsi
leaq -0x1c8(%rbp), %rdi
leaq -0x28(%rbp), %rdx
callq 0x27080
jmp 0x27cbd
leaq -0x170(%rbp), %rdi
leaq -0x1c8(%rbp), %rsi
callq 0xc370
jmp 0x27cd2
leaq -0x1c8(%rbp), %rdi
callq 0xb9d0
leaq -0x1b0(%rbp), %rdi
callq 0x12e10
jmp 0x27c63
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x1c8(%rbp), %rdi
callq 0xb9d0
jmp 0x28292
jmp 0x27d0e
leaq -0x150(%rbp), %rdi
callq 0xd3a0
movl %eax, -0x374(%rbp)
jmp 0x27d22
movl -0x374(%rbp), %eax
addl $-0x6, %eax
movl %eax, %ecx
movq %rcx, -0x380(%rbp)
subl $0x3, %eax
ja 0x281ab
movq -0x380(%rbp), %rax
leaq 0x158dd(%rip), %rcx     # 0x3d628
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
leaq -0x1e0(%rbp), %rdi
leaq -0x150(%rbp), %rsi
callq 0x1bf40
jmp 0x27d69
leaq -0x1f8(%rbp), %rdi
leaq -0x150(%rbp), %rsi
callq 0x1be40
jmp 0x27d7e
leaq -0x1f0(%rbp), %rdi
leaq -0x1f8(%rbp), %rsi
callq 0xb9f0
jmp 0x27d93
leaq -0x1d8(%rbp), %rdi
leaq -0x1e0(%rbp), %rsi
leaq -0x170(%rbp), %rdx
leaq -0x1f0(%rbp), %rcx
callq 0x28730
jmp 0x27db6
leaq -0x1f0(%rbp), %rdi
callq 0xb8e0
leaq -0x1f8(%rbp), %rdi
callq 0xb9d0
leaq -0x1e0(%rbp), %rdi
callq 0xb9d0
leaq -0x210(%rbp), %rdi
movq %rdi, -0x388(%rbp)
leaq -0x1d8(%rbp), %rsi
callq 0xf830
movq -0x388(%rbp), %rsi
leaq -0x200(%rbp), %rdi
callq 0xb880
jmp 0x27e09
leaq -0x28(%rbp), %rdi
leaq -0x200(%rbp), %rsi
movq %rsi, -0x390(%rbp)
callq 0x13810
movq -0x390(%rbp), %rdi
callq 0xc060
leaq -0x210(%rbp), %rdi
callq 0xb8e0
leaq -0x218(%rbp), %rdi
leaq -0x150(%rbp), %rsi
callq 0x1c040
jmp 0x27e4d
leaq -0x20(%rbp), %rdi
leaq -0x218(%rbp), %rsi
callq 0x13810
leaq -0x218(%rbp), %rdi
callq 0xb9d0
movl $0x2, -0x4c(%rbp)
leaq -0x1d8(%rbp), %rdi
callq 0xb8e0
jmp 0x28278
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x27ec1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x27eb5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x1f0(%rbp), %rdi
callq 0xb8e0
leaq -0x1f8(%rbp), %rdi
callq 0xb9d0
leaq -0x1e0(%rbp), %rdi
callq 0xb9d0
jmp 0x28292
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x210(%rbp), %rdi
callq 0xb8e0
jmp 0x27ef8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x1d8(%rbp), %rdi
callq 0xb8e0
jmp 0x28292
leaq -0x230(%rbp), %rdi
leaq -0x150(%rbp), %rsi
callq 0x1bf40
jmp 0x27f1e
leaq -0x248(%rbp), %rdi
leaq -0x150(%rbp), %rsi
callq 0x1be40
jmp 0x27f33
leaq -0x240(%rbp), %rdi
leaq -0x248(%rbp), %rsi
callq 0xb9f0
jmp 0x27f48
leaq -0x228(%rbp), %rdi
leaq -0x230(%rbp), %rsi
leaq -0x170(%rbp), %rdx
leaq -0x240(%rbp), %rcx
callq 0x28730
jmp 0x27f6b
leaq -0x240(%rbp), %rdi
callq 0xb8e0
leaq -0x248(%rbp), %rdi
callq 0xb9d0
leaq -0x230(%rbp), %rdi
callq 0xb9d0
leaq -0x260(%rbp), %rdi
movq %rdi, -0x398(%rbp)
leaq -0x228(%rbp), %rsi
callq 0xf830
movq -0x398(%rbp), %rsi
leaq -0x250(%rbp), %rdi
callq 0xb880
jmp 0x27fbe
leaq -0x260(%rbp), %rdi
callq 0xb8e0
leaq -0x270(%rbp), %rdi
leaq -0x150(%rbp), %rsi
callq 0x1c040
jmp 0x27fdf
leaq -0x268(%rbp), %rdi
leaq -0x270(%rbp), %rsi
leaq -0x250(%rbp), %rdx
callq 0x27080
jmp 0x27ffb
leaq -0x20(%rbp), %rdi
leaq -0x268(%rbp), %rsi
callq 0x13810
leaq -0x268(%rbp), %rdi
callq 0xb9d0
leaq -0x270(%rbp), %rdi
callq 0xb9d0
movl $0x2, -0x4c(%rbp)
leaq -0x250(%rbp), %rdi
callq 0xc060
leaq -0x228(%rbp), %rdi
callq 0xb8e0
jmp 0x28278
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x28087
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x2807b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x240(%rbp), %rdi
callq 0xb8e0
leaq -0x248(%rbp), %rdi
callq 0xb9d0
leaq -0x230(%rbp), %rdi
callq 0xb9d0
jmp 0x28292
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x260(%rbp), %rdi
callq 0xb8e0
jmp 0x280e4
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x280d8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x270(%rbp), %rdi
callq 0xb9d0
leaq -0x250(%rbp), %rdi
callq 0xc060
leaq -0x228(%rbp), %rdi
callq 0xb8e0
jmp 0x28292
leaq -0x150(%rbp), %rdi
callq 0x287b0
movq %rax, -0x3a0(%rbp)
jmp 0x2810a
movq -0x3a0(%rbp), %rax
movq -0x2b8(%rbp), %rdi
leaq -0x170(%rbp), %rsi
callq *%rax
jmp 0x28123
movl $0x1, -0x4c(%rbp)
jmp 0x28278
leaq -0x150(%rbp), %rdi
callq 0x288c0
movq %rax, -0x3a8(%rbp)
jmp 0x28144
leaq -0x280(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0xb9f0
jmp 0x28156
movq -0x3a8(%rbp), %rax
movq -0x2b8(%rbp), %rdi
leaq -0x170(%rbp), %rsi
leaq -0x280(%rbp), %rdx
callq *%rax
jmp 0x28176
leaq -0x280(%rbp), %rdi
callq 0xb8e0
movl $0x1, -0x4c(%rbp)
jmp 0x28278
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x280(%rbp), %rdi
callq 0xb8e0
jmp 0x28292
movb $0x1, -0x2a2(%rbp)
movl $0x28, %edi
callq 0x8240
movq %rax, -0x3b8(%rbp)
leaq -0x2a1(%rbp), %rdi
movq %rdi, -0x3b0(%rbp)
callq 0x87d0
movq -0x3b0(%rbp), %rdx
leaq 0x15455(%rip), %rsi     # 0x3d639
leaq -0x2a0(%rbp), %rdi
callq 0x8610
jmp 0x281f2
movq -0x3b8(%rbp), %rdi
leaq -0x2a0(%rbp), %rsi
callq 0xd550
jmp 0x28207
movq -0x3b8(%rbp), %rdi
movb $0x0, -0x2a2(%rbp)
leaq 0x2db4c(%rip), %rsi     # 0x55d68
leaq -0x1ac63(%rip), %rdx    # 0xd5c0
callq 0x8770
jmp 0x2830b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x28253
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x2a0(%rbp), %rdi
callq 0x8878
leaq -0x2a1(%rbp), %rdi
callq 0x8490
testb $0x1, -0x2a2(%rbp)
jne 0x2826a
jmp 0x28276
movq -0x3b8(%rbp), %rdi
callq 0x8300
jmp 0x28292
leaq -0x170(%rbp), %rdi
callq 0xc130
leaq -0x150(%rbp), %rdi
callq 0xb9d0
jmp 0x282ac
leaq -0x170(%rbp), %rdi
callq 0xc130
leaq -0x150(%rbp), %rdi
callq 0xb9d0
jmp 0x282c3
leaq -0x58(%rbp), %rdi
callq 0xb9d0
movl -0x4c(%rbp), %eax
subl $0x2, %eax
je 0x270c6
jmp 0x282ce
leaq -0x58(%rbp), %rdi
callq 0xb9d0
jmp 0x282f0
leaq -0x28(%rbp), %rdi
callq 0xb9d0
leaq -0x20(%rbp), %rdi
callq 0xb9d0
movq -0x2b0(%rbp), %rax
addq $0x3c0, %rsp            # imm = 0x3C0
popq %rbp
retq
leaq -0x28(%rbp), %rdi
callq 0xb9d0
leaq -0x20(%rbp), %rdi
callq 0xb9d0
movq -0x30(%rbp), %rdi
callq 0x87b0
nopl (%rax,%rax)