
void bigdivmod(Bignum_conflict p,Bignum_conflict mod,Bignum_conflict result,Bignum_conflict quotient
              )

{
  BignumInt *m;
  int iVar1;
  BignumInt *pBVar2;
  BignumInt *pBVar3;
  BignumInt BVar4;
  BignumInt d;
  BignumInt *pBVar5;
  int iVar6;
  BignumInt BVar7;
  BignumInt mlen;
  uint rshift;
  
  mlen = *mod;
  if (mod[mlen] == 0) {
    (*(code *)PTR___assert_fail_000adb00)
              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328);
    return;
  }
  m = (BignumInt *)(*(code *)PTR_safemalloc_000ad414)(mlen,4);
  if (0 < (int)mlen) {
    BVar4 = 0;
    pBVar2 = m;
    do {
      iVar1 = *mod - BVar4;
      BVar4 = BVar4 + 1;
      *pBVar2 = mod[iVar1];
      pBVar2 = pBVar2 + 1;
    } while (mlen != BVar4);
  }
  BVar4 = *p;
  if ((int)BVar4 <= (int)mlen) {
    BVar4 = mlen + 1;
  }
  pBVar2 = (BignumInt *)(*(code *)PTR_safemalloc_000ad414)(BVar4,4);
  if (0 < (int)BVar4) {
    pBVar3 = pBVar2;
    do {
      *pBVar3 = 0;
      pBVar3 = pBVar3 + 1;
    } while (pBVar3 != pBVar2 + BVar4);
  }
  if (0 < (int)*p) {
    pBVar5 = p + 1;
    pBVar3 = pBVar2 + BVar4;
    iVar1 = 1;
    do {
      pBVar3 = pBVar3 + -1;
      iVar1 = iVar1 + 1;
      *pBVar3 = *pBVar5;
      pBVar5 = pBVar5 + 1;
    } while (iVar1 <= (int)*p);
  }
  d = *m;
  iVar6 = 5;
  rshift = 0;
  iVar1 = 0x10;
  BVar7 = d;
  do {
    if (BVar7 >> (0x20U - iVar1 & 0x1f) == 0) {
      BVar7 = BVar7 << iVar1;
      rshift = rshift + iVar1;
    }
    iVar6 = iVar6 + -1;
    iVar1 = iVar1 >> 1;
  } while (iVar6 != 0);
  if ((rshift != 0) && (d = d << (rshift & 0x1f), 1 < (int)mlen)) {
    d = d | m[1] >> (-rshift & 0x1f);
  }
  BVar7 = reciprocal_word(d);
  internal_mod(pBVar2,BVar4,m,mlen,quotient,BVar7,rshift);
  if ((result != (Bignum_conflict)0x0) && (0 < (int)*result)) {
    iVar1 = BVar4 - 1;
    pBVar3 = result + 1;
    do {
      while (-1 < iVar1) {
        iVar6 = iVar1 + -1;
        *pBVar3 = pBVar2[iVar1];
        iVar1 = iVar6;
        pBVar3 = pBVar3 + 1;
        if ((int)*result < (int)(BVar4 - iVar6)) goto LAB_0004ee3c;
      }
      iVar1 = iVar1 + -1;
      *pBVar3 = 0;
      pBVar3 = pBVar3 + 1;
    } while ((int)(BVar4 - iVar1) <= (int)*result);
  }
LAB_0004ee3c:
  (*(code *)PTR_smemclr_000ad430)(m,mlen * 4);
  (*(code *)PTR_safefree_000ad380)(m);
  (*(code *)PTR_smemclr_000ad430)(pBVar2,BVar4 << 2);
  (*(code *)PTR_safefree_000ad380)(pBVar2);
  return;
}



void FUN_0004ec24(int *param_1,int *param_2,int *param_3,undefined4 param_4)

{
  uint *puVar1;
  int iVar2;
  undefined4 *puVar3;
  undefined4 *puVar4;
  undefined4 uVar5;
  int iVar6;
  int *piVar7;
  uint *puVar8;
  uint uVar9;
  int *piVar10;
  int iVar11;
  uint uVar12;
  int iVar13;
  uint uVar14;
  
  iVar13 = *param_2;
  if (param_2[iVar13] == 0) {
    (*(code *)PTR___assert_fail_000adb00)
              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328);
    return;
  }
  puVar1 = (uint *)(*(code *)PTR_safemalloc_000ad414)(iVar13,4);
  if (0 < iVar13) {
    iVar6 = 0;
    puVar8 = puVar1;
    do {
      iVar2 = *param_2 - iVar6;
      iVar6 = iVar6 + 1;
      *puVar8 = param_2[iVar2];
      puVar8 = puVar8 + 1;
    } while (iVar13 != iVar6);
  }
  iVar6 = *param_1;
  if (iVar6 <= iVar13) {
    iVar6 = iVar13 + 1;
  }
  puVar3 = (undefined4 *)(*(code *)PTR_safemalloc_000ad414)(iVar6,4);
  if (0 < iVar6) {
    puVar4 = puVar3;
    do {
      *puVar4 = 0;
      puVar4 = puVar4 + 1;
    } while (puVar4 != puVar3 + iVar6);
  }
  if (0 < *param_1) {
    piVar10 = param_1 + 1;
    piVar7 = puVar3 + iVar6;
    iVar2 = 1;
    do {
      piVar7 = piVar7 + -1;
      iVar2 = iVar2 + 1;
      *piVar7 = *piVar10;
      piVar10 = piVar10 + 1;
    } while (iVar2 <= *param_1);
  }
  uVar9 = *puVar1;
  iVar11 = 5;
  uVar14 = 0;
  iVar2 = 0x10;
  uVar12 = uVar9;
  do {
    if (uVar12 >> (0x20U - iVar2 & 0x1f) == 0) {
      uVar12 = uVar12 << iVar2;
      uVar14 = uVar14 + iVar2;
    }
    iVar11 = iVar11 + -1;
    iVar2 = iVar2 >> 1;
  } while (iVar11 != 0);
  if ((uVar14 != 0) && (uVar9 = uVar9 << (uVar14 & 0x1f), 1 < iVar13)) {
    uVar9 = uVar9 | puVar1[1] >> (-uVar14 & 0x1f);
  }
  uVar5 = FUN_0004e5b0(uVar9);
  FUN_0004e858(puVar3,iVar6,puVar1,iVar13,param_4,uVar5,uVar14);
  if ((param_3 != (int *)0x0) && (0 < *param_3)) {
    iVar2 = iVar6 + -1;
    piVar7 = param_3 + 1;
    do {
      while (-1 < iVar2) {
        iVar11 = iVar2 + -1;
        *piVar7 = puVar3[iVar2];
        iVar2 = iVar11;
        piVar7 = piVar7 + 1;
        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;
      }
      iVar2 = iVar2 + -1;
      *piVar7 = 0;
      piVar7 = piVar7 + 1;
    } while (iVar6 - iVar2 <= *param_3);
  }
LAB_0004ee3c:
  (*(code *)PTR_smemclr_000ad430)(puVar1,iVar13 * 4);
  (*(code *)PTR_safefree_000ad380)(puVar1);
  (*(code *)PTR_smemclr_000ad430)(puVar3,iVar6 << 2);
  (*(code *)PTR_safefree_000ad380)(puVar3);
  return;
}


lui gp,0x6
addiu gp,gp,0x666c
addu gp,gp,t9
addiu sp,sp,-0x50
sw s4,0x38(sp)
sw s1,0x2c(sp)
lw s4,0x0(a1)
sw gp,0x20(sp)
sw ra,0x4c(sp)
sll s1,s4,0x2
sw s8,0x48(sp)
sw s7,0x44(sp)
addu v0,a1,s1
sw s6,0x40(sp)
sw s5,0x3c(sp)
sw s3,0x34(sp)
sw s2,0x30(sp)
sw s0,0x28(sp)
lw v0,0x0(v0)
beq v0,zero,0x0004eed0
_lw t9,-0x7e7c(gp)
or s3,a1,zero
li a1,0x4
or s6,a0,zero
or a0,s4,zero
or s5,a2,zero
jalr t9
_or s2,a3,zero
lw gp,0x20(sp)
blez s4,0x0004eccc
_or s0,v0,zero
or v1,zero,zero
or a0,v0,zero
lw v0,0x0(s3)
addiu a0,a0,0x4
subu v0,v0,v1
addiu v1,v1,0x1
sll v0,v0,0x2
addu v0,s3,v0
lw v0,0x0(v0)
bne s4,v1,0x0004eca8
_sw v0,-0x4(a0)
lw s3,0x0(s6)
slt v0,s4,s3
beq v0,zero,0x0004eec4
_or s7,s3,zero
lw t9,-0x7e7c(gp)
li a1,0x4
jalr t9
_or a0,s3,zero
lw gp,0x20(sp)
blez s7,0x0004ed10
_or s8,v0,zero
sll v1,s7,0x2
addu v1,v1,v0
sw zero,0x0(v0)
addiu v0,v0,0x4
bne v0,v1,0x0004ed00
_nop
lw v0,0x0(s6)
blez v0,0x0004ed48
_sll v1,s7,0x2
addiu a1,s6,0x4
addu v1,s8,v1
li a0,0x1
lw v0,0x0(a1)
addiu v1,v1,-0x4
addiu a0,a0,0x1
sw v0,0x0(v1)
lw v0,0x0(s6)
slt v0,v0,a0
beq v0,zero,0x0004ed28
_addiu a1,a1,0x4
lw a0,0x0(s0)
li a1,0x5
or s6,zero,zero
li v0,0x10
li a3,0x20
or a2,a0,zero
subu v1,a3,v0
srlv v1,a2,v1
bne v1,zero,0x0004ed78
_nop
sllv a2,a2,v0
addu s6,s6,v0
addiu a1,a1,-0x1
bne a1,zero,0x0004ed60
_sra v0,v0,0x1
bne s6,zero,0x0004eea8
_slti v0,s4,0x2
lw t9,-0x7bc0(gp)
addiu t9,t9,-0x1a50
bal 0x0004e5b0
_nop
or a3,s4,zero
lw gp,0x20(sp)
or a2,s0,zero
sw s6,0x18(sp)
or a1,s7,zero
sw v0,0x14(sp)
or a0,s8,zero
lw t9,-0x7bc0(gp)
addiu t9,t9,-0x17a8
bal 0x0004e858
_sw s2,0x10(sp)
beq s5,zero,0x0004ee38
_lw gp,0x20(sp)
lw v0,0x0(s5)
blez v0,0x0004ee3c
_lw t9,-0x7e60(gp)
addiu v0,s7,-0x1
b 0x0004ee10
_addiu a0,s5,0x4
addiu v0,v0,-0x1
addu v1,s8,v1
subu a1,s7,v0
addiu a0,a0,0x4
lw v1,0x0(v1)
sw v1,-0x4(a0)
lw v1,0x0(s5)
slt v1,v1,a1
bne v1,zero,0x0004ee3c
_lw t9,-0x7e60(gp)
bgez v0,0x0004ede8
_sll v1,v0,0x2
or v1,zero,zero
addiu v0,v0,-0x1
sw v1,0x0(a0)
lw v1,0x0(s5)
subu a1,s7,v0
slt v1,v1,a1
beq v1,zero,0x0004ee10
_addiu a0,a0,0x4
lw t9,-0x7e60(gp)
or a1,s1,zero
jalr t9
_or a0,s0,zero
lw gp,0x20(sp)
lw t9,-0x7f10(gp)
jalr t9
_or a0,s0,zero
sll a1,s3,0x2
lw gp,0x20(sp)
lw t9,-0x7e60(gp)
jalr t9
_or a0,s8,zero
or a0,s8,zero
lw gp,0x20(sp)
lw ra,0x4c(sp)
lw s8,0x48(sp)
lw s7,0x44(sp)
lw s6,0x40(sp)
lw s5,0x3c(sp)
lw s4,0x38(sp)
lw s3,0x34(sp)
lw s2,0x30(sp)
lw s1,0x2c(sp)
lw s0,0x28(sp)
lw t9,-0x7f10(gp)
jr t9
_addiu sp,sp,0x50
bne v0,zero,0x0004ed8c
_sllv a0,a0,s6
lw v0,0x4(s0)
subu v1,zero,s6
srlv v0,v0,v1
b 0x0004ed8c
_or a0,a0,v0
addiu s7,s4,0x1
b 0x0004ecdc
_or s3,s7,zero
lw a3,-0x7fc8(gp)
li a2,0x540
lw a1,-0x7fc8(gp)
lw a0,-0x7fc8(gp)
lw t9,-0x7790(gp)
addiu a3,a3,0x4328
addiu a1,a1,0x41d0
jalr t9
_addiu a0,a0,0x420c
(translation_unit "void FUN_0004ec24(int *param_1,int *param_2,int *param_3,undefined4 param_4)\n\n{\n  uint *puVar1;\n  int iVar2;\n  undefined4 *puVar3;\n  undefined4 *puVar4;\n  undefined4 uVar5;\n  int iVar6;\n  int *piVar7;\n  uint *puVar8;\n  uint uVar9;\n  int *piVar10;\n  int iVar11;\n  uint uVar12;\n  int iVar13;\n  uint uVar14;\n  \n  iVar13 = *param_2;\n  if (param_2[iVar13] == 0) {\n    (*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328);\n    return;\n  }\n  puVar1 = (uint *)(*(code *)PTR_safemalloc_000ad414)(iVar13,4);\n  if (0 < iVar13) {\n    iVar6 = 0;\n    puVar8 = puVar1;\n    do {\n      iVar2 = *param_2 - iVar6;\n      iVar6 = iVar6 + 1;\n      *puVar8 = param_2[iVar2];\n      puVar8 = puVar8 + 1;\n    } while (iVar13 != iVar6);\n  }\n  iVar6 = *param_1;\n  if (iVar6 <= iVar13) {\n    iVar6 = iVar13 + 1;\n  }\n  puVar3 = (undefined4 *)(*(code *)PTR_safemalloc_000ad414)(iVar6,4);\n  if (0 < iVar6) {\n    puVar4 = puVar3;\n    do {\n      *puVar4 = 0;\n      puVar4 = puVar4 + 1;\n    } while (puVar4 != puVar3 + iVar6);\n  }\n  if (0 < *param_1) {\n    piVar10 = param_1 + 1;\n    piVar7 = puVar3 + iVar6;\n    iVar2 = 1;\n    do {\n      piVar7 = piVar7 + -1;\n      iVar2 = iVar2 + 1;\n      *piVar7 = *piVar10;\n      piVar10 = piVar10 + 1;\n    } while (iVar2 <= *param_1);\n  }\n  uVar9 = *puVar1;\n  iVar11 = 5;\n  uVar14 = 0;\n  iVar2 = 0x10;\n  uVar12 = uVar9;\n  do {\n    if (uVar12 >> (0x20U - iVar2 & 0x1f) == 0) {\n      uVar12 = uVar12 << iVar2;\n      uVar14 = uVar14 + iVar2;\n    }\n    iVar11 = iVar11 + -1;\n    iVar2 = iVar2 >> 1;\n  } while (iVar11 != 0);\n  if ((uVar14 != 0) && (uVar9 = uVar9 << (uVar14 & 0x1f), 1 < iVar13)) {\n    uVar9 = uVar9 | puVar1[1] >> (-uVar14 & 0x1f);\n  }\n  uVar5 = FUN_0004e5b0(uVar9);\n  FUN_0004e858(puVar3,iVar6,puVar1,iVar13,param_4,uVar5,uVar14);\n  if ((param_3 != (int *)0x0) && (0 < *param_3)) {\n    iVar2 = iVar6 + -1;\n    piVar7 = param_3 + 1;\n    do {\n      while (-1 < iVar2) {\n        iVar11 = iVar2 + -1;\n        *piVar7 = puVar3[iVar2];\n        iVar2 = iVar11;\n        piVar7 = piVar7 + 1;\n        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;\n      }\n      iVar2 = iVar2 + -1;\n      *piVar7 = 0;\n      piVar7 = piVar7 + 1;\n    } while (iVar6 - iVar2 <= *param_3);\n  }\nLAB_0004ee3c:\n  (*(code *)PTR_smemclr_000ad430)(puVar1,iVar13 * 4);\n  (*(code *)PTR_safefree_000ad380)(puVar1);\n  (*(code *)PTR_smemclr_000ad430)(puVar3,iVar6 << 2);\n  (*(code *)PTR_safefree_000ad380)(puVar3);\n  return;\n}\n\n" (function_definition "void FUN_0004ec24(int *param_1,int *param_2,int *param_3,undefined4 param_4)\n\n{\n  uint *puVar1;\n  int iVar2;\n  undefined4 *puVar3;\n  undefined4 *puVar4;\n  undefined4 uVar5;\n  int iVar6;\n  int *piVar7;\n  uint *puVar8;\n  uint uVar9;\n  int *piVar10;\n  int iVar11;\n  uint uVar12;\n  int iVar13;\n  uint uVar14;\n  \n  iVar13 = *param_2;\n  if (param_2[iVar13] == 0) {\n    (*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328);\n    return;\n  }\n  puVar1 = (uint *)(*(code *)PTR_safemalloc_000ad414)(iVar13,4);\n  if (0 < iVar13) {\n    iVar6 = 0;\n    puVar8 = puVar1;\n    do {\n      iVar2 = *param_2 - iVar6;\n      iVar6 = iVar6 + 1;\n      *puVar8 = param_2[iVar2];\n      puVar8 = puVar8 + 1;\n    } while (iVar13 != iVar6);\n  }\n  iVar6 = *param_1;\n  if (iVar6 <= iVar13) {\n    iVar6 = iVar13 + 1;\n  }\n  puVar3 = (undefined4 *)(*(code *)PTR_safemalloc_000ad414)(iVar6,4);\n  if (0 < iVar6) {\n    puVar4 = puVar3;\n    do {\n      *puVar4 = 0;\n      puVar4 = puVar4 + 1;\n    } while (puVar4 != puVar3 + iVar6);\n  }\n  if (0 < *param_1) {\n    piVar10 = param_1 + 1;\n    piVar7 = puVar3 + iVar6;\n    iVar2 = 1;\n    do {\n      piVar7 = piVar7 + -1;\n      iVar2 = iVar2 + 1;\n      *piVar7 = *piVar10;\n      piVar10 = piVar10 + 1;\n    } while (iVar2 <= *param_1);\n  }\n  uVar9 = *puVar1;\n  iVar11 = 5;\n  uVar14 = 0;\n  iVar2 = 0x10;\n  uVar12 = uVar9;\n  do {\n    if (uVar12 >> (0x20U - iVar2 & 0x1f) == 0) {\n      uVar12 = uVar12 << iVar2;\n      uVar14 = uVar14 + iVar2;\n    }\n    iVar11 = iVar11 + -1;\n    iVar2 = iVar2 >> 1;\n  } while (iVar11 != 0);\n  if ((uVar14 != 0) && (uVar9 = uVar9 << (uVar14 & 0x1f), 1 < iVar13)) {\n    uVar9 = uVar9 | puVar1[1] >> (-uVar14 & 0x1f);\n  }\n  uVar5 = FUN_0004e5b0(uVar9);\n  FUN_0004e858(puVar3,iVar6,puVar1,iVar13,param_4,uVar5,uVar14);\n  if ((param_3 != (int *)0x0) && (0 < *param_3)) {\n    iVar2 = iVar6 + -1;\n    piVar7 = param_3 + 1;\n    do {\n      while (-1 < iVar2) {\n        iVar11 = iVar2 + -1;\n        *piVar7 = puVar3[iVar2];\n        iVar2 = iVar11;\n        piVar7 = piVar7 + 1;\n        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;\n      }\n      iVar2 = iVar2 + -1;\n      *piVar7 = 0;\n      piVar7 = piVar7 + 1;\n    } while (iVar6 - iVar2 <= *param_3);\n  }\nLAB_0004ee3c:\n  (*(code *)PTR_smemclr_000ad430)(puVar1,iVar13 * 4);\n  (*(code *)PTR_safefree_000ad380)(puVar1);\n  (*(code *)PTR_smemclr_000ad430)(puVar3,iVar6 << 2);\n  (*(code *)PTR_safefree_000ad380)(puVar3);\n  return;\n}" primitive_type (function_declarator "FUN_0004ec24(int *param_1,int *param_2,int *param_3,undefined4 param_4)" identifier (parameter_list "(int *param_1,int *param_2,int *param_3,undefined4 param_4)" ( (parameter_declaration "int *param_1" primitive_type (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "int *param_2" primitive_type (pointer_declarator "*param_2" * identifier)) , (parameter_declaration "int *param_3" primitive_type (pointer_declarator "*param_3" * identifier)) , (parameter_declaration "undefined4 param_4" type_identifier identifier) ))) (compound_statement "{\n  uint *puVar1;\n  int iVar2;\n  undefined4 *puVar3;\n  undefined4 *puVar4;\n  undefined4 uVar5;\n  int iVar6;\n  int *piVar7;\n  uint *puVar8;\n  uint uVar9;\n  int *piVar10;\n  int iVar11;\n  uint uVar12;\n  int iVar13;\n  uint uVar14;\n  \n  iVar13 = *param_2;\n  if (param_2[iVar13] == 0) {\n    (*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328);\n    return;\n  }\n  puVar1 = (uint *)(*(code *)PTR_safemalloc_000ad414)(iVar13,4);\n  if (0 < iVar13) {\n    iVar6 = 0;\n    puVar8 = puVar1;\n    do {\n      iVar2 = *param_2 - iVar6;\n      iVar6 = iVar6 + 1;\n      *puVar8 = param_2[iVar2];\n      puVar8 = puVar8 + 1;\n    } while (iVar13 != iVar6);\n  }\n  iVar6 = *param_1;\n  if (iVar6 <= iVar13) {\n    iVar6 = iVar13 + 1;\n  }\n  puVar3 = (undefined4 *)(*(code *)PTR_safemalloc_000ad414)(iVar6,4);\n  if (0 < iVar6) {\n    puVar4 = puVar3;\n    do {\n      *puVar4 = 0;\n      puVar4 = puVar4 + 1;\n    } while (puVar4 != puVar3 + iVar6);\n  }\n  if (0 < *param_1) {\n    piVar10 = param_1 + 1;\n    piVar7 = puVar3 + iVar6;\n    iVar2 = 1;\n    do {\n      piVar7 = piVar7 + -1;\n      iVar2 = iVar2 + 1;\n      *piVar7 = *piVar10;\n      piVar10 = piVar10 + 1;\n    } while (iVar2 <= *param_1);\n  }\n  uVar9 = *puVar1;\n  iVar11 = 5;\n  uVar14 = 0;\n  iVar2 = 0x10;\n  uVar12 = uVar9;\n  do {\n    if (uVar12 >> (0x20U - iVar2 & 0x1f) == 0) {\n      uVar12 = uVar12 << iVar2;\n      uVar14 = uVar14 + iVar2;\n    }\n    iVar11 = iVar11 + -1;\n    iVar2 = iVar2 >> 1;\n  } while (iVar11 != 0);\n  if ((uVar14 != 0) && (uVar9 = uVar9 << (uVar14 & 0x1f), 1 < iVar13)) {\n    uVar9 = uVar9 | puVar1[1] >> (-uVar14 & 0x1f);\n  }\n  uVar5 = FUN_0004e5b0(uVar9);\n  FUN_0004e858(puVar3,iVar6,puVar1,iVar13,param_4,uVar5,uVar14);\n  if ((param_3 != (int *)0x0) && (0 < *param_3)) {\n    iVar2 = iVar6 + -1;\n    piVar7 = param_3 + 1;\n    do {\n      while (-1 < iVar2) {\n        iVar11 = iVar2 + -1;\n        *piVar7 = puVar3[iVar2];\n        iVar2 = iVar11;\n        piVar7 = piVar7 + 1;\n        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;\n      }\n      iVar2 = iVar2 + -1;\n      *piVar7 = 0;\n      piVar7 = piVar7 + 1;\n    } while (iVar6 - iVar2 <= *param_3);\n  }\nLAB_0004ee3c:\n  (*(code *)PTR_smemclr_000ad430)(puVar1,iVar13 * 4);\n  (*(code *)PTR_safefree_000ad380)(puVar1);\n  (*(code *)PTR_smemclr_000ad430)(puVar3,iVar6 << 2);\n  (*(code *)PTR_safefree_000ad380)(puVar3);\n  return;\n}" { (declaration "uint *puVar1;" type_identifier (pointer_declarator "*puVar1" * identifier) ;) (declaration "int iVar2;" primitive_type identifier ;) (declaration "undefined4 *puVar3;" type_identifier (pointer_declarator "*puVar3" * identifier) ;) (declaration "undefined4 *puVar4;" type_identifier (pointer_declarator "*puVar4" * identifier) ;) (declaration "undefined4 uVar5;" type_identifier identifier ;) (declaration "int iVar6;" primitive_type identifier ;) (declaration "int *piVar7;" primitive_type (pointer_declarator "*piVar7" * identifier) ;) (declaration "uint *puVar8;" type_identifier (pointer_declarator "*puVar8" * identifier) ;) (declaration "uint uVar9;" type_identifier identifier ;) (declaration "int *piVar10;" primitive_type (pointer_declarator "*piVar10" * identifier) ;) (declaration "int iVar11;" primitive_type identifier ;) (declaration "uint uVar12;" type_identifier identifier ;) (declaration "int iVar13;" primitive_type identifier ;) (declaration "uint uVar14;" type_identifier identifier ;) (expression_statement "iVar13 = *param_2;" (assignment_expression "iVar13 = *param_2" identifier = (pointer_expression "*param_2" * identifier)) ;) (if_statement "if (param_2[iVar13] == 0) {\n    (*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328);\n    return;\n  }" if (parenthesized_expression "(param_2[iVar13] == 0)" ( (binary_expression "param_2[iVar13] == 0" (subscript_expression "param_2[iVar13]" identifier [ identifier ]) == number_literal) )) (compound_statement "{\n    (*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328);\n    return;\n  }" { (expression_statement "(*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328);" (call_expression "(*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328)" (parenthesized_expression "(*(code *)PTR___assert_fail_000adb00)" ( (pointer_expression "*(code *)PTR___assert_fail_000adb00" * (cast_expression "(code *)PTR___assert_fail_000adb00" ( (type_descriptor "code *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier)) )) (argument_list "(PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328)" ( (binary_expression "PTR_DAT_000ad2c8 + 0x420c" identifier + number_literal) , (binary_expression "PTR_DAT_000ad2c8 + 0x41d0" identifier + number_literal) , number_literal , (binary_expression "PTR_DAT_000ad2c8 + 0x4328" identifier + number_literal) ))) ;) (return_statement "return;" return ;) })) (expression_statement "puVar1 = (uint *)(*(code *)PTR_safemalloc_000ad414)(iVar13,4);" (assignment_expression "puVar1 = (uint *)(*(code *)PTR_safemalloc_000ad414)(iVar13,4)" identifier = (cast_expression "(uint *)(*(code *)PTR_safemalloc_000ad414)(iVar13,4)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (call_expression "(*(code *)PTR_safemalloc_000ad414)(iVar13,4)" (parenthesized_expression "(*(code *)PTR_safemalloc_000ad414)" ( (pointer_expression "*(code *)PTR_safemalloc_000ad414" * (cast_expression "(code *)PTR_safemalloc_000ad414" ( (type_descriptor "code *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier)) )) (argument_list "(iVar13,4)" ( identifier , number_literal ))))) ;) (if_statement "if (0 < iVar13) {\n    iVar6 = 0;\n    puVar8 = puVar1;\n    do {\n      iVar2 = *param_2 - iVar6;\n      iVar6 = iVar6 + 1;\n      *puVar8 = param_2[iVar2];\n      puVar8 = puVar8 + 1;\n    } while (iVar13 != iVar6);\n  }" if (parenthesized_expression "(0 < iVar13)" ( (binary_expression "0 < iVar13" number_literal < identifier) )) (compound_statement "{\n    iVar6 = 0;\n    puVar8 = puVar1;\n    do {\n      iVar2 = *param_2 - iVar6;\n      iVar6 = iVar6 + 1;\n      *puVar8 = param_2[iVar2];\n      puVar8 = puVar8 + 1;\n    } while (iVar13 != iVar6);\n  }" { (expression_statement "iVar6 = 0;" (assignment_expression "iVar6 = 0" identifier = number_literal) ;) (expression_statement "puVar8 = puVar1;" (assignment_expression "puVar8 = puVar1" identifier = identifier) ;) (do_statement "do {\n      iVar2 = *param_2 - iVar6;\n      iVar6 = iVar6 + 1;\n      *puVar8 = param_2[iVar2];\n      puVar8 = puVar8 + 1;\n    } while (iVar13 != iVar6);" do (compound_statement "{\n      iVar2 = *param_2 - iVar6;\n      iVar6 = iVar6 + 1;\n      *puVar8 = param_2[iVar2];\n      puVar8 = puVar8 + 1;\n    }" { (expression_statement "iVar2 = *param_2 - iVar6;" (assignment_expression "iVar2 = *param_2 - iVar6" identifier = (binary_expression "*param_2 - iVar6" (pointer_expression "*param_2" * identifier) - identifier)) ;) (expression_statement "iVar6 = iVar6 + 1;" (assignment_expression "iVar6 = iVar6 + 1" identifier = (binary_expression "iVar6 + 1" identifier + number_literal)) ;) (expression_statement "*puVar8 = param_2[iVar2];" (assignment_expression "*puVar8 = param_2[iVar2]" (pointer_expression "*puVar8" * identifier) = (subscript_expression "param_2[iVar2]" identifier [ identifier ])) ;) (expression_statement "puVar8 = puVar8 + 1;" (assignment_expression "puVar8 = puVar8 + 1" identifier = (binary_expression "puVar8 + 1" identifier + number_literal)) ;) }) while (parenthesized_expression "(iVar13 != iVar6)" ( (binary_expression "iVar13 != iVar6" identifier != identifier) )) ;) })) (expression_statement "iVar6 = *param_1;" (assignment_expression "iVar6 = *param_1" identifier = (pointer_expression "*param_1" * identifier)) ;) (if_statement "if (iVar6 <= iVar13) {\n    iVar6 = iVar13 + 1;\n  }" if (parenthesized_expression "(iVar6 <= iVar13)" ( (binary_expression "iVar6 <= iVar13" identifier <= identifier) )) (compound_statement "{\n    iVar6 = iVar13 + 1;\n  }" { (expression_statement "iVar6 = iVar13 + 1;" (assignment_expression "iVar6 = iVar13 + 1" identifier = (binary_expression "iVar13 + 1" identifier + number_literal)) ;) })) (expression_statement "puVar3 = (undefined4 *)(*(code *)PTR_safemalloc_000ad414)(iVar6,4);" (assignment_expression "puVar3 = (undefined4 *)(*(code *)PTR_safemalloc_000ad414)(iVar6,4)" identifier = (cast_expression "(undefined4 *)(*(code *)PTR_safemalloc_000ad414)(iVar6,4)" ( (type_descriptor "undefined4 *" type_identifier (abstract_pointer_declarator "*" *)) ) (call_expression "(*(code *)PTR_safemalloc_000ad414)(iVar6,4)" (parenthesized_expression "(*(code *)PTR_safemalloc_000ad414)" ( (pointer_expression "*(code *)PTR_safemalloc_000ad414" * (cast_expression "(code *)PTR_safemalloc_000ad414" ( (type_descriptor "code *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier)) )) (argument_list "(iVar6,4)" ( identifier , number_literal ))))) ;) (if_statement "if (0 < iVar6) {\n    puVar4 = puVar3;\n    do {\n      *puVar4 = 0;\n      puVar4 = puVar4 + 1;\n    } while (puVar4 != puVar3 + iVar6);\n  }" if (parenthesized_expression "(0 < iVar6)" ( (binary_expression "0 < iVar6" number_literal < identifier) )) (compound_statement "{\n    puVar4 = puVar3;\n    do {\n      *puVar4 = 0;\n      puVar4 = puVar4 + 1;\n    } while (puVar4 != puVar3 + iVar6);\n  }" { (expression_statement "puVar4 = puVar3;" (assignment_expression "puVar4 = puVar3" identifier = identifier) ;) (do_statement "do {\n      *puVar4 = 0;\n      puVar4 = puVar4 + 1;\n    } while (puVar4 != puVar3 + iVar6);" do (compound_statement "{\n      *puVar4 = 0;\n      puVar4 = puVar4 + 1;\n    }" { (expression_statement "*puVar4 = 0;" (assignment_expression "*puVar4 = 0" (pointer_expression "*puVar4" * identifier) = number_literal) ;) (expression_statement "puVar4 = puVar4 + 1;" (assignment_expression "puVar4 = puVar4 + 1" identifier = (binary_expression "puVar4 + 1" identifier + number_literal)) ;) }) while (parenthesized_expression "(puVar4 != puVar3 + iVar6)" ( (binary_expression "puVar4 != puVar3 + iVar6" identifier != (binary_expression "puVar3 + iVar6" identifier + identifier)) )) ;) })) (if_statement "if (0 < *param_1) {\n    piVar10 = param_1 + 1;\n    piVar7 = puVar3 + iVar6;\n    iVar2 = 1;\n    do {\n      piVar7 = piVar7 + -1;\n      iVar2 = iVar2 + 1;\n      *piVar7 = *piVar10;\n      piVar10 = piVar10 + 1;\n    } while (iVar2 <= *param_1);\n  }" if (parenthesized_expression "(0 < *param_1)" ( (binary_expression "0 < *param_1" number_literal < (pointer_expression "*param_1" * identifier)) )) (compound_statement "{\n    piVar10 = param_1 + 1;\n    piVar7 = puVar3 + iVar6;\n    iVar2 = 1;\n    do {\n      piVar7 = piVar7 + -1;\n      iVar2 = iVar2 + 1;\n      *piVar7 = *piVar10;\n      piVar10 = piVar10 + 1;\n    } while (iVar2 <= *param_1);\n  }" { (expression_statement "piVar10 = param_1 + 1;" (assignment_expression "piVar10 = param_1 + 1" identifier = (binary_expression "param_1 + 1" identifier + number_literal)) ;) (expression_statement "piVar7 = puVar3 + iVar6;" (assignment_expression "piVar7 = puVar3 + iVar6" identifier = (binary_expression "puVar3 + iVar6" identifier + identifier)) ;) (expression_statement "iVar2 = 1;" (assignment_expression "iVar2 = 1" identifier = number_literal) ;) (do_statement "do {\n      piVar7 = piVar7 + -1;\n      iVar2 = iVar2 + 1;\n      *piVar7 = *piVar10;\n      piVar10 = piVar10 + 1;\n    } while (iVar2 <= *param_1);" do (compound_statement "{\n      piVar7 = piVar7 + -1;\n      iVar2 = iVar2 + 1;\n      *piVar7 = *piVar10;\n      piVar10 = piVar10 + 1;\n    }" { (expression_statement "piVar7 = piVar7 + -1;" (assignment_expression "piVar7 = piVar7 + -1" identifier = (binary_expression "piVar7 + -1" identifier + number_literal)) ;) (expression_statement "iVar2 = iVar2 + 1;" (assignment_expression "iVar2 = iVar2 + 1" identifier = (binary_expression "iVar2 + 1" identifier + number_literal)) ;) (expression_statement "*piVar7 = *piVar10;" (assignment_expression "*piVar7 = *piVar10" (pointer_expression "*piVar7" * identifier) = (pointer_expression "*piVar10" * identifier)) ;) (expression_statement "piVar10 = piVar10 + 1;" (assignment_expression "piVar10 = piVar10 + 1" identifier = (binary_expression "piVar10 + 1" identifier + number_literal)) ;) }) while (parenthesized_expression "(iVar2 <= *param_1)" ( (binary_expression "iVar2 <= *param_1" identifier <= (pointer_expression "*param_1" * identifier)) )) ;) })) (expression_statement "uVar9 = *puVar1;" (assignment_expression "uVar9 = *puVar1" identifier = (pointer_expression "*puVar1" * identifier)) ;) (expression_statement "iVar11 = 5;" (assignment_expression "iVar11 = 5" identifier = number_literal) ;) (expression_statement "uVar14 = 0;" (assignment_expression "uVar14 = 0" identifier = number_literal) ;) (expression_statement "iVar2 = 0x10;" (assignment_expression "iVar2 = 0x10" identifier = number_literal) ;) (expression_statement "uVar12 = uVar9;" (assignment_expression "uVar12 = uVar9" identifier = identifier) ;) (do_statement "do {\n    if (uVar12 >> (0x20U - iVar2 & 0x1f) == 0) {\n      uVar12 = uVar12 << iVar2;\n      uVar14 = uVar14 + iVar2;\n    }\n    iVar11 = iVar11 + -1;\n    iVar2 = iVar2 >> 1;\n  } while (iVar11 != 0);" do (compound_statement "{\n    if (uVar12 >> (0x20U - iVar2 & 0x1f) == 0) {\n      uVar12 = uVar12 << iVar2;\n      uVar14 = uVar14 + iVar2;\n    }\n    iVar11 = iVar11 + -1;\n    iVar2 = iVar2 >> 1;\n  }" { (if_statement "if (uVar12 >> (0x20U - iVar2 & 0x1f) == 0) {\n      uVar12 = uVar12 << iVar2;\n      uVar14 = uVar14 + iVar2;\n    }" if (parenthesized_expression "(uVar12 >> (0x20U - iVar2 & 0x1f) == 0)" ( (binary_expression "uVar12 >> (0x20U - iVar2 & 0x1f) == 0" (binary_expression "uVar12 >> (0x20U - iVar2 & 0x1f)" identifier >> (parenthesized_expression "(0x20U - iVar2 & 0x1f)" ( (binary_expression "0x20U - iVar2 & 0x1f" (binary_expression "0x20U - iVar2" number_literal - identifier) & number_literal) ))) == number_literal) )) (compound_statement "{\n      uVar12 = uVar12 << iVar2;\n      uVar14 = uVar14 + iVar2;\n    }" { (expression_statement "uVar12 = uVar12 << iVar2;" (assignment_expression "uVar12 = uVar12 << iVar2" identifier = (binary_expression "uVar12 << iVar2" identifier << identifier)) ;) (expression_statement "uVar14 = uVar14 + iVar2;" (assignment_expression "uVar14 = uVar14 + iVar2" identifier = (binary_expression "uVar14 + iVar2" identifier + identifier)) ;) })) (expression_statement "iVar11 = iVar11 + -1;" (assignment_expression "iVar11 = iVar11 + -1" identifier = (binary_expression "iVar11 + -1" identifier + number_literal)) ;) (expression_statement "iVar2 = iVar2 >> 1;" (assignment_expression "iVar2 = iVar2 >> 1" identifier = (binary_expression "iVar2 >> 1" identifier >> number_literal)) ;) }) while (parenthesized_expression "(iVar11 != 0)" ( (binary_expression "iVar11 != 0" identifier != number_literal) )) ;) (if_statement "if ((uVar14 != 0) && (uVar9 = uVar9 << (uVar14 & 0x1f), 1 < iVar13)) {\n    uVar9 = uVar9 | puVar1[1] >> (-uVar14 & 0x1f);\n  }" if (parenthesized_expression "((uVar14 != 0) && (uVar9 = uVar9 << (uVar14 & 0x1f), 1 < iVar13))" ( (binary_expression "(uVar14 != 0) && (uVar9 = uVar9 << (uVar14 & 0x1f), 1 < iVar13)" (parenthesized_expression "(uVar14 != 0)" ( (binary_expression "uVar14 != 0" identifier != number_literal) )) && (parenthesized_expression "(uVar9 = uVar9 << (uVar14 & 0x1f), 1 < iVar13)" ( (comma_expression "uVar9 = uVar9 << (uVar14 & 0x1f), 1 < iVar13" (assignment_expression "uVar9 = uVar9 << (uVar14 & 0x1f)" identifier = (binary_expression "uVar9 << (uVar14 & 0x1f)" identifier << (parenthesized_expression "(uVar14 & 0x1f)" ( (binary_expression "uVar14 & 0x1f" identifier & number_literal) )))) , (binary_expression "1 < iVar13" number_literal < identifier)) ))) )) (compound_statement "{\n    uVar9 = uVar9 | puVar1[1] >> (-uVar14 & 0x1f);\n  }" { (expression_statement "uVar9 = uVar9 | puVar1[1] >> (-uVar14 & 0x1f);" (assignment_expression "uVar9 = uVar9 | puVar1[1] >> (-uVar14 & 0x1f)" identifier = (binary_expression "uVar9 | puVar1[1] >> (-uVar14 & 0x1f)" identifier | (binary_expression "puVar1[1] >> (-uVar14 & 0x1f)" (subscript_expression "puVar1[1]" identifier [ number_literal ]) >> (parenthesized_expression "(-uVar14 & 0x1f)" ( (binary_expression "-uVar14 & 0x1f" (unary_expression "-uVar14" - identifier) & number_literal) ))))) ;) })) (expression_statement "uVar5 = FUN_0004e5b0(uVar9);" (assignment_expression "uVar5 = FUN_0004e5b0(uVar9)" identifier = (call_expression "FUN_0004e5b0(uVar9)" identifier (argument_list "(uVar9)" ( identifier )))) ;) (expression_statement "FUN_0004e858(puVar3,iVar6,puVar1,iVar13,param_4,uVar5,uVar14);" (call_expression "FUN_0004e858(puVar3,iVar6,puVar1,iVar13,param_4,uVar5,uVar14)" identifier (argument_list "(puVar3,iVar6,puVar1,iVar13,param_4,uVar5,uVar14)" ( identifier , identifier , identifier , identifier , identifier , identifier , identifier ))) ;) (if_statement "if ((param_3 != (int *)0x0) && (0 < *param_3)) {\n    iVar2 = iVar6 + -1;\n    piVar7 = param_3 + 1;\n    do {\n      while (-1 < iVar2) {\n        iVar11 = iVar2 + -1;\n        *piVar7 = puVar3[iVar2];\n        iVar2 = iVar11;\n        piVar7 = piVar7 + 1;\n        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;\n      }\n      iVar2 = iVar2 + -1;\n      *piVar7 = 0;\n      piVar7 = piVar7 + 1;\n    } while (iVar6 - iVar2 <= *param_3);\n  }" if (parenthesized_expression "((param_3 != (int *)0x0) && (0 < *param_3))" ( (binary_expression "(param_3 != (int *)0x0) && (0 < *param_3)" (parenthesized_expression "(param_3 != (int *)0x0)" ( (binary_expression "param_3 != (int *)0x0" identifier != (cast_expression "(int *)0x0" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) number_literal)) )) && (parenthesized_expression "(0 < *param_3)" ( (binary_expression "0 < *param_3" number_literal < (pointer_expression "*param_3" * identifier)) ))) )) (compound_statement "{\n    iVar2 = iVar6 + -1;\n    piVar7 = param_3 + 1;\n    do {\n      while (-1 < iVar2) {\n        iVar11 = iVar2 + -1;\n        *piVar7 = puVar3[iVar2];\n        iVar2 = iVar11;\n        piVar7 = piVar7 + 1;\n        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;\n      }\n      iVar2 = iVar2 + -1;\n      *piVar7 = 0;\n      piVar7 = piVar7 + 1;\n    } while (iVar6 - iVar2 <= *param_3);\n  }" { (expression_statement "iVar2 = iVar6 + -1;" (assignment_expression "iVar2 = iVar6 + -1" identifier = (binary_expression "iVar6 + -1" identifier + number_literal)) ;) (expression_statement "piVar7 = param_3 + 1;" (assignment_expression "piVar7 = param_3 + 1" identifier = (binary_expression "param_3 + 1" identifier + number_literal)) ;) (do_statement "do {\n      while (-1 < iVar2) {\n        iVar11 = iVar2 + -1;\n        *piVar7 = puVar3[iVar2];\n        iVar2 = iVar11;\n        piVar7 = piVar7 + 1;\n        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;\n      }\n      iVar2 = iVar2 + -1;\n      *piVar7 = 0;\n      piVar7 = piVar7 + 1;\n    } while (iVar6 - iVar2 <= *param_3);" do (compound_statement "{\n      while (-1 < iVar2) {\n        iVar11 = iVar2 + -1;\n        *piVar7 = puVar3[iVar2];\n        iVar2 = iVar11;\n        piVar7 = piVar7 + 1;\n        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;\n      }\n      iVar2 = iVar2 + -1;\n      *piVar7 = 0;\n      piVar7 = piVar7 + 1;\n    }" { (while_statement "while (-1 < iVar2) {\n        iVar11 = iVar2 + -1;\n        *piVar7 = puVar3[iVar2];\n        iVar2 = iVar11;\n        piVar7 = piVar7 + 1;\n        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;\n      }" while (parenthesized_expression "(-1 < iVar2)" ( (binary_expression "-1 < iVar2" number_literal < identifier) )) (compound_statement "{\n        iVar11 = iVar2 + -1;\n        *piVar7 = puVar3[iVar2];\n        iVar2 = iVar11;\n        piVar7 = piVar7 + 1;\n        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;\n      }" { (expression_statement "iVar11 = iVar2 + -1;" (assignment_expression "iVar11 = iVar2 + -1" identifier = (binary_expression "iVar2 + -1" identifier + number_literal)) ;) (expression_statement "*piVar7 = puVar3[iVar2];" (assignment_expression "*piVar7 = puVar3[iVar2]" (pointer_expression "*piVar7" * identifier) = (subscript_expression "puVar3[iVar2]" identifier [ identifier ])) ;) (expression_statement "iVar2 = iVar11;" (assignment_expression "iVar2 = iVar11" identifier = identifier) ;) (expression_statement "piVar7 = piVar7 + 1;" (assignment_expression "piVar7 = piVar7 + 1" identifier = (binary_expression "piVar7 + 1" identifier + number_literal)) ;) (if_statement "if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;" if (parenthesized_expression "(*param_3 < iVar6 - iVar11)" ( (binary_expression "*param_3 < iVar6 - iVar11" (pointer_expression "*param_3" * identifier) < (binary_expression "iVar6 - iVar11" identifier - identifier)) )) (goto_statement "goto LAB_0004ee3c;" goto statement_identifier ;)) })) (expression_statement "iVar2 = iVar2 + -1;" (assignment_expression "iVar2 = iVar2 + -1" identifier = (binary_expression "iVar2 + -1" identifier + number_literal)) ;) (expression_statement "*piVar7 = 0;" (assignment_expression "*piVar7 = 0" (pointer_expression "*piVar7" * identifier) = number_literal) ;) (expression_statement "piVar7 = piVar7 + 1;" (assignment_expression "piVar7 = piVar7 + 1" identifier = (binary_expression "piVar7 + 1" identifier + number_literal)) ;) }) while (parenthesized_expression "(iVar6 - iVar2 <= *param_3)" ( (binary_expression "iVar6 - iVar2 <= *param_3" (binary_expression "iVar6 - iVar2" identifier - identifier) <= (pointer_expression "*param_3" * identifier)) )) ;) })) (labeled_statement "LAB_0004ee3c:\n  (*(code *)PTR_smemclr_000ad430)(puVar1,iVar13 * 4);" statement_identifier : (expression_statement "(*(code *)PTR_smemclr_000ad430)(puVar1,iVar13 * 4);" (call_expression "(*(code *)PTR_smemclr_000ad430)(puVar1,iVar13 * 4)" (parenthesized_expression "(*(code *)PTR_smemclr_000ad430)" ( (pointer_expression "*(code *)PTR_smemclr_000ad430" * (cast_expression "(code *)PTR_smemclr_000ad430" ( (type_descriptor "code *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier)) )) (argument_list "(puVar1,iVar13 * 4)" ( identifier , (binary_expression "iVar13 * 4" identifier * number_literal) ))) ;)) (expression_statement "(*(code *)PTR_safefree_000ad380)(puVar1);" (call_expression "(*(code *)PTR_safefree_000ad380)(puVar1)" (parenthesized_expression "(*(code *)PTR_safefree_000ad380)" ( (pointer_expression "*(code *)PTR_safefree_000ad380" * (cast_expression "(code *)PTR_safefree_000ad380" ( (type_descriptor "code *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier)) )) (argument_list "(puVar1)" ( identifier ))) ;) (expression_statement "(*(code *)PTR_smemclr_000ad430)(puVar3,iVar6 << 2);" (call_expression "(*(code *)PTR_smemclr_000ad430)(puVar3,iVar6 << 2)" (parenthesized_expression "(*(code *)PTR_smemclr_000ad430)" ( (pointer_expression "*(code *)PTR_smemclr_000ad430" * (cast_expression "(code *)PTR_smemclr_000ad430" ( (type_descriptor "code *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier)) )) (argument_list "(puVar3,iVar6 << 2)" ( identifier , (binary_expression "iVar6 << 2" identifier << number_literal) ))) ;) (expression_statement "(*(code *)PTR_safefree_000ad380)(puVar3);" (call_expression "(*(code *)PTR_safefree_000ad380)(puVar3)" (parenthesized_expression "(*(code *)PTR_safefree_000ad380)" ( (pointer_expression "*(code *)PTR_safefree_000ad380" * (cast_expression "(code *)PTR_safefree_000ad380" ( (type_descriptor "code *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier)) )) (argument_list "(puVar3)" ( identifier ))) ;) (return_statement "return;" return ;) })))
(translation_unit "void bigdivmod(Bignum_conflict p,Bignum_conflict mod,Bignum_conflict result,Bignum_conflict quotient\n              )\n\n{\n  BignumInt *m;\n  int iVar1;\n  BignumInt *pBVar2;\n  BignumInt *pBVar3;\n  BignumInt BVar4;\n  BignumInt d;\n  BignumInt *pBVar5;\n  int iVar6;\n  BignumInt BVar7;\n  BignumInt mlen;\n  uint rshift;\n  \n  mlen = *mod;\n  if (mod[mlen] == 0) {\n    (*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328);\n    return;\n  }\n  m = (BignumInt *)(*(code *)PTR_safemalloc_000ad414)(mlen,4);\n  if (0 < (int)mlen) {\n    BVar4 = 0;\n    pBVar2 = m;\n    do {\n      iVar1 = *mod - BVar4;\n      BVar4 = BVar4 + 1;\n      *pBVar2 = mod[iVar1];\n      pBVar2 = pBVar2 + 1;\n    } while (mlen != BVar4);\n  }\n  BVar4 = *p;\n  if ((int)BVar4 <= (int)mlen) {\n    BVar4 = mlen + 1;\n  }\n  pBVar2 = (BignumInt *)(*(code *)PTR_safemalloc_000ad414)(BVar4,4);\n  if (0 < (int)BVar4) {\n    pBVar3 = pBVar2;\n    do {\n      *pBVar3 = 0;\n      pBVar3 = pBVar3 + 1;\n    } while (pBVar3 != pBVar2 + BVar4);\n  }\n  if (0 < (int)*p) {\n    pBVar5 = p + 1;\n    pBVar3 = pBVar2 + BVar4;\n    iVar1 = 1;\n    do {\n      pBVar3 = pBVar3 + -1;\n      iVar1 = iVar1 + 1;\n      *pBVar3 = *pBVar5;\n      pBVar5 = pBVar5 + 1;\n    } while (iVar1 <= (int)*p);\n  }\n  d = *m;\n  iVar6 = 5;\n  rshift = 0;\n  iVar1 = 0x10;\n  BVar7 = d;\n  do {\n    if (BVar7 >> (0x20U - iVar1 & 0x1f) == 0) {\n      BVar7 = BVar7 << iVar1;\n      rshift = rshift + iVar1;\n    }\n    iVar6 = iVar6 + -1;\n    iVar1 = iVar1 >> 1;\n  } while (iVar6 != 0);\n  if ((rshift != 0) && (d = d << (rshift & 0x1f), 1 < (int)mlen)) {\n    d = d | m[1] >> (-rshift & 0x1f);\n  }\n  BVar7 = reciprocal_word(d);\n  internal_mod(pBVar2,BVar4,m,mlen,quotient,BVar7,rshift);\n  if ((result != (Bignum_conflict)0x0) && (0 < (int)*result)) {\n    iVar1 = BVar4 - 1;\n    pBVar3 = result + 1;\n    do {\n      while (-1 < iVar1) {\n        iVar6 = iVar1 + -1;\n        *pBVar3 = pBVar2[iVar1];\n        iVar1 = iVar6;\n        pBVar3 = pBVar3 + 1;\n        if ((int)*result < (int)(BVar4 - iVar6)) goto LAB_0004ee3c;\n      }\n      iVar1 = iVar1 + -1;\n      *pBVar3 = 0;\n      pBVar3 = pBVar3 + 1;\n    } while ((int)(BVar4 - iVar1) <= (int)*result);\n  }\nLAB_0004ee3c:\n  (*(code *)PTR_smemclr_000ad430)(m,mlen * 4);\n  (*(code *)PTR_safefree_000ad380)(m);\n  (*(code *)PTR_smemclr_000ad430)(pBVar2,BVar4 << 2);\n  (*(code *)PTR_safefree_000ad380)(pBVar2);\n  return;\n}\n\n" (function_definition "void bigdivmod(Bignum_conflict p,Bignum_conflict mod,Bignum_conflict result,Bignum_conflict quotient\n              )\n\n{\n  BignumInt *m;\n  int iVar1;\n  BignumInt *pBVar2;\n  BignumInt *pBVar3;\n  BignumInt BVar4;\n  BignumInt d;\n  BignumInt *pBVar5;\n  int iVar6;\n  BignumInt BVar7;\n  BignumInt mlen;\n  uint rshift;\n  \n  mlen = *mod;\n  if (mod[mlen] == 0) {\n    (*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328);\n    return;\n  }\n  m = (BignumInt *)(*(code *)PTR_safemalloc_000ad414)(mlen,4);\n  if (0 < (int)mlen) {\n    BVar4 = 0;\n    pBVar2 = m;\n    do {\n      iVar1 = *mod - BVar4;\n      BVar4 = BVar4 + 1;\n      *pBVar2 = mod[iVar1];\n      pBVar2 = pBVar2 + 1;\n    } while (mlen != BVar4);\n  }\n  BVar4 = *p;\n  if ((int)BVar4 <= (int)mlen) {\n    BVar4 = mlen + 1;\n  }\n  pBVar2 = (BignumInt *)(*(code *)PTR_safemalloc_000ad414)(BVar4,4);\n  if (0 < (int)BVar4) {\n    pBVar3 = pBVar2;\n    do {\n      *pBVar3 = 0;\n      pBVar3 = pBVar3 + 1;\n    } while (pBVar3 != pBVar2 + BVar4);\n  }\n  if (0 < (int)*p) {\n    pBVar5 = p + 1;\n    pBVar3 = pBVar2 + BVar4;\n    iVar1 = 1;\n    do {\n      pBVar3 = pBVar3 + -1;\n      iVar1 = iVar1 + 1;\n      *pBVar3 = *pBVar5;\n      pBVar5 = pBVar5 + 1;\n    } while (iVar1 <= (int)*p);\n  }\n  d = *m;\n  iVar6 = 5;\n  rshift = 0;\n  iVar1 = 0x10;\n  BVar7 = d;\n  do {\n    if (BVar7 >> (0x20U - iVar1 & 0x1f) == 0) {\n      BVar7 = BVar7 << iVar1;\n      rshift = rshift + iVar1;\n    }\n    iVar6 = iVar6 + -1;\n    iVar1 = iVar1 >> 1;\n  } while (iVar6 != 0);\n  if ((rshift != 0) && (d = d << (rshift & 0x1f), 1 < (int)mlen)) {\n    d = d | m[1] >> (-rshift & 0x1f);\n  }\n  BVar7 = reciprocal_word(d);\n  internal_mod(pBVar2,BVar4,m,mlen,quotient,BVar7,rshift);\n  if ((result != (Bignum_conflict)0x0) && (0 < (int)*result)) {\n    iVar1 = BVar4 - 1;\n    pBVar3 = result + 1;\n    do {\n      while (-1 < iVar1) {\n        iVar6 = iVar1 + -1;\n        *pBVar3 = pBVar2[iVar1];\n        iVar1 = iVar6;\n        pBVar3 = pBVar3 + 1;\n        if ((int)*result < (int)(BVar4 - iVar6)) goto LAB_0004ee3c;\n      }\n      iVar1 = iVar1 + -1;\n      *pBVar3 = 0;\n      pBVar3 = pBVar3 + 1;\n    } while ((int)(BVar4 - iVar1) <= (int)*result);\n  }\nLAB_0004ee3c:\n  (*(code *)PTR_smemclr_000ad430)(m,mlen * 4);\n  (*(code *)PTR_safefree_000ad380)(m);\n  (*(code *)PTR_smemclr_000ad430)(pBVar2,BVar4 << 2);\n  (*(code *)PTR_safefree_000ad380)(pBVar2);\n  return;\n}" primitive_type (function_declarator "bigdivmod(Bignum_conflict p,Bignum_conflict mod,Bignum_conflict result,Bignum_conflict quotient\n              )" identifier (parameter_list "(Bignum_conflict p,Bignum_conflict mod,Bignum_conflict result,Bignum_conflict quotient\n              )" ( (parameter_declaration "Bignum_conflict p" type_identifier identifier) , (parameter_declaration "Bignum_conflict mod" type_identifier identifier) , (parameter_declaration "Bignum_conflict result" type_identifier identifier) , (parameter_declaration "Bignum_conflict quotient" type_identifier identifier) ))) (compound_statement "{\n  BignumInt *m;\n  int iVar1;\n  BignumInt *pBVar2;\n  BignumInt *pBVar3;\n  BignumInt BVar4;\n  BignumInt d;\n  BignumInt *pBVar5;\n  int iVar6;\n  BignumInt BVar7;\n  BignumInt mlen;\n  uint rshift;\n  \n  mlen = *mod;\n  if (mod[mlen] == 0) {\n    (*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328);\n    return;\n  }\n  m = (BignumInt *)(*(code *)PTR_safemalloc_000ad414)(mlen,4);\n  if (0 < (int)mlen) {\n    BVar4 = 0;\n    pBVar2 = m;\n    do {\n      iVar1 = *mod - BVar4;\n      BVar4 = BVar4 + 1;\n      *pBVar2 = mod[iVar1];\n      pBVar2 = pBVar2 + 1;\n    } while (mlen != BVar4);\n  }\n  BVar4 = *p;\n  if ((int)BVar4 <= (int)mlen) {\n    BVar4 = mlen + 1;\n  }\n  pBVar2 = (BignumInt *)(*(code *)PTR_safemalloc_000ad414)(BVar4,4);\n  if (0 < (int)BVar4) {\n    pBVar3 = pBVar2;\n    do {\n      *pBVar3 = 0;\n      pBVar3 = pBVar3 + 1;\n    } while (pBVar3 != pBVar2 + BVar4);\n  }\n  if (0 < (int)*p) {\n    pBVar5 = p + 1;\n    pBVar3 = pBVar2 + BVar4;\n    iVar1 = 1;\n    do {\n      pBVar3 = pBVar3 + -1;\n      iVar1 = iVar1 + 1;\n      *pBVar3 = *pBVar5;\n      pBVar5 = pBVar5 + 1;\n    } while (iVar1 <= (int)*p);\n  }\n  d = *m;\n  iVar6 = 5;\n  rshift = 0;\n  iVar1 = 0x10;\n  BVar7 = d;\n  do {\n    if (BVar7 >> (0x20U - iVar1 & 0x1f) == 0) {\n      BVar7 = BVar7 << iVar1;\n      rshift = rshift + iVar1;\n    }\n    iVar6 = iVar6 + -1;\n    iVar1 = iVar1 >> 1;\n  } while (iVar6 != 0);\n  if ((rshift != 0) && (d = d << (rshift & 0x1f), 1 < (int)mlen)) {\n    d = d | m[1] >> (-rshift & 0x1f);\n  }\n  BVar7 = reciprocal_word(d);\n  internal_mod(pBVar2,BVar4,m,mlen,quotient,BVar7,rshift);\n  if ((result != (Bignum_conflict)0x0) && (0 < (int)*result)) {\n    iVar1 = BVar4 - 1;\n    pBVar3 = result + 1;\n    do {\n      while (-1 < iVar1) {\n        iVar6 = iVar1 + -1;\n        *pBVar3 = pBVar2[iVar1];\n        iVar1 = iVar6;\n        pBVar3 = pBVar3 + 1;\n        if ((int)*result < (int)(BVar4 - iVar6)) goto LAB_0004ee3c;\n      }\n      iVar1 = iVar1 + -1;\n      *pBVar3 = 0;\n      pBVar3 = pBVar3 + 1;\n    } while ((int)(BVar4 - iVar1) <= (int)*result);\n  }\nLAB_0004ee3c:\n  (*(code *)PTR_smemclr_000ad430)(m,mlen * 4);\n  (*(code *)PTR_safefree_000ad380)(m);\n  (*(code *)PTR_smemclr_000ad430)(pBVar2,BVar4 << 2);\n  (*(code *)PTR_safefree_000ad380)(pBVar2);\n  return;\n}" { (declaration "BignumInt *m;" type_identifier (pointer_declarator "*m" * identifier) ;) (declaration "int iVar1;" primitive_type identifier ;) (declaration "BignumInt *pBVar2;" type_identifier (pointer_declarator "*pBVar2" * identifier) ;) (declaration "BignumInt *pBVar3;" type_identifier (pointer_declarator "*pBVar3" * identifier) ;) (declaration "BignumInt BVar4;" type_identifier identifier ;) (declaration "BignumInt d;" type_identifier identifier ;) (declaration "BignumInt *pBVar5;" type_identifier (pointer_declarator "*pBVar5" * identifier) ;) (declaration "int iVar6;" primitive_type identifier ;) (declaration "BignumInt BVar7;" type_identifier identifier ;) (declaration "BignumInt mlen;" type_identifier identifier ;) (declaration "uint rshift;" type_identifier identifier ;) (expression_statement "mlen = *mod;" (assignment_expression "mlen = *mod" identifier = (pointer_expression "*mod" * identifier)) ;) (if_statement "if (mod[mlen] == 0) {\n    (*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328);\n    return;\n  }" if (parenthesized_expression "(mod[mlen] == 0)" ( (binary_expression "mod[mlen] == 0" (subscript_expression "mod[mlen]" identifier [ identifier ]) == number_literal) )) (compound_statement "{\n    (*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328);\n    return;\n  }" { (expression_statement "(*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328);" (call_expression "(*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328)" (parenthesized_expression "(*(code *)PTR___assert_fail_000adb00)" ( (pointer_expression "*(code *)PTR___assert_fail_000adb00" * (cast_expression "(code *)PTR___assert_fail_000adb00" ( (type_descriptor "code *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier)) )) (argument_list "(PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328)" ( (binary_expression "PTR_DAT_000ad2c8 + 0x420c" identifier + number_literal) , (binary_expression "PTR_DAT_000ad2c8 + 0x41d0" identifier + number_literal) , number_literal , (binary_expression "PTR_DAT_000ad2c8 + 0x4328" identifier + number_literal) ))) ;) (return_statement "return;" return ;) })) (expression_statement "m = (BignumInt *)(*(code *)PTR_safemalloc_000ad414)(mlen,4);" (assignment_expression "m = (BignumInt *)(*(code *)PTR_safemalloc_000ad414)(mlen,4)" identifier = (cast_expression "(BignumInt *)(*(code *)PTR_safemalloc_000ad414)(mlen,4)" ( (type_descriptor "BignumInt *" type_identifier (abstract_pointer_declarator "*" *)) ) (call_expression "(*(code *)PTR_safemalloc_000ad414)(mlen,4)" (parenthesized_expression "(*(code *)PTR_safemalloc_000ad414)" ( (pointer_expression "*(code *)PTR_safemalloc_000ad414" * (cast_expression "(code *)PTR_safemalloc_000ad414" ( (type_descriptor "code *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier)) )) (argument_list "(mlen,4)" ( identifier , number_literal ))))) ;) (if_statement "if (0 < (int)mlen) {\n    BVar4 = 0;\n    pBVar2 = m;\n    do {\n      iVar1 = *mod - BVar4;\n      BVar4 = BVar4 + 1;\n      *pBVar2 = mod[iVar1];\n      pBVar2 = pBVar2 + 1;\n    } while (mlen != BVar4);\n  }" if (parenthesized_expression "(0 < (int)mlen)" ( (binary_expression "0 < (int)mlen" number_literal < (cast_expression "(int)mlen" ( (type_descriptor "int" primitive_type) ) identifier)) )) (compound_statement "{\n    BVar4 = 0;\n    pBVar2 = m;\n    do {\n      iVar1 = *mod - BVar4;\n      BVar4 = BVar4 + 1;\n      *pBVar2 = mod[iVar1];\n      pBVar2 = pBVar2 + 1;\n    } while (mlen != BVar4);\n  }" { (expression_statement "BVar4 = 0;" (assignment_expression "BVar4 = 0" identifier = number_literal) ;) (expression_statement "pBVar2 = m;" (assignment_expression "pBVar2 = m" identifier = identifier) ;) (do_statement "do {\n      iVar1 = *mod - BVar4;\n      BVar4 = BVar4 + 1;\n      *pBVar2 = mod[iVar1];\n      pBVar2 = pBVar2 + 1;\n    } while (mlen != BVar4);" do (compound_statement "{\n      iVar1 = *mod - BVar4;\n      BVar4 = BVar4 + 1;\n      *pBVar2 = mod[iVar1];\n      pBVar2 = pBVar2 + 1;\n    }" { (expression_statement "iVar1 = *mod - BVar4;" (assignment_expression "iVar1 = *mod - BVar4" identifier = (binary_expression "*mod - BVar4" (pointer_expression "*mod" * identifier) - identifier)) ;) (expression_statement "BVar4 = BVar4 + 1;" (assignment_expression "BVar4 = BVar4 + 1" identifier = (binary_expression "BVar4 + 1" identifier + number_literal)) ;) (expression_statement "*pBVar2 = mod[iVar1];" (assignment_expression "*pBVar2 = mod[iVar1]" (pointer_expression "*pBVar2" * identifier) = (subscript_expression "mod[iVar1]" identifier [ identifier ])) ;) (expression_statement "pBVar2 = pBVar2 + 1;" (assignment_expression "pBVar2 = pBVar2 + 1" identifier = (binary_expression "pBVar2 + 1" identifier + number_literal)) ;) }) while (parenthesized_expression "(mlen != BVar4)" ( (binary_expression "mlen != BVar4" identifier != identifier) )) ;) })) (expression_statement "BVar4 = *p;" (assignment_expression "BVar4 = *p" identifier = (pointer_expression "*p" * identifier)) ;) (if_statement "if ((int)BVar4 <= (int)mlen) {\n    BVar4 = mlen + 1;\n  }" if (parenthesized_expression "((int)BVar4 <= (int)mlen)" ( (binary_expression "(int)BVar4 <= (int)mlen" (cast_expression "(int)BVar4" ( (type_descriptor "int" primitive_type) ) identifier) <= (cast_expression "(int)mlen" ( (type_descriptor "int" primitive_type) ) identifier)) )) (compound_statement "{\n    BVar4 = mlen + 1;\n  }" { (expression_statement "BVar4 = mlen + 1;" (assignment_expression "BVar4 = mlen + 1" identifier = (binary_expression "mlen + 1" identifier + number_literal)) ;) })) (expression_statement "pBVar2 = (BignumInt *)(*(code *)PTR_safemalloc_000ad414)(BVar4,4);" (assignment_expression "pBVar2 = (BignumInt *)(*(code *)PTR_safemalloc_000ad414)(BVar4,4)" identifier = (cast_expression "(BignumInt *)(*(code *)PTR_safemalloc_000ad414)(BVar4,4)" ( (type_descriptor "BignumInt *" type_identifier (abstract_pointer_declarator "*" *)) ) (call_expression "(*(code *)PTR_safemalloc_000ad414)(BVar4,4)" (parenthesized_expression "(*(code *)PTR_safemalloc_000ad414)" ( (pointer_expression "*(code *)PTR_safemalloc_000ad414" * (cast_expression "(code *)PTR_safemalloc_000ad414" ( (type_descriptor "code *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier)) )) (argument_list "(BVar4,4)" ( identifier , number_literal ))))) ;) (if_statement "if (0 < (int)BVar4) {\n    pBVar3 = pBVar2;\n    do {\n      *pBVar3 = 0;\n      pBVar3 = pBVar3 + 1;\n    } while (pBVar3 != pBVar2 + BVar4);\n  }" if (parenthesized_expression "(0 < (int)BVar4)" ( (binary_expression "0 < (int)BVar4" number_literal < (cast_expression "(int)BVar4" ( (type_descriptor "int" primitive_type) ) identifier)) )) (compound_statement "{\n    pBVar3 = pBVar2;\n    do {\n      *pBVar3 = 0;\n      pBVar3 = pBVar3 + 1;\n    } while (pBVar3 != pBVar2 + BVar4);\n  }" { (expression_statement "pBVar3 = pBVar2;" (assignment_expression "pBVar3 = pBVar2" identifier = identifier) ;) (do_statement "do {\n      *pBVar3 = 0;\n      pBVar3 = pBVar3 + 1;\n    } while (pBVar3 != pBVar2 + BVar4);" do (compound_statement "{\n      *pBVar3 = 0;\n      pBVar3 = pBVar3 + 1;\n    }" { (expression_statement "*pBVar3 = 0;" (assignment_expression "*pBVar3 = 0" (pointer_expression "*pBVar3" * identifier) = number_literal) ;) (expression_statement "pBVar3 = pBVar3 + 1;" (assignment_expression "pBVar3 = pBVar3 + 1" identifier = (binary_expression "pBVar3 + 1" identifier + number_literal)) ;) }) while (parenthesized_expression "(pBVar3 != pBVar2 + BVar4)" ( (binary_expression "pBVar3 != pBVar2 + BVar4" identifier != (binary_expression "pBVar2 + BVar4" identifier + identifier)) )) ;) })) (if_statement "if (0 < (int)*p) {\n    pBVar5 = p + 1;\n    pBVar3 = pBVar2 + BVar4;\n    iVar1 = 1;\n    do {\n      pBVar3 = pBVar3 + -1;\n      iVar1 = iVar1 + 1;\n      *pBVar3 = *pBVar5;\n      pBVar5 = pBVar5 + 1;\n    } while (iVar1 <= (int)*p);\n  }" if (parenthesized_expression "(0 < (int)*p)" ( (binary_expression "0 < (int)*p" number_literal < (cast_expression "(int)*p" ( (type_descriptor "int" primitive_type) ) (pointer_expression "*p" * identifier))) )) (compound_statement "{\n    pBVar5 = p + 1;\n    pBVar3 = pBVar2 + BVar4;\n    iVar1 = 1;\n    do {\n      pBVar3 = pBVar3 + -1;\n      iVar1 = iVar1 + 1;\n      *pBVar3 = *pBVar5;\n      pBVar5 = pBVar5 + 1;\n    } while (iVar1 <= (int)*p);\n  }" { (expression_statement "pBVar5 = p + 1;" (assignment_expression "pBVar5 = p + 1" identifier = (binary_expression "p + 1" identifier + number_literal)) ;) (expression_statement "pBVar3 = pBVar2 + BVar4;" (assignment_expression "pBVar3 = pBVar2 + BVar4" identifier = (binary_expression "pBVar2 + BVar4" identifier + identifier)) ;) (expression_statement "iVar1 = 1;" (assignment_expression "iVar1 = 1" identifier = number_literal) ;) (do_statement "do {\n      pBVar3 = pBVar3 + -1;\n      iVar1 = iVar1 + 1;\n      *pBVar3 = *pBVar5;\n      pBVar5 = pBVar5 + 1;\n    } while (iVar1 <= (int)*p);" do (compound_statement "{\n      pBVar3 = pBVar3 + -1;\n      iVar1 = iVar1 + 1;\n      *pBVar3 = *pBVar5;\n      pBVar5 = pBVar5 + 1;\n    }" { (expression_statement "pBVar3 = pBVar3 + -1;" (assignment_expression "pBVar3 = pBVar3 + -1" identifier = (binary_expression "pBVar3 + -1" identifier + number_literal)) ;) (expression_statement "iVar1 = iVar1 + 1;" (assignment_expression "iVar1 = iVar1 + 1" identifier = (binary_expression "iVar1 + 1" identifier + number_literal)) ;) (expression_statement "*pBVar3 = *pBVar5;" (assignment_expression "*pBVar3 = *pBVar5" (pointer_expression "*pBVar3" * identifier) = (pointer_expression "*pBVar5" * identifier)) ;) (expression_statement "pBVar5 = pBVar5 + 1;" (assignment_expression "pBVar5 = pBVar5 + 1" identifier = (binary_expression "pBVar5 + 1" identifier + number_literal)) ;) }) while (parenthesized_expression "(iVar1 <= (int)*p)" ( (binary_expression "iVar1 <= (int)*p" identifier <= (cast_expression "(int)*p" ( (type_descriptor "int" primitive_type) ) (pointer_expression "*p" * identifier))) )) ;) })) (expression_statement "d = *m;" (assignment_expression "d = *m" identifier = (pointer_expression "*m" * identifier)) ;) (expression_statement "iVar6 = 5;" (assignment_expression "iVar6 = 5" identifier = number_literal) ;) (expression_statement "rshift = 0;" (assignment_expression "rshift = 0" identifier = number_literal) ;) (expression_statement "iVar1 = 0x10;" (assignment_expression "iVar1 = 0x10" identifier = number_literal) ;) (expression_statement "BVar7 = d;" (assignment_expression "BVar7 = d" identifier = identifier) ;) (do_statement "do {\n    if (BVar7 >> (0x20U - iVar1 & 0x1f) == 0) {\n      BVar7 = BVar7 << iVar1;\n      rshift = rshift + iVar1;\n    }\n    iVar6 = iVar6 + -1;\n    iVar1 = iVar1 >> 1;\n  } while (iVar6 != 0);" do (compound_statement "{\n    if (BVar7 >> (0x20U - iVar1 & 0x1f) == 0) {\n      BVar7 = BVar7 << iVar1;\n      rshift = rshift + iVar1;\n    }\n    iVar6 = iVar6 + -1;\n    iVar1 = iVar1 >> 1;\n  }" { (if_statement "if (BVar7 >> (0x20U - iVar1 & 0x1f) == 0) {\n      BVar7 = BVar7 << iVar1;\n      rshift = rshift + iVar1;\n    }" if (parenthesized_expression "(BVar7 >> (0x20U - iVar1 & 0x1f) == 0)" ( (binary_expression "BVar7 >> (0x20U - iVar1 & 0x1f) == 0" (binary_expression "BVar7 >> (0x20U - iVar1 & 0x1f)" identifier >> (parenthesized_expression "(0x20U - iVar1 & 0x1f)" ( (binary_expression "0x20U - iVar1 & 0x1f" (binary_expression "0x20U - iVar1" number_literal - identifier) & number_literal) ))) == number_literal) )) (compound_statement "{\n      BVar7 = BVar7 << iVar1;\n      rshift = rshift + iVar1;\n    }" { (expression_statement "BVar7 = BVar7 << iVar1;" (assignment_expression "BVar7 = BVar7 << iVar1" identifier = (binary_expression "BVar7 << iVar1" identifier << identifier)) ;) (expression_statement "rshift = rshift + iVar1;" (assignment_expression "rshift = rshift + iVar1" identifier = (binary_expression "rshift + iVar1" identifier + identifier)) ;) })) (expression_statement "iVar6 = iVar6 + -1;" (assignment_expression "iVar6 = iVar6 + -1" identifier = (binary_expression "iVar6 + -1" identifier + number_literal)) ;) (expression_statement "iVar1 = iVar1 >> 1;" (assignment_expression "iVar1 = iVar1 >> 1" identifier = (binary_expression "iVar1 >> 1" identifier >> number_literal)) ;) }) while (parenthesized_expression "(iVar6 != 0)" ( (binary_expression "iVar6 != 0" identifier != number_literal) )) ;) (if_statement "if ((rshift != 0) && (d = d << (rshift & 0x1f), 1 < (int)mlen)) {\n    d = d | m[1] >> (-rshift & 0x1f);\n  }" if (parenthesized_expression "((rshift != 0) && (d = d << (rshift & 0x1f), 1 < (int)mlen))" ( (binary_expression "(rshift != 0) && (d = d << (rshift & 0x1f), 1 < (int)mlen)" (parenthesized_expression "(rshift != 0)" ( (binary_expression "rshift != 0" identifier != number_literal) )) && (parenthesized_expression "(d = d << (rshift & 0x1f), 1 < (int)mlen)" ( (comma_expression "d = d << (rshift & 0x1f), 1 < (int)mlen" (assignment_expression "d = d << (rshift & 0x1f)" identifier = (binary_expression "d << (rshift & 0x1f)" identifier << (parenthesized_expression "(rshift & 0x1f)" ( (binary_expression "rshift & 0x1f" identifier & number_literal) )))) , (binary_expression "1 < (int)mlen" number_literal < (cast_expression "(int)mlen" ( (type_descriptor "int" primitive_type) ) identifier))) ))) )) (compound_statement "{\n    d = d | m[1] >> (-rshift & 0x1f);\n  }" { (expression_statement "d = d | m[1] >> (-rshift & 0x1f);" (assignment_expression "d = d | m[1] >> (-rshift & 0x1f)" identifier = (binary_expression "d | m[1] >> (-rshift & 0x1f)" identifier | (binary_expression "m[1] >> (-rshift & 0x1f)" (subscript_expression "m[1]" identifier [ number_literal ]) >> (parenthesized_expression "(-rshift & 0x1f)" ( (binary_expression "-rshift & 0x1f" (unary_expression "-rshift" - identifier) & number_literal) ))))) ;) })) (expression_statement "BVar7 = reciprocal_word(d);" (assignment_expression "BVar7 = reciprocal_word(d)" identifier = (call_expression "reciprocal_word(d)" identifier (argument_list "(d)" ( identifier )))) ;) (expression_statement "internal_mod(pBVar2,BVar4,m,mlen,quotient,BVar7,rshift);" (call_expression "internal_mod(pBVar2,BVar4,m,mlen,quotient,BVar7,rshift)" identifier (argument_list "(pBVar2,BVar4,m,mlen,quotient,BVar7,rshift)" ( identifier , identifier , identifier , identifier , identifier , identifier , identifier ))) ;) (if_statement "if ((result != (Bignum_conflict)0x0) && (0 < (int)*result)) {\n    iVar1 = BVar4 - 1;\n    pBVar3 = result + 1;\n    do {\n      while (-1 < iVar1) {\n        iVar6 = iVar1 + -1;\n        *pBVar3 = pBVar2[iVar1];\n        iVar1 = iVar6;\n        pBVar3 = pBVar3 + 1;\n        if ((int)*result < (int)(BVar4 - iVar6)) goto LAB_0004ee3c;\n      }\n      iVar1 = iVar1 + -1;\n      *pBVar3 = 0;\n      pBVar3 = pBVar3 + 1;\n    } while ((int)(BVar4 - iVar1) <= (int)*result);\n  }" if (parenthesized_expression "((result != (Bignum_conflict)0x0) && (0 < (int)*result))" ( (binary_expression "(result != (Bignum_conflict)0x0) && (0 < (int)*result)" (parenthesized_expression "(result != (Bignum_conflict)0x0)" ( (binary_expression "result != (Bignum_conflict)0x0" identifier != (cast_expression "(Bignum_conflict)0x0" ( (type_descriptor "Bignum_conflict" type_identifier) ) number_literal)) )) && (parenthesized_expression "(0 < (int)*result)" ( (binary_expression "0 < (int)*result" number_literal < (cast_expression "(int)*result" ( (type_descriptor "int" primitive_type) ) (pointer_expression "*result" * identifier))) ))) )) (compound_statement "{\n    iVar1 = BVar4 - 1;\n    pBVar3 = result + 1;\n    do {\n      while (-1 < iVar1) {\n        iVar6 = iVar1 + -1;\n        *pBVar3 = pBVar2[iVar1];\n        iVar1 = iVar6;\n        pBVar3 = pBVar3 + 1;\n        if ((int)*result < (int)(BVar4 - iVar6)) goto LAB_0004ee3c;\n      }\n      iVar1 = iVar1 + -1;\n      *pBVar3 = 0;\n      pBVar3 = pBVar3 + 1;\n    } while ((int)(BVar4 - iVar1) <= (int)*result);\n  }" { (expression_statement "iVar1 = BVar4 - 1;" (assignment_expression "iVar1 = BVar4 - 1" identifier = (binary_expression "BVar4 - 1" identifier - number_literal)) ;) (expression_statement "pBVar3 = result + 1;" (assignment_expression "pBVar3 = result + 1" identifier = (binary_expression "result + 1" identifier + number_literal)) ;) (do_statement "do {\n      while (-1 < iVar1) {\n        iVar6 = iVar1 + -1;\n        *pBVar3 = pBVar2[iVar1];\n        iVar1 = iVar6;\n        pBVar3 = pBVar3 + 1;\n        if ((int)*result < (int)(BVar4 - iVar6)) goto LAB_0004ee3c;\n      }\n      iVar1 = iVar1 + -1;\n      *pBVar3 = 0;\n      pBVar3 = pBVar3 + 1;\n    } while ((int)(BVar4 - iVar1) <= (int)*result);" do (compound_statement "{\n      while (-1 < iVar1) {\n        iVar6 = iVar1 + -1;\n        *pBVar3 = pBVar2[iVar1];\n        iVar1 = iVar6;\n        pBVar3 = pBVar3 + 1;\n        if ((int)*result < (int)(BVar4 - iVar6)) goto LAB_0004ee3c;\n      }\n      iVar1 = iVar1 + -1;\n      *pBVar3 = 0;\n      pBVar3 = pBVar3 + 1;\n    }" { (while_statement "while (-1 < iVar1) {\n        iVar6 = iVar1 + -1;\n        *pBVar3 = pBVar2[iVar1];\n        iVar1 = iVar6;\n        pBVar3 = pBVar3 + 1;\n        if ((int)*result < (int)(BVar4 - iVar6)) goto LAB_0004ee3c;\n      }" while (parenthesized_expression "(-1 < iVar1)" ( (binary_expression "-1 < iVar1" number_literal < identifier) )) (compound_statement "{\n        iVar6 = iVar1 + -1;\n        *pBVar3 = pBVar2[iVar1];\n        iVar1 = iVar6;\n        pBVar3 = pBVar3 + 1;\n        if ((int)*result < (int)(BVar4 - iVar6)) goto LAB_0004ee3c;\n      }" { (expression_statement "iVar6 = iVar1 + -1;" (assignment_expression "iVar6 = iVar1 + -1" identifier = (binary_expression "iVar1 + -1" identifier + number_literal)) ;) (expression_statement "*pBVar3 = pBVar2[iVar1];" (assignment_expression "*pBVar3 = pBVar2[iVar1]" (pointer_expression "*pBVar3" * identifier) = (subscript_expression "pBVar2[iVar1]" identifier [ identifier ])) ;) (expression_statement "iVar1 = iVar6;" (assignment_expression "iVar1 = iVar6" identifier = identifier) ;) (expression_statement "pBVar3 = pBVar3 + 1;" (assignment_expression "pBVar3 = pBVar3 + 1" identifier = (binary_expression "pBVar3 + 1" identifier + number_literal)) ;) (if_statement "if ((int)*result < (int)(BVar4 - iVar6)) goto LAB_0004ee3c;" if (parenthesized_expression "((int)*result < (int)(BVar4 - iVar6))" ( (binary_expression "(int)*result < (int)(BVar4 - iVar6)" (cast_expression "(int)*result" ( (type_descriptor "int" primitive_type) ) (pointer_expression "*result" * identifier)) < (cast_expression "(int)(BVar4 - iVar6)" ( (type_descriptor "int" primitive_type) ) (parenthesized_expression "(BVar4 - iVar6)" ( (binary_expression "BVar4 - iVar6" identifier - identifier) )))) )) (goto_statement "goto LAB_0004ee3c;" goto statement_identifier ;)) })) (expression_statement "iVar1 = iVar1 + -1;" (assignment_expression "iVar1 = iVar1 + -1" identifier = (binary_expression "iVar1 + -1" identifier + number_literal)) ;) (expression_statement "*pBVar3 = 0;" (assignment_expression "*pBVar3 = 0" (pointer_expression "*pBVar3" * identifier) = number_literal) ;) (expression_statement "pBVar3 = pBVar3 + 1;" (assignment_expression "pBVar3 = pBVar3 + 1" identifier = (binary_expression "pBVar3 + 1" identifier + number_literal)) ;) }) while (parenthesized_expression "((int)(BVar4 - iVar1) <= (int)*result)" ( (binary_expression "(int)(BVar4 - iVar1) <= (int)*result" (cast_expression "(int)(BVar4 - iVar1)" ( (type_descriptor "int" primitive_type) ) (parenthesized_expression "(BVar4 - iVar1)" ( (binary_expression "BVar4 - iVar1" identifier - identifier) ))) <= (cast_expression "(int)*result" ( (type_descriptor "int" primitive_type) ) (pointer_expression "*result" * identifier))) )) ;) })) (labeled_statement "LAB_0004ee3c:\n  (*(code *)PTR_smemclr_000ad430)(m,mlen * 4);" statement_identifier : (expression_statement "(*(code *)PTR_smemclr_000ad430)(m,mlen * 4);" (call_expression "(*(code *)PTR_smemclr_000ad430)(m,mlen * 4)" (parenthesized_expression "(*(code *)PTR_smemclr_000ad430)" ( (pointer_expression "*(code *)PTR_smemclr_000ad430" * (cast_expression "(code *)PTR_smemclr_000ad430" ( (type_descriptor "code *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier)) )) (argument_list "(m,mlen * 4)" ( identifier , (binary_expression "mlen * 4" identifier * number_literal) ))) ;)) (expression_statement "(*(code *)PTR_safefree_000ad380)(m);" (call_expression "(*(code *)PTR_safefree_000ad380)(m)" (parenthesized_expression "(*(code *)PTR_safefree_000ad380)" ( (pointer_expression "*(code *)PTR_safefree_000ad380" * (cast_expression "(code *)PTR_safefree_000ad380" ( (type_descriptor "code *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier)) )) (argument_list "(m)" ( identifier ))) ;) (expression_statement "(*(code *)PTR_smemclr_000ad430)(pBVar2,BVar4 << 2);" (call_expression "(*(code *)PTR_smemclr_000ad430)(pBVar2,BVar4 << 2)" (parenthesized_expression "(*(code *)PTR_smemclr_000ad430)" ( (pointer_expression "*(code *)PTR_smemclr_000ad430" * (cast_expression "(code *)PTR_smemclr_000ad430" ( (type_descriptor "code *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier)) )) (argument_list "(pBVar2,BVar4 << 2)" ( identifier , (binary_expression "BVar4 << 2" identifier << number_literal) ))) ;) (expression_statement "(*(code *)PTR_safefree_000ad380)(pBVar2);" (call_expression "(*(code *)PTR_safefree_000ad380)(pBVar2)" (parenthesized_expression "(*(code *)PTR_safefree_000ad380)" ( (pointer_expression "*(code *)PTR_safefree_000ad380" * (cast_expression "(code *)PTR_safefree_000ad380" ( (type_descriptor "code *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier)) )) (argument_list "(pBVar2)" ( identifier ))) ;) (return_statement "return;" return ;) })))
(translation_unit "void FUN_0004ec24(int *param_1,int *param_2,int *param_3,undefined4 param_4)\n\n{\n  uint *puVar1;\n  int iVar2;\n  undefined4 *puVar3;\n  undefined4 *puVar4;\n  undefined4 uVar5;\n  int iVar6;\n  int *piVar7;\n  uint *puVar8;\n  uint uVar9;\n  int *piVar10;\n  int iVar11;\n  uint uVar12;\n  int iVar13;\n  uint uVar14;\n  \n  iVar13 = *param_2;\n  if (param_2[iVar13] == 0) {\n    (*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328);\n    return;\n  }\n  puVar1 = (uint *)(*(code *)PTR_safemalloc_000ad414)(iVar13,4);\n  if (0 < iVar13) {\n    iVar6 = 0;\n    puVar8 = puVar1;\n    do {\n      iVar2 = *param_2 - iVar6;\n      iVar6 = iVar6 + 1;\n      *puVar8 = param_2[iVar2];\n      puVar8 = puVar8 + 1;\n    } while (iVar13 != iVar6);\n  }\n  iVar6 = *param_1;\n  if (iVar6 <= iVar13) {\n    iVar6 = iVar13 + 1;\n  }\n  puVar3 = (undefined4 *)(*(code *)PTR_safemalloc_000ad414)(iVar6,4);\n  if (0 < iVar6) {\n    puVar4 = puVar3;\n    do {\n      *puVar4 = 0;\n      puVar4 = puVar4 + 1;\n    } while (puVar4 != puVar3 + iVar6);\n  }\n  if (0 < *param_1) {\n    piVar10 = param_1 + 1;\n    piVar7 = puVar3 + iVar6;\n    iVar2 = 1;\n    do {\n      piVar7 = piVar7 + -1;\n      iVar2 = iVar2 + 1;\n      *piVar7 = *piVar10;\n      piVar10 = piVar10 + 1;\n    } while (iVar2 <= *param_1);\n  }\n  uVar9 = *puVar1;\n  iVar11 = 5;\n  uVar14 = 0;\n  iVar2 = 0x10;\n  uVar12 = uVar9;\n  do {\n    if (uVar12 >> (0x20U - iVar2 & 0x1f) == 0) {\n      uVar12 = uVar12 << iVar2;\n      uVar14 = uVar14 + iVar2;\n    }\n    iVar11 = iVar11 + -1;\n    iVar2 = iVar2 >> 1;\n  } while (iVar11 != 0);\n  if ((uVar14 != 0) && (uVar9 = uVar9 << (uVar14 & 0x1f), 1 < iVar13)) {\n    uVar9 = uVar9 | puVar1[1] >> (-uVar14 & 0x1f);\n  }\n  uVar5 = FUN_0004e5b0(uVar9);\n  FUN_0004e858(puVar3,iVar6,puVar1,iVar13,param_4,uVar5,uVar14);\n  if ((param_3 != (int *)0x0) && (0 < *param_3)) {\n    iVar2 = iVar6 + -1;\n    piVar7 = param_3 + 1;\n    do {\n      while (-1 < iVar2) {\n        iVar11 = iVar2 + -1;\n        *piVar7 = puVar3[iVar2];\n        iVar2 = iVar11;\n        piVar7 = piVar7 + 1;\n        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;\n      }\n      iVar2 = iVar2 + -1;\n      *piVar7 = 0;\n      piVar7 = piVar7 + 1;\n    } while (iVar6 - iVar2 <= *param_3);\n  }\nLAB_0004ee3c:\n  (*(code *)PTR_smemclr_000ad430)(puVar1,iVar13 * 4);\n  (*(code *)PTR_safefree_000ad380)(puVar1);\n  (*(code *)PTR_smemclr_000ad430)(puVar3,iVar6 << 2);\n  (*(code *)PTR_safefree_000ad380)(puVar3);\n  return;\n}\n\n" (function_definition "void FUN_0004ec24(int *param_1,int *param_2,int *param_3,undefined4 param_4)\n\n{\n  uint *puVar1;\n  int iVar2;\n  undefined4 *puVar3;\n  undefined4 *puVar4;\n  undefined4 uVar5;\n  int iVar6;\n  int *piVar7;\n  uint *puVar8;\n  uint uVar9;\n  int *piVar10;\n  int iVar11;\n  uint uVar12;\n  int iVar13;\n  uint uVar14;\n  \n  iVar13 = *param_2;\n  if (param_2[iVar13] == 0) {\n    (*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328);\n    return;\n  }\n  puVar1 = (uint *)(*(code *)PTR_safemalloc_000ad414)(iVar13,4);\n  if (0 < iVar13) {\n    iVar6 = 0;\n    puVar8 = puVar1;\n    do {\n      iVar2 = *param_2 - iVar6;\n      iVar6 = iVar6 + 1;\n      *puVar8 = param_2[iVar2];\n      puVar8 = puVar8 + 1;\n    } while (iVar13 != iVar6);\n  }\n  iVar6 = *param_1;\n  if (iVar6 <= iVar13) {\n    iVar6 = iVar13 + 1;\n  }\n  puVar3 = (undefined4 *)(*(code *)PTR_safemalloc_000ad414)(iVar6,4);\n  if (0 < iVar6) {\n    puVar4 = puVar3;\n    do {\n      *puVar4 = 0;\n      puVar4 = puVar4 + 1;\n    } while (puVar4 != puVar3 + iVar6);\n  }\n  if (0 < *param_1) {\n    piVar10 = param_1 + 1;\n    piVar7 = puVar3 + iVar6;\n    iVar2 = 1;\n    do {\n      piVar7 = piVar7 + -1;\n      iVar2 = iVar2 + 1;\n      *piVar7 = *piVar10;\n      piVar10 = piVar10 + 1;\n    } while (iVar2 <= *param_1);\n  }\n  uVar9 = *puVar1;\n  iVar11 = 5;\n  uVar14 = 0;\n  iVar2 = 0x10;\n  uVar12 = uVar9;\n  do {\n    if (uVar12 >> (0x20U - iVar2 & 0x1f) == 0) {\n      uVar12 = uVar12 << iVar2;\n      uVar14 = uVar14 + iVar2;\n    }\n    iVar11 = iVar11 + -1;\n    iVar2 = iVar2 >> 1;\n  } while (iVar11 != 0);\n  if ((uVar14 != 0) && (uVar9 = uVar9 << (uVar14 & 0x1f), 1 < iVar13)) {\n    uVar9 = uVar9 | puVar1[1] >> (-uVar14 & 0x1f);\n  }\n  uVar5 = FUN_0004e5b0(uVar9);\n  FUN_0004e858(puVar3,iVar6,puVar1,iVar13,param_4,uVar5,uVar14);\n  if ((param_3 != (int *)0x0) && (0 < *param_3)) {\n    iVar2 = iVar6 + -1;\n    piVar7 = param_3 + 1;\n    do {\n      while (-1 < iVar2) {\n        iVar11 = iVar2 + -1;\n        *piVar7 = puVar3[iVar2];\n        iVar2 = iVar11;\n        piVar7 = piVar7 + 1;\n        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;\n      }\n      iVar2 = iVar2 + -1;\n      *piVar7 = 0;\n      piVar7 = piVar7 + 1;\n    } while (iVar6 - iVar2 <= *param_3);\n  }\nLAB_0004ee3c:\n  (*(code *)PTR_smemclr_000ad430)(puVar1,iVar13 * 4);\n  (*(code *)PTR_safefree_000ad380)(puVar1);\n  (*(code *)PTR_smemclr_000ad430)(puVar3,iVar6 << 2);\n  (*(code *)PTR_safefree_000ad380)(puVar3);\n  return;\n}" primitive_type (function_declarator "FUN_0004ec24(int *param_1,int *param_2,int *param_3,undefined4 param_4)" identifier (parameter_list "(int *param_1,int *param_2,int *param_3,undefined4 param_4)" ( (parameter_declaration "int *param_1" primitive_type (pointer_declarator "*param_1" * identifier)) , (parameter_declaration "int *param_2" primitive_type (pointer_declarator "*param_2" * identifier)) , (parameter_declaration "int *param_3" primitive_type (pointer_declarator "*param_3" * identifier)) , (parameter_declaration "undefined4 param_4" type_identifier identifier) ))) (compound_statement "{\n  uint *puVar1;\n  int iVar2;\n  undefined4 *puVar3;\n  undefined4 *puVar4;\n  undefined4 uVar5;\n  int iVar6;\n  int *piVar7;\n  uint *puVar8;\n  uint uVar9;\n  int *piVar10;\n  int iVar11;\n  uint uVar12;\n  int iVar13;\n  uint uVar14;\n  \n  iVar13 = *param_2;\n  if (param_2[iVar13] == 0) {\n    (*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328);\n    return;\n  }\n  puVar1 = (uint *)(*(code *)PTR_safemalloc_000ad414)(iVar13,4);\n  if (0 < iVar13) {\n    iVar6 = 0;\n    puVar8 = puVar1;\n    do {\n      iVar2 = *param_2 - iVar6;\n      iVar6 = iVar6 + 1;\n      *puVar8 = param_2[iVar2];\n      puVar8 = puVar8 + 1;\n    } while (iVar13 != iVar6);\n  }\n  iVar6 = *param_1;\n  if (iVar6 <= iVar13) {\n    iVar6 = iVar13 + 1;\n  }\n  puVar3 = (undefined4 *)(*(code *)PTR_safemalloc_000ad414)(iVar6,4);\n  if (0 < iVar6) {\n    puVar4 = puVar3;\n    do {\n      *puVar4 = 0;\n      puVar4 = puVar4 + 1;\n    } while (puVar4 != puVar3 + iVar6);\n  }\n  if (0 < *param_1) {\n    piVar10 = param_1 + 1;\n    piVar7 = puVar3 + iVar6;\n    iVar2 = 1;\n    do {\n      piVar7 = piVar7 + -1;\n      iVar2 = iVar2 + 1;\n      *piVar7 = *piVar10;\n      piVar10 = piVar10 + 1;\n    } while (iVar2 <= *param_1);\n  }\n  uVar9 = *puVar1;\n  iVar11 = 5;\n  uVar14 = 0;\n  iVar2 = 0x10;\n  uVar12 = uVar9;\n  do {\n    if (uVar12 >> (0x20U - iVar2 & 0x1f) == 0) {\n      uVar12 = uVar12 << iVar2;\n      uVar14 = uVar14 + iVar2;\n    }\n    iVar11 = iVar11 + -1;\n    iVar2 = iVar2 >> 1;\n  } while (iVar11 != 0);\n  if ((uVar14 != 0) && (uVar9 = uVar9 << (uVar14 & 0x1f), 1 < iVar13)) {\n    uVar9 = uVar9 | puVar1[1] >> (-uVar14 & 0x1f);\n  }\n  uVar5 = FUN_0004e5b0(uVar9);\n  FUN_0004e858(puVar3,iVar6,puVar1,iVar13,param_4,uVar5,uVar14);\n  if ((param_3 != (int *)0x0) && (0 < *param_3)) {\n    iVar2 = iVar6 + -1;\n    piVar7 = param_3 + 1;\n    do {\n      while (-1 < iVar2) {\n        iVar11 = iVar2 + -1;\n        *piVar7 = puVar3[iVar2];\n        iVar2 = iVar11;\n        piVar7 = piVar7 + 1;\n        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;\n      }\n      iVar2 = iVar2 + -1;\n      *piVar7 = 0;\n      piVar7 = piVar7 + 1;\n    } while (iVar6 - iVar2 <= *param_3);\n  }\nLAB_0004ee3c:\n  (*(code *)PTR_smemclr_000ad430)(puVar1,iVar13 * 4);\n  (*(code *)PTR_safefree_000ad380)(puVar1);\n  (*(code *)PTR_smemclr_000ad430)(puVar3,iVar6 << 2);\n  (*(code *)PTR_safefree_000ad380)(puVar3);\n  return;\n}" { (declaration "uint *puVar1;" type_identifier (pointer_declarator "*puVar1" * identifier) ;) (declaration "int iVar2;" primitive_type identifier ;) (declaration "undefined4 *puVar3;" type_identifier (pointer_declarator "*puVar3" * identifier) ;) (declaration "undefined4 *puVar4;" type_identifier (pointer_declarator "*puVar4" * identifier) ;) (declaration "undefined4 uVar5;" type_identifier identifier ;) (declaration "int iVar6;" primitive_type identifier ;) (declaration "int *piVar7;" primitive_type (pointer_declarator "*piVar7" * identifier) ;) (declaration "uint *puVar8;" type_identifier (pointer_declarator "*puVar8" * identifier) ;) (declaration "uint uVar9;" type_identifier identifier ;) (declaration "int *piVar10;" primitive_type (pointer_declarator "*piVar10" * identifier) ;) (declaration "int iVar11;" primitive_type identifier ;) (declaration "uint uVar12;" type_identifier identifier ;) (declaration "int iVar13;" primitive_type identifier ;) (declaration "uint uVar14;" type_identifier identifier ;) (expression_statement "iVar13 = *param_2;" (assignment_expression "iVar13 = *param_2" identifier = (pointer_expression "*param_2" * identifier)) ;) (if_statement "if (param_2[iVar13] == 0) {\n    (*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328);\n    return;\n  }" if (parenthesized_expression "(param_2[iVar13] == 0)" ( (binary_expression "param_2[iVar13] == 0" (subscript_expression "param_2[iVar13]" identifier [ identifier ]) == number_literal) )) (compound_statement "{\n    (*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328);\n    return;\n  }" { (expression_statement "(*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328);" (call_expression "(*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328)" (parenthesized_expression "(*(code *)PTR___assert_fail_000adb00)" ( (pointer_expression "*(code *)PTR___assert_fail_000adb00" * (cast_expression "(code *)PTR___assert_fail_000adb00" ( (type_descriptor "code *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier)) )) (argument_list "(PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328)" ( (binary_expression "PTR_DAT_000ad2c8 + 0x420c" identifier + number_literal) , (binary_expression "PTR_DAT_000ad2c8 + 0x41d0" identifier + number_literal) , number_literal , (binary_expression "PTR_DAT_000ad2c8 + 0x4328" identifier + number_literal) ))) ;) (return_statement "return;" return ;) })) (expression_statement "puVar1 = (uint *)(*(code *)PTR_safemalloc_000ad414)(iVar13,4);" (assignment_expression "puVar1 = (uint *)(*(code *)PTR_safemalloc_000ad414)(iVar13,4)" identifier = (cast_expression "(uint *)(*(code *)PTR_safemalloc_000ad414)(iVar13,4)" ( (type_descriptor "uint *" type_identifier (abstract_pointer_declarator "*" *)) ) (call_expression "(*(code *)PTR_safemalloc_000ad414)(iVar13,4)" (parenthesized_expression "(*(code *)PTR_safemalloc_000ad414)" ( (pointer_expression "*(code *)PTR_safemalloc_000ad414" * (cast_expression "(code *)PTR_safemalloc_000ad414" ( (type_descriptor "code *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier)) )) (argument_list "(iVar13,4)" ( identifier , number_literal ))))) ;) (if_statement "if (0 < iVar13) {\n    iVar6 = 0;\n    puVar8 = puVar1;\n    do {\n      iVar2 = *param_2 - iVar6;\n      iVar6 = iVar6 + 1;\n      *puVar8 = param_2[iVar2];\n      puVar8 = puVar8 + 1;\n    } while (iVar13 != iVar6);\n  }" if (parenthesized_expression "(0 < iVar13)" ( (binary_expression "0 < iVar13" number_literal < identifier) )) (compound_statement "{\n    iVar6 = 0;\n    puVar8 = puVar1;\n    do {\n      iVar2 = *param_2 - iVar6;\n      iVar6 = iVar6 + 1;\n      *puVar8 = param_2[iVar2];\n      puVar8 = puVar8 + 1;\n    } while (iVar13 != iVar6);\n  }" { (expression_statement "iVar6 = 0;" (assignment_expression "iVar6 = 0" identifier = number_literal) ;) (expression_statement "puVar8 = puVar1;" (assignment_expression "puVar8 = puVar1" identifier = identifier) ;) (do_statement "do {\n      iVar2 = *param_2 - iVar6;\n      iVar6 = iVar6 + 1;\n      *puVar8 = param_2[iVar2];\n      puVar8 = puVar8 + 1;\n    } while (iVar13 != iVar6);" do (compound_statement "{\n      iVar2 = *param_2 - iVar6;\n      iVar6 = iVar6 + 1;\n      *puVar8 = param_2[iVar2];\n      puVar8 = puVar8 + 1;\n    }" { (expression_statement "iVar2 = *param_2 - iVar6;" (assignment_expression "iVar2 = *param_2 - iVar6" identifier = (binary_expression "*param_2 - iVar6" (pointer_expression "*param_2" * identifier) - identifier)) ;) (expression_statement "iVar6 = iVar6 + 1;" (assignment_expression "iVar6 = iVar6 + 1" identifier = (binary_expression "iVar6 + 1" identifier + number_literal)) ;) (expression_statement "*puVar8 = param_2[iVar2];" (assignment_expression "*puVar8 = param_2[iVar2]" (pointer_expression "*puVar8" * identifier) = (subscript_expression "param_2[iVar2]" identifier [ identifier ])) ;) (expression_statement "puVar8 = puVar8 + 1;" (assignment_expression "puVar8 = puVar8 + 1" identifier = (binary_expression "puVar8 + 1" identifier + number_literal)) ;) }) while (parenthesized_expression "(iVar13 != iVar6)" ( (binary_expression "iVar13 != iVar6" identifier != identifier) )) ;) })) (expression_statement "iVar6 = *param_1;" (assignment_expression "iVar6 = *param_1" identifier = (pointer_expression "*param_1" * identifier)) ;) (if_statement "if (iVar6 <= iVar13) {\n    iVar6 = iVar13 + 1;\n  }" if (parenthesized_expression "(iVar6 <= iVar13)" ( (binary_expression "iVar6 <= iVar13" identifier <= identifier) )) (compound_statement "{\n    iVar6 = iVar13 + 1;\n  }" { (expression_statement "iVar6 = iVar13 + 1;" (assignment_expression "iVar6 = iVar13 + 1" identifier = (binary_expression "iVar13 + 1" identifier + number_literal)) ;) })) (expression_statement "puVar3 = (undefined4 *)(*(code *)PTR_safemalloc_000ad414)(iVar6,4);" (assignment_expression "puVar3 = (undefined4 *)(*(code *)PTR_safemalloc_000ad414)(iVar6,4)" identifier = (cast_expression "(undefined4 *)(*(code *)PTR_safemalloc_000ad414)(iVar6,4)" ( (type_descriptor "undefined4 *" type_identifier (abstract_pointer_declarator "*" *)) ) (call_expression "(*(code *)PTR_safemalloc_000ad414)(iVar6,4)" (parenthesized_expression "(*(code *)PTR_safemalloc_000ad414)" ( (pointer_expression "*(code *)PTR_safemalloc_000ad414" * (cast_expression "(code *)PTR_safemalloc_000ad414" ( (type_descriptor "code *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier)) )) (argument_list "(iVar6,4)" ( identifier , number_literal ))))) ;) (if_statement "if (0 < iVar6) {\n    puVar4 = puVar3;\n    do {\n      *puVar4 = 0;\n      puVar4 = puVar4 + 1;\n    } while (puVar4 != puVar3 + iVar6);\n  }" if (parenthesized_expression "(0 < iVar6)" ( (binary_expression "0 < iVar6" number_literal < identifier) )) (compound_statement "{\n    puVar4 = puVar3;\n    do {\n      *puVar4 = 0;\n      puVar4 = puVar4 + 1;\n    } while (puVar4 != puVar3 + iVar6);\n  }" { (expression_statement "puVar4 = puVar3;" (assignment_expression "puVar4 = puVar3" identifier = identifier) ;) (do_statement "do {\n      *puVar4 = 0;\n      puVar4 = puVar4 + 1;\n    } while (puVar4 != puVar3 + iVar6);" do (compound_statement "{\n      *puVar4 = 0;\n      puVar4 = puVar4 + 1;\n    }" { (expression_statement "*puVar4 = 0;" (assignment_expression "*puVar4 = 0" (pointer_expression "*puVar4" * identifier) = number_literal) ;) (expression_statement "puVar4 = puVar4 + 1;" (assignment_expression "puVar4 = puVar4 + 1" identifier = (binary_expression "puVar4 + 1" identifier + number_literal)) ;) }) while (parenthesized_expression "(puVar4 != puVar3 + iVar6)" ( (binary_expression "puVar4 != puVar3 + iVar6" identifier != (binary_expression "puVar3 + iVar6" identifier + identifier)) )) ;) })) (if_statement "if (0 < *param_1) {\n    piVar10 = param_1 + 1;\n    piVar7 = puVar3 + iVar6;\n    iVar2 = 1;\n    do {\n      piVar7 = piVar7 + -1;\n      iVar2 = iVar2 + 1;\n      *piVar7 = *piVar10;\n      piVar10 = piVar10 + 1;\n    } while (iVar2 <= *param_1);\n  }" if (parenthesized_expression "(0 < *param_1)" ( (binary_expression "0 < *param_1" number_literal < (pointer_expression "*param_1" * identifier)) )) (compound_statement "{\n    piVar10 = param_1 + 1;\n    piVar7 = puVar3 + iVar6;\n    iVar2 = 1;\n    do {\n      piVar7 = piVar7 + -1;\n      iVar2 = iVar2 + 1;\n      *piVar7 = *piVar10;\n      piVar10 = piVar10 + 1;\n    } while (iVar2 <= *param_1);\n  }" { (expression_statement "piVar10 = param_1 + 1;" (assignment_expression "piVar10 = param_1 + 1" identifier = (binary_expression "param_1 + 1" identifier + number_literal)) ;) (expression_statement "piVar7 = puVar3 + iVar6;" (assignment_expression "piVar7 = puVar3 + iVar6" identifier = (binary_expression "puVar3 + iVar6" identifier + identifier)) ;) (expression_statement "iVar2 = 1;" (assignment_expression "iVar2 = 1" identifier = number_literal) ;) (do_statement "do {\n      piVar7 = piVar7 + -1;\n      iVar2 = iVar2 + 1;\n      *piVar7 = *piVar10;\n      piVar10 = piVar10 + 1;\n    } while (iVar2 <= *param_1);" do (compound_statement "{\n      piVar7 = piVar7 + -1;\n      iVar2 = iVar2 + 1;\n      *piVar7 = *piVar10;\n      piVar10 = piVar10 + 1;\n    }" { (expression_statement "piVar7 = piVar7 + -1;" (assignment_expression "piVar7 = piVar7 + -1" identifier = (binary_expression "piVar7 + -1" identifier + number_literal)) ;) (expression_statement "iVar2 = iVar2 + 1;" (assignment_expression "iVar2 = iVar2 + 1" identifier = (binary_expression "iVar2 + 1" identifier + number_literal)) ;) (expression_statement "*piVar7 = *piVar10;" (assignment_expression "*piVar7 = *piVar10" (pointer_expression "*piVar7" * identifier) = (pointer_expression "*piVar10" * identifier)) ;) (expression_statement "piVar10 = piVar10 + 1;" (assignment_expression "piVar10 = piVar10 + 1" identifier = (binary_expression "piVar10 + 1" identifier + number_literal)) ;) }) while (parenthesized_expression "(iVar2 <= *param_1)" ( (binary_expression "iVar2 <= *param_1" identifier <= (pointer_expression "*param_1" * identifier)) )) ;) })) (expression_statement "uVar9 = *puVar1;" (assignment_expression "uVar9 = *puVar1" identifier = (pointer_expression "*puVar1" * identifier)) ;) (expression_statement "iVar11 = 5;" (assignment_expression "iVar11 = 5" identifier = number_literal) ;) (expression_statement "uVar14 = 0;" (assignment_expression "uVar14 = 0" identifier = number_literal) ;) (expression_statement "iVar2 = 0x10;" (assignment_expression "iVar2 = 0x10" identifier = number_literal) ;) (expression_statement "uVar12 = uVar9;" (assignment_expression "uVar12 = uVar9" identifier = identifier) ;) (do_statement "do {\n    if (uVar12 >> (0x20U - iVar2 & 0x1f) == 0) {\n      uVar12 = uVar12 << iVar2;\n      uVar14 = uVar14 + iVar2;\n    }\n    iVar11 = iVar11 + -1;\n    iVar2 = iVar2 >> 1;\n  } while (iVar11 != 0);" do (compound_statement "{\n    if (uVar12 >> (0x20U - iVar2 & 0x1f) == 0) {\n      uVar12 = uVar12 << iVar2;\n      uVar14 = uVar14 + iVar2;\n    }\n    iVar11 = iVar11 + -1;\n    iVar2 = iVar2 >> 1;\n  }" { (if_statement "if (uVar12 >> (0x20U - iVar2 & 0x1f) == 0) {\n      uVar12 = uVar12 << iVar2;\n      uVar14 = uVar14 + iVar2;\n    }" if (parenthesized_expression "(uVar12 >> (0x20U - iVar2 & 0x1f) == 0)" ( (binary_expression "uVar12 >> (0x20U - iVar2 & 0x1f) == 0" (binary_expression "uVar12 >> (0x20U - iVar2 & 0x1f)" identifier >> (parenthesized_expression "(0x20U - iVar2 & 0x1f)" ( (binary_expression "0x20U - iVar2 & 0x1f" (binary_expression "0x20U - iVar2" number_literal - identifier) & number_literal) ))) == number_literal) )) (compound_statement "{\n      uVar12 = uVar12 << iVar2;\n      uVar14 = uVar14 + iVar2;\n    }" { (expression_statement "uVar12 = uVar12 << iVar2;" (assignment_expression "uVar12 = uVar12 << iVar2" identifier = (binary_expression "uVar12 << iVar2" identifier << identifier)) ;) (expression_statement "uVar14 = uVar14 + iVar2;" (assignment_expression "uVar14 = uVar14 + iVar2" identifier = (binary_expression "uVar14 + iVar2" identifier + identifier)) ;) })) (expression_statement "iVar11 = iVar11 + -1;" (assignment_expression "iVar11 = iVar11 + -1" identifier = (binary_expression "iVar11 + -1" identifier + number_literal)) ;) (expression_statement "iVar2 = iVar2 >> 1;" (assignment_expression "iVar2 = iVar2 >> 1" identifier = (binary_expression "iVar2 >> 1" identifier >> number_literal)) ;) }) while (parenthesized_expression "(iVar11 != 0)" ( (binary_expression "iVar11 != 0" identifier != number_literal) )) ;) (if_statement "if ((uVar14 != 0) && (uVar9 = uVar9 << (uVar14 & 0x1f), 1 < iVar13)) {\n    uVar9 = uVar9 | puVar1[1] >> (-uVar14 & 0x1f);\n  }" if (parenthesized_expression "((uVar14 != 0) && (uVar9 = uVar9 << (uVar14 & 0x1f), 1 < iVar13))" ( (binary_expression "(uVar14 != 0) && (uVar9 = uVar9 << (uVar14 & 0x1f), 1 < iVar13)" (parenthesized_expression "(uVar14 != 0)" ( (binary_expression "uVar14 != 0" identifier != number_literal) )) && (parenthesized_expression "(uVar9 = uVar9 << (uVar14 & 0x1f), 1 < iVar13)" ( (comma_expression "uVar9 = uVar9 << (uVar14 & 0x1f), 1 < iVar13" (assignment_expression "uVar9 = uVar9 << (uVar14 & 0x1f)" identifier = (binary_expression "uVar9 << (uVar14 & 0x1f)" identifier << (parenthesized_expression "(uVar14 & 0x1f)" ( (binary_expression "uVar14 & 0x1f" identifier & number_literal) )))) , (binary_expression "1 < iVar13" number_literal < identifier)) ))) )) (compound_statement "{\n    uVar9 = uVar9 | puVar1[1] >> (-uVar14 & 0x1f);\n  }" { (expression_statement "uVar9 = uVar9 | puVar1[1] >> (-uVar14 & 0x1f);" (assignment_expression "uVar9 = uVar9 | puVar1[1] >> (-uVar14 & 0x1f)" identifier = (binary_expression "uVar9 | puVar1[1] >> (-uVar14 & 0x1f)" identifier | (binary_expression "puVar1[1] >> (-uVar14 & 0x1f)" (subscript_expression "puVar1[1]" identifier [ number_literal ]) >> (parenthesized_expression "(-uVar14 & 0x1f)" ( (binary_expression "-uVar14 & 0x1f" (unary_expression "-uVar14" - identifier) & number_literal) ))))) ;) })) (expression_statement "uVar5 = FUN_0004e5b0(uVar9);" (assignment_expression "uVar5 = FUN_0004e5b0(uVar9)" identifier = (call_expression "FUN_0004e5b0(uVar9)" identifier (argument_list "(uVar9)" ( identifier )))) ;) (expression_statement "FUN_0004e858(puVar3,iVar6,puVar1,iVar13,param_4,uVar5,uVar14);" (call_expression "FUN_0004e858(puVar3,iVar6,puVar1,iVar13,param_4,uVar5,uVar14)" identifier (argument_list "(puVar3,iVar6,puVar1,iVar13,param_4,uVar5,uVar14)" ( identifier , identifier , identifier , identifier , identifier , identifier , identifier ))) ;) (if_statement "if ((param_3 != (int *)0x0) && (0 < *param_3)) {\n    iVar2 = iVar6 + -1;\n    piVar7 = param_3 + 1;\n    do {\n      while (-1 < iVar2) {\n        iVar11 = iVar2 + -1;\n        *piVar7 = puVar3[iVar2];\n        iVar2 = iVar11;\n        piVar7 = piVar7 + 1;\n        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;\n      }\n      iVar2 = iVar2 + -1;\n      *piVar7 = 0;\n      piVar7 = piVar7 + 1;\n    } while (iVar6 - iVar2 <= *param_3);\n  }" if (parenthesized_expression "((param_3 != (int *)0x0) && (0 < *param_3))" ( (binary_expression "(param_3 != (int *)0x0) && (0 < *param_3)" (parenthesized_expression "(param_3 != (int *)0x0)" ( (binary_expression "param_3 != (int *)0x0" identifier != (cast_expression "(int *)0x0" ( (type_descriptor "int *" primitive_type (abstract_pointer_declarator "*" *)) ) number_literal)) )) && (parenthesized_expression "(0 < *param_3)" ( (binary_expression "0 < *param_3" number_literal < (pointer_expression "*param_3" * identifier)) ))) )) (compound_statement "{\n    iVar2 = iVar6 + -1;\n    piVar7 = param_3 + 1;\n    do {\n      while (-1 < iVar2) {\n        iVar11 = iVar2 + -1;\n        *piVar7 = puVar3[iVar2];\n        iVar2 = iVar11;\n        piVar7 = piVar7 + 1;\n        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;\n      }\n      iVar2 = iVar2 + -1;\n      *piVar7 = 0;\n      piVar7 = piVar7 + 1;\n    } while (iVar6 - iVar2 <= *param_3);\n  }" { (expression_statement "iVar2 = iVar6 + -1;" (assignment_expression "iVar2 = iVar6 + -1" identifier = (binary_expression "iVar6 + -1" identifier + number_literal)) ;) (expression_statement "piVar7 = param_3 + 1;" (assignment_expression "piVar7 = param_3 + 1" identifier = (binary_expression "param_3 + 1" identifier + number_literal)) ;) (do_statement "do {\n      while (-1 < iVar2) {\n        iVar11 = iVar2 + -1;\n        *piVar7 = puVar3[iVar2];\n        iVar2 = iVar11;\n        piVar7 = piVar7 + 1;\n        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;\n      }\n      iVar2 = iVar2 + -1;\n      *piVar7 = 0;\n      piVar7 = piVar7 + 1;\n    } while (iVar6 - iVar2 <= *param_3);" do (compound_statement "{\n      while (-1 < iVar2) {\n        iVar11 = iVar2 + -1;\n        *piVar7 = puVar3[iVar2];\n        iVar2 = iVar11;\n        piVar7 = piVar7 + 1;\n        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;\n      }\n      iVar2 = iVar2 + -1;\n      *piVar7 = 0;\n      piVar7 = piVar7 + 1;\n    }" { (while_statement "while (-1 < iVar2) {\n        iVar11 = iVar2 + -1;\n        *piVar7 = puVar3[iVar2];\n        iVar2 = iVar11;\n        piVar7 = piVar7 + 1;\n        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;\n      }" while (parenthesized_expression "(-1 < iVar2)" ( (binary_expression "-1 < iVar2" number_literal < identifier) )) (compound_statement "{\n        iVar11 = iVar2 + -1;\n        *piVar7 = puVar3[iVar2];\n        iVar2 = iVar11;\n        piVar7 = piVar7 + 1;\n        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;\n      }" { (expression_statement "iVar11 = iVar2 + -1;" (assignment_expression "iVar11 = iVar2 + -1" identifier = (binary_expression "iVar2 + -1" identifier + number_literal)) ;) (expression_statement "*piVar7 = puVar3[iVar2];" (assignment_expression "*piVar7 = puVar3[iVar2]" (pointer_expression "*piVar7" * identifier) = (subscript_expression "puVar3[iVar2]" identifier [ identifier ])) ;) (expression_statement "iVar2 = iVar11;" (assignment_expression "iVar2 = iVar11" identifier = identifier) ;) (expression_statement "piVar7 = piVar7 + 1;" (assignment_expression "piVar7 = piVar7 + 1" identifier = (binary_expression "piVar7 + 1" identifier + number_literal)) ;) (if_statement "if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;" if (parenthesized_expression "(*param_3 < iVar6 - iVar11)" ( (binary_expression "*param_3 < iVar6 - iVar11" (pointer_expression "*param_3" * identifier) < (binary_expression "iVar6 - iVar11" identifier - identifier)) )) (goto_statement "goto LAB_0004ee3c;" goto statement_identifier ;)) })) (expression_statement "iVar2 = iVar2 + -1;" (assignment_expression "iVar2 = iVar2 + -1" identifier = (binary_expression "iVar2 + -1" identifier + number_literal)) ;) (expression_statement "*piVar7 = 0;" (assignment_expression "*piVar7 = 0" (pointer_expression "*piVar7" * identifier) = number_literal) ;) (expression_statement "piVar7 = piVar7 + 1;" (assignment_expression "piVar7 = piVar7 + 1" identifier = (binary_expression "piVar7 + 1" identifier + number_literal)) ;) }) while (parenthesized_expression "(iVar6 - iVar2 <= *param_3)" ( (binary_expression "iVar6 - iVar2 <= *param_3" (binary_expression "iVar6 - iVar2" identifier - identifier) <= (pointer_expression "*param_3" * identifier)) )) ;) })) (labeled_statement "LAB_0004ee3c:\n  (*(code *)PTR_smemclr_000ad430)(puVar1,iVar13 * 4);" statement_identifier : (expression_statement "(*(code *)PTR_smemclr_000ad430)(puVar1,iVar13 * 4);" (call_expression "(*(code *)PTR_smemclr_000ad430)(puVar1,iVar13 * 4)" (parenthesized_expression "(*(code *)PTR_smemclr_000ad430)" ( (pointer_expression "*(code *)PTR_smemclr_000ad430" * (cast_expression "(code *)PTR_smemclr_000ad430" ( (type_descriptor "code *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier)) )) (argument_list "(puVar1,iVar13 * 4)" ( identifier , (binary_expression "iVar13 * 4" identifier * number_literal) ))) ;)) (expression_statement "(*(code *)PTR_safefree_000ad380)(puVar1);" (call_expression "(*(code *)PTR_safefree_000ad380)(puVar1)" (parenthesized_expression "(*(code *)PTR_safefree_000ad380)" ( (pointer_expression "*(code *)PTR_safefree_000ad380" * (cast_expression "(code *)PTR_safefree_000ad380" ( (type_descriptor "code *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier)) )) (argument_list "(puVar1)" ( identifier ))) ;) (expression_statement "(*(code *)PTR_smemclr_000ad430)(puVar3,iVar6 << 2);" (call_expression "(*(code *)PTR_smemclr_000ad430)(puVar3,iVar6 << 2)" (parenthesized_expression "(*(code *)PTR_smemclr_000ad430)" ( (pointer_expression "*(code *)PTR_smemclr_000ad430" * (cast_expression "(code *)PTR_smemclr_000ad430" ( (type_descriptor "code *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier)) )) (argument_list "(puVar3,iVar6 << 2)" ( identifier , (binary_expression "iVar6 << 2" identifier << number_literal) ))) ;) (expression_statement "(*(code *)PTR_safefree_000ad380)(puVar3);" (call_expression "(*(code *)PTR_safefree_000ad380)(puVar3)" (parenthesized_expression "(*(code *)PTR_safefree_000ad380)" ( (pointer_expression "*(code *)PTR_safefree_000ad380" * (cast_expression "(code *)PTR_safefree_000ad380" ( (type_descriptor "code *" type_identifier (abstract_pointer_declarator "*" *)) ) identifier)) )) (argument_list "(puVar3)" ( identifier ))) ;) (return_statement "return;" return ;) })))
(translation_unit (function_definition TYPE (function_declarator IDENT (parameter_list ( (parameter_declaration TYPE (pointer_declarator * IDENT)) , (parameter_declaration TYPE (pointer_declarator * IDENT)) , (parameter_declaration TYPE (pointer_declarator * IDENT)) , (parameter_declaration TYPE IDENT) ))) (compound_statement { (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE IDENT ;) (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE IDENT ;) (declaration TYPE (pointer_declarator * IDENT) ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (declaration TYPE IDENT ;) (expression_statement (assignment_expression IDENT = (pointer_expression * IDENT)) ;) (if_statement if (parenthesized_expression ( (binary_expression (subscript_expression IDENT [ IDENT ]) == LIT) )) (compound_statement { (expression_statement (call_expression (parenthesized_expression ( (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) IDENT)) )) (argument_list ( (binary_expression IDENT + LIT) , (binary_expression IDENT + LIT) , LIT , (binary_expression IDENT + LIT) ))) ;) (return_statement return ;) })) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (call_expression (parenthesized_expression ( (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) IDENT)) )) (argument_list ( IDENT , LIT ))))) ;) (if_statement if (parenthesized_expression ( (binary_expression LIT < IDENT) )) (compound_statement { (expression_statement (assignment_expression IDENT = LIT) ;) (expression_statement (assignment_expression IDENT = IDENT) ;) (do_statement do (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression (pointer_expression * IDENT) - IDENT)) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (expression_statement (assignment_expression (pointer_expression * IDENT) = (subscript_expression IDENT [ IDENT ])) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) }) while (parenthesized_expression ( (binary_expression IDENT != IDENT) )) ;) })) (expression_statement (assignment_expression IDENT = (pointer_expression * IDENT)) ;) (if_statement if (parenthesized_expression ( (binary_expression IDENT <= IDENT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) })) (expression_statement (assignment_expression IDENT = (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) (call_expression (parenthesized_expression ( (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) IDENT)) )) (argument_list ( IDENT , LIT ))))) ;) (if_statement if (parenthesized_expression ( (binary_expression LIT < IDENT) )) (compound_statement { (expression_statement (assignment_expression IDENT = IDENT) ;) (do_statement do (compound_statement { (expression_statement (assignment_expression (pointer_expression * IDENT) = LIT) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) }) while (parenthesized_expression ( (binary_expression IDENT != (binary_expression IDENT + IDENT)) )) ;) })) (if_statement if (parenthesized_expression ( (binary_expression LIT < (pointer_expression * IDENT)) )) (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + IDENT)) ;) (expression_statement (assignment_expression IDENT = LIT) ;) (do_statement do (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (expression_statement (assignment_expression (pointer_expression * IDENT) = (pointer_expression * IDENT)) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) }) while (parenthesized_expression ( (binary_expression IDENT <= (pointer_expression * IDENT)) )) ;) })) (expression_statement (assignment_expression IDENT = (pointer_expression * IDENT)) ;) (expression_statement (assignment_expression IDENT = LIT) ;) (expression_statement (assignment_expression IDENT = LIT) ;) (expression_statement (assignment_expression IDENT = LIT) ;) (expression_statement (assignment_expression IDENT = IDENT) ;) (do_statement do (compound_statement { (if_statement if (parenthesized_expression ( (binary_expression (binary_expression IDENT >> (parenthesized_expression ( (binary_expression (binary_expression LIT - IDENT) & LIT) ))) == LIT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression IDENT << IDENT)) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + IDENT)) ;) })) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT >> LIT)) ;) }) while (parenthesized_expression ( (binary_expression IDENT != LIT) )) ;) (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression IDENT != LIT) )) && (parenthesized_expression ( (comma_expression (assignment_expression IDENT = (binary_expression IDENT << (parenthesized_expression ( (binary_expression IDENT & LIT) )))) , (binary_expression LIT < IDENT)) ))) )) (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression IDENT | (binary_expression (subscript_expression IDENT [ LIT ]) >> (parenthesized_expression ( (binary_expression (unary_expression - IDENT) & LIT) ))))) ;) })) (expression_statement (assignment_expression IDENT = (call_expression IDENT (argument_list ( IDENT )))) ;) (expression_statement (call_expression IDENT (argument_list ( IDENT , IDENT , IDENT , IDENT , IDENT , IDENT , IDENT ))) ;) (if_statement if (parenthesized_expression ( (binary_expression (parenthesized_expression ( (binary_expression IDENT != (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) LIT)) )) && (parenthesized_expression ( (binary_expression LIT < (pointer_expression * IDENT)) ))) )) (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (do_statement do (compound_statement { (while_statement while (parenthesized_expression ( (binary_expression LIT < IDENT) )) (compound_statement { (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (expression_statement (assignment_expression (pointer_expression * IDENT) = (subscript_expression IDENT [ IDENT ])) ;) (expression_statement (assignment_expression IDENT = IDENT) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (if_statement if (parenthesized_expression ( (binary_expression (pointer_expression * IDENT) < (binary_expression IDENT - IDENT)) )) (goto_statement goto statement_identifier ;)) })) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) (expression_statement (assignment_expression (pointer_expression * IDENT) = LIT) ;) (expression_statement (assignment_expression IDENT = (binary_expression IDENT + LIT)) ;) }) while (parenthesized_expression ( (binary_expression (binary_expression IDENT - IDENT) <= (pointer_expression * IDENT)) )) ;) })) (labeled_statement statement_identifier : (expression_statement (call_expression (parenthesized_expression ( (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) IDENT)) )) (argument_list ( IDENT , (binary_expression IDENT * LIT) ))) ;)) (expression_statement (call_expression (parenthesized_expression ( (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) IDENT)) )) (argument_list ( IDENT ))) ;) (expression_statement (call_expression (parenthesized_expression ( (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) IDENT)) )) (argument_list ( IDENT , (binary_expression IDENT << LIT) ))) ;) (expression_statement (call_expression (parenthesized_expression ( (pointer_expression * (cast_expression ( (type_descriptor TYPE (abstract_pointer_declarator *)) ) IDENT)) )) (argument_list ( IDENT ))) ;) (return_statement return ;) })))
(function_definition "void FUN_0004ec24(int *param_1,int *param_2,int *param_3,undefined4 param_4)\n\n{\n  uint *puVar1;\n  int iVar2;\n  undefined4 *puVar3;\n  undefined4 *puVar4;\n  undefined4 uVar5;\n  int iVar6;\n  int *piVar7;\n  uint *puVar8;\n  uint uVar9;\n  int *piVar10;\n  int iVar11;\n  uint uVar12;\n  int iVar13;\n  uint uVar14;\n  \n  iVar13 = *param_2;\n  if (param_2[iVar13] == 0) {\n    (*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328);\n    return;\n  }\n  puVar1 = (uint *)(*(code *)PTR_safemalloc_000ad414)(iVar13,4);\n  if (0 < iVar13) {\n    iVar6 = 0;\n    puVar8 = puVar1;\n    do {\n      iVar2 = *param_2 - iVar6;\n      iVar6 = iVar6 + 1;\n      *puVar8 = param_2[iVar2];\n      puVar8 = puVar8 + 1;\n    } while (iVar13 != iVar6);\n  }\n  iVar6 = *param_1;\n  if (iVar6 <= iVar13) {\n    iVar6 = iVar13 + 1;\n  }\n  puVar3 = (undefined4 *)(*(code *)PTR_safemalloc_000ad414)(iVar6,4);\n  if (0 < iVar6) {\n    puVar4 = puVar3;\n    do {\n      *puVar4 = 0;\n      puVar4 = puVar4 + 1;\n    } while (puVar4 != puVar3 + iVar6);\n  }\n  if (0 < *param_1) {\n    piVar10 = param_1 + 1;\n    piVar7 = puVar3 + iVar6;\n    iVar2 = 1;\n    do {\n      piVar7 = piVar7 + -1;\n      iVar2 = iVar2 + 1;\n      *piVar7 = *piVar10;\n      piVar10 = piVar10 + 1;\n    } while (iVar2 <= *param_1);\n  }\n  uVar9 = *puVar1;\n  iVar11 = 5;\n  uVar14 = 0;\n  iVar2 = 0x10;\n  uVar12 = uVar9;\n  do {\n    if (uVar12 >> (0x20U - iVar2 & 0x1f) == 0) {\n      uVar12 = uVar12 << iVar2;\n      uVar14 = uVar14 + iVar2;\n    }\n    iVar11 = iVar11 + -1;\n    iVar2 = iVar2 >> 1;\n  } while (iVar11 != 0);\n  if ((uVar14 != 0) && (uVar9 = uVar9 << (uVar14 & 0x1f), 1 < iVar13)) {\n    uVar9 = uVar9 | puVar1[1] >> (-uVar14 & 0x1f);\n  }\n  uVar5 = FUN_0004e5b0(uVar9);\n  FUN_0004e858(puVar3,iVar6,puVar1,iVar13,param_4,uVar5,uVar14);\n  if ((param_3 != (int *)0x0) && (0 < *param_3)) {\n    iVar2 = iVar6 + -1;\n    piVar7 = param_3 + 1;\n    do {\n      while (-1 < iVar2) {\n        iVar11 = iVar2 + -1;\n        *piVar7 = puVar3[iVar2];\n        iVar2 = iVar11;\n        piVar7 = piVar7 + 1;\n        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;\n      }\n      iVar2 = iVar2 + -1;\n      *piVar7 = 0;\n      piVar7 = piVar7 + 1;\n    } while (iVar6 - iVar2 <= *param_3);\n  }\nLAB_0004ee3c:\n  (*(code *)PTR_smemclr_000ad430)(puVar1,iVar13 * 4);\n  (*(code *)PTR_safefree_000ad380)(puVar1);\n  (*(code *)PTR_smemclr_000ad430)(puVar3,iVar6 << 2);\n  (*(code *)PTR_safefree_000ad380)(puVar3);\n  return;\n}" (primitive_type "void") (function_declarator "FUN_0004ec24(int *param_1,int *param_2,int *param_3,undefined4 param_4)" (identifier "FUN_0004ec24") (parameter_list "(int *param_1,int *param_2,int *param_3,undefined4 param_4)" (( "(") (parameter_declaration "int *param_1" (primitive_type "int") (pointer_declarator "*param_1" (* "*") (identifier "param_1"))) (, ",") (parameter_declaration "int *param_2" (primitive_type "int") (pointer_declarator "*param_2" (* "*") (identifier "param_2"))) (, ",") (parameter_declaration "int *param_3" (primitive_type "int") (pointer_declarator "*param_3" (* "*") (identifier "param_3"))) (, ",") (parameter_declaration "undefined4 param_4" (type_identifier "undefined4") (identifier "param_4")) () ")"))) (compound_statement "{\n  uint *puVar1;\n  int iVar2;\n  undefined4 *puVar3;\n  undefined4 *puVar4;\n  undefined4 uVar5;\n  int iVar6;\n  int *piVar7;\n  uint *puVar8;\n  uint uVar9;\n  int *piVar10;\n  int iVar11;\n  uint uVar12;\n  int iVar13;\n  uint uVar14;\n  \n  iVar13 = *param_2;\n  if (param_2[iVar13] == 0) {\n    (*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328);\n    return;\n  }\n  puVar1 = (uint *)(*(code *)PTR_safemalloc_000ad414)(iVar13,4);\n  if (0 < iVar13) {\n    iVar6 = 0;\n    puVar8 = puVar1;\n    do {\n      iVar2 = *param_2 - iVar6;\n      iVar6 = iVar6 + 1;\n      *puVar8 = param_2[iVar2];\n      puVar8 = puVar8 + 1;\n    } while (iVar13 != iVar6);\n  }\n  iVar6 = *param_1;\n  if (iVar6 <= iVar13) {\n    iVar6 = iVar13 + 1;\n  }\n  puVar3 = (undefined4 *)(*(code *)PTR_safemalloc_000ad414)(iVar6,4);\n  if (0 < iVar6) {\n    puVar4 = puVar3;\n    do {\n      *puVar4 = 0;\n      puVar4 = puVar4 + 1;\n    } while (puVar4 != puVar3 + iVar6);\n  }\n  if (0 < *param_1) {\n    piVar10 = param_1 + 1;\n    piVar7 = puVar3 + iVar6;\n    iVar2 = 1;\n    do {\n      piVar7 = piVar7 + -1;\n      iVar2 = iVar2 + 1;\n      *piVar7 = *piVar10;\n      piVar10 = piVar10 + 1;\n    } while (iVar2 <= *param_1);\n  }\n  uVar9 = *puVar1;\n  iVar11 = 5;\n  uVar14 = 0;\n  iVar2 = 0x10;\n  uVar12 = uVar9;\n  do {\n    if (uVar12 >> (0x20U - iVar2 & 0x1f) == 0) {\n      uVar12 = uVar12 << iVar2;\n      uVar14 = uVar14 + iVar2;\n    }\n    iVar11 = iVar11 + -1;\n    iVar2 = iVar2 >> 1;\n  } while (iVar11 != 0);\n  if ((uVar14 != 0) && (uVar9 = uVar9 << (uVar14 & 0x1f), 1 < iVar13)) {\n    uVar9 = uVar9 | puVar1[1] >> (-uVar14 & 0x1f);\n  }\n  uVar5 = FUN_0004e5b0(uVar9);\n  FUN_0004e858(puVar3,iVar6,puVar1,iVar13,param_4,uVar5,uVar14);\n  if ((param_3 != (int *)0x0) && (0 < *param_3)) {\n    iVar2 = iVar6 + -1;\n    piVar7 = param_3 + 1;\n    do {\n      while (-1 < iVar2) {\n        iVar11 = iVar2 + -1;\n        *piVar7 = puVar3[iVar2];\n        iVar2 = iVar11;\n        piVar7 = piVar7 + 1;\n        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;\n      }\n      iVar2 = iVar2 + -1;\n      *piVar7 = 0;\n      piVar7 = piVar7 + 1;\n    } while (iVar6 - iVar2 <= *param_3);\n  }\nLAB_0004ee3c:\n  (*(code *)PTR_smemclr_000ad430)(puVar1,iVar13 * 4);\n  (*(code *)PTR_safefree_000ad380)(puVar1);\n  (*(code *)PTR_smemclr_000ad430)(puVar3,iVar6 << 2);\n  (*(code *)PTR_safefree_000ad380)(puVar3);\n  return;\n}" ({ "{") (declaration "uint *puVar1;" (type_identifier "uint") (pointer_declarator "*puVar1" (* "*") (identifier "puVar1")) (; ";")) (declaration "int iVar2;" (primitive_type "int") (identifier "iVar2") (; ";")) (declaration "undefined4 *puVar3;" (type_identifier "undefined4") (pointer_declarator "*puVar3" (* "*") (identifier "puVar3")) (; ";")) (declaration "undefined4 *puVar4;" (type_identifier "undefined4") (pointer_declarator "*puVar4" (* "*") (identifier "puVar4")) (; ";")) (declaration "undefined4 uVar5;" (type_identifier "undefined4") (identifier "uVar5") (; ";")) (declaration "int iVar6;" (primitive_type "int") (identifier "iVar6") (; ";")) (declaration "int *piVar7;" (primitive_type "int") (pointer_declarator "*piVar7" (* "*") (identifier "piVar7")) (; ";")) (declaration "uint *puVar8;" (type_identifier "uint") (pointer_declarator "*puVar8" (* "*") (identifier "puVar8")) (; ";")) (declaration "uint uVar9;" (type_identifier "uint") (identifier "uVar9") (; ";")) (declaration "int *piVar10;" (primitive_type "int") (pointer_declarator "*piVar10" (* "*") (identifier "piVar10")) (; ";")) (declaration "int iVar11;" (primitive_type "int") (identifier "iVar11") (; ";")) (declaration "uint uVar12;" (type_identifier "uint") (identifier "uVar12") (; ";")) (declaration "int iVar13;" (primitive_type "int") (identifier "iVar13") (; ";")) (declaration "uint uVar14;" (type_identifier "uint") (identifier "uVar14") (; ";")) (expression_statement "iVar13 = *param_2;" (assignment_expression "iVar13 = *param_2" (identifier "iVar13") (= "=") (pointer_expression "*param_2" (* "*") (identifier "param_2"))) (; ";")) (if_statement "if (param_2[iVar13] == 0) {\n    (*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328);\n    return;\n  }" (if "if") (parenthesized_expression "(param_2[iVar13] == 0)" (( "(") (binary_expression "param_2[iVar13] == 0" (subscript_expression "param_2[iVar13]" (identifier "param_2") ([ "[") (identifier "iVar13") (] "]")) (== "==") (number_literal "0")) () ")")) (compound_statement "{\n    (*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328);\n    return;\n  }" ({ "{") (expression_statement "(*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328);" (call_expression "(*(code *)PTR___assert_fail_000adb00)\n              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328)" (parenthesized_expression "(*(code *)PTR___assert_fail_000adb00)" (( "(") (pointer_expression "*(code *)PTR___assert_fail_000adb00" (* "*") (cast_expression "(code *)PTR___assert_fail_000adb00" (( "(") (type_descriptor "code *" (type_identifier "code") (abstract_pointer_declarator "*" (* "*"))) () ")") (identifier "PTR___assert_fail_000adb00"))) () ")")) (argument_list "(PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328)" (( "(") (binary_expression "PTR_DAT_000ad2c8 + 0x420c" (identifier "PTR_DAT_000ad2c8") (+ "+") (number_literal "0x420c")) (, ",") (binary_expression "PTR_DAT_000ad2c8 + 0x41d0" (identifier "PTR_DAT_000ad2c8") (+ "+") (number_literal "0x41d0")) (, ",") (number_literal "0x540") (, ",") (binary_expression "PTR_DAT_000ad2c8 + 0x4328" (identifier "PTR_DAT_000ad2c8") (+ "+") (number_literal "0x4328")) () ")"))) (; ";")) (return_statement "return;" (return "return") (; ";")) (} "}"))) (expression_statement "puVar1 = (uint *)(*(code *)PTR_safemalloc_000ad414)(iVar13,4);" (assignment_expression "puVar1 = (uint *)(*(code *)PTR_safemalloc_000ad414)(iVar13,4)" (identifier "puVar1") (= "=") (cast_expression "(uint *)(*(code *)PTR_safemalloc_000ad414)(iVar13,4)" (( "(") (type_descriptor "uint *" (type_identifier "uint") (abstract_pointer_declarator "*" (* "*"))) () ")") (call_expression "(*(code *)PTR_safemalloc_000ad414)(iVar13,4)" (parenthesized_expression "(*(code *)PTR_safemalloc_000ad414)" (( "(") (pointer_expression "*(code *)PTR_safemalloc_000ad414" (* "*") (cast_expression "(code *)PTR_safemalloc_000ad414" (( "(") (type_descriptor "code *" (type_identifier "code") (abstract_pointer_declarator "*" (* "*"))) () ")") (identifier "PTR_safemalloc_000ad414"))) () ")")) (argument_list "(iVar13,4)" (( "(") (identifier "iVar13") (, ",") (number_literal "4") () ")"))))) (; ";")) (if_statement "if (0 < iVar13) {\n    iVar6 = 0;\n    puVar8 = puVar1;\n    do {\n      iVar2 = *param_2 - iVar6;\n      iVar6 = iVar6 + 1;\n      *puVar8 = param_2[iVar2];\n      puVar8 = puVar8 + 1;\n    } while (iVar13 != iVar6);\n  }" (if "if") (parenthesized_expression "(0 < iVar13)" (( "(") (binary_expression "0 < iVar13" (number_literal "0") (< "<") (identifier "iVar13")) () ")")) (compound_statement "{\n    iVar6 = 0;\n    puVar8 = puVar1;\n    do {\n      iVar2 = *param_2 - iVar6;\n      iVar6 = iVar6 + 1;\n      *puVar8 = param_2[iVar2];\n      puVar8 = puVar8 + 1;\n    } while (iVar13 != iVar6);\n  }" ({ "{") (expression_statement "iVar6 = 0;" (assignment_expression "iVar6 = 0" (identifier "iVar6") (= "=") (number_literal "0")) (; ";")) (expression_statement "puVar8 = puVar1;" (assignment_expression "puVar8 = puVar1" (identifier "puVar8") (= "=") (identifier "puVar1")) (; ";")) (do_statement "do {\n      iVar2 = *param_2 - iVar6;\n      iVar6 = iVar6 + 1;\n      *puVar8 = param_2[iVar2];\n      puVar8 = puVar8 + 1;\n    } while (iVar13 != iVar6);" (do "do") (compound_statement "{\n      iVar2 = *param_2 - iVar6;\n      iVar6 = iVar6 + 1;\n      *puVar8 = param_2[iVar2];\n      puVar8 = puVar8 + 1;\n    }" ({ "{") (expression_statement "iVar2 = *param_2 - iVar6;" (assignment_expression "iVar2 = *param_2 - iVar6" (identifier "iVar2") (= "=") (binary_expression "*param_2 - iVar6" (pointer_expression "*param_2" (* "*") (identifier "param_2")) (- "-") (identifier "iVar6"))) (; ";")) (expression_statement "iVar6 = iVar6 + 1;" (assignment_expression "iVar6 = iVar6 + 1" (identifier "iVar6") (= "=") (binary_expression "iVar6 + 1" (identifier "iVar6") (+ "+") (number_literal "1"))) (; ";")) (expression_statement "*puVar8 = param_2[iVar2];" (assignment_expression "*puVar8 = param_2[iVar2]" (pointer_expression "*puVar8" (* "*") (identifier "puVar8")) (= "=") (subscript_expression "param_2[iVar2]" (identifier "param_2") ([ "[") (identifier "iVar2") (] "]"))) (; ";")) (expression_statement "puVar8 = puVar8 + 1;" (assignment_expression "puVar8 = puVar8 + 1" (identifier "puVar8") (= "=") (binary_expression "puVar8 + 1" (identifier "puVar8") (+ "+") (number_literal "1"))) (; ";")) (} "}")) (while "while") (parenthesized_expression "(iVar13 != iVar6)" (( "(") (binary_expression "iVar13 != iVar6" (identifier "iVar13") (!= "!=") (identifier "iVar6")) () ")")) (; ";")) (} "}"))) (expression_statement "iVar6 = *param_1;" (assignment_expression "iVar6 = *param_1" (identifier "iVar6") (= "=") (pointer_expression "*param_1" (* "*") (identifier "param_1"))) (; ";")) (if_statement "if (iVar6 <= iVar13) {\n    iVar6 = iVar13 + 1;\n  }" (if "if") (parenthesized_expression "(iVar6 <= iVar13)" (( "(") (binary_expression "iVar6 <= iVar13" (identifier "iVar6") (<= "<=") (identifier "iVar13")) () ")")) (compound_statement "{\n    iVar6 = iVar13 + 1;\n  }" ({ "{") (expression_statement "iVar6 = iVar13 + 1;" (assignment_expression "iVar6 = iVar13 + 1" (identifier "iVar6") (= "=") (binary_expression "iVar13 + 1" (identifier "iVar13") (+ "+") (number_literal "1"))) (; ";")) (} "}"))) (expression_statement "puVar3 = (undefined4 *)(*(code *)PTR_safemalloc_000ad414)(iVar6,4);" (assignment_expression "puVar3 = (undefined4 *)(*(code *)PTR_safemalloc_000ad414)(iVar6,4)" (identifier "puVar3") (= "=") (cast_expression "(undefined4 *)(*(code *)PTR_safemalloc_000ad414)(iVar6,4)" (( "(") (type_descriptor "undefined4 *" (type_identifier "undefined4") (abstract_pointer_declarator "*" (* "*"))) () ")") (call_expression "(*(code *)PTR_safemalloc_000ad414)(iVar6,4)" (parenthesized_expression "(*(code *)PTR_safemalloc_000ad414)" (( "(") (pointer_expression "*(code *)PTR_safemalloc_000ad414" (* "*") (cast_expression "(code *)PTR_safemalloc_000ad414" (( "(") (type_descriptor "code *" (type_identifier "code") (abstract_pointer_declarator "*" (* "*"))) () ")") (identifier "PTR_safemalloc_000ad414"))) () ")")) (argument_list "(iVar6,4)" (( "(") (identifier "iVar6") (, ",") (number_literal "4") () ")"))))) (; ";")) (if_statement "if (0 < iVar6) {\n    puVar4 = puVar3;\n    do {\n      *puVar4 = 0;\n      puVar4 = puVar4 + 1;\n    } while (puVar4 != puVar3 + iVar6);\n  }" (if "if") (parenthesized_expression "(0 < iVar6)" (( "(") (binary_expression "0 < iVar6" (number_literal "0") (< "<") (identifier "iVar6")) () ")")) (compound_statement "{\n    puVar4 = puVar3;\n    do {\n      *puVar4 = 0;\n      puVar4 = puVar4 + 1;\n    } while (puVar4 != puVar3 + iVar6);\n  }" ({ "{") (expression_statement "puVar4 = puVar3;" (assignment_expression "puVar4 = puVar3" (identifier "puVar4") (= "=") (identifier "puVar3")) (; ";")) (do_statement "do {\n      *puVar4 = 0;\n      puVar4 = puVar4 + 1;\n    } while (puVar4 != puVar3 + iVar6);" (do "do") (compound_statement "{\n      *puVar4 = 0;\n      puVar4 = puVar4 + 1;\n    }" ({ "{") (expression_statement "*puVar4 = 0;" (assignment_expression "*puVar4 = 0" (pointer_expression "*puVar4" (* "*") (identifier "puVar4")) (= "=") (number_literal "0")) (; ";")) (expression_statement "puVar4 = puVar4 + 1;" (assignment_expression "puVar4 = puVar4 + 1" (identifier "puVar4") (= "=") (binary_expression "puVar4 + 1" (identifier "puVar4") (+ "+") (number_literal "1"))) (; ";")) (} "}")) (while "while") (parenthesized_expression "(puVar4 != puVar3 + iVar6)" (( "(") (binary_expression "puVar4 != puVar3 + iVar6" (identifier "puVar4") (!= "!=") (binary_expression "puVar3 + iVar6" (identifier "puVar3") (+ "+") (identifier "iVar6"))) () ")")) (; ";")) (} "}"))) (if_statement "if (0 < *param_1) {\n    piVar10 = param_1 + 1;\n    piVar7 = puVar3 + iVar6;\n    iVar2 = 1;\n    do {\n      piVar7 = piVar7 + -1;\n      iVar2 = iVar2 + 1;\n      *piVar7 = *piVar10;\n      piVar10 = piVar10 + 1;\n    } while (iVar2 <= *param_1);\n  }" (if "if") (parenthesized_expression "(0 < *param_1)" (( "(") (binary_expression "0 < *param_1" (number_literal "0") (< "<") (pointer_expression "*param_1" (* "*") (identifier "param_1"))) () ")")) (compound_statement "{\n    piVar10 = param_1 + 1;\n    piVar7 = puVar3 + iVar6;\n    iVar2 = 1;\n    do {\n      piVar7 = piVar7 + -1;\n      iVar2 = iVar2 + 1;\n      *piVar7 = *piVar10;\n      piVar10 = piVar10 + 1;\n    } while (iVar2 <= *param_1);\n  }" ({ "{") (expression_statement "piVar10 = param_1 + 1;" (assignment_expression "piVar10 = param_1 + 1" (identifier "piVar10") (= "=") (binary_expression "param_1 + 1" (identifier "param_1") (+ "+") (number_literal "1"))) (; ";")) (expression_statement "piVar7 = puVar3 + iVar6;" (assignment_expression "piVar7 = puVar3 + iVar6" (identifier "piVar7") (= "=") (binary_expression "puVar3 + iVar6" (identifier "puVar3") (+ "+") (identifier "iVar6"))) (; ";")) (expression_statement "iVar2 = 1;" (assignment_expression "iVar2 = 1" (identifier "iVar2") (= "=") (number_literal "1")) (; ";")) (do_statement "do {\n      piVar7 = piVar7 + -1;\n      iVar2 = iVar2 + 1;\n      *piVar7 = *piVar10;\n      piVar10 = piVar10 + 1;\n    } while (iVar2 <= *param_1);" (do "do") (compound_statement "{\n      piVar7 = piVar7 + -1;\n      iVar2 = iVar2 + 1;\n      *piVar7 = *piVar10;\n      piVar10 = piVar10 + 1;\n    }" ({ "{") (expression_statement "piVar7 = piVar7 + -1;" (assignment_expression "piVar7 = piVar7 + -1" (identifier "piVar7") (= "=") (binary_expression "piVar7 + -1" (identifier "piVar7") (+ "+") (number_literal "-1"))) (; ";")) (expression_statement "iVar2 = iVar2 + 1;" (assignment_expression "iVar2 = iVar2 + 1" (identifier "iVar2") (= "=") (binary_expression "iVar2 + 1" (identifier "iVar2") (+ "+") (number_literal "1"))) (; ";")) (expression_statement "*piVar7 = *piVar10;" (assignment_expression "*piVar7 = *piVar10" (pointer_expression "*piVar7" (* "*") (identifier "piVar7")) (= "=") (pointer_expression "*piVar10" (* "*") (identifier "piVar10"))) (; ";")) (expression_statement "piVar10 = piVar10 + 1;" (assignment_expression "piVar10 = piVar10 + 1" (identifier "piVar10") (= "=") (binary_expression "piVar10 + 1" (identifier "piVar10") (+ "+") (number_literal "1"))) (; ";")) (} "}")) (while "while") (parenthesized_expression "(iVar2 <= *param_1)" (( "(") (binary_expression "iVar2 <= *param_1" (identifier "iVar2") (<= "<=") (pointer_expression "*param_1" (* "*") (identifier "param_1"))) () ")")) (; ";")) (} "}"))) (expression_statement "uVar9 = *puVar1;" (assignment_expression "uVar9 = *puVar1" (identifier "uVar9") (= "=") (pointer_expression "*puVar1" (* "*") (identifier "puVar1"))) (; ";")) (expression_statement "iVar11 = 5;" (assignment_expression "iVar11 = 5" (identifier "iVar11") (= "=") (number_literal "5")) (; ";")) (expression_statement "uVar14 = 0;" (assignment_expression "uVar14 = 0" (identifier "uVar14") (= "=") (number_literal "0")) (; ";")) (expression_statement "iVar2 = 0x10;" (assignment_expression "iVar2 = 0x10" (identifier "iVar2") (= "=") (number_literal "0x10")) (; ";")) (expression_statement "uVar12 = uVar9;" (assignment_expression "uVar12 = uVar9" (identifier "uVar12") (= "=") (identifier "uVar9")) (; ";")) (do_statement "do {\n    if (uVar12 >> (0x20U - iVar2 & 0x1f) == 0) {\n      uVar12 = uVar12 << iVar2;\n      uVar14 = uVar14 + iVar2;\n    }\n    iVar11 = iVar11 + -1;\n    iVar2 = iVar2 >> 1;\n  } while (iVar11 != 0);" (do "do") (compound_statement "{\n    if (uVar12 >> (0x20U - iVar2 & 0x1f) == 0) {\n      uVar12 = uVar12 << iVar2;\n      uVar14 = uVar14 + iVar2;\n    }\n    iVar11 = iVar11 + -1;\n    iVar2 = iVar2 >> 1;\n  }" ({ "{") (if_statement "if (uVar12 >> (0x20U - iVar2 & 0x1f) == 0) {\n      uVar12 = uVar12 << iVar2;\n      uVar14 = uVar14 + iVar2;\n    }" (if "if") (parenthesized_expression "(uVar12 >> (0x20U - iVar2 & 0x1f) == 0)" (( "(") (binary_expression "uVar12 >> (0x20U - iVar2 & 0x1f) == 0" (binary_expression "uVar12 >> (0x20U - iVar2 & 0x1f)" (identifier "uVar12") (>> ">>") (parenthesized_expression "(0x20U - iVar2 & 0x1f)" (( "(") (binary_expression "0x20U - iVar2 & 0x1f" (binary_expression "0x20U - iVar2" (number_literal "0x20U") (- "-") (identifier "iVar2")) (& "&") (number_literal "0x1f")) () ")"))) (== "==") (number_literal "0")) () ")")) (compound_statement "{\n      uVar12 = uVar12 << iVar2;\n      uVar14 = uVar14 + iVar2;\n    }" ({ "{") (expression_statement "uVar12 = uVar12 << iVar2;" (assignment_expression "uVar12 = uVar12 << iVar2" (identifier "uVar12") (= "=") (binary_expression "uVar12 << iVar2" (identifier "uVar12") (<< "<<") (identifier "iVar2"))) (; ";")) (expression_statement "uVar14 = uVar14 + iVar2;" (assignment_expression "uVar14 = uVar14 + iVar2" (identifier "uVar14") (= "=") (binary_expression "uVar14 + iVar2" (identifier "uVar14") (+ "+") (identifier "iVar2"))) (; ";")) (} "}"))) (expression_statement "iVar11 = iVar11 + -1;" (assignment_expression "iVar11 = iVar11 + -1" (identifier "iVar11") (= "=") (binary_expression "iVar11 + -1" (identifier "iVar11") (+ "+") (number_literal "-1"))) (; ";")) (expression_statement "iVar2 = iVar2 >> 1;" (assignment_expression "iVar2 = iVar2 >> 1" (identifier "iVar2") (= "=") (binary_expression "iVar2 >> 1" (identifier "iVar2") (>> ">>") (number_literal "1"))) (; ";")) (} "}")) (while "while") (parenthesized_expression "(iVar11 != 0)" (( "(") (binary_expression "iVar11 != 0" (identifier "iVar11") (!= "!=") (number_literal "0")) () ")")) (; ";")) (if_statement "if ((uVar14 != 0) && (uVar9 = uVar9 << (uVar14 & 0x1f), 1 < iVar13)) {\n    uVar9 = uVar9 | puVar1[1] >> (-uVar14 & 0x1f);\n  }" (if "if") (parenthesized_expression "((uVar14 != 0) && (uVar9 = uVar9 << (uVar14 & 0x1f), 1 < iVar13))" (( "(") (binary_expression "(uVar14 != 0) && (uVar9 = uVar9 << (uVar14 & 0x1f), 1 < iVar13)" (parenthesized_expression "(uVar14 != 0)" (( "(") (binary_expression "uVar14 != 0" (identifier "uVar14") (!= "!=") (number_literal "0")) () ")")) (&& "&&") (parenthesized_expression "(uVar9 = uVar9 << (uVar14 & 0x1f), 1 < iVar13)" (( "(") (comma_expression "uVar9 = uVar9 << (uVar14 & 0x1f), 1 < iVar13" (assignment_expression "uVar9 = uVar9 << (uVar14 & 0x1f)" (identifier "uVar9") (= "=") (binary_expression "uVar9 << (uVar14 & 0x1f)" (identifier "uVar9") (<< "<<") (parenthesized_expression "(uVar14 & 0x1f)" (( "(") (binary_expression "uVar14 & 0x1f" (identifier "uVar14") (& "&") (number_literal "0x1f")) () ")")))) (, ",") (binary_expression "1 < iVar13" (number_literal "1") (< "<") (identifier "iVar13"))) () ")"))) () ")")) (compound_statement "{\n    uVar9 = uVar9 | puVar1[1] >> (-uVar14 & 0x1f);\n  }" ({ "{") (expression_statement "uVar9 = uVar9 | puVar1[1] >> (-uVar14 & 0x1f);" (assignment_expression "uVar9 = uVar9 | puVar1[1] >> (-uVar14 & 0x1f)" (identifier "uVar9") (= "=") (binary_expression "uVar9 | puVar1[1] >> (-uVar14 & 0x1f)" (identifier "uVar9") (| "|") (binary_expression "puVar1[1] >> (-uVar14 & 0x1f)" (subscript_expression "puVar1[1]" (identifier "puVar1") ([ "[") (number_literal "1") (] "]")) (>> ">>") (parenthesized_expression "(-uVar14 & 0x1f)" (( "(") (binary_expression "-uVar14 & 0x1f" (unary_expression "-uVar14" (- "-") (identifier "uVar14")) (& "&") (number_literal "0x1f")) () ")"))))) (; ";")) (} "}"))) (expression_statement "uVar5 = FUN_0004e5b0(uVar9);" (assignment_expression "uVar5 = FUN_0004e5b0(uVar9)" (identifier "uVar5") (= "=") (call_expression "FUN_0004e5b0(uVar9)" (identifier "FUN_0004e5b0") (argument_list "(uVar9)" (( "(") (identifier "uVar9") () ")")))) (; ";")) (expression_statement "FUN_0004e858(puVar3,iVar6,puVar1,iVar13,param_4,uVar5,uVar14);" (call_expression "FUN_0004e858(puVar3,iVar6,puVar1,iVar13,param_4,uVar5,uVar14)" (identifier "FUN_0004e858") (argument_list "(puVar3,iVar6,puVar1,iVar13,param_4,uVar5,uVar14)" (( "(") (identifier "puVar3") (, ",") (identifier "iVar6") (, ",") (identifier "puVar1") (, ",") (identifier "iVar13") (, ",") (identifier "param_4") (, ",") (identifier "uVar5") (, ",") (identifier "uVar14") () ")"))) (; ";")) (if_statement "if ((param_3 != (int *)0x0) && (0 < *param_3)) {\n    iVar2 = iVar6 + -1;\n    piVar7 = param_3 + 1;\n    do {\n      while (-1 < iVar2) {\n        iVar11 = iVar2 + -1;\n        *piVar7 = puVar3[iVar2];\n        iVar2 = iVar11;\n        piVar7 = piVar7 + 1;\n        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;\n      }\n      iVar2 = iVar2 + -1;\n      *piVar7 = 0;\n      piVar7 = piVar7 + 1;\n    } while (iVar6 - iVar2 <= *param_3);\n  }" (if "if") (parenthesized_expression "((param_3 != (int *)0x0) && (0 < *param_3))" (( "(") (binary_expression "(param_3 != (int *)0x0) && (0 < *param_3)" (parenthesized_expression "(param_3 != (int *)0x0)" (( "(") (binary_expression "param_3 != (int *)0x0" (identifier "param_3") (!= "!=") (cast_expression "(int *)0x0" (( "(") (type_descriptor "int *" (primitive_type "int") (abstract_pointer_declarator "*" (* "*"))) () ")") (number_literal "0x0"))) () ")")) (&& "&&") (parenthesized_expression "(0 < *param_3)" (( "(") (binary_expression "0 < *param_3" (number_literal "0") (< "<") (pointer_expression "*param_3" (* "*") (identifier "param_3"))) () ")"))) () ")")) (compound_statement "{\n    iVar2 = iVar6 + -1;\n    piVar7 = param_3 + 1;\n    do {\n      while (-1 < iVar2) {\n        iVar11 = iVar2 + -1;\n        *piVar7 = puVar3[iVar2];\n        iVar2 = iVar11;\n        piVar7 = piVar7 + 1;\n        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;\n      }\n      iVar2 = iVar2 + -1;\n      *piVar7 = 0;\n      piVar7 = piVar7 + 1;\n    } while (iVar6 - iVar2 <= *param_3);\n  }" ({ "{") (expression_statement "iVar2 = iVar6 + -1;" (assignment_expression "iVar2 = iVar6 + -1" (identifier "iVar2") (= "=") (binary_expression "iVar6 + -1" (identifier "iVar6") (+ "+") (number_literal "-1"))) (; ";")) (expression_statement "piVar7 = param_3 + 1;" (assignment_expression "piVar7 = param_3 + 1" (identifier "piVar7") (= "=") (binary_expression "param_3 + 1" (identifier "param_3") (+ "+") (number_literal "1"))) (; ";")) (do_statement "do {\n      while (-1 < iVar2) {\n        iVar11 = iVar2 + -1;\n        *piVar7 = puVar3[iVar2];\n        iVar2 = iVar11;\n        piVar7 = piVar7 + 1;\n        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;\n      }\n      iVar2 = iVar2 + -1;\n      *piVar7 = 0;\n      piVar7 = piVar7 + 1;\n    } while (iVar6 - iVar2 <= *param_3);" (do "do") (compound_statement "{\n      while (-1 < iVar2) {\n        iVar11 = iVar2 + -1;\n        *piVar7 = puVar3[iVar2];\n        iVar2 = iVar11;\n        piVar7 = piVar7 + 1;\n        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;\n      }\n      iVar2 = iVar2 + -1;\n      *piVar7 = 0;\n      piVar7 = piVar7 + 1;\n    }" ({ "{") (while_statement "while (-1 < iVar2) {\n        iVar11 = iVar2 + -1;\n        *piVar7 = puVar3[iVar2];\n        iVar2 = iVar11;\n        piVar7 = piVar7 + 1;\n        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;\n      }" (while "while") (parenthesized_expression "(-1 < iVar2)" (( "(") (binary_expression "-1 < iVar2" (number_literal "-1") (< "<") (identifier "iVar2")) () ")")) (compound_statement "{\n        iVar11 = iVar2 + -1;\n        *piVar7 = puVar3[iVar2];\n        iVar2 = iVar11;\n        piVar7 = piVar7 + 1;\n        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;\n      }" ({ "{") (expression_statement "iVar11 = iVar2 + -1;" (assignment_expression "iVar11 = iVar2 + -1" (identifier "iVar11") (= "=") (binary_expression "iVar2 + -1" (identifier "iVar2") (+ "+") (number_literal "-1"))) (; ";")) (expression_statement "*piVar7 = puVar3[iVar2];" (assignment_expression "*piVar7 = puVar3[iVar2]" (pointer_expression "*piVar7" (* "*") (identifier "piVar7")) (= "=") (subscript_expression "puVar3[iVar2]" (identifier "puVar3") ([ "[") (identifier "iVar2") (] "]"))) (; ";")) (expression_statement "iVar2 = iVar11;" (assignment_expression "iVar2 = iVar11" (identifier "iVar2") (= "=") (identifier "iVar11")) (; ";")) (expression_statement "piVar7 = piVar7 + 1;" (assignment_expression "piVar7 = piVar7 + 1" (identifier "piVar7") (= "=") (binary_expression "piVar7 + 1" (identifier "piVar7") (+ "+") (number_literal "1"))) (; ";")) (if_statement "if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;" (if "if") (parenthesized_expression "(*param_3 < iVar6 - iVar11)" (( "(") (binary_expression "*param_3 < iVar6 - iVar11" (pointer_expression "*param_3" (* "*") (identifier "param_3")) (< "<") (binary_expression "iVar6 - iVar11" (identifier "iVar6") (- "-") (identifier "iVar11"))) () ")")) (goto_statement "goto LAB_0004ee3c;" (goto "goto") (statement_identifier "LAB_0004ee3c") (; ";"))) (} "}"))) (expression_statement "iVar2 = iVar2 + -1;" (assignment_expression "iVar2 = iVar2 + -1" (identifier "iVar2") (= "=") (binary_expression "iVar2 + -1" (identifier "iVar2") (+ "+") (number_literal "-1"))) (; ";")) (expression_statement "*piVar7 = 0;" (assignment_expression "*piVar7 = 0" (pointer_expression "*piVar7" (* "*") (identifier "piVar7")) (= "=") (number_literal "0")) (; ";")) (expression_statement "piVar7 = piVar7 + 1;" (assignment_expression "piVar7 = piVar7 + 1" (identifier "piVar7") (= "=") (binary_expression "piVar7 + 1" (identifier "piVar7") (+ "+") (number_literal "1"))) (; ";")) (} "}")) (while "while") (parenthesized_expression "(iVar6 - iVar2 <= *param_3)" (( "(") (binary_expression "iVar6 - iVar2 <= *param_3" (binary_expression "iVar6 - iVar2" (identifier "iVar6") (- "-") (identifier "iVar2")) (<= "<=") (pointer_expression "*param_3" (* "*") (identifier "param_3"))) () ")")) (; ";")) (} "}"))) (labeled_statement "LAB_0004ee3c:\n  (*(code *)PTR_smemclr_000ad430)(puVar1,iVar13 * 4);" (statement_identifier "LAB_0004ee3c") (: ":") (expression_statement "(*(code *)PTR_smemclr_000ad430)(puVar1,iVar13 * 4);" (call_expression "(*(code *)PTR_smemclr_000ad430)(puVar1,iVar13 * 4)" (parenthesized_expression "(*(code *)PTR_smemclr_000ad430)" (( "(") (pointer_expression "*(code *)PTR_smemclr_000ad430" (* "*") (cast_expression "(code *)PTR_smemclr_000ad430" (( "(") (type_descriptor "code *" (type_identifier "code") (abstract_pointer_declarator "*" (* "*"))) () ")") (identifier "PTR_smemclr_000ad430"))) () ")")) (argument_list "(puVar1,iVar13 * 4)" (( "(") (identifier "puVar1") (, ",") (binary_expression "iVar13 * 4" (identifier "iVar13") (* "*") (number_literal "4")) () ")"))) (; ";"))) (expression_statement "(*(code *)PTR_safefree_000ad380)(puVar1);" (call_expression "(*(code *)PTR_safefree_000ad380)(puVar1)" (parenthesized_expression "(*(code *)PTR_safefree_000ad380)" (( "(") (pointer_expression "*(code *)PTR_safefree_000ad380" (* "*") (cast_expression "(code *)PTR_safefree_000ad380" (( "(") (type_descriptor "code *" (type_identifier "code") (abstract_pointer_declarator "*" (* "*"))) () ")") (identifier "PTR_safefree_000ad380"))) () ")")) (argument_list "(puVar1)" (( "(") (identifier "puVar1") () ")"))) (; ";")) (expression_statement "(*(code *)PTR_smemclr_000ad430)(puVar3,iVar6 << 2);" (call_expression "(*(code *)PTR_smemclr_000ad430)(puVar3,iVar6 << 2)" (parenthesized_expression "(*(code *)PTR_smemclr_000ad430)" (( "(") (pointer_expression "*(code *)PTR_smemclr_000ad430" (* "*") (cast_expression "(code *)PTR_smemclr_000ad430" (( "(") (type_descriptor "code *" (type_identifier "code") (abstract_pointer_declarator "*" (* "*"))) () ")") (identifier "PTR_smemclr_000ad430"))) () ")")) (argument_list "(puVar3,iVar6 << 2)" (( "(") (identifier "puVar3") (, ",") (binary_expression "iVar6 << 2" (identifier "iVar6") (<< "<<") (number_literal "2")) () ")"))) (; ";")) (expression_statement "(*(code *)PTR_safefree_000ad380)(puVar3);" (call_expression "(*(code *)PTR_safefree_000ad380)(puVar3)" (parenthesized_expression "(*(code *)PTR_safefree_000ad380)" (( "(") (pointer_expression "*(code *)PTR_safefree_000ad380" (* "*") (cast_expression "(code *)PTR_safefree_000ad380" (( "(") (type_descriptor "code *" (type_identifier "code") (abstract_pointer_declarator "*" (* "*"))) () ")") (identifier "PTR_safefree_000ad380"))) () ")")) (argument_list "(puVar3)" (( "(") (identifier "puVar3") () ")"))) (; ";")) (return_statement "return;" (return "return") (; ";")) (} "}")))
(translation_unit (function_definition type: (primitive_type) declarator: (function_declarator declarator: (identifier) parameters: (parameter_list (parameter_declaration type: (primitive_type) declarator: (pointer_declarator declarator: (identifier))) (parameter_declaration type: (primitive_type) declarator: (pointer_declarator declarator: (identifier))) (parameter_declaration type: (primitive_type) declarator: (pointer_declarator declarator: (identifier))) (parameter_declaration type: (type_identifier) declarator: (identifier)))) body: (compound_statement (declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (primitive_type) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (type_identifier) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (primitive_type) declarator: (pointer_declarator declarator: (identifier))) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (declaration type: (primitive_type) declarator: (identifier)) (declaration type: (type_identifier) declarator: (identifier)) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (identifier)))) (if_statement condition: (parenthesized_expression (binary_expression left: (subscript_expression argument: (identifier) index: (identifier)) right: (number_literal))) consequence: (compound_statement (expression_statement (call_expression function: (parenthesized_expression (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (identifier)))) arguments: (argument_list (binary_expression left: (identifier) right: (number_literal)) (binary_expression left: (identifier) right: (number_literal)) (number_literal) (binary_expression left: (identifier) right: (number_literal))))) (return_statement))) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (call_expression function: (parenthesized_expression (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (identifier)))) arguments: (argument_list (identifier) (number_literal)))))) (if_statement condition: (parenthesized_expression (binary_expression left: (number_literal) right: (identifier))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (number_literal))) (expression_statement (assignment_expression left: (identifier) right: (identifier))) (do_statement body: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (pointer_expression argument: (identifier)) right: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (subscript_expression argument: (identifier) index: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal))))) condition: (parenthesized_expression (binary_expression left: (identifier) right: (identifier)))))) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (identifier)))) (if_statement condition: (parenthesized_expression (binary_expression left: (identifier) right: (identifier))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))))) (expression_statement (assignment_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (call_expression function: (parenthesized_expression (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (identifier)))) arguments: (argument_list (identifier) (number_literal)))))) (if_statement condition: (parenthesized_expression (binary_expression left: (number_literal) right: (identifier))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (identifier))) (do_statement body: (compound_statement (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (number_literal))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal))))) condition: (parenthesized_expression (binary_expression left: (identifier) right: (binary_expression left: (identifier) right: (identifier))))))) (if_statement condition: (parenthesized_expression (binary_expression left: (number_literal) right: (pointer_expression argument: (identifier)))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (number_literal))) (do_statement body: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (pointer_expression argument: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal))))) condition: (parenthesized_expression (binary_expression left: (identifier) right: (pointer_expression argument: (identifier))))))) (expression_statement (assignment_expression left: (identifier) right: (pointer_expression argument: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (number_literal))) (expression_statement (assignment_expression left: (identifier) right: (number_literal))) (expression_statement (assignment_expression left: (identifier) right: (number_literal))) (expression_statement (assignment_expression left: (identifier) right: (identifier))) (do_statement body: (compound_statement (if_statement condition: (parenthesized_expression (binary_expression left: (binary_expression left: (identifier) right: (parenthesized_expression (binary_expression left: (binary_expression left: (number_literal) right: (identifier)) right: (number_literal)))) right: (number_literal))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (identifier)))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal))))) condition: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal)))) (if_statement condition: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))) right: (parenthesized_expression (comma_expression left: (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (parenthesized_expression (binary_expression left: (identifier) right: (number_literal))))) right: (binary_expression left: (number_literal) right: (identifier)))))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (binary_expression left: (subscript_expression argument: (identifier) index: (number_literal)) right: (parenthesized_expression (binary_expression left: (unary_expression argument: (identifier)) right: (number_literal))))))))) (expression_statement (assignment_expression left: (identifier) right: (call_expression function: (identifier) arguments: (argument_list (identifier))))) (expression_statement (call_expression function: (identifier) arguments: (argument_list (identifier) (identifier) (identifier) (identifier) (identifier) (identifier) (identifier)))) (if_statement condition: (parenthesized_expression (binary_expression left: (parenthesized_expression (binary_expression left: (identifier) right: (cast_expression type: (type_descriptor type: (primitive_type) declarator: (abstract_pointer_declarator)) value: (number_literal)))) right: (parenthesized_expression (binary_expression left: (number_literal) right: (pointer_expression argument: (identifier)))))) consequence: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (do_statement body: (compound_statement (while_statement condition: (parenthesized_expression (binary_expression left: (number_literal) right: (identifier))) body: (compound_statement (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (subscript_expression argument: (identifier) index: (identifier)))) (expression_statement (assignment_expression left: (identifier) right: (identifier))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (if_statement condition: (parenthesized_expression (binary_expression left: (pointer_expression argument: (identifier)) right: (binary_expression left: (identifier) right: (identifier)))) consequence: (goto_statement label: (statement_identifier))))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal)))) (expression_statement (assignment_expression left: (pointer_expression argument: (identifier)) right: (number_literal))) (expression_statement (assignment_expression left: (identifier) right: (binary_expression left: (identifier) right: (number_literal))))) condition: (parenthesized_expression (binary_expression left: (binary_expression left: (identifier) right: (identifier)) right: (pointer_expression argument: (identifier))))))) (labeled_statement label: (statement_identifier) (expression_statement (call_expression function: (parenthesized_expression (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (identifier)))) arguments: (argument_list (identifier) (binary_expression left: (identifier) right: (number_literal)))))) (expression_statement (call_expression function: (parenthesized_expression (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (identifier)))) arguments: (argument_list (identifier)))) (expression_statement (call_expression function: (parenthesized_expression (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (identifier)))) arguments: (argument_list (identifier) (binary_expression left: (identifier) right: (number_literal))))) (expression_statement (call_expression function: (parenthesized_expression (pointer_expression argument: (cast_expression type: (type_descriptor type: (type_identifier) declarator: (abstract_pointer_declarator)) value: (identifier)))) arguments: (argument_list (identifier)))) (return_statement))))

void MASKED(int *param_1,int *param_2,int *param_3,undefined4 param_4)

{
  uint *puVar1;
  int iVar2;
  undefined4 *puVar3;
  undefined4 *puVar4;
  undefined4 uVar5;
  int iVar6;
  int *piVar7;
  uint *puVar8;
  uint uVar9;
  int *piVar10;
  int iVar11;
  uint uVar12;
  int iVar13;
  uint uVar14;
  
  iVar13 = *param_2;
  if (param_2[iVar13] == 0) {
    (*(code *)PTR___assert_fail_000adb00)
              (PTR_DAT_000ad2c8 + 0x420c,PTR_DAT_000ad2c8 + 0x41d0,0x540,PTR_DAT_000ad2c8 + 0x4328);
    return;
  }
  puVar1 = (uint *)(*(code *)PTR_safemalloc_000ad414)(iVar13,4);
  if (0 < iVar13) {
    iVar6 = 0;
    puVar8 = puVar1;
    do {
      iVar2 = *param_2 - iVar6;
      iVar6 = iVar6 + 1;
      *puVar8 = param_2[iVar2];
      puVar8 = puVar8 + 1;
    } while (iVar13 != iVar6);
  }
  iVar6 = *param_1;
  if (iVar6 <= iVar13) {
    iVar6 = iVar13 + 1;
  }
  puVar3 = (undefined4 *)(*(code *)PTR_safemalloc_000ad414)(iVar6,4);
  if (0 < iVar6) {
    puVar4 = puVar3;
    do {
      *puVar4 = 0;
      puVar4 = puVar4 + 1;
    } while (puVar4 != puVar3 + iVar6);
  }
  if (0 < *param_1) {
    piVar10 = param_1 + 1;
    piVar7 = puVar3 + iVar6;
    iVar2 = 1;
    do {
      piVar7 = piVar7 + -1;
      iVar2 = iVar2 + 1;
      *piVar7 = *piVar10;
      piVar10 = piVar10 + 1;
    } while (iVar2 <= *param_1);
  }
  uVar9 = *puVar1;
  iVar11 = 5;
  uVar14 = 0;
  iVar2 = 0x10;
  uVar12 = uVar9;
  do {
    if (uVar12 >> (0x20U - iVar2 & 0x1f) == 0) {
      uVar12 = uVar12 << iVar2;
      uVar14 = uVar14 + iVar2;
    }
    iVar11 = iVar11 + -1;
    iVar2 = iVar2 >> 1;
  } while (iVar11 != 0);
  if ((uVar14 != 0) && (uVar9 = uVar9 << (uVar14 & 0x1f), 1 < iVar13)) {
    uVar9 = uVar9 | puVar1[1] >> (-uVar14 & 0x1f);
  }
  uVar5 = FUN_0004e5b0(uVar9);
  FUN_0004e858(puVar3,iVar6,puVar1,iVar13,param_4,uVar5,uVar14);
  if ((param_3 != (int *)0x0) && (0 < *param_3)) {
    iVar2 = iVar6 + -1;
    piVar7 = param_3 + 1;
    do {
      while (-1 < iVar2) {
        iVar11 = iVar2 + -1;
        *piVar7 = puVar3[iVar2];
        iVar2 = iVar11;
        piVar7 = piVar7 + 1;
        if (*param_3 < iVar6 - iVar11) goto LAB_0004ee3c;
      }
      iVar2 = iVar2 + -1;
      *piVar7 = 0;
      piVar7 = piVar7 + 1;
    } while (iVar6 - iVar2 <= *param_3);
  }
LAB_0004ee3c:
  (*(code *)PTR_smemclr_000ad430)(puVar1,iVar13 * 4);
  (*(code *)PTR_safefree_000ad380)(puVar1);
  (*(code *)PTR_smemclr_000ad430)(puVar3,iVar6 << 2);
  (*(code *)PTR_safefree_000ad380)(puVar3);
  return;
}

