// File: toxaart[P]hierarchical_block_sparse_lib/source/HierarchicalBlockSparseMatrix.h
// Function: hbsm::HierarchicalBlockSparseMatrix<double>::symm_square(hbsm::HierarchicalBlockSparseMatrix<double> const&, hbsm::HierarchicalBlockSparseMatrix<double>&)
void HierarchicalBlockSparseMatrix<Treal>::symm_square(HierarchicalBlockSparseMatrix<Treal> const & A, HierarchicalBlockSparseMatrix<Treal> & C){

			if(!C.empty()) throw std::runtime_error("Error in HierarchicalBlockSparseMatrix::symm_square(): non-empty matrix to write result!");

			if(A.nCols_orig != A.nRows_orig) throw std::runtime_error("Error in HierarchicalBlockSparseMatrix::symm_square(): matrix has bad sizes!");

			C.set_params(A.get_params());

			C.resize(A.nRows_orig,A.nCols_orig);


			if(A.lowest_level()){

				int blocksize = A.nRows;
				int M = A.nRows;
				if(A.on_bottom_boundary()) M = A.get_n_rows() % A.blocksize; // fill only necessary elements

				for (int row = 0; row < M; row++){
				  for (int col = row; col < M; col++){
					 // Here we rely on that resize has set the elements of C to zero.

					 for (int ind = 0; ind < row; ind++){
						C.submatrix[row + col * blocksize] += A.submatrix[ind + row * blocksize] * A.submatrix[ind + col * blocksize];
					 }

					 for (int ind = row; ind <= col; ind++){
						C.submatrix[row + col * blocksize] += A.submatrix[row + ind * blocksize] * A.submatrix[ind + col * blocksize];
					 }

					 for (int ind = col + 1; ind < M; ind++) {
						C.submatrix[row + col * blocksize] += A.submatrix[row + ind * blocksize] * A.submatrix[col + ind * blocksize];
					 }
				  }
				}

				return;
			}


			// same as regular multiplication, except that if A0*A0 and A3*A3 are done recursively,
			// multiplication invilving A0 XOR A3 is computed using symm_multiply
			// rest - standard routine

			// C0 = A0xA0 + A2xA2^T
			// C1 = A2^TxA0 + A3xA2^T  - NO NEED IN THIS
			// C2 = A0xA2 + A2xA3
			// C3 = A2^TxA2 + A3xA3

			if(A.children[2] != NULL){

				// C0 = A0xA0 + A2xA2^T
				std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> >  A0xA0;
				if(A.children[0] != NULL){
					A0xA0 = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
					symm_square(*A.children[0],  *A0xA0);
				}

				std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> > A2xA2T;
				A2xA2T = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
				multiply(*A.children[2], false, *A.children[2], true, *A2xA2T);

				std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> > A2xA2T_U;
				A2xA2T_U = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
				A2xA2T->get_upper_triangle(*A2xA2T_U);

				if(A0xA0 != NULL && A2xA2T_U == NULL){C.children[0] = A0xA0; C.children[0]->parent = &C;}
				if(A0xA0 == NULL && A2xA2T_U != NULL){C.children[0] = A2xA2T_U; C.children[0]->parent = &C;}
				if(A0xA0 != NULL && A2xA2T_U != NULL){
					add_to_first(*A0xA0, *A2xA2T_U);
					C.children[0] = A0xA0;
					C.children[0]->parent = &C;
				}

				// C2 = A0xA2 + A2xA3
				std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> >  A0xA2;
				if(A.children[0] != NULL){
					A0xA2 = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
					symm_multiply(*A.children[0], true, *A.children[2], false, *A0xA2);
				}

				std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> >  A2xA3;
				if(A.children[3] != NULL){
					A2xA3 = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
					symm_multiply(*A.children[2], false, *A.children[3], true, *A2xA3);
				}

				if(A0xA2 != NULL && A2xA3 == NULL){C.children[2] = A0xA2; C.children[2]->parent = &C;}
				if(A0xA2 == NULL && A2xA3 != NULL){C.children[2] = A2xA3; C.children[2]->parent = &C;}
				if(A0xA2 != NULL && A2xA3 != NULL){
					add_to_first(*A0xA2, *A2xA3);
					C.children[2] = A0xA2;
					C.children[2]->parent = &C;
				}

				// C3 = A2TxA2 + A3xA3
				std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> > A2TxA2;
				A2TxA2 = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
				multiply(*A.children[2], true, *A.children[2], false, *A2TxA2);

				std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> > A2TxA2_U;
				A2TxA2_U = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
				A2TxA2->get_upper_triangle(*A2TxA2_U);

				std::shared_ptr<HierarchicalBlockSparseMatrix<Treal> > A3xA3;
				if(A.children[3] != NULL){
					A3xA3 = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
					symm_square(*A.children[3], *A3xA3);
				}

				if(A2TxA2_U != NULL && A3xA3 == NULL){C.children[3] = A2TxA2_U; C.children[3]->parent = &C;}
				if(A2TxA2_U == NULL && A3xA3 != NULL){C.children[3] = A3xA3; C.children[3]->parent = &C;}
				if(A2TxA2_U != NULL && A3xA3 != NULL){
					add_to_first(*A2TxA2_U, *A3xA3);
					C.children[3] = A2TxA2_U;
					C.children[3]->parent = &C;
				}

			}
			else{ // so much less to compute

				// all summands which included A2 disappear now

				// C1 = A0 * A0
				if(A.children[0] != NULL){
					C.children[0] = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
					C.children[0]->parent = &C;
					symm_square(*A.children[0],  *C.children[0]);
				}

				// C1 = NULL

				// C2 = NULL

				// C3 = A3*A3
				if(A.children[3] != NULL){
					C.children[3] = std::make_shared<HierarchicalBlockSparseMatrix<Treal> >();
					C.children[3]->parent = &C;
					symm_square(*A.children[3],  *C.children[3]);
				}

			}


			return;

		}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x310, %rsp            # imm = 0x310
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x10(%rbp), %rdi
callq 0x230a0
testb $0x1, %al
jne 0x2bddc
movl $0x10, %edi
callq 0x20d0
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x168(%rbp)
leaq 0xbad1(%rip), %rsi      # 0x3786f
callq 0x20a0
jmp 0x2bda5
movq -0x168(%rbp), %rdi
movq 0x1523d(%rip), %rsi     # 0x40ff0
movq 0x15206(%rip), %rdx     # 0x40fc0
callq 0x2320
movq -0x168(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x18(%rbp)
movl %eax, -0x1c(%rbp)
callq 0x2150
jmp 0x2ccce
movq -0x8(%rbp), %rax
movl 0xc(%rax), %eax
movq -0x8(%rbp), %rcx
cmpl 0x8(%rcx), %eax
je 0x2be48
movl $0x10, %edi
callq 0x20d0
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x170(%rbp)
leaq 0xbabe(%rip), %rsi      # 0x378c8
callq 0x20a0
jmp 0x2be11
movq -0x170(%rbp), %rdi
movq 0x151d1(%rip), %rsi     # 0x40ff0
movq 0x1519a(%rip), %rdx     # 0x40fc0
callq 0x2320
movq -0x170(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x18(%rbp)
movl %eax, -0x1c(%rbp)
callq 0x2150
jmp 0x2ccce
movq -0x10(%rbp), %rax
movq %rax, -0x178(%rbp)
movq -0x8(%rbp), %rdi
callq 0x243e0
movq -0x178(%rbp), %rdi
movl %eax, -0x20(%rbp)
leaq -0x20(%rbp), %rsi
callq 0x8570
movq -0x10(%rbp), %rdi
movq -0x8(%rbp), %rax
movl 0x8(%rax), %esi
movq -0x8(%rbp), %rax
movl 0xc(%rax), %edx
xorl %eax, %eax
movl %eax, %ecx
callq 0x8600
movq -0x8(%rbp), %rdi
callq 0x23500
testb $0x1, %al
jne 0x2be9c
jmp 0x2c123
movq -0x8(%rbp), %rax
movl (%rax), %eax
movl %eax, -0x24(%rbp)
movq -0x8(%rbp), %rax
movl (%rax), %eax
movl %eax, -0x28(%rbp)
movq -0x8(%rbp), %rdi
callq 0x24400
testb $0x1, %al
jne 0x2bebd
jmp 0x2bed1
movq -0x8(%rbp), %rdi
callq 0x24470
movq -0x8(%rbp), %rcx
cltd
idivl 0x10(%rcx)
movl %edx, -0x28(%rbp)
movl $0x0, -0x2c(%rbp)
movl -0x2c(%rbp), %eax
cmpl -0x28(%rbp), %eax
jge 0x2c11e
movl -0x2c(%rbp), %eax
movl %eax, -0x30(%rbp)
movl -0x30(%rbp), %eax
cmpl -0x28(%rbp), %eax
jge 0x2c10e
movl $0x0, -0x34(%rbp)
movl -0x34(%rbp), %eax
cmpl -0x2c(%rbp), %eax
jge 0x2bfa3
movq -0x8(%rbp), %rdi
addq $0x70, %rdi
movl -0x34(%rbp), %eax
movl -0x2c(%rbp), %ecx
imull -0x24(%rbp), %ecx
addl %ecx, %eax
movslq %eax, %rsi
callq 0x245a0
movsd (%rax), %xmm0
movsd %xmm0, -0x188(%rbp)
movq -0x8(%rbp), %rdi
addq $0x70, %rdi
movl -0x34(%rbp), %eax
movl -0x30(%rbp), %ecx
imull -0x24(%rbp), %ecx
addl %ecx, %eax
movslq %eax, %rsi
callq 0x245a0
movsd (%rax), %xmm0
movsd %xmm0, -0x180(%rbp)
movq -0x10(%rbp), %rdi
addq $0x70, %rdi
movl -0x2c(%rbp), %eax
movl -0x30(%rbp), %ecx
imull -0x24(%rbp), %ecx
addl %ecx, %eax
movslq %eax, %rsi
callq 0x22b60
movsd -0x188(%rbp), %xmm0
movsd -0x180(%rbp), %xmm2
movsd (%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, (%rax)
movl -0x34(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x34(%rbp)
jmp 0x2befd
movl -0x2c(%rbp), %eax
movl %eax, -0x38(%rbp)
movl -0x38(%rbp), %eax
cmpl -0x30(%rbp), %eax
jg 0x2c04f
movq -0x8(%rbp), %rdi
addq $0x70, %rdi
movl -0x2c(%rbp), %eax
movl -0x38(%rbp), %ecx
imull -0x24(%rbp), %ecx
addl %ecx, %eax
movslq %eax, %rsi
callq 0x245a0
movsd (%rax), %xmm0
movsd %xmm0, -0x198(%rbp)
movq -0x8(%rbp), %rdi
addq $0x70, %rdi
movl -0x38(%rbp), %eax
movl -0x30(%rbp), %ecx
imull -0x24(%rbp), %ecx
addl %ecx, %eax
movslq %eax, %rsi
callq 0x245a0
movsd (%rax), %xmm0
movsd %xmm0, -0x190(%rbp)
movq -0x10(%rbp), %rdi
addq $0x70, %rdi
movl -0x2c(%rbp), %eax
movl -0x30(%rbp), %ecx
imull -0x24(%rbp), %ecx
addl %ecx, %eax
movslq %eax, %rsi
callq 0x22b60
movsd -0x198(%rbp), %xmm0
movsd -0x190(%rbp), %xmm2
movsd (%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, (%rax)
movl -0x38(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x38(%rbp)
jmp 0x2bfa9
movl -0x30(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x3c(%rbp)
movl -0x3c(%rbp), %eax
cmpl -0x28(%rbp), %eax
jge 0x2c0fe
movq -0x8(%rbp), %rdi
addq $0x70, %rdi
movl -0x2c(%rbp), %eax
movl -0x3c(%rbp), %ecx
imull -0x24(%rbp), %ecx
addl %ecx, %eax
movslq %eax, %rsi
callq 0x245a0
movsd (%rax), %xmm0
movsd %xmm0, -0x1a8(%rbp)
movq -0x8(%rbp), %rdi
addq $0x70, %rdi
movl -0x30(%rbp), %eax
movl -0x3c(%rbp), %ecx
imull -0x24(%rbp), %ecx
addl %ecx, %eax
movslq %eax, %rsi
callq 0x245a0
movsd (%rax), %xmm0
movsd %xmm0, -0x1a0(%rbp)
movq -0x10(%rbp), %rdi
addq $0x70, %rdi
movl -0x2c(%rbp), %eax
movl -0x30(%rbp), %ecx
imull -0x24(%rbp), %ecx
addl %ecx, %eax
movslq %eax, %rsi
callq 0x22b60
movsd -0x1a8(%rbp), %xmm0
movsd -0x1a0(%rbp), %xmm2
movsd (%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, (%rax)
movl -0x3c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x3c(%rbp)
jmp 0x2c058
jmp 0x2c100
movl -0x30(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x30(%rbp)
jmp 0x2beea
jmp 0x2c110
movl -0x2c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x2c(%rbp)
jmp 0x2bed8
jmp 0x2ccc5
movq -0x8(%rbp), %rdi
addq $0x28, %rdi
addq $0x20, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x2c141
jmp 0x2cb7e
leaq -0x50(%rbp), %rdi
callq 0x23030
movq -0x8(%rbp), %rdi
addq $0x28, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x2c161
jmp 0x2c1d7
leaq -0x60(%rbp), %rdi
callq 0x245c0
jmp 0x2c16c
leaq -0x50(%rbp), %rdi
movq %rdi, -0x1b8(%rbp)
leaq -0x60(%rbp), %rsi
movq %rsi, -0x1c0(%rbp)
callq 0x235b0
movq -0x1c0(%rbp), %rdi
callq 0x235e0
movq -0x8(%rbp), %rdi
addq $0x28, %rdi
callq 0x24630
movq -0x1b8(%rbp), %rdi
movq %rax, -0x1b0(%rbp)
callq 0x24630
movq -0x1b0(%rbp), %rdi
movq %rax, %rsi
callq 0x2bd60
jmp 0x2c1c4
jmp 0x2c1d7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x18(%rbp)
movl %eax, -0x1c(%rbp)
jmp 0x2cb70
leaq -0x70(%rbp), %rdi
callq 0x23030
leaq -0x80(%rbp), %rdi
callq 0x245c0
jmp 0x2c1eb
leaq -0x70(%rbp), %rdi
movq %rdi, -0x1d8(%rbp)
leaq -0x80(%rbp), %rsi
movq %rsi, -0x1e0(%rbp)
callq 0x235b0
movq -0x1e0(%rbp), %rdi
callq 0x235e0
movq -0x8(%rbp), %rdi
addq $0x48, %rdi
callq 0x24630
movq %rax, -0x1d0(%rbp)
movq -0x8(%rbp), %rdi
addq $0x48, %rdi
callq 0x24630
movq -0x1d8(%rbp), %rdi
movq %rax, -0x1c8(%rbp)
callq 0x24630
movq -0x1d0(%rbp), %rdi
movq -0x1c8(%rbp), %rdx
movq %rax, %r8
movq %rsp, %rax
movq $0x0, (%rax)
xorl %esi, %esi
movl %esi, %r9d
movl $0x1, %ecx
callq 0x9580
jmp 0x2c272
leaq -0x90(%rbp), %rdi
callq 0x23030
leaq -0xa0(%rbp), %rdi
callq 0x245c0
jmp 0x2c28c
leaq -0x90(%rbp), %rdi
movq %rdi, -0x1f0(%rbp)
leaq -0xa0(%rbp), %rsi
movq %rsi, -0x1f8(%rbp)
callq 0x235b0
movq -0x1f8(%rbp), %rdi
callq 0x235e0
leaq -0x70(%rbp), %rdi
callq 0x23570
movq -0x1f0(%rbp), %rdi
movq %rax, -0x1e8(%rbp)
callq 0x24630
movq -0x1e8(%rbp), %rdi
movq %rax, %rsi
callq 0x2cce0
jmp 0x2c2e6
leaq -0x50(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x2c2f9
jmp 0x2c367
leaq -0x90(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x27380
testb $0x1, %al
jne 0x2c30f
jmp 0x2c367
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
leaq -0x50(%rbp), %rsi
callq 0x273b0
movq -0x10(%rbp), %rax
movq %rax, -0x200(%rbp)
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
callq 0x23570
movq -0x200(%rbp), %rcx
movq %rcx, 0x68(%rax)
jmp 0x2c367
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x18(%rbp)
movl %eax, -0x1c(%rbp)
jmp 0x2cb67
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x18(%rbp)
movl %eax, -0x1c(%rbp)
jmp 0x2cb5b
leaq -0x50(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x27380
testb $0x1, %al
jne 0x2c37a
jmp 0x2c3c7
leaq -0x90(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x2c390
jmp 0x2c3c7
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
leaq -0x90(%rbp), %rsi
callq 0x273b0
movq -0x10(%rbp), %rax
movq %rax, -0x208(%rbp)
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
callq 0x23570
movq -0x208(%rbp), %rcx
movq %rcx, 0x68(%rax)
leaq -0x50(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x2c3da
jmp 0x2c455
leaq -0x90(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x2c3f0
jmp 0x2c455
leaq -0x50(%rbp), %rdi
callq 0x24630
movq %rax, -0x210(%rbp)
leaq -0x90(%rbp), %rdi
callq 0x24630
movq -0x210(%rbp), %rdi
movq %rax, %rsi
xorl %eax, %eax
movl %eax, %edx
callq 0x27720
jmp 0x2c421
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
leaq -0x50(%rbp), %rsi
callq 0x273b0
movq -0x10(%rbp), %rax
movq %rax, -0x218(%rbp)
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
callq 0x23570
movq -0x218(%rbp), %rcx
movq %rcx, 0x68(%rax)
leaq -0xb0(%rbp), %rdi
callq 0x23030
movq -0x8(%rbp), %rdi
addq $0x28, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x2c47b
jmp 0x2c51c
leaq -0xc0(%rbp), %rdi
callq 0x245c0
jmp 0x2c489
leaq -0xb0(%rbp), %rdi
movq %rdi, -0x230(%rbp)
leaq -0xc0(%rbp), %rsi
movq %rsi, -0x238(%rbp)
callq 0x235b0
movq -0x238(%rbp), %rdi
callq 0x235e0
movq -0x8(%rbp), %rdi
addq $0x28, %rdi
callq 0x24630
movq %rax, -0x228(%rbp)
movq -0x8(%rbp), %rdi
addq $0x48, %rdi
callq 0x24630
movq -0x230(%rbp), %rdi
movq %rax, -0x220(%rbp)
callq 0x24630
movq -0x228(%rbp), %rdi
movq -0x220(%rbp), %rdx
movq %rax, %r8
movl $0x1, %esi
xorl %ecx, %ecx
callq 0x296d0
jmp 0x2c509
jmp 0x2c51c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x18(%rbp)
movl %eax, -0x1c(%rbp)
jmp 0x2cb4f
leaq -0xd0(%rbp), %rdi
callq 0x23030
movq -0x8(%rbp), %rdi
addq $0x28, %rdi
addq $0x30, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x2c546
jmp 0x2c5e7
leaq -0xe0(%rbp), %rdi
callq 0x245c0
jmp 0x2c554
leaq -0xd0(%rbp), %rdi
movq %rdi, -0x250(%rbp)
leaq -0xe0(%rbp), %rsi
movq %rsi, -0x258(%rbp)
callq 0x235b0
movq -0x258(%rbp), %rdi
callq 0x235e0
movq -0x8(%rbp), %rdi
addq $0x48, %rdi
callq 0x24630
movq %rax, -0x248(%rbp)
movq -0x8(%rbp), %rdi
addq $0x58, %rdi
callq 0x24630
movq -0x250(%rbp), %rdi
movq %rax, -0x240(%rbp)
callq 0x24630
movq -0x248(%rbp), %rdi
movq -0x240(%rbp), %rdx
movq %rax, %r8
xorl %esi, %esi
movl $0x1, %ecx
callq 0x296d0
jmp 0x2c5d4
jmp 0x2c5e7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x18(%rbp)
movl %eax, -0x1c(%rbp)
jmp 0x2cb43
leaq -0xb0(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x2c5fd
jmp 0x2c652
leaq -0xd0(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x27380
testb $0x1, %al
jne 0x2c613
jmp 0x2c652
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
addq $0x20, %rdi
leaq -0xb0(%rbp), %rsi
callq 0x273b0
movq -0x10(%rbp), %rax
movq %rax, -0x260(%rbp)
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
addq $0x20, %rdi
callq 0x23570
movq -0x260(%rbp), %rcx
movq %rcx, 0x68(%rax)
leaq -0xb0(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x27380
testb $0x1, %al
jne 0x2c668
jmp 0x2c6bd
leaq -0xd0(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x2c67e
jmp 0x2c6bd
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
addq $0x20, %rdi
leaq -0xd0(%rbp), %rsi
callq 0x273b0
movq -0x10(%rbp), %rax
movq %rax, -0x268(%rbp)
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
addq $0x20, %rdi
callq 0x23570
movq -0x268(%rbp), %rcx
movq %rcx, 0x68(%rax)
leaq -0xb0(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x2c6d6
jmp 0x2c75f
leaq -0xd0(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x2c6ec
jmp 0x2c75f
leaq -0xb0(%rbp), %rdi
callq 0x24630
movq %rax, -0x270(%rbp)
leaq -0xd0(%rbp), %rdi
callq 0x24630
movq -0x270(%rbp), %rdi
movq %rax, %rsi
xorl %eax, %eax
movl %eax, %edx
callq 0x27720
jmp 0x2c720
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
addq $0x20, %rdi
leaq -0xb0(%rbp), %rsi
callq 0x273b0
movq -0x10(%rbp), %rax
movq %rax, -0x278(%rbp)
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
addq $0x20, %rdi
callq 0x23570
movq -0x278(%rbp), %rcx
movq %rcx, 0x68(%rax)
leaq -0xf0(%rbp), %rdi
callq 0x23030
leaq -0x100(%rbp), %rdi
callq 0x245c0
jmp 0x2c779
leaq -0xf0(%rbp), %rdi
movq %rdi, -0x290(%rbp)
leaq -0x100(%rbp), %rsi
movq %rsi, -0x298(%rbp)
callq 0x235b0
movq -0x298(%rbp), %rdi
callq 0x235e0
movq -0x8(%rbp), %rdi
addq $0x48, %rdi
callq 0x24630
movq %rax, -0x288(%rbp)
movq -0x8(%rbp), %rdi
addq $0x48, %rdi
callq 0x24630
movq -0x290(%rbp), %rdi
movq %rax, -0x280(%rbp)
callq 0x24630
movq -0x288(%rbp), %rdi
movq -0x280(%rbp), %rdx
movq %rax, %r8
movq %rsp, %rax
movq $0x0, (%rax)
xorl %ecx, %ecx
movl %ecx, %r9d
movl $0x1, %esi
callq 0x9580
jmp 0x2c806
leaq -0x110(%rbp), %rdi
callq 0x23030
leaq -0x120(%rbp), %rdi
callq 0x245c0
jmp 0x2c820
leaq -0x110(%rbp), %rdi
movq %rdi, -0x2a8(%rbp)
leaq -0x120(%rbp), %rsi
movq %rsi, -0x2b0(%rbp)
callq 0x235b0
movq -0x2b0(%rbp), %rdi
callq 0x235e0
leaq -0xf0(%rbp), %rdi
callq 0x23570
movq -0x2a8(%rbp), %rdi
movq %rax, -0x2a0(%rbp)
callq 0x24630
movq -0x2a0(%rbp), %rdi
movq %rax, %rsi
callq 0x2cce0
jmp 0x2c87d
leaq -0x130(%rbp), %rdi
callq 0x23030
movq -0x8(%rbp), %rdi
addq $0x28, %rdi
addq $0x30, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x2c8a7
jmp 0x2c954
leaq -0x140(%rbp), %rdi
callq 0x245c0
jmp 0x2c8b5
leaq -0x130(%rbp), %rdi
movq %rdi, -0x2c0(%rbp)
leaq -0x140(%rbp), %rsi
movq %rsi, -0x2c8(%rbp)
callq 0x235b0
movq -0x2c8(%rbp), %rdi
callq 0x235e0
movq -0x8(%rbp), %rdi
addq $0x58, %rdi
callq 0x24630
movq -0x2c0(%rbp), %rdi
movq %rax, -0x2b8(%rbp)
callq 0x24630
movq -0x2b8(%rbp), %rdi
movq %rax, %rsi
callq 0x2bd60
jmp 0x2c913
jmp 0x2c954
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x18(%rbp)
movl %eax, -0x1c(%rbp)
jmp 0x2cb37
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x18(%rbp)
movl %eax, -0x1c(%rbp)
jmp 0x2cb2b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x18(%rbp)
movl %eax, -0x1c(%rbp)
leaq -0x130(%rbp), %rdi
callq 0x235e0
jmp 0x2cb2b
leaq -0x110(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x2c96a
jmp 0x2c9bf
leaq -0x130(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x27380
testb $0x1, %al
jne 0x2c980
jmp 0x2c9bf
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
addq $0x30, %rdi
leaq -0x110(%rbp), %rsi
callq 0x273b0
movq -0x10(%rbp), %rax
movq %rax, -0x2d0(%rbp)
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
addq $0x30, %rdi
callq 0x23570
movq -0x2d0(%rbp), %rcx
movq %rcx, 0x68(%rax)
leaq -0x110(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x27380
testb $0x1, %al
jne 0x2c9d5
jmp 0x2ca2a
leaq -0x130(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x2c9eb
jmp 0x2ca2a
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
addq $0x30, %rdi
leaq -0x130(%rbp), %rsi
callq 0x273b0
movq -0x10(%rbp), %rax
movq %rax, -0x2d8(%rbp)
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
addq $0x30, %rdi
callq 0x23570
movq -0x2d8(%rbp), %rcx
movq %rcx, 0x68(%rax)
leaq -0x110(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x2ca43
jmp 0x2cacc
leaq -0x130(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x2ca59
jmp 0x2cacc
leaq -0x110(%rbp), %rdi
callq 0x24630
movq %rax, -0x2e0(%rbp)
leaq -0x130(%rbp), %rdi
callq 0x24630
movq -0x2e0(%rbp), %rdi
movq %rax, %rsi
xorl %eax, %eax
movl %eax, %edx
callq 0x27720
jmp 0x2ca8d
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
addq $0x30, %rdi
leaq -0x110(%rbp), %rsi
callq 0x273b0
movq -0x10(%rbp), %rax
movq %rax, -0x2e8(%rbp)
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
addq $0x30, %rdi
callq 0x23570
movq -0x2e8(%rbp), %rcx
movq %rcx, 0x68(%rax)
leaq -0x130(%rbp), %rdi
callq 0x235e0
leaq -0x110(%rbp), %rdi
callq 0x235e0
leaq -0xf0(%rbp), %rdi
callq 0x235e0
leaq -0xd0(%rbp), %rdi
callq 0x235e0
leaq -0xb0(%rbp), %rdi
callq 0x235e0
leaq -0x90(%rbp), %rdi
callq 0x235e0
leaq -0x70(%rbp), %rdi
callq 0x235e0
leaq -0x50(%rbp), %rdi
callq 0x235e0
jmp 0x2ccc3
leaq -0x110(%rbp), %rdi
callq 0x235e0
leaq -0xf0(%rbp), %rdi
callq 0x235e0
leaq -0xd0(%rbp), %rdi
callq 0x235e0
leaq -0xb0(%rbp), %rdi
callq 0x235e0
leaq -0x90(%rbp), %rdi
callq 0x235e0
leaq -0x70(%rbp), %rdi
callq 0x235e0
leaq -0x50(%rbp), %rdi
callq 0x235e0
jmp 0x2ccce
movq -0x8(%rbp), %rdi
addq $0x28, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x2cb95
jmp 0x2cc14
leaq -0x150(%rbp), %rdi
callq 0x245c0
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
leaq -0x150(%rbp), %rsi
callq 0x235b0
leaq -0x150(%rbp), %rdi
callq 0x235e0
movq -0x10(%rbp), %rax
movq %rax, -0x2f8(%rbp)
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
callq 0x23570
movq -0x2f8(%rbp), %rcx
movq %rcx, 0x68(%rax)
movq -0x8(%rbp), %rdi
addq $0x28, %rdi
callq 0x24630
movq %rax, -0x2f0(%rbp)
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
callq 0x24630
movq -0x2f0(%rbp), %rdi
movq %rax, %rsi
callq 0x2bd60
movq -0x8(%rbp), %rdi
addq $0x28, %rdi
addq $0x30, %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x232b0
testb $0x1, %al
jne 0x2cc32
jmp 0x2ccc1
leaq -0x160(%rbp), %rdi
callq 0x245c0
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
addq $0x30, %rdi
leaq -0x160(%rbp), %rsi
callq 0x235b0
leaq -0x160(%rbp), %rdi
callq 0x235e0
movq -0x10(%rbp), %rax
movq %rax, -0x308(%rbp)
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
addq $0x30, %rdi
callq 0x23570
movq -0x308(%rbp), %rcx
movq %rcx, 0x68(%rax)
movq -0x8(%rbp), %rdi
addq $0x28, %rdi
addq $0x30, %rdi
callq 0x24630
movq %rax, -0x300(%rbp)
movq -0x10(%rbp), %rdi
addq $0x28, %rdi
addq $0x30, %rdi
callq 0x24630
movq -0x300(%rbp), %rdi
movq %rax, %rsi
callq 0x2bd60
jmp 0x2ccc3
jmp 0x2ccc5
addq $0x310, %rsp            # imm = 0x310
popq %rbp
retq
movq -0x18(%rbp), %rdi
callq 0x2340
nopw (%rax,%rax)