sonamu 0.6.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (406) hide show
  1. package/.swcrc.project-default +18 -0
  2. package/bin/cli.js +24 -0
  3. package/dist/ai/agents/agent.d.ts +11 -0
  4. package/dist/ai/agents/agent.d.ts.map +1 -0
  5. package/dist/ai/agents/agent.js +65 -0
  6. package/dist/ai/agents/index.d.ts +3 -0
  7. package/dist/ai/agents/index.d.ts.map +1 -0
  8. package/dist/ai/agents/index.js +4 -0
  9. package/dist/ai/agents/types.d.ts +43 -0
  10. package/dist/ai/agents/types.d.ts.map +1 -0
  11. package/dist/ai/agents/types.js +3 -0
  12. package/dist/ai/index.d.ts +2 -0
  13. package/dist/ai/index.d.ts.map +1 -0
  14. package/dist/ai/index.js +3 -0
  15. package/dist/ai/providers/rtzr/api.d.ts +22 -0
  16. package/dist/ai/providers/rtzr/api.d.ts.map +1 -0
  17. package/dist/ai/providers/rtzr/api.js +28 -0
  18. package/dist/ai/providers/rtzr/error.d.ts +18 -0
  19. package/dist/ai/providers/rtzr/error.d.ts.map +1 -0
  20. package/dist/ai/providers/rtzr/error.js +29 -0
  21. package/dist/ai/providers/rtzr/index.d.ts +5 -0
  22. package/dist/ai/providers/rtzr/index.d.ts.map +1 -0
  23. package/dist/ai/providers/rtzr/index.js +6 -0
  24. package/dist/ai/providers/rtzr/model.d.ts +52 -0
  25. package/dist/ai/providers/rtzr/model.d.ts.map +1 -0
  26. package/dist/ai/providers/rtzr/model.js +137 -0
  27. package/dist/ai/providers/rtzr/options.d.ts +7 -0
  28. package/dist/ai/providers/rtzr/options.d.ts.map +1 -0
  29. package/dist/ai/providers/rtzr/options.js +47 -0
  30. package/dist/ai/providers/rtzr/provider.d.ts +18 -0
  31. package/dist/ai/providers/rtzr/provider.d.ts.map +1 -0
  32. package/dist/ai/providers/rtzr/provider.js +54 -0
  33. package/dist/ai/providers/rtzr/utils.d.ts +19 -0
  34. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -0
  35. package/dist/ai/providers/rtzr/utils.js +88 -0
  36. package/dist/api/base-frame.d.ts +2 -2
  37. package/dist/api/base-frame.d.ts.map +1 -1
  38. package/dist/api/base-frame.js +2 -1
  39. package/dist/api/caster.d.ts.map +1 -1
  40. package/dist/api/caster.js +6 -1
  41. package/dist/api/code-converters.d.ts +58 -14
  42. package/dist/api/code-converters.d.ts.map +1 -1
  43. package/dist/api/code-converters.js +178 -409
  44. package/dist/api/config.d.ts +27 -13
  45. package/dist/api/config.d.ts.map +1 -1
  46. package/dist/api/config.js +19 -26
  47. package/dist/api/context.d.ts +4 -3
  48. package/dist/api/context.d.ts.map +1 -1
  49. package/dist/api/context.js +1 -1
  50. package/dist/api/decorators.d.ts +20 -6
  51. package/dist/api/decorators.d.ts.map +1 -1
  52. package/dist/api/decorators.js +111 -18
  53. package/dist/api/index.d.ts +2 -2
  54. package/dist/api/index.d.ts.map +1 -1
  55. package/dist/api/index.js +3 -3
  56. package/dist/api/sonamu.d.ts +7 -7
  57. package/dist/api/sonamu.d.ts.map +1 -1
  58. package/dist/api/sonamu.js +83 -51
  59. package/dist/api/validator.d.ts +6 -0
  60. package/dist/api/validator.d.ts.map +1 -0
  61. package/dist/api/validator.js +81 -0
  62. package/dist/bin/build-config.d.ts +5 -1
  63. package/dist/bin/build-config.d.ts.map +1 -1
  64. package/dist/bin/build-config.js +5 -2
  65. package/dist/bin/cli.js +165 -64
  66. package/dist/bin/loader-register.d.ts +2 -0
  67. package/dist/bin/loader-register.d.ts.map +1 -0
  68. package/dist/bin/loader-register.js +34 -0
  69. package/dist/database/_batch_update.d.ts +5 -3
  70. package/dist/database/_batch_update.d.ts.map +1 -1
  71. package/dist/database/_batch_update.js +30 -13
  72. package/dist/database/base-model.d.ts +96 -10
  73. package/dist/database/base-model.d.ts.map +1 -1
  74. package/dist/database/base-model.js +232 -89
  75. package/dist/database/base-model.types.d.ts +93 -0
  76. package/dist/database/base-model.types.d.ts.map +1 -0
  77. package/dist/database/base-model.types.js +10 -0
  78. package/dist/database/code-generator.d.ts +1 -1
  79. package/dist/database/code-generator.d.ts.map +1 -1
  80. package/dist/database/code-generator.js +11 -10
  81. package/dist/database/db.d.ts +5 -6
  82. package/dist/database/db.d.ts.map +1 -1
  83. package/dist/database/db.js +22 -25
  84. package/dist/database/puri-subset.test-d.js +81 -0
  85. package/dist/database/puri-subset.types.d.ts +123 -0
  86. package/dist/database/puri-subset.types.d.ts.map +1 -0
  87. package/dist/database/puri-subset.types.js +16 -0
  88. package/dist/database/puri-wrapper.d.ts +13 -11
  89. package/dist/database/puri-wrapper.d.ts.map +1 -1
  90. package/dist/database/puri-wrapper.js +2 -2
  91. package/dist/database/puri.d.ts +25 -14
  92. package/dist/database/puri.d.ts.map +1 -1
  93. package/dist/database/puri.js +83 -21
  94. package/dist/database/puri.types.d.ts +21 -7
  95. package/dist/database/puri.types.d.ts.map +1 -1
  96. package/dist/database/puri.types.js +4 -1
  97. package/dist/database/transaction-context.d.ts +1 -1
  98. package/dist/database/transaction-context.d.ts.map +1 -1
  99. package/dist/database/transaction-context.js +1 -1
  100. package/dist/database/upsert-builder.d.ts +9 -3
  101. package/dist/database/upsert-builder.d.ts.map +1 -1
  102. package/dist/database/upsert-builder.js +227 -78
  103. package/dist/entity/entity-manager.d.ts +165 -2
  104. package/dist/entity/entity-manager.d.ts.map +1 -1
  105. package/dist/entity/entity-manager.js +26 -10
  106. package/dist/entity/entity.d.ts +5 -3
  107. package/dist/entity/entity.d.ts.map +1 -1
  108. package/dist/entity/entity.js +153 -54
  109. package/dist/exceptions/error-handler.d.ts +1 -1
  110. package/dist/exceptions/error-handler.d.ts.map +1 -1
  111. package/dist/exceptions/error-handler.js +1 -1
  112. package/dist/exceptions/so-exceptions.d.ts +1 -1
  113. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  114. package/dist/exceptions/so-exceptions.js +1 -1
  115. package/dist/file-storage/driver.d.ts +1 -1
  116. package/dist/file-storage/driver.d.ts.map +1 -1
  117. package/dist/file-storage/driver.js +1 -1
  118. package/dist/file-storage/file-storage.js +2 -2
  119. package/dist/index.d.ts +18 -11
  120. package/dist/index.d.ts.map +1 -1
  121. package/dist/index.js +19 -13
  122. package/dist/migration/code-generation.d.ts +1 -1
  123. package/dist/migration/code-generation.d.ts.map +1 -1
  124. package/dist/migration/code-generation.js +123 -67
  125. package/dist/migration/migration-set.d.ts +2 -10
  126. package/dist/migration/migration-set.d.ts.map +1 -1
  127. package/dist/migration/migration-set.js +67 -218
  128. package/dist/migration/migrator.d.ts +24 -73
  129. package/dist/migration/migrator.d.ts.map +1 -1
  130. package/dist/migration/migrator.js +121 -301
  131. package/dist/migration/postgresql-schema-reader.d.ts +51 -0
  132. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -0
  133. package/dist/migration/postgresql-schema-reader.js +245 -0
  134. package/dist/migration/types.d.ts +6 -38
  135. package/dist/migration/types.d.ts.map +1 -1
  136. package/dist/migration/types.js +1 -1
  137. package/dist/naite/messaging-types.d.ts +43 -0
  138. package/dist/naite/messaging-types.d.ts.map +1 -0
  139. package/dist/naite/messaging-types.js +7 -0
  140. package/dist/naite/naite-reporter.d.ts +41 -0
  141. package/dist/naite/naite-reporter.d.ts.map +1 -0
  142. package/dist/naite/naite-reporter.js +102 -0
  143. package/dist/naite/naite.d.ts +91 -8
  144. package/dist/naite/naite.d.ts.map +1 -1
  145. package/dist/naite/naite.js +285 -41
  146. package/dist/stream/sse.d.ts +2 -2
  147. package/dist/stream/sse.d.ts.map +1 -1
  148. package/dist/stream/sse.js +1 -1
  149. package/dist/syncer/api-parser.d.ts +3 -13
  150. package/dist/syncer/api-parser.d.ts.map +1 -1
  151. package/dist/syncer/api-parser.js +67 -56
  152. package/dist/syncer/checksum.d.ts +2 -2
  153. package/dist/syncer/checksum.d.ts.map +1 -1
  154. package/dist/syncer/checksum.js +11 -11
  155. package/dist/syncer/code-generator.d.ts +3 -3
  156. package/dist/syncer/code-generator.d.ts.map +1 -1
  157. package/dist/syncer/code-generator.js +37 -17
  158. package/dist/syncer/entity-operations.d.ts +2 -2
  159. package/dist/syncer/entity-operations.d.ts.map +1 -1
  160. package/dist/syncer/entity-operations.js +9 -8
  161. package/dist/syncer/file-patterns.d.ts +1 -1
  162. package/dist/syncer/file-patterns.d.ts.map +1 -1
  163. package/dist/syncer/file-patterns.js +1 -1
  164. package/dist/syncer/index.d.ts +4 -4
  165. package/dist/syncer/index.d.ts.map +1 -1
  166. package/dist/syncer/index.js +5 -5
  167. package/dist/syncer/module-loader.d.ts +4 -4
  168. package/dist/syncer/module-loader.d.ts.map +1 -1
  169. package/dist/syncer/module-loader.js +17 -12
  170. package/dist/syncer/syncer.d.ts +31 -24
  171. package/dist/syncer/syncer.d.ts.map +1 -1
  172. package/dist/syncer/syncer.js +92 -45
  173. package/dist/template/entity-converter.d.ts +1 -1
  174. package/dist/template/entity-converter.d.ts.map +1 -1
  175. package/dist/template/entity-converter.js +15 -8
  176. package/dist/template/helpers.d.ts +2 -2
  177. package/dist/template/helpers.d.ts.map +1 -1
  178. package/dist/template/helpers.js +3 -3
  179. package/dist/template/implementations/entity.template.d.ts +2 -2
  180. package/dist/template/implementations/entity.template.d.ts.map +1 -1
  181. package/dist/template/implementations/entity.template.js +4 -5
  182. package/dist/template/implementations/generated.template.d.ts +2 -3
  183. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  184. package/dist/template/implementations/generated.template.js +46 -29
  185. package/dist/template/implementations/generated_http.template.d.ts +2 -3
  186. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  187. package/dist/template/implementations/generated_http.template.js +9 -9
  188. package/dist/template/implementations/generated_sso.template.d.ts +3 -4
  189. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  190. package/dist/template/implementations/generated_sso.template.js +54 -25
  191. package/dist/template/implementations/init_types.template.d.ts +2 -2
  192. package/dist/template/implementations/init_types.template.d.ts.map +1 -1
  193. package/dist/template/implementations/init_types.template.js +2 -2
  194. package/dist/template/implementations/model.template.d.ts +2 -2
  195. package/dist/template/implementations/model.template.d.ts.map +1 -1
  196. package/dist/template/implementations/model.template.js +47 -37
  197. package/dist/template/implementations/model_test.template.d.ts +2 -2
  198. package/dist/template/implementations/model_test.template.d.ts.map +1 -1
  199. package/dist/template/implementations/model_test.template.js +2 -2
  200. package/dist/template/implementations/service.template.d.ts +4 -4
  201. package/dist/template/implementations/service.template.d.ts.map +1 -1
  202. package/dist/template/implementations/service.template.js +24 -16
  203. package/dist/template/implementations/view_enums_buttonset.template.d.ts +2 -2
  204. package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +1 -1
  205. package/dist/template/implementations/view_enums_buttonset.template.js +1 -1
  206. package/dist/template/implementations/view_enums_dropdown.template.d.ts +2 -2
  207. package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +1 -1
  208. package/dist/template/implementations/view_enums_dropdown.template.js +2 -2
  209. package/dist/template/implementations/view_enums_select.template.d.ts +2 -2
  210. package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -1
  211. package/dist/template/implementations/view_enums_select.template.js +2 -2
  212. package/dist/template/implementations/view_form.template.d.ts +2 -2
  213. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  214. package/dist/template/implementations/view_form.template.js +4 -4
  215. package/dist/template/implementations/view_id_all_select.template.d.ts +2 -2
  216. package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -1
  217. package/dist/template/implementations/view_id_all_select.template.js +1 -1
  218. package/dist/template/implementations/view_id_async_select.template.d.ts +2 -2
  219. package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -1
  220. package/dist/template/implementations/view_id_async_select.template.js +1 -1
  221. package/dist/template/implementations/view_list.template.d.ts +2 -2
  222. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  223. package/dist/template/implementations/view_list.template.js +29 -19
  224. package/dist/template/implementations/view_list_columns.template.d.ts +3 -3
  225. package/dist/template/implementations/view_list_columns.template.d.ts.map +1 -1
  226. package/dist/template/implementations/view_list_columns.template.js +1 -1
  227. package/dist/template/implementations/view_search_input.template.d.ts +2 -2
  228. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
  229. package/dist/template/implementations/view_search_input.template.js +1 -1
  230. package/dist/template/index.d.ts +4 -2
  231. package/dist/template/index.d.ts.map +1 -1
  232. package/dist/template/index.js +5 -3
  233. package/dist/template/template-manager.d.ts +56 -0
  234. package/dist/template/template-manager.d.ts.map +1 -0
  235. package/dist/template/template-manager.js +125 -0
  236. package/dist/template/template-types.d.ts +16 -0
  237. package/dist/template/template-types.d.ts.map +1 -0
  238. package/dist/template/template-types.js +7 -0
  239. package/dist/template/template.d.ts +12 -2
  240. package/dist/template/template.d.ts.map +1 -1
  241. package/dist/template/template.js +19 -6
  242. package/dist/template/zod-converter.d.ts +40 -7
  243. package/dist/template/zod-converter.d.ts.map +1 -1
  244. package/dist/template/zod-converter.js +386 -58
  245. package/dist/testing/_relation-graph.d.ts +1 -1
  246. package/dist/testing/_relation-graph.d.ts.map +1 -1
  247. package/dist/testing/_relation-graph.js +12 -3
  248. package/dist/testing/fixture-manager.d.ts +42 -11
  249. package/dist/testing/fixture-manager.d.ts.map +1 -1
  250. package/dist/testing/fixture-manager.js +338 -236
  251. package/dist/types/types.d.ts +709 -104
  252. package/dist/types/types.d.ts.map +1 -1
  253. package/dist/types/types.js +309 -52
  254. package/dist/typings/knex.d.js +2 -2
  255. package/dist/utils/async-utils.d.ts.map +1 -1
  256. package/dist/utils/async-utils.js +3 -3
  257. package/dist/utils/console-util.js +1 -1
  258. package/dist/utils/controller.d.ts +1 -0
  259. package/dist/utils/controller.d.ts.map +1 -1
  260. package/dist/utils/controller.js +4 -1
  261. package/dist/utils/esm-utils.d.ts +0 -6
  262. package/dist/utils/esm-utils.d.ts.map +1 -1
  263. package/dist/utils/esm-utils.js +2 -9
  264. package/dist/utils/formatter.d.ts +3 -0
  265. package/dist/utils/formatter.d.ts.map +1 -0
  266. package/dist/utils/formatter.js +110 -0
  267. package/dist/utils/fs-utils.d.ts +1 -1
  268. package/dist/utils/fs-utils.d.ts.map +1 -1
  269. package/dist/utils/fs-utils.js +1 -1
  270. package/dist/utils/lodash-able.d.ts.map +1 -1
  271. package/dist/utils/lodash-able.js +1 -1
  272. package/dist/utils/object-utils.d.ts +44 -0
  273. package/dist/utils/object-utils.d.ts.map +1 -0
  274. package/dist/utils/object-utils.js +191 -0
  275. package/dist/utils/path-utils.d.ts +1 -1
  276. package/dist/utils/path-utils.d.ts.map +1 -1
  277. package/dist/utils/path-utils.js +3 -3
  278. package/dist/utils/process-utils.js +1 -1
  279. package/dist/utils/sql-parser.d.ts +5 -1
  280. package/dist/utils/sql-parser.d.ts.map +1 -1
  281. package/dist/utils/sql-parser.js +14 -3
  282. package/dist/utils/type-utils.d.ts +23 -0
  283. package/dist/utils/type-utils.d.ts.map +1 -0
  284. package/dist/utils/type-utils.js +45 -0
  285. package/dist/utils/utils.d.ts +7 -1
  286. package/dist/utils/utils.d.ts.map +1 -1
  287. package/dist/utils/utils.js +44 -5
  288. package/dist/utils/zod-error.d.ts +1 -1
  289. package/dist/utils/zod-error.d.ts.map +1 -1
  290. package/dist/utils/zod-error.js +1 -1
  291. package/package.json +55 -30
  292. package/src/ai/agents/agent.ts +87 -0
  293. package/src/ai/agents/index.ts +2 -0
  294. package/src/ai/agents/types.ts +47 -0
  295. package/src/ai/index.ts +1 -0
  296. package/src/ai/providers/rtzr/api.ts +37 -0
  297. package/src/ai/providers/rtzr/error.ts +34 -0
  298. package/src/ai/providers/rtzr/index.ts +4 -0
  299. package/src/ai/providers/rtzr/model.ts +201 -0
  300. package/src/ai/providers/rtzr/options.ts +49 -0
  301. package/src/ai/providers/rtzr/provider.ts +91 -0
  302. package/src/ai/providers/rtzr/utils.ts +127 -0
  303. package/src/api/base-frame.ts +4 -2
  304. package/src/api/caster.ts +17 -23
  305. package/src/api/code-converters.ts +176 -533
  306. package/src/api/config.ts +39 -56
  307. package/src/api/context.ts +7 -18
  308. package/src/api/decorators.ts +175 -46
  309. package/src/api/index.ts +2 -2
  310. package/src/api/sonamu.ts +133 -124
  311. package/src/api/validator.ts +83 -0
  312. package/src/bin/build-config.ts +7 -1
  313. package/src/bin/cli.ts +192 -110
  314. package/src/bin/loader-register.ts +38 -0
  315. package/src/database/_batch_update.ts +46 -31
  316. package/src/database/base-model.ts +390 -182
  317. package/src/database/base-model.types.ts +155 -0
  318. package/src/database/code-generator.ts +13 -32
  319. package/src/database/db.ts +36 -50
  320. package/src/database/puri-subset.test-d.ts +471 -0
  321. package/src/database/puri-subset.types.ts +195 -0
  322. package/src/database/puri-wrapper.ts +58 -67
  323. package/src/database/puri.ts +182 -126
  324. package/src/database/puri.types.ts +64 -31
  325. package/src/database/transaction-context.ts +1 -1
  326. package/src/database/upsert-builder.ts +261 -132
  327. package/src/entity/entity-manager.ts +36 -28
  328. package/src/entity/entity.ts +330 -249
  329. package/src/exceptions/error-handler.ts +3 -3
  330. package/src/exceptions/so-exceptions.ts +11 -11
  331. package/src/file-storage/driver.ts +5 -5
  332. package/src/file-storage/file-storage.ts +2 -2
  333. package/src/index.ts +18 -12
  334. package/src/migration/code-generation.ts +185 -172
  335. package/src/migration/migration-set.ts +80 -293
  336. package/src/migration/migrator.ts +182 -425
  337. package/src/migration/mysql-schema-reader.ts.txt +272 -0
  338. package/src/migration/postgresql-schema-reader.ts +310 -0
  339. package/src/migration/types.ts +6 -39
  340. package/src/naite/messaging-types.ts +51 -0
  341. package/src/naite/naite-reporter.ts +128 -0
  342. package/src/naite/naite.ts +378 -33
  343. package/src/shared/web.shared.ts.txt +20 -24
  344. package/src/stream/sse.ts +5 -5
  345. package/src/syncer/api-parser.ts +52 -69
  346. package/src/syncer/checksum.ts +25 -37
  347. package/src/syncer/code-generator.ts +58 -62
  348. package/src/syncer/entity-operations.ts +12 -15
  349. package/src/syncer/file-patterns.ts +2 -2
  350. package/src/syncer/index.ts +4 -4
  351. package/src/syncer/module-loader.ts +28 -25
  352. package/src/syncer/syncer.ts +155 -162
  353. package/src/template/entity-converter.ts +18 -27
  354. package/src/template/helpers.ts +8 -11
  355. package/src/template/implementations/entity.template.ts +6 -6
  356. package/src/template/implementations/generated.template.ts +99 -99
  357. package/src/template/implementations/generated_http.template.ts +21 -54
  358. package/src/template/implementations/generated_sso.template.ts +78 -65
  359. package/src/template/implementations/init_types.template.ts +4 -6
  360. package/src/template/implementations/model.template.ts +47 -38
  361. package/src/template/implementations/model_test.template.ts +3 -3
  362. package/src/template/implementations/service.template.ts +56 -80
  363. package/src/template/implementations/view_enums_buttonset.template.ts +2 -2
  364. package/src/template/implementations/view_enums_dropdown.template.ts +4 -4
  365. package/src/template/implementations/view_enums_select.template.ts +3 -3
  366. package/src/template/implementations/view_form.template.ts +34 -75
  367. package/src/template/implementations/view_id_all_select.template.ts +2 -2
  368. package/src/template/implementations/view_id_async_select.template.ts +9 -23
  369. package/src/template/implementations/view_list.template.ts +54 -95
  370. package/src/template/implementations/view_list_columns.template.ts +4 -10
  371. package/src/template/implementations/view_search_input.template.ts +2 -2
  372. package/src/template/index.ts +4 -2
  373. package/src/template/template-manager.ts +166 -0
  374. package/src/template/template-types.ts +16 -0
  375. package/src/template/template.ts +29 -10
  376. package/src/template/zod-converter.ts +459 -101
  377. package/src/testing/_relation-graph.ts +18 -11
  378. package/src/testing/fixture-manager.ts +468 -362
  379. package/src/types/types.ts +516 -248
  380. package/src/typings/knex.d.ts +7 -9
  381. package/src/utils/async-utils.ts +8 -12
  382. package/src/utils/console-util.ts +1 -1
  383. package/src/utils/controller.ts +3 -0
  384. package/src/utils/esm-utils.ts +8 -18
  385. package/src/utils/formatter.ts +109 -0
  386. package/src/utils/fs-utils.ts +1 -1
  387. package/src/utils/lodash-able.ts +1 -4
  388. package/src/utils/object-utils.ts +217 -0
  389. package/src/utils/path-utils.ts +3 -6
  390. package/src/utils/process-utils.ts +1 -1
  391. package/src/utils/sql-parser.ts +23 -5
  392. package/src/utils/type-utils.ts +83 -0
  393. package/src/utils/utils.ts +58 -9
  394. package/src/utils/zod-error.ts +3 -3
  395. package/dist/bin/cli-wrapper.d.ts +0 -3
  396. package/dist/bin/cli-wrapper.d.ts.map +0 -1
  397. package/dist/bin/cli-wrapper.js +0 -72
  398. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts +0 -2
  399. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts.map +0 -1
  400. package/dist/database/knex-plugins/knex-on-duplicate-update.js +0 -39
  401. package/dist/entity/entity-utils.d.ts +0 -61
  402. package/dist/entity/entity-utils.d.ts.map +0 -1
  403. package/dist/entity/entity-utils.js +0 -210
  404. package/src/bin/cli-wrapper.ts +0 -82
  405. package/src/database/knex-plugins/knex-on-duplicate-update.ts +0 -45
  406. package/src/entity/entity-utils.ts +0 -291
@@ -0,0 +1,81 @@
1
+ export const RESERVED_KEYWORDS = new Set([
2
+ "abstract",
3
+ "arguments",
4
+ "async",
5
+ "await",
6
+ "boolean",
7
+ "break",
8
+ "byte",
9
+ "case",
10
+ "catch",
11
+ "char",
12
+ "class",
13
+ "const",
14
+ "continue",
15
+ "debugger",
16
+ "default",
17
+ "delete",
18
+ "do",
19
+ "double",
20
+ "else",
21
+ "enum",
22
+ "eval",
23
+ "export",
24
+ "extends",
25
+ "false",
26
+ "final",
27
+ "finally",
28
+ "float",
29
+ "for",
30
+ "function",
31
+ "goto",
32
+ "if",
33
+ "implements",
34
+ "import",
35
+ "in",
36
+ "instanceof",
37
+ "int",
38
+ "interface",
39
+ "let",
40
+ "long",
41
+ "native",
42
+ "new",
43
+ "null",
44
+ "package",
45
+ "private",
46
+ "protected",
47
+ "public",
48
+ "return",
49
+ "short",
50
+ "static",
51
+ "super",
52
+ "switch",
53
+ "synchronized",
54
+ "this",
55
+ "throw",
56
+ "throws",
57
+ "transient",
58
+ "true",
59
+ "try",
60
+ "typeof",
61
+ "using",
62
+ "var",
63
+ "void",
64
+ "volatile",
65
+ "while",
66
+ "with",
67
+ "yield"
68
+ ]);
69
+ export class ApiValidationError extends Error {
70
+ constructor(message){
71
+ super(`[Sonamu API Validation] ${message}`);
72
+ this.name = "ApiValidationError";
73
+ }
74
+ }
75
+ export function validateMethodName(methodName) {
76
+ if (RESERVED_KEYWORDS.has(methodName)) {
77
+ throw new ApiValidationError(`Method name ${methodName} is a reserved keyword. Please choose a different name.`);
78
+ }
79
+ }
80
+
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvdmFsaWRhdG9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBSRVNFUlZFRF9LRVlXT1JEUyA9IG5ldyBTZXQoW1xuICBcImFic3RyYWN0XCIsXG4gIFwiYXJndW1lbnRzXCIsXG4gIFwiYXN5bmNcIixcbiAgXCJhd2FpdFwiLFxuICBcImJvb2xlYW5cIixcbiAgXCJicmVha1wiLFxuICBcImJ5dGVcIixcbiAgXCJjYXNlXCIsXG4gIFwiY2F0Y2hcIixcbiAgXCJjaGFyXCIsXG4gIFwiY2xhc3NcIixcbiAgXCJjb25zdFwiLFxuICBcImNvbnRpbnVlXCIsXG4gIFwiZGVidWdnZXJcIixcbiAgXCJkZWZhdWx0XCIsXG4gIFwiZGVsZXRlXCIsXG4gIFwiZG9cIixcbiAgXCJkb3VibGVcIixcbiAgXCJlbHNlXCIsXG4gIFwiZW51bVwiLFxuICBcImV2YWxcIixcbiAgXCJleHBvcnRcIixcbiAgXCJleHRlbmRzXCIsXG4gIFwiZmFsc2VcIixcbiAgXCJmaW5hbFwiLFxuICBcImZpbmFsbHlcIixcbiAgXCJmbG9hdFwiLFxuICBcImZvclwiLFxuICBcImZ1bmN0aW9uXCIsXG4gIFwiZ290b1wiLFxuICBcImlmXCIsXG4gIFwiaW1wbGVtZW50c1wiLFxuICBcImltcG9ydFwiLFxuICBcImluXCIsXG4gIFwiaW5zdGFuY2VvZlwiLFxuICBcImludFwiLFxuICBcImludGVyZmFjZVwiLFxuICBcImxldFwiLFxuICBcImxvbmdcIixcbiAgXCJuYXRpdmVcIixcbiAgXCJuZXdcIixcbiAgXCJudWxsXCIsXG4gIFwicGFja2FnZVwiLFxuICBcInByaXZhdGVcIixcbiAgXCJwcm90ZWN0ZWRcIixcbiAgXCJwdWJsaWNcIixcbiAgXCJyZXR1cm5cIixcbiAgXCJzaG9ydFwiLFxuICBcInN0YXRpY1wiLFxuICBcInN1cGVyXCIsXG4gIFwic3dpdGNoXCIsXG4gIFwic3luY2hyb25pemVkXCIsXG4gIFwidGhpc1wiLFxuICBcInRocm93XCIsXG4gIFwidGhyb3dzXCIsXG4gIFwidHJhbnNpZW50XCIsXG4gIFwidHJ1ZVwiLFxuICBcInRyeVwiLFxuICBcInR5cGVvZlwiLFxuICBcInVzaW5nXCIsXG4gIFwidmFyXCIsXG4gIFwidm9pZFwiLFxuICBcInZvbGF0aWxlXCIsXG4gIFwid2hpbGVcIixcbiAgXCJ3aXRoXCIsXG4gIFwieWllbGRcIixcbl0pO1xuXG5leHBvcnQgY2xhc3MgQXBpVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgW1NvbmFtdSBBUEkgVmFsaWRhdGlvbl0gJHttZXNzYWdlfWApO1xuICAgIHRoaXMubmFtZSA9IFwiQXBpVmFsaWRhdGlvbkVycm9yXCI7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTWV0aG9kTmFtZShtZXRob2ROYW1lOiBzdHJpbmcpIHtcbiAgaWYgKFJFU0VSVkVEX0tFWVdPUkRTLmhhcyhtZXRob2ROYW1lKSkge1xuICAgIHRocm93IG5ldyBBcGlWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBgTWV0aG9kIG5hbWUgJHttZXRob2ROYW1lfSBpcyBhIHJlc2VydmVkIGtleXdvcmQuIFBsZWFzZSBjaG9vc2UgYSBkaWZmZXJlbnQgbmFtZS5gLFxuICAgICk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJSRVNFUlZFRF9LRVlXT1JEUyIsIlNldCIsIkFwaVZhbGlkYXRpb25FcnJvciIsIkVycm9yIiwibWVzc2FnZSIsIm5hbWUiLCJ2YWxpZGF0ZU1ldGhvZE5hbWUiLCJtZXRob2ROYW1lIiwiaGFzIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU1BLG9CQUFvQixJQUFJQyxJQUFJO0lBQ3ZDO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtDQUNELEVBQUU7QUFFSCxPQUFPLE1BQU1DLDJCQUEyQkM7SUFDdEMsWUFBWUMsT0FBZSxDQUFFO1FBQzNCLEtBQUssQ0FBQyxDQUFDLHdCQUF3QixFQUFFQSxTQUFTO1FBQzFDLElBQUksQ0FBQ0MsSUFBSSxHQUFHO0lBQ2Q7QUFDRjtBQUVBLE9BQU8sU0FBU0MsbUJBQW1CQyxVQUFrQjtJQUNuRCxJQUFJUCxrQkFBa0JRLEdBQUcsQ0FBQ0QsYUFBYTtRQUNyQyxNQUFNLElBQUlMLG1CQUNSLENBQUMsWUFBWSxFQUFFSyxXQUFXLHVEQUF1RCxDQUFDO0lBRXRGO0FBQ0YifQ==
@@ -1,3 +1,7 @@
1
+ /**
2
+ * 소스 코드가 담길 디렉토리 경로
3
+ */
4
+ export declare const SRC_DIR = "src";
1
5
  /**
2
6
  * 빌드 결과물이 담길 디렉토리 경로
3
7
  */
@@ -6,7 +10,7 @@ export declare const BUILD_DIR = "dist";
6
10
  * SWC 빌드 명령어
7
11
  * .swcrc 설정 사용
8
12
  */
9
- export declare const SWC_BUILD_COMMAND = "swc src -d dist --strip-leading-paths";
13
+ export declare const SWC_BUILD_COMMAND: (configFilePath: string) => string;
10
14
  /**
11
15
  * TSC 타입 체크 명령어
12
16
  */
@@ -1 +1 @@
1
- {"version":3,"file":"build-config.d.ts","sourceRoot":"","sources":["../../src/bin/build-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,SAAS,SAAS,CAAC;AAEhC;;;GAGG;AACH,eAAO,MAAM,iBAAiB,0CAAkD,CAAC;AAEjF;;GAEG;AACH,eAAO,MAAM,sBAAsB,iBAAiB,CAAC"}
1
+ {"version":3,"file":"build-config.d.ts","sourceRoot":"","sources":["../../src/bin/build-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,OAAO,QAAQ,CAAC;AAE7B;;GAEG;AACH,eAAO,MAAM,SAAS,SAAS,CAAC;AAEhC;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,gBAAgB,MAAM,WACiC,CAAC;AAE1F;;GAEG;AACH,eAAO,MAAM,sBAAsB,iBAAiB,CAAC"}
@@ -1,12 +1,15 @@
1
+ /**
2
+ * 소스 코드가 담길 디렉토리 경로
3
+ */ export const SRC_DIR = "src";
1
4
  /**
2
5
  * 빌드 결과물이 담길 디렉토리 경로
3
6
  */ export const BUILD_DIR = "dist";
4
7
  /**
5
8
  * SWC 빌드 명령어
6
9
  * .swcrc 설정 사용
7
- */ export const SWC_BUILD_COMMAND = `swc src -d ${BUILD_DIR} --strip-leading-paths`;
10
+ */ export const SWC_BUILD_COMMAND = (configFilePath)=>`swc ${SRC_DIR} -d ${BUILD_DIR} --config-file ${configFilePath} --strip-leading-paths`;
8
11
  /**
9
12
  * TSC 타입 체크 명령어
10
13
  */ export const TSC_TYPE_CHECK_COMMAND = `tsc --noEmit`;
11
14
 
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vYnVpbGQtY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog67mM65OcIOqysOqzvOusvOydtCDri7TquLgg65SU66CJ7Yag66asIOqyveuhnFxuICovXG5leHBvcnQgY29uc3QgQlVJTERfRElSID0gXCJkaXN0XCI7XG5cbi8qKlxuICogU1dDIOu5jOuTnCDrqoXroLnslrRcbiAqIC5zd2NyYyDshKTsoJUg7IKs7JqpXG4gKi9cbmV4cG9ydCBjb25zdCBTV0NfQlVJTERfQ09NTUFORCA9IGBzd2Mgc3JjIC1kICR7QlVJTERfRElSfSAtLXN0cmlwLWxlYWRpbmctcGF0aHNgO1xuXG4vKipcbiAqIFRTQyDtg4DsnoUg7LK07YGsIOuqheugueyWtFxuICovXG5leHBvcnQgY29uc3QgVFNDX1RZUEVfQ0hFQ0tfQ09NTUFORCA9IGB0c2MgLS1ub0VtaXRgO1xuIl0sIm5hbWVzIjpbIkJVSUxEX0RJUiIsIlNXQ19CVUlMRF9DT01NQU5EIiwiVFNDX1RZUEVfQ0hFQ0tfQ09NTUFORCJdLCJtYXBwaW5ncyI6IkFBQUE7O0NBRUMsR0FDRCxPQUFPLE1BQU1BLFlBQVksT0FBTztBQUVoQzs7O0NBR0MsR0FDRCxPQUFPLE1BQU1DLG9CQUFvQixDQUFDLFdBQVcsRUFBRUQsVUFBVSxzQkFBc0IsQ0FBQyxDQUFDO0FBRWpGOztDQUVDLEdBQ0QsT0FBTyxNQUFNRSx5QkFBeUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyJ9
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vYnVpbGQtY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog7IaM7IqkIOy9lOuTnOqwgCDri7TquLgg65SU66CJ7Yag66asIOqyveuhnFxuICovXG5leHBvcnQgY29uc3QgU1JDX0RJUiA9IFwic3JjXCI7XG5cbi8qKlxuICog67mM65OcIOqysOqzvOusvOydtCDri7TquLgg65SU66CJ7Yag66asIOqyveuhnFxuICovXG5leHBvcnQgY29uc3QgQlVJTERfRElSID0gXCJkaXN0XCI7XG5cbi8qKlxuICogU1dDIOu5jOuTnCDrqoXroLnslrRcbiAqIC5zd2NyYyDshKTsoJUg7IKs7JqpXG4gKi9cbmV4cG9ydCBjb25zdCBTV0NfQlVJTERfQ09NTUFORCA9IChjb25maWdGaWxlUGF0aDogc3RyaW5nKSA9PlxuICBgc3djICR7U1JDX0RJUn0gLWQgJHtCVUlMRF9ESVJ9IC0tY29uZmlnLWZpbGUgJHtjb25maWdGaWxlUGF0aH0gIC0tc3RyaXAtbGVhZGluZy1wYXRoc2A7XG5cbi8qKlxuICogVFNDIO2DgOyehSDssrTtgawg66qF66C57Ja0XG4gKi9cbmV4cG9ydCBjb25zdCBUU0NfVFlQRV9DSEVDS19DT01NQU5EID0gYHRzYyAtLW5vRW1pdGA7XG4iXSwibmFtZXMiOlsiU1JDX0RJUiIsIkJVSUxEX0RJUiIsIlNXQ19CVUlMRF9DT01NQU5EIiwiY29uZmlnRmlsZVBhdGgiLCJUU0NfVFlQRV9DSEVDS19DT01NQU5EIl0sIm1hcHBpbmdzIjoiQUFBQTs7Q0FFQyxHQUNELE9BQU8sTUFBTUEsVUFBVSxNQUFNO0FBRTdCOztDQUVDLEdBQ0QsT0FBTyxNQUFNQyxZQUFZLE9BQU87QUFFaEM7OztDQUdDLEdBQ0QsT0FBTyxNQUFNQyxvQkFBb0IsQ0FBQ0MsaUJBQ2hDLENBQUMsSUFBSSxFQUFFSCxRQUFRLElBQUksRUFBRUMsVUFBVSxlQUFlLEVBQUVFLGVBQWUsdUJBQXVCLENBQUMsQ0FBQztBQUUxRjs7Q0FFQyxHQUNELE9BQU8sTUFBTUMseUJBQXlCLENBQUMsWUFBWSxDQUFDLENBQUMifQ==
package/dist/bin/cli.js CHANGED
@@ -1,23 +1,28 @@
1
1
  import chalk from "chalk";
2
2
  import dotenv from "dotenv";
3
3
  dotenv.config();
4
- import path from "path";
5
- import { fileURLToPath } from "url";
6
- import { tsicli } from "tsicli";
7
4
  import { execSync, spawn } from "child_process";
8
- import { mkdir, readdir, writeFile } from "node:fs/promises";
9
- import { exists } from "../utils/fs-utils.js";
5
+ import { mkdir, readdir, rm, writeFile } from "node:fs/promises";
6
+ import knex from "knex";
7
+ import { createRequire } from "module";
8
+ import path from "path";
10
9
  import process from "process";
10
+ import { tsicli } from "tsicli";
11
11
  import { Sonamu } from "../api/index.js";
12
- import knex from "knex";
13
12
  import { EntityManager } from "../entity/entity-manager.js";
14
13
  import { Migrator } from "../migration/migrator.js";
15
14
  import { FixtureManager } from "../testing/fixture-manager.js";
15
+ import { exists } from "../utils/fs-utils.js";
16
16
  import { findApiRootPath } from "../utils/utils.js";
17
+ import { BUILD_DIR, SWC_BUILD_COMMAND, TSC_TYPE_CHECK_COMMAND } from "./build-config.js";
17
18
  let migrator;
18
19
  async function bootstrap() {
19
- // dev 명령어가 아닌 경우에만 Sonamu 초기화
20
- if (process.argv[2] !== "dev") {
20
+ const notToInit = [
21
+ "dev",
22
+ "build",
23
+ "start"
24
+ ].includes(process.argv[2] ?? "");
25
+ if (!notToInit) {
21
26
  await Sonamu.init(false, false);
22
27
  }
23
28
  await tsicli(process.argv, {
@@ -106,20 +111,22 @@ async function bootstrap() {
106
111
  [
107
112
  "ui"
108
113
  ],
114
+ [
115
+ "sync"
116
+ ],
109
117
  [
110
118
  "dev"
111
119
  ],
120
+ [
121
+ "build"
122
+ ],
112
123
  [
113
124
  "start"
114
125
  ]
115
126
  ],
116
127
  runners: {
117
- migrate_run,
118
- migrate_check,
119
- migrate_rollback,
120
- migrate_clear,
121
- migrate_reset,
122
128
  migrate_status,
129
+ migrate_run,
123
130
  fixture_init,
124
131
  fixture_import,
125
132
  fixture_sync,
@@ -130,26 +137,52 @@ async function bootstrap() {
130
137
  ui,
131
138
  // scaffold_view_list,
132
139
  // scaffold_view_form,
140
+ sync,
133
141
  dev,
142
+ build,
134
143
  start
135
144
  }
136
145
  });
137
146
  }
138
147
  bootstrap().finally(async ()=>{
139
- if (migrator) {
140
- await migrator.destroy();
141
- }
142
148
  await FixtureManager.destroy();
143
149
  });
144
- async function dev() {
150
+ /**
151
+ * pnpm sync 하면 실행되는 함수입니다.
152
+ * 프로젝트를 싱크합니다.
153
+ */ async function sync() {
154
+ await Sonamu.syncer.sync();
155
+ }
156
+ /**
157
+ * pnpm dev 하면 실행되는 함수입니다.
158
+ * 프로젝트에 대해 HMR 지원하는 개발 서버를 띄워줍니다.
159
+ *
160
+ * TypeScript를 바로 실행할 수 있도록 @sonamu-kit/loader를,
161
+ * HMR을 지원하기 위해 @sonamu-kit/hot-hook을 import하며,
162
+ * 소스맵 지원을 위해 --enable-source-maps 플래그를 포함하여 실행합니다.
163
+ *
164
+ * 이때 @sonamu-kit/loader와 @sonamu-kit/hot-hook는 sonamu가 자체적으로 가지고 있는 dependency입니다.
165
+ * 또한 실행에 사용하는 @sonamu-kit/hot-runner도 마찬가지로 sonamu가 자체적으로 가지고 있는 dependency입니다.
166
+ * 따라서 사용자 프로젝트에서는 이 세 패키지를 직접 설치할 필요가 없습니다.
167
+ *
168
+ * Sonamu.init 없이 호출될 것을 상정하여 구현되었습니다.
169
+ */ async function dev() {
145
170
  const apiRoot = findApiRootPath();
146
- const entryPoint = 'src/index.ts';
147
- console.log(chalk.yellow.bold('🚀 Starting Sonamu dev server...\n'));
148
- const serverProcess = spawn("hot-runner", [
171
+ const entryPoint = "src/index.ts";
172
+ console.log(chalk.yellow.bold("🚀 Starting Sonamu dev server...\n"));
173
+ // sonamu 패키지가 dependencies로 가지고 있는 @sonamu-kit/hot-runner bin/run.js를 사용합니다.
174
+ // 이 경로(/bin/run.js)는 @sonamu-kit/hot-runner의 package.json의 bin 필드에 명시되어 있는 그것과 같습니다.
175
+ const hotRunnerBinPath = createRequire(import.meta.url).resolve("@sonamu-kit/hot-runner/bin/run.js");
176
+ const serverProcess = spawn(process.execPath, [
177
+ hotRunnerBinPath,
149
178
  "--clear-screen=false",
150
- "--node-args=--import=@sonamu-kit/loader",
179
+ "--node-args=--import=sonamu/loader-register",
151
180
  "--node-args=--import=sonamu/hot-hook-register",
152
181
  "--node-args=--enable-source-maps",
182
+ "--on-key=r:restart:Restart server",
183
+ `--on-key=f:shell(rm ${path.join(apiRoot, "sonamu.lock")}):restart:Force restart`,
184
+ "--on-key=enter:shell(echo hi):Key binding test",
185
+ "--on-key=ctrl+f ctrl+f:shell(git pull && pnpm install && pnpm --filter sonamu build && echo 'Sonamu is now up-to-date!'):restart:Pull & install & build & restart",
153
186
  entryPoint
154
187
  ], {
155
188
  cwd: apiRoot,
@@ -163,34 +196,121 @@ async function dev() {
163
196
  });
164
197
  // 종료 처리
165
198
  const cleanup = ()=>{
166
- console.log(chalk.yellow('\n\n👋 Shutting down...'));
167
- serverProcess.kill('SIGTERM');
199
+ console.log(chalk.yellow("\n\n👋 Shutting down..."));
200
+ serverProcess.kill("SIGTERM");
168
201
  process.exit(0);
169
202
  };
170
- process.on('SIGINT', cleanup);
171
- process.on('SIGTERM', cleanup);
172
- serverProcess.on('exit', (code)=>{
203
+ process.on("SIGINT", cleanup);
204
+ process.on("SIGTERM", cleanup);
205
+ serverProcess.on("exit", (code)=>{
173
206
  if (code !== 0) {
174
207
  console.error(chalk.red(`❌ Server exited with code ${code}`));
175
208
  process.exit(code || 1);
176
209
  }
177
210
  });
178
211
  }
179
- async function start() {
180
- const entryPoint = 'dist/index.js';
212
+ /**
213
+ * pnpm build 하면 실행되는 함수입니다.
214
+ * 프로젝트를 빌드합니다.
215
+ *
216
+ * 빌드에 필요한 .swcrc는 프로젝트 루트에서 찾고, 없으면 sonamu가 관리하는 .swcrc.project-default를 사용합니다.
217
+ * sonamu.config.ts는 src에 들어있지 않기 때문에 SWC_BUILD_COMMAND로 빌드되지 않습니다.
218
+ * 따라서 따로 빌드해줍니다.
219
+ *
220
+ * Sonamu.init 없이 호출될 것을 상정하여 구현되었습니다.
221
+ */ async function build() {
222
+ const apiRoot = findApiRootPath();
223
+ // 출력 디렉토리를 제거합니다.
224
+ try {
225
+ console.log(chalk.blue("Removing build directory..."));
226
+ if (await exists(BUILD_DIR)) {
227
+ await rm(BUILD_DIR, {
228
+ recursive: true,
229
+ force: true
230
+ });
231
+ }
232
+ } catch (error) {
233
+ console.error(chalk.red("Remove build directory failed."), error);
234
+ process.exit(1);
235
+ }
236
+ // .swcrc 파일을 지정합니다.
237
+ let swcFilePath = ".swcrc";
238
+ try {
239
+ if (await exists(swcFilePath)) {
240
+ // 사용자 프로젝트에 .swcrc가 있으면 우선으로 사용합니다.
241
+ console.log(chalk.blue("Using .swcrc from project root..."));
242
+ } else {
243
+ // 아니라면 sonamu가 관리하는 .swcrc.project-default를 가져다 씁니다.
244
+ console.log(chalk.blue("Using default .swcrc from sonamu package..."));
245
+ swcFilePath = path.join(import.meta.dirname, "..", "..", ".swcrc.project-default");
246
+ }
247
+ } catch (error) {
248
+ console.error(chalk.red("Setting up swc config file failed."), error);
249
+ process.exit(1);
250
+ }
251
+ // 소스 디렉토리를 빌드합니다.
252
+ try {
253
+ console.log(chalk.blue("Building with swc..."));
254
+ execSync(SWC_BUILD_COMMAND(swcFilePath), {
255
+ cwd: apiRoot,
256
+ stdio: "inherit"
257
+ });
258
+ } catch (error) {
259
+ console.error(chalk.red("Build failed."), error);
260
+ process.exit(1);
261
+ }
262
+ // sonamu.config.ts만 따로 빌드합니다.
263
+ // 이 친구는 src에 들어있지 않기 때문에 SWC_BUILD_COMMAND로 빌드되지 않습니다.
264
+ // 따라서 따로 빌드해줍니다.
265
+ try {
266
+ const configPath = path.join(apiRoot, "sonamu.config.ts");
267
+ if (await exists(configPath)) {
268
+ console.log(chalk.blue("Building sonamu.config.ts..."));
269
+ execSync(`swc ${configPath} -o ${BUILD_DIR}/sonamu.config.js`, {
270
+ cwd: apiRoot,
271
+ stdio: "inherit"
272
+ });
273
+ }
274
+ } catch (error) {
275
+ console.error(chalk.red("Building sonamu.config.ts failed."), error);
276
+ process.exit(1);
277
+ }
278
+ // 마지막에는 타입 체크를 해요.
279
+ try {
280
+ console.log(chalk.blue("Checking types with tsc..."));
281
+ execSync(TSC_TYPE_CHECK_COMMAND, {
282
+ cwd: apiRoot,
283
+ stdio: "inherit"
284
+ });
285
+ } catch (error) {
286
+ console.error(chalk.red("Type check failed."), error);
287
+ process.exit(1);
288
+ }
289
+ }
290
+ /**
291
+ * pnpm start 하면 실행되는 함수입니다.
292
+ * 빌드된 프로젝트를 실행합니다.
293
+ *
294
+ * 빌드된 결과물(dist 디렉토리의 index.js 엔트리포인트)이 없다면 실행을 중단합니다.
295
+ * 소스맵 지원과 dotenv 지원을 포함하여 실행합니다.
296
+ *
297
+ * Sonamu.init 없이 호출될 것을 상정하여 구현되었습니다.
298
+ */ async function start() {
299
+ const apiRoot = findApiRootPath();
300
+ const entryPoint = "dist/index.js";
181
301
  if (!await exists(entryPoint)) {
182
302
  console.log(chalk.red(`${entryPoint} not found. Please build your project first.`));
183
303
  console.log(chalk.blue("Run: yarn sonamu build"));
184
304
  return;
185
305
  }
186
306
  const { spawn } = await import("child_process");
187
- const serverProcess = spawn("node", [
307
+ const serverProcess = spawn(process.execPath, [
188
308
  "--enable-source-maps",
189
309
  "-r",
190
310
  "dotenv/config",
191
311
  entryPoint
192
312
  ], {
193
- cwd: Sonamu.apiRootPath,
313
+ cwd: apiRoot,
194
314
  stdio: "inherit"
195
315
  });
196
316
  process.on("SIGINT", ()=>{
@@ -200,20 +320,14 @@ async function start() {
200
320
  }
201
321
  async function setupMigrator() {
202
322
  // migrator
203
- migrator = new Migrator({
204
- mode: "dev"
205
- });
323
+ migrator = new Migrator();
206
324
  }
207
325
  async function setupFixtureManager() {
208
326
  FixtureManager.init();
209
327
  }
210
328
  async function migrate_run() {
211
329
  await setupMigrator();
212
- await migrator.run();
213
- }
214
- async function migrate_check() {
215
- await setupMigrator();
216
- await migrator.check();
330
+ await migrator.runAction("apply", Object.keys(Sonamu.dbConfig));
217
331
  }
218
332
  async function migrate_status() {
219
333
  await setupMigrator();
@@ -221,18 +335,6 @@ async function migrate_status() {
221
335
  // status;
222
336
  console.log(status);
223
337
  }
224
- async function migrate_rollback() {
225
- await setupMigrator();
226
- await migrator.rollback();
227
- }
228
- async function migrate_clear() {
229
- await setupMigrator();
230
- await migrator.clearPendingList();
231
- }
232
- async function migrate_reset() {
233
- await setupMigrator();
234
- await migrator.resetAll();
235
- }
236
338
  async function fixture_init() {
237
339
  const srcConfig = Sonamu.dbConfig.development_master;
238
340
  const targets = [
@@ -241,17 +343,13 @@ async function fixture_init() {
241
343
  config: Sonamu.dbConfig.fixture_remote
242
344
  },
243
345
  {
244
- label: "(LOCAL) Fixture DB",
245
- config: Sonamu.dbConfig.fixture_local,
346
+ label: "(LOCAL) Testing DB",
347
+ config: Sonamu.dbConfig.test,
246
348
  toSkip: (()=>{
247
349
  const remoteConn = Sonamu.dbConfig.fixture_remote.connection;
248
- const localConn = Sonamu.dbConfig.fixture_local.connection;
350
+ const localConn = Sonamu.dbConfig.test.connection;
249
351
  return remoteConn.host === localConn.host && remoteConn.database === localConn.database;
250
352
  })()
251
- },
252
- {
253
- label: "(LOCAL) Testing DB",
254
- config: Sonamu.dbConfig.test
255
353
  }
256
354
  ];
257
355
  // 1. 기준DB 스키마를 덤프
@@ -318,7 +416,7 @@ async function stub_practice(name) {
318
416
  });
319
417
  }
320
418
  const filteredSeqs = fileNames.filter((fileName)=>fileName.startsWith("p") && fileName.endsWith(".ts")).map((fileName)=>{
321
- const [, seqNo] = fileName.match(/^p([0-9]+)\-/) ?? [
419
+ const [, seqNo] = fileName.match(/^p([0-9]+)-/) ?? [
322
420
  "0",
323
421
  "0"
324
422
  ];
@@ -351,7 +449,8 @@ async function stub_practice(name) {
351
449
  }
352
450
  async function stub_entity(entityId) {
353
451
  await Sonamu.syncer.createEntity({
354
- entityId
452
+ entityId,
453
+ title: entityId
355
454
  });
356
455
  }
357
456
  async function scaffold_model(entityId) {
@@ -366,9 +465,11 @@ async function scaffold_model_test(entityId) {
366
465
  }
367
466
  async function ui() {
368
467
  try {
369
- // @sonamu-kit/ui run-ui.ts 스크립트 경로 찾기
370
- const uiModulePath = await import.meta.resolve("@sonamu-kit/ui");
371
- const uiNodePath = path.join(path.dirname(fileURLToPath(uiModulePath)), "run-ui.js");
468
+ // 사용자 프로젝트의 패키지들 중에서 @sonamu-kit/ui 찾습니다.
469
+ // 이를 위해서 createRequire를 사용하여 프로젝트 경로 기준으로 resolve합니다.
470
+ const projectRequire = createRequire(path.join(Sonamu.apiRootPath, "package.json"));
471
+ const uiPackagePath = projectRequire.resolve("@sonamu-kit/ui"); // 없으면 여기서 터져요(MODULE_NOT_FOUND)
472
+ const uiNodePath = path.join(path.dirname(uiPackagePath), "run-ui.js");
372
473
  if (!await exists(uiNodePath)) {
373
474
  console.log(chalk.red(`UI runner script not found at ${uiNodePath}. Please rebuild @sonamu-kit/ui.`));
374
475
  return;
@@ -376,7 +477,7 @@ async function ui() {
376
477
  // UI를 별도 프로세스로 실행 (hot-hook 활성화)
377
478
  const uiProcess = spawn(process.execPath, [
378
479
  "--import",
379
- "@sonamu-kit/loader",
480
+ "sonamu/loader-register",
380
481
  "--import",
381
482
  "sonamu/hot-hook-register",
382
483
  "--enable-source-maps",
@@ -415,4 +516,4 @@ async function ui() {
415
516
  }
416
517
  }
417
518
 
418
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCBkb3RlbnYgZnJvbSBcImRvdGVudlwiO1xuZG90ZW52LmNvbmZpZygpO1xuXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJ1cmxcIjtcbmltcG9ydCB7IHRzaWNsaSB9IGZyb20gXCJ0c2ljbGlcIjtcbmltcG9ydCB7IGV4ZWNTeW5jLCBzcGF3biB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZGRpciwgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCBwcm9jZXNzIGZyb20gXCJwcm9jZXNzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQga25leCwgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBNaWdyYXRvciB9IGZyb20gXCIuLi9taWdyYXRpb24vbWlncmF0b3JcIjtcbmltcG9ydCB7IEZpeHR1cmVNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZml4dHVyZS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBmaW5kQXBpUm9vdFBhdGggfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcblxubGV0IG1pZ3JhdG9yOiBNaWdyYXRvcjtcblxuYXN5bmMgZnVuY3Rpb24gYm9vdHN0cmFwKCkge1xuICAvLyBkZXYg66qF66C57Ja06rCAIOyVhOuLjCDqsr3smrDsl5Drp4wgU29uYW11IOy0iOq4sO2ZlFxuICBpZiAocHJvY2Vzcy5hcmd2WzJdICE9PSBcImRldlwiKSB7XG4gICAgYXdhaXQgU29uYW11LmluaXQoZmFsc2UsIGZhbHNlKTtcbiAgfVxuXG4gIGF3YWl0IHRzaWNsaShwcm9jZXNzLmFyZ3YsIHtcbiAgICB0eXBlczoge1xuICAgICAgXCIjZW50aXR5SWRcIjoge1xuICAgICAgICB0eXBlOiBcImF1dG9jb21wbGV0ZVwiLFxuICAgICAgICBuYW1lOiBcIiNlbnRpdHlJZFwiLFxuICAgICAgICBtZXNzYWdlOiBcIlBsZWFzZSBpbnB1dCAjZW50aXR5SWRcIixcbiAgICAgICAgY2hvaWNlczogRW50aXR5TWFuYWdlci5nZXRBbGxQYXJlbnRJZHMoKS5tYXAoKGVudGl0eUlkKSA9PiAoe1xuICAgICAgICAgIHRpdGxlOiBlbnRpdHlJZCxcbiAgICAgICAgICB2YWx1ZTogZW50aXR5SWQsXG4gICAgICAgIH0pKSxcbiAgICAgIH0sXG4gICAgICBcIiNyZWNvcmRJZHNcIjogXCJudW1iZXJbXVwiLFxuICAgICAgXCIjbmFtZVwiOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgYXJnczogW1xuICAgICAgW1wiZml4dHVyZVwiLCBcImluaXRcIl0sXG4gICAgICBbXCJmaXh0dXJlXCIsIFwiaW1wb3J0XCIsIFwiI2VudGl0eUlkXCIsIFwiI3JlY29yZElkc1wiXSxcbiAgICAgIFtcImZpeHR1cmVcIiwgXCJzeW5jXCJdLFxuICAgICAgW1wibWlncmF0ZVwiLCBcInJ1blwiXSxcbiAgICAgIFtcIm1pZ3JhdGVcIiwgXCJjaGVja1wiXSxcbiAgICAgIFtcIm1pZ3JhdGVcIiwgXCJyb2xsYmFja1wiXSxcbiAgICAgIFtcIm1pZ3JhdGVcIiwgXCJyZXNldFwiXSxcbiAgICAgIFtcIm1pZ3JhdGVcIiwgXCJjbGVhclwiXSxcbiAgICAgIFtcIm1pZ3JhdGVcIiwgXCJzdGF0dXNcIl0sXG4gICAgICBbXCJzdHViXCIsIFwicHJhY3RpY2VcIiwgXCIjbmFtZVwiXSxcbiAgICAgIFtcInN0dWJcIiwgXCJlbnRpdHlcIiwgXCIjbmFtZVwiXSxcbiAgICAgIFtcInNjYWZmb2xkXCIsIFwibW9kZWxcIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICBbXCJzY2FmZm9sZFwiLCBcIm1vZGVsX3Rlc3RcIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICBbXCJzY2FmZm9sZFwiLCBcInZpZXdfbGlzdFwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgIFtcInNjYWZmb2xkXCIsIFwidmlld19mb3JtXCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgW1widWlcIl0sXG4gICAgICBbXCJkZXZcIl0sXG4gICAgICBbXCJzdGFydFwiXSxcbiAgICBdLFxuICAgIHJ1bm5lcnM6IHtcbiAgICAgIG1pZ3JhdGVfcnVuLFxuICAgICAgbWlncmF0ZV9jaGVjayxcbiAgICAgIG1pZ3JhdGVfcm9sbGJhY2ssXG4gICAgICBtaWdyYXRlX2NsZWFyLFxuICAgICAgbWlncmF0ZV9yZXNldCxcbiAgICAgIG1pZ3JhdGVfc3RhdHVzLFxuICAgICAgZml4dHVyZV9pbml0LFxuICAgICAgZml4dHVyZV9pbXBvcnQsXG4gICAgICBmaXh0dXJlX3N5bmMsXG4gICAgICBzdHViX3ByYWN0aWNlLFxuICAgICAgc3R1Yl9lbnRpdHksXG4gICAgICBzY2FmZm9sZF9tb2RlbCxcbiAgICAgIHNjYWZmb2xkX21vZGVsX3Rlc3QsXG4gICAgICB1aSxcbiAgICAgIC8vIHNjYWZmb2xkX3ZpZXdfbGlzdCxcbiAgICAgIC8vIHNjYWZmb2xkX3ZpZXdfZm9ybSxcbiAgICAgIGRldixcbiAgICAgIHN0YXJ0LFxuICAgIH0sXG4gIH0pO1xufVxuYm9vdHN0cmFwKCkuZmluYWxseShhc3luYyAoKSA9PiB7XG4gIGlmIChtaWdyYXRvcikge1xuICAgIGF3YWl0IG1pZ3JhdG9yLmRlc3Ryb3koKTtcbiAgfVxuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5kZXN0cm95KCk7XG59KTtcblxuYXN5bmMgZnVuY3Rpb24gZGV2KCkge1xuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSAnc3JjL2luZGV4LnRzJzsgICBcblxuICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3cuYm9sZCgn8J+agCBTdGFydGluZyBTb25hbXUgZGV2IHNlcnZlci4uLlxcbicpKTtcblxuICBjb25zdCBzZXJ2ZXJQcm9jZXNzID0gc3Bhd24oXG4gICAgXCJob3QtcnVubmVyXCIsXG4gICAgW1xuICAgICAgXCItLWNsZWFyLXNjcmVlbj1mYWxzZVwiLFxuICAgICAgXCItLW5vZGUtYXJncz0tLWltcG9ydD1Ac29uYW11LWtpdC9sb2FkZXJcIixcbiAgICAgIFwiLS1ub2RlLWFyZ3M9LS1pbXBvcnQ9c29uYW11L2hvdC1ob29rLXJlZ2lzdGVyXCIsXG4gICAgICBcIi0tbm9kZS1hcmdzPS0tZW5hYmxlLXNvdXJjZS1tYXBzXCIsXG4gICAgICBlbnRyeVBvaW50LFxuICAgIF0sXG4gICAge1xuICAgICAgY3dkOiBhcGlSb290LFxuICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgICAgZW52OiB7XG4gICAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgICBOT0RFX0VOVjogXCJkZXZlbG9wbWVudFwiLFxuICAgICAgICBIT1Q6IFwieWVzXCIsXG4gICAgICAgIEFQSV9ST09UX1BBVEg6IGFwaVJvb3QsXG4gICAgICB9LFxuICAgIH1cbiAgKTtcblxuICAvLyDsooXro4wg7LKY66asXG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KCdcXG5cXG7wn5GLIFNodXR0aW5nIGRvd24uLi4nKSk7XG4gICAgc2VydmVyUHJvY2Vzcy5raWxsKCdTSUdURVJNJyk7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9O1xuXG4gIHByb2Nlc3Mub24oJ1NJR0lOVCcsIGNsZWFudXApO1xuICBwcm9jZXNzLm9uKCdTSUdURVJNJywgY2xlYW51cCk7XG5cbiAgc2VydmVyUHJvY2Vzcy5vbignZXhpdCcsIChjb2RlKSA9PiB7XG4gICAgaWYgKGNvZGUgIT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGDinYwgU2VydmVyIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApKTtcbiAgICAgIHByb2Nlc3MuZXhpdChjb2RlIHx8IDEpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0KCkge1xuICBjb25zdCBlbnRyeVBvaW50ID0gJ2Rpc3QvaW5kZXguanMnOyAgXG5cbiAgaWYgKCEoYXdhaXQgZXhpc3RzKGVudHJ5UG9pbnQpKSkge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgY2hhbGsucmVkKGAke2VudHJ5UG9pbnR9IG5vdCBmb3VuZC4gUGxlYXNlIGJ1aWxkIHlvdXIgcHJvamVjdCBmaXJzdC5gKVxuICAgICk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlJ1bjogeWFybiBzb25hbXUgYnVpbGRcIikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgc3Bhd24gfSA9IGF3YWl0IGltcG9ydChcImNoaWxkX3Byb2Nlc3NcIik7XG4gIGNvbnN0IHNlcnZlclByb2Nlc3MgPSBzcGF3bihcbiAgICBcIm5vZGVcIixcbiAgICBbXCItLWVuYWJsZS1zb3VyY2UtbWFwc1wiLCBcIi1yXCIsIFwiZG90ZW52L2NvbmZpZ1wiLCBlbnRyeVBvaW50XSxcbiAgICB7XG4gICAgICBjd2Q6IFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICB9XG4gICk7XG5cbiAgcHJvY2Vzcy5vbihcIlNJR0lOVFwiLCAoKSA9PiB7XG4gICAgc2VydmVyUHJvY2Vzcy5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICBwcm9jZXNzLmV4aXQoMCk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR1cE1pZ3JhdG9yKCkge1xuICAvLyBtaWdyYXRvclxuICBtaWdyYXRvciA9IG5ldyBNaWdyYXRvcih7XG4gICAgbW9kZTogXCJkZXZcIixcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwRml4dHVyZU1hbmFnZXIoKSB7XG4gIEZpeHR1cmVNYW5hZ2VyLmluaXQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWlncmF0ZV9ydW4oKSB7XG4gIGF3YWl0IHNldHVwTWlncmF0b3IoKTtcblxuICBhd2FpdCBtaWdyYXRvci5ydW4oKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWlncmF0ZV9jaGVjaygpIHtcbiAgYXdhaXQgc2V0dXBNaWdyYXRvcigpO1xuXG4gIGF3YWl0IG1pZ3JhdG9yLmNoZWNrKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGVfc3RhdHVzKCkge1xuICBhd2FpdCBzZXR1cE1pZ3JhdG9yKCk7XG5cbiAgY29uc3Qgc3RhdHVzID0gYXdhaXQgbWlncmF0b3IuZ2V0U3RhdHVzKCk7XG4gIC8vIHN0YXR1cztcbiAgY29uc29sZS5sb2coc3RhdHVzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWlncmF0ZV9yb2xsYmFjaygpIHtcbiAgYXdhaXQgc2V0dXBNaWdyYXRvcigpO1xuXG4gIGF3YWl0IG1pZ3JhdG9yLnJvbGxiYWNrKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGVfY2xlYXIoKSB7XG4gIGF3YWl0IHNldHVwTWlncmF0b3IoKTtcblxuICBhd2FpdCBtaWdyYXRvci5jbGVhclBlbmRpbmdMaXN0KCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGVfcmVzZXQoKSB7XG4gIGF3YWl0IHNldHVwTWlncmF0b3IoKTtcblxuICBhd2FpdCBtaWdyYXRvci5yZXNldEFsbCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX2luaXQoKSB7XG4gIGNvbnN0IHNyY0NvbmZpZyA9IFNvbmFtdS5kYkNvbmZpZy5kZXZlbG9wbWVudF9tYXN0ZXI7XG4gIGNvbnN0IHRhcmdldHMgPSBbXG4gICAge1xuICAgICAgbGFiZWw6IFwiKFJFTU9URSkgRml4dHVyZSBEQlwiLFxuICAgICAgY29uZmlnOiBTb25hbXUuZGJDb25maWcuZml4dHVyZV9yZW1vdGUsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogXCIoTE9DQUwpIEZpeHR1cmUgREJcIixcbiAgICAgIGNvbmZpZzogU29uYW11LmRiQ29uZmlnLmZpeHR1cmVfbG9jYWwsXG4gICAgICB0b1NraXA6ICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlbW90ZUNvbm4gPSBTb25hbXUuZGJDb25maWcuZml4dHVyZV9yZW1vdGVcbiAgICAgICAgICAuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gICAgICAgIGNvbnN0IGxvY2FsQ29ubiA9IFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlX2xvY2FsXG4gICAgICAgICAgLmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHJlbW90ZUNvbm4uaG9zdCA9PT0gbG9jYWxDb25uLmhvc3QgJiZcbiAgICAgICAgICByZW1vdGVDb25uLmRhdGFiYXNlID09PSBsb2NhbENvbm4uZGF0YWJhc2VcbiAgICAgICAgKTtcbiAgICAgIH0pKCksXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogXCIoTE9DQUwpIFRlc3RpbmcgREJcIixcbiAgICAgIGNvbmZpZzogU29uYW11LmRiQ29uZmlnLnRlc3QsXG4gICAgfSxcbiAgXSBhcyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBjb25maWc6IEtuZXguQ29uZmlnO1xuICAgIHRvU2tpcD86IGJvb2xlYW47XG4gIH1bXTtcblxuICAvLyAxLiDquLDspIBEQiDsiqTtgqTrp4jrpbwg642k7ZSEXG4gIGNvbnNvbGUubG9nKFwiRFVNUC4uLlwiKTtcbiAgY29uc3QgZHVtcEZpbGVuYW1lID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC0ke0RhdGUubm93KCl9LnNxbGA7XG4gIGNvbnN0IHNyY0Nvbm4gPSBzcmNDb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gIGNvbnN0IG1pZ3JhdGlvbnNEdW1wID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC1taWdyYXRpb25zLSR7RGF0ZS5ub3coKX0uc3FsYDtcbiAgZXhlY1N5bmMoXG4gICAgYG15c3FsZHVtcCAtaCR7c3JjQ29ubi5ob3N0fSAtdSR7c3JjQ29ubi51c2VyfSAtcCR7c3JjQ29ubi5wYXNzd29yZH0gLS1zaW5nbGUtdHJhbnNhY3Rpb24gLWQgLS1uby1jcmVhdGUtZGIgLS10cmlnZ2VycyAke3NyY0Nvbm4uZGF0YWJhc2V9ID4gJHtkdW1wRmlsZW5hbWV9YFxuICApO1xuICBjb25zdCBfZGIgPSBrbmV4KHNyY0NvbmZpZyk7XG4gIGNvbnN0IFtbbWlncmF0aW9uc11dID0gYXdhaXQgX2RiLnJhdyhcbiAgICBcIlNFTEVDVCBDT1VOVCgqKSBhcyBjb3VudCBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgV0hFUkUgdGFibGVfc2NoZW1hID0gPyBBTkQgdGFibGVfbmFtZSA9ICdrbmV4X21pZ3JhdGlvbnMnXCIsXG4gICAgW3NyY0Nvbm4uZGF0YWJhc2VdXG4gICk7XG4gIGlmIChtaWdyYXRpb25zLmNvdW50ID4gMCkge1xuICAgIGV4ZWNTeW5jKFxuICAgICAgYG15c3FsZHVtcCAtaCR7c3JjQ29ubi5ob3N0fSAtdSR7c3JjQ29ubi51c2VyfSAtcCR7c3JjQ29ubi5wYXNzd29yZH0gLS1zaW5nbGUtdHJhbnNhY3Rpb24gLS1uby1jcmVhdGUtZGIgLS10cmlnZ2VycyAke3NyY0Nvbm4uZGF0YWJhc2V9IGtuZXhfbWlncmF0aW9ucyBrbmV4X21pZ3JhdGlvbnNfbG9jayA+ICR7bWlncmF0aW9uc0R1bXB9YFxuICAgICk7XG4gIH1cblxuICAvLyAyLiDrjIDsg4FEQiDqsIHqsIHsl5Ag64yA7ZWY7JesIOyhtOyerOyXrOu2gCDtmZXsnbgg7ZuEIOu2k+q4sFxuICBmb3IgYXdhaXQgKGNvbnN0IHsgbGFiZWwsIGNvbmZpZywgdG9Ta2lwIH0gb2YgdGFyZ2V0cykge1xuICAgIGNvbnN0IGNvbm4gPSBjb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG5cbiAgICBpZiAodG9Ta2lwID09PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoYCR7bGFiZWx9OiBTa2lwcGVkIWApKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGRiID0ga25leCh7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLigoY29uZmlnLmNvbm5lY3Rpb24gPz8ge30pIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyksXG4gICAgICAgIGRhdGFiYXNlOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNvbnN0IFtbcm93XV0gPSBhd2FpdCBkYi5yYXcoYFNIT1cgREFUQUJBU0VTIExJS0UgXCIke2Nvbm4uZGF0YWJhc2V9XCJgKTtcbiAgICBpZiAocm93KSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsueWVsbG93KGAke2xhYmVsfTogRGF0YWJhc2UgXCIke2Nvbm4uZGF0YWJhc2V9XCIgQWxyZWFkeSBleGlzdHNgKVxuICAgICAgKTtcbiAgICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBTWU5DIHRvICR7bGFiZWx9Li4uYCk7XG4gICAgY29uc3QgbXlzcWxDbWQgPSBgbXlzcWwgLWgke2Nvbm4uaG9zdH0gLXUke2Nvbm4udXNlcn0gLXAke2Nvbm4ucGFzc3dvcmR9YDtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gLWUgJ0RST1AgREFUQUJBU0UgSUYgRVhJU1RTIFxcYCR7Y29ubi5kYXRhYmFzZX1cXGAnYCk7XG4gICAgZXhlY1N5bmMoYCR7bXlzcWxDbWR9IC1lICdDUkVBVEUgREFUQUJBU0UgXFxgJHtjb25uLmRhdGFiYXNlfVxcYCdgKTtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7ZHVtcEZpbGVuYW1lfWApO1xuICAgIGlmIChhd2FpdCBleGlzdHMobWlncmF0aW9uc0R1bXApKSB7XG4gICAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7bWlncmF0aW9uc0R1bXB9YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICB9XG5cbiAgYXdhaXQgX2RiLmRlc3Ryb3koKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9pbXBvcnQoZW50aXR5SWQ6IHN0cmluZywgcmVjb3JkSWRzOiBudW1iZXJbXSkge1xuICBhd2FpdCBzZXR1cEZpeHR1cmVNYW5hZ2VyKCk7XG5cbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuaW1wb3J0Rml4dHVyZShlbnRpdHlJZCwgcmVjb3JkSWRzKTtcbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuc3luYygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX3N5bmMoKSB7XG4gIGF3YWl0IHNldHVwRml4dHVyZU1hbmFnZXIoKTtcblxuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5zeW5jKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0dWJfcHJhY3RpY2UobmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IHByYWN0aWNlRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJwcmFjdGljZXNcIik7XG4gIGNvbnN0IGZpbGVOYW1lcyA9IGF3YWl0IHJlYWRkaXIocHJhY3RpY2VEaXIpO1xuXG4gIGNvbnN0IG1heFNlcU5vID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICBpZiAoIShhd2FpdCBleGlzdHMocHJhY3RpY2VEaXIpKSkge1xuICAgICAgYXdhaXQgbWtkaXIocHJhY3RpY2VEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcmVkU2VxcyA9IGZpbGVOYW1lc1xuICAgICAgLmZpbHRlcihcbiAgICAgICAgKGZpbGVOYW1lKSA9PiBmaWxlTmFtZS5zdGFydHNXaXRoKFwicFwiKSAmJiBmaWxlTmFtZS5lbmRzV2l0aChcIi50c1wiKVxuICAgICAgKVxuICAgICAgLm1hcCgoZmlsZU5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgWywgc2VxTm9dID0gZmlsZU5hbWUubWF0Y2goL15wKFswLTldKylcXC0vKSA/PyBbXCIwXCIsIFwiMFwiXTtcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHNlcU5vKTtcbiAgICAgIH0pXG4gICAgICAuc29ydCgoYSwgYikgPT4gYiAtIGEpO1xuXG4gICAgaWYgKGZpbHRlcmVkU2Vxcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZmlsdGVyZWRTZXFzWzBdO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9KSgpO1xuXG4gIGNvbnN0IGN1cnJlbnRTZXFObyA9IG1heFNlcU5vICsgMTtcbiAgY29uc3QgZmlsZU5hbWUgPSBgcCR7Y3VycmVudFNlcU5vfS0ke25hbWV9LnRzYDtcbiAgY29uc3QgZHN0UGF0aCA9IHBhdGguam9pbihwcmFjdGljZURpciwgZmlsZU5hbWUpO1xuXG4gIGNvbnN0IGNvZGUgPSBbXG4gICAgYGltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCJzb25hbXVcIjtgLFxuICAgIFwiXCIsXG4gICAgYGNvbnNvbGUuY2xlYXIoKTtgLFxuICAgIGBjb25zb2xlLmxvZyhcIiR7ZmlsZU5hbWV9XCIpO2AsXG4gICAgXCJcIixcbiAgICBgU29uYW11LnJ1blNjcmlwdChhc3luYyAoKSA9PiB7YCxcbiAgICBgIC8vIFRPRE9gLFxuICAgIGB9KTtgLFxuICAgIFwiXCIsXG4gIF0uam9pbihcIlxcblwiKTtcbiAgYXdhaXQgd3JpdGVGaWxlKGRzdFBhdGgsIGNvZGUpO1xuXG4gIGV4ZWNTeW5jKGBjb2RlICR7ZHN0UGF0aH1gKTtcblxuICBjb25zdCBydW5Db2RlID0gYHlhcm4gbm9kZSAtciBkb3RlbnYvY29uZmlnIC0tZW5hYmxlLXNvdXJjZS1tYXBzIGRpc3QvcHJhY3RpY2VzLyR7ZmlsZU5hbWUucmVwbGFjZShcbiAgICBcIi50c1wiLFxuICAgIFwiLmpzXCJcbiAgKX1gO1xuICBjb25zb2xlLmxvZyhgJHtjaGFsay5ibHVlKHJ1bkNvZGUpfSBjb3BpZWQgdG8gY2xpcGJvYXJkLmApO1xuICBleGVjU3luYyhgZWNobyBcIiR7cnVuQ29kZX1cIiB8IHBiY29weWApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdHViX2VudGl0eShlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuY3JlYXRlRW50aXR5KHsgZW50aXR5SWQgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkX21vZGVsKGVudGl0eUlkOiBzdHJpbmcpIHtcbiAgYXdhaXQgU29uYW11LnN5bmNlci5nZW5lcmF0ZVRlbXBsYXRlKFwibW9kZWxcIiwge1xuICAgIGVudGl0eUlkLFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2NhZmZvbGRfbW9kZWxfdGVzdChlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuZ2VuZXJhdGVUZW1wbGF0ZShcIm1vZGVsX3Rlc3RcIiwge1xuICAgIGVudGl0eUlkLFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdWkoKSB7XG4gIHRyeSB7XG4gICAgLy8gQHNvbmFtdS1raXQvdWnsnZggcnVuLXVpLnRzIOyKpO2BrOumve2KuCDqsr3roZwg7LC+6riwXG4gICAgY29uc3QgdWlNb2R1bGVQYXRoID0gYXdhaXQgaW1wb3J0Lm1ldGEucmVzb2x2ZShcIkBzb25hbXUta2l0L3VpXCIpO1xuICAgIGNvbnN0IHVpTm9kZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICBwYXRoLmRpcm5hbWUoZmlsZVVSTFRvUGF0aCh1aU1vZHVsZVBhdGgpKSxcbiAgICAgIFwicnVuLXVpLmpzXCJcbiAgICApO1xuXG4gICAgaWYgKCEoYXdhaXQgZXhpc3RzKHVpTm9kZVBhdGgpKSkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICBgVUkgcnVubmVyIHNjcmlwdCBub3QgZm91bmQgYXQgJHt1aU5vZGVQYXRofS4gUGxlYXNlIHJlYnVpbGQgQHNvbmFtdS1raXQvdWkuYFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVJ66W8IOuzhOuPhCDtlITroZzshLjsiqTroZwg7Iuk7ZaJIChob3QtaG9vayDtmZzshLHtmZQpXG4gICAgY29uc3QgdWlQcm9jZXNzID0gc3Bhd24oXG4gICAgICBwcm9jZXNzLmV4ZWNQYXRoLFxuICAgICAgW1xuICAgICAgICBcIi0taW1wb3J0XCIsIFwiQHNvbmFtdS1raXQvbG9hZGVyXCIsXG4gICAgICAgIFwiLS1pbXBvcnRcIiwgXCJzb25hbXUvaG90LWhvb2stcmVnaXN0ZXJcIixcbiAgICAgICAgXCItLWVuYWJsZS1zb3VyY2UtbWFwc1wiLFxuICAgICAgICBcIi0tbm8td2FybmluZ3NcIixcbiAgICAgICAgdWlOb2RlUGF0aCxcbiAgICAgIF0sXG4gICAgICB7XG4gICAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgICAgZW52OiB7XG4gICAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgICAgSE9UOiBcInllc1wiLFxuICAgICAgICAgIFBST0pFQ1RfTkFNRTpcbiAgICAgICAgICAgIFNvbmFtdS5jb25maWcucHJvamVjdE5hbWUgPz8gcGF0aC5iYXNlbmFtZShTb25hbXUuYXBpUm9vdFBhdGgpLFxuICAgICAgICAgIEFQSV9ST09UX1BBVEg6IFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgICAgICBVSV9QT1JUOiAoU29uYW11LmNvbmZpZy51aT8ucG9ydCA/PyA1NzAwMCkudG9TdHJpbmcoKSxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy8g7KKF66OMIOyymOumrFxuICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCJcXG5cXG7wn5GLIFNodXR0aW5nIGRvd24gVUkgc2VydmVyLi4uXCIpKTtcbiAgICAgIHVpUHJvY2Vzcy5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9O1xuXG4gICAgcHJvY2Vzcy5vbihcIlNJR0lOVFwiLCBjbGVhbnVwKTtcbiAgICBwcm9jZXNzLm9uKFwiU0lHVEVSTVwiLCBjbGVhbnVwKTtcblxuICAgIHVpUHJvY2Vzcy5vbihcImV4aXRcIiwgKGNvZGUpID0+IHtcbiAgICAgIGlmIChjb2RlICE9PSAwKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGDinYwgVUkgc2VydmVyIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KGNvZGUgfHwgMSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUubWVzc2FnZS5pbmNsdWRlcyhcImlzbid0IGRlY2xhcmVkXCIpKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYFlvdSBuZWVkIHRvIGluc3RhbGwgJHtjaGFsay5ibHVlKGBAc29uYW11LWtpdC91aWApfSBmaXJzdC5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG59XG4iXSwibmFtZXMiOlsiY2hhbGsiLCJkb3RlbnYiLCJjb25maWciLCJwYXRoIiwiZmlsZVVSTFRvUGF0aCIsInRzaWNsaSIsImV4ZWNTeW5jIiwic3Bhd24iLCJta2RpciIsInJlYWRkaXIiLCJ3cml0ZUZpbGUiLCJleGlzdHMiLCJwcm9jZXNzIiwiU29uYW11Iiwia25leCIsIkVudGl0eU1hbmFnZXIiLCJNaWdyYXRvciIsIkZpeHR1cmVNYW5hZ2VyIiwiZmluZEFwaVJvb3RQYXRoIiwibWlncmF0b3IiLCJib290c3RyYXAiLCJhcmd2IiwiaW5pdCIsInR5cGVzIiwidHlwZSIsIm5hbWUiLCJtZXNzYWdlIiwiY2hvaWNlcyIsImdldEFsbFBhcmVudElkcyIsIm1hcCIsImVudGl0eUlkIiwidGl0bGUiLCJ2YWx1ZSIsImFyZ3MiLCJydW5uZXJzIiwibWlncmF0ZV9ydW4iLCJtaWdyYXRlX2NoZWNrIiwibWlncmF0ZV9yb2xsYmFjayIsIm1pZ3JhdGVfY2xlYXIiLCJtaWdyYXRlX3Jlc2V0IiwibWlncmF0ZV9zdGF0dXMiLCJmaXh0dXJlX2luaXQiLCJmaXh0dXJlX2ltcG9ydCIsImZpeHR1cmVfc3luYyIsInN0dWJfcHJhY3RpY2UiLCJzdHViX2VudGl0eSIsInNjYWZmb2xkX21vZGVsIiwic2NhZmZvbGRfbW9kZWxfdGVzdCIsInVpIiwiZGV2Iiwic3RhcnQiLCJmaW5hbGx5IiwiZGVzdHJveSIsImFwaVJvb3QiLCJlbnRyeVBvaW50IiwiY29uc29sZSIsImxvZyIsInllbGxvdyIsImJvbGQiLCJzZXJ2ZXJQcm9jZXNzIiwiY3dkIiwic3RkaW8iLCJlbnYiLCJOT0RFX0VOViIsIkhPVCIsIkFQSV9ST09UX1BBVEgiLCJjbGVhbnVwIiwia2lsbCIsImV4aXQiLCJvbiIsImNvZGUiLCJlcnJvciIsInJlZCIsImJsdWUiLCJhcGlSb290UGF0aCIsInNldHVwTWlncmF0b3IiLCJtb2RlIiwic2V0dXBGaXh0dXJlTWFuYWdlciIsInJ1biIsImNoZWNrIiwic3RhdHVzIiwiZ2V0U3RhdHVzIiwicm9sbGJhY2siLCJjbGVhclBlbmRpbmdMaXN0IiwicmVzZXRBbGwiLCJzcmNDb25maWciLCJkYkNvbmZpZyIsImRldmVsb3BtZW50X21hc3RlciIsInRhcmdldHMiLCJsYWJlbCIsImZpeHR1cmVfcmVtb3RlIiwiZml4dHVyZV9sb2NhbCIsInRvU2tpcCIsInJlbW90ZUNvbm4iLCJjb25uZWN0aW9uIiwibG9jYWxDb25uIiwiaG9zdCIsImRhdGFiYXNlIiwidGVzdCIsImR1bXBGaWxlbmFtZSIsIkRhdGUiLCJub3ciLCJzcmNDb25uIiwibWlncmF0aW9uc0R1bXAiLCJ1c2VyIiwicGFzc3dvcmQiLCJfZGIiLCJtaWdyYXRpb25zIiwicmF3IiwiY291bnQiLCJjb25uIiwiZGIiLCJ1bmRlZmluZWQiLCJyb3ciLCJteXNxbENtZCIsInJlY29yZElkcyIsImltcG9ydEZpeHR1cmUiLCJzeW5jIiwicHJhY3RpY2VEaXIiLCJqb2luIiwiZmlsZU5hbWVzIiwibWF4U2VxTm8iLCJyZWN1cnNpdmUiLCJmaWx0ZXJlZFNlcXMiLCJmaWx0ZXIiLCJmaWxlTmFtZSIsInN0YXJ0c1dpdGgiLCJlbmRzV2l0aCIsInNlcU5vIiwibWF0Y2giLCJwYXJzZUludCIsInNvcnQiLCJhIiwiYiIsImxlbmd0aCIsImN1cnJlbnRTZXFObyIsImRzdFBhdGgiLCJydW5Db2RlIiwicmVwbGFjZSIsInN5bmNlciIsImNyZWF0ZUVudGl0eSIsImdlbmVyYXRlVGVtcGxhdGUiLCJ1aU1vZHVsZVBhdGgiLCJyZXNvbHZlIiwidWlOb2RlUGF0aCIsImRpcm5hbWUiLCJ1aVByb2Nlc3MiLCJleGVjUGF0aCIsIlBST0pFQ1RfTkFNRSIsInByb2plY3ROYW1lIiwiYmFzZW5hbWUiLCJVSV9QT1JUIiwicG9ydCIsInRvU3RyaW5nIiwiZSIsIkVycm9yIiwiaW5jbHVkZXMiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFdBQVcsUUFBUTtBQUMxQixPQUFPQyxZQUFZLFNBQVM7QUFDNUJBLE9BQU9DLE1BQU07QUFFYixPQUFPQyxVQUFVLE9BQU87QUFDeEIsU0FBU0MsYUFBYSxRQUFRLE1BQU07QUFDcEMsU0FBU0MsTUFBTSxRQUFRLFNBQVM7QUFDaEMsU0FBU0MsUUFBUSxFQUFFQyxLQUFLLFFBQVEsZ0JBQWdCO0FBQ2hELFNBQVNDLEtBQUssRUFBRUMsT0FBTyxFQUFFQyxTQUFTLFFBQVEsbUJBQWM7QUFDeEQsU0FBU0MsTUFBTSxRQUFRLHVCQUFvQjtBQUMzQyxPQUFPQyxhQUFhLFVBQVU7QUFDOUIsU0FBU0MsTUFBTSxRQUFRLGtCQUFTO0FBQ2hDLE9BQU9DLFVBQW9CLE9BQU87QUFDbEMsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQUFTQyxRQUFRLFFBQVEsMkJBQXdCO0FBQ2pELFNB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
519
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCBkb3RlbnYgZnJvbSBcImRvdGVudlwiO1xuXG5kb3RlbnYuY29uZmlnKCk7XG5cbmltcG9ydCB7IGV4ZWNTeW5jLCBzcGF3biB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZGRpciwgcm0sIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IGtuZXgsIHsgdHlwZSBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibW9kdWxlXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSBcInByb2Nlc3NcIjtcbmltcG9ydCB7IHRzaWNsaSB9IGZyb20gXCJ0c2ljbGlcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGlcIjtcbmltcG9ydCB0eXBlIHsgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBNaWdyYXRvciB9IGZyb20gXCIuLi9taWdyYXRpb24vbWlncmF0b3JcIjtcbmltcG9ydCB7IEZpeHR1cmVNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZml4dHVyZS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IGZpbmRBcGlSb290UGF0aCB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgQlVJTERfRElSLCBTV0NfQlVJTERfQ09NTUFORCwgVFNDX1RZUEVfQ0hFQ0tfQ09NTUFORCB9IGZyb20gXCIuL2J1aWxkLWNvbmZpZ1wiO1xuXG5sZXQgbWlncmF0b3I6IE1pZ3JhdG9yO1xuXG5hc3luYyBmdW5jdGlvbiBib290c3RyYXAoKSB7XG4gIGNvbnN0IG5vdFRvSW5pdCA9IFtcImRldlwiLCBcImJ1aWxkXCIsIFwic3RhcnRcIl0uaW5jbHVkZXMocHJvY2Vzcy5hcmd2WzJdID8/IFwiXCIpO1xuICBpZiAoIW5vdFRvSW5pdCkge1xuICAgIGF3YWl0IFNvbmFtdS5pbml0KGZhbHNlLCBmYWxzZSk7XG4gIH1cblxuICBhd2FpdCB0c2ljbGkocHJvY2Vzcy5hcmd2LCB7XG4gICAgdHlwZXM6IHtcbiAgICAgIFwiI2VudGl0eUlkXCI6IHtcbiAgICAgICAgdHlwZTogXCJhdXRvY29tcGxldGVcIixcbiAgICAgICAgbmFtZTogXCIjZW50aXR5SWRcIixcbiAgICAgICAgbWVzc2FnZTogXCJQbGVhc2UgaW5wdXQgI2VudGl0eUlkXCIsXG4gICAgICAgIGNob2ljZXM6IEVudGl0eU1hbmFnZXIuZ2V0QWxsUGFyZW50SWRzKCkubWFwKChlbnRpdHlJZCkgPT4gKHtcbiAgICAgICAgICB0aXRsZTogZW50aXR5SWQsXG4gICAgICAgICAgdmFsdWU6IGVudGl0eUlkLFxuICAgICAgICB9KSksXG4gICAgICB9LFxuICAgICAgXCIjcmVjb3JkSWRzXCI6IFwibnVtYmVyW11cIixcbiAgICAgIFwiI25hbWVcIjogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIGFyZ3M6IFtcbiAgICAgIFtcImZpeHR1cmVcIiwgXCJpbml0XCJdLFxuICAgICAgW1wiZml4dHVyZVwiLCBcImltcG9ydFwiLCBcIiNlbnRpdHlJZFwiLCBcIiNyZWNvcmRJZHNcIl0sXG4gICAgICBbXCJmaXh0dXJlXCIsIFwic3luY1wiXSxcbiAgICAgIFtcIm1pZ3JhdGVcIiwgXCJydW5cIl0sXG4gICAgICBbXCJtaWdyYXRlXCIsIFwiY2hlY2tcIl0sXG4gICAgICBbXCJtaWdyYXRlXCIsIFwicm9sbGJhY2tcIl0sXG4gICAgICBbXCJtaWdyYXRlXCIsIFwicmVzZXRcIl0sXG4gICAgICBbXCJtaWdyYXRlXCIsIFwiY2xlYXJcIl0sXG4gICAgICBbXCJtaWdyYXRlXCIsIFwic3RhdHVzXCJdLFxuICAgICAgW1wic3R1YlwiLCBcInByYWN0aWNlXCIsIFwiI25hbWVcIl0sXG4gICAgICBbXCJzdHViXCIsIFwiZW50aXR5XCIsIFwiI25hbWVcIl0sXG4gICAgICBbXCJzY2FmZm9sZFwiLCBcIm1vZGVsXCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgW1wic2NhZmZvbGRcIiwgXCJtb2RlbF90ZXN0XCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgW1wic2NhZmZvbGRcIiwgXCJ2aWV3X2xpc3RcIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICBbXCJzY2FmZm9sZFwiLCBcInZpZXdfZm9ybVwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgIFtcInVpXCJdLFxuICAgICAgW1wic3luY1wiXSxcbiAgICAgIFtcImRldlwiXSxcbiAgICAgIFtcImJ1aWxkXCJdLFxuICAgICAgW1wic3RhcnRcIl0sXG4gICAgXSxcbiAgICBydW5uZXJzOiB7XG4gICAgICBtaWdyYXRlX3N0YXR1cyxcbiAgICAgIG1pZ3JhdGVfcnVuLFxuICAgICAgZml4dHVyZV9pbml0LFxuICAgICAgZml4dHVyZV9pbXBvcnQsXG4gICAgICBmaXh0dXJlX3N5bmMsXG4gICAgICBzdHViX3ByYWN0aWNlLFxuICAgICAgc3R1Yl9lbnRpdHksXG4gICAgICBzY2FmZm9sZF9tb2RlbCxcbiAgICAgIHNjYWZmb2xkX21vZGVsX3Rlc3QsXG4gICAgICB1aSxcbiAgICAgIC8vIHNjYWZmb2xkX3ZpZXdfbGlzdCxcbiAgICAgIC8vIHNjYWZmb2xkX3ZpZXdfZm9ybSxcbiAgICAgIHN5bmMsXG4gICAgICBkZXYsXG4gICAgICBidWlsZCxcbiAgICAgIHN0YXJ0LFxuICAgIH0sXG4gIH0pO1xufVxuXG5ib290c3RyYXAoKS5maW5hbGx5KGFzeW5jICgpID0+IHtcbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuZGVzdHJveSgpO1xufSk7XG5cbi8qKlxuICogcG5wbSBzeW5jIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICog7ZSE66Gc7KCd7Yq466W8IOyLse2BrO2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3luYygpIHtcbiAgYXdhaXQgU29uYW11LnN5bmNlci5zeW5jKCk7XG59XG5cbi8qKlxuICogcG5wbSBkZXYg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDtlITroZzsoJ3tirjsl5Ag64yA7ZW0IEhNUiDsp4Dsm5DtlZjripQg6rCc67CcIOyEnOuyhOulvCDrnYTsm4zspI3ri4jri6QuXG4gKlxuICogVHlwZVNjcmlwdOulvCDrsJTroZwg7Iuk7ZaJ7ZWgIOyImCDsnojrj4TroZ0gQHNvbmFtdS1raXQvbG9hZGVy66W8LFxuICogSE1S7J2EIOyngOybkO2VmOq4sCDsnITtlbQgQHNvbmFtdS1raXQvaG90LWhvb2vsnYQgaW1wb3J07ZWY66mwLFxuICog7IaM7Iqk66e1IOyngOybkOydhCDsnITtlbQgLS1lbmFibGUtc291cmNlLW1hcHMg7ZSM656Y6re466W8IO2PrO2VqO2VmOyXrCDsi6Ttlontlanri4jri6QuXG4gKlxuICog7J2065WMIEBzb25hbXUta2l0L2xvYWRlcuyZgCBAc29uYW11LWtpdC9ob3QtaG9va+uKlCBzb25hbXXqsIAg7J6Q7LK07KCB7Jy866GcIOqwgOyngOqzoCDsnojripQgZGVwZW5kZW5jeeyeheuLiOuLpC5cbiAqIOuYkO2VnCDsi6Ttlonsl5Ag7IKs7Jqp7ZWY64qUIEBzb25hbXUta2l0L2hvdC1ydW5uZXLrj4Qg66eI7LCs6rCA7KeA66GcIHNvbmFtdeqwgCDsnpDssrTsoIHsnLzroZwg6rCA7KeA6rOgIOyeiOuKlCBkZXBlbmRlbmN57J6F64uI64ukLlxuICog65Sw65287IScIOyCrOyaqeyekCDtlITroZzsoJ3tirjsl5DshJzripQg7J20IOyEuCDtjKjtgqTsp4Drpbwg7KeB7KCRIOyEpOy5mO2VoCDtlYTsmpTqsIAg7JeG7Iq164uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRldigpIHtcbiAgY29uc3QgYXBpUm9vdCA9IGZpbmRBcGlSb290UGF0aCgpO1xuICBjb25zdCBlbnRyeVBvaW50ID0gXCJzcmMvaW5kZXgudHNcIjtcblxuICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3cuYm9sZChcIvCfmoAgU3RhcnRpbmcgU29uYW11IGRldiBzZXJ2ZXIuLi5cXG5cIikpO1xuXG4gIC8vIOydtCBzb25hbXUg7Yyo7YKk7KeA6rCAIGRlcGVuZGVuY2llc+uhnCDqsIDsp4Dqs6Ag7J6I64qUIEBzb25hbXUta2l0L2hvdC1ydW5uZXLsnZggYmluL3J1bi5qc+ulvCDsgqzsmqntlanri4jri6QuXG4gIC8vIOydtCDqsr3roZwoL2Jpbi9ydW4uanMp64qUIEBzb25hbXUta2l0L2hvdC1ydW5uZXLsnZggcGFja2FnZS5qc29u7J2YIGJpbiDtlYTrk5zsl5Ag66qF7Iuc65CY7Ja0IOyeiOuKlCDqt7jqsoPqs7wg6rCZ7Iq164uI64ukLlxuICBjb25zdCBob3RSdW5uZXJCaW5QYXRoID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpLnJlc29sdmUoXG4gICAgXCJAc29uYW11LWtpdC9ob3QtcnVubmVyL2Jpbi9ydW4uanNcIixcbiAgKTtcblxuICBjb25zdCBzZXJ2ZXJQcm9jZXNzID0gc3Bhd24oXG4gICAgcHJvY2Vzcy5leGVjUGF0aCwgLy8gbm9kZVxuICAgIFtcbiAgICAgIGhvdFJ1bm5lckJpblBhdGgsIC8vIOydtOugh+qyjCDtlbTshJwgaG90LXJ1bm5lcuulvCDsi6TtlontlZjqtazsmpRcbiAgICAgIFwiLS1jbGVhci1zY3JlZW49ZmFsc2VcIiwgLy8g7J207ZWYIGhvdC1ydW5uZXLsl5Dqsowg64SY6rKo7KSEIOyduOyekOuTpOyeheuLiOuLpC5cbiAgICAgIFwiLS1ub2RlLWFyZ3M9LS1pbXBvcnQ9c29uYW11L2xvYWRlci1yZWdpc3RlclwiLCAvLyBUeXBlU2NyaXB0IOyEnO2PrO2KuOulvCDsnITtlZwg66Gc642ULFxuICAgICAgXCItLW5vZGUtYXJncz0tLWltcG9ydD1zb25hbXUvaG90LWhvb2stcmVnaXN0ZXJcIiwgLy8gSE1S7J2EIOyngOybkO2VmOq4sCDsnITtlZwgaG90LWhvb2ssXG4gICAgICBcIi0tbm9kZS1hcmdzPS0tZW5hYmxlLXNvdXJjZS1tYXBzXCIsIC8vIOq3uOumrOqzoCDshozsiqTrp7Ug7KeA7JuQ7J2EIOychO2VnCDtlIzrnpjqt7jsnoXri4jri6QuXG4gICAgICBcIi0tb24ta2V5PXI6cmVzdGFydDpSZXN0YXJ0IHNlcnZlclwiLCAvLyByIOuIhOultOuptCDshJzrsoQg7J6s7Iuc7J6R7ZWY6rKMIO2VtOykmOyalC5cbiAgICAgIGAtLW9uLWtleT1mOnNoZWxsKHJtICR7cGF0aC5qb2luKGFwaVJvb3QsIFwic29uYW11LmxvY2tcIil9KTpyZXN0YXJ0OkZvcmNlIHJlc3RhcnRgLCAvLyBmIOuIhOultOuptCBzb25hbXUubG9jayDtjIzsnbzsnYQg7KeA7Jqw6rOgIOyEnOuyhCDsnqzsi5zsnpHtlZjqsowg7ZW07KSY7JqULlxuXG4gICAgICBcIi0tb24ta2V5PWVudGVyOnNoZWxsKGVjaG8gaGkpOktleSBiaW5kaW5nIHRlc3RcIiwgLy8gZW50ZXLrpbwga2V566GcIOyTuCDsiJgg7J6I7J2M7J2EIOuztOydtOq4sCDsnITtlZwg7YWM7Iqk7Yq47J6F64uI64ukLlxuICAgICAgXCItLW9uLWtleT1jdHJsK2YgY3RybCtmOnNoZWxsKGdpdCBwdWxsICYmIHBucG0gaW5zdGFsbCAmJiBwbnBtIC0tZmlsdGVyIHNvbmFtdSBidWlsZCAmJiBlY2hvICdTb25hbXUgaXMgbm93IHVwLXRvLWRhdGUhJyk6cmVzdGFydDpQdWxsICYgaW5zdGFsbCAmIGJ1aWxkICYgcmVzdGFydFwiLCAvLyBtb2RpZmllcuyZgOydmCDsobDtlaksIOq3uOumrOqzoCDrkZAg6rCc7J2YIGNob3Jk66W8IOyCrOyaqe2VoCDsiJgg7J6I7J2M7J2EIOuztOydtOq4sCDsnITtlZwg7YWM7Iqk7Yq47J6F64uI64ukLlxuICAgICAgZW50cnlQb2ludCwgLy8g66eI7KeA66eJ7Jy866GcIOyLpOygnCDsi6TtlontlaAg7Iqk7YGs66a97Yq47J2YIOqyveuhnOulvCDrhJjqsqjspI3ri4jri6QuXG4gICAgXSxcbiAgICB7XG4gICAgICBjd2Q6IGFwaVJvb3QsXG4gICAgICBzdGRpbzogXCJpbmhlcml0XCIsXG4gICAgICBlbnY6IHtcbiAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgIE5PREVfRU5WOiBcImRldmVsb3BtZW50XCIsXG4gICAgICAgIEhPVDogXCJ5ZXNcIiwgLy8g7JaY6rCAIOyeiOyWtOyVvCBITVLsnbQg7Zmc7ISx7ZmU65Cp64uI64ukLlxuICAgICAgICBBUElfUk9PVF9QQVRIOiBhcGlSb290LCAvLyDsnbQg6rK966Gc6rCAIGhvdC1ob29r7J2YIOujqO2KuCDrlJTroInthqDrpqzqsIAg65Cp64uI64ukLlxuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4gIC8vIOyiheujjCDsspjrpqxcbiAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCJcXG5cXG7wn5GLIFNodXR0aW5nIGRvd24uLi5cIikpO1xuICAgIHNlcnZlclByb2Nlc3Mua2lsbChcIlNJR1RFUk1cIik7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9O1xuXG4gIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgY2xlYW51cCk7XG4gIHByb2Nlc3Mub24oXCJTSUdURVJNXCIsIGNsZWFudXApO1xuXG4gIHNlcnZlclByb2Nlc3Mub24oXCJleGl0XCIsIChjb2RlKSA9PiB7XG4gICAgaWYgKGNvZGUgIT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGDinYwgU2VydmVyIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApKTtcbiAgICAgIHByb2Nlc3MuZXhpdChjb2RlIHx8IDEpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogcG5wbSBidWlsZCDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIO2UhOuhnOygne2KuOulvCDruYzrk5ztlanri4jri6QuXG4gKlxuICog67mM65Oc7JeQIO2VhOyalO2VnCAuc3djcmPripQg7ZSE66Gc7KCd7Yq4IOujqO2KuOyXkOyEnCDssL7qs6AsIOyXhuycvOuptCBzb25hbXXqsIAg6rSA66as7ZWY64qUIC5zd2NyYy5wcm9qZWN0LWRlZmF1bHTrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICogc29uYW11LmNvbmZpZy50c+uKlCBzcmPsl5Ag65Ok7Ja07J6I7KeAIOyViuq4sCDrlYzrrLjsl5AgU1dDX0JVSUxEX0NPTU1BTkTroZwg67mM65Oc65CY7KeAIOyViuyKteuLiOuLpC5cbiAqIOuUsOudvOyEnCDrlLDroZwg67mM65Oc7ZW07KSN64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkKCkge1xuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG5cbiAgLy8g7Lac66ClIOuUlOugie2GoOumrOulvCDsoJzqsbDtlanri4jri6QuXG4gIHRyeSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlJlbW92aW5nIGJ1aWxkIGRpcmVjdG9yeS4uLlwiKSk7XG4gICAgaWYgKGF3YWl0IGV4aXN0cyhCVUlMRF9ESVIpKSB7XG4gICAgICBhd2FpdCBybShCVUlMRF9ESVIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCJSZW1vdmUgYnVpbGQgZGlyZWN0b3J5IGZhaWxlZC5cIiksIGVycm9yKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICAvLyAuc3djcmMg7YyM7J287J2EIOyngOygle2VqeuLiOuLpC5cbiAgbGV0IHN3Y0ZpbGVQYXRoID0gXCIuc3djcmNcIjtcbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKHN3Y0ZpbGVQYXRoKSkge1xuICAgICAgLy8g7IKs7Jqp7J6QIO2UhOuhnOygne2KuOyXkCAuc3djcmPqsIAg7J6I7Jy866m0IOyasOyEoOycvOuhnCDsgqzsmqntlanri4jri6QuXG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKFwiVXNpbmcgLnN3Y3JjIGZyb20gcHJvamVjdCByb290Li4uXCIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g7JWE64uI652866m0IHNvbmFtdeqwgCDqtIDrpqztlZjripQgLnN3Y3JjLnByb2plY3QtZGVmYXVsdOulvCDqsIDsoLjri6Qg7JSB64uI64ukLlxuICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlVzaW5nIGRlZmF1bHQgLnN3Y3JjIGZyb20gc29uYW11IHBhY2thZ2UuLi5cIikpO1xuICAgICAgc3djRmlsZVBhdGggPSBwYXRoLmpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLlwiLCBcIi4uXCIsIFwiLnN3Y3JjLnByb2plY3QtZGVmYXVsdFwiKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCJTZXR0aW5nIHVwIHN3YyBjb25maWcgZmlsZSBmYWlsZWQuXCIpLCBlcnJvcik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgLy8g7IaM7IqkIOuUlOugie2GoOumrOulvCDruYzrk5ztlanri4jri6QuXG4gIHRyeSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIkJ1aWxkaW5nIHdpdGggc3djLi4uXCIpKTtcbiAgICBleGVjU3luYyhTV0NfQlVJTERfQ09NTUFORChzd2NGaWxlUGF0aCksIHsgY3dkOiBhcGlSb290LCBzdGRpbzogXCJpbmhlcml0XCIgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCJCdWlsZCBmYWlsZWQuXCIpLCBlcnJvcik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgLy8gc29uYW11LmNvbmZpZy50c+unjCDrlLDroZwg67mM65Oc7ZWp64uI64ukLlxuICAvLyDsnbQg7Lmc6rWs64qUIHNyY+yXkCDrk6TslrTsnojsp4Ag7JWK6riwIOuVjOusuOyXkCBTV0NfQlVJTERfQ09NTUFOROuhnCDruYzrk5zrkJjsp4Ag7JWK7Iq164uI64ukLlxuICAvLyDrlLDrnbzshJwg65Sw66GcIOu5jOuTnO2VtOykjeuLiOuLpC5cbiAgdHJ5IHtcbiAgICBjb25zdCBjb25maWdQYXRoID0gcGF0aC5qb2luKGFwaVJvb3QsIFwic29uYW11LmNvbmZpZy50c1wiKTtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKGNvbmZpZ1BhdGgpKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKFwiQnVpbGRpbmcgc29uYW11LmNvbmZpZy50cy4uLlwiKSk7XG4gICAgICBleGVjU3luYyhgc3djICR7Y29uZmlnUGF0aH0gLW8gJHtCVUlMRF9ESVJ9L3NvbmFtdS5jb25maWcuanNgLCB7XG4gICAgICAgIGN3ZDogYXBpUm9vdCxcbiAgICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgICAgfSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwiQnVpbGRpbmcgc29uYW11LmNvbmZpZy50cyBmYWlsZWQuXCIpLCBlcnJvcik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgLy8g66eI7KeA66eJ7JeQ64qUIO2DgOyehSDssrTtgazrpbwg7ZW07JqULlxuICB0cnkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoXCJDaGVja2luZyB0eXBlcyB3aXRoIHRzYy4uLlwiKSk7XG4gICAgZXhlY1N5bmMoVFNDX1RZUEVfQ0hFQ0tfQ09NTUFORCwge1xuICAgICAgY3dkOiBhcGlSb290LFxuICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwiVHlwZSBjaGVjayBmYWlsZWQuXCIpLCBlcnJvcik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogcG5wbSBzdGFydCDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIOu5jOuTnOuQnCDtlITroZzsoJ3tirjrpbwg7Iuk7ZaJ7ZWp64uI64ukLlxuICpcbiAqIOu5jOuTnOuQnCDqsrDqs7zrrLwoZGlzdCDrlJTroInthqDrpqzsnZggaW5kZXguanMg7JeU7Yq466as7Y+s7J247Yq4KeydtCDsl4bri6TrqbQg7Iuk7ZaJ7J2EIOykkeuLqO2VqeuLiOuLpC5cbiAqIOyGjOyKpOuntSDsp4Dsm5Dqs7wgZG90ZW52IOyngOybkOydhCDtj6ztlajtlZjsl6wg7Iuk7ZaJ7ZWp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0KCkge1xuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBcImRpc3QvaW5kZXguanNcIjtcblxuICBpZiAoIShhd2FpdCBleGlzdHMoZW50cnlQb2ludCkpKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsucmVkKGAke2VudHJ5UG9pbnR9IG5vdCBmb3VuZC4gUGxlYXNlIGJ1aWxkIHlvdXIgcHJvamVjdCBmaXJzdC5gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlJ1bjogeWFybiBzb25hbXUgYnVpbGRcIikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgc3Bhd24gfSA9IGF3YWl0IGltcG9ydChcImNoaWxkX3Byb2Nlc3NcIik7XG4gIGNvbnN0IHNlcnZlclByb2Nlc3MgPSBzcGF3bihcbiAgICBwcm9jZXNzLmV4ZWNQYXRoLFxuICAgIFtcIi0tZW5hYmxlLXNvdXJjZS1tYXBzXCIsIFwiLXJcIiwgXCJkb3RlbnYvY29uZmlnXCIsIGVudHJ5UG9pbnRdLFxuICAgIHtcbiAgICAgIGN3ZDogYXBpUm9vdCxcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICB9LFxuICApO1xuXG4gIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgKCkgPT4ge1xuICAgIHNlcnZlclByb2Nlc3Mua2lsbChcIlNJR1RFUk1cIik7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBNaWdyYXRvcigpIHtcbiAgLy8gbWlncmF0b3JcbiAgbWlncmF0b3IgPSBuZXcgTWlncmF0b3IoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBGaXh0dXJlTWFuYWdlcigpIHtcbiAgRml4dHVyZU1hbmFnZXIuaW5pdCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX3J1bigpIHtcbiAgYXdhaXQgc2V0dXBNaWdyYXRvcigpO1xuXG4gIGF3YWl0IG1pZ3JhdG9yLnJ1bkFjdGlvbihcbiAgICBcImFwcGx5XCIsXG4gICAgT2JqZWN0LmtleXMoU29uYW11LmRiQ29uZmlnKSBhcyAoa2V5b2YgU29uYW11REJDb25maWcpW10gLyrsi7kg64ukISovLFxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX3N0YXR1cygpIHtcbiAgYXdhaXQgc2V0dXBNaWdyYXRvcigpO1xuXG4gIGNvbnN0IHN0YXR1cyA9IGF3YWl0IG1pZ3JhdG9yLmdldFN0YXR1cygpO1xuICAvLyBzdGF0dXM7XG4gIGNvbnNvbGUubG9nKHN0YXR1cyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVfaW5pdCgpIHtcbiAgY29uc3Qgc3JjQ29uZmlnID0gU29uYW11LmRiQ29uZmlnLmRldmVsb3BtZW50X21hc3RlcjtcbiAgY29uc3QgdGFyZ2V0cyA9IFtcbiAgICB7XG4gICAgICBsYWJlbDogXCIoUkVNT1RFKSBGaXh0dXJlIERCXCIsXG4gICAgICBjb25maWc6IFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlX3JlbW90ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiBcIihMT0NBTCkgVGVzdGluZyBEQlwiLFxuICAgICAgY29uZmlnOiBTb25hbXUuZGJDb25maWcudGVzdCxcbiAgICAgIHRvU2tpcDogKCgpID0+IHtcbiAgICAgICAgY29uc3QgcmVtb3RlQ29ubiA9IFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlX3JlbW90ZS5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZztcbiAgICAgICAgY29uc3QgbG9jYWxDb25uID0gU29uYW11LmRiQ29uZmlnLnRlc3QuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gICAgICAgIHJldHVybiByZW1vdGVDb25uLmhvc3QgPT09IGxvY2FsQ29ubi5ob3N0ICYmIHJlbW90ZUNvbm4uZGF0YWJhc2UgPT09IGxvY2FsQ29ubi5kYXRhYmFzZTtcbiAgICAgIH0pKCksXG4gICAgfSxcbiAgXSBhcyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBjb25maWc6IEtuZXguQ29uZmlnO1xuICAgIHRvU2tpcD86IGJvb2xlYW47XG4gIH1bXTtcblxuICAvLyAxLiDquLDspIBEQiDsiqTtgqTrp4jrpbwg642k7ZSEXG4gIGNvbnNvbGUubG9nKFwiRFVNUC4uLlwiKTtcbiAgY29uc3QgZHVtcEZpbGVuYW1lID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC0ke0RhdGUubm93KCl9LnNxbGA7XG4gIGNvbnN0IHNyY0Nvbm4gPSBzcmNDb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gIGNvbnN0IG1pZ3JhdGlvbnNEdW1wID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC1taWdyYXRpb25zLSR7RGF0ZS5ub3coKX0uc3FsYDtcbiAgZXhlY1N5bmMoXG4gICAgYG15c3FsZHVtcCAtaCR7c3JjQ29ubi5ob3N0fSAtdSR7c3JjQ29ubi51c2VyfSAtcCR7c3JjQ29ubi5wYXNzd29yZH0gLS1zaW5nbGUtdHJhbnNhY3Rpb24gLWQgLS1uby1jcmVhdGUtZGIgLS10cmlnZ2VycyAke3NyY0Nvbm4uZGF0YWJhc2V9ID4gJHtkdW1wRmlsZW5hbWV9YCxcbiAgKTtcbiAgY29uc3QgX2RiID0ga25leChzcmNDb25maWcpO1xuICBjb25zdCBbW21pZ3JhdGlvbnNdXSA9IGF3YWl0IF9kYi5yYXcoXG4gICAgXCJTRUxFQ1QgQ09VTlQoKikgYXMgY291bnQgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX3NjaGVtYSA9ID8gQU5EIHRhYmxlX25hbWUgPSAna25leF9taWdyYXRpb25zJ1wiLFxuICAgIFtzcmNDb25uLmRhdGFiYXNlXSxcbiAgKTtcbiAgaWYgKG1pZ3JhdGlvbnMuY291bnQgPiAwKSB7XG4gICAgZXhlY1N5bmMoXG4gICAgICBgbXlzcWxkdW1wIC1oJHtzcmNDb25uLmhvc3R9IC11JHtzcmNDb25uLnVzZXJ9IC1wJHtzcmNDb25uLnBhc3N3b3JkfSAtLXNpbmdsZS10cmFuc2FjdGlvbiAtLW5vLWNyZWF0ZS1kYiAtLXRyaWdnZXJzICR7c3JjQ29ubi5kYXRhYmFzZX0ga25leF9taWdyYXRpb25zIGtuZXhfbWlncmF0aW9uc19sb2NrID4gJHttaWdyYXRpb25zRHVtcH1gLFxuICAgICk7XG4gIH1cblxuICAvLyAyLiDrjIDsg4FEQiDqsIHqsIHsl5Ag64yA7ZWY7JesIOyhtOyerOyXrOu2gCDtmZXsnbgg7ZuEIOu2k+q4sFxuICBmb3IgYXdhaXQgKGNvbnN0IHsgbGFiZWwsIGNvbmZpZywgdG9Ta2lwIH0gb2YgdGFyZ2V0cykge1xuICAgIGNvbnN0IGNvbm4gPSBjb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG5cbiAgICBpZiAodG9Ta2lwID09PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoYCR7bGFiZWx9OiBTa2lwcGVkIWApKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGRiID0ga25leCh7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLigoY29uZmlnLmNvbm5lY3Rpb24gPz8ge30pIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyksXG4gICAgICAgIGRhdGFiYXNlOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNvbnN0IFtbcm93XV0gPSBhd2FpdCBkYi5yYXcoYFNIT1cgREFUQUJBU0VTIExJS0UgXCIke2Nvbm4uZGF0YWJhc2V9XCJgKTtcbiAgICBpZiAocm93KSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYCR7bGFiZWx9OiBEYXRhYmFzZSBcIiR7Y29ubi5kYXRhYmFzZX1cIiBBbHJlYWR5IGV4aXN0c2ApKTtcbiAgICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBTWU5DIHRvICR7bGFiZWx9Li4uYCk7XG4gICAgY29uc3QgbXlzcWxDbWQgPSBgbXlzcWwgLWgke2Nvbm4uaG9zdH0gLXUke2Nvbm4udXNlcn0gLXAke2Nvbm4ucGFzc3dvcmR9YDtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gLWUgJ0RST1AgREFUQUJBU0UgSUYgRVhJU1RTIFxcYCR7Y29ubi5kYXRhYmFzZX1cXGAnYCk7XG4gICAgZXhlY1N5bmMoYCR7bXlzcWxDbWR9IC1lICdDUkVBVEUgREFUQUJBU0UgXFxgJHtjb25uLmRhdGFiYXNlfVxcYCdgKTtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7ZHVtcEZpbGVuYW1lfWApO1xuICAgIGlmIChhd2FpdCBleGlzdHMobWlncmF0aW9uc0R1bXApKSB7XG4gICAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7bWlncmF0aW9uc0R1bXB9YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICB9XG5cbiAgYXdhaXQgX2RiLmRlc3Ryb3koKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9pbXBvcnQoZW50aXR5SWQ6IHN0cmluZywgcmVjb3JkSWRzOiBudW1iZXJbXSkge1xuICBhd2FpdCBzZXR1cEZpeHR1cmVNYW5hZ2VyKCk7XG5cbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuaW1wb3J0Rml4dHVyZShlbnRpdHlJZCwgcmVjb3JkSWRzKTtcbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuc3luYygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX3N5bmMoKSB7XG4gIGF3YWl0IHNldHVwRml4dHVyZU1hbmFnZXIoKTtcblxuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5zeW5jKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0dWJfcHJhY3RpY2UobmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IHByYWN0aWNlRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJwcmFjdGljZXNcIik7XG4gIGNvbnN0IGZpbGVOYW1lcyA9IGF3YWl0IHJlYWRkaXIocHJhY3RpY2VEaXIpO1xuXG4gIGNvbnN0IG1heFNlcU5vID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICBpZiAoIShhd2FpdCBleGlzdHMocHJhY3RpY2VEaXIpKSkge1xuICAgICAgYXdhaXQgbWtkaXIocHJhY3RpY2VEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcmVkU2VxcyA9IGZpbGVOYW1lc1xuICAgICAgLmZpbHRlcigoZmlsZU5hbWUpID0+IGZpbGVOYW1lLnN0YXJ0c1dpdGgoXCJwXCIpICYmIGZpbGVOYW1lLmVuZHNXaXRoKFwiLnRzXCIpKVxuICAgICAgLm1hcCgoZmlsZU5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgWywgc2VxTm9dID0gZmlsZU5hbWUubWF0Y2goL15wKFswLTldKyktLykgPz8gW1wiMFwiLCBcIjBcIl07XG4gICAgICAgIHJldHVybiBwYXJzZUludChzZXFObyk7XG4gICAgICB9KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIgLSBhKTtcblxuICAgIGlmIChmaWx0ZXJlZFNlcXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZpbHRlcmVkU2Vxc1swXTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSkoKTtcblxuICBjb25zdCBjdXJyZW50U2VxTm8gPSBtYXhTZXFObyArIDE7XG4gIGNvbnN0IGZpbGVOYW1lID0gYHAke2N1cnJlbnRTZXFOb30tJHtuYW1lfS50c2A7XG4gIGNvbnN0IGRzdFBhdGggPSBwYXRoLmpvaW4ocHJhY3RpY2VEaXIsIGZpbGVOYW1lKTtcblxuICBjb25zdCBjb2RlID0gW1xuICAgIGBpbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwic29uYW11XCI7YCxcbiAgICBcIlwiLFxuICAgIGBjb25zb2xlLmNsZWFyKCk7YCxcbiAgICBgY29uc29sZS5sb2coXCIke2ZpbGVOYW1lfVwiKTtgLFxuICAgIFwiXCIsXG4gICAgYFNvbmFtdS5ydW5TY3JpcHQoYXN5bmMgKCkgPT4ge2AsXG4gICAgYCAvLyBUT0RPYCxcbiAgICBgfSk7YCxcbiAgICBcIlwiLFxuICBdLmpvaW4oXCJcXG5cIik7XG4gIGF3YWl0IHdyaXRlRmlsZShkc3RQYXRoLCBjb2RlKTtcblxuICBleGVjU3luYyhgY29kZSAke2RzdFBhdGh9YCk7XG5cbiAgY29uc3QgcnVuQ29kZSA9IGB5YXJuIG5vZGUgLXIgZG90ZW52L2NvbmZpZyAtLWVuYWJsZS1zb3VyY2UtbWFwcyBkaXN0L3ByYWN0aWNlcy8ke2ZpbGVOYW1lLnJlcGxhY2UoXG4gICAgXCIudHNcIixcbiAgICBcIi5qc1wiLFxuICApfWA7XG4gIGNvbnNvbGUubG9nKGAke2NoYWxrLmJsdWUocnVuQ29kZSl9IGNvcGllZCB0byBjbGlwYm9hcmQuYCk7XG4gIGV4ZWNTeW5jKGBlY2hvIFwiJHtydW5Db2RlfVwiIHwgcGJjb3B5YCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0dWJfZW50aXR5KGVudGl0eUlkOiBzdHJpbmcpIHtcbiAgYXdhaXQgU29uYW11LnN5bmNlci5jcmVhdGVFbnRpdHkoeyBlbnRpdHlJZCwgdGl0bGU6IGVudGl0eUlkIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzY2FmZm9sZF9tb2RlbChlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuZ2VuZXJhdGVUZW1wbGF0ZShcIm1vZGVsXCIsIHtcbiAgICBlbnRpdHlJZCxcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkX21vZGVsX3Rlc3QoZW50aXR5SWQ6IHN0cmluZykge1xuICBhd2FpdCBTb25hbXUuc3luY2VyLmdlbmVyYXRlVGVtcGxhdGUoXCJtb2RlbF90ZXN0XCIsIHtcbiAgICBlbnRpdHlJZCxcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVpKCkge1xuICB0cnkge1xuICAgIC8vIOyCrOyaqeyekCDtlITroZzsoJ3tirjsnZgg7Yyo7YKk7KeA65OkIOykkeyXkOyEnCBAc29uYW11LWtpdC91aeulvCDssL7sirXri4jri6QuXG4gICAgLy8g7J2066W8IOychO2VtOyEnCBjcmVhdGVSZXF1aXJl66W8IOyCrOyaqe2VmOyXrCDtlITroZzsoJ3tirgg6rK966GcIOq4sOykgOycvOuhnCByZXNvbHZl7ZWp64uI64ukLlxuICAgIGNvbnN0IHByb2plY3RSZXF1aXJlID0gY3JlYXRlUmVxdWlyZShwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInBhY2thZ2UuanNvblwiKSk7XG4gICAgY29uc3QgdWlQYWNrYWdlUGF0aCA9IHByb2plY3RSZXF1aXJlLnJlc29sdmUoXCJAc29uYW11LWtpdC91aVwiKTsgLy8g7JeG7Jy866m0IOyXrOq4sOyEnCDthLDsoLjsmpQoTU9EVUxFX05PVF9GT1VORClcbiAgICBjb25zdCB1aU5vZGVQYXRoID0gcGF0aC5qb2luKHBhdGguZGlybmFtZSh1aVBhY2thZ2VQYXRoKSwgXCJydW4tdWkuanNcIik7XG5cbiAgICBpZiAoIShhd2FpdCBleGlzdHModWlOb2RlUGF0aCkpKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsucmVkKGBVSSBydW5uZXIgc2NyaXB0IG5vdCBmb3VuZCBhdCAke3VpTm9kZVBhdGh9LiBQbGVhc2UgcmVidWlsZCBAc29uYW11LWtpdC91aS5gKSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVUnrpbwg67OE64+EIO2UhOuhnOyEuOyKpOuhnCDsi6TtlokgKGhvdC1ob29rIO2ZnOyEse2ZlClcbiAgICBjb25zdCB1aVByb2Nlc3MgPSBzcGF3bihcbiAgICAgIHByb2Nlc3MuZXhlY1BhdGgsXG4gICAgICBbXG4gICAgICAgIFwiLS1pbXBvcnRcIixcbiAgICAgICAgXCJzb25hbXUvbG9hZGVyLXJlZ2lzdGVyXCIsXG4gICAgICAgIFwiLS1pbXBvcnRcIixcbiAgICAgICAgXCJzb25hbXUvaG90LWhvb2stcmVnaXN0ZXJcIixcbiAgICAgICAgXCItLWVuYWJsZS1zb3VyY2UtbWFwc1wiLFxuICAgICAgICBcIi0tbm8td2FybmluZ3NcIixcbiAgICAgICAgdWlOb2RlUGF0aCxcbiAgICAgIF0sXG4gICAgICB7XG4gICAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgICAgZW52OiB7XG4gICAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgICAgSE9UOiBcInllc1wiLFxuICAgICAgICAgIFBST0pFQ1RfTkFNRTogU29uYW11LmNvbmZpZy5wcm9qZWN0TmFtZSA/PyBwYXRoLmJhc2VuYW1lKFNvbmFtdS5hcGlSb290UGF0aCksXG4gICAgICAgICAgQVBJX1JPT1RfUEFUSDogU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgICAgIFVJX1BPUlQ6IChTb25hbXUuY29uZmlnLnVpPy5wb3J0ID8/IDU3MDAwKS50b1N0cmluZygpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8g7KKF66OMIOyymOumrFxuICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCJcXG5cXG7wn5GLIFNodXR0aW5nIGRvd24gVUkgc2VydmVyLi4uXCIpKTtcbiAgICAgIHVpUHJvY2Vzcy5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9O1xuXG4gICAgcHJvY2Vzcy5vbihcIlNJR0lOVFwiLCBjbGVhbnVwKTtcbiAgICBwcm9jZXNzLm9uKFwiU0lHVEVSTVwiLCBjbGVhbnVwKTtcblxuICAgIHVpUHJvY2Vzcy5vbihcImV4aXRcIiwgKGNvZGUpID0+IHtcbiAgICAgIGlmIChjb2RlICE9PSAwKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGDinYwgVUkgc2VydmVyIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KGNvZGUgfHwgMSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUubWVzc2FnZS5pbmNsdWRlcyhcImlzbid0IGRlY2xhcmVkXCIpKSB7XG4gICAgICBjb25zb2xlLmxvZyhgWW91IG5lZWQgdG8gaW5zdGFsbCAke2NoYWxrLmJsdWUoYEBzb25hbXUta2l0L3VpYCl9IGZpcnN0LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG59XG4iXSwibmFtZXMiOlsiY2hhbGsiLCJkb3RlbnYiLCJjb25maWciLCJleGVjU3luYyIsInNwYXduIiwibWtkaXIiLCJyZWFkZGlyIiwicm0iLCJ3cml0ZUZpbGUiLCJrbmV4IiwiY3JlYXRlUmVxdWlyZSIsInBhdGgiLCJwcm9jZXNzIiwidHNpY2xpIiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsIk1pZ3JhdG9yIiwiRml4dHVyZU1hbmFnZXIiLCJleGlzdHMiLCJmaW5kQXBpUm9vdFBhdGgiLCJCVUlMRF9ESVIiLCJTV0NfQlVJTERfQ09NTUFORCIsIlRTQ19UWVBFX0NIRUNLX0NPTU1BTkQiLCJtaWdyYXRvciIsImJvb3RzdHJhcCIsIm5vdFRvSW5pdCIsImluY2x1ZGVzIiwiYXJndiIsImluaXQiLCJ0eXBlcyIsInR5cGUiLCJuYW1lIiwibWVzc2FnZSIsImNob2ljZXMiLCJnZXRBbGxQYXJlbnRJZHMiLCJtYXAiLCJlbnRpdHlJZCIsInRpdGxlIiwidmFsdWUiLCJhcmdzIiwicnVubmVycyIsIm1pZ3JhdGVfc3RhdHVzIiwibWlncmF0ZV9ydW4iLCJmaXh0dXJlX2luaXQiLCJmaXh0dXJlX2ltcG9ydCIsImZpeHR1cmVfc3luYyIsInN0dWJfcHJhY3RpY2UiLCJzdHViX2VudGl0eSIsInNjYWZmb2xkX21vZGVsIiwic2NhZmZvbGRfbW9kZWxfdGVzdCIsInVpIiwic3luYyIsImRldiIsImJ1aWxkIiwic3RhcnQiLCJmaW5hbGx5IiwiZGVzdHJveSIsInN5bmNlciIsImFwaVJvb3QiLCJlbnRyeVBvaW50IiwiY29uc29sZSIsImxvZyIsInllbGxvdyIsImJvbGQiLCJob3RSdW5uZXJCaW5QYXRoIiwidXJsIiwicmVzb2x2ZSIsInNlcnZlclByb2Nlc3MiLCJleGVjUGF0aCIsImpvaW4iLCJjd2QiLCJzdGRpbyIsImVudiIsIk5PREVfRU5WIiwiSE9UIiwiQVBJX1JPT1RfUEFUSCIsImNsZWFudXAiLCJraWxsIiwiZXhpdCIsIm9uIiwiY29kZSIsImVycm9yIiwicmVkIiwiYmx1ZSIsInJlY3Vyc2l2ZSIsImZvcmNlIiwic3djRmlsZVBhdGgiLCJkaXJuYW1lIiwiY29uZmlnUGF0aCIsInNldHVwTWlncmF0b3IiLCJzZXR1cEZpeHR1cmVNYW5hZ2VyIiwicnVuQWN0aW9uIiwiT2JqZWN0Iiwia2V5cyIsImRiQ29uZmlnIiwic3RhdHVzIiwiZ2V0U3RhdHVzIiwic3JjQ29uZmlnIiwiZGV2ZWxvcG1lbnRfbWFzdGVyIiwidGFyZ2V0cyIsImxhYmVsIiwiZml4dHVyZV9yZW1vdGUiLCJ0ZXN0IiwidG9Ta2lwIiwicmVtb3RlQ29ubiIsImNvbm5lY3Rpb24iLCJsb2NhbENvbm4iLCJob3N0IiwiZGF0YWJhc2UiLCJkdW1wRmlsZW5hbWUiLCJEYXRlIiwibm93Iiwic3JjQ29ubiIsIm1pZ3JhdGlvbnNEdW1wIiwidXNlciIsInBhc3N3b3JkIiwiX2RiIiwibWlncmF0aW9ucyIsInJhdyIsImNvdW50IiwiY29ubiIsImRiIiwidW5kZWZpbmVkIiwicm93IiwibXlzcWxDbWQiLCJyZWNvcmRJZHMiLCJpbXBvcnRGaXh0dXJlIiwicHJhY3RpY2VEaXIiLCJhcGlSb290UGF0aCIsImZpbGVOYW1lcyIsIm1heFNlcU5vIiwiZmlsdGVyZWRTZXFzIiwiZmlsdGVyIiwiZmlsZU5hbWUiLCJzdGFydHNXaXRoIiwiZW5kc1dpdGgiLCJzZXFObyIsIm1hdGNoIiwicGFyc2VJbnQiLCJzb3J0IiwiYSIsImIiLCJsZW5ndGgiLCJjdXJyZW50U2VxTm8iLCJkc3RQYXRoIiwicnVuQ29kZSIsInJlcGxhY2UiLCJjcmVhdGVFbnRpdHkiLCJnZW5lcmF0ZVRlbXBsYXRlIiwicHJvamVjdFJlcXVpcmUiLCJ1aVBhY2thZ2VQYXRoIiwidWlOb2RlUGF0aCIsInVpUHJvY2VzcyIsIlBST0pFQ1RfTkFNRSIsInByb2plY3ROYW1lIiwiYmFzZW5hbWUiLCJVSV9QT1JUIiwicG9ydCIsInRvU3RyaW5nIiwiZSIsIkVycm9yIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFXLFFBQVE7QUFDMUIsT0FBT0MsWUFBWSxTQUFTO0FBRTVCQSxPQUFPQyxNQUFNO0FBRWIsU0FBU0MsUUFBUSxFQUFFQyxLQUFLLFFBQVEsZ0JBQWdCO0FBQ2hELFNBQVNDLEtBQUssRUFBRUMsT0FBTyxFQUFFQyxFQUFFLEVB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
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=loader-register.d.ts.map