Advertisement
Guest User

Sammwy Thread (DLL SRC)

a guest
Jun 8th, 2023
297
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 255.03 KB | None | 0 0
  1. // Source: https://gist.githubusercontent.com/NotNite/79ab1e5501e1ef109e8030059356b1b8/raw/c2102bf5ff74275ac44c2200d5121bfff652fd49/hook.dll.c
  2.  
  3. /* This file was generated by the Hex-Rays decompiler.
  4.    Copyright (c) 2007-2020 Hex-Rays <[email protected]>
  5.  
  6.    Detected compiler: Visual C++
  7. */
  8.  
  9. #include <windows.h>
  10. #include <defs.h>
  11.  
  12. #include <stdarg.h>
  13.  
  14.  
  15. //-------------------------------------------------------------------------
  16. // Function declarations
  17.  
  18. int sub_180001000();
  19. __int64 sub_180001010(__int64 a1, __int64 a2, __int64 a3, ...);
  20. __int64 sub_180001040(__int64 a1, __int64 a2, __int64 a3, ...);
  21. __int64 __fastcall sub_180001070(__int64 a1, __int64 a2);
  22. const char *__fastcall sub_1800010B0(__int64 a1);
  23. void *__fastcall sub_1800010D0(void *Block, char a2);
  24. __int64 __fastcall sub_180001120(_QWORD *a1);
  25. _QWORD *__fastcall sub_180001140(_QWORD *a1);
  26. // void __noreturn Concurrency::cancel_current_task(void); idb
  27. __int64 __fastcall sub_180001190(__int64 a1, __int64 a2);
  28. __int64 __fastcall sub_1800011D0(__int64 a1, __int64 a2);
  29. void __noreturn sub_180001210();
  30. _QWORD *__fastcall sub_180001230(_QWORD *a1);
  31. // void __noreturn Concurrency::cancel_current_task(void); idb
  32. __int64 __fastcall sub_180001280(__int64 a1, __int64 a2);
  33. void __fastcall sub_1800012C0(__int64 a1);
  34. _QWORD *__fastcall sub_1800012F0(_QWORD *a1, char a2);
  35. _QWORD *__fastcall sub_180001320(_QWORD *a1, char a2);
  36. _QWORD *__fastcall sub_180001350(_QWORD *a1, char a2);
  37. void *__fastcall sub_180001380(void *Block, char a2);
  38. void *__fastcall sub_180001410(void *Block, char a2);
  39. _QWORD *__fastcall sub_1800014D0(_QWORD *a1, char a2);
  40. __int64 __fastcall sub_180001500(__int64 a1, __int64 a2, __int64 a3);
  41. __int64 __fastcall Java_dev_neko_nekoclient_api_windows_WindowsHook_retrieveClipboardFiles(__int64 a1);
  42. __int64 __fastcall Java_dev_neko_nekoclient_api_windows_WindowsHook_retrieveMSACredentials(__int64 a1);
  43. __int64 __fastcall sub_180001A80(__int64 a1, __int64 a2, __int64 a3);
  44. __int64 __fastcall sub_1800020A0(__int64 a1);
  45. __int64 __fastcall sub_180002100(__int64 a1, __int64 a2, __int64 a3);
  46. _QWORD *__fastcall sub_180002150(const _Collvec *a1, _QWORD *a2, const wchar_t *a3, const wchar_t *a4);
  47. __int64 __fastcall sub_180002300(const _Collvec *a1, const wchar_t *a2, const wchar_t *a3, const wchar_t *a4, wchar_t *a5);
  48. __int64 __fastcall sub_180002350(__int64 a1);
  49. _QWORD *__fastcall sub_1800023C0(_QWORD *a1, _WORD *a2);
  50. void __fastcall sub_180002510(__int64 a1);
  51. _QWORD *__fastcall sub_180002570(_QWORD *a1, _BYTE *a2);
  52. void __fastcall sub_180002690(__int64 a1);
  53. void *__fastcall sub_1800026C0(void *Block, char a2);
  54. __int64 __fastcall sub_180002710(__int64 *a1);
  55. __int64 *__fastcall sub_180002790(__int64 *a1, unsigned __int16 *a2);
  56. void *__fastcall sub_180002960(void *Src, unsigned __int64 a2, __int64 a3, __int64 a4);
  57. void __fastcall sub_180002B50(struct _Collvec **a1);
  58. bool __fastcall sub_180002D30(__int64 a1, __int64 a2, __int64 a3, __int64 *a4, int a5);
  59. _QWORD *__fastcall sub_180002EF0(const void **a1, _BYTE *a2, _QWORD *a3);
  60. __int64 __fastcall sub_180003080(_QWORD *a1);
  61. void __fastcall sub_1800030E0(_QWORD *a1);
  62. void __fastcall sub_180003160(_QWORD *a1);
  63. __int64 __fastcall sub_180003210(_QWORD *a1);
  64. __int64 __fastcall sub_180003270(__int64 a1, __int64 a2, __int64 a3, __int64 a4, __int64 a5, int a6, int a7, int a8);
  65. void __noreturn sub_1800033B0();
  66. __int64 __fastcall sub_1800033D0(__int64 a1);
  67. __int64 __fastcall sub_180003430(__int64 a1);
  68. __int64 __fastcall sub_180003490(struct _Collvec **a1, __int64 a2);
  69. __int64 __fastcall sub_1800036C0(__int64 a1);
  70. __int64 __fastcall sub_180003850(__int64 **a1);
  71. __int128 *__fastcall sub_1800038B0(unsigned __int64 *a1, unsigned __int64 a2);
  72. __int128 *__fastcall sub_180003A40(__int64 *a1, __int128 *a2, __int128 *a3, signed __int64 a4, char *a5);
  73. _OWORD *__fastcall sub_180003C00(unsigned __int64 *a1, _OWORD *a2, _QWORD *a3, _QWORD *a4);
  74. void __noreturn sub_180003E70();
  75. __int64 __fastcall sub_180003E90(__int64 *a1, _QWORD *a2, unsigned __int64 a3);
  76. void __fastcall __noreturn sub_1800040C0(__int64 a1, unsigned int a2);
  77. __int16 __fastcall sub_1800040D0(unsigned __int16 **a1);
  78. char __fastcall sub_1800043A0(__int64 a1);
  79. __int64 __fastcall sub_180004600(__int64 a1, __int64 a2);
  80. _OWORD *__fastcall sub_1800046B0(__int64 a1, int a2);
  81. bool __fastcall sub_180004740(__int64 a1, __int64 a2);
  82. char *__fastcall sub_180004D30(__int64 a1, unsigned __int64 a2);
  83. _QWORD *__fastcall sub_180004EA0(_QWORD *a1, _QWORD *a2);
  84. unsigned __int64 __fastcall sub_180004F50(unsigned __int64 *a1, unsigned __int64 a2);
  85. char __fastcall sub_180004FE0(__int64 a1);
  86. _OWORD *__fastcall sub_1800055C0(__int64 a1, int a2);
  87. __int64 __fastcall sub_180005650(__int64 a1, __int64 a2);
  88. __int64 __fastcall sub_180005A00(__int64 a1, __int64 a2, char a3, int a4);
  89. char __fastcall sub_180005D40(__int64 *a1, __int64 a2);
  90. bool __fastcall sub_180005F70(__int64 a1);
  91. bool __fastcall sub_180006050(unsigned __int16 **a1);
  92. __int16 *__fastcall sub_1800060F0(__int16 *a1, __int16 *a2, __int16 *a3, __int16 *a4, __int64 *a5, __int16 a6);
  93. char *__fastcall sub_180006230(__int64 a1, unsigned __int64 a2, _DWORD *a3);
  94. char *__fastcall sub_1800063C0(unsigned __int64 *a1, char *a2, unsigned __int64 a3);
  95. char *__fastcall sub_180006510(unsigned __int64 *a1, char *a2, unsigned __int64 a3);
  96. _QWORD *__fastcall sub_180006650(_QWORD *a1, _QWORD *a2);
  97. __int64 __fastcall sub_180006740(__int64 *a1, __int16 a2);
  98. void *__fastcall sub_1800067F0(void *Block, char a2);
  99. size_t __fastcall sub_180006900(unsigned __int64 *a1, unsigned __int64 a2);
  100. int __fastcall sub_180006990(__int64 a1);
  101. char __fastcall sub_180006AC0(__int64 a1);
  102. char __fastcall sub_180006C50(__int64 a1);
  103. __int64 __fastcall sub_180007010(__int64 a1);
  104. __int64 __fastcall sub_1800072A0(__int64 a1, unsigned __int16 a2);
  105. __int64 __fastcall sub_1800073C0(void **a1, __int64 a2, char a3);
  106. __int64 __fastcall sub_180007800(unsigned __int16 a1, unsigned int *a2, _QWORD *a3);
  107. bool __fastcall sub_180007BC0(__int64 a1, unsigned int a2);
  108. char __fastcall sub_180007CD0(__int64 a1, char a2);
  109. int __fastcall sub_180007DE0(__int64 a1);
  110. char __fastcall sub_180007F60(__int64 a1);
  111. __int64 __fastcall sub_180008520(__int64 a1, unsigned __int8 a2);
  112. __int64 __fastcall sub_180008630(__int64 a1);
  113. int __fastcall sub_1800086D0(__int64 a1, __int64 a2);
  114. __int64 __fastcall sub_1800087E0(_QWORD *a1, int a2, int a3, unsigned __int8 a4);
  115. __int64 __fastcall sub_180008B10(_QWORD *a1, __int64 a2, _BYTE *a3, _BYTE *a4);
  116. __int64 __fastcall sub_180008D90(__int64 a1, unsigned __int64 a2, __int64 a3, const void *a4);
  117. __int64 __fastcall sub_180008EF0(__int64 a1);
  118. void *__fastcall sub_180008F50(void *Block, char a2);
  119. void __fastcall sub_180008FA0(__int64 a1, int a2);
  120. __int64 __fastcall sub_1800090C0(__int64 a1);
  121. void __fastcall sub_1800094A0(__int64 a1, __int64 a2, unsigned __int16 a3);
  122. char __fastcall sub_1800096C0(__int64 a1, unsigned __int16 a2, char a3);
  123. __int64 __fastcall sub_1800097A0(__int64 a1, unsigned __int16 *a2, unsigned __int16 *a3, char a4);
  124. __int16 __fastcall sub_180009910(__int64 a1, int a2);
  125. void __fastcall sub_180009B70(__int64 a1, __int16 *a2, __int16 *a3, unsigned int a4);
  126. void __fastcall sub_180009D50(__int64 a1, __int16 *a2, __int16 *a3, unsigned int a4, __int64 *a5);
  127. __int64 __fastcall sub_180009E30(_QWORD *a1, __int64 a2, _BYTE *a3, _BYTE *a4);
  128. _QWORD *__fastcall sub_18000A09C(__int64 a1);
  129. const __m128i *__fastcall sub_18000A0E0(const __m128i *a1, const __m128i *a2, __int16 a3);
  130. // void __cdecl _security_check_cookie(uintptr_t StackCookie);
  131. void __cdecl j_j_free(void *Block);
  132. _QWORD *__fastcall sub_18000A1F8(_QWORD *a1, char a2);
  133. void *__fastcall sub_18000A224(size_t Size);
  134. __int64 __fastcall sub_18000A260(__int64 a1, int a2, __int64 a3);
  135. __int64 __fastcall sub_18000A2B0(__int64 a1, __int64 a2);
  136. __int64 __fastcall sub_18000A3C8(char a1);
  137. __int64 __fastcall sub_18000A44C(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved); // idb
  138. // BOOL __stdcall DllEntryPoint(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved);
  139. char sub_18000A5C0();
  140. char sub_18000A5FC();
  141. bool sub_18000A630();
  142. char sub_18000A648();
  143. char sub_18000A670();
  144. int __fastcall sub_18000A688(__int64 a1, int a2, __int64 a3, void (__fastcall *a4)(__int64, _QWORD, __int64), unsigned int ExceptionNum, struct _EXCEPTION_POINTERS *ExceptionPtr);
  145. void sub_18000A6E8();
  146. char sub_18000A718();
  147. char __fastcall sub_18000A72C(int a1);
  148. char __fastcall sub_18000A778(unsigned int a1);
  149. bool __fastcall sub_18000A804(__int64 a1);
  150. char __fastcall sub_18000A89C(char a1);
  151. char __fastcall sub_18000A8C0(__int64 a1, char a2);
  152. _onexit_t __fastcall sub_18000A8EC(_onexit_t Function);
  153. // int __cdecl atexit(void (__cdecl *)());
  154. // __int64 __fastcall _GSHandlerCheckCommon(_QWORD, _QWORD, _QWORD); weak
  155. __int64 sub_18000A9C0();
  156. BOOL __fastcall sub_18000AB6C(struct _EXCEPTION_POINTERS *ExceptionInfo);
  157. BOOL __fastcall sub_18000ABA0(DWORD64 a1);
  158. struct _IMAGE_RUNTIME_FUNCTION_ENTRY *__fastcall sub_18000AC74(PCONTEXT ContextRecord);
  159. _QWORD *__fastcall sub_18000ACF0(_QWORD *a1);
  160. // void __noreturn Concurrency::cancel_current_task(void); idb
  161. __int64 sub_18000AD30();
  162. // BOOL __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved);
  163. void sub_18000AE00();
  164. __int64 sub_18000AE10();
  165. void *sub_18000AE1C();
  166. void *sub_18000AE24();
  167. _QWORD *sub_18000AE2C();
  168. void *sub_18000AE48();
  169. void sub_18000AE50();
  170. void __fastcall sub_18000AE58(unsigned int a1);
  171. void sub_18000AFA4();
  172. void sub_18000AFE0();
  173. __int64 sub_18000B01C();
  174. // bool __uncaught_exception(void); idb
  175. // __int64 __fastcall _CxxFrameHandler4(_QWORD, _QWORD, _QWORD, _QWORD); weak
  176. // __int64 __fastcall _std_type_info_destroy_list(_QWORD); weak
  177. // void *__cdecl memset(void *, int Val, size_t Size);
  178. // int __cdecl callnewh(size_t Size);
  179. // void *__cdecl malloc(size_t Size);
  180. // void __cdecl initterm(_PVFV *First, _PVFV *Last);
  181. // int __cdecl initterm_e(_PIFV *First, _PIFV *Last);
  182. // int __cdecl seh_filter_dll(unsigned int ExceptionNum, struct _EXCEPTION_POINTERS *ExceptionPtr);
  183. // errno_t __cdecl configure_narrow_argv(_crt_argv_mode mode);
  184. // int __cdecl initialize_narrow_environment();
  185. // int __cdecl initialize_onexit_table(_onexit_table_t *Table);
  186. // int __cdecl register_onexit_function(_onexit_table_t *Table, _onexit_t Function);
  187. // int __cdecl execute_onexit_table(_onexit_table_t *Table);
  188. // int __cdecl crt_atexit(_PVFV Function);
  189. // void __cdecl cexit();
  190. char sub_18000B0A4();
  191. __int64 sub_18000B0A8();
  192. __int64 __fastcall sub_18000B0AC(__int64 a1, __int64 a2, __int64 a3, __int64 a4);
  193. // int __cdecl memcmp(const void *Buf1, const void *Buf2, size_t Size);
  194. // void *__cdecl memcpy(void *, const void *Src, size_t Size);
  195. // void *__cdecl memmove(void *, const void *Src, size_t Size);
  196. __int64 __fastcall guard_dispatch_icall_nop(); // weak
  197. __int64 __fastcall sub_18000B180(__int64 a1, __int64 a2);
  198. void __fastcall sub_18000B1A6(__int64 a1, __int64 a2);
  199. __int64 __fastcall sub_18000B1D0(__int64 a1, __int64 a2);
  200. void __fastcall sub_18000B2D0(__int64 a1, __int64 a2);
  201. void __fastcall sub_18000B2F0(__int64 a1, __int64 a2);
  202. void __fastcall sub_18000B316(__int64 a1, __int64 a2);
  203. void __fastcall sub_18000B340(__int64 a1, __int64 a2);
  204. __int64 __fastcall sub_18000B426(__int64 a1, __int64 a2);
  205. void sub_18000B4E0();
  206. // __int64 __fastcall std::_Xregex_error(_QWORD); weak
  207. // __int64 __fastcall std::ctype<wchar_t>::_Getcat(_QWORD, _QWORD); weak
  208. // __int64 __fastcall std::ctype<wchar_t>::tolower(_QWORD, _QWORD, _QWORD); weak
  209. // __int64 __fastcall std::ctype<wchar_t>::tolower(_QWORD, _QWORD); weak
  210. // __int64 __fastcall std::ctype<wchar_t>::is(_QWORD, _QWORD, _QWORD); weak
  211. // void std::locale::facet::~facet(std::locale::facet *__hidden this); weak
  212. // _QWORD std::locale::facet::facet(std::locale::facet *__hidden this, unsigned __int64); weak
  213. // __int64 __fastcall std::locale::id::operator unsigned __int64(_QWORD); weak
  214. // void std::_Xbad_alloc(void); weak
  215. // struct _Collvec *std::_Locinfo::_Getcoll(std::_Locinfo *__hidden this, struct _Collvec *__return_ptr __struct_ptr retstr); weak
  216. // void std::_Locinfo::~_Locinfo(std::_Locinfo *__hidden this); weak
  217. // _QWORD std::_Locinfo::_Locinfo(std::_Locinfo *__hidden this, const char *); weak
  218. // _QWORD std::_Lockit::_Lockit(std::_Lockit *__hidden this, _DWORD); weak
  219. // void std::_Lockit::~_Lockit(std::_Lockit *__hidden this); weak
  220. // void __stdcall __noreturn std::_Xlength_error(const char *); weak
  221. // struct std::locale::_Locimp *__stdcall static std::locale::_Init(bool); weak
  222. // __int64 std::locale::_Getgloballocale(void); weak
  223. // __int64 __fastcall _std_exception_copy(_QWORD); weak
  224. // __int64 __fastcall _std_exception_destroy(_QWORD); weak
  225.  
  226. //-------------------------------------------------------------------------
  227. // Data declarations
  228.  
  229. // extern BOOL (__stdcall *CredEnumerateW)(LPCWSTR Filter, DWORD Flags, DWORD *Count, PCREDENTIALW **Credential);
  230. // extern void (__stdcall *CredFree)(PVOID Buffer);
  231. // extern PRUNTIME_FUNCTION (__stdcall *RtlLookupFunctionEntry)(ULONG64 ControlPc, PULONG64 ImageBase, PUNWIND_HISTORY_TABLE HistoryTable);
  232. // extern PEXCEPTION_ROUTINE (__stdcall *RtlVirtualUnwind)(ULONG HandlerType, ULONG64 ImageBase, ULONG64 ControlPc, PRUNTIME_FUNCTION FunctionEntry, PCONTEXT ContextRecord, PVOID *HandlerData, PULONG64 EstablisherFrame, PKNONVOLATILE_CONTEXT_POINTERS ContextPointers);
  233. // extern LONG (__stdcall *UnhandledExceptionFilter)(struct _EXCEPTION_POINTERS *ExceptionInfo);
  234. // extern BOOL (__stdcall *GlobalUnlock)(HGLOBAL hMem);
  235. // extern HANDLE (__stdcall *GetCurrentProcess)();
  236. // extern BOOL (__stdcall *TerminateProcess)(HANDLE hProcess, UINT uExitCode);
  237. // extern BOOL (__stdcall *IsProcessorFeaturePresent)(DWORD ProcessorFeature);
  238. // extern BOOL (__stdcall *QueryPerformanceCounter)(LARGE_INTEGER *lpPerformanceCount);
  239. // extern LPVOID (__stdcall *GlobalLock)(HGLOBAL hMem);
  240. // extern LPTOP_LEVEL_EXCEPTION_FILTER (__stdcall *SetUnhandledExceptionFilter)(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter);
  241. // extern DWORD (__stdcall *GetCurrentProcessId)();
  242. // extern DWORD (__stdcall *GetCurrentThreadId)();
  243. // extern void (__stdcall *GetSystemTimeAsFileTime)(LPFILETIME lpSystemTimeAsFileTime);
  244. // extern void (__stdcall *InitializeSListHead)(PSLIST_HEADER ListHead);
  245. // extern BOOL (__stdcall *IsDebuggerPresent)();
  246. // extern void (__stdcall *RtlCaptureContext)(PCONTEXT ContextRecord);
  247. // extern _UNKNOWN std::collate<wchar_t>::id; weak
  248. // extern _UNKNOWN std::ctype<wchar_t>::id; weak
  249. // extern int (__cdecl *Wcscoll)(const wchar_t *, const wchar_t *, const wchar_t *, const wchar_t *, const _Collvec *);
  250. // extern size_t (__cdecl *Wcsxfrm)(wchar_t *String1, wchar_t *End1, const wchar_t *, const wchar_t *, const _Collvec *);
  251. // extern BOOL (__stdcall *IsClipboardFormatAvailable)(UINT format);
  252. // extern BOOL (__stdcall *CloseClipboard)();
  253. // extern UINT (__stdcall *EnumClipboardFormats)(UINT format);
  254. // extern int (__stdcall *GetClipboardFormatNameA)(UINT format, LPSTR lpszFormatName, int cchMaxCount);
  255. // extern HANDLE (__stdcall *GetClipboardData)(UINT uFormat);
  256. // extern BOOL (__stdcall *OpenClipboard)(HWND hWndNewOwner);
  257. // extern char *(__cdecl *strchr)(const char *Str, int Val);
  258. // extern void (__cdecl *free)(void *Block);
  259. // extern void *(__cdecl *realloc)(void *Block, size_t Size);
  260. // extern void (__cdecl __noreturn *invalid_parameter_noinfo_noreturn)();
  261. __int64 (__fastcall *_guard_dispatch_icall_fptr)(_QWORD, _QWORD, _QWORD) = &guard_dispatch_icall_nop; // weak
  262. const _PVFV qword_18000C2D0 = NULL; // idb
  263. const _PVFV qword_18000C2E0 = NULL; // idb
  264. const _PIFV First = NULL; // idb
  265. const _PIFV Last = NULL; // idb
  266. __int128 xmmword_18000C320 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFi64; // weak
  267. void *type_info::`vftable' = &sub_18000A1F8; // weak
  268. const struct _EXCEPTION_POINTERS ExceptionInfo = { &dword_180010420, &ContextRecord }; // idb
  269. void *std::exception::`vftable' = &sub_1800010D0; // weak
  270. void *std::bad_alloc::`vftable' = &sub_1800010D0; // weak
  271. void *std::bad_array_new_length::`vftable' = &sub_1800010D0; // weak
  272. char *off_18000C650 = "alnum"; // weak
  273. void *std::_Node_str<wchar_t>::`vftable' = &sub_180008F50; // weak
  274. void *std::_Node_class<wchar_t,std::regex_traits<wchar_t>>::`vftable' = &sub_1800067F0; // weak
  275. void *std::collate<wchar_t>::`vftable' = &sub_1800026C0; // weak
  276. void *std::_Node_rep::`vftable' = &sub_1800014D0; // weak
  277. void *std::_Node_end_rep::`vftable' = &sub_180001350; // weak
  278. void *std::_Node_if::`vftable' = &sub_180001410; // weak
  279. void *std::_Node_endif::`vftable' = &sub_1800012F0; // weak
  280. void *std::_Node_back::`vftable' = &sub_180001350; // weak
  281. void *std::_Node_capture::`vftable' = &sub_180001350; // weak
  282. void *std::_Node_assert::`vftable' = &sub_180001380; // weak
  283. void *std::_Node_end_group::`vftable' = &sub_180001350; // weak
  284. void *std::_Root_node::`vftable' = &sub_180001320; // weak
  285. void *std::_Node_base::`vftable' = &sub_1800012F0; // weak
  286. _BYTE byte_18000C8E0[256] =
  287. {
  288.  0,
  289.  0,
  290.  0,
  291.  0,
  292.  0,
  293.  0,
  294.  0,
  295.  0,
  296.  0,
  297.  0,
  298.  0,
  299.  0,
  300.  0,
  301.  0,
  302.  0,
  303.  0,
  304.  0,
  305.  0,
  306.  0,
  307.  0,
  308.  0,
  309.  0,
  310.  0,
  311.  0,
  312.  0,
  313.  0,
  314.  0,
  315.  0,
  316.  0,
  317.  0,
  318.  0,
  319.  0,
  320.  0,
  321.  0,
  322.  0,
  323.  0,
  324.  0,
  325.  0,
  326.  0,
  327.  0,
  328.  0,
  329.  0,
  330.  0,
  331.  0,
  332.  0,
  333.  0,
  334.  0,
  335.  0,
  336.  1,
  337.  1,
  338.  1,
  339.  1,
  340.  1,
  341.  1,
  342.  1,
  343.  1,
  344.  1,
  345.  1,
  346.  0,
  347.  0,
  348.  0,
  349.  0,
  350.  0,
  351.  0,
  352.  0,
  353.  1,
  354.  1,
  355.  1,
  356.  1,
  357.  1,
  358.  1,
  359.  1,
  360.  1,
  361.  1,
  362.  1,
  363.  1,
  364.  1,
  365.  1,
  366.  1,
  367.  1,
  368.  1,
  369.  1,
  370.  1,
  371.  1,
  372.  1,
  373.  1,
  374.  1,
  375.  1,
  376.  1,
  377.  1,
  378.  1,
  379.  0,
  380.  0,
  381.  0,
  382.  0,
  383.  1,
  384.  0,
  385.  1,
  386.  1,
  387.  1,
  388.  1,
  389.  1,
  390.  1,
  391.  1,
  392.  1,
  393.  1,
  394.  1,
  395.  1,
  396.  1,
  397.  1,
  398.  1,
  399.  1,
  400.  1,
  401.  1,
  402.  1,
  403.  1,
  404.  1,
  405.  1,
  406.  1,
  407.  1,
  408.  1,
  409.  1,
  410.  1,
  411.  0,
  412.  0,
  413.  0,
  414.  0,
  415.  0,
  416.  0,
  417.  0,
  418.  0,
  419.  0,
  420.  0,
  421.  0,
  422.  0,
  423.  0,
  424.  0,
  425.  0,
  426.  0,
  427.  0,
  428.  0,
  429.  0,
  430.  0,
  431.  0,
  432.  0,
  433.  0,
  434.  0,
  435.  0,
  436.  0,
  437.  0,
  438.  0,
  439.  0,
  440.  0,
  441.  0,
  442.  0,
  443.  0,
  444.  0,
  445.  0,
  446.  0,
  447.  0,
  448.  0,
  449.  0,
  450.  0,
  451.  0,
  452.  0,
  453.  0,
  454.  0,
  455.  0,
  456.  0,
  457.  0,
  458.  0,
  459.  0,
  460.  0,
  461.  0,
  462.  0,
  463.  0,
  464.  0,
  465.  0,
  466.  0,
  467.  0,
  468.  0,
  469.  0,
  470.  0,
  471.  0,
  472.  0,
  473.  0,
  474.  0,
  475.  0,
  476.  0,
  477.  0,
  478.  0,
  479.  0,
  480.  0,
  481.  0,
  482.  0,
  483.  0,
  484.  0,
  485.  0,
  486.  0,
  487.  0,
  488.  0,
  489.  0,
  490.  0,
  491.  0,
  492.  0,
  493.  0,
  494.  0,
  495.  0,
  496.  0,
  497.  0,
  498.  0,
  499.  0,
  500.  0,
  501.  0,
  502.  0,
  503.  0,
  504.  0,
  505.  0,
  506.  0,
  507.  0,
  508.  0,
  509.  0,
  510.  0,
  511.  0,
  512.  0,
  513.  0,
  514.  0,
  515.  0,
  516.  0,
  517.  0,
  518.  0,
  519.  0,
  520.  0,
  521.  0,
  522.  0,
  523.  0,
  524.  0,
  525.  0,
  526.  0,
  527.  0,
  528.  0,
  529.  0,
  530.  0,
  531.  0,
  532.  0,
  533.  0,
  534.  0,
  535.  0,
  536.  0,
  537.  0,
  538.  0,
  539.  0,
  540.  0,
  541.  0,
  542.  0,
  543.  0
  544. }; // weak
  545. void *std::bad_cast::`vftable' = &sub_1800010D0; // weak
  546. __int128 xmmword_18000CA00 = 0x70000000000000000i64; // weak
  547. void (*qword_18000D9F8[2])(void) = { NULL, NULL }; // weak
  548. void (*qword_18000DA08)(void) = NULL; // weak
  549. int dword_180010008 = 1; // weak
  550. int dword_18001000C = 2; // weak
  551. __int64 qword_180010010 = 524288i64; // weak
  552. __int64 qword_180010018 = 33554432i64; // weak
  553. __int64 qword_180010020 = -47936899621427i64; // weak
  554. uintptr_t _security_cookie = 47936899621426ui64;
  555. void *Block = NULL; // idb
  556. int dword_1800103CC = 0; // weak
  557. int dword_1800103D0 = 0; // weak
  558. __int64 qword_1800103D8 = 0i64; // weak
  559. char byte_1800103E0 = '\0'; // weak
  560. char byte_1800103E1 = '\0'; // weak
  561. _onexit_table_t Table = { NULL, NULL, NULL }; // idb
  562. _onexit_table_t stru_180010400; // idb
  563. int dword_180010418; // weak
  564. int dword_180010420; // weak
  565. int dword_180010424; // weak
  566. __int64 qword_180010430; // weak
  567. int dword_180010438; // weak
  568. _UNKNOWN unk_180010440; // weak
  569. _CONTEXT ContextRecord; // idb
  570. union _SLIST_HEADER stru_180010990; // weak
  571. _UNKNOWN unk_1800109A0; // weak
  572. _UNKNOWN unk_1800109A8; // weak
  573. int dword_1800109B0; // weak
  574. __int64 qword_1800109B8; // weak
  575. __int64 qword_1800109C0; // weak
  576. _UNKNOWN unk_1800109D0; // weak
  577.  
  578.  
  579. //----- (0000000180001000) ----------------------------------------------------
  580. int sub_180001000()
  581. {
  582.   return atexit(sub_18000B4E0);
  583. }
  584.  
  585. //----- (0000000180001010) ----------------------------------------------------
  586. __int64 sub_180001010(__int64 a1, __int64 a2, __int64 a3, ...)
  587. {
  588.   va_list va; // [rsp+48h] [rbp+20h] BYREF
  589.  
  590.   va_start(va, a3);
  591.   return (*(__int64 (__fastcall **)(__int64, __int64, __int64, __int64 *))(*(_QWORD *)a1 + 232i64))(
  592.            a1,
  593.            a2,
  594.            a3,
  595.            (__int64 *)va);
  596. }
  597.  
  598. //----- (0000000180001040) ----------------------------------------------------
  599. __int64 sub_180001040(__int64 a1, __int64 a2, __int64 a3, ...)
  600. {
  601.   va_list va; // [rsp+48h] [rbp+20h] BYREF
  602.  
  603.   va_start(va, a3);
  604.   return (*(__int64 (__fastcall **)(__int64, __int64, __int64, __int64 *))(*(_QWORD *)a1 + 280i64))(
  605.            a1,
  606.            a2,
  607.            a3,
  608.            (__int64 *)va);
  609. }
  610.  
  611. //----- (0000000180001070) ----------------------------------------------------
  612. __int64 __fastcall sub_180001070(__int64 a1, __int64 a2)
  613. {
  614.   *(_QWORD *)a1 = &std::exception::`vftable';
  615.  *(_OWORD *)(a1 + 8) = 0i64;
  616.  _std_exception_copy(a2 + 8);
  617.  return a1;
  618. }
  619. // 18000C1B0: using guessed type __int64 __fastcall _std_exception_copy(_QWORD);
  620. // 18000C360: using guessed type void *std::exception::`vftable';
  621.  
  622. //----- (00000001800010B0) ----------------------------------------------------
  623. const char *__fastcall sub_1800010B0(__int64 a1)
  624. {
  625.   const char *result; // rax
  626.  
  627.   result = "Unknown exception";
  628.   if ( *(_QWORD *)(a1 + 8) )
  629.     return *(const char **)(a1 + 8);
  630.   return result;
  631. }
  632.  
  633. //----- (00000001800010D0) ----------------------------------------------------
  634. void *__fastcall sub_1800010D0(void *Block, char a2)
  635. {
  636.   *(_QWORD *)Block = &std::exception::`vftable';
  637.  _std_exception_destroy((char *)Block + 8);
  638.  if ( (a2 & 1) != 0 )
  639.    j_j_free(Block);
  640.  return Block;
  641. }
  642. // 18000C1E8: using guessed type __int64 __fastcall _std_exception_destroy(_QWORD);
  643. // 18000C360: using guessed type void *std::exception::`vftable';
  644.  
  645. //----- (0000000180001120) ----------------------------------------------------
  646. __int64 __fastcall sub_180001120(_QWORD *a1)
  647. {
  648.   *a1 = &std::exception::`vftable';
  649.  return _std_exception_destroy(a1 + 1);
  650. }
  651. // 18000C1E8: using guessed type __int64 __fastcall _std_exception_destroy(_QWORD);
  652. // 18000C360: using guessed type void *std::exception::`vftable';
  653.  
  654. //----- (0000000180001140) ----------------------------------------------------
  655. _QWORD *__fastcall sub_180001140(_QWORD *a1)
  656. {
  657.   a1[2] = 0i64;
  658.   a1[1] = "bad array new length";
  659.   *a1 = &std::bad_array_new_length::`vftable';
  660.  return a1;
  661. }
  662. // 18000C3A0: using guessed type void *std::bad_array_new_length::`vftable';
  663.  
  664. //----- (0000000180001190) ----------------------------------------------------
  665. __int64 __fastcall sub_180001190(__int64 a1, __int64 a2)
  666. {
  667.   *(_QWORD *)a1 = &std::exception::`vftable';
  668.  *(_OWORD *)(a1 + 8) = 0i64;
  669.  _std_exception_copy(a2 + 8);
  670.  *(_QWORD *)a1 = &std::bad_array_new_length::`vftable';
  671.   return a1;
  672. }
  673. // 18000C1B0: using guessed type __int64 __fastcall _std_exception_copy(_QWORD);
  674. // 18000C360: using guessed type void *std::exception::`vftable';
  675. // 18000C3A0: using guessed type void *std::bad_array_new_length::`vftable';
  676.  
  677. //----- (00000001800011D0) ----------------------------------------------------
  678. __int64 __fastcall sub_1800011D0(__int64 a1, __int64 a2)
  679. {
  680.   *(_QWORD *)a1 = &std::exception::`vftable';
  681.  *(_OWORD *)(a1 + 8) = 0i64;
  682.  _std_exception_copy(a2 + 8);
  683.  *(_QWORD *)a1 = &std::bad_alloc::`vftable';
  684.   return a1;
  685. }
  686. // 18000C1B0: using guessed type __int64 __fastcall _std_exception_copy(_QWORD);
  687. // 18000C360: using guessed type void *std::exception::`vftable';
  688. // 18000C378: using guessed type void *std::bad_alloc::`vftable';
  689.  
  690. //----- (0000000180001210) ----------------------------------------------------
  691. void __noreturn sub_180001210()
  692. {
  693.   std::_Xlength_error("string too long");
  694. }
  695. // 18000C138: using guessed type void __stdcall __noreturn std::_Xlength_error(const char *);
  696.  
  697. //----- (0000000180001230) ----------------------------------------------------
  698. _QWORD *__fastcall sub_180001230(_QWORD *a1)
  699. {
  700.   a1[2] = 0i64;
  701.   a1[1] = "bad cast";
  702.   *a1 = &std::bad_cast::`vftable';
  703.  return a1;
  704. }
  705. // 18000C9E8: using guessed type void *std::bad_cast::`vftable';
  706.  
  707. //----- (0000000180001280) ----------------------------------------------------
  708. __int64 __fastcall sub_180001280(__int64 a1, __int64 a2)
  709. {
  710.   *(_QWORD *)a1 = &std::exception::`vftable';
  711.  *(_OWORD *)(a1 + 8) = 0i64;
  712.  _std_exception_copy(a2 + 8);
  713.  *(_QWORD *)a1 = &std::bad_cast::`vftable';
  714.   return a1;
  715. }
  716. // 18000C1B0: using guessed type __int64 __fastcall _std_exception_copy(_QWORD);
  717. // 18000C360: using guessed type void *std::exception::`vftable';
  718. // 18000C9E8: using guessed type void *std::bad_cast::`vftable';
  719.  
  720. //----- (00000001800012C0) ----------------------------------------------------
  721. void __fastcall sub_1800012C0(__int64 a1)
  722. {
  723.   __int64 v1; // rcx
  724.   void (__fastcall ***v2)(_QWORD, __int64); // rax
  725.  
  726.   v1 = *(_QWORD *)(a1 + 8);
  727.   if ( v1 )
  728.   {
  729.     v2 = (void (__fastcall ***)(_QWORD, __int64))(*(__int64 (__fastcall **)(__int64))(*(_QWORD *)v1 + 16i64))(v1);
  730.     if ( v2 )
  731.       (**v2)(v2, 1i64);
  732.   }
  733. }
  734.  
  735. //----- (00000001800012F0) ----------------------------------------------------
  736. _QWORD *__fastcall sub_1800012F0(_QWORD *a1, char a2)
  737. {
  738.   *a1 = &std::_Node_base::`vftable';
  739.  if ( (a2 & 1) != 0 )
  740.    j_j_free(a1);
  741.  return a1;
  742. }
  743. // 18000C8D8: using guessed type void *std::_Node_base::`vftable';
  744.  
  745. //----- (0000000180001320) ----------------------------------------------------
  746. _QWORD *__fastcall sub_180001320(_QWORD *a1, char a2)
  747. {
  748.   *a1 = &std::_Node_base::`vftable';
  749.  if ( (a2 & 1) != 0 )
  750.    j_j_free(a1);
  751.  return a1;
  752. }
  753. // 18000C8D8: using guessed type void *std::_Node_base::`vftable';
  754.  
  755. //----- (0000000180001350) ----------------------------------------------------
  756. _QWORD *__fastcall sub_180001350(_QWORD *a1, char a2)
  757. {
  758.   *a1 = &std::_Node_base::`vftable';
  759.  if ( (a2 & 1) != 0 )
  760.    j_j_free(a1);
  761.  return a1;
  762. }
  763. // 18000C8D8: using guessed type void *std::_Node_base::`vftable';
  764.  
  765. //----- (0000000180001380) ----------------------------------------------------
  766. void *__fastcall sub_180001380(void *Block, char a2)
  767. {
  768.   __int64 v2; // rbx
  769.   _QWORD *v5; // rax
  770.   void (__fastcall ***v6)(_QWORD, __int64); // rcx
  771.  
  772.   v2 = *((_QWORD *)Block + 4);
  773.   *(_QWORD *)Block = &std::_Node_assert::`vftable';
  774.  while ( v2 )
  775.  {
  776.    v5 = (_QWORD *)(v2 + 16);
  777.    v6 = (void (__fastcall ***)(_QWORD, __int64))v2;
  778.    v2 = *(_QWORD *)(v2 + 16);
  779.    *v5 = 0i64;
  780.    (**v6)(v6, 1i64);
  781.  }
  782.  *(_QWORD *)Block = &std::_Node_base::`vftable';
  783.   if ( (a2 & 1) != 0 )
  784.     j_j_free(Block);
  785.   return Block;
  786. }
  787. // 18000C8A8: using guessed type void *std::_Node_assert::`vftable';
  788. // 18000C8D8: using guessed type void *std::_Node_base::`vftable';
  789.  
  790. //----- (0000000180001410) ----------------------------------------------------
  791. void *__fastcall sub_180001410(void *Block, char a2)
  792. {
  793.   __int64 v3; // rsi
  794.   _QWORD *v5; // rax
  795.   __int64 v6; // rbx
  796.   __int64 v7; // rdi
  797.   _QWORD *v8; // rax
  798.   void (__fastcall ***v9)(_QWORD, __int64); // rcx
  799.  
  800.   v3 = *((_QWORD *)Block + 5);
  801.   *(_QWORD *)Block = &std::_Node_if::`vftable';
  802.  while ( v3 )
  803.  {
  804.    v5 = (_QWORD *)(v3 + 40);
  805.    v6 = v3;
  806.    v3 = *(_QWORD *)(v3 + 40);
  807.    *v5 = 0i64;
  808.    v7 = *((_QWORD *)Block + 4);
  809.    while ( v6 != v7 )
  810.    {
  811.      if ( !v6 )
  812.        break;
  813.      v8 = (_QWORD *)(v6 + 16);
  814.      v9 = (void (__fastcall ***)(_QWORD, __int64))v6;
  815.      v6 = *(_QWORD *)(v6 + 16);
  816.      *v8 = 0i64;
  817.      (**v9)(v9, 1i64);
  818.    }
  819.  }
  820.  *(_QWORD *)Block = &std::_Node_base::`vftable';
  821.   if ( (a2 & 1) != 0 )
  822.     j_j_free(Block);
  823.   return Block;
  824. }
  825. // 18000C868: using guessed type void *std::_Node_if::`vftable';
  826. // 18000C8D8: using guessed type void *std::_Node_base::`vftable';
  827.  
  828. //----- (00000001800014D0) ----------------------------------------------------
  829. _QWORD *__fastcall sub_1800014D0(_QWORD *a1, char a2)
  830. {
  831.   *a1 = &std::_Node_base::`vftable';
  832.  if ( (a2 & 1) != 0 )
  833.    j_j_free(a1);
  834.  return a1;
  835. }
  836. // 18000C8D8: using guessed type void *std::_Node_base::`vftable';
  837.  
  838. //----- (0000000180001500) ----------------------------------------------------
  839. __int64 __fastcall sub_180001500(__int64 a1, __int64 a2, __int64 a3)
  840. {
  841.   __int64 v5; // rsi
  842.   _QWORD *i; // rbx
  843.   __int64 result; // rax
  844.  
  845.   if ( a1 != a2 )
  846.   {
  847.     v5 = a1;
  848.     do
  849.     {
  850.       if ( !v5 )
  851.         break;
  852.       switch ( *(_DWORD *)(v5 + 8) )
  853.       {
  854.         case 0xA:
  855.         case 0xB:
  856.           result = sub_180001500(*(_QWORD *)(v5 + 32), 0i64, 0i64);
  857.           break;
  858.         case 0x10:
  859.           if ( a3 )
  860.             *(_DWORD *)(a3 + 52) = 0;
  861.           for ( i = *(_QWORD **)(v5 + 40); i; i = (_QWORD *)i[5] )
  862.             result = sub_180001500(i[2], i[4], a3);
  863.           break;
  864.         case 0x12:
  865.           if ( a3 )
  866.           {
  867.             *(_DWORD *)(a3 + 52) = 0;
  868.             *(_DWORD *)(v5 + 52) = 0;
  869.           }
  870.           else
  871.           {
  872.             a3 = v5;
  873.           }
  874.           break;
  875.         default:
  876.           if ( *(_DWORD *)(v5 + 8) == 19 && a3 == *(_QWORD *)(v5 + 32) )
  877.           {
  878.             if ( *(_DWORD *)(a3 + 52) == -1 )
  879.               *(_DWORD *)(a3 + 52) = 1;
  880.             a3 = 0i64;
  881.           }
  882.           break;
  883.       }
  884.       v5 = *(_QWORD *)(v5 + 16);
  885.     }
  886.     while ( v5 != a2 );
  887.   }
  888.   return result;
  889. }
  890.  
  891. //----- (00000001800015E0) ----------------------------------------------------
  892. __int64 __fastcall Java_dev_neko_nekoclient_api_windows_WindowsHook_retrieveClipboardFiles(__int64 a1)
  893. {
  894.   __int64 v2; // rbx
  895.   __int64 *v3; // r14
  896.   __int64 v4; // rax
  897.   __int64 v5; // rdx
  898.   unsigned __int64 v6; // rbx
  899.   __int64 i; // rbp
  900.   __int64 v8; // rdi
  901.   void *v9; // rcx
  902.   void *Block[4]; // [rsp+20h] [rbp-38h] BYREF
  903.  
  904.   v2 = (*(__int64 (__fastcall **)(__int64, const char *))(*(_QWORD *)a1 + 48i64))(
  905.          a1,
  906.          "dev/neko/nekoclient/api/windows/FileDescriptor");
  907.   v3 = (__int64 *)sub_180001A80((__int64)Block, a1, v2);
  908.   v4 = (*(__int64 (__fastcall **)(__int64, __int64, __int64, _QWORD))(*(_QWORD *)a1 + 1376i64))(
  909.          a1,
  910.          (v3[1] - *v3) >> 3,
  911.          v2,
  912.          0i64);
  913.   v5 = *v3;
  914.   v6 = 0i64;
  915.   for ( i = v4; v6 < (v3[1] - *v3) >> 3; ++v6 )
  916.   {
  917.     v8 = *(_QWORD *)(v5 + 8 * v6);
  918.     (*(void (__fastcall **)(__int64, __int64, _QWORD, __int64))(*(_QWORD *)a1 + 1392i64))(a1, i, (unsigned int)v6, v8);
  919.     (*(void (__fastcall **)(__int64, __int64))(*(_QWORD *)a1 + 184i64))(a1, v8);
  920.     v5 = *v3;
  921.   }
  922.   v9 = Block[0];
  923.   if ( Block[0] )
  924.   {
  925.     if ( ((Block[2] - Block[0]) & 0xFFFFFFFFFFFFFFF8ui64) >= 0x1000 )
  926.     {
  927.       v9 = (void *)*((_QWORD *)Block[0] - 1);
  928.       if ( (unsigned __int64)(Block[0] - v9 - 8) > 0x1F )
  929.         invalid_parameter_noinfo_noreturn();
  930.     }
  931.     j_j_free(v9);
  932.   }
  933.   return i;
  934. }
  935.  
  936. //----- (0000000180001700) ----------------------------------------------------
  937. __int64 __fastcall Java_dev_neko_nekoclient_api_windows_WindowsHook_retrieveMSACredentials(__int64 a1)
  938. {
  939.   unsigned int v3; // er12
  940.   DWORD v4; // ebx
  941.   unsigned int i; // edi
  942.   __int64 v6; // r8
  943.   __int64 *v7; // rdx
  944.   __int64 *v8; // rcx
  945.   void *v9; // rcx
  946.   __int64 v10; // rax
  947.   DWORD v11; // er14
  948.   __int64 j; // r13
  949.   PCREDENTIALW v13; // rdi
  950.   __int64 *v14; // r8
  951.   __int64 *v15; // rcx
  952.   LPBYTE CredentialBlob; // rbx
  953.   DWORD CredentialBlobSize; // edi
  954.   __int64 v18; // rsi
  955.   void *v19; // rcx
  956.   __int64 v20; // rax
  957.   __int64 v21; // rax
  958.   void (__fastcall ***v22)(_QWORD, __int64); // rax
  959.   void *v23; // rcx
  960.   PCREDENTIALW *Credential; // [rsp+30h] [rbp-49h] BYREF
  961.   DWORD Count; // [rsp+38h] [rbp-41h] BYREF
  962.   __int64 v26[2]; // [rsp+40h] [rbp-39h] BYREF
  963.   __int64 v27; // [rsp+50h] [rbp-29h]
  964.   unsigned __int64 v28; // [rsp+58h] [rbp-21h]
  965.   __int128 v29[2]; // [rsp+60h] [rbp-19h] BYREF
  966.   __int64 v30; // [rsp+80h] [rbp+7h]
  967.   void *Block[3]; // [rsp+88h] [rbp+Fh] BYREF
  968.   unsigned __int64 v32; // [rsp+A0h] [rbp+27h]
  969.  
  970.   if ( !CredEnumerateW(0i64, 0, &Count, &Credential) )
  971.     return 0i64;
  972.   sub_1800023C0(Block, L"^MCL(?:MS)?\\|\\d+\\|Xal\\.\\d+\\.Production\\.Msa\\..+$");
  973.   memset(v29, 0, sizeof(v29));
  974.   v30 = 0i64;
  975.   sub_180002790((__int64 *)v29, (unsigned __int16 *)Block);
  976.   v3 = 0;
  977.   v4 = 0;
  978.   for ( i = 0; v4 < Count; ++v4 )
  979.   {
  980.     sub_1800023C0(v26, Credential[v4]->TargetName);
  981.     v7 = v26;
  982.     v8 = v26;
  983.     if ( v28 >= 8 )
  984.       v7 = (__int64 *)v26[0];
  985.     if ( v28 >= 8 )
  986.       v8 = (__int64 *)v26[0];
  987.     if ( sub_180002D30((__int64)v8, (__int64)v7 + 2 * v27, v6, (__int64 *)v29, 16) )
  988.       ++i;
  989.     if ( v28 >= 8 )
  990.     {
  991.       v9 = (void *)v26[0];
  992.       if ( 2 * v28 + 2 >= 0x1000 )
  993.       {
  994.         v9 = *(void **)(v26[0] - 8);
  995.         if ( (unsigned __int64)(v26[0] - (_QWORD)v9 - 8) > 0x1F )
  996.           invalid_parameter_noinfo_noreturn();
  997.       }
  998.       j_j_free(v9);
  999.     }
  1000.   }
  1001.   v10 = (*(__int64 (__fastcall **)(__int64, const char *))(*(_QWORD *)a1 + 48i64))(a1, "[B");
  1002.   v11 = 0;
  1003.   for ( j = (*(__int64 (__fastcall **)(__int64, _QWORD, __int64, _QWORD))(*(_QWORD *)a1 + 1376i64))(a1, i, v10, 0i64);
  1004.         v11 < Count;
  1005.         ++v11 )
  1006.   {
  1007.     v13 = Credential[v11];
  1008.     sub_1800023C0(v26, v13->TargetName);
  1009.     v14 = v26;
  1010.     v15 = v26;
  1011.     if ( v28 >= 8 )
  1012.       v14 = (__int64 *)v26[0];
  1013.     if ( v28 >= 8 )
  1014.       v15 = (__int64 *)v26[0];
  1015.     if ( sub_180002D30((__int64)v15, (__int64)v14 + 2 * v27, (__int64)v14, (__int64 *)v29, 16) )
  1016.     {
  1017.       CredentialBlob = v13->CredentialBlob;
  1018.       CredentialBlobSize = v13->CredentialBlobSize;
  1019.       v18 = (*(__int64 (__fastcall **)(__int64, _QWORD))(*(_QWORD *)a1 + 1408i64))(a1, CredentialBlobSize);
  1020.       (*(void (__fastcall **)(__int64, __int64, _QWORD, _QWORD, LPBYTE))(*(_QWORD *)a1 + 1664i64))(
  1021.         a1,
  1022.         v18,
  1023.         0i64,
  1024.         CredentialBlobSize,
  1025.         CredentialBlob);
  1026.       (*(void (__fastcall **)(__int64, __int64, _QWORD, __int64))(*(_QWORD *)a1 + 1392i64))(a1, j, v3++, v18);
  1027.     }
  1028.     if ( v28 >= 8 )
  1029.     {
  1030.       v19 = (void *)v26[0];
  1031.       if ( 2 * v28 + 2 >= 0x1000 )
  1032.       {
  1033.         v19 = *(void **)(v26[0] - 8);
  1034.         if ( (unsigned __int64)(v26[0] - (_QWORD)v19 - 8) > 0x1F )
  1035.           invalid_parameter_noinfo_noreturn();
  1036.       }
  1037.       j_j_free(v19);
  1038.     }
  1039.   }
  1040.   CredFree(Credential);
  1041.   v20 = (*(__int64 (__fastcall **)(__int64, __int64))(*(_QWORD *)a1 + 248i64))(a1, j);
  1042.   v21 = (*(__int64 (__fastcall **)(__int64, __int64, const char *, const char *))(*(_QWORD *)a1 + 264i64))(
  1043.           a1,
  1044.           v20,
  1045.           "clone",
  1046.           "()Ljava/lang/Object;");
  1047.   sub_180001040(a1, j, v21);
  1048.   sub_180002710((__int64 *)v29);
  1049.   if ( v30 )
  1050.   {
  1051.     v22 = (void (__fastcall ***)(_QWORD, __int64))(*(__int64 (__fastcall **)(__int64))(*(_QWORD *)v30 + 16i64))(v30);
  1052.     if ( v22 )
  1053.       (**v22)(v22, 1i64);
  1054.   }
  1055.   if ( v32 >= 8 )
  1056.   {
  1057.     v23 = Block[0];
  1058.     if ( 2 * v32 + 2 >= 0x1000 )
  1059.     {
  1060.       v23 = (void *)*((_QWORD *)Block[0] - 1);
  1061.       if ( (unsigned __int64)(Block[0] - v23 - 8) > 0x1F )
  1062.         invalid_parameter_noinfo_noreturn();
  1063.     }
  1064.     j_j_free(v23);
  1065.   }
  1066.   return j;
  1067. }
  1068. // 1800017E2: variable 'v6' is possibly undefined
  1069. // 18000C430: using guessed type wchar_t aMclMsDXalDProd[49];
  1070.  
  1071. //----- (0000000180001A80) ----------------------------------------------------
  1072. __int64 __fastcall sub_180001A80(__int64 a1, __int64 a2, __int64 a3)
  1073. {
  1074.   __int64 v3; // r15
  1075.   UINT v4; // ebx
  1076.   UINT v5; // er12
  1077.   char *v6; // r15
  1078.   size_t v7; // rdi
  1079.   unsigned __int64 v8; // rsi
  1080.   void *v9; // rbx
  1081.   size_t v10; // rax
  1082.   void *v11; // rax
  1083.   void **v12; // rcx
  1084.   size_t v13; // r8
  1085.   int v14; // er14
  1086.   _BYTE *v15; // rax
  1087.   HANDLE ClipboardData; // rax
  1088.   _DWORD *v17; // rax
  1089.   _DWORD *v18; // rdx
  1090.   unsigned int v19; // er13
  1091.   int v20; // er14
  1092.   _DWORD *v21; // r12
  1093.   __int64 *v22; // rdx
  1094.   __int64 *v23; // rsi
  1095.   __int64 *v24; // rdi
  1096.   unsigned __int64 v25; // rax
  1097.   __int64 v26; // rdx
  1098.   unsigned __int64 v27; // rbx
  1099.   size_t v28; // rcx
  1100.   void *v29; // rax
  1101.   void *v30; // rcx
  1102.   _QWORD *v31; // rax
  1103.   void **v32; // rcx
  1104.   void **v33; // rax
  1105.   __int64 v34; // rdi
  1106.   __int64 v35; // rbx
  1107.   void **v36; // rdx
  1108.   __int64 v37; // rax
  1109.   __int64 v38; // rax
  1110.   _BYTE *v39; // rdx
  1111.   void *v40; // rcx
  1112.   void *v41; // rcx
  1113.   __int64 v43; // [rsp+20h] [rbp-E0h]
  1114.   __int64 v44; // [rsp+28h] [rbp-D8h]
  1115.   int v45; // [rsp+30h] [rbp-D0h]
  1116.   _DWORD *v46; // [rsp+30h] [rbp-D0h]
  1117.   __int64 v47; // [rsp+40h] [rbp-C0h] BYREF
  1118.   __int64 v48; // [rsp+48h] [rbp-B8h]
  1119.   __int64 v49; // [rsp+50h] [rbp-B0h]
  1120.   HGLOBAL hMem; // [rsp+58h] [rbp-A8h]
  1121.   __int64 v51; // [rsp+60h] [rbp-A0h]
  1122.   __int128 v52; // [rsp+68h] [rbp-98h]
  1123.   __int64 v53; // [rsp+78h] [rbp-88h]
  1124.   __int64 v54; // [rsp+80h] [rbp-80h]
  1125.   void *Buf1[2]; // [rsp+88h] [rbp-78h] BYREF
  1126.   size_t v56; // [rsp+98h] [rbp-68h]
  1127.   unsigned __int64 v57; // [rsp+A0h] [rbp-60h]
  1128.   __int64 v58[3]; // [rsp+A8h] [rbp-58h] BYREF
  1129.   unsigned __int64 v59; // [rsp+C0h] [rbp-40h]
  1130.   char szFormatName[256]; // [rsp+D0h] [rbp-30h] BYREF
  1131.  
  1132.   v49 = a3;
  1133.   v48 = a2;
  1134.   v3 = a1;
  1135.   v47 = a1;
  1136.   v51 = a1;
  1137.   *(_OWORD *)a1 = 0i64;
  1138.   *(_QWORD *)a1 = 0i64;
  1139.   *(_QWORD *)(a1 + 8) = 0i64;
  1140.   *(_QWORD *)(a1 + 16) = 0i64;
  1141.   if ( !OpenClipboard(0i64) )
  1142.     return v3;
  1143.   if ( IsClipboardFormatAvailable(0xFu) )
  1144.     goto LABEL_90;
  1145.   v4 = 49251;
  1146.   v45 = 49251;
  1147.   v5 = EnumClipboardFormats(0);
  1148.   if ( !v5 )
  1149.     goto LABEL_39;
  1150.   do
  1151.   {
  1152.     if ( GetClipboardFormatNameA(v5, szFormatName, 128) <= 0 )
  1153.       goto LABEL_37;
  1154.     v52 = 0i64;
  1155.     v6 = (char *)sub_18000A224(0x20ui64);
  1156.     *(_QWORD *)&v52 = v6;
  1157.     v53 = 20i64;
  1158.     v54 = 31i64;
  1159.     strcpy(v6, "FileGroupDescriptorW");
  1160.     *(_OWORD *)Buf1 = 0i64;
  1161.     v7 = -1i64;
  1162.     do
  1163.       ++v7;
  1164.     while ( szFormatName[v7] );
  1165.     if ( v7 > 0x7FFFFFFFFFFFFFFFi64 )
  1166.       sub_180001210();
  1167.     if ( v7 >= 0x10 )
  1168.     {
  1169.       v8 = v7 | 0xF;
  1170.       if ( (v7 | 0xF) <= 0x7FFFFFFFFFFFFFFFi64 )
  1171.       {
  1172.         if ( v8 < 0x16 )
  1173.           v8 = 22i64;
  1174.         if ( v8 + 1 < 0x1000 )
  1175.         {
  1176.           if ( v8 == -1i64 )
  1177.             v9 = 0i64;
  1178.           else
  1179.             v9 = sub_18000A224(v8 + 1);
  1180. LABEL_21:
  1181.           Buf1[0] = v9;
  1182.           v56 = v7;
  1183.           v57 = v8;
  1184.           memcpy(v9, szFormatName, v7);
  1185.           *((_BYTE *)v9 + v7) = 0;
  1186.           goto LABEL_22;
  1187.         }
  1188.         v10 = v8 + 40;
  1189.         if ( v8 + 40 <= v8 + 1 )
  1190.           Concurrency::cancel_current_task();
  1191.       }
  1192.       else
  1193.       {
  1194.         v8 = 0x7FFFFFFFFFFFFFFFi64;
  1195.         v10 = 0x8000000000000027ui64;
  1196.       }
  1197.       v11 = sub_18000A224(v10);
  1198.       if ( !v11 )
  1199.         goto LABEL_48;
  1200.       v9 = (void *)(((unsigned __int64)v11 + 39) & 0xFFFFFFFFFFFFFFE0ui64);
  1201.       *((_QWORD *)v9 - 1) = v11;
  1202.       goto LABEL_21;
  1203.     }
  1204.     v56 = v7;
  1205.     v57 = 15i64;
  1206.     memcpy(Buf1, szFormatName, v7);
  1207.     *((_BYTE *)Buf1 + v7) = 0;
  1208.     v8 = v57;
  1209.     v7 = v56;
  1210.     v9 = Buf1[0];
  1211. LABEL_22:
  1212.     v12 = Buf1;
  1213.     if ( v8 >= 0x10 )
  1214.       v12 = (void **)v9;
  1215.     v13 = v7;
  1216.     if ( v7 > 0x14 )
  1217.       v13 = 20i64;
  1218.     v14 = memcmp(v12, v6, v13);
  1219.     if ( !v14 )
  1220.     {
  1221.       if ( v7 >= 0x14 )
  1222.         v14 = v7 > 0x14;
  1223.       else
  1224.         v14 = -1;
  1225.     }
  1226.     if ( v8 >= 0x10 )
  1227.     {
  1228.       v15 = v9;
  1229.       if ( v8 + 1 >= 0x1000 )
  1230.       {
  1231.         v9 = (void *)*((_QWORD *)v9 - 1);
  1232.         if ( (unsigned __int64)(v15 - (_BYTE *)v9 - 8) > 0x1F )
  1233. LABEL_48:
  1234.           invalid_parameter_noinfo_noreturn();
  1235.       }
  1236.       j_j_free(v9);
  1237.     }
  1238.     j_j_free(v6);
  1239.     v4 = v45;
  1240.     if ( !v14 )
  1241.       v4 = v5;
  1242.     v45 = v4;
  1243. LABEL_37:
  1244.     v5 = EnumClipboardFormats(v5);
  1245.   }
  1246.   while ( v5 );
  1247.   v3 = v47;
  1248. LABEL_39:
  1249.   ClipboardData = GetClipboardData(v4);
  1250.   hMem = ClipboardData;
  1251.   if ( ClipboardData )
  1252.   {
  1253.     v17 = GlobalLock(ClipboardData);
  1254.     v18 = v17;
  1255.     v46 = v17;
  1256.     if ( v17 )
  1257.     {
  1258.       v19 = *v17;
  1259.       v20 = 0;
  1260.       if ( *v17 )
  1261.       {
  1262.         while ( 1 )
  1263.         {
  1264.           v21 = &v18[148 * v20];
  1265.           sub_1800023C0(v58, (_WORD *)v21 + 38);
  1266.           v22 = v58;
  1267.           if ( v59 >= 8 )
  1268.             v22 = (__int64 *)v58[0];
  1269.           v23 = (__int64 *)((char *)v22 + 2 * v58[2]);
  1270.           v24 = v58;
  1271.           if ( v59 >= 8 )
  1272.             v24 = (__int64 *)v58[0];
  1273.           *(_OWORD *)Buf1 = 0i64;
  1274.           if ( v24 == v23 )
  1275.           {
  1276.             v56 = 0i64;
  1277.             v57 = 15i64;
  1278.             LOBYTE(Buf1[0]) = 0;
  1279.           }
  1280.           else
  1281.           {
  1282.             v25 = ((char *)v23 - (char *)v24) >> 1;
  1283.             v26 = 0i64;
  1284.             v56 = 0i64;
  1285.             v27 = 15i64;
  1286.             v57 = 15i64;
  1287.             if ( v25 > 0x7FFFFFFFFFFFFFFFi64 )
  1288.               sub_180001210();
  1289.             if ( v25 >= 0x10 )
  1290.             {
  1291.               v27 = v25 | 0xF;
  1292.               if ( (v25 | 0xF) <= 0x7FFFFFFFFFFFFFFFi64 )
  1293.               {
  1294.                 if ( v27 < 0x16 )
  1295.                   v27 = 22i64;
  1296.               }
  1297.               else
  1298.               {
  1299.                 v27 = 0x7FFFFFFFFFFFFFFFi64;
  1300.               }
  1301.               v28 = v27 + 1;
  1302.               if ( v27 == -1i64 )
  1303.                 v28 = -1i64;
  1304.               if ( v28 < 0x1000 )
  1305.               {
  1306.                 if ( v28 )
  1307.                 {
  1308.                   v31 = sub_18000A224(v28);
  1309.                   v26 = v56;
  1310.                 }
  1311.                 else
  1312.                 {
  1313.                   v31 = 0i64;
  1314.                 }
  1315.               }
  1316.               else
  1317.               {
  1318.                 if ( v28 + 39 <= v28 )
  1319.                   Concurrency::cancel_current_task();
  1320.                 v29 = sub_18000A224(v28 + 39);
  1321.                 v30 = v29;
  1322.                 if ( !v29 )
  1323. LABEL_87:
  1324.                   invalid_parameter_noinfo_noreturn();
  1325.                 v31 = (_QWORD *)(((unsigned __int64)v29 + 39) & 0xFFFFFFFFFFFFFFE0ui64);
  1326.                 *(v31 - 1) = v30;
  1327.                 v26 = v56;
  1328.               }
  1329.               Buf1[0] = v31;
  1330.               v57 = v27;
  1331.             }
  1332.             while ( 1 )
  1333.             {
  1334.               v32 = Buf1;
  1335.               if ( v27 >= 0x10 )
  1336.                 v32 = (void **)Buf1[0];
  1337.               *((_BYTE *)v32 + v26) = *(_BYTE *)v24;
  1338.               v26 = ++v56;
  1339.               v24 = (__int64 *)((char *)v24 + 2);
  1340.               if ( v24 == v23 )
  1341.                 break;
  1342.               v27 = v57;
  1343.             }
  1344.             v33 = Buf1;
  1345.             if ( v57 >= 0x10 )
  1346.               v33 = (void **)Buf1[0];
  1347.             *((_BYTE *)v33 + v26) = 0;
  1348.           }
  1349.           v34 = v48;
  1350.           v35 = (*(__int64 (__fastcall **)(__int64, __int64, const char *, const char *))(*(_QWORD *)v48 + 264i64))(
  1351.                   v48,
  1352.                   v49,
  1353.                   "<init>",
  1354.                   "(Ljava/lang/String;II)V");
  1355.           v36 = Buf1;
  1356.           if ( v57 >= 0x10 )
  1357.             v36 = (void **)Buf1[0];
  1358.           v37 = (*(__int64 (__fastcall **)(__int64, void **))(*(_QWORD *)v34 + 1336i64))(v34, v36);
  1359.           LODWORD(v44) = v21[10];
  1360.           LODWORD(v43) = v21[1];
  1361.           v38 = sub_180001010(v34, v49, v35, v37, v43, v44);
  1362.           v47 = v38;
  1363.           v39 = *(_BYTE **)(v3 + 8);
  1364.           if ( v39 == *(_BYTE **)(v3 + 16) )
  1365.           {
  1366.             sub_180002EF0((const void **)v3, v39, &v47);
  1367.           }
  1368.           else
  1369.           {
  1370.             *(_QWORD *)v39 = v38;
  1371.             *(_QWORD *)(v3 + 8) += 8i64;
  1372.           }
  1373.           if ( v57 >= 0x10 )
  1374.           {
  1375.             v40 = Buf1[0];
  1376.             if ( v57 + 1 >= 0x1000 )
  1377.             {
  1378.               v40 = (void *)*((_QWORD *)Buf1[0] - 1);
  1379.               if ( (unsigned __int64)(Buf1[0] - v40 - 8) > 0x1F )
  1380.                 goto LABEL_87;
  1381.             }
  1382.             j_j_free(v40);
  1383.           }
  1384.           v56 = 0i64;
  1385.           v57 = 15i64;
  1386.           LOBYTE(Buf1[0]) = 0;
  1387.           if ( v59 >= 8 )
  1388.           {
  1389.             v41 = (void *)v58[0];
  1390.             if ( 2 * v59 + 2 >= 0x1000 )
  1391.             {
  1392.               v41 = *(void **)(v58[0] - 8);
  1393.               if ( (unsigned __int64)(v58[0] - (_QWORD)v41 - 8) > 0x1F )
  1394.                 invalid_parameter_noinfo_noreturn();
  1395.             }
  1396.             j_j_free(v41);
  1397.           }
  1398.           if ( ++v20 >= v19 )
  1399.             break;
  1400.           v18 = v46;
  1401.         }
  1402.       }
  1403.       GlobalUnlock(hMem);
  1404.     }
  1405.   }
  1406. LABEL_90:
  1407.   CloseClipboard();
  1408.   return v3;
  1409. }
  1410. // 180001F71: variable 'v43' is possibly undefined
  1411. // 180001F71: variable 'v44' is possibly undefined
  1412. // 180001A80: using guessed type CHAR szFormatName[256];
  1413.  
  1414. //----- (00000001800020A0) ----------------------------------------------------
  1415. __int64 __fastcall sub_1800020A0(__int64 a1)
  1416. {
  1417.   _QWORD *v2; // rcx
  1418.   __int64 result; // rax
  1419.  
  1420.   v2 = *(_QWORD **)a1;
  1421.   if ( v2 )
  1422.   {
  1423.     if ( ((*(_QWORD *)(a1 + 16) - (_QWORD)v2) & 0xFFFFFFFFFFFFFFF8ui64) >= 0x1000 )
  1424.     {
  1425.       if ( (unsigned __int64)v2 - *(v2 - 1) - 8 > 0x1F )
  1426.         invalid_parameter_noinfo_noreturn();
  1427.       v2 = (_QWORD *)*(v2 - 1);
  1428.     }
  1429.     j_j_free(v2);
  1430.     result = 0i64;
  1431.     *(_QWORD *)a1 = 0i64;
  1432.     *(_QWORD *)(a1 + 8) = 0i64;
  1433.     *(_QWORD *)(a1 + 16) = 0i64;
  1434.   }
  1435.   return result;
  1436. }
  1437.  
  1438. //----- (0000000180002100) ----------------------------------------------------
  1439. __int64 __fastcall sub_180002100(__int64 a1, __int64 a2, __int64 a3)
  1440. {
  1441.   __int64 result; // rax
  1442.   unsigned __int64 v4; // r9
  1443.   unsigned __int64 v5; // r8
  1444.   __int64 v6; // rcx
  1445.  
  1446.   result = 0xCBF29CE484222325ui64;
  1447.   v4 = 0i64;
  1448.   v5 = 2 * ((a3 - a2) >> 1);
  1449.   if ( v5 )
  1450.   {
  1451.     do
  1452.     {
  1453.       v6 = *(unsigned __int8 *)(v4 + a2);
  1454.       ++v4;
  1455.       result = 0x100000001B3i64 * (v6 ^ result);
  1456.     }
  1457.     while ( v4 < v5 );
  1458.   }
  1459.   return result;
  1460. }
  1461.  
  1462. //----- (0000000180002150) ----------------------------------------------------
  1463. _QWORD *__fastcall sub_180002150(const _Collvec *a1, _QWORD *a2, const wchar_t *a3, const wchar_t *a4)
  1464. {
  1465.   unsigned __int64 v8; // rdx
  1466.   size_t v9; // rcx
  1467.   unsigned __int64 v10; // rdi
  1468.   const _Collvec *v11; // rsi
  1469.   _QWORD *v12; // rax
  1470.   __int64 v13; // rcx
  1471.   unsigned __int64 v14; // r9
  1472.   _QWORD *v15; // r8
  1473.   _WORD *v16; // rdi
  1474.   wchar_t *v17; // rdx
  1475.   wchar_t *v18; // rcx
  1476.   size_t v19; // rax
  1477.   _QWORD *v20; // rax
  1478.   __int64 v22; // r8
  1479.   unsigned __int64 v23; // rdi
  1480.   _QWORD *v24; // r9
  1481.   _WORD *v25; // rdi
  1482.   unsigned __int64 i; // rcx
  1483.  
  1484.   *(_OWORD *)a2 = 0i64;
  1485.   a2[2] = 0i64;
  1486.   a2[3] = 7i64;
  1487.   *(_WORD *)a2 = 0;
  1488.   v8 = a4 - a3;
  1489.   v9 = 0i64;
  1490.   if ( v8 )
  1491.   {
  1492.     v10 = 0i64;
  1493.     v11 = a1 + 1;
  1494.     while ( 1 )
  1495.     {
  1496.       if ( v8 > v10 )
  1497.       {
  1498.         v13 = v8 - v10;
  1499.         v14 = a2[3];
  1500.         if ( v8 - v10 > v14 - v10 )
  1501.         {
  1502.           sub_180002960(a2, v8 - v10, (__int64)a3, v8 - v10);
  1503.         }
  1504.         else
  1505.         {
  1506.           a2[2] = v8;
  1507.           v15 = a2;
  1508.           if ( v14 >= 8 )
  1509.             v15 = (_QWORD *)*a2;
  1510.           v16 = (_WORD *)v15 + v10;
  1511.           if ( v13 )
  1512.           {
  1513.             while ( v13 )
  1514.             {
  1515.               *v16++ = 0;
  1516.               --v13;
  1517.             }
  1518.           }
  1519.           *((_WORD *)v15 + v8) = 0;
  1520.         }
  1521.       }
  1522.       else
  1523.       {
  1524.         a2[2] = v8;
  1525.         v12 = a2;
  1526.         if ( a2[3] >= 8ui64 )
  1527.           v12 = (_QWORD *)*a2;
  1528.         *((_WORD *)v12 + v8) = 0;
  1529.       }
  1530.       v17 = (wchar_t *)a2;
  1531.       if ( a2[3] < 8ui64 )
  1532.       {
  1533.         v18 = (wchar_t *)a2;
  1534.         if ( a2[3] < 8ui64 )
  1535.           goto LABEL_19;
  1536.       }
  1537.       else
  1538.       {
  1539.         v17 = (wchar_t *)*a2;
  1540.       }
  1541.       v18 = (wchar_t *)*a2;
  1542. LABEL_19:
  1543.       v19 = Wcsxfrm(v18, &v17[a2[2]], a3, a4, v11);
  1544.       v8 = v19;
  1545.       v9 = a2[2];
  1546.       if ( v19 > v9 )
  1547.       {
  1548.         v10 = a2[2];
  1549.         if ( v19 )
  1550.           continue;
  1551.       }
  1552.       break;
  1553.     }
  1554.   }
  1555.   if ( v8 > v9 )
  1556.   {
  1557.     v22 = v8 - v9;
  1558.     v23 = a2[3];
  1559.     if ( v8 - v9 > v23 - v9 )
  1560.     {
  1561.       sub_180002960(a2, v8 - v9, v22, v8 - v9);
  1562.       return a2;
  1563.     }
  1564.     else
  1565.     {
  1566.       a2[2] = v8;
  1567.       v24 = a2;
  1568.       if ( v23 >= 8 )
  1569.         v24 = (_QWORD *)*a2;
  1570.       v25 = (_WORD *)v24 + v9;
  1571.       if ( v22 )
  1572.       {
  1573.         for ( i = v8 - v9; i; --i )
  1574.           *v25++ = 0;
  1575.       }
  1576.       *((_WORD *)v24 + v8) = 0;
  1577.       return a2;
  1578.     }
  1579.   }
  1580.   else
  1581.   {
  1582.     a2[2] = v8;
  1583.     v20 = a2;
  1584.     if ( a2[3] >= 8ui64 )
  1585.       v20 = (_QWORD *)*a2;
  1586.     *((_WORD *)v20 + v8) = 0;
  1587.     return a2;
  1588.   }
  1589. }
  1590. // 180002212: variable 'a3' is possibly undefined
  1591.  
  1592. //----- (0000000180002300) ----------------------------------------------------
  1593. __int64 __fastcall sub_180002300(
  1594.         const _Collvec *a1,
  1595.         const wchar_t *a2,
  1596.         const wchar_t *a3,
  1597.         const wchar_t *a4,
  1598.         wchar_t *a5)
  1599. {
  1600.   int v5; // ecx
  1601.  
  1602.   v5 = Wcscoll(a2, a3, a4, a5, a1 + 1);
  1603.   if ( v5 >= 0 )
  1604.     return v5 != 0;
  1605.   else
  1606.     return 0xFFFFFFFFi64;
  1607. }
  1608.  
  1609. //----- (0000000180002350) ----------------------------------------------------
  1610. __int64 __fastcall sub_180002350(__int64 a1)
  1611. {
  1612.   unsigned __int64 v1; // rdx
  1613.   _QWORD *v3; // rcx
  1614.   __int64 result; // rax
  1615.  
  1616.   v1 = *(_QWORD *)(a1 + 24);
  1617.   if ( v1 >= 8 )
  1618.   {
  1619.     v3 = *(_QWORD **)a1;
  1620.     if ( 2 * v1 + 2 >= 0x1000 )
  1621.     {
  1622.       if ( (unsigned __int64)v3 - *(v3 - 1) - 8 > 0x1F )
  1623.         invalid_parameter_noinfo_noreturn();
  1624.       v3 = (_QWORD *)*(v3 - 1);
  1625.     }
  1626.     j_j_free(v3);
  1627.   }
  1628.   result = 0i64;
  1629.   *(_QWORD *)(a1 + 24) = 7i64;
  1630.   *(_QWORD *)(a1 + 16) = 0i64;
  1631.   *(_WORD *)a1 = 0;
  1632.   return result;
  1633. }
  1634.  
  1635. //----- (00000001800023C0) ----------------------------------------------------
  1636. _QWORD *__fastcall sub_1800023C0(_QWORD *a1, _WORD *a2)
  1637. {
  1638.   unsigned __int64 v4; // rbx
  1639.   __int64 v5; // r14
  1640.   size_t v6; // rbx
  1641.   size_t v7; // rcx
  1642.   void *v8; // rax
  1643.   char *v9; // rsi
  1644.   size_t v10; // rbx
  1645.  
  1646.   *(_OWORD *)a1 = 0i64;
  1647.   a1[2] = 0i64;
  1648.   a1[3] = 0i64;
  1649.   v4 = -1i64;
  1650.   do
  1651.     ++v4;
  1652.   while ( a2[v4] );
  1653.   v5 = 0x7FFFFFFFFFFFFFFEi64;
  1654.   if ( v4 > 0x7FFFFFFFFFFFFFFEi64 )
  1655.     sub_180001210();
  1656.   a1[3] = 7i64;
  1657.   if ( v4 >= 8 )
  1658.   {
  1659.     if ( (v4 | 7) <= 0x7FFFFFFFFFFFFFFEi64 )
  1660.     {
  1661.       v5 = v4 | 7;
  1662.       if ( (v4 | 7) < 0xA )
  1663.         v5 = 10i64;
  1664.       if ( (unsigned __int64)(v5 + 1) > 0x7FFFFFFFFFFFFFFFi64 )
  1665.         goto LABEL_22;
  1666.       v7 = 2 * (v5 + 1);
  1667.       if ( v7 < 0x1000 )
  1668.       {
  1669.         if ( v7 )
  1670.           v9 = (char *)sub_18000A224(v7);
  1671.         else
  1672.           v9 = 0i64;
  1673. LABEL_19:
  1674.         a1[2] = v4;
  1675.         v10 = 2 * v4;
  1676.         *a1 = v9;
  1677.         a1[3] = v5;
  1678.         memcpy(v9, a2, v10);
  1679.         *(_WORD *)&v9[v10] = 0;
  1680.         return a1;
  1681.       }
  1682.     }
  1683.     else
  1684.     {
  1685.       v7 = -2i64;
  1686.     }
  1687.     if ( v7 + 39 > v7 )
  1688.     {
  1689.       v8 = sub_18000A224(v7 + 39);
  1690.       if ( !v8 )
  1691.         invalid_parameter_noinfo_noreturn();
  1692.       v9 = (char *)(((unsigned __int64)v8 + 39) & 0xFFFFFFFFFFFFFFE0ui64);
  1693.       *((_QWORD *)v9 - 1) = v8;
  1694.       goto LABEL_19;
  1695.     }
  1696. LABEL_22:
  1697.     Concurrency::cancel_current_task();
  1698.   }
  1699.   a1[2] = v4;
  1700.   v6 = 2 * v4;
  1701.   memmove(a1, a2, v6);
  1702.   *(_WORD *)((char *)a1 + v6) = 0;
  1703.   return a1;
  1704. }
  1705.  
  1706. //----- (0000000180002510) ----------------------------------------------------
  1707. void __fastcall sub_180002510(__int64 a1)
  1708. {
  1709.   unsigned __int64 v1; // rdx
  1710.   _QWORD *v3; // rcx
  1711.  
  1712.   v1 = *(_QWORD *)(a1 + 24);
  1713.   if ( v1 >= 0x10 )
  1714.   {
  1715.     v3 = *(_QWORD **)a1;
  1716.     if ( v1 + 1 >= 0x1000 )
  1717.     {
  1718.       if ( (unsigned __int64)v3 - *(v3 - 1) - 8 > 0x1F )
  1719.         invalid_parameter_noinfo_noreturn();
  1720.       v3 = (_QWORD *)*(v3 - 1);
  1721.     }
  1722.     j_j_free(v3);
  1723.   }
  1724.   *(_QWORD *)(a1 + 16) = 0i64;
  1725.   *(_QWORD *)(a1 + 24) = 15i64;
  1726.   *(_BYTE *)a1 = 0;
  1727. }
  1728.  
  1729. //----- (0000000180002570) ----------------------------------------------------
  1730. _QWORD *__fastcall sub_180002570(_QWORD *a1, _BYTE *a2)
  1731. {
  1732.   _QWORD *v2; // r14
  1733.   size_t v5; // rbx
  1734.   __int64 v6; // rsi
  1735.   size_t v7; // rax
  1736.   void *v8; // rax
  1737.  
  1738.   v2 = 0i64;
  1739.   *(_OWORD *)a1 = 0i64;
  1740.   a1[2] = 0i64;
  1741.   a1[3] = 0i64;
  1742.   v5 = -1i64;
  1743.   do
  1744.     ++v5;
  1745.   while ( a2[v5] );
  1746.   v6 = 0x7FFFFFFFFFFFFFFFi64;
  1747.   if ( v5 > 0x7FFFFFFFFFFFFFFFi64 )
  1748.     sub_180001210();
  1749.   a1[3] = 15i64;
  1750.   if ( v5 >= 0x10 )
  1751.   {
  1752.     if ( (v5 | 0xF) <= 0x7FFFFFFFFFFFFFFFi64 )
  1753.     {
  1754.       v6 = v5 | 0xF;
  1755.       if ( (v5 | 0xF) < 0x16 )
  1756.         v6 = 22i64;
  1757.       if ( (unsigned __int64)(v6 + 1) < 0x1000 )
  1758.       {
  1759.         if ( v6 != -1 )
  1760.           v2 = sub_18000A224(v6 + 1);
  1761.         goto LABEL_18;
  1762.       }
  1763.       v7 = v6 + 40;
  1764.       if ( v6 + 40 <= (unsigned __int64)(v6 + 1) )
  1765.         Concurrency::cancel_current_task();
  1766.     }
  1767.     else
  1768.     {
  1769.       v7 = 0x8000000000000027ui64;
  1770.     }
  1771.     v8 = sub_18000A224(v7);
  1772.     if ( !v8 )
  1773.       invalid_parameter_noinfo_noreturn();
  1774.     v2 = (_QWORD *)(((unsigned __int64)v8 + 39) & 0xFFFFFFFFFFFFFFE0ui64);
  1775.     *(v2 - 1) = v8;
  1776. LABEL_18:
  1777.     *a1 = v2;
  1778.     a1[2] = v5;
  1779.     a1[3] = v6;
  1780.     memcpy(v2, a2, v5);
  1781.     *((_BYTE *)v2 + v5) = 0;
  1782.     return a1;
  1783.   }
  1784.   a1[2] = v5;
  1785.   memmove(a1, a2, v5);
  1786.   *((_BYTE *)a1 + v5) = 0;
  1787.   return a1;
  1788. }
  1789.  
  1790. //----- (0000000180002690) ----------------------------------------------------
  1791. void __fastcall sub_180002690(__int64 a1)
  1792. {
  1793.   __int64 v1; // rcx
  1794.   void (__fastcall ***v2)(_QWORD, __int64); // rax
  1795.  
  1796.   v1 = *(_QWORD *)(a1 + 24);
  1797.   if ( v1 )
  1798.   {
  1799.     v2 = (void (__fastcall ***)(_QWORD, __int64))(*(__int64 (__fastcall **)(__int64))(*(_QWORD *)v1 + 16i64))(v1);
  1800.     if ( v2 )
  1801.       (**v2)(v2, 1i64);
  1802.   }
  1803. }
  1804.  
  1805. //----- (00000001800026C0) ----------------------------------------------------
  1806. void *__fastcall sub_1800026C0(void *Block, char a2)
  1807. {
  1808.   *(_QWORD *)Block = &std::collate<wchar_t>::`vftable';
  1809.  free(*((void **)Block + 3));
  1810.  std::locale::facet::~facet((std::locale::facet *)Block);
  1811.  if ( (a2 & 1) != 0 )
  1812.    j_j_free(Block);
  1813.  return Block;
  1814. }
  1815. // 18000C0D8: using guessed type void std::locale::facet::~facet(std::locale::facet *__hidden this);
  1816. // 18000C810: using guessed type void *std::collate<wchar_t>::`vftable';
  1817.  
  1818. //----- (0000000180002710) ----------------------------------------------------
  1819. __int64 __fastcall sub_180002710(__int64 *a1)
  1820. {
  1821.   __int64 v2; // rcx
  1822.   __int64 result; // rax
  1823.   __int64 i; // rdi
  1824.   _QWORD *v5; // rax
  1825.   __int64 (__fastcall ***v6)(_QWORD, __int64); // rcx
  1826.  
  1827.   v2 = *a1;
  1828.   if ( v2
  1829.     && (result = (unsigned int)_InterlockedExchangeAdd((volatile signed __int32 *)(v2 + 44), 0xFFFFFFFF),
  1830.         (_DWORD)result == 1) )
  1831.   {
  1832.     for ( i = *a1; i; result = (**v6)(v6, 1i64) )
  1833.     {
  1834.       v5 = (_QWORD *)(i + 16);
  1835.       v6 = (__int64 (__fastcall ***)(_QWORD, __int64))i;
  1836.       i = *(_QWORD *)(i + 16);
  1837.       *v5 = 0i64;
  1838.     }
  1839.     *a1 = 0i64;
  1840.   }
  1841.   else
  1842.   {
  1843.     *a1 = 0i64;
  1844.   }
  1845.   return result;
  1846. }
  1847.  
  1848. //----- (0000000180002790) ----------------------------------------------------
  1849. __int64 *__fastcall sub_180002790(__int64 *a1, unsigned __int16 *a2)
  1850. {
  1851.   struct _Collvec **v4; // rsi
  1852.   unsigned __int16 *v5; // rcx
  1853.   unsigned __int16 *v6; // rdx
  1854.   unsigned __int16 *v7; // rcx
  1855.   __int64 v8; // rax
  1856.   __int64 v9; // rdi
  1857.   void *v10; // rcx
  1858.   char *v12; // [rsp+20h] [rbp-69h]
  1859.   unsigned __int16 *v13[2]; // [rsp+30h] [rbp-59h] BYREF
  1860.   __int128 v14; // [rsp+40h] [rbp-49h]
  1861.   void *Block[2]; // [rsp+50h] [rbp-39h]
  1862.   __int128 v16; // [rsp+60h] [rbp-29h]
  1863.   __int128 v17; // [rsp+70h] [rbp-19h]
  1864.   __int128 v18; // [rsp+80h] [rbp-9h]
  1865.   __int128 v19; // [rsp+90h] [rbp+7h]
  1866.   __int128 v20; // [rsp+A0h] [rbp+17h]
  1867.   __int64 v21; // [rsp+B0h] [rbp+27h]
  1868.  
  1869.   *a1 = 0i64;
  1870.   v4 = (struct _Collvec **)(a1 + 1);
  1871.   a1[4] = (__int64)std::locale::_Init(1);
  1872.   sub_180002B50(v4);
  1873.   v5 = a2;
  1874.   if ( *((_QWORD *)a2 + 3) < 8ui64 )
  1875.   {
  1876.     v6 = a2;
  1877.   }
  1878.   else
  1879.   {
  1880.     v5 = *(unsigned __int16 **)a2;
  1881.     v6 = *(unsigned __int16 **)a2;
  1882.   }
  1883.   v7 = &v5[*((_QWORD *)a2 + 2)];
  1884.   v17 = 0i64;
  1885.   v18 = 0i64;
  1886.   v19 = 0i64;
  1887.   v20 = 0i64;
  1888.   v21 = 0i64;
  1889.   v13[0] = v6;
  1890.   v13[1] = v6;
  1891.   v14 = (unsigned __int64)v7;
  1892.   *(_OWORD *)Block = 0i64;
  1893.   v16 = 0ui64;
  1894.   v12 = (char *)sub_18000A224(0x30ui64);
  1895.   *(_OWORD *)v12 = 0i64;
  1896.   *((_OWORD *)v12 + 1) = 0i64;
  1897.   *((_OWORD *)v12 + 2) = 0i64;
  1898.   *((_QWORD *)v12 + 1) = 20i64;
  1899.   *((_QWORD *)v12 + 2) = 0i64;
  1900.   *((_QWORD *)v12 + 3) = 0i64;
  1901.   *(_QWORD *)v12 = &std::_Root_node::`vftable';
  1902.  *(_QWORD *)(v12 + 36) = 0i64;
  1903.  *((_DWORD *)v12 + 11) = 0;
  1904.  *(_QWORD *)&v17 = v12;
  1905.  *((_QWORD *)&v17 + 1) = v12;
  1906.  LODWORD(v18) = 1;
  1907.  *((_QWORD *)&v18 + 1) = v4;
  1908.  *(_QWORD *)&v19 = 0x400000100i64;
  1909.  *((_QWORD *)&v19 + 1) = v4;
  1910.  LODWORD(v20) = 1;
  1911.  LODWORD(v21) = 142040571;
  1912.  sub_1800040D0(v13);
  1913.  v8 = sub_1800036C0((__int64)v13);
  1914.  v9 = v8;
  1915.  if ( v8 )
  1916.    _InterlockedIncrement((volatile signed __int32 *)(v8 + 44));
  1917.  sub_180002710(a1);
  1918.  *a1 = v9;
  1919.  v10 = Block[0];
  1920.  if ( Block[0] )
  1921.  {
  1922.    if ( (unsigned __int64)(4 * ((__int64)(v16 - (unsigned __int64)Block[0]) >> 2)) >= 0x1000 )
  1923.    {
  1924.      v10 = (void *)*((_QWORD *)Block[0] - 1);
  1925.      if ( (unsigned __int64)(Block[0] - v10 - 8) > 0x1F )
  1926.        invalid_parameter_noinfo_noreturn();
  1927.    }
  1928.    j_j_free(v10);
  1929.  }
  1930.  return a1;
  1931. }
  1932. // 18000C150: using guessed type struct std::locale::_Locimp *__stdcall static std::locale::_Init(bool);
  1933. // 18000C8C8: using guessed type void *std::_Root_node::`vftable';
  1934.  
  1935. //----- (0000000180002960) ----------------------------------------------------
  1936. void *__fastcall sub_180002960(void *Src, unsigned __int64 a2, __int64 a3, __int64 a4)
  1937. {
  1938.   __int64 v4; // r12
  1939.   __int64 v5; // rdi
  1940.   unsigned __int64 v8; // rbp
  1941.   __int64 v9; // rsi
  1942.   unsigned __int64 v10; // rdx
  1943.   size_t v11; // rcx
  1944.   unsigned __int64 v12; // rcx
  1945.   void *v13; // rax
  1946.   _QWORD *v14; // rbx
  1947.   size_t v15; // r8
  1948.   _WORD *v16; // rdi
  1949.   _QWORD *v17; // rsi
  1950.   __int64 i; // rcx
  1951.   __int64 j; // rcx
  1952.  
  1953.   v4 = *((_QWORD *)Src + 2);
  1954.   v5 = 0x7FFFFFFFFFFFFFFEi64;
  1955.   if ( 0x7FFFFFFFFFFFFFFEi64 - v4 < a2 )
  1956.     sub_180001210();
  1957.   v8 = *((_QWORD *)Src + 3);
  1958.   v9 = a2 + v4;
  1959.   v10 = (a2 + v4) | 7;
  1960.   if ( v10 <= 0x7FFFFFFFFFFFFFFEi64 )
  1961.   {
  1962.     v12 = v8 >> 1;
  1963.     if ( v8 <= 0x7FFFFFFFFFFFFFFEi64 - (v8 >> 1) )
  1964.     {
  1965.       v5 = v10;
  1966.       if ( v10 < v12 + v8 )
  1967.         v5 = v12 + v8;
  1968.       if ( (unsigned __int64)(v5 + 1) > 0x7FFFFFFFFFFFFFFFi64 )
  1969. LABEL_33:
  1970.         Concurrency::cancel_current_task();
  1971.       v11 = 2 * (v5 + 1);
  1972.       if ( v11 < 0x1000 )
  1973.       {
  1974.         if ( v11 )
  1975.           v14 = sub_18000A224(v11);
  1976.         else
  1977.           v14 = 0i64;
  1978.         goto LABEL_16;
  1979.       }
  1980.     }
  1981.     else
  1982.     {
  1983.       v11 = -2i64;
  1984.     }
  1985.   }
  1986.   else
  1987.   {
  1988.     v11 = -2i64;
  1989.   }
  1990.   if ( v11 + 39 <= v11 )
  1991.     goto LABEL_33;
  1992.   v13 = sub_18000A224(v11 + 39);
  1993.   if ( !v13 )
  1994.     goto LABEL_25;
  1995.   v14 = (_QWORD *)(((unsigned __int64)v13 + 39) & 0xFFFFFFFFFFFFFFE0ui64);
  1996.   *(v14 - 1) = v13;
  1997. LABEL_16:
  1998.   *((_QWORD *)Src + 3) = v5;
  1999.   v15 = 2 * v4;
  2000.   *((_QWORD *)Src + 2) = v9;
  2001.   v16 = (_WORD *)v14 + v4;
  2002.   if ( v8 >= 8 )
  2003.   {
  2004.     v17 = *(_QWORD **)Src;
  2005.     memcpy(v14, *(const void **)Src, v15);
  2006.     if ( a4 )
  2007.     {
  2008.       for ( i = a4; i; --i )
  2009.         *v16++ = 0;
  2010.     }
  2011.     *((_WORD *)v14 + a4 + v4) = 0;
  2012.     if ( 2 * v8 + 2 < 0x1000 )
  2013.       goto LABEL_24;
  2014.     if ( (unsigned __int64)v17 - *(v17 - 1) - 8 <= 0x1F )
  2015.     {
  2016.       v17 = (_QWORD *)*(v17 - 1);
  2017. LABEL_24:
  2018.       j_j_free(v17);
  2019.       goto LABEL_31;
  2020.     }
  2021. LABEL_25:
  2022.     invalid_parameter_noinfo_noreturn();
  2023.   }
  2024.   memcpy(v14, Src, v15);
  2025.   if ( a4 )
  2026.   {
  2027.     for ( j = a4; j; --j )
  2028.       *v16++ = 0;
  2029.   }
  2030.   *((_WORD *)v14 + a4 + v4) = 0;
  2031. LABEL_31:
  2032.   *(_QWORD *)Src = v14;
  2033.   return Src;
  2034. }
  2035.  
  2036. //----- (0000000180002B50) ----------------------------------------------------
  2037. void __fastcall sub_180002B50(struct _Collvec **a1)
  2038. {
  2039.   __int64 v2; // rbp
  2040.   unsigned __int64 v3; // r15
  2041.   struct _Collvec *v4; // rdx
  2042.   __int64 v5; // rsi
  2043.   struct _Collvec *v6; // rdi
  2044.   struct _Collvec *v7; // rbx
  2045.   __int64 v8; // rax
  2046.   unsigned __int64 v9; // rsi
  2047.   struct _Collvec *v10; // rdx
  2048.   __int64 v11; // rbx
  2049.   __int64 v12; // rax
  2050.   struct _Collvec *v13; // rbx
  2051.   struct _Collvec *v14; // [rsp+20h] [rbp-48h] BYREF
  2052.   char v15[8]; // [rsp+28h] [rbp-40h] BYREF
  2053.   struct _Collvec *v16; // [rsp+30h] [rbp-38h]
  2054.  
  2055.   std::_Lockit::_Lockit((std::_Lockit *)v15, 0);
  2056.   v2 = qword_1800109B8;
  2057.   v14 = (struct _Collvec *)qword_1800109B8;
  2058.   v3 = std::locale::id::operator unsigned __int64(std::collate<wchar_t>::id);
  2059.   v4 = a1[3];
  2060.   v5 = 8 * v3;
  2061.   v6 = 0i64;
  2062.   if ( (wchar_t *)v3 >= v4[1]._LocaleName )
  2063.   {
  2064.     v7 = 0i64;
  2065.   }
  2066.   else
  2067.   {
  2068.     v7 = *(struct _Collvec **)(v5 + *(_QWORD *)&v4[1]._Page);
  2069.     if ( v7 )
  2070.       goto LABEL_13;
  2071.   }
  2072.   if ( !*((_BYTE *)&v4[2]._Page + 4) )
  2073.     goto LABEL_8;
  2074.   v8 = std::locale::_Getgloballocale();
  2075.   if ( v3 < *(_QWORD *)(v8 + 24) )
  2076.   {
  2077.     v7 = *(struct _Collvec **)(v5 + *(_QWORD *)(v8 + 16));
  2078. LABEL_8:
  2079.     if ( v7 )
  2080.       goto LABEL_13;
  2081.   }
  2082.   if ( v2 )
  2083.   {
  2084.     v7 = (struct _Collvec *)v2;
  2085.   }
  2086.   else
  2087.   {
  2088.     if ( sub_180003490(&v14, (__int64)(a1 + 2)) == -1 )
  2089.       Concurrency::cancel_current_task();
  2090.     v7 = v14;
  2091.     sub_18000A09C((__int64)v14);
  2092.     (*(void (__fastcall **)(struct _Collvec *))(*(_QWORD *)&v7->_Page + 8i64))(v7);
  2093.     qword_1800109B8 = (__int64)v7;
  2094.   }
  2095. LABEL_13:
  2096.   std::_Lockit::~_Lockit((std::_Lockit *)v15);
  2097.   *a1 = v7;
  2098.   std::_Lockit::_Lockit((std::_Lockit *)v15, 0);
  2099.   v14 = (struct _Collvec *)qword_1800109C0;
  2100.   v9 = std::locale::id::operator unsigned __int64(std::ctype<wchar_t>::id);
  2101.   v10 = a1[3];
  2102.   v11 = 8 * v9;
  2103.   if ( (wchar_t *)v9 < v10[1]._LocaleName )
  2104.   {
  2105.     v6 = *(struct _Collvec **)(v11 + *(_QWORD *)&v10[1]._Page);
  2106.     if ( v6 )
  2107.       goto LABEL_22;
  2108.   }
  2109.   if ( !*((_BYTE *)&v10[2]._Page + 4) )
  2110.     goto LABEL_18;
  2111.   v12 = std::locale::_Getgloballocale();
  2112.   if ( v9 < *(_QWORD *)(v12 + 24) )
  2113.   {
  2114.     v6 = *(struct _Collvec **)(v11 + *(_QWORD *)(v12 + 16));
  2115. LABEL_18:
  2116.     if ( v6 )
  2117.       goto LABEL_22;
  2118.   }
  2119.   v6 = v14;
  2120.   if ( !v14 )
  2121.   {
  2122.     if ( std::ctype<wchar_t>::_Getcat(&v14, a1 + 2) == -1 )
  2123.       Concurrency::cancel_current_task();
  2124.     v13 = v14;
  2125.     v16 = v14;
  2126.     sub_18000A09C((__int64)v14);
  2127.     (*(void (__fastcall **)(struct _Collvec *))(*(_QWORD *)&v13->_Page + 8i64))(v13);
  2128.     v6 = v14;
  2129.     qword_1800109C0 = (__int64)v14;
  2130.   }
  2131. LABEL_22:
  2132.   std::_Lockit::~_Lockit((std::_Lockit *)v15);
  2133.   a1[1] = v6;
  2134. }
  2135. // 18000C0B8: using guessed type __int64 __fastcall std::ctype<wchar_t>::_Getcat(_QWORD, _QWORD);
  2136. // 18000C0F8: using guessed type __int64 __fastcall std::locale::id::operator unsigned __int64(_QWORD);
  2137. // 18000C128: using guessed type _QWORD std::_Lockit::_Lockit(std::_Lockit *__hidden this, _DWORD);
  2138. // 18000C130: using guessed type void std::_Lockit::~_Lockit(std::_Lockit *__hidden this);
  2139. // 18000C158: using guessed type __int64 std::locale::_Getgloballocale(void);
  2140. // 1800109B8: using guessed type __int64 qword_1800109B8;
  2141. // 1800109C0: using guessed type __int64 qword_1800109C0;
  2142. // 180002B50: using guessed type char var_40[8];
  2143.  
  2144. //----- (0000000180002D30) ----------------------------------------------------
  2145. bool __fastcall sub_180002D30(__int64 a1, __int64 a2, __int64 a3, __int64 *a4, int a5)
  2146. {
  2147.   __int64 v8; // rbx
  2148.   __int64 v10; // rdi
  2149.   unsigned __int64 v11; // rcx
  2150.   unsigned __int64 v12; // rbx
  2151.   bool v13; // bl
  2152.   void *v14; // rcx
  2153.   __int64 v15[30]; // [rsp+40h] [rbp-C0h] BYREF
  2154.  
  2155.   v8 = *a4;
  2156.   if ( !*a4 )
  2157.     return 0;
  2158.   memset(v15, 0, 0xE8ui64);
  2159.   sub_180003270((__int64)v15, a1, a2, (__int64)(a4 + 1), v8, *(_DWORD *)(v8 + 40), *(_DWORD *)(v8 + 32), a5);
  2160.   v15[19] = v15[21];
  2161.   v15[0] = v15[21];
  2162.   sub_1800038B0((unsigned __int64 *)&v15[1], HIDWORD(v15[24]));
  2163.   v10 = v15[6];
  2164.   v11 = (v15[6] - v15[5]) >> 4;
  2165.   if ( HIDWORD(v15[24]) >= v11 )
  2166.   {
  2167.     if ( HIDWORD(v15[24]) > v11 )
  2168.     {
  2169.       if ( HIDWORD(v15[24]) <= (unsigned __int64)((v15[7] - v15[5]) >> 4) )
  2170.       {
  2171.         v12 = HIDWORD(v15[24]) - v11;
  2172.         if ( v12 )
  2173.         {
  2174.           memset((void *)v15[6], 0, 16 * v12);
  2175.           v10 += 16 * v12;
  2176.         }
  2177.         v15[6] = v10;
  2178.       }
  2179.       else
  2180.       {
  2181.         sub_180004D30((__int64)&v15[5], HIDWORD(v15[24]));
  2182.       }
  2183.     }
  2184.   }
  2185.   else
  2186.   {
  2187.     v15[6] = v15[5] + 16i64 * HIDWORD(v15[24]);
  2188.   }
  2189.   LOWORD(v15[24]) = 0;
  2190.   LOBYTE(v15[27]) = 1;
  2191.   HIDWORD(v15[27]) = 10000000;
  2192.   LODWORD(v15[28]) = 600;
  2193.   v13 = sub_180004740((__int64)v15, v15[22]);
  2194.   v14 = (void *)v15[16];
  2195.   if ( v15[16] )
  2196.   {
  2197.     if ( ((v15[18] - v15[16]) & 0xFFFFFFFFFFFFFFF0ui64) >= 0x1000 )
  2198.     {
  2199.       v14 = *(void **)(v15[16] - 8);
  2200.       if ( (unsigned __int64)(v15[16] - (_QWORD)v14 - 8) > 0x1F )
  2201.         invalid_parameter_noinfo_noreturn();
  2202.     }
  2203.     j_j_free(v14);
  2204.     memset(&v15[16], 0, 24);
  2205.   }
  2206.   sub_180003160(&v15[8]);
  2207.   sub_180003160(v15);
  2208.   return v13;
  2209. }
  2210.  
  2211. //----- (0000000180002EF0) ----------------------------------------------------
  2212. _QWORD *__fastcall sub_180002EF0(const void **a1, _BYTE *a2, _QWORD *a3)
  2213. {
  2214.   __int64 v5; // r14
  2215.   __int64 v6; // rax
  2216.   unsigned __int64 v8; // rcx
  2217.   unsigned __int64 v9; // rdx
  2218.   unsigned __int64 v10; // r15
  2219.   unsigned __int64 v11; // rsi
  2220.   size_t v12; // rsi
  2221.   void *v13; // rax
  2222.   _QWORD *v14; // rbx
  2223.   _QWORD *v15; // r14
  2224.   void *v16; // rcx
  2225.   _BYTE *v17; // r8
  2226.   _BYTE *v18; // rdx
  2227.   size_t v19; // r8
  2228.   void *v20; // rcx
  2229.   _QWORD *result; // rax
  2230.  
  2231.   v5 = (a2 - (_BYTE *)*a1) >> 3;
  2232.   v6 = ((_BYTE *)a1[1] - (_BYTE *)*a1) >> 3;
  2233.   if ( v6 == 0x1FFFFFFFFFFFFFFFi64 )
  2234.     sub_1800033B0();
  2235.   v8 = ((_BYTE *)a1[2] - (_BYTE *)*a1) >> 3;
  2236.   v9 = v8 >> 1;
  2237.   v10 = v6 + 1;
  2238.   if ( v8 > 0x1FFFFFFFFFFFFFFFi64 - (v8 >> 1) )
  2239.     goto LABEL_24;
  2240.   v11 = v6 + 1;
  2241.   if ( v9 + v8 >= v10 )
  2242.     v11 = v9 + v8;
  2243.   if ( v11 > 0x1FFFFFFFFFFFFFFFi64 )
  2244.     goto LABEL_24;
  2245.   v12 = 8 * v11;
  2246.   if ( v12 < 0x1000 )
  2247.   {
  2248.     if ( v12 )
  2249.       v14 = sub_18000A224(v12);
  2250.     else
  2251.       v14 = 0i64;
  2252.     goto LABEL_13;
  2253.   }
  2254.   if ( v12 + 39 <= v12 )
  2255. LABEL_24:
  2256.     Concurrency::cancel_current_task();
  2257.   v13 = sub_18000A224(v12 + 39);
  2258.   if ( !v13 )
  2259.     goto LABEL_22;
  2260.   v14 = (_QWORD *)(((unsigned __int64)v13 + 39) & 0xFFFFFFFFFFFFFFE0ui64);
  2261.   *(v14 - 1) = v13;
  2262. LABEL_13:
  2263.   v15 = &v14[v5];
  2264.   *v15 = *a3;
  2265.   v16 = v14;
  2266.   v17 = a1[1];
  2267.   v18 = *a1;
  2268.   if ( a2 == v17 )
  2269.   {
  2270.     v19 = v17 - v18;
  2271.   }
  2272.   else
  2273.   {
  2274.     memmove(v14, v18, a2 - v18);
  2275.     v16 = v15 + 1;
  2276.     v19 = (_BYTE *)a1[1] - a2;
  2277.     v18 = a2;
  2278.   }
  2279.   memmove(v16, v18, v19);
  2280.   v20 = (void *)*a1;
  2281.   if ( *a1 )
  2282.   {
  2283.     if ( (((_BYTE *)a1[2] - (_BYTE *)v20) & 0xFFFFFFFFFFFFFFF8ui64) < 0x1000 )
  2284.     {
  2285. LABEL_20:
  2286.       j_j_free(v20);
  2287.       goto LABEL_21;
  2288.     }
  2289.     if ( (unsigned __int64)v20 - *((_QWORD *)v20 - 1) - 8 <= 0x1F )
  2290.     {
  2291.       v20 = (void *)*((_QWORD *)v20 - 1);
  2292.       goto LABEL_20;
  2293.     }
  2294. LABEL_22:
  2295.     invalid_parameter_noinfo_noreturn();
  2296.   }
  2297. LABEL_21:
  2298.   *a1 = v14;
  2299.   result = v15;
  2300.   a1[1] = &v14[v10];
  2301.   a1[2] = &v14[v12 / 8];
  2302.   return result;
  2303. }
  2304.  
  2305. //----- (0000000180003080) ----------------------------------------------------
  2306. __int64 __fastcall sub_180003080(_QWORD *a1)
  2307. {
  2308.   _QWORD *v2; // rcx
  2309.   __int64 result; // rax
  2310.  
  2311.   v2 = (_QWORD *)a1[4];
  2312.   if ( v2 )
  2313.   {
  2314.     if ( ((a1[6] - (_QWORD)v2) & 0xFFFFFFFFFFFFFFFCui64) >= 0x1000 )
  2315.     {
  2316.       if ( (unsigned __int64)v2 - *(v2 - 1) - 8 > 0x1F )
  2317.         invalid_parameter_noinfo_noreturn();
  2318.       v2 = (_QWORD *)*(v2 - 1);
  2319.     }
  2320.     j_j_free(v2);
  2321.     result = 0i64;
  2322.     a1[4] = 0i64;
  2323.     a1[5] = 0i64;
  2324.     a1[6] = 0i64;
  2325.   }
  2326.   return result;
  2327. }
  2328.  
  2329. //----- (00000001800030E0) ----------------------------------------------------
  2330. void __fastcall sub_1800030E0(_QWORD *a1)
  2331. {
  2332.   _QWORD *v2; // rcx
  2333.  
  2334.   v2 = (_QWORD *)a1[16];
  2335.   if ( v2 )
  2336.   {
  2337.     if ( ((a1[18] - (_QWORD)v2) & 0xFFFFFFFFFFFFFFF0ui64) >= 0x1000 )
  2338.     {
  2339.       if ( (unsigned __int64)v2 - *(v2 - 1) - 8 > 0x1F )
  2340.         invalid_parameter_noinfo_noreturn();
  2341.       v2 = (_QWORD *)*(v2 - 1);
  2342.     }
  2343.     j_j_free(v2);
  2344.     a1[16] = 0i64;
  2345.     a1[17] = 0i64;
  2346.     a1[18] = 0i64;
  2347.   }
  2348.   sub_180003160(a1 + 8);
  2349.   sub_180003160(a1);
  2350. }
  2351.  
  2352. //----- (0000000180003160) ----------------------------------------------------
  2353. void __fastcall sub_180003160(_QWORD *a1)
  2354. {
  2355.   _QWORD *v2; // rcx
  2356.   _QWORD *v3; // rcx
  2357.  
  2358.   v2 = (_QWORD *)a1[5];
  2359.   if ( v2 )
  2360.   {
  2361.     if ( ((a1[7] - (_QWORD)v2) & 0xFFFFFFFFFFFFFFF0ui64) >= 0x1000 )
  2362.     {
  2363.       if ( (unsigned __int64)v2 - *(v2 - 1) - 8 > 0x1F )
  2364.         goto LABEL_12;
  2365.       v2 = (_QWORD *)*(v2 - 1);
  2366.     }
  2367.     j_j_free(v2);
  2368.     a1[5] = 0i64;
  2369.     a1[6] = 0i64;
  2370.     a1[7] = 0i64;
  2371.   }
  2372.   v3 = (_QWORD *)a1[1];
  2373.   if ( !v3 )
  2374.     return;
  2375.   if ( ((a1[3] - (_QWORD)v3) & 0xFFFFFFFFFFFFFFFCui64) >= 0x1000 )
  2376.   {
  2377.     if ( (unsigned __int64)v3 - *(v3 - 1) - 8 <= 0x1F )
  2378.     {
  2379.       v3 = (_QWORD *)*(v3 - 1);
  2380.       goto LABEL_10;
  2381.     }
  2382. LABEL_12:
  2383.     invalid_parameter_noinfo_noreturn();
  2384.   }
  2385. LABEL_10:
  2386.   j_j_free(v3);
  2387.   a1[1] = 0i64;
  2388.   a1[2] = 0i64;
  2389.   a1[3] = 0i64;
  2390. }
  2391.  
  2392. //----- (0000000180003210) ----------------------------------------------------
  2393. __int64 __fastcall sub_180003210(_QWORD *a1)
  2394. {
  2395.   _QWORD *v2; // rcx
  2396.   __int64 result; // rax
  2397.  
  2398.   v2 = (_QWORD *)a1[1];
  2399.   if ( v2 )
  2400.   {
  2401.     if ( ((a1[3] - (_QWORD)v2) & 0xFFFFFFFFFFFFFFFCui64) >= 0x1000 )
  2402.     {
  2403.       if ( (unsigned __int64)v2 - *(v2 - 1) - 8 > 0x1F )
  2404.         invalid_parameter_noinfo_noreturn();
  2405.       v2 = (_QWORD *)*(v2 - 1);
  2406.     }
  2407.     j_j_free(v2);
  2408.     result = 0i64;
  2409.     a1[1] = 0i64;
  2410.     a1[2] = 0i64;
  2411.     a1[3] = 0i64;
  2412.   }
  2413.   return result;
  2414. }
  2415.  
  2416. //----- (0000000180003270) ----------------------------------------------------
  2417. __int64 __fastcall sub_180003270(__int64 a1, __int64 a2, __int64 a3, __int64 a4, __int64 a5, int a6, int a7, int a8)
  2418. {
  2419.   __int64 v9; // rsi
  2420.   bool v10; // al
  2421.   unsigned __int64 v11; // rbx
  2422.   __int64 v12; // rbp
  2423.   unsigned __int64 v13; // rcx
  2424.   unsigned __int64 v14; // rbx
  2425.  
  2426.   *(_QWORD *)(a1 + 8) = 0i64;
  2427.   *(_QWORD *)(a1 + 16) = 0i64;
  2428.   *(_QWORD *)(a1 + 24) = 0i64;
  2429.   *(_QWORD *)(a1 + 32) = 0i64;
  2430.   *(_QWORD *)(a1 + 40) = 0i64;
  2431.   *(_QWORD *)(a1 + 48) = 0i64;
  2432.   *(_QWORD *)(a1 + 56) = 0i64;
  2433.   *(_QWORD *)(a1 + 72) = 0i64;
  2434.   *(_QWORD *)(a1 + 80) = 0i64;
  2435.   *(_QWORD *)(a1 + 88) = 0i64;
  2436.   *(_QWORD *)(a1 + 96) = 0i64;
  2437.   *(_QWORD *)(a1 + 104) = 0i64;
  2438.   *(_QWORD *)(a1 + 112) = 0i64;
  2439.   *(_QWORD *)(a1 + 120) = 0i64;
  2440.   v9 = a1 + 128;
  2441.   *(_QWORD *)(a1 + 128) = 0i64;
  2442.   *(_QWORD *)(a1 + 136) = 0i64;
  2443.   *(_QWORD *)(a1 + 144) = 0i64;
  2444.   *(_QWORD *)(a1 + 160) = a3;
  2445.   *(_QWORD *)(a1 + 168) = a2;
  2446.   *(_QWORD *)(a1 + 176) = a5;
  2447.   *(_DWORD *)(a1 + 184) = a7;
  2448.   *(_DWORD *)(a1 + 188) = a8;
  2449.   *(_BYTE *)(a1 + 192) = 0;
  2450.   *(_DWORD *)(a1 + 196) = a6;
  2451.   v10 = (*(_BYTE *)(a5 + 12) & 8) != 0 && (a8 & 0x10) == 0;
  2452.   *(_BYTE *)(a1 + 200) = v10;
  2453.   *(_QWORD *)(a1 + 208) = a4;
  2454.   v11 = *(unsigned int *)(a5 + 36);
  2455.   v12 = *(_QWORD *)(a1 + 136);
  2456.   v13 = v12 >> 4;
  2457.   if ( v11 >= v12 >> 4 )
  2458.   {
  2459.     if ( v11 > v13 )
  2460.     {
  2461.       if ( v11 <= *(__int64 *)(v9 + 16) >> 4 )
  2462.       {
  2463.         v14 = v11 - v13;
  2464.         if ( v14 )
  2465.         {
  2466.           memset(*(void **)(v9 + 8), 0, 16 * v14);
  2467.           v12 += 16 * v14;
  2468.         }
  2469.         *(_QWORD *)(v9 + 8) = v12;
  2470.       }
  2471.       else
  2472.       {
  2473.         sub_180004D30(v9, *(unsigned int *)(a5 + 36));
  2474.       }
  2475.     }
  2476.   }
  2477.   else
  2478.   {
  2479.     *(_QWORD *)(v9 + 8) = 16 * v11;
  2480.   }
  2481.   return a1;
  2482. }
  2483.  
  2484. //----- (00000001800033B0) ----------------------------------------------------
  2485. void __noreturn sub_1800033B0()
  2486. {
  2487.   std::_Xlength_error("vector too long");
  2488. }
  2489. // 18000C138: using guessed type void __stdcall __noreturn std::_Xlength_error(const char *);
  2490.  
  2491. //----- (00000001800033D0) ----------------------------------------------------
  2492. __int64 __fastcall sub_1800033D0(__int64 a1)
  2493. {
  2494.   _QWORD *v2; // rcx
  2495.   __int64 result; // rax
  2496.  
  2497.   v2 = *(_QWORD **)a1;
  2498.   if ( v2 )
  2499.   {
  2500.     if ( ((*(_QWORD *)(a1 + 16) - (_QWORD)v2) & 0xFFFFFFFFFFFFFFF0ui64) >= 0x1000 )
  2501.     {
  2502.       if ( (unsigned __int64)v2 - *(v2 - 1) - 8 > 0x1F )
  2503.         invalid_parameter_noinfo_noreturn();
  2504.       v2 = (_QWORD *)*(v2 - 1);
  2505.     }
  2506.     j_j_free(v2);
  2507.     result = 0i64;
  2508.     *(_QWORD *)a1 = 0i64;
  2509.     *(_QWORD *)(a1 + 8) = 0i64;
  2510.     *(_QWORD *)(a1 + 16) = 0i64;
  2511.   }
  2512.   return result;
  2513. }
  2514.  
  2515. //----- (0000000180003430) ----------------------------------------------------
  2516. __int64 __fastcall sub_180003430(__int64 a1)
  2517. {
  2518.   _QWORD *v2; // rcx
  2519.   __int64 result; // rax
  2520.  
  2521.   v2 = *(_QWORD **)a1;
  2522.   if ( v2 )
  2523.   {
  2524.     if ( ((*(_QWORD *)(a1 + 16) - (_QWORD)v2) & 0xFFFFFFFFFFFFFFFCui64) >= 0x1000 )
  2525.     {
  2526.       if ( (unsigned __int64)v2 - *(v2 - 1) - 8 > 0x1F )
  2527.         invalid_parameter_noinfo_noreturn();
  2528.       v2 = (_QWORD *)*(v2 - 1);
  2529.     }
  2530.     j_j_free(v2);
  2531.     result = 0i64;
  2532.     *(_QWORD *)a1 = 0i64;
  2533.     *(_QWORD *)(a1 + 8) = 0i64;
  2534.     *(_QWORD *)(a1 + 16) = 0i64;
  2535.   }
  2536.   return result;
  2537. }
  2538.  
  2539. //----- (0000000180003490) ----------------------------------------------------
  2540. __int64 __fastcall sub_180003490(struct _Collvec **a1, __int64 a2)
  2541. {
  2542.   struct _Collvec *v4; // r14
  2543.   __int64 v5; // rcx
  2544.   _BYTE *v6; // rdx
  2545.   struct _Collvec *v7; // rax
  2546.   char v8; // di
  2547.   char v9; // di
  2548.   void *v10; // rcx
  2549.   void *v11; // rcx
  2550.   char v12; // di
  2551.   void **v13; // rdx
  2552.   std::_Locinfo *v14; // rbx
  2553.   char v15; // di
  2554.   void *v16; // rcx
  2555.   void *v18[2]; // [rsp+28h] [rbp-A1h] BYREF
  2556.   struct _Collvec v19; // [rsp+38h] [rbp-91h]
  2557.   struct _Collvec v20; // [rsp+48h] [rbp-81h] BYREF
  2558.   __int64 v21; // [rsp+58h] [rbp-71h]
  2559.   unsigned __int64 v22; // [rsp+60h] [rbp-69h]
  2560.   void *Block[3]; // [rsp+68h] [rbp-61h] BYREF
  2561.   unsigned __int64 v24; // [rsp+80h] [rbp-49h]
  2562.   struct _Collvec *v25; // [rsp+88h] [rbp-41h]
  2563.   char v26[144]; // [rsp+90h] [rbp-39h] BYREF
  2564.  
  2565.   if ( a1 && !*a1 )
  2566.   {
  2567.     v4 = (struct _Collvec *)sub_18000A224(0x20ui64);
  2568.     v25 = v4;
  2569.     v5 = *(_QWORD *)(a2 + 8);
  2570.     if ( v5 )
  2571.     {
  2572.       v6 = *(_BYTE **)(v5 + 40);
  2573.       if ( !v6 )
  2574.         v6 = (_BYTE *)(v5 + 48);
  2575.       v7 = (struct _Collvec *)sub_180002570(Block, v6);
  2576.       v8 = 4;
  2577.     }
  2578.     else
  2579.     {
  2580.       v20 = 0i64;
  2581.       v21 = 0i64;
  2582.       v22 = 15i64;
  2583.       LOBYTE(v20._Page) = 0;
  2584.       v7 = &v20;
  2585.       v8 = 8;
  2586.     }
  2587.     *(_OWORD *)v18 = 0i64;
  2588.     v19 = (struct _Collvec)0i64;
  2589.     *(struct _Collvec *)v18 = *v7;
  2590.     v19 = v7[1];
  2591.     *(_QWORD *)&v7[1]._Page = 0i64;
  2592.     v7[1]._LocaleName = (wchar_t *)15;
  2593.     LOBYTE(v7->_Page) = 0;
  2594.     v9 = v8 | 0x10;
  2595.     if ( (v9 & 8) != 0 )
  2596.     {
  2597.       v9 &= ~8u;
  2598.       if ( v22 >= 0x10 )
  2599.       {
  2600.         v10 = *(void **)&v20._Page;
  2601.         if ( v22 + 1 >= 0x1000 )
  2602.         {
  2603.           v10 = *(void **)(*(_QWORD *)&v20._Page - 8i64);
  2604.           if ( (unsigned __int64)(*(_QWORD *)&v20._Page - (_QWORD)v10 - 8i64) > 0x1F )
  2605. LABEL_17:
  2606.             invalid_parameter_noinfo_noreturn();
  2607.         }
  2608.         j_j_free(v10);
  2609.       }
  2610.     }
  2611.     if ( (v9 & 4) != 0 )
  2612.     {
  2613.       v9 &= ~4u;
  2614.       if ( v24 >= 0x10 )
  2615.       {
  2616.         v11 = Block[0];
  2617.         if ( v24 + 1 >= 0x1000 )
  2618.         {
  2619.           v11 = (void *)*((_QWORD *)Block[0] - 1);
  2620.           if ( (unsigned __int64)(Block[0] - v11 - 8) > 0x1F )
  2621.             goto LABEL_17;
  2622.         }
  2623.         j_j_free(v11);
  2624.       }
  2625.       Block[2] = 0i64;
  2626.       v24 = 15i64;
  2627.       LOBYTE(Block[0]) = 0;
  2628.     }
  2629.     v12 = v9 | 1;
  2630.     v13 = v18;
  2631.     if ( v19._LocaleName >= (wchar_t *)0x10 )
  2632.       v13 = (void **)v18[0];
  2633.     v14 = (std::_Locinfo *)std::_Locinfo::_Locinfo((std::_Locinfo *)v26, (const char *)v13);
  2634.     v15 = v12 | 2;
  2635.     std::locale::facet::facet((std::locale::facet *)v4, 0i64);
  2636.     *(_QWORD *)&v4->_Page = &std::collate<wchar_t>::`vftable';
  2637.    v4[1] = *std::_Locinfo::_Getcoll(v14, &v20);
  2638.    *a1 = v4;
  2639.    if ( (v15 & 2) != 0 )
  2640.    {
  2641.      v15 &= ~2u;
  2642.      std::_Locinfo::~_Locinfo((std::_Locinfo *)v26);
  2643.    }
  2644.    if ( (v15 & 1) != 0 && v19._LocaleName >= (wchar_t *)0x10 )
  2645.    {
  2646.      v16 = v18[0];
  2647.      if ( (unsigned __int64)v19._LocaleName + 1 >= 0x1000 )
  2648.      {
  2649.        v16 = (void *)*((_QWORD *)v18[0] - 1);
  2650.        if ( (unsigned __int64)(v18[0] - v16 - 8) > 0x1F )
  2651.          invalid_parameter_noinfo_noreturn();
  2652.      }
  2653.      j_j_free(v16);
  2654.    }
  2655.  }
  2656.  return 1i64;
  2657. }
  2658. // 18000C0E0: using guessed type _QWORD std::locale::facet::facet(std::locale::facet *__hidden this, unsigned __int64);
  2659. // 18000C108: using guessed type struct _Collvec *std::_Locinfo::_Getcoll(std::_Locinfo *__hidden this, struct _Collvec *__return_ptr __struct_ptr retstr);
  2660. // 18000C110: using guessed type void std::_Locinfo::~_Locinfo(std::_Locinfo *__hidden this);
  2661. // 18000C118: using guessed type _QWORD std::_Locinfo::_Locinfo(std::_Locinfo *__hidden this, const char *);
  2662. // 18000C810: using guessed type void *std::collate<wchar_t>::`vftable';
  2663.  
  2664. //----- (00000001800036C0) ----------------------------------------------------
  2665. __int64 __fastcall sub_1800036C0(__int64 a1)
  2666. {
  2667.   __int64 *v2; // rbx
  2668.   _OWORD *v3; // rsi
  2669.   __int64 v4; // rcx
  2670.   _OWORD *v5; // rdx
  2671.   __int64 v6; // rcx
  2672.   __int64 v7; // r11
  2673.   __int64 v8; // r9
  2674.   __int64 i; // r10
  2675.   __int64 j; // rax
  2676.  
  2677.   v2 = (__int64 *)(a1 + 64);
  2678.   v3 = sub_1800046B0(a1 + 64, 0);
  2679.   sub_1800043A0(a1);
  2680.   if ( *(_QWORD *)a1 != *(_QWORD *)(a1 + 16) )
  2681.     sub_1800040C0(v4, 0xEu);
  2682.   sub_180004600((__int64)v2, (__int64)v3);
  2683.   v5 = sub_18000A224(0x20ui64);
  2684.   *v5 = 0i64;
  2685.   v5[1] = 0i64;
  2686.   *(_QWORD *)v5 = &std::_Node_base::`vftable';
  2687.  *((_QWORD *)v5 + 1) = 21i64;
  2688.  *((_QWORD *)v5 + 2) = 0i64;
  2689.  *((_QWORD *)v5 + 3) = 0i64;
  2690.  *((_QWORD *)v5 + 3) = v2[1];
  2691.  v6 = *(_QWORD *)(v2[1] + 16);
  2692.  if ( v6 )
  2693.  {
  2694.    *((_QWORD *)v5 + 2) = v6;
  2695.    *(_QWORD *)(*(_QWORD *)(v2[1] + 16) + 24i64) = v5;
  2696.  }
  2697.  *(_QWORD *)(v2[1] + 16) = v5;
  2698.  v2[1] = (__int64)v5;
  2699.  v7 = *v2;
  2700.  *(_DWORD *)(v7 + 32) = *(_DWORD *)(a1 + 112);
  2701.  *(_DWORD *)(v7 + 40) = *(_DWORD *)(a1 + 24) + 1;
  2702.  v8 = 0i64;
  2703.  for ( i = v7; i; i = *(_QWORD *)(i + 16) )
  2704.  {
  2705.    switch ( *(_DWORD *)(i + 8) )
  2706.    {
  2707.      case 0xA:
  2708.      case 0xB:
  2709.        sub_180001500(*(_QWORD *)(i + 32), 0i64, 0i64);
  2710.        break;
  2711.      case 0x10:
  2712.        if ( v8 )
  2713.          *(_DWORD *)(v8 + 52) = 0;
  2714.        for ( j = *(_QWORD *)(i + 40); j; j = *(_QWORD *)(sub_180001500(*(_QWORD *)(j + 16), *(_QWORD *)(j + 32), v8)
  2715.                                                        + 40) )
  2716.          ;
  2717.        break;
  2718.      case 0x12:
  2719.        if ( v8 )
  2720.        {
  2721.          *(_DWORD *)(v8 + 52) = 0;
  2722.          *(_DWORD *)(i + 52) = 0;
  2723.        }
  2724.        else
  2725.        {
  2726.          v8 = i;
  2727.        }
  2728.        break;
  2729.      default:
  2730.        if ( *(_DWORD *)(i + 8) == 19 && v8 == *(_QWORD *)(i + 32) )
  2731.        {
  2732.          if ( *(_DWORD *)(v8 + 52) == -1 )
  2733.            *(_DWORD *)(v8 + 52) = 1;
  2734.          v8 = 0i64;
  2735.        }
  2736.        break;
  2737.    }
  2738.  }
  2739.  return v7;
  2740. }
  2741. // 1800037B4: variable 'v8' is possibly undefined
  2742. // 180003819: variable 'i' is possibly undefined
  2743. // 180003826: variable 'v7' is possibly undefined
  2744. // 18000383E: variable 'v4' is possibly undefined
  2745. // 18000C8D8: using guessed type void *std::_Node_base::`vftable';
  2746.  
  2747. //----- (0000000180003850) ----------------------------------------------------
  2748. __int64 __fastcall sub_180003850(__int64 **a1)
  2749. {
  2750.   __int64 *v1; // rdi
  2751.   __int64 i; // rbx
  2752.   _QWORD *v3; // rax
  2753.   __int64 (__fastcall ***v4)(_QWORD, __int64); // rcx
  2754.   __int64 result; // rax
  2755.  
  2756.   v1 = *a1;
  2757.   if ( *a1 )
  2758.   {
  2759.     for ( i = *v1; i; result = (**v4)(v4, 1i64) )
  2760.     {
  2761.       v3 = (_QWORD *)(i + 16);
  2762.       v4 = (__int64 (__fastcall ***)(_QWORD, __int64))i;
  2763.       i = *(_QWORD *)(i + 16);
  2764.       *v3 = 0i64;
  2765.     }
  2766.     *v1 = 0i64;
  2767.   }
  2768.   return result;
  2769. }
  2770.  
  2771. //----- (00000001800038B0) ----------------------------------------------------
  2772. __int128 *__fastcall sub_1800038B0(unsigned __int64 *a1, unsigned __int64 a2)
  2773. {
  2774.   __int64 v2; // r8
  2775.   unsigned __int64 v4; // rcx
  2776.   __int128 *result; // rax
  2777.   unsigned __int64 v6; // r9
  2778.   __int128 v7; // [rsp+30h] [rbp-58h] BYREF
  2779.   __int128 v8; // [rsp+40h] [rbp-48h] BYREF
  2780.   __int128 v9; // [rsp+50h] [rbp-38h] BYREF
  2781.   char v10[16]; // [rsp+60h] [rbp-28h] BYREF
  2782.  
  2783.   v2 = a1[3];
  2784.   v10[0] = 0;
  2785.   if ( v2 >= a2 )
  2786.   {
  2787.     if ( v2 > a2 )
  2788.     {
  2789.       v6 = *a1;
  2790.       if ( v2 >= 0 )
  2791.         *(_QWORD *)&v7 = v6 + 4 * ((unsigned __int64)v2 >> 5);
  2792.       else
  2793.         *(_QWORD *)&v7 = v6 - (4 * ((unsigned __int64)~v2 >> 5) + 4);
  2794.       *((_QWORD *)&v7 + 1) = v2 & 0x1F;
  2795.       if ( (a2 & 0x8000000000000000ui64) == 0i64 )
  2796.         *(_QWORD *)&v8 = v6 + 4 * (a2 >> 5);
  2797.       else
  2798.         *(_QWORD *)&v8 = v6 - (4 * (~a2 >> 5) + 4);
  2799.       *((_QWORD *)&v8 + 1) = a2 & 0x1F;
  2800.       return sub_180003C00(a1, &v9, &v8, &v7);
  2801.     }
  2802.   }
  2803.   else
  2804.   {
  2805.     v4 = *a1;
  2806.     if ( v2 >= 0 )
  2807.       *(_QWORD *)&v7 = v4 + 4 * ((unsigned __int64)v2 >> 5);
  2808.     else
  2809.       *(_QWORD *)&v7 = v4 - (4 * ((unsigned __int64)~v2 >> 5) + 4);
  2810.     *((_QWORD *)&v7 + 1) = v2 & 0x1F;
  2811.     v8 = v7;
  2812.     return sub_180003A40((__int64 *)a1, &v7, &v8, a2 - v2, v10);
  2813.   }
  2814.   return result;
  2815. }
  2816. // 1800038E9: conditional instruction was optimized away because r8.8<0
  2817. // 180003978: conditional instruction was optimized away because r8.8<0
  2818. // 1800039BD: conditional instruction was optimized away because rdx.8<0
  2819. // 1800038B0: using guessed type char var_28[16];
  2820.  
  2821. //----- (0000000180003A40) ----------------------------------------------------
  2822. __int128 *__fastcall sub_180003A40(__int64 *a1, __int128 *a2, __int128 *a3, signed __int64 a4, char *a5)
  2823. {
  2824.   __int64 v8; // rax
  2825.   unsigned int v9; // ebp
  2826.   unsigned __int64 *v10; // rdx
  2827.   unsigned __int64 v11; // r8
  2828.   __int64 v12; // rax
  2829.   unsigned __int64 v13; // rcx
  2830.   __int128 v14; // xmm0
  2831.   unsigned __int64 v15; // rsi
  2832.   unsigned int *v16; // r14
  2833.   char v17; // r15
  2834.   unsigned __int64 v18; // rsi
  2835.   __int64 v19; // rcx
  2836.   int v20; // er10
  2837.   int v21; // er9
  2838.   int v23; // eax
  2839.   __int128 v24; // [rsp+20h] [rbp-48h] BYREF
  2840.  
  2841.   v24 = *a3;
  2842.   v8 = sub_180003E90(a1, &v24, a4);
  2843.   v9 = 0;
  2844.   v10 = (unsigned __int64 *)a2 + 1;
  2845.   *((_QWORD *)&v24 + 1) = 0i64;
  2846.   *a2 = 0i64;
  2847.   *(_QWORD *)&v24 = *a1;
  2848.   *a2 = v24;
  2849.   if ( v8 >= 0 || *v10 >= -v8 )
  2850.   {
  2851.     v11 = v8 + *v10;
  2852.     v12 = 4 * (v11 >> 5);
  2853.   }
  2854.   else
  2855.   {
  2856.     v11 = v8 + *v10;
  2857.     v12 = -4i64 - 4 * (~v11 >> 5);
  2858.   }
  2859.   *(_QWORD *)a2 += v12;
  2860.   *v10 = v11;
  2861.   *v10 = v11 & 0x1F;
  2862.   v13 = *((_QWORD *)a2 + 1);
  2863.   v14 = *a2;
  2864.   v24 = *a2;
  2865.   if ( a4 >= 0 || v13 >= -a4 )
  2866.   {
  2867.     v15 = v13 + a4;
  2868.     v16 = (unsigned int *)(v24 + 4 * (v15 >> 5));
  2869.   }
  2870.   else
  2871.   {
  2872.     v15 = v13 + a4;
  2873.     v16 = (unsigned int *)(-4i64 - 4 * (~v15 >> 5) + v24);
  2874.   }
  2875.   v17 = *a5;
  2876.   v18 = v15 & 0x1F;
  2877.   v19 = *((_QWORD *)a2 + 1);
  2878.   if ( (unsigned int *)v14 == v16 && v19 == v18 )
  2879.     return a2;
  2880.   v20 = *(_DWORD *)v14;
  2881.   v21 = ~(-1 << v19);
  2882.   if ( (unsigned int *)v14 != v16 )
  2883.   {
  2884.     v23 = 0;
  2885.     if ( v17 )
  2886.       v23 = -1 << v19;
  2887.     *(_DWORD *)v14 = v21 & v20 | v23;
  2888.     memset((void *)(v14 + 4), (unsigned __int8)-(v17 != 0), (size_t)v16 - v14 - 4);
  2889.     if ( v18 )
  2890.     {
  2891.       if ( v17 )
  2892.         v9 = 0xFFFFFFFF >> (32 - v18);
  2893.       *v16 = *v16 & ~(0xFFFFFFFF >> (32 - v18)) | v9;
  2894.     }
  2895.     return a2;
  2896.   }
  2897.   if ( v17 )
  2898.     v9 = 0xFFFFFFFF >> (32 - v18);
  2899.   *(_DWORD *)v14 = (-1 << v19) & v9 | v20 & (v21 | ~(0xFFFFFFFF >> (32 - v18)));
  2900.   return a2;
  2901. }
  2902.  
  2903. //----- (0000000180003C00) ----------------------------------------------------
  2904. _OWORD *__fastcall sub_180003C00(unsigned __int64 *a1, _OWORD *a2, _QWORD *a3, _QWORD *a4)
  2905. {
  2906.   __int64 v6; // rbx
  2907.   __int64 v7; // rdi
  2908.   __int64 v8; // rdx
  2909.   int *v9; // r8
  2910.   unsigned __int64 v10; // rdx
  2911.   __int64 v11; // rcx
  2912.   int *v12; // r10
  2913.   unsigned __int64 v13; // rcx
  2914.   __int64 v14; // r11
  2915.   int *v15; // rbx
  2916.   int v16; // edi
  2917.   int v17; // er9
  2918.   int v18; // er9
  2919.   __int64 v19; // r9
  2920.   unsigned __int64 v20; // r8
  2921.   unsigned __int64 v21; // rdx
  2922.   unsigned __int64 v22; // rax
  2923.   int v23; // er8
  2924.   unsigned __int64 *v24; // rdx
  2925.   unsigned __int64 v25; // rcx
  2926.   unsigned __int64 v26; // r8
  2927.  
  2928.   v6 = *a1;
  2929.   v7 = a1[3];
  2930.   if ( v7 )
  2931.   {
  2932.     v8 = a3[1] + 32 * ((*a3 - v6) >> 2);
  2933.     if ( v8 >= 0 )
  2934.       v9 = (int *)(v6 + 4 * ((unsigned __int64)v8 >> 5));
  2935.     else
  2936.       v9 = (int *)(v6 - (4 * ((unsigned __int64)~v8 >> 5) + 4));
  2937.     v10 = v8 & 0x1F;
  2938.     v11 = a4[1] + 32 * ((*a4 - v6) >> 2);
  2939.     if ( v11 >= 0 )
  2940.       v12 = (int *)(v6 + 4 * ((unsigned __int64)v11 >> 5));
  2941.     else
  2942.       v12 = (int *)(v6 - (4 * ((unsigned __int64)~v11 >> 5) + 4));
  2943.     v13 = v11 & 0x1F;
  2944.     v14 = v10 + 32 * (((__int64)v9 - v6) >> 2);
  2945.     if ( v9 != v12 || v10 != v13 )
  2946.     {
  2947.       if ( v7 >= 0 )
  2948.         v15 = (int *)(v6 + 4 * ((unsigned __int64)v7 >> 5));
  2949.       else
  2950.         v15 = (int *)(v6 - (4 * ((unsigned __int64)~v7 >> 5) + 4));
  2951.       v16 = v7 & 0x1F;
  2952.       while ( v12 != v15 || v13 != v16 )
  2953.       {
  2954.         v17 = *v9;
  2955.         if ( ((1 << v13) & *v12) != 0 )
  2956.           v18 = v17 | (1 << v10);
  2957.         else
  2958.           v18 = v17 & ~(1 << v10);
  2959.         *v9 = v18;
  2960.         if ( v10 >= 0x1F )
  2961.         {
  2962.           v10 = 0i64;
  2963.           ++v9;
  2964.         }
  2965.         else
  2966.         {
  2967.           ++v10;
  2968.         }
  2969.         if ( v13 >= 0x1F )
  2970.         {
  2971.           v13 = 0i64;
  2972.           ++v12;
  2973.         }
  2974.         else
  2975.         {
  2976.           ++v13;
  2977.         }
  2978.       }
  2979.       v19 = *a1;
  2980.       v20 = v10 + 32 * ((__int64)((__int64)v9 - *a1) >> 2);
  2981.       if ( v20 > 0x7FFFFFFFFFFFFFFFi64 )
  2982.         sub_180003E70();
  2983.       v21 = (v20 + 31) >> 5;
  2984.       if ( v21 < (__int64)(a1[1] - v19) >> 2 )
  2985.       {
  2986.         v22 = v19 + 4 * v21;
  2987.         if ( v22 != a1[1] )
  2988.           a1[1] = v22;
  2989.       }
  2990.       a1[3] = v20;
  2991.       v23 = v20 & 0x1F;
  2992.       if ( v23 )
  2993.         *(_DWORD *)(v19 + 4 * v21 - 4) &= (1 << v23) - 1;
  2994.     }
  2995.   }
  2996.   else
  2997.   {
  2998.     v14 = 0i64;
  2999.   }
  3000.   *a2 = *a1;
  3001.   v24 = (unsigned __int64 *)a2 + 1;
  3002.   if ( v14 >= 0 || (v25 = *v24, *v24 >= -v14) )
  3003.   {
  3004.     v26 = v14 + *v24;
  3005.     *(_QWORD *)a2 += 4 * (v26 >> 5);
  3006.   }
  3007.   else
  3008.   {
  3009.     v26 = v25 + v14;
  3010.     *(_QWORD *)a2 += -4i64 - 4 * (~(v25 + v14) >> 5);
  3011.   }
  3012.   *v24 = v26;
  3013.   *v24 = v26 & 0x1F;
  3014.   return a2;
  3015. }
  3016. // 180003C4E: conditional instruction was optimized away because rdx.8<0
  3017. // 180003C9E: conditional instruction was optimized away because rcx.8<0
  3018. // 180003CF2: conditional instruction was optimized away because rdi.8<0
  3019.  
  3020. //----- (0000000180003E70) ----------------------------------------------------
  3021. void __noreturn sub_180003E70()
  3022. {
  3023.   std::_Xlength_error("vector<bool> too long");
  3024. }
  3025. // 18000C138: using guessed type void __stdcall __noreturn std::_Xlength_error(const char *);
  3026.  
  3027. //----- (0000000180003E90) ----------------------------------------------------
  3028. __int64 __fastcall sub_180003E90(__int64 *a1, _QWORD *a2, unsigned __int64 a3)
  3029. {
  3030.   __int64 v3; // r10
  3031.   __int64 v6; // rbp
  3032.   __int64 v7; // rcx
  3033.   char *v8; // rsi
  3034.   unsigned __int64 v9; // rbx
  3035.   unsigned __int64 v10; // rcx
  3036.   size_t v11; // rbx
  3037.   __int64 v12; // rcx
  3038.   __int64 v14; // r11
  3039.   _DWORD *v15; // r10
  3040.   unsigned __int64 v16; // r8
  3041.   __int64 v17; // rdx
  3042.   _DWORD *v18; // r11
  3043.   __int64 v19; // r8
  3044.   int *v20; // r9
  3045.   __int64 v21; // rcx
  3046.   int v22; // eax
  3047.   int v23[4]; // [rsp+20h] [rbp-38h] BYREF
  3048.   int *v24; // [rsp+30h] [rbp-28h]
  3049.   __int64 v25; // [rsp+38h] [rbp-20h]
  3050.  
  3051.   v3 = *a1;
  3052.   v6 = a2[1] + 32 * ((*a2 - *a1) >> 2);
  3053.   if ( a3 )
  3054.   {
  3055.     v7 = a1[3];
  3056.     if ( 0x7FFFFFFFFFFFFFFFi64 - v7 < a3 )
  3057.       sub_180003E70();
  3058.     v8 = (char *)a1[1];
  3059.     v9 = (a3 + v7 + 31) >> 5;
  3060.     v23[0] = 0;
  3061.     v10 = (__int64)&v8[-v3] >> 2;
  3062.     if ( v9 >= v10 )
  3063.     {
  3064.       if ( v9 > v10 )
  3065.       {
  3066.         if ( v9 <= (a1[2] - v3) >> 2 )
  3067.         {
  3068.           v11 = 4 * (v9 - v10);
  3069.           memset(v8, 0, v11);
  3070.           a1[1] = (__int64)&v8[v11];
  3071.         }
  3072.         else
  3073.         {
  3074.           sub_180006230((__int64)a1, v9, v23);
  3075.         }
  3076.       }
  3077.     }
  3078.     else
  3079.     {
  3080.       a1[1] = v3 + 4 * v9;
  3081.     }
  3082.     v12 = a1[3];
  3083.     if ( v12 )
  3084.     {
  3085.       v14 = *a1;
  3086.       if ( v12 >= 0 )
  3087.         v15 = (_DWORD *)(v14 + 4 * ((unsigned __int64)v12 >> 5));
  3088.       else
  3089.         v15 = (_DWORD *)(v14 - (4 * ((unsigned __int64)~v12 >> 5) + 4));
  3090.       v16 = a3 + v12;
  3091.       v17 = a1[3] & 0x1F;
  3092.       a1[3] = a3 + v12;
  3093.       if ( (__int64)(a3 + v12) >= 0 )
  3094.         v24 = (int *)(v14 + 4 * (v16 >> 5));
  3095.       else
  3096.         v24 = (int *)(v14 - (4 * (~v16 >> 5) + 4));
  3097.       v25 = v16 & 0x1F;
  3098.       if ( v6 >= 0 )
  3099.         v18 = (_DWORD *)(v14 + 4 * ((unsigned __int64)v6 >> 5));
  3100.       else
  3101.         v18 = (_DWORD *)(v14 - (4 * ((unsigned __int64)~v6 >> 5) + 4));
  3102.       v19 = v25;
  3103.       v20 = v24;
  3104.       while ( 1 )
  3105.       {
  3106.         v21 = v17;
  3107.         if ( v18 == v15 && (v6 & 0x1F) == v17 )
  3108.           break;
  3109.         if ( v17 )
  3110.           --v17;
  3111.         else
  3112.           v17 = 31i64;
  3113.         if ( !v21 )
  3114.           --v15;
  3115.         if ( v19 )
  3116.         {
  3117.           --v19;
  3118.         }
  3119.         else
  3120.         {
  3121.           v19 = 31i64;
  3122.           --v20;
  3123.         }
  3124.         v22 = *v20;
  3125.         if ( ((1 << v17) & *v15) != 0 )
  3126.           *v20 = v22 | (1 << v19);
  3127.         else
  3128.           *v20 = v22 & ~(1 << v19);
  3129.       }
  3130.     }
  3131.     else
  3132.     {
  3133.       a1[3] = a3;
  3134.     }
  3135.   }
  3136.   return v6;
  3137. }
  3138. // 180003F85: conditional instruction was optimized away because rcx.8<0
  3139. // 18000400A: conditional instruction was optimized away because rbp.8<0
  3140. // 180003E90: using guessed type int var_38[4];
  3141.  
  3142. //----- (00000001800040C0) ----------------------------------------------------
  3143. void __fastcall __noreturn sub_1800040C0(__int64 a1, unsigned int a2)
  3144. {
  3145.   std::_Xregex_error(a2);
  3146.   JUMPOUT(0x1800040CCi64);
  3147. }
  3148. // 1800040C6: control flows out of bounds to 1800040CC
  3149. // 18000C0B0: using guessed type __int64 __fastcall std::_Xregex_error(_QWORD);
  3150.  
  3151. //----- (00000001800040D0) ----------------------------------------------------
  3152. __int16 __fastcall sub_1800040D0(unsigned __int16 **a1)
  3153. {
  3154.   unsigned __int16 v2; // cx
  3155.   char *v3; // rax
  3156.   int v4; // eax
  3157.   bool v5; // zf
  3158.   unsigned __int16 *v6; // rcx
  3159.   int v7; // edx
  3160.   unsigned __int16 *v8; // rdx
  3161.   int v9; // ecx
  3162.   unsigned int v10; // edx
  3163.   unsigned __int16 *v11; // rdx
  3164.   int v12; // ecx
  3165.   unsigned int v13; // edx
  3166.  
  3167.   if ( *a1 == a1[2] )
  3168.   {
  3169.     v2 = -1;
  3170.     LODWORD(v3) = -1;
  3171.     *((_WORD *)a1 + 60) = -1;
  3172.   }
  3173.   else
  3174.   {
  3175.     v4 = **a1;
  3176.     *((_WORD *)a1 + 60) = v4;
  3177.     v3 = strchr("()$^.*+?[]|\\-{},:=!\n\r\b", v4);
  3178.     v2 = *((_WORD *)a1 + 60);
  3179.     v5 = v3 == 0i64;
  3180.     LODWORD(v3) = v2;
  3181.     if ( v5 )
  3182.       LODWORD(v3) = 0;
  3183.   }
  3184.   *((_DWORD *)a1 + 31) = (_DWORD)v3;
  3185.   LOWORD(v3) = v2 - 10;
  3186.   switch ( v2 )
  3187.   {
  3188.     case 0xAu:
  3189.       if ( ((_BYTE)a1[16] & 4) != 0 && !*((_DWORD *)a1 + 7) )
  3190.         *((_DWORD *)a1 + 31) = 124;
  3191.       break;
  3192.     case 0x24u:
  3193.       if ( ((_DWORD)a1[16] & 0x2000000) != 0 )
  3194.       {
  3195.         v3 = (char *)(*a1 + 1);
  3196.         if ( v3 != (char *)a1[2] && *(_WORD *)v3 != 10 )
  3197.           *((_DWORD *)a1 + 31) = 0;
  3198.       }
  3199.       break;
  3200.     case 0x28u:
  3201.     case 0x29u:
  3202.       if ( ((_BYTE)a1[16] & 8) == 0 )
  3203.         *((_DWORD *)a1 + 31) = 0;
  3204.       break;
  3205.     case 0x2Au:
  3206.       if ( ((_DWORD)a1[16] & 0x4000000) != 0 )
  3207.       {
  3208.         v8 = a1[9];
  3209.         v9 = 1057024;
  3210.         LODWORD(v3) = *((_DWORD *)v8 + 2);
  3211.         if ( (unsigned int)v3 <= 0x14 )
  3212.         {
  3213.           if ( _bittest(&v9, (unsigned int)v3) )
  3214.             goto LABEL_25;
  3215.         }
  3216.         if ( (_DWORD)v3 == 2 )
  3217.         {
  3218.           v3 = (char *)*((_QWORD *)v8 + 3);
  3219.           v10 = *((_DWORD *)v3 + 2);
  3220.           if ( v10 <= 0x14 )
  3221.           {
  3222.             if ( _bittest(&v9, v10) )
  3223.               goto LABEL_25;
  3224.           }
  3225.         }
  3226.       }
  3227.       break;
  3228.     case 0x2Bu:
  3229.     case 0x3Fu:
  3230.       if ( ((_BYTE)a1[16] & 1) == 0 )
  3231.         *((_DWORD *)a1 + 31) = 0;
  3232.       break;
  3233.     case 0x5Cu:
  3234.       v6 = *a1 + 1;
  3235.       if ( v6 != a1[2] )
  3236.       {
  3237.         if ( (v7 = *((_DWORD *)a1 + 32), (v7 & 8) == 0) && (LOWORD(v3) = *v6 - 40, (unsigned __int16)v3 <= 1u)
  3238.           || (v7 & 0x10) == 0 && (LOWORD(v3) = *v6 - 123, ((unsigned __int16)v3 & 0xFFFD) == 0) )
  3239.         {
  3240.           LODWORD(v3) = *v6;
  3241.           *((_WORD *)a1 + 60) = (_WORD)v3;
  3242.           *((_DWORD *)a1 + 31) = (_DWORD)v3;
  3243.         }
  3244.       }
  3245.       break;
  3246.     case 0x5Eu:
  3247.       if ( ((_DWORD)a1[16] & 0x2000000) != 0 )
  3248.       {
  3249.         v11 = a1[9];
  3250.         v12 = 1057024;
  3251.         LODWORD(v3) = *((_DWORD *)v11 + 2);
  3252.         if ( (unsigned int)v3 > 0x14 || !_bittest(&v12, (unsigned int)v3) )
  3253.         {
  3254.           if ( (_DWORD)v3 == 2 && (v3 = (char *)*((_QWORD *)v11 + 3), v13 = *((_DWORD *)v3 + 2), v13 <= 0x14) )
  3255.           {
  3256.             if ( !_bittest(&v12, v13) )
  3257.               *((_DWORD *)a1 + 31) = 0;
  3258.           }
  3259.           else
  3260.           {
  3261. LABEL_25:
  3262.             *((_DWORD *)a1 + 31) = 0;
  3263.           }
  3264.         }
  3265.       }
  3266.       break;
  3267.     case 0x7Bu:
  3268.     case 0x7Du:
  3269.       if ( ((_BYTE)a1[16] & 0x10) == 0 )
  3270.         *((_DWORD *)a1 + 31) = 0;
  3271.       break;
  3272.     case 0x7Cu:
  3273.       LODWORD(v3) = *((_DWORD *)a1 + 31);
  3274.       if ( ((_BYTE)a1[16] & 2) == 0 )
  3275.         LODWORD(v3) = 0;
  3276.       *((_DWORD *)a1 + 31) = (_DWORD)v3;
  3277.       break;
  3278.     default:
  3279.       return (__int16)v3;
  3280.   }
  3281.   return (__int16)v3;
  3282. }
  3283.  
  3284. //----- (00000001800043A0) ----------------------------------------------------
  3285. char __fastcall sub_1800043A0(__int64 a1)
  3286. {
  3287.   __int64 v1; // r13
  3288.   __int64 v3; // rax
  3289.   __int64 v4; // rbp
  3290.   _OWORD *v5; // rax
  3291.   _OWORD *v6; // rsi
  3292.   __int64 v7; // rcx
  3293.   __int64 v8; // rcx
  3294.   unsigned __int16 *v9; // rax
  3295.   unsigned __int16 *v10; // rdx
  3296.   unsigned __int16 *v11; // rcx
  3297.   int v12; // edx
  3298.   _OWORD *v13; // rax
  3299.   __int64 v14; // rbx
  3300.   __int64 v15; // r14
  3301.   __int64 v16; // rax
  3302.   __int64 i; // rax
  3303.   _OWORD *v19; // [rsp+50h] [rbp+8h]
  3304.   _OWORD *v20; // [rsp+50h] [rbp+8h]
  3305.  
  3306.   v1 = *(_QWORD *)(a1 + 72);
  3307.   LOBYTE(v3) = sub_180004FE0(a1);
  3308.   if ( (_BYTE)v3 )
  3309.   {
  3310.     v4 = a1 + 64;
  3311.   }
  3312.   else
  3313.   {
  3314.     if ( *(_DWORD *)(a1 + 124) != 124 )
  3315.       return v3;
  3316.     v4 = a1 + 64;
  3317.     v5 = sub_1800055C0(a1 + 64, 8);
  3318.     sub_180004600(a1 + 64, (__int64)v5);
  3319.   }
  3320.   v6 = sub_18000A224(0x20ui64);
  3321.   *v6 = 0i64;
  3322.   v6[1] = 0i64;
  3323.   *((_QWORD *)v6 + 3) = 0i64;
  3324.   *((_QWORD *)v6 + 1) = 17i64;
  3325.   *((_QWORD *)v6 + 2) = 0i64;
  3326.   *(_QWORD *)v6 = &std::_Node_endif::`vftable';
  3327.  *((_QWORD *)v6 + 3) = *(_QWORD *)(v4 + 8);
  3328.  v7 = *(_QWORD *)(*(_QWORD *)(v4 + 8) + 16i64);
  3329.  if ( v7 )
  3330.  {
  3331.    *((_QWORD *)v6 + 2) = v7;
  3332.    *(_QWORD *)(*(_QWORD *)(*(_QWORD *)(v4 + 8) + 16i64) + 24i64) = v6;
  3333.  }
  3334.  *(_QWORD *)(*(_QWORD *)(v4 + 8) + 16i64) = v6;
  3335.  *(_QWORD *)(v4 + 8) = v6;
  3336.  v19 = sub_18000A224(0x30ui64);
  3337.  *v19 = 0i64;
  3338.  v19[1] = 0i64;
  3339.  v19[2] = 0i64;
  3340.  *((_QWORD *)v19 + 1) = 16i64;
  3341.  *((_QWORD *)v19 + 2) = 0i64;
  3342.  *((_QWORD *)v19 + 3) = 0i64;
  3343.  *(_QWORD *)v19 = &std::_Node_if::`vftable';
  3344.   *((_QWORD *)v19 + 4) = v6;
  3345.   *((_QWORD *)v19 + 5) = 0i64;
  3346.   v8 = *(_QWORD *)(v1 + 16);
  3347.   *(_QWORD *)(*(_QWORD *)(v8 + 24) + 16i64) = v19;
  3348.   v3 = *(_QWORD *)(v8 + 24);
  3349.   *((_QWORD *)v19 + 3) = v3;
  3350.   *(_QWORD *)(v8 + 24) = v19;
  3351.   *((_QWORD *)v19 + 2) = v8;
  3352.   if ( *(_DWORD *)(a1 + 124) == 124 )
  3353.   {
  3354.     while ( 1 )
  3355.     {
  3356.       v9 = *(unsigned __int16 **)a1;
  3357.       v10 = *(unsigned __int16 **)(a1 + 16);
  3358.       if ( *(unsigned __int16 **)a1 != v10 )
  3359.         break;
  3360. LABEL_20:
  3361.       sub_1800040D0((unsigned __int16 **)a1);
  3362.       if ( !sub_180004FE0(a1) )
  3363.       {
  3364.         v13 = sub_1800055C0(v4, 8);
  3365.         sub_180004600(v4, (__int64)v13);
  3366.       }
  3367.       v14 = *(_QWORD *)(v1 + 16);
  3368.       v15 = *((_QWORD *)v6 + 2);
  3369.       *((_QWORD *)v6 + 2) = 0i64;
  3370.       v16 = *(_QWORD *)(v4 + 8);
  3371.       *(_QWORD *)(v4 + 8) = v6;
  3372.       *((_QWORD *)v6 + 2) = 0i64;
  3373.       *(_QWORD *)(v16 + 16) = v6;
  3374.       for ( i = *(_QWORD *)(v14 + 40); i; i = *(_QWORD *)(i + 40) )
  3375.         v14 = i;
  3376.       v20 = sub_18000A224(0x30ui64);
  3377.       *v20 = 0i64;
  3378.       v20[1] = 0i64;
  3379.       v20[2] = 0i64;
  3380.       *((_QWORD *)v20 + 1) = 16i64;
  3381.       *((_QWORD *)v20 + 3) = 0i64;
  3382.       *(_QWORD *)v20 = &std::_Node_if::`vftable';
  3383.      *((_QWORD *)v20 + 4) = v6;
  3384.      *((_QWORD *)v20 + 5) = 0i64;
  3385.      *(_QWORD *)(v14 + 40) = v20;
  3386.      *((_QWORD *)v20 + 2) = v15;
  3387.      v3 = *(_QWORD *)(v14 + 40);
  3388.      *(_QWORD *)(v15 + 24) = v3;
  3389.      if ( *(_DWORD *)(a1 + 124) != 124 )
  3390.        return v3;
  3391.    }
  3392.    if ( *v9 != 92 || (v11 = v9 + 1, v9 + 1 == v10) )
  3393.    {
  3394. LABEL_19:
  3395.      *(_QWORD *)a1 = v9 + 1;
  3396.      goto LABEL_20;
  3397.    }
  3398.    v12 = *(_DWORD *)(a1 + 128);
  3399.    if ( (v12 & 8) == 0 )
  3400.    {
  3401.      if ( *v11 == 40 || *v11 == 41 )
  3402.      {
  3403. LABEL_18:
  3404.        v9 = v11;
  3405.        goto LABEL_19;
  3406.      }
  3407.      v9 = *(unsigned __int16 **)a1;
  3408.    }
  3409.    if ( (v12 & 0x10) != 0 || *v11 != 123 && *v11 != 125 )
  3410.      goto LABEL_19;
  3411.    goto LABEL_18;
  3412.  }
  3413.  return v3;
  3414. }
  3415. // 18000C868: using guessed type void *std::_Node_if::`vftable';
  3416. // 18000C878: using guessed type void *std::_Node_endif::`vftable';
  3417.  
  3418. //----- (0000000180004600) ----------------------------------------------------
  3419. __int64 __fastcall sub_180004600(__int64 a1, __int64 a2)
  3420. {
  3421.   int v2; // eax
  3422.   int v5; // edi
  3423.   _OWORD *v6; // rdx
  3424.   __int64 v7; // rcx
  3425.   __int64 result; // rax
  3426.  
  3427.   v2 = *(_DWORD *)(a2 + 8);
  3428.   if ( v2 == 8 )
  3429.   {
  3430.     v5 = 9;
  3431.   }
  3432.   else
  3433.   {
  3434.     v5 = 12;
  3435.     if ( (unsigned int)(v2 - 10) > 1 )
  3436.       v5 = 14;
  3437.   }
  3438.   v6 = sub_18000A224(0x28ui64);
  3439.   *v6 = 0i64;
  3440.   v6[1] = 0i64;
  3441.   *((_QWORD *)v6 + 3) = 0i64;
  3442.   *((_DWORD *)v6 + 3) = 0;
  3443.   *((_QWORD *)v6 + 2) = 0i64;
  3444.   *(_QWORD *)v6 = &std::_Node_end_group::`vftable';
  3445.  *((_DWORD *)v6 + 2) = v5;
  3446.  *((_QWORD *)v6 + 4) = a2;
  3447.  *((_QWORD *)v6 + 3) = *(_QWORD *)(a1 + 8);
  3448.  v7 = *(_QWORD *)(*(_QWORD *)(a1 + 8) + 16i64);
  3449.  if ( v7 )
  3450.  {
  3451.    *((_QWORD *)v6 + 2) = v7;
  3452.    *(_QWORD *)(*(_QWORD *)(*(_QWORD *)(a1 + 8) + 16i64) + 24i64) = v6;
  3453.  }
  3454.  result = *(_QWORD *)(a1 + 8);
  3455.  *(_QWORD *)(result + 16) = v6;
  3456.  *(_QWORD *)(a1 + 8) = v6;
  3457.  return result;
  3458. }
  3459. // 18000C8B8: using guessed type void *std::_Node_end_group::`vftable';
  3460.  
  3461. //----- (00000001800046B0) ----------------------------------------------------
  3462. _OWORD *__fastcall sub_1800046B0(__int64 a1, int a2)
  3463. {
  3464.   _OWORD *v4; // rdx
  3465.   __int64 v5; // rcx
  3466.   _OWORD *result; // rax
  3467.  
  3468.   v4 = sub_18000A224(0x28ui64);
  3469.   *v4 = 0i64;
  3470.   v4[1] = 0i64;
  3471.   *((_QWORD *)v4 + 4) = 0i64;
  3472.   *((_QWORD *)v4 + 3) = 0i64;
  3473.   *((_QWORD *)v4 + 2) = 0i64;
  3474.   *(_QWORD *)v4 = &std::_Node_capture::`vftable';
  3475.  *((_QWORD *)v4 + 1) = 13i64;
  3476.  *((_DWORD *)v4 + 8) = a2;
  3477.  *((_QWORD *)v4 + 3) = *(_QWORD *)(a1 + 8);
  3478.  v5 = *(_QWORD *)(*(_QWORD *)(a1 + 8) + 16i64);
  3479.  if ( v5 )
  3480.  {
  3481.    *((_QWORD *)v4 + 2) = v5;
  3482.    *(_QWORD *)(*(_QWORD *)(*(_QWORD *)(a1 + 8) + 16i64) + 24i64) = v4;
  3483.  }
  3484.  *(_QWORD *)(*(_QWORD *)(a1 + 8) + 16i64) = v4;
  3485.  result = v4;
  3486.  *(_QWORD *)(a1 + 8) = v4;
  3487.  return result;
  3488. }
  3489. // 18000C898: using guessed type void *std::_Node_capture::`vftable';
  3490.  
  3491. //----- (0000000180004740) ----------------------------------------------------
  3492. bool __fastcall sub_180004740(__int64 a1, __int64 a2)
  3493. {
  3494.   __int64 v2; // rsi
  3495.   int v4; // eax
  3496.   int v5; // eax
  3497.   int v6; // eax
  3498.   int v7; // eax
  3499.   char v8; // bp
  3500.   int v9; // edx
  3501.   int v10; // ebp
  3502.   unsigned __int16 *v11; // rax
  3503.   __int16 *v12; // rax
  3504.   const void **v13; // r12
  3505.   __int64 v14; // rdi
  3506.   unsigned __int64 v15; // rdx
  3507.   signed __int64 v16; // rdi
  3508.   char *v17; // r14
  3509.   char *v18; // r15
  3510.   __int64 v19; // r13
  3511.   char *v20; // rax
  3512.   unsigned __int64 i; // r8
  3513.   _DWORD *v22; // rdx
  3514.   __int64 v23; // r9
  3515.   _DWORD *v24; // rdx
  3516.   int v25; // eax
  3517.   __int16 *v26; // rcx
  3518.   __int64 v27; // rax
  3519.   __int16 *v28; // r8
  3520.   __int16 *v29; // r9
  3521.   bool v30; // r8
  3522.   int v31; // er9
  3523.   _DWORD *v32; // rdx
  3524.   int v33; // eax
  3525.   char v35; // [rsp+30h] [rbp-88h]
  3526.   unsigned __int16 *v36; // [rsp+38h] [rbp-80h]
  3527.   __int128 Block_8; // [rsp+50h] [rbp-68h] BYREF
  3528.   __int64 v38; // [rsp+60h] [rbp-58h]
  3529.   __int64 v39; // [rsp+68h] [rbp-50h]
  3530.  
  3531.   v2 = a2;
  3532.   v4 = *(_DWORD *)(a1 + 224);
  3533.   if ( v4 > 0 )
  3534.   {
  3535.     v5 = v4 - 1;
  3536.     *(_DWORD *)(a1 + 224) = v5;
  3537.     if ( v5 <= 0 )
  3538.     {
  3539.       std::_Xregex_error(12i64);
  3540.       __debugbreak();
  3541.     }
  3542.   }
  3543.   v6 = *(_DWORD *)(a1 + 220);
  3544.   if ( v6 > 0 )
  3545.   {
  3546.     v7 = v6 - 1;
  3547.     *(_DWORD *)(a1 + 220) = v7;
  3548.     if ( v7 <= 0 )
  3549.     {
  3550.       std::_Xregex_error(11i64);
  3551.       __debugbreak();
  3552.     }
  3553.   }
  3554.   v8 = 0;
  3555.   if ( a2 )
  3556.   {
  3557.     while ( 1 )
  3558.     {
  3559.       v9 = *(_DWORD *)(v2 + 8);
  3560.       switch ( v9 )
  3561.       {
  3562.         case 1:
  3563.         case 8:
  3564.         case 9:
  3565.         case 17:
  3566.         case 20:
  3567.           goto LABEL_71;
  3568.         case 2:
  3569.           v10 = *(_DWORD *)(a1 + 188);
  3570.           if ( (v10 & 0x100) != 0 || *(_QWORD *)a1 != *(_QWORD *)(a1 + 152) )
  3571.             v8 = *(_WORD *)(*(_QWORD *)a1 - 2i64) != 10;
  3572.           else
  3573.             v8 = v10 & 1;
  3574.           goto LABEL_71;
  3575.         case 3:
  3576.           if ( *(_QWORD *)a1 == *(_QWORD *)(a1 + 160) )
  3577.             v8 = (*(_DWORD *)(a1 + 188) & 2) != 0;
  3578.           else
  3579.             v8 = **(_WORD **)a1 != 10;
  3580.           goto LABEL_71;
  3581.         case 4:
  3582.           v8 = sub_180006050((unsigned __int16 **)a1) == (*(_BYTE *)(v2 + 12) & 1);
  3583.           goto LABEL_71;
  3584.         case 5:
  3585.           v11 = *(unsigned __int16 **)a1;
  3586.           if ( *(_QWORD *)a1 == *(_QWORD *)(a1 + 160) || *v11 == 10 || *v11 == 13 )
  3587.             goto LABEL_78;
  3588.           *(_QWORD *)a1 = v11 + 1;
  3589.           goto LABEL_71;
  3590.         case 6:
  3591.           v12 = sub_1800060F0(
  3592.                   *(__int16 **)a1,
  3593.                   *(__int16 **)(a1 + 160),
  3594.                   *(__int16 **)(v2 + 40),
  3595.                   (__int16 *)(*(_QWORD *)(v2 + 40) + 2i64 * *(unsigned int *)(v2 + 36)),
  3596.                   *(__int64 **)(a1 + 208),
  3597.                   *(_DWORD *)(a1 + 184));
  3598.           if ( v12 == *(__int16 **)a1 )
  3599.             goto LABEL_78;
  3600.           *(_QWORD *)a1 = v12;
  3601.           goto LABEL_71;
  3602.         case 7:
  3603.           if ( *(_QWORD *)a1 == *(_QWORD *)(a1 + 160) || !sub_180005D40((__int64 *)a1, v2) )
  3604.             goto LABEL_78;
  3605.           v8 = 0;
  3606.           goto LABEL_72;
  3607.         case 10:
  3608.         case 11:
  3609.           v36 = *(unsigned __int16 **)a1;
  3610.           v35 = v9 == 11;
  3611.           v39 = 0i64;
  3612.           v13 = (const void **)(a1 + 8);
  3613.           Block_8 = 0i64;
  3614.           v14 = 0i64;
  3615.           v38 = 0i64;
  3616.           v15 = (__int64)(*(_QWORD *)(a1 + 16) - *(_QWORD *)(a1 + 8)) >> 2;
  3617.           if ( v15 )
  3618.           {
  3619.             if ( v15 > 0x3FFFFFFFFFFFFFFFi64 )
  3620.               sub_1800033B0();
  3621.             sub_180004F50((unsigned __int64 *)&Block_8, v15);
  3622.             v16 = *(_QWORD *)(a1 + 16) - (_QWORD)*v13;
  3623.             v17 = (char *)Block_8;
  3624.             memmove((void *)Block_8, *v13, v16);
  3625.             v18 = &v17[4 * (v16 >> 2)];
  3626.             *((_QWORD *)&Block_8 + 1) = v18;
  3627.             v14 = v38;
  3628.           }
  3629.           else
  3630.           {
  3631.             v18 = (char *)*((_QWORD *)&Block_8 + 1);
  3632.             v17 = (char *)Block_8;
  3633.           }
  3634.           v19 = *(_QWORD *)(a1 + 32);
  3635.           v39 = v19;
  3636.           if ( (unsigned __int8)sub_180004740(a1, *(_QWORD *)(v2 + 32)) == v35 )
  3637.           {
  3638.             *(_QWORD *)a1 = v36;
  3639.             if ( v13 != (const void **)&Block_8 )
  3640.             {
  3641.               sub_180006510((unsigned __int64 *)(a1 + 8), v17, (v18 - v17) >> 2);
  3642.               *(_QWORD *)(a1 + 32) = v19;
  3643.             }
  3644.             v8 = 1;
  3645.           }
  3646.           else
  3647.           {
  3648.             *(_QWORD *)a1 = v36;
  3649.           }
  3650.           if ( v17 )
  3651.           {
  3652.             v20 = v17;
  3653.             if ( ((v14 - (_QWORD)v17) & 0xFFFFFFFFFFFFFFFCui64) >= 0x1000 )
  3654.             {
  3655.               v17 = (char *)*((_QWORD *)v17 - 1);
  3656.               if ( (unsigned __int64)(v20 - v17 - 8) > 0x1F )
  3657.                 invalid_parameter_noinfo_noreturn();
  3658.             }
  3659.             j_j_free(v17);
  3660.           }
  3661.           goto LABEL_71;
  3662.         case 12:
  3663.           goto LABEL_70;
  3664.         case 13:
  3665.           *(_QWORD *)(*(_QWORD *)(a1 + 40) + 16i64 * *(unsigned int *)(v2 + 32)) = *(_QWORD *)a1;
  3666.           for ( i = *(_QWORD *)(a1 + 32); *(unsigned int *)(v2 + 32) < i; *v22 &= ~(1 << (i & 0x1F)) )
  3667.             v22 = (_DWORD *)(*(_QWORD *)(a1 + 8) + 4 * (--i >> 5));
  3668.           goto LABEL_71;
  3669.         case 14:
  3670.           v23 = *(_QWORD *)(v2 + 32);
  3671.           if ( *(_BYTE *)(a1 + 193) || *(_DWORD *)(v23 + 32) )
  3672.           {
  3673.             v24 = (_DWORD *)(*(_QWORD *)(a1 + 8) + 4 * ((unsigned __int64)*(unsigned int *)(v23 + 32) >> 5));
  3674.             *v24 |= 1 << (*(_BYTE *)(v23 + 32) & 0x1F);
  3675.             *(_QWORD *)(*(_QWORD *)(a1 + 40) + 16i64 * *(unsigned int *)(v23 + 32) + 8) = *(_QWORD *)a1;
  3676.           }
  3677.           goto LABEL_71;
  3678.         case 15:
  3679.           v25 = *(_DWORD *)(*(_QWORD *)(a1 + 8) + 4 * ((unsigned __int64)*(unsigned int *)(v2 + 32) >> 5));
  3680.           if ( !_bittest(&v25, *(_DWORD *)(v2 + 32) & 0x1F) )
  3681.             goto LABEL_71;
  3682.           v26 = *(__int16 **)a1;
  3683.           v27 = *(_QWORD *)(a1 + 40);
  3684.           v28 = *(__int16 **)(v27 + 16i64 * *(unsigned int *)(v2 + 32));
  3685.           v29 = *(__int16 **)(v27 + 16i64 * *(unsigned int *)(v2 + 32) + 8);
  3686.           if ( v28 != v29 )
  3687.           {
  3688.             v26 = sub_1800060F0(v26, *(__int16 **)(a1 + 160), v28, v29, *(__int64 **)(a1 + 208), *(_DWORD *)(a1 + 184));
  3689.             if ( v26 == *(__int16 **)a1 )
  3690.             {
  3691. LABEL_78:
  3692.               v8 = 1;
  3693.               goto LABEL_74;
  3694.             }
  3695.           }
  3696.           *(_QWORD *)a1 = v26;
  3697. LABEL_71:
  3698.           if ( v8 )
  3699.             goto LABEL_74;
  3700. LABEL_72:
  3701.           if ( !v2 )
  3702.             goto LABEL_74;
  3703.           v2 = *(_QWORD *)(v2 + 16);
  3704.           if ( !v2 )
  3705.             goto LABEL_74;
  3706.           break;
  3707.         case 16:
  3708.           if ( !(unsigned __int8)sub_180005650(a1, v2) )
  3709.             v8 = 1;
  3710.           goto LABEL_70;
  3711.         case 18:
  3712.           v30 = (*(_DWORD *)(v2 + 12) & 2) != 0;
  3713.           v31 = 0;
  3714.           v32 = (_DWORD *)v2;
  3715.           goto LABEL_53;
  3716.         case 19:
  3717.           v32 = *(_DWORD **)(v2 + 32);
  3718.           if ( v32[13] )
  3719.             goto LABEL_70;
  3720.           v30 = (v32[3] & 2) != 0;
  3721.           v31 = *(_DWORD *)(*(_QWORD *)(a1 + 128) + 16i64 * (unsigned int)v32[12]);
  3722. LABEL_53:
  3723.           if ( !(unsigned __int8)sub_180005A00(a1, (__int64)v32, v30, v31) )
  3724.             v8 = 1;
  3725. LABEL_70:
  3726.           v2 = 0i64;
  3727.           goto LABEL_71;
  3728.         case 21:
  3729.           if ( (*(_DWORD *)(a1 + 188) & 0x2020) != 0 && *(_QWORD *)(a1 + 152) == *(_QWORD *)a1
  3730.             || *(_BYTE *)(a1 + 216) && *(_QWORD *)a1 != *(_QWORD *)(a1 + 160) )
  3731.           {
  3732.             v8 = 1;
  3733.           }
  3734.           else if ( !*(_BYTE *)(a1 + 192) || sub_180005F70(a1) )
  3735.           {
  3736.             *(_QWORD *)(a1 + 64) = *(_QWORD *)a1;
  3737.             if ( a1 + 72 != a1 + 8 )
  3738.             {
  3739.               sub_180006510(
  3740.                 (unsigned __int64 *)(a1 + 72),
  3741.                 *(char **)(a1 + 8),
  3742.                 (__int64)(*(_QWORD *)(a1 + 16) - *(_QWORD *)(a1 + 8)) >> 2);
  3743.               *(_QWORD *)(a1 + 96) = *(_QWORD *)(a1 + 32);
  3744.             }
  3745.             if ( a1 + 104 != a1 + 40 )
  3746.               sub_1800063C0(
  3747.                 (unsigned __int64 *)(a1 + 104),
  3748.                 *(char **)(a1 + 40),
  3749.                 (__int64)(*(_QWORD *)(a1 + 48) - *(_QWORD *)(a1 + 40)) >> 4);
  3750.             *(_BYTE *)(a1 + 192) = 1;
  3751.           }
  3752.           goto LABEL_70;
  3753.         default:
  3754.           std::_Xregex_error(13i64);
  3755.           __debugbreak();
  3756.       }
  3757.     }
  3758.   }
  3759. LABEL_74:
  3760.   v33 = *(_DWORD *)(a1 + 224);
  3761.   if ( v33 > 0 )
  3762.     *(_DWORD *)(a1 + 224) = v33 + 1;
  3763.   return v8 == 0;
  3764. }
  3765. // 18000C0B0: using guessed type __int64 __fastcall std::_Xregex_error(_QWORD);
  3766.  
  3767. //----- (0000000180004D30) ----------------------------------------------------
  3768. char *__fastcall sub_180004D30(__int64 a1, unsigned __int64 a2)
  3769. {
  3770.   __int64 v4; // rbp
  3771.   unsigned __int64 v5; // rcx
  3772.   __int64 v6; // rbp
  3773.   unsigned __int64 v7; // rdx
  3774.   unsigned __int64 v8; // rbx
  3775.   size_t v9; // rbx
  3776.   void *v10; // rax
  3777.   _QWORD *v11; // rdi
  3778.   void *v12; // rcx
  3779.   char *result; // rax
  3780.  
  3781.   if ( a2 > 0xFFFFFFFFFFFFFFFi64 )
  3782.     sub_1800033B0();
  3783.   v4 = *(_QWORD *)(a1 + 8) - *(_QWORD *)a1;
  3784.   v5 = (__int64)(*(_QWORD *)(a1 + 16) - *(_QWORD *)a1) >> 4;
  3785.   v6 = v4 >> 4;
  3786.   v7 = v5 >> 1;
  3787.   if ( v5 > 0xFFFFFFFFFFFFFFFi64 - (v5 >> 1) )
  3788.     goto LABEL_23;
  3789.   v8 = v7 + v5;
  3790.   if ( v7 + v5 >= a2 )
  3791.   {
  3792.     if ( v8 > 0xFFFFFFFFFFFFFFFi64 )
  3793.       goto LABEL_23;
  3794.   }
  3795.   else
  3796.   {
  3797.     v8 = a2;
  3798.   }
  3799.   v9 = 16 * v8;
  3800.   if ( v9 < 0x1000 )
  3801.   {
  3802.     if ( v9 )
  3803.       v11 = sub_18000A224(v9);
  3804.     else
  3805.       v11 = 0i64;
  3806.     goto LABEL_13;
  3807.   }
  3808.   if ( v9 + 39 <= v9 )
  3809. LABEL_23:
  3810.     Concurrency::cancel_current_task();
  3811.   v10 = sub_18000A224(v9 + 39);
  3812.   if ( !v10 )
  3813.     goto LABEL_21;
  3814.   v11 = (_QWORD *)(((unsigned __int64)v10 + 39) & 0xFFFFFFFFFFFFFFE0ui64);
  3815.   *(v11 - 1) = v10;
  3816. LABEL_13:
  3817.   if ( a2 != v6 )
  3818.     memset(&v11[2 * v6], 0, 16 * (a2 - v6));
  3819.   memmove(v11, *(const void **)a1, *(_QWORD *)(a1 + 8) - *(_QWORD *)a1);
  3820.   v12 = *(void **)a1;
  3821.   if ( *(_QWORD *)a1 )
  3822.   {
  3823.     if ( ((*(_QWORD *)(a1 + 16) - (_QWORD)v12) & 0xFFFFFFFFFFFFFFF0ui64) < 0x1000 )
  3824.     {
  3825. LABEL_19:
  3826.       j_j_free(v12);
  3827.       goto LABEL_20;
  3828.     }
  3829.     if ( (unsigned __int64)v12 - *((_QWORD *)v12 - 1) - 8 <= 0x1F )
  3830.     {
  3831.       v12 = (void *)*((_QWORD *)v12 - 1);
  3832.       goto LABEL_19;
  3833.     }
  3834. LABEL_21:
  3835.     invalid_parameter_noinfo_noreturn();
  3836.   }
  3837. LABEL_20:
  3838.   result = (char *)&v11[v9 / 8];
  3839.   *(_QWORD *)a1 = v11;
  3840.   *(_QWORD *)(a1 + 8) = &v11[2 * a2];
  3841.   *(_QWORD *)(a1 + 16) = &v11[v9 / 8];
  3842.   return result;
  3843. }
  3844.  
  3845. //----- (0000000180004EA0) ----------------------------------------------------
  3846. _QWORD *__fastcall sub_180004EA0(_QWORD *a1, _QWORD *a2)
  3847. {
  3848.   void **v2; // rsi
  3849.   unsigned __int64 v5; // rdx
  3850.   const void *v6; // rdx
  3851.   char *v7; // rdi
  3852.   signed __int64 v8; // rbx
  3853.   _QWORD *result; // rax
  3854.  
  3855.   v2 = (void **)(a1 + 1);
  3856.   *a1 = *a2;
  3857.   a1[1] = 0i64;
  3858.   a1[2] = 0i64;
  3859.   a1[3] = 0i64;
  3860.   v5 = (__int64)(a2[2] - a2[1]) >> 2;
  3861.   if ( v5 )
  3862.   {
  3863.     if ( v5 > 0x3FFFFFFFFFFFFFFFi64 )
  3864.       sub_1800033B0();
  3865.     sub_180004F50(a1 + 1, v5);
  3866.     v6 = (const void *)a2[1];
  3867.     v7 = (char *)*v2;
  3868.     v8 = a2[2] - (_QWORD)v6;
  3869.     memmove(*v2, v6, v8);
  3870.     v2[1] = &v7[4 * (v8 >> 2)];
  3871.   }
  3872.   result = a1;
  3873.   v2[3] = (void *)a2[4];
  3874.   return result;
  3875. }
  3876.  
  3877. //----- (0000000180004F50) ----------------------------------------------------
  3878. unsigned __int64 __fastcall sub_180004F50(unsigned __int64 *a1, unsigned __int64 a2)
  3879. {
  3880.   unsigned __int64 v3; // rbx
  3881.   void *v4; // rax
  3882.   void *v5; // rcx
  3883.   unsigned __int64 v6; // rax
  3884.   unsigned __int64 result; // rax
  3885.  
  3886.   if ( a2 > 0x3FFFFFFFFFFFFFFFi64 )
  3887.     goto LABEL_11;
  3888.   v3 = 4 * a2;
  3889.   if ( 4 * a2 < 0x1000 )
  3890.   {
  3891.     if ( v3 )
  3892.       v6 = (unsigned __int64)sub_18000A224(4 * a2);
  3893.     else
  3894.       v6 = 0i64;
  3895.     goto LABEL_10;
  3896.   }
  3897.   if ( v3 + 39 <= v3 )
  3898. LABEL_11:
  3899.     Concurrency::cancel_current_task();
  3900.   v4 = sub_18000A224(v3 + 39);
  3901.   v5 = v4;
  3902.   if ( !v4 )
  3903.     invalid_parameter_noinfo_noreturn();
  3904.   v6 = ((unsigned __int64)v4 + 39) & 0xFFFFFFFFFFFFFFE0ui64;
  3905.   *(_QWORD *)(v6 - 8) = v5;
  3906. LABEL_10:
  3907.   *a1 = v6;
  3908.   a1[1] = v6;
  3909.   result = v3 + v6;
  3910.   a1[2] = result;
  3911.   return result;
  3912. }
  3913.  
  3914. //----- (0000000180004FE0) ----------------------------------------------------
  3915. char __fastcall sub_180004FE0(__int64 a1)
  3916. {
  3917.   char result; // al
  3918.   __int64 v3; // rcx
  3919.   _QWORD *v4; // rdi
  3920.   unsigned __int16 *v5; // rcx
  3921.   _WORD *v6; // rdx
  3922.   int v7; // er8
  3923.   unsigned __int16 *v8; // rcx
  3924.   _WORD *v9; // rdx
  3925.   int v10; // er8
  3926.   __int16 v11; // ax
  3927.   unsigned __int16 *v12; // rcx
  3928.   _WORD *v13; // rdx
  3929.   int v14; // er8
  3930.   unsigned __int16 *v15; // rax
  3931.   unsigned __int16 *v16; // rcx
  3932.   int v17; // edx
  3933.   unsigned __int16 *v18; // rax
  3934.   unsigned __int16 *v19; // rcx
  3935.   int v20; // edx
  3936.   __int64 v21; // rcx
  3937.   unsigned __int16 *v22; // rax
  3938.   unsigned __int16 *v23; // rcx
  3939.   int v24; // edx
  3940.   unsigned __int16 *v25; // rax
  3941.   unsigned __int16 *v26; // rcx
  3942.   int v27; // edx
  3943.   __int64 v28; // rcx
  3944.   char v29; // si
  3945.   unsigned __int16 *v30; // rax
  3946.   unsigned __int16 *v31; // rcx
  3947.   int v32; // edx
  3948.   unsigned __int16 *v33; // rcx
  3949.   _WORD *v34; // rcx
  3950.   int v35; // edx
  3951.   unsigned __int16 *v36; // rcx
  3952.   _WORD *v37; // rcx
  3953.   int v38; // edx
  3954.   unsigned __int16 *v39; // rcx
  3955.   _WORD *v40; // rcx
  3956.   int v41; // edx
  3957.  
  3958.   result = 0;
  3959.   v3 = *(unsigned int *)(a1 + 124);
  3960.   if ( (_DWORD)v3 != -1 )
  3961.   {
  3962.     v4 = (_QWORD *)(a1 + 16);
  3963.     while ( 1 )
  3964.     {
  3965.       switch ( (_DWORD)v3 )
  3966.       {
  3967.         case '|':
  3968.           return result;
  3969.         case ')':
  3970.           if ( *(_DWORD *)(a1 + 28) )
  3971.             return result;
  3972.           if ( (*(_DWORD *)(a1 + 128) & 0x10000000) == 0 )
  3973.             sub_1800040C0(v3, 5u);
  3974. LABEL_137:
  3975.           sub_1800072A0(a1 + 64, *(_WORD *)(a1 + 120));
  3976.           v39 = *(unsigned __int16 **)a1;
  3977.           if ( *(_QWORD *)a1 != *v4 )
  3978.           {
  3979.             if ( *v39 == 92 )
  3980.             {
  3981.               v40 = v39 + 1;
  3982.               if ( v40 != (_WORD *)*v4 )
  3983.               {
  3984.                 if ( (v41 = *(_DWORD *)(a1 + 128), (v41 & 8) == 0) && (unsigned __int16)(*v40 - 40) <= 1u
  3985.                   || (v41 & 0x10) == 0 && ((*v40 - 123) & 0xFFFD) == 0 )
  3986.                 {
  3987.                   *(_QWORD *)a1 = v40;
  3988.                 }
  3989.               }
  3990.             }
  3991.             *(_QWORD *)a1 += 2i64;
  3992.           }
  3993.           goto LABEL_146;
  3994.         case '.':
  3995.           sub_1800055C0(a1 + 64, 5);
  3996.           v5 = *(unsigned __int16 **)a1;
  3997.           if ( *(_QWORD *)a1 != *v4 )
  3998.           {
  3999.             if ( *v5 == 92 )
  4000.             {
  4001.               v6 = v5 + 1;
  4002.               if ( v5 + 1 != (unsigned __int16 *)*v4 )
  4003.               {
  4004.                 if ( (v7 = *(_DWORD *)(a1 + 128), (v7 & 8) == 0) && (unsigned __int16)(*v6 - 40) <= 1u
  4005.                   || (v7 & 0x10) == 0 && (*v6 == 123 || *v6 == 125) )
  4006.                 {
  4007.                   ++v5;
  4008.                 }
  4009.               }
  4010.             }
  4011.             *(_QWORD *)a1 = v5 + 1;
  4012.           }
  4013.           goto LABEL_146;
  4014.         case '\\':
  4015.           v8 = *(unsigned __int16 **)a1;
  4016.           if ( *(_QWORD *)a1 != *v4 )
  4017.           {
  4018.             if ( *v8 == 92 )
  4019.             {
  4020.               v9 = v8 + 1;
  4021.               if ( v8 + 1 != (unsigned __int16 *)*v4 )
  4022.               {
  4023.                 if ( (v10 = *(_DWORD *)(a1 + 128), (v10 & 8) == 0) && (unsigned __int16)(*v9 - 40) <= 1u
  4024.                   || (v10 & 0x10) == 0 && (*v9 == 123 || *v9 == 125) )
  4025.                 {
  4026.                   ++v8;
  4027.                 }
  4028.               }
  4029.             }
  4030.             *(_QWORD *)a1 = v8 + 1;
  4031.           }
  4032.           sub_1800040D0((unsigned __int16 **)a1);
  4033.           if ( *(char *)(a1 + 128) >= 0 )
  4034.           {
  4035. LABEL_56:
  4036.             sub_180006AC0(a1);
  4037. LABEL_147:
  4038.             sub_180007010(a1);
  4039.             v4 = (_QWORD *)(a1 + 16);
  4040.             goto LABEL_148;
  4041.           }
  4042.           v11 = *(_WORD *)(a1 + 120);
  4043.           if ( v11 == 98 )
  4044.           {
  4045.             sub_1800055C0(a1 + 64, 4);
  4046.             v12 = *(unsigned __int16 **)a1;
  4047.             if ( *(_QWORD *)a1 != *v4 )
  4048.             {
  4049.               if ( *v12 == 92 )
  4050.               {
  4051.                 v13 = v12 + 1;
  4052.                 if ( v12 + 1 != (unsigned __int16 *)*v4 )
  4053.                 {
  4054.                   if ( (v14 = *(_DWORD *)(a1 + 128), (v14 & 8) == 0) && (unsigned __int16)(*v13 - 40) <= 1u
  4055.                     || (v14 & 0x10) == 0 && (*v13 == 123 || *v13 == 125) )
  4056.                   {
  4057.                     ++v12;
  4058.                   }
  4059.                 }
  4060.               }
  4061.               *(_QWORD *)a1 = v12 + 1;
  4062.             }
  4063.             goto LABEL_128;
  4064.           }
  4065.           if ( v11 != 66 )
  4066.             goto LABEL_56;
  4067.           sub_1800055C0(a1 + 64, 4);
  4068.           *(_DWORD *)(*(_QWORD *)(a1 + 72) + 12i64) ^= 1u;
  4069.           v15 = *(unsigned __int16 **)a1;
  4070.           if ( *(_QWORD *)a1 == *v4 )
  4071.             goto LABEL_128;
  4072.           if ( *v15 == 92 )
  4073.           {
  4074.             v16 = v15 + 1;
  4075.             if ( v15 + 1 != (unsigned __int16 *)*v4 )
  4076.             {
  4077.               v17 = *(_DWORD *)(a1 + 128);
  4078.               if ( (v17 & 8) != 0 )
  4079.               {
  4080. LABEL_50:
  4081.                 if ( (v17 & 0x10) == 0 && (*v16 == 123 || *v16 == 125) )
  4082.                   goto LABEL_53;
  4083.               }
  4084.               else
  4085.               {
  4086.                 if ( (unsigned __int16)(*v16 - 40) > 1u )
  4087.                 {
  4088.                   v15 = *(unsigned __int16 **)a1;
  4089.                   goto LABEL_50;
  4090.                 }
  4091. LABEL_53:
  4092.                 v15 = v16;
  4093.               }
  4094.             }
  4095.           }
  4096.           *(_QWORD *)a1 = v15 + 1;
  4097. LABEL_128:
  4098.           sub_1800040D0((unsigned __int16 **)a1);
  4099.           goto LABEL_148;
  4100.         case '[':
  4101.           v18 = *(unsigned __int16 **)a1;
  4102.           if ( *(_QWORD *)a1 != *v4 )
  4103.           {
  4104.             if ( *v18 == 92 )
  4105.             {
  4106.               v19 = v18 + 1;
  4107.               if ( v18 + 1 != (unsigned __int16 *)*v4 )
  4108.               {
  4109.                 v20 = *(_DWORD *)(a1 + 128);
  4110.                 if ( (v20 & 8) != 0 )
  4111.                 {
  4112. LABEL_64:
  4113.                   if ( (v20 & 0x10) == 0 && (*v19 == 123 || *v19 == 125) )
  4114.                     goto LABEL_67;
  4115.                 }
  4116.                 else
  4117.                 {
  4118.                   if ( (unsigned __int16)(*v19 - 40) > 1u )
  4119.                   {
  4120.                     v18 = *(unsigned __int16 **)a1;
  4121.                     goto LABEL_64;
  4122.                   }
  4123. LABEL_67:
  4124.                   v18 = v19;
  4125.                 }
  4126.               }
  4127.             }
  4128.             *(_QWORD *)a1 = v18 + 1;
  4129.           }
  4130.           sub_1800040D0((unsigned __int16 **)a1);
  4131.           sub_180006990(a1);
  4132.           if ( *(_DWORD *)(a1 + 124) != 93 )
  4133.             sub_1800040C0(v21, 4u);
  4134.           v22 = *(unsigned __int16 **)a1;
  4135.           if ( *(_QWORD *)a1 != *v4 )
  4136.           {
  4137.             if ( *v22 == 92 )
  4138.             {
  4139.               v23 = v22 + 1;
  4140.               if ( v22 + 1 != (unsigned __int16 *)*v4 )
  4141.               {
  4142.                 v24 = *(_DWORD *)(a1 + 128);
  4143.                 if ( (v24 & 8) != 0 )
  4144.                 {
  4145. LABEL_76:
  4146.                   if ( (v24 & 0x10) == 0 && (*v23 == 123 || *v23 == 125) )
  4147.                     goto LABEL_79;
  4148.                 }
  4149.                 else
  4150.                 {
  4151.                   if ( (unsigned __int16)(*v23 - 40) > 1u )
  4152.                   {
  4153.                     v22 = *(unsigned __int16 **)a1;
  4154.                     goto LABEL_76;
  4155.                   }
  4156. LABEL_79:
  4157.                   v22 = v23;
  4158.                 }
  4159.               }
  4160.             }
  4161.             *(_QWORD *)a1 = v22 + 1;
  4162.           }
  4163. LABEL_146:
  4164.           sub_1800040D0((unsigned __int16 **)a1);
  4165.           goto LABEL_147;
  4166.       }
  4167.       if ( (_DWORD)v3 != 40 )
  4168.       {
  4169.         if ( (_DWORD)v3 == 94 )
  4170.         {
  4171.           sub_1800055C0(a1 + 64, 2);
  4172.           v33 = *(unsigned __int16 **)a1;
  4173.           if ( *(_QWORD *)a1 != *v4 )
  4174.           {
  4175.             if ( *v33 == 92 )
  4176.             {
  4177.               v34 = v33 + 1;
  4178.               if ( v34 != (_WORD *)*v4 )
  4179.               {
  4180.                 if ( (v35 = *(_DWORD *)(a1 + 128), (v35 & 8) == 0) && (unsigned __int16)(*v34 - 40) <= 1u
  4181.                   || (v35 & 0x10) == 0 && ((*v34 - 123) & 0xFFFD) == 0 )
  4182.                 {
  4183.                   *(_QWORD *)a1 = v34;
  4184.                 }
  4185.               }
  4186.             }
  4187.             *(_QWORD *)a1 += 2i64;
  4188.           }
  4189.         }
  4190.         else
  4191.         {
  4192.           if ( (_DWORD)v3 != 36 )
  4193.           {
  4194.             if ( (unsigned int)(v3 - 42) <= 1 || (_DWORD)v3 == 63 || (_DWORD)v3 == 123 )
  4195.               sub_1800040C0(v3, 0xAu);
  4196.             if ( (_DWORD)v3 == 125 )
  4197.             {
  4198.               if ( (*(_DWORD *)(a1 + 128) & 0x10000000) == 0 )
  4199.                 sub_1800040C0(v3, 6u);
  4200.             }
  4201.             else if ( (_DWORD)v3 == 93 && (*(_DWORD *)(a1 + 128) & 0x10000000) == 0 )
  4202.             {
  4203.               sub_1800040C0(v3, 4u);
  4204.             }
  4205.             goto LABEL_137;
  4206.           }
  4207.           sub_1800055C0(a1 + 64, 3);
  4208.           v36 = *(unsigned __int16 **)a1;
  4209.           if ( *(_QWORD *)a1 != *v4 )
  4210.           {
  4211.             if ( *v36 == 92 )
  4212.             {
  4213.               v37 = v36 + 1;
  4214.               if ( v37 != (_WORD *)*v4 )
  4215.               {
  4216.                 if ( (v38 = *(_DWORD *)(a1 + 128), (v38 & 8) == 0) && (unsigned __int16)(*v37 - 40) <= 1u
  4217.                   || (v38 & 0x10) == 0 && ((*v37 - 123) & 0xFFFD) == 0 )
  4218.                 {
  4219.                   *(_QWORD *)a1 = v37;
  4220.                 }
  4221.               }
  4222.             }
  4223.             *(_QWORD *)a1 += 2i64;
  4224.           }
  4225.         }
  4226.         goto LABEL_128;
  4227.       }
  4228.       v25 = *(unsigned __int16 **)a1;
  4229.       if ( *(_QWORD *)a1 != *v4 )
  4230.         break;
  4231. LABEL_93:
  4232.       sub_1800040D0((unsigned __int16 **)a1);
  4233.       v29 = sub_180006C50(a1);
  4234.       if ( *(_DWORD *)(a1 + 124) != 41 )
  4235.         sub_1800040C0(v28, 5u);
  4236.       v30 = *(unsigned __int16 **)a1;
  4237.       if ( *(_QWORD *)a1 != *v4 )
  4238.       {
  4239.         if ( *v30 == 92 )
  4240.         {
  4241.           v31 = v30 + 1;
  4242.           if ( v30 + 1 != (unsigned __int16 *)*v4 )
  4243.           {
  4244.             v32 = *(_DWORD *)(a1 + 128);
  4245.             if ( (v32 & 8) != 0 )
  4246.             {
  4247. LABEL_100:
  4248.               if ( (v32 & 0x10) == 0 && (*v31 == 123 || *v31 == 125) )
  4249.                 goto LABEL_103;
  4250.             }
  4251.             else
  4252.             {
  4253.               if ( (unsigned __int16)(*v31 - 40) > 1u )
  4254.               {
  4255.                 v30 = *(unsigned __int16 **)a1;
  4256.                 goto LABEL_100;
  4257.               }
  4258. LABEL_103:
  4259.               v30 = v31;
  4260.             }
  4261.           }
  4262.         }
  4263.         *(_QWORD *)a1 = v30 + 1;
  4264.       }
  4265.       sub_1800040D0((unsigned __int16 **)a1);
  4266.       if ( v29 )
  4267.         goto LABEL_147;
  4268. LABEL_148:
  4269.       v3 = *(unsigned int *)(a1 + 124);
  4270.       result = 1;
  4271.       if ( (_DWORD)v3 == -1 )
  4272.         return result;
  4273.     }
  4274.     if ( *v25 != 92 || (v26 = v25 + 1, v25 + 1 == (unsigned __int16 *)*v4) )
  4275.     {
  4276. LABEL_92:
  4277.       *(_QWORD *)a1 = v25 + 1;
  4278.       goto LABEL_93;
  4279.     }
  4280.     v27 = *(_DWORD *)(a1 + 128);
  4281.     if ( (v27 & 8) == 0 )
  4282.     {
  4283.       if ( (unsigned __int16)(*v26 - 40) <= 1u )
  4284.       {
  4285. LABEL_91:
  4286.         v25 = v26;
  4287.         goto LABEL_92;
  4288.       }
  4289.       v25 = *(unsigned __int16 **)a1;
  4290.     }
  4291.     if ( (v27 & 0x10) != 0 || *v26 != 123 && *v26 != 125 )
  4292.       goto LABEL_92;
  4293.     goto LABEL_91;
  4294.   }
  4295.   return result;
  4296. }
  4297. // 1800055AF: variable 'v21' is possibly undefined
  4298. // 1800055BA: variable 'v28' is possibly undefined
  4299.  
  4300. //----- (00000001800055C0) ----------------------------------------------------
  4301. _OWORD *__fastcall sub_1800055C0(__int64 a1, int a2)
  4302. {
  4303.   _OWORD *v4; // rdx
  4304.   __int64 v5; // rcx
  4305.   _OWORD *result; // rax
  4306.  
  4307.   v4 = sub_18000A224(0x20ui64);
  4308.   *v4 = 0i64;
  4309.   v4[1] = 0i64;
  4310.   *((_DWORD *)v4 + 2) = a2;
  4311.   *(_QWORD *)v4 = &std::_Node_base::`vftable';
  4312.  *((_QWORD *)v4 + 3) = 0i64;
  4313.  *((_DWORD *)v4 + 3) = 0;
  4314.  *((_QWORD *)v4 + 2) = 0i64;
  4315.  *((_QWORD *)v4 + 3) = *(_QWORD *)(a1 + 8);
  4316.  v5 = *(_QWORD *)(*(_QWORD *)(a1 + 8) + 16i64);
  4317.  if ( v5 )
  4318.  {
  4319.    *((_QWORD *)v4 + 2) = v5;
  4320.    *(_QWORD *)(*(_QWORD *)(*(_QWORD *)(a1 + 8) + 16i64) + 24i64) = v4;
  4321.  }
  4322.  *(_QWORD *)(*(_QWORD *)(a1 + 8) + 16i64) = v4;
  4323.  result = v4;
  4324.  *(_QWORD *)(a1 + 8) = v4;
  4325.  return result;
  4326. }
  4327. // 18000C8D8: using guessed type void *std::_Node_base::`vftable';
  4328.  
  4329. //----- (0000000180005650) ----------------------------------------------------
  4330. __int64 __fastcall sub_180005650(__int64 a1, __int64 a2)
  4331. {
  4332.   unsigned __int64 *v4; // rdi
  4333.   __int128 *v5; // rsi
  4334.   unsigned __int8 v6; // bl
  4335.   void *v7; // rcx
  4336.   void *v8; // rcx
  4337.   __int64 v9; // r12
  4338.   __int64 i; // r15
  4339.   __int64 v11; // rbx
  4340.   void *v12; // rcx
  4341.   void *v13; // rcx
  4342.   void *v15[2]; // [rsp+20h] [rbp-59h] BYREF
  4343.   __int128 v16; // [rsp+30h] [rbp-49h]
  4344.   __int128 v17; // [rsp+40h] [rbp-39h] BYREF
  4345.   __int128 v18; // [rsp+50h] [rbp-29h]
  4346.   void *Block[2]; // [rsp+60h] [rbp-19h] BYREF
  4347.   __int128 v20; // [rsp+70h] [rbp-9h]
  4348.   __int128 v21; // [rsp+80h] [rbp+7h] BYREF
  4349.   __int128 v22; // [rsp+90h] [rbp+17h]
  4350.  
  4351.   *(_OWORD *)v15 = 0i64;
  4352.   v16 = 0i64;
  4353.   v17 = 0i64;
  4354.   v18 = 0i64;
  4355.   sub_180006650(v15, (_QWORD *)a1);
  4356.   if ( !a2 )
  4357.   {
  4358. LABEL_9:
  4359.     v6 = 0;
  4360.     goto LABEL_10;
  4361.   }
  4362.   v4 = (unsigned __int64 *)(a1 + 8);
  4363.   v5 = (__int128 *)(a1 + 40);
  4364.   while ( 1 )
  4365.   {
  4366.     *(void **)a1 = v15[0];
  4367.     if ( v4 != (unsigned __int64 *)&v15[1] )
  4368.     {
  4369.       sub_180006510(v4, (char *)v15[1], (__int64)(v16 - (unsigned __int64)v15[1]) >> 2);
  4370.       *(_QWORD *)(a1 + 32) = v17;
  4371.     }
  4372.     if ( v5 != (__int128 *)((char *)&v17 + 8) )
  4373.       sub_1800063C0((unsigned __int64 *)(a1 + 40), *((char **)&v17 + 1), (__int64)(v18 - *((_QWORD *)&v17 + 1)) >> 4);
  4374.     if ( (unsigned __int8)sub_180004740(a1, *(_QWORD *)(a2 + 16)) )
  4375.       break;
  4376.     a2 = *(_QWORD *)(a2 + 40);
  4377.     if ( !a2 )
  4378.       goto LABEL_9;
  4379.   }
  4380.   if ( !*(_BYTE *)(a1 + 200) )
  4381.   {
  4382.     v6 = 1;
  4383.     goto LABEL_10;
  4384.   }
  4385.   *(_OWORD *)Block = 0i64;
  4386.   v20 = 0i64;
  4387.   v21 = 0i64;
  4388.   v22 = 0i64;
  4389.   sub_180006650(Block, (_QWORD *)a1);
  4390.   v9 = (__int64)(*(_QWORD *)a1 - (unsigned __int64)v15[0]) >> 1;
  4391.   for ( i = *(_QWORD *)(a2 + 40); i; i = *(_QWORD *)(i + 40) )
  4392.   {
  4393.     *(void **)a1 = v15[0];
  4394.     if ( v4 != (unsigned __int64 *)&v15[1] )
  4395.     {
  4396.       sub_180006510(v4, (char *)v15[1], (__int64)(v16 - (unsigned __int64)v15[1]) >> 2);
  4397.       *(_QWORD *)(a1 + 32) = v17;
  4398.     }
  4399.     if ( v5 != (__int128 *)((char *)&v17 + 8) )
  4400.       sub_1800063C0((unsigned __int64 *)(a1 + 40), *((char **)&v17 + 1), (__int64)(v18 - *((_QWORD *)&v17 + 1)) >> 4);
  4401.     if ( (unsigned __int8)sub_180004740(a1, *(_QWORD *)(i + 16)) )
  4402.     {
  4403.       v11 = (__int64)(*(_QWORD *)a1 - (unsigned __int64)v15[0]) >> 1;
  4404.       if ( v9 < v11 )
  4405.       {
  4406.         Block[0] = *(void **)a1;
  4407.         if ( &Block[1] != (void **)v4 )
  4408.         {
  4409.           sub_180006510(
  4410.             (unsigned __int64 *)&Block[1],
  4411.             *(char **)(a1 + 8),
  4412.             (__int64)(*(_QWORD *)(a1 + 16) - *(_QWORD *)(a1 + 8)) >> 2);
  4413.           *(_QWORD *)&v21 = *(_QWORD *)(a1 + 32);
  4414.         }
  4415.         if ( (__int128 *)((char *)&v21 + 8) != v5 )
  4416.           sub_1800063C0(
  4417.             (unsigned __int64 *)&v21 + 1,
  4418.             *(char **)v5,
  4419.             (__int64)(*(_QWORD *)(a1 + 48) - *(_QWORD *)(a1 + 40)) >> 4);
  4420.         v9 = v11;
  4421.       }
  4422.     }
  4423.   }
  4424.   *(void **)a1 = Block[0];
  4425.   if ( v4 != (unsigned __int64 *)&Block[1] )
  4426.   {
  4427.     sub_180006510(v4, (char *)Block[1], (__int64)(v20 - (unsigned __int64)Block[1]) >> 2);
  4428.     *(_QWORD *)(a1 + 32) = v21;
  4429.   }
  4430.   if ( v5 != (__int128 *)((char *)&v21 + 8) )
  4431.     sub_1800063C0((unsigned __int64 *)(a1 + 40), *((char **)&v21 + 1), (__int64)(v22 - *((_QWORD *)&v21 + 1)) >> 4);
  4432.   v6 = 1;
  4433.   v12 = (void *)*((_QWORD *)&v21 + 1);
  4434.   if ( *((_QWORD *)&v21 + 1) )
  4435.   {
  4436.     if ( ((*((_QWORD *)&v22 + 1) - *((_QWORD *)&v21 + 1)) & 0xFFFFFFFFFFFFFFF0ui64) >= 0x1000 )
  4437.     {
  4438.       v12 = *(void **)(*((_QWORD *)&v21 + 1) - 8i64);
  4439.       if ( (unsigned __int64)(*((_QWORD *)&v21 + 1) - (_QWORD)v12 - 8i64) > 0x1F )
  4440. LABEL_44:
  4441.         invalid_parameter_noinfo_noreturn();
  4442.     }
  4443.     j_j_free(v12);
  4444.     *((_QWORD *)&v21 + 1) = 0i64;
  4445.     v22 = 0i64;
  4446.   }
  4447.   v13 = Block[1];
  4448.   if ( Block[1] )
  4449.   {
  4450.     if ( (unsigned __int64)(4 * ((__int64)(*((_QWORD *)&v20 + 1) - (unsigned __int64)Block[1]) >> 2)) >= 0x1000 )
  4451.     {
  4452.       v13 = (void *)*((_QWORD *)Block[1] - 1);
  4453.       if ( (unsigned __int64)(Block[1] - v13 - 8) > 0x1F )
  4454.         goto LABEL_44;
  4455.     }
  4456.     j_j_free(v13);
  4457.     Block[1] = 0i64;
  4458.     v20 = 0i64;
  4459.   }
  4460. LABEL_10:
  4461.   v7 = (void *)*((_QWORD *)&v17 + 1);
  4462.   if ( *((_QWORD *)&v17 + 1) )
  4463.   {
  4464.     if ( ((*((_QWORD *)&v18 + 1) - *((_QWORD *)&v17 + 1)) & 0xFFFFFFFFFFFFFFF0ui64) >= 0x1000 )
  4465.     {
  4466.       v7 = *(void **)(*((_QWORD *)&v17 + 1) - 8i64);
  4467.       if ( (unsigned __int64)(*((_QWORD *)&v17 + 1) - (_QWORD)v7 - 8i64) > 0x1F )
  4468. LABEL_17:
  4469.         invalid_parameter_noinfo_noreturn();
  4470.     }
  4471.     j_j_free(v7);
  4472.     *((_QWORD *)&v17 + 1) = 0i64;
  4473.     v18 = 0i64;
  4474.   }
  4475.   v8 = v15[1];
  4476.   if ( v15[1] )
  4477.   {
  4478.     if ( ((*((_QWORD *)&v16 + 1) - (unsigned __int64)v15[1]) & 0xFFFFFFFFFFFFFFFCui64) >= 0x1000 )
  4479.     {
  4480.       v8 = (void *)*((_QWORD *)v15[1] - 1);
  4481.       if ( (unsigned __int64)(v15[1] - v8 - 8) > 0x1F )
  4482.         goto LABEL_17;
  4483.     }
  4484.     j_j_free(v8);
  4485.   }
  4486.   return v6;
  4487. }
  4488. // 180004740: using guessed type __int64 __fastcall sub_180004740(_QWORD, _QWORD);
  4489.  
  4490. //----- (0000000180005A00) ----------------------------------------------------
  4491. __int64 __fastcall sub_180005A00(__int64 a1, __int64 a2, char a3, int a4)
  4492. {
  4493.   unsigned __int8 v9; // r14
  4494.   __int64 v10; // rsi
  4495.   void **v11; // rcx
  4496.   void *v12; // rax
  4497.   bool v13; // r12
  4498.   int v14; // eax
  4499.   int v15; // er15
  4500.   __int64 v16; // rdx
  4501.   void *v17; // rcx
  4502.   void *v18; // rcx
  4503.   int v19; // [rsp+20h] [rbp-49h]
  4504.   void **v20; // [rsp+28h] [rbp-41h]
  4505.   __int64 v21[2]; // [rsp+30h] [rbp-39h] BYREF
  4506.   void *Block[2]; // [rsp+40h] [rbp-29h] BYREF
  4507.   __int128 v23; // [rsp+50h] [rbp-19h]
  4508.   __int128 v24; // [rsp+60h] [rbp-9h] BYREF
  4509.   __int128 v25; // [rsp+70h] [rbp+7h]
  4510.  
  4511.   if ( *(_DWORD *)(a2 + 52) == 1 )
  4512.     return sub_1800073C0((void **)a1, a2, a3);
  4513.   v9 = 0;
  4514.   *(_OWORD *)Block = 0i64;
  4515.   v23 = 0i64;
  4516.   v24 = 0i64;
  4517.   v25 = 0i64;
  4518.   sub_180006650(Block, (_QWORD *)a1);
  4519.   v10 = *(_QWORD *)(a1 + 128) + 16i64 * *(unsigned int *)(a2 + 48);
  4520.   v19 = *(_DWORD *)v10;
  4521.   v11 = *(void ***)(v10 + 8);
  4522.   v20 = v11;
  4523.   v12 = *(void **)a1;
  4524.   v21[0] = *(_QWORD *)a1;
  4525.   v13 = !a4 || *v11 != v12;
  4526.   v14 = *(_DWORD *)(a2 + 36);
  4527.   if ( v14 >= 0 && v14 <= a4 )
  4528.   {
  4529.     v15 = v19;
  4530. LABEL_29:
  4531.     v16 = *(_QWORD *)(*(_QWORD *)(a2 + 40) + 16i64);
  4532. LABEL_30:
  4533.     v9 = sub_180004740(a1, v16);
  4534.     if ( v9 )
  4535.       goto LABEL_38;
  4536.     goto LABEL_33;
  4537.   }
  4538.   if ( a4 < *(_DWORD *)(a2 + 32) )
  4539.   {
  4540.     if ( !v13 )
  4541.     {
  4542.       v16 = *(_QWORD *)(*(_QWORD *)(a2 + 40) + 16i64);
  4543.       v15 = v19;
  4544.       goto LABEL_30;
  4545.     }
  4546.     goto LABEL_20;
  4547.   }
  4548.   if ( a3 )
  4549.   {
  4550.     if ( v13 )
  4551.     {
  4552.       *(_DWORD *)v10 = a4 + 1;
  4553.       *(_QWORD *)(v10 + 8) = v21;
  4554.       v9 = sub_180004740(a1, *(_QWORD *)(a2 + 16));
  4555.       if ( v9 )
  4556.         goto LABEL_37;
  4557.       v11 = v20;
  4558.     }
  4559.     else if ( a4 > 1 )
  4560.     {
  4561.       goto LABEL_32;
  4562.     }
  4563.     v15 = v19;
  4564.     *(_DWORD *)v10 = v19;
  4565.     *(_QWORD *)(v10 + 8) = v11;
  4566.     *(void **)a1 = Block[0];
  4567.     if ( (void **)(a1 + 8) != &Block[1] )
  4568.     {
  4569.       sub_180006510((unsigned __int64 *)(a1 + 8), (char *)Block[1], (__int64)(v23 - (unsigned __int64)Block[1]) >> 2);
  4570.       *(_QWORD *)(a1 + 32) = v24;
  4571.     }
  4572.     if ( (__int128 *)(a1 + 40) != (__int128 *)((char *)&v24 + 8) )
  4573.       sub_1800063C0((unsigned __int64 *)(a1 + 40), *((char **)&v24 + 1), (__int64)(v25 - *((_QWORD *)&v24 + 1)) >> 4);
  4574.     goto LABEL_29;
  4575.   }
  4576.   v9 = sub_180004740(a1, *(_QWORD *)(*(_QWORD *)(a2 + 40) + 16i64));
  4577.   if ( v9 )
  4578.   {
  4579. LABEL_37:
  4580.     v15 = v19;
  4581.     goto LABEL_38;
  4582.   }
  4583.   if ( v13 )
  4584.   {
  4585.     *(void **)a1 = Block[0];
  4586.     if ( (void **)(a1 + 8) != &Block[1] )
  4587.     {
  4588.       sub_180006510((unsigned __int64 *)(a1 + 8), (char *)Block[1], (__int64)(v23 - (unsigned __int64)Block[1]) >> 2);
  4589.       *(_QWORD *)(a1 + 32) = v24;
  4590.     }
  4591.     if ( (__int128 *)(a1 + 40) != (__int128 *)((char *)&v24 + 8) )
  4592.       sub_1800063C0((unsigned __int64 *)(a1 + 40), *((char **)&v24 + 1), (__int64)(v25 - *((_QWORD *)&v24 + 1)) >> 4);
  4593. LABEL_20:
  4594.     *(_DWORD *)v10 = a4 + 1;
  4595.     *(_QWORD *)(v10 + 8) = v21;
  4596.     v16 = *(_QWORD *)(a2 + 16);
  4597.     v15 = v19;
  4598.     goto LABEL_30;
  4599.   }
  4600. LABEL_32:
  4601.   v15 = v19;
  4602. LABEL_33:
  4603.   *(void **)a1 = Block[0];
  4604.   if ( (void **)(a1 + 8) != &Block[1] )
  4605.   {
  4606.     sub_180006510((unsigned __int64 *)(a1 + 8), (char *)Block[1], (__int64)(v23 - (unsigned __int64)Block[1]) >> 2);
  4607.     *(_QWORD *)(a1 + 32) = v24;
  4608.   }
  4609.   if ( (__int128 *)(a1 + 40) != (__int128 *)((char *)&v24 + 8) )
  4610.     sub_1800063C0((unsigned __int64 *)(a1 + 40), *((char **)&v24 + 1), (__int64)(v25 - *((_QWORD *)&v24 + 1)) >> 4);
  4611. LABEL_38:
  4612.   *(_DWORD *)v10 = v15;
  4613.   *(_QWORD *)(v10 + 8) = v20;
  4614.   v17 = (void *)*((_QWORD *)&v24 + 1);
  4615.   if ( *((_QWORD *)&v24 + 1) )
  4616.   {
  4617.     if ( ((*((_QWORD *)&v25 + 1) - *((_QWORD *)&v24 + 1)) & 0xFFFFFFFFFFFFFFF0ui64) >= 0x1000 )
  4618.     {
  4619.       v17 = *(void **)(*((_QWORD *)&v24 + 1) - 8i64);
  4620.       if ( (unsigned __int64)(*((_QWORD *)&v24 + 1) - (_QWORD)v17 - 8i64) > 0x1F )
  4621. LABEL_45:
  4622.         invalid_parameter_noinfo_noreturn();
  4623.     }
  4624.     j_j_free(v17);
  4625.     *((_QWORD *)&v24 + 1) = 0i64;
  4626.     v25 = 0i64;
  4627.   }
  4628.   v18 = Block[1];
  4629.   if ( Block[1] )
  4630.   {
  4631.     if ( ((*((_QWORD *)&v23 + 1) - (unsigned __int64)Block[1]) & 0xFFFFFFFFFFFFFFFCui64) >= 0x1000 )
  4632.     {
  4633.       v18 = (void *)*((_QWORD *)Block[1] - 1);
  4634.       if ( (unsigned __int64)(Block[1] - v18 - 8) > 0x1F )
  4635.         goto LABEL_45;
  4636.     }
  4637.     j_j_free(v18);
  4638.   }
  4639.   return v9;
  4640. }
  4641. // 180004740: using guessed type __int64 __fastcall sub_180004740(_QWORD, _QWORD);
  4642.  
  4643. //----- (0000000180005D40) ----------------------------------------------------
  4644. char __fastcall sub_180005D40(__int64 *a1, __int64 a2)
  4645. {
  4646.   __int64 **v2; // rsi
  4647.   unsigned __int16 v5; // r12
  4648.   unsigned int v6; // ebx
  4649.   unsigned int *v7; // rdi
  4650.   __int64 v8; // rbp
  4651.   unsigned int v9; // esi
  4652.   unsigned int v10; // er11
  4653.   unsigned __int64 v11; // r10
  4654.   unsigned __int16 *v12; // r9
  4655.   unsigned __int64 v13; // rax
  4656.   _WORD *v14; // r8
  4657.   __int16 v15; // cx
  4658.   unsigned __int16 v16; // dx
  4659.   __int64 v17; // r8
  4660.   unsigned int v18; // er9
  4661.   __int64 v19; // r8
  4662.   __int64 v20; // r9
  4663.   bool v21; // zf
  4664.   char v22; // cl
  4665.   __int64 v23; // rax
  4666.   __int64 v24; // rdx
  4667.   unsigned int *v25; // rdx
  4668.   __int64 **v27; // [rsp+20h] [rbp-48h]
  4669.  
  4670.   v2 = (__int64 **)(a1 + 26);
  4671.   v27 = (__int64 **)(a1 + 26);
  4672.   v5 = *(_WORD *)*a1;
  4673.   if ( (a1[23] & 0x100) != 0 )
  4674.     v5 = std::ctype<wchar_t>::tolower((*v2)[1], v5);
  4675.   else
  4676.     v27 = (__int64 **)(a1 + 26);
  4677.   v6 = 0;
  4678.   v7 = *(unsigned int **)(a2 + 32);
  4679.   v8 = *a1 + 2;
  4680.   if ( !v7 )
  4681.   {
  4682. LABEL_16:
  4683.     if ( *(_QWORD *)(a2 + 56) )
  4684.     {
  4685.       v16 = v5;
  4686.       if ( (a1[23] & 0x800) != 0 )
  4687.         v16 = sub_180006740(*v2, v5);
  4688.       v17 = *(_QWORD *)(a2 + 56);
  4689.       v18 = *(_DWORD *)(v17 + 4);
  4690.       if ( v18 )
  4691.       {
  4692.         v19 = *(_QWORD *)(v17 + 8);
  4693.         while ( *(_WORD *)(v19 + 2i64 * v6) > v16 || v16 > *(_WORD *)(v19 + 2i64 * (v6 + 1)) )
  4694.         {
  4695.           v6 += 2;
  4696.           if ( v6 >= v18 )
  4697.             goto LABEL_24;
  4698.         }
  4699.         goto LABEL_40;
  4700.       }
  4701.     }
  4702. LABEL_24:
  4703.     if ( v5 >= 0x100u )
  4704.     {
  4705.       v23 = *(_QWORD *)(a2 + 48);
  4706.       if ( v23
  4707.         && sub_18000A0E0(
  4708.              *(const __m128i **)(v23 + 8),
  4709.              (const __m128i *)(*(_QWORD *)(v23 + 8) + 2i64 * *(unsigned int *)(v23 + 4)),
  4710.              v5) != (const __m128i *)(*(_QWORD *)(*(_QWORD *)(a2 + 48) + 8i64)
  4711.                                     + 2i64 * *(unsigned int *)(*(_QWORD *)(a2 + 48) + 4i64)) )
  4712.       {
  4713.         v22 = 1;
  4714.         goto LABEL_42;
  4715.       }
  4716.       v24 = *(unsigned __int16 *)(a2 + 64);
  4717.       if ( (_WORD)v24 )
  4718.       {
  4719.         if ( (_WORD)v24 == 0xFFFF )
  4720.           v24 = 263i64;
  4721.         if ( (unsigned __int8)std::ctype<wchar_t>::is((*v2)[1], v24, v5) )
  4722.         {
  4723.           v22 = 1;
  4724.           goto LABEL_42;
  4725.         }
  4726.       }
  4727.       v25 = *(unsigned int **)(a2 + 72);
  4728.       if ( !v25 )
  4729.         goto LABEL_41;
  4730.       v21 = (unsigned __int8)sub_180007800(v5, v25, *v2) == 0;
  4731.     }
  4732.     else
  4733.     {
  4734.       v20 = *(_QWORD *)(a2 + 40);
  4735.       if ( !v20 )
  4736.         goto LABEL_41;
  4737.       v21 = ((unsigned __int8)(1 << (v5 & 7)) & *(_BYTE *)(((unsigned __int64)v5 >> 3) + v20)) == 0;
  4738.     }
  4739.     if ( !v21 )
  4740.     {
  4741. LABEL_40:
  4742.       v22 = 1;
  4743.       goto LABEL_42;
  4744.     }
  4745. LABEL_41:
  4746.     v22 = 0;
  4747.     goto LABEL_42;
  4748.   }
  4749.   v8 = a1[20];
  4750.   while ( 1 )
  4751.   {
  4752.     v9 = v7[3];
  4753.     v10 = 0;
  4754.     if ( v9 )
  4755.       break;
  4756. LABEL_14:
  4757.     v7 = (unsigned int *)*((_QWORD *)v7 + 3);
  4758.     if ( !v7 )
  4759.       goto LABEL_15;
  4760.   }
  4761.   v11 = *v7;
  4762.   while ( 1 )
  4763.   {
  4764.     v12 = (unsigned __int16 *)*a1;
  4765.     v13 = 0i64;
  4766.     if ( *v7 )
  4767.     {
  4768.       v14 = (_WORD *)(*((_QWORD *)v7 + 2) + 2i64 * v10);
  4769.       do
  4770.       {
  4771.         v15 = *v12++;
  4772.         if ( v15 != *v14 )
  4773.           break;
  4774.         ++v13;
  4775.         ++v14;
  4776.       }
  4777.       while ( v13 < v11 );
  4778.     }
  4779.     if ( v12 == (unsigned __int16 *)v8 )
  4780.       break;
  4781.     v10 += v11;
  4782.     if ( v10 >= v9 )
  4783.       goto LABEL_14;
  4784.   }
  4785.   if ( v8 == *a1 )
  4786.   {
  4787. LABEL_15:
  4788.     v8 = *a1 + 2;
  4789.     v2 = v27;
  4790.     goto LABEL_16;
  4791.   }
  4792.   v22 = 1;
  4793. LABEL_42:
  4794.   if ( v22 == (*(_BYTE *)(a2 + 12) & 1) )
  4795.     return 0;
  4796.   *a1 = v8;
  4797.   return 1;
  4798. }
  4799. // 18000C0C8: using guessed type __int64 __fastcall std::ctype<wchar_t>::tolower(_QWORD, _QWORD);
  4800. // 18000C0D0: using guessed type __int64 __fastcall std::ctype<wchar_t>::is(_QWORD, _QWORD, _QWORD);
  4801.  
  4802. //----- (0000000180005F70) ----------------------------------------------------
  4803. bool __fastcall sub_180005F70(__int64 a1)
  4804. {
  4805.   unsigned int v1; // ebx
  4806.   unsigned int v2; // eax
  4807.   __int64 v4; // rdi
  4808.   unsigned __int64 v5; // r10
  4809.   int v6; // edx
  4810.   __int64 v7; // r10
  4811.   __int64 v8; // r11
  4812.   __int64 v9; // rcx
  4813.   __int64 v10; // rdx
  4814.   __int64 v11; // rdx
  4815.   __int64 v12; // rcx
  4816.  
  4817.   v1 = *(_DWORD *)(a1 + 196);
  4818.   v2 = 0;
  4819.   if ( !v1 )
  4820.     return 0;
  4821.   v4 = *(_QWORD *)(a1 + 72);
  4822.   while ( 1 )
  4823.   {
  4824.     v5 = 4 * ((unsigned __int64)v2 >> 5);
  4825.     v6 = 1 << (v2 & 0x1F);
  4826.     if ( (v6 & *(_DWORD *)(v5 + v4)) == 0 || (v6 & *(_DWORD *)(v5 + *(_QWORD *)(a1 + 8))) == 0 )
  4827.       goto LABEL_7;
  4828.     v7 = *(_QWORD *)(a1 + 104);
  4829.     v8 = *(_QWORD *)(a1 + 40);
  4830.     v9 = *(_QWORD *)(v7 + 16i64 * v2);
  4831.     v10 = *(_QWORD *)(v8 + 16i64 * v2);
  4832.     if ( v9 != v10 )
  4833.       return (__int64)((v9 - *(_QWORD *)(a1 + 152)) & 0xFFFFFFFFFFFFFFFEui64) < (__int64)((v10 - *(_QWORD *)(a1 + 152)) & 0xFFFFFFFFFFFFFFFEui64);
  4834.     v11 = *(_QWORD *)(v7 + 16i64 * v2 + 8);
  4835.     v12 = *(_QWORD *)(v8 + 16i64 * v2 + 8);
  4836.     if ( v11 != v12 )
  4837.       return (__int64)((v11 - *(_QWORD *)(a1 + 152)) & 0xFFFFFFFFFFFFFFFEui64) < (__int64)((v12 - *(_QWORD *)(a1 + 152)) & 0xFFFFFFFFFFFFFFFEui64);
  4838. LABEL_7:
  4839.     if ( ++v2 >= v1 )
  4840.       return 0;
  4841.   }
  4842. }
  4843.  
  4844. //----- (0000000180006050) ----------------------------------------------------
  4845. bool __fastcall sub_180006050(unsigned __int16 **a1)
  4846. {
  4847.   int v1; // eax
  4848.   unsigned __int16 *v2; // rdx
  4849.   unsigned int v4; // eax
  4850.   unsigned __int16 *v5; // rdx
  4851.   unsigned int v6; // eax
  4852.   bool v7; // r8
  4853.   unsigned int v8; // eax
  4854.  
  4855.   v1 = *((_DWORD *)a1 + 47);
  4856.   if ( (v1 & 0x100) == 0 )
  4857.   {
  4858.     v2 = *a1;
  4859.     if ( *a1 == a1[19] )
  4860.     {
  4861.       if ( v2 == a1[20] )
  4862.         return (v1 & 0xC) == 0;
  4863.       if ( (v1 & 4) == 0 )
  4864.       {
  4865.         v4 = *v2;
  4866.         return v4 <= 0x7A && byte_18000C8E0[(unsigned __int8)v4];
  4867.       }
  4868.       return 0;
  4869.     }
  4870.   }
  4871.   v5 = *a1;
  4872.   if ( *a1 == a1[20] )
  4873.   {
  4874.     if ( (v1 & 8) == 0 )
  4875.     {
  4876.       v4 = *(v5 - 1);
  4877.       return v4 <= 0x7A && byte_18000C8E0[(unsigned __int8)v4];
  4878.     }
  4879.     return 0;
  4880.   }
  4881.   v6 = *(v5 - 1);
  4882.   v7 = v6 <= 0x7A && byte_18000C8E0[(unsigned __int8)v6];
  4883.   v8 = *v5;
  4884.   if ( v8 <= 0x7A && byte_18000C8E0[(unsigned __int8)v8] )
  4885.     return !v7;
  4886.   else
  4887.     return v7;
  4888. }
  4889. // 18000C8E0: using guessed type _BYTE byte_18000C8E0[256];
  4890.  
  4891. //----- (00000001800060F0) ----------------------------------------------------
  4892. __int16 *__fastcall sub_1800060F0(__int16 *a1, __int16 *a2, __int16 *a3, __int16 *a4, __int64 *a5, __int16 a6)
  4893. {
  4894.   __int16 *v9; // rbp
  4895.   __int16 *i; // r12
  4896.   bool v11; // zf
  4897.   unsigned __int16 v12; // di
  4898.   __int16 v13; // si
  4899.   __int16 v14; // di
  4900.   __int16 v15; // si
  4901.   __int16 *v16; // rdx
  4902.   bool v17; // zf
  4903.   __int16 v18; // cx
  4904.   __int16 v19; // ax
  4905.  
  4906.   v9 = a1;
  4907.   if ( (a6 & 0x100) != 0 )
  4908.   {
  4909.     for ( i = a1; i != a2; ++i )
  4910.     {
  4911.       v11 = a3 == a4;
  4912.       if ( a3 == a4 )
  4913.         goto LABEL_7;
  4914.       v12 = *a3;
  4915.       v13 = std::ctype<wchar_t>::tolower(a5[1], (unsigned __int16)*i);
  4916.       ++a3;
  4917.       if ( v13 != (unsigned __int16)std::ctype<wchar_t>::tolower(a5[1], v12) )
  4918.         return v9;
  4919.     }
  4920. LABEL_6:
  4921.     v11 = a3 == a4;
  4922. LABEL_7:
  4923.     if ( v11 )
  4924.       return i;
  4925.     return v9;
  4926.   }
  4927.   if ( (a6 & 0x800) != 0 )
  4928.   {
  4929.     i = a1;
  4930.     if ( a1 != a2 )
  4931.     {
  4932.       while ( 1 )
  4933.       {
  4934.         v11 = a3 == a4;
  4935.         if ( a3 == a4 )
  4936.           break;
  4937.         v14 = *a3;
  4938.         v15 = sub_180006740(a5, *i++);
  4939.         ++a3;
  4940.         if ( v15 != (unsigned __int16)sub_180006740(a5, v14) )
  4941.           return v9;
  4942.         if ( i == a2 )
  4943.         {
  4944.           if ( a3 == a4 )
  4945.             return i;
  4946.           return v9;
  4947.         }
  4948.       }
  4949.       goto LABEL_7;
  4950.     }
  4951.     goto LABEL_6;
  4952.   }
  4953.   v16 = a1;
  4954.   if ( a1 == a2 )
  4955.   {
  4956. LABEL_22:
  4957.     v17 = a3 == a4;
  4958.   }
  4959.   else
  4960.   {
  4961.     while ( 1 )
  4962.     {
  4963.       v17 = a3 == a4;
  4964.       if ( a3 == a4 )
  4965.         break;
  4966.       v18 = *v16++;
  4967.       v19 = *a3++;
  4968.       if ( v18 != v19 )
  4969.         return v9;
  4970.       if ( v16 == a2 )
  4971.         goto LABEL_22;
  4972.     }
  4973.   }
  4974.   if ( v17 )
  4975.     return v16;
  4976.   return v9;
  4977. }
  4978. // 18000C0C8: using guessed type __int64 __fastcall std::ctype<wchar_t>::tolower(_QWORD, _QWORD);
  4979.  
  4980. //----- (0000000180006230) ----------------------------------------------------
  4981. char *__fastcall sub_180006230(__int64 a1, unsigned __int64 a2, _DWORD *a3)
  4982. {
  4983.   __int64 v6; // r15
  4984.   unsigned __int64 v7; // rcx
  4985.   __int64 v8; // r15
  4986.   unsigned __int64 v9; // rdx
  4987.   unsigned __int64 v10; // rax
  4988.   unsigned __int64 v11; // rsi
  4989.   void *v12; // rax
  4990.   _QWORD *v13; // rbx
  4991.   _DWORD *v14; // rcx
  4992.   unsigned __int64 v15; // rdx
  4993.   void *v16; // rcx
  4994.   char *result; // rax
  4995.  
  4996.   if ( a2 > 0x3FFFFFFFFFFFFFFFi64 )
  4997.     sub_1800033B0();
  4998.   v6 = *(_QWORD *)(a1 + 8) - *(_QWORD *)a1;
  4999.   v7 = (__int64)(*(_QWORD *)(a1 + 16) - *(_QWORD *)a1) >> 2;
  5000.   v8 = v6 >> 2;
  5001.   v9 = v7 >> 1;
  5002.   if ( v7 > 0x3FFFFFFFFFFFFFFFi64 - (v7 >> 1) )
  5003.     goto LABEL_25;
  5004.   v10 = v9 + v7;
  5005.   if ( v9 + v7 >= a2 )
  5006.   {
  5007.     if ( v10 > 0x3FFFFFFFFFFFFFFFi64 )
  5008.       goto LABEL_25;
  5009.   }
  5010.   else
  5011.   {
  5012.     v10 = a2;
  5013.   }
  5014.   v11 = 4 * v10;
  5015.   if ( 4 * v10 < 0x1000 )
  5016.   {
  5017.     if ( v11 )
  5018.       v13 = sub_18000A224(4 * v10);
  5019.     else
  5020.       v13 = 0i64;
  5021.     goto LABEL_13;
  5022.   }
  5023.   if ( v11 + 39 <= v11 )
  5024. LABEL_25:
  5025.     Concurrency::cancel_current_task();
  5026.   v12 = sub_18000A224(v11 + 39);
  5027.   if ( !v12 )
  5028.     goto LABEL_23;
  5029.   v13 = (_QWORD *)(((unsigned __int64)v12 + 39) & 0xFFFFFFFFFFFFFFE0ui64);
  5030.   *(v13 - 1) = v12;
  5031. LABEL_13:
  5032.   v14 = (_DWORD *)v13 + v8;
  5033.   v15 = a2 - v8;
  5034.   if ( *a3 )
  5035.   {
  5036.     for ( ; v15; --v15 )
  5037.       *v14++ = *a3;
  5038.   }
  5039.   else
  5040.   {
  5041.     memset(v14, 0, 4 * v15);
  5042.   }
  5043.   memmove(v13, *(const void **)a1, *(_QWORD *)(a1 + 8) - *(_QWORD *)a1);
  5044.   v16 = *(void **)a1;
  5045.   if ( *(_QWORD *)a1 )
  5046.   {
  5047.     if ( ((*(_QWORD *)(a1 + 16) - (_QWORD)v16) & 0xFFFFFFFFFFFFFFFCui64) < 0x1000 )
  5048.     {
  5049. LABEL_21:
  5050.       j_j_free(v16);
  5051.       goto LABEL_22;
  5052.     }
  5053.     if ( (unsigned __int64)v16 - *((_QWORD *)v16 - 1) - 8 <= 0x1F )
  5054.     {
  5055.       v16 = (void *)*((_QWORD *)v16 - 1);
  5056.       goto LABEL_21;
  5057.     }
  5058. LABEL_23:
  5059.     invalid_parameter_noinfo_noreturn();
  5060.   }
  5061. LABEL_22:
  5062.   *(_QWORD *)a1 = v13;
  5063.   *(_QWORD *)(a1 + 8) = (char *)v13 + 4 * a2;
  5064.   result = (char *)v13 + v11;
  5065.   *(_QWORD *)(a1 + 16) = (char *)v13 + v11;
  5066.   return result;
  5067. }
  5068.  
  5069. //----- (00000001800063C0) ----------------------------------------------------
  5070. char *__fastcall sub_1800063C0(unsigned __int64 *a1, char *a2, unsigned __int64 a3)
  5071. {
  5072.   char *v3; // rsi
  5073.   unsigned __int64 v7; // rdx
  5074.   unsigned __int64 v8; // rbx
  5075.   unsigned __int64 v9; // rcx
  5076.   unsigned __int64 v10; // rbx
  5077.   size_t v11; // rdi
  5078.   char *result; // rax
  5079.   unsigned __int64 v13; // rbp
  5080.   char *v14; // rbx
  5081.   size_t v15; // rdi
  5082.   __int64 v16; // rdi
  5083.  
  5084.   v3 = (char *)*a1;
  5085.   v7 = (__int64)(a1[2] - *a1) >> 4;
  5086.   if ( a3 <= v7 )
  5087.   {
  5088.     v13 = (__int64)(a1[1] - (_QWORD)v3) >> 4;
  5089.     if ( a3 <= v13 )
  5090.     {
  5091.       v16 = 16 * a3;
  5092.       memmove(v3, a2, 16 * a3);
  5093.       result = &v3[v16];
  5094.     }
  5095.     else
  5096.     {
  5097.       memmove(v3, a2, 16 * v13);
  5098.       v14 = (char *)a1[1];
  5099.       v15 = 16 * (a3 - v13);
  5100.       memmove(v14, &a2[16 * v13], v15);
  5101.       result = &v14[v15];
  5102.     }
  5103.     a1[1] = (unsigned __int64)result;
  5104.   }
  5105.   else
  5106.   {
  5107.     v8 = 0xFFFFFFFFFFFFFFFi64;
  5108.     if ( a3 > 0xFFFFFFFFFFFFFFFi64 )
  5109.       sub_1800033B0();
  5110.     v9 = v7 >> 1;
  5111.     if ( v7 <= 0xFFFFFFFFFFFFFFFi64 - (v7 >> 1) )
  5112.     {
  5113.       v8 = v9 + v7;
  5114.       if ( v9 + v7 < a3 )
  5115.         v8 = a3;
  5116.     }
  5117.     if ( v3 )
  5118.     {
  5119.       if ( 16 * v7 >= 0x1000 )
  5120.       {
  5121.         if ( (unsigned __int64)&v3[-*((_QWORD *)v3 - 1) - 8] > 0x1F )
  5122.           invalid_parameter_noinfo_noreturn();
  5123.         v3 = (char *)*((_QWORD *)v3 - 1);
  5124.       }
  5125.       j_j_free(v3);
  5126.       *a1 = 0i64;
  5127.       a1[1] = 0i64;
  5128.       a1[2] = 0i64;
  5129.     }
  5130.     sub_180006900(a1, v8);
  5131.     v10 = *a1;
  5132.     v11 = 16 * a3;
  5133.     memmove((void *)*a1, a2, v11);
  5134.     result = (char *)(v11 + v10);
  5135.     a1[1] = v11 + v10;
  5136.   }
  5137.   return result;
  5138. }
  5139.  
  5140. //----- (0000000180006510) ----------------------------------------------------
  5141. char *__fastcall sub_180006510(unsigned __int64 *a1, char *a2, unsigned __int64 a3)
  5142. {
  5143.   char *v3; // rdi
  5144.   char *v6; // r15
  5145.   unsigned __int64 v7; // rcx
  5146.   unsigned __int64 v8; // rbx
  5147.   unsigned __int64 v9; // rdx
  5148.   size_t v10; // rbx
  5149.   void *v11; // rcx
  5150.   unsigned __int64 v12; // rbp
  5151.   char *result; // rax
  5152.  
  5153.   v3 = (char *)*a1;
  5154.   v6 = a2;
  5155.   v7 = (__int64)(a1[2] - *a1) >> 2;
  5156.   if ( a3 <= v7 )
  5157.   {
  5158.     v11 = v3;
  5159.     v12 = (__int64)(a1[1] - (_QWORD)v3) >> 2;
  5160.     if ( a3 <= v12 )
  5161.     {
  5162.       v10 = 4 * a3;
  5163.     }
  5164.     else
  5165.     {
  5166.       memmove(v3, a2, 4 * v12);
  5167.       v3 = (char *)a1[1];
  5168.       a2 = &v6[4 * v12];
  5169.       v11 = v3;
  5170.       v10 = 4 * (a3 - v12);
  5171.     }
  5172.     memmove(v11, a2, v10);
  5173.   }
  5174.   else
  5175.   {
  5176.     v8 = 0x3FFFFFFFFFFFFFFFi64;
  5177.     if ( a3 > 0x3FFFFFFFFFFFFFFFi64 )
  5178.       sub_1800033B0();
  5179.     v9 = v7 >> 1;
  5180.     if ( v7 <= 0x3FFFFFFFFFFFFFFFi64 - (v7 >> 1) )
  5181.     {
  5182.       v8 = v9 + v7;
  5183.       if ( v9 + v7 < a3 )
  5184.         v8 = a3;
  5185.     }
  5186.     if ( v3 )
  5187.     {
  5188.       if ( 4 * v7 >= 0x1000 )
  5189.       {
  5190.         if ( (unsigned __int64)&v3[-*((_QWORD *)v3 - 1) - 8] > 0x1F )
  5191.           invalid_parameter_noinfo_noreturn();
  5192.         v3 = (char *)*((_QWORD *)v3 - 1);
  5193.       }
  5194.       j_j_free(v3);
  5195.       *a1 = 0i64;
  5196.       a1[1] = 0i64;
  5197.       a1[2] = 0i64;
  5198.     }
  5199.     sub_180004F50(a1, v8);
  5200.     v3 = (char *)*a1;
  5201.     v10 = 4 * a3;
  5202.     memmove((void *)*a1, v6, 4 * a3);
  5203.   }
  5204.   result = &v3[v10];
  5205.   a1[1] = (unsigned __int64)&v3[v10];
  5206.   return result;
  5207. }
  5208.  
  5209. //----- (0000000180006650) ----------------------------------------------------
  5210. _QWORD *__fastcall sub_180006650(_QWORD *a1, _QWORD *a2)
  5211. {
  5212.   unsigned __int64 v4; // rax
  5213.   unsigned __int64 v5; // rbx
  5214.   size_t v6; // rbx
  5215.   void *v7; // rax
  5216.   void *v8; // rcx
  5217.   char *v9; // rdi
  5218.   const void *v10; // rdx
  5219.   size_t v11; // rbx
  5220.  
  5221.   sub_180004EA0(a1, a2);
  5222.   v4 = 0i64;
  5223.   a1[5] = 0i64;
  5224.   a1[6] = 0i64;
  5225.   a1[7] = 0i64;
  5226.   v5 = (__int64)(a2[6] - a2[5]) >> 4;
  5227.   if ( v5 )
  5228.   {
  5229.     if ( v5 > 0xFFFFFFFFFFFFFFFi64 )
  5230.       sub_1800033B0();
  5231.     v6 = 16 * v5;
  5232.     if ( v6 < 0x1000 )
  5233.     {
  5234.       if ( v6 )
  5235.         v4 = (unsigned __int64)sub_18000A224(v6);
  5236.     }
  5237.     else
  5238.     {
  5239.       if ( v6 + 39 <= v6 )
  5240.         Concurrency::cancel_current_task();
  5241.       v7 = sub_18000A224(v6 + 39);
  5242.       v8 = v7;
  5243.       if ( !v7 )
  5244.         invalid_parameter_noinfo_noreturn();
  5245.       v4 = ((unsigned __int64)v7 + 39) & 0xFFFFFFFFFFFFFFE0ui64;
  5246.       *(_QWORD *)(v4 - 8) = v8;
  5247.     }
  5248.     a1[5] = v4;
  5249.     a1[6] = v4;
  5250.     a1[7] = v6 + v4;
  5251.     v9 = (char *)a1[5];
  5252.     v10 = (const void *)a2[5];
  5253.     v11 = a2[6] - (_QWORD)v10;
  5254.     memmove(v9, v10, v11);
  5255.     a1[6] = &v9[v11 & 0xFFFFFFFFFFFFFFF0ui64];
  5256.   }
  5257.   return a1;
  5258. }
  5259.  
  5260. //----- (0000000180006740) ----------------------------------------------------
  5261. __int64 __fastcall sub_180006740(__int64 *a1, __int16 a2)
  5262. {
  5263.   __int64 v2; // rcx
  5264.   void *v3; // rcx
  5265.   void **v4; // rax
  5266.   unsigned __int16 v5; // bx
  5267.   __int16 v7; // [rsp+28h] [rbp-40h] BYREF
  5268.   char v8[6]; // [rsp+2Ah] [rbp-3Eh] BYREF
  5269.   void *Block[3]; // [rsp+30h] [rbp-38h] BYREF
  5270.   unsigned __int64 v10; // [rsp+48h] [rbp-20h]
  5271.  
  5272.   v2 = *a1;
  5273.   v7 = a2;
  5274.   (*(void (__fastcall **)(__int64, void **, __int16 *, char *))(*(_QWORD *)v2 + 32i64))(v2, Block, &v7, v8);
  5275.   v3 = Block[0];
  5276.   if ( Block[2] == (void *)1 )
  5277.   {
  5278.     v4 = Block;
  5279.     if ( v10 >= 8 )
  5280.       v4 = (void **)Block[0];
  5281.     v5 = *(_WORD *)v4;
  5282.   }
  5283.   else
  5284.   {
  5285.     v5 = v7;
  5286.   }
  5287.   if ( v10 >= 8 )
  5288.   {
  5289.     if ( 2 * v10 + 2 >= 0x1000 )
  5290.     {
  5291.       v3 = (void *)*((_QWORD *)Block[0] - 1);
  5292.       if ( (unsigned __int64)(Block[0] - v3 - 8) > 0x1F )
  5293.         invalid_parameter_noinfo_noreturn();
  5294.     }
  5295.     j_j_free(v3);
  5296.   }
  5297.   return v5;
  5298. }
  5299. // 180006740: using guessed type char var_3E[6];
  5300.  
  5301. //----- (00000001800067F0) ----------------------------------------------------
  5302. void *__fastcall sub_1800067F0(void *Block, char a2)
  5303. {
  5304.   __int64 v2; // rdi
  5305.   void **v5; // rbx
  5306.   void **v6; // rbx
  5307.   void **v7; // rbx
  5308.   __int64 v8; // rdi
  5309.   void **v9; // rbx
  5310.  
  5311.   v2 = *((_QWORD *)Block + 4);
  5312.   *(_QWORD *)Block = &std::_Node_class<wchar_t,std::regex_traits<wchar_t>>::`vftable';
  5313.  while ( v2 )
  5314.  {
  5315.    v5 = (void **)v2;
  5316.    v2 = *(_QWORD *)(v2 + 24);
  5317.    free(v5[2]);
  5318.    j_j_free(v5);
  5319.  }
  5320.  j_j_free(*((void **)Block + 5));
  5321.  v6 = (void **)*((_QWORD *)Block + 6);
  5322.  if ( v6 )
  5323.  {
  5324.    free(v6[1]);
  5325.    j_j_free(v6);
  5326.  }
  5327.  v7 = (void **)*((_QWORD *)Block + 7);
  5328.  if ( v7 )
  5329.  {
  5330.    free(v7[1]);
  5331.    j_j_free(v7);
  5332.  }
  5333.  v8 = *((_QWORD *)Block + 9);
  5334.  while ( v8 )
  5335.  {
  5336.    v9 = (void **)v8;
  5337.    v8 = *(_QWORD *)(v8 + 24);
  5338.    free(v9[2]);
  5339.    j_j_free(v9);
  5340.  }
  5341.  *(_QWORD *)Block = &std::_Node_base::`vftable';
  5342.   if ( (a2 & 1) != 0 )
  5343.     j_j_free(Block);
  5344.   return Block;
  5345. }
  5346. // 18000C7E8: using guessed type void *std::_Node_class<wchar_t,std::regex_traits<wchar_t>>::`vftable';
  5347. // 18000C8D8: using guessed type void *std::_Node_base::`vftable';
  5348.  
  5349. //----- (0000000180006900) ----------------------------------------------------
  5350. size_t __fastcall sub_180006900(unsigned __int64 *a1, unsigned __int64 a2)
  5351. {
  5352.   size_t v3; // rbx
  5353.   void *v4; // rax
  5354.   void *v5; // rcx
  5355.   unsigned __int64 v6; // rax
  5356.   size_t result; // rax
  5357.  
  5358.   if ( a2 > 0xFFFFFFFFFFFFFFFi64 )
  5359.     goto LABEL_11;
  5360.   v3 = 16 * a2;
  5361.   if ( 16 * a2 < 0x1000 )
  5362.   {
  5363.     if ( v3 )
  5364.       v6 = (unsigned __int64)sub_18000A224(v3);
  5365.     else
  5366.       v6 = 0i64;
  5367.     goto LABEL_10;
  5368.   }
  5369.   if ( v3 + 39 <= v3 )
  5370. LABEL_11:
  5371.     Concurrency::cancel_current_task();
  5372.   v4 = sub_18000A224(v3 + 39);
  5373.   v5 = v4;
  5374.   if ( !v4 )
  5375.     invalid_parameter_noinfo_noreturn();
  5376.   v6 = ((unsigned __int64)v4 + 39) & 0xFFFFFFFFFFFFFFE0ui64;
  5377.   *(_QWORD *)(v6 - 8) = v5;
  5378. LABEL_10:
  5379.   *a1 = v6;
  5380.   a1[1] = v6;
  5381.   result = v3 + v6;
  5382.   a1[2] = result;
  5383.   return result;
  5384. }
  5385.  
  5386. //----- (0000000180006990) ----------------------------------------------------
  5387. int __fastcall sub_180006990(__int64 a1)
  5388. {
  5389.   unsigned __int16 *v2; // rcx
  5390.   unsigned __int16 *v3; // rax
  5391.   _WORD *v4; // rdx
  5392.   int v5; // er8
  5393.   unsigned __int16 *v6; // rcx
  5394.   unsigned __int16 *v7; // rax
  5395.   _WORD *v8; // rdx
  5396.   int v9; // er8
  5397.  
  5398.   sub_180008630(a1 + 64);
  5399.   if ( *(_DWORD *)(a1 + 124) == 94 )
  5400.   {
  5401.     *(_DWORD *)(*(_QWORD *)(a1 + 72) + 12i64) ^= 1u;
  5402.     v2 = *(unsigned __int16 **)a1;
  5403.     v3 = *(unsigned __int16 **)(a1 + 16);
  5404.     if ( *(unsigned __int16 **)a1 != v3 )
  5405.     {
  5406.       if ( *v2 == 92 )
  5407.       {
  5408.         v4 = v2 + 1;
  5409.         if ( v2 + 1 != v3 )
  5410.         {
  5411.           if ( (v5 = *(_DWORD *)(a1 + 128), (v5 & 8) == 0) && (unsigned __int16)(*v4 - 40) <= 1u
  5412.             || (v5 & 0x10) == 0 && ((*v4 - 123) & 0xFFFD) == 0 )
  5413.           {
  5414.             ++v2;
  5415.           }
  5416.         }
  5417.       }
  5418.       *(_QWORD *)a1 = v2 + 1;
  5419.     }
  5420.     sub_1800040D0((unsigned __int16 **)a1);
  5421.   }
  5422.   if ( (*(_DWORD *)(a1 + 128) & 0x20000000) != 0 && *(_DWORD *)(a1 + 124) == 93 )
  5423.   {
  5424.     sub_1800086D0(a1 + 64, 93i64);
  5425.     v6 = *(unsigned __int16 **)a1;
  5426.     v7 = *(unsigned __int16 **)(a1 + 16);
  5427.     if ( *(unsigned __int16 **)a1 != v7 )
  5428.     {
  5429.       if ( *v6 == 92 )
  5430.       {
  5431.         v8 = v6 + 1;
  5432.         if ( v6 + 1 != v7 )
  5433.         {
  5434.           if ( (v9 = *(_DWORD *)(a1 + 128), (v9 & 8) == 0) && (unsigned __int16)(*v8 - 40) <= 1u
  5435.             || (v9 & 0x10) == 0 && ((*v8 - 123) & 0xFFFD) == 0 )
  5436.           {
  5437.             ++v6;
  5438.           }
  5439.         }
  5440.       }
  5441.       *(_QWORD *)a1 = v6 + 1;
  5442.     }
  5443.     sub_1800040D0((unsigned __int16 **)a1);
  5444.   }
  5445.   return sub_180007DE0(a1);
  5446. }
  5447.  
  5448. //----- (0000000180006AC0) ----------------------------------------------------
  5449. char __fastcall sub_180006AC0(__int64 a1)
  5450. {
  5451.   __int64 v2; // rcx
  5452.   int v3; // eax
  5453.   signed int v4; // edi
  5454.   __int64 v5; // rax
  5455.   _OWORD *v6; // rdx
  5456.   __int64 v7; // rcx
  5457.   __int64 v8; // rcx
  5458.  
  5459.   if ( (*(_DWORD *)(a1 + 128) & 0x100) != 0 && sub_180007BC0(a1, 3u) )
  5460.   {
  5461.     v3 = *(_DWORD *)(a1 + 128);
  5462.     v4 = *(_DWORD *)(a1 + 116);
  5463.     if ( v4 )
  5464.     {
  5465.       if ( (v3 & 0x200) != 0 && (unsigned int)v4 > 9
  5466.         || (v2 = v4, *(unsigned int *)(a1 + 24) < (unsigned __int64)v4)
  5467.         || *(_QWORD *)(a1 + 56) <= (unsigned __int64)v4
  5468.         || (v2 = v4 & 0x1F,
  5469.             ((1 << (v4 & 0x1F)) & *(_DWORD *)(*(_QWORD *)(a1 + 32) + 4 * ((unsigned __int64)v4 >> 5))) == 0) )
  5470.       {
  5471.         sub_1800040C0(v2, 3u);
  5472.       }
  5473.       v6 = sub_18000A224(0x28ui64);
  5474.       *v6 = 0i64;
  5475.       v6[1] = 0i64;
  5476.       *((_QWORD *)v6 + 4) = 0i64;
  5477.       *((_QWORD *)v6 + 3) = 0i64;
  5478.       *((_QWORD *)v6 + 2) = 0i64;
  5479.       *(_QWORD *)v6 = &std::_Node_back::`vftable';
  5480.      *((_QWORD *)v6 + 1) = 15i64;
  5481.      *((_DWORD *)v6 + 8) = v4;
  5482.      *((_QWORD *)v6 + 3) = *(_QWORD *)(a1 + 72);
  5483.      v7 = *(_QWORD *)(*(_QWORD *)(a1 + 72) + 16i64);
  5484.      if ( v7 )
  5485.      {
  5486.        *((_QWORD *)v6 + 2) = v7;
  5487.        *(_QWORD *)(*(_QWORD *)(*(_QWORD *)(a1 + 72) + 16i64) + 24i64) = v6;
  5488.      }
  5489.      v5 = *(_QWORD *)(a1 + 72);
  5490.      *(_QWORD *)(v5 + 16) = v6;
  5491.      *(_QWORD *)(a1 + 72) = v6;
  5492.    }
  5493.    else
  5494.    {
  5495.      if ( (v3 & 0x100000) == 0 )
  5496.        sub_1800040C0(v2, 2u);
  5497.      LOBYTE(v5) = sub_1800072A0(a1 + 64, 0);
  5498.    }
  5499.  }
  5500.  else if ( sub_180007F60(a1) )
  5501.  {
  5502.    LOBYTE(v5) = sub_1800072A0(a1 + 64, *(_WORD *)(a1 + 116));
  5503.  }
  5504.  else if ( (*(_DWORD *)(a1 + 128) & 0x20000) == 0 || (LOBYTE(v5) = sub_180007CD0(a1, 1), !(_BYTE)v5) )
  5505.  {
  5506.    sub_1800040C0(v8, 2u);
  5507.  }
  5508.  return v5;
  5509. }
  5510. // 180006C27: variable 'v2' is possibly undefined
  5511. // 180006C32: variable 'v8' is possibly undefined
  5512. // 18000C888: using guessed type void *std::_Node_back::`vftable';
  5513.  
  5514. //----- (0000000180006C50) ----------------------------------------------------
  5515. char __fastcall sub_180006C50(__int64 a1)
  5516. {
  5517.   int v2; // edx
  5518.   unsigned __int16 *v3; // rax
  5519.   unsigned __int16 *v4; // r8
  5520.   unsigned __int16 *v5; // rcx
  5521.   unsigned __int16 *v6; // rax
  5522.   unsigned __int16 *v7; // rdx
  5523.   int v8; // ebx
  5524.   unsigned __int16 *v9; // rcx
  5525.   int v10; // edx
  5526.   __int64 v11; // rcx
  5527.   _OWORD *v12; // rsi
  5528.   int v13; // eax
  5529.   int v14; // ebx
  5530.   _OWORD *v15; // rdx
  5531.   __int64 v16; // rcx
  5532.   _OWORD *v18; // rbp
  5533.   int v19; // eax
  5534.   int v20; // ebx
  5535.   _OWORD *v21; // rdx
  5536.   __int64 v22; // rcx
  5537.   int v23; // edx
  5538.   _OWORD *v24; // rbp
  5539.   int v25; // eax
  5540.   int v26; // ebx
  5541.   _OWORD *v27; // rdx
  5542.   __int64 v28; // rcx
  5543.   int v29; // edx
  5544.   bool v30; // cf
  5545.   unsigned __int64 v31; // rdx
  5546.   _DWORD *v32; // rdx
  5547.  
  5548.   ++*(_DWORD *)(a1 + 28);
  5549.   v2 = *(_DWORD *)(a1 + 128);
  5550.   if ( (v2 & 0x8000000) == 0 && *(_DWORD *)(a1 + 124) == 41 )
  5551.     sub_1800040C0(a1, 5u);
  5552.   if ( (v2 & 0x20) == 0 || *(_DWORD *)(a1 + 124) != 63 )
  5553.   {
  5554.     if ( (*(_DWORD *)(a1 + 112) & 0x200) != 0 )
  5555.     {
  5556.       v18 = sub_1800055C0(a1 + 64, 8);
  5557.       sub_1800043A0(a1);
  5558.       v19 = *((_DWORD *)v18 + 2);
  5559.       if ( v19 == 8 )
  5560.       {
  5561.         v20 = 9;
  5562.       }
  5563.       else
  5564.       {
  5565.         v20 = 12;
  5566.         if ( (unsigned int)(v19 - 10) > 1 )
  5567.           v20 = 14;
  5568.       }
  5569.       v21 = sub_18000A224(0x28ui64);
  5570.       *v21 = 0i64;
  5571.       v21[1] = 0i64;
  5572.       *((_QWORD *)v21 + 3) = 0i64;
  5573.       *((_DWORD *)v21 + 3) = 0;
  5574.       *((_QWORD *)v21 + 2) = 0i64;
  5575.       *(_QWORD *)v21 = &std::_Node_end_group::`vftable';
  5576.      *((_DWORD *)v21 + 2) = v20;
  5577.      *((_QWORD *)v21 + 4) = v18;
  5578.      *((_QWORD *)v21 + 3) = *(_QWORD *)(a1 + 72);
  5579.      v22 = *(_QWORD *)(*(_QWORD *)(a1 + 72) + 16i64);
  5580.      if ( v22 )
  5581.      {
  5582.        *((_QWORD *)v21 + 2) = v22;
  5583.        *(_QWORD *)(*(_QWORD *)(*(_QWORD *)(a1 + 72) + 16i64) + 24i64) = v21;
  5584.      }
  5585.      *(_QWORD *)(*(_QWORD *)(a1 + 72) + 16i64) = v21;
  5586.      *(_QWORD *)(a1 + 72) = v21;
  5587.    }
  5588.    else
  5589.    {
  5590.      v23 = *(_DWORD *)(a1 + 24) + 1;
  5591.      *(_DWORD *)(a1 + 24) = v23;
  5592.      v24 = sub_1800046B0(a1 + 64, v23);
  5593.      sub_1800043A0(a1);
  5594.      v25 = *((_DWORD *)v24 + 2);
  5595.      if ( v25 == 8 )
  5596.      {
  5597.        v26 = 9;
  5598.      }
  5599.      else
  5600.      {
  5601.        v26 = 12;
  5602.        if ( (unsigned int)(v25 - 10) > 1 )
  5603.          v26 = 14;
  5604.      }
  5605.      v27 = sub_18000A224(0x28ui64);
  5606.      *v27 = 0i64;
  5607.      v27[1] = 0i64;
  5608.      *((_QWORD *)v27 + 3) = 0i64;
  5609.      *((_DWORD *)v27 + 3) = 0;
  5610.      *((_QWORD *)v27 + 2) = 0i64;
  5611.      *(_QWORD *)v27 = &std::_Node_end_group::`vftable';
  5612.       *((_DWORD *)v27 + 2) = v26;
  5613.       *((_QWORD *)v27 + 4) = v24;
  5614.       *((_QWORD *)v27 + 3) = *(_QWORD *)(a1 + 72);
  5615.       v28 = *(_QWORD *)(*(_QWORD *)(a1 + 72) + 16i64);
  5616.       if ( v28 )
  5617.       {
  5618.         *((_QWORD *)v27 + 2) = v28;
  5619.         *(_QWORD *)(*(_QWORD *)(*(_QWORD *)(a1 + 72) + 16i64) + 24i64) = v27;
  5620.       }
  5621.       *(_QWORD *)(*(_QWORD *)(a1 + 72) + 16i64) = v27;
  5622.       *(_QWORD *)(a1 + 72) = v27;
  5623.       v29 = *(_DWORD *)(a1 + 24);
  5624.       v30 = __CFADD__(v29, 1);
  5625.       v31 = (unsigned int)(v29 + 1);
  5626.       if ( v30 )
  5627.         v31 = -1i64;
  5628.       sub_1800038B0((unsigned __int64 *)(a1 + 32), v31);
  5629.       v32 = (_DWORD *)(*(_QWORD *)(a1 + 32) + 4 * ((unsigned __int64)*((unsigned int *)v24 + 8) >> 5));
  5630.       *v32 |= 1 << (v24[2] & 0x1F);
  5631.     }
  5632.     goto LABEL_58;
  5633.   }
  5634.   v3 = *(unsigned __int16 **)a1;
  5635.   v4 = *(unsigned __int16 **)(a1 + 16);
  5636.   if ( *(unsigned __int16 **)a1 != v4 )
  5637.   {
  5638.     if ( *v3 != 92 )
  5639.       goto LABEL_16;
  5640.     v5 = v3 + 1;
  5641.     if ( v3 + 1 == v4 )
  5642.       goto LABEL_16;
  5643.     if ( (v2 & 8) == 0 )
  5644.     {
  5645.       if ( *v5 == 40 || *v5 == 41 )
  5646.       {
  5647. LABEL_15:
  5648.         v3 = v5;
  5649. LABEL_16:
  5650.         *(_QWORD *)a1 = v3 + 1;
  5651.         goto LABEL_17;
  5652.       }
  5653.       v3 = *(unsigned __int16 **)a1;
  5654.     }
  5655.     if ( (v2 & 0x10) != 0 || *v5 != 123 && *v5 != 125 )
  5656.       goto LABEL_16;
  5657.     goto LABEL_15;
  5658.   }
  5659. LABEL_17:
  5660.   sub_1800040D0((unsigned __int16 **)a1);
  5661.   v6 = *(unsigned __int16 **)a1;
  5662.   v7 = *(unsigned __int16 **)(a1 + 16);
  5663.   v8 = *(_DWORD *)(a1 + 124);
  5664.   if ( *(unsigned __int16 **)a1 == v7 )
  5665.     goto LABEL_29;
  5666.   if ( *v6 == 92 )
  5667.   {
  5668.     v9 = v6 + 1;
  5669.     if ( v6 + 1 != v7 )
  5670.     {
  5671.       v10 = *(_DWORD *)(a1 + 128);
  5672.       if ( (v10 & 8) == 0 )
  5673.       {
  5674.         if ( *v9 == 40 || *v9 == 41 )
  5675.         {
  5676. LABEL_27:
  5677.           v6 = v9;
  5678.           goto LABEL_28;
  5679.         }
  5680.         v6 = *(unsigned __int16 **)a1;
  5681.       }
  5682.       if ( (v10 & 0x10) != 0 || *v9 != 123 && *v9 != 125 )
  5683.         goto LABEL_28;
  5684.       goto LABEL_27;
  5685.     }
  5686.   }
  5687. LABEL_28:
  5688.   *(_QWORD *)a1 = v6 + 1;
  5689. LABEL_29:
  5690.   sub_1800040D0((unsigned __int16 **)a1);
  5691.   switch ( v8 )
  5692.   {
  5693.     case ':':
  5694.       v12 = sub_1800055C0(a1 + 64, 8);
  5695.       sub_1800043A0(a1);
  5696.       v13 = *((_DWORD *)v12 + 2);
  5697.       if ( v13 == 8 )
  5698.       {
  5699.         v14 = 9;
  5700.       }
  5701.       else
  5702.       {
  5703.         v14 = 12;
  5704.         if ( (unsigned int)(v13 - 10) > 1 )
  5705.           v14 = 14;
  5706.       }
  5707.       v15 = sub_18000A224(0x28ui64);
  5708.       *v15 = 0i64;
  5709.       v15[1] = 0i64;
  5710.       *((_QWORD *)v15 + 3) = 0i64;
  5711.       *((_DWORD *)v15 + 3) = 0;
  5712.       *((_QWORD *)v15 + 2) = 0i64;
  5713.       *(_QWORD *)v15 = &std::_Node_end_group::`vftable';
  5714.      *((_DWORD *)v15 + 2) = v14;
  5715.      *((_QWORD *)v15 + 4) = v12;
  5716.      *((_QWORD *)v15 + 3) = *(_QWORD *)(a1 + 72);
  5717.      v16 = *(_QWORD *)(*(_QWORD *)(a1 + 72) + 16i64);
  5718.      if ( v16 )
  5719.      {
  5720.        *((_QWORD *)v15 + 2) = v16;
  5721.        *(_QWORD *)(*(_QWORD *)(*(_QWORD *)(a1 + 72) + 16i64) + 24i64) = v15;
  5722.      }
  5723.      *(_QWORD *)(*(_QWORD *)(a1 + 72) + 16i64) = v15;
  5724.      *(_QWORD *)(a1 + 72) = v15;
  5725. LABEL_58:
  5726.      --*(_DWORD *)(a1 + 28);
  5727.      return 1;
  5728.    case '!':
  5729.      sub_180008520(a1, 1u);
  5730.      --*(_DWORD *)(a1 + 28);
  5731.      return 0;
  5732.    case '=':
  5733.      sub_180008520(a1, 0);
  5734.      --*(_DWORD *)(a1 + 28);
  5735.      return 0;
  5736.    default:
  5737.      sub_1800040C0(v11, 0xEu);
  5738.  }
  5739. }
  5740. // 180006FFE: variable 'v11' is possibly undefined
  5741. // 1800043A0: using guessed type __int64 __fastcall sub_1800043A0(_QWORD);
  5742. // 18000C8B8: using guessed type void *std::_Node_end_group::`vftable';
  5743.  
  5744. //----- (0000000180007010) ----------------------------------------------------
  5745. __int64 __fastcall sub_180007010(__int64 a1)
  5746. {
  5747.   __int64 result; // rax
  5748.   int v2; // ebp
  5749.   int v4; // esi
  5750.   unsigned __int16 *v5; // rcx
  5751.   unsigned __int16 *v6; // rax
  5752.   _WORD *v7; // rdx
  5753.   int v8; // er8
  5754.   int v9; // er8
  5755.   unsigned __int16 *v10; // rcx
  5756.   unsigned __int8 v11; // di
  5757.   unsigned __int16 *v12; // rax
  5758.   _WORD *v13; // rdx
  5759.   unsigned __int16 *v14; // rcx
  5760.   unsigned __int16 *v15; // rax
  5761.   _WORD *v16; // rdx
  5762.   int v17; // er8
  5763.   __int64 v18; // rcx
  5764.   unsigned __int16 *v19; // rcx
  5765.   unsigned __int16 *v20; // rax
  5766.   _WORD *v21; // rdx
  5767.   int v22; // er8
  5768.  
  5769.   result = *(unsigned int *)(a1 + 124);
  5770.   v2 = 0;
  5771.   v4 = -1;
  5772.   if ( (_DWORD)result == 42 )
  5773.     goto LABEL_4;
  5774.   if ( (_DWORD)result != 43 )
  5775.   {
  5776.     if ( (_DWORD)result == 63 )
  5777.     {
  5778.       v4 = 1;
  5779.       goto LABEL_4;
  5780.     }
  5781.     if ( (_DWORD)result != 123 )
  5782.       return result;
  5783.     v14 = *(unsigned __int16 **)a1;
  5784.     v15 = *(unsigned __int16 **)(a1 + 16);
  5785.     if ( v14 != v15 )
  5786.     {
  5787.       if ( *v14 == 92 )
  5788.       {
  5789.         v16 = v14 + 1;
  5790.         if ( v14 + 1 != v15 )
  5791.         {
  5792.           if ( (v17 = *(_DWORD *)(a1 + 128), (v17 & 8) == 0) && (unsigned __int16)(*v16 - 40) <= 1u
  5793.             || (v17 & 0x10) == 0 && ((*v16 - 123) & 0xFFFD) == 0 )
  5794.           {
  5795.             ++v14;
  5796.           }
  5797.         }
  5798.       }
  5799.       *(_QWORD *)a1 = v14 + 1;
  5800.     }
  5801.     sub_1800040D0((unsigned __int16 **)a1);
  5802.     if ( !sub_180007BC0(a1, 7u) )
  5803.       sub_1800040C0(v18, 7u);
  5804.     v2 = *(_DWORD *)(a1 + 116);
  5805.     if ( *(_DWORD *)(a1 + 124) == 44 )
  5806.     {
  5807.       v19 = *(unsigned __int16 **)a1;
  5808.       v20 = *(unsigned __int16 **)(a1 + 16);
  5809.       if ( *(unsigned __int16 **)a1 != v20 )
  5810.       {
  5811.         if ( *v19 == 92 )
  5812.         {
  5813.           v21 = v19 + 1;
  5814.           if ( v19 + 1 != v20 )
  5815.           {
  5816.             if ( (v22 = *(_DWORD *)(a1 + 128), (v22 & 8) == 0) && (unsigned __int16)(*v21 - 40) <= 1u
  5817.               || (v22 & 0x10) == 0 && ((*v21 - 123) & 0xFFFD) == 0 )
  5818.             {
  5819.               ++v19;
  5820.             }
  5821.           }
  5822.         }
  5823.         *(_QWORD *)a1 = v19 + 1;
  5824.       }
  5825.       sub_1800040D0((unsigned __int16 **)a1);
  5826.       if ( *(_DWORD *)(a1 + 124) == 125 )
  5827.       {
  5828. LABEL_53:
  5829.         if ( v4 == -1 || v4 >= v2 )
  5830.           goto LABEL_4;
  5831. LABEL_60:
  5832.         sub_1800040C0(v18, 7u);
  5833.       }
  5834.       if ( !sub_180007BC0(a1, 7u) )
  5835.         sub_1800040C0(v18, 7u);
  5836.       v4 = *(_DWORD *)(a1 + 116);
  5837.     }
  5838.     else
  5839.     {
  5840.       v4 = *(_DWORD *)(a1 + 116);
  5841.     }
  5842.     if ( *(_DWORD *)(a1 + 124) != 125 )
  5843.       goto LABEL_60;
  5844.     goto LABEL_53;
  5845.   }
  5846.   v2 = 1;
  5847. LABEL_4:
  5848.   *(_DWORD *)(*(_QWORD *)(a1 + 72) + 12i64) |= 4u;
  5849.   v5 = *(unsigned __int16 **)a1;
  5850.   v6 = *(unsigned __int16 **)(a1 + 16);
  5851.   if ( *(unsigned __int16 **)a1 != v6 )
  5852.   {
  5853.     if ( *v5 == 92 )
  5854.     {
  5855.       v7 = v5 + 1;
  5856.       if ( v5 + 1 != v6 )
  5857.       {
  5858.         if ( (v8 = *(_DWORD *)(a1 + 128), (v8 & 8) == 0) && (unsigned __int16)(*v7 - 40) <= 1u
  5859.           || (v8 & 0x10) == 0 && ((*v7 - 123) & 0xFFFD) == 0 )
  5860.         {
  5861.           ++v5;
  5862.         }
  5863.       }
  5864.     }
  5865.     *(_QWORD *)a1 = v5 + 1;
  5866.   }
  5867.   sub_1800040D0((unsigned __int16 **)a1);
  5868.   v9 = *(_DWORD *)(a1 + 128);
  5869.   if ( (v9 & 0x400) != 0 && *(_DWORD *)(a1 + 124) == 63 )
  5870.   {
  5871.     v10 = *(unsigned __int16 **)a1;
  5872.     v11 = 0;
  5873.     v12 = *(unsigned __int16 **)(a1 + 16);
  5874.     if ( *(unsigned __int16 **)a1 != v12 )
  5875.     {
  5876.       if ( *v10 == 92 )
  5877.       {
  5878.         v13 = v10 + 1;
  5879.         if ( v10 + 1 != v12
  5880.           && ((v9 & 8) == 0 && (unsigned __int16)(*v13 - 40) <= 1u || (v9 & 0x10) == 0 && ((*v13 - 123) & 0xFFFD) == 0) )
  5881.         {
  5882.           ++v10;
  5883.         }
  5884.       }
  5885.       *(_QWORD *)a1 = v10 + 1;
  5886.     }
  5887.     sub_1800040D0((unsigned __int16 **)a1);
  5888.   }
  5889.   else
  5890.   {
  5891.     v11 = 1;
  5892.   }
  5893.   return sub_1800087E0((_QWORD *)(a1 + 64), v2, v4, v11);
  5894. }
  5895. // 180007278: variable 'v18' is possibly undefined
  5896.  
  5897. //----- (00000001800072A0) ----------------------------------------------------
  5898. __int64 __fastcall sub_1800072A0(__int64 a1, unsigned __int16 a2)
  5899. {
  5900.   __int64 v2; // rax
  5901.   _OWORD *v5; // rdx
  5902.   __int64 v6; // rcx
  5903.   int v7; // eax
  5904.   unsigned __int16 v8; // ax
  5905.   __int64 v9; // rbx
  5906.   unsigned int v10; // eax
  5907.   unsigned int v11; // esi
  5908.   void *v12; // rax
  5909.   __int64 result; // rax
  5910.  
  5911.   v2 = *(_QWORD *)(a1 + 8);
  5912.   if ( *(_DWORD *)(v2 + 8) != 6 || (*(_BYTE *)(v2 + 12) & 4) != 0 )
  5913.   {
  5914.     v5 = sub_18000A224(0x30ui64);
  5915.     *v5 = 0i64;
  5916.     v5[1] = 0i64;
  5917.     v5[2] = 0i64;
  5918.     *((_QWORD *)v5 + 1) = 6i64;
  5919.     *((_QWORD *)v5 + 2) = 0i64;
  5920.     *((_QWORD *)v5 + 3) = 0i64;
  5921.     *(_QWORD *)v5 = &std::_Node_str<wchar_t>::`vftable';
  5922.    *((_QWORD *)v5 + 4) = 0i64;
  5923.    *((_QWORD *)v5 + 5) = 0i64;
  5924.    *((_QWORD *)v5 + 3) = *(_QWORD *)(a1 + 8);
  5925.    v6 = *(_QWORD *)(*(_QWORD *)(a1 + 8) + 16i64);
  5926.    if ( v6 )
  5927.    {
  5928.      *((_QWORD *)v5 + 2) = v6;
  5929.      *(_QWORD *)(*(_QWORD *)(*(_QWORD *)(a1 + 8) + 16i64) + 24i64) = v5;
  5930.    }
  5931.    *(_QWORD *)(*(_QWORD *)(a1 + 8) + 16i64) = v5;
  5932.    *(_QWORD *)(a1 + 8) = v5;
  5933.  }
  5934.  v7 = *(_DWORD *)(a1 + 16);
  5935.  if ( (v7 & 0x100) != 0 )
  5936.  {
  5937.    v8 = std::ctype<wchar_t>::tolower(*(_QWORD *)(*(_QWORD *)(a1 + 24) + 8i64), a2);
  5938.  }
  5939.  else
  5940.  {
  5941.    if ( (v7 & 0x800) == 0 )
  5942.      goto LABEL_11;
  5943.    v8 = sub_180006740(*(__int64 **)(a1 + 24), a2);
  5944.  }
  5945.  a2 = v8;
  5946. LABEL_11:
  5947.  v9 = *(_QWORD *)(a1 + 8);
  5948.  v10 = *(_DWORD *)(v9 + 36);
  5949.  if ( *(_DWORD *)(v9 + 32) <= v10 )
  5950.  {
  5951.    v11 = v10 + 16;
  5952.    v12 = realloc(*(void **)(v9 + 40), 2i64 * (v10 + 16));
  5953.    if ( !v12 )
  5954.    {
  5955.      std::_Xbad_alloc();
  5956.      __debugbreak();
  5957.    }
  5958.    *(_QWORD *)(v9 + 40) = v12;
  5959.    *(_DWORD *)(v9 + 32) = v11;
  5960.  }
  5961.  result = *(_QWORD *)(v9 + 40);
  5962.  *(_WORD *)(result + 2i64 * (unsigned int)(*(_DWORD *)(v9 + 36))++) = a2;
  5963.  return result;
  5964. }
  5965. // 18000C0C8: using guessed type __int64 __fastcall std::ctype<wchar_t>::tolower(_QWORD, _QWORD);
  5966. // 18000C100: using guessed type void std::_Xbad_alloc(void);
  5967. // 18000C7D8: using guessed type void *std::_Node_str<wchar_t>::`vftable';
  5968.  
  5969. //----- (00000001800073C0) ----------------------------------------------------
  5970. __int64 __fastcall sub_1800073C0(void **a1, __int64 a2, char a3)
  5971. {
  5972.   char v3; // si
  5973.   int v6; // edi
  5974.   void *v7; // rsi
  5975.   unsigned __int8 v8; // r13
  5976.   void *v9; // r12
  5977.   __int64 *v10; // r15
  5978.   char **v11; // rsi
  5979.   int v12; // ecx
  5980.   int v13; // eax
  5981.   void **v14; // rdi
  5982.   void *v15; // rcx
  5983.   void *v16; // rcx
  5984.   void *v17; // rcx
  5985.   void *v18; // rcx
  5986.   void *v21; // [rsp+28h] [rbp-71h]
  5987.   void *Block[2]; // [rsp+30h] [rbp-69h] BYREF
  5988.   __int128 v23; // [rsp+40h] [rbp-59h]
  5989.   __int128 v24; // [rsp+50h] [rbp-49h] BYREF
  5990.   __int128 v25; // [rsp+60h] [rbp-39h]
  5991.   void *v26[2]; // [rsp+70h] [rbp-29h] BYREF
  5992.   __int128 v27; // [rsp+80h] [rbp-19h]
  5993.   __int128 v28; // [rsp+90h] [rbp-9h] BYREF
  5994.   __int128 v29; // [rsp+A0h] [rbp+7h]
  5995.  
  5996.   v3 = a3;
  5997.   v6 = 0;
  5998.   *(_OWORD *)v26 = 0i64;
  5999.   v27 = 0i64;
  6000.   v28 = 0i64;
  6001.   v29 = 0i64;
  6002.   sub_180006650(v26, a1);
  6003.   if ( *(int *)(a2 + 32) <= 0 )
  6004.   {
  6005. LABEL_7:
  6006.     *(_OWORD *)Block = 0i64;
  6007.     v23 = 0i64;
  6008.     v24 = 0i64;
  6009.     v25 = 0i64;
  6010.     sub_180006650(Block, a1);
  6011.     v8 = 0;
  6012.     v9 = *a1;
  6013.     v21 = *a1;
  6014.     if ( !(unsigned __int8)sub_180004740(a1, *(_QWORD *)(*(_QWORD *)(a2 + 40) + 16i64)) )
  6015.     {
  6016.       v10 = (__int64 *)(a1 + 1);
  6017.       goto LABEL_20;
  6018.     }
  6019.     if ( v3 )
  6020.     {
  6021.       Block[0] = *a1;
  6022.       v10 = (__int64 *)(a1 + 1);
  6023.       if ( &Block[1] != a1 + 1 )
  6024.       {
  6025.         sub_180006510((unsigned __int64 *)&Block[1], (char *)*v10, ((_BYTE *)a1[2] - (_BYTE *)a1[1]) >> 2);
  6026.         *(_QWORD *)&v24 = a1[4];
  6027.       }
  6028.       if ( (void **)((char *)&v24 + 8) != a1 + 5 )
  6029.         sub_1800063C0((unsigned __int64 *)&v24 + 1, (char *)a1[5], ((_BYTE *)a1[6] - (_BYTE *)a1[5]) >> 4);
  6030.       v8 = 1;
  6031.       while ( 1 )
  6032.       {
  6033. LABEL_20:
  6034.         v11 = (char **)(a1 + 5);
  6035.         v12 = *(_DWORD *)(a2 + 36);
  6036.         if ( v12 != -1 )
  6037.         {
  6038.           v13 = v6++;
  6039.           if ( v13 >= v12 )
  6040.             break;
  6041.           v11 = (char **)(a1 + 5);
  6042.         }
  6043.         *a1 = v9;
  6044.         if ( v10 != (__int64 *)&v26[1] )
  6045.         {
  6046.           sub_180006510((unsigned __int64 *)v10, (char *)v26[1], (__int64)(v27 - (unsigned __int64)v26[1]) >> 2);
  6047.           v10[3] = v28;
  6048.         }
  6049.         if ( !(unsigned __int8)sub_180004740(a1, *(_QWORD *)(a2 + 16)) )
  6050.           break;
  6051.         v9 = *a1;
  6052.         if ( (unsigned __int8)sub_180004740(a1, *(_QWORD *)(*(_QWORD *)(a2 + 40) + 16i64)) )
  6053.         {
  6054.           if ( !a3 )
  6055.             goto LABEL_36;
  6056.           Block[0] = *a1;
  6057.           if ( &Block[1] != (void **)v10 )
  6058.           {
  6059.             sub_180006510((unsigned __int64 *)&Block[1], (char *)*v10, (v10[1] - *v10) >> 2);
  6060.             *(_QWORD *)&v24 = v10[3];
  6061.           }
  6062.           v11 = (char **)(a1 + 5);
  6063.           if ( (void **)((char *)&v24 + 8) != a1 + 5 )
  6064.             sub_1800063C0((unsigned __int64 *)&v24 + 1, *v11, ((_BYTE *)a1[6] - (_BYTE *)a1[5]) >> 4);
  6065.           v8 = 1;
  6066.         }
  6067.         else
  6068.         {
  6069.           v11 = (char **)(a1 + 5);
  6070.         }
  6071.         if ( v21 == v9 )
  6072.           break;
  6073.         v21 = v9;
  6074.       }
  6075.       v14 = Block;
  6076.       if ( !v8 )
  6077.         v14 = v26;
  6078.       *a1 = *v14;
  6079.       if ( v10 != (__int64 *)(v14 + 1) )
  6080.       {
  6081.         sub_180006510((unsigned __int64 *)v10, (char *)v14[1], ((_BYTE *)v14[2] - (_BYTE *)v14[1]) >> 2);
  6082.         v10[3] = (__int64)v14[4];
  6083.       }
  6084.       if ( v11 != (char **)(v14 + 5) )
  6085.         sub_1800063C0((unsigned __int64 *)v11, (char *)v14[5], ((_BYTE *)v14[6] - (_BYTE *)v14[5]) >> 4);
  6086.     }
  6087.     else
  6088.     {
  6089. LABEL_36:
  6090.       v8 = 1;
  6091.     }
  6092.     v15 = (void *)*((_QWORD *)&v24 + 1);
  6093.     if ( *((_QWORD *)&v24 + 1) )
  6094.     {
  6095.       if ( ((*((_QWORD *)&v25 + 1) - *((_QWORD *)&v24 + 1)) & 0xFFFFFFFFFFFFFFF0ui64) >= 0x1000 )
  6096.       {
  6097.         v15 = *(void **)(*((_QWORD *)&v24 + 1) - 8i64);
  6098.         if ( (unsigned __int64)(*((_QWORD *)&v24 + 1) - (_QWORD)v15 - 8i64) > 0x1F )
  6099.           goto LABEL_50;
  6100.       }
  6101.       j_j_free(v15);
  6102.       *((_QWORD *)&v24 + 1) = 0i64;
  6103.       v25 = 0i64;
  6104.     }
  6105.     v16 = Block[1];
  6106.     if ( !Block[1] )
  6107.       goto LABEL_52;
  6108.     if ( (unsigned __int64)(4 * ((__int64)(*((_QWORD *)&v23 + 1) - (unsigned __int64)Block[1]) >> 2)) < 0x1000
  6109.       || (v16 = (void *)*((_QWORD *)Block[1] - 1), (unsigned __int64)(Block[1] - v16 - 8) <= 0x1F) )
  6110.     {
  6111.       j_j_free(v16);
  6112.       Block[1] = 0i64;
  6113.       v23 = 0i64;
  6114.       goto LABEL_52;
  6115.     }
  6116. LABEL_50:
  6117.     invalid_parameter_noinfo_noreturn();
  6118.   }
  6119.   while ( 1 )
  6120.   {
  6121.     v7 = *a1;
  6122.     if ( !(unsigned __int8)sub_180004740(a1, *(_QWORD *)(a2 + 16)) )
  6123.       break;
  6124.     if ( v7 == *a1 )
  6125.       v6 = *(_DWORD *)(a2 + 32) - 1;
  6126.     if ( ++v6 >= *(_DWORD *)(a2 + 32) )
  6127.     {
  6128.       v3 = a3;
  6129.       goto LABEL_7;
  6130.     }
  6131.   }
  6132.   *a1 = v26[0];
  6133.   if ( a1 + 1 != &v26[1] )
  6134.   {
  6135.     sub_180006510((unsigned __int64 *)a1 + 1, (char *)v26[1], (__int64)(v27 - (unsigned __int64)v26[1]) >> 2);
  6136.     a1[4] = (void *)v28;
  6137.   }
  6138.   if ( a1 + 5 != (void **)((char *)&v28 + 8) )
  6139.     sub_1800063C0((unsigned __int64 *)a1 + 5, *((char **)&v28 + 1), (__int64)(v29 - *((_QWORD *)&v28 + 1)) >> 4);
  6140.   v8 = 0;
  6141. LABEL_52:
  6142.   v17 = (void *)*((_QWORD *)&v28 + 1);
  6143.   if ( *((_QWORD *)&v28 + 1) )
  6144.   {
  6145.     if ( ((*((_QWORD *)&v29 + 1) - *((_QWORD *)&v28 + 1)) & 0xFFFFFFFFFFFFFFF0ui64) >= 0x1000 )
  6146.     {
  6147.       v17 = *(void **)(*((_QWORD *)&v28 + 1) - 8i64);
  6148.       if ( (unsigned __int64)(*((_QWORD *)&v28 + 1) - (_QWORD)v17 - 8i64) > 0x1F )
  6149. LABEL_59:
  6150.         invalid_parameter_noinfo_noreturn();
  6151.     }
  6152.     j_j_free(v17);
  6153.     *((_QWORD *)&v28 + 1) = 0i64;
  6154.     v29 = 0i64;
  6155.   }
  6156.   v18 = v26[1];
  6157.   if ( v26[1] )
  6158.   {
  6159.     if ( ((*((_QWORD *)&v27 + 1) - (unsigned __int64)v26[1]) & 0xFFFFFFFFFFFFFFFCui64) >= 0x1000 )
  6160.     {
  6161.       v18 = (void *)*((_QWORD *)v26[1] - 1);
  6162.       if ( (unsigned __int64)(v26[1] - v18 - 8) > 0x1F )
  6163.         goto LABEL_59;
  6164.     }
  6165.     j_j_free(v18);
  6166.   }
  6167.   return v8;
  6168. }
  6169. // 180004740: using guessed type __int64 __fastcall sub_180004740(_QWORD, _QWORD);
  6170.  
  6171. //----- (0000000180007800) ----------------------------------------------------
  6172. __int64 __fastcall sub_180007800(unsigned __int16 a1, unsigned int *a2, _QWORD *a3)
  6173. {
  6174.   __int64 v5; // rbx
  6175.   void **v6; // r8
  6176.   void *v7; // rcx
  6177.   void *v8; // rcx
  6178.   unsigned __int64 v9; // r10
  6179.   void **v10; // r11
  6180.   unsigned __int64 v11; // r9
  6181.   unsigned int i; // er14
  6182.   unsigned __int64 v13; // rdx
  6183.   __int64 v14; // rax
  6184.   void **v15; // rdi
  6185.   __int64 v16; // rbx
  6186.   void **v17; // rdx
  6187.   void **v18; // r8
  6188.   __int64 v19; // rbx
  6189.   void *v20; // rcx
  6190.   void *v21; // rcx
  6191.   void **v22; // rax
  6192.   __int64 v23; // rdx
  6193.   unsigned __int8 v24; // bl
  6194.   void *v25; // rcx
  6195.   void **v26; // rax
  6196.   void *Block[3]; // [rsp+20h] [rbp-39h] BYREF
  6197.   unsigned __int64 v29; // [rsp+38h] [rbp-21h]
  6198.   void *v30[2]; // [rsp+40h] [rbp-19h] BYREF
  6199.   __int128 v31; // [rsp+50h] [rbp-9h]
  6200.   void *v32[2]; // [rsp+60h] [rbp+7h] BYREF
  6201.   __int128 v33; // [rsp+70h] [rbp+17h]
  6202.  
  6203.   *(_OWORD *)v30 = 0i64;
  6204.   *(_QWORD *)&v31 = 0i64;
  6205.   *((_QWORD *)&v31 + 1) = 7i64;
  6206.   LOWORD(v30[0]) = 0;
  6207.   *(_OWORD *)v32 = 0i64;
  6208.   *((_QWORD *)&v33 + 1) = 7i64;
  6209.   *(_QWORD *)&v33 = 1i64;
  6210.   LODWORD(v32[0]) = a1;
  6211.   v5 = sub_180008B10(a3, (__int64)Block, v32, (_BYTE *)v32 + 2);
  6212.   if ( v32 != (void **)v5 )
  6213.   {
  6214.     if ( *((_QWORD *)&v33 + 1) >= 8ui64 )
  6215.     {
  6216.       v7 = v32[0];
  6217.       if ( (unsigned __int64)(2i64 * *((_QWORD *)&v33 + 1) + 2) >= 0x1000 )
  6218.       {
  6219.         v7 = (void *)*((_QWORD *)v32[0] - 1);
  6220.         if ( (unsigned __int64)(v32[0] - v7 - 8) > 0x1F )
  6221. LABEL_10:
  6222.           invalid_parameter_noinfo_noreturn();
  6223.       }
  6224.       j_j_free(v7);
  6225.     }
  6226.     *(_QWORD *)&v33 = 0i64;
  6227.     *((_QWORD *)&v33 + 1) = 7i64;
  6228.     LOWORD(v32[0]) = 0;
  6229.     *(_OWORD *)v32 = *(_OWORD *)v5;
  6230.     v33 = *(_OWORD *)(v5 + 16);
  6231.     *(_QWORD *)(v5 + 16) = 0i64;
  6232.     *(_QWORD *)(v5 + 24) = 7i64;
  6233.     *(_WORD *)v5 = 0;
  6234.   }
  6235.   if ( v29 >= 8 )
  6236.   {
  6237.     v8 = Block[0];
  6238.     if ( 2 * v29 + 2 >= 0x1000 )
  6239.     {
  6240.       v8 = (void *)*((_QWORD *)Block[0] - 1);
  6241.       if ( (unsigned __int64)(Block[0] - v8 - 8) > 0x1F )
  6242.         goto LABEL_10;
  6243.     }
  6244.     j_j_free(v8);
  6245.   }
  6246.   v9 = *((_QWORD *)&v31 + 1);
  6247.   v10 = (void **)v30[0];
  6248.   v11 = *((_QWORD *)&v33 + 1);
  6249.   while ( a2 )
  6250.   {
  6251.     for ( i = 0; i < a2[3]; i += *a2 )
  6252.     {
  6253.       v13 = *a2;
  6254.       v14 = *((_QWORD *)a2 + 2);
  6255.       if ( v13 > v9 )
  6256.       {
  6257.         sub_180008D90((__int64)v30, v13, (__int64)v6, (const void *)(v14 + 2i64 * i));
  6258.       }
  6259.       else
  6260.       {
  6261.         v15 = v30;
  6262.         if ( v9 >= 8 )
  6263.           v15 = v10;
  6264.         *(_QWORD *)&v31 = *a2;
  6265.         v16 = 2 * v13;
  6266.         memmove(v15, (const void *)(v14 + 2i64 * i), 2 * v13);
  6267.         *(_WORD *)((char *)v15 + v16) = 0;
  6268.       }
  6269.       v17 = v30;
  6270.       if ( *((_QWORD *)&v31 + 1) >= 8ui64 )
  6271.         v17 = (void **)v30[0];
  6272.       v18 = v30;
  6273.       if ( *((_QWORD *)&v31 + 1) >= 8ui64 )
  6274.         v18 = (void **)v30[0];
  6275.       v19 = sub_180008B10(a3, (__int64)Block, v18, (_BYTE *)v17 + 2 * v31);
  6276.       if ( v30 != (void **)v19 )
  6277.       {
  6278.         if ( *((_QWORD *)&v31 + 1) >= 8ui64 )
  6279.         {
  6280.           v20 = v30[0];
  6281.           if ( (unsigned __int64)(2i64 * *((_QWORD *)&v31 + 1) + 2) >= 0x1000 )
  6282.           {
  6283.             v20 = (void *)*((_QWORD *)v30[0] - 1);
  6284.             if ( (unsigned __int64)(v30[0] - v20 - 8) > 0x1F )
  6285. LABEL_46:
  6286.               invalid_parameter_noinfo_noreturn();
  6287.           }
  6288.           j_j_free(v20);
  6289.         }
  6290.         *(_QWORD *)&v31 = 0i64;
  6291.         *((_QWORD *)&v31 + 1) = 7i64;
  6292.         LOWORD(v30[0]) = 0;
  6293.         *(_OWORD *)v30 = *(_OWORD *)v19;
  6294.         v31 = *(_OWORD *)(v19 + 16);
  6295.         *(_QWORD *)(v19 + 16) = 0i64;
  6296.         *(_QWORD *)(v19 + 24) = 7i64;
  6297.         *(_WORD *)v19 = 0;
  6298.       }
  6299.       if ( v29 >= 8 )
  6300.       {
  6301.         v21 = Block[0];
  6302.         if ( 2 * v29 + 2 >= 0x1000 )
  6303.         {
  6304.           v21 = (void *)*((_QWORD *)Block[0] - 1);
  6305.           if ( (unsigned __int64)(Block[0] - v21 - 8) > 0x1F )
  6306.             goto LABEL_46;
  6307.         }
  6308.         j_j_free(v21);
  6309.       }
  6310.       v22 = v32;
  6311.       v11 = *((_QWORD *)&v33 + 1);
  6312.       if ( *((_QWORD *)&v33 + 1) >= 8ui64 )
  6313.         v22 = (void **)v32[0];
  6314.       v6 = v30;
  6315.       v10 = (void **)v30[0];
  6316.       v9 = *((_QWORD *)&v31 + 1);
  6317.       if ( *((_QWORD *)&v31 + 1) >= 8ui64 )
  6318.         v6 = (void **)v30[0];
  6319.       v23 = v31;
  6320.       if ( (_QWORD)v31 == (_QWORD)v33 )
  6321.       {
  6322.         if ( !(_QWORD)v31 )
  6323.         {
  6324. LABEL_43:
  6325.           v24 = 1;
  6326.           goto LABEL_48;
  6327.         }
  6328.         v6 = (void **)((char *)v6 - (__int64)v22);
  6329.         while ( *(_WORD *)((char *)v22 + (_QWORD)v6) == *(_WORD *)v22 )
  6330.         {
  6331.           v22 = (void **)((char *)v22 + 2);
  6332.           if ( !--v23 )
  6333.             goto LABEL_43;
  6334.         }
  6335.       }
  6336.     }
  6337.     a2 = (unsigned int *)*((_QWORD *)a2 + 3);
  6338.   }
  6339.   v24 = 0;
  6340. LABEL_48:
  6341.   if ( v11 >= 8 )
  6342.   {
  6343.     v25 = v32[0];
  6344.     if ( 2 * v11 + 2 >= 0x1000 )
  6345.     {
  6346.       v25 = (void *)*((_QWORD *)v32[0] - 1);
  6347.       if ( (unsigned __int64)(v32[0] - v25 - 8) > 0x1F )
  6348.         invalid_parameter_noinfo_noreturn();
  6349.     }
  6350.     j_j_free(v25);
  6351.     v9 = *((_QWORD *)&v31 + 1);
  6352.     v10 = (void **)v30[0];
  6353.   }
  6354.   *(_QWORD *)&v33 = 0i64;
  6355.   *((_QWORD *)&v33 + 1) = 7i64;
  6356.   LOWORD(v32[0]) = 0;
  6357.   if ( v9 >= 8 )
  6358.   {
  6359.     v26 = v10;
  6360.     if ( 2 * v9 + 2 >= 0x1000 )
  6361.     {
  6362.       v10 = (void **)*(v10 - 1);
  6363.       if ( (unsigned __int64)((char *)v26 - (char *)v10 - 8) > 0x1F )
  6364.         invalid_parameter_noinfo_noreturn();
  6365.     }
  6366.     j_j_free(v10);
  6367.   }
  6368.   return v24;
  6369. }
  6370. // 18000799F: variable 'v6' is possibly undefined
  6371.  
  6372. //----- (0000000180007BC0) ----------------------------------------------------
  6373. bool __fastcall sub_180007BC0(__int64 a1, unsigned int a2)
  6374. {
  6375.   int v4; // edi
  6376.   int v5; // ecx
  6377.   int v6; // er8
  6378.   int v7; // er9
  6379.   __int64 v8; // rcx
  6380.   unsigned __int16 *v9; // rax
  6381.   unsigned __int16 *v10; // rcx
  6382.   _WORD *v11; // rdx
  6383.   int v12; // er8
  6384.  
  6385.   *(_DWORD *)(a1 + 116) = 0;
  6386.   v4 = 0x7FFFFFFF;
  6387.   do
  6388.   {
  6389.     v5 = *(unsigned __int16 *)(a1 + 120);
  6390.     if ( (unsigned __int16)(v5 - 48) > 9u )
  6391.       break;
  6392.     v6 = v5 - 48;
  6393.     if ( v5 == 47 )
  6394.       break;
  6395.     v7 = *(_DWORD *)(a1 + 116);
  6396.     v8 = (unsigned int)(0x7FFFFFFF - v6);
  6397.     if ( v7 > (int)v8 / 10 )
  6398.       sub_1800040C0(v8, a2);
  6399.     --v4;
  6400.     v9 = *(unsigned __int16 **)a1;
  6401.     *(_DWORD *)(a1 + 116) = v6 + 10 * v7;
  6402.     v10 = *(unsigned __int16 **)(a1 + 16);
  6403.     if ( v9 != v10 )
  6404.     {
  6405.       if ( *v9 == 92 )
  6406.       {
  6407.         v11 = v9 + 1;
  6408.         if ( v9 + 1 != v10 )
  6409.         {
  6410.           if ( (v12 = *(_DWORD *)(a1 + 128), (v12 & 8) == 0) && (unsigned __int16)(*v11 - 40) <= 1u
  6411.             || (v12 & 0x10) == 0 && ((*v11 - 123) & 0xFFFD) == 0 )
  6412.           {
  6413.             ++v9;
  6414.           }
  6415.         }
  6416.       }
  6417.       *(_QWORD *)a1 = v9 + 1;
  6418.     }
  6419.     sub_1800040D0((unsigned __int16 **)a1);
  6420.   }
  6421.   while ( v4 );
  6422.   return v4 != 0x7FFFFFFF;
  6423. }
  6424.  
  6425. //----- (0000000180007CD0) ----------------------------------------------------
  6426. char __fastcall sub_180007CD0(__int64 a1, char a2)
  6427. {
  6428.   unsigned __int16 v4; // bp
  6429.   char v5; // al
  6430.   unsigned __int16 *v6; // rcx
  6431.   unsigned __int16 *v7; // rax
  6432.   _WORD *v8; // rdx
  6433.   int v9; // er8
  6434.  
  6435.   if ( *(_QWORD *)a1 == *(_QWORD *)(a1 + 16) )
  6436.     return 0;
  6437.   v4 = sub_1800097A0(
  6438.          *(_QWORD *)(a1 + 104),
  6439.          *(unsigned __int16 **)a1,
  6440.          (unsigned __int16 *)(*(_QWORD *)a1 + 2i64),
  6441.          BYTE1(*(_DWORD *)(a1 + 112)) & 1);
  6442.   if ( !v4 )
  6443.     return 0;
  6444.   if ( a2 )
  6445.     sub_180008630(a1 + 64);
  6446.   v5 = std::ctype<wchar_t>::is(*(_QWORD *)(*(_QWORD *)(a1 + 104) + 8i64), 1i64, *(unsigned __int16 *)(a1 + 120));
  6447.   sub_1800096C0(a1 + 64, v4, v5);
  6448.   v6 = *(unsigned __int16 **)a1;
  6449.   v7 = *(unsigned __int16 **)(a1 + 16);
  6450.   if ( *(unsigned __int16 **)a1 != v7 )
  6451.   {
  6452.     if ( *v6 == 92 )
  6453.     {
  6454.       v8 = v6 + 1;
  6455.       if ( v6 + 1 != v7 )
  6456.       {
  6457.         if ( (v9 = *(_DWORD *)(a1 + 128), (v9 & 8) == 0) && (unsigned __int16)(*v8 - 40) <= 1u
  6458.           || (v9 & 0x10) == 0 && ((*v8 - 123) & 0xFFFD) == 0 )
  6459.         {
  6460.           ++v6;
  6461.         }
  6462.       }
  6463.     }
  6464.     *(_QWORD *)a1 = v6 + 1;
  6465.   }
  6466.   sub_1800040D0((unsigned __int16 **)a1);
  6467.   return 1;
  6468. }
  6469. // 18000C0D0: using guessed type __int64 __fastcall std::ctype<wchar_t>::is(_QWORD, _QWORD, _QWORD);
  6470.  
  6471. //----- (0000000180007DE0) ----------------------------------------------------
  6472. int __fastcall sub_180007DE0(__int64 a1)
  6473. {
  6474.   int result; // eax
  6475.   __int64 v3; // rcx
  6476.   int v4; // eax
  6477.   unsigned __int16 *v5; // rcx
  6478.   unsigned __int16 *v6; // rax
  6479.   _WORD *v7; // rdx
  6480.   int v8; // er8
  6481.   unsigned __int16 v9; // di
  6482.   int v10; // eax
  6483.   __int64 v11; // rcx
  6484.   unsigned __int16 v12; // ax
  6485.   __int64 *v13; // rcx
  6486.   unsigned __int16 v14; // r8
  6487.  
  6488.   for ( result = sub_1800090C0(a1); result; result = sub_1800090C0(a1) )
  6489.   {
  6490.     if ( result != 2 )
  6491.     {
  6492.       v4 = *(_DWORD *)(a1 + 116);
  6493.       if ( !v4 && (*(_DWORD *)(a1 + 128) & 0x100000) == 0 )
  6494.         sub_1800040C0(v3, 2u);
  6495.       if ( *(_DWORD *)(a1 + 124) == 45 )
  6496.       {
  6497.         v5 = *(unsigned __int16 **)a1;
  6498.         v6 = *(unsigned __int16 **)(a1 + 16);
  6499.         if ( *(unsigned __int16 **)a1 != v6 )
  6500.         {
  6501.           if ( *v5 == 92 )
  6502.           {
  6503.             v7 = v5 + 1;
  6504.             if ( v5 + 1 != v6 )
  6505.             {
  6506.               if ( (v8 = *(_DWORD *)(a1 + 128), (v8 & 8) == 0) && (unsigned __int16)(*v7 - 40) <= 1u
  6507.                 || (v8 & 0x10) == 0 && ((*v7 - 123) & 0xFFFD) == 0 )
  6508.               {
  6509.                 ++v5;
  6510.               }
  6511.             }
  6512.           }
  6513.           *(_QWORD *)a1 = v5 + 1;
  6514.         }
  6515.         sub_1800040D0((unsigned __int16 **)a1);
  6516.         v9 = *(_WORD *)(a1 + 116);
  6517.         v10 = sub_1800090C0(a1);
  6518.         if ( !v10 )
  6519.         {
  6520.           sub_1800086D0(a1 + 64, *(unsigned __int16 *)(a1 + 116));
  6521.           return sub_1800086D0(a1 + 64, 45i64);
  6522.         }
  6523.         if ( v10 == 2 )
  6524.           sub_1800040C0(v11, 8u);
  6525.         if ( (*(_DWORD *)(a1 + 112) & 0x800) != 0 )
  6526.         {
  6527.           v12 = sub_180006740(*(__int64 **)(a1 + 104), *(_WORD *)(a1 + 116));
  6528.           v13 = *(__int64 **)(a1 + 104);
  6529.           *(_DWORD *)(a1 + 116) = v12;
  6530.           v9 = sub_180006740(v13, v9);
  6531.         }
  6532.         v14 = *(_WORD *)(a1 + 116);
  6533.         if ( v14 < v9 )
  6534.           sub_1800040C0(v11, 8u);
  6535.         sub_1800094A0(a1 + 64, v9, v14);
  6536.       }
  6537.       else
  6538.       {
  6539.         sub_1800086D0(a1 + 64, (unsigned __int16)v4);
  6540.       }
  6541.     }
  6542.   }
  6543.   return result;
  6544. }
  6545. // 180007F41: variable 'v11' is possibly undefined
  6546. // 180007F4C: variable 'v3' is possibly undefined
  6547.  
  6548. //----- (0000000180007F60) ----------------------------------------------------
  6549. char __fastcall sub_180007F60(__int64 a1)
  6550. {
  6551.   __int64 v1; // rbx
  6552.   int v2; // edx
  6553.   __int16 v3; // ax
  6554.   int v4; // eax
  6555.   __int16 v5; // ax
  6556.   unsigned __int16 *v6; // rcx
  6557.   unsigned __int16 *v7; // rax
  6558.   _WORD *v8; // r8
  6559.   unsigned __int16 *v9; // rcx
  6560.   unsigned __int16 *v10; // rax
  6561.   _WORD *v11; // r8
  6562.   __int64 v12; // rcx
  6563.   unsigned __int16 *v13; // rax
  6564.   _WORD *v14; // rdx
  6565.   int v15; // er8
  6566.   unsigned __int16 *v16; // rax
  6567.   unsigned __int16 *v17; // r8
  6568.   unsigned __int16 *v18; // rcx
  6569.   int v19; // edx
  6570.   unsigned int v20; // eax
  6571.   unsigned __int16 *v21; // rax
  6572.   unsigned __int16 *v22; // r8
  6573.   unsigned __int16 *v23; // rcx
  6574.   int v24; // edi
  6575.   int v25; // er8
  6576.   __int64 v26; // rcx
  6577.   unsigned __int16 *v27; // rdx
  6578.   unsigned __int16 *v28; // rax
  6579.   unsigned __int16 *v29; // rcx
  6580.   int v30; // edx
  6581.   char result; // al
  6582.   unsigned int v32; // er8
  6583.   unsigned int v33; // eax
  6584.   unsigned __int16 *v34; // rcx
  6585.   unsigned __int16 *v35; // rax
  6586.   unsigned __int16 *v36; // rcx
  6587.  
  6588.   v1 = a1;
  6589.   if ( *(_DWORD *)(a1 + 124) == -1 )
  6590.     sub_1800040C0(a1, 2u);
  6591.   v2 = *(_DWORD *)(a1 + 128);
  6592.   if ( (v2 & 0x10000) != 0 )
  6593.   {
  6594.     v3 = *(_WORD *)(a1 + 120);
  6595.     switch ( v3 )
  6596.     {
  6597.       case 'f':
  6598.         v4 = 12;
  6599. LABEL_18:
  6600.         *(_DWORD *)(a1 + 116) = v4;
  6601.         v6 = *(unsigned __int16 **)a1;
  6602.         v7 = *(unsigned __int16 **)(v1 + 16);
  6603.         if ( v6 == v7 )
  6604.         {
  6605. LABEL_47:
  6606.           sub_1800040D0((unsigned __int16 **)v1);
  6607.           goto LABEL_63;
  6608.         }
  6609.         if ( *v6 == 92 )
  6610.         {
  6611.           v8 = v6 + 1;
  6612.           if ( v6 + 1 != v7
  6613.             && ((v2 & 8) == 0 && (unsigned __int16)(*v8 - 40) <= 1u || (v2 & 0x10) == 0 && ((*v8 - 123) & 0xFFFD) == 0) )
  6614.           {
  6615.             *(_QWORD *)v1 = v6 + 2;
  6616.             sub_1800040D0((unsigned __int16 **)v1);
  6617.             goto LABEL_63;
  6618.           }
  6619.         }
  6620. LABEL_46:
  6621.         *(_QWORD *)v1 = v6 + 1;
  6622.         goto LABEL_47;
  6623.       case 'n':
  6624.         v4 = 10;
  6625.         goto LABEL_18;
  6626.       case 'r':
  6627.         v4 = 13;
  6628.         goto LABEL_18;
  6629.       case 't':
  6630.         v4 = 9;
  6631.         goto LABEL_18;
  6632.       case 'v':
  6633.         v4 = 11;
  6634.         goto LABEL_18;
  6635.     }
  6636.   }
  6637.   if ( (v2 & 0x8000) != 0 )
  6638.   {
  6639.     v5 = *(_WORD *)(a1 + 120);
  6640.     if ( v5 == 97 )
  6641.     {
  6642.       v4 = 7;
  6643.       goto LABEL_18;
  6644.     }
  6645.     if ( v5 == 98 )
  6646.     {
  6647.       v4 = 8;
  6648.       goto LABEL_18;
  6649.     }
  6650.   }
  6651.   LOWORD(a1) = *(_WORD *)(a1 + 120);
  6652.   if ( (_WORD)a1 == 99 )
  6653.   {
  6654.     if ( (v2 & 0x40000) != 0 )
  6655.     {
  6656.       v9 = *(unsigned __int16 **)v1;
  6657.       v10 = *(unsigned __int16 **)(v1 + 16);
  6658.       if ( *(unsigned __int16 **)v1 != v10 )
  6659.       {
  6660.         if ( *v9 == 92 )
  6661.         {
  6662.           v11 = v9 + 1;
  6663.           if ( v9 + 1 != v10
  6664.             && ((v2 & 8) == 0 && (unsigned __int16)(*v11 - 40) <= 1u || (v2 & 0x10) == 0 && ((*v11 - 123) & 0xFFFD) == 0) )
  6665.           {
  6666.             ++v9;
  6667.           }
  6668.         }
  6669.         *(_QWORD *)v1 = v9 + 1;
  6670.       }
  6671.       sub_1800040D0((unsigned __int16 **)v1);
  6672.       if ( !(unsigned __int8)std::ctype<wchar_t>::is(
  6673.                                *(_QWORD *)(*(_QWORD *)(v1 + 104) + 8i64),
  6674.                                259i64,
  6675.                                *(unsigned __int16 *)(v1 + 120)) )
  6676.         sub_1800040C0(v12, 2u);
  6677.       v6 = *(unsigned __int16 **)v1;
  6678.       *(_DWORD *)(v1 + 116) = *(_WORD *)(v1 + 120) & 0x1F;
  6679.       v13 = *(unsigned __int16 **)(v1 + 16);
  6680.       if ( v6 == v13 )
  6681.         goto LABEL_47;
  6682.       if ( *v6 == 92 )
  6683.       {
  6684.         v14 = v6 + 1;
  6685.         if ( v6 + 1 != v13 )
  6686.         {
  6687.           if ( (v15 = *(_DWORD *)(v1 + 128), (v15 & 8) == 0) && (unsigned __int16)(*v14 - 40) <= 1u
  6688.             || (v15 & 0x10) == 0 && ((*v14 - 123) & 0xFFFD) == 0 )
  6689.           {
  6690.             ++v6;
  6691.           }
  6692.         }
  6693.       }
  6694.       goto LABEL_46;
  6695.     }
  6696.     goto LABEL_79;
  6697.   }
  6698.   if ( (_WORD)a1 != 120 )
  6699.   {
  6700.     if ( (_WORD)a1 != 117 || (v2 & 0x800) == 0 )
  6701.       goto LABEL_79;
  6702.     v21 = *(unsigned __int16 **)v1;
  6703.     v22 = *(unsigned __int16 **)(v1 + 16);
  6704.     if ( *(unsigned __int16 **)v1 == v22 )
  6705.     {
  6706. LABEL_78:
  6707.       sub_1800040D0((unsigned __int16 **)v1);
  6708.       v19 = 4;
  6709.       goto LABEL_62;
  6710.     }
  6711.     if ( *v21 != 92 || (v23 = v21 + 1, v21 + 1 == v22) )
  6712.     {
  6713. LABEL_77:
  6714.       *(_QWORD *)v1 = v21 + 1;
  6715.       goto LABEL_78;
  6716.     }
  6717.     if ( (v2 & 8) == 0 )
  6718.     {
  6719.       if ( (unsigned __int16)(*v23 - 40) <= 1u )
  6720.       {
  6721. LABEL_76:
  6722.         v21 = v23;
  6723.         goto LABEL_77;
  6724.       }
  6725.       v21 = *(unsigned __int16 **)v1;
  6726.     }
  6727.     if ( (v2 & 0x10) != 0 || *v23 != 123 && *v23 != 125 )
  6728.       goto LABEL_77;
  6729.     goto LABEL_76;
  6730.   }
  6731.   if ( (v2 & 0x1000) != 0 )
  6732.   {
  6733.     v16 = *(unsigned __int16 **)v1;
  6734.     v17 = *(unsigned __int16 **)(v1 + 16);
  6735.     if ( *(unsigned __int16 **)v1 == v17 )
  6736.     {
  6737. LABEL_61:
  6738.       sub_1800040D0((unsigned __int16 **)v1);
  6739.       v19 = 2;
  6740. LABEL_62:
  6741.       sub_180008FA0(v1, v19);
  6742.       goto LABEL_63;
  6743.     }
  6744.     if ( *v16 != 92 || (v18 = v16 + 1, v16 + 1 == v17) )
  6745.     {
  6746. LABEL_60:
  6747.       *(_QWORD *)v1 = v16 + 1;
  6748.       goto LABEL_61;
  6749.     }
  6750.     if ( (v2 & 8) == 0 )
  6751.     {
  6752.       if ( (unsigned __int16)(*v18 - 40) <= 1u )
  6753.       {
  6754. LABEL_59:
  6755.         v16 = v18;
  6756.         goto LABEL_60;
  6757.       }
  6758.       v16 = *(unsigned __int16 **)v1;
  6759.     }
  6760.     if ( (v2 & 0x10) != 0 || *v18 != 123 && *v18 != 125 )
  6761.       goto LABEL_60;
  6762.     goto LABEL_59;
  6763.   }
  6764. LABEL_79:
  6765.   if ( (v2 & 0x2000) == 0 )
  6766.   {
  6767. LABEL_100:
  6768.     v32 = *(_DWORD *)(v1 + 128);
  6769.     if ( (v32 & 0x400000) != 0 )
  6770.     {
  6771.       switch ( (__int16)a1 )
  6772.       {
  6773.         case 'D':
  6774.         case 'S':
  6775.         case 'W':
  6776.         case 'c':
  6777.         case 'd':
  6778.         case 's':
  6779.         case 'w':
  6780.           goto LABEL_116;
  6781.         default:
  6782.           goto LABEL_106;
  6783.       }
  6784.     }
  6785.     switch ( (__int16)a1 )
  6786.     {
  6787.       case '"':
  6788.       case '/':
  6789.         v33 = HIBYTE(v32);
  6790.         goto LABEL_105;
  6791.       case '$':
  6792.       case '*':
  6793.       case '.':
  6794.       case '[':
  6795.       case '\\':
  6796.       case '^':
  6797.       case '|':
  6798.         goto LABEL_106;
  6799.       case '(':
  6800.       case ')':
  6801.       case '+':
  6802.       case '?':
  6803.       case '{':
  6804.       case '}':
  6805.         v33 = v32 >> 23;
  6806. LABEL_105:
  6807.         if ( (v33 & 1) == 0 )
  6808.           goto LABEL_116;
  6809. LABEL_106:
  6810.         v34 = *(unsigned __int16 **)v1;
  6811.         *(_DWORD *)(v1 + 116) = *(unsigned __int16 *)(v1 + 120);
  6812.         v35 = *(unsigned __int16 **)(v1 + 16);
  6813.         if ( v34 != v35 )
  6814.         {
  6815.           if ( *v34 == 92 )
  6816.           {
  6817.             v36 = v34 + 1;
  6818.             if ( v36 != v35
  6819.               && ((v32 & 8) == 0 && (unsigned __int16)(*v36 - 40) <= 1u
  6820.                || (v32 & 0x10) == 0 && ((*v36 - 123) & 0xFFFD) == 0) )
  6821.             {
  6822.               *(_QWORD *)v1 = v36;
  6823.             }
  6824.           }
  6825.           *(_QWORD *)v1 += 2i64;
  6826.         }
  6827.         sub_1800040D0((unsigned __int16 **)v1);
  6828.         result = 1;
  6829.         break;
  6830.       default:
  6831. LABEL_116:
  6832.         result = 0;
  6833.         break;
  6834.     }
  6835.     return result;
  6836.   }
  6837.   v24 = 3;
  6838.   *(_DWORD *)(v1 + 116) = 0;
  6839.   while ( 1 )
  6840.   {
  6841.     a1 = *(unsigned __int16 *)(v1 + 120);
  6842.     if ( (unsigned __int16)(a1 - 48) > 7u )
  6843.       break;
  6844.     v25 = a1 - 48;
  6845.     if ( (_DWORD)a1 == 47 )
  6846.       break;
  6847.     v26 = *(unsigned int *)(v1 + 116);
  6848.     if ( (int)v26 > (0x7FFFFFFF - v25) / 8 )
  6849.       sub_1800040C0(v26, 2u);
  6850.     v27 = *(unsigned __int16 **)(v1 + 16);
  6851.     *(_DWORD *)(v1 + 116) = v25 + 8 * v26;
  6852.     --v24;
  6853.     v28 = *(unsigned __int16 **)v1;
  6854.     if ( *(unsigned __int16 **)v1 == v27 )
  6855.       goto LABEL_95;
  6856.     if ( *v28 == 92 )
  6857.     {
  6858.       v29 = v28 + 1;
  6859.       if ( v28 + 1 != v27 )
  6860.       {
  6861.         v30 = *(_DWORD *)(v1 + 128);
  6862.         if ( (v30 & 8) != 0 )
  6863.           goto LABEL_90;
  6864.         if ( (unsigned __int16)(*v29 - 40) > 1u )
  6865.         {
  6866.           v28 = *(unsigned __int16 **)v1;
  6867. LABEL_90:
  6868.           if ( (v30 & 0x10) != 0 || *v29 != 123 && *v29 != 125 )
  6869.             goto LABEL_94;
  6870.         }
  6871.         v28 = v29;
  6872.       }
  6873.     }
  6874. LABEL_94:
  6875.     *(_QWORD *)v1 = v28 + 1;
  6876. LABEL_95:
  6877.     sub_1800040D0((unsigned __int16 **)v1);
  6878.     if ( !v24 )
  6879.       goto LABEL_98;
  6880.   }
  6881.   if ( v24 == 3 )
  6882.     goto LABEL_100;
  6883. LABEL_98:
  6884.   if ( !*(_DWORD *)(v1 + 116) )
  6885.     sub_1800040C0(a1, 2u);
  6886. LABEL_63:
  6887.   v20 = *(_DWORD *)(v1 + 116);
  6888.   if ( v20 > 0xFFFF )
  6889.     sub_1800040C0(a1, 2u);
  6890.   *(_DWORD *)(v1 + 116) = (unsigned __int16)v20;
  6891.   return 1;
  6892. }
  6893. // 180008446: variable 'v12' is possibly undefined
  6894. // 180008451: variable 'a1' is possibly undefined
  6895. // 18000C0D0: using guessed type __int64 __fastcall std::ctype<wchar_t>::is(_QWORD, _QWORD, _QWORD);
  6896.  
  6897. //----- (0000000180008520) ----------------------------------------------------
  6898. __int64 __fastcall sub_180008520(__int64 a1, unsigned __int8 a2)
  6899. {
  6900.   int v3; // ebx
  6901.   _OWORD *v4; // rdi
  6902.   _OWORD *v5; // r8
  6903.   __int64 v6; // rcx
  6904.   __int64 result; // rax
  6905.  
  6906.   v3 = a2;
  6907.   v4 = sub_18000A224(0x28ui64);
  6908.   *v4 = 0i64;
  6909.   v4[1] = 0i64;
  6910.   *((_QWORD *)v4 + 1) = (unsigned int)(v3 + 10);
  6911.   *((_QWORD *)v4 + 2) = 0i64;
  6912.   *((_QWORD *)v4 + 3) = 0i64;
  6913.   *(_QWORD *)v4 = &std::_Node_assert::`vftable';
  6914.  *((_QWORD *)v4 + 4) = 0i64;
  6915.  v5 = sub_18000A224(0x20ui64);
  6916.  *v5 = 0i64;
  6917.  v5[1] = 0i64;
  6918.  *(_QWORD *)v5 = &std::_Node_base::`vftable';
  6919.   *((_QWORD *)v5 + 1) = 1i64;
  6920.   *((_QWORD *)v5 + 2) = 0i64;
  6921.   *((_QWORD *)v5 + 3) = 0i64;
  6922.   *((_QWORD *)v4 + 3) = *(_QWORD *)(a1 + 72);
  6923.   v6 = *(_QWORD *)(*(_QWORD *)(a1 + 72) + 16i64);
  6924.   if ( v6 )
  6925.   {
  6926.     *((_QWORD *)v4 + 2) = v6;
  6927.     *(_QWORD *)(*(_QWORD *)(*(_QWORD *)(a1 + 72) + 16i64) + 24i64) = v4;
  6928.   }
  6929.   *(_QWORD *)(*(_QWORD *)(a1 + 72) + 16i64) = v4;
  6930.   *((_QWORD *)v4 + 4) = v5;
  6931.   *((_QWORD *)v5 + 3) = v4;
  6932.   *(_QWORD *)(a1 + 72) = v5;
  6933.   sub_1800043A0(a1);
  6934.   result = sub_180004600(a1 + 64, (__int64)v4);
  6935.   *(_QWORD *)(a1 + 72) = v4;
  6936.   return result;
  6937. }
  6938. // 1800043A0: using guessed type __int64 __fastcall sub_1800043A0(_QWORD);
  6939. // 18000C8A8: using guessed type void *std::_Node_assert::`vftable';
  6940. // 18000C8D8: using guessed type void *std::_Node_base::`vftable';
  6941.  
  6942. //----- (0000000180008630) ----------------------------------------------------
  6943. __int64 __fastcall sub_180008630(__int64 a1)
  6944. {
  6945.   _OWORD *v2; // rdx
  6946.   __int64 v3; // rcx
  6947.   __int64 result; // rax
  6948.  
  6949.   v2 = sub_18000A224(0x50ui64);
  6950.   *v2 = 0i64;
  6951.   v2[1] = 0i64;
  6952.   v2[2] = 0i64;
  6953.   v2[3] = 0i64;
  6954.   v2[4] = 0i64;
  6955.   *((_QWORD *)v2 + 3) = 0i64;
  6956.   *((_QWORD *)v2 + 1) = 7i64;
  6957.   *((_QWORD *)v2 + 2) = 0i64;
  6958.   *(_QWORD *)v2 = &std::_Node_class<wchar_t,std::regex_traits<wchar_t>>::`vftable';
  6959.  *((_QWORD *)v2 + 4) = 0i64;
  6960.  *((_QWORD *)v2 + 5) = 0i64;
  6961.  *((_QWORD *)v2 + 6) = 0i64;
  6962.  *((_QWORD *)v2 + 7) = 0i64;
  6963.  *((_WORD *)v2 + 32) = 0;
  6964.  *((_QWORD *)v2 + 9) = 0i64;
  6965.  *((_QWORD *)v2 + 3) = *(_QWORD *)(a1 + 8);
  6966.  v3 = *(_QWORD *)(*(_QWORD *)(a1 + 8) + 16i64);
  6967.  if ( v3 )
  6968.  {
  6969.    *((_QWORD *)v2 + 2) = v3;
  6970.    *(_QWORD *)(*(_QWORD *)(*(_QWORD *)(a1 + 8) + 16i64) + 24i64) = v2;
  6971.  }
  6972.  result = *(_QWORD *)(a1 + 8);
  6973.  *(_QWORD *)(result + 16) = v2;
  6974.  *(_QWORD *)(a1 + 8) = v2;
  6975.  return result;
  6976. }
  6977. // 18000C7E8: using guessed type void *std::_Node_class<wchar_t,std::regex_traits<wchar_t>>::`vftable';
  6978.  
  6979. //----- (00000001800086D0) ----------------------------------------------------
  6980. int __fastcall sub_1800086D0(__int64 a1, __int64 a2)
  6981. {
  6982.   int v2; // eax
  6983.   unsigned __int16 v4; // di
  6984.   __int64 v5; // rbx
  6985.   _OWORD *v6; // r8
  6986.   unsigned __int64 v7; // rcx
  6987.   __int64 v8; // rax
  6988.   __int64 v9; // rsi
  6989.   void *v10; // rbx
  6990.   unsigned int v11; // eax
  6991.   unsigned int v12; // esi
  6992.   void *v13; // rax
  6993.  
  6994.   v2 = *(_DWORD *)(a1 + 16);
  6995.   v4 = a2;
  6996.   if ( (unsigned __int16)a2 >= 0x100u )
  6997.   {
  6998.     if ( (v2 & 0x100) != 0 )
  6999.       v4 = std::ctype<wchar_t>::tolower(*(_QWORD *)(*(_QWORD *)(a1 + 24) + 8i64), a2);
  7000.     v9 = *(_QWORD *)(a1 + 8);
  7001.     v10 = *(void **)(v9 + 48);
  7002.     if ( !v10 )
  7003.     {
  7004.       v10 = sub_18000A224(0x10ui64);
  7005.       *(_QWORD *)v10 = 0i64;
  7006.       *((_QWORD *)v10 + 1) = 0i64;
  7007.       *(_QWORD *)(v9 + 48) = v10;
  7008.     }
  7009.     v11 = *((_DWORD *)v10 + 1);
  7010.     if ( *(_DWORD *)v10 <= v11 )
  7011.     {
  7012.       v12 = v11 + 16;
  7013.       v13 = realloc(*((void **)v10 + 1), 2i64 * (v11 + 16));
  7014.       if ( !v13 )
  7015.       {
  7016.         std::_Xbad_alloc();
  7017.         __debugbreak();
  7018.       }
  7019.       *((_QWORD *)v10 + 1) = v13;
  7020.       *(_DWORD *)v10 = v12;
  7021.     }
  7022.     v8 = *((_QWORD *)v10 + 1);
  7023.     *(_WORD *)(v8 + 2i64 * (unsigned int)(*((_DWORD *)v10 + 1))++) = v4;
  7024.   }
  7025.   else
  7026.   {
  7027.     if ( (v2 & 0x100) != 0 )
  7028.       v4 = std::ctype<wchar_t>::tolower(*(_QWORD *)(*(_QWORD *)(a1 + 24) + 8i64), a2);
  7029.     v5 = *(_QWORD *)(a1 + 8);
  7030.     v6 = *(_OWORD **)(v5 + 40);
  7031.     if ( !v6 )
  7032.     {
  7033.       v6 = sub_18000A224(0x20ui64);
  7034.       *v6 = 0i64;
  7035.       v6[1] = 0i64;
  7036.       *(_QWORD *)(v5 + 40) = v6;
  7037.     }
  7038.     v7 = (unsigned __int64)v4 >> 3;
  7039.     LODWORD(v8) = *((unsigned __int8 *)v6 + v7) | (1 << (v4 & 7));
  7040.     *((_BYTE *)v6 + v7) = v8;
  7041.   }
  7042.   return v8;
  7043. }
  7044. // 18000C0C8: using guessed type __int64 __fastcall std::ctype<wchar_t>::tolower(_QWORD, _QWORD);
  7045. // 18000C100: using guessed type void std::_Xbad_alloc(void);
  7046.  
  7047. //----- (00000001800087E0) ----------------------------------------------------
  7048. __int64 __fastcall sub_1800087E0(_QWORD *a1, int a2, int a3, unsigned __int8 a4)
  7049. {
  7050.   __int64 v4; // rax
  7051.   int v6; // er13
  7052.   __int64 v9; // rdi
  7053.   int v10; // eax
  7054.   _OWORD *v11; // r15
  7055.   _OWORD *v12; // r14
  7056.   _OWORD *v13; // r12
  7057.   _OWORD *v14; // rbx
  7058.   __int64 v15; // rcx
  7059.   __int64 result; // rax
  7060.   __int64 v17; // rdx
  7061.   __int64 v18; // rcx
  7062.   __int64 v19; // rcx
  7063.   _OWORD *v20; // rbx
  7064.   _OWORD *v21; // r9
  7065.   int v22; // er8
  7066.   __int64 v23; // rcx
  7067.   _OWORD *v24; // [rsp+50h] [rbp+8h]
  7068.  
  7069.   v4 = a1[1];
  7070.   v6 = a4;
  7071.   if ( *(_DWORD *)(v4 + 8) == 6 && *(_DWORD *)(v4 + 36) != 1 )
  7072.     sub_1800072A0((__int64)a1, *(_WORD *)(*(_QWORD *)(v4 + 40) + 2i64 * (unsigned int)--*(_DWORD *)(v4 + 36)));
  7073.   v9 = a1[1];
  7074.   v10 = *(_DWORD *)(v9 + 8);
  7075.   if ( v10 == 9 || v10 == 14 )
  7076.     v9 = *(_QWORD *)(v9 + 32);
  7077.   if ( a2 || a3 != 1 )
  7078.   {
  7079.     v20 = sub_18000A224(0x28ui64);
  7080.     *v20 = 0i64;
  7081.     v20[1] = 0i64;
  7082.     *((_QWORD *)v20 + 1) = 19i64;
  7083.     *((_QWORD *)v20 + 2) = 0i64;
  7084.     *((_QWORD *)v20 + 3) = 0i64;
  7085.     *(_QWORD *)v20 = &std::_Node_end_rep::`vftable';
  7086.    *((_QWORD *)v20 + 4) = 0i64;
  7087.    v21 = sub_18000A224(0x38ui64);
  7088.    *v21 = 0i64;
  7089.    v21[1] = 0i64;
  7090.    v21[2] = 0i64;
  7091.    *((_QWORD *)v21 + 6) = 0i64;
  7092.    v22 = *(_DWORD *)(*a1 + 36i64);
  7093.    *(_DWORD *)(*a1 + 36i64) = v22 + 1;
  7094.    *((_DWORD *)v21 + 3) = 2 * v6;
  7095.    *(_QWORD *)v21 = &std::_Node_rep::`vftable';
  7096.     *((_DWORD *)v21 + 2) = 18;
  7097.     *((_QWORD *)v21 + 2) = 0i64;
  7098.     *((_QWORD *)v21 + 3) = 0i64;
  7099.     *((_DWORD *)v21 + 8) = a2;
  7100.     *((_DWORD *)v21 + 9) = a3;
  7101.     *((_QWORD *)v21 + 5) = v20;
  7102.     *((_DWORD *)v21 + 12) = v22;
  7103.     *((_DWORD *)v21 + 13) = -1;
  7104.     *((_QWORD *)v20 + 4) = v21;
  7105.     *((_QWORD *)v20 + 3) = a1[1];
  7106.     v23 = *(_QWORD *)(a1[1] + 16i64);
  7107.     if ( v23 )
  7108.     {
  7109.       *((_QWORD *)v20 + 2) = v23;
  7110.       *(_QWORD *)(*(_QWORD *)(a1[1] + 16i64) + 24i64) = v20;
  7111.     }
  7112.     *(_QWORD *)(a1[1] + 16i64) = v20;
  7113.     a1[1] = v20;
  7114.     *(_QWORD *)(*(_QWORD *)(v9 + 24) + 16i64) = v21;
  7115.     result = *(_QWORD *)(v9 + 24);
  7116.     *((_QWORD *)v21 + 3) = result;
  7117.     *(_QWORD *)(v9 + 24) = v21;
  7118.     *((_QWORD *)v21 + 2) = v9;
  7119.   }
  7120.   else
  7121.   {
  7122.     v11 = sub_18000A224(0x20ui64);
  7123.     *v11 = 0i64;
  7124.     v11[1] = 0i64;
  7125.     *((_QWORD *)v11 + 1) = 17i64;
  7126.     *((_QWORD *)v11 + 2) = 0i64;
  7127.     *((_QWORD *)v11 + 3) = 0i64;
  7128.     *(_QWORD *)v11 = &std::_Node_endif::`vftable';
  7129.    v12 = sub_18000A224(0x30ui64);
  7130.    *v12 = 0i64;
  7131.    v12[1] = 0i64;
  7132.    v12[2] = 0i64;
  7133.    *((_QWORD *)v12 + 1) = 16i64;
  7134.    *((_QWORD *)v12 + 2) = 0i64;
  7135.    *((_QWORD *)v12 + 3) = 0i64;
  7136.    *(_QWORD *)v12 = &std::_Node_if::`vftable';
  7137.     *((_QWORD *)v12 + 4) = v11;
  7138.     *((_QWORD *)v12 + 5) = 0i64;
  7139.     v13 = sub_18000A224(0x30ui64);
  7140.     *v13 = 0i64;
  7141.     v13[1] = 0i64;
  7142.     v13[2] = 0i64;
  7143.     *((_QWORD *)v13 + 1) = 16i64;
  7144.     *((_QWORD *)v13 + 2) = 0i64;
  7145.     *((_QWORD *)v13 + 3) = 0i64;
  7146.     *(_QWORD *)v13 = &std::_Node_if::`vftable';
  7147.    *((_QWORD *)v13 + 4) = v11;
  7148.    *((_QWORD *)v13 + 5) = 0i64;
  7149.    v14 = sub_18000A224(0x20ui64);
  7150.    *v14 = 0i64;
  7151.    v14[1] = 0i64;
  7152.    *((_QWORD *)v14 + 1) = 8i64;
  7153.    *(_QWORD *)v14 = &std::_Node_base::`vftable';
  7154.     *((_QWORD *)v14 + 2) = 0i64;
  7155.     *((_QWORD *)v14 + 3) = 0i64;
  7156.     v24 = sub_18000A224(0x28ui64);
  7157.     *v24 = 0i64;
  7158.     v24[1] = 0i64;
  7159.     *((_QWORD *)v24 + 1) = 9i64;
  7160.     *(_QWORD *)v24 = &std::_Node_end_group::`vftable';
  7161.    *((_QWORD *)v24 + 4) = v14;
  7162.    *((_QWORD *)v13 + 2) = v14;
  7163.    *((_QWORD *)v14 + 3) = v13;
  7164.    *((_QWORD *)v14 + 2) = v24;
  7165.    *((_QWORD *)v24 + 3) = v14;
  7166.    *((_QWORD *)v24 + 2) = v11;
  7167.    *((_QWORD *)v12 + 5) = v13;
  7168.    *((_QWORD *)v11 + 3) = a1[1];
  7169.    v15 = *(_QWORD *)(a1[1] + 16i64);
  7170.    if ( v15 )
  7171.    {
  7172.      *((_QWORD *)v11 + 2) = v15;
  7173.      *(_QWORD *)(*(_QWORD *)(a1[1] + 16i64) + 24i64) = v11;
  7174.    }
  7175.    *(_QWORD *)(a1[1] + 16i64) = v11;
  7176.    a1[1] = v11;
  7177.    *(_QWORD *)(*(_QWORD *)(v9 + 24) + 16i64) = v12;
  7178.    result = *(_QWORD *)(v9 + 24);
  7179.    *((_QWORD *)v12 + 3) = result;
  7180.    *(_QWORD *)(v9 + 24) = v12;
  7181.    *((_QWORD *)v12 + 2) = v9;
  7182.    if ( !(_BYTE)v6 )
  7183.    {
  7184.      v17 = *((_QWORD *)v13 + 2);
  7185.      v18 = *(_QWORD *)(v9 + 24);
  7186.      *(_QWORD *)(v9 + 24) = *(_QWORD *)(v17 + 24);
  7187.      *(_QWORD *)(v17 + 24) = v18;
  7188.      result = *((_QWORD *)v13 + 2);
  7189.      v19 = *((_QWORD *)v12 + 2);
  7190.      *((_QWORD *)v12 + 2) = result;
  7191.      *((_QWORD *)v13 + 2) = v19;
  7192.    }
  7193.  }
  7194.  return result;
  7195. }
  7196. // 18000C848: using guessed type void *std::_Node_rep::`vftable';
  7197. // 18000C858: using guessed type void *std::_Node_end_rep::`vftable';
  7198. // 18000C868: using guessed type void *std::_Node_if::`vftable';
  7199. // 18000C878: using guessed type void *std::_Node_endif::`vftable';
  7200. // 18000C8B8: using guessed type void *std::_Node_end_group::`vftable';
  7201. // 18000C8D8: using guessed type void *std::_Node_base::`vftable';
  7202.  
  7203. //----- (0000000180008B10) ----------------------------------------------------
  7204. __int64 __fastcall sub_180008B10(_QWORD *a1, __int64 a2, _BYTE *a3, _BYTE *a4)
  7205. {
  7206.   __int64 v7; // rsi
  7207.   size_t v8; // rbx
  7208.   unsigned __int64 v9; // rax
  7209.   __int64 v10; // r12
  7210.   char *v11; // rbp
  7211.   unsigned __int64 v12; // rsi
  7212.   void *v13; // rax
  7213.   char *v14; // r15
  7214.   __int64 v15; // r12
  7215.   unsigned __int64 v16; // rdx
  7216.   _QWORD *v17; // rcx
  7217.   void *v18; // rcx
  7218.   char *v19; // rax
  7219.   void *Block[2]; // [rsp+28h] [rbp-80h] BYREF
  7220.   __m128i si128; // [rsp+38h] [rbp-70h]
  7221.   __int64 v23; // [rsp+48h] [rbp-60h]
  7222.   __int128 v24; // [rsp+50h] [rbp-58h]
  7223.   __int64 v25; // [rsp+60h] [rbp-48h]
  7224.  
  7225.   v23 = a2;
  7226.   *(_OWORD *)a2 = 0i64;
  7227.   *(_QWORD *)(a2 + 16) = 0i64;
  7228.   *(_QWORD *)(a2 + 24) = 7i64;
  7229.   *(_WORD *)a2 = 0;
  7230.   if ( a3 != a4 )
  7231.   {
  7232.     v24 = 0i64;
  7233.     v7 = 0i64;
  7234.     v25 = 0i64;
  7235.     v8 = a4 - a3;
  7236.     v9 = (a4 - a3) >> 1;
  7237.     v10 = 0i64;
  7238.     v11 = 0i64;
  7239.     if ( (unsigned __int64)(a4 - a3) < 2 )
  7240.     {
  7241.       v14 = (char *)v24;
  7242.     }
  7243.     else
  7244.     {
  7245.       if ( v9 > 0x7FFFFFFFFFFFFFFFi64 )
  7246.         sub_1800033B0();
  7247.       v12 = 2 * v9;
  7248.       if ( 2 * v9 < 0x1000 )
  7249.       {
  7250.         if ( v12 )
  7251.           v11 = (char *)sub_18000A224(2 * v9);
  7252.         else
  7253.           v11 = 0i64;
  7254.       }
  7255.       else
  7256.       {
  7257.         if ( v12 + 39 <= v12 )
  7258.           Concurrency::cancel_current_task();
  7259.         v13 = sub_18000A224(v12 + 39);
  7260.         if ( !v13 )
  7261. LABEL_28:
  7262.           invalid_parameter_noinfo_noreturn();
  7263.         v11 = (char *)(((unsigned __int64)v13 + 39) & 0xFFFFFFFFFFFFFFE0ui64);
  7264.         *((_QWORD *)v11 - 1) = v13;
  7265.       }
  7266.       v14 = v11;
  7267.       *(_QWORD *)&v24 = v11;
  7268.       v7 = (__int64)&v11[v12];
  7269.       v10 = v7;
  7270.       v25 = v7;
  7271.       memmove(v11, a3, v8);
  7272.       *((_QWORD *)&v24 + 1) = v7;
  7273.     }
  7274.     v15 = (v10 - (__int64)v11) >> 1;
  7275.     std::ctype<wchar_t>::tolower(a1[1], v14, &v11[2 * v15]);
  7276.     (*(void (__fastcall **)(_QWORD, void **, char *, char *, int))(*(_QWORD *)*a1 + 32i64))(
  7277.       *a1,
  7278.       Block,
  7279.       v14,
  7280.       &v14[2 * v15],
  7281.       1);
  7282.     if ( (void **)a2 != Block )
  7283.     {
  7284.       v16 = *(_QWORD *)(a2 + 24);
  7285.       if ( v16 >= 8 )
  7286.       {
  7287.         v17 = *(_QWORD **)a2;
  7288.         if ( 2 * v16 + 2 >= 0x1000 )
  7289.         {
  7290.           if ( (unsigned __int64)v17 - *(v17 - 1) - 8 > 0x1F )
  7291.             goto LABEL_23;
  7292.           v17 = (_QWORD *)*(v17 - 1);
  7293.         }
  7294.         j_j_free(v17);
  7295.       }
  7296.       *(_QWORD *)(a2 + 24) = 7i64;
  7297.       *(_OWORD *)a2 = *(_OWORD *)Block;
  7298.       *(__m128i *)(a2 + 16) = si128;
  7299.       si128 = _mm_load_si128((const __m128i *)&xmmword_18000CA00);
  7300.       LOWORD(Block[0]) = 0;
  7301.     }
  7302.     if ( si128.m128i_i64[1] >= 8ui64 )
  7303.     {
  7304.       v18 = Block[0];
  7305.       if ( (unsigned __int64)(2 * si128.m128i_i64[1] + 2) >= 0x1000 )
  7306.       {
  7307.         v18 = (void *)*((_QWORD *)Block[0] - 1);
  7308.         if ( (unsigned __int64)(Block[0] - v18 - 8) > 0x1F )
  7309. LABEL_23:
  7310.           invalid_parameter_noinfo_noreturn();
  7311.       }
  7312.       j_j_free(v18);
  7313.     }
  7314.     if ( v14 )
  7315.     {
  7316.       v19 = v14;
  7317.       if ( (unsigned __int64)(2 * ((v7 - (__int64)v14) >> 1)) >= 0x1000 )
  7318.       {
  7319.         v14 = (char *)*((_QWORD *)v14 - 1);
  7320.         if ( (unsigned __int64)(v19 - v14 - 8) > 0x1F )
  7321.           goto LABEL_28;
  7322.       }
  7323.       j_j_free(v14);
  7324.     }
  7325.   }
  7326.   return a2;
  7327. }
  7328. // 18000C0C0: using guessed type __int64 __fastcall std::ctype<wchar_t>::tolower(_QWORD, _QWORD, _QWORD);
  7329. // 18000CA00: using guessed type __int128 xmmword_18000CA00;
  7330.  
  7331. //----- (0000000180008D90) ----------------------------------------------------
  7332. __int64 __fastcall sub_180008D90(__int64 a1, unsigned __int64 a2, __int64 a3, const void *a4)
  7333. {
  7334.   __int64 v4; // rbx
  7335.   unsigned __int64 v8; // rdx
  7336.   unsigned __int64 v9; // rbp
  7337.   unsigned __int64 v10; // rcx
  7338.   unsigned __int64 v11; // rax
  7339.   size_t v12; // rcx
  7340.   void *v13; // rax
  7341.   _QWORD *v14; // rdi
  7342.   void *v15; // rcx
  7343.  
  7344.   v4 = 0x7FFFFFFFFFFFFFFEi64;
  7345.   if ( a2 > 0x7FFFFFFFFFFFFFFEi64 )
  7346.     sub_180001210();
  7347.   v8 = a2 | 7;
  7348.   v9 = *(_QWORD *)(a1 + 24);
  7349.   if ( v8 <= 0x7FFFFFFFFFFFFFFEi64 )
  7350.   {
  7351.     v10 = v9 >> 1;
  7352.     if ( v9 <= 0x7FFFFFFFFFFFFFFEi64 - (v9 >> 1) )
  7353.     {
  7354.       v4 = v8;
  7355.       if ( v8 < v10 + v9 )
  7356.         v4 = v10 + v9;
  7357.     }
  7358.   }
  7359.   v11 = v4 + 1;
  7360.   if ( v4 == -1 )
  7361.     v11 = -1i64;
  7362.   if ( v11 > 0x7FFFFFFFFFFFFFFFi64 )
  7363.     goto LABEL_24;
  7364.   v12 = 2 * v11;
  7365.   if ( 2 * v11 < 0x1000 )
  7366.   {
  7367.     if ( v12 )
  7368.       v14 = sub_18000A224(v12);
  7369.     else
  7370.       v14 = 0i64;
  7371.     goto LABEL_16;
  7372.   }
  7373.   if ( v12 + 39 <= v12 )
  7374. LABEL_24:
  7375.     Concurrency::cancel_current_task();
  7376.   v13 = sub_18000A224(v12 + 39);
  7377.   if ( !v13 )
  7378.     goto LABEL_22;
  7379.   v14 = (_QWORD *)(((unsigned __int64)v13 + 39) & 0xFFFFFFFFFFFFFFE0ui64);
  7380.   *(v14 - 1) = v13;
  7381. LABEL_16:
  7382.   *(_QWORD *)(a1 + 24) = v4;
  7383.   *(_QWORD *)(a1 + 16) = a2;
  7384.   memcpy(v14, a4, 2 * a2);
  7385.   *((_WORD *)v14 + a2) = 0;
  7386.   if ( v9 >= 8 )
  7387.   {
  7388.     v15 = *(void **)a1;
  7389.     if ( 2 * v9 + 2 < 0x1000 )
  7390.     {
  7391. LABEL_20:
  7392.       j_j_free(v15);
  7393.       goto LABEL_21;
  7394.     }
  7395.     if ( (unsigned __int64)v15 - *((_QWORD *)v15 - 1) - 8 <= 0x1F )
  7396.     {
  7397.       v15 = (void *)*((_QWORD *)v15 - 1);
  7398.       goto LABEL_20;
  7399.     }
  7400. LABEL_22:
  7401.     invalid_parameter_noinfo_noreturn();
  7402.   }
  7403. LABEL_21:
  7404.   *(_QWORD *)a1 = v14;
  7405.   return a1;
  7406. }
  7407.  
  7408. //----- (0000000180008EF0) ----------------------------------------------------
  7409. __int64 __fastcall sub_180008EF0(__int64 a1)
  7410. {
  7411.   _QWORD *v2; // rcx
  7412.   __int64 result; // rax
  7413.  
  7414.   v2 = *(_QWORD **)a1;
  7415.   if ( v2 )
  7416.   {
  7417.     if ( (unsigned __int64)(2 * ((__int64)(*(_QWORD *)(a1 + 16) - (_QWORD)v2) >> 1)) >= 0x1000 )
  7418.     {
  7419.       if ( (unsigned __int64)v2 - *(v2 - 1) - 8 > 0x1F )
  7420.         invalid_parameter_noinfo_noreturn();
  7421.       v2 = (_QWORD *)*(v2 - 1);
  7422.     }
  7423.     j_j_free(v2);
  7424.     result = 0i64;
  7425.     *(_QWORD *)a1 = 0i64;
  7426.     *(_QWORD *)(a1 + 8) = 0i64;
  7427.     *(_QWORD *)(a1 + 16) = 0i64;
  7428.   }
  7429.   return result;
  7430. }
  7431.  
  7432. //----- (0000000180008F50) ----------------------------------------------------
  7433. void *__fastcall sub_180008F50(void *Block, char a2)
  7434. {
  7435.   free(*((void **)Block + 5));
  7436.   *(_QWORD *)Block = &std::_Node_base::`vftable';
  7437.  if ( (a2 & 1) != 0 )
  7438.    j_j_free(Block);
  7439.  return Block;
  7440. }
  7441. // 18000C8D8: using guessed type void *std::_Node_base::`vftable';
  7442.  
  7443. //----- (0000000180008FA0) ----------------------------------------------------
  7444. void __fastcall sub_180008FA0(__int64 a1, int a2)
  7445. {
  7446.   int v2; // edi
  7447.   __int64 v4; // rcx
  7448.   int v5; // er8
  7449.   unsigned __int16 *v6; // rax
  7450.   int v7; // er8
  7451.   unsigned __int16 *v8; // rcx
  7452.   _WORD *v9; // rdx
  7453.   int v10; // er8
  7454.  
  7455.   *(_DWORD *)(a1 + 116) = 0;
  7456.   v2 = a2;
  7457.   if ( a2 )
  7458.   {
  7459.     while ( 1 )
  7460.     {
  7461.       v4 = *(unsigned __int16 *)(a1 + 120);
  7462.       if ( (unsigned __int16)(v4 - 48) > 9u )
  7463.       {
  7464.         if ( (unsigned __int16)(v4 - 97) > 5u )
  7465.         {
  7466.           if ( (unsigned __int16)(v4 - 65) > 5u )
  7467.             break;
  7468.           v4 = (unsigned int)(v4 - 55);
  7469.         }
  7470.         else
  7471.         {
  7472.           v4 = (unsigned int)(v4 - 87);
  7473.         }
  7474.       }
  7475.       else
  7476.       {
  7477.         v4 = (unsigned int)(v4 - 48);
  7478.       }
  7479.       if ( (_DWORD)v4 == -1 )
  7480.         break;
  7481.       v5 = *(_DWORD *)(a1 + 116);
  7482.       if ( v5 > (0x7FFFFFFF - (int)v4) / 16 )
  7483.         sub_1800040C0(v4, 2u);
  7484.       v6 = *(unsigned __int16 **)(a1 + 16);
  7485.       --v2;
  7486.       v7 = v4 + 16 * v5;
  7487.       v8 = *(unsigned __int16 **)a1;
  7488.       *(_DWORD *)(a1 + 116) = v7;
  7489.       if ( v8 != v6 )
  7490.       {
  7491.         if ( *v8 == 92 )
  7492.         {
  7493.           v9 = v8 + 1;
  7494.           if ( v8 + 1 != v6 )
  7495.           {
  7496.             if ( (v10 = *(_DWORD *)(a1 + 128), (v10 & 8) == 0) && (unsigned __int16)(*v9 - 40) <= 1u
  7497.               || (v10 & 0x10) == 0 && ((*v9 - 123) & 0xFFFD) == 0 )
  7498.             {
  7499.               ++v8;
  7500.             }
  7501.           }
  7502.         }
  7503.         *(_QWORD *)a1 = v8 + 1;
  7504.       }
  7505.       sub_1800040D0((unsigned __int16 **)a1);
  7506.       if ( !v2 )
  7507.         return;
  7508.     }
  7509.     if ( v2 )
  7510.       sub_1800040C0(v4, 2u);
  7511.   }
  7512. }
  7513.  
  7514. //----- (00000001800090C0) ----------------------------------------------------
  7515. __int64 __fastcall sub_1800090C0(__int64 a1)
  7516. {
  7517.   int v1; // eax
  7518.   unsigned __int16 *v3; // rcx
  7519.   unsigned __int16 *v4; // rax
  7520.   _WORD *v5; // rdx
  7521.   int v6; // er8
  7522.   int v7; // edx
  7523.   unsigned __int16 *v8; // rcx
  7524.   unsigned __int16 *v9; // rax
  7525.   _WORD *v10; // r8
  7526.   __int64 v12; // rcx
  7527.   __int16 v13; // ax
  7528.   int v14; // eax
  7529.   __int16 v15; // ax
  7530.   unsigned __int16 *v16; // rcx
  7531.   unsigned __int16 *v17; // rax
  7532.   _WORD *v18; // r8
  7533.   unsigned __int16 *v19; // rax
  7534.   unsigned __int16 *v20; // rcx
  7535.   unsigned __int16 *v21; // rax
  7536.   _WORD *v22; // rdx
  7537.   int v23; // er8
  7538.   unsigned __int64 v24; // rdi
  7539.   __int64 v25; // rcx
  7540.   unsigned __int16 *v26; // rax
  7541.   unsigned __int16 *v27; // rdx
  7542.   unsigned __int16 *v28; // rcx
  7543.   int v29; // edx
  7544.   unsigned __int16 *v30; // rdx
  7545.   unsigned __int16 *v31; // rax
  7546.   unsigned __int16 *v32; // rcx
  7547.   int v33; // edx
  7548.  
  7549.   v1 = *(_DWORD *)(a1 + 124);
  7550.   if ( v1 != 92 )
  7551.   {
  7552.     if ( v1 == 91 )
  7553.     {
  7554.       v20 = *(unsigned __int16 **)a1;
  7555.       v21 = *(unsigned __int16 **)(a1 + 16);
  7556.       if ( v20 != v21 )
  7557.       {
  7558.         if ( *v20 == 92 )
  7559.         {
  7560.           v22 = v20 + 1;
  7561.           if ( v20 + 1 != v21 )
  7562.           {
  7563.             if ( (v23 = *(_DWORD *)(a1 + 128), (v23 & 8) == 0) && (unsigned __int16)(*v22 - 40) <= 1u
  7564.               || (v23 & 0x10) == 0 && ((*v22 - 123) & 0xFFFD) == 0 )
  7565.             {
  7566.               ++v20;
  7567.             }
  7568.           }
  7569.         }
  7570.         *(_QWORD *)a1 = v20 + 1;
  7571.       }
  7572.       sub_1800040D0((unsigned __int16 **)a1);
  7573.       v24 = *(int *)(a1 + 124);
  7574.       if ( (unsigned int)v24 > 0x3D || (v25 = 0x2400400000000000i64, !_bittest64(&v25, v24)) )
  7575.       {
  7576.         *(_DWORD *)(a1 + 116) = 91;
  7577.         return 1i64;
  7578.       }
  7579.       v26 = *(unsigned __int16 **)a1;
  7580.       v27 = *(unsigned __int16 **)(a1 + 16);
  7581.       if ( *(unsigned __int16 **)a1 == v27 )
  7582.       {
  7583. LABEL_81:
  7584.         sub_1800040D0((unsigned __int16 **)a1);
  7585.         sub_180009910(a1, v24);
  7586.         return 2i64;
  7587.       }
  7588.       if ( *v26 != 92 || (v28 = v26 + 1, v26 + 1 == v27) )
  7589.       {
  7590. LABEL_80:
  7591.         *(_QWORD *)a1 = v26 + 1;
  7592.         goto LABEL_81;
  7593.       }
  7594.       v29 = *(_DWORD *)(a1 + 128);
  7595.       if ( (v29 & 8) == 0 )
  7596.       {
  7597.         if ( (unsigned __int16)(*v28 - 40) <= 1u )
  7598.         {
  7599. LABEL_79:
  7600.           v26 = v28;
  7601.           goto LABEL_80;
  7602.         }
  7603.         v26 = *(unsigned __int16 **)a1;
  7604.       }
  7605.       if ( (v29 & 0x10) != 0 || *v28 != 123 && *v28 != 125 )
  7606.         goto LABEL_80;
  7607.       goto LABEL_79;
  7608.     }
  7609.     if ( v1 == 93 || v1 == -1 )
  7610.       return 0i64;
  7611.     v30 = *(unsigned __int16 **)(a1 + 16);
  7612.     *(_DWORD *)(a1 + 116) = *(unsigned __int16 *)(a1 + 120);
  7613.     v31 = *(unsigned __int16 **)a1;
  7614.     if ( *(unsigned __int16 **)a1 == v30 )
  7615.       goto LABEL_97;
  7616.     if ( *v31 != 92 || (v32 = v31 + 1, v31 + 1 == v30) )
  7617.     {
  7618. LABEL_95:
  7619.       v19 = v31 + 1;
  7620. LABEL_96:
  7621.       *(_QWORD *)a1 = v19;
  7622.       goto LABEL_97;
  7623.     }
  7624.     v33 = *(_DWORD *)(a1 + 128);
  7625.     if ( (v33 & 8) == 0 )
  7626.     {
  7627.       if ( (unsigned __int16)(*v32 - 40) <= 1u )
  7628.       {
  7629. LABEL_94:
  7630.         v31 = v32;
  7631.         goto LABEL_95;
  7632.       }
  7633.       v31 = *(unsigned __int16 **)a1;
  7634.     }
  7635.     if ( (v33 & 0x10) != 0 || *v32 != 123 && *v32 != 125 )
  7636.       goto LABEL_95;
  7637.     goto LABEL_94;
  7638.   }
  7639.   v3 = *(unsigned __int16 **)a1;
  7640.   v4 = *(unsigned __int16 **)(a1 + 16);
  7641.   if ( v3 != v4 )
  7642.   {
  7643.     if ( *v3 == 92 )
  7644.     {
  7645.       v5 = v3 + 1;
  7646.       if ( v3 + 1 != v4 )
  7647.       {
  7648.         if ( (v6 = *(_DWORD *)(a1 + 128), (v6 & 8) == 0) && (unsigned __int16)(*v5 - 40) <= 1u
  7649.           || (v6 & 0x10) == 0 && ((*v5 - 123) & 0xFFFD) == 0 )
  7650.         {
  7651.           ++v3;
  7652.         }
  7653.       }
  7654.     }
  7655.     *(_QWORD *)a1 = v3 + 1;
  7656.   }
  7657.   sub_1800040D0((unsigned __int16 **)a1);
  7658.   v7 = *(_DWORD *)(a1 + 128);
  7659.   if ( (v7 & 0x200000) == 0 )
  7660.   {
  7661.     if ( (v7 & 0x10000) != 0 )
  7662.     {
  7663.       v13 = *(_WORD *)(a1 + 120);
  7664.       switch ( v13 )
  7665.       {
  7666.         case 'f':
  7667.           v14 = 12;
  7668.           goto LABEL_48;
  7669.         case 'n':
  7670.           v14 = 10;
  7671.           goto LABEL_48;
  7672.         case 'r':
  7673.           v14 = 13;
  7674.           goto LABEL_48;
  7675.         case 't':
  7676.           v14 = 9;
  7677.           goto LABEL_48;
  7678.         case 'v':
  7679.           v14 = 11;
  7680.           goto LABEL_48;
  7681.       }
  7682.     }
  7683.     if ( (v7 & 0x8000) != 0 )
  7684.     {
  7685.       v15 = *(_WORD *)(a1 + 120);
  7686.       if ( v15 == 97 )
  7687.       {
  7688.         v14 = 7;
  7689.         goto LABEL_48;
  7690.       }
  7691.       if ( v15 == 98 )
  7692.       {
  7693.         v14 = 8;
  7694. LABEL_48:
  7695.         *(_DWORD *)(a1 + 116) = v14;
  7696.         v16 = *(unsigned __int16 **)a1;
  7697.         v17 = *(unsigned __int16 **)(a1 + 16);
  7698.         if ( *(unsigned __int16 **)a1 != v17 )
  7699.         {
  7700.           if ( *v16 == 92 )
  7701.           {
  7702.             v18 = v16 + 1;
  7703.             if ( v16 + 1 != v17
  7704.               && ((v7 & 8) == 0 && (unsigned __int16)(*v18 - 40) <= 1u
  7705.                || (v7 & 0x10) == 0 && ((*v18 - 123) & 0xFFFD) == 0) )
  7706.             {
  7707.               ++v16;
  7708.             }
  7709.           }
  7710.           v19 = v16 + 1;
  7711.           goto LABEL_96;
  7712.         }
  7713. LABEL_97:
  7714.         sub_1800040D0((unsigned __int16 **)a1);
  7715.         return 1i64;
  7716.       }
  7717.     }
  7718.     *(_DWORD *)(a1 + 116) = 92;
  7719.     return 1i64;
  7720.   }
  7721.   if ( (v7 & 0x4000) != 0 && *(_WORD *)(a1 + 120) == 92 )
  7722.   {
  7723.     v8 = *(unsigned __int16 **)a1;
  7724.     v9 = *(unsigned __int16 **)(a1 + 16);
  7725.     *(_DWORD *)(a1 + 116) = 92;
  7726.     if ( v8 != v9 )
  7727.     {
  7728.       if ( *v8 == 92 )
  7729.       {
  7730.         v10 = v8 + 1;
  7731.         if ( v8 + 1 != v9
  7732.           && ((v7 & 8) == 0 && (unsigned __int16)(*v10 - 40) <= 1u || (v7 & 0x10) == 0 && ((*v10 - 123) & 0xFFFD) == 0) )
  7733.         {
  7734.           ++v8;
  7735.         }
  7736.       }
  7737.       *(_QWORD *)a1 = v8 + 1;
  7738.     }
  7739.     sub_1800040D0((unsigned __int16 **)a1);
  7740.     return 1i64;
  7741.   }
  7742.   if ( (v7 & 0x20000) != 0 && sub_180007CD0(a1, 0) )
  7743.     return 2i64;
  7744.   if ( sub_180007BC0(a1, 2u) )
  7745.   {
  7746.     if ( *(_DWORD *)(a1 + 116) )
  7747.       sub_1800040C0(v12, 2u);
  7748.     return 1i64;
  7749.   }
  7750.   return sub_180007F60(a1) != 0;
  7751. }
  7752. // 180009495: variable 'v12' is possibly undefined
  7753.  
  7754. //----- (00000001800094A0) ----------------------------------------------------
  7755. void __fastcall sub_1800094A0(__int64 a1, __int64 a2, unsigned __int16 a3)
  7756. {
  7757.   unsigned int v5; // edi
  7758.   unsigned int v6; // er14
  7759.   __int64 v7; // rsi
  7760.   _OWORD *v8; // rax
  7761.   _BYTE *v9; // rdx
  7762.   char v10; // al
  7763.   __int16 v11; // r12
  7764.   __int64 v12; // rsi
  7765.   void *v13; // rbx
  7766.   unsigned int v14; // eax
  7767.   unsigned int v15; // er13
  7768.   void *v16; // rax
  7769.   void *v17; // rbx
  7770.   unsigned int v18; // eax
  7771.   unsigned int v19; // ebp
  7772.   void *v20; // rax
  7773.   __int64 v21; // rbx
  7774.   unsigned int v22; // edi
  7775.   unsigned int v23; // edi
  7776.   void *v24; // rax
  7777.  
  7778.   if ( (*(_DWORD *)(a1 + 16) & 0x100) != 0 )
  7779.   {
  7780.     v5 = (unsigned __int16)std::ctype<wchar_t>::tolower(*(_QWORD *)(*(_QWORD *)(a1 + 24) + 8i64), a2);
  7781.     v6 = (unsigned __int16)std::ctype<wchar_t>::tolower(*(_QWORD *)(*(_QWORD *)(a1 + 24) + 8i64), a3);
  7782.   }
  7783.   else
  7784.   {
  7785.     v5 = (unsigned __int16)a2;
  7786.     v6 = a3;
  7787.   }
  7788.   v7 = *(_QWORD *)(a1 + 8);
  7789.   if ( v6 >= v5 )
  7790.   {
  7791.     do
  7792.     {
  7793.       if ( v6 >= *(_DWORD *)(a1 + 32) )
  7794.         break;
  7795.       v8 = *(_OWORD **)(v7 + 40);
  7796.       if ( !v8 )
  7797.       {
  7798.         v8 = sub_18000A224(0x20ui64);
  7799.         *v8 = 0i64;
  7800.         v8[1] = 0i64;
  7801.         *(_QWORD *)(v7 + 40) = v8;
  7802.       }
  7803.       v9 = (char *)v8 + ((unsigned __int64)v5 >> 3);
  7804.       v10 = v5++ & 7;
  7805.       *v9 |= 1 << v10;
  7806.     }
  7807.     while ( v5 <= v6 );
  7808.     if ( v6 >= v5 )
  7809.     {
  7810.       if ( v6 - v5 >= *(_DWORD *)(a1 + 36) )
  7811.       {
  7812.         v17 = *(void **)(v7 + 56);
  7813.         if ( !v17 )
  7814.         {
  7815.           v17 = sub_18000A224(0x10ui64);
  7816.           *(_QWORD *)v17 = 0i64;
  7817.           *((_QWORD *)v17 + 1) = 0i64;
  7818.           *(_QWORD *)(v7 + 56) = v17;
  7819.         }
  7820.         v18 = *((_DWORD *)v17 + 1);
  7821.         if ( *(_DWORD *)v17 <= v18 )
  7822.         {
  7823.           v19 = v18 + 16;
  7824.           v20 = realloc(*((void **)v17 + 1), 2i64 * (v18 + 16));
  7825.           if ( !v20 )
  7826.           {
  7827. LABEL_24:
  7828.             std::_Xbad_alloc();
  7829.             __debugbreak();
  7830.           }
  7831.           *((_QWORD *)v17 + 1) = v20;
  7832.           *(_DWORD *)v17 = v19;
  7833.         }
  7834.         *(_WORD *)(*((_QWORD *)v17 + 1) + 2i64 * (unsigned int)(*((_DWORD *)v17 + 1))++) = v5;
  7835.         v21 = *(_QWORD *)(v7 + 56);
  7836.         v22 = *(_DWORD *)(v21 + 4);
  7837.         if ( *(_DWORD *)v21 <= v22 )
  7838.         {
  7839.           v23 = v22 + 16;
  7840.           v24 = realloc(*(void **)(v21 + 8), 2i64 * v23);
  7841.           if ( !v24 )
  7842.           {
  7843.             std::_Xbad_alloc();
  7844.             __debugbreak();
  7845.           }
  7846.           *(_QWORD *)(v21 + 8) = v24;
  7847.           *(_DWORD *)v21 = v23;
  7848.         }
  7849.         *(_WORD *)(*(_QWORD *)(v21 + 8) + 2i64 * (unsigned int)(*(_DWORD *)(v21 + 4))++) = v6;
  7850.       }
  7851.       else
  7852.       {
  7853.         do
  7854.         {
  7855.           v11 = v5;
  7856.           if ( (*(_DWORD *)(a1 + 16) & 0x100) != 0 )
  7857.             v11 = std::ctype<wchar_t>::tolower(*(_QWORD *)(*(_QWORD *)(a1 + 24) + 8i64), (unsigned __int16)v5);
  7858.           v12 = *(_QWORD *)(a1 + 8);
  7859.           v13 = *(void **)(v12 + 48);
  7860.           if ( !v13 )
  7861.           {
  7862.             v13 = sub_18000A224(0x10ui64);
  7863.             *(_QWORD *)v13 = 0i64;
  7864.             *((_QWORD *)v13 + 1) = 0i64;
  7865.             *(_QWORD *)(v12 + 48) = v13;
  7866.           }
  7867.           v14 = *((_DWORD *)v13 + 1);
  7868.           if ( *(_DWORD *)v13 <= v14 )
  7869.           {
  7870.             v15 = v14 + 16;
  7871.             v16 = realloc(*((void **)v13 + 1), 2i64 * (v14 + 16));
  7872.             if ( !v16 )
  7873.               goto LABEL_24;
  7874.             *((_QWORD *)v13 + 1) = v16;
  7875.             *(_DWORD *)v13 = v15;
  7876.           }
  7877.           ++v5;
  7878.           *(_WORD *)(*((_QWORD *)v13 + 1) + 2i64 * (unsigned int)(*((_DWORD *)v13 + 1))++) = v11;
  7879.         }
  7880.         while ( v5 <= v6 );
  7881.       }
  7882.     }
  7883.   }
  7884. }
  7885. // 18000C0C8: using guessed type __int64 __fastcall std::ctype<wchar_t>::tolower(_QWORD, _QWORD);
  7886. // 18000C100: using guessed type void std::_Xbad_alloc(void);
  7887.  
  7888. //----- (00000001800096C0) ----------------------------------------------------
  7889. char __fastcall sub_1800096C0(__int64 a1, unsigned __int16 a2, char a3)
  7890. {
  7891.   __int64 v3; // rsi
  7892.   unsigned int v4; // ebx
  7893.   unsigned __int64 v5; // rdi
  7894.   __int64 v9; // rcx
  7895.   char result; // al
  7896.   _OWORD *v11; // rax
  7897.   _BYTE *v12; // rdx
  7898.  
  7899.   v3 = *(_QWORD *)(a1 + 8);
  7900.   v4 = 0;
  7901.   v5 = 0i64;
  7902.   do
  7903.   {
  7904.     v9 = *(_QWORD *)(a1 + 24);
  7905.     if ( a2 == 0xFFFF )
  7906.     {
  7907.       if ( (_WORD)v4 == 95 || (result = std::ctype<wchar_t>::is(*(_QWORD *)(v9 + 8), 263i64, (unsigned __int16)v4)) != 0 )
  7908.         result = 1;
  7909.     }
  7910.     else
  7911.     {
  7912.       result = std::ctype<wchar_t>::is(*(_QWORD *)(v9 + 8), a2, (unsigned __int16)v4);
  7913.     }
  7914.     if ( result != a3 )
  7915.     {
  7916.       v11 = *(_OWORD **)(v3 + 40);
  7917.       if ( !v11 )
  7918.       {
  7919.         v11 = sub_18000A224(0x20ui64);
  7920.         *v11 = 0i64;
  7921.         v11[1] = 0i64;
  7922.         *(_QWORD *)(v3 + 40) = v11;
  7923.       }
  7924.       v12 = (char *)v11 + (v5 >> 3);
  7925.       result = v4 & 7;
  7926.       *v12 |= 1 << (v4 & 7);
  7927.     }
  7928.     ++v4;
  7929.     ++v5;
  7930.   }
  7931.   while ( v4 < 0x100 );
  7932.   *(_WORD *)(v3 + 64) |= a2;
  7933.   return result;
  7934. }
  7935. // 18000C0D0: using guessed type __int64 __fastcall std::ctype<wchar_t>::is(_QWORD, _QWORD, _QWORD);
  7936.  
  7937. //----- (00000001800097A0) ----------------------------------------------------
  7938. __int64 __fastcall sub_1800097A0(__int64 a1, unsigned __int16 *a2, unsigned __int16 *a3, char a4)
  7939. {
  7940.   unsigned __int16 v4; // r15
  7941.   __int64 v5; // r12
  7942.   __int64 v8; // rcx
  7943.   __int64 v9; // r8
  7944.   char *v10; // r14
  7945.   unsigned __int16 *v11; // rbx
  7946.   unsigned __int16 v12; // si
  7947.   __int16 v13; // di
  7948.   char v15; // [rsp+20h] [rbp-48h]
  7949.   unsigned __int16 *v16; // [rsp+28h] [rbp-40h]
  7950.   __int64 v17; // [rsp+30h] [rbp-38h]
  7951.  
  7952.   v4 = 0;
  7953.   LODWORD(v5) = 0;
  7954.   v15 = a4;
  7955.   v16 = a2;
  7956.   if ( L"alnum" )
  7957.   {
  7958.     v8 = 0i64;
  7959.     v9 = a3 - a2;
  7960.     v17 = v9;
  7961.     do
  7962.     {
  7963.       if ( v9 == LODWORD((&off_18000C650)[v8 + 2]) )
  7964.       {
  7965.         v10 = (&off_18000C650)[v8 + 1];
  7966.         v11 = a2;
  7967.         if ( a2 == a3 )
  7968.           break;
  7969.         while ( 1 )
  7970.         {
  7971.           v12 = *(_WORD *)v10;
  7972.           v13 = std::ctype<wchar_t>::tolower(*(_QWORD *)(a1 + 8), *v11);
  7973.           if ( v13 != (unsigned __int16)std::ctype<wchar_t>::tolower(*(_QWORD *)(a1 + 8), v12) )
  7974.             break;
  7975.           ++v11;
  7976.           v10 += 2;
  7977.           if ( v11 == a3 )
  7978.             goto LABEL_7;
  7979.         }
  7980.         a2 = v16;
  7981.         v9 = v17;
  7982.       }
  7983.       v5 = (unsigned int)(v5 + 1);
  7984.       v8 = 3 * v5;
  7985.     }
  7986.     while ( (&off_18000C650)[3 * v5 + 1] );
  7987. LABEL_7:
  7988.     a4 = v15;
  7989.   }
  7990.   if ( (&off_18000C650)[3 * (unsigned int)v5 + 1] )
  7991.     v4 = *((_WORD *)&off_18000C650 + 12 * (unsigned int)v5 + 10);
  7992.   if ( a4 && (v4 & 3) != 0 )
  7993.     v4 |= 3u;
  7994.   return v4;
  7995. }
  7996. // 18000C0C8: using guessed type __int64 __fastcall std::ctype<wchar_t>::tolower(_QWORD, _QWORD);
  7997. // 18000C520: using guessed type wchar_t aAlnum[6];
  7998. // 18000C650: using guessed type char *off_18000C650;
  7999.  
  8000. //----- (0000000180009910) ----------------------------------------------------
  8001. __int16 __fastcall sub_180009910(__int64 a1, int a2)
  8002. {
  8003.   unsigned int v2; // edi
  8004.   unsigned int v5; // ebp
  8005.   unsigned __int16 *v6; // r14
  8006.   __int64 v7; // rcx
  8007.   unsigned int v8; // eax
  8008.   unsigned __int16 *v9; // rcx
  8009.   unsigned __int16 *v10; // rax
  8010.   _WORD *v11; // rdx
  8011.   int v12; // er8
  8012.   unsigned __int16 v13; // ax
  8013.   __int64 v14; // rcx
  8014.   unsigned __int16 *v15; // rcx
  8015.   unsigned __int16 *v16; // rax
  8016.   _WORD *v17; // rdx
  8017.   int v18; // er8
  8018.   __int64 v19; // rcx
  8019.   unsigned __int16 *v20; // rcx
  8020.   unsigned __int16 *v21; // rax
  8021.   _WORD *v22; // rdx
  8022.   int v23; // er8
  8023.  
  8024.   v2 = 0;
  8025.   if ( a2 == 58 )
  8026.   {
  8027.     v5 = 1;
  8028.   }
  8029.   else if ( a2 == 61 )
  8030.   {
  8031.     v5 = 0;
  8032.   }
  8033.   else
  8034.   {
  8035.     v5 = 14;
  8036.     if ( a2 == 46 )
  8037.       v5 = 0;
  8038.   }
  8039.   v6 = *(unsigned __int16 **)a1;
  8040.   v7 = *(unsigned int *)(a1 + 124);
  8041.   if ( (_DWORD)v7 != 58 )
  8042.   {
  8043.     v8 = v7;
  8044.     do
  8045.     {
  8046.       v7 = v8;
  8047.       if ( v8 == 61 || v8 == 46 || v8 == -1 )
  8048.         break;
  8049.       v9 = *(unsigned __int16 **)a1;
  8050.       v10 = *(unsigned __int16 **)(a1 + 16);
  8051.       if ( *(unsigned __int16 **)a1 != v10 )
  8052.       {
  8053.         if ( *v9 == 92 )
  8054.         {
  8055.           v11 = v9 + 1;
  8056.           if ( v9 + 1 != v10 )
  8057.           {
  8058.             if ( (v12 = *(_DWORD *)(a1 + 128), (v12 & 8) == 0) && (unsigned __int16)(*v11 - 40) <= 1u
  8059.               || (v12 & 0x10) == 0 && ((*v11 - 123) & 0xFFFD) == 0 )
  8060.             {
  8061.               ++v9;
  8062.             }
  8063.           }
  8064.         }
  8065.         *(_QWORD *)a1 = v9 + 1;
  8066.       }
  8067.       sub_1800040D0((unsigned __int16 **)a1);
  8068.       v7 = *(unsigned int *)(a1 + 124);
  8069.       ++v2;
  8070.       v8 = v7;
  8071.     }
  8072.     while ( (_DWORD)v7 != 58 );
  8073.   }
  8074.   if ( (_DWORD)v7 != a2 )
  8075.     sub_1800040C0(v7, v5);
  8076.   switch ( a2 )
  8077.   {
  8078.     case ':':
  8079.       v13 = sub_1800097A0(*(_QWORD *)(a1 + 104), v6, *(unsigned __int16 **)a1, BYTE1(*(_DWORD *)(a1 + 112)) & 1);
  8080.       if ( !v13 )
  8081.         sub_1800040C0(v14, 1u);
  8082.       sub_1800096C0(a1 + 64, v13, 0);
  8083.       break;
  8084.     case '=':
  8085.       if ( v6 == *(unsigned __int16 **)a1 )
  8086.         sub_1800040C0(v7, 0);
  8087.       sub_180009B70(a1 + 64, (__int16 *)v6, *(__int16 **)a1, v2);
  8088.       break;
  8089.     case '.':
  8090.       if ( v6 == *(unsigned __int16 **)a1 )
  8091.         sub_1800040C0(v7, 0);
  8092.       sub_180009D50(v7, (__int16 *)v6, *(__int16 **)a1, v2, (__int64 *)(*(_QWORD *)(a1 + 72) + 32i64));
  8093.       break;
  8094.   }
  8095.   v15 = *(unsigned __int16 **)a1;
  8096.   v16 = *(unsigned __int16 **)(a1 + 16);
  8097.   if ( *(unsigned __int16 **)a1 != v16 )
  8098.   {
  8099.     if ( *v15 == 92 )
  8100.     {
  8101.       v17 = v15 + 1;
  8102.       if ( v15 + 1 != v16 )
  8103.       {
  8104.         if ( (v18 = *(_DWORD *)(a1 + 128), (v18 & 8) == 0) && (unsigned __int16)(*v17 - 40) <= 1u
  8105.           || (v18 & 0x10) == 0 && ((*v17 - 123) & 0xFFFD) == 0 )
  8106.         {
  8107.           ++v15;
  8108.         }
  8109.       }
  8110.     }
  8111.     *(_QWORD *)a1 = v15 + 1;
  8112.   }
  8113.   sub_1800040D0((unsigned __int16 **)a1);
  8114.   if ( *(_DWORD *)(a1 + 124) != 93 )
  8115.     sub_1800040C0(v19, v5);
  8116.   v20 = *(unsigned __int16 **)a1;
  8117.   v21 = *(unsigned __int16 **)(a1 + 16);
  8118.   if ( *(unsigned __int16 **)a1 != v21 )
  8119.   {
  8120.     if ( *v20 == 92 )
  8121.     {
  8122.       v22 = v20 + 1;
  8123.       if ( v20 + 1 != v21 )
  8124.       {
  8125.         if ( (v23 = *(_DWORD *)(a1 + 128), (v23 & 8) == 0) && (unsigned __int16)(*v22 - 40) <= 1u
  8126.           || (v23 & 0x10) == 0 && ((*v22 - 123) & 0xFFFD) == 0 )
  8127.         {
  8128.           ++v20;
  8129.         }
  8130.       }
  8131.     }
  8132.     *(_QWORD *)a1 = v20 + 1;
  8133.   }
  8134.   return sub_1800040D0((unsigned __int16 **)a1);
  8135. }
  8136. // 180009B39: variable 'v19' is possibly undefined
  8137. // 180009B4C: variable 'v14' is possibly undefined
  8138.  
  8139. //----- (0000000180009B70) ----------------------------------------------------
  8140. void __fastcall sub_180009B70(__int64 a1, __int16 *a2, __int16 *a3, unsigned int a4)
  8141. {
  8142.   __int64 v8; // rsi
  8143.   unsigned int i; // ebx
  8144.   __int64 *v10; // rax
  8145.   void **v11; // rdx
  8146.   __int64 v12; // rcx
  8147.   char *v13; // r8
  8148.   char v14; // di
  8149.   _BYTE *v15; // rcx
  8150.   _OWORD *v16; // rax
  8151.   _BYTE *v17; // rdx
  8152.   void *v18; // rcx
  8153.   _BYTE *v19; // [rsp+38h] [rbp-90h] BYREF
  8154.   unsigned __int64 v20; // [rsp+50h] [rbp-78h]
  8155.   __int16 v21; // [rsp+58h] [rbp-70h] BYREF
  8156.   char v22[6]; // [rsp+5Ah] [rbp-6Eh] BYREF
  8157.   void *Block[3]; // [rsp+60h] [rbp-68h] BYREF
  8158.   unsigned __int64 v24; // [rsp+78h] [rbp-50h]
  8159.  
  8160.   v8 = *(_QWORD *)(a1 + 8);
  8161.   sub_180009E30(*(_QWORD **)(a1 + 24), (__int64)Block, a2, a3);
  8162.   for ( i = 0; i < 0x100; ++i )
  8163.   {
  8164.     v21 = i;
  8165.     v10 = (__int64 *)sub_180009E30(*(_QWORD **)(a1 + 24), (__int64)&v19, &v21, v22);
  8166.     v11 = Block;
  8167.     if ( v24 >= 8 )
  8168.       v11 = (void **)Block[0];
  8169.     v12 = (__int64)v10;
  8170.     if ( (unsigned __int64)v10[3] >= 8 )
  8171.       v12 = *v10;
  8172.     v13 = (char *)v10[2];
  8173.     if ( v13 == Block[2] )
  8174.     {
  8175.       if ( !v13 )
  8176.       {
  8177. LABEL_10:
  8178.         v14 = 1;
  8179.         goto LABEL_12;
  8180.       }
  8181.       while ( *(_WORD *)v12 == *(_WORD *)v11 )
  8182.       {
  8183.         v12 += 2i64;
  8184.         v11 = (void **)((char *)v11 + 2);
  8185.         if ( !--v13 )
  8186.           goto LABEL_10;
  8187.       }
  8188.     }
  8189.     v14 = 0;
  8190. LABEL_12:
  8191.     if ( v20 >= 8 )
  8192.     {
  8193.       v15 = v19;
  8194.       if ( 2 * v20 + 2 >= 0x1000 )
  8195.       {
  8196.         v15 = (_BYTE *)*((_QWORD *)v19 - 1);
  8197.         if ( (unsigned __int64)(v19 - v15 - 8) > 0x1F )
  8198.           invalid_parameter_noinfo_noreturn();
  8199.       }
  8200.       j_j_free(v15);
  8201.     }
  8202.     if ( v14 )
  8203.     {
  8204.       v16 = *(_OWORD **)(v8 + 40);
  8205.       if ( !v16 )
  8206.       {
  8207.         v16 = sub_18000A224(0x20ui64);
  8208.         *v16 = 0i64;
  8209.         v16[1] = 0i64;
  8210.         *(_QWORD *)(v8 + 40) = v16;
  8211.       }
  8212.       v17 = (char *)v16 + ((unsigned __int64)i >> 3);
  8213.       v12 = (unsigned __int8)*v17;
  8214.       LODWORD(v12) = v12 | (1 << (i & 7));
  8215.       *v17 = v12;
  8216.     }
  8217.   }
  8218.   sub_180009D50(v12, a2, a3, a4, (__int64 *)(v8 + 72));
  8219.   if ( v24 >= 8 )
  8220.   {
  8221.     v18 = Block[0];
  8222.     if ( 2 * v24 + 2 >= 0x1000 )
  8223.     {
  8224.       v18 = (void *)*((_QWORD *)Block[0] - 1);
  8225.       if ( (unsigned __int64)(Block[0] - v18 - 8) > 0x1F )
  8226.         invalid_parameter_noinfo_noreturn();
  8227.     }
  8228.     j_j_free(v18);
  8229.   }
  8230. }
  8231. // 180009CCF: variable 'v12' is possibly undefined
  8232. // 180009B70: using guessed type char var_6E[6];
  8233.  
  8234. //----- (0000000180009D50) ----------------------------------------------------
  8235. void __fastcall sub_180009D50(__int64 a1, __int16 *a2, __int16 *a3, unsigned int a4, __int64 *a5)
  8236. {
  8237.   __int64 *v6; // r14
  8238.   __int64 v9; // rdi
  8239.   __int64 v10; // rbx
  8240.   unsigned int v11; // eax
  8241.   __int16 v12; // bp
  8242.   unsigned int v13; // edi
  8243.   void *v14; // rax
  8244.   _QWORD *v15; // [rsp+40h] [rbp+8h]
  8245.  
  8246.   v6 = a5;
  8247.   v9 = *a5;
  8248.   if ( !*a5 )
  8249.     goto LABEL_6;
  8250.   do
  8251.   {
  8252.     v10 = v9;
  8253.     if ( a4 >= *(_DWORD *)v9 )
  8254.       break;
  8255.     v6 = (__int64 *)(v9 + 24);
  8256.     v9 = *(_QWORD *)(v9 + 24);
  8257.     v10 = v9;
  8258.   }
  8259.   while ( v9 );
  8260.   v9 = v10;
  8261.   if ( !v10 || a4 != *(_DWORD *)v10 )
  8262.   {
  8263. LABEL_6:
  8264.     v15 = sub_18000A224(0x20ui64);
  8265.     *(_DWORD *)v15 = a4;
  8266.     v15[1] = 0i64;
  8267.     v15[2] = 0i64;
  8268.     *v6 = (__int64)v15;
  8269.     v15[3] = v9;
  8270.     v10 = *v6;
  8271.   }
  8272.   for ( ; a2 != a3; ++*(_DWORD *)(v10 + 12) )
  8273.   {
  8274.     v11 = *(_DWORD *)(v10 + 12);
  8275.     v12 = *a2;
  8276.     if ( *(_DWORD *)(v10 + 8) <= v11 )
  8277.     {
  8278.       v13 = v11 + 16;
  8279.       v14 = realloc(*(void **)(v10 + 16), 2i64 * (v11 + 16));
  8280.       if ( !v14 )
  8281.       {
  8282.         std::_Xbad_alloc();
  8283.         JUMPOUT(0x180009E2Bi64);
  8284.       }
  8285.       *(_QWORD *)(v10 + 16) = v14;
  8286.       *(_DWORD *)(v10 + 8) = v13;
  8287.     }
  8288.     ++a2;
  8289.     *(_WORD *)(*(_QWORD *)(v10 + 16) + 2i64 * *(unsigned int *)(v10 + 12)) = v12;
  8290.   }
  8291. }
  8292. // 180009E25: control flows out of bounds to 180009E2B
  8293. // 18000C100: using guessed type void std::_Xbad_alloc(void);
  8294.  
  8295. //----- (0000000180009E30) ----------------------------------------------------
  8296. __int64 __fastcall sub_180009E30(_QWORD *a1, __int64 a2, _BYTE *a3, _BYTE *a4)
  8297. {
  8298.   __int64 v7; // rbx
  8299.   size_t v8; // rbp
  8300.   unsigned __int64 v9; // rax
  8301.   __int64 v10; // r15
  8302.   char *v11; // r14
  8303.   unsigned __int64 v12; // rbx
  8304.   void *v13; // rax
  8305.   char *v14; // rsi
  8306.   __int64 v15; // r15
  8307.   unsigned __int64 v16; // rdx
  8308.   _QWORD *v17; // rcx
  8309.   void *v18; // rcx
  8310.   char *v19; // rax
  8311.   void *Block[2]; // [rsp+28h] [rbp-90h] BYREF
  8312.   __m128i si128; // [rsp+38h] [rbp-80h]
  8313.   __int64 v23; // [rsp+48h] [rbp-70h]
  8314.   __int128 v24; // [rsp+50h] [rbp-68h]
  8315.   __int64 v25; // [rsp+60h] [rbp-58h]
  8316.  
  8317.   v23 = a2;
  8318.   *(_OWORD *)a2 = 0i64;
  8319.   *(_QWORD *)(a2 + 16) = 0i64;
  8320.   *(_QWORD *)(a2 + 24) = 7i64;
  8321.   *(_WORD *)a2 = 0;
  8322.   if ( a3 != a4 )
  8323.   {
  8324.     v24 = 0i64;
  8325.     v7 = 0i64;
  8326.     v25 = 0i64;
  8327.     v8 = a4 - a3;
  8328.     v9 = (a4 - a3) >> 1;
  8329.     v10 = 0i64;
  8330.     v11 = 0i64;
  8331.     if ( (unsigned __int64)(a4 - a3) < 2 )
  8332.     {
  8333.       v14 = (char *)v24;
  8334.     }
  8335.     else
  8336.     {
  8337.       if ( v9 > 0x7FFFFFFFFFFFFFFFi64 )
  8338.         sub_1800033B0();
  8339.       v12 = 2 * v9;
  8340.       if ( 2 * v9 < 0x1000 )
  8341.       {
  8342.         if ( v12 )
  8343.           v11 = (char *)sub_18000A224(2 * v9);
  8344.         else
  8345.           v11 = 0i64;
  8346.       }
  8347.       else
  8348.       {
  8349.         if ( v12 + 39 <= v12 )
  8350.           Concurrency::cancel_current_task();
  8351.         v13 = sub_18000A224(v12 + 39);
  8352.         if ( !v13 )
  8353. LABEL_28:
  8354.           invalid_parameter_noinfo_noreturn();
  8355.         v11 = (char *)(((unsigned __int64)v13 + 39) & 0xFFFFFFFFFFFFFFE0ui64);
  8356.         *((_QWORD *)v11 - 1) = v13;
  8357.       }
  8358.       v14 = v11;
  8359.       *(_QWORD *)&v24 = v11;
  8360.       v7 = (__int64)&v11[v12];
  8361.       v10 = v7;
  8362.       v25 = v7;
  8363.       memmove(v11, a3, v8);
  8364.       *((_QWORD *)&v24 + 1) = v7;
  8365.     }
  8366.     v15 = (v10 - (__int64)v11) >> 1;
  8367.     std::ctype<wchar_t>::tolower(a1[1], v14, &v11[2 * v15]);
  8368.     (*(void (__fastcall **)(_QWORD, void **, char *, char *, int))(*(_QWORD *)*a1 + 32i64))(
  8369.       *a1,
  8370.       Block,
  8371.       v14,
  8372.       &v14[2 * v15],
  8373.       1);
  8374.     if ( (void **)a2 != Block )
  8375.     {
  8376.       v16 = *(_QWORD *)(a2 + 24);
  8377.       if ( v16 >= 8 )
  8378.       {
  8379.         v17 = *(_QWORD **)a2;
  8380.         if ( 2 * v16 + 2 >= 0x1000 )
  8381.         {
  8382.           if ( (unsigned __int64)v17 - *(v17 - 1) - 8 > 0x1F )
  8383.             goto LABEL_23;
  8384.           v17 = (_QWORD *)*(v17 - 1);
  8385.         }
  8386.         j_j_free(v17);
  8387.       }
  8388.       *(_QWORD *)(a2 + 24) = 7i64;
  8389.       *(_OWORD *)a2 = *(_OWORD *)Block;
  8390.       *(__m128i *)(a2 + 16) = si128;
  8391.       si128 = _mm_load_si128((const __m128i *)&xmmword_18000CA00);
  8392.       LOWORD(Block[0]) = 0;
  8393.     }
  8394.     if ( si128.m128i_i64[1] >= 8ui64 )
  8395.     {
  8396.       v18 = Block[0];
  8397.       if ( (unsigned __int64)(2 * si128.m128i_i64[1] + 2) >= 0x1000 )
  8398.       {
  8399.         v18 = (void *)*((_QWORD *)Block[0] - 1);
  8400.         if ( (unsigned __int64)(Block[0] - v18 - 8) > 0x1F )
  8401. LABEL_23:
  8402.           invalid_parameter_noinfo_noreturn();
  8403.       }
  8404.       j_j_free(v18);
  8405.     }
  8406.     if ( v14 )
  8407.     {
  8408.       v19 = v14;
  8409.       if ( (unsigned __int64)(2 * ((v7 - (__int64)v14) >> 1)) >= 0x1000 )
  8410.       {
  8411.         v14 = (char *)*((_QWORD *)v14 - 1);
  8412.         if ( (unsigned __int64)(v19 - v14 - 8) > 0x1F )
  8413.           goto LABEL_28;
  8414.       }
  8415.       j_j_free(v14);
  8416.     }
  8417.   }
  8418.   return a2;
  8419. }
  8420. // 18000C0C0: using guessed type __int64 __fastcall std::ctype<wchar_t>::tolower(_QWORD, _QWORD, _QWORD);
  8421. // 18000CA00: using guessed type __int128 xmmword_18000CA00;
  8422.  
  8423. //----- (000000018000A09C) ----------------------------------------------------
  8424. _QWORD *__fastcall sub_18000A09C(__int64 a1)
  8425. {
  8426.   _QWORD *result; // rax
  8427.  
  8428.   result = sub_18000A224(0x10ui64);
  8429.   if ( result )
  8430.   {
  8431.     *result = Block;
  8432.     result[1] = a1;
  8433.   }
  8434.   Block = result;
  8435.   return result;
  8436. }
  8437.  
  8438. //----- (000000018000A0E0) ----------------------------------------------------
  8439. const __m128i *__fastcall sub_18000A0E0(const __m128i *a1, const __m128i *a2, __int16 a3)
  8440. {
  8441.   signed __int64 v4; // r9
  8442.   const __m128i *v6; // r10
  8443.   unsigned __int64 v13; // r9
  8444.   const __m128i *v14; // r10
  8445.   __m128i v15; // xmm1
  8446.   __m128i v16; // xmm1
  8447.   __int64 v17; // rax
  8448.   const __m128i *result; // rax
  8449.  
  8450.   v4 = (char *)a2 - (char *)a1;
  8451.   if ( (((char *)a2 - (char *)a1) & 0xFFFFFFFFFFFFFFE0ui64) != 0 && (dword_18001000C & 0x20) != 0 )
  8452.   {
  8453.     _EAX = a3;
  8454.     v6 = (const __m128i *)((char *)a1 + (((char *)a2 - (char *)a1) & 0xFFFFFFFFFFFFFFE0ui64));
  8455.     __asm
  8456.     {
  8457.       vmovd   xmm2, eax
  8458.       vpunpcklwd xmm2, xmm2, xmm2
  8459.       vpshufd xmm2, xmm2, 0
  8460.       vinsertf128 ymm2, ymm2, xmm2, 1
  8461.     }
  8462.     while ( 1 )
  8463.     {
  8464.       __asm
  8465.       {
  8466.         vpcmpeqw ymm1, ymm2, ymmword ptr [rcx]
  8467.         vpmovmskb eax, ymm1
  8468.       }
  8469.       if ( _EAX )
  8470.         break;
  8471.       a1 += 2;
  8472.       if ( a1 == v6 )
  8473.       {
  8474.         v4 &= 0x1Fu;
  8475.         __asm { vzeroupper }
  8476.         goto LABEL_7;
  8477.       }
  8478.     }
  8479.     __asm { tzcnt   eax, eax }
  8480.     result = (const __m128i *)((char *)a1 + _EAX);
  8481.     __asm { vzeroupper }
  8482.   }
  8483.   else
  8484.   {
  8485. LABEL_7:
  8486.     v13 = v4 & 0xFFFFFFFFFFFFFFF0ui64;
  8487.     if ( v13 )
  8488.     {
  8489.       v14 = (const __m128i *)((char *)a1 + v13);
  8490.       v15 = _mm_cvtsi32_si128(a3);
  8491.       v16 = _mm_shuffle_epi32(_mm_unpacklo_epi16(v15, v15), 0);
  8492.       while ( 1 )
  8493.       {
  8494.         LODWORD(v17) = _mm_movemask_epi8(_mm_cmpeq_epi16(_mm_loadu_si128(a1), v16));
  8495.         if ( (_DWORD)v17 )
  8496.           break;
  8497.         if ( ++a1 == v14 )
  8498.           goto LABEL_11;
  8499.       }
  8500.       _BitScanForward((unsigned int *)&v17, v17);
  8501.       return (const __m128i *)((char *)a1 + v17);
  8502.     }
  8503.     else
  8504.     {
  8505. LABEL_11:
  8506.       while ( a1 != a2 )
  8507.       {
  8508.         if ( a1->m128i_i16[0] == a3 )
  8509.           break;
  8510.         a1 = (const __m128i *)((char *)a1 + 2);
  8511.       }
  8512.       return a1;
  8513.     }
  8514.   }
  8515.   return result;
  8516. }
  8517. // 18000A1A3: variable 'v17' is possibly undefined
  8518. // 18001000C: using guessed type int dword_18001000C;
  8519.  
  8520. //----- (000000018000A1F8) ----------------------------------------------------
  8521. _QWORD *__fastcall sub_18000A1F8(_QWORD *a1, char a2)
  8522. {
  8523.   *a1 = &type_info::`vftable';
  8524.  if ( (a2 & 1) != 0 )
  8525.    j_j_free(a1);
  8526.  return a1;
  8527. }
  8528. // 18000C338: using guessed type void *type_info::`vftable';
  8529.  
  8530. //----- (000000018000A224) ----------------------------------------------------
  8531. void *__fastcall sub_18000A224(size_t Size)
  8532. {
  8533.   size_t i; // rbx
  8534.   void *result; // rax
  8535.  
  8536.   for ( i = Size; ; Size = i )
  8537.   {
  8538.     result = malloc(Size);
  8539.     if ( result )
  8540.       break;
  8541.     if ( !callnewh(i) )
  8542.     {
  8543.       if ( i != -1i64 )
  8544.         Concurrency::cancel_current_task();
  8545.       Concurrency::cancel_current_task();
  8546.     }
  8547.   }
  8548.   return result;
  8549. }
  8550.  
  8551. //----- (000000018000A260) ----------------------------------------------------
  8552. __int64 __fastcall sub_18000A260(__int64 a1, int a2, __int64 a3)
  8553. {
  8554.   int v3; // edx
  8555.   int v4; // edx
  8556.   __int64 result; // rax
  8557.  
  8558.   if ( !a2 )
  8559.     return sub_18000A3C8(a3 != 0);
  8560.   v3 = a2 - 1;
  8561.   if ( !v3 )
  8562.     return sub_18000A2B0(a1, a3);
  8563.   v4 = v3 - 1;
  8564.   if ( v4 )
  8565.   {
  8566.     if ( v4 != 1 )
  8567.       return 1i64;
  8568.     LOBYTE(result) = sub_18000A670();
  8569.   }
  8570.   else
  8571.   {
  8572.     LOBYTE(result) = sub_18000A648();
  8573.   }
  8574.   return (unsigned __int8)result;
  8575. }
  8576.  
  8577. //----- (000000018000A2B0) ----------------------------------------------------
  8578. __int64 __fastcall sub_18000A2B0(__int64 a1, __int64 a2)
  8579. {
  8580.   char v4; // bl
  8581.   char v5; // di
  8582.   _QWORD *v6; // rax
  8583.  
  8584.   if ( !sub_18000A72C(0) )
  8585.     return 0i64;
  8586.   v4 = sub_18000A5C0();
  8587.   v5 = 1;
  8588.   if ( dword_1800103D0 )
  8589.   {
  8590.     sub_18000AE58(7u);
  8591.     __debugbreak();
  8592.     JUMPOUT(0x18000A3C6i64);
  8593.   }
  8594.   dword_1800103D0 = 1;
  8595.   if ( sub_18000A630() )
  8596.   {
  8597.     sub_18000AFA4();
  8598.     sub_18000AE00();
  8599.     sub_18000AE2C();
  8600.     if ( !initterm_e((_PIFV *)&First, (_PIFV *)&Last) )
  8601.     {
  8602.       if ( sub_18000A5FC() )
  8603.       {
  8604.         initterm((_PVFV *)&qword_18000C2D0, (_PVFV *)&qword_18000C2E0);
  8605.         dword_1800103D0 = 2;
  8606.         v5 = 0;
  8607.       }
  8608.     }
  8609.   }
  8610.   sub_18000A89C(v4);
  8611.   if ( v5 )
  8612.     return 0i64;
  8613.   v6 = sub_18000AE48();
  8614.   if ( *v6 )
  8615.   {
  8616.     if ( sub_18000A804((__int64)v6) )
  8617.       _guard_dispatch_icall_fptr(a1, 2i64, a2);
  8618.   }
  8619.   ++dword_1800103CC;
  8620.   return 1i64;
  8621. }
  8622. // 18000A3C5: control flows out of bounds to 18000A3C6
  8623. // 18000B150: using guessed type __int64 __fastcall guard_dispatch_icall_nop();
  8624. // 18000C2A8: using guessed type __int64 (__fastcall *_guard_dispatch_icall_fptr)(_QWORD, _QWORD, _QWORD);
  8625. // 1800103CC: using guessed type int dword_1800103CC;
  8626. // 1800103D0: using guessed type int dword_1800103D0;
  8627.  
  8628. //----- (000000018000A3C8) ----------------------------------------------------
  8629. __int64 __fastcall sub_18000A3C8(char a1)
  8630. {
  8631.   char v3; // bl
  8632.   __int64 v4; // rcx
  8633.   BOOL v5; // ebx
  8634.   DWORD v6; // edx
  8635.   HINSTANCE v7; // rcx
  8636.   LPVOID v8; // r8
  8637.  
  8638.   if ( dword_1800103CC <= 0 )
  8639.     return 0i64;
  8640.   --dword_1800103CC;
  8641.   v3 = sub_18000A5C0();
  8642.   if ( dword_1800103D0 == 2 )
  8643.   {
  8644.     sub_18000A6E8();
  8645.     sub_18000AE10();
  8646.     sub_18000AFE0();
  8647.     dword_1800103D0 = 0;
  8648.     sub_18000A89C(v3);
  8649.     LOBYTE(v4) = a1;
  8650.     v5 = sub_18000A8C0(v4, 0) != 0;
  8651.     sub_18000A718();
  8652.     return v5;
  8653.   }
  8654.   else
  8655.   {
  8656.     sub_18000AE58(7u);
  8657.     __debugbreak();
  8658.     return sub_18000A44C(v7, v6, v8);
  8659.   }
  8660. }
  8661. // 18000A42A: variable 'v4' is possibly undefined
  8662. // 18000A44B: variable 'v7' is possibly undefined
  8663. // 18000A44B: variable 'v6' is possibly undefined
  8664. // 18000A44B: variable 'v8' is possibly undefined
  8665. // 1800103CC: using guessed type int dword_1800103CC;
  8666. // 1800103D0: using guessed type int dword_1800103D0;
  8667.  
  8668. //----- (000000018000A44C) ----------------------------------------------------
  8669. __int64 __fastcall sub_18000A44C(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
  8670. {
  8671.   unsigned int v7; // ebx
  8672.   BOOL v8; // eax
  8673.  
  8674.   if ( !fdwReason && dword_1800103CC <= 0 )
  8675.     return 0i64;
  8676.   if ( fdwReason - 1 > 1 || (v7 = sub_18000A260((__int64)hinstDLL, fdwReason, (__int64)lpvReserved)) != 0 )
  8677.   {
  8678.     v8 = DllMain(hinstDLL, fdwReason, lpvReserved);
  8679.     v7 = v8;
  8680.     if ( fdwReason == 1 && !v8 )
  8681.     {
  8682.       DllMain(hinstDLL, 0, lpvReserved);
  8683.       sub_18000A3C8(lpvReserved != 0i64);
  8684.     }
  8685.     if ( !fdwReason || fdwReason == 3 )
  8686.       return (unsigned int)sub_18000A260((__int64)hinstDLL, fdwReason, (__int64)lpvReserved) != 0;
  8687.   }
  8688.   return v7;
  8689. }
  8690. // 18000C2A8: using guessed type __int64 (__fastcall *_guard_dispatch_icall_fptr)(_QWORD, _QWORD, _QWORD);
  8691. // 1800103CC: using guessed type int dword_1800103CC;
  8692.  
  8693. //----- (000000018000A5C0) ----------------------------------------------------
  8694. char sub_18000A5C0()
  8695. {
  8696.   int v0; // eax
  8697.   PVOID StackBase; // rcx
  8698.   signed __int64 v2; // rax
  8699.  
  8700.   LOBYTE(v0) = __uncaught_exception();
  8701.   if ( v0 )
  8702.   {
  8703.     StackBase = NtCurrentTeb()->NtTib.StackBase;
  8704.     while ( 1 )
  8705.     {
  8706.       v2 = _InterlockedCompareExchange64(&qword_1800103D8, (signed __int64)StackBase, 0i64);
  8707.       if ( !v2 )
  8708.         break;
  8709.       if ( StackBase == (PVOID)v2 )
  8710.         return 1;
  8711.     }
  8712.   }
  8713.   return 0;
  8714. }
  8715. // 18000A5CB: variable 'v0' is possibly undefined
  8716. // 1800103D8: using guessed type __int64 qword_1800103D8;
  8717.  
  8718. //----- (000000018000A5FC) ----------------------------------------------------
  8719. char sub_18000A5FC()
  8720. {
  8721.   int v0; // eax
  8722.   _crt_argv_mode v1; // eax
  8723.  
  8724.   LOBYTE(v0) = __uncaught_exception();
  8725.   if ( v0 )
  8726.   {
  8727.     sub_18000A9C0();
  8728.   }
  8729.   else
  8730.   {
  8731.     v1 = (unsigned int)sub_18000B01C();
  8732.     if ( configure_narrow_argv(v1) )
  8733.       return 0;
  8734.     initialize_narrow_environment();
  8735.   }
  8736.   return 1;
  8737. }
  8738. // 18000A607: variable 'v0' is possibly undefined
  8739.  
  8740. //----- (000000018000A630) ----------------------------------------------------
  8741. bool sub_18000A630()
  8742. {
  8743.   return sub_18000A778(0) != 0;
  8744. }
  8745.  
  8746. //----- (000000018000A648) ----------------------------------------------------
  8747. char sub_18000A648()
  8748. {
  8749.   if ( !sub_18000B0A4() )
  8750.     return 0;
  8751.   if ( !sub_18000B0A4() )
  8752.   {
  8753.     sub_18000B0A4();
  8754.     return 0;
  8755.   }
  8756.   return 1;
  8757. }
  8758.  
  8759. //----- (000000018000A670) ----------------------------------------------------
  8760. char sub_18000A670()
  8761. {
  8762.   sub_18000B0A4();
  8763.   sub_18000B0A4();
  8764.   return 1;
  8765. }
  8766.  
  8767. //----- (000000018000A688) ----------------------------------------------------
  8768. int __fastcall sub_18000A688(
  8769.         __int64 a1,
  8770.         int a2,
  8771.         __int64 a3,
  8772.         void (__fastcall *a4)(__int64, _QWORD, __int64),
  8773.         unsigned int ExceptionNum,
  8774.         struct _EXCEPTION_POINTERS *ExceptionPtr)
  8775. {
  8776.   int v10; // eax
  8777.  
  8778.   LOBYTE(v10) = __uncaught_exception();
  8779.   if ( !v10 && a2 == 1 )
  8780.     a4(a1, 0i64, a3);
  8781.   return seh_filter_dll(ExceptionNum, ExceptionPtr);
  8782. }
  8783. // 18000A6AE: variable 'v10' is possibly undefined
  8784.  
  8785. //----- (000000018000A6E8) ----------------------------------------------------
  8786. void sub_18000A6E8()
  8787. {
  8788.   int v0; // eax
  8789.  
  8790.   LOBYTE(v0) = __uncaught_exception();
  8791.   if ( v0 )
  8792.   {
  8793.     execute_onexit_table(&Table);
  8794.   }
  8795.   else if ( !(unsigned int)sub_18000B0A8() )
  8796.   {
  8797.     cexit();
  8798.   }
  8799. }
  8800. // 18000A6F3: variable 'v0' is possibly undefined
  8801.  
  8802. //----- (000000018000A718) ----------------------------------------------------
  8803. char sub_18000A718()
  8804. {
  8805.   sub_18000B0A4();
  8806.   return sub_18000B0A4();
  8807. }
  8808.  
  8809. //----- (000000018000A72C) ----------------------------------------------------
  8810. char __fastcall sub_18000A72C(int a1)
  8811. {
  8812.   char v1; // al
  8813.  
  8814.   v1 = byte_1800103E0;
  8815.   if ( !a1 )
  8816.     v1 = 1;
  8817.   byte_1800103E0 = v1;
  8818.   sub_18000A9C0();
  8819.   if ( !sub_18000B0A4() )
  8820.     return 0;
  8821.   if ( !sub_18000B0A4() )
  8822.   {
  8823.     sub_18000B0A4();
  8824.     return 0;
  8825.   }
  8826.   return 1;
  8827. }
  8828. // 1800103E0: using guessed type char byte_1800103E0;
  8829.  
  8830. //----- (000000018000A778) ----------------------------------------------------
  8831. char __fastcall sub_18000A778(unsigned int a1)
  8832. {
  8833.   int v2; // eax
  8834.  
  8835.   if ( !byte_1800103E1 )
  8836.   {
  8837.     if ( a1 > 1 )
  8838.     {
  8839.       sub_18000AE58(5u);
  8840.       JUMPOUT(0x18000A802i64);
  8841.     }
  8842.     LOBYTE(v2) = __uncaught_exception();
  8843.     if ( !v2 || a1 )
  8844.     {
  8845.       *(__m128i *)&Table._first = _mm_load_si128((const __m128i *)&xmmword_18000C320);
  8846.       Table._end = (_PVFV *)-1i64;
  8847.       *(_OWORD *)&stru_180010400._first = *(_OWORD *)&Table._first;
  8848.       stru_180010400._end = (_PVFV *)-1i64;
  8849.     }
  8850.     else if ( initialize_onexit_table(&Table) || initialize_onexit_table(&stru_180010400) )
  8851.     {
  8852.       return 0;
  8853.     }
  8854.     byte_1800103E1 = 1;
  8855.   }
  8856.   return 1;
  8857. }
  8858. // 18000A7FD: control flows out of bounds to 18000A802
  8859. // 18000A795: variable 'v2' is possibly undefined
  8860. // 18000C320: using guessed type __int128 xmmword_18000C320;
  8861. // 1800103E1: using guessed type char byte_1800103E1;
  8862.  
  8863. //----- (000000018000A804) ----------------------------------------------------
  8864. bool __fastcall sub_18000A804(__int64 a1)
  8865. {
  8866.   _DWORD *v2; // rcx
  8867.   unsigned __int64 v3; // r8
  8868.   _DWORD *v4; // rdx
  8869.   _DWORD *v5; // r9
  8870.   unsigned __int64 v6; // rcx
  8871.  
  8872.   if ( MEMORY[0x180000000] != 23117 )
  8873.     return 0;
  8874.   v2 = (_DWORD *)(0x180000000i64 + MEMORY[0x18000003C]);
  8875.   if ( *v2 != 17744 || *(_WORD *)(0x180000018i64 + MEMORY[0x18000003C]) != 523 )
  8876.     return 0;
  8877.   v3 = a1 - 0x180000000i64;
  8878.   v4 = (_DWORD *)((char *)v2 + *(unsigned __int16 *)(0x180000014i64 + MEMORY[0x18000003C]) + 24);
  8879.   v5 = &v4[10 * *(unsigned __int16 *)(0x180000006i64 + MEMORY[0x18000003C])];
  8880.   while ( v4 != v5 )
  8881.   {
  8882.     v6 = (unsigned int)v4[3];
  8883.     if ( v3 >= v6 && v3 < (unsigned int)(v6 + v4[2]) )
  8884.       return v4 && v4[9] >= 0;
  8885.     v4 += 10;
  8886.   }
  8887.   v4 = 0i64;
  8888.   return v4 && v4[9] >= 0;
  8889. }
  8890.  
  8891. //----- (000000018000A89C) ----------------------------------------------------
  8892. char __fastcall sub_18000A89C(char a1)
  8893. {
  8894.   int v2; // eax
  8895.  
  8896.   LOBYTE(v2) = __uncaught_exception();
  8897.   if ( v2 && !a1 )
  8898.     _InterlockedExchange64(&qword_1800103D8, 0i64);
  8899.   return v2;
  8900. }
  8901. // 18000A8AD: variable 'v2' is possibly undefined
  8902. // 1800103D8: using guessed type __int64 qword_1800103D8;
  8903.  
  8904. //----- (000000018000A8C0) ----------------------------------------------------
  8905. char __fastcall sub_18000A8C0(__int64 a1, char a2)
  8906. {
  8907.   if ( !byte_1800103E0 || !a2 )
  8908.   {
  8909.     sub_18000B0A4();
  8910.     sub_18000B0A4();
  8911.   }
  8912.   return 1;
  8913. }
  8914. // 1800103E0: using guessed type char byte_1800103E0;
  8915.  
  8916. //----- (000000018000A8EC) ----------------------------------------------------
  8917. _onexit_t __fastcall sub_18000A8EC(_onexit_t Function)
  8918. {
  8919.   int v2; // eax
  8920.   __int64 v3; // rdx
  8921.  
  8922.   if ( Table._first == (_PVFV *)-1i64 )
  8923.     v2 = crt_atexit((_PVFV)Function);
  8924.   else
  8925.     v2 = register_onexit_function(&Table, Function);
  8926.   v3 = 0i64;
  8927.   if ( !v2 )
  8928.     return Function;
  8929.   return (_onexit_t)v3;
  8930. }
  8931.  
  8932. //----- (000000018000A9C0) ----------------------------------------------------
  8933. __int64 sub_18000A9C0()
  8934. {
  8935.   int v5; // er11
  8936.   int v6; // er9
  8937.   int v7; // esi
  8938.   int v9; // er10
  8939.   int v14; // edi
  8940.   int v15; // eax
  8941.   unsigned __int64 v16; // rax
  8942.   __int64 v17; // rcx
  8943.   int v18; // er8
  8944.   int v23; // eax
  8945.   char v25; // [rsp+20h] [rbp+8h]
  8946.  
  8947.   _RAX = 0i64;
  8948.   __asm { cpuid }
  8949.   v5 = 0;
  8950.   v6 = _RBX;
  8951.   v7 = _RAX;
  8952.   _RAX = 1i64;
  8953.   v9 = _RCX ^ 0x6C65746E | _RDX ^ 0x49656E69;
  8954.   __asm { cpuid }
  8955.   v14 = _RCX;
  8956.   if ( !(v6 ^ 0x756E6547 | v9)
  8957.     && ((qword_180010018 = -1i64, v15 = _RAX & 0xFFF3FF0, qword_180010010 = 0x8000i64, v15 == 67264)
  8958.      || v15 == 132704
  8959.      || v15 == 132720
  8960.      || (v16 = (unsigned int)(v15 - 198224), (unsigned int)v16 <= 0x20) && (v17 = 0x100010001i64, _bittest64(&v17, v16))) )
  8961.   {
  8962.     v18 = dword_180010418 | 1;
  8963.     dword_180010418 |= 1u;
  8964.   }
  8965.   else
  8966.   {
  8967.     v18 = dword_180010418;
  8968.   }
  8969.   _RAX = 7i64;
  8970.   if ( v7 >= 7 )
  8971.   {
  8972.     __asm { cpuid }
  8973.     v5 = _RBX;
  8974.     if ( (_RBX & 0x200) != 0 )
  8975.       dword_180010418 = v18 | 2;
  8976.   }
  8977.   dword_180010008 = 1;
  8978.   dword_18001000C = 2;
  8979.   if ( (v14 & 0x100000) != 0 )
  8980.   {
  8981.     dword_180010008 = 2;
  8982.     dword_18001000C = 6;
  8983.     if ( (v14 & 0x8000000) != 0 && (v14 & 0x10000000) != 0 )
  8984.     {
  8985.       __asm { xgetbv }
  8986.       v25 = _RAX;
  8987.       if ( (_RAX & 6) == 6 )
  8988.       {
  8989.         v23 = dword_18001000C | 8;
  8990.         dword_180010008 = 3;
  8991.         dword_18001000C |= 8u;
  8992.         if ( (v5 & 0x20) != 0 )
  8993.         {
  8994.           dword_180010008 = 5;
  8995.           dword_18001000C = v23 | 0x20;
  8996.           if ( (v5 & 0xD0030000) == -805109760 && (v25 & 0xE0) == 0xE0 )
  8997.           {
  8998.             dword_18001000C |= 0x40u;
  8999.             dword_180010008 = 6;
  9000.           }
  9001.         }
  9002.       }
  9003.     }
  9004.   }
  9005.   return 0i64;
  9006. }
  9007. // 180010008: using guessed type int dword_180010008;
  9008. // 18001000C: using guessed type int dword_18001000C;
  9009. // 180010010: using guessed type __int64 qword_180010010;
  9010. // 180010018: using guessed type __int64 qword_180010018;
  9011. // 180010418: using guessed type int dword_180010418;
  9012.  
  9013. //----- (000000018000AB6C) ----------------------------------------------------
  9014. BOOL __fastcall sub_18000AB6C(struct _EXCEPTION_POINTERS *ExceptionInfo)
  9015. {
  9016.   HANDLE CurrentProcess; // rax
  9017.  
  9018.   SetUnhandledExceptionFilter(0i64);
  9019.   UnhandledExceptionFilter(ExceptionInfo);
  9020.   CurrentProcess = GetCurrentProcess();
  9021.   return TerminateProcess(CurrentProcess, 0xC0000409);
  9022. }
  9023.  
  9024. //----- (000000018000ABA0) ----------------------------------------------------
  9025. BOOL __fastcall sub_18000ABA0(DWORD64 a1)
  9026. {
  9027.   DWORD64 retaddr; // [rsp+38h] [rbp+0h]
  9028.   DWORD64 v3; // [rsp+40h] [rbp+8h] BYREF
  9029.  
  9030.   v3 = a1;
  9031.   if ( IsProcessorFeaturePresent(0x17u) )
  9032.     __fastfail(2u);
  9033.   sub_18000AC74(&ContextRecord);
  9034.   ContextRecord.Rip = retaddr;
  9035.   ContextRecord.Rsp = (DWORD64)&v3;
  9036.   qword_180010430 = retaddr;
  9037.   ContextRecord.Rcx = v3;
  9038.   dword_180010420 = -1073740791;
  9039.   dword_180010424 = 1;
  9040.   dword_180010438 = 1;
  9041.   unk_180010440 = 2i64;
  9042.   return sub_18000AB6C((struct _EXCEPTION_POINTERS *)&ExceptionInfo);
  9043. }
  9044. // 180010020: using guessed type __int64 qword_180010020;
  9045. // 180010420: using guessed type int dword_180010420;
  9046. // 180010424: using guessed type int dword_180010424;
  9047. // 180010430: using guessed type __int64 qword_180010430;
  9048. // 180010438: using guessed type int dword_180010438;
  9049.  
  9050. //----- (000000018000AC74) ----------------------------------------------------
  9051. struct _IMAGE_RUNTIME_FUNCTION_ENTRY *__fastcall sub_18000AC74(PCONTEXT ContextRecord)
  9052. {
  9053.   DWORD64 Rip; // rsi
  9054.   int i; // edi
  9055.   struct _IMAGE_RUNTIME_FUNCTION_ENTRY *result; // rax
  9056.   unsigned __int64 ImageBase; // [rsp+60h] [rbp+8h] BYREF
  9057.   unsigned __int64 EstablisherFrame; // [rsp+68h] [rbp+10h] BYREF
  9058.   PVOID HandlerData; // [rsp+70h] [rbp+18h] BYREF
  9059.  
  9060.   RtlCaptureContext(ContextRecord);
  9061.   Rip = ContextRecord->Rip;
  9062.   for ( i = 0; i < 2; ++i )
  9063.   {
  9064.     result = RtlLookupFunctionEntry(Rip, &ImageBase, 0i64);
  9065.     if ( !result )
  9066.       break;
  9067.     result = (struct _IMAGE_RUNTIME_FUNCTION_ENTRY *)RtlVirtualUnwind(
  9068.                                                        0,
  9069.                                                        ImageBase,
  9070.                                                        Rip,
  9071.                                                        result,
  9072.                                                        ContextRecord,
  9073.                                                        &HandlerData,
  9074.                                                        &EstablisherFrame,
  9075.                                                        0i64);
  9076.   }
  9077.   return result;
  9078. }
  9079.  
  9080. //----- (000000018000ACF0) ----------------------------------------------------
  9081. _QWORD *__fastcall sub_18000ACF0(_QWORD *a1)
  9082. {
  9083.   a1[2] = 0i64;
  9084.   a1[1] = "bad allocation";
  9085.   *a1 = &std::bad_alloc::`vftable';
  9086.  return a1;
  9087. }
  9088. // 18000C378: using guessed type void *std::bad_alloc::`vftable';
  9089.  
  9090. //----- (000000018000AD30) ----------------------------------------------------
  9091. __int64 sub_18000AD30()
  9092. {
  9093.   uintptr_t v0; // rax
  9094.   __int64 result; // rax
  9095.   unsigned __int64 v2; // [rsp+30h] [rbp+10h] BYREF
  9096.   struct _FILETIME SystemTimeAsFileTime; // [rsp+38h] [rbp+18h] BYREF
  9097.   LARGE_INTEGER PerformanceCount; // [rsp+40h] [rbp+20h] BYREF
  9098.  
  9099.   v0 = _security_cookie;
  9100.   if ( _security_cookie == 0x2B992DDFA232i64 )
  9101.   {
  9102.     SystemTimeAsFileTime = 0i64;
  9103.     GetSystemTimeAsFileTime(&SystemTimeAsFileTime);
  9104.     v2 = (unsigned __int64)SystemTimeAsFileTime;
  9105.     v2 ^= GetCurrentThreadId();
  9106.     v2 ^= GetCurrentProcessId();
  9107.     QueryPerformanceCounter(&PerformanceCount);
  9108.     v0 = ((unsigned __int64)&v2 ^ v2 ^ PerformanceCount.QuadPart ^ ((unsigned __int64)PerformanceCount.LowPart << 32)) & 0xFFFFFFFFFFFFi64;
  9109.     if ( v0 == 0x2B992DDFA232i64 )
  9110.       v0 = 0x2B992DDFA233i64;
  9111.     _security_cookie = v0;
  9112.   }
  9113.   result = ~v0;
  9114.   qword_180010020 = result;
  9115.   return result;
  9116. }
  9117. // 180010020: using guessed type __int64 qword_180010020;
  9118.  
  9119. //----- (000000018000AE00) ----------------------------------------------------
  9120. void sub_18000AE00()
  9121. {
  9122.   InitializeSListHead(&stru_180010990);
  9123. }
  9124. // 180010990: using guessed type union _SLIST_HEADER stru_180010990;
  9125.  
  9126. //----- (000000018000AE10) ----------------------------------------------------
  9127. __int64 sub_18000AE10()
  9128. {
  9129.   return _std_type_info_destroy_list(&stru_180010990);
  9130. }
  9131. // 18000B048: using guessed type __int64 __fastcall _std_type_info_destroy_list(_QWORD);
  9132. // 180010990: using guessed type union _SLIST_HEADER stru_180010990;
  9133.  
  9134. //----- (000000018000AE1C) ----------------------------------------------------
  9135. void *sub_18000AE1C()
  9136. {
  9137.   return &unk_1800109A0;
  9138. }
  9139.  
  9140. //----- (000000018000AE24) ----------------------------------------------------
  9141. void *sub_18000AE24()
  9142. {
  9143.   return &unk_1800109A8;
  9144. }
  9145.  
  9146. //----- (000000018000AE2C) ----------------------------------------------------
  9147. _QWORD *sub_18000AE2C()
  9148. {
  9149.   _QWORD *v0; // rax
  9150.   _QWORD *result; // rax
  9151.  
  9152.   v0 = sub_18000AE1C();
  9153.   *v0 |= 0x24ui64;
  9154.   result = sub_18000AE24();
  9155.   *result |= 2ui64;
  9156.   return result;
  9157. }
  9158.  
  9159. //----- (000000018000AE48) ----------------------------------------------------
  9160. void *sub_18000AE48()
  9161. {
  9162.   return &unk_1800109D0;
  9163. }
  9164.  
  9165. //----- (000000018000AE50) ----------------------------------------------------
  9166. void sub_18000AE50()
  9167. {
  9168.   dword_1800109B0 = 0;
  9169. }
  9170. // 1800109B0: using guessed type int dword_1800109B0;
  9171.  
  9172. //----- (000000018000AE58) ----------------------------------------------------
  9173. void __fastcall sub_18000AE58(unsigned int a1)
  9174. {
  9175.   DWORD64 Rip; // rbx
  9176.   struct _IMAGE_RUNTIME_FUNCTION_ENTRY *v3; // rax
  9177.   bool v4; // bl
  9178.   struct _EXCEPTION_POINTERS ExceptionInfo; // [rsp+40h] [rbp-C0h] BYREF
  9179.   _QWORD v6[20]; // [rsp+50h] [rbp-B0h] BYREF
  9180.   struct _CONTEXT ContextRecord; // [rsp+F0h] [rbp-10h] BYREF
  9181.   DWORD64 retaddr; // [rsp+5C8h] [rbp+4C8h]
  9182.   __int64 v9; // [rsp+5D0h] [rbp+4D0h] BYREF
  9183.   unsigned __int64 ImageBase; // [rsp+5D8h] [rbp+4D8h] BYREF
  9184.   unsigned __int64 EstablisherFrame; // [rsp+5E0h] [rbp+4E0h] BYREF
  9185.   PVOID HandlerData; // [rsp+5E8h] [rbp+4E8h] BYREF
  9186.  
  9187.   if ( IsProcessorFeaturePresent(0x17u) )
  9188.     __fastfail(a1);
  9189.   sub_18000AE50();
  9190.   memset(&ContextRecord, 0, sizeof(ContextRecord));
  9191.   RtlCaptureContext(&ContextRecord);
  9192.   Rip = ContextRecord.Rip;
  9193.   v3 = RtlLookupFunctionEntry(ContextRecord.Rip, &ImageBase, 0i64);
  9194.   if ( v3 )
  9195.     RtlVirtualUnwind(0, ImageBase, Rip, v3, &ContextRecord, &HandlerData, &EstablisherFrame, 0i64);
  9196.   ContextRecord.Rip = retaddr;
  9197.   ContextRecord.Rsp = (DWORD64)&v9;
  9198.   memset(v6, 0, 0x98ui64);
  9199.   v6[2] = retaddr;
  9200.   v6[0] = 0x140000015i64;
  9201.   ExceptionInfo.ExceptionRecord = (PEXCEPTION_RECORD)v6;
  9202.   v4 = IsDebuggerPresent();
  9203.   ExceptionInfo.ContextRecord = &ContextRecord;
  9204.   SetUnhandledExceptionFilter(0i64);
  9205.   if ( !UnhandledExceptionFilter(&ExceptionInfo) && !v4 )
  9206.     sub_18000AE50();
  9207. }
  9208.  
  9209. //----- (000000018000AFA4) ----------------------------------------------------
  9210. void sub_18000AFA4()
  9211. {
  9212.   void (**i)(void); // rbx
  9213.  
  9214.   for ( i = qword_18000D9F8; i < qword_18000D9F8; ++i )
  9215.   {
  9216.     if ( *i )
  9217.       (*i)();
  9218.   }
  9219. }
  9220. // 18000D9F8: using guessed type void (*qword_18000D9F8[2])(void);
  9221.  
  9222. //----- (000000018000AFE0) ----------------------------------------------------
  9223. void sub_18000AFE0()
  9224. {
  9225.   void (**i)(void); // rbx
  9226.  
  9227.   for ( i = &qword_18000DA08; i < &qword_18000DA08; ++i )
  9228.   {
  9229.     if ( *i )
  9230.       (*i)();
  9231.   }
  9232. }
  9233. // 18000DA08: using guessed type void (*qword_18000DA08)(void);
  9234.  
  9235. //----- (000000018000B01C) ----------------------------------------------------
  9236. __int64 sub_18000B01C()
  9237. {
  9238.   return 1i64;
  9239. }
  9240.  
  9241. //----- (000000018000B0A4) ----------------------------------------------------
  9242. char sub_18000B0A4()
  9243. {
  9244.   return 1;
  9245. }
  9246.  
  9247. //----- (000000018000B0A8) ----------------------------------------------------
  9248. __int64 sub_18000B0A8()
  9249. {
  9250.   return 0i64;
  9251. }
  9252.  
  9253. //----- (000000018000B0AC) ----------------------------------------------------
  9254. __int64 __fastcall sub_18000B0AC(__int64 a1, __int64 a2, __int64 a3, __int64 a4)
  9255. {
  9256.   __int64 v4; // rbx
  9257.   __int64 result; // rax
  9258.  
  9259.   v4 = *(_QWORD *)(a4 + 56);
  9260.   _GSHandlerCheckCommon(a2, a4, v4 + 4);
  9261.   result = 1i64;
  9262.   if ( ((((*(_DWORD *)(a1 + 4) & 0x66) != 0) + 1) & *(_DWORD *)(v4 + 4)) != 0 )
  9263.     return _CxxFrameHandler4(a1, a2, a3, a4);
  9264.   return result;
  9265. }
  9266. // 18000A964: using guessed type __int64 __fastcall _GSHandlerCheckCommon(_QWORD, _QWORD, _QWORD);
  9267. // 18000B030: using guessed type __int64 __fastcall _CxxFrameHandler4(_QWORD, _QWORD, _QWORD, _QWORD);
  9268.  
  9269. //----- (000000018000B180) ----------------------------------------------------
  9270. __int64 __fastcall sub_18000B180(__int64 a1, __int64 a2)
  9271. {
  9272.   __int64 result; // rax
  9273.  
  9274.   result = *(_DWORD *)(a2 + 56) & 1;
  9275.   if ( (_DWORD)result )
  9276.   {
  9277.     *(_DWORD *)(a2 + 56) &= ~1u;
  9278.     return sub_1800020A0(*(_QWORD *)(a2 + 96));
  9279.   }
  9280.   return result;
  9281. }
  9282.  
  9283. //----- (000000018000B1A6) ----------------------------------------------------
  9284. void __fastcall sub_18000B1A6(__int64 a1, __int64 a2)
  9285. {
  9286.   sub_180002510(a2 + 104);
  9287. }
  9288.  
  9289. //----- (000000018000B1D0) ----------------------------------------------------
  9290. __int64 __fastcall sub_18000B1D0(__int64 a1, __int64 a2)
  9291. {
  9292.   __int64 result; // rax
  9293.  
  9294.   result = *(_DWORD *)(a2 + 48) & 1;
  9295.   if ( (_DWORD)result )
  9296.   {
  9297.     *(_DWORD *)(a2 + 48) &= ~1u;
  9298.     return sub_180002350(*(_QWORD *)(a2 + 56));
  9299.   }
  9300.   return result;
  9301. }
  9302.  
  9303. //----- (000000018000B2D0) ----------------------------------------------------
  9304. void __fastcall sub_18000B2D0(__int64 a1, __int64 a2)
  9305. {
  9306.   j_j_free(*(void **)(a2 + 136));
  9307. }
  9308.  
  9309. //----- (000000018000B2F0) ----------------------------------------------------
  9310. void __fastcall sub_18000B2F0(__int64 a1, __int64 a2)
  9311. {
  9312.   if ( (*(_DWORD *)(a2 + 32) & 1) != 0 )
  9313.   {
  9314.     *(_DWORD *)(a2 + 32) &= ~1u;
  9315.     sub_180002510(a2 + 40);
  9316.   }
  9317. }
  9318.  
  9319. //----- (000000018000B316) ----------------------------------------------------
  9320. void __fastcall sub_18000B316(__int64 a1, __int64 a2)
  9321. {
  9322.   if ( (*(_DWORD *)(a2 + 32) & 2) != 0 )
  9323.   {
  9324.     *(_DWORD *)(a2 + 32) &= ~2u;
  9325.     std::_Locinfo::~_Locinfo((std::_Locinfo *)(a2 + 144));
  9326.   }
  9327. }
  9328. // 18000C110: using guessed type void std::_Locinfo::~_Locinfo(std::_Locinfo *__hidden this);
  9329.  
  9330. //----- (000000018000B340) ----------------------------------------------------
  9331. void __fastcall sub_18000B340(__int64 a1, __int64 a2)
  9332. {
  9333.   std::locale::facet::~facet(*(std::locale::facet **)(a2 + 136));
  9334. }
  9335. // 18000C0D8: using guessed type void std::locale::facet::~facet(std::locale::facet *__hidden this);
  9336.  
  9337. //----- (000000018000B426) ----------------------------------------------------
  9338. __int64 __fastcall sub_18000B426(__int64 a1, __int64 a2)
  9339. {
  9340.   return sub_180008EF0(a2 + 80);
  9341. }
  9342.  
  9343. //----- (000000018000B4E0) ----------------------------------------------------
  9344. void sub_18000B4E0()
  9345. {
  9346.   __int64 v0; // rcx
  9347.   void (__fastcall ***v1)(_QWORD, __int64); // rax
  9348.   void *v2; // rbx
  9349.  
  9350.   while ( 1 )
  9351.   {
  9352.     v2 = Block;
  9353.     if ( !Block )
  9354.       break;
  9355.     v0 = *((_QWORD *)Block + 1);
  9356.     Block = *(void **)Block;
  9357.     v1 = (void (__fastcall ***)(_QWORD, __int64))(*(__int64 (__fastcall **)(__int64))(*(_QWORD *)v0 + 16i64))(v0);
  9358.     if ( v1 )
  9359.       (**v1)(v1, 1i64);
  9360.     j_j_free(v2);
  9361.   }
  9362. }
  9363.  
  9364. // nfuncs=199 queued=159 decompiled=159 lumina nreq=0 worse=0 better=0
  9365. // ALL OK, 159 function(s) have been successfully decompiled
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement