// File: canzarlab[P]Trajan/src/BnB.cpp
// Function: BnB::SolveLP()
bool BnB::SolveLP()
{
    int nr_t = Triplets.size();
    int nr_r = nr_rows;
    double f;

#if DEBUG == 1
    int qwe = 0;
    double qwer = 0.0;
    Timer T;
#endif

    while(1)
    {
        SpMat A(nr_rows, nr_cols);
        A.setFromTriplets(Triplets.begin(), Triplets.end());
        Vector b = Vector::Ones(nr_rows);       
        y = Vector::Zero(nr_rows);
        Vector d = -c;            

        BranchingJRF simpleJRF(A, b, d, x, y);
        simpleJRF.lo = sys_lo;
        simpleJRF.hi = sys_hi;
        AugmentedLagrangian solver(simpleJRF, 15);
        solver.setParameter("verbose", false);
        solver.setParameter("pgtol", 0.275); 
        solver.setParameter("constraintsTol", 1e-4);

#if DEBUG == 1
        T.start();
#endif
        SolverStatus status = solver.solve();    
#if DEBUG == 1        
        if (status == SUBOPTIMAL)
            cout << "SUBOPTIMAL(" << status << ")" << endl; 
        if (status == UNBOUNDED)
            cout << "UNBOUNDED(" << status << ")" << endl; 
        if (status == INFEASIBLE)
            cout << "INFEASIBLE(" << status << ")" << endl; 
        if (status == NUM_ERROR)
            cout << "NUM_ERROR(" << status << ")" << endl; 
        T.stop();
        qwe++;
        qwer += T.secs();
        geno_calls++;
        geno_time += T.secs();
#endif

        if (status == INFEASIBLE) 
        {                
            Cleanup(nr_t, nr_r);            
            return 0; 
        }

        x = Vector::ConstMapType(solver.x(), nr_cols); 
        
        if (LP::cf == 1 && Add<1>())
            continue;
        else if (LP::cf == 2 && (Add<1>() + Add<2>()))
            continue;

        f = solver.f();    

#if DEBUG == 1
        cout << "rows: " << nr_rows << endl;
        cout << "cols: " << nr_cols << endl;
        cout << "geno calls: " << qwe << endl;
        cout << "geno time: " << qwer << endl;
        cout << "total geno calls: " << geno_calls << endl;
        cout << "total geno time: " << geno_time << endl;
        cout << "upper: " << f << endl;
        cout << "lower: " << sys_lb << endl;
        int qwert = 0;
        for (size_t i = 0; i < x.size(); ++i)
            if (x(i) > 1e-3 && x(i) < 1 - 1e-3 && !sys_x[i])
                qwert++;
        cout << "fracs: " << qwert << endl;
#endif

        if (sys_lb != double(INF) && f >= sys_lb * (1.0 + con_eps)) 
        {    
#if DEBUG == 1            
            cout << "The branch was cut." << endl << endl;
#endif
            Cleanup(nr_t, nr_r);            
            return 0; 
        }            
#if DEBUG == 1
        else cout << endl;        
#endif

        break;
    }
    
    vector<pair<size_t, size_t>> vp;
    size_t p = 0;

    for (size_t i = 0; i < t1.GetNumNodes(); ++i)
        for (size_t j = 0; j < t2.GetNumNodes(); ++j)
            if (K[i][j] != -1 && x(K[i][j]) > 1e-3 && x(K[i][j]) < 1 - 1e-3 && !sys_x[K[i][j]])                
                vp.emplace_back(i, j);                

    sort(vp.begin(), vp.end(), [this](pair<size_t, size_t>& p, pair<size_t, size_t>& q)
    { 
        int i = K[p.first][p.second];
        int j = K[q.first][q.second];
        return c(i) > c(j); 
    });
   
    for (int i = 0; !p && i < vp.size(); ++i)
    {
        bool flag = 1;
        for (size_t k = 0; flag && k < t1.GetNumNodes(); ++k)          
            for (size_t j = 0; flag && j < t2.GetNumNodes(); ++j)
                if (K[k][j] != -1 && sys_x[K[k][j]])                              
                    flag = IsNotInConflict(vp[i].first, k, vp[i].second, j);                    
        if (flag) p = 1 + K[vp[i].first][vp[i].second];
    }

    if (vp.size())
    {
        bool b0 = !p; 
        p = (b0) ? K[vp[0].first][vp[0].second] : p - 1; // bool b1 = b0 || x(--p) >= 0.1;     
        bool s0 = !b0 && SolveRec(p, 1);            
        bool s1 = SolveRec(p, 0);                       
        if (!s0 && !s1)
        {                 
            Cleanup(nr_t, nr_r);            
            return 0;
        }
    }
    else if (sys_lb > f)
    {
#if DEBUG == 1
        if (gap_flag) 
        {
            gap_amount += abs(sys_lb - f);  
            ++gap_count;
        }
        else 
            gap_flag = 1;
#endif
        sys_s = x;
        sys_lb = f; 
    }

    Cleanup(nr_t, nr_r);
    return 1;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x5f0, %rsp            # imm = 0x5F0
movq %rdi, -0x10(%rbp)
movq -0x10(%rbp), %rdi
movq %rdi, -0x348(%rbp)
addq $0x88, %rdi
callq 0xb5310
movq %rax, %rcx
movq -0x348(%rbp), %rax
movl %ecx, -0x14(%rbp)
movl 0x108(%rax), %eax
movl %eax, -0x18(%rbp)
movl $0x0, -0x24(%rbp)
xorps %xmm0, %xmm0
movsd %xmm0, -0x30(%rbp)
leaq -0x70(%rbp), %rdi
callq 0xeb30
movq -0x348(%rbp), %rax
movslq 0x108(%rax), %rsi
movslq 0x10c(%rax), %rdx
leaq -0xb8(%rbp), %rdi
movq %rdi, -0x350(%rbp)
callq 0xaf0a0
movq -0x348(%rbp), %rdi
addq $0x88, %rdi
movq %rdi, -0x358(%rbp)
callq 0xaf180
movq -0x358(%rbp), %rdi
movq %rax, -0xc0(%rbp)
callq 0xaf1b0
movq -0x350(%rbp), %rdi
movq %rax, -0xc8(%rbp)
leaq -0xc0(%rbp), %rsi
leaq -0xc8(%rbp), %rdx
callq 0xaf130
jmp 0xcc31c
movq -0x348(%rbp), %rax
movslq 0x108(%rax), %rsi
leaq -0x100(%rbp), %rdi
callq 0xaf2b0
jmp 0xcc338
leaq -0xe8(%rbp), %rdi
leaq -0x100(%rbp), %rsi
callq 0xaf2f0
jmp 0xcc34d
movq -0x348(%rbp), %rax
movslq 0x108(%rax), %rsi
leaq -0x118(%rbp), %rdi
callq 0x13c30
jmp 0xcc369
movq -0x348(%rbp), %rdi
addq $0xd0, %rdi
leaq -0x118(%rbp), %rsi
callq 0x28100
jmp 0xcc385
movq -0x348(%rbp), %rsi
addq $0xf8, %rsi
leaq -0x138(%rbp), %rdi
callq 0xaf330
jmp 0xcc3a1
leaq -0x128(%rbp), %rdi
leaq -0x138(%rbp), %rsi
callq 0xaf380
jmp 0xcc3b6
movq -0x348(%rbp), %r9
movq %r9, %r8
addq $0xc0, %r8
addq $0xd0, %r9
leaq -0x198(%rbp), %rdi
leaq -0xb8(%rbp), %rsi
leaq -0xe8(%rbp), %rdx
leaq -0x128(%rbp), %rcx
callq 0xcee40
jmp 0xcc3f1
movq -0x348(%rbp), %rsi
addq $0x228, %rsi            # imm = 0x228
leaq -0x148(%rbp), %rdi
callq 0x145a0
jmp 0xcc40d
movq -0x348(%rbp), %rsi
addq $0x238, %rsi            # imm = 0x238
leaq -0x158(%rbp), %rdi
callq 0x145a0
jmp 0xcc429
leaq -0x200(%rbp), %rdi
leaq -0x198(%rbp), %rsi
movl $0xf, %edx
callq 0x124e0
jmp 0xcc443
leaq -0x221(%rbp), %rdi
movq %rdi, -0x360(%rbp)
callq 0xa7d0
movq -0x360(%rbp), %rdx
leaq 0x3efa6(%rip), %rsi     # 0x10b40a
leaq -0x220(%rbp), %rdi
callq 0xe9b0
jmp 0xcc472
leaq -0x200(%rbp), %rdi
leaq -0x220(%rbp), %rsi
xorps %xmm0, %xmm0
callq 0x139e0
jmp 0xcc48a
leaq -0x220(%rbp), %rdi
callq 0xa8d8
leaq -0x221(%rbp), %rdi
callq 0xa4c0
leaq -0x249(%rbp), %rdi
movq %rdi, -0x368(%rbp)
callq 0xa7d0
movq -0x368(%rbp), %rdx
leaq 0x3ef25(%rip), %rsi     # 0x10b3e8
leaq -0x248(%rbp), %rdi
callq 0xe9b0
jmp 0xcc4d1
leaq -0x200(%rbp), %rdi
leaq -0x248(%rbp), %rsi
movsd 0x5f5c1(%rip), %xmm0    # 0x12baa8
callq 0x139e0
jmp 0xcc4ee
leaq -0x248(%rbp), %rdi
callq 0xa8d8
leaq -0x249(%rbp), %rdi
callq 0xa4c0
leaq -0x271(%rbp), %rdi
movq %rdi, -0x370(%rbp)
callq 0xa7d0
movq -0x370(%rbp), %rdx
leaq 0x3eed4(%rip), %rsi     # 0x10b3fb
leaq -0x270(%rbp), %rdi
callq 0xe9b0
jmp 0xcc535
leaq -0x200(%rbp), %rdi
leaq -0x270(%rbp), %rsi
movsd 0x5f565(%rip), %xmm0    # 0x12bab0
callq 0x139e0
jmp 0xcc552
leaq -0x270(%rbp), %rdi
callq 0xa8d8
leaq -0x271(%rbp), %rdi
callq 0xa4c0
leaq -0x70(%rbp), %rdi
callq 0xeb50
jmp 0xcc575
leaq -0x200(%rbp), %rdi
callq 0x125f0
movl %eax, -0x374(%rbp)
jmp 0xcc589
movl -0x374(%rbp), %eax
movl %eax, -0x278(%rbp)
cmpl $0x1, -0x278(%rbp)
jne 0xcc74b
movq 0xd4a07(%rip), %rdi     # 0x1a0fb0
leaq 0x5f548(%rip), %rsi     # 0x12baf8
callq 0xa440
movq %rax, -0x380(%rbp)
jmp 0xcc5be
movq -0x380(%rbp), %rdi
movl -0x278(%rbp), %esi
callq 0xa790
movq %rax, -0x388(%rbp)
jmp 0xcc5d9
movq -0x388(%rbp), %rdi
leaq 0x5fa3e(%rip), %rsi     # 0x12c025
callq 0xa440
movq %rax, -0x390(%rbp)
jmp 0xcc5f5
movq -0x390(%rbp), %rdi
movq 0xd495d(%rip), %rsi     # 0x1a0f60
callq 0xa4a0
jmp 0xcc60a
jmp 0xcc74b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xd0(%rbp)
movl %eax, -0xd4(%rbp)
jmp 0xcd027
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xd0(%rbp)
movl %eax, -0xd4(%rbp)
jmp 0xcd01b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xd0(%rbp)
movl %eax, -0xd4(%rbp)
jmp 0xcd00f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xd0(%rbp)
movl %eax, -0xd4(%rbp)
jmp 0xcd003
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xd0(%rbp)
movl %eax, -0xd4(%rbp)
jmp 0xcc69d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xd0(%rbp)
movl %eax, -0xd4(%rbp)
leaq -0x220(%rbp), %rdi
callq 0xa8d8
leaq -0x221(%rbp), %rdi
callq 0xa4c0
jmp 0xccff7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xd0(%rbp)
movl %eax, -0xd4(%rbp)
jmp 0xcc6e0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xd0(%rbp)
movl %eax, -0xd4(%rbp)
leaq -0x248(%rbp), %rdi
callq 0xa8d8
leaq -0x249(%rbp), %rdi
callq 0xa4c0
jmp 0xccff7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xd0(%rbp)
movl %eax, -0xd4(%rbp)
jmp 0xcc723
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xd0(%rbp)
movl %eax, -0xd4(%rbp)
leaq -0x270(%rbp), %rdi
callq 0xa8d8
leaq -0x271(%rbp), %rdi
callq 0xa4c0
jmp 0xccff7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xd0(%rbp)
movl %eax, -0xd4(%rbp)
jmp 0xccff7
cmpl $0x2, -0x278(%rbp)
jne 0xcc7be
movq 0xd4855(%rip), %rdi     # 0x1a0fb0
leaq 0x5f3a2(%rip), %rsi     # 0x12bb04
callq 0xa440
movq %rax, -0x398(%rbp)
jmp 0xcc770
movq -0x398(%rbp), %rdi
movl -0x278(%rbp), %esi
callq 0xa790
movq %rax, -0x3a0(%rbp)
jmp 0xcc78b
movq -0x3a0(%rbp), %rdi
leaq 0x5f88c(%rip), %rsi     # 0x12c025
callq 0xa440
movq %rax, -0x3a8(%rbp)
jmp 0xcc7a7
movq -0x3a8(%rbp), %rdi
movq 0xd47ab(%rip), %rsi     # 0x1a0f60
callq 0xa4a0
jmp 0xcc7bc
jmp 0xcc7be
cmpl $0x3, -0x278(%rbp)
jne 0xcc831
movq 0xd47e2(%rip), %rdi     # 0x1a0fb0
leaq 0x5f33a(%rip), %rsi     # 0x12bb0f
callq 0xa440
movq %rax, -0x3b0(%rbp)
jmp 0xcc7e3
movq -0x3b0(%rbp), %rdi
movl -0x278(%rbp), %esi
callq 0xa790
movq %rax, -0x3b8(%rbp)
jmp 0xcc7fe
movq -0x3b8(%rbp), %rdi
leaq 0x5f819(%rip), %rsi     # 0x12c025
callq 0xa440
movq %rax, -0x3c0(%rbp)
jmp 0xcc81a
movq -0x3c0(%rbp), %rdi
movq 0xd4738(%rip), %rsi     # 0x1a0f60
callq 0xa4a0
jmp 0xcc82f
jmp 0xcc831
cmpl $0x4, -0x278(%rbp)
jne 0xcc8a4
movq 0xd476f(%rip), %rdi     # 0x1a0fb0
leaq 0x5f2d3(%rip), %rsi     # 0x12bb1b
callq 0xa440
movq %rax, -0x3c8(%rbp)
jmp 0xcc856
movq -0x3c8(%rbp), %rdi
movl -0x278(%rbp), %esi
callq 0xa790
movq %rax, -0x3d0(%rbp)
jmp 0xcc871
movq -0x3d0(%rbp), %rdi
leaq 0x5f7a6(%rip), %rsi     # 0x12c025
callq 0xa440
movq %rax, -0x3d8(%rbp)
jmp 0xcc88d
movq -0x3d8(%rbp), %rdi
movq 0xd46c5(%rip), %rsi     # 0x1a0f60
callq 0xa4a0
jmp 0xcc8a2
jmp 0xcc8a4
leaq -0x70(%rbp), %rdi
callq 0xf350
jmp 0xcc8af
movl -0x24(%rbp), %eax
incl %eax
movl %eax, -0x24(%rbp)
leaq -0x70(%rbp), %rdi
callq 0xf3b0
movss %xmm0, -0x3dc(%rbp)
jmp 0xcc8ca
movss -0x3dc(%rbp), %xmm0
cvtss2sd %xmm0, %xmm1
movsd -0x30(%rbp), %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x30(%rbp)
movl 0xd4c2a(%rip), %eax     # 0x1a1514
incl %eax
movl %eax, 0xd4c22(%rip)     # 0x1a1514
leaq -0x70(%rbp), %rdi
callq 0xf3b0
movss %xmm0, -0x3e0(%rbp)
jmp 0xcc905
movss -0x3e0(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
addsd 0xd4bff(%rip), %xmm0    # 0x1a1518
movsd %xmm0, 0xd4bf7(%rip)    # 0x1a1518
cmpl $0x3, -0x278(%rbp)
jne 0xcc953
movq -0x348(%rbp), %rdi
movslq -0x14(%rbp), %rsi
movslq -0x18(%rbp), %rdx
callq 0xcc210
jmp 0xcc940
movb $0x0, -0x1(%rbp)
movl $0x1, -0x27c(%rbp)
jmp 0xccf91
leaq -0x200(%rbp), %rdi
callq 0x13980
movq %rax, -0x3e8(%rbp)
jmp 0xcc968
movq -0x348(%rbp), %rax
movslq 0x10c(%rax), %rax
movq %rax, -0x3f0(%rbp)
leaq -0x29a(%rbp), %rdi
callq 0x160e0
jmp 0xcc98b
movq -0x3f0(%rbp), %rdx
movq -0x3e8(%rbp), %rsi
leaq -0x298(%rbp), %rdi
leaq -0x29a(%rbp), %rcx
callq 0x1cea0
jmp 0xcc9ae
movq -0x348(%rbp), %rdi
addq $0xc0, %rdi
leaq -0x298(%rbp), %rsi
callq 0x14740
jmp 0xcc9ca
leaq 0xd4b0f(%rip), %rax     # 0x1a14e0
cmpl $0x1, (%rax)
jne 0xcca04
movq -0x348(%rbp), %rdi
callq 0xaf040
movl %eax, -0x3f4(%rbp)
jmp 0xcc9ea
movl -0x3f4(%rbp), %eax
cmpl $0x0, %eax
je 0xcca04
movl $0x2, -0x27c(%rbp)
jmp 0xccf91
leaq 0xd4ad5(%rip), %rax     # 0x1a14e0
cmpl $0x2, (%rax)
jne 0xcca5a
movq -0x348(%rbp), %rdi
callq 0xaf040
movl %eax, -0x3f8(%rbp)
jmp 0xcca24
movq -0x348(%rbp), %rdi
callq 0xaf060
movl %eax, -0x3fc(%rbp)
jmp 0xcca38
movl -0x3fc(%rbp), %ecx
movl -0x3f8(%rbp), %eax
addl %ecx, %eax
cmpl $0x0, %eax
je 0xcca5a
movl $0x2, -0x27c(%rbp)
jmp 0xccf91
jmp 0xcca5c
leaq -0x200(%rbp), %rdi
callq 0x139c0
movsd %xmm0, -0x408(%rbp)
jmp 0xcca72
movsd -0x408(%rbp), %xmm0
movsd %xmm0, -0x20(%rbp)
movq 0xd452a(%rip), %rdi     # 0x1a0fb0
leaq 0x5f099(%rip), %rsi     # 0x12bb26
callq 0xa440
movq %rax, -0x410(%rbp)
jmp 0xcca9b
movq -0x410(%rbp), %rdi
movq -0x348(%rbp), %rax
movl 0x108(%rax), %esi
callq 0xa790
movq %rax, -0x418(%rbp)
jmp 0xccabd
movq -0x418(%rbp), %rdi
movq 0xd4495(%rip), %rsi     # 0x1a0f60
callq 0xa4a0
jmp 0xccad2
movq 0xd44d7(%rip), %rdi     # 0x1a0fb0
leaq 0x5f04d(%rip), %rsi     # 0x12bb2d
callq 0xa440
movq %rax, -0x420(%rbp)
jmp 0xccaee
movq -0x420(%rbp), %rdi
movq -0x348(%rbp), %rax
movl 0x10c(%rax), %esi
callq 0xa790
movq %rax, -0x428(%rbp)
jmp 0xccb10
movq -0x428(%rbp), %rdi
movq 0xd4442(%rip), %rsi     # 0x1a0f60
callq 0xa4a0
jmp 0xccb25
movq 0xd4484(%rip), %rdi     # 0x1a0fb0
leaq 0x5ef93(%rip), %rsi     # 0x12bac6
callq 0xa440
movq %rax, -0x430(%rbp)
jmp 0xccb41
movq -0x430(%rbp), %rdi
movl -0x24(%rbp), %esi
callq 0xa790
movq %rax, -0x438(%rbp)
jmp 0xccb59
movq -0x438(%rbp), %rdi
movq 0xd43f9(%rip), %rsi     # 0x1a0f60
callq 0xa4a0
jmp 0xccb6e
movq 0xd443b(%rip), %rdi     # 0x1a0fb0
leaq 0x5ef5d(%rip), %rsi     # 0x12bad9
callq 0xa440
movq %rax, -0x440(%rbp)
jmp 0xccb8a
movq -0x440(%rbp), %rdi
movsd -0x30(%rbp), %xmm0
callq 0xa870
movq %rax, -0x448(%rbp)
jmp 0xccba4
movq -0x448(%rbp), %rdi
movq 0xd43ae(%rip), %rsi     # 0x1a0f60
callq 0xa4a0
jmp 0xccbb9
movq 0xd43f0(%rip), %rdi     # 0x1a0fb0
leaq 0x5eef9(%rip), %rsi     # 0x12bac0
callq 0xa440
movq %rax, -0x450(%rbp)
jmp 0xccbd5
movq -0x450(%rbp), %rdi
movl 0xd4932(%rip), %esi     # 0x1a1514
callq 0xa790
movq %rax, -0x458(%rbp)
jmp 0xccbf0
movq -0x458(%rbp), %rdi
movq 0xd4362(%rip), %rsi     # 0x1a0f60
callq 0xa4a0
jmp 0xccc05
movq 0xd43a4(%rip), %rdi     # 0x1a0fb0
leaq 0x5eec0(%rip), %rsi     # 0x12bad3
callq 0xa440
movq %rax, -0x460(%rbp)
jmp 0xccc21
movq -0x460(%rbp), %rdi
movsd 0xd48e8(%rip), %xmm0    # 0x1a1518
callq 0xa870
movq %rax, -0x468(%rbp)
jmp 0xccc3e
movq -0x468(%rbp), %rdi
movq 0xd4314(%rip), %rsi     # 0x1a0f60
callq 0xa4a0
jmp 0xccc53
movq 0xd4356(%rip), %rdi     # 0x1a0fb0
leaq 0x5eed3(%rip), %rsi     # 0x12bb34
callq 0xa440
movq %rax, -0x470(%rbp)
jmp 0xccc6f
movq -0x470(%rbp), %rdi
movsd -0x20(%rbp), %xmm0
callq 0xa870
movq %rax, -0x478(%rbp)
jmp 0xccc89
movq -0x478(%rbp), %rdi
movq 0xd42c9(%rip), %rsi     # 0x1a0f60
callq 0xa4a0
jmp 0xccc9e
movq 0xd430b(%rip), %rdi     # 0x1a0fb0
leaq 0x5ee90(%rip), %rsi     # 0x12bb3c
callq 0xa440
movq %rax, -0x480(%rbp)
jmp 0xcccba
movq -0x480(%rbp), %rdi
movq -0x348(%rbp), %rax
movsd 0x1e8(%rax), %xmm0
callq 0xa870
movq %rax, -0x488(%rbp)
jmp 0xcccde
movq -0x488(%rbp), %rdi
movq 0xd4274(%rip), %rsi     # 0x1a0f60
callq 0xa4a0
jmp 0xcccf3
movl $0x0, -0x2a0(%rbp)
movq $0x0, -0x2a8(%rbp)
movq -0x348(%rbp), %rdi
movq -0x2a8(%rbp), %rax
movq %rax, -0x498(%rbp)
addq $0xc0, %rdi
callq 0x14700
movq %rax, -0x490(%rbp)
jmp 0xccd32
movq -0x498(%rbp), %rax
movq -0x490(%rbp), %rcx
cmpq %rcx, %rax
jae 0xcce5f
movq -0x348(%rbp), %rdi
addq $0xc0, %rdi
movq -0x2a8(%rbp), %rsi
callq 0x145f0
movq %rax, -0x4a0(%rbp)
jmp 0xccd6c
movq -0x4a0(%rbp), %rax
movsd (%rax), %xmm0
xorl %eax, %eax
movsd 0x40eff(%rip), %xmm1    # 0x10dc80
ucomisd %xmm1, %xmm0
movb %al, -0x4a1(%rbp)
jbe 0xcce2b
movq -0x348(%rbp), %rdi
addq $0xc0, %rdi
movq -0x2a8(%rbp), %rsi
callq 0x145f0
movq %rax, -0x4b0(%rbp)
jmp 0xccdb4
movq -0x4b0(%rbp), %rcx
xorl %eax, %eax
movsd 0x5ecf3(%rip), %xmm0    # 0x12bab8
ucomisd (%rcx), %xmm0
movb %al, -0x4a1(%rbp)
jbe 0xcce2b
movq -0x348(%rbp), %rdi
addq $0x1f0, %rdi            # imm = 0x1F0
movq -0x2a8(%rbp), %rsi
callq 0x997b0
movq %rdx, -0x4c0(%rbp)
movq %rax, -0x4b8(%rbp)
jmp 0xccdfb
movq -0x4c0(%rbp), %rax
movq -0x4b8(%rbp), %rcx
movq %rcx, -0x2b8(%rbp)
movq %rax, -0x2b0(%rbp)
leaq -0x2b8(%rbp), %rdi
callq 0x99810
xorb $-0x1, %al
movb %al, -0x4a1(%rbp)
movb -0x4a1(%rbp), %al
testb $0x1, %al
jne 0xcce37
jmp 0xcce46
movl -0x2a0(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x2a0(%rbp)
jmp 0xcce48
movq -0x2a8(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x2a8(%rbp)
jmp 0xccd08
movq 0xd414a(%rip), %rdi     # 0x1a0fb0
leaq 0x5ecd7(%rip), %rsi     # 0x12bb44
callq 0xa440
movq %rax, -0x4c8(%rbp)
jmp 0xcce7b
movq -0x4c8(%rbp), %rdi
movl -0x2a0(%rbp), %esi
callq 0xa790
movq %rax, -0x4d0(%rbp)
jmp 0xcce96
movq -0x4d0(%rbp), %rdi
movq 0xd40bc(%rip), %rsi     # 0x1a0f60
callq 0xa4a0
jmp 0xcceab
movq -0x348(%rbp), %rax
movsd 0x1e8(%rax), %xmm0
movsd 0x3e4de(%rip), %xmm1    # 0x10b3a0
ucomisd %xmm1, %xmm0
jne 0xccecf
jp 0xccecf
jmp 0xccf70
movq -0x348(%rbp), %rax
movsd -0x20(%rbp), %xmm0
movsd 0x1e8(%rax), %xmm1
movsd 0x40d7d(%rip), %xmm2    # 0x10dc68
addsd 0x248(%rax), %xmm2
mulsd %xmm2, %xmm1
ucomisd %xmm1, %xmm0
jb 0xccf70
movq 0xd40ac(%rip), %rdi     # 0x1a0fb0
leaq 0x5ec41(%rip), %rsi     # 0x12bb4c
callq 0xa440
movq %rax, -0x4d8(%rbp)
jmp 0xccf19
movq -0x4d8(%rbp), %rdi
movq 0xd4039(%rip), %rsi     # 0x1a0f60
callq 0xa4a0
movq %rax, -0x4e0(%rbp)
jmp 0xccf35
movq -0x4e0(%rbp), %rdi
movq 0xd401d(%rip), %rsi     # 0x1a0f60
callq 0xa4a0
jmp 0xccf4a
movq -0x348(%rbp), %rdi
movslq -0x14(%rbp), %rsi
movslq -0x18(%rbp), %rdx
callq 0xcc210
jmp 0xccf60
movb $0x0, -0x1(%rbp)
movl $0x1, -0x27c(%rbp)
jmp 0xccf91
movq 0xd4039(%rip), %rdi     # 0x1a0fb0
movq 0xd3fe2(%rip), %rsi     # 0x1a0f60
callq 0xa4a0
jmp 0xccf85
jmp 0xccf87
movl $0x3, -0x27c(%rbp)
leaq -0x200(%rbp), %rdi
callq 0xaf420
leaq -0x198(%rbp), %rdi
callq 0xcef80
leaq -0x128(%rbp), %rdi
callq 0xff40
leaq -0xe8(%rbp), %rdi
callq 0xff40
leaq -0xb8(%rbp), %rdi
callq 0xaf470
movl -0x27c(%rbp), %eax
movl %eax, -0x4e4(%rbp)
subl $0x1, %eax
je 0xcd8fd
jmp 0xccfe4
movl -0x4e4(%rbp), %eax
subl $0x2, %eax
je 0xcc2a4
jmp 0xccff5
jmp 0xcd038
leaq -0x200(%rbp), %rdi
callq 0xaf420
leaq -0x198(%rbp), %rdi
callq 0xcef80
leaq -0x128(%rbp), %rdi
callq 0xff40
leaq -0xe8(%rbp), %rdi
callq 0xff40
leaq -0xb8(%rbp), %rdi
callq 0xaf470
jmp 0xcd90b
leaq -0x2d0(%rbp), %rdi
callq 0xcefd0
movq $0x0, -0x2d8(%rbp)
movq $0x0, -0x2e0(%rbp)
movq -0x348(%rbp), %rax
movq -0x2e0(%rbp), %rcx
movq %rcx, -0x4f0(%rbp)
movq 0x30(%rax), %rdi
callq 0xa8e00
movl %eax, -0x4e8(%rbp)
jmp 0xcd080
movq -0x4f0(%rbp), %rax
movl -0x4e8(%rbp), %ecx
movslq %ecx, %rcx
cmpq %rcx, %rax
jae 0xcd30f
movq $0x0, -0x2e8(%rbp)
movq -0x348(%rbp), %rax
movq -0x2e8(%rbp), %rcx
movq %rcx, -0x500(%rbp)
movq 0x38(%rax), %rdi
callq 0xa8e00
movl %eax, -0x4f4(%rbp)
jmp 0xcd0ca
movq -0x500(%rbp), %rax
movl -0x4f4(%rbp), %ecx
movslq %ecx, %rcx
cmpq %rcx, %rax
jae 0xcd2f6
movq -0x348(%rbp), %rdi
addq $0xe0, %rdi
movq -0x2e0(%rbp), %rsi
callq 0x993b0
movq %rax, %rdi
movq -0x2e8(%rbp), %rsi
callq 0x145d0
movq %rax, %rcx
xorl %eax, %eax
cmpl $-0x1, (%rcx)
movb %al, -0x501(%rbp)
je 0xcd290
movq -0x348(%rbp), %rdi
movq %rdi, %rax
addq $0xc0, %rax
movq %rax, -0x518(%rbp)
addq $0xe0, %rdi
movq -0x2e0(%rbp), %rsi
callq 0x993b0
movq %rax, %rdi
movq -0x2e8(%rbp), %rsi
callq 0x145d0
movq -0x518(%rbp), %rdi
movslq (%rax), %rsi
callq 0x145f0
movq %rax, -0x510(%rbp)
jmp 0xcd171
movq -0x510(%rbp), %rax
movsd (%rax), %xmm0
xorl %eax, %eax
movsd 0x40afa(%rip), %xmm1    # 0x10dc80
ucomisd %xmm1, %xmm0
movb %al, -0x501(%rbp)
jbe 0xcd290
movq -0x348(%rbp), %rdi
movq %rdi, %rax
addq $0xc0, %rax
movq %rax, -0x528(%rbp)
addq $0xe0, %rdi
movq -0x2e0(%rbp), %rsi
callq 0x993b0
movq %rax, %rdi
movq -0x2e8(%rbp), %rsi
callq 0x145d0
movq -0x528(%rbp), %rdi
movslq (%rax), %rsi
callq 0x145f0
movq %rax, -0x520(%rbp)
jmp 0xcd1e7
movq -0x520(%rbp), %rcx
xorl %eax, %eax
movsd 0x5e8c0(%rip), %xmm0    # 0x12bab8
ucomisd (%rcx), %xmm0
movb %al, -0x501(%rbp)
jbe 0xcd290
movq -0x348(%rbp), %rdi
movq %rdi, %rax
addq $0x1f0, %rax            # imm = 0x1F0
movq %rax, -0x540(%rbp)
addq $0xe0, %rdi
movq -0x2e0(%rbp), %rsi
callq 0x993b0
movq %rax, %rdi
movq -0x2e8(%rbp), %rsi
callq 0x145d0
movq -0x540(%rbp), %rdi
movslq (%rax), %rsi
callq 0x997b0
movq %rdx, -0x538(%rbp)
movq %rax, -0x530(%rbp)
jmp 0xcd260
movq -0x538(%rbp), %rax
movq -0x530(%rbp), %rcx
movq %rcx, -0x2f8(%rbp)
movq %rax, -0x2f0(%rbp)
leaq -0x2f8(%rbp), %rdi
callq 0x99810
xorb $-0x1, %al
movb %al, -0x501(%rbp)
movb -0x501(%rbp), %al
testb $0x1, %al
jne 0xcd29c
jmp 0xcd2dd
leaq -0x2d0(%rbp), %rdi
leaq -0x2e0(%rbp), %rsi
leaq -0x2e8(%rbp), %rdx
callq 0xceff0
jmp 0xcd2b8
jmp 0xcd2dd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0xd0(%rbp)
movl %eax, -0xd4(%rbp)
leaq -0x2d0(%rbp), %rdi
callq 0xcf110
jmp 0xcd90b
jmp 0xcd2df
movq -0x2e8(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x2e8(%rbp)
jmp 0xcd0a4
jmp 0xcd2f8
movq -0x2e0(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x2e0(%rbp)
jmp 0xcd05a
leaq -0x2d0(%rbp), %rdi
movq %rdi, -0x548(%rbp)
callq 0xcf070
movq -0x548(%rbp), %rdi
movq %rax, -0x300(%rbp)
callq 0xcf0a0
movq %rax, %rcx
movq -0x348(%rbp), %rax
movq %rcx, -0x308(%rbp)
movq %rax, -0x310(%rbp)
movq -0x300(%rbp), %rdi
movq -0x308(%rbp), %rsi
movq -0x310(%rbp), %rdx
callq 0xcd920
jmp 0xcd369
movl $0x0, -0x314(%rbp)
xorl %eax, %eax
cmpq $0x0, -0x2d8(%rbp)
movb %al, -0x549(%rbp)
jne 0xcd3b5
movslq -0x314(%rbp), %rax
movq %rax, -0x558(%rbp)
leaq -0x2d0(%rbp), %rdi
callq 0xcf0d0
movq %rax, %rcx
movq -0x558(%rbp), %rax
cmpq %rcx, %rax
setb %al
movb %al, -0x549(%rbp)
movb -0x549(%rbp), %al
testb $0x1, %al
jne 0xcd3c4
jmp 0xcd6ac
movb $0x1, -0x315(%rbp)
movq $0x0, -0x320(%rbp)
xorl %eax, %eax
testb $0x1, -0x315(%rbp)
movb %al, -0x559(%rbp)
je 0xcd429
movq -0x348(%rbp), %rax
movq -0x320(%rbp), %rcx
movq %rcx, -0x568(%rbp)
movq 0x30(%rax), %rdi
callq 0xa8e00
movl %eax, -0x560(%rbp)
jmp 0xcd40d
movq -0x568(%rbp), %rax
movl -0x560(%rbp), %ecx
movslq %ecx, %rcx
cmpq %rcx, %rax
setb %al
movb %al, -0x559(%rbp)
movb -0x559(%rbp), %al
testb $0x1, %al
jne 0xcd438
jmp 0xcd61f
movq $0x0, -0x328(%rbp)
xorl %eax, %eax
testb $0x1, -0x315(%rbp)
movb %al, -0x569(%rbp)
je 0xcd496
movq -0x348(%rbp), %rax
movq -0x328(%rbp), %rcx
movq %rcx, -0x578(%rbp)
movq 0x38(%rax), %rdi
callq 0xa8e00
movl %eax, -0x570(%rbp)
jmp 0xcd47a
movq -0x578(%rbp), %rax
movl -0x570(%rbp), %ecx
movslq %ecx, %rcx
cmpq %rcx, %rax
setb %al
movb %al, -0x569(%rbp)
movb -0x569(%rbp), %al
testb $0x1, %al
jne 0xcd4a5
jmp 0xcd606
movq -0x348(%rbp), %rdi
addq $0xe0, %rdi
movq -0x320(%rbp), %rsi
callq 0x993b0
movq %rax, %rdi
movq -0x328(%rbp), %rsi
callq 0x145d0
movq %rax, %rcx
xorl %eax, %eax
cmpl $-0x1, (%rcx)
movb %al, -0x579(%rbp)
je 0xcd568
movq -0x348(%rbp), %rdi
movq %rdi, %rax
addq $0x1f0, %rax            # imm = 0x1F0
movq %rax, -0x598(%rbp)
addq $0xe0, %rdi
movq -0x320(%rbp), %rsi
callq 0x993b0
movq %rax, %rdi
movq -0x328(%rbp), %rsi
callq 0x145d0
movq -0x598(%rbp), %rdi
movslq (%rax), %rsi
callq 0x997b0
movq %rdx, -0x590(%rbp)
movq %rax, -0x588(%rbp)
jmp 0xcd53a
movq -0x590(%rbp), %rax
movq -0x588(%rbp), %rcx
movq %rcx, -0x338(%rbp)
movq %rax, -0x330(%rbp)
leaq -0x338(%rbp), %rdi
callq 0x99810
movb %al, -0x579(%rbp)
movb -0x579(%rbp), %al
testb $0x1, %al
jne 0xcd574
jmp 0xcd5ed
movslq -0x314(%rbp), %rsi
leaq -0x2d0(%rbp), %rdi
movq %rdi, -0x5b0(%rbp)
callq 0xcf0f0
movq -0x5b0(%rbp), %rdi
movl (%rax), %eax
movl %eax, -0x5a4(%rbp)
movl -0x320(%rbp), %eax
movl %eax, -0x5a0(%rbp)
movslq -0x314(%rbp), %rsi
callq 0xcf0f0
movq -0x348(%rbp), %rdi
movl -0x5a4(%rbp), %esi
movl -0x5a0(%rbp), %edx
movl 0x8(%rax), %ecx
movl -0x328(%rbp), %r8d
callq 0xacb00
movb %al, -0x599(%rbp)
jmp 0xcd5df
movb -0x599(%rbp), %al
andb $0x1, %al
movb %al, -0x315(%rbp)
jmp 0xcd5ef
movq -0x328(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x328(%rbp)
jmp 0xcd443
jmp 0xcd608
movq -0x320(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x320(%rbp)
jmp 0xcd3d6
testb $0x1, -0x315(%rbp)
je 0xcd696
movq -0x348(%rbp), %rax
addq $0xe0, %rax
movq %rax, -0x5c0(%rbp)
movslq -0x314(%rbp), %rsi
leaq -0x2d0(%rbp), %rdi
callq 0xcf0f0
movq -0x5c0(%rbp), %rdi
movq (%rax), %rsi
callq 0x993b0
movq %rax, -0x5b8(%rbp)
movslq -0x314(%rbp), %rsi
leaq -0x2d0(%rbp), %rdi
callq 0xcf0f0
movq -0x5b8(%rbp), %rdi
movq 0x8(%rax), %rsi
callq 0x145d0
movl (%rax), %eax
addl $0x1, %eax
cltq
movq %rax, -0x2d8(%rbp)
jmp 0xcd698
movl -0x314(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x314(%rbp)
jmp 0xcd373
leaq -0x2d0(%rbp), %rdi
callq 0xcf0d0
cmpq $0x0, %rax
je 0xcd81e
cmpq $0x0, -0x2d8(%rbp)
setne %al
xorb $-0x1, %al
andb $0x1, %al
movb %al, -0x339(%rbp)
testb $0x1, -0x339(%rbp)
je 0xcd746
movq -0x348(%rbp), %rax
addq $0xe0, %rax
movq %rax, -0x5d8(%rbp)
leaq -0x2d0(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0xcf0f0
movq -0x5d8(%rbp), %rdi
movq (%rax), %rsi
callq 0x993b0
movq %rax, -0x5d0(%rbp)
leaq -0x2d0(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0xcf0f0
movq -0x5d0(%rbp), %rdi
movq 0x8(%rax), %rsi
callq 0x145d0
movslq (%rax), %rax
movq %rax, -0x5c8(%rbp)
jmp 0xcd758
movq -0x2d8(%rbp), %rax
subq $0x1, %rax
movq %rax, -0x5c8(%rbp)
movq -0x5c8(%rbp), %rax
movq %rax, -0x2d8(%rbp)
xorl %eax, %eax
testb $0x1, -0x339(%rbp)
movb %al, -0x5d9(%rbp)
jne 0xcd7a5
movq -0x348(%rbp), %rdi
movq -0x2d8(%rbp), %rsi
movl $0x1, %edx
callq 0xcd970
movb %al, -0x5da(%rbp)
jmp 0xcd797
movb -0x5da(%rbp), %al
movb %al, -0x5d9(%rbp)
jmp 0xcd7a5
movq -0x348(%rbp), %rdi
movb -0x5d9(%rbp), %al
andb $0x1, %al
movb %al, -0x33a(%rbp)
movq -0x2d8(%rbp), %rsi
xorl %edx, %edx
callq 0xcd970
movb %al, -0x5db(%rbp)
jmp 0xcd7d0
movb -0x5db(%rbp), %al
andb $0x1, %al
movb %al, -0x33b(%rbp)
testb $0x1, -0x33a(%rbp)
jne 0xcd819
testb $0x1, -0x33b(%rbp)
jne 0xcd819
movq -0x348(%rbp), %rdi
movslq -0x14(%rbp), %rsi
movslq -0x18(%rbp), %rdx
callq 0xcc210
jmp 0xcd806
movb $0x0, -0x1(%rbp)
movl $0x1, -0x27c(%rbp)
jmp 0xcd8f1
jmp 0xcd8cd
movq -0x348(%rbp), %rax
movsd 0x1e8(%rax), %xmm0
ucomisd -0x20(%rbp), %xmm0
jbe 0xcd8cb
testb $0x1, 0xd3cf1(%rip)     # 0x1a1530
je 0xcd891
movq -0x348(%rbp), %rax
movsd 0x1e8(%rax), %xmm0
movsd -0x20(%rbp), %xmm1
subsd %xmm1, %xmm0
callq 0x14980
movsd %xmm0, -0x5e8(%rbp)
jmp 0xcd868
movsd -0x5e8(%rbp), %xmm0
addsd 0xd3cb0(%rip), %xmm0    # 0x1a1528
movsd %xmm0, 0xd3ca8(%rip)    # 0x1a1528
movl 0xd3c9a(%rip), %eax     # 0x1a1520
addl $0x1, %eax
movl %eax, 0xd3c91(%rip)     # 0x1a1520
jmp 0xcd898
movb $0x1, 0xd3c98(%rip)     # 0x1a1530
movq -0x348(%rbp), %rdi
movq %rdi, %rsi
addq $0xc0, %rsi
addq $0x218, %rdi            # imm = 0x218
callq 0x145a0
jmp 0xcd8b7
movq -0x348(%rbp), %rax
movsd -0x20(%rbp), %xmm0
movsd %xmm0, 0x1e8(%rax)
jmp 0xcd8cd
movq -0x348(%rbp), %rdi
movslq -0x14(%rbp), %rsi
movslq -0x18(%rbp), %rdx
callq 0xcc210
jmp 0xcd8e3
movb $0x1, -0x1(%rbp)
movl $0x1, -0x27c(%rbp)
leaq -0x2d0(%rbp), %rdi
callq 0xcf110
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0x5f0, %rsp            # imm = 0x5F0
popq %rbp
retq
movq -0xd0(%rbp), %rdi
callq 0xa7c0
nopw (%rax,%rax)