void FUN_00409248(void *param_1)

{
  int *piVar1;
  int iVar2;
  int *piVar3;
  
  switch(*(undefined4 *)((int)param_1 + 8)) {
  case 0:
    if (*(void **)((int)param_1 + 0x10) != (void *)0x0) {
      free(*(void **)((int)param_1 + 0x10));
    }
    iVar2 = (int)param_1 + 0x18;
    goto LAB_0040939c;
  case 1:
    while (piVar3 = *(int **)((int)param_1 + 0xc), piVar3 != (int *)((int)param_1 + 0xc)) {
      piVar1 = (int *)piVar3[1];
      iVar2 = *piVar3;
      *piVar1 = iVar2;
      *(int **)(iVar2 + 4) = piVar1;
      *piVar3 = 0;
      piVar3[1] = 0;
      FUN_00408e24(piVar3);
    }
    FUN_00409728((int)param_1 + 0x14);
    iVar2 = (int)param_1 + 0x1c;
    break;
  case 2:
    if (*(void **)((int)param_1 + 0xc) != (void *)0x0) {
      free(*(void **)((int)param_1 + 0xc));
    }
    FUN_00407df4((int)param_1 + 0x14);
    goto switchD_00409294_default;
  case 3:
    while( true ) {
      piVar3 = *(int **)((int)param_1 + 0xc);
      iVar2 = (int)param_1 + 0x14;
      if (piVar3 == (int *)((int)param_1 + 0xc)) break;
      piVar1 = (int *)piVar3[1];
      iVar2 = *piVar3;
      *piVar1 = iVar2;
      *(int **)(iVar2 + 4) = piVar1;
      *piVar3 = 0;
      piVar3[1] = 0;
      FUN_00408e24(piVar3);
    }
    break;
  case 4:
    FUN_00407f28((int)param_1 + 0xc);
    iVar2 = (int)param_1 + 0x14;
    break;
  case 5:
  case 6:
    iVar2 = (int)param_1 + 0xc;
LAB_0040939c:
    FUN_00407f28(iVar2);
  default:
    goto switchD_00409294_default;
  }
  FUN_00409728(iVar2);
switchD_00409294_default:
  free(param_1);
  return;
}