int FUN_004040e4(int *param_1,undefined4 param_2)

{
  undefined1 uVar1;
  uint uVar2;
  undefined1 *puVar3;
  undefined1 *puVar4;
  int iVar5;
  int iVar6;
  int iVar7;
  int iVar8;
  undefined1 local_78 [15];
  undefined1 local_69;
  undefined4 local_68;
  undefined4 local_64;
  undefined1 auStack_60 [16];
  int local_50;
  undefined1 auStack_4c [12];
  int local_40;
  undefined1 auStack_3c [24];
  
  iVar6 = *param_1;
  if (iVar6 == 0) {
    iVar5 = -0x16;
  }
  else {
    iVar7 = *(int *)(iVar6 + 0x18);
    iVar5 = -0x16;
    if (iVar7 != 0) {
      iVar8 = *(int *)(iVar7 + 8);
      iVar5 = -0xc;
      if (*(int *)(iVar7 + 0x1c) != 0) {
        *(int *)(iVar7 + 0x1c) = *(int *)(iVar7 + 0x1c) + -1;
        iVar5 = FUN_0040294c(iVar7 + 0x20,*(undefined4 *)(iVar7 + 0x18),0);
        FUN_004028c0(iVar7 + 0x20,iVar5,0);
        if (-1 < iVar5) {
          FUN_00402620(auStack_4c,0,0x80);
          local_40 = iVar5 + *(int *)(iVar7 + 0x14);
          FUN_00402fec(auStack_3c,auStack_4c,0x20 - *(int *)(iVar7 + 0x10),0x80);
          FUN_00402e30(local_78,auStack_3c,*(undefined4 *)(iVar8 + 0x24),0x80);
          puVar3 = &local_69;
          puVar4 = local_78;
          do {
            uVar1 = *puVar4;
            *puVar4 = *puVar3;
            *puVar3 = uVar1;
            puVar4 = puVar4 + 1;
            puVar3 = puVar3 + -1;
          } while (puVar4 < puVar3);
          FUN_00402740(auStack_60,iVar8 + 0x14,local_78,0x80);
          local_68 = *(undefined4 *)(iVar8 + 0xc);
          local_64 = *(undefined4 *)(iVar8 + 0x10);
          local_50 = *(int *)(iVar7 + 0x10) + *(int *)(iVar8 + 0x24);
          iVar5 = add_prefix(param_2,*(undefined4 *)(*(int *)(iVar6 + 0x18) + 4),5,&local_68);
          if ((iVar5 < 0) ||
             (iVar5 = add_prefix(iVar6 + 0x10,*(undefined4 *)(*(int *)(iVar6 + 0x18) + 4),5,
                                 &local_68), iVar5 < 0)) {
            uVar2 = FUN_00403150(*(undefined4 *)(iVar6 + 0x18),&local_68);
            if (-1 < (int)uVar2) {
              iVar6 = *(int *)(iVar6 + 0x18);
              if (uVar2 < *(uint *)(iVar6 + 0x18)) {
                *(int *)(iVar6 + 0x1c) = *(int *)(iVar6 + 0x1c) + 1;
                FUN_00402944(iVar6 + 0x20,uVar2,0);
                return -1;
              }
            }
            iVar5 = -1;
          }
          else {
            FUN_00402d08(param_1,&local_68);
            iVar5 = 0;
          }
        }
      }
    }
  }
  return iVar5;
}