// File: kelwinfc[P]ci4721-Fernandez-Gyomrey/src/AST/constant_folding.cpp
// Function: AST_op::constant_folding()
AST_expression* AST_op::constant_folding(){
    
    if (    !left->is_constant
         || !right->is_constant 
         || (typeid(*left) != typeid(*right))
       )
    {
        return this;
    }
    
    bool equals = false;
    
    switch( oper_type ){
        
        case MOD:
            if ( typeid(*left) == typeid(AST_int) ){
                tokenInt* tk = new tokenInt( left->line, left->column,
                                             (char*)"0");
                AST_int* sol = new AST_int(tk);
                sol->value = ((AST_int*)left)->value % ((AST_int*)right)->value;
                
                return sol;
            }
            break;
            
        /* Operadores aritmeticos: suma, resta, multiplicacion y division */
        case PLUS:
        case MINUS:
        case PROD:
        case DIV:
            
            if ( typeid(*left) == typeid(AST_int) ){
                tokenInt* tk = new tokenInt( left->line, left->column,
                                             (char*)"0");
                AST_int* sol = new AST_int(tk);
                switch( oper_type ){
                    case PLUS:
                        sol->value = 
                            ((AST_int*)left)->value + ((AST_int*)right)->value;
                        break;
                    case MINUS:
                        sol->value = 
                            ((AST_int*)left)->value - ((AST_int*)right)->value;
                        break;
                    case PROD:
                        sol->value = 
                            ((AST_int*)left)->value * ((AST_int*)right)->value;
                        break;
                    case DIV:
                        sol->value = 
                            ((AST_int*)left)->value / ((AST_int*)right)->value;
                        break;
                    default:
                        break;
                }
                return sol;
                
            } else if ( typeid(*left) == typeid(AST_float) ){
                tokenFloat* tk = new tokenFloat( left->line, left->column,
                                                 (char*)"0.0");
                AST_float* sol = new AST_float(tk);
                sol->value = ((AST_float*)left)->value + 
                                ((AST_float*)right)->value;
                                
                switch( oper_type ){
                    case PLUS:
                        sol->value = ((AST_float*)left)->value 
                                        + ((AST_float*)right)->value;
                        break;
                    case MINUS:
                        sol->value = ((AST_float*)left)->value 
                                        - ((AST_float*)right)->value;
                        break;
                    case PROD:
                        sol->value = ((AST_float*)left)->value 
                                        * ((AST_float*)right)->value;
                        break;
                    case DIV:
                        sol->value = ((AST_float*)left)->value 
                                        / ((AST_float*)right)->value;
                        break;
                    default:
                        break;
                }
                
                return sol;
            }
            
            break;
        
        /* Operadores logicos: y, o, implica, consecuencia */
        case AND:
        case OR:
        case IMP:
        case CONSEQ:
            
            if ( typeid(*left) == typeid(AST_boolean) ){
                tokenBoolean* tk = new tokenBoolean( left->line, left->column,
                                             (char*)"true");
                AST_boolean* sol = new AST_boolean(tk);
                switch( oper_type ){
                    case AND:
                        sol->value = ((AST_boolean*)left)->value 
                                        && ((AST_boolean*)right)->value;
                        break;
                    case OR:
                        sol->value = ((AST_boolean*)left)->value 
                                        || ((AST_boolean*)right)->value;
                        break;
                    case IMP:
                        sol->value = !((AST_boolean*)left)->value 
                                        || ((AST_boolean*)right)->value;
                        break;
                    case CONSEQ:
                        sol->value = ((AST_boolean*)left)->value 
                                        || !((AST_boolean*)right)->value;
                        break;
                    default:
                        break;
                }
                
                return sol;
            }
        
        /* Operadores de comparación de igualdad: ==, != */
        case EQ:
            equals = true;
        case UNEQ:
            
            {
            tokenBoolean* tk = 
                new tokenBoolean(left->line,left->column,(char*)"true");
            AST_boolean* sol = new AST_boolean(tk);
            
            if ( typeid(*left) == typeid(AST_int) ){
                sol->value = equals == ( ((AST_int*)left)->value 
                                            == ((AST_int*)right)->value );
            } else if ( typeid(*left) == typeid(AST_float) ){
                sol->value = equals == ( ((AST_float*)left)->value 
                                            == ((AST_float*)right)->value );
            } else if ( typeid(*left) == typeid(AST_char) ){
                sol->value = equals == ( ((AST_char*)left)->value 
                                            == ((AST_char*)right)->value );
            } else if ( typeid(*left) == typeid(AST_boolean) ){
                sol->value = equals == ( ((AST_boolean*)left)->value 
                                            == ((AST_boolean*)right)->value );
            } else {
                delete sol;
                return this;
            }
            
            return sol;
            }
            
        /* Operadores de relación de orden: <, <=, >, >= */
        case LESS:
            
            {
            tokenBoolean* tk = 
                new tokenBoolean(left->line,left->column,(char*)"true");
            AST_boolean* sol = new AST_boolean(tk);
            
            if ( typeid(*left) == typeid(AST_int) ){
                sol->value = ((AST_int*)left)->value 
                                            < ((AST_int*)right)->value;
            } else if ( typeid(*left) == typeid(AST_float) ){
                sol->value = ((AST_float*)left)->value 
                                            < ((AST_float*)right)->value;
            } else if ( typeid(*left) == typeid(AST_char) ){
                sol->value = ((AST_char*)left)->value 
                                            < ((AST_char*)right)->value;
            } else {
                delete sol;
                return this;
            }
            
            return sol;
            }
            
        case LESS_EQ:
            
            {
            tokenBoolean* tk = 
                new tokenBoolean(left->line,left->column,(char*)"true");
            AST_boolean* sol = new AST_boolean(tk);
            
            if ( typeid(*left) == typeid(AST_int) ){
                sol->value = ((AST_int*)left)->value 
                                            <= ((AST_int*)right)->value;
            } else if ( typeid(*left) == typeid(AST_float) ){
                sol->value = ((AST_float*)left)->value 
                                            <= ((AST_float*)right)->value;
            } else if ( typeid(*left) == typeid(AST_char) ){
                sol->value = ((AST_char*)left)->value 
                                            <= ((AST_char*)right)->value;
            } else {
                delete sol;
                return this;
            }
            
            return sol;
            }
            
        case GREAT:
            
            {
            tokenBoolean* tk = 
                new tokenBoolean(left->line,left->column,(char*)"true");
            AST_boolean* sol = new AST_boolean(tk);
            
            if ( typeid(*left) == typeid(AST_int) ){
                sol->value = ((AST_int*)left)->value 
                                            > ((AST_int*)right)->value;
            } else if ( typeid(*left) == typeid(AST_float) ){
                sol->value = ((AST_float*)left)->value 
                                            > ((AST_float*)right)->value;
            } else if ( typeid(*left) == typeid(AST_char) ){
                sol->value = ((AST_char*)left)->value 
                                            > ((AST_char*)right)->value;
            } else {
                delete sol;
                return this;
            }
            
            return sol;
            }
            
        case GREAT_EQ:
            
            {
            tokenBoolean* tk = 
                new tokenBoolean(left->line,left->column,(char*)"true");
            AST_boolean* sol = new AST_boolean(tk);
            
            if ( typeid(*left) == typeid(AST_int) ){
                sol->value = ((AST_int*)left)->value 
                                            >= ((AST_int*)right)->value;
            } else if ( typeid(*left) == typeid(AST_float) ){
                sol->value = ((AST_float*)left)->value 
                                            >= ((AST_float*)right)->value;
            } else if ( typeid(*left) == typeid(AST_char) ){
                sol->value = ((AST_char*)left)->value 
                                            >= ((AST_char*)right)->value;
            } else {
                delete sol;
                return this;
            }
            
            return sol;
            }
            
            break;
    }
    
    return this;
}

// Assembly:
subq $0x268, %rsp            # imm = 0x268
movq %rdi, 0x258(%rsp)
movq 0x258(%rsp), %rax
movq %rax, 0x1a8(%rsp)
movq 0x58(%rax), %rax
testb $0x1, 0x14(%rax)
je 0x11026
movq 0x1a8(%rsp), %rax
movq 0x60(%rax), %rax
testb $0x1, 0x14(%rax)
je 0x11026
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rax
movq %rax, 0x1a0(%rsp)
cmpq $0x0, %rax
jne 0x10fce
callq 0x6420
movq 0x1a8(%rsp), %rax
movq 0x1a0(%rsp), %rcx
movq (%rcx), %rcx
movq -0x8(%rcx), %rcx
movq %rcx, 0x190(%rsp)
movq 0x60(%rax), %rax
movq %rax, 0x198(%rsp)
cmpq $0x0, %rax
jne 0x11004
callq 0x6420
movq 0x190(%rsp), %rdi
movq 0x198(%rsp), %rax
movq (%rax), %rax
movq -0x8(%rax), %rsi
callq 0x201f0
testb $0x1, %al
jne 0x11026
jmp 0x1103b
movq 0x1a8(%rsp), %rax
movq %rax, 0x260(%rsp)
jmp 0x125ae
movq 0x1a8(%rsp), %rax
movb $0x0, 0x257(%rsp)
movl 0x68(%rax), %eax
movq %rax, 0x188(%rsp)
subq $0xe, %rax
ja 0x1259e
movq 0x188(%rsp), %rax
leaq 0x410d1(%rip), %rcx     # 0x52140
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rax
movq %rax, 0x180(%rsp)
cmpq $0x0, %rax
jne 0x11097
callq 0x6420
movq 0x180(%rsp), %rax
movq (%rax), %rax
movq -0x8(%rax), %rdi
leaq 0x5bf03(%rip), %rsi     # 0x6cfb0
callq 0x20340
testb $0x1, %al
jne 0x110bb
jmp 0x111c7
movl $0xc, %edi
callq 0x6390
movq %rax, %rdi
movq 0x1a8(%rsp), %rax
movq %rdi, %rcx
movq %rcx, 0x178(%rsp)
movq 0x58(%rax), %rax
movl 0x8(%rax), %esi
movl 0xc(%rax), %edx
leaq 0x41e5b(%rip), %rcx     # 0x52f47
callq 0x6fe0
jmp 0x110f3
movq 0x178(%rsp), %rax
movq %rax, 0x248(%rsp)
movl $0x50, %edi
callq 0x6390
movq %rax, %rdi
movq %rdi, %rax
movq %rax, 0x170(%rsp)
movq 0x248(%rsp), %rsi
callq 0x1d9a0
jmp 0x1112a
movq 0x1a8(%rsp), %rcx
movq 0x170(%rsp), %rax
movq %rax, 0x230(%rsp)
movq 0x58(%rcx), %rax
movl 0x48(%rax), %eax
movq 0x60(%rcx), %rcx
cltd
idivl 0x48(%rcx)
movq 0x230(%rsp), %rax
movl %edx, 0x48(%rax)
movq 0x230(%rsp), %rax
movq %rax, 0x260(%rsp)
jmp 0x125ae
movq 0x178(%rsp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x240(%rsp)
movl %eax, 0x23c(%rsp)
movl $0xc, %esi
callq 0x63a0
jmp 0x125be
movq 0x170(%rsp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x240(%rsp)
movl %eax, 0x23c(%rsp)
movl $0x50, %esi
callq 0x63a0
jmp 0x125be
jmp 0x1259e
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rax
movq %rax, 0x168(%rsp)
cmpq $0x0, %rax
jne 0x111eb
callq 0x6420
movq 0x168(%rsp), %rax
movq (%rax), %rax
movq -0x8(%rax), %rdi
leaq 0x5bdaf(%rip), %rsi     # 0x6cfb0
callq 0x20340
testb $0x1, %al
jne 0x1120f
jmp 0x113c0
movl $0xc, %edi
callq 0x6390
movq %rax, %rdi
movq 0x1a8(%rsp), %rax
movq %rdi, %rcx
movq %rcx, 0x160(%rsp)
movq 0x58(%rax), %rax
movl 0x8(%rax), %esi
movl 0xc(%rax), %edx
leaq 0x41d07(%rip), %rcx     # 0x52f47
callq 0x6fe0
jmp 0x11247
movq 0x160(%rsp), %rax
movq %rax, 0x228(%rsp)
movl $0x50, %edi
callq 0x6390
movq %rax, %rdi
movq %rdi, %rax
movq %rax, 0x158(%rsp)
movq 0x228(%rsp), %rsi
callq 0x1d9a0
jmp 0x1127e
movq 0x1a8(%rsp), %rax
movq 0x158(%rsp), %rcx
movq %rcx, 0x220(%rsp)
movl 0x68(%rax), %eax
movq %rax, 0x150(%rsp)
subq $0x3, %rax
ja 0x113a9
movq 0x150(%rsp), %rax
leaq 0x40ee2(%rip), %rcx     # 0x5219c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq 0x160(%rsp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x240(%rsp)
movl %eax, 0x23c(%rsp)
movl $0xc, %esi
callq 0x63a0
jmp 0x125be
movq 0x158(%rsp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x240(%rsp)
movl %eax, 0x23c(%rsp)
movl $0x50, %esi
callq 0x63a0
jmp 0x125be
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rcx
movl 0x48(%rcx), %ecx
movq 0x60(%rax), %rax
addl 0x48(%rax), %ecx
movq 0x220(%rsp), %rax
movl %ecx, 0x48(%rax)
jmp 0x113ab
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rcx
movl 0x48(%rcx), %ecx
movq 0x60(%rax), %rax
subl 0x48(%rax), %ecx
movq 0x220(%rsp), %rax
movl %ecx, 0x48(%rax)
jmp 0x113ab
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rcx
movl 0x48(%rcx), %ecx
movq 0x60(%rax), %rax
imull 0x48(%rax), %ecx
movq 0x220(%rsp), %rax
movl %ecx, 0x48(%rax)
jmp 0x113ab
movq 0x1a8(%rsp), %rcx
movq 0x58(%rcx), %rax
movl 0x48(%rax), %eax
movq 0x60(%rcx), %rcx
cltd
idivl 0x48(%rcx)
movl %eax, %ecx
movq 0x220(%rsp), %rax
movl %ecx, 0x48(%rax)
jmp 0x113ab
jmp 0x113ab
movq 0x220(%rsp), %rax
movq %rax, 0x260(%rsp)
jmp 0x125ae
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rax
movq %rax, 0x148(%rsp)
cmpq $0x0, %rax
jne 0x113df
callq 0x6420
movq 0x148(%rsp), %rax
movq (%rax), %rax
movq -0x8(%rax), %rdi
leaq 0x5bbd3(%rip), %rsi     # 0x6cfc8
callq 0x20340
testb $0x1, %al
jne 0x11403
jmp 0x115eb
movl $0xc, %edi
callq 0x6390
movq %rax, %rdi
movq 0x1a8(%rsp), %rax
movq %rdi, %rcx
movq %rcx, 0x140(%rsp)
movq 0x58(%rax), %rax
movl 0x8(%rax), %esi
movl 0xc(%rax), %edx
leaq 0x41b11(%rip), %rcx     # 0x52f45
callq 0x6e30
jmp 0x1143b
movq 0x140(%rsp), %rax
movq %rax, 0x218(%rsp)
movl $0x50, %edi
callq 0x6390
movq %rax, %rdi
movq %rdi, %rax
movq %rax, 0x138(%rsp)
movq 0x218(%rsp), %rsi
callq 0x1da20
jmp 0x11472
movq 0x1a8(%rsp), %rax
movq 0x138(%rsp), %rcx
movq %rcx, 0x210(%rsp)
movq 0x58(%rax), %rdx
movq 0x60(%rax), %rcx
movss 0x48(%rdx), %xmm0
movss 0x48(%rcx), %xmm1
addss %xmm1, %xmm0
movq 0x210(%rsp), %rcx
movss %xmm0, 0x48(%rcx)
movl 0x68(%rax), %eax
movq %rax, 0x130(%rsp)
subq $0x3, %rax
ja 0x115d4
movq 0x130(%rsp), %rax
leaq 0x40cbb(%rip), %rcx     # 0x5218c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq 0x140(%rsp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x240(%rsp)
movl %eax, 0x23c(%rsp)
movl $0xc, %esi
callq 0x63a0
jmp 0x125be
movq 0x138(%rsp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x240(%rsp)
movl %eax, 0x23c(%rsp)
movl $0x50, %esi
callq 0x63a0
jmp 0x125be
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rcx
movss 0x48(%rcx), %xmm0
movq 0x60(%rax), %rax
addss 0x48(%rax), %xmm0
movq 0x210(%rsp), %rax
movss %xmm0, 0x48(%rax)
jmp 0x115d6
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rcx
movss 0x48(%rcx), %xmm0
movq 0x60(%rax), %rax
subss 0x48(%rax), %xmm0
movq 0x210(%rsp), %rax
movss %xmm0, 0x48(%rax)
jmp 0x115d6
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rcx
movss 0x48(%rcx), %xmm0
movq 0x60(%rax), %rax
mulss 0x48(%rax), %xmm0
movq 0x210(%rsp), %rax
movss %xmm0, 0x48(%rax)
jmp 0x115d6
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rcx
movss 0x48(%rcx), %xmm0
movq 0x60(%rax), %rax
divss 0x48(%rax), %xmm0
movq 0x210(%rsp), %rax
movss %xmm0, 0x48(%rax)
jmp 0x115d6
jmp 0x115d6
movq 0x210(%rsp), %rax
movq %rax, 0x260(%rsp)
jmp 0x125ae
jmp 0x115ed
jmp 0x1259e
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rax
movq %rax, 0x128(%rsp)
cmpq $0x0, %rax
jne 0x11611
callq 0x6420
movq 0x128(%rsp), %rax
movq (%rax), %rax
movq -0x8(%rax), %rdi
leaq 0x5b9b9(%rip), %rsi     # 0x6cfe0
callq 0x20340
testb $0x1, %al
jne 0x11635
jmp 0x11882
movl $0xc, %edi
callq 0x6390
movq %rax, %rdi
movq 0x1a8(%rsp), %rax
movq %rdi, %rcx
movq %rcx, 0x120(%rsp)
movq 0x58(%rax), %rax
movl 0x8(%rax), %esi
movl 0xc(%rax), %edx
leaq 0x4099e(%rip), %rcx     # 0x52004
callq 0x6e90
jmp 0x1166d
movq 0x120(%rsp), %rax
movq %rax, 0x208(%rsp)
movl $0x50, %edi
callq 0x6390
movq %rax, %rdi
movq %rdi, %rax
movq %rax, 0x118(%rsp)
movq 0x208(%rsp), %rsi
callq 0x1dab0
jmp 0x116a4
movq 0x1a8(%rsp), %rax
movq 0x118(%rsp), %rcx
movq %rcx, 0x200(%rsp)
movl 0x68(%rax), %eax
addl $-0x5, %eax
movl %eax, %ecx
movq %rcx, 0x110(%rsp)
subl $0x3, %eax
ja 0x1186b
movq 0x110(%rsp), %rax
leaq 0x40a98(%rip), %rcx     # 0x5217c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq 0x120(%rsp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x240(%rsp)
movl %eax, 0x23c(%rsp)
movl $0xc, %esi
callq 0x63a0
jmp 0x125be
movq 0x118(%rsp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x240(%rsp)
movl %eax, 0x23c(%rsp)
movl $0x50, %esi
callq 0x63a0
jmp 0x125be
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rcx
xorl %eax, %eax
testb $0x1, 0x48(%rcx)
movb %al, 0x10f(%rsp)
je 0x11774
movq 0x1a8(%rsp), %rax
movq 0x60(%rax), %rax
movb 0x48(%rax), %al
movb %al, 0x10f(%rsp)
movb 0x10f(%rsp), %cl
movq 0x200(%rsp), %rax
andb $0x1, %cl
movb %cl, 0x48(%rax)
jmp 0x1186d
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rcx
movb $0x1, %al
testb $0x1, 0x48(%rcx)
movb %al, 0x10e(%rsp)
jne 0x117bf
movq 0x1a8(%rsp), %rax
movq 0x60(%rax), %rax
movb 0x48(%rax), %al
movb %al, 0x10e(%rsp)
movb 0x10e(%rsp), %cl
movq 0x200(%rsp), %rax
andb $0x1, %cl
movb %cl, 0x48(%rax)
jmp 0x1186d
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rcx
movb $0x1, %al
testb $0x1, 0x48(%rcx)
movb %al, 0x10d(%rsp)
je 0x1180a
movq 0x1a8(%rsp), %rax
movq 0x60(%rax), %rax
movb 0x48(%rax), %al
movb %al, 0x10d(%rsp)
movb 0x10d(%rsp), %cl
movq 0x200(%rsp), %rax
andb $0x1, %cl
movb %cl, 0x48(%rax)
jmp 0x1186d
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rcx
movb $0x1, %al
testb $0x1, 0x48(%rcx)
movb %al, 0x10c(%rsp)
jne 0x11854
movq 0x1a8(%rsp), %rax
movq 0x60(%rax), %rax
movb 0x48(%rax), %al
xorb $-0x1, %al
movb %al, 0x10c(%rsp)
movb 0x10c(%rsp), %cl
movq 0x200(%rsp), %rax
andb $0x1, %cl
movb %cl, 0x48(%rax)
jmp 0x1186d
jmp 0x1186d
movq 0x200(%rsp), %rax
movq %rax, 0x260(%rsp)
jmp 0x125ae
jmp 0x11884
movb $0x1, 0x257(%rsp)
movl $0xc, %edi
callq 0x6390
movq %rax, %rdi
movq 0x1a8(%rsp), %rax
movq %rdi, %rcx
movq %rcx, 0x100(%rsp)
movq 0x58(%rax), %rax
movl 0x8(%rax), %esi
movl 0xc(%rax), %edx
leaq 0x40747(%rip), %rcx     # 0x52004
callq 0x6e90
jmp 0x118c4
movq 0x100(%rsp), %rax
movq %rax, 0x1f8(%rsp)
movl $0x50, %edi
callq 0x6390
movq %rax, %rdi
movq %rdi, %rax
movq %rax, 0xf8(%rsp)
movq 0x1f8(%rsp), %rsi
callq 0x1dab0
jmp 0x118fb
movq 0x1a8(%rsp), %rax
movq 0xf8(%rsp), %rcx
movq %rcx, 0x1f0(%rsp)
movq 0x58(%rax), %rax
movq %rax, 0xf0(%rsp)
cmpq $0x0, %rax
jne 0x1192a
callq 0x6420
movq 0xf0(%rsp), %rax
movq (%rax), %rax
movq -0x8(%rax), %rdi
leaq 0x5b670(%rip), %rsi     # 0x6cfb0
callq 0x20340
testb $0x1, %al
jne 0x1194e
jmp 0x119e7
movq 0x1a8(%rsp), %rdx
movb 0x257(%rsp), %al
andb $0x1, %al
movzbl %al, %eax
movq 0x58(%rdx), %rcx
movl 0x48(%rcx), %ecx
movq 0x60(%rdx), %rdx
cmpl 0x48(%rdx), %ecx
sete %cl
andb $0x1, %cl
movzbl %cl, %ecx
cmpl %ecx, %eax
sete %cl
movq 0x1f0(%rsp), %rax
andb $0x1, %cl
movb %cl, 0x48(%rax)
jmp 0x11be8
movq 0x100(%rsp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x240(%rsp)
movl %eax, 0x23c(%rsp)
movl $0xc, %esi
callq 0x63a0
jmp 0x125be
movq 0xf8(%rsp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x240(%rsp)
movl %eax, 0x23c(%rsp)
movl $0x50, %esi
callq 0x63a0
jmp 0x125be
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rax
movq %rax, 0xe8(%rsp)
cmpq $0x0, %rax
jne 0x11a06
callq 0x6420
movq 0xe8(%rsp), %rax
movq (%rax), %rax
movq -0x8(%rax), %rdi
leaq 0x5b5ac(%rip), %rsi     # 0x6cfc8
callq 0x20340
testb $0x1, %al
jne 0x11a27
jmp 0x11a72
movq 0x1a8(%rsp), %rcx
movb 0x257(%rsp), %al
andb $0x1, %al
movzbl %al, %eax
movq 0x58(%rcx), %rdx
movss 0x48(%rdx), %xmm0
movq 0x60(%rcx), %rcx
ucomiss 0x48(%rcx), %xmm0
sete %cl
setnp %dl
andb %dl, %cl
andb $0x1, %cl
movzbl %cl, %ecx
cmpl %ecx, %eax
sete %cl
movq 0x1f0(%rsp), %rax
andb $0x1, %cl
movb %cl, 0x48(%rax)
jmp 0x11be6
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rax
movq %rax, 0xe0(%rsp)
cmpq $0x0, %rax
jne 0x11a91
callq 0x6420
movq 0xe0(%rsp), %rax
movq (%rax), %rax
movq -0x8(%rax), %rdi
leaq 0x5b551(%rip), %rsi     # 0x6cff8
callq 0x20340
testb $0x1, %al
jne 0x11ab2
jmp 0x11b0a
movq 0x1a8(%rsp), %rax
movb 0x257(%rsp), %cl
andb $0x1, %cl
movzbl %cl, %ecx
movl %ecx, 0xdc(%rsp)
movq 0x58(%rax), %rdi
addq $0x48, %rdi
movq 0x60(%rax), %rsi
addq $0x48, %rsi
callq 0x20690
movb %al, %cl
movl 0xdc(%rsp), %eax
andb $0x1, %cl
movzbl %cl, %ecx
cmpl %ecx, %eax
sete %cl
movq 0x1f0(%rsp), %rax
andb $0x1, %cl
movb %cl, 0x48(%rax)
jmp 0x11be4
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rax
movq %rax, 0xd0(%rsp)
cmpq $0x0, %rax
jne 0x11b29
callq 0x6420
movq 0xd0(%rsp), %rax
movq (%rax), %rax
movq -0x8(%rax), %rdi
leaq 0x5b4a1(%rip), %rsi     # 0x6cfe0
callq 0x20340
testb $0x1, %al
jne 0x11b4a
jmp 0x11b98
movq 0x1a8(%rsp), %rdx
movb 0x257(%rsp), %al
andb $0x1, %al
movzbl %al, %eax
movq 0x58(%rdx), %rcx
movb 0x48(%rcx), %cl
andb $0x1, %cl
movzbl %cl, %ecx
movq 0x60(%rdx), %rdx
movb 0x48(%rdx), %dl
andb $0x1, %dl
movzbl %dl, %edx
cmpl %edx, %ecx
sete %cl
andb $0x1, %cl
movzbl %cl, %ecx
cmpl %ecx, %eax
sete %cl
movq 0x1f0(%rsp), %rax
andb $0x1, %cl
movb %cl, 0x48(%rax)
jmp 0x11be2
movq 0x1f0(%rsp), %rax
movq %rax, 0xc8(%rsp)
cmpq $0x0, %rax
je 0x11bcd
movq 0xc8(%rsp), %rdi
callq 0x20730
movq 0xc8(%rsp), %rdi
movl $0x50, %esi
callq 0x63a0
movq 0x1a8(%rsp), %rax
movq %rax, 0x260(%rsp)
jmp 0x125ae
jmp 0x11be4
jmp 0x11be6
jmp 0x11be8
movq 0x1f0(%rsp), %rax
movq %rax, 0x260(%rsp)
jmp 0x125ae
movl $0xc, %edi
callq 0x6390
movq %rax, %rdi
movq 0x1a8(%rsp), %rax
movq %rdi, %rcx
movq %rcx, 0xc0(%rsp)
movq 0x58(%rax), %rax
movl 0x8(%rax), %esi
movl 0xc(%rax), %edx
leaq 0x403d6(%rip), %rcx     # 0x52004
callq 0x6e90
jmp 0x11c35
movq 0xc0(%rsp), %rax
movq %rax, 0x1e8(%rsp)
movl $0x50, %edi
callq 0x6390
movq %rax, %rdi
movq %rdi, %rax
movq %rax, 0xb8(%rsp)
movq 0x1e8(%rsp), %rsi
callq 0x1dab0
jmp 0x11c6c
movq 0x1a8(%rsp), %rax
movq 0xb8(%rsp), %rcx
movq %rcx, 0x1e0(%rsp)
movq 0x58(%rax), %rax
movq %rax, 0xb0(%rsp)
cmpq $0x0, %rax
jne 0x11c9b
callq 0x6420
movq 0xb0(%rsp), %rax
movq (%rax), %rax
movq -0x8(%rax), %rdi
leaq 0x5b2ff(%rip), %rsi     # 0x6cfb0
callq 0x20340
testb $0x1, %al
jne 0x11cbf
jmp 0x11d41
movq 0x1a8(%rsp), %rcx
movq 0x58(%rcx), %rax
movl 0x48(%rax), %eax
movq 0x60(%rcx), %rcx
cmpl 0x48(%rcx), %eax
setl %cl
movq 0x1e0(%rsp), %rax
andb $0x1, %cl
movb %cl, 0x48(%rax)
jmp 0x11e71
movq 0xc0(%rsp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x240(%rsp)
movl %eax, 0x23c(%rsp)
movl $0xc, %esi
callq 0x63a0
jmp 0x125be
movq 0xb8(%rsp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x240(%rsp)
movl %eax, 0x23c(%rsp)
movl $0x50, %esi
callq 0x63a0
jmp 0x125be
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rax
movq %rax, 0xa8(%rsp)
cmpq $0x0, %rax
jne 0x11d60
callq 0x6420
movq 0xa8(%rsp), %rax
movq (%rax), %rax
movq -0x8(%rax), %rdi
leaq 0x5b252(%rip), %rsi     # 0x6cfc8
callq 0x20340
testb $0x1, %al
jne 0x11d81
jmp 0x11db4
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rcx
movss 0x48(%rcx), %xmm1
movq 0x60(%rax), %rax
movss 0x48(%rax), %xmm0
ucomiss %xmm1, %xmm0
seta %cl
movq 0x1e0(%rsp), %rax
andb $0x1, %cl
movb %cl, 0x48(%rax)
jmp 0x11e6f
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rax
movq %rax, 0xa0(%rsp)
cmpq $0x0, %rax
jne 0x11dd3
callq 0x6420
movq 0xa0(%rsp), %rax
movq (%rax), %rax
movq -0x8(%rax), %rdi
leaq 0x5b20f(%rip), %rsi     # 0x6cff8
callq 0x20340
testb $0x1, %al
jne 0x11df4
jmp 0x11e23
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rdi
addq $0x48, %rdi
movq 0x60(%rax), %rsi
addq $0x48, %rsi
callq 0x20740
movb %al, %cl
movq 0x1e0(%rsp), %rax
andb $0x1, %cl
movb %cl, 0x48(%rax)
jmp 0x11e6d
movq 0x1e0(%rsp), %rax
movq %rax, 0x98(%rsp)
cmpq $0x0, %rax
je 0x11e58
movq 0x98(%rsp), %rdi
callq 0x20730
movq 0x98(%rsp), %rdi
movl $0x50, %esi
callq 0x63a0
movq 0x1a8(%rsp), %rax
movq %rax, 0x260(%rsp)
jmp 0x125ae
jmp 0x11e6f
jmp 0x11e71
movq 0x1e0(%rsp), %rax
movq %rax, 0x260(%rsp)
jmp 0x125ae
movl $0xc, %edi
callq 0x6390
movq %rax, %rdi
movq 0x1a8(%rsp), %rax
movq %rdi, %rcx
movq %rcx, 0x90(%rsp)
movq 0x58(%rax), %rax
movl 0x8(%rax), %esi
movl 0xc(%rax), %edx
leaq 0x4014d(%rip), %rcx     # 0x52004
callq 0x6e90
jmp 0x11ebe
movq 0x90(%rsp), %rax
movq %rax, 0x1d8(%rsp)
movl $0x50, %edi
callq 0x6390
movq %rax, %rdi
movq %rdi, %rax
movq %rax, 0x88(%rsp)
movq 0x1d8(%rsp), %rsi
callq 0x1dab0
jmp 0x11ef5
movq 0x1a8(%rsp), %rax
movq 0x88(%rsp), %rcx
movq %rcx, 0x1d0(%rsp)
movq 0x58(%rax), %rax
movq %rax, 0x80(%rsp)
cmpq $0x0, %rax
jne 0x11f24
callq 0x6420
movq 0x80(%rsp), %rax
movq (%rax), %rax
movq -0x8(%rax), %rdi
leaq 0x5b076(%rip), %rsi     # 0x6cfb0
callq 0x20340
testb $0x1, %al
jne 0x11f48
jmp 0x11fca
movq 0x1a8(%rsp), %rcx
movq 0x58(%rcx), %rax
movl 0x48(%rax), %eax
movq 0x60(%rcx), %rcx
cmpl 0x48(%rcx), %eax
setle %cl
movq 0x1d0(%rsp), %rax
andb $0x1, %cl
movb %cl, 0x48(%rax)
jmp 0x120e5
movq 0x90(%rsp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x240(%rsp)
movl %eax, 0x23c(%rsp)
movl $0xc, %esi
callq 0x63a0
jmp 0x125be
movq 0x88(%rsp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x240(%rsp)
movl %eax, 0x23c(%rsp)
movl $0x50, %esi
callq 0x63a0
jmp 0x125be
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rax
movq %rax, 0x78(%rsp)
cmpq $0x0, %rax
jne 0x11fe6
callq 0x6420
movq 0x78(%rsp), %rax
movq (%rax), %rax
movq -0x8(%rax), %rdi
leaq 0x5afcf(%rip), %rsi     # 0x6cfc8
callq 0x20340
testb $0x1, %al
jne 0x12004
jmp 0x12037
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rcx
movss 0x48(%rcx), %xmm1
movq 0x60(%rax), %rax
movss 0x48(%rax), %xmm0
ucomiss %xmm1, %xmm0
setae %cl
movq 0x1d0(%rsp), %rax
andb $0x1, %cl
movb %cl, 0x48(%rax)
jmp 0x120e3
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rax
movq %rax, 0x70(%rsp)
cmpq $0x0, %rax
jne 0x12053
callq 0x6420
movq 0x70(%rsp), %rax
movq (%rax), %rax
movq -0x8(%rax), %rdi
leaq 0x5af92(%rip), %rsi     # 0x6cff8
callq 0x20340
testb $0x1, %al
jne 0x12071
jmp 0x120a0
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rdi
addq $0x48, %rdi
movq 0x60(%rax), %rsi
addq $0x48, %rsi
callq 0x20780
movb %al, %cl
movq 0x1d0(%rsp), %rax
andb $0x1, %cl
movb %cl, 0x48(%rax)
jmp 0x120e1
movq 0x1d0(%rsp), %rax
movq %rax, 0x68(%rsp)
cmpq $0x0, %rax
je 0x120cc
movq 0x68(%rsp), %rdi
callq 0x20730
movq 0x68(%rsp), %rdi
movl $0x50, %esi
callq 0x63a0
movq 0x1a8(%rsp), %rax
movq %rax, 0x260(%rsp)
jmp 0x125ae
jmp 0x120e3
jmp 0x120e5
movq 0x1d0(%rsp), %rax
movq %rax, 0x260(%rsp)
jmp 0x125ae
movl $0xc, %edi
callq 0x6390
movq %rax, %rdi
movq 0x1a8(%rsp), %rax
movq %rdi, %rcx
movq %rcx, 0x60(%rsp)
movq 0x58(%rax), %rax
movl 0x8(%rax), %esi
movl 0xc(%rax), %edx
leaq 0x3fedc(%rip), %rcx     # 0x52004
callq 0x6e90
jmp 0x1212f
movq 0x60(%rsp), %rax
movq %rax, 0x1c8(%rsp)
movl $0x50, %edi
callq 0x6390
movq %rax, %rdi
movq %rdi, %rax
movq %rax, 0x58(%rsp)
movq 0x1c8(%rsp), %rsi
callq 0x1dab0
jmp 0x12160
movq 0x1a8(%rsp), %rax
movq 0x58(%rsp), %rcx
movq %rcx, 0x1c0(%rsp)
movq 0x58(%rax), %rax
movq %rax, 0x50(%rsp)
cmpq $0x0, %rax
jne 0x12189
callq 0x6420
movq 0x50(%rsp), %rax
movq (%rax), %rax
movq -0x8(%rax), %rdi
leaq 0x5ae14(%rip), %rsi     # 0x6cfb0
callq 0x20340
testb $0x1, %al
jne 0x121a7
jmp 0x12223
movq 0x1a8(%rsp), %rcx
movq 0x58(%rcx), %rax
movl 0x48(%rax), %eax
movq 0x60(%rcx), %rcx
cmpl 0x48(%rcx), %eax
setg %cl
movq 0x1c0(%rsp), %rax
andb $0x1, %cl
movb %cl, 0x48(%rax)
jmp 0x1233a
movq 0x60(%rsp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x240(%rsp)
movl %eax, 0x23c(%rsp)
movl $0xc, %esi
callq 0x63a0
jmp 0x125be
movq 0x58(%rsp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x240(%rsp)
movl %eax, 0x23c(%rsp)
movl $0x50, %esi
callq 0x63a0
jmp 0x125be
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rax
movq %rax, 0x48(%rsp)
cmpq $0x0, %rax
jne 0x1223f
callq 0x6420
movq 0x48(%rsp), %rax
movq (%rax), %rax
movq -0x8(%rax), %rdi
leaq 0x5ad76(%rip), %rsi     # 0x6cfc8
callq 0x20340
testb $0x1, %al
jne 0x1225d
jmp 0x1228c
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rcx
movss 0x48(%rcx), %xmm0
movq 0x60(%rax), %rax
ucomiss 0x48(%rax), %xmm0
seta %cl
movq 0x1c0(%rsp), %rax
andb $0x1, %cl
movb %cl, 0x48(%rax)
jmp 0x12338
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rax
movq %rax, 0x40(%rsp)
cmpq $0x0, %rax
jne 0x122a8
callq 0x6420
movq 0x40(%rsp), %rax
movq (%rax), %rax
movq -0x8(%rax), %rdi
leaq 0x5ad3d(%rip), %rsi     # 0x6cff8
callq 0x20340
testb $0x1, %al
jne 0x122c6
jmp 0x122f5
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rdi
addq $0x48, %rdi
movq 0x60(%rax), %rsi
addq $0x48, %rsi
callq 0x207c0
movb %al, %cl
movq 0x1c0(%rsp), %rax
andb $0x1, %cl
movb %cl, 0x48(%rax)
jmp 0x12336
movq 0x1c0(%rsp), %rax
movq %rax, 0x38(%rsp)
cmpq $0x0, %rax
je 0x12321
movq 0x38(%rsp), %rdi
callq 0x20730
movq 0x38(%rsp), %rdi
movl $0x50, %esi
callq 0x63a0
movq 0x1a8(%rsp), %rax
movq %rax, 0x260(%rsp)
jmp 0x125ae
jmp 0x12338
jmp 0x1233a
movq 0x1c0(%rsp), %rax
movq %rax, 0x260(%rsp)
jmp 0x125ae
movl $0xc, %edi
callq 0x6390
movq %rax, %rdi
movq 0x1a8(%rsp), %rax
movq %rdi, %rcx
movq %rcx, 0x30(%rsp)
movq 0x58(%rax), %rax
movl 0x8(%rax), %esi
movl 0xc(%rax), %edx
leaq 0x3fc87(%rip), %rcx     # 0x52004
callq 0x6e90
jmp 0x12384
movq 0x30(%rsp), %rax
movq %rax, 0x1b8(%rsp)
movl $0x50, %edi
callq 0x6390
movq %rax, %rdi
movq %rdi, %rax
movq %rax, 0x28(%rsp)
movq 0x1b8(%rsp), %rsi
callq 0x1dab0
jmp 0x123b5
movq 0x1a8(%rsp), %rax
movq 0x28(%rsp), %rcx
movq %rcx, 0x1b0(%rsp)
movq 0x58(%rax), %rax
movq %rax, 0x20(%rsp)
cmpq $0x0, %rax
jne 0x123de
callq 0x6420
movq 0x20(%rsp), %rax
movq (%rax), %rax
movq -0x8(%rax), %rdi
leaq 0x5abbf(%rip), %rsi     # 0x6cfb0
callq 0x20340
testb $0x1, %al
jne 0x123fc
jmp 0x12478
movq 0x1a8(%rsp), %rcx
movq 0x58(%rcx), %rax
movl 0x48(%rax), %eax
movq 0x60(%rcx), %rcx
cmpl 0x48(%rcx), %eax
setge %cl
movq 0x1b0(%rsp), %rax
andb $0x1, %cl
movb %cl, 0x48(%rax)
jmp 0x1258c
movq 0x30(%rsp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x240(%rsp)
movl %eax, 0x23c(%rsp)
movl $0xc, %esi
callq 0x63a0
jmp 0x125be
movq 0x28(%rsp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x240(%rsp)
movl %eax, 0x23c(%rsp)
movl $0x50, %esi
callq 0x63a0
jmp 0x125be
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rax
movq %rax, 0x18(%rsp)
cmpq $0x0, %rax
jne 0x12494
callq 0x6420
movq 0x18(%rsp), %rax
movq (%rax), %rax
movq -0x8(%rax), %rdi
leaq 0x5ab21(%rip), %rsi     # 0x6cfc8
callq 0x20340
testb $0x1, %al
jne 0x124b2
jmp 0x124e1
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rcx
movss 0x48(%rcx), %xmm0
movq 0x60(%rax), %rax
ucomiss 0x48(%rax), %xmm0
setae %cl
movq 0x1b0(%rsp), %rax
andb $0x1, %cl
movb %cl, 0x48(%rax)
jmp 0x1258a
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rax
movq %rax, 0x10(%rsp)
cmpq $0x0, %rax
jne 0x124fd
callq 0x6420
movq 0x10(%rsp), %rax
movq (%rax), %rax
movq -0x8(%rax), %rdi
leaq 0x5aae8(%rip), %rsi     # 0x6cff8
callq 0x20340
testb $0x1, %al
jne 0x1251b
jmp 0x1254a
movq 0x1a8(%rsp), %rax
movq 0x58(%rax), %rdi
addq $0x48, %rdi
movq 0x60(%rax), %rsi
addq $0x48, %rsi
callq 0x20800
movb %al, %cl
movq 0x1b0(%rsp), %rax
andb $0x1, %cl
movb %cl, 0x48(%rax)
jmp 0x12588
movq 0x1b0(%rsp), %rax
movq %rax, 0x8(%rsp)
cmpq $0x0, %rax
je 0x12576
movq 0x8(%rsp), %rdi
callq 0x20730
movq 0x8(%rsp), %rdi
movl $0x50, %esi
callq 0x63a0
movq 0x1a8(%rsp), %rax
movq %rax, 0x260(%rsp)
jmp 0x125ae
jmp 0x1258a
jmp 0x1258c
movq 0x1b0(%rsp), %rax
movq %rax, 0x260(%rsp)
jmp 0x125ae
movq 0x1a8(%rsp), %rax
movq %rax, 0x260(%rsp)
movq 0x260(%rsp), %rax
addq $0x268, %rsp            # imm = 0x268
retq
movq 0x240(%rsp), %rdi
callq 0x66b0
nopl (%rax,%rax)