// File: /workspace/github_cpp_makefile_star2_O2/zimpha[P]MiniSQL/interpreter.cc
// Function: Interpreter::parse(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>)
bool Interpreter::parse(std::string input) {
    if (input == "quit") {
        api.bm.BufferManagerFlush();
        printf("Flush finished\n");
        return true;
    }

    if (input == "flush") {
        api.bm.BufferManagerFlush();
        printf("Flush finished\n");
        return false;
    }

    if (input == "") return false;
    
    for (size_t i = 0; i < input.length(); ++ i) {
        if (input[i] == '(' || input[i] == ')' || input[i] == ',') {
            input.insert(i, " ");
            input.insert(i + 2, " ");
            i += 2;
        }
    }
    std::strstream sin;
    sin << input;

    std::string oper, null;
    sin >> oper;

    if (oper == "execfile") {
        std::string filename;
        sin >> filename;
        return execfile(filename);
    }
    else if (oper == "create") {
        std::string type;
        sin >> type;

        if (type == "table") {
            std::string tableName;
            sin >> tableName >> null;
            // null == "("

            std::vector<AttrType> data;
            int pk = 0x3f3f3f3f;

            while (1) {
                std::string attrName;
                sin >> attrName;

                if (attrName == "primary") {
                    sin >> null; // null == "key"
                    sin >> null; // null == "("
                    std::string pkName;
                    sin >> pkName;

                    for (size_t i = 0; i < data.size(); ++ i) {
                        if (data[i].name == pkName) {
                            pk = i;
                            break;
                        }
                    }
                    break;
                }

                std::string dataType;
                int length = 0;
                sin >> dataType;

                if (dataType == "char") { // get char length
                    sin >> null; // null == "("
                    sin >> length;
                    sin >> null; // null == ")"
                }
                std::string unique;
                sin >> unique;

                AttrType newAttr;
                if (unique == "unique") {
                    newAttr.unique = true;
                    sin >> null; // null: ","
                }
                else {
                    // unique == ","
                    newAttr.unique = false;
                }
                newAttr.name = attrName;
                if (dataType == "char") {
                    newAttr.type = 2;
                    newAttr.length = length + 1;
                }
                else if (dataType == "int") {
                    newAttr.type = 0;
                    newAttr.length = 0;
                }
                else if (dataType == "float") {
                    newAttr.type = 1;
                    newAttr.length = 0;
                }
                else {
                    std::cout << "unrecognized data type: " << dataType << std::endl;
                    return false;
                }
                data.push_back(newAttr);
            }
            if (pk == 0x3f3f3f3f) {
                std::cout << "don't set primary key or no such attribute" << std::endl;
                return false;
            }
            else {
                Response res = api.createTable(tableName, data, pk);
                if (!res.succeed) {
                    std::cout << res.info << std::endl;
                    return false;
                }
                else {
                    std::cout << "OK" << std::endl;
                    return false;
                }
            }
        }
        else if (type == "index") {
            std::string indexName, tableName, attrName;
            sin >> indexName >> null >> tableName >> null >> attrName;
            // first null == "on"
            // second null == "("
            Response res = api.createIndex(indexName, tableName, attrName);
            if (!res.succeed) {
                std::cout << res.info << std::endl;
                return false;
            }
            else {
                std::cout << "OK" << std::endl;
                return false;
            }
        }
        else {
            std::cout << "syntax error" << std::endl;
            return false;
        }
    }
    else if (oper == "drop") {
        std::string type;
        sin >> type;
        if (type == "table") {
            std::string tableName;
            sin >> tableName;
            Response res = api.dropTable(tableName);
            if (!res.succeed) {
                std::cout << res.info << std::endl;
                return false;
            }
            else {
                std::cout << "OK" << std::endl;
                return false;
            }
        }
        else if (type == "index") {
            std::string indexName;
            sin >> indexName;
            Response res = api.dropIndex(indexName);
            if (!res.succeed) {
                std::cout << res.info << std::endl;
                return false;
            }
            else {
                std::cout << "OK" << std::endl;
                return false;
            }
        }
        else {
            std::cout << "syntax error" << std::endl;
            return false;
        }
    }
    else if (oper == "insert") {
        std::string tableName;
        sin >> null >> tableName >> null >> null;
        // first null == "into"
        // second null == "values"
        // third null == "("
        std::vector<element> entry;
        while (1) {
            std::string data;
            sin >> data;
            entry.push_back(parseElement(data));
            sin >> null; // null == ","
            if (null == ")") {
                break;
            }
        }
        Response res = api.Insert(tableName, entry);
        if (!res.succeed) {
            std::cout << res.info << std::endl;
            return false;
        }
        else {
            std::cout << "OK" << std::endl;
            return false;
        }
    }
    else if (oper == "select") {
        std::string tableName;
        sin >> null >> null >> tableName;
        // first null == "*"
        // second null == "from"
        Filter filter;
        if (!api.cm.hasTable(tableName + ".table")) {
            std::cout << "table does not exist" << std::endl;
            return false;
        }
        Table nt = api.cm.loadTable(tableName + ".table");
        while (sin >> null) { // null == "where", null == "and"
            std::string attrName, ope, data;
            sin >> attrName >> ope >> data;
            int index = -1, op;
            for (size_t i = 0; i < nt.attributes.size(); ++ i) {
                if (nt.attributes[i].name == attrName) {
                    index = i;
                    break;
                }
            }
            if (index == -1) {
                std::cout << "attribute does not exist" << std::endl;
                return false;
            }
            if (ope == "<") op = 0;
            else if (ope == "<=") op = 1;
            else if (ope == "=") op = 2;
            else if (ope == ">=") op = 3;
            else if (ope == ">") op = 4;
            else if (ope == "<>") op = 5;
            else {
                std::cout << "syntax error" << std::endl;
                return false;
            }
            filter.addRule(Rule(index, op, parseElement(data)));
        }
        Response res = api.Select(tableName, filter);
        if (!res.succeed) {
            std::cout << res.info << std::endl;
            return false;
        }
        else {
            printSelectResult(nt, res);
            return false;
        }
    }
    else if (oper == "delete") {
        std::string tableName;
        sin >> null >> tableName;// null == from;
        Filter filter;
        if (!api.cm.hasTable(tableName + ".table")) {
            std::cout << "table does not exist" << std::endl;
            return false;
        }
        Table nt = api.cm.loadTable(tableName + ".table");
        while (sin >> null) { // null == "where", null == "and"
            std::string attrName, ope, data;
            sin >> attrName >> ope >> data;
            int index = -1, op;
            for (size_t i = 0; i < nt.attributes.size(); ++ i) {
                if (nt.attributes[i].name == attrName) {
                    index = i;
                    break;
                }
            }
            if (index == -1) {
                std::cout << "attribute does not exist" << std::endl;
                return false;
            }
            if (ope == "<") op = 0;
            else if (ope == "<=") op = 1;
            else if (ope == "=") op = 2;
            else if (ope == ">=") op = 3;
            else if (ope == ">") op = 4;
            else if (ope == "<>") op = 5;
            else {
                std::cout << "syntax error" << std::endl;
                return false;
            }
            filter.addRule(Rule(index, op, parseElement(data)));
        }
        Response res = api.Delete(tableName, filter);
        if (!res.succeed) {
            std::cout << res.info << std::endl;
        }
        else {
            std::cout << "delete OK" << std::endl;
        }
    }
    else {
        std::cout << "syntax error" << std::endl;
        return false;
    }
    return false;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x418, %rsp            # imm = 0x418
movq %rsi, %rbx
movq %rdi, %r14
leaq 0x4aa9(%rip), %rsi      # 0x115a4
movq %rbx, %rdi
callq 0xe83f
testb %al, %al
je 0xcb29
addq $0x98, %r14
movq %r14, %rdi
callq 0x7dfa
leaq 0x4bb3(%rip), %rdi      # 0x116d0
callq 0x33e0
movb $0x1, %bl
jmp 0xdc07
leaq 0x4a79(%rip), %rsi      # 0x115a9
movq %rbx, %rdi
callq 0xe83f
testb %al, %al
je 0xcb59
addq $0x98, %r14
movq %r14, %rdi
callq 0x7dfa
leaq 0x4b7e(%rip), %rdi      # 0x116d0
callq 0x33e0
jmp 0xcb6c
leaq 0x472b(%rip), %rsi      # 0x1128b
movq %rbx, %rdi
callq 0xe83f
testb %al, %al
je 0xcb73
xorl %ebx, %ebx
jmp 0xdc07
movq %r14, -0x140(%rbp)
xorl %r14d, %r14d
movabsq $0x130000000000, %r12   # imm = 0x130000000000
leaq 0x4a5f(%rip), %r15      # 0x115ed
cmpq 0x8(%rbx), %r14
jae 0xcbcd
movq (%rbx), %rax
movzbl (%rax,%r14), %eax
cmpq $0x2c, %rax
ja 0xcbc8
btq %rax, %r12
jae 0xcbc8
movq %rbx, %rdi
movq %r14, %rsi
movq %r15, %rdx
callq 0x3090
addq $0x2, %r14
movq %rbx, %rdi
movq %r14, %rsi
movq %r15, %rdx
callq 0x3090
incq %r14
jmp 0xcb8e
leaq -0x3d8(%rbp), %rdi
callq 0x3370
leaq -0x3c8(%rbp), %rdi
movq %rbx, %rsi
callq 0x3250
leaq -0x1b8(%rbp), %rax
movq %rax, -0x10(%rax)
andq $0x0, -0x8(%rax)
xorl %ecx, %ecx
movb %cl, (%rax)
leaq -0x158(%rbp), %rax
movq %rax, -0x10(%rax)
andq $0x0, -0x8(%rax)
movb %cl, (%rax)
leaq -0x3d8(%rbp), %rdi
leaq -0x1c8(%rbp), %rsi
callq 0x3330
movq -0x140(%rbp), %r14
leaq 0x4980(%rip), %rsi      # 0x115af
leaq -0x1c8(%rbp), %rdi
callq 0xe83f
leaq -0xe0(%rbp), %rcx
testb %al, %al
je 0xcca6
leaq -0xf0(%rbp), %rsi
movq %rcx, (%rsi)
andq $0x0, 0x8(%rsi)
movb $0x0, 0x10(%rsi)
leaq -0x3d8(%rbp), %rdi
callq 0x3330
leaq -0x200(%rbp), %rdi
leaq -0xf0(%rbp), %rsi
callq 0x3380
leaq -0x200(%rbp), %rsi
movq %r14, %rdi
callq 0xe0ae
movl %eax, %ebx
leaq -0x200(%rbp), %rdi
callq 0x34f8
leaq -0xf0(%rbp), %rdi
callq 0x34f8
jmp 0xdbe3
leaq 0x490b(%rip), %rsi      # 0x115b8
leaq -0x1c8(%rbp), %rdi
callq 0xe83f
leaq -0x198(%rbp), %rbx
pushq $0x60
popq %r15
testb %al, %al
je 0xcf51
leaq -0x1a8(%rbp), %rsi
movq %rbx, (%rsi)
andq $0x0, 0x8(%rsi)
movb $0x0, 0x10(%rsi)
leaq -0x3d8(%rbp), %rdi
callq 0x3330
leaq 0x4360(%rip), %rsi      # 0x11052
leaq -0x1a8(%rbp), %rdi
callq 0xe83f
testb %al, %al
je 0xd199
leaq -0x40(%rbp), %rax
movq %rax, -0x10(%rax)
andq $0x0, -0x8(%rax)
movb $0x0, (%rax)
leaq -0x3d8(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x3330
leaq -0x168(%rbp), %rsi
movq %rax, %rdi
callq 0x3330
xorps %xmm0, %xmm0
leaq -0x130(%rbp), %rax
movaps %xmm0, (%rax)
andq $0x0, 0x10(%rax)
leaq -0x3d8(%rbp), %r15
leaq -0x70(%rbp), %r12
leaq -0x90(%rbp), %r14
leaq -0x110(%rbp), %r13
leaq -0xf0(%rbp), %rbx
leaq -0x60(%rbp), %rax
movq %rax, -0x70(%rbp)
andq $0x0, -0x68(%rbp)
movb $0x0, -0x60(%rbp)
movq %r15, %rdi
movq %r12, %rsi
callq 0x3330
movq %r12, %rdi
leaq 0x4832(%rip), %rsi      # 0x115bf
callq 0xe83f
testb %al, %al
jne 0xd26f
leaq -0x80(%rbp), %rax
movq %rax, -0x90(%rbp)
andq $0x0, -0x88(%rbp)
movb $0x0, -0x80(%rbp)
andl $0x0, -0x144(%rbp)
movq %r15, %rdi
movq %r14, %rsi
callq 0x3330
movq %r14, %rdi
leaq 0x47fa(%rip), %rsi      # 0x115c7
callq 0xe83f
testb %al, %al
je 0xce03
movq %r15, %rdi
leaq -0x168(%rbp), %rsi
callq 0x3330
movq %r15, %rdi
leaq -0x144(%rbp), %rsi
callq 0x3180
movq %r15, %rdi
leaq -0x168(%rbp), %rsi
callq 0x3330
leaq -0x100(%rbp), %rax
movq %rax, -0x110(%rbp)
andq $0x0, -0x108(%rbp)
movb $0x0, -0x100(%rbp)
movq %r15, %rdi
movq %r13, %rsi
callq 0x3330
leaq -0xe0(%rbp), %rax
movq %rax, -0xf0(%rbp)
andq $0x0, -0xe8(%rbp)
movb $0x0, -0xe0(%rbp)
andl $0x0, -0xb8(%rbp)
andq $0x0, -0xb0(%rbp)
leaq -0xb8(%rbp), %rax
movq %rax, -0xa8(%rbp)
movq %rax, -0xa0(%rbp)
andq $0x0, -0x98(%rbp)
movq %r13, %rdi
leaq 0x421f(%rip), %rsi      # 0x1109d
callq 0xe83f
testb %al, %al
je 0xce9f
movb $0x1, -0xc8(%rbp)
movq %r15, %rdi
leaq -0x168(%rbp), %rsi
callq 0x3330
jmp 0xcea6
movb $0x0, -0xc8(%rbp)
movq %rbx, %rdi
movq %r12, %rsi
callq 0x3150
movq %r14, %rdi
leaq 0x470c(%rip), %rsi      # 0x115c7
callq 0xe83f
testb %al, %al
je 0xced8
movl $0x2, -0xd0(%rbp)
movl -0x144(%rbp), %eax
incl %eax
jmp 0xcf17
movq %r14, %rdi
leaq 0x46ea(%rip), %rsi      # 0x115cc
callq 0xe83f
testb %al, %al
je 0xcef4
andl $0x0, -0xd0(%rbp)
jmp 0xcf15
movq %r14, %rdi
leaq 0x46d2(%rip), %rsi      # 0x115d0
callq 0xe83f
testb %al, %al
je 0xdb23
movl $0x1, -0xd0(%rbp)
xorl %eax, %eax
movl %eax, -0xcc(%rbp)
leaq -0x130(%rbp), %rdi
movq %rbx, %rsi
callq 0xbeea
movq %rbx, %rdi
callq 0x684c
movq %r13, %rdi
callq 0x34f8
movq %r14, %rdi
callq 0x34f8
movq %r12, %rdi
callq 0x34f8
jmp 0xcd67
leaq 0x43cc(%rip), %rsi      # 0x11324
leaq -0x1c8(%rbp), %rdi
callq 0xe83f
testb %al, %al
je 0xcffe
leaq -0x1a8(%rbp), %rsi
movq %rbx, (%rsi)
andq $0x0, 0x8(%rsi)
movb $0x0, 0x10(%rsi)
leaq -0x3d8(%rbp), %rdi
callq 0x3330
leaq 0x40c0(%rip), %rsi      # 0x11052
leaq -0x1a8(%rbp), %rdi
callq 0xe83f
testb %al, %al
je 0xd61c
leaq -0x40(%rbp), %rax
movq %rax, -0x10(%rax)
andq $0x0, -0x8(%rax)
movb $0x0, (%rax)
leaq -0x3d8(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x3330
leaq -0xf0(%rbp), %rdi
leaq -0x50(%rbp), %rdx
movq %r14, %rsi
callq 0x4154
cmpb $0x0, -0xf0(%rbp)
je 0xda64
movq 0xbfdb(%rip), %rdi      # 0x18fc8
leaq 0x4681(%rip), %rsi      # 0x11675
callq 0x3280
jmp 0xda77
leaq 0x436b(%rip), %rsi      # 0x11370
leaq -0x1c8(%rbp), %rdi
callq 0xe83f
testb %al, %al
je 0xd306
movq %rbx, -0x1a8(%rbp)
andq $0x0, -0x1a0(%rbp)
movb $0x0, -0x198(%rbp)
leaq -0x3d8(%rbp), %rdi
leaq -0x168(%rbp), %rsi
callq 0x3330
leaq -0x1a8(%rbp), %rsi
movq %rax, %rdi
callq 0x3330
leaq -0x168(%rbp), %rsi
movq %rax, %rdi
callq 0x3330
leaq -0x168(%rbp), %rsi
movq %rax, %rdi
callq 0x3330
xorps %xmm0, %xmm0
leaq -0x70(%rbp), %rax
movaps %xmm0, (%rax)
andq $0x0, 0x10(%rax)
leaq -0x3d8(%rbp), %r15
leaq -0x50(%rbp), %r12
leaq -0x260(%rbp), %r13
leaq -0xf0(%rbp), %r14
leaq -0x168(%rbp), %rbx
leaq -0x40(%rbp), %rax
movq %rax, -0x50(%rbp)
andq $0x0, -0x48(%rbp)
movb $0x0, -0x40(%rbp)
movq %r15, %rdi
movq %r12, %rsi
callq 0x3330
movq %r13, %rdi
movq %r12, %rsi
callq 0x3380
movq %r14, %rdi
movq %r13, %rdx
callq 0xe212
leaq -0x70(%rbp), %rdi
movq %r14, %rsi
callq 0xe8a2
leaq -0xe8(%rbp), %rdi
callq 0x34f8
movq %r13, %rdi
callq 0x34f8
movq %r15, %rdi
movq %rbx, %rsi
callq 0x3330
movq %rbx, %rdi
leaq 0x46fc(%rip), %rsi      # 0x11801
callq 0xe83f
movq %rbx, %r13
movq %r14, %rbx
movq %r15, %r14
movl %eax, %r15d
movq %r12, %rdi
callq 0x34f8
testb %r15b, %r15b
movq %r14, %r15
movq %rbx, %r14
movq %r13, %rbx
leaq -0x260(%rbp), %r13
je 0xd09e
leaq -0x1e0(%rbp), %rdi
leaq -0x70(%rbp), %rsi
callq 0x770e
leaq -0xf0(%rbp), %rdi
leaq -0x1a8(%rbp), %rdx
leaq -0x1e0(%rbp), %rcx
movq -0x140(%rbp), %rsi
callq 0x59b4
leaq -0x1e0(%rbp), %rdi
callq 0x6dc8
cmpb $0x0, -0xf0(%rbp)
je 0xdac5
movq 0xbe40(%rip), %rdi      # 0x18fc8
leaq 0x44e6(%rip), %rsi      # 0x11675
callq 0x3280
jmp 0xdad8
leaq 0x3f9e(%rip), %rsi      # 0x1113e
leaq -0x1a8(%rbp), %rdi
callq 0xe83f
testb %al, %al
je 0xd68f
leaq -0x40(%rbp), %rax
movq %rax, -0x10(%rax)
andq $0x0, -0x8(%rax)
xorl %ecx, %ecx
leaq -0x60(%rbp), %rdx
movq %rdx, -0x10(%rdx)
andq $0x0, -0x8(%rdx)
movb %cl, (%rax)
movb %cl, (%rdx)
leaq -0x80(%rbp), %rax
movq %rax, -0x10(%rax)
andq $0x0, -0x8(%rax)
movb %cl, (%rax)
leaq -0x3d8(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x3330
leaq -0x168(%rbp), %rsi
movq %rax, %rdi
callq 0x3330
leaq -0x70(%rbp), %rsi
movq %rax, %rdi
callq 0x3330
leaq -0x168(%rbp), %rsi
movq %rax, %rdi
callq 0x3330
leaq -0x90(%rbp), %rsi
movq %rax, %rdi
callq 0x3330
leaq -0xf0(%rbp), %rdi
leaq -0x50(%rbp), %rdx
leaq -0x70(%rbp), %rcx
leaq -0x90(%rbp), %r8
movq %r14, %rsi
callq 0x3942
cmpb $0x0, -0xf0(%rbp)
je 0xda84
movq 0xbd6a(%rip), %rdi      # 0x18fc8
leaq 0x4410(%rip), %rsi      # 0x11675
callq 0x3280
jmp 0xda97
leaq -0x3d8(%rbp), %rdi
leaq -0x168(%rbp), %rsi
callq 0x3330
leaq -0x3d8(%rbp), %rdi
leaq -0x168(%rbp), %rsi
callq 0x3330
leaq -0xf0(%rbp), %rsi
leaq -0xe0(%rbp), %rax
movq %rax, (%rsi)
andq $0x0, 0x8(%rsi)
movb $0x0, 0x10(%rsi)
leaq -0x3d8(%rbp), %rdi
callq 0x3330
pushq $0x60
popq %r12
xorl %r15d, %r15d
leaq -0xf0(%rbp), %r14
xorl %ebx, %ebx
movq -0x130(%rbp), %rdi
movq -0x128(%rbp), %rax
subq %rdi, %rax
cqto
idivq %r12
cmpq %rax, %rbx
jae 0xd6af
addq %r15, %rdi
movq %r14, %rsi
callq 0x5db5
testb %al, %al
jne 0xd6b4
incq %rbx
addq $0x60, %r15
jmp 0xd2cb
leaq 0x431a(%rip), %rsi      # 0x11627
leaq -0x1c8(%rbp), %rdi
callq 0xe83f
leaq -0x40(%rbp), %rbx
testb %al, %al
je 0xd737
movq %rbx, -0x50(%rbp)
andq $0x0, -0x48(%rbp)
movb $0x0, -0x40(%rbp)
leaq -0x3d8(%rbp), %rdi
leaq -0x168(%rbp), %rsi
callq 0x3330
leaq -0x168(%rbp), %rsi
movq %rax, %rdi
callq 0x3330
leaq -0x50(%rbp), %rsi
movq %rax, %rdi
callq 0x3330
leaq -0x130(%rbp), %rdi
callq 0xc5d8
leaq 0x3cde(%rip), %rdx      # 0x11051
leaq -0xf0(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x5d7d
leaq -0xf0(%rbp), %rsi
movq %r14, %rdi
callq 0xb838
movl %eax, %ebx
leaq -0xf0(%rbp), %rdi
callq 0x34f8
testb %bl, %bl
je 0xdc1b
leaq 0x3ca2(%rip), %rdx      # 0x11051
leaq -0x1a8(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x5d7d
leaq -0xf0(%rbp), %rdi
leaq -0x1a8(%rbp), %rdx
movq %r14, %rsi
callq 0xb966
leaq -0x1a8(%rbp), %rdi
callq 0x34f8
leaq -0x3d8(%rbp), %rdi
leaq -0x168(%rbp), %rsi
leaq -0x70(%rbp), %r12
leaq 0x4249(%rip), %rax      # 0x11643
movq %rax, -0x138(%rbp)
callq 0x3330
movq (%rax), %rcx
movq -0x18(%rcx), %rcx
testb $0x5, 0x20(%rax,%rcx)
jne 0xdc5b
leaq -0x60(%rbp), %rax
movq %rax, -0x70(%rbp)
andq $0x0, -0x68(%rbp)
leaq -0x80(%rbp), %rax
movq %rax, -0x90(%rbp)
andq $0x0, -0x88(%rbp)
xorl %ecx, %ecx
movb %cl, -0x60(%rbp)
movb %cl, -0x80(%rbp)
leaq -0x100(%rbp), %rax
movq %rax, -0x110(%rbp)
andq $0x0, -0x108(%rbp)
movb %cl, -0x100(%rbp)
leaq -0x3d8(%rbp), %rdi
movq %r12, %rsi
callq 0x3330
movq %rax, %rdi
leaq -0x90(%rbp), %rsi
callq 0x3330
movq %rax, %rdi
leaq -0x110(%rbp), %rsi
callq 0x3330
xorl %r13d, %r13d
xorl %ebx, %ebx
movq -0xc8(%rbp), %rdi
movq -0xc0(%rbp), %rax
subq %rdi, %rax
cqto
idivq %r15
cmpq %rax, %rbx
jae 0xdd27
addq %r13, %rdi
movq %r12, %rsi
callq 0x5db5
testb %al, %al
jne 0xd4c5
incq %rbx
addq $0x60, %r13
jmp 0xd48e
cmpl $-0x1, %ebx
leaq -0x90(%rbp), %rax
je 0xdd27
movq %rax, %r14
movq %rax, %rdi
leaq 0x417a(%rip), %rsi      # 0x1165c
callq 0xe83f
movl $0x0, -0x2c(%rbp)
testb %al, %al
jne 0xd577
movq %r14, %rdi
leaq 0x415e(%rip), %rsi      # 0x1165e
callq 0xe83f
pushq $0x1
popq %rcx
movl %ecx, -0x2c(%rbp)
testb %al, %al
jne 0xd577
movq %r14, %rdi
leaq 0x4146(%rip), %rsi      # 0x1165f
callq 0xe83f
pushq $0x2
popq %rcx
movl %ecx, -0x2c(%rbp)
testb %al, %al
jne 0xd577
movq %r14, %rdi
leaq 0x412f(%rip), %rsi      # 0x11661
callq 0xe83f
pushq $0x3
popq %rcx
movl %ecx, -0x2c(%rbp)
testb %al, %al
jne 0xd577
movq %r14, %rdi
leaq 0x411a(%rip), %rsi      # 0x11665
callq 0xe83f
pushq $0x4
popq %rcx
movl %ecx, -0x2c(%rbp)
testb %al, %al
jne 0xd577
movq %r14, %rdi
leaq 0x4100(%rip), %rsi      # 0x11664
callq 0xe83f
pushq $0x5
popq %rcx
movl %ecx, -0x2c(%rbp)
testb %al, %al
je 0xdd19
leaq -0x240(%rbp), %r14
movq %r14, %rdi
leaq -0x110(%rbp), %rsi
callq 0x3380
leaq -0x438(%rbp), %r13
movq %r13, %rdi
movq %r14, %rdx
callq 0xe212
leaq -0x1a8(%rbp), %r14
movq %r14, %rdi
movl %ebx, %esi
movl -0x2c(%rbp), %edx
movq %r13, %rcx
callq 0xc5c2
leaq -0x130(%rbp), %rdi
movq %r14, %rsi
callq 0xc5ea
leaq -0x198(%rbp), %rdi
callq 0x34f8
leaq -0x430(%rbp), %rdi
callq 0x34f8
leaq -0x240(%rbp), %rdi
callq 0x34f8
leaq -0x110(%rbp), %rdi
callq 0x34f8
leaq -0x90(%rbp), %rdi
callq 0x34f8
movq %r12, %rdi
callq 0x34f8
leaq -0x3d8(%rbp), %rdi
leaq -0x168(%rbp), %rsi
jmp 0xd401
leaq 0x3b1b(%rip), %rsi      # 0x1113e
leaq -0x1a8(%rbp), %rdi
callq 0xe83f
testb %al, %al
je 0xda44
leaq -0x40(%rbp), %rax
movq %rax, -0x10(%rax)
andq $0x0, -0x8(%rax)
movb $0x0, (%rax)
leaq -0x3d8(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x3330
leaq -0xf0(%rbp), %rdi
leaq -0x50(%rbp), %rdx
movq %r14, %rsi
callq 0x3cec
cmpb $0x0, -0xf0(%rbp)
je 0xdba5
movq 0xb94a(%rip), %rdi      # 0x18fc8
leaq 0x3ff0(%rip), %rsi      # 0x11675
callq 0x3280
jmp 0xdbb8
movq 0xb932(%rip), %rdi      # 0x18fc8
leaq 0x3f7d(%rip), %rsi      # 0x1161a
callq 0x3280
movq %rax, %rdi
callq 0x3120
jmp 0xdbd5
movl $0x3f3f3f3f, %ebx       # imm = 0x3F3F3F3F
leaq -0xf0(%rbp), %rdi
callq 0x34f8
leaq -0x70(%rbp), %rdi
callq 0x34f8
cmpl $0x3f3f3f3f, %ebx       # imm = 0x3F3F3F3F
movq -0x140(%rbp), %rsi
jne 0xd6f8
movq 0xb8e9(%rip), %rdi      # 0x18fc8
leaq 0x3f09(%rip), %rsi      # 0x115ef
callq 0x3280
movq %rax, %rdi
callq 0x3120
jmp 0xdb7a
leaq -0xf0(%rbp), %rdi
leaq -0x50(%rbp), %rdx
leaq -0x130(%rbp), %rcx
movl %ebx, %r8d
callq 0x3f58
cmpb $0x0, -0xf0(%rbp)
je 0xdafa
movq 0xb8a2(%rip), %rdi      # 0x18fc8
leaq 0x3f48(%rip), %rsi      # 0x11675
callq 0x3280
jmp 0xdb0d
leaq 0x3f29(%rip), %rsi      # 0x11667
leaq -0x1c8(%rbp), %rdi
callq 0xe83f
testb %al, %al
je 0xdb88
movq %rbx, -0x50(%rbp)
andq $0x0, -0x48(%rbp)
movb $0x0, -0x40(%rbp)
leaq -0x3d8(%rbp), %rdi
leaq -0x168(%rbp), %rsi
callq 0x3330
leaq -0x50(%rbp), %rsi
movq %rax, %rdi
callq 0x3330
leaq -0x130(%rbp), %rdi
callq 0xc5d8
leaq 0x38c0(%rip), %rdx      # 0x11051
leaq -0xf0(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x5d7d
leaq -0xf0(%rbp), %rsi
movq %r14, %rdi
callq 0xb838
movl %eax, %ebx
leaq -0xf0(%rbp), %rdi
callq 0x34f8
testb %bl, %bl
je 0xdc3b
leaq 0x3884(%rip), %rdx      # 0x11051
leaq -0x1a8(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x5d7d
leaq -0xf0(%rbp), %rdi
leaq -0x1a8(%rbp), %rdx
movq %r14, %rsi
callq 0xb966
leaq -0x1a8(%rbp), %rdi
callq 0x34f8
leaq -0x3d8(%rbp), %rdi
leaq -0x168(%rbp), %rsi
leaq -0x70(%rbp), %r12
leaq 0x3e2b(%rip), %rax      # 0x11643
movq %rax, -0x138(%rbp)
callq 0x3330
movq (%rax), %rcx
movq -0x18(%rcx), %rcx
testb $0x5, 0x20(%rax,%rcx)
jne 0xdc97
leaq -0x60(%rbp), %rax
movq %rax, -0x70(%rbp)
andq $0x0, -0x68(%rbp)
leaq -0x80(%rbp), %rax
movq %rax, -0x90(%rbp)
andq $0x0, -0x88(%rbp)
xorl %ecx, %ecx
movb %cl, -0x60(%rbp)
movb %cl, -0x80(%rbp)
leaq -0x100(%rbp), %rax
movq %rax, -0x110(%rbp)
andq $0x0, -0x108(%rbp)
movb %cl, -0x100(%rbp)
leaq -0x3d8(%rbp), %rdi
movq %r12, %rsi
callq 0x3330
movq %rax, %rdi
leaq -0x90(%rbp), %rsi
callq 0x3330
movq %rax, %rdi
leaq -0x110(%rbp), %rsi
callq 0x3330
xorl %r13d, %r13d
xorl %ebx, %ebx
movq -0xc8(%rbp), %rdi
movq -0xc0(%rbp), %rax
subq %rdi, %rax
cqto
idivq %r15
cmpq %rax, %rbx
jae 0xdd52
addq %r13, %rdi
movq %r12, %rsi
callq 0x5db5
testb %al, %al
jne 0xd8e3
incq %rbx
addq $0x60, %r13
jmp 0xd8ac
cmpl $-0x1, %ebx
leaq -0x90(%rbp), %rax
je 0xdd52
movq %rax, %r14
movq %rax, %rdi
leaq 0x3d5c(%rip), %rsi      # 0x1165c
callq 0xe83f
movl $0x0, -0x2c(%rbp)
testb %al, %al
jne 0xd99f
movq %r14, %rdi
leaq 0x3d40(%rip), %rsi      # 0x1165e
callq 0xe83f
pushq $0x1
popq %r13
movl %r13d, -0x2c(%rbp)
testb %al, %al
jne 0xd99f
movq %r14, %rdi
leaq 0x3d26(%rip), %rsi      # 0x1165f
callq 0xe83f
pushq $0x2
popq %r13
movl %r13d, -0x2c(%rbp)
testb %al, %al
jne 0xd99f
movq %r14, %rdi
leaq 0x3d0d(%rip), %rsi      # 0x11661
callq 0xe83f
pushq $0x3
popq %r13
movl %r13d, -0x2c(%rbp)
testb %al, %al
jne 0xd99f
movq %r14, %rdi
leaq 0x3cf6(%rip), %rsi      # 0x11665
callq 0xe83f
pushq $0x4
popq %r13
movl %r13d, -0x2c(%rbp)
testb %al, %al
jne 0xd99f
movq %r14, %rdi
leaq 0x3cda(%rip), %rsi      # 0x11664
callq 0xe83f
pushq $0x5
popq %r13
movl %r13d, -0x2c(%rbp)
testb %al, %al
je 0xdd44
leaq -0x220(%rbp), %r14
movq %r14, %rdi
leaq -0x110(%rbp), %rsi
callq 0x3380
leaq -0x408(%rbp), %r13
movq %r13, %rdi
movq %r14, %rdx
callq 0xe212
leaq -0x1a8(%rbp), %r14
movq %r14, %rdi
movl %ebx, %esi
movl -0x2c(%rbp), %edx
movq %r13, %rcx
callq 0xc5c2
leaq -0x130(%rbp), %rdi
movq %r14, %rsi
callq 0xc5ea
leaq -0x198(%rbp), %rdi
callq 0x34f8
leaq -0x400(%rbp), %rdi
callq 0x34f8
leaq -0x220(%rbp), %rdi
callq 0x34f8
leaq -0x110(%rbp), %rdi
callq 0x34f8
leaq -0x90(%rbp), %rdi
callq 0x34f8
movq %r12, %rdi
callq 0x34f8
leaq -0x3d8(%rbp), %rdi
leaq -0x168(%rbp), %rsi
jmp 0xd81f
movq 0xb57d(%rip), %rdi      # 0x18fc8
leaq 0x3bc8(%rip), %rsi      # 0x1161a
callq 0x3280
movq %rax, %rdi
callq 0x3120
jmp 0xdbd5
leaq -0xe8(%rbp), %rsi
movq 0xb556(%rip), %rdi      # 0x18fc8
callq 0x3250
movq %rax, %rdi
callq 0x3120
jmp 0xdbc0
leaq -0xe8(%rbp), %rsi
movq 0xb536(%rip), %rdi      # 0x18fc8
callq 0x3250
movq %rax, %rdi
callq 0x3120
leaq -0xf0(%rbp), %rdi
callq 0x5e02
leaq -0x90(%rbp), %rdi
callq 0x34f8
leaq -0x70(%rbp), %rdi
callq 0x34f8
jmp 0xdbcc
leaq -0xe8(%rbp), %rsi
movq 0xb4f5(%rip), %rdi      # 0x18fc8
callq 0x3250
movq %rax, %rdi
callq 0x3120
leaq -0xf0(%rbp), %rdi
callq 0x5e02
leaq -0x70(%rbp), %rdi
callq 0x6dc8
jmp 0xdbd5
leaq -0xe8(%rbp), %rsi
movq 0xb4c0(%rip), %rdi      # 0x18fc8
callq 0x3250
movq %rax, %rdi
callq 0x3120
leaq -0xf0(%rbp), %rdi
callq 0x5e02
jmp 0xdb7a
movq 0xb49e(%rip), %rdi      # 0x18fc8
leaq 0x3aa5(%rip), %rsi      # 0x115d6
callq 0x3280
leaq -0x90(%rbp), %rsi
movq %rax, %rdi
callq 0x3250
movq %rax, %rdi
callq 0x3120
leaq -0xf0(%rbp), %rdi
callq 0x684c
leaq -0x110(%rbp), %rdi
callq 0x34f8
leaq -0x90(%rbp), %rdi
callq 0x34f8
leaq -0x70(%rbp), %rdi
callq 0x34f8
leaq -0x130(%rbp), %rdi
callq 0x67e6
jmp 0xdbcc
movq 0xb439(%rip), %rdi      # 0x18fc8
leaq 0x3a84(%rip), %rsi      # 0x1161a
callq 0x3280
movq %rax, %rdi
callq 0x3120
jmp 0xdbe1
leaq -0xe8(%rbp), %rsi
movq 0xb415(%rip), %rdi      # 0x18fc8
callq 0x3250
movq %rax, %rdi
callq 0x3120
leaq -0xf0(%rbp), %rdi
callq 0x5e02
leaq -0x50(%rbp), %rdi
callq 0x34f8
leaq -0x1a8(%rbp), %rdi
callq 0x34f8
xorl %ebx, %ebx
leaq -0x168(%rbp), %rdi
callq 0x34f8
leaq -0x1c8(%rbp), %rdi
callq 0x34f8
leaq -0x3d8(%rbp), %rdi
callq 0x34a0
movl %ebx, %eax
addq $0x418, %rsp            # imm = 0x418
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq 0xb3a6(%rip), %rdi      # 0x18fc8
leaq 0x3a05(%rip), %rsi      # 0x1162e
callq 0x3280
movq %rax, %rdi
callq 0x3120
jmp 0xdd9a
movq 0xb386(%rip), %rdi      # 0x18fc8
leaq 0x39e5(%rip), %rsi      # 0x1162e
callq 0x3280
movq %rax, %rdi
callq 0x3120
jmp 0xdd9a
leaq -0x1a8(%rbp), %rdi
leaq -0x50(%rbp), %rdx
leaq -0x130(%rbp), %rcx
movq -0x140(%rbp), %rsi
callq 0x427a
cmpb $0x0, -0x1a8(%rbp)
je 0xdcd3
leaq -0xf0(%rbp), %rsi
leaq -0x1a8(%rbp), %rdx
callq 0xe34e
jmp 0xdd0b
leaq -0x1a8(%rbp), %rdi
leaq -0x50(%rbp), %rdx
leaq -0x130(%rbp), %rcx
movq -0x140(%rbp), %rsi
callq 0x4ef6
cmpb $0x0, -0x1a8(%rbp)
je 0xdcf0
movq 0xb303(%rip), %rdi      # 0x18fc8
leaq 0x39a2(%rip), %rsi      # 0x1166e
callq 0x3280
jmp 0xdd03
leaq -0x1a0(%rbp), %rsi
movq 0xb2e7(%rip), %rdi      # 0x18fc8
callq 0x3250
movq %rax, %rdi
callq 0x3120
jmp 0xdd0b
leaq -0x1a0(%rbp), %rsi
movq 0xb2ca(%rip), %rdi      # 0x18fc8
callq 0x3250
movq %rax, %rdi
callq 0x3120
leaq -0x1a8(%rbp), %rdi
callq 0x5e02
jmp 0xdd8e
leaq 0x38fa(%rip), %rax      # 0x1161a
movq %rax, -0x138(%rbp)
movq 0xb29a(%rip), %rdi      # 0x18fc8
movq -0x138(%rbp), %rsi
callq 0x3280
movq %rax, %rdi
callq 0x3120
jmp 0xdd6d
leaq 0x38cf(%rip), %rax      # 0x1161a
movq %rax, -0x138(%rbp)
movq 0xb26f(%rip), %rdi      # 0x18fc8
movq -0x138(%rbp), %rsi
callq 0x3280
movq %rax, %rdi
callq 0x3120
leaq -0x110(%rbp), %rdi
callq 0x34f8
leaq -0x90(%rbp), %rdi
callq 0x34f8
leaq -0x70(%rbp), %rdi
callq 0x34f8
leaq -0xf0(%rbp), %rdi
callq 0x5e26
leaq -0x130(%rbp), %rdi
callq 0x6d28
leaq -0x50(%rbp), %rdi
jmp 0xdbdc
jmp 0xde61
jmp 0xddbb
jmp 0xde61
movq %rax, %rbx
leaq -0x1a8(%rbp), %rdi
callq 0x5e02
jmp 0xdef7
movq %rax, %rbx
leaq -0x198(%rbp), %rdi
callq 0x34f8
jmp 0xdde3
movq %rax, %rbx
leaq -0x400(%rbp), %rdi
callq 0x34f8
jmp 0xddf4
movq %rax, %rbx
leaq -0x220(%rbp), %rdi
jmp 0xde32
jmp 0xded3
jmp 0xde48
jmp 0xde81
movq %rax, %rbx
leaq -0x198(%rbp), %rdi
callq 0x34f8
jmp 0xde1a
movq %rax, %rbx
leaq -0x430(%rbp), %rdi
callq 0x34f8
jmp 0xde2b
movq %rax, %rbx
leaq -0x240(%rbp), %rdi
callq 0x34f8
jmp 0xded6
jmp 0xded3
jmp 0xde61
jmp 0xded3
movq %rax, %rbx
leaq -0x1a8(%rbp), %rdi
jmp 0xde77
jmp 0xde81
jmp 0xde81
jmp 0xde6d
jmp 0xde81
jmp 0xdf11
movq %rax, %rbx
jmp 0xdef7
jmp 0xded3
jmp 0xde81
movq %rax, %rbx
leaq -0xf0(%rbp), %rdi
callq 0x34f8
jmp 0xdf03
movq %rax, %rbx
jmp 0xdf03
jmp 0xdf11
jmp 0xdf8a
jmp 0xdf8a
jmp 0xdf11
jmp 0xded3
jmp 0xdf31
movq %rax, %rbx
leaq -0x1e0(%rbp), %rdi
callq 0x6dc8
jmp 0xe021
movq %rax, %rbx
jmp 0xe021
jmp 0xdf92
jmp 0xdf6d
jmp 0xdf8a
jmp 0xdf8a
jmp 0xe02c
movq %rax, %rbx
leaq -0x110(%rbp), %rdi
callq 0x34f8
leaq -0x90(%rbp), %rdi
callq 0x34f8
leaq -0x70(%rbp), %rdi
callq 0x34f8
leaq -0xf0(%rbp), %rdi
callq 0x5e26
leaq -0x130(%rbp), %rdi
callq 0x6d28
jmp 0xdf14
movq %rax, %rbx
leaq -0x50(%rbp), %rdi
jmp 0xe07d
movq %rax, %rbx
leaq -0xf0(%rbp), %rdi
callq 0x5e02
jmp 0xe061
movq %rax, %rbx
jmp 0xe061
movq %rax, %rbx
leaq -0xf0(%rbp), %rdi
jmp 0xe053
movq %rax, %rbx
leaq -0xf0(%rbp), %rdi
callq 0x5e02
jmp 0xe021
movq %rax, %rbx
leaq -0xf0(%rbp), %rdi
callq 0x5e02
jmp 0xdf95
movq %rax, %rbx
leaq -0xf0(%rbp), %rdi
callq 0x5e02
jmp 0xe06d
jmp 0xdfaf
jmp 0xe010
jmp 0xdfaf
movq %rax, %rbx
jmp 0xe06d
movq %rax, %rbx
leaq -0x90(%rbp), %rdi
callq 0x34f8
leaq -0x70(%rbp), %rdi
callq 0x34f8
jmp 0xe06d
movq %rax, %rbx
jmp 0xe076
movq %rax, %rbx
leaq -0x200(%rbp), %rdi
callq 0x34f8
jmp 0xdfcb
movq %rax, %rbx
leaq -0xf0(%rbp), %rdi
jmp 0xe07d
movq %rax, %rbx
jmp 0xe09a
movq %rax, %rbx
jmp 0xe082
jmp 0xe015
movq %rax, %rbx
jmp 0xdffd
movq %rax, %rbx
leaq -0xe8(%rbp), %rdi
callq 0x34f8
leaq -0x260(%rbp), %rdi
callq 0x34f8
jmp 0xe018
movq %rax, %rbx
jmp 0xe03b
movq %rax, %rbx
jmp 0xe058
movq %rax, %rbx
leaq -0x50(%rbp), %rdi
callq 0x34f8
leaq -0x70(%rbp), %rdi
callq 0x6dc8
jmp 0xe076
movq %rax, %rbx
leaq -0xf0(%rbp), %rdi
callq 0x684c
leaq -0x110(%rbp), %rdi
callq 0x34f8
jmp 0xe04c
movq %rax, %rbx
leaq -0x90(%rbp), %rdi
callq 0x34f8
leaq -0x70(%rbp), %rdi
callq 0x34f8
leaq -0x130(%rbp), %rdi
callq 0x67e6
leaq -0x50(%rbp), %rdi
callq 0x34f8
leaq -0x1a8(%rbp), %rdi
callq 0x34f8
leaq -0x168(%rbp), %rdi
callq 0x34f8
leaq -0x1c8(%rbp), %rdi
callq 0x34f8
leaq -0x3d8(%rbp), %rdi
callq 0x34a0
movq %rbx, %rdi
callq 0x3450