// File: /workspace/github_cpp_makefile_star2_O2/TBody[P]atomicpp/atomicpp/RateEquations.cpp
// Function: atomicpp::RateEquations::calculateElectronImpactPopulationEquation(double, std::vector<double, std::allocator<double>> const&, std::vector<double, std::allocator<double>> const&, double)
void RateEquations::calculateElectronImpactPopulationEquation(
	const double Ne,
	const std::vector<double>& Nzk,
	const std::vector<double>& Vzk,
	const double Te
	){
	
	// Initialise vectors as all zeros (this is default, but it doesn't hurt to be explicit)
	// These will be summed with Neumaier summation
	//Rates for population equation
		std::vector<double>    iz_to_above(Z+1, 0.0); //Rate (m^-3 s^-1)
		std::vector<double>  iz_from_below(Z+1, 0.0);
		std::vector<double>   rec_to_below(Z+1, 0.0);
		std::vector<double> rec_from_above(Z+1, 0.0);

	//Rates for momentum equation
		std::vector<double>    iz_p_to_above(Z+1, 0.0); //Momentum (kg m/s s^-1 = N)
		std::vector<double>  iz_p_from_below(Z+1, 0.0);
		std::vector<double>   rec_p_to_below(Z+1, 0.0);
		std::vector<double> rec_p_from_above(Z+1, 0.0);

	std::shared_ptr<RateCoefficient> ionisation_coefficient    = rate_coefficients["ionisation"];
	std::shared_ptr<RateCoefficient> recombination_coefficient = rate_coefficients["recombination"];
	
	//N.b. iterating over all data indices of the rate coefficient, hence the < since these are 0,...,Z-1  or 1,...,Z indexed
	for(int k=0; k < Z; ++k){
		double ionisation_coefficient_evaluated = ionisation_coefficient->call0D(k, Te, Ne);
		double recombination_coefficient_evaluated = recombination_coefficient->call0D(k, Te, Ne);
		
		// Note that recombination coefficients are indexed from 1 to Z, while ionisation is indexed from 0 to Z-1 (consider what 
		// charge the target must have in each case)
		int k_rec = k + 1; //The target charge state for recombination -- makes it a bit easier to understand

		double ionisation_rate_factor = ionisation_coefficient_evaluated * Ne;
		// std::printf("ionisation(%i)    K = %e, Ne = %e, Nzk = %e, R= %e\n",k,ionisation_coefficient_evaluated, Ne, Nzk[k],ionisation_rate_factor);
		double recombination_rate_factor = recombination_coefficient_evaluated * Ne;
		// std::printf("recombination(%i) K = %e, Ne = %e, Nzk = %e, R= %e\n",k+1,recombination_coefficient_evaluated, Ne, Nzk[k+1],recombination_rate_factor);

		// Want both the target and source densities to be above the Nthres density threshold
		// If we allow target to be below the source density, then won't get particle balance if ignoring stage or alternatively
		// 	will artificially pump a low density stage if we consider only source terms
		// 	N.b. Nzk[k+1] = Nzk[k_rec], Nzk[k] = Nzk[k_rec - 1], so can test just one condition and it will work for ionisation and recombination
		if((Nzk[k+1] > Nthres) and (Nzk[k] > Nthres)){
			//Rates 'to' a state are loss terms from that state. They are paired with Rates 'from'
			//which are source terms for other states
			iz_to_above.at(k)               = -ionisation_rate_factor * Nzk.at(k);
			iz_from_below.at(k+1)        = +ionisation_rate_factor * Nzk.at(k);
			rec_to_below.at(k_rec)       = -recombination_rate_factor * Nzk.at(k_rec);
			rec_from_above.at(k_rec-1)   = +recombination_rate_factor * Nzk.at(k_rec);

			iz_p_to_above.at(k)          = -ionisation_rate_factor * mz * amu_to_kg * Vzk.at(k);
			iz_p_from_below.at(k+1)      = +ionisation_rate_factor * mz * amu_to_kg * Vzk.at(k);
			rec_p_to_below.at(k_rec)     = -recombination_rate_factor * mz * amu_to_kg * Vzk.at(k_rec);
			rec_p_from_above.at(k_rec-1) = +recombination_rate_factor * mz * amu_to_kg * Vzk.at(k_rec);
		}
		// Otherwise, the rates stay as default = 0
	}

	for(int k=0; k <= Z; ++k){
		// N.b. bare nucleus will not contribute to electron density nor have an ionisation potential -- treat it separately
		// Rates will be zero for edge cases (from initialisation)
		std::vector<double> rates_for_stage              = {iz_to_above[k],iz_from_below[k],rec_to_below[k],rec_from_above[k]};
		std::pair<double, double> neumaier_pair_rates    = neumaierSum(rates_for_stage);
		dNzk[k]                                          = neumaier_pair_rates.first;
		dNzk_correction[k]                               = neumaier_pair_rates.second; //Store compensation separately for later evaluation

		std::vector<double> momentum_for_stage           = {iz_p_to_above[k],iz_p_from_below[k],rec_p_to_below[k],rec_p_from_above[k]};
		std::pair<double, double> neumaier_pair_momentum = neumaierSum(momentum_for_stage);
		F_zk[k]                                          = neumaier_pair_momentum.first;
		F_zk_correction[k]                               = neumaier_pair_momentum.second; //Store compensation separately for later evaluation
	}

	//For Neumaier summation of the change in Ne from the different rates 
	std::vector<double> dNe_from_stage(Z, 0.0);
	// Ionisation potential (in eV per transition) is not a rate coefficient, but is treated as one since the interpolation methods and
	// data shape are identical. This is used to calculate the effect of iz and rec on the electron energy (in Pcool).
	std::shared_ptr<RateCoefficient> ionisation_potential = rate_coefficients["ionisation_potential"];
	for(int k=0; k < Z; ++k){
		// N.b. bare nucleus will not contribute to electron density nor have an ionisation potential
		// Rates will be zero for edge cases (from initialisation)
		double ionisation_potential_evaluated            = ionisation_potential->call0D(k, Te, Ne);
		Pcool                                            += eV_to_J * ionisation_potential_evaluated * (iz_to_above[k] + rec_from_above[k]); //N.b. iz_to_above is -ve, rec_from_above is +ve
		dNe_from_stage[k]                                = -(iz_to_above[k] + rec_from_above[k]); //N.b. rates already have signs
	}
	// Perturbation on electron density
	std::pair<double, double> neumaier_pair_dNe      = neumaierSum(dNe_from_stage);
	dNe                                              = neumaier_pair_dNe.first + neumaier_pair_dNe.second;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x1b8, %rsp            # imm = 0x1B8
movsd %xmm1, -0xb0(%rbp)
movq %rdx, %r14
movq %rsi, %r15
movsd %xmm0, -0x78(%rbp)
movq %rdi, %rbx
movslq 0x34(%rdi), %r12
incq %r12
leaq -0x70(%rbp), %rax
andq $0x0, (%rax)
leaq -0x188(%rbp), %r13
movq %r13, %rdi
callq 0x531c
leaq -0x1e0(%rbp), %rdi
movq %r12, %rsi
leaq -0x70(%rbp), %rdx
movq %r13, %rcx
callq 0x17a40
leaq -0x188(%rbp), %rdi
callq 0x5a64
movslq 0x34(%rbx), %r12
incq %r12
leaq -0x70(%rbp), %rax
andq $0x0, (%rax)
leaq -0x170(%rbp), %r13
movq %r13, %rdi
callq 0x531c
leaq -0x188(%rbp), %rdi
movq %r12, %rsi
leaq -0x70(%rbp), %rdx
movq %r13, %rcx
callq 0x17a40
leaq -0x170(%rbp), %rdi
callq 0x5a64
movslq 0x34(%rbx), %r12
incq %r12
leaq -0x70(%rbp), %rax
andq $0x0, (%rax)
leaq -0xf8(%rbp), %r13
movq %r13, %rdi
callq 0x531c
leaq -0x170(%rbp), %rdi
movq %r12, %rsi
leaq -0x70(%rbp), %rdx
movq %r13, %rcx
callq 0x17a40
leaq -0xf8(%rbp), %rdi
callq 0x5a64
movslq 0x34(%rbx), %r12
incq %r12
leaq -0x70(%rbp), %rax
andq $0x0, (%rax)
leaq -0x158(%rbp), %r13
movq %r13, %rdi
callq 0x531c
leaq -0xf8(%rbp), %rdi
movq %r12, %rsi
leaq -0x70(%rbp), %rdx
movq %r13, %rcx
callq 0x17a40
leaq -0x158(%rbp), %rdi
callq 0x5a64
movslq 0x34(%rbx), %r12
incq %r12
leaq -0x70(%rbp), %rax
andq $0x0, (%rax)
leaq -0x140(%rbp), %r13
movq %r13, %rdi
callq 0x531c
leaq -0x158(%rbp), %rdi
movq %r12, %rsi
leaq -0x70(%rbp), %rdx
movq %r13, %rcx
callq 0x17a40
leaq -0x140(%rbp), %rdi
callq 0x5a64
movslq 0x34(%rbx), %r12
incq %r12
leaq -0x70(%rbp), %rax
andq $0x0, (%rax)
leaq -0x128(%rbp), %r13
movq %r13, %rdi
callq 0x531c
leaq -0x140(%rbp), %rdi
movq %r12, %rsi
leaq -0x70(%rbp), %rdx
movq %r13, %rcx
callq 0x17a40
leaq -0x128(%rbp), %rdi
callq 0x5a64
movslq 0x34(%rbx), %r12
incq %r12
leaq -0x70(%rbp), %rax
andq $0x0, (%rax)
leaq -0x110(%rbp), %r13
movq %r13, %rdi
callq 0x531c
leaq -0x128(%rbp), %rdi
movq %r12, %rsi
leaq -0x70(%rbp), %rdx
movq %r13, %rcx
callq 0x17a40
leaq -0x110(%rbp), %rdi
callq 0x5a64
movslq 0x34(%rbx), %r12
incq %r12
leaq -0x70(%rbp), %rax
andq $0x0, (%rax)
leaq -0x90(%rbp), %r13
movq %r13, %rdi
callq 0x531c
leaq -0x110(%rbp), %rdi
movq %r12, %rsi
leaq -0x70(%rbp), %rdx
movq %r13, %rcx
callq 0x17a40
leaq -0x90(%rbp), %rdi
callq 0x5a64
leaq -0x90(%rbp), %r12
movq %r12, %rdi
callq 0x4540
leaq 0x25f0(%rip), %rsi      # 0x21040
leaq -0x70(%rbp), %rdi
movq %r12, %rdx
callq 0x4160
leaq -0x70(%rbp), %rsi
movq %rbx, %rdi
callq 0xcf52
leaq -0x1c8(%rbp), %rdi
movq %rax, %rsi
callq 0xcf48
leaq -0x70(%rbp), %rdi
callq 0x41a0
leaq -0x90(%rbp), %rdi
callq 0x58aa
movq %r12, %rdi
callq 0x4540
leaq 0x25b0(%rip), %rsi      # 0x2104b
leaq -0x70(%rbp), %rdi
movq %r12, %rdx
callq 0x4160
leaq -0x70(%rbp), %rsi
movq %rbx, %rdi
callq 0xcf52
leaq -0x1b8(%rbp), %rdi
movq %rax, %rsi
callq 0xcf48
leaq -0x70(%rbp), %rdi
callq 0x41a0
leaq -0x90(%rbp), %rdi
callq 0x58aa
xorl %r12d, %r12d
movslq 0x34(%rbx), %rax
cmpq %rax, %r12
jge 0x1edbb
leaq -0x1c8(%rbp), %rdi
callq 0x538e
movq %rax, %rdi
movl %r12d, %esi
movsd -0xb0(%rbp), %xmm0
movsd -0x78(%rbp), %xmm1
callq 0x10f96
movapd %xmm0, -0x50(%rbp)
leaq -0x1b8(%rbp), %rdi
callq 0x538e
movq %rax, %rdi
movl %r12d, %esi
movsd -0xb0(%rbp), %xmm0
movsd -0x78(%rbp), %xmm1
callq 0x10f96
movapd %xmm0, -0xa0(%rbp)
leaq 0x1(%r12), %r13
movq %r15, %rdi
movq %r13, %rsi
callq 0x17efc
movsd (%rax), %xmm0
ucomisd 0x40(%rbx), %xmm0
jbe 0x1edb3
movq %r15, %rdi
movq %r12, %rsi
callq 0x17efc
movsd (%rax), %xmm0
ucomisd 0x40(%rbx), %xmm0
jbe 0x1edb3
movq %r15, %rdi
movq %r12, %rsi
callq 0x1c9de
movsd (%rax), %xmm0
movsd %xmm0, -0x38(%rbp)
leaq -0x1e0(%rbp), %rdi
movq %r12, %rsi
callq 0x1c982
movapd -0x50(%rbp), %xmm0
mulsd -0x78(%rbp), %xmm0
movapd %xmm0, -0x50(%rbp)
xorpd 0x54e1(%rip), %xmm0     # 0x24090
movapd %xmm0, -0xe0(%rbp)
movsd -0x38(%rbp), %xmm1
mulsd %xmm0, %xmm1
movsd %xmm1, (%rax)
movq %r15, %rdi
movq %r12, %rsi
callq 0x1c9de
movsd (%rax), %xmm0
movsd %xmm0, -0x38(%rbp)
leaq -0x188(%rbp), %rdi
movq %r13, %rsi
callq 0x1c982
movsd -0x38(%rbp), %xmm0
mulsd -0x50(%rbp), %xmm0
movsd %xmm0, (%rax)
movq %r15, %rdi
movq %r13, %rsi
callq 0x1c9de
movsd (%rax), %xmm0
movsd %xmm0, -0x38(%rbp)
leaq -0x170(%rbp), %rdi
movq %r13, %rsi
callq 0x1c982
movapd -0xa0(%rbp), %xmm0
mulsd -0x78(%rbp), %xmm0
movapd %xmm0, -0xa0(%rbp)
xorpd 0x545b(%rip), %xmm0     # 0x24090
movapd %xmm0, -0x1a0(%rbp)
movsd -0x38(%rbp), %xmm1
mulsd %xmm0, %xmm1
movsd %xmm1, (%rax)
movq %r15, %rdi
movq %r13, %rsi
callq 0x1c9de
movsd (%rax), %xmm0
movsd %xmm0, -0x38(%rbp)
leaq -0xf8(%rbp), %rdi
movq %r12, %rsi
callq 0x1c982
movsd -0x38(%rbp), %xmm0
mulsd -0xa0(%rbp), %xmm0
movsd %xmm0, (%rax)
movsd 0x38(%rbx), %xmm0
movsd %xmm0, -0x38(%rbp)
movq %r14, %rdi
movq %r12, %rsi
callq 0x1c9de
movsd (%rax), %xmm0
movsd %xmm0, -0xa8(%rbp)
leaq -0x158(%rbp), %rdi
movq %r12, %rsi
callq 0x1c982
movsd -0x38(%rbp), %xmm0
mulsd -0xe0(%rbp), %xmm0
mulsd 0x53b5(%rip), %xmm0     # 0x24078
mulsd -0xa8(%rbp), %xmm0
movsd %xmm0, (%rax)
movsd 0x38(%rbx), %xmm0
movsd %xmm0, -0x38(%rbp)
movq %r14, %rdi
movq %r12, %rsi
callq 0x1c9de
movsd (%rax), %xmm0
movsd %xmm0, -0xe0(%rbp)
leaq -0x140(%rbp), %rdi
movq %r13, %rsi
callq 0x1c982
movapd -0x50(%rbp), %xmm0
mulsd -0x38(%rbp), %xmm0
mulsd 0x5367(%rip), %xmm0     # 0x24078
mulsd -0xe0(%rbp), %xmm0
movsd %xmm0, (%rax)
movsd 0x38(%rbx), %xmm0
movsd %xmm0, -0x50(%rbp)
movq %r14, %rdi
movq %r13, %rsi
callq 0x1c9de
movsd (%rax), %xmm0
movsd %xmm0, -0x38(%rbp)
leaq -0x128(%rbp), %rdi
movq %r13, %rsi
callq 0x1c982
movsd -0x50(%rbp), %xmm0
mulsd -0x1a0(%rbp), %xmm0
mulsd 0x5319(%rip), %xmm0     # 0x24078
mulsd -0x38(%rbp), %xmm0
movsd %xmm0, (%rax)
movsd 0x38(%rbx), %xmm0
movsd %xmm0, -0x50(%rbp)
movq %r14, %rdi
movq %r13, %rsi
callq 0x1c9de
movsd (%rax), %xmm0
movsd %xmm0, -0x38(%rbp)
leaq -0x110(%rbp), %rdi
movq %r12, %rsi
callq 0x1c982
movapd -0xa0(%rbp), %xmm0
mulsd -0x50(%rbp), %xmm0
mulsd 0x52ce(%rip), %xmm0     # 0x24078
mulsd -0x38(%rbp), %xmm0
movsd %xmm0, (%rax)
movq %r13, %r12
jmp 0x1eada
leaq 0x70(%rbx), %rcx
movq %rcx, -0xe0(%rbp)
leaq 0xa0(%rbx), %rcx
movq %rcx, -0xa8(%rbp)
leaq 0x88(%rbx), %rcx
movq %rcx, -0x1a0(%rbp)
movq %rbx, -0x38(%rbp)
leaq 0xb8(%rbx), %rcx
movq %rcx, -0x1a8(%rbp)
xorl %r14d, %r14d
leaq -0x70(%rbp), %rbx
pushq $0x4
popq %r15
movslq %eax, %r12
cmpq %r12, %r14
jg 0x1eff1
leaq -0x1e0(%rbp), %rdi
movq %r14, %rsi
callq 0x537c
movsd (%rax), %xmm0
movsd %xmm0, -0x70(%rbp)
leaq -0x188(%rbp), %rdi
movq %r14, %rsi
callq 0x537c
movsd (%rax), %xmm0
movsd %xmm0, -0x68(%rbp)
leaq -0x170(%rbp), %rdi
movq %r14, %rsi
callq 0x537c
movsd (%rax), %xmm0
movsd %xmm0, -0x60(%rbp)
leaq -0xf8(%rbp), %rdi
movq %r14, %rsi
callq 0x537c
movsd (%rax), %xmm0
movsd %xmm0, -0x58(%rbp)
leaq -0xc8(%rbp), %r13
movq %r13, %rdi
callq 0x531c
leaq -0x90(%rbp), %rdi
movq %rbx, %rsi
movq %r15, %rdx
movq %r13, %rcx
callq 0x17e2a
movq %r15, %r12
movq %r13, %rdi
callq 0x5a64
xorpd %xmm0, %xmm0
leaq -0x90(%rbp), %rdi
callq 0x20572
movsd %xmm0, -0xa0(%rbp)
movsd %xmm1, -0x50(%rbp)
movq -0xe0(%rbp), %rdi
movq %r14, %rsi
callq 0x537c
movsd -0xa0(%rbp), %xmm0
movsd %xmm0, (%rax)
movq -0xa8(%rbp), %rdi
movq %r14, %rsi
callq 0x537c
movsd -0x50(%rbp), %xmm0
movsd %xmm0, (%rax)
leaq -0x158(%rbp), %rdi
movq %r14, %rsi
callq 0x537c
movsd (%rax), %xmm0
movsd %xmm0, -0x70(%rbp)
leaq -0x140(%rbp), %rdi
movq %r14, %rsi
callq 0x537c
movsd (%rax), %xmm0
movsd %xmm0, -0x68(%rbp)
leaq -0x128(%rbp), %rdi
movq %r14, %rsi
callq 0x537c
movsd (%rax), %xmm0
movsd %xmm0, -0x60(%rbp)
leaq -0x110(%rbp), %rdi
movq %r14, %rsi
callq 0x537c
movsd (%rax), %xmm0
movsd %xmm0, -0x58(%rbp)
leaq -0x29(%rbp), %r15
movq %r15, %rdi
callq 0x531c
movq %r13, %rdi
movq %rbx, %r13
movq %rbx, %rsi
movq %r15, %rbx
movq %r12, %r15
movq %r12, %rdx
movq %rbx, %rcx
callq 0x17e2a
movq %rbx, %rdi
callq 0x5a64
xorpd %xmm0, %xmm0
leaq -0xc8(%rbp), %rbx
movq %rbx, %rdi
callq 0x20572
movsd %xmm0, -0xa0(%rbp)
movsd %xmm1, -0x50(%rbp)
movq -0x1a0(%rbp), %rdi
movq %r14, %rsi
callq 0x537c
movsd -0xa0(%rbp), %xmm0
movsd %xmm0, (%rax)
movq -0x1a8(%rbp), %rdi
movq %r14, %rsi
callq 0x537c
movsd -0x50(%rbp), %xmm0
movsd %xmm0, (%rax)
movq %rbx, %rdi
callq 0x53a6
leaq -0x90(%rbp), %rdi
callq 0x53a6
incq %r14
movq -0x38(%rbp), %rax
movl 0x34(%rax), %eax
movq %r13, %rbx
jmp 0x1edff
leaq -0x70(%rbp), %r14
andq $0x0, (%r14)
leaq -0xc8(%rbp), %r15
movq %r15, %rdi
callq 0x531c
leaq -0x90(%rbp), %rdi
movq %r12, %rsi
movq %r14, %rdx
movq %r15, %rcx
callq 0x17a40
leaq -0xc8(%rbp), %rdi
callq 0x5a64
leaq -0x29(%rbp), %r14
movq %r14, %rdi
callq 0x4540
leaq 0x37a8(%rip), %rsi      # 0x227e4
leaq -0x70(%rbp), %rdi
movq %r14, %rdx
callq 0x4160
movq -0x38(%rbp), %rbx
leaq -0x70(%rbp), %rsi
movq %rbx, %rdi
callq 0xcf52
leaq -0xc8(%rbp), %rdi
movq %rax, %rsi
callq 0xcf48
leaq -0x70(%rbp), %rdi
callq 0x41a0
leaq -0x29(%rbp), %rdi
callq 0x58aa
xorl %r15d, %r15d
leaq -0x1e0(%rbp), %r12
leaq -0xf8(%rbp), %r13
leaq -0x90(%rbp), %r14
movslq 0x34(%rbx), %rax
cmpq %rax, %r15
jge 0x1f15c
leaq -0xc8(%rbp), %rdi
callq 0x538e
movq %rax, %rdi
movl %r15d, %esi
movsd -0xb0(%rbp), %xmm0
movsd -0x78(%rbp), %xmm1
callq 0x10f96
mulsd 0x4fa6(%rip), %xmm0     # 0x24070
movsd %xmm0, -0x50(%rbp)
movq %r12, %rdi
movq %r15, %rsi
callq 0x537c
movsd (%rax), %xmm0
movsd %xmm0, -0xa0(%rbp)
movq %r13, %rdi
movq %r15, %rsi
callq 0x537c
movsd -0xa0(%rbp), %xmm0
addsd (%rax), %xmm0
mulsd -0x50(%rbp), %xmm0
addsd 0x60(%rbx), %xmm0
movsd %xmm0, 0x60(%rbx)
movq %r12, %rdi
movq %r15, %rsi
callq 0x537c
movsd (%rax), %xmm0
movaps %xmm0, -0x50(%rbp)
movq %r13, %rdi
movq %r15, %rsi
callq 0x537c
movapd -0x50(%rbp), %xmm0
addsd (%rax), %xmm0
xorpd 0x4f55(%rip), %xmm0     # 0x24090
movapd %xmm0, -0x50(%rbp)
movq %r14, %rdi
movq %r15, %rsi
callq 0x537c
movapd -0x50(%rbp), %xmm0
movlpd %xmm0, (%rax)
incq %r15
jmp 0x1f091
leaq -0x90(%rbp), %r14
xorpd %xmm0, %xmm0
movq %r14, %rdi
callq 0x20572
addsd %xmm0, %xmm1
movsd %xmm1, 0xd0(%rbx)
leaq -0xc8(%rbp), %rdi
callq 0x5398
movq %r14, %rdi
callq 0x53a6
leaq -0x1b8(%rbp), %rdi
callq 0x5398
leaq -0x1c8(%rbp), %rdi
callq 0x5398
leaq -0x110(%rbp), %rdi
callq 0x53a6
leaq -0x128(%rbp), %rdi
callq 0x53a6
leaq -0x140(%rbp), %rdi
callq 0x53a6
leaq -0x158(%rbp), %rdi
callq 0x53a6
leaq -0xf8(%rbp), %rdi
callq 0x53a6
leaq -0x170(%rbp), %rdi
callq 0x53a6
leaq -0x188(%rbp), %rdi
callq 0x53a6
leaq -0x1e0(%rbp), %rdi
callq 0x53a6
addq $0x1b8, %rsp            # imm = 0x1B8
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq %rax, %rbx
leaq -0x70(%rbp), %rdi
callq 0x41a0
jmp 0x1f22a
movq %rax, %rbx
leaq -0x29(%rbp), %rdi
callq 0x58aa
jmp 0x1f34f
jmp 0x1f332
movq %rax, %rbx
leaq -0x70(%rbp), %rdi
callq 0x41a0
jmp 0x1f24e
movq %rax, %rbx
leaq -0x90(%rbp), %rdi
callq 0x58aa
jmp 0x1f370
movq %rax, %rbx
leaq -0x70(%rbp), %rdi
callq 0x41a0
jmp 0x1f270
movq %rax, %rbx
leaq -0x90(%rbp), %rdi
callq 0x58aa
jmp 0x1f37c
movq %rax, %rbx
leaq -0x90(%rbp), %rdi
callq 0x5a64
jmp 0x1f388
movq %rax, %rbx
leaq -0x110(%rbp), %rdi
callq 0x5a64
jmp 0x1f394
movq %rax, %rbx
leaq -0x128(%rbp), %rdi
callq 0x5a64
jmp 0x1f3a0
movq %rax, %rbx
leaq -0x140(%rbp), %rdi
callq 0x5a64
jmp 0x1f3ac
movq %rax, %rbx
leaq -0x158(%rbp), %rdi
callq 0x5a64
jmp 0x1f3b8
movq %rax, %rbx
leaq -0xf8(%rbp), %rdi
callq 0x5a64
jmp 0x1f3c4
movq %rax, %rbx
leaq -0x170(%rbp), %rdi
callq 0x5a64
jmp 0x1f3d0
movq %rax, %rbx
leaq -0x188(%rbp), %rdi
callq 0x5a64
jmp 0x1f3dc
movq %rax, %rbx
leaq -0xc8(%rbp), %rdi
callq 0x5398
jmp 0x1f34f
movq %rax, %rbx
leaq -0xc8(%rbp), %rdi
callq 0x5a64
jmp 0x1f364
movq %rax, %rbx
leaq -0x29(%rbp), %rdi
callq 0x5a64
leaq -0x90(%rbp), %rdi
callq 0x53a6
jmp 0x1f364
jmp 0x1f361
jmp 0x1f361
movq %rax, %rbx
leaq -0x1b8(%rbp), %rdi
callq 0x5398
leaq -0x1c8(%rbp), %rdi
callq 0x5398
leaq -0x110(%rbp), %rdi
callq 0x53a6
leaq -0x128(%rbp), %rdi
callq 0x53a6
leaq -0x140(%rbp), %rdi
callq 0x53a6
leaq -0x158(%rbp), %rdi
callq 0x53a6
leaq -0xf8(%rbp), %rdi
callq 0x53a6
leaq -0x170(%rbp), %rdi
callq 0x53a6
leaq -0x188(%rbp), %rdi
callq 0x53a6
leaq -0x1e0(%rbp), %rdi
callq 0x53a6
movq %rbx, %rdi
callq 0x45a0