NAME=x86_32
FILE=bins/elf/crackme0x05
EXPECT=<<EOF
x86:LE:32:default:gcc

uint main(int argc,char **argv,char **envp)

{
    int32_t var_78h;
    
    sym.imp.printf("IOLI Crackme Level 0x05\n");
    sym.imp.printf("Password: ");
    sym.imp.scanf(0x80486b2,&var_78h);
    sym.check(&var_78h);
    return 0;
}

EOF
CMDS=<<EOF
pdgss
s main
af
pdg
EOF
RUN

NAME=x86_32
FILE=bins/elf/crackme0x05
EXPECT=<<EOF
                                                |
    0x08048540 push ebp                         |uint main(int argc,char **argv,char **envp)
                                                |
                                                |{
                                                |    int32_t var_78h;
                                                |    
    0x08048566 call sym.imp.printf              |    sym.imp.printf("IOLI Crackme Level 0x05\n");
    0x08048572 call sym.imp.printf              |    sym.imp.printf("Password: ");
    0x08048585 call sym.imp.scanf               |    sym.imp.scanf(0x80486b2,&var_78h);
    0x08048590 call sym.check                   |    sym.check(&var_78h);
    0x0804859b ret                              |    return 0;
                                                |}
                                                |
x86
x86:LE:32:default:gcc

uint main(int argc,char **argv,char **envp)

{
    int32_t var_78h;
    
    sym.imp.printf("IOLI Crackme Level 0x05\n");
    sym.imp.printf("Password: ");
    sym.imp.scanf(0x80486b2,&var_78h);
    sym.check(&var_78h);
    return 0;
}

EOF
CMDS=<<EOF
s main
af
pdga
e asm.arch
pdgss
pdg
EOF
RUN

NAME=x86_64
FILE=bins/elf/hello_world
EXPECT=<<EOF
x86:LE:64:default:gcc

void main(int argc,char **argv,char **envp)

{
    int iVar1;
    int iVar2;
    char *dest;
    int64_t var_20h;
    int64_t var_18h;
    int64_t var_10h;
    int64_t var_8h;
    
    iVar1 = sym.imp.strlen("Hello");
    iVar2 = sym.imp.strlen(" r2-folks");
    dest = sym.imp.malloc(iVar2 + iVar1 + 1);
    if (dest != NULL) {
        sym.imp.strcpy(dest,"Hello");
        sym.imp.strcat(dest," r2-folks");
        sym.imp.puts(dest);
        sym.imp.free(dest);
    }
    return;
}

EOF
CMDS=<<EOF
pdgss
s main
af
pdg
EOF
RUN

NAME=x86_16
FILE=bins/mz/unzip.exe
EXPECT=<<EOF
x86:LE:16:Real Mode:

//WARNING: Variable defined which should be unmapped: var_8h
//WARNING: Variable defined which should be unmapped: var_4h
//WARNING: Type propagation algorithm not settling
//WARNING: Unknown calling convention -- yet parameter storage is locked

char * fcn.00001c98(int16_t arg_8h,int16_t arg_6h,int16_t arg_eh,int16_t arg_ah)

{
    int16_t *piVar1;
    ushort unaff_CS;
    ushort unaff_DS;
    char *in_stack_00000008;
    int16_t in_stack_0000000c;
    int16_t var_8h;
    int16_t var_6h;
    int16_t var_4h;
    int16_t var_2h;
    char cStack_4;
    
    var_6h = 0x13da;
    do {
        func_0x0000ec24(unaff_CS,var_6h,unaff_DS,0x401e);
        func_0x0000ec24(0xdee,arg_8h,arg_ah,0x401e);
        func_0x0000e59a(0xdee,0x401e);
        var_2h = 0;
        do {
            cStack_4 = func_0x0000eb82(0xdee);
            if (cStack_4 == '\r') {
                cStack_4 = '\n';
            }
            if (var_2h < in_stack_0000000c) {
                in_stack_00000008[var_2h] = cStack_4;
                var_2h = var_2h + 1;
            }
        } while (cStack_4 != '\n');
        piVar1 = 0x4022;
        *piVar1 = *piVar1 + -1;
        if (*piVar1 < 0) {
            func_0x0000e4ae(0xdee,10,0x401e);
        }
        else {
            **0x401e = 10;
            *0x401e = *0x401e + 1;
        }
        unaff_CS = 0xdee;
        func_0x0000e59a(0xdee,0x401e);
        var_6h = 0x13db;
    } while (in_stack_00000008[var_2h + -1] != '\n');
    in_stack_00000008[var_2h + -1] = '\0';
    return _in_stack_00000008;
}

EOF
CMDS=<<EOF
pdgss
s 0x1c98
af
pdg
EOF
RUN

NAME=x86_64
FILE=bins/elf/hello_world
EXPECT=<<EOF
x86:LE:64:default:gcc

void main(int argc,char **argv,char **envp)

{
    int iVar1;
    int iVar2;
    char *dest;
    int64_t var_20h;
    int64_t var_18h;
    int64_t var_10h;
    int64_t var_8h;
    
    iVar1 = sym.imp.strlen("Hello");
    iVar2 = sym.imp.strlen(" r2-folks");
    dest = sym.imp.malloc(iVar2 + iVar1 + 1);
    if (dest != NULL) {
        sym.imp.strcpy(dest,"Hello");
        sym.imp.strcat(dest," r2-folks");
        sym.imp.puts(dest);
        sym.imp.free(dest);
    }
    return;
}

EOF
CMDS=<<EOF
pdgss
s main
af
pdg
EOF
RUN


NAME=6502
FILE=bins/prg/t01.prg
ARGS=-F prg
EXPECT=<<EOF
6502:LE:16:default:

void fcn.0000080e(void)

{
    uchar uVar1;
    uint8_t uVar2;
    
    uVar2 = 0xff;
    do {
        *(uVar2 + 0x3ff) = 0x41;
        uVar1 = *0x824;
        uVar2 = uVar2 - 1;
    } while (uVar2 != 0);
    uVar2 = 0xff;
    do {
        *(uVar2 + 0xd7ff) = uVar1;
        uVar2 = uVar2 - 1;
    } while (uVar2 != 0);
    return;
}

EOF
CMDS=<<EOF
pdgss
s 0x080e
af
pdg
EOF
RUN


NAME=rawptr
FILE=bins/dectest32
EXPECT=<<EOF

uint sym.get_global_array_entry(void)

{
    return *0x804c034;
}

--

uint sym.get_global_array_entry(void)

{
    return uRam0804c034;
}

EOF
CMDS=<<EOF
s sym.get_global_array_entry
af
e r2ghidra.rawptr=1
pdg
?e --
e r2ghidra.rawptr=0
pdg
EOF
RUN

NAME=global flag
FILE=bins/dectest32
EXPECT=<<EOF

uint sym.get_global_var(void)

{
    return _obj.global_var;
}

--

//WARNING: Globals starting with '_' overlap smaller symbols at the same address

uint sym.get_global_var(void)

{
    return _obj.global_var;
}

EOF
CMDS=<<EOF
s sym.get_global_var
af
e r2ghidra.rawptr=1
pdg
?e --
e r2ghidra.rawptr=0
pdg
EOF
RUN

NAME=function variable annotations
FILE=bins/dectest64
EXPECT=<<EOF
{
  "code": "\nulong main(int argc,char **argv)\n\n{\n    ulong uVar1;\n    int64_t in_FS_OFFSET;\n    int64_t var_30h;\n    int64_t var_24h;\n    int64_t var_8h;\n    \n    var_8h = *(in_FS_OFFSET + 0x28);\n    var_24h._0_4_ = argc;\n    sym.Aeropause(&var_24h + 4,argc,argv);\n    uVar1 = 0;\n    if (var_8h != *(in_FS_OFFSET + 0x28)) {\n        uVar1 = sym.imp.__stack_chk_fail();\n    }\n    return uVar1;\n}\n\n",
  "annotations": [
    {
      "start": 1,
      "end": 6,
      "type": "syntax_highlight",
      "syntax_highlight": "datatype"
    },
    {
      "start": 7,
      "end": 11,
      "type": "function_name",
      "name": "main",
      "offset": 4198782
    },
    {
      "start": 7,
      "end": 11,
      "type": "offset",
      "offset": 4198782
    },
    {
      "start": 7,
      "end": 11,
      "type": "syntax_highlight",
      "syntax_highlight": "function_name"
    },
    {
      "start": 12,
      "end": 15,
      "type": "syntax_highlight",
      "syntax_highlight": "datatype"
    },
    {
      "start": 16,
      "end": 20,
      "type": "function_parameter",
      "name": "argc"
    },
    {
      "start": 16,
      "end": 20,
      "type": "syntax_highlight",
      "syntax_highlight": "function_parameter"
    },
    {
      "start": 21,
      "end": 25,
      "type": "syntax_highlight",
      "syntax_highlight": "datatype"
    },
    {
      "start": 28,
      "end": 32,
      "type": "function_parameter",
      "name": "argv"
    },
    {
      "start": 28,
      "end": 32,
      "type": "syntax_highlight",
      "syntax_highlight": "function_parameter"
    },
    {
      "start": 41,
      "end": 46,
      "type": "syntax_highlight",
      "syntax_highlight": "datatype"
    },
    {
      "start": 47,
      "end": 52,
      "type": "local_variable",
      "name": "uVar1"
    },
    {
      "start": 47,
      "end": 52,
      "type": "syntax_highlight",
      "syntax_highlight": "local_variable"
    },
    {
      "start": 58,
      "end": 65,
      "type": "syntax_highlight",
      "syntax_highlight": "datatype"
    },
    {
      "start": 66,
      "end": 78,
      "type": "local_variable",
      "name": "in_FS_OFFSET"
    },
    {
      "start": 66,
      "end": 78,
      "type": "syntax_highlight",
      "syntax_highlight": "local_variable"
    },
    {
      "start": 84,
      "end": 91,
      "type": "syntax_highlight",
      "syntax_highlight": "datatype"
    },
    {
      "start": 92,
      "end": 99,
      "type": "local_variable",
      "name": "var_30h"
    },
    {
      "start": 92,
      "end": 99,
      "type": "syntax_highlight",
      "syntax_highlight": "local_variable"
    },
    {
      "start": 105,
      "end": 112,
      "type": "syntax_highlight",
      "syntax_highlight": "datatype"
    },
    {
      "start": 113,
      "end": 120,
      "type": "local_variable",
      "name": "var_24h"
    },
    {
      "start": 113,
      "end": 120,
      "type": "syntax_highlight",
      "syntax_highlight": "local_variable"
    },
    {
      "start": 126,
      "end": 133,
      "type": "syntax_highlight",
      "syntax_highlight": "datatype"
    },
    {
      "start": 134,
      "end": 140,
      "type": "local_variable",
      "name": "var_8h"
    },
    {
      "start": 134,
      "end": 140,
      "type": "syntax_highlight",
      "syntax_highlight": "local_variable"
    },
    {
      "start": 151,
      "end": 157,
      "type": "local_variable",
      "name": "var_8h"
    },
    {
      "start": 151,
      "end": 157,
      "type": "syntax_highlight",
      "syntax_highlight": "local_variable"
    },
    {
      "start": 158,
      "end": 159,
      "type": "offset",
      "offset": 4198797
    },
    {
      "start": 160,
      "end": 161,
      "type": "offset",
      "offset": 4198797
    },
    {
      "start": 162,
      "end": 174,
      "type": "local_variable",
      "name": "in_FS_OFFSET"
    },
    {
      "start": 162,
      "end": 174,
      "type": "syntax_highlight",
      "syntax_highlight": "local_variable"
    },
    {
      "start": 175,
      "end": 176,
      "type": "offset",
      "offset": 4198797
    },
    {
      "start": 177,
      "end": 181,
      "type": "syntax_highlight",
      "syntax_highlight": "constant_variable"
    },
    {
      "start": 151,
      "end": 182,
      "type": "offset",
      "offset": 4198797
    },
    {
      "start": 188,
      "end": 195,
      "type": "local_variable",
      "name": "var_24h"
    },
    {
      "start": 188,
      "end": 195,
      "type": "syntax_highlight",
      "syntax_highlight": "local_variable"
    },
    {
      "start": 195,
      "end": 196,
      "type": "offset",
      "offset": 4198828
    },
    {
      "start": 202,
      "end": 203,
      "type": "offset",
      "offset": 4198828
    },
    {
      "start": 204,
      "end": 208,
      "type": "function_parameter",
      "name": "argc"
    },
    {
      "start": 204,
      "end": 208,
      "type": "syntax_highlight",
      "syntax_highlight": "function_parameter"
    },
    {
      "start": 188,
      "end": 208,
      "type": "offset",
      "offset": 4198828
    },
    {
      "start": 214,
      "end": 227,
      "type": "function_name",
      "name": "sym.Aeropause",
      "offset": 4199038
    },
    {
      "start": 214,
      "end": 227,
      "type": "syntax_highlight",
      "syntax_highlight": "function_name"
    },
    {
      "start": 228,
      "end": 229,
      "type": "offset",
      "offset": 4198819
    },
    {
      "start": 229,
      "end": 236,
      "type": "syntax_highlight",
      "syntax_highlight": "local_variable"
    },
    {
      "start": 237,
      "end": 238,
      "type": "offset",
      "offset": 4198819
    },
    {
      "start": 239,
      "end": 240,
      "type": "syntax_highlight",
      "syntax_highlight": "constant_variable"
    },
    {
      "start": 240,
      "end": 241,
      "type": "offset",
      "offset": 4198828
    },
    {
      "start": 241,
      "end": 245,
      "type": "function_parameter",
      "name": "argc"
    },
    {
      "start": 241,
      "end": 245,
      "type": "syntax_highlight",
      "syntax_highlight": "function_parameter"
    },
    {
      "start": 245,
      "end": 246,
      "type": "offset",
      "offset": 4198828
    },
    {
      "start": 246,
      "end": 250,
      "type": "function_parameter",
      "name": "argv"
    },
    {
      "start": 246,
      "end": 250,
      "type": "syntax_highlight",
      "syntax_highlight": "function_parameter"
    },
    {
      "start": 214,
      "end": 251,
      "type": "offset",
      "offset": 4198828
    },
    {
      "start": 257,
      "end": 262,
      "type": "local_variable",
      "name": "uVar1"
    },
    {
      "start": 257,
      "end": 262,
      "type": "syntax_highlight",
      "syntax_highlight": "local_variable"
    },
    {
      "start": 263,
      "end": 264,
      "type": "offset",
      "offset": 4198833
    },
    {
      "start": 265,
      "end": 266,
      "type": "syntax_highlight",
      "syntax_highlight": "constant_variable"
    },
    {
      "start": 257,
      "end": 266,
      "type": "offset",
      "offset": 4198833
    },
    {
      "start": 272,
      "end": 274,
      "type": "offset",
      "offset": 4198851
    },
    {
      "start": 272,
      "end": 274,
      "type": "syntax_highlight",
      "syntax_highlight": "keyword"
    },
    {
      "start": 276,
      "end": 282,
      "type": "local_variable",
      "name": "var_8h"
    },
    {
      "start": 276,
      "end": 282,
      "type": "syntax_highlight",
      "syntax_highlight": "local_variable"
    },
    {
      "start": 283,
      "end": 285,
      "type": "offset",
      "offset": 4198842
    },
    {
      "start": 286,
      "end": 287,
      "type": "offset",
      "offset": 4198842
    },
    {
      "start": 288,
      "end": 300,
      "type": "local_variable",
      "name": "in_FS_OFFSET"
    },
    {
      "start": 288,
      "end": 300,
      "type": "syntax_highlight",
      "syntax_highlight": "local_variable"
    },
    {
      "start": 301,
      "end": 302,
      "type": "offset",
      "offset": 4198842
    },
    {
      "start": 303,
      "end": 307,
      "type": "syntax_highlight",
      "syntax_highlight": "constant_variable"
    },
    {
      "start": 320,
      "end": 325,
      "type": "local_variable",
      "name": "uVar1"
    },
    {
      "start": 320,
      "end": 325,
      "type": "syntax_highlight",
      "syntax_highlight": "local_variable"
    },
    {
      "start": 326,
      "end": 327,
      "type": "offset",
      "offset": 4198853
    },
    {
      "start": 328,
      "end": 352,
      "type": "function_name",
      "name": "sym.imp.__stack_chk_fail",
      "offset": 4198464
    },
    {
      "start": 328,
      "end": 352,
      "type": "syntax_highlight",
      "syntax_highlight": "function_name"
    },
    {
      "start": 320,
      "end": 354,
      "type": "offset",
      "offset": 4198853
    },
    {
      "start": 366,
      "end": 372,
      "type": "offset",
      "offset": 4198859
    },
    {
      "start": 366,
      "end": 372,
      "type": "syntax_highlight",
      "syntax_highlight": "keyword"
    },
    {
      "start": 373,
      "end": 378,
      "type": "local_variable",
      "name": "uVar1"
    },
    {
      "start": 373,
      "end": 378,
      "type": "syntax_highlight",
      "syntax_highlight": "local_variable"
    },
    {
      "start": 366,
      "end": 378,
      "type": "offset",
      "offset": 4198859
    }
  ]
}
EOF
CMDS=<<EOF
s main
af
pdgj~{}
EOF
RUN

NAME=global variable annotation
FILE=bins/dectest32
EXPECT=<<EOF
{
  "code": "\nuint sym.get_global_array_entry(void)\n\n{\n    return *0x804c034;\n}\n\n",
  "annotations": [
    {
      "start": 1,
      "end": 5,
      "type": "syntax_highlight",
      "syntax_highlight": "datatype"
    },
    {
      "start": 6,
      "end": 32,
      "type": "function_name",
      "name": "sym.get_global_array_entry",
      "offset": 134517184
    },
    {
      "start": 6,
      "end": 32,
      "type": "offset",
      "offset": 134517184
    },
    {
      "start": 6,
      "end": 32,
      "type": "syntax_highlight",
      "syntax_highlight": "function_name"
    },
    {
      "start": 33,
      "end": 37,
      "type": "syntax_highlight",
      "syntax_highlight": "keyword"
    },
    {
      "start": 46,
      "end": 52,
      "type": "offset",
      "offset": 134517193
    },
    {
      "start": 46,
      "end": 52,
      "type": "syntax_highlight",
      "syntax_highlight": "keyword"
    },
    {
      "start": 53,
      "end": 54,
      "type": "offset",
      "offset": 134517187
    },
    {
      "start": 54,
      "end": 63,
      "type": "global_variable",
      "offset": 134529076
    },
    {
      "start": 54,
      "end": 63,
      "type": "syntax_highlight",
      "syntax_highlight": "constant_variable"
    },
    {
      "start": 46,
      "end": 63,
      "type": "offset",
      "offset": 134517193
    }
  ]
}
EOF
CMDS=<<EOF
s sym.get_global_array_entry
af
pdgj~{}
EOF
RUN

NAME=constant variable annotation
FILE=bins/dectest32
EXPECT=<<EOF
{
  "code": "\nvoid sym.PrintAmbassador(int32_t arg_8h)\n\n{\n    func_0x08049050(\"Ambassador value: \");\n    if (arg_8h < 5) {\n        if (arg_8h < 5) {\n            switch(*(arg_8h * 4 + 0x804a048)) {\n            case 0x8049261:\n                func_0x08049050(\"pure\");\n                break;\n            case 0x8049273:\n                func_0x08049050(\"reason\");\n                break;\n            case 0x8049285:\n                func_0x08049050(\"revolution\");\n                break;\n            case 0x8049297:\n                func_0x08049050(\"echoes\");\n                break;\n            case 0x80492a9:\n                func_0x08049050(\"wall\");\n            }\n        }\n    }\n    else if (arg_8h == 1000000) {\n        func_0x08049050(\"million\");\n    }\n    func_0x08049090(10);\n    return;\n}\n\n",
  "annotations": [
    {
      "start": 1,
      "end": 5,
      "type": "syntax_highlight",
      "syntax_highlight": "datatype"
    },
    {
      "start": 6,
      "end": 25,
      "type": "function_name",
      "name": "sym.PrintAmbassador",
      "offset": 134517281
    },
    {
      "start": 6,
      "end": 25,
      "type": "offset",
      "offset": 134517281
    },
    {
      "start": 6,
      "end": 25,
      "type": "syntax_highlight",
      "syntax_highlight": "function_name"
    },
    {
      "start": 26,
      "end": 33,
      "type": "syntax_highlight",
      "syntax_highlight": "datatype"
    },
    {
      "start": 34,
      "end": 40,
      "type": "function_parameter",
      "name": "arg_8h"
    },
    {
      "start": 34,
      "end": 40,
      "type": "syntax_highlight",
      "syntax_highlight": "function_parameter"
    },
    {
      "start": 49,
      "end": 64,
      "type": "function_name",
      "name": "",
      "offset": 134516816
    },
    {
      "start": 49,
      "end": 64,
      "type": "syntax_highlight",
      "syntax_highlight": "function_name"
    },
    {
      "start": 65,
      "end": 85,
      "type": "constant_variable",
      "offset": 134520840
    },
    {
      "start": 65,
      "end": 85,
      "type": "syntax_highlight",
      "syntax_highlight": "constant_variable"
    },
    {
      "start": 49,
      "end": 86,
      "type": "offset",
      "offset": 134517295
    },
    {
      "start": 92,
      "end": 94,
      "type": "offset",
      "offset": 134517307
    },
    {
      "start": 92,
      "end": 94,
      "type": "syntax_highlight",
      "syntax_highlight": "keyword"
    },
    {
      "start": 96,
      "end": 102,
      "type": "function_parameter",
      "name": "arg_8h"
    },
    {
      "start": 96,
      "end": 102,
      "type": "syntax_highlight",
      "syntax_highlight": "function_parameter"
    },
    {
      "start": 103,
      "end": 104,
      "type": "offset",
      "offset": 134517307
    },
    {
      "start": 105,
      "end": 106,
      "type": "syntax_highlight",
      "syntax_highlight": "constant_variable"
    },
    {
      "start": 118,
      "end": 120,
      "type": "offset",
      "offset": 134517313
    },
    {
      "start": 118,
      "end": 120,
      "type": "syntax_highlight",
      "syntax_highlight": "keyword"
    },
    {
      "start": 122,
      "end": 128,
      "type": "function_parameter",
      "name": "arg_8h"
    },
    {
      "start": 122,
      "end": 128,
      "type": "syntax_highlight",
      "syntax_highlight": "function_parameter"
    },
    {
      "start": 129,
      "end": 130,
      "type": "offset",
      "offset": 134517313
    },
    {
      "start": 131,
      "end": 132,
      "type": "syntax_highlight",
      "syntax_highlight": "constant_variable"
    },
    {
      "start": 148,
      "end": 154,
      "type": "offset",
      "offset": 134517332
    },
    {
      "start": 148,
      "end": 154,
      "type": "syntax_highlight",
      "syntax_highlight": "keyword"
    },
    {
      "start": 155,
      "end": 156,
      "type": "offset",
      "offset": 134517330
    },
    {
      "start": 157,
      "end": 163,
      "type": "function_parameter",
      "name": "arg_8h"
    },
    {
      "start": 157,
      "end": 163,
      "type": "syntax_highlight",
      "syntax_highlight": "function_parameter"
    },
    {
      "start": 164,
      "end": 165,
      "type": "offset",
      "offset": 134517322
    },
    {
      "start": 166,
      "end": 167,
      "type": "syntax_highlight",
      "syntax_highlight": "constant_variable"
    },
    {
      "start": 168,
      "end": 169,
      "type": "offset",
      "offset": 134517325
    },
    {
      "start": 170,
      "end": 179,
      "type": "syntax_highlight",
      "syntax_highlight": "constant_variable"
    },
    {
      "start": 196,
      "end": 200,
      "type": "syntax_highlight",
      "syntax_highlight": "keyword"
    },
    {
      "start": 228,
      "end": 243,
      "type": "function_name",
      "name": "",
      "offset": 134516816
    },
    {
      "start": 228,
      "end": 243,
      "type": "syntax_highlight",
      "syntax_highlight": "function_name"
    },
    {
      "start": 244,
      "end": 250,
      "type": "constant_variable",
      "offset": 134520859
    },
    {
      "start": 244,
      "end": 250,
      "type": "syntax_highlight",
      "syntax_highlight": "constant_variable"
    },
    {
      "start": 228,
      "end": 251,
      "type": "offset",
      "offset": 134517353
    },
    {
      "start": 269,
      "end": 274,
      "type": "syntax_highlight",
      "syntax_highlight": "keyword"
    },
    {
      "start": 269,
      "end": 275,
      "type": "offset",
      "offset": 134517361
    },
    {
      "start": 288,
      "end": 292,
      "type": "syntax_highlight",
      "syntax_highlight": "keyword"
    },
    {
      "start": 320,
      "end": 335,
      "type": "function_name",
      "name": "",
      "offset": 134516816
    },
    {
      "start": 320,
      "end": 335,
      "type": "syntax_highlight",
      "syntax_highlight": "function_name"
    },
    {
      "start": 336,
      "end": 344,
      "type": "constant_variable",
      "offset": 134520864
    },
    {
      "start": 336,
      "end": 344,
      "type": "syntax_highlight",
      "syntax_highlight": "constant_variable"
    },
    {
      "start": 320,
      "end": 345,
      "type": "offset",
      "offset": 134517371
    },
    {
      "start": 363,
      "end": 368,
      "type": "syntax_highlight",
      "syntax_highlight": "keyword"
    },
    {
      "start": 363,
      "end": 369,
      "type": "offset",
      "offset": 134517379
    },
    {
      "start": 382,
      "end": 386,
      "type": "syntax_highlight",
      "syntax_highlight": "keyword"
    },
    {
      "start": 414,
      "end": 429,
      "type": "function_name",
      "name": "",
      "offset": 134516816
    },
    {
      "start": 414,
      "end": 429,
      "type": "syntax_highlight",
      "syntax_highlight": "function_name"
    },
    {
      "start": 430,
      "end": 442,
      "type": "constant_variable",
      "offset": 134520871
    },
    {
      "start": 430,
      "end": 442,
      "type": "syntax_highlight",
      "syntax_highlight": "constant_variable"
    },
    {
      "start": 414,
      "end": 443,
      "type": "offset",
      "offset": 134517389
    },
    {
      "start": 461,
      "end": 466,
      "type": "syntax_highlight",
      "syntax_highlight": "keyword"
    },
    {
      "start": 461,
      "end": 467,
      "type": "offset",
      "offset": 134517397
    },
    {
      "start": 480,
      "end": 484,
      "type": "syntax_highlight",
      "syntax_highlight": "keyword"
    },
    {
      "start": 512,
      "end": 527,
      "type": "function_name",
      "name": "",
      "offset": 134516816
    },
    {
      "start": 512,
      "end": 527,
      "type": "syntax_highlight",
      "syntax_highlight": "function_name"
    },
    {
      "start": 528,
      "end": 536,
      "type": "constant_variable",
      "offset": 134520882
    },
    {
      "start": 528,
      "end": 536,
      "type": "syntax_highlight",
      "syntax_highlight": "constant_variable"
    },
    {
      "start": 512,
      "end": 537,
      "type": "offset",
      "offset": 134517407
    },
    {
      "start": 555,
      "end": 560,
      "type": "syntax_highlight",
      "syntax_highlight": "keyword"
    },
    {
      "start": 555,
      "end": 561,
      "type": "offset",
      "offset": 134517415
    },
    {
      "start": 574,
      "end": 578,
      "type": "syntax_highlight",
      "syntax_highlight": "keyword"
    },
    {
      "start": 606,
      "end": 621,
      "type": "function_name",
      "name": "",
      "offset": 134516816
    },
    {
      "start": 606,
      "end": 621,
      "type": "syntax_highlight",
      "syntax_highlight": "function_name"
    },
    {
      "start": 622,
      "end": 628,
      "type": "constant_variable",
      "offset": 134520889
    },
    {
      "start": 622,
      "end": 628,
      "type": "syntax_highlight",
      "syntax_highlight": "constant_variable"
    },
    {
      "start": 606,
      "end": 629,
      "type": "offset",
      "offset": 134517425
    },
    {
      "start": 665,
      "end": 669,
      "type": "syntax_highlight",
      "syntax_highlight": "keyword"
    },
    {
      "start": 670,
      "end": 672,
      "type": "offset",
      "offset": 134517341
    },
    {
      "start": 670,
      "end": 672,
      "type": "syntax_highlight",
      "syntax_highlight": "keyword"
    },
    {
      "start": 674,
      "end": 680,
      "type": "function_parameter",
      "name": "arg_8h"
    },
    {
      "start": 674,
      "end": 680,
      "type": "syntax_highlight",
      "syntax_highlight": "function_parameter"
    },
    {
      "start": 681,
      "end": 683,
      "type": "offset",
      "offset": 134517334
    },
    {
      "start": 684,
      "end": 691,
      "type": "syntax_highlight",
      "syntax_highlight": "constant_variable"
    },
    {
      "start": 703,
      "end": 718,
      "type": "function_name",
      "name": "",
      "offset": 134516816
    },
    {
      "start": 703,
      "end": 718,
      "type": "syntax_highlight",
      "syntax_highlight": "function_name"
    },
    {
      "start": 719,
      "end": 728,
      "type": "constant_variable",
      "offset": 134520894
    },
    {
      "start": 719,
      "end": 728,
      "type": "syntax_highlight",
      "syntax_highlight": "constant_variable"
    },
    {
      "start": 703,
      "end": 729,
      "type": "offset",
      "offset": 134517443
    },
    {
      "start": 741,
      "end": 756,
      "type": "function_name",
      "name": "",
      "offset": 134516880
    },
    {
      "start": 741,
      "end": 756,
      "type": "syntax_highlight",
      "syntax_highlight": "function_name"
    },
    {
      "start": 757,
      "end": 759,
      "type": "syntax_highlight",
      "syntax_highlight": "constant_variable"
    },
    {
      "start": 741,
      "end": 760,
      "type": "offset",
      "offset": 134517459
    },
    {
      "start": 766,
      "end": 772,
      "type": "offset",
      "offset": 134517469
    },
    {
      "start": 766,
      "end": 772,
      "type": "syntax_highlight",
      "syntax_highlight": "keyword"
    },
    {
      "start": 766,
      "end": 772,
      "type": "offset",
      "offset": 134517469
    }
  ]
}
EOF
CMDS=<<EOF
s sym.PrintAmbassador
af
pdgj~{}
EOF
RUN

NAME=aeropause32 (many features combined)
FILE=bins/dectest32
EXPECT=<<EOF

void sym.Aeropause(Bright *bright,int32_t argc,char **argv)

{
    Ambassador AVar1;
    Morning *pMVar2;
    int iVar3;
    
    pMVar2 = sym.imp.malloc(8);
    bright->morning = pMVar2;
    bright->morning->saved_argc = argc;
    bright->morning->saved_argv = argv;
    if (bright->morning->saved_argc < 2) {
        bright->ambassador = AMBASSADOR_PURE;
    }
    else {
        (bright->window).sunlight = bright->morning->saved_argv[1];
        iVar3 = sym.imp.strcmp((bright->window).sunlight,0x804a05c);
        if (iVar3 == 0) {
            bright->ambassador = AMBASSADOR_REASON;
        }
        else {
            iVar3 = sym.imp.strcmp((bright->window).sunlight,"dark");
            if (iVar3 == 0) {
                bright->ambassador = AMBASSADOR_REVOLUTION;
            }
            else {
                iVar3 = sym.imp.strcmp((bright->window).sunlight,"third");
                if (iVar3 == 0) {
                    bright->ambassador = AMBASSADOR_ECHOES;
                }
                else {
                    bright->ambassador = AMBASSADOR_MILLION;
                }
            }
        }
    }
    AVar1 = bright->ambassador;
    if (AVar1 < (AMBASSADOR_WALL|AMBASSADOR_REASON)) {
    //switch table (5 cases) at 0x804a070
        switch(AVar1) {
        case AMBASSADOR_PURE:
            sym.imp.printf("pure");
            break;
        case AMBASSADOR_REASON:
            sym.imp.printf("reason");
            break;
        case AMBASSADOR_REVOLUTION:
            sym.imp.printf("revolution");
            break;
        case AMBASSADOR_ECHOES:
            sym.imp.printf("echoes");
            break;
        case AMBASSADOR_WALL:
            sym.imp.printf("wall");
        }
    }
    else if (AVar1 == AMBASSADOR_MILLION) {
        sym.imp.printf("million");
    }
    sym.PrintAmbassador(bright->ambassador);
    return;
}

EOF
CMDS=<<EOF
aaa
to bins/types.h
s sym.Aeropause
afvb 8 bright Bright *
afvb 12 argc int32_t
afvb 16 argv const char **
pdg
EOF
RUN

NAME=aeropause64 (many features combined)
FILE=bins/dectest64
EXPECT=<<EOF

void sym.Aeropause(Bright *bright,int32_t argc,char **argv)

{
    uint uVar1;
    int iVar2;
    Morning *pMVar3;
    int64_t var_18h;
    void **var_8h;
    
    pMVar3 = sym.imp.malloc(0x10);
    bright->morning = pMVar3;
    bright->morning->saved_argc = argc;
    bright->morning->saved_argv = argv;
    if (bright->morning->saved_argc < 2) {
        bright->ambassador = AMBASSADOR_PURE;
    }
    else {
        (bright->window).sunlight = bright->morning->saved_argv[1];
        iVar2 = sym.imp.strcmp((bright->window).sunlight,"the  ");
        if (iVar2 == 0) {
            bright->ambassador = AMBASSADOR_REASON;
        }
        else {
            iVar2 = sym.imp.strcmp((bright->window).sunlight,"dark");
            if (iVar2 == 0) {
                bright->ambassador = AMBASSADOR_REVOLUTION;
            }
            else {
                iVar2 = sym.imp.strcmp((bright->window).sunlight,"third");
                if (iVar2 == 0) {
                    bright->ambassador = AMBASSADOR_ECHOES;
                }
                else {
                    bright->ambassador = AMBASSADOR_MILLION;
                }
            }
        }
    }
    uVar1 = bright->ambassador;
    if (uVar1 < (AMBASSADOR_WALL|AMBASSADOR_REASON)) {
    //switch table (5 cases) at 0x402088
        switch(uVar1) {
        case 0:
            sym.imp.printf("pure");
            break;
        case 1:
            sym.imp.printf("reason");
            break;
        case 2:
            sym.imp.printf("revolution");
            break;
        case 3:
            sym.imp.printf("echoes");
            break;
        case 4:
            sym.imp.printf("wall");
        }
    }
    else if (uVar1 == AMBASSADOR_MILLION) {
        sym.imp.printf("million");
    }
    sym.PrintAmbassador(bright->ambassador);
    return;
}

EOF
CMDS=<<EOF
aaa
to bins/types.h

s sym.Aeropause
pdg
EOF
RUN

NAME=typedef
FILE=bins/dectest32
EXPECT=<<EOF

void sym.Aeropause(Bright *bright,int32_t argc,char **argv)

{
    Ambassador AVar1;
    Morning *pMVar2;
    int iVar3;
    
    pMVar2 = sym.imp.malloc(8);
    bright->morning = pMVar2;
    bright->morning->saved_argc = argc;
    bright->morning->saved_argv = argv;
    if (bright->morning->saved_argc < 2) {
        bright->ambassador = AMBASSADOR_PURE;
    }
    else {
        (bright->window).sunlight = bright->morning->saved_argv[1];
        iVar3 = sym.imp.strcmp((bright->window).sunlight,0x804a05c);
        if (iVar3 == 0) {
            bright->ambassador = AMBASSADOR_REASON;
        }
        else {
            iVar3 = sym.imp.strcmp((bright->window).sunlight,"dark");
            if (iVar3 == 0) {
                bright->ambassador = AMBASSADOR_REVOLUTION;
            }
            else {
                iVar3 = sym.imp.strcmp((bright->window).sunlight,"third");
                if (iVar3 == 0) {
                    bright->ambassador = AMBASSADOR_ECHOES;
                }
                else {
                    bright->ambassador = AMBASSADOR_MILLION;
                }
            }
        }
    }
    AVar1 = bright->ambassador;
    if (AVar1 < (AMBASSADOR_WALL|AMBASSADOR_REASON)) {
    //switch table (5 cases) at 0x804a070
        switch(AVar1) {
        case AMBASSADOR_PURE:
            sym.imp.printf("pure");
            break;
        case AMBASSADOR_REASON:
            sym.imp.printf("reason");
            break;
        case AMBASSADOR_REVOLUTION:
            sym.imp.printf("revolution");
            break;
        case AMBASSADOR_ECHOES:
            sym.imp.printf("echoes");
            break;
        case AMBASSADOR_WALL:
            sym.imp.printf("wall");
        }
    }
    else if (AVar1 == AMBASSADOR_MILLION) {
        sym.imp.printf("million");
    }
    sym.PrintAmbassador(bright->ambassador);
    return;
}

--

void sym.Aeropause(Bright *bright,int32_t argc,char **argv)

{
    Ambassador AVar1;
    Morning *pMVar2;
    int iVar3;
    
    pMVar2 = sym.imp.malloc(8);
    bright->morning = pMVar2;
    bright->morning->saved_argc = argc;
    bright->morning->saved_argv = argv;
    if (bright->morning->saved_argc < 2) {
        bright->ambassador = AMBASSADOR_PURE;
    }
    else {
        (bright->window).sunlight = bright->morning->saved_argv[1];
        iVar3 = sym.imp.strcmp((bright->window).sunlight,0x804a05c);
        if (iVar3 == 0) {
            bright->ambassador = AMBASSADOR_REASON;
        }
        else {
            iVar3 = sym.imp.strcmp((bright->window).sunlight,"dark");
            if (iVar3 == 0) {
                bright->ambassador = AMBASSADOR_REVOLUTION;
            }
            else {
                iVar3 = sym.imp.strcmp((bright->window).sunlight,"third");
                if (iVar3 == 0) {
                    bright->ambassador = AMBASSADOR_ECHOES;
                }
                else {
                    bright->ambassador = AMBASSADOR_MILLION;
                }
            }
        }
    }
    AVar1 = bright->ambassador;
    if (AVar1 < (AMBASSADOR_WALL|AMBASSADOR_REASON)) {
    //switch table (5 cases) at 0x804a070
        switch(AVar1) {
        case AMBASSADOR_PURE:
            sym.imp.printf("pure");
            break;
        case AMBASSADOR_REASON:
            sym.imp.printf("reason");
            break;
        case AMBASSADOR_REVOLUTION:
            sym.imp.printf("revolution");
            break;
        case AMBASSADOR_ECHOES:
            sym.imp.printf("echoes");
            break;
        case AMBASSADOR_WALL:
            sym.imp.printf("wall");
        }
    }
    else if (AVar1 == AMBASSADOR_MILLION) {
        sym.imp.printf("million");
    }
    sym.PrintAmbassador(bright->ambassador);
    return;
}

--

void sym.Aeropause(Bright *bright,int32_t argc,char **argv)

{
    Ambassador AVar1;
    Morning *pMVar2;
    int iVar3;
    
    pMVar2 = sym.imp.malloc(8);
    bright->morning = pMVar2;
    bright->morning->saved_argc = argc;
    bright->morning->saved_argv = argv;
    if (bright->morning->saved_argc < 2) {
        bright->ambassador = AMBASSADOR_PURE;
    }
    else {
        (bright->window).sunlight = bright->morning->saved_argv[1];
        iVar3 = sym.imp.strcmp((bright->window).sunlight,0x804a05c);
        if (iVar3 == 0) {
            bright->ambassador = AMBASSADOR_REASON;
        }
        else {
            iVar3 = sym.imp.strcmp((bright->window).sunlight,"dark");
            if (iVar3 == 0) {
                bright->ambassador = AMBASSADOR_REVOLUTION;
            }
            else {
                iVar3 = sym.imp.strcmp((bright->window).sunlight,"third");
                if (iVar3 == 0) {
                    bright->ambassador = AMBASSADOR_ECHOES;
                }
                else {
                    bright->ambassador = AMBASSADOR_MILLION;
                }
            }
        }
    }
    AVar1 = bright->ambassador;
    if (AVar1 < (AMBASSADOR_WALL|AMBASSADOR_REASON)) {
    //switch table (5 cases) at 0x804a070
        switch(AVar1) {
        case AMBASSADOR_PURE:
            sym.imp.printf("pure");
            break;
        case AMBASSADOR_REASON:
            sym.imp.printf("reason");
            break;
        case AMBASSADOR_REVOLUTION:
            sym.imp.printf("revolution");
            break;
        case AMBASSADOR_ECHOES:
            sym.imp.printf("echoes");
            break;
        case AMBASSADOR_WALL:
            sym.imp.printf("wall");
        }
    }
    else if (AVar1 == AMBASSADOR_MILLION) {
        sym.imp.printf("million");
    }
    sym.PrintAmbassador(bright->ambassador);
    return;
}

EOF
CMDS=<<EOF
aaa
to bins/types.h
s sym.Aeropause
afvb 8 bright BrightPtr
afvb 12 argc Bright *
afvb 16 argv const char **
pdg
?e --
afvb 8 bright BrightTypedefd *
afvb 12 argc int32_t
afvb 16 argv const char **
pdg
?e --
afvb 8 bright BrightTypedefdPtr
pdg
EOF
RUN

NAME=macos args
FILE=bins/mach0/arg
EXPECT=<<EOF

//WARNING: Variable defined which should be unmapped: var_4h

void __stdcall main(int argc,char **argv,char **envp)

{
    char *var_4h;
    
    sym._call();
    return;
}

EOF
CMDS=<<EOF
aaa
s main
pdg
EOF
RUN

NAME=Nodup function on container query
FILE=bins/hello-arm
EXPECT=<<EOF

//WARNING: Control flow encountered bad instruction data

void entry0(void)

{
    //[11] -r-x section size 200 named .text
    func_0x0000039c();
    //WARNING: Bad instruction - Truncating control flow here
    halt_baddata();
}

EOF
CMDS=<<EOF
s entry0
af
pdg
EOF
RUN

NAME=code printing
FILE=bins/elf/crackme0x05
EXPECT=<<EOF

uint main(int argc,char **argv,char **envp)

{
    int32_t var_78h;
    
    sym.imp.printf("IOLI Crackme Level 0x05\n");
    sym.imp.printf("Password: ");
    sym.imp.scanf(0x80486b2,&var_78h);
    sym.check(&var_78h);
    return 0;
}

--
                  |
    0x08048540    |uint main(int argc,char **argv,char **envp)
                  |
                  |{
                  |    int32_t var_78h;
                  |    
    0x08048566    |    sym.imp.printf("IOLI Crackme Level 0x05\n");
    0x08048572    |    sym.imp.printf("Password: ");
    0x08048585    |    sym.imp.scanf(0x80486b2,&var_78h);
    0x08048590    |    sym.check(&var_78h);
    0x0804859b    |    return 0;
                  |}
                  |
--
CCu base64:Jg== @ 0x8048577
CCu base64:bWFpbg== @ 0x8048540
CCu base64:c3ltLmltcC5zY2FuZigweDgwNDg2YjIsJnZhcl83OGgp @ 0x8048585
CCu base64:c3ltLmNoZWNrKCZ2YXJfNzhoKQ== @ 0x8048590
CCu base64:cmV0dXJuIDA= @ 0x804859b
CCu base64:c3ltLmltcC5wcmludGYoIklPTEkgQ3JhY2ttZSBMZXZlbCAweDA1XG4iKQ== @ 0x8048566
CCu base64:c3ltLmltcC5wcmludGYoIlBhc3N3b3JkOiAiKQ== @ 0x8048572
CCu base64:Jg== @ 0x804858a
--
<result><function>
<function name="main" size="92">
  <localdb main="stack" lock="false">
      <rangelist>
        <range space="stack" first="0x4" last="0x1f7"/>
        <range space="stack" first="0xfff0bdc0" last="0xffffff5f"/>
        <range space="stack" first="0xffffff68" last="0xfffffffb"/>
      </rangelist>
      <symbollist>
        <mapsym>
          </symbol>
          <rangelist>
            <range space="ram" first="0x804853f" last="0x804853f"/>
          </rangelist>
        </mapsym>
        <mapsym>
            <type name="" size="4" metatype="ptr" core="true">
              <type name="" size="4" metatype="ptr" core="true">
              </type>
            </type>
          </symbol>
          <rangelist>
            <range space="ram" first="0x804853f" last="0x804853f"/>
          </rangelist>
        </mapsym>
        <mapsym>
            <type name="" size="4" metatype="ptr" core="true">
              <type name="" size="4" metatype="ptr" core="true">
              </type>
            </type>
          </symbol>
          <rangelist>
            <range space="ram" first="0x804853f" last="0x804853f"/>
          </rangelist>
        </mapsym>
        <mapsym>
          </symbol>
          <rangelist/>
        </mapsym>
      </symbollist>
    </scope>
  </localdb>
  <ast>
    <varnodes>
    </varnodes>
    <block index="0">
      <rangelist>
        <range space="ram" first="0x8048540" last="0x804859b"/>
      </rangelist>
      <op code="1">
        <seqnum space="ram" offset="0x8048566" uniq="0xf6"/>
      </op>
      <op code="7">
        <seqnum space="ram" offset="0x8048566" uniq="0x80"/>
        <void/>
      </op>
      <op code="1">
        <seqnum space="ram" offset="0x8048572" uniq="0xf7"/>
      </op>
      <op code="7">
        <seqnum space="ram" offset="0x8048572" uniq="0x85"/>
        <void/>
      </op>
      <op code="66">
        <seqnum space="ram" offset="0x8048577" uniq="0xf8"/>
      </op>
      <op code="7">
        <seqnum space="ram" offset="0x8048585" uniq="0x8f"/>
        <void/>
      </op>
      <op code="66">
        <seqnum space="ram" offset="0x804858a" uniq="0xf9"/>
      </op>
      <op code="64">
        <seqnum space="ram" offset="0x8048590" uniq="0xfa"/>
      </op>
      <op code="7">
        <seqnum space="ram" offset="0x8048590" uniq="0x96"/>
        <void/>
      </op>
      <op code="1">
        <seqnum space="ram" offset="0x8048595" uniq="0x97"/>
      </op>
      <op code="10">
        <seqnum space="ram" offset="0x804859b" uniq="0x9d"/>
        <void/>
      </op>
    </block>
  </ast>
  <highlist>
    <high repref="0x1a3" class="constant">
    </high>
    <high repref="0x1c1" class="constant">
    </high>
    <high repref="0x316" class="constant">
      <type name="" size="4" metatype="ptr" core="true">
      </type>
    </high>
    <high repref="0x317" class="constant">
      <type name="" size="4" metatype="ptr" core="true">
      </type>
    </high>
    <high repref="0x30b" class="constant">
      <type name="" size="4" metatype="ptr" core="true">
      </type>
    </high>
    <high repref="0x312" class="constant" symref="0x4000010000000003" offset="0">
    </high>
    <high repref="0x314" class="constant" symref="0x4000010000000003" offset="0">
    </high>
    <high repref="0x176" class="other">
      <type name="" size="4" metatype="ptr" core="true">
      </type>
    </high>
    <high repref="0x190" class="other">
      <type name="" size="4" metatype="ptr" core="true">
      </type>
    </high>
    <high repref="0x30d" class="other" typelock="true">
      <type name="" size="4" metatype="ptr" core="true">
      </type>
    </high>
    <high repref="0x310" class="other" typelock="true">
      <type name="" size="4" metatype="ptr" core="true">
      </type>
    </high>
    <high repref="0x318" class="other">
    </high>
    <high repref="0x1a2" class="other">
    </high>
    <high repref="0x240" class="other" typelock="true">
      <type name="" size="4" metatype="ptr">
        <type name="" size="0" metatype="spacebase" space="stack">
        </type>
      </type>
    </high>
    <high repref="0x1c2" class="param" symref="0x4000010000000000">
    </high>
    <high repref="0x1c3" class="param" symref="0x4000010000000001">
      <type name="" size="4" metatype="ptr" core="true">
        <type name="" size="4" metatype="ptr" core="true">
        </type>
      </type>
    </high>
    <high repref="0x1c4" class="param" symref="0x4000010000000002">
      <type name="" size="4" metatype="ptr" core="true">
        <type name="" size="4" metatype="ptr" core="true">
        </type>
      </type>
    </high>
  </highlist>
  <prototype model="__cdecl" extrapop="4" modellock="true">
    <returnsym>
    </returnsym>
  </prototype>
</function></function><code>
<function>
  <syntax></syntax>
  <break indent="0"/>
  <funcproto>
    <return_type varref="0x1a2">
      <syntax></syntax>
      <syntax></syntax>
    </return_type>
    <syntax> </syntax>
    <funcname color="0x3">main</funcname>
    <syntax></syntax>
    <syntax open="113">(</syntax>
    <syntax></syntax>
    <vardecl symref="0x4000010000000000">
      <syntax> </syntax>
      <variable color="0x6">argc</variable>
    </vardecl>
    <syntax></syntax>
    <syntax>, </syntax>
    <syntax></syntax>
    <vardecl symref="0x4000010000000001">
      <syntax> </syntax>
      <op>*</op>
      <syntax></syntax>
      <op>*</op>
      <syntax></syntax>
      <variable color="0x6">argv</variable>
    </vardecl>
    <syntax></syntax>
    <syntax>, </syntax>
    <syntax></syntax>
    <vardecl symref="0x4000010000000002">
      <syntax> </syntax>
      <op>*</op>
      <syntax></syntax>
      <op>*</op>
      <syntax></syntax>
      <variable color="0x6">envp</variable>
    </vardecl>
    <syntax></syntax>
    <syntax close="113">)</syntax>
  </funcproto>
  <break indent="0"/>
  <syntax></syntax>
  <break indent="0"/>
  <syntax>{</syntax>
  <break indent="4"/>
  <vardecl symref="0x4000010000000003">
    <syntax> </syntax>
    <variable color="0x4">var_78h</variable>
  </vardecl>
  <syntax></syntax>
  <syntax>;</syntax>
  <break indent="4"/>
  <block blockref="0">
    <syntax></syntax>
    <break indent="4"/>
    <statement opref="0x80">
      <funcname color="0x3" opref="0x80">sym.imp.printf</funcname>
      <syntax></syntax>
      <syntax open="130">(</syntax>
      <syntax></syntax>
      <variable color="0x5" varref="0x316" opref="0xf6">&quot;IOLI Crackme Level 0x05\n&quot;</variable>
      <syntax></syntax>
      <syntax close="130">)</syntax>
    </statement>
    <syntax></syntax>
    <syntax>;</syntax>
    <break indent="4"/>
    <statement opref="0x85">
      <funcname color="0x3" opref="0x85">sym.imp.printf</funcname>
      <syntax></syntax>
      <syntax open="133">(</syntax>
      <syntax></syntax>
      <variable color="0x5" varref="0x317" opref="0xf7">&quot;Password: &quot;</variable>
      <syntax></syntax>
      <syntax close="133">)</syntax>
    </statement>
    <syntax></syntax>
    <syntax>;</syntax>
    <break indent="4"/>
    <statement opref="0x8f">
      <funcname color="0x3" opref="0x8f">sym.imp.scanf</funcname>
      <syntax></syntax>
      <syntax open="136">(</syntax>
      <syntax></syntax>
      <variable color="0x5" varref="0x30b" opref="0x8f">0x80486b2</variable>
      <syntax></syntax>
      <op opref="0x8f">, </op>
      <syntax></syntax>
      <op opref="0xf8">&amp;</op>
      <syntax></syntax>
      <variable color="0x4" opref="0xf8">var_78h</variable>
      <syntax></syntax>
      <syntax close="136">)</syntax>
    </statement>
    <syntax></syntax>
    <syntax>;</syntax>
    <break indent="4"/>
    <statement opref="0x96">
      <funcname color="0x3" opref="0x96">sym.check</funcname>
      <syntax></syntax>
      <syntax open="141">(</syntax>
      <syntax></syntax>
      <op opref="0xf9">&amp;</op>
      <syntax></syntax>
      <variable color="0x4" opref="0xf9">var_78h</variable>
      <syntax></syntax>
      <syntax close="141">)</syntax>
    </statement>
    <syntax></syntax>
    <syntax>;</syntax>
    <break indent="4"/>
    <statement opref="0x9d">
      <op color="0x0" opref="0x9d">return</op>
      <syntax> </syntax>
      <variable color="0x5" varref="0x1a3" opref="0x97">0</variable>
    </statement>
    <syntax></syntax>
    <syntax>;</syntax>
  </block>
  <break indent="0"/>
  <syntax>}</syntax>
  <break indent="0"/>
  <syntax></syntax>
</function></code></result>
--
<save_state loadersymbols="false">
  <typegrp/>
  <db>
    <property_changepoint space="register" offset="0x1100" val="0x20000000"/>
    <property_changepoint space="register" offset="0x110a" val="0x0"/>
    <property_changepoint space="register" offset="0x1110" val="0x20000000"/>
    <property_changepoint space="register" offset="0x111a" val="0x0"/>
    <property_changepoint space="register" offset="0x1120" val="0x20000000"/>
    <property_changepoint space="register" offset="0x112a" val="0x0"/>
    <property_changepoint space="register" offset="0x1130" val="0x20000000"/>
    <property_changepoint space="register" offset="0x113a" val="0x0"/>
    <property_changepoint space="register" offset="0x1140" val="0x20000000"/>
    <property_changepoint space="register" offset="0x114a" val="0x0"/>
    <property_changepoint space="register" offset="0x1150" val="0x20000000"/>
    <property_changepoint space="register" offset="0x115a" val="0x0"/>
    <property_changepoint space="register" offset="0x1160" val="0x20000000"/>
    <property_changepoint space="register" offset="0x116a" val="0x0"/>
    <property_changepoint space="register" offset="0x1170" val="0x20000000"/>
    <property_changepoint space="register" offset="0x117a" val="0x0"/>
      <rangelist/>
      <symbollist>
        <mapsym>
            <addr space="ram" offset="0x8048540"/>
            <localdb main="stack" lock="false">
                <rangelist>
                  <range space="stack" first="0x4" last="0x1f7"/>
                  <range space="stack" first="0xfff0bdc0" last="0xffffff5f"/>
                  <range space="stack" first="0xffffff68" last="0xfffffffb"/>
                </rangelist>
                <symbollist>
                  <mapsym>
                    </symbol>
                    <addr space="stack" offset="0x4"/>
                    <rangelist>
                      <range space="ram" first="0x804853f" last="0x804853f"/>
                    </rangelist>
                  </mapsym>
                  <mapsym>
                      <type name="" size="4" metatype="ptr" core="true">
                        <type name="" size="4" metatype="ptr" core="true">
                        </type>
                      </type>
                    </symbol>
                    <addr space="stack" offset="0x8"/>
                    <rangelist>
                      <range space="ram" first="0x804853f" last="0x804853f"/>
                    </rangelist>
                  </mapsym>
                  <mapsym>
                      <type name="" size="4" metatype="ptr" core="true">
                        <type name="" size="4" metatype="ptr" core="true">
                        </type>
                      </type>
                    </symbol>
                    <addr space="stack" offset="0xc"/>
                    <rangelist>
                      <range space="ram" first="0x804853f" last="0x804853f"/>
                    </rangelist>
                  </mapsym>
                  <mapsym>
                    </symbol>
                    <addr space="stack" offset="0xffffff84"/>
                    <rangelist/>
                  </mapsym>
                </symbollist>
              </scope>
            </localdb>
            <prototype model="__cdecl" extrapop="4" modellock="true">
              <returnsym>
                <addr space="register" offset="0x0" size="4"/>
              </returnsym>
            </prototype>
          </function>
          <addr space="ram" offset="0x8048540"/>
          <rangelist/>
        </mapsym>
        <mapsym>
            <type name="" size="25" metatype="array" arraysize="25">
            </type>
          </symbol>
          <addr space="ram" offset="0x804868e"/>
          <rangelist/>
        </mapsym>
        <mapsym>
            <type name="" size="11" metatype="array" arraysize="11">
            </type>
          </symbol>
          <addr space="ram" offset="0x80486a7"/>
          <rangelist/>
        </mapsym>
        <mapsym>
            <addr space="ram" offset="0x80484c8"/>
            <localdb main="stack" lock="false">
                <rangelist>
                  <range space="stack" first="0x4" last="0x1f7"/>
                  <range space="stack" first="0xfff0bdc0" last="0xffffffff"/>
                </rangelist>
                <symbollist>
                  <mapsym>
                    </symbol>
                    <addr space="stack" offset="0x4"/>
                    <rangelist/>
                  </mapsym>
                  <mapsym>
                    </symbol>
                    <addr space="stack" offset="0xfffffff4"/>
                    <rangelist/>
                  </mapsym>
                  <mapsym>
                    </symbol>
                    <addr space="stack" offset="0xfffffff0"/>
                    <rangelist/>
                  </mapsym>
                </symbollist>
              </scope>
            </localdb>
            <prototype model="__cdecl" extrapop="4" modellock="true">
              <returnsym>
                <addr space="stack" offset="0x0" size="4"/>
              </returnsym>
            </prototype>
          </function>
          <addr space="ram" offset="0x80484c8"/>
          <rangelist/>
        </mapsym>
        <mapsym>
            <addr space="ram" offset="0x8048394"/>
            <localdb main="stack" lock="false">
                <rangelist>
                  <range space="stack" first="0x4" last="0x1f7"/>
                  <range space="stack" first="0xfff0bdc0" last="0xffffffff"/>
                </rangelist>
                <symbollist>
                  <mapsym>
                      <type name="" size="4" metatype="ptr" core="true">
                      </type>
                    </symbol>
                    <addr space="stack" offset="0x4"/>
                    <rangelist>
                      <range space="ram" first="0x8048393" last="0x8048393"/>
                    </rangelist>
                  </mapsym>
                </symbollist>
              </scope>
            </localdb>
            <prototype model="__cdecl" extrapop="4" modellock="true">
              <returnsym>
                <addr space="stack" offset="0x0" size="4"/>
              </returnsym>
            </prototype>
          </function>
          <addr space="ram" offset="0x8048394"/>
          <rangelist/>
        </mapsym>
        <mapsym>
            <addr space="ram" offset="0x8048374"/>
            <localdb main="stack" lock="false">
                <rangelist>
                  <range space="stack" first="0x4" last="0x1f7"/>
                  <range space="stack" first="0xfff0bdc0" last="0xffffffff"/>
                </rangelist>
                <symbollist>
                  <mapsym>
                    </symbol>
                    <addr space="stack" offset="0x8"/>
                    <rangelist>
                      <range space="ram" first="0x8048373" last="0x8048373"/>
                    </rangelist>
                  </mapsym>
                  <mapsym>
                      <type name="" size="4" metatype="ptr" core="true">
                      </type>
                    </symbol>
                    <addr space="stack" offset="0x4"/>
                    <rangelist>
                      <range space="ram" first="0x8048373" last="0x8048373"/>
                    </rangelist>
                  </mapsym>
                </symbollist>
              </scope>
            </localdb>
            <prototype model="__cdecl" extrapop="4" modellock="true">
              <returnsym>
                <addr space="stack" offset="0x0" size="4"/>
              </returnsym>
            </prototype>
          </function>
          <addr space="ram" offset="0x8048374"/>
          <rangelist/>
        </mapsym>
      </symbollist>
    </scope>
  </db>
  <context_points>
    <context_pointset space="ram" offset="0x0">
      <set name="addrsize" val="0x1"/>
      <set name="bit64" val="0x0"/>
      <set name="evexAAA" val="0x0"/>
      <set name="evexB" val="0x0"/>
      <set name="evexBType" val="0x0"/>
      <set name="evexD8Type" val="0x0"/>
      <set name="evexDisp8" val="0x0"/>
      <set name="evexL" val="0x0"/>
      <set name="evexLp" val="0x0"/>
      <set name="evexRp" val="0x0"/>
      <set name="evexTType" val="0x0"/>
      <set name="evexV5" val="0x0"/>
      <set name="evexVp" val="0x0"/>
      <set name="evexZ" val="0x0"/>
      <set name="highseg" val="0x0"/>
      <set name="instrPhase" val="0x0"/>
      <set name="lockprefx" val="0x0"/>
      <set name="mandover" val="0x0"/>
      <set name="opsize" val="0x1"/>
      <set name="prefix_66" val="0x0"/>
      <set name="prefix_f2" val="0x0"/>
      <set name="prefix_f3" val="0x0"/>
      <set name="repneprefx" val="0x0"/>
      <set name="repprefx" val="0x0"/>
      <set name="reserved" val="0x0"/>
      <set name="reservedHigh" val="0x0"/>
      <set name="rexBprefix" val="0x0"/>
      <set name="rexRprefix" val="0x0"/>
      <set name="rexWRXBprefix" val="0x0"/>
      <set name="rexWprefix" val="0x0"/>
      <set name="rexXprefix" val="0x0"/>
      <set name="rexprefix" val="0x0"/>
      <set name="segover" val="0x0"/>
      <set name="suffix3D" val="0x0"/>
      <set name="vexHighV" val="0x0"/>
      <set name="vexL" val="0x0"/>
      <set name="vexMMMMM" val="0x0"/>
      <set name="vexMode" val="0x0"/>
      <set name="vexVVVV" val="0x0"/>
      <set name="vexVVVV_r64" val="0x0"/>
      <set name="xacquireprefx" val="0x0"/>
      <set name="xreleaseprefx" val="0x0"/>
    </context_pointset>
    <context_pointset space="register" offset="0x0">
      <set name="addrsize" val="0x0"/>
      <set name="bit64" val="0x0"/>
      <set name="evexAAA" val="0x0"/>
      <set name="evexB" val="0x0"/>
      <set name="evexBType" val="0x0"/>
      <set name="evexD8Type" val="0x0"/>
      <set name="evexDisp8" val="0x0"/>
      <set name="evexL" val="0x0"/>
      <set name="evexLp" val="0x0"/>
      <set name="evexRp" val="0x0"/>
      <set name="evexTType" val="0x0"/>
      <set name="evexV5" val="0x0"/>
      <set name="evexVp" val="0x0"/>
      <set name="evexZ" val="0x0"/>
      <set name="highseg" val="0x0"/>
      <set name="instrPhase" val="0x0"/>
      <set name="lockprefx" val="0x0"/>
      <set name="mandover" val="0x0"/>
      <set name="opsize" val="0x0"/>
      <set name="prefix_66" val="0x0"/>
      <set name="prefix_f2" val="0x0"/>
      <set name="prefix_f3" val="0x0"/>
      <set name="repneprefx" val="0x0"/>
      <set name="repprefx" val="0x0"/>
      <set name="reserved" val="0x0"/>
      <set name="reservedHigh" val="0x0"/>
      <set name="rexBprefix" val="0x0"/>
      <set name="rexRprefix" val="0x0"/>
      <set name="rexWRXBprefix" val="0x0"/>
      <set name="rexWprefix" val="0x0"/>
      <set name="rexXprefix" val="0x0"/>
      <set name="rexprefix" val="0x0"/>
      <set name="segover" val="0x0"/>
      <set name="suffix3D" val="0x0"/>
      <set name="vexHighV" val="0x0"/>
      <set name="vexL" val="0x0"/>
      <set name="vexMMMMM" val="0x0"/>
      <set name="vexMode" val="0x0"/>
      <set name="vexVVVV" val="0x0"/>
      <set name="vexVVVV_r64" val="0x0"/>
      <set name="xacquireprefx" val="0x0"/>
      <set name="xreleaseprefx" val="0x0"/>
    </context_pointset>
    <tracked_pointset space="ram" offset="0x0">
      <set space="register" offset="0x20a" size="1" val="0x0"/>
    </tracked_pointset>
  </context_points>
  <commentdb/>
  <stringmanage>
    <string>
      <addr space="ram" offset="0x804868e"/>
      <bytes trunc="false">
494f4c4920437261636b6d65204c6576656c2030
  7830350a0050617373776f72
</bytes>
      <string>
        <addr space="ram" offset="0x80486a7"/>
        <bytes trunc="false">
50617373776f72643a2000257300000000000000
  00ffffffffffffffffffffff
</bytes>
      </stringmanage>
    </save_state>
EOF
CMDS=<<EOF
s main
af
e scr.color=0
pdg
?e --
pdgo
?e --
pdg*
?e --
pdgx~!id=,<addr
?e --
pdgd~!id=,protectedMode
# ?e --
# e scr.color=3 - XXX: Make colors work on tests
# pdg
# ?e --
# pdgo
EOF
RUN

NAME=pdgo align
FILE=bins/elf/hello_world
ARGS=-B 0x1000000000000000
EXPECT=<<EOF
                          |
    0x10000000000007aa    |void main(int argc,char **argv,char **envp)
                          |
                          |{
                          |    int iVar1;
                          |    int iVar2;
                          |    char *dest;
                          |    int64_t var_20h;
                          |    int64_t var_18h;
                          |    int64_t var_10h;
                          |    int64_t var_8h;
                          |    
    0x10000000000007cf    |    iVar1 = sym.imp.strlen("Hello");
    0x10000000000007de    |    iVar2 = sym.imp.strlen(" r2-folks");
    0x10000000000007f6    |    dest = sym.imp.malloc(iVar2 + iVar1 + 1);
    0x1000000000000804    |    if (dest != NULL) {
    0x1000000000000814    |        sym.imp.strcpy(dest,"Hello");
    0x1000000000000827    |        sym.imp.strcat(dest," r2-folks");
    0x1000000000000833    |        sym.imp.puts(dest);
    0x100000000000083f    |        sym.imp.free(dest);
                          |    }
    0x1000000000000846    |    return;
                          |}
                          |
EOF
CMDS=<<EOF
s main
af
pdgo
EOF
RUN

NAME=pdgs
FILE=-
EXPECT=<<EOF
6502:LE:16:default
65C02:LE:16:default
80251:BE:24:default
80390:BE:24:default
8051:BE:16:default
8051:BE:24:mx51
AARCH64:BE:32:ilp32
AARCH64:BE:64:v8A
AARCH64:LE:32:ilp32
AARCH64:LE:64:AppleSilicon
AARCH64:LE:64:v8A
ARM:BE:32:Cortex
ARM:BE:32:v4
ARM:BE:32:v4t
ARM:BE:32:v5
ARM:BE:32:v5t
ARM:BE:32:v6
ARM:BE:32:v7
ARM:BE:32:v8
ARM:BE:32:v8-m
ARM:BE:32:v8T
ARM:LE:32:Cortex
ARM:LE:32:v4
ARM:LE:32:v4t
ARM:LE:32:v5
ARM:LE:32:v5t
ARM:LE:32:v6
ARM:LE:32:v7
ARM:LE:32:v8
ARM:LE:32:v8-m
ARM:LE:32:v8T
ARM:LEBE:32:v7LEInstruction
ARM:LEBE:32:v8LEInstruction
BPF:LE:32:default
DATA:BE:64:default
DATA:LE:64:default
JVM:BE:32:default
MCS96:LE:16:default
MIPS:BE:32:R6
MIPS:BE:32:default
MIPS:BE:32:micro
MIPS:BE:64:64-32R6addr
MIPS:BE:64:64-32addr
MIPS:BE:64:R6
MIPS:BE:64:default
MIPS:BE:64:micro
MIPS:BE:64:micro64-32addr
MIPS:LE:32:R6
MIPS:LE:32:default
MIPS:LE:32:micro
MIPS:LE:64:64-32R6addr
MIPS:LE:64:64-32addr
MIPS:LE:64:R6
MIPS:LE:64:default
MIPS:LE:64:micro
MIPS:LE:64:micro64-32addr
PowerPC:BE:32:4xx
PowerPC:BE:32:MPC8270
PowerPC:BE:32:QUICC
PowerPC:BE:32:default
PowerPC:BE:32:e500
PowerPC:BE:32:e500mc
PowerPC:BE:64:64-32addr
PowerPC:BE:64:A2-32addr
PowerPC:BE:64:A2ALT
PowerPC:BE:64:A2ALT-32addr
PowerPC:BE:64:VLE-32addr
PowerPC:BE:64:VLEALT-32addr
PowerPC:BE:64:default
PowerPC:LE:32:4xx
PowerPC:LE:32:QUICC
PowerPC:LE:32:default
PowerPC:LE:32:e500
PowerPC:LE:32:e500mc
PowerPC:LE:64:64-32addr
PowerPC:LE:64:A2-32addr
PowerPC:LE:64:A2ALT
PowerPC:LE:64:A2ALT-32addr
PowerPC:LE:64:default
RISCV:LE:32:RV32G
RISCV:LE:32:RV32GC
RISCV:LE:32:RV32I
RISCV:LE:32:RV32IC
RISCV:LE:32:RV32IMC
RISCV:LE:32:default
RISCV:LE:64:RV64G
RISCV:LE:64:RV64GC
RISCV:LE:64:RV64I
RISCV:LE:64:RV64IC
RISCV:LE:64:default
STM8:BE:16:default
STM8:BE:24:default
SuperH:BE:32:SH-1
SuperH:BE:32:SH-2
SuperH:BE:32:SH-2A
TI_MSP430:LE:16:default
TI_MSP430X:LE:32:default
V850:LE:32:default
Xtensa:BE:32:default
Xtensa:LE:32:default
avr32:BE:32:default
avr8:LE:16:atmega256
avr8:LE:16:default
avr8:LE:16:extended
avr8:LE:24:xmega
eBPF:BE:64:default
eBPF:LE:64:default
hexagon:LE:32:default
sBPF:LE:64:default
sparc:BE:32:default
sparc:BE:64:default
tricore:LE:32:default
tricore:LE:32:tc172x
tricore:LE:32:tc176x
tricore:LE:32:tc29x
x86:LE:16:Protected Mode
x86:LE:16:Real Mode
x86:LE:32:System Management Mode
x86:LE:32:default
x86:LE:64:compat32
x86:LE:64:default
z180:LE:16:default
z182:LE:16:default
z80:LE:16:default
z8401x:LE:16:default
EOF
CMDS=<<EOF
pdgs
EOF
RUN

NAME=pdgsd
FILE=bins/elf/crackme0x05
EXPECT=<<EOF
push ebp
mov ebp, esp
sub esp, 0x88
and esp, 0xfffffff0
mov eax, 0
add eax, 0xf
add eax, 0xf
shr eax, 4
-----
0x08048540: PUSH EBP
    (unique,0x20a80,4) = COPY EBP
    ESP = INT_SUB ESP, 0x4
0x08048541: MOV EBP,ESP
    EBP = COPY ESP
0x08048543: SUB ESP,0x88
    CF = INT_LESS ESP, 0x88
    OF = INT_SBORROW ESP, 0x88
    ESP = INT_SUB ESP, 0x88
    SF = INT_SLESS ESP, 0x0
    ZF = INT_EQUAL ESP, 0x0
    (unique,0x24c00,4) = INT_AND ESP, 0xff
    (unique,0x24c80,1) = POPCOUNT (unique,0x24c00,4)
    (unique,0x24d00,1) = INT_AND (unique,0x24c80,1), 0x1
    PF = INT_EQUAL (unique,0x24d00,1), 0x0
0x08048549: AND ESP,0xfffffff0
    CF = COPY 0x0
    OF = COPY 0x0
    ESP = INT_AND ESP, 0xfffffff0
    SF = INT_SLESS ESP, 0x0
    ZF = INT_EQUAL ESP, 0x0
    (unique,0x24c00,4) = INT_AND ESP, 0xff
    (unique,0x24c80,1) = POPCOUNT (unique,0x24c00,4)
    (unique,0x24d00,1) = INT_AND (unique,0x24c80,1), 0x1
    PF = INT_EQUAL (unique,0x24d00,1), 0x0
0x0804854c: MOV EAX,0x0
    EAX = COPY 0x0
0x08048551: ADD EAX,0xf
    CF = INT_CARRY EAX, 0xf
    OF = INT_SCARRY EAX, 0xf
    EAX = INT_ADD EAX, 0xf
    SF = INT_SLESS EAX, 0x0
    ZF = INT_EQUAL EAX, 0x0
    (unique,0x24c00,4) = INT_AND EAX, 0xff
    (unique,0x24c80,1) = POPCOUNT (unique,0x24c00,4)
    (unique,0x24d00,1) = INT_AND (unique,0x24c80,1), 0x1
    PF = INT_EQUAL (unique,0x24d00,1), 0x0
0x08048554: ADD EAX,0xf
    CF = INT_CARRY EAX, 0xf
    OF = INT_SCARRY EAX, 0xf
    EAX = INT_ADD EAX, 0xf
    SF = INT_SLESS EAX, 0x0
    ZF = INT_EQUAL EAX, 0x0
    (unique,0x24c00,4) = INT_AND EAX, 0xff
    (unique,0x24c80,1) = POPCOUNT (unique,0x24c00,4)
    (unique,0x24d00,1) = INT_AND (unique,0x24c80,1), 0x1
    PF = INT_EQUAL (unique,0x24d00,1), 0x0
0x08048557: SHR EAX,0x4
    (unique,0x55c80,4) = INT_AND 0x4, 0x1f
    (unique,0x55d00,4) = COPY EAX
    EAX = INT_RIGHT EAX, (unique,0x55c80,4)
    (unique,0x28100,1) = INT_NOTEQUAL (unique,0x55c80,4), 0x0
    (unique,0x28180,4) = INT_SUB (unique,0x55c80,4), 0x1
    (unique,0x28200,4) = INT_RIGHT (unique,0x55d00,4), (unique,0x28180,4)
    (unique,0x28280,4) = INT_AND (unique,0x28200,4), 0x1
    (unique,0x28380,1) = INT_NOTEQUAL (unique,0x28280,4), 0x0
    (unique,0x28400,1) = BOOL_NEGATE (unique,0x28100,1)
    (unique,0x28480,1) = INT_AND (unique,0x28400,1), CF
    (unique,0x28500,1) = INT_AND (unique,0x28100,1), (unique,0x28380,1)
    CF = INT_OR (unique,0x28480,1), (unique,0x28500,1)
    (unique,0x28680,1) = INT_EQUAL (unique,0x55c80,4), 0x1
    (unique,0x28780,1) = INT_SLESS (unique,0x55d00,4), 0x0
    (unique,0x28800,1) = BOOL_NEGATE (unique,0x28680,1)
    (unique,0x28880,1) = INT_AND (unique,0x28800,1), OF
    (unique,0x28900,1) = INT_AND (unique,0x28680,1), (unique,0x28780,1)
    OF = INT_OR (unique,0x28880,1), (unique,0x28900,1)
    (unique,0x24e80,1) = INT_NOTEQUAL (unique,0x55c80,4), 0x0
    (unique,0x24f80,1) = INT_SLESS EAX, 0x0
    (unique,0x25000,1) = BOOL_NEGATE (unique,0x24e80,1)
    (unique,0x25080,1) = INT_AND (unique,0x25000,1), SF
    (unique,0x25100,1) = INT_AND (unique,0x24e80,1), (unique,0x24f80,1)
    SF = INT_OR (unique,0x25080,1), (unique,0x25100,1)
    (unique,0x25280,1) = INT_EQUAL EAX, 0x0
    (unique,0x25300,1) = BOOL_NEGATE (unique,0x24e80,1)
    (unique,0x25380,1) = INT_AND (unique,0x25300,1), ZF
    (unique,0x25400,1) = INT_AND (unique,0x24e80,1), (unique,0x25280,1)
    ZF = INT_OR (unique,0x25380,1), (unique,0x25400,1)
    (unique,0x25500,4) = INT_AND EAX, 0xff
    (unique,0x25580,1) = POPCOUNT (unique,0x25500,4)
    (unique,0x25600,1) = INT_AND (unique,0x25580,1), 0x1
    (unique,0x25700,1) = INT_EQUAL (unique,0x25600,1), 0x0
    (unique,0x25780,1) = BOOL_NEGATE (unique,0x24e80,1)
    (unique,0x25800,1) = INT_AND (unique,0x25780,1), PF
    (unique,0x25880,1) = INT_AND (unique,0x24e80,1), (unique,0x25700,1)
    PF = INT_OR (unique,0x25800,1), (unique,0x25880,1)
EOF
CMDS=<<EOF
s main
pi 8
?e -----
pdgsd 8~!STORE
EOF
RUN

NAME=comments
FILE=bins/elf/crackme0x05
EXPECT=<<EOF

uint main(int argc,char **argv,char **envp)

{
    int32_t var_78h;
    
    //main starts here
    //printf call here
    sym.imp.printf("IOLI Crackme Level 0x05\n");
    sym.imp.printf("Password: ");
    //scanf call here
    sym.imp.scanf(0x80486b2,&var_78h);
    sym.check(&var_78h);
    //main returns here
    return 0;
}

EOF
CMDS=<<EOF
CCu base64:bWFpbiBzdGFydHMgaGVyZQ== @ 0x08048540
CCu base64:cHJpbnRmIGNhbGwgaGVyZQ== @ 0x08048566
CCu base64:bWFpbiByZXR1cm5zIGhlcmU= @ 0x0804859b
CCu base64:bm90aGluZyB0byBzZWUgaGVyZQ== @ 0x0804859c
CCu base64:c2NhbmYgY2FsbCBoZXJl @ 0x08048585
s main
af
pdg
EOF
RUN

NAME=comment-function_name-offset
FILE=bins/elf/crackme0x05
EXPECT=<<EOF
                  |
    0x08048540    |uint main(int argc,char **argv,char **envp)
                  |
                  |{
                  |    int32_t var_78h;
                  |    
    0x08048540    |    //main starts here
    0x08048566    |    //printf call here
    0x08048566    |    sym.imp.printf("IOLI Crackme Level 0x05\n");
    0x08048572    |    sym.imp.printf("Password: ");
    0x08048585    |    //scanf call here
    0x08048585    |    sym.imp.scanf(0x80486b2,&var_78h);
    0x08048590    |    sym.check(&var_78h);
    0x0804859b    |    //main returns here
    0x0804859b    |    return 0;
                  |}
                  |
EOF
CMDS=<<EOF
CCu base64:bWFpbiBzdGFydHMgaGVyZQ== @ 0x08048540
CCu base64:cHJpbnRmIGNhbGwgaGVyZQ== @ 0x08048566
CCu base64:bWFpbiByZXR1cm5zIGhlcmU= @ 0x0804859b
CCu base64:bm90aGluZyB0byBzZWUgaGVyZQ== @ 0x0804859c
CCu base64:c2NhbmYgY2FsbCBoZXJl @ 0x08048585
s main
af
pdgo
EOF
RUN

NAME=recursive type
FILE=bins/rec
CMDS=<<EOF
to bins/types_rec.h
aaa
s sym.KillList
afvt arg1 LL
afvt ptr LL
pdg
EOF
EXPECT=<<EOF

void sym.KillList(LL arg1)

{
    LinkedList LVar1;
    LL ptr;
    int64_t var_8h;
    
    ptr = arg1;
    while (ptr != NULL) {
        LVar1 = ptr[1];
        sym.imp.free(ptr);
        ptr = LVar1;
    }
    return;
}

EOF
RUN
