// File: sebastienmeyer2[P]mst-clustering/src/main.cpp
// Function: main
int main(int argc, char** argv){

    bool run_mst_algo = false;
    bool run_mst_clust = false;
    bool run_mst_inc = false;
    bool run_mpi_prim = false;

    if (argc <= 1) 
    {
        exit_with_help();
    }
    
	for (int i = 1; i<argc; i++)
	{
		if(argv[i][0] != '-') exit_with_help();
		++i;
		switch(argv[i-1][1])
		{
			case 'a': run_mst_algo = true; break;
			case 'c': run_mst_clust = true; break;
			case 'i': run_mst_inc = true; break;
            case 'm': run_mpi_prim = true; break;
			default:
				std::fprintf(stderr,"unknown option\n");
				exit_with_help();
		}
	}

    /*
     * Tasks 
     */

    // TASKS 1 & 2

    if (run_mst_algo) 
    {
        // Comparing MST algorithms on Erdos-Rényi graphs

        std::vector<int> ER_graph_sizes({4, 8, 100, 250, 500, 1000});

        for (int n : ER_graph_sizes) 
        {
            Graph gER = Graph("data/ERn" + std::to_string(n) + "p10.txt");

            std::cout << "\nComparing MST algorithms with Erdos-Rényi graphs of size " << n << "." << std::endl;
            std::cout << "The graph contains " << gER.get_number_of_edges() << " edges." << std::endl;

            PrimAlgorithm primER = PrimAlgorithm(&gER);
            primER.compute_mst();

            BoruvkaAlgorithm boruvkaER = BoruvkaAlgorithm(&gER);
            boruvkaER.compute_mst();

            KruskalAlgorithm kruskalER = KruskalAlgorithm(&gER);
            kruskalER.compute_mst();
        }

        // Comparing MST algorithms on Barabasi-Albert graphs

        std::vector<int> BA_graph_sizes({100, 250, 500, 1000});

        for (int n : BA_graph_sizes) 
        {
            Graph gBA = Graph("data/BAn" + std::to_string(n) + "mo20m2.txt");

            std::cout << "\nComparing MST algorithms with Barabasi-Albert graphs of size " << n << "." << std::endl;
            std::cout << "The graph contains " << gBA.get_number_of_edges() << " edges." << std::endl;

            PrimAlgorithm primBA = PrimAlgorithm(&gBA);
            primBA.compute_mst();

            BoruvkaAlgorithm boruvkaBA = BoruvkaAlgorithm(&gBA);
            boruvkaBA.compute_mst();

            KruskalAlgorithm kruskalBA = KruskalAlgorithm(&gBA);
            kruskalBA.compute_mst();
        }
    }

    if (run_mpi_prim) 
    {
        // Comparing MST algorithms on Erdos-Rényi graphs

        std::vector<int> ER_graph_sizes({4, 8, 100, 250, 500, 1000});
    
        MPI_Init(NULL, NULL);

        int world_size;
        MPI_Comm_size(MPI_COMM_WORLD, &world_size);

        int world_rank;
        MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);

        
        

        for (int n : ER_graph_sizes) 
        {
            Graph gER = Graph("data/ERn" + std::to_string(n) + "p10.txt");

            std::cout << "\nComparing MST algorithms with Erdos-Rényi graphs of size " << n << "." << std::endl;
            std::cout << "The graph contains " << gER.get_number_of_edges() << " edges." << std::endl;

            PrimKumarAlgorithm primER = PrimKumarAlgorithm(&gER, world_rank, world_size);
            primER.compute_mst();


        }

        // Comparing MST algorithms on Barabasi-Albert graphs

        std::vector<int> BA_graph_sizes({100, 250, 500, 1000});

        for (int n : BA_graph_sizes) 
        {
            Graph gBA = Graph("data/BAn" + std::to_string(n) + "mo20m2.txt");

            std::cout << "\nComparing MST algorithms with Barabasi-Albert graphs of size " << n << "." << std::endl;
            std::cout << "The graph contains " << gBA.get_number_of_edges() << " edges." << std::endl;

            PrimKumarAlgorithm primBA = PrimKumarAlgorithm(&gBA, world_rank, world_size);
            primBA.compute_mst();
        }
        
        MPI_Finalize();
    }

    
    // TASK 5

    if (run_mst_clust) 
    {
        // Comparing MST clustering and k-means on Walmart dataset 

        std::vector<int> walmart_graph_sizes({100, 250, 500, 1000});
        std::vector<int> nb_clusters({3, 4, 5, 6, 7, 8});

        for (int n : walmart_graph_sizes)
        {
            for (int k : nb_clusters)
            {
                std::cout << "\nComparing MST clustering and k-means on graph of size " << n;
                std::cout << " and with " << k << " clusters" << std::endl;

                compare_clustering("data/scaled_n" + std::to_string(n) + "_walmart_features.txt", k);
            }
        }
    }

    // TASK 6 

    if (run_mst_inc)
    {
        // with Erdos-Rényi graphs 

        std::cout << "\nComparing different cutoffs on Erdos-Rényi graphs" << std::endl;
        std::vector<double> ER_cutoffs({1, 5, 10, 50, 100, 500, 1000});

        for (double c : ER_cutoffs) {
            Graph g = Graph("data/ERn1000p10.txt");
            KruskalAlgorithm k = KruskalAlgorithm(&g);

            std::unordered_map<Node*, Node*> clusters = k.compute_clustering(c);

            std::unordered_map<Node*, int> clusters_size;
            for (auto kv : clusters) {
                if(clusters_size.find(kv.second) != clusters_size.end()) {
                    clusters_size.at(kv.second) += 1;
                } else {
                    clusters_size.insert(std::pair<Node*, int>(kv.second, 1));
                }
            }
            std::cout << "In total, there are : " << clusters_size.size() << " clusters when cutoff = " << c << std::endl;

            int big_clusters = 0;
            std::cout << "The cluster sizes above 1 are the following : ";
            for (auto kv : clusters_size) {
                if (kv.second > 1) {
                    std::cout << kv.second << " ";
                    big_clusters += 1;
                }
            }
            std::cout << std::endl;
            std::cout << "There are " << big_clusters << " clusters of size above 1." << std::endl;
        }

        // with Walmart dataset

        std::cout << "\nComparing different cutoffs on Walmart dataset" << std::endl;
        std::vector<double> walmart_cutoffs({1, 5, 10, 50, 100, 500, 1000});

        for (double c : walmart_cutoffs) {
            compare_inconsistency("data/scaled_n1000_walmart_features.txt", c);
        }
    }

    return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x1690, %rsp           # imm = 0x1690
movl $0x0, -0x4(%rbp)
movl %edi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movb $0x0, -0x11(%rbp)
movb $0x0, -0x12(%rbp)
movb $0x0, -0x13(%rbp)
movb $0x0, -0x14(%rbp)
cmpl $0x1, -0x8(%rbp)
jg 0x19294
callq 0x19240
movl $0x1, -0x18(%rbp)
movl -0x18(%rbp), %eax
cmpl -0x8(%rbp), %eax
jge 0x19349
movq -0x10(%rbp), %rax
movslq -0x18(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movsbl (%rax), %eax
cmpl $0x2d, %eax
je 0x192c0
callq 0x19240
movl -0x18(%rbp), %eax
incl %eax
movl %eax, -0x18(%rbp)
movq -0x10(%rbp), %rax
movl -0x18(%rbp), %ecx
decl %ecx
movslq %ecx, %rcx
movq (%rax,%rcx,8), %rax
movsbl 0x1(%rax), %eax
addl $-0x61, %eax
movl %eax, %ecx
movq %rcx, -0x14d8(%rbp)
subl $0xc, %eax
ja 0x1931c
movq -0x14d8(%rbp), %rax
leaq 0x1de75(%rip), %rcx     # 0x37170
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movb $0x1, -0x11(%rbp)
jmp 0x19339
movb $0x1, -0x12(%rbp)
jmp 0x19339
movb $0x1, -0x13(%rbp)
jmp 0x19339
movb $0x1, -0x14(%rbp)
jmp 0x19339
movq 0x36c95(%rip), %rax     # 0x4ffb8
movq (%rax), %rdi
leaq 0x1e02c(%rip), %rsi     # 0x37359
movb $0x0, %al
callq 0xab80
callq 0x19240
jmp 0x1933b
movl -0x18(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x18(%rbp)
jmp 0x1929b
testb $0x1, -0x11(%rbp)
je 0x19b10
movups 0x1de4a(%rip), %xmm0    # 0x371a4
movaps %xmm0, -0x60(%rbp)
movabsq $0x3e8000001f4, %rax    # imm = 0x3E8000001F4
movq %rax, -0x50(%rbp)
leaq -0x60(%rbp), %rax
movq %rax, -0x40(%rbp)
movq $0x6, -0x38(%rbp)
leaq -0x61(%rbp), %rdi
movq %rdi, -0x14e0(%rbp)
callq 0x1b560
movq -0x14e0(%rbp), %rcx
movq -0x40(%rbp), %rsi
movq -0x38(%rbp), %rdx
leaq -0x30(%rbp), %rdi
callq 0x1b580
jmp 0x193a6
leaq -0x61(%rbp), %rdi
callq 0x1b600
leaq -0x30(%rbp), %rax
movq %rax, -0x80(%rbp)
movq -0x80(%rbp), %rdi
callq 0x1b620
movq %rax, -0x88(%rbp)
movq -0x80(%rbp), %rdi
callq 0x1b650
movq %rax, -0x90(%rbp)
leaq -0x88(%rbp), %rdi
leaq -0x90(%rbp), %rsi
callq 0x1b680
testb $0x1, %al
jne 0x193f3
jmp 0x19701
leaq -0x88(%rbp), %rdi
callq 0x1b6c0
movl (%rax), %eax
movl %eax, -0x94(%rbp)
movl -0x94(%rbp), %esi
leaq -0x1e0(%rbp), %rdi
callq 0x1b780
jmp 0x1941b
leaq 0x1df47(%rip), %rsi     # 0x37369
leaq -0x1c0(%rbp), %rdi
leaq -0x1e0(%rbp), %rdx
callq 0x1b730
jmp 0x19437
leaq 0x1e07a(%rip), %rdx     # 0x374b8
leaq -0x1a0(%rbp), %rdi
leaq -0x1c0(%rbp), %rsi
callq 0x1b6e0
jmp 0x19453
leaq -0x180(%rbp), %rdi
leaq -0x1a0(%rbp), %rsi
callq 0xd000
jmp 0x19468
leaq -0x1a0(%rbp), %rdi
callq 0xa470
leaq -0x1c0(%rbp), %rdi
callq 0xa470
leaq -0x1e0(%rbp), %rdi
callq 0xa470
movq 0x36b1d(%rip), %rdi     # 0x4ffb0
leaq 0x1ded8(%rip), %rsi     # 0x37372
callq 0xa780
movq %rax, -0x14e8(%rbp)
jmp 0x194a8
movq -0x14e8(%rbp), %rdi
movl -0x94(%rbp), %esi
callq 0xada0
movq %rax, -0x14f0(%rbp)
jmp 0x194c3
movq -0x14f0(%rbp), %rdi
leaq 0x1e719(%rip), %rsi     # 0x37bea
callq 0xa780
movq %rax, -0x14f8(%rbp)
jmp 0x194df
movq -0x14f8(%rbp), %rdi
movq 0x36a9b(%rip), %rsi     # 0x4ff88
callq 0xa7e0
jmp 0x194f4
movq 0x36ab5(%rip), %rdi     # 0x4ffb0
leaq 0x1deac(%rip), %rsi     # 0x373ae
callq 0xa780
movq %rax, -0x1500(%rbp)
jmp 0x19510
leaq -0x180(%rbp), %rdi
callq 0xd640
movl %eax, -0x1504(%rbp)
jmp 0x19524
movl -0x1504(%rbp), %esi
movq -0x1500(%rbp), %rdi
callq 0xada0
movq %rax, -0x1510(%rbp)
jmp 0x1953f
movq -0x1510(%rbp), %rdi
leaq 0x1de75(%rip), %rsi     # 0x373c2
callq 0xa780
movq %rax, -0x1518(%rbp)
jmp 0x1955b
movq -0x1518(%rbp), %rdi
movq 0x36a1f(%rip), %rsi     # 0x4ff88
callq 0xa7e0
jmp 0x19570
leaq -0x2e8(%rbp), %rdi
leaq -0x180(%rbp), %rsi
callq 0x29990
jmp 0x19585
leaq -0x2e8(%rbp), %rdi
callq 0x299d0
jmp 0x19593
leaq -0x3f0(%rbp), %rdi
leaq -0x180(%rbp), %rsi
callq 0x2dc10
jmp 0x195a8
leaq -0x3f0(%rbp), %rdi
callq 0x2dc50
jmp 0x195b6
leaq -0x4f8(%rbp), %rdi
leaq -0x180(%rbp), %rsi
callq 0x2e540
jmp 0x195cb
leaq -0x4f8(%rbp), %rdi
callq 0x2e580
jmp 0x195d9
leaq -0x4f8(%rbp), %rdi
callq 0x1b8a0
leaq -0x3f0(%rbp), %rdi
callq 0x1b8c0
leaq -0x2e8(%rbp), %rdi
callq 0x1b8e0
leaq -0x180(%rbp), %rdi
callq 0xddf0
leaq -0x88(%rbp), %rdi
callq 0x1b900
jmp 0x193d7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x61(%rbp), %rdi
callq 0x1b600
jmp 0x1ae68
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x19b02
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x19685
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x19679
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x1a0(%rbp), %rdi
callq 0xa470
leaq -0x1c0(%rbp), %rdi
callq 0xa470
leaq -0x1e0(%rbp), %rdi
callq 0xa470
jmp 0x19b02
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x196f0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x196e4
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x196d8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x4f8(%rbp), %rdi
callq 0x1b8a0
leaq -0x3f0(%rbp), %rdi
callq 0x1b8c0
leaq -0x2e8(%rbp), %rdi
callq 0x1b8e0
leaq -0x180(%rbp), %rdi
callq 0xddf0
jmp 0x19b02
movl $0x64, -0x530(%rbp)
movl $0xfa, -0x52c(%rbp)
movl $0x1f4, -0x528(%rbp)    # imm = 0x1F4
movl $0x3e8, -0x524(%rbp)    # imm = 0x3E8
leaq -0x530(%rbp), %rax
movq %rax, -0x520(%rbp)
movq $0x4, -0x518(%rbp)
leaq -0x531(%rbp), %rdi
movq %rdi, -0x1520(%rbp)
callq 0x1b560
movq -0x1520(%rbp), %rcx
movq -0x520(%rbp), %rsi
movq -0x518(%rbp), %rdx
leaq -0x510(%rbp), %rdi
callq 0x1b580
jmp 0x19778
leaq -0x531(%rbp), %rdi
callq 0x1b600
leaq -0x510(%rbp), %rax
movq %rax, -0x540(%rbp)
movq -0x540(%rbp), %rdi
callq 0x1b620
movq %rax, -0x548(%rbp)
movq -0x540(%rbp), %rdi
callq 0x1b650
movq %rax, -0x550(%rbp)
leaq -0x548(%rbp), %rdi
leaq -0x550(%rbp), %rsi
callq 0x1b680
testb $0x1, %al
jne 0x197d4
jmp 0x19adf
leaq -0x548(%rbp), %rdi
callq 0x1b6c0
movl (%rax), %eax
movl %eax, -0x554(%rbp)
movl -0x554(%rbp), %esi
leaq -0x6a0(%rbp), %rdi
callq 0x1b780
jmp 0x197fc
leaq 0x1dbc7(%rip), %rsi     # 0x373ca
leaq -0x680(%rbp), %rdi
leaq -0x6a0(%rbp), %rdx
callq 0x1b730
jmp 0x19818
leaq 0x1dbb4(%rip), %rdx     # 0x373d3
leaq -0x660(%rbp), %rdi
leaq -0x680(%rbp), %rsi
callq 0x1b6e0
jmp 0x19834
leaq -0x640(%rbp), %rdi
leaq -0x660(%rbp), %rsi
callq 0xd000
jmp 0x19849
leaq -0x660(%rbp), %rdi
callq 0xa470
leaq -0x680(%rbp), %rdi
callq 0xa470
leaq -0x6a0(%rbp), %rdi
callq 0xa470
movq 0x3673c(%rip), %rdi     # 0x4ffb0
leaq 0x1db63(%rip), %rsi     # 0x373de
callq 0xa780
movq %rax, -0x1528(%rbp)
jmp 0x19889
movq -0x1528(%rbp), %rdi
movl -0x554(%rbp), %esi
callq 0xada0
movq %rax, -0x1530(%rbp)
jmp 0x198a4
movq -0x1530(%rbp), %rdi
leaq 0x1e338(%rip), %rsi     # 0x37bea
callq 0xa780
movq %rax, -0x1538(%rbp)
jmp 0x198c0
movq -0x1538(%rbp), %rdi
movq 0x366ba(%rip), %rsi     # 0x4ff88
callq 0xa7e0
jmp 0x198d5
movq 0x366d4(%rip), %rdi     # 0x4ffb0
leaq 0x1dacb(%rip), %rsi     # 0x373ae
callq 0xa780
movq %rax, -0x1540(%rbp)
jmp 0x198f1
leaq -0x640(%rbp), %rdi
callq 0xd640
movl %eax, -0x1544(%rbp)
jmp 0x19905
movl -0x1544(%rbp), %esi
movq -0x1540(%rbp), %rdi
callq 0xada0
movq %rax, -0x1550(%rbp)
jmp 0x19920
movq -0x1550(%rbp), %rdi
leaq 0x1da94(%rip), %rsi     # 0x373c2
callq 0xa780
movq %rax, -0x1558(%rbp)
jmp 0x1993c
movq -0x1558(%rbp), %rdi
movq 0x3663e(%rip), %rsi     # 0x4ff88
callq 0xa7e0
jmp 0x19951
leaq -0x7a8(%rbp), %rdi
leaq -0x640(%rbp), %rsi
callq 0x29990
jmp 0x19966
leaq -0x7a8(%rbp), %rdi
callq 0x299d0
jmp 0x19974
leaq -0x8b0(%rbp), %rdi
leaq -0x640(%rbp), %rsi
callq 0x2dc10
jmp 0x19989
leaq -0x8b0(%rbp), %rdi
callq 0x2dc50
jmp 0x19997
leaq -0x9b8(%rbp), %rdi
leaq -0x640(%rbp), %rsi
callq 0x2e540
jmp 0x199ac
leaq -0x9b8(%rbp), %rdi
callq 0x2e580
jmp 0x199ba
leaq -0x9b8(%rbp), %rdi
callq 0x1b8a0
leaq -0x8b0(%rbp), %rdi
callq 0x1b8c0
leaq -0x7a8(%rbp), %rdi
callq 0x1b8e0
leaq -0x640(%rbp), %rdi
callq 0xddf0
leaq -0x548(%rbp), %rdi
callq 0x1b900
jmp 0x197b8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x531(%rbp), %rdi
callq 0x1b600
jmp 0x19b02
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x19af6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x19a69
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x19a5d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x660(%rbp), %rdi
callq 0xa470
leaq -0x680(%rbp), %rdi
callq 0xa470
leaq -0x6a0(%rbp), %rdi
callq 0xa470
jmp 0x19af6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x19ad1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x19ac5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x19ab9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x9b8(%rbp), %rdi
callq 0x1b8a0
leaq -0x8b0(%rbp), %rdi
callq 0x1b8c0
leaq -0x7a8(%rbp), %rdi
callq 0x1b8e0
leaq -0x640(%rbp), %rdi
callq 0xddf0
jmp 0x19af6
leaq -0x510(%rbp), %rdi
callq 0x1b920
leaq -0x30(%rbp), %rdi
callq 0x1b920
jmp 0x19b10
leaq -0x510(%rbp), %rdi
callq 0x1b920
leaq -0x30(%rbp), %rdi
callq 0x1b920
jmp 0x1ae68
testb $0x1, -0x14(%rbp)
je 0x1a23d
movups 0x1d69b(%rip), %xmm0    # 0x371bc
movaps %xmm0, -0xa00(%rbp)
movabsq $0x3e8000001f4, %rax    # imm = 0x3E8000001F4
movq %rax, -0x9f0(%rbp)
leaq -0xa00(%rbp), %rax
movq %rax, -0x9e0(%rbp)
movq $0x6, -0x9d8(%rbp)
leaq -0xa01(%rbp), %rdi
movq %rdi, -0x1560(%rbp)
callq 0x1b560
movq -0x1560(%rbp), %rcx
movq -0x9e0(%rbp), %rsi
movq -0x9d8(%rbp), %rdx
leaq -0x9d0(%rbp), %rdi
callq 0x1b580
jmp 0x19b88
leaq -0xa01(%rbp), %rdi
callq 0x1b600
xorl %eax, %eax
movl %eax, %esi
movq %rsi, %rdi
callq 0xab40
jmp 0x19ba2
movq 0x363e7(%rip), %rdi     # 0x4ff90
leaq -0xa08(%rbp), %rsi
callq 0xa900
jmp 0x19bb7
movq 0x363d2(%rip), %rdi     # 0x4ff90
leaq -0xa0c(%rbp), %rsi
callq 0xab30
jmp 0x19bcc
leaq -0x9d0(%rbp), %rax
movq %rax, -0xa18(%rbp)
movq -0xa18(%rbp), %rdi
callq 0x1b620
movq %rax, -0xa20(%rbp)
movq -0xa18(%rbp), %rdi
callq 0x1b650
movq %rax, -0xa28(%rbp)
leaq -0xa20(%rbp), %rdi
leaq -0xa28(%rbp), %rsi
callq 0x1b680
testb $0x1, %al
jne 0x19c1c
jmp 0x19ea7
leaq -0xa20(%rbp), %rdi
callq 0x1b6c0
movl (%rax), %eax
movl %eax, -0xa2c(%rbp)
movl -0xa2c(%rbp), %esi
leaq -0xb78(%rbp), %rdi
callq 0x1b780
jmp 0x19c44
leaq 0x1d71e(%rip), %rsi     # 0x37369
leaq -0xb58(%rbp), %rdi
leaq -0xb78(%rbp), %rdx
callq 0x1b730
jmp 0x19c60
leaq 0x1d851(%rip), %rdx     # 0x374b8
leaq -0xb38(%rbp), %rdi
leaq -0xb58(%rbp), %rsi
callq 0x1b6e0
jmp 0x19c7c
leaq -0xb18(%rbp), %rdi
leaq -0xb38(%rbp), %rsi
callq 0xd000
jmp 0x19c91
leaq -0xb38(%rbp), %rdi
callq 0xa470
leaq -0xb58(%rbp), %rdi
callq 0xa470
leaq -0xb78(%rbp), %rdi
callq 0xa470
movq 0x362f4(%rip), %rdi     # 0x4ffb0
leaq 0x1d6af(%rip), %rsi     # 0x37372
callq 0xa780
movq %rax, -0x1568(%rbp)
jmp 0x19cd1
movq -0x1568(%rbp), %rdi
movl -0xa2c(%rbp), %esi
callq 0xada0
movq %rax, -0x1570(%rbp)
jmp 0x19cec
movq -0x1570(%rbp), %rdi
leaq 0x1def0(%rip), %rsi     # 0x37bea
callq 0xa780
movq %rax, -0x1578(%rbp)
jmp 0x19d08
movq -0x1578(%rbp), %rdi
movq 0x36272(%rip), %rsi     # 0x4ff88
callq 0xa7e0
jmp 0x19d1d
movq 0x3628c(%rip), %rdi     # 0x4ffb0
leaq 0x1d683(%rip), %rsi     # 0x373ae
callq 0xa780
movq %rax, -0x1580(%rbp)
jmp 0x19d39
leaq -0xb18(%rbp), %rdi
callq 0xd640
movl %eax, -0x1584(%rbp)
jmp 0x19d4d
movl -0x1584(%rbp), %esi
movq -0x1580(%rbp), %rdi
callq 0xada0
movq %rax, -0x1590(%rbp)
jmp 0x19d68
movq -0x1590(%rbp), %rdi
leaq 0x1d64c(%rip), %rsi     # 0x373c2
callq 0xa780
movq %rax, -0x1598(%rbp)
jmp 0x19d84
movq -0x1598(%rbp), %rdi
movq 0x361f6(%rip), %rsi     # 0x4ff88
callq 0xa7e0
jmp 0x19d99
movl -0xa0c(%rbp), %edx
movl -0xa08(%rbp), %ecx
leaq -0xc88(%rbp), %rdi
leaq -0xb18(%rbp), %rsi
callq 0x2f2a0
jmp 0x19dba
leaq -0xc88(%rbp), %rdi
callq 0x2f300
jmp 0x19dc8
leaq -0xc88(%rbp), %rdi
callq 0x1b980
leaq -0xb18(%rbp), %rdi
callq 0xddf0
leaq -0xa20(%rbp), %rdi
callq 0x1b900
jmp 0x19c00
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0xa01(%rbp), %rdi
callq 0x1b600
jmp 0x1ae68
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x1a22c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x19e5f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x19e53
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0xb38(%rbp), %rdi
callq 0xa470
leaq -0xb58(%rbp), %rdi
callq 0xa470
leaq -0xb78(%rbp), %rdi
callq 0xa470
jmp 0x1a22c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x19e96
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0xc88(%rbp), %rdi
callq 0x1b980
leaq -0xb18(%rbp), %rdi
callq 0xddf0
jmp 0x1a22c
movl $0x64, -0xcc0(%rbp)
movl $0xfa, -0xcbc(%rbp)
movl $0x1f4, -0xcb8(%rbp)    # imm = 0x1F4
movl $0x3e8, -0xcb4(%rbp)    # imm = 0x3E8
leaq -0xcc0(%rbp), %rax
movq %rax, -0xcb0(%rbp)
movq $0x4, -0xca8(%rbp)
leaq -0xcc1(%rbp), %rdi
movq %rdi, -0x15a0(%rbp)
callq 0x1b560
movq -0x15a0(%rbp), %rcx
movq -0xcb0(%rbp), %rsi
movq -0xca8(%rbp), %rdx
leaq -0xca0(%rbp), %rdi
callq 0x1b580
jmp 0x19f1e
leaq -0xcc1(%rbp), %rdi
callq 0x1b600
leaq -0xca0(%rbp), %rax
movq %rax, -0xcd0(%rbp)
movq -0xcd0(%rbp), %rdi
callq 0x1b620
movq %rax, -0xcd8(%rbp)
movq -0xcd0(%rbp), %rdi
callq 0x1b650
movq %rax, -0xce0(%rbp)
leaq -0xcd8(%rbp), %rdi
leaq -0xce0(%rbp), %rsi
callq 0x1b680
testb $0x1, %al
jne 0x19f7a
jmp 0x1a1ff
leaq -0xcd8(%rbp), %rdi
callq 0x1b6c0
movl (%rax), %eax
movl %eax, -0xce4(%rbp)
movl -0xce4(%rbp), %esi
leaq -0xe30(%rbp), %rdi
callq 0x1b780
jmp 0x19fa2
leaq 0x1d421(%rip), %rsi     # 0x373ca
leaq -0xe10(%rbp), %rdi
leaq -0xe30(%rbp), %rdx
callq 0x1b730
jmp 0x19fbe
leaq 0x1d40e(%rip), %rdx     # 0x373d3
leaq -0xdf0(%rbp), %rdi
leaq -0xe10(%rbp), %rsi
callq 0x1b6e0
jmp 0x19fda
leaq -0xdd0(%rbp), %rdi
leaq -0xdf0(%rbp), %rsi
callq 0xd000
jmp 0x19fef
leaq -0xdf0(%rbp), %rdi
callq 0xa470
leaq -0xe10(%rbp), %rdi
callq 0xa470
leaq -0xe30(%rbp), %rdi
callq 0xa470
movq 0x35f96(%rip), %rdi     # 0x4ffb0
leaq 0x1d3bd(%rip), %rsi     # 0x373de
callq 0xa780
movq %rax, -0x15a8(%rbp)
jmp 0x1a02f
movq -0x15a8(%rbp), %rdi
movl -0xce4(%rbp), %esi
callq 0xada0
movq %rax, -0x15b0(%rbp)
jmp 0x1a04a
movq -0x15b0(%rbp), %rdi
leaq 0x1db92(%rip), %rsi     # 0x37bea
callq 0xa780
movq %rax, -0x15b8(%rbp)
jmp 0x1a066
movq -0x15b8(%rbp), %rdi
movq 0x35f14(%rip), %rsi     # 0x4ff88
callq 0xa7e0
jmp 0x1a07b
movq 0x35f2e(%rip), %rdi     # 0x4ffb0
leaq 0x1d325(%rip), %rsi     # 0x373ae
callq 0xa780
movq %rax, -0x15c0(%rbp)
jmp 0x1a097
leaq -0xdd0(%rbp), %rdi
callq 0xd640
movl %eax, -0x15c4(%rbp)
jmp 0x1a0ab
movl -0x15c4(%rbp), %esi
movq -0x15c0(%rbp), %rdi
callq 0xada0
movq %rax, -0x15d0(%rbp)
jmp 0x1a0c6
movq -0x15d0(%rbp), %rdi
leaq 0x1d2ee(%rip), %rsi     # 0x373c2
callq 0xa780
movq %rax, -0x15d8(%rbp)
jmp 0x1a0e2
movq -0x15d8(%rbp), %rdi
movq 0x35e98(%rip), %rsi     # 0x4ff88
callq 0xa7e0
jmp 0x1a0f7
movl -0xa0c(%rbp), %edx
movl -0xa08(%rbp), %ecx
leaq -0xf40(%rbp), %rdi
leaq -0xdd0(%rbp), %rsi
callq 0x2f2a0
jmp 0x1a118
leaq -0xf40(%rbp), %rdi
callq 0x2f300
jmp 0x1a126
leaq -0xf40(%rbp), %rdi
callq 0x1b980
leaq -0xdd0(%rbp), %rdi
callq 0xddf0
leaq -0xcd8(%rbp), %rdi
callq 0x1b900
jmp 0x19f5e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0xcc1(%rbp), %rdi
callq 0x1b600
jmp 0x1a22c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x1a220
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x1a1bd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x1a1b1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0xdf0(%rbp), %rdi
callq 0xa470
leaq -0xe10(%rbp), %rdi
callq 0xa470
leaq -0xe30(%rbp), %rdi
callq 0xa470
jmp 0x1a220
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x1a1f1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0xf40(%rbp), %rdi
callq 0x1b980
leaq -0xdd0(%rbp), %rdi
callq 0xddf0
jmp 0x1a220
callq 0xa5b0
jmp 0x1a206
leaq -0xca0(%rbp), %rdi
callq 0x1b920
leaq -0x9d0(%rbp), %rdi
callq 0x1b920
jmp 0x1a23d
leaq -0xca0(%rbp), %rdi
callq 0x1b920
leaq -0x9d0(%rbp), %rdi
callq 0x1b920
jmp 0x1ae68
testb $0x1, -0x12(%rbp)
je 0x1a619
movl $0x64, -0xf78(%rbp)
movl $0xfa, -0xf74(%rbp)
movl $0x1f4, -0xf70(%rbp)    # imm = 0x1F4
movl $0x3e8, -0xf6c(%rbp)    # imm = 0x3E8
leaq -0xf78(%rbp), %rax
movq %rax, -0xf68(%rbp)
movq $0x4, -0xf60(%rbp)
leaq -0xf79(%rbp), %rdi
movq %rdi, -0x15e0(%rbp)
callq 0x1b560
movq -0x15e0(%rbp), %rcx
movq -0xf68(%rbp), %rsi
movq -0xf60(%rbp), %rdx
leaq -0xf58(%rbp), %rdi
callq 0x1b580
jmp 0x1a2be
leaq -0xf79(%rbp), %rdi
callq 0x1b600
movabsq $0x800000007, %rax      # imm = 0x800000007
movq %rax, -0xfb0(%rbp)
movups 0x1cef2(%rip), %xmm0    # 0x371d4
movaps %xmm0, -0xfc0(%rbp)
leaq -0xfc0(%rbp), %rax
movq %rax, -0xfa8(%rbp)
movq $0x6, -0xfa0(%rbp)
leaq -0xfc1(%rbp), %rdi
movq %rdi, -0x15e8(%rbp)
callq 0x1b560
movq -0x15e8(%rbp), %rcx
movq -0xfa8(%rbp), %rsi
movq -0xfa0(%rbp), %rdx
leaq -0xf98(%rbp), %rdi
callq 0x1b580
jmp 0x1a338
leaq -0xfc1(%rbp), %rdi
callq 0x1b600
leaq -0xf58(%rbp), %rax
movq %rax, -0xfd0(%rbp)
movq -0xfd0(%rbp), %rdi
callq 0x1b620
movq %rax, -0xfd8(%rbp)
movq -0xfd0(%rbp), %rdi
callq 0x1b650
movq %rax, -0xfe0(%rbp)
leaq -0xfd8(%rbp), %rdi
leaq -0xfe0(%rbp), %rsi
callq 0x1b680
testb $0x1, %al
jne 0x1a394
jmp 0x1a5e2
leaq -0xfd8(%rbp), %rdi
callq 0x1b6c0
movl (%rax), %eax
movl %eax, -0xfe4(%rbp)
leaq -0xf98(%rbp), %rax
movq %rax, -0xff0(%rbp)
movq -0xff0(%rbp), %rdi
callq 0x1b620
movq %rax, -0xff8(%rbp)
movq -0xff0(%rbp), %rdi
callq 0x1b650
movq %rax, -0x1000(%rbp)
leaq -0xff8(%rbp), %rdi
leaq -0x1000(%rbp), %rsi
callq 0x1b680
testb $0x1, %al
jne 0x1a3f8
jmp 0x1a5cf
leaq -0xff8(%rbp), %rdi
callq 0x1b6c0
movl (%rax), %eax
movl %eax, -0x1004(%rbp)
movq 0x35b9d(%rip), %rdi     # 0x4ffb0
leaq 0x1d003(%rip), %rsi     # 0x3741d
callq 0xa780
movq %rax, -0x15f0(%rbp)
jmp 0x1a428
movq -0x15f0(%rbp), %rdi
movl -0xfe4(%rbp), %esi
callq 0xada0
jmp 0x1a43c
movq 0x35b6d(%rip), %rdi     # 0x4ffb0
leaq 0x1d00b(%rip), %rsi     # 0x37455
callq 0xa780
movq %rax, -0x15f8(%rbp)
jmp 0x1a458
movq -0x15f8(%rbp), %rdi
movl -0x1004(%rbp), %esi
callq 0xada0
movq %rax, -0x1600(%rbp)
jmp 0x1a473
movq -0x1600(%rbp), %rdi
leaq 0x1cfdf(%rip), %rsi     # 0x37460
callq 0xa780
movq %rax, -0x1608(%rbp)
jmp 0x1a48f
movq -0x1608(%rbp), %rdi
movq 0x35aeb(%rip), %rsi     # 0x4ff88
callq 0xa7e0
jmp 0x1a4a4
movl -0xfe4(%rbp), %esi
leaq -0x1068(%rbp), %rdi
callq 0x1b780
jmp 0x1a4b8
leaq 0x1cfab(%rip), %rsi     # 0x3746a
leaq -0x1048(%rbp), %rdi
leaq -0x1068(%rbp), %rdx
callq 0x1b730
jmp 0x1a4d4
leaq 0x1d0ab(%rip), %rdx     # 0x37586
leaq -0x1028(%rbp), %rdi
leaq -0x1048(%rbp), %rsi
callq 0x1b6e0
jmp 0x1a4f0
movl -0x1004(%rbp), %esi
leaq -0x1028(%rbp), %rdi
callq 0x33f30
jmp 0x1a504
leaq -0x1028(%rbp), %rdi
callq 0xa470
leaq -0x1048(%rbp), %rdi
callq 0xa470
leaq -0x1068(%rbp), %rdi
callq 0xa470
leaq -0xff8(%rbp), %rdi
callq 0x1b900
jmp 0x1a3dc
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0xf79(%rbp), %rdi
callq 0x1b600
jmp 0x1ae68
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0xfc1(%rbp), %rdi
callq 0x1b600
jmp 0x1a608
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x1a5fc
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x1a5c1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x1a5b5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x1028(%rbp), %rdi
callq 0xa470
leaq -0x1048(%rbp), %rdi
callq 0xa470
leaq -0x1068(%rbp), %rdi
callq 0xa470
jmp 0x1a5fc
jmp 0x1a5d1
leaq -0xfd8(%rbp), %rdi
callq 0x1b900
jmp 0x1a378
leaq -0xf98(%rbp), %rdi
callq 0x1b920
leaq -0xf58(%rbp), %rdi
callq 0x1b920
jmp 0x1a619
leaq -0xf98(%rbp), %rdi
callq 0x1b920
leaq -0xf58(%rbp), %rdi
callq 0x1b920
jmp 0x1ae68
testb $0x1, -0x13(%rbp)
je 0x1ae5d
movq 0x35986(%rip), %rdi     # 0x4ffb0
leaq 0x1ce47(%rip), %rsi     # 0x37478
callq 0xa780
movq %rax, %rdi
movq 0x35948(%rip), %rsi     # 0x4ff88
callq 0xa7e0
movabsq $0x408f400000000000, %rax # imm = 0x408F400000000000
movq %rax, -0x10a0(%rbp)
movups 0x1cbb3(%rip), %xmm0    # 0x37210
movaps %xmm0, -0x10b0(%rbp)
movups 0x1cb95(%rip), %xmm0    # 0x37200
movaps %xmm0, -0x10c0(%rbp)
movups 0x1cb77(%rip), %xmm0    # 0x371f0
movaps %xmm0, -0x10d0(%rbp)
leaq -0x10d0(%rbp), %rax
movq %rax, -0x1090(%rbp)
movq $0x7, -0x1088(%rbp)
leaq -0x10d1(%rbp), %rdi
movq %rdi, -0x1610(%rbp)
callq 0x1b9a0
movq -0x1610(%rbp), %rcx
movq -0x1090(%rbp), %rsi
movq -0x1088(%rbp), %rdx
leaq -0x1080(%rbp), %rdi
callq 0x1b9c0
jmp 0x1a6cf
leaq -0x10d1(%rbp), %rdi
callq 0x1ba40
leaq -0x1080(%rbp), %rax
movq %rax, -0x10e0(%rbp)
movq -0x10e0(%rbp), %rdi
callq 0x1ba60
movq %rax, -0x10e8(%rbp)
movq -0x10e0(%rbp), %rdi
callq 0x1ba90
movq %rax, -0x10f0(%rbp)
leaq -0x10e8(%rbp), %rdi
leaq -0x10f0(%rbp), %rsi
callq 0x1bac0
testb $0x1, %al
jne 0x1a72b
jmp 0x1ac30
leaq -0x10e8(%rbp), %rdi
callq 0x1bb00
movsd (%rax), %xmm0
movsd %xmm0, -0x10f8(%rbp)
leaq -0x1201(%rbp), %rdi
movq %rdi, -0x1618(%rbp)
callq 0xadf0
movq -0x1618(%rbp), %rdx
leaq 0x1cd48(%rip), %rsi     # 0x374ac
leaq -0x1200(%rbp), %rdi
callq 0x12010
jmp 0x1a772
leaq -0x11e0(%rbp), %rdi
leaq -0x1200(%rbp), %rsi
callq 0xd000
jmp 0x1a787
leaq -0x1200(%rbp), %rdi
callq 0xa470
leaq -0x1201(%rbp), %rdi
callq 0xa850
leaq -0x1310(%rbp), %rdi
leaq -0x11e0(%rbp), %rsi
callq 0x2e540
jmp 0x1a7b4
movsd -0x10f8(%rbp), %xmm0
leaq -0x1348(%rbp), %rdi
leaq -0x1310(%rbp), %rsi
callq 0x26bc0
jmp 0x1a7d1
leaq -0x1380(%rbp), %rdi
callq 0x1bb20
leaq -0x1348(%rbp), %rax
movq %rax, -0x1388(%rbp)
movq -0x1388(%rbp), %rdi
callq 0x1bb40
movq %rax, -0x1390(%rbp)
movq -0x1388(%rbp), %rdi
callq 0x1bb70
movq %rax, -0x1398(%rbp)
leaq -0x1390(%rbp), %rdi
leaq -0x1398(%rbp), %rsi
callq 0x1bba0
testb $0x1, %al
jne 0x1a82d
jmp 0x1a9df
leaq -0x1390(%rbp), %rdi
callq 0x1bbd0
movups (%rax), %xmm0
movaps %xmm0, -0x13b0(%rbp)
leaq -0x13a8(%rbp), %rsi
leaq -0x1380(%rbp), %rdi
callq 0x1bc30
movq %rax, -0x1620(%rbp)
jmp 0x1a85f
movq -0x1620(%rbp), %rax
movq %rax, -0x13b8(%rbp)
leaq -0x1380(%rbp), %rdi
callq 0x1bc60
movq %rax, -0x13c0(%rbp)
leaq -0x13b8(%rbp), %rdi
leaq -0x13c0(%rbp), %rsi
callq 0x1bc00
testb $0x1, %al
jne 0x1a89c
jmp 0x1a96a
leaq -0x13a8(%rbp), %rsi
leaq -0x1380(%rbp), %rdi
callq 0x1bc90
movq %rax, -0x1628(%rbp)
jmp 0x1a8b8
movq -0x1628(%rbp), %rax
movl (%rax), %ecx
addl $0x1, %ecx
movl %ecx, (%rax)
jmp 0x1a9cc
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x10d1(%rbp), %rdi
callq 0x1ba40
jmp 0x1ae68
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x1a90e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x1200(%rbp), %rdi
callq 0xa470
leaq -0x1201(%rbp), %rdi
callq 0xa850
jmp 0x1ae4f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x1ac1f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x1ac13
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x1380(%rbp), %rdi
callq 0x1be10
leaq -0x1348(%rbp), %rdi
callq 0x1be30
jmp 0x1ac13
leaq -0x13a8(%rbp), %rsi
movl $0x1, -0x13d4(%rbp)
leaq -0x13d0(%rbp), %rdi
leaq -0x13d4(%rbp), %rdx
callq 0x1bd00
jmp 0x1a990
leaq -0x1380(%rbp), %rdi
leaq -0x13d0(%rbp), %rsi
callq 0x1bcc0
movb %dl, -0x1631(%rbp)
movq %rax, -0x1630(%rbp)
jmp 0x1a9b2
movb -0x1631(%rbp), %al
movq -0x1630(%rbp), %rcx
movq %rcx, -0x13e8(%rbp)
movb %al, -0x13e0(%rbp)
jmp 0x1a9ce
leaq -0x1390(%rbp), %rdi
callq 0x1bd30
jmp 0x1a811
movq 0x355ca(%rip), %rdi     # 0x4ffb0
leaq 0x1cad3(%rip), %rsi     # 0x374c0
callq 0xa780
movq %rax, -0x1640(%rbp)
jmp 0x1a9fb
leaq -0x1380(%rbp), %rdi
callq 0x1bd60
movq -0x1640(%rbp), %rdi
movq %rax, %rsi
callq 0xa180
movq %rax, -0x1648(%rbp)
jmp 0x1aa1f
movq -0x1648(%rbp), %rdi
leaq 0x1caaa(%rip), %rsi     # 0x374d7
callq 0xa780
movq %rax, -0x1650(%rbp)
jmp 0x1aa3b
movq -0x1650(%rbp), %rdi
movsd -0x10f8(%rbp), %xmm0
callq 0xaee0
movq %rax, -0x1658(%rbp)
jmp 0x1aa58
movq -0x1658(%rbp), %rdi
movq 0x35522(%rip), %rsi     # 0x4ff88
callq 0xa7e0
jmp 0x1aa6d
movl $0x0, -0x13ec(%rbp)
movq 0x35532(%rip), %rdi     # 0x4ffb0
leaq 0x1ca6b(%rip), %rsi     # 0x374f0
callq 0xa780
jmp 0x1aa8c
leaq -0x1380(%rbp), %rax
movq %rax, -0x13f8(%rbp)
movq -0x13f8(%rbp), %rdi
callq 0x1bd80
movq %rax, -0x1400(%rbp)
movq -0x13f8(%rbp), %rdi
callq 0x1bc60
movq %rax, -0x1408(%rbp)
leaq -0x1400(%rbp), %rdi
leaq -0x1408(%rbp), %rsi
callq 0x1bc00
testb $0x1, %al
jne 0x1aad9
jmp 0x1ab55
leaq -0x1400(%rbp), %rdi
callq 0x1bdb0
movq (%rax), %rcx
movq %rcx, -0x1418(%rbp)
movq 0x8(%rax), %rax
movq %rax, -0x1410(%rbp)
cmpl $0x1, -0x1410(%rbp)
jle 0x1ab42
movl -0x1410(%rbp), %esi
movq 0x354a0(%rip), %rdi     # 0x4ffb0
callq 0xada0
movq %rax, -0x1660(%rbp)
jmp 0x1ab1e
movq -0x1660(%rbp), %rdi
leaq 0x1c9a9(%rip), %rsi     # 0x374d5
callq 0xa780
jmp 0x1ab33
movl -0x13ec(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x13ec(%rbp)
jmp 0x1ab44
leaq -0x1400(%rbp), %rdi
callq 0x1bde0
jmp 0x1aac0
movq 0x35454(%rip), %rdi     # 0x4ffb0
movq 0x35425(%rip), %rsi     # 0x4ff88
callq 0xa7e0
jmp 0x1ab6a
movq 0x3543f(%rip), %rdi     # 0x4ffb0
leaq 0x1c9a7(%rip), %rsi     # 0x3751f
callq 0xa780
movq %rax, -0x1668(%rbp)
jmp 0x1ab86
movq -0x1668(%rbp), %rdi
movl -0x13ec(%rbp), %esi
callq 0xada0
movq %rax, -0x1670(%rbp)
jmp 0x1aba1
movq -0x1670(%rbp), %rdi
leaq 0x1c97b(%rip), %rsi     # 0x3752a
callq 0xa780
movq %rax, -0x1678(%rbp)
jmp 0x1abbd
movq -0x1678(%rbp), %rdi
movq 0x353bd(%rip), %rsi     # 0x4ff88
callq 0xa7e0
jmp 0x1abd2
leaq -0x1380(%rbp), %rdi
callq 0x1be10
leaq -0x1348(%rbp), %rdi
callq 0x1be30
leaq -0x1310(%rbp), %rdi
callq 0x1b8a0
leaq -0x11e0(%rbp), %rdi
callq 0xddf0
leaq -0x10e8(%rbp), %rdi
callq 0x1be50
jmp 0x1a70f
leaq -0x1310(%rbp), %rdi
callq 0x1b8a0
leaq -0x11e0(%rbp), %rdi
callq 0xddf0
jmp 0x1ae4f
movq 0x35379(%rip), %rdi     # 0x4ffb0
leaq 0x1c907(%rip), %rsi     # 0x37545
callq 0xa780
movq %rax, -0x1680(%rbp)
jmp 0x1ac4c
movq -0x1680(%rbp), %rdi
movq 0x3532e(%rip), %rsi     # 0x4ff88
callq 0xa7e0
jmp 0x1ac61
movups 0x1c5e0(%rip), %xmm0    # 0x37248
movaps %xmm0, -0x1460(%rbp)
movups 0x1c5c2(%rip), %xmm0    # 0x37238
movaps %xmm0, -0x1470(%rbp)
movups 0x1c5a4(%rip), %xmm0    # 0x37228
movaps %xmm0, -0x1480(%rbp)
movabsq $0x408f400000000000, %rax # imm = 0x408F400000000000
movq %rax, -0x1450(%rbp)
leaq -0x1480(%rbp), %rax
movq %rax, -0x1440(%rbp)
movq $0x7, -0x1438(%rbp)
leaq -0x1481(%rbp), %rdi
movq %rdi, -0x1688(%rbp)
callq 0x1b9a0
movq -0x1688(%rbp), %rcx
movq -0x1440(%rbp), %rsi
movq -0x1438(%rbp), %rdx
leaq -0x1430(%rbp), %rdi
callq 0x1b9c0
jmp 0x1aceb
leaq -0x1481(%rbp), %rdi
callq 0x1ba40
leaq -0x1430(%rbp), %rax
movq %rax, -0x1490(%rbp)
movq -0x1490(%rbp), %rdi
callq 0x1ba60
movq %rax, -0x1498(%rbp)
movq -0x1490(%rbp), %rdi
callq 0x1ba90
movq %rax, -0x14a0(%rbp)
leaq -0x1498(%rbp), %rdi
leaq -0x14a0(%rbp), %rsi
callq 0x1bac0
testb $0x1, %al
jne 0x1ad47
jmp 0x1ae35
leaq -0x1498(%rbp), %rdi
callq 0x1bb00
movsd (%rax), %xmm0
movsd %xmm0, -0x14a8(%rbp)
leaq -0x14c9(%rbp), %rdi
movq %rdi, -0x1690(%rbp)
callq 0xadf0
movq -0x1690(%rbp), %rdx
leaq 0x1c7f5(%rip), %rsi     # 0x37575
leaq -0x14c8(%rbp), %rdi
callq 0x12010
jmp 0x1ad8e
movsd -0x14a8(%rbp), %xmm0
leaq -0x14c8(%rbp), %rdi
callq 0x34960
jmp 0x1ada4
leaq -0x14c8(%rbp), %rdi
callq 0xa470
leaq -0x14c9(%rbp), %rdi
callq 0xa850
leaq -0x1498(%rbp), %rdi
callq 0x1be50
jmp 0x1ad2b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x1ae4f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x1481(%rbp), %rdi
callq 0x1ba40
jmp 0x1ae4f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
jmp 0x1ae1b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x70(%rbp)
movl %eax, -0x74(%rbp)
leaq -0x14c8(%rbp), %rdi
callq 0xa470
leaq -0x14c9(%rbp), %rdi
callq 0xa850
leaq -0x1430(%rbp), %rdi
callq 0x1be70
jmp 0x1ae4f
leaq -0x1430(%rbp), %rdi
callq 0x1be70
leaq -0x1080(%rbp), %rdi
callq 0x1be70
jmp 0x1ae5d
leaq -0x1080(%rbp), %rdi
callq 0x1be70
jmp 0x1ae68
xorl %eax, %eax
addq $0x1690, %rsp           # imm = 0x1690
popq %rbp
retq
movq -0x70(%rbp), %rdi
callq 0xade0
nopw %cs:(%rax,%rax)
nopl (%rax,%rax)