// File: /workspace/github_cpp_makefile_star2_O1/bobverity[P]MavericK/readIn.cpp
// Function: checkOptions(globals&)
void checkOptions(globals &globals) {
    
    /*
     The following checks are carried out (in this order):
     - fixLabels_on=true if producing any Qmatrix output
     - popCol_on=true if producing Qmatrix_pop files
     - admix_on=true if
        - producing Qmatrix_gene files
        - producing ML admixture freqs
     - outputQmatrix_?_on=true if outputQmatrixError_?_on=true
     - mainRepeats>1 if producing QmatrixError files
     - EMalgorithm_on=true if
        - producing model comp stats
        - producing ML output
     - (Kmax-Kmin)>=2 and mainRepeats>1 if outputEvanno_on=true
     - if using exhaustive approach, check that number of partitions required to sum over is reasonable. Otherwise throw warning
     - ensure that alpha and alphaPropSD vectors are of length 1 or (Kmax-Kmin+1). If former then duplicate value as needed.
     */
    
    // force fixLabels_on=true if producing any Qmatrix output
    if (!globals.fixLabels_on && (globals.outputQmatrix_ind_on || globals.outputQmatrix_pop_on || globals.outputQmatrix_gene_on)) {
        cerrAndLog("\nError: the label switching problem must be solved in order to produce Qmatrix output. Either set fixLabels_on to true, or turn off all Qmatrix output.\n", globals.outputLog_on, globals.outputLog_fileStream);
        exit(1);
    }
    
    // force popCol_on=true if producing Qmatrix_pop files
    if (!globals.popCol_on && globals.outputQmatrix_pop_on) {
        cerrAndLog("\nError: unable to produce population level Qmatrix, as population data not currently being used. Either read in population data (by setting popCol_on to true), or stop producing population level Qmatrix output (by setting outputQmatrix_pop_on to false and outputQmatrixError_pop_on to false).\n", globals.outputLog_on, globals.outputLog_fileStream);
        exit(1);
    }
    
    // force admix_on=true if producing Qmatrix_gene files
    if (!globals.admix_on && globals.outputQmatrix_gene_on) {
        cerrAndLog("\nError: admixture model must be turned on in order to produce gene level Qmatrix. Either switch to the admixture model (by setting admix_on to true) or stop producing gene level Qmatrix output (by setting outputQmatrix_gene_on and outputQmatrixError_gene_on to false).\n", globals.outputLog_on, globals.outputLog_fileStream);
        exit(1);
    }
    
    // force admix_on=true if producing maximum likelihood admixture frequencies
    if (!globals.admix_on && globals.outputMaxLike_admixFreqs_on) {
        cerrAndLog("\nError: admixture model must be turned on in order to produce maximum likelihood admixture frequency output. Either switch to the admixture model (by setting admix_on to true) or stop producing maximum likelihood admixture frequency output (by setting outputMaxLike_admixFreqs_on to false).\n", globals.outputLog_on, globals.outputLog_fileStream);
        exit(1);
    }
    
    // force outputQmatrix_?_on=true if outputQmatrixError_?_on=true for all Qmatrix types
    if ((globals.outputQmatrixError_ind_on && !globals.outputQmatrix_ind_on) || (globals.outputQmatrixError_pop_on && !globals.outputQmatrix_pop_on) || (globals.outputQmatrixError_gene_on && !globals.outputQmatrix_gene_on)) {
        cerrAndLog("\nError: if outputQmatrixError options are turned on then the corresponding outputQmatrix options must also be turned on.\n", globals.outputLog_on, globals.outputLog_fileStream);
        exit(1);
    }
    
    // force mainRepeats>1 if outputQmatrixError_?_on=true for all Qmatrix types
    if (globals.mainRepeats==1 && (globals.outputQmatrixError_ind_on || globals.outputQmatrixError_pop_on || globals.outputQmatrixError_gene_on)) {
        cerrAndLog("\nError: mainRepeats must be greater than 1 when any outputQmatrixError options are turned on.\n", globals.outputLog_on, globals.outputLog_fileStream);
        exit(1);
    }
    
    // force EMalgorithm_on=true if producing model comparison statistics
    if (!globals.EMalgorithm_on && globals.outputComparisonStatistics_on) {
        cerrAndLog("\nError: EM algorithm must be turned on in order to compute model comparison statistics. Either turn on the EM algorithm (by setting EMalgorithm_on to true) or stop producing model comparison statistics (by setting outputComparisonStatistics_on to false).\n", globals.outputLog_on, globals.outputLog_fileStream);
        exit(1);
    }
    
    // force EMalgorithm_on=true if producing maximum likelihood output
    if (!globals.EMalgorithm_on && (globals.outputMaxLike_alleleFreqs_on || globals.outputMaxLike_admixFreqs_on)) {
        cerrAndLog("\nError: EM algorithm must be turned on in order to produce maximum likelihood output files. Either turn on the EM algorithm (by setting EMalgorithm_on to true) or stop producing maximum likelihood output (by setting outputMaxLike_alleleFreqs_on and outputMaxLike_admixFreqs_on to false).\n", globals.outputLog_on, globals.outputLog_fileStream);
        exit(1);
    }
    
    // force (Kmax-Kmin)>=2 and mainRepeats>1 if outputEvanno_on=true
    if ((globals.Kmax-globals.Kmin)<2 && globals.outputEvanno_on) {
        cerrAndLog("\nError: Kmax must be at least 2 greater than Kmin when calculating Evanno's delta K.\n", globals.outputLog_on, globals.outputLog_fileStream);
        exit(1);
    }
    if (globals.mainRepeats==1 && globals.outputEvanno_on) {
        cerrAndLog("\nError: mainRepeats must be greater than 1 when calculating Evanno's delta K.\n", globals.outputLog_on, globals.outputLog_fileStream);
        exit(1);
    }
    
    // if using exhaustive approach, check that number of partitions required to sum over is reasonable. Otherwise throw warning
    if (globals.exhaustive_on && !globals.suppressWarning1_on) {
        
        // calculate number of partitions. Number of ways of splitting n elements into i groups is given by the Stirling number of the second kind {n, i}. Number of ways of splitting n elements into UP TO K groups is given by sum_{i=1}^k {n, i}. Calculate this for all K that will be explored under current settings. The total number of partitions (in log space) is given by log_partitions.
        double log_partitions = log(double(0));
        for (int K=globals.Kmin; K<=globals.Kmax; K++) {
            vector<double> StirlingNumbers = globals.admix_on ? StirlingSecond(sum(globals.ploidy_vec)*globals.loci) : StirlingSecond(globals.n);
            for (int i=0; (i<K) & (i<int(StirlingNumbers.size())); i++) {
                log_partitions = logSum(log_partitions,StirlingNumbers[i]);
            }
        }
        
        // if very large then error
        if (log_partitions>180) {
            cerrAndLog("\nWarning: for this combination of data and parameters the number of partitions explored in the exhaustive approach is greater than the number of protons in the observable universe, and the program is unlikely to finish within your lifetime. Either turn off the exhaustive approach, or to override this warning and continue with the analysis insert the optional parameter \"suppressWarning1_on\" with value \"true\" in the parameters file.\n", globals.outputLog_on, globals.outputLog_fileStream);
            exit(1);
        }
        if (log_partitions>log(double(1e7))) {
            cerrAndLog("\nWarning: for this combination of data and parameters the number of partitions explored in the exhaustive approach is extremely large (greater than 1e7 in total), and the program may take a very long time to execute. Either turn off the exhaustive approach, or to override this warning and continue with the analysis insert the optional parameter \"suppressWarning1_on\" with value \"true\" in the parameters file.\n", globals.outputLog_on, globals.outputLog_fileStream);
            exit(1);
        }
        
    }
    
    // ensure that alpha and alphaPropSD vectors are of length 1 or (Kmax-Kmin+1). If former then duplicate value as needed.
    if (int(globals.alpha.size())==1) {
        globals.alpha = vector<double>(globals.Kmax-globals.Kmin+1, globals.alpha[0]);
    } else if (int(globals.alpha.size())!=(globals.Kmax-globals.Kmin+1)) {
        cerrAndLog("\nWarning: alpha must contain either a single value to apply to all K, or a comma-separated list of values of length (Kmax-Kmin+1) to apply to each K individually.\n", globals.outputLog_on, globals.outputLog_fileStream);
        exit(1);
    }
    
    if (int(globals.alphaPropSD.size())==1) {
        globals.alphaPropSD = vector<double>(globals.Kmax-globals.Kmin+1, globals.alphaPropSD[0]);
    } else if (int(globals.alphaPropSD.size())!=(globals.Kmax-globals.Kmin+1)) {
        cerrAndLog("\nWarning: alphaPropSD must contain either a single value to apply to all K, or a comma-separated list of values of length (Kmax-Kmin+1).\n", globals.outputLog_on, globals.outputLog_fileStream);
        exit(1);
    }
    
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x1e8, %rsp            # imm = 0x1E8
movq %rdi, %rbx
cmpb $0x0, 0x2c4f(%rdi)
jne 0x2dd4a
cmpb $0x0, 0x2c3e(%rbx)
jne 0x2e10f
cmpb $0x0, 0x2c3f(%rbx)
jne 0x2e10f
cmpb $0x1, 0x2c40(%rbx)
je 0x2e10f
cmpb $0x0, 0x2ba1(%rbx)
jne 0x2dd60
cmpb $0x1, 0x2c3f(%rbx)
je 0x2e1ff
movb 0x2bd0(%rbx), %al
testb %al, %al
jne 0x2dd88
cmpb $0x1, 0x2c40(%rbx)
je 0x2e24f
testb %al, %al
jne 0x2dd88
cmpb $0x1, 0x2c4c(%rbx)
je 0x2e46d
movb 0x2c41(%rbx), %cl
cmpb $0x1, %cl
jne 0x2dda0
cmpb $0x1, 0x2c3e(%rbx)
jne 0x2e15f
movb 0x2c42(%rbx), %dl
cmpb $0x1, %dl
jne 0x2ddb8
cmpb $0x1, 0x2c3f(%rbx)
jne 0x2e15f
movb 0x2c43(%rbx), %sil
cmpb $0x1, %sil
jne 0x2ddd2
cmpb $0x0, 0x2c40(%rbx)
je 0x2e15f
movl 0x2c0c(%rbx), %eax
cmpl $0x1, %eax
setne %dil
orb %dl, %cl
orb %sil, %cl
xorb $0x1, %cl
orb %dil, %cl
je 0x2e1af
movb 0x2c30(%rbx), %cl
testb %cl, %cl
jne 0x2de25
cmpb $0x1, 0x2c49(%rbx)
je 0x2e29f
testb %cl, %cl
jne 0x2de25
cmpb $0x0, 0x2c4b(%rbx)
jne 0x2e33f
cmpb $0x1, 0x2c4c(%rbx)
je 0x2e33f
movl 0x2bcc(%rbx), %ecx
subl 0x2bc8(%rbx), %ecx
cmpl $0x1, %ecx
jg 0x2de43
cmpb $0x1, 0x2c4a(%rbx)
je 0x2e2ef
cmpl $0x1, %eax
jne 0x2de55
cmpb $0x1, 0x2c4a(%rbx)
je 0x2e38f
cmpb $0x1, 0x2c08(%rbx)
jne 0x2df91
cmpb $0x0, 0x2c4e(%rbx)
jne 0x2df91
xorpd %xmm0, %xmm0
callq 0x3290
movslq 0x2bc8(%rbx), %r15
cmpl 0x2bcc(%rbx), %r15d
jg 0x2df75
leaq 0x10(%rsp), %r14
cmpb $0x1, 0x2bd0(%rbx)
movsd %xmm0, 0x8(%rsp)
jne 0x2ded0
movq 0x2cd0(%rbx), %rax
movq 0x2cd8(%rbx), %rcx
subq %rax, %rcx
shrq $0x2, %rcx
testl %ecx, %ecx
jle 0x2ded8
andl $0x7fffffff, %ecx       # imm = 0x7FFFFFFF
xorl %edx, %edx
xorl %esi, %esi
addl (%rax,%rdx,4), %esi
incq %rdx
cmpq %rdx, %rcx
jne 0x2dec3
jmp 0x2deda
movl 0x2d18(%rbx), %esi
jmp 0x2dee1
xorl %esi, %esi
imull 0x2d1c(%rbx), %esi
movq %r14, %rdi
callq 0x1b3b4
movq 0x10(%rsp), %rdi
testq %r15, %r15
jle 0x2df42
movq 0x18(%rsp), %rax
subq %rdi, %rax
shrq $0x3, %rax
testl %eax, %eax
movsd 0x8(%rsp), %xmm0
jle 0x2df48
movl $0x1, %r12d
movsd -0x8(%rdi,%r12,8), %xmm1
callq 0x1aa59
movq 0x10(%rsp), %rdi
cmpq %r15, %r12
jge 0x2df48
movq 0x18(%rsp), %rax
subq %rdi, %rax
shrq $0x3, %rax
leaq 0x1(%r12), %rcx
cltq
cmpq %rax, %r12
movq %rcx, %r12
jl 0x2df0f
jmp 0x2df48
movsd 0x8(%rsp), %xmm0
testq %rdi, %rdi
je 0x2df5e
movsd %xmm0, 0x8(%rsp)
callq 0x3310
movsd 0x8(%rsp), %xmm0
leaq 0x1(%r15), %rax
movslq 0x2bcc(%rbx), %rcx
cmpq %rcx, %r15
movq %rax, %r15
jl 0x2de91
ucomisd 0x9f3b(%rip), %xmm0     # 0x37eb8
ja 0x2e4bd
ucomisd 0x9f35(%rip), %xmm0     # 0x37ec0
ja 0x2e50a
movabsq $0x7fffffff8, %r15      # imm = 0x7FFFFFFF8
movq 0x2bd8(%rbx), %rdx
movq 0x2be0(%rbx), %rax
subq %rdx, %rax
movq %rax, %rcx
andq %r15, %rcx
cmpq $0x8, %rcx
jne 0x2e035
movl 0x2bcc(%rbx), %eax
subl 0x2bc8(%rbx), %eax
incl %eax
movslq %eax, %rsi
leaq 0x10(%rsp), %r14
leaq 0x7(%rsp), %rcx
movq %r14, %rdi
callq 0x5bba
movq 0x2bd8(%rbx), %rdi
movapd (%r14), %xmm0
movq 0x10(%r14), %rax
movq %rdi, (%r14)
movups 0x2be0(%rbx), %xmm1
movupd %xmm0, 0x2bd8(%rbx)
movq %rax, 0x2be8(%rbx)
movups %xmm1, 0x8(%r14)
xorpd %xmm0, %xmm0
movapd %xmm0, (%r14)
movq $0x0, 0x10(%r14)
testq %rdi, %rdi
je 0x2e024
callq 0x3310
movq 0x10(%rsp), %rdi
testq %rdi, %rdi
je 0x2e04f
callq 0x3310
jmp 0x2e04f
shrq $0x3, %rax
movl 0x2bcc(%rbx), %ecx
subl 0x2bc8(%rbx), %ecx
incl %ecx
cmpl %eax, %ecx
jne 0x2e3df
movq 0x2bf0(%rbx), %rdx
movq 0x2bf8(%rbx), %rax
subq %rdx, %rax
andq %rax, %r15
cmpq $0x8, %r15
jne 0x2e0e6
movl 0x2bcc(%rbx), %eax
subl 0x2bc8(%rbx), %eax
incl %eax
movslq %eax, %rsi
leaq 0x10(%rsp), %r14
leaq 0x7(%rsp), %rcx
movq %r14, %rdi
callq 0x5bba
movq 0x2bf0(%rbx), %rdi
movapd (%r14), %xmm0
movq 0x10(%r14), %rax
movq %rdi, (%r14)
movups 0x2bf8(%rbx), %xmm1
movupd %xmm0, 0x2bf0(%rbx)
movq %rax, 0x2c00(%rbx)
movups %xmm1, 0x8(%r14)
xorpd %xmm0, %xmm0
movapd %xmm0, (%r14)
movq $0x0, 0x10(%r14)
testq %rdi, %rdi
je 0x2e0d5
callq 0x3310
movq 0x10(%rsp), %rdi
testq %rdi, %rdi
je 0x2e100
callq 0x3310
jmp 0x2e100
shrq $0x3, %rax
movl 0x2bcc(%rbx), %ecx
subl 0x2bc8(%rbx), %ecx
incl %ecx
cmpl %eax, %ecx
jne 0x2e426
addq $0x1e8, %rsp            # imm = 0x1E8
popq %rbx
popq %r12
popq %r14
popq %r15
retq
leaq 0x1d8(%rsp), %r15
movq %r15, -0x10(%r15)
leaq 0xa9d2(%rip), %rsi      # 0x38af4
leaq 0xaa63(%rip), %rdx      # 0x38b8c
leaq 0x1c8(%rsp), %r14
movq %r14, %rdi
callq 0x6e56
movzbl 0x2c3c(%rbx), %esi
addq $0x970, %rbx            # imm = 0x970
movq %r14, %rdi
movq %rbx, %rdx
callq 0x1db5c
leaq 0x1c8(%rsp), %rdi
jmp 0x2e54c
leaq 0x158(%rsp), %r15
movq %r15, -0x10(%r15)
leaq 0xad73(%rip), %rsi      # 0x38ee5
leaq 0xade5(%rip), %rdx      # 0x38f5e
leaq 0x148(%rsp), %r14
movq %r14, %rdi
callq 0x6e56
movzbl 0x2c3c(%rbx), %esi
addq $0x970, %rbx            # imm = 0x970
movq %r14, %rdi
movq %rbx, %rdx
callq 0x1db5c
leaq 0x148(%rsp), %rdi
jmp 0x2e54c
leaq 0x138(%rsp), %r15
movq %r15, -0x10(%r15)
leaq 0xad9d(%rip), %rsi      # 0x38f5f
leaq 0xadf4(%rip), %rdx      # 0x38fbd
leaq 0x128(%rsp), %r14
movq %r14, %rdi
callq 0x6e56
movzbl 0x2c3c(%rbx), %esi
addq $0x970, %rbx            # imm = 0x970
movq %r14, %rdi
movq %rbx, %rdx
callq 0x1db5c
leaq 0x128(%rsp), %rdi
jmp 0x2e54c
leaq 0x1b8(%rsp), %r15
movq %r15, -0x10(%r15)
leaq 0xa97b(%rip), %rsi      # 0x38b8d
leaq 0xaa99(%rip), %rdx      # 0x38cb2
leaq 0x1a8(%rsp), %r14
movq %r14, %rdi
callq 0x6e56
movzbl 0x2c3c(%rbx), %esi
addq $0x970, %rbx            # imm = 0x970
movq %r14, %rdi
movq %rbx, %rdx
callq 0x1db5c
leaq 0x1a8(%rsp), %rdi
jmp 0x2e54c
leaq 0x198(%rsp), %r15
movq %r15, -0x10(%r15)
leaq 0xaa51(%rip), %rsi      # 0x38cb3
leaq 0xab57(%rip), %rdx      # 0x38dc0
leaq 0x188(%rsp), %r14
movq %r14, %rdi
callq 0x6e56
movzbl 0x2c3c(%rbx), %esi
addq $0x970, %rbx            # imm = 0x970
movq %r14, %rdi
movq %rbx, %rdx
callq 0x1db5c
leaq 0x188(%rsp), %rdi
jmp 0x2e54c
leaq 0x118(%rsp), %r15
movq %r15, -0x10(%r15)
leaq 0xad0c(%rip), %rsi      # 0x38fbe
leaq 0xae04(%rip), %rdx      # 0x390bd
leaq 0x108(%rsp), %r14
movq %r14, %rdi
callq 0x6e56
movzbl 0x2c3c(%rbx), %esi
addq $0x970, %rbx            # imm = 0x970
movq %r14, %rdi
movq %rbx, %rdx
callq 0x1db5c
leaq 0x108(%rsp), %rdi
jmp 0x2e54c
leaq 0xd8(%rsp), %r15
movq %r15, -0x10(%r15)
leaq 0xaedd(%rip), %rsi      # 0x391df
leaq 0xaf2b(%rip), %rdx      # 0x39234
leaq 0xc8(%rsp), %r14
movq %r14, %rdi
callq 0x6e56
movzbl 0x2c3c(%rbx), %esi
addq $0x970, %rbx            # imm = 0x970
movq %r14, %rdi
movq %rbx, %rdx
callq 0x1db5c
leaq 0xc8(%rsp), %rdi
jmp 0x2e54c
leaq 0xf8(%rsp), %r15
movq %r15, -0x10(%r15)
leaq 0xad6c(%rip), %rsi      # 0x390be
leaq 0xae85(%rip), %rdx      # 0x391de
leaq 0xe8(%rsp), %r14
movq %r14, %rdi
callq 0x6e56
movzbl 0x2c3c(%rbx), %esi
addq $0x970, %rbx            # imm = 0x970
movq %r14, %rdi
movq %rbx, %rdx
callq 0x1db5c
leaq 0xe8(%rsp), %rdi
jmp 0x2e54c
leaq 0xb8(%rsp), %r15
movq %r15, -0x10(%r15)
leaq 0xae93(%rip), %rsi      # 0x39235
leaq 0xaeda(%rip), %rdx      # 0x39283
leaq 0xa8(%rsp), %r14
movq %r14, %rdi
callq 0x6e56
movzbl 0x2c3c(%rbx), %esi
addq $0x970, %rbx            # imm = 0x970
movq %r14, %rdi
movq %rbx, %rdx
callq 0x1db5c
leaq 0xa8(%rsp), %rdi
jmp 0x2e54c
leaq 0x58(%rsp), %r15
movq %r15, -0x10(%r15)
leaq 0xb1e5(%rip), %rsi      # 0x395d4
leaq 0xb281(%rip), %rdx      # 0x39677
leaq 0x48(%rsp), %r14
movq %r14, %rdi
callq 0x6e56
movzbl 0x2c3c(%rbx), %esi
addq $0x970, %rbx            # imm = 0x970
movq %r14, %rdi
movq %rbx, %rdx
callq 0x1db5c
leaq 0x48(%rsp), %rdi
jmp 0x2e54c
leaq 0x38(%rsp), %r15
movq %r15, -0x10(%r15)
leaq 0xb242(%rip), %rsi      # 0x39678
leaq 0xb2c4(%rip), %rdx      # 0x39701
leaq 0x28(%rsp), %r14
movq %r14, %rdi
callq 0x6e56
movzbl 0x2c3c(%rbx), %esi
addq $0x970, %rbx            # imm = 0x970
movq %r14, %rdi
movq %rbx, %rdx
callq 0x1db5c
leaq 0x28(%rsp), %rdi
jmp 0x2e54c
leaq 0x178(%rsp), %r15
movq %r15, -0x10(%r15)
leaq 0xa941(%rip), %rsi      # 0x38dc1
leaq 0xaa5d(%rip), %rdx      # 0x38ee4
leaq 0x168(%rsp), %r14
movq %r14, %rdi
callq 0x6e56
movzbl 0x2c3c(%rbx), %esi
addq $0x970, %rbx            # imm = 0x970
movq %r14, %rdi
movq %rbx, %rdx
callq 0x1db5c
leaq 0x168(%rsp), %rdi
jmp 0x2e54c
leaq 0x98(%rsp), %r15
movq %r15, -0x10(%r15)
leaq 0xadb4(%rip), %rsi      # 0x39284
leaq 0xaf60(%rip), %rdx      # 0x39437
leaq 0x88(%rsp), %r14
movq %r14, %rdi
callq 0x6e56
movzbl 0x2c3c(%rbx), %esi
addq $0x970, %rbx            # imm = 0x970
movq %r14, %rdi
movq %rbx, %rdx
callq 0x1db5c
leaq 0x88(%rsp), %rdi
jmp 0x2e54c
leaq 0x78(%rsp), %r15
movq %r15, -0x10(%r15)
leaq 0xaf1e(%rip), %rsi      # 0x39438
leaq 0xb0b2(%rip), %rdx      # 0x395d3
leaq 0x68(%rsp), %r14
movq %r14, %rdi
callq 0x6e56
movzbl 0x2c3c(%rbx), %esi
addq $0x970, %rbx            # imm = 0x970
movq %r14, %rdi
movq %rbx, %rdx
callq 0x1db5c
leaq 0x68(%rsp), %rdi
callq 0x3150
movl $0x1, %edi
callq 0x33d0
movq %rax, %rbx
movq 0x68(%rsp), %rdi
jmp 0x2e60f
movq %rax, %rbx
movq 0x88(%rsp), %rdi
jmp 0x2e60f
movq %rax, %rbx
movq 0x168(%rsp), %rdi
jmp 0x2e60f
movq %rax, %rbx
movq 0x28(%rsp), %rdi
jmp 0x2e60f
movq %rax, %rbx
movq 0x48(%rsp), %rdi
jmp 0x2e60f
movq %rax, %rbx
movq 0xa8(%rsp), %rdi
jmp 0x2e60f
movq %rax, %rbx
movq 0xe8(%rsp), %rdi
jmp 0x2e60f
movq %rax, %rbx
movq 0xc8(%rsp), %rdi
jmp 0x2e60f
movq %rax, %rbx
movq 0x108(%rsp), %rdi
jmp 0x2e60f
movq %rax, %rbx
movq 0x188(%rsp), %rdi
jmp 0x2e60f
movq %rax, %rbx
movq 0x1a8(%rsp), %rdi
jmp 0x2e60f
movq %rax, %rbx
movq 0x128(%rsp), %rdi
jmp 0x2e60f
movq %rax, %rbx
movq 0x148(%rsp), %rdi
jmp 0x2e60f
movq %rax, %rbx
movq 0x1c8(%rsp), %rdi
cmpq %r15, %rdi
jne 0x2e623
jmp 0x2e628
movq %rax, %rbx
movq 0x10(%rsp), %rdi
testq %rdi, %rdi
je 0x2e628
callq 0x3310
movq %rbx, %rdi
callq 0x3580