sonamu 0.8.26 → 0.9.0

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 (684) hide show
  1. package/bin/cli.js +60 -13
  2. package/dist/_virtual/rolldown_runtime.js +39 -0
  3. package/dist/ai/agents/agent.d.ts +3 -3
  4. package/dist/ai/agents/agent.d.ts.map +1 -1
  5. package/dist/ai/agents/agent.js +76 -73
  6. package/dist/ai/agents/index.js +3 -3
  7. package/dist/ai/agents/types.d.ts +3 -3
  8. package/dist/ai/agents/types.d.ts.map +1 -1
  9. package/dist/ai/agents/types.js +1 -3
  10. package/dist/ai/index.js +3 -2
  11. package/dist/ai/providers/rtzr/api.js +25 -25
  12. package/dist/ai/providers/rtzr/error.js +25 -26
  13. package/dist/ai/providers/rtzr/index.js +5 -5
  14. package/dist/ai/providers/rtzr/model.d.ts +1 -1
  15. package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
  16. package/dist/ai/providers/rtzr/model.js +117 -133
  17. package/dist/ai/providers/rtzr/options.d.ts.map +1 -1
  18. package/dist/ai/providers/rtzr/options.js +35 -41
  19. package/dist/ai/providers/rtzr/provider.d.ts +1 -1
  20. package/dist/ai/providers/rtzr/provider.d.ts.map +1 -1
  21. package/dist/ai/providers/rtzr/provider.js +53 -51
  22. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
  23. package/dist/ai/providers/rtzr/utils.js +84 -84
  24. package/dist/api/base-frame.d.ts +2 -2
  25. package/dist/api/base-frame.d.ts.map +1 -1
  26. package/dist/api/base-frame.js +29 -19
  27. package/dist/api/caster.d.ts +1 -1
  28. package/dist/api/caster.d.ts.map +1 -1
  29. package/dist/api/caster.js +51 -61
  30. package/dist/api/code-converters.d.ts +4 -3
  31. package/dist/api/code-converters.d.ts.map +1 -1
  32. package/dist/api/code-converters.js +226 -249
  33. package/dist/api/config.d.ts +17 -17
  34. package/dist/api/config.d.ts.map +1 -1
  35. package/dist/api/config.js +37 -30
  36. package/dist/api/context.d.ts +10 -10
  37. package/dist/api/context.d.ts.map +1 -1
  38. package/dist/api/context.js +8 -2
  39. package/dist/api/decorators.d.ts +8 -8
  40. package/dist/api/decorators.d.ts.map +1 -1
  41. package/dist/api/decorators.js +245 -268
  42. package/dist/api/index.js +39 -7
  43. package/dist/api/secret.js +22 -15
  44. package/dist/api/sonamu.d.ts +15 -15
  45. package/dist/api/sonamu.d.ts.map +1 -1
  46. package/dist/api/sonamu.js +1012 -1131
  47. package/dist/api/validator.js +88 -79
  48. package/dist/auth/auth-generator.d.ts.map +1 -1
  49. package/dist/auth/auth-generator.js +203 -200
  50. package/dist/auth/better-auth-entities.d.ts +2 -2
  51. package/dist/auth/better-auth-entities.d.ts.map +1 -1
  52. package/dist/auth/better-auth-entities.js +369 -429
  53. package/dist/auth/index.js +21 -6
  54. package/dist/auth/knex-adapter.d.ts +2 -2
  55. package/dist/auth/knex-adapter.d.ts.map +1 -1
  56. package/dist/auth/knex-adapter.js +153 -157
  57. package/dist/auth/plugins/entity-definitions/admin.d.ts +1 -1
  58. package/dist/auth/plugins/entity-definitions/admin.d.ts.map +1 -1
  59. package/dist/auth/plugins/entity-definitions/admin.js +58 -56
  60. package/dist/auth/plugins/entity-definitions/anonymous.d.ts +1 -1
  61. package/dist/auth/plugins/entity-definitions/anonymous.d.ts.map +1 -1
  62. package/dist/auth/plugins/entity-definitions/anonymous.js +20 -20
  63. package/dist/auth/plugins/entity-definitions/api-key.d.ts +1 -1
  64. package/dist/auth/plugins/entity-definitions/api-key.d.ts.map +1 -1
  65. package/dist/auth/plugins/entity-definitions/api-key.js +185 -196
  66. package/dist/auth/plugins/entity-definitions/index.d.ts +1 -1
  67. package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
  68. package/dist/auth/plugins/entity-definitions/index.js +26 -29
  69. package/dist/auth/plugins/entity-definitions/jwt.d.ts +1 -1
  70. package/dist/auth/plugins/entity-definitions/jwt.d.ts.map +1 -1
  71. package/dist/auth/plugins/entity-definitions/jwt.js +62 -64
  72. package/dist/auth/plugins/entity-definitions/organization.d.ts +1 -1
  73. package/dist/auth/plugins/entity-definitions/organization.d.ts.map +1 -1
  74. package/dist/auth/plugins/entity-definitions/organization.js +362 -421
  75. package/dist/auth/plugins/entity-definitions/passkey.d.ts +1 -1
  76. package/dist/auth/plugins/entity-definitions/passkey.d.ts.map +1 -1
  77. package/dist/auth/plugins/entity-definitions/passkey.js +115 -126
  78. package/dist/auth/plugins/entity-definitions/phone-number.d.ts +1 -1
  79. package/dist/auth/plugins/entity-definitions/phone-number.d.ts.map +1 -1
  80. package/dist/auth/plugins/entity-definitions/phone-number.js +31 -40
  81. package/dist/auth/plugins/entity-definitions/sso.d.ts +1 -1
  82. package/dist/auth/plugins/entity-definitions/sso.d.ts.map +1 -1
  83. package/dist/auth/plugins/entity-definitions/sso.js +94 -107
  84. package/dist/auth/plugins/entity-definitions/two-factor.d.ts +1 -1
  85. package/dist/auth/plugins/entity-definitions/two-factor.d.ts.map +1 -1
  86. package/dist/auth/plugins/entity-definitions/two-factor.js +78 -92
  87. package/dist/auth/plugins/entity-definitions/types.d.ts +1 -1
  88. package/dist/auth/plugins/entity-definitions/types.d.ts.map +1 -1
  89. package/dist/auth/plugins/entity-definitions/types.js +1 -10
  90. package/dist/auth/plugins/entity-definitions/username.d.ts +1 -1
  91. package/dist/auth/plugins/entity-definitions/username.d.ts.map +1 -1
  92. package/dist/auth/plugins/entity-definitions/username.js +31 -40
  93. package/dist/auth/plugins/index.js +12 -3
  94. package/dist/auth/plugins/wrappers/admin.d.ts +2 -2
  95. package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
  96. package/dist/auth/plugins/wrappers/admin.js +28 -29
  97. package/dist/auth/plugins/wrappers/anonymous.d.ts +2 -1
  98. package/dist/auth/plugins/wrappers/anonymous.d.ts.map +1 -1
  99. package/dist/auth/plugins/wrappers/anonymous.js +23 -22
  100. package/dist/auth/plugins/wrappers/api-key.d.ts +2 -1
  101. package/dist/auth/plugins/wrappers/api-key.d.ts.map +1 -1
  102. package/dist/auth/plugins/wrappers/api-key.js +39 -34
  103. package/dist/auth/plugins/wrappers/index.js +11 -11
  104. package/dist/auth/plugins/wrappers/jwt.d.ts +2 -1
  105. package/dist/auth/plugins/wrappers/jwt.d.ts.map +1 -1
  106. package/dist/auth/plugins/wrappers/jwt.js +31 -26
  107. package/dist/auth/plugins/wrappers/organization.d.ts +2 -1
  108. package/dist/auth/plugins/wrappers/organization.d.ts.map +1 -1
  109. package/dist/auth/plugins/wrappers/organization.js +65 -62
  110. package/dist/auth/plugins/wrappers/passkey.d.ts +2 -1
  111. package/dist/auth/plugins/wrappers/passkey.d.ts.map +1 -1
  112. package/dist/auth/plugins/wrappers/passkey.js +33 -28
  113. package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
  114. package/dist/auth/plugins/wrappers/phone-number.js +26 -23
  115. package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
  116. package/dist/auth/plugins/wrappers/sso.js +37 -31
  117. package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
  118. package/dist/auth/plugins/wrappers/two-factor.js +31 -28
  119. package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
  120. package/dist/auth/plugins/wrappers/username.js +23 -23
  121. package/dist/bin/build-config.js +31 -31
  122. package/dist/bin/cli.js +1063 -1204
  123. package/dist/bin/fixture.d.ts.map +1 -1
  124. package/dist/bin/fixture.js +266 -259
  125. package/dist/bin/hmr-hook-register.d.ts.map +1 -1
  126. package/dist/bin/hmr-hook-register.js +19 -18
  127. package/dist/bin/test-command.d.ts.map +1 -1
  128. package/dist/bin/test-command.js +180 -177
  129. package/dist/bin/ts-loader-register.js +13 -6
  130. package/dist/bin/ts-loader-registration.d.ts.map +1 -1
  131. package/dist/bin/ts-loader-registration.js +28 -38
  132. package/dist/cache/cache-manager.d.ts +1 -1
  133. package/dist/cache/cache-manager.d.ts.map +1 -1
  134. package/dist/cache/cache-manager.js +20 -15
  135. package/dist/cache/decorator.d.ts +1 -1
  136. package/dist/cache/decorator.d.ts.map +1 -1
  137. package/dist/cache/decorator.js +84 -76
  138. package/dist/cache/drivers.js +21 -34
  139. package/dist/cache/index.js +10 -7
  140. package/dist/cache/types.d.ts +2 -2
  141. package/dist/cache/types.d.ts.map +1 -1
  142. package/dist/cache/types.js +1 -6
  143. package/dist/cache-control/cache-control.d.ts +2 -2
  144. package/dist/cache-control/cache-control.d.ts.map +1 -1
  145. package/dist/cache-control/cache-control.js +106 -122
  146. package/dist/cache-control/types.d.ts +2 -2
  147. package/dist/cache-control/types.d.ts.map +1 -1
  148. package/dist/cache-control/types.js +1 -19
  149. package/dist/compress/compress.d.ts +1 -1
  150. package/dist/compress/compress.d.ts.map +1 -1
  151. package/dist/compress/compress.js +58 -56
  152. package/dist/compress/index.js +7 -2
  153. package/dist/compress/types.js +1 -11
  154. package/dist/cone/cone-generator.d.ts +1 -1
  155. package/dist/cone/cone-generator.d.ts.map +1 -1
  156. package/dist/cone/cone-generator.js +216 -219
  157. package/dist/database/_batch_update.d.ts +1 -1
  158. package/dist/database/_batch_update.d.ts.map +1 -1
  159. package/dist/database/_batch_update.js +107 -102
  160. package/dist/database/base-model.d.ts +8 -9
  161. package/dist/database/base-model.d.ts.map +1 -1
  162. package/dist/database/base-model.js +371 -392
  163. package/dist/database/base-model.types.d.ts +5 -5
  164. package/dist/database/base-model.types.d.ts.map +1 -1
  165. package/dist/database/base-model.types.js +1 -20
  166. package/dist/database/db.d.ts +5 -2
  167. package/dist/database/db.d.ts.map +1 -1
  168. package/dist/database/db.js +185 -171
  169. package/dist/database/knex.d.ts +1 -1
  170. package/dist/database/knex.d.ts.map +1 -1
  171. package/dist/database/knex.js +48 -42
  172. package/dist/database/puri-subset.types.d.ts +6 -7
  173. package/dist/database/puri-subset.types.d.ts.map +1 -1
  174. package/dist/database/puri-subset.types.js +1 -16
  175. package/dist/database/puri-wrapper.d.ts +6 -6
  176. package/dist/database/puri-wrapper.d.ts.map +1 -1
  177. package/dist/database/puri-wrapper.js +99 -101
  178. package/dist/database/puri.d.ts +4 -5
  179. package/dist/database/puri.d.ts.map +1 -1
  180. package/dist/database/puri.js +1021 -1227
  181. package/dist/database/puri.types.d.ts +6 -6
  182. package/dist/database/puri.types.d.ts.map +1 -1
  183. package/dist/database/puri.types.js +15 -6
  184. package/dist/database/transaction-context.d.ts +2 -2
  185. package/dist/database/transaction-context.d.ts.map +1 -1
  186. package/dist/database/transaction-context.js +22 -13
  187. package/dist/database/upsert-builder.d.ts +3 -3
  188. package/dist/database/upsert-builder.d.ts.map +1 -1
  189. package/dist/database/upsert-builder.js +405 -465
  190. package/dist/dict/en.js +72 -74
  191. package/dist/dict/index.js +13 -13
  192. package/dist/dict/ko.js +72 -74
  193. package/dist/dict/rc-keys.js +150 -168
  194. package/dist/dict/sd.d.ts +3 -1
  195. package/dist/dict/sd.d.ts.map +1 -1
  196. package/dist/dict/sd.js +54 -40
  197. package/dist/dict/sonamu-dictionary.d.ts +1 -1
  198. package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
  199. package/dist/dict/sonamu-dictionary.js +887 -955
  200. package/dist/dict/types.js +1 -7
  201. package/dist/dict/utils.js +26 -24
  202. package/dist/entity/entity-manager.d.ts +9 -9
  203. package/dist/entity/entity-manager.d.ts.map +1 -1
  204. package/dist/entity/entity-manager.js +226 -223
  205. package/dist/entity/entity-template-cone.d.ts +1 -1
  206. package/dist/entity/entity-template-cone.d.ts.map +1 -1
  207. package/dist/entity/entity-template-cone.js +152 -151
  208. package/dist/entity/entity.d.ts.map +1 -1
  209. package/dist/entity/entity.js +952 -1089
  210. package/dist/exceptions/error-handler.d.ts +1 -1
  211. package/dist/exceptions/error-handler.d.ts.map +1 -1
  212. package/dist/exceptions/error-handler.js +32 -27
  213. package/dist/exceptions/so-exceptions.d.ts +1 -1
  214. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  215. package/dist/exceptions/so-exceptions.js +61 -68
  216. package/dist/filter/index.js +9 -3
  217. package/dist/filter/types.js +92 -88
  218. package/dist/filter/utils.d.ts +1 -1
  219. package/dist/filter/utils.d.ts.map +1 -1
  220. package/dist/filter/utils.js +147 -161
  221. package/dist/index.js +87 -40
  222. package/dist/logger/category.d.ts.map +1 -1
  223. package/dist/logger/category.js +30 -29
  224. package/dist/logger/configure.d.ts.map +1 -1
  225. package/dist/logger/configure.js +83 -107
  226. package/dist/migration/code-generation.d.ts +2 -2
  227. package/dist/migration/code-generation.d.ts.map +1 -1
  228. package/dist/migration/code-generation.js +1385 -1578
  229. package/dist/migration/migration-set.d.ts +1 -1
  230. package/dist/migration/migration-set.d.ts.map +1 -1
  231. package/dist/migration/migration-set.js +177 -227
  232. package/dist/migration/migrator.d.ts +4 -3
  233. package/dist/migration/migrator.d.ts.map +1 -1
  234. package/dist/migration/migrator.js +340 -345
  235. package/dist/migration/postgresql-schema-reader.d.ts +2 -2
  236. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  237. package/dist/migration/postgresql-schema-reader.js +506 -564
  238. package/dist/migration/slack-confirm.d.ts +2 -2
  239. package/dist/migration/slack-confirm.d.ts.map +1 -1
  240. package/dist/migration/slack-confirm.js +205 -193
  241. package/dist/migration/types.d.ts +2 -2
  242. package/dist/migration/types.d.ts.map +1 -1
  243. package/dist/migration/types.js +1 -3
  244. package/dist/naite/messaging-types.d.ts +1 -0
  245. package/dist/naite/messaging-types.d.ts.map +1 -1
  246. package/dist/naite/messaging-types.js +1 -7
  247. package/dist/naite/naite-reporter.d.ts +2 -2
  248. package/dist/naite/naite-reporter.d.ts.map +1 -1
  249. package/dist/naite/naite-reporter.js +127 -120
  250. package/dist/naite/naite.d.ts +3 -2
  251. package/dist/naite/naite.d.ts.map +1 -1
  252. package/dist/naite/naite.js +266 -300
  253. package/dist/ssr/index.d.ts +2 -2
  254. package/dist/ssr/index.d.ts.map +1 -1
  255. package/dist/ssr/index.js +13 -3
  256. package/dist/ssr/registry.d.ts +1 -1
  257. package/dist/ssr/registry.d.ts.map +1 -1
  258. package/dist/ssr/registry.js +45 -37
  259. package/dist/ssr/renderer.d.ts +4 -4
  260. package/dist/ssr/renderer.d.ts.map +1 -1
  261. package/dist/ssr/renderer.js +84 -91
  262. package/dist/ssr/types.d.ts +2 -2
  263. package/dist/ssr/types.d.ts.map +1 -1
  264. package/dist/ssr/types.js +1 -3
  265. package/dist/storage/base-file.js +54 -41
  266. package/dist/storage/buffered-file.d.ts +2 -2
  267. package/dist/storage/buffered-file.d.ts.map +1 -1
  268. package/dist/storage/buffered-file.js +51 -44
  269. package/dist/storage/drivers.d.ts +2 -2
  270. package/dist/storage/drivers.d.ts.map +1 -1
  271. package/dist/storage/drivers.js +12 -7
  272. package/dist/storage/index.js +14 -7
  273. package/dist/storage/s3-driver.d.ts +2 -2
  274. package/dist/storage/s3-driver.d.ts.map +1 -1
  275. package/dist/storage/s3-driver.js +52 -48
  276. package/dist/storage/storage-manager.d.ts +2 -2
  277. package/dist/storage/storage-manager.d.ts.map +1 -1
  278. package/dist/storage/storage-manager.js +33 -25
  279. package/dist/storage/types.d.ts +2 -2
  280. package/dist/storage/types.d.ts.map +1 -1
  281. package/dist/storage/types.js +1 -5
  282. package/dist/storage/uploaded-file.d.ts +1 -1
  283. package/dist/storage/uploaded-file.d.ts.map +1 -1
  284. package/dist/storage/uploaded-file.js +45 -35
  285. package/dist/stream/index.js +7 -2
  286. package/dist/stream/sse.d.ts +2 -2
  287. package/dist/stream/sse.d.ts.map +1 -1
  288. package/dist/stream/sse.js +72 -67
  289. package/dist/syncer/api-parser.d.ts +1 -1
  290. package/dist/syncer/api-parser.d.ts.map +1 -1
  291. package/dist/syncer/api-parser.js +224 -245
  292. package/dist/syncer/checksum.d.ts +1 -1
  293. package/dist/syncer/checksum.d.ts.map +1 -1
  294. package/dist/syncer/checksum.js +86 -72
  295. package/dist/syncer/code-generator.d.ts +2 -2
  296. package/dist/syncer/code-generator.d.ts.map +1 -1
  297. package/dist/syncer/code-generator.js +154 -160
  298. package/dist/syncer/entity-operations.d.ts +1 -1
  299. package/dist/syncer/entity-operations.d.ts.map +1 -1
  300. package/dist/syncer/entity-operations.js +63 -54
  301. package/dist/syncer/file-patterns.d.ts +1 -1
  302. package/dist/syncer/file-patterns.d.ts.map +1 -1
  303. package/dist/syncer/file-patterns.js +38 -38
  304. package/dist/syncer/index.js +19 -8
  305. package/dist/syncer/module-loader.d.ts +5 -5
  306. package/dist/syncer/module-loader.d.ts.map +1 -1
  307. package/dist/syncer/module-loader.js +83 -78
  308. package/dist/syncer/syncer-actions.d.ts +2 -2
  309. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  310. package/dist/syncer/syncer-actions.js +76 -91
  311. package/dist/syncer/syncer.d.ts +7 -6
  312. package/dist/syncer/syncer.d.ts.map +1 -1
  313. package/dist/syncer/syncer.js +426 -492
  314. package/dist/tasks/decorator.d.ts +3 -3
  315. package/dist/tasks/decorator.d.ts.map +1 -1
  316. package/dist/tasks/decorator.js +32 -28
  317. package/dist/tasks/step-wrapper.d.ts +1 -1
  318. package/dist/tasks/step-wrapper.d.ts.map +1 -1
  319. package/dist/tasks/step-wrapper.js +42 -41
  320. package/dist/tasks/workflow-manager.d.ts +2 -2
  321. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  322. package/dist/tasks/workflow-manager.js +192 -221
  323. package/dist/template/entity-converter.d.ts +1 -1
  324. package/dist/template/entity-converter.d.ts.map +1 -1
  325. package/dist/template/entity-converter.js +103 -103
  326. package/dist/template/helpers.d.ts.map +1 -1
  327. package/dist/template/helpers.js +163 -163
  328. package/dist/template/implementations/entity.template.d.ts +1 -1
  329. package/dist/template/implementations/entity.template.d.ts.map +1 -1
  330. package/dist/template/implementations/entity.template.js +76 -85
  331. package/dist/template/implementations/entry-server.template.d.ts +1 -1
  332. package/dist/template/implementations/entry-server.template.d.ts.map +1 -1
  333. package/dist/template/implementations/entry-server.template.js +32 -27
  334. package/dist/template/implementations/generated.template.d.ts +1 -1
  335. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  336. package/dist/template/implementations/generated.template.js +254 -275
  337. package/dist/template/implementations/generated_http.template.d.ts +2 -2
  338. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  339. package/dist/template/implementations/generated_http.template.js +114 -133
  340. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  341. package/dist/template/implementations/generated_sso.template.js +249 -275
  342. package/dist/template/implementations/init_types.template.d.ts +1 -1
  343. package/dist/template/implementations/init_types.template.d.ts.map +1 -1
  344. package/dist/template/implementations/init_types.template.js +40 -34
  345. package/dist/template/implementations/model.template.d.ts +1 -1
  346. package/dist/template/implementations/model.template.d.ts.map +1 -1
  347. package/dist/template/implementations/model.template.js +56 -53
  348. package/dist/template/implementations/model_test.template.d.ts +1 -1
  349. package/dist/template/implementations/model_test.template.d.ts.map +1 -1
  350. package/dist/template/implementations/model_test.template.js +32 -24
  351. package/dist/template/implementations/queries.template.d.ts +1 -1
  352. package/dist/template/implementations/queries.template.d.ts.map +1 -1
  353. package/dist/template/implementations/queries.template.js +84 -89
  354. package/dist/template/implementations/sd.template.d.ts +1 -1
  355. package/dist/template/implementations/sd.template.d.ts.map +1 -1
  356. package/dist/template/implementations/sd.template.js +137 -144
  357. package/dist/template/implementations/services.template.d.ts +1 -1
  358. package/dist/template/implementations/services.template.d.ts.map +1 -1
  359. package/dist/template/implementations/services.template.js +164 -189
  360. package/dist/template/implementations/view_form.template.d.ts +1 -1
  361. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  362. package/dist/template/implementations/view_form.template.js +258 -285
  363. package/dist/template/implementations/view_id_all_select.template.d.ts +1 -1
  364. package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -1
  365. package/dist/template/implementations/view_id_all_select.template.js +31 -25
  366. package/dist/template/implementations/view_list.template.d.ts +1 -1
  367. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  368. package/dist/template/implementations/view_list.template.js +304 -355
  369. package/dist/template/implementations/view_search_input.template.d.ts +1 -1
  370. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
  371. package/dist/template/implementations/view_search_input.template.js +31 -27
  372. package/dist/template/index.js +21 -7
  373. package/dist/template/template-manager.d.ts +1 -1
  374. package/dist/template/template-manager.d.ts.map +1 -1
  375. package/dist/template/template-manager.js +132 -123
  376. package/dist/template/template-types.js +8 -6
  377. package/dist/template/template.d.ts +2 -2
  378. package/dist/template/template.d.ts.map +1 -1
  379. package/dist/template/template.js +73 -68
  380. package/dist/template/zod-converter.d.ts.map +1 -1
  381. package/dist/template/zod-converter.js +603 -657
  382. package/dist/testing/_relation-graph.d.ts +1 -1
  383. package/dist/testing/_relation-graph.d.ts.map +1 -1
  384. package/dist/testing/_relation-graph.js +93 -88
  385. package/dist/testing/bootstrap.d.ts +22 -13
  386. package/dist/testing/bootstrap.d.ts.map +1 -1
  387. package/dist/testing/bootstrap.js +114 -114
  388. package/dist/testing/data-explorer.d.ts +3 -3
  389. package/dist/testing/data-explorer.d.ts.map +1 -1
  390. package/dist/testing/data-explorer.js +237 -265
  391. package/dist/testing/dev-test-routes.d.ts +2 -2
  392. package/dist/testing/dev-test-routes.d.ts.map +1 -1
  393. package/dist/testing/dev-test-routes.js +258 -249
  394. package/dist/testing/dev-vitest-manager.d.ts +1 -1
  395. package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
  396. package/dist/testing/dev-vitest-manager.js +514 -539
  397. package/dist/testing/faker-mappings.js +422 -420
  398. package/dist/testing/fixture-generator.d.ts +3 -3
  399. package/dist/testing/fixture-generator.d.ts.map +1 -1
  400. package/dist/testing/fixture-generator.js +1216 -1346
  401. package/dist/testing/fixture-loader.js +26 -25
  402. package/dist/testing/fixture-manager.d.ts +3 -3
  403. package/dist/testing/fixture-manager.d.ts.map +1 -1
  404. package/dist/testing/fixture-manager.js +706 -776
  405. package/dist/testing/global-setup.js +53 -49
  406. package/dist/testing/index.js +19 -11
  407. package/dist/testing/naite-vitest-reporter.js +18 -13
  408. package/dist/testing/parallel-db-manager.d.ts +1 -1
  409. package/dist/testing/parallel-db-manager.d.ts.map +1 -1
  410. package/dist/testing/parallel-db-manager.js +63 -78
  411. package/dist/testing/vitest-helpers.d.ts +1 -1
  412. package/dist/testing/vitest-helpers.d.ts.map +1 -1
  413. package/dist/testing/vitest-helpers.js +37 -33
  414. package/dist/types/types.d.ts +28 -28
  415. package/dist/types/types.d.ts.map +1 -1
  416. package/dist/types/types.js +764 -890
  417. package/dist/ui/ai-api.d.ts +1 -1
  418. package/dist/ui/ai-api.d.ts.map +1 -1
  419. package/dist/ui/ai-api.js +52 -42
  420. package/dist/ui/ai-client.d.ts +1 -2
  421. package/dist/ui/ai-client.d.ts.map +1 -1
  422. package/dist/ui/ai-client.js +353 -388
  423. package/dist/ui/api.d.ts +1 -1
  424. package/dist/ui/api.d.ts.map +1 -1
  425. package/dist/ui/api.js +903 -1145
  426. package/dist/ui/cdd-service.d.ts +1 -1
  427. package/dist/ui/cdd-service.d.ts.map +1 -1
  428. package/dist/ui/cdd-service.js +406 -407
  429. package/dist/ui/cdd-types.js +1 -3
  430. package/dist/ui-web/assets/index-C-Zz-wYg.css +1 -0
  431. package/dist/ui-web/assets/index-DejDON8K.js +238 -0
  432. package/dist/ui-web/index.html +3 -3
  433. package/dist/utils/async-utils.js +57 -45
  434. package/dist/utils/console-util.d.ts.map +1 -1
  435. package/dist/utils/console-util.js +104 -87
  436. package/dist/utils/controller.js +26 -19
  437. package/dist/utils/esm-utils.js +49 -38
  438. package/dist/utils/formatter.d.ts +1 -2
  439. package/dist/utils/formatter.d.ts.map +1 -1
  440. package/dist/utils/formatter.js +89 -115
  441. package/dist/utils/fs-utils.d.ts.map +1 -1
  442. package/dist/utils/fs-utils.js +68 -65
  443. package/dist/utils/lodash-able.js +11 -4
  444. package/dist/utils/model.d.ts +1 -1
  445. package/dist/utils/model.d.ts.map +1 -1
  446. package/dist/utils/model.js +21 -19
  447. package/dist/utils/object-utils.js +148 -186
  448. package/dist/utils/path-utils.js +67 -57
  449. package/dist/utils/process-utils.d.ts.map +1 -1
  450. package/dist/utils/process-utils.js +37 -31
  451. package/dist/utils/sql-parser.d.ts +1 -1
  452. package/dist/utils/sql-parser.d.ts.map +1 -1
  453. package/dist/utils/sql-parser.js +40 -40
  454. package/dist/utils/type-utils.js +44 -43
  455. package/dist/utils/utils.d.ts +2 -3
  456. package/dist/utils/utils.d.ts.map +1 -1
  457. package/dist/utils/utils.js +81 -93
  458. package/dist/utils/zod-error.d.ts +1 -1
  459. package/dist/utils/zod-error.d.ts.map +1 -1
  460. package/dist/utils/zod-error.js +24 -17
  461. package/dist/vector/chunking.d.ts +1 -1
  462. package/dist/vector/chunking.d.ts.map +1 -1
  463. package/dist/vector/chunking.js +100 -94
  464. package/dist/vector/config.d.ts +1 -1
  465. package/dist/vector/config.d.ts.map +1 -1
  466. package/dist/vector/config.js +76 -78
  467. package/dist/vector/embedding.d.ts +1 -1
  468. package/dist/vector/embedding.d.ts.map +1 -1
  469. package/dist/vector/embedding.js +128 -125
  470. package/dist/vector/index.js +5 -5
  471. package/dist/vector/types.js +1 -5
  472. package/package.json +31 -36
  473. package/src/ai/agents/agent.ts +12 -5
  474. package/src/ai/agents/types.ts +5 -5
  475. package/src/ai/providers/rtzr/model.ts +8 -10
  476. package/src/ai/providers/rtzr/options.ts +2 -1
  477. package/src/ai/providers/rtzr/provider.ts +5 -3
  478. package/src/ai/providers/rtzr/utils.ts +2 -7
  479. package/src/api/__tests__/config.test.ts +15 -8
  480. package/src/api/base-frame.ts +5 -3
  481. package/src/api/caster.ts +7 -6
  482. package/src/api/code-converters.ts +23 -26
  483. package/src/api/config.ts +23 -17
  484. package/src/api/context.ts +18 -11
  485. package/src/api/decorators.ts +17 -18
  486. package/src/api/sonamu.ts +44 -49
  487. package/src/auth/auth-generator.ts +4 -6
  488. package/src/auth/better-auth-entities.ts +3 -2
  489. package/src/auth/knex-adapter.ts +6 -5
  490. package/src/auth/plugins/entity-definitions/admin.ts +1 -1
  491. package/src/auth/plugins/entity-definitions/anonymous.ts +1 -1
  492. package/src/auth/plugins/entity-definitions/api-key.ts +1 -1
  493. package/src/auth/plugins/entity-definitions/index.ts +1 -1
  494. package/src/auth/plugins/entity-definitions/jwt.ts +1 -1
  495. package/src/auth/plugins/entity-definitions/organization.ts +1 -1
  496. package/src/auth/plugins/entity-definitions/passkey.ts +1 -1
  497. package/src/auth/plugins/entity-definitions/phone-number.ts +1 -1
  498. package/src/auth/plugins/entity-definitions/sso.ts +1 -1
  499. package/src/auth/plugins/entity-definitions/two-factor.ts +1 -1
  500. package/src/auth/plugins/entity-definitions/types.ts +1 -1
  501. package/src/auth/plugins/entity-definitions/username.ts +1 -1
  502. package/src/auth/plugins/wrappers/admin.ts +3 -1
  503. package/src/auth/plugins/wrappers/anonymous.ts +3 -1
  504. package/src/auth/plugins/wrappers/api-key.ts +3 -1
  505. package/src/auth/plugins/wrappers/jwt.ts +3 -1
  506. package/src/auth/plugins/wrappers/organization.ts +3 -1
  507. package/src/auth/plugins/wrappers/passkey.ts +3 -1
  508. package/src/auth/plugins/wrappers/phone-number.ts +3 -1
  509. package/src/auth/plugins/wrappers/sso.ts +2 -1
  510. package/src/auth/plugins/wrappers/two-factor.ts +3 -1
  511. package/src/auth/plugins/wrappers/username.ts +3 -1
  512. package/src/bin/__tests__/ts-loader-register.test.ts +7 -12
  513. package/src/bin/build-config.ts +3 -3
  514. package/src/bin/cli.ts +27 -25
  515. package/src/bin/fixture.ts +4 -2
  516. package/src/bin/hmr-hook-register.ts +1 -0
  517. package/src/bin/test-command.ts +4 -2
  518. package/src/bin/ts-loader-registration.ts +6 -22
  519. package/src/cache/cache-manager.ts +2 -1
  520. package/src/cache/decorator.ts +2 -2
  521. package/src/cache/types.ts +3 -3
  522. package/src/cache-control/cache-control.ts +3 -2
  523. package/src/cache-control/types.ts +2 -2
  524. package/src/compress/compress.ts +1 -1
  525. package/src/cone/cone-generator.ts +5 -3
  526. package/src/database/_batch_update.ts +1 -1
  527. package/src/database/base-model.ts +20 -14
  528. package/src/database/base-model.types.ts +12 -11
  529. package/src/database/db.ts +56 -21
  530. package/src/database/knex.ts +2 -2
  531. package/src/database/puri-subset.test-d.ts +33 -32
  532. package/src/database/puri-subset.types.ts +6 -7
  533. package/src/database/puri-wrapper.ts +29 -26
  534. package/src/database/puri.ts +36 -34
  535. package/src/database/puri.types.test-d.ts +6 -5
  536. package/src/database/puri.types.ts +9 -12
  537. package/src/database/transaction-context.ts +2 -2
  538. package/src/database/upsert-builder.ts +17 -10
  539. package/src/dict/sd.ts +17 -4
  540. package/src/dict/sonamu-dictionary.ts +23 -17
  541. package/src/entity/entity-manager.ts +9 -7
  542. package/src/entity/entity-template-cone.ts +10 -3
  543. package/src/entity/entity.ts +20 -16
  544. package/src/exceptions/error-handler.ts +2 -1
  545. package/src/exceptions/so-exceptions.ts +1 -1
  546. package/src/filter/utils.ts +3 -2
  547. package/src/logger/category.ts +1 -0
  548. package/src/logger/configure.ts +5 -5
  549. package/src/migration/__tests__/code-generation.search-text.test.ts +2 -3
  550. package/src/migration/code-generation.ts +26 -25
  551. package/src/migration/migration-set.ts +16 -18
  552. package/src/migration/migrator.ts +38 -33
  553. package/src/migration/postgresql-schema-reader.ts +12 -12
  554. package/src/migration/slack-confirm.ts +5 -4
  555. package/src/migration/types.ts +2 -2
  556. package/src/naite/messaging-types.ts +1 -1
  557. package/src/naite/naite-reporter.ts +5 -3
  558. package/src/naite/naite.ts +12 -7
  559. package/src/shared/app.shared.ts.txt +2 -2
  560. package/src/shared/web.shared.ts.txt +2 -2
  561. package/src/skills/AGENTS.md +19 -18
  562. package/src/skills/commands/sonamu-skills.md +9 -9
  563. package/src/skills/sonamu/SKILL.md +111 -104
  564. package/src/skills/sonamu/ai-agents.md +27 -26
  565. package/src/skills/sonamu/api.md +81 -69
  566. package/src/skills/sonamu/auth-migration.md +13 -27
  567. package/src/skills/sonamu/auth-plugins.md +41 -31
  568. package/src/skills/sonamu/auth.md +30 -24
  569. package/src/skills/sonamu/cdd.md +26 -17
  570. package/src/skills/sonamu/cone.md +50 -50
  571. package/src/skills/sonamu/config.md +74 -51
  572. package/src/skills/sonamu/create-sonamu.md +31 -19
  573. package/src/skills/sonamu/database.md +43 -26
  574. package/src/skills/sonamu/entity-basic.md +61 -61
  575. package/src/skills/sonamu/entity-relations.md +84 -80
  576. package/src/skills/sonamu/entity-validation-checklist.md +19 -15
  577. package/src/skills/sonamu/fixture-cli.md +52 -30
  578. package/src/skills/sonamu/framework-change.md +9 -7
  579. package/src/skills/sonamu/frontend.md +64 -82
  580. package/src/skills/sonamu/i18n.md +45 -37
  581. package/src/skills/sonamu/migration.md +54 -31
  582. package/src/skills/sonamu/model.md +98 -66
  583. package/src/skills/sonamu/naite.md +34 -32
  584. package/src/skills/sonamu/project-init.md +28 -8
  585. package/src/skills/sonamu/puri.md +82 -91
  586. package/src/skills/sonamu/scaffolding.md +44 -32
  587. package/src/skills/sonamu/skill-contribution.md +50 -45
  588. package/src/skills/sonamu/subset.md +13 -13
  589. package/src/skills/sonamu/tasks.md +73 -58
  590. package/src/skills/sonamu/testing-devrunner.md +56 -36
  591. package/src/skills/sonamu/testing.md +23 -58
  592. package/src/skills/sonamu/upsert.md +32 -31
  593. package/src/skills/sonamu/vector.md +37 -36
  594. package/src/ssr/index.ts +2 -12
  595. package/src/ssr/registry.ts +1 -1
  596. package/src/ssr/renderer.ts +7 -5
  597. package/src/ssr/types.ts +2 -2
  598. package/src/storage/buffered-file.ts +4 -2
  599. package/src/storage/drivers.ts +3 -2
  600. package/src/storage/s3-driver.ts +7 -4
  601. package/src/storage/storage-manager.ts +3 -2
  602. package/src/storage/types.ts +3 -2
  603. package/src/storage/uploaded-file.ts +1 -1
  604. package/src/stream/sse.ts +2 -2
  605. package/src/syncer/api-parser.ts +8 -5
  606. package/src/syncer/checksum.ts +9 -5
  607. package/src/syncer/code-generator.ts +16 -8
  608. package/src/syncer/entity-operations.ts +5 -3
  609. package/src/syncer/file-patterns.ts +2 -1
  610. package/src/syncer/module-loader.ts +9 -6
  611. package/src/syncer/syncer-actions.ts +5 -3
  612. package/src/syncer/syncer.ts +18 -24
  613. package/src/tasks/decorator.ts +10 -8
  614. package/src/tasks/step-wrapper.ts +1 -1
  615. package/src/tasks/workflow-manager.ts +18 -15
  616. package/src/template/__tests__/generated.template.search-text.test.ts +1 -0
  617. package/src/template/entity-converter.ts +4 -2
  618. package/src/template/generated.template.test-d.ts +2 -1
  619. package/src/template/helpers.ts +5 -2
  620. package/src/template/implementations/entity.template.ts +9 -8
  621. package/src/template/implementations/entry-server.template.ts +1 -1
  622. package/src/template/implementations/generated.template.ts +21 -29
  623. package/src/template/implementations/generated_http.template.ts +9 -6
  624. package/src/template/implementations/generated_sso.template.ts +6 -4
  625. package/src/template/implementations/init_types.template.ts +3 -2
  626. package/src/template/implementations/model.template.ts +4 -2
  627. package/src/template/implementations/model_test.template.ts +3 -2
  628. package/src/template/implementations/queries.template.ts +6 -14
  629. package/src/template/implementations/sd.template.ts +4 -2
  630. package/src/template/implementations/services.template.ts +7 -11
  631. package/src/template/implementations/view_form.template.ts +5 -3
  632. package/src/template/implementations/view_id_all_select.template.ts +3 -2
  633. package/src/template/implementations/view_list.template.ts +7 -5
  634. package/src/template/implementations/view_search_input.template.ts +3 -2
  635. package/src/template/template-manager.ts +4 -3
  636. package/src/template/template.ts +4 -3
  637. package/src/template/zod-converter.ts +10 -7
  638. package/src/testing/__tests__/dev-test-routes.test.ts +3 -2
  639. package/src/testing/__tests__/dev-vitest-manager.test.ts +1 -0
  640. package/src/testing/_relation-graph.ts +2 -2
  641. package/src/testing/bootstrap.ts +55 -27
  642. package/src/testing/data-explorer.ts +5 -4
  643. package/src/testing/dev-test-routes.ts +8 -5
  644. package/src/testing/dev-vitest-manager.ts +13 -12
  645. package/src/testing/fixture-generator.ts +11 -17
  646. package/src/testing/fixture-manager.ts +21 -17
  647. package/src/testing/parallel-db-manager.ts +2 -1
  648. package/src/testing/vitest-helpers.ts +2 -1
  649. package/src/types/__tests__/entity-json-schema-search-text.test.ts +1 -0
  650. package/src/types/types.ts +8 -8
  651. package/src/typings/knex.d.ts +4 -4
  652. package/src/ui/ai-api.ts +5 -3
  653. package/src/ui/ai-client.ts +6 -5
  654. package/src/ui/api.ts +25 -23
  655. package/src/ui/cdd-service.ts +12 -11
  656. package/src/utils/console-util.ts +3 -1
  657. package/src/utils/formatter.ts +94 -102
  658. package/src/utils/fs-utils.ts +2 -1
  659. package/src/utils/model.ts +2 -2
  660. package/src/utils/object-utils.ts +3 -3
  661. package/src/utils/process-utils.ts +2 -1
  662. package/src/utils/sql-parser.ts +10 -1
  663. package/src/utils/type-utils.ts +3 -3
  664. package/src/utils/utils.ts +9 -7
  665. package/src/utils/zod-error.ts +1 -1
  666. package/src/vector/chunking.ts +1 -1
  667. package/src/vector/config.ts +1 -1
  668. package/src/vector/embedding.ts +11 -9
  669. package/tsdown.api.config.ts +50 -0
  670. package/.swcrc.project-default +0 -18
  671. package/dist/api/__tests__/config.test.js +0 -189
  672. package/dist/bin/__tests__/test-command.test.js +0 -112
  673. package/dist/bin/__tests__/ts-loader-register.test.js +0 -45
  674. package/dist/database/puri-subset.test-d.js +0 -89
  675. package/dist/database/puri.types.test-d.js +0 -129
  676. package/dist/migration/__tests__/code-generation.search-text.test.js +0 -435
  677. package/dist/template/__tests__/generated.template.search-text.test.js +0 -99
  678. package/dist/template/generated.template.test-d.js +0 -24
  679. package/dist/testing/__tests__/dev-test-routes.test.js +0 -144
  680. package/dist/testing/__tests__/dev-vitest-manager.test.js +0 -152
  681. package/dist/types/__tests__/entity-json-schema-search-text.test.js +0 -256
  682. package/dist/typings/knex.d.js +0 -3
  683. package/dist/ui-web/assets/index-CKo0Z2Iu.css +0 -1
  684. package/dist/ui-web/assets/index-DK-2aacv.js +0 -257
@@ -1,268 +1,275 @@
1
+ import { createKnexInstance, init_knex } from "../database/knex.js";
2
+ import { DB, init_db } from "../database/db.js";
3
+ import { Sonamu, init_sonamu } from "../api/sonamu.js";
4
+ import { EntityManager, init_entity_manager } from "../entity/entity-manager.js";
5
+ import { DataExplorer, init_data_explorer } from "../testing/data-explorer.js";
6
+ import { FixtureGenerator, init_fixture_generator } from "../testing/fixture-generator.js";
1
7
  import chalk from "chalk";
2
8
  import prompts from "prompts";
3
- import { Sonamu } from "../api/index.js";
4
- import { DB } from "../database/db.js";
5
- import { createKnexInstance } from "../database/knex.js";
6
- import { EntityManager } from "../entity/entity-manager.js";
7
- import { DataExplorer } from "../testing/data-explorer.js";
8
- import { FixtureGenerator } from "../testing/fixture-generator.js";
9
+
10
+ //#region src/bin/fixture.ts
11
+ init_sonamu();
12
+ init_db();
13
+ init_knex();
14
+ init_entity_manager();
15
+ init_data_explorer();
16
+ init_fixture_generator();
9
17
  /**
10
- * fixture gen 명령어 - cone 메타데이터를 활용하여 자동으로 fixture를 생성합니다.
11
- */ export async function fixtureGenCommand(options) {
12
- try {
13
- if (!EntityManager.isAutoloaded) {
14
- await EntityManager.autoload();
15
- }
16
- let entityNames;
17
- if (options.all) {
18
- entityNames = EntityManager.getAllIds();
19
- if (options.exclude) {
20
- const excludeList = options.exclude.split(",").map((s)=>s.trim());
21
- entityNames = entityNames.filter((name)=>!excludeList.includes(name));
22
- }
23
- } else if (options.include) {
24
- entityNames = options.include.split(",").map((s)=>s.trim());
25
- } else {
26
- const result = await prompts({
27
- type: "multiselect",
28
- name: "entities",
29
- message: "Fixture를 생성할 Entity를 선택하세요:",
30
- choices: EntityManager.getAllIds().map((id)=>({
31
- title: id,
32
- value: id
33
- })),
34
- min: 1
35
- });
36
- if (!result.entities || result.entities.length === 0) {
37
- console.log(chalk.yellow("취소되었습니다."));
38
- return;
39
- }
40
- entityNames = result.entities;
41
- }
42
- let count = options.count ? Number.parseInt(options.count, 10) : 5;
43
- if (!options.count) {
44
- const result = await prompts({
45
- type: "number",
46
- name: "count",
47
- message: "각 Entity별 생성 개수:",
48
- initial: 5,
49
- min: 1
50
- });
51
- if (!result.count) {
52
- console.log(chalk.yellow("취소되었습니다."));
53
- return;
54
- }
55
- count = result.count;
56
- }
57
- let saveTarget = options["save-to"] || "db";
58
- if (!options["save-to"]) {
59
- const result = await prompts({
60
- type: "select",
61
- name: "saveTarget",
62
- message: "저장 방식:",
63
- choices: [
64
- {
65
- title: "Fixture DB에 저장",
66
- value: "db"
67
- },
68
- {
69
- title: "파일로 저장 (자동 파일명)",
70
- value: "file"
71
- },
72
- {
73
- title: "파일로 저장 (파일명 지정)",
74
- value: "file:custom"
75
- },
76
- {
77
- title: "저장 안 함 (출력만)",
78
- value: "none"
79
- }
80
- ]
81
- });
82
- saveTarget = result.saveTarget;
83
- if (saveTarget === "file:custom") {
84
- const filenameResult = await prompts({
85
- type: "text",
86
- name: "filename",
87
- message: "파일명:",
88
- initial: "fixtures.json"
89
- });
90
- if (!filenameResult.filename) {
91
- console.log(chalk.yellow("취소되었습니다."));
92
- return;
93
- }
94
- saveTarget = `file:${filenameResult.filename}`;
95
- }
96
- }
97
- // LLM 사용 여부 결정
98
- let useLLM = options["use-llm"] ?? false;
99
- if (!options["use-llm"]) {
100
- const llmResult = await prompts({
101
- type: "confirm",
102
- name: "useLLM",
103
- message: "LLM으로 더 현실적인 데이터를 생성할까요? (fixtureHint 기반, ANTHROPIC_API_KEY 필요)",
104
- initial: false
105
- });
106
- useLLM = llmResult.useLLM ?? false;
107
- }
108
- const enableLLMCache = !options["no-cache"];
109
- // fixture gen: fixture DB 내에서 참조 관계를 해결하고 저장합니다
110
- const fixtureDb = createKnexInstance(Sonamu.dbConfig.fixture);
111
- const generator = new FixtureGenerator(fixtureDb, fixtureDb, "fixture", EntityManager, {
112
- useLLM,
113
- enableLLMCache
114
- });
115
- if (useLLM) {
116
- console.log(chalk.cyan(`\nLLM 모드로 ${entityNames.join(", ")} 생성 중... (캐싱: ${enableLLMCache ? "ON" : "OFF"})`));
117
- } else {
118
- console.log(chalk.cyan(`\n${entityNames.join(", ")} 생성 중...`));
119
- }
120
- const specs = entityNames.map((entityName)=>({
121
- entity: entityName,
122
- count,
123
- overrides: {}
124
- }));
125
- const results = await generator.generateBatch(specs);
126
- if (useLLM) {
127
- const stats = generator.getLLMCacheStats();
128
- console.log(chalk.cyan(`[LLM Cache] 캐시 크기: ${stats.size}`));
129
- }
130
- console.log(chalk.green(`\n✅ ${results.length}개 fixture 생성 완료`));
131
- if (saveTarget === "none") {
132
- console.log(JSON.stringify(results, null, 2));
133
- } else if (saveTarget === "db") {
134
- // generateBatch가 이미 DB에 저장했으므로 별도 저장이 불필요합니다.
135
- console.log(chalk.green("Fixture DB에 저장되었습니다."));
136
- } else if (saveTarget.startsWith("file")) {
137
- const fs = await import("node:fs/promises");
138
- const path = await import("node:path");
139
- const fixturesDir = path.join(process.cwd(), "test", "fixtures");
140
- try {
141
- await fs.access(fixturesDir);
142
- } catch {
143
- await fs.mkdir(fixturesDir, {
144
- recursive: true
145
- });
146
- }
147
- for (const entityName of entityNames){
148
- const entityResults = results.filter((r)=>r.entityId === entityName);
149
- if (entityResults.length === 0) {
150
- continue;
151
- }
152
- let filename;
153
- if (saveTarget === "file") {
154
- const entity = EntityManager.get(entityName);
155
- filename = `${entity.table}.json`;
156
- } else {
157
- filename = saveTarget.replace("file:", "");
158
- }
159
- const filepath = path.join(fixturesDir, filename);
160
- await fs.writeFile(filepath, JSON.stringify(entityResults.map((r)=>r.data), null, 2));
161
- console.log(chalk.green(`✅ ${filepath} 저장 완료`));
162
- }
163
- }
164
- } catch (error) {
165
- console.error(chalk.red("Fixture 생성 중 오류가 발생했습니다.\n" + "원인: Entity 정의나 DB 연결을 확인해주세요.\n" + "자세한 내용:"), error);
166
- throw error;
167
- }
18
+ * fixture gen 명령어 - cone 메타데이터를 활용하여 자동으로 fixture를 생성합니다.
19
+ */
20
+ async function fixtureGenCommand(options) {
21
+ try {
22
+ if (!EntityManager.isAutoloaded) {
23
+ await EntityManager.autoload();
24
+ }
25
+ let entityNames;
26
+ if (options.all) {
27
+ entityNames = EntityManager.getAllIds();
28
+ if (options.exclude) {
29
+ const excludeList = options.exclude.split(",").map((s) => s.trim());
30
+ entityNames = entityNames.filter((name) => !excludeList.includes(name));
31
+ }
32
+ } else if (options.include) {
33
+ entityNames = options.include.split(",").map((s) => s.trim());
34
+ } else {
35
+ const result = await prompts({
36
+ type: "multiselect",
37
+ name: "entities",
38
+ message: "Fixture를 생성할 Entity를 선택하세요:",
39
+ choices: EntityManager.getAllIds().map((id) => ({
40
+ title: id,
41
+ value: id
42
+ })),
43
+ min: 1
44
+ });
45
+ if (!result.entities || result.entities.length === 0) {
46
+ console.log(chalk.yellow("취소되었습니다."));
47
+ return;
48
+ }
49
+ entityNames = result.entities;
50
+ }
51
+ let count = options.count ? Number.parseInt(options.count, 10) : 5;
52
+ if (!options.count) {
53
+ const result = await prompts({
54
+ type: "number",
55
+ name: "count",
56
+ message: "각 Entity별 생성 개수:",
57
+ initial: 5,
58
+ min: 1
59
+ });
60
+ if (!result.count) {
61
+ console.log(chalk.yellow("취소되었습니다."));
62
+ return;
63
+ }
64
+ count = result.count;
65
+ }
66
+ let saveTarget = options["save-to"] || "db";
67
+ if (!options["save-to"]) {
68
+ const result = await prompts({
69
+ type: "select",
70
+ name: "saveTarget",
71
+ message: "저장 방식:",
72
+ choices: [
73
+ {
74
+ title: "Fixture DB에 저장",
75
+ value: "db"
76
+ },
77
+ {
78
+ title: "파일로 저장 (자동 파일명)",
79
+ value: "file"
80
+ },
81
+ {
82
+ title: "파일로 저장 (파일명 지정)",
83
+ value: "file:custom"
84
+ },
85
+ {
86
+ title: "저장 안 함 (출력만)",
87
+ value: "none"
88
+ }
89
+ ]
90
+ });
91
+ saveTarget = result.saveTarget;
92
+ if (saveTarget === "file:custom") {
93
+ const filenameResult = await prompts({
94
+ type: "text",
95
+ name: "filename",
96
+ message: "파일명:",
97
+ initial: "fixtures.json"
98
+ });
99
+ if (!filenameResult.filename) {
100
+ console.log(chalk.yellow("취소되었습니다."));
101
+ return;
102
+ }
103
+ saveTarget = `file:${filenameResult.filename}`;
104
+ }
105
+ }
106
+ let useLLM = options["use-llm"] ?? false;
107
+ if (!options["use-llm"]) {
108
+ const llmResult = await prompts({
109
+ type: "confirm",
110
+ name: "useLLM",
111
+ message: "LLM으로 더 현실적인 데이터를 생성할까요? (fixtureHint 기반, ANTHROPIC_API_KEY 필요)",
112
+ initial: false
113
+ });
114
+ useLLM = llmResult.useLLM ?? false;
115
+ }
116
+ const enableLLMCache = !options["no-cache"];
117
+ const fixtureDb = createKnexInstance(Sonamu.dbConfig.fixture);
118
+ const generator = new FixtureGenerator(fixtureDb, fixtureDb, "fixture", EntityManager, {
119
+ useLLM,
120
+ enableLLMCache
121
+ });
122
+ if (useLLM) {
123
+ console.log(chalk.cyan(`\nLLM 모드로 ${entityNames.join(", ")} 생성 중... (캐싱: ${enableLLMCache ? "ON" : "OFF"})`));
124
+ } else {
125
+ console.log(chalk.cyan(`\n${entityNames.join(", ")} 생성 중...`));
126
+ }
127
+ const specs = entityNames.map((entityName) => ({
128
+ entity: entityName,
129
+ count,
130
+ overrides: {}
131
+ }));
132
+ const results = await generator.generateBatch(specs);
133
+ if (useLLM) {
134
+ const stats = generator.getLLMCacheStats();
135
+ console.log(chalk.cyan(`[LLM Cache] 캐시 크기: ${stats.size}`));
136
+ }
137
+ console.log(chalk.green(`\n✅ ${results.length}개 fixture 생성 완료`));
138
+ if (saveTarget === "none") {
139
+ console.log(JSON.stringify(results, null, 2));
140
+ } else if (saveTarget === "db") {
141
+ console.log(chalk.green("Fixture DB에 저장되었습니다."));
142
+ } else if (saveTarget.startsWith("file")) {
143
+ const fs = await import("node:fs/promises");
144
+ const path = await import("node:path");
145
+ const fixturesDir = path.join(process.cwd(), "test", "fixtures");
146
+ try {
147
+ await fs.access(fixturesDir);
148
+ } catch {
149
+ await fs.mkdir(fixturesDir, { recursive: true });
150
+ }
151
+ for (const entityName of entityNames) {
152
+ const entityResults = results.filter((r) => r.entityId === entityName);
153
+ if (entityResults.length === 0) {
154
+ continue;
155
+ }
156
+ let filename;
157
+ if (saveTarget === "file") {
158
+ const entity = EntityManager.get(entityName);
159
+ filename = `${entity.table}.json`;
160
+ } else {
161
+ filename = saveTarget.replace("file:", "");
162
+ }
163
+ const filepath = path.join(fixturesDir, filename);
164
+ await fs.writeFile(filepath, JSON.stringify(entityResults.map((r) => r.data), null, 2));
165
+ console.log(chalk.green(`✅ ${filepath} 저장 완료`));
166
+ }
167
+ }
168
+ } catch (error) {
169
+ console.error(chalk.red("Fixture 생성 오류가 발생했습니다.\n" + "원인: Entity 정의나 DB 연결을 확인해주세요.\n" + "자세한 내용:"), error);
170
+ throw error;
171
+ }
168
172
  }
169
173
  /**
170
- * fixture fetch 명령어 - 실제 운영 DB에서 데이터를 가져와 fixture로 저장합니다.
171
- * 관계된 데이터도 함께 가져오므로 현실적인 테스트 데이터를 확보할 수 있습니다.
172
- */ export async function fixtureFetchCommand(options) {
173
- try {
174
- if (!EntityManager.isAutoloaded) {
175
- await EntityManager.autoload();
176
- }
177
- let entityNames;
178
- if (options.all) {
179
- entityNames = EntityManager.getAllIds();
180
- if (options.exclude) {
181
- const excludeList = options.exclude.split(",").map((s)=>s.trim());
182
- entityNames = entityNames.filter((name)=>!excludeList.includes(name));
183
- }
184
- } else if (options.include) {
185
- entityNames = options.include.split(",").map((s)=>s.trim());
186
- } else {
187
- const result = await prompts({
188
- type: "multiselect",
189
- name: "entities",
190
- message: "Import할 Entity를 선택하세요:",
191
- choices: EntityManager.getAllIds().map((id)=>({
192
- title: id,
193
- value: id
194
- })),
195
- min: 1
196
- });
197
- if (!result.entities || result.entities.length === 0) {
198
- console.log(chalk.yellow("취소되었습니다."));
199
- return;
200
- }
201
- entityNames = result.entities;
202
- }
203
- const strategy = options.strategy ?? "recent";
204
- const limit = options.limit ? Number.parseInt(options.limit, 10) : 10;
205
- // fixture fetch: production 데이터를 fixture DB로 import합니다
206
- const sourceDb = DB.getDB("r"); // production_master (또는 development_master)
207
- const fixtureDb = createKnexInstance(Sonamu.dbConfig.fixture);
208
- const generator = new FixtureGenerator(sourceDb, fixtureDb, "fixture", EntityManager);
209
- console.log(chalk.cyan(`\n${entityNames.join(", ")} import 중...`));
210
- for (const entityName of entityNames){
211
- const results = await generator.importFromSource(entityName, {
212
- strategy,
213
- limit,
214
- includeRelations: true,
215
- maxDepth: 2
216
- });
217
- console.log(chalk.green(`✅ ${entityName}: ${results.length}개 import 완료`));
218
- }
219
- } catch (error) {
220
- console.error(chalk.red("실제 DB에서 데이터를 가져오는 중 오류가 발생했습니다.\n" + "원인: 소스 DB 연결 설정(sonamu.config.ts)이나 Entity 관계 정의를 확인해주세요.\n" + "자세한 내용:"), error);
221
- throw error;
222
- }
174
+ * fixture fetch 명령어 - 실제 운영 DB에서 데이터를 가져와 fixture로 저장합니다.
175
+ * 관계된 데이터도 함께 가져오므로 현실적인 테스트 데이터를 확보할 수 있습니다.
176
+ */
177
+ async function fixtureFetchCommand(options) {
178
+ try {
179
+ if (!EntityManager.isAutoloaded) {
180
+ await EntityManager.autoload();
181
+ }
182
+ let entityNames;
183
+ if (options.all) {
184
+ entityNames = EntityManager.getAllIds();
185
+ if (options.exclude) {
186
+ const excludeList = options.exclude.split(",").map((s) => s.trim());
187
+ entityNames = entityNames.filter((name) => !excludeList.includes(name));
188
+ }
189
+ } else if (options.include) {
190
+ entityNames = options.include.split(",").map((s) => s.trim());
191
+ } else {
192
+ const result = await prompts({
193
+ type: "multiselect",
194
+ name: "entities",
195
+ message: "Import할 Entity를 선택하세요:",
196
+ choices: EntityManager.getAllIds().map((id) => ({
197
+ title: id,
198
+ value: id
199
+ })),
200
+ min: 1
201
+ });
202
+ if (!result.entities || result.entities.length === 0) {
203
+ console.log(chalk.yellow("취소되었습니다."));
204
+ return;
205
+ }
206
+ entityNames = result.entities;
207
+ }
208
+ const strategy = options.strategy ?? "recent";
209
+ const limit = options.limit ? Number.parseInt(options.limit, 10) : 10;
210
+ const sourceDb = DB.getDB("r");
211
+ const fixtureDb = createKnexInstance(Sonamu.dbConfig.fixture);
212
+ const generator = new FixtureGenerator(sourceDb, fixtureDb, "fixture", EntityManager);
213
+ console.log(chalk.cyan(`\n${entityNames.join(", ")} import 중...`));
214
+ for (const entityName of entityNames) {
215
+ const results = await generator.importFromSource(entityName, {
216
+ strategy,
217
+ limit,
218
+ includeRelations: true,
219
+ maxDepth: 2
220
+ });
221
+ console.log(chalk.green(`✅ ${entityName}: ${results.length}개 import 완료`));
222
+ }
223
+ } catch (error) {
224
+ console.error(chalk.red("실제 DB에서 데이터를 가져오는 중 오류가 발생했습니다.\n" + "원인: 소스 DB 연결 설정(sonamu.config.ts)이나 Entity 관계 정의를 확인해주세요.\n" + "자세한 내용:"), error);
225
+ throw error;
226
+ }
223
227
  }
224
228
  /**
225
- * fixture explore 명령어 - DB의 실제 데이터를 조회하여 확인합니다.
226
- * 저장하지 않고 조회만 하므로 데이터를 빠르게 확인할 때 유용합니다.
227
- */ export async function fixtureExploreCommand(options) {
228
- try {
229
- if (!EntityManager.isAutoloaded) {
230
- await EntityManager.autoload();
231
- }
232
- let entityName = options.include;
233
- if (!entityName) {
234
- const result = await prompts({
235
- type: "select",
236
- name: "entity",
237
- message: "탐색할 Entity:",
238
- choices: EntityManager.getAllIds().map((id)=>({
239
- title: id,
240
- value: id
241
- }))
242
- });
243
- if (!result.entity) {
244
- console.log(chalk.yellow("취소되었습니다."));
245
- return;
246
- }
247
- entityName = result.entity;
248
- }
249
- if (!entityName) {
250
- throw new Error("Entity name is required");
251
- }
252
- const strategy = options.strategy ?? "sample";
253
- const limit = options.limit ? Number.parseInt(options.limit, 10) : 10;
254
- const db = DB.getDB("r");
255
- const explorer = new DataExplorer(db, EntityManager);
256
- const data = await explorer.explore(entityName, {
257
- strategy,
258
- limit
259
- });
260
- console.log(chalk.cyan(`\n${entityName} ${data.length}개 조회 완료:`));
261
- console.table(data);
262
- } catch (error) {
263
- console.error(chalk.red("데이터 조회 중 오류가 발생했습니다.\n" + "원인: DB 연결이나 Entity 정의를 확인해주세요.\n" + "자세한 내용:"), error);
264
- throw error;
265
- }
229
+ * fixture explore 명령어 - DB의 실제 데이터를 조회하여 확인합니다.
230
+ * 저장하지 않고 조회만 하므로 데이터를 빠르게 확인할 때 유용합니다.
231
+ */
232
+ async function fixtureExploreCommand(options) {
233
+ try {
234
+ if (!EntityManager.isAutoloaded) {
235
+ await EntityManager.autoload();
236
+ }
237
+ let entityName = options.include;
238
+ if (!entityName) {
239
+ const result = await prompts({
240
+ type: "select",
241
+ name: "entity",
242
+ message: "탐색할 Entity:",
243
+ choices: EntityManager.getAllIds().map((id) => ({
244
+ title: id,
245
+ value: id
246
+ }))
247
+ });
248
+ if (!result.entity) {
249
+ console.log(chalk.yellow("취소되었습니다."));
250
+ return;
251
+ }
252
+ entityName = result.entity;
253
+ }
254
+ if (!entityName) {
255
+ throw new Error("Entity name is required");
256
+ }
257
+ const strategy = options.strategy ?? "sample";
258
+ const limit = options.limit ? Number.parseInt(options.limit, 10) : 10;
259
+ const db = DB.getDB("r");
260
+ const explorer = new DataExplorer(db, EntityManager);
261
+ const data = await explorer.explore(entityName, {
262
+ strategy,
263
+ limit
264
+ });
265
+ console.log(chalk.cyan(`\n${entityName} ${data.length}개 조회 완료:`));
266
+ console.table(data);
267
+ } catch (error) {
268
+ console.error(chalk.red("데이터 조회 중 오류가 발생했습니다.\n" + "원인: DB 연결이나 Entity 정의를 확인해주세요.\n" + "자세한 내용:"), error);
269
+ throw error;
270
+ }
266
271
  }
267
272
 
268
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vZml4dHVyZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgcHJvbXB0cyBmcm9tIFwicHJvbXB0c1wiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaVwiO1xuaW1wb3J0IHsgREIgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IGNyZWF0ZUtuZXhJbnN0YW5jZSB9IGZyb20gXCIuLi9kYXRhYmFzZS9rbmV4XCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgRGF0YUV4cGxvcmVyLCB0eXBlIERhdGFFeHBsb3JlclN0cmF0ZWd5IH0gZnJvbSBcIi4uL3Rlc3RpbmcvZGF0YS1leHBsb3JlclwiO1xuaW1wb3J0IHsgRml4dHVyZUdlbmVyYXRvciB9IGZyb20gXCIuLi90ZXN0aW5nL2ZpeHR1cmUtZ2VuZXJhdG9yXCI7XG5cbmludGVyZmFjZSBGaXh0dXJlQ29tbWFuZE9wdGlvbnMge1xuICBfPzogc3RyaW5nW107XG4gIGFsbD86IGJvb2xlYW47XG4gIGluY2x1ZGU/OiBzdHJpbmc7XG4gIGV4Y2x1ZGU/OiBzdHJpbmc7XG4gIGNvdW50Pzogc3RyaW5nO1xuICBcInNhdmUtdG9cIj86IHN0cmluZztcbiAgc3RyYXRlZ3k/OiBEYXRhRXhwbG9yZXJTdHJhdGVneTtcbiAgbGltaXQ/OiBzdHJpbmc7XG4gIFwidXNlLWxsbVwiPzogYm9vbGVhbjtcbiAgXCJuby1jYWNoZVwiPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBmaXh0dXJlIGdlbiDrqoXroLnslrQgLSBjb25lIOuplO2DgOuNsOydtO2EsOulvCDtmZzsmqntlZjsl6wg7J6Q64+Z7Jy866GcIGZpeHR1cmXrpbwg7IOd7ISx7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4dHVyZUdlbkNvbW1hbmQob3B0aW9uczogRml4dHVyZUNvbW1hbmRPcHRpb25zKSB7XG4gIHRyeSB7XG4gICAgaWYgKCFFbnRpdHlNYW5hZ2VyLmlzQXV0b2xvYWRlZCkge1xuICAgICAgYXdhaXQgRW50aXR5TWFuYWdlci5hdXRvbG9hZCgpO1xuICAgIH1cblxuICAgIGxldCBlbnRpdHlOYW1lczogc3RyaW5nW107XG5cbiAgICBpZiAob3B0aW9ucy5hbGwpIHtcbiAgICAgIGVudGl0eU5hbWVzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICAgIGlmIChvcHRpb25zLmV4Y2x1ZGUpIHtcbiAgICAgICAgY29uc3QgZXhjbHVkZUxpc3QgPSBvcHRpb25zLmV4Y2x1ZGUuc3BsaXQoXCIsXCIpLm1hcCgoczogc3RyaW5nKSA9PiBzLnRyaW0oKSk7XG4gICAgICAgIGVudGl0eU5hbWVzID0gZW50aXR5TmFtZXMuZmlsdGVyKChuYW1lKSA9PiAhZXhjbHVkZUxpc3QuaW5jbHVkZXMobmFtZSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5pbmNsdWRlKSB7XG4gICAgICBlbnRpdHlOYW1lcyA9IG9wdGlvbnMuaW5jbHVkZS5zcGxpdChcIixcIikubWFwKChzOiBzdHJpbmcpID0+IHMudHJpbSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgIHR5cGU6IFwibXVsdGlzZWxlY3RcIixcbiAgICAgICAgbmFtZTogXCJlbnRpdGllc1wiLFxuICAgICAgICBtZXNzYWdlOiBcIkZpeHR1cmXrpbwg7IOd7ISx7ZWgIEVudGl0eeulvCDshKDtg53tlZjshLjsmpQ6XCIsXG4gICAgICAgIGNob2ljZXM6IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCkubWFwKChpZCkgPT4gKHsgdGl0bGU6IGlkLCB2YWx1ZTogaWQgfSkpLFxuICAgICAgICBtaW46IDEsXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXN1bHQuZW50aXRpZXMgfHwgcmVzdWx0LmVudGl0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCLst6jshozrkJjsl4jsirXri4jri6QuXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBlbnRpdHlOYW1lcyA9IHJlc3VsdC5lbnRpdGllcztcbiAgICB9XG5cbiAgICBsZXQgY291bnQgPSBvcHRpb25zLmNvdW50ID8gTnVtYmVyLnBhcnNlSW50KG9wdGlvbnMuY291bnQsIDEwKSA6IDU7XG4gICAgaWYgKCFvcHRpb25zLmNvdW50KSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgbmFtZTogXCJjb3VudFwiLFxuICAgICAgICBtZXNzYWdlOiBcIuqwgSBFbnRpdHnrs4Qg7IOd7ISxIOqwnOyImDpcIixcbiAgICAgICAgaW5pdGlhbDogNSxcbiAgICAgICAgbWluOiAxLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzdWx0LmNvdW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIuy3qOyGjOuQmOyXiOyKteuLiOuLpC5cIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvdW50ID0gcmVzdWx0LmNvdW50O1xuICAgIH1cblxuICAgIGxldCBzYXZlVGFyZ2V0ID0gb3B0aW9uc1tcInNhdmUtdG9cIl0gfHwgXCJkYlwiO1xuICAgIGlmICghb3B0aW9uc1tcInNhdmUtdG9cIl0pIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb21wdHMoe1xuICAgICAgICB0eXBlOiBcInNlbGVjdFwiLFxuICAgICAgICBuYW1lOiBcInNhdmVUYXJnZXRcIixcbiAgICAgICAgbWVzc2FnZTogXCLsoIDsnqUg67Cp7IudOlwiLFxuICAgICAgICBjaG9pY2VzOiBbXG4gICAgICAgICAgeyB0aXRsZTogXCJGaXh0dXJlIERC7JeQIOyggOyepVwiLCB2YWx1ZTogXCJkYlwiIH0sXG4gICAgICAgICAgeyB0aXRsZTogXCLtjIzsnbzroZwg7KCA7J6lICjsnpDrj5kg7YyM7J2866qFKVwiLCB2YWx1ZTogXCJmaWxlXCIgfSxcbiAgICAgICAgICB7IHRpdGxlOiBcIu2MjOydvOuhnCDsoIDsnqUgKO2MjOydvOuqhSDsp4DsoJUpXCIsIHZhbHVlOiBcImZpbGU6Y3VzdG9tXCIgfSxcbiAgICAgICAgICB7IHRpdGxlOiBcIuyggOyepSDslYgg7ZWoICjstpzroKXrp4wpXCIsIHZhbHVlOiBcIm5vbmVcIiB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIHNhdmVUYXJnZXQgPSByZXN1bHQuc2F2ZVRhcmdldDtcblxuICAgICAgaWYgKHNhdmVUYXJnZXQgPT09IFwiZmlsZTpjdXN0b21cIikge1xuICAgICAgICBjb25zdCBmaWxlbmFtZVJlc3VsdCA9IGF3YWl0IHByb21wdHMoe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIG5hbWU6IFwiZmlsZW5hbWVcIixcbiAgICAgICAgICBtZXNzYWdlOiBcIu2MjOydvOuqhTpcIixcbiAgICAgICAgICBpbml0aWFsOiBcImZpeHR1cmVzLmpzb25cIixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFmaWxlbmFtZVJlc3VsdC5maWxlbmFtZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIuy3qOyGjOuQmOyXiOyKteuLiOuLpC5cIikpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNhdmVUYXJnZXQgPSBgZmlsZToke2ZpbGVuYW1lUmVzdWx0LmZpbGVuYW1lfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTExNIOyCrOyaqSDsl6zrtoAg6rKw7KCVXG4gICAgbGV0IHVzZUxMTSA9IG9wdGlvbnNbXCJ1c2UtbGxtXCJdID8/IGZhbHNlO1xuICAgIGlmICghb3B0aW9uc1tcInVzZS1sbG1cIl0pIHtcbiAgICAgIGNvbnN0IGxsbVJlc3VsdCA9IGF3YWl0IHByb21wdHMoe1xuICAgICAgICB0eXBlOiBcImNvbmZpcm1cIixcbiAgICAgICAgbmFtZTogXCJ1c2VMTE1cIixcbiAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICBcIkxMTeycvOuhnCDrjZQg7ZiE7Iuk7KCB7J24IOuNsOydtO2EsOulvCDsg53shLHtlaDquYzsmpQ/IChmaXh0dXJlSGludCDquLDrsJgsIEFOVEhST1BJQ19BUElfS0VZIO2VhOyalClcIixcbiAgICAgICAgaW5pdGlhbDogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIHVzZUxMTSA9IGxsbVJlc3VsdC51c2VMTE0gPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZW5hYmxlTExNQ2FjaGUgPSAhb3B0aW9uc1tcIm5vLWNhY2hlXCJdO1xuXG4gICAgLy8gZml4dHVyZSBnZW46IGZpeHR1cmUgREIg64K07JeQ7IScIOywuOyhsCDqtIDqs4Trpbwg7ZW06rKw7ZWY6rOgIOyggOyepe2VqeuLiOuLpFxuICAgIGNvbnN0IGZpeHR1cmVEYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWcuZml4dHVyZSk7XG4gICAgY29uc3QgZ2VuZXJhdG9yID0gbmV3IEZpeHR1cmVHZW5lcmF0b3IoZml4dHVyZURiLCBmaXh0dXJlRGIsIFwiZml4dHVyZVwiLCBFbnRpdHlNYW5hZ2VyLCB7XG4gICAgICB1c2VMTE0sXG4gICAgICBlbmFibGVMTE1DYWNoZSxcbiAgICB9KTtcblxuICAgIGlmICh1c2VMTE0pIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay5jeWFuKFxuICAgICAgICAgIGBcXG5MTE0g66qo65Oc66GcICR7ZW50aXR5TmFtZXMuam9pbihcIiwgXCIpfSDsg53shLEg7KSRLi4uICjsupDsi7E6ICR7ZW5hYmxlTExNQ2FjaGUgPyBcIk9OXCIgOiBcIk9GRlwifSlgLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgXFxuJHtlbnRpdHlOYW1lcy5qb2luKFwiLCBcIil9IOyDneyEsSDspJEuLi5gKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3BlY3MgPSBlbnRpdHlOYW1lcy5tYXAoKGVudGl0eU5hbWUpID0+ICh7XG4gICAgICBlbnRpdHk6IGVudGl0eU5hbWUsXG4gICAgICBjb3VudCxcbiAgICAgIG92ZXJyaWRlczoge30sXG4gICAgfSkpO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IGdlbmVyYXRvci5nZW5lcmF0ZUJhdGNoKHNwZWNzKTtcblxuICAgIGlmICh1c2VMTE0pIHtcbiAgICAgIGNvbnN0IHN0YXRzID0gZ2VuZXJhdG9yLmdldExMTUNhY2hlU3RhdHMoKTtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oYFtMTE0gQ2FjaGVdIOy6kOyLnCDtgazquLA6ICR7c3RhdHMuc2l6ZX1gKSk7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYFxcbuKchSAke3Jlc3VsdHMubGVuZ3RofeqwnCBmaXh0dXJlIOyDneyEsSDsmYTro4xgKSk7XG5cbiAgICBpZiAoc2F2ZVRhcmdldCA9PT0gXCJub25lXCIpIHtcbiAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlc3VsdHMsIG51bGwsIDIpKTtcbiAgICB9IGVsc2UgaWYgKHNhdmVUYXJnZXQgPT09IFwiZGJcIikge1xuICAgICAgLy8gZ2VuZXJhdGVCYXRjaOqwgCDsnbTrr7ggRELsl5Ag7KCA7J6l7ZaI7Jy866+A66GcIOuzhOuPhCDsoIDsnqXsnbQg67aI7ZWE7JqU7ZWp64uI64ukLlxuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oXCJGaXh0dXJlIERC7JeQIOyggOyepeuQmOyXiOyKteuLiOuLpC5cIikpO1xuICAgIH0gZWxzZSBpZiAoc2F2ZVRhcmdldC5zdGFydHNXaXRoKFwiZmlsZVwiKSkge1xuICAgICAgY29uc3QgZnMgPSBhd2FpdCBpbXBvcnQoXCJub2RlOmZzL3Byb21pc2VzXCIpO1xuICAgICAgY29uc3QgcGF0aCA9IGF3YWl0IGltcG9ydChcIm5vZGU6cGF0aFwiKTtcblxuICAgICAgY29uc3QgZml4dHVyZXNEaXIgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJ0ZXN0XCIsIFwiZml4dHVyZXNcIik7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5hY2Nlc3MoZml4dHVyZXNEaXIpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKGZpeHR1cmVzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBlbnRpdHlOYW1lIG9mIGVudGl0eU5hbWVzKSB7XG4gICAgICAgIGNvbnN0IGVudGl0eVJlc3VsdHMgPSByZXN1bHRzLmZpbHRlcigocikgPT4gci5lbnRpdHlJZCA9PT0gZW50aXR5TmFtZSk7XG5cbiAgICAgICAgaWYgKGVudGl0eVJlc3VsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZmlsZW5hbWU6IHN0cmluZztcbiAgICAgICAgaWYgKHNhdmVUYXJnZXQgPT09IFwiZmlsZVwiKSB7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5TmFtZSk7XG4gICAgICAgICAgZmlsZW5hbWUgPSBgJHtlbnRpdHkudGFibGV9Lmpzb25gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbGVuYW1lID0gc2F2ZVRhcmdldC5yZXBsYWNlKFwiZmlsZTpcIiwgXCJcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWxlcGF0aCA9IHBhdGguam9pbihmaXh0dXJlc0RpciwgZmlsZW5hbWUpO1xuICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUoXG4gICAgICAgICAgZmlsZXBhdGgsXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBlbnRpdHlSZXN1bHRzLm1hcCgocikgPT4gci5kYXRhKSxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAyLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinIUgJHtmaWxlcGF0aH0g7KCA7J6lIOyZhOujjGApKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgXCJGaXh0dXJlIOyDneyEsSDspJEg7Jik66WY6rCAIOuwnOyDne2WiOyKteuLiOuLpC5cXG5cIiArXG4gICAgICAgICAgXCLsm5Dsnbg6IEVudGl0eSDsoJXsnZjrgpggREIg7Jew6rKw7J2EIO2ZleyduO2VtOyjvOyEuOyalC5cXG5cIiArXG4gICAgICAgICAgXCLsnpDshLjtlZwg64K07JqpOlwiLFxuICAgICAgKSxcbiAgICAgIGVycm9yLFxuICAgICk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBmaXh0dXJlIGZldGNoIOuqheugueyWtCAtIOyLpOygnCDsmrTsmIEgRELsl5DshJwg642w7J207YSw66W8IOqwgOyguOyZgCBmaXh0dXJl66GcIOyggOyepe2VqeuLiOuLpC5cbiAqIOq0gOqzhOuQnCDrjbDsnbTthLDrj4Qg7ZWo6ruYIOqwgOyguOyYpOuvgOuhnCDtmITsi6TsoIHsnbgg7YWM7Iqk7Yq4IOuNsOydtO2EsOulvCDtmZXrs7TtlaAg7IiYIOyeiOyKteuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVGZXRjaENvbW1hbmQob3B0aW9uczogRml4dHVyZUNvbW1hbmRPcHRpb25zKSB7XG4gIHRyeSB7XG4gICAgaWYgKCFFbnRpdHlNYW5hZ2VyLmlzQXV0b2xvYWRlZCkge1xuICAgICAgYXdhaXQgRW50aXR5TWFuYWdlci5hdXRvbG9hZCgpO1xuICAgIH1cblxuICAgIGxldCBlbnRpdHlOYW1lczogc3RyaW5nW107XG5cbiAgICBpZiAob3B0aW9ucy5hbGwpIHtcbiAgICAgIGVudGl0eU5hbWVzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICAgIGlmIChvcHRpb25zLmV4Y2x1ZGUpIHtcbiAgICAgICAgY29uc3QgZXhjbHVkZUxpc3QgPSBvcHRpb25zLmV4Y2x1ZGUuc3BsaXQoXCIsXCIpLm1hcCgoczogc3RyaW5nKSA9PiBzLnRyaW0oKSk7XG4gICAgICAgIGVudGl0eU5hbWVzID0gZW50aXR5TmFtZXMuZmlsdGVyKChuYW1lKSA9PiAhZXhjbHVkZUxpc3QuaW5jbHVkZXMobmFtZSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5pbmNsdWRlKSB7XG4gICAgICBlbnRpdHlOYW1lcyA9IG9wdGlvbnMuaW5jbHVkZS5zcGxpdChcIixcIikubWFwKChzOiBzdHJpbmcpID0+IHMudHJpbSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgIHR5cGU6IFwibXVsdGlzZWxlY3RcIixcbiAgICAgICAgbmFtZTogXCJlbnRpdGllc1wiLFxuICAgICAgICBtZXNzYWdlOiBcIkltcG9ydO2VoCBFbnRpdHnrpbwg7ISg7YOd7ZWY7IS47JqUOlwiLFxuICAgICAgICBjaG9pY2VzOiBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpLm1hcCgoaWQpID0+ICh7IHRpdGxlOiBpZCwgdmFsdWU6IGlkIH0pKSxcbiAgICAgICAgbWluOiAxLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzdWx0LmVudGl0aWVzIHx8IHJlc3VsdC5lbnRpdGllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwi7Leo7IaM65CY7JeI7Iq164uI64ukLlwiKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZW50aXR5TmFtZXMgPSByZXN1bHQuZW50aXRpZXM7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RyYXRlZ3k6IERhdGFFeHBsb3JlclN0cmF0ZWd5ID0gb3B0aW9ucy5zdHJhdGVneSA/PyBcInJlY2VudFwiO1xuICAgIGNvbnN0IGxpbWl0ID0gb3B0aW9ucy5saW1pdCA/IE51bWJlci5wYXJzZUludChvcHRpb25zLmxpbWl0LCAxMCkgOiAxMDtcblxuICAgIC8vIGZpeHR1cmUgZmV0Y2g6IHByb2R1Y3Rpb24g642w7J207YSw66W8IGZpeHR1cmUgRELroZwgaW1wb3J07ZWp64uI64ukXG4gICAgY29uc3Qgc291cmNlRGIgPSBEQi5nZXREQihcInJcIik7IC8vIHByb2R1Y3Rpb25fbWFzdGVyICjrmJDripQgZGV2ZWxvcG1lbnRfbWFzdGVyKVxuICAgIGNvbnN0IGZpeHR1cmVEYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWcuZml4dHVyZSk7XG4gICAgY29uc3QgZ2VuZXJhdG9yID0gbmV3IEZpeHR1cmVHZW5lcmF0b3Ioc291cmNlRGIsIGZpeHR1cmVEYiwgXCJmaXh0dXJlXCIsIEVudGl0eU1hbmFnZXIpO1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgXFxuJHtlbnRpdHlOYW1lcy5qb2luKFwiLCBcIil9IGltcG9ydCDspJEuLi5gKSk7XG5cbiAgICBmb3IgKGNvbnN0IGVudGl0eU5hbWUgb2YgZW50aXR5TmFtZXMpIHtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBnZW5lcmF0b3IuaW1wb3J0RnJvbVNvdXJjZShlbnRpdHlOYW1lLCB7XG4gICAgICAgIHN0cmF0ZWd5LFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgaW5jbHVkZVJlbGF0aW9uczogdHJ1ZSxcbiAgICAgICAgbWF4RGVwdGg6IDIsXG4gICAgICB9KTtcblxuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKchSAke2VudGl0eU5hbWV9OiAke3Jlc3VsdHMubGVuZ3RofeqwnCBpbXBvcnQg7JmE66OMYCkpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgY2hhbGsucmVkKFxuICAgICAgICBcIuyLpOygnCBEQuyXkOyEnCDrjbDsnbTthLDrpbwg6rCA7KC47Jik64qUIOykkSDsmKTrpZjqsIAg67Cc7IOd7ZaI7Iq164uI64ukLlxcblwiICtcbiAgICAgICAgICBcIuybkOyduDog7IaM7IqkIERCIOyXsOqysCDshKTsoJUoc29uYW11LmNvbmZpZy50cynsnbTrgpggRW50aXR5IOq0gOqzhCDsoJXsnZjrpbwg7ZmV7J247ZW07KO87IS47JqULlxcblwiICtcbiAgICAgICAgICBcIuyekOyEuO2VnCDrgrTsmqk6XCIsXG4gICAgICApLFxuICAgICAgZXJyb3IsXG4gICAgKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIGZpeHR1cmUgZXhwbG9yZSDrqoXroLnslrQgLSBEQuydmCDsi6TsoJwg642w7J207YSw66W8IOyhsO2ajO2VmOyXrCDtmZXsnbjtlanri4jri6QuXG4gKiDsoIDsnqXtlZjsp4Ag7JWK6rOgIOyhsO2ajOunjCDtlZjrr4DroZwg642w7J207YSw66W8IOu5oOultOqyjCDtmZXsnbjtlaAg65WMIOycoOyaqe2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVFeHBsb3JlQ29tbWFuZChvcHRpb25zOiBGaXh0dXJlQ29tbWFuZE9wdGlvbnMpIHtcbiAgdHJ5IHtcbiAgICBpZiAoIUVudGl0eU1hbmFnZXIuaXNBdXRvbG9hZGVkKSB7XG4gICAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKCk7XG4gICAgfVxuXG4gICAgbGV0IGVudGl0eU5hbWUgPSBvcHRpb25zLmluY2x1ZGU7XG5cbiAgICBpZiAoIWVudGl0eU5hbWUpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb21wdHMoe1xuICAgICAgICB0eXBlOiBcInNlbGVjdFwiLFxuICAgICAgICBuYW1lOiBcImVudGl0eVwiLFxuICAgICAgICBtZXNzYWdlOiBcIu2DkOyDie2VoCBFbnRpdHk6XCIsXG4gICAgICAgIGNob2ljZXM6IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCkubWFwKChpZCkgPT4gKHsgdGl0bGU6IGlkLCB2YWx1ZTogaWQgfSkpLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVzdWx0LmVudGl0eSkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCLst6jshozrkJjsl4jsirXri4jri6QuXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBlbnRpdHlOYW1lID0gcmVzdWx0LmVudGl0eTtcbiAgICB9XG5cbiAgICBpZiAoIWVudGl0eU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkVudGl0eSBuYW1lIGlzIHJlcXVpcmVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0cmF0ZWd5OiBEYXRhRXhwbG9yZXJTdHJhdGVneSA9IG9wdGlvbnMuc3RyYXRlZ3kgPz8gXCJzYW1wbGVcIjtcbiAgICBjb25zdCBsaW1pdCA9IG9wdGlvbnMubGltaXQgPyBOdW1iZXIucGFyc2VJbnQob3B0aW9ucy5saW1pdCwgMTApIDogMTA7XG5cbiAgICBjb25zdCBkYiA9IERCLmdldERCKFwiclwiKTtcbiAgICBjb25zdCBleHBsb3JlciA9IG5ldyBEYXRhRXhwbG9yZXIoZGIsIEVudGl0eU1hbmFnZXIpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBleHBsb3Jlci5leHBsb3JlKGVudGl0eU5hbWUsIHsgc3RyYXRlZ3ksIGxpbWl0IH0pO1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgXFxuJHtlbnRpdHlOYW1lfSAke2RhdGEubGVuZ3RofeqwnCDsobDtmowg7JmE66OMOmApKTtcbiAgICBjb25zb2xlLnRhYmxlKGRhdGEpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBjaGFsay5yZWQoXG4gICAgICAgIFwi642w7J207YSwIOyhsO2ajCDspJEg7Jik66WY6rCAIOuwnOyDne2WiOyKteuLiOuLpC5cXG5cIiArXG4gICAgICAgICAgXCLsm5Dsnbg6IERCIOyXsOqysOydtOuCmCBFbnRpdHkg7KCV7J2Y66W8IO2ZleyduO2VtOyjvOyEuOyalC5cXG5cIiArXG4gICAgICAgICAgXCLsnpDshLjtlZwg64K07JqpOlwiLFxuICAgICAgKSxcbiAgICAgIGVycm9yLFxuICAgICk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJjaGFsayIsInByb21wdHMiLCJTb25hbXUiLCJEQiIsImNyZWF0ZUtuZXhJbnN0YW5jZSIsIkVudGl0eU1hbmFnZXIiLCJEYXRhRXhwbG9yZXIiLCJGaXh0dXJlR2VuZXJhdG9yIiwiZml4dHVyZUdlbkNvbW1hbmQiLCJvcHRpb25zIiwiaXNBdXRvbG9hZGVkIiwiYXV0b2xvYWQiLCJlbnRpdHlOYW1lcyIsImFsbCIsImdldEFsbElkcyIsImV4Y2x1ZGUiLCJleGNsdWRlTGlzdCIsInNwbGl0IiwibWFwIiwicyIsInRyaW0iLCJmaWx0ZXIiLCJuYW1lIiwiaW5jbHVkZXMiLCJpbmNsdWRlIiwicmVzdWx0IiwidHlwZSIsIm1lc3NhZ2UiLCJjaG9pY2VzIiwiaWQiLCJ0aXRsZSIsInZhbHVlIiwibWluIiwiZW50aXRpZXMiLCJsZW5ndGgiLCJjb25zb2xlIiwibG9nIiwieWVsbG93IiwiY291bnQiLCJOdW1iZXIiLCJwYXJzZUludCIsImluaXRpYWwiLCJzYXZlVGFyZ2V0IiwiZmlsZW5hbWVSZXN1bHQiLCJmaWxlbmFtZSIsInVzZUxMTSIsImxsbVJlc3VsdCIsImVuYWJsZUxMTUNhY2hlIiwiZml4dHVyZURiIiwiZGJDb25maWciLCJmaXh0dXJlIiwiZ2VuZXJhdG9yIiwiY3lhbiIsImpvaW4iLCJzcGVjcyIsImVudGl0eU5hbWUiLCJlbnRpdHkiLCJvdmVycmlkZXMiLCJyZXN1bHRzIiwiZ2VuZXJhdGVCYXRjaCIsInN0YXRzIiwiZ2V0TExNQ2FjaGVTdGF0cyIsInNpemUiLCJncmVlbiIsIkpTT04iLCJzdHJpbmdpZnkiLCJzdGFydHNXaXRoIiwiZnMiLCJwYXRoIiwiZml4dHVyZXNEaXIiLCJwcm9jZXNzIiwiY3dkIiwiYWNjZXNzIiwibWtkaXIiLCJyZWN1cnNpdmUiLCJlbnRpdHlSZXN1bHRzIiwiciIsImVudGl0eUlkIiwiZ2V0IiwidGFibGUiLCJyZXBsYWNlIiwiZmlsZXBhdGgiLCJ3cml0ZUZpbGUiLCJkYXRhIiwiZXJyb3IiLCJyZWQiLCJmaXh0dXJlRmV0Y2hDb21tYW5kIiwic3RyYXRlZ3kiLCJsaW1pdCIsInNvdXJjZURiIiwiZ2V0REIiLCJpbXBvcnRGcm9tU291cmNlIiwiaW5jbHVkZVJlbGF0aW9ucyIsIm1heERlcHRoIiwiZml4dHVyZUV4cGxvcmVDb21tYW5kIiwiRXJyb3IiLCJkYiIsImV4cGxvcmVyIiwiZXhwbG9yZSJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBVyxRQUFRO0FBQzFCLE9BQU9DLGFBQWEsVUFBVTtBQUM5QixTQUFTQyxNQUFNLFFBQVEsa0JBQVM7QUFDaEMsU0FBU0MsRUFBRSxRQUFRLG9CQUFpQjtBQUNwQyxTQUFTQyxrQkFBa0IsUUFBUSxzQkFBbUI7QUFDdEQsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQUFTQyxZQUFZLFFBQW1DLDhCQUEyQjtBQUNuRixTQUFTQyxnQkFBZ0IsUUFBUSxrQ0FBK0I7QUFlaEU7O0NBRUMsR0FDRCxPQUFPLGVBQWVDLGtCQUFrQkMsT0FBOEI7SUFDcEUsSUFBSTtRQUNGLElBQUksQ0FBQ0osY0FBY0ssWUFBWSxFQUFFO1lBQy9CLE1BQU1MLGNBQWNNLFFBQVE7UUFDOUI7UUFFQSxJQUFJQztRQUVKLElBQUlILFFBQVFJLEdBQUcsRUFBRTtZQUNmRCxjQUFjUCxjQUFjUyxTQUFTO1lBQ3JDLElBQUlMLFFBQVFNLE9BQU8sRUFBRTtnQkFDbkIsTUFBTUMsY0FBY1AsUUFBUU0sT0FBTyxDQUFDRSxLQUFLLENBQUMsS0FBS0MsR0FBRyxDQUFDLENBQUNDLElBQWNBLEVBQUVDLElBQUk7Z0JBQ3hFUixjQUFjQSxZ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
273
+ //#endregion
274
+ export { fixtureExploreCommand, fixtureFetchCommand, fixtureGenCommand };
275
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS5qcyIsIm5hbWVzIjpbImVudGl0eU5hbWVzOiBzdHJpbmdbXSIsImZpbGVuYW1lOiBzdHJpbmciLCJzdHJhdGVneTogRGF0YUV4cGxvcmVyU3RyYXRlZ3kiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYmluL2ZpeHR1cmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHByb21wdHMgZnJvbSBcInByb21wdHNcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBjcmVhdGVLbmV4SW5zdGFuY2UgfSBmcm9tIFwiLi4vZGF0YWJhc2Uva25leFwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IERhdGFFeHBsb3JlciB9IGZyb20gXCIuLi90ZXN0aW5nL2RhdGEtZXhwbG9yZXJcIjtcbmltcG9ydCB7IHR5cGUgRGF0YUV4cGxvcmVyU3RyYXRlZ3kgfSBmcm9tIFwiLi4vdGVzdGluZy9kYXRhLWV4cGxvcmVyXCI7XG5pbXBvcnQgeyBGaXh0dXJlR2VuZXJhdG9yIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZml4dHVyZS1nZW5lcmF0b3JcIjtcblxuaW50ZXJmYWNlIEZpeHR1cmVDb21tYW5kT3B0aW9ucyB7XG4gIF8/OiBzdHJpbmdbXTtcbiAgYWxsPzogYm9vbGVhbjtcbiAgaW5jbHVkZT86IHN0cmluZztcbiAgZXhjbHVkZT86IHN0cmluZztcbiAgY291bnQ/OiBzdHJpbmc7XG4gIFwic2F2ZS10b1wiPzogc3RyaW5nO1xuICBzdHJhdGVneT86IERhdGFFeHBsb3JlclN0cmF0ZWd5O1xuICBsaW1pdD86IHN0cmluZztcbiAgXCJ1c2UtbGxtXCI/OiBib29sZWFuO1xuICBcIm5vLWNhY2hlXCI/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIGZpeHR1cmUgZ2VuIOuqheugueyWtCAtIGNvbmUg66mU7YOA642w7J207YSw66W8IO2ZnOyaqe2VmOyXrCDsnpDrj5nsnLzroZwgZml4dHVyZeulvCDsg53shLHtlanri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXh0dXJlR2VuQ29tbWFuZChvcHRpb25zOiBGaXh0dXJlQ29tbWFuZE9wdGlvbnMpIHtcbiAgdHJ5IHtcbiAgICBpZiAoIUVudGl0eU1hbmFnZXIuaXNBdXRvbG9hZGVkKSB7XG4gICAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKCk7XG4gICAgfVxuXG4gICAgbGV0IGVudGl0eU5hbWVzOiBzdHJpbmdbXTtcblxuICAgIGlmIChvcHRpb25zLmFsbCkge1xuICAgICAgZW50aXR5TmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgICAgaWYgKG9wdGlvbnMuZXhjbHVkZSkge1xuICAgICAgICBjb25zdCBleGNsdWRlTGlzdCA9IG9wdGlvbnMuZXhjbHVkZS5zcGxpdChcIixcIikubWFwKChzOiBzdHJpbmcpID0+IHMudHJpbSgpKTtcbiAgICAgICAgZW50aXR5TmFtZXMgPSBlbnRpdHlOYW1lcy5maWx0ZXIoKG5hbWUpID0+ICFleGNsdWRlTGlzdC5pbmNsdWRlcyhuYW1lKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmluY2x1ZGUpIHtcbiAgICAgIGVudGl0eU5hbWVzID0gb3B0aW9ucy5pbmNsdWRlLnNwbGl0KFwiLFwiKS5tYXAoKHM6IHN0cmluZykgPT4gcy50cmltKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgdHlwZTogXCJtdWx0aXNlbGVjdFwiLFxuICAgICAgICBuYW1lOiBcImVudGl0aWVzXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwiRml4dHVyZeulvCDsg53shLHtlaAgRW50aXR566W8IOyEoO2Dne2VmOyEuOyalDpcIixcbiAgICAgICAgY2hvaWNlczogRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKS5tYXAoKGlkKSA9PiAoeyB0aXRsZTogaWQsIHZhbHVlOiBpZCB9KSksXG4gICAgICAgIG1pbjogMSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXJlc3VsdC5lbnRpdGllcyB8fCByZXN1bHQuZW50aXRpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIuy3qOyGjOuQmOyXiOyKteuLiOuLpC5cIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGVudGl0eU5hbWVzID0gcmVzdWx0LmVudGl0aWVzO1xuICAgIH1cblxuICAgIGxldCBjb3VudCA9IG9wdGlvbnMuY291bnQgPyBOdW1iZXIucGFyc2VJbnQob3B0aW9ucy5jb3VudCwgMTApIDogNTtcbiAgICBpZiAoIW9wdGlvbnMuY291bnQpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb21wdHMoe1xuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICBuYW1lOiBcImNvdW50XCIsXG4gICAgICAgIG1lc3NhZ2U6IFwi6rCBIEVudGl0eeuzhCDsg53shLEg6rCc7IiYOlwiLFxuICAgICAgICBpbml0aWFsOiA1LFxuICAgICAgICBtaW46IDEsXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXN1bHQuY291bnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwi7Leo7IaM65CY7JeI7Iq164uI64ukLlwiKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY291bnQgPSByZXN1bHQuY291bnQ7XG4gICAgfVxuXG4gICAgbGV0IHNhdmVUYXJnZXQgPSBvcHRpb25zW1wic2F2ZS10b1wiXSB8fCBcImRiXCI7XG4gICAgaWYgKCFvcHRpb25zW1wic2F2ZS10b1wiXSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgIHR5cGU6IFwic2VsZWN0XCIsXG4gICAgICAgIG5hbWU6IFwic2F2ZVRhcmdldFwiLFxuICAgICAgICBtZXNzYWdlOiBcIuyggOyepSDrsKnsi506XCIsXG4gICAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgICB7IHRpdGxlOiBcIkZpeHR1cmUgRELsl5Ag7KCA7J6lXCIsIHZhbHVlOiBcImRiXCIgfSxcbiAgICAgICAgICB7IHRpdGxlOiBcIu2MjOydvOuhnCDsoIDsnqUgKOyekOuPmSDtjIzsnbzrqoUpXCIsIHZhbHVlOiBcImZpbGVcIiB9LFxuICAgICAgICAgIHsgdGl0bGU6IFwi7YyM7J2866GcIOyggOyepSAo7YyM7J2866qFIOyngOyglSlcIiwgdmFsdWU6IFwiZmlsZTpjdXN0b21cIiB9LFxuICAgICAgICAgIHsgdGl0bGU6IFwi7KCA7J6lIOyViCDtlaggKOy2nOugpeunjClcIiwgdmFsdWU6IFwibm9uZVwiIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgc2F2ZVRhcmdldCA9IHJlc3VsdC5zYXZlVGFyZ2V0O1xuXG4gICAgICBpZiAoc2F2ZVRhcmdldCA9PT0gXCJmaWxlOmN1c3RvbVwiKSB7XG4gICAgICAgIGNvbnN0IGZpbGVuYW1lUmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgbmFtZTogXCJmaWxlbmFtZVwiLFxuICAgICAgICAgIG1lc3NhZ2U6IFwi7YyM7J2866qFOlwiLFxuICAgICAgICAgIGluaXRpYWw6IFwiZml4dHVyZXMuanNvblwiLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIWZpbGVuYW1lUmVzdWx0LmZpbGVuYW1lKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwi7Leo7IaM65CY7JeI7Iq164uI64ukLlwiKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc2F2ZVRhcmdldCA9IGBmaWxlOiR7ZmlsZW5hbWVSZXN1bHQuZmlsZW5hbWV9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMTE0g7IKs7JqpIOyXrOu2gCDqsrDsoJVcbiAgICBsZXQgdXNlTExNID0gb3B0aW9uc1tcInVzZS1sbG1cIl0gPz8gZmFsc2U7XG4gICAgaWYgKCFvcHRpb25zW1widXNlLWxsbVwiXSkge1xuICAgICAgY29uc3QgbGxtUmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgIHR5cGU6IFwiY29uZmlybVwiLFxuICAgICAgICBuYW1lOiBcInVzZUxMTVwiLFxuICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgIFwiTExN7Jy866GcIOuNlCDtmITsi6TsoIHsnbgg642w7J207YSw66W8IOyDneyEse2VoOq5jOyalD8gKGZpeHR1cmVIaW50IOq4sOuwmCwgQU5USFJPUElDX0FQSV9LRVkg7ZWE7JqUKVwiLFxuICAgICAgICBpbml0aWFsOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgdXNlTExNID0gbGxtUmVzdWx0LnVzZUxMTSA/PyBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmFibGVMTE1DYWNoZSA9ICFvcHRpb25zW1wibm8tY2FjaGVcIl07XG5cbiAgICAvLyBmaXh0dXJlIGdlbjogZml4dHVyZSBEQiDrgrTsl5DshJwg7LC47KGwIOq0gOqzhOulvCDtlbTqsrDtlZjqs6Ag7KCA7J6l7ZWp64uI64ukXG4gICAgY29uc3QgZml4dHVyZURiID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlKTtcbiAgICBjb25zdCBnZW5lcmF0b3IgPSBuZXcgRml4dHVyZUdlbmVyYXRvcihmaXh0dXJlRGIsIGZpeHR1cmVEYiwgXCJmaXh0dXJlXCIsIEVudGl0eU1hbmFnZXIsIHtcbiAgICAgIHVzZUxMTSxcbiAgICAgIGVuYWJsZUxMTUNhY2hlLFxuICAgIH0pO1xuXG4gICAgaWYgKHVzZUxMTSkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgYFxcbkxMTSDrqqjrk5zroZwgJHtlbnRpdHlOYW1lcy5qb2luKFwiLCBcIil9IOyDneyEsSDspJEuLi4gKOy6kOyLsTogJHtlbmFibGVMTE1DYWNoZSA/IFwiT05cIiA6IFwiT0ZGXCJ9KWAsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBcXG4ke2VudGl0eU5hbWVzLmpvaW4oXCIsIFwiKX0g7IOd7ISxIOykkS4uLmApKTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGVjcyA9IGVudGl0eU5hbWVzLm1hcCgoZW50aXR5TmFtZSkgPT4gKHtcbiAgICAgIGVudGl0eTogZW50aXR5TmFtZSxcbiAgICAgIGNvdW50LFxuICAgICAgb3ZlcnJpZGVzOiB7fSxcbiAgICB9KSk7XG5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgZ2VuZXJhdG9yLmdlbmVyYXRlQmF0Y2goc3BlY3MpO1xuXG4gICAgaWYgKHVzZUxMTSkge1xuICAgICAgY29uc3Qgc3RhdHMgPSBnZW5lcmF0b3IuZ2V0TExNQ2FjaGVTdGF0cygpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgW0xMTSBDYWNoZV0g7LqQ7IucIO2BrOq4sDogJHtzdGF0cy5zaXplfWApKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgXFxu4pyFICR7cmVzdWx0cy5sZW5ndGh96rCcIGZpeHR1cmUg7IOd7ISxIOyZhOujjGApKTtcblxuICAgIGlmIChzYXZlVGFyZ2V0ID09PSBcIm5vbmVcIikge1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVzdWx0cywgbnVsbCwgMikpO1xuICAgIH0gZWxzZSBpZiAoc2F2ZVRhcmdldCA9PT0gXCJkYlwiKSB7XG4gICAgICAvLyBnZW5lcmF0ZUJhdGNo6rCAIOydtOuvuCBEQuyXkCDsoIDsnqXtlojsnLzrr4DroZwg67OE64+EIOyggOyepeydtCDrtojtlYTsmpTtlanri4jri6QuXG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihcIkZpeHR1cmUgRELsl5Ag7KCA7J6l65CY7JeI7Iq164uI64ukLlwiKSk7XG4gICAgfSBlbHNlIGlmIChzYXZlVGFyZ2V0LnN0YXJ0c1dpdGgoXCJmaWxlXCIpKSB7XG4gICAgICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydChcIm5vZGU6ZnMvcHJvbWlzZXNcIik7XG4gICAgICBjb25zdCBwYXRoID0gYXdhaXQgaW1wb3J0KFwibm9kZTpwYXRoXCIpO1xuXG4gICAgICBjb25zdCBmaXh0dXJlc0RpciA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcInRlc3RcIiwgXCJmaXh0dXJlc1wiKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaXh0dXJlc0Rpcik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgYXdhaXQgZnMubWtkaXIoZml4dHVyZXNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGVudGl0eU5hbWUgb2YgZW50aXR5TmFtZXMpIHtcbiAgICAgICAgY29uc3QgZW50aXR5UmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKChyKSA9PiByLmVudGl0eUlkID09PSBlbnRpdHlOYW1lKTtcblxuICAgICAgICBpZiAoZW50aXR5UmVzdWx0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmaWxlbmFtZTogc3RyaW5nO1xuICAgICAgICBpZiAoc2F2ZVRhcmdldCA9PT0gXCJmaWxlXCIpIHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlOYW1lKTtcbiAgICAgICAgICBmaWxlbmFtZSA9IGAke2VudGl0eS50YWJsZX0uanNvbmA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmlsZW5hbWUgPSBzYXZlVGFyZ2V0LnJlcGxhY2UoXCJmaWxlOlwiLCBcIlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVwYXRoID0gcGF0aC5qb2luKGZpeHR1cmVzRGlyLCBmaWxlbmFtZSk7XG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShcbiAgICAgICAgICBmaWxlcGF0aCxcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIGVudGl0eVJlc3VsdHMubWFwKChyKSA9PiByLmRhdGEpLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIDIsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKchSAke2ZpbGVwYXRofSDsoIDsnqUg7JmE66OMYCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgY2hhbGsucmVkKFxuICAgICAgICBcIkZpeHR1cmUg7IOd7ISxIOykkSDsmKTrpZjqsIAg67Cc7IOd7ZaI7Iq164uI64ukLlxcblwiICtcbiAgICAgICAgICBcIuybkOyduDogRW50aXR5IOygleydmOuCmCBEQiDsl7DqsrDsnYQg7ZmV7J247ZW07KO87IS47JqULlxcblwiICtcbiAgICAgICAgICBcIuyekOyEuO2VnCDrgrTsmqk6XCIsXG4gICAgICApLFxuICAgICAgZXJyb3IsXG4gICAgKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIGZpeHR1cmUgZmV0Y2gg66qF66C57Ja0IC0g7Iuk7KCcIOyatOyYgSBEQuyXkOyEnCDrjbDsnbTthLDrpbwg6rCA7KC47JmAIGZpeHR1cmXroZwg7KCA7J6l7ZWp64uI64ukLlxuICog6rSA6rOE65CcIOuNsOydtO2EsOuPhCDtlajqu5gg6rCA7KC47Jik66+A66GcIO2YhOyLpOyggeyduCDthYzsiqTtirgg642w7J207YSw66W8IO2ZleuztO2VoCDsiJgg7J6I7Iq164uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4dHVyZUZldGNoQ29tbWFuZChvcHRpb25zOiBGaXh0dXJlQ29tbWFuZE9wdGlvbnMpIHtcbiAgdHJ5IHtcbiAgICBpZiAoIUVudGl0eU1hbmFnZXIuaXNBdXRvbG9hZGVkKSB7XG4gICAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKCk7XG4gICAgfVxuXG4gICAgbGV0IGVudGl0eU5hbWVzOiBzdHJpbmdbXTtcblxuICAgIGlmIChvcHRpb25zLmFsbCkge1xuICAgICAgZW50aXR5TmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgICAgaWYgKG9wdGlvbnMuZXhjbHVkZSkge1xuICAgICAgICBjb25zdCBleGNsdWRlTGlzdCA9IG9wdGlvbnMuZXhjbHVkZS5zcGxpdChcIixcIikubWFwKChzOiBzdHJpbmcpID0+IHMudHJpbSgpKTtcbiAgICAgICAgZW50aXR5TmFtZXMgPSBlbnRpdHlOYW1lcy5maWx0ZXIoKG5hbWUpID0+ICFleGNsdWRlTGlzdC5pbmNsdWRlcyhuYW1lKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmluY2x1ZGUpIHtcbiAgICAgIGVudGl0eU5hbWVzID0gb3B0aW9ucy5pbmNsdWRlLnNwbGl0KFwiLFwiKS5tYXAoKHM6IHN0cmluZykgPT4gcy50cmltKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9tcHRzKHtcbiAgICAgICAgdHlwZTogXCJtdWx0aXNlbGVjdFwiLFxuICAgICAgICBuYW1lOiBcImVudGl0aWVzXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwiSW1wb3J07ZWgIEVudGl0eeulvCDshKDtg53tlZjshLjsmpQ6XCIsXG4gICAgICAgIGNob2ljZXM6IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCkubWFwKChpZCkgPT4gKHsgdGl0bGU6IGlkLCB2YWx1ZTogaWQgfSkpLFxuICAgICAgICBtaW46IDEsXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXN1bHQuZW50aXRpZXMgfHwgcmVzdWx0LmVudGl0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCLst6jshozrkJjsl4jsirXri4jri6QuXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBlbnRpdHlOYW1lcyA9IHJlc3VsdC5lbnRpdGllcztcbiAgICB9XG5cbiAgICBjb25zdCBzdHJhdGVneTogRGF0YUV4cGxvcmVyU3RyYXRlZ3kgPSBvcHRpb25zLnN0cmF0ZWd5ID8/IFwicmVjZW50XCI7XG4gICAgY29uc3QgbGltaXQgPSBvcHRpb25zLmxpbWl0ID8gTnVtYmVyLnBhcnNlSW50KG9wdGlvbnMubGltaXQsIDEwKSA6IDEwO1xuXG4gICAgLy8gZml4dHVyZSBmZXRjaDogcHJvZHVjdGlvbiDrjbDsnbTthLDrpbwgZml4dHVyZSBEQuuhnCBpbXBvcnTtlanri4jri6RcbiAgICBjb25zdCBzb3VyY2VEYiA9IERCLmdldERCKFwiclwiKTsgLy8gcHJvZHVjdGlvbl9tYXN0ZXIgKOuYkOuKlCBkZXZlbG9wbWVudF9tYXN0ZXIpXG4gICAgY29uc3QgZml4dHVyZURiID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlKTtcbiAgICBjb25zdCBnZW5lcmF0b3IgPSBuZXcgRml4dHVyZUdlbmVyYXRvcihzb3VyY2VEYiwgZml4dHVyZURiLCBcImZpeHR1cmVcIiwgRW50aXR5TWFuYWdlcik7XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBcXG4ke2VudGl0eU5hbWVzLmpvaW4oXCIsIFwiKX0gaW1wb3J0IOykkS4uLmApKTtcblxuICAgIGZvciAoY29uc3QgZW50aXR5TmFtZSBvZiBlbnRpdHlOYW1lcykge1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IGdlbmVyYXRvci5pbXBvcnRGcm9tU291cmNlKGVudGl0eU5hbWUsIHtcbiAgICAgICAgc3RyYXRlZ3ksXG4gICAgICAgIGxpbWl0LFxuICAgICAgICBpbmNsdWRlUmVsYXRpb25zOiB0cnVlLFxuICAgICAgICBtYXhEZXB0aDogMixcbiAgICAgIH0pO1xuXG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyFICR7ZW50aXR5TmFtZX06ICR7cmVzdWx0cy5sZW5ndGh96rCcIGltcG9ydCDsmYTro4xgKSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBjaGFsay5yZWQoXG4gICAgICAgIFwi7Iuk7KCcIERC7JeQ7IScIOuNsOydtO2EsOulvCDqsIDsoLjsmKTripQg7KSRIOyYpOulmOqwgCDrsJzsg53tlojsirXri4jri6QuXFxuXCIgK1xuICAgICAgICAgIFwi7JuQ7J24OiDshozsiqQgREIg7Jew6rKwIOyEpOyglShzb25hbXUuY29uZmlnLnRzKeydtOuCmCBFbnRpdHkg6rSA6rOEIOygleydmOulvCDtmZXsnbjtlbTso7zshLjsmpQuXFxuXCIgK1xuICAgICAgICAgIFwi7J6Q7IS47ZWcIOuCtOyaqTpcIixcbiAgICAgICksXG4gICAgICBlcnJvcixcbiAgICApO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogZml4dHVyZSBleHBsb3JlIOuqheugueyWtCAtIERC7J2YIOyLpOygnCDrjbDsnbTthLDrpbwg7KGw7ZqM7ZWY7JesIO2ZleyduO2VqeuLiOuLpC5cbiAqIOyggOyepe2VmOyngCDslYrqs6Ag7KGw7ZqM66eMIO2VmOuvgOuhnCDrjbDsnbTthLDrpbwg67mg66W06rKMIO2ZleyduO2VoCDrlYwg7Jyg7Jqp7ZWp64uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4dHVyZUV4cGxvcmVDb21tYW5kKG9wdGlvbnM6IEZpeHR1cmVDb21tYW5kT3B0aW9ucykge1xuICB0cnkge1xuICAgIGlmICghRW50aXR5TWFuYWdlci5pc0F1dG9sb2FkZWQpIHtcbiAgICAgIGF3YWl0IEVudGl0eU1hbmFnZXIuYXV0b2xvYWQoKTtcbiAgICB9XG5cbiAgICBsZXQgZW50aXR5TmFtZSA9IG9wdGlvbnMuaW5jbHVkZTtcblxuICAgIGlmICghZW50aXR5TmFtZSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvbXB0cyh7XG4gICAgICAgIHR5cGU6IFwic2VsZWN0XCIsXG4gICAgICAgIG5hbWU6IFwiZW50aXR5XCIsXG4gICAgICAgIG1lc3NhZ2U6IFwi7YOQ7IOJ7ZWgIEVudGl0eTpcIixcbiAgICAgICAgY2hvaWNlczogRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKS5tYXAoKGlkKSA9PiAoeyB0aXRsZTogaWQsIHZhbHVlOiBpZCB9KSksXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXN1bHQuZW50aXR5KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhcIuy3qOyGjOuQmOyXiOyKteuLiOuLpC5cIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGVudGl0eU5hbWUgPSByZXN1bHQuZW50aXR5O1xuICAgIH1cblxuICAgIGlmICghZW50aXR5TmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW50aXR5IG5hbWUgaXMgcmVxdWlyZWRcIik7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RyYXRlZ3k6IERhdGFFeHBsb3JlclN0cmF0ZWd5ID0gb3B0aW9ucy5zdHJhdGVneSA/PyBcInNhbXBsZVwiO1xuICAgIGNvbnN0IGxpbWl0ID0gb3B0aW9ucy5saW1pdCA/IE51bWJlci5wYXJzZUludChvcHRpb25zLmxpbWl0LCAxMCkgOiAxMDtcblxuICAgIGNvbnN0IGRiID0gREIuZ2V0REIoXCJyXCIpO1xuICAgIGNvbnN0IGV4cGxvcmVyID0gbmV3IERhdGFFeHBsb3JlcihkYiwgRW50aXR5TWFuYWdlcik7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGV4cGxvcmVyLmV4cGxvcmUoZW50aXR5TmFtZSwgeyBzdHJhdGVneSwgbGltaXQgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBcXG4ke2VudGl0eU5hbWV9ICR7ZGF0YS5sZW5ndGh96rCcIOyhsO2ajCDsmYTro4w6YCkpO1xuICAgIGNvbnNvbGUudGFibGUoZGF0YSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgXCLrjbDsnbTthLAg7KGw7ZqMIOykkSDsmKTrpZjqsIAg67Cc7IOd7ZaI7Iq164uI64ukLlxcblwiICtcbiAgICAgICAgICBcIuybkOyduDogREIg7Jew6rKw7J2064KYIEVudGl0eSDsoJXsnZjrpbwg7ZmV7J247ZW07KO87IS47JqULlxcblwiICtcbiAgICAgICAgICBcIuyekOyEuO2VnCDrgrTsmqk6XCIsXG4gICAgICApLFxuICAgICAgZXJyb3IsXG4gICAgKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O2FBR3VDO1NBQ0g7V0FDa0I7cUJBQ0c7b0JBQ0Q7d0JBRVE7Ozs7QUFrQmhFLGVBQXNCLGtCQUFrQixTQUFnQztBQUN0RSxLQUFJO0FBQ0YsTUFBSSxDQUFDLGNBQWMsY0FBYztBQUMvQixTQUFNLGNBQWMsVUFBVTs7RUFHaEMsSUFBSUE7QUFFSixNQUFJLFFBQVEsS0FBSztBQUNmLGlCQUFjLGNBQWMsV0FBVztBQUN2QyxPQUFJLFFBQVEsU0FBUztJQUNuQixNQUFNLGNBQWMsUUFBUSxRQUFRLE1BQU0sSUFBSSxDQUFDLEtBQUssTUFBYyxFQUFFLE1BQU0sQ0FBQztBQUMzRSxrQkFBYyxZQUFZLFFBQVEsU0FBUyxDQUFDLFlBQVksU0FBUyxLQUFLLENBQUM7O2FBRWhFLFFBQVEsU0FBUztBQUMxQixpQkFBYyxRQUFRLFFBQVEsTUFBTSxJQUFJLENBQUMsS0FBSyxNQUFjLEVBQUUsTUFBTSxDQUFDO1NBQ2hFO0dBQ0wsTUFBTSxTQUFTLE1BQU0sUUFBUTtJQUMzQixNQUFNO0lBQ04sTUFBTTtJQUNOLFNBQVM7SUFDVCxTQUFTLGNBQWMsV0FBVyxDQUFDLEtBQUssUUFBUTtLQUFFLE9BQU87S0FBSSxPQUFPO0tBQUksRUFBRTtJQUMxRSxLQUFLO0lBQ04sQ0FBQztBQUVGLE9BQUksQ0FBQyxPQUFPLFlBQVksT0FBTyxTQUFTLFdBQVcsR0FBRztBQUNwRCxZQUFRLElBQUksTUFBTSxPQUFPLFdBQVcsQ0FBQztBQUNyQzs7QUFHRixpQkFBYyxPQUFPOztFQUd2QixJQUFJLFFBQVEsUUFBUSxRQUFRLE9BQU8sU0FBUyxRQUFRLE9BQU8sR0FBRyxHQUFHO0FBQ2pFLE1BQUksQ0FBQyxRQUFRLE9BQU87R0FDbEIsTUFBTSxTQUFTLE1BQU0sUUFBUTtJQUMzQixNQUFNO0lBQ04sTUFBTTtJQUNOLFNBQVM7SUFDVCxTQUFTO0lBQ1QsS0FBSztJQUNOLENBQUM7QUFFRixPQUFJLENBQUMsT0FBTyxPQUFPO0FBQ2pCLFlBQVEsSUFBSSxNQUFNLE9BQU8sV0FBVyxDQUFDO0FBQ3JDOztBQUdGLFdBQVEsT0FBTzs7RUFHakIsSUFBSSxhQUFhLFFBQVEsY0FBYztBQUN2QyxNQUFJLENBQUMsUUFBUSxZQUFZO0dBQ3ZCLE1BQU0sU0FBUyxNQUFNLFFBQVE7SUFDM0IsTUFBTTtJQUNOLE1BQU07SUFDTixTQUFTO0lBQ1QsU0FBUztLQUNQO01BQUUsT0FBTztNQUFrQixPQUFPO01BQU07S0FDeEM7TUFBRSxPQUFPO01BQW1CLE9BQU87TUFBUTtLQUMzQztNQUFFLE9BQU87TUFBbUIsT0FBTztNQUFlO0tBQ2xEO01BQUUsT0FBTztNQUFnQixPQUFPO01BQVE7S0FDekM7SUFDRixDQUFDO0FBRUYsZ0JBQWEsT0FBTztBQUVwQixPQUFJLGVBQWUsZUFBZTtJQUNoQyxNQUFNLGlCQUFpQixNQUFNLFFBQVE7S0FDbkMsTUFBTTtLQUNOLE1BQU07S0FDTixTQUFTO0tBQ1QsU0FBUztLQUNWLENBQUM7QUFFRixRQUFJLENBQUMsZUFBZSxVQUFVO0FBQzVCLGFBQVEsSUFBSSxNQUFNLE9BQU8sV0FBVyxDQUFDO0FBQ3JDOztBQUdGLGlCQUFhLFFBQVEsZUFBZTs7O0VBS3hDLElBQUksU0FBUyxRQUFRLGNBQWM7QUFDbkMsTUFBSSxDQUFDLFFBQVEsWUFBWTtHQUN2QixNQUFNLFlBQVksTUFBTSxRQUFRO0lBQzlCLE1BQU07SUFDTixNQUFNO0lBQ04sU0FDRTtJQUNGLFNBQVM7SUFDVixDQUFDO0FBQ0YsWUFBUyxVQUFVLFVBQVU7O0VBRy9CLE1BQU0saUJBQWlCLENBQUMsUUFBUTtFQUdoQyxNQUFNLFlBQVksbUJBQW1CLE9BQU8sU0FBUyxRQUFRO0VBQzdELE1BQU0sWUFBWSxJQUFJLGlCQUFpQixXQUFXLFdBQVcsV0FBVyxlQUFlO0dBQ3JGO0dBQ0E7R0FDRCxDQUFDO0FBRUYsTUFBSSxRQUFRO0FBQ1YsV0FBUSxJQUNOLE1BQU0sS0FDSixhQUFhLFlBQVksS0FBSyxLQUFLLENBQUMsZ0JBQWdCLGlCQUFpQixPQUFPLE1BQU0sR0FDbkYsQ0FDRjtTQUNJO0FBQ0wsV0FBUSxJQUFJLE1BQU0sS0FBSyxLQUFLLFlBQVksS0FBSyxLQUFLLENBQUMsVUFBVSxDQUFDOztFQUdoRSxNQUFNLFFBQVEsWUFBWSxLQUFLLGdCQUFnQjtHQUM3QyxRQUFRO0dBQ1I7R0FDQSxXQUFXLEVBQUU7R0FDZCxFQUFFO0VBRUgsTUFBTSxVQUFVLE1BQU0sVUFBVSxjQUFjLE1BQU07QUFFcEQsTUFBSSxRQUFRO0dBQ1YsTUFBTSxRQUFRLFVBQVUsa0JBQWtCO0FBQzFDLFdBQVEsSUFBSSxNQUFNLEtBQUssc0JBQXNCLE1BQU0sT0FBTyxDQUFDOztBQUc3RCxVQUFRLElBQUksTUFBTSxNQUFNLE9BQU8sUUFBUSxPQUFPLGlCQUFpQixDQUFDO0FBRWhFLE1BQUksZUFBZSxRQUFRO0FBQ3pCLFdBQVEsSUFBSSxLQUFLLFVBQVUsU0FBUyxNQUFNLEVBQUUsQ0FBQzthQUNwQyxlQUFlLE1BQU07QUFFOUIsV0FBUSxJQUFJLE1BQU0sTUFBTSx1QkFBdUIsQ0FBQzthQUN2QyxXQUFXLFdBQVcsT0FBTyxFQUFFO0dBQ3hDLE1BQU0sS0FBSyxNQUFNLE9BQU87R0FDeEIsTUFBTSxPQUFPLE1BQU0sT0FBTztHQUUxQixNQUFNLGNBQWMsS0FBSyxLQUFLLFFBQVEsS0FBSyxFQUFFLFFBQVEsV0FBVztBQUNoRSxPQUFJO0FBQ0YsVUFBTSxHQUFHLE9BQU8sWUFBWTtXQUN0QjtBQUNOLFVBQU0sR0FBRyxNQUFNLGFBQWEsRUFBRSxXQUFXLE1BQU0sQ0FBQzs7QUFHbEQsUUFBSyxNQUFNLGNBQWMsYUFBYTtJQUNwQyxNQUFNLGdCQUFnQixRQUFRLFFBQVEsTUFBTSxFQUFFLGFBQWEsV0FBVztBQUV0RSxRQUFJLGNBQWMsV0FBVyxHQUFHO0FBQzlCOztJQUdGLElBQUlDO0FBQ0osUUFBSSxlQUFlLFFBQVE7S0FDekIsTUFBTSxTQUFTLGNBQWMsSUFBSSxXQUFXO0FBQzVDLGdCQUFXLEdBQUcsT0FBTyxNQUFNO1dBQ3RCO0FBQ0wsZ0JBQVcsV0FBVyxRQUFRLFNBQVMsR0FBRzs7SUFHNUMsTUFBTSxXQUFXLEtBQUssS0FBSyxhQUFhLFNBQVM7QUFDakQsVUFBTSxHQUFHLFVBQ1AsVUFDQSxLQUFLLFVBQ0gsY0FBYyxLQUFLLE1BQU0sRUFBRSxLQUFLLEVBQ2hDLE1BQ0EsRUFDRCxDQUNGO0FBQ0QsWUFBUSxJQUFJLE1BQU0sTUFBTSxLQUFLLFNBQVMsUUFBUSxDQUFDOzs7VUFHNUMsT0FBTztBQUNkLFVBQVEsTUFDTixNQUFNLElBQ0osK0JBQ0Usb0NBQ0EsVUFDSCxFQUNELE1BQ0Q7QUFDRCxRQUFNOzs7Ozs7O0FBUVYsZUFBc0Isb0JBQW9CLFNBQWdDO0FBQ3hFLEtBQUk7QUFDRixNQUFJLENBQUMsY0FBYyxjQUFjO0FBQy9CLFNBQU0sY0FBYyxVQUFVOztFQUdoQyxJQUFJRDtBQUVKLE1BQUksUUFBUSxLQUFLO0FBQ2YsaUJBQWMsY0FBYyxXQUFXO0FBQ3ZDLE9BQUksUUFBUSxTQUFTO0lBQ25CLE1BQU0sY0FBYyxRQUFRLFFBQVEsTUFBTSxJQUFJLENBQUMsS0FBSyxNQUFjLEVBQUUsTUFBTSxDQUFDO0FBQzNFLGtCQUFjLFlBQVksUUFBUSxTQUFTLENBQUMsWUFBWSxTQUFTLEtBQUssQ0FBQzs7YUFFaEUsUUFBUSxTQUFTO0FBQzFCLGlCQUFjLFFBQVEsUUFBUSxNQUFNLElBQUksQ0FBQyxLQUFLLE1BQWMsRUFBRSxNQUFNLENBQUM7U0FDaEU7R0FDTCxNQUFNLFNBQVMsTUFBTSxRQUFRO0lBQzNCLE1BQU07SUFDTixNQUFNO0lBQ04sU0FBUztJQUNULFNBQVMsY0FBYyxXQUFXLENBQUMsS0FBSyxRQUFRO0tBQUUsT0FBTztLQUFJLE9BQU87S0FBSSxFQUFFO0lBQzFFLEtBQUs7SUFDTixDQUFDO0FBRUYsT0FBSSxDQUFDLE9BQU8sWUFBWSxPQUFPLFNBQVMsV0FBVyxHQUFHO0FBQ3BELFlBQVEsSUFBSSxNQUFNLE9BQU8sV0FBVyxDQUFDO0FBQ3JDOztBQUdGLGlCQUFjLE9BQU87O0VBR3ZCLE1BQU1FLFdBQWlDLFFBQVEsWUFBWTtFQUMzRCxNQUFNLFFBQVEsUUFBUSxRQUFRLE9BQU8sU0FBUyxRQUFRLE9BQU8sR0FBRyxHQUFHO0VBR25FLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSTtFQUM5QixNQUFNLFlBQVksbUJBQW1CLE9BQU8sU0FBUyxRQUFRO0VBQzdELE1BQU0sWUFBWSxJQUFJLGlCQUFpQixVQUFVLFdBQVcsV0FBVyxjQUFjO0FBRXJGLFVBQVEsSUFBSSxNQUFNLEtBQUssS0FBSyxZQUFZLEtBQUssS0FBSyxDQUFDLGNBQWMsQ0FBQztBQUVsRSxPQUFLLE1BQU0sY0FBYyxhQUFhO0dBQ3BDLE1BQU0sVUFBVSxNQUFNLFVBQVUsaUJBQWlCLFlBQVk7SUFDM0Q7SUFDQTtJQUNBLGtCQUFrQjtJQUNsQixVQUFVO0lBQ1gsQ0FBQztBQUVGLFdBQVEsSUFBSSxNQUFNLE1BQU0sS0FBSyxXQUFXLElBQUksUUFBUSxPQUFPLGFBQWEsQ0FBQzs7VUFFcEUsT0FBTztBQUNkLFVBQVEsTUFDTixNQUFNLElBQ0osc0NBQ0UsZ0VBQ0EsVUFDSCxFQUNELE1BQ0Q7QUFDRCxRQUFNOzs7Ozs7O0FBUVYsZUFBc0Isc0JBQXNCLFNBQWdDO0FBQzFFLEtBQUk7QUFDRixNQUFJLENBQUMsY0FBYyxjQUFjO0FBQy9CLFNBQU0sY0FBYyxVQUFVOztFQUdoQyxJQUFJLGFBQWEsUUFBUTtBQUV6QixNQUFJLENBQUMsWUFBWTtHQUNmLE1BQU0sU0FBUyxNQUFNLFFBQVE7SUFDM0IsTUFBTTtJQUNOLE1BQU07SUFDTixTQUFTO0lBQ1QsU0FBUyxjQUFjLFdBQVcsQ0FBQyxLQUFLLFFBQVE7S0FBRSxPQUFPO0tBQUksT0FBTztLQUFJLEVBQUU7SUFDM0UsQ0FBQztBQUVGLE9BQUksQ0FBQyxPQUFPLFFBQVE7QUFDbEIsWUFBUSxJQUFJLE1BQU0sT0FBTyxXQUFXLENBQUM7QUFDckM7O0FBR0YsZ0JBQWEsT0FBTzs7QUFHdEIsTUFBSSxDQUFDLFlBQVk7QUFDZixTQUFNLElBQUksTUFBTSwwQkFBMEI7O0VBRzVDLE1BQU1BLFdBQWlDLFFBQVEsWUFBWTtFQUMzRCxNQUFNLFFBQVEsUUFBUSxRQUFRLE9BQU8sU0FBUyxRQUFRLE9BQU8sR0FBRyxHQUFHO0VBRW5FLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSTtFQUN4QixNQUFNLFdBQVcsSUFBSSxhQUFhLElBQUksY0FBYztFQUNwRCxNQUFNLE9BQU8sTUFBTSxTQUFTLFFBQVEsWUFBWTtHQUFFO0dBQVU7R0FBTyxDQUFDO0FBRXBFLFVBQVEsSUFBSSxNQUFNLEtBQUssS0FBSyxXQUFXLEdBQUcsS0FBSyxPQUFPLFVBQVUsQ0FBQztBQUNqRSxVQUFRLE1BQU0sS0FBSztVQUNaLE9BQU87QUFDZCxVQUFRLE1BQ04sTUFBTSxJQUNKLDJCQUNFLHFDQUNBLFVBQ0gsRUFDRCxNQUNEO0FBQ0QsUUFBTSJ9