sonamu 0.5.7 → 0.7.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 (529) hide show
  1. package/.swcrc.project-default +18 -0
  2. package/bin/cli.js +24 -0
  3. package/dist/ai/agents/agent.d.ts +11 -0
  4. package/dist/ai/agents/agent.d.ts.map +1 -0
  5. package/dist/ai/agents/agent.js +65 -0
  6. package/dist/ai/agents/index.d.ts +3 -0
  7. package/dist/ai/agents/index.d.ts.map +1 -0
  8. package/dist/ai/agents/index.js +4 -0
  9. package/dist/ai/agents/types.d.ts +43 -0
  10. package/dist/ai/agents/types.d.ts.map +1 -0
  11. package/dist/ai/agents/types.js +3 -0
  12. package/dist/ai/index.d.ts +2 -0
  13. package/dist/ai/index.d.ts.map +1 -0
  14. package/dist/ai/index.js +3 -0
  15. package/dist/ai/providers/rtzr/api.d.ts +22 -0
  16. package/dist/ai/providers/rtzr/api.d.ts.map +1 -0
  17. package/dist/ai/providers/rtzr/api.js +28 -0
  18. package/dist/ai/providers/rtzr/error.d.ts +18 -0
  19. package/dist/ai/providers/rtzr/error.d.ts.map +1 -0
  20. package/dist/ai/providers/rtzr/error.js +29 -0
  21. package/dist/ai/providers/rtzr/index.d.ts +5 -0
  22. package/dist/ai/providers/rtzr/index.d.ts.map +1 -0
  23. package/dist/ai/providers/rtzr/index.js +6 -0
  24. package/dist/ai/providers/rtzr/model.d.ts +52 -0
  25. package/dist/ai/providers/rtzr/model.d.ts.map +1 -0
  26. package/dist/ai/providers/rtzr/model.js +137 -0
  27. package/dist/ai/providers/rtzr/options.d.ts +7 -0
  28. package/dist/ai/providers/rtzr/options.d.ts.map +1 -0
  29. package/dist/ai/providers/rtzr/options.js +47 -0
  30. package/dist/ai/providers/rtzr/provider.d.ts +18 -0
  31. package/dist/ai/providers/rtzr/provider.d.ts.map +1 -0
  32. package/dist/ai/providers/rtzr/provider.js +54 -0
  33. package/dist/ai/providers/rtzr/utils.d.ts +19 -0
  34. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -0
  35. package/dist/ai/providers/rtzr/utils.js +88 -0
  36. package/dist/api/base-frame.d.ts +2 -2
  37. package/dist/api/base-frame.d.ts.map +1 -1
  38. package/dist/api/base-frame.js +13 -2
  39. package/dist/api/caster.d.ts.map +1 -1
  40. package/dist/api/caster.js +71 -2
  41. package/dist/api/code-converters.d.ts +58 -14
  42. package/dist/api/code-converters.d.ts.map +1 -1
  43. package/dist/api/code-converters.js +258 -2
  44. package/dist/api/config.d.ts +90 -0
  45. package/dist/api/config.d.ts.map +1 -0
  46. package/dist/api/config.js +25 -0
  47. package/dist/api/context.d.ts +4 -2
  48. package/dist/api/context.d.ts.map +1 -1
  49. package/dist/api/context.js +3 -2
  50. package/dist/api/decorators.d.ts +20 -6
  51. package/dist/api/decorators.d.ts.map +1 -1
  52. package/dist/api/decorators.js +235 -2
  53. package/dist/api/index.d.ts +2 -2
  54. package/dist/api/index.d.ts.map +1 -1
  55. package/dist/api/index.js +9 -2
  56. package/dist/api/sonamu.d.ts +10 -24
  57. package/dist/api/sonamu.d.ts.map +1 -1
  58. package/dist/api/sonamu.js +514 -2
  59. package/dist/api/validator.d.ts +6 -0
  60. package/dist/api/validator.d.ts.map +1 -0
  61. package/dist/api/validator.js +81 -0
  62. package/dist/bin/build-config.d.ts +6 -1
  63. package/dist/bin/build-config.d.ts.map +1 -1
  64. package/dist/bin/build-config.js +15 -2
  65. package/dist/bin/cli.js +519 -2
  66. package/dist/bin/hot-hook-register.d.ts +11 -0
  67. package/dist/bin/hot-hook-register.d.ts.map +1 -0
  68. package/dist/bin/hot-hook-register.js +21 -0
  69. package/dist/bin/loader-register.d.ts +2 -0
  70. package/dist/bin/loader-register.d.ts.map +1 -0
  71. package/dist/bin/loader-register.js +34 -0
  72. package/dist/database/_batch_update.d.ts +5 -3
  73. package/dist/database/_batch_update.d.ts.map +1 -1
  74. package/dist/database/_batch_update.js +95 -2
  75. package/dist/database/base-model.d.ts +96 -10
  76. package/dist/database/base-model.d.ts.map +1 -1
  77. package/dist/database/base-model.js +390 -2
  78. package/dist/database/base-model.types.d.ts +93 -0
  79. package/dist/database/base-model.types.d.ts.map +1 -0
  80. package/dist/database/base-model.types.js +10 -0
  81. package/dist/database/code-generator.d.ts +1 -1
  82. package/dist/database/code-generator.d.ts.map +1 -1
  83. package/dist/database/code-generator.js +54 -2
  84. package/dist/database/db.d.ts +6 -21
  85. package/dist/database/db.d.ts.map +1 -1
  86. package/dist/database/db.js +129 -2
  87. package/dist/database/puri-subset.test-d.js +81 -0
  88. package/dist/database/puri-subset.types.d.ts +123 -0
  89. package/dist/database/puri-subset.types.d.ts.map +1 -0
  90. package/dist/database/puri-subset.types.js +16 -0
  91. package/dist/database/puri-wrapper.d.ts +13 -11
  92. package/dist/database/puri-wrapper.d.ts.map +1 -1
  93. package/dist/database/puri-wrapper.js +109 -2
  94. package/dist/database/puri.d.ts +41 -23
  95. package/dist/database/puri.d.ts.map +1 -1
  96. package/dist/database/puri.js +601 -2
  97. package/dist/database/puri.types.d.ts +25 -6
  98. package/dist/database/puri.types.d.ts.map +1 -1
  99. package/dist/database/puri.types.js +6 -2
  100. package/dist/database/transaction-context.d.ts +1 -1
  101. package/dist/database/transaction-context.d.ts.map +1 -1
  102. package/dist/database/transaction-context.js +14 -2
  103. package/dist/database/upsert-builder.d.ts +9 -3
  104. package/dist/database/upsert-builder.d.ts.map +1 -1
  105. package/dist/database/upsert-builder.js +365 -2
  106. package/dist/entity/entity-manager.d.ts +167 -2
  107. package/dist/entity/entity-manager.d.ts.map +1 -1
  108. package/dist/entity/entity-manager.js +130 -2
  109. package/dist/entity/entity.d.ts +5 -3
  110. package/dist/entity/entity.d.ts.map +1 -1
  111. package/dist/entity/entity.js +750 -2
  112. package/dist/exceptions/error-handler.d.ts +1 -1
  113. package/dist/exceptions/error-handler.d.ts.map +1 -1
  114. package/dist/exceptions/error-handler.js +29 -2
  115. package/dist/exceptions/so-exceptions.d.ts +1 -1
  116. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  117. package/dist/exceptions/so-exceptions.js +85 -2
  118. package/dist/file-storage/driver.d.ts +1 -1
  119. package/dist/file-storage/driver.d.ts.map +1 -1
  120. package/dist/file-storage/driver.js +79 -2
  121. package/dist/file-storage/file-storage.js +75 -2
  122. package/dist/index.d.ts +18 -9
  123. package/dist/index.d.ts.map +1 -1
  124. package/dist/index.js +34 -2
  125. package/dist/migration/code-generation.d.ts +1 -1
  126. package/dist/migration/code-generation.d.ts.map +1 -1
  127. package/dist/migration/code-generation.js +614 -2
  128. package/dist/migration/migration-set.d.ts +2 -10
  129. package/dist/migration/migration-set.d.ts.map +1 -1
  130. package/dist/migration/migration-set.js +213 -2
  131. package/dist/migration/migrator.d.ts +24 -82
  132. package/dist/migration/migrator.d.ts.map +1 -1
  133. package/dist/migration/migrator.js +330 -2
  134. package/dist/migration/postgresql-schema-reader.d.ts +51 -0
  135. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -0
  136. package/dist/migration/postgresql-schema-reader.js +245 -0
  137. package/dist/migration/types.d.ts +6 -38
  138. package/dist/migration/types.d.ts.map +1 -1
  139. package/dist/migration/types.js +3 -2
  140. package/dist/naite/messaging-types.d.ts +43 -0
  141. package/dist/naite/messaging-types.d.ts.map +1 -0
  142. package/dist/naite/messaging-types.js +7 -0
  143. package/dist/naite/naite-reporter.d.ts +41 -0
  144. package/dist/naite/naite-reporter.d.ts.map +1 -0
  145. package/dist/naite/naite-reporter.js +102 -0
  146. package/dist/naite/naite.d.ts +95 -0
  147. package/dist/naite/naite.d.ts.map +1 -0
  148. package/dist/naite/naite.js +316 -0
  149. package/dist/stream/index.js +3 -2
  150. package/dist/stream/sse.d.ts +2 -2
  151. package/dist/stream/sse.d.ts.map +1 -1
  152. package/dist/stream/sse.js +38 -2
  153. package/dist/syncer/api-parser.d.ts +10 -0
  154. package/dist/syncer/api-parser.d.ts.map +1 -0
  155. package/dist/syncer/api-parser.js +240 -0
  156. package/dist/syncer/checksum.d.ts +21 -0
  157. package/dist/syncer/checksum.d.ts.map +1 -0
  158. package/dist/syncer/checksum.js +98 -0
  159. package/dist/syncer/code-generator.d.ts +20 -0
  160. package/dist/syncer/code-generator.d.ts.map +1 -0
  161. package/dist/syncer/code-generator.js +161 -0
  162. package/dist/syncer/entity-operations.d.ts +17 -0
  163. package/dist/syncer/entity-operations.d.ts.map +1 -0
  164. package/dist/syncer/entity-operations.js +59 -0
  165. package/dist/syncer/file-patterns.d.ts +29 -0
  166. package/dist/syncer/file-patterns.d.ts.map +1 -0
  167. package/dist/syncer/file-patterns.js +38 -0
  168. package/dist/syncer/index.d.ts +6 -0
  169. package/dist/syncer/index.d.ts.map +1 -1
  170. package/dist/syncer/index.js +9 -2
  171. package/dist/syncer/module-loader.d.ts +35 -0
  172. package/dist/syncer/module-loader.d.ts.map +1 -0
  173. package/dist/syncer/module-loader.js +87 -0
  174. package/dist/syncer/syncer.d.ts +98 -106
  175. package/dist/syncer/syncer.d.ts.map +1 -1
  176. package/dist/syncer/syncer.js +422 -2
  177. package/dist/template/entity-converter.d.ts +14 -0
  178. package/dist/template/entity-converter.d.ts.map +1 -0
  179. package/dist/template/entity-converter.js +108 -0
  180. package/dist/template/helpers.d.ts +23 -0
  181. package/dist/template/helpers.d.ts.map +1 -0
  182. package/dist/template/helpers.js +64 -0
  183. package/dist/{templates → template/implementations}/entity.template.d.ts +3 -3
  184. package/dist/template/implementations/entity.template.d.ts.map +1 -0
  185. package/dist/template/implementations/entity.template.js +86 -0
  186. package/dist/{templates → template/implementations}/generated.template.d.ts +3 -4
  187. package/dist/template/implementations/generated.template.d.ts.map +1 -0
  188. package/dist/template/implementations/generated.template.js +249 -0
  189. package/dist/{templates → template/implementations}/generated_http.template.d.ts +3 -4
  190. package/dist/template/implementations/generated_http.template.d.ts.map +1 -0
  191. package/dist/template/implementations/generated_http.template.js +131 -0
  192. package/dist/{templates → template/implementations}/generated_sso.template.d.ts +4 -5
  193. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -0
  194. package/dist/template/implementations/generated_sso.template.js +134 -0
  195. package/dist/{templates → template/implementations}/init_types.template.d.ts +3 -3
  196. package/dist/template/implementations/init_types.template.d.ts.map +1 -0
  197. package/dist/template/implementations/init_types.template.js +38 -0
  198. package/dist/template/implementations/model.template.d.ts +17 -0
  199. package/dist/template/implementations/model.template.d.ts.map +1 -0
  200. package/dist/template/implementations/model.template.js +181 -0
  201. package/dist/{templates → template/implementations}/model_test.template.d.ts +3 -3
  202. package/dist/template/implementations/model_test.template.d.ts.map +1 -0
  203. package/dist/template/implementations/model_test.template.js +35 -0
  204. package/dist/{templates → template/implementations}/service.template.d.ts +6 -6
  205. package/dist/template/implementations/service.template.d.ts.map +1 -0
  206. package/dist/template/implementations/service.template.js +201 -0
  207. package/dist/{templates → template/implementations}/view_enums_buttonset.template.d.ts +3 -3
  208. package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +1 -0
  209. package/dist/template/implementations/view_enums_buttonset.template.js +31 -0
  210. package/dist/{templates → template/implementations}/view_enums_dropdown.template.d.ts +3 -4
  211. package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +1 -0
  212. package/dist/template/implementations/view_enums_dropdown.template.js +50 -0
  213. package/dist/{templates → template/implementations}/view_enums_select.template.d.ts +3 -3
  214. package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -0
  215. package/dist/template/implementations/view_enums_select.template.js +55 -0
  216. package/dist/{templates → template/implementations}/view_form.template.d.ts +5 -5
  217. package/dist/template/implementations/view_form.template.d.ts.map +1 -0
  218. package/dist/template/implementations/view_form.template.js +337 -0
  219. package/dist/{templates → template/implementations}/view_id_all_select.template.d.ts +3 -3
  220. package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -0
  221. package/dist/template/implementations/view_id_all_select.template.js +31 -0
  222. package/dist/{templates → template/implementations}/view_id_async_select.template.d.ts +3 -3
  223. package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -0
  224. package/dist/template/implementations/view_id_async_select.template.js +105 -0
  225. package/dist/{templates → template/implementations}/view_list.template.d.ts +5 -13
  226. package/dist/template/implementations/view_list.template.d.ts.map +1 -0
  227. package/dist/template/implementations/view_list.template.js +475 -0
  228. package/dist/template/implementations/view_list_columns.template.d.ts +17 -0
  229. package/dist/template/implementations/view_list_columns.template.d.ts.map +1 -0
  230. package/dist/template/implementations/view_list_columns.template.js +49 -0
  231. package/dist/{templates → template/implementations}/view_search_input.template.d.ts +3 -3
  232. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -0
  233. package/dist/template/implementations/view_search_input.template.js +64 -0
  234. package/dist/template/index.d.ts +7 -0
  235. package/dist/template/index.d.ts.map +1 -0
  236. package/dist/template/index.js +8 -0
  237. package/dist/template/template-manager.d.ts +56 -0
  238. package/dist/template/template-manager.d.ts.map +1 -0
  239. package/dist/template/template-manager.js +125 -0
  240. package/dist/template/template-types.d.ts +16 -0
  241. package/dist/template/template-types.d.ts.map +1 -0
  242. package/dist/template/template-types.js +7 -0
  243. package/dist/template/template.d.ts +49 -0
  244. package/dist/template/template.d.ts.map +1 -0
  245. package/dist/template/template.js +60 -0
  246. package/dist/template/zod-converter.d.ts +51 -0
  247. package/dist/template/zod-converter.d.ts.map +1 -0
  248. package/dist/template/zod-converter.js +449 -0
  249. package/dist/testing/_relation-graph.d.ts +1 -1
  250. package/dist/testing/_relation-graph.d.ts.map +1 -1
  251. package/dist/testing/_relation-graph.js +89 -2
  252. package/dist/testing/fixture-manager.d.ts +42 -11
  253. package/dist/testing/fixture-manager.d.ts.map +1 -1
  254. package/dist/testing/fixture-manager.js +623 -2
  255. package/dist/types/types.d.ts +747 -143
  256. package/dist/types/types.d.ts.map +1 -1
  257. package/dist/types/types.js +546 -2
  258. package/dist/typings/knex.d.js +3 -2
  259. package/dist/utils/async-utils.d.ts +7 -0
  260. package/dist/utils/async-utils.d.ts.map +1 -1
  261. package/dist/utils/async-utils.js +57 -2
  262. package/dist/utils/console-util.d.ts +2 -0
  263. package/dist/utils/console-util.d.ts.map +1 -0
  264. package/dist/utils/console-util.js +6 -0
  265. package/dist/utils/controller.d.ts +1 -0
  266. package/dist/utils/controller.d.ts.map +1 -1
  267. package/dist/utils/controller.js +29 -2
  268. package/dist/utils/esm-utils.d.ts +39 -0
  269. package/dist/utils/esm-utils.d.ts.map +1 -0
  270. package/dist/utils/esm-utils.js +49 -0
  271. package/dist/utils/formatter.d.ts +3 -0
  272. package/dist/utils/formatter.d.ts.map +1 -0
  273. package/dist/utils/formatter.js +110 -0
  274. package/dist/utils/fs-utils.d.ts +1 -1
  275. package/dist/utils/fs-utils.d.ts.map +1 -1
  276. package/dist/utils/fs-utils.js +17 -2
  277. package/dist/utils/lodash-able.d.ts.map +1 -1
  278. package/dist/utils/lodash-able.js +6 -2
  279. package/dist/utils/model.js +22 -2
  280. package/dist/utils/object-utils.d.ts +44 -0
  281. package/dist/utils/object-utils.d.ts.map +1 -0
  282. package/dist/utils/object-utils.js +191 -0
  283. package/dist/utils/path-utils.d.ts +89 -0
  284. package/dist/utils/path-utils.d.ts.map +1 -0
  285. package/dist/utils/path-utils.js +60 -0
  286. package/dist/utils/process-utils.d.ts +13 -0
  287. package/dist/utils/process-utils.d.ts.map +1 -0
  288. package/dist/utils/process-utils.js +36 -0
  289. package/dist/utils/sql-parser.d.ts +5 -1
  290. package/dist/utils/sql-parser.d.ts.map +1 -1
  291. package/dist/utils/sql-parser.js +46 -2
  292. package/dist/utils/type-utils.d.ts +23 -0
  293. package/dist/utils/type-utils.d.ts.map +1 -0
  294. package/dist/utils/type-utils.js +45 -0
  295. package/dist/utils/utils.d.ts +10 -7
  296. package/dist/utils/utils.d.ts.map +1 -1
  297. package/dist/utils/utils.js +72 -2
  298. package/dist/utils/zod-error.d.ts +1 -1
  299. package/dist/utils/zod-error.d.ts.map +1 -1
  300. package/dist/utils/zod-error.js +19 -2
  301. package/package.json +65 -27
  302. package/src/ai/agents/agent.ts +87 -0
  303. package/src/ai/agents/index.ts +2 -0
  304. package/src/ai/agents/types.ts +47 -0
  305. package/src/ai/index.ts +1 -0
  306. package/src/ai/providers/rtzr/api.ts +37 -0
  307. package/src/ai/providers/rtzr/error.ts +34 -0
  308. package/src/ai/providers/rtzr/index.ts +4 -0
  309. package/src/ai/providers/rtzr/model.ts +201 -0
  310. package/src/ai/providers/rtzr/options.ts +49 -0
  311. package/src/ai/providers/rtzr/provider.ts +91 -0
  312. package/src/ai/providers/rtzr/utils.ts +127 -0
  313. package/src/api/base-frame.ts +4 -2
  314. package/src/api/caster.ts +17 -23
  315. package/src/api/code-converters.ts +178 -535
  316. package/src/api/config.ts +125 -0
  317. package/src/api/context.ts +7 -17
  318. package/src/api/decorators.ts +176 -46
  319. package/src/api/index.ts +2 -2
  320. package/src/api/sonamu.ts +190 -167
  321. package/src/api/validator.ts +83 -0
  322. package/src/bin/build-config.ts +8 -1
  323. package/src/bin/cli.ts +258 -124
  324. package/src/bin/hot-hook-register.ts +22 -0
  325. package/src/bin/loader-register.ts +38 -0
  326. package/src/database/_batch_update.ts +46 -31
  327. package/src/database/base-model.ts +390 -182
  328. package/src/database/base-model.types.ts +155 -0
  329. package/src/database/code-generator.ts +13 -32
  330. package/src/database/db.ts +40 -96
  331. package/src/database/puri-subset.test-d.ts +471 -0
  332. package/src/database/puri-subset.types.ts +195 -0
  333. package/src/database/puri-wrapper.ts +58 -67
  334. package/src/database/puri.ts +229 -148
  335. package/src/database/puri.types.ts +76 -30
  336. package/src/database/transaction-context.ts +1 -1
  337. package/src/database/upsert-builder.ts +262 -132
  338. package/src/entity/entity-manager.ts +48 -36
  339. package/src/entity/entity.ts +330 -248
  340. package/src/exceptions/error-handler.ts +3 -3
  341. package/src/exceptions/so-exceptions.ts +11 -11
  342. package/src/file-storage/driver.ts +5 -5
  343. package/src/file-storage/file-storage.ts +2 -2
  344. package/src/index.ts +18 -10
  345. package/src/migration/code-generation.ts +185 -172
  346. package/src/migration/migration-set.ts +80 -293
  347. package/src/migration/migrator.ts +199 -571
  348. package/src/migration/mysql-schema-reader.ts.txt +272 -0
  349. package/src/migration/postgresql-schema-reader.ts +310 -0
  350. package/src/migration/types.ts +6 -39
  351. package/src/naite/messaging-types.ts +51 -0
  352. package/src/naite/naite-reporter.ts +128 -0
  353. package/src/naite/naite.ts +415 -0
  354. package/src/shared/web.shared.ts.txt +20 -24
  355. package/src/stream/sse.ts +5 -5
  356. package/src/syncer/api-parser.ts +282 -0
  357. package/src/syncer/checksum.ts +140 -0
  358. package/src/syncer/code-generator.ts +198 -0
  359. package/src/syncer/entity-operations.ts +65 -0
  360. package/src/syncer/file-patterns.ts +56 -0
  361. package/src/syncer/index.ts +6 -0
  362. package/src/syncer/module-loader.ts +128 -0
  363. package/src/syncer/syncer.ts +389 -1453
  364. package/src/template/entity-converter.ts +114 -0
  365. package/src/template/helpers.ts +81 -0
  366. package/src/{templates → template/implementations}/entity.template.ts +7 -7
  367. package/src/{templates → template/implementations}/generated.template.ts +101 -101
  368. package/src/{templates → template/implementations}/generated_http.template.ts +27 -57
  369. package/src/template/implementations/generated_sso.template.ts +151 -0
  370. package/src/{templates → template/implementations}/init_types.template.ts +5 -7
  371. package/src/{templates → template/implementations}/model.template.ts +52 -43
  372. package/src/{templates → template/implementations}/model_test.template.ts +5 -5
  373. package/src/{templates → template/implementations}/service.template.ts +66 -82
  374. package/src/{templates → template/implementations}/view_enums_buttonset.template.ts +3 -3
  375. package/src/{templates → template/implementations}/view_enums_dropdown.template.ts +4 -20
  376. package/src/{templates → template/implementations}/view_enums_select.template.ts +4 -4
  377. package/src/{templates → template/implementations}/view_form.template.ts +40 -83
  378. package/src/{templates → template/implementations}/view_id_all_select.template.ts +3 -3
  379. package/src/{templates → template/implementations}/view_id_async_select.template.ts +10 -24
  380. package/src/{templates → template/implementations}/view_list.template.ts +60 -152
  381. package/src/{templates → template/implementations}/view_list_columns.template.ts +5 -11
  382. package/src/{templates → template/implementations}/view_search_input.template.ts +3 -3
  383. package/src/template/index.ts +6 -0
  384. package/src/template/template-manager.ts +166 -0
  385. package/src/template/template-types.ts +16 -0
  386. package/src/template/template.ts +105 -0
  387. package/src/template/zod-converter.ts +525 -0
  388. package/src/testing/_relation-graph.ts +18 -11
  389. package/src/testing/fixture-manager.ts +472 -359
  390. package/src/types/types.ts +553 -308
  391. package/src/typings/knex.d.ts +7 -9
  392. package/src/utils/async-utils.ts +23 -10
  393. package/src/utils/console-util.ts +4 -0
  394. package/src/utils/controller.ts +3 -0
  395. package/src/utils/esm-utils.ts +59 -0
  396. package/src/utils/formatter.ts +109 -0
  397. package/src/utils/fs-utils.ts +1 -1
  398. package/src/utils/lodash-able.ts +1 -4
  399. package/src/utils/object-utils.ts +217 -0
  400. package/src/utils/path-utils.ts +99 -0
  401. package/src/utils/process-utils.ts +46 -0
  402. package/src/utils/sql-parser.ts +23 -5
  403. package/src/utils/type-utils.ts +83 -0
  404. package/src/utils/utils.ts +66 -43
  405. package/src/utils/zod-error.ts +3 -4
  406. package/dist/api/base-frame.js.map +0 -1
  407. package/dist/api/caster.js.map +0 -1
  408. package/dist/api/code-converters.js.map +0 -1
  409. package/dist/api/context.js.map +0 -1
  410. package/dist/api/decorators.js.map +0 -1
  411. package/dist/api/index.js.map +0 -1
  412. package/dist/api/sonamu.js.map +0 -1
  413. package/dist/bin/build-config.js.map +0 -1
  414. package/dist/bin/cli-wrapper.d.ts +0 -3
  415. package/dist/bin/cli-wrapper.d.ts.map +0 -1
  416. package/dist/bin/cli-wrapper.js +0 -3
  417. package/dist/bin/cli-wrapper.js.map +0 -1
  418. package/dist/bin/cli.js.map +0 -1
  419. package/dist/database/_batch_update.js.map +0 -1
  420. package/dist/database/base-model.js.map +0 -1
  421. package/dist/database/code-generator.js.map +0 -1
  422. package/dist/database/db.js.map +0 -1
  423. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts +0 -2
  424. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts.map +0 -1
  425. package/dist/database/knex-plugins/knex-on-duplicate-update.js +0 -2
  426. package/dist/database/knex-plugins/knex-on-duplicate-update.js.map +0 -1
  427. package/dist/database/puri-wrapper.js.map +0 -1
  428. package/dist/database/puri.js.map +0 -1
  429. package/dist/database/puri.types.js.map +0 -1
  430. package/dist/database/transaction-context.js.map +0 -1
  431. package/dist/database/upsert-builder.js.map +0 -1
  432. package/dist/entity/entity-manager.js.map +0 -1
  433. package/dist/entity/entity-utils.d.ts +0 -61
  434. package/dist/entity/entity-utils.d.ts.map +0 -1
  435. package/dist/entity/entity-utils.js +0 -2
  436. package/dist/entity/entity-utils.js.map +0 -1
  437. package/dist/entity/entity.js.map +0 -1
  438. package/dist/exceptions/error-handler.js.map +0 -1
  439. package/dist/exceptions/so-exceptions.js.map +0 -1
  440. package/dist/file-storage/driver.js.map +0 -1
  441. package/dist/file-storage/file-storage.js.map +0 -1
  442. package/dist/index.js.map +0 -1
  443. package/dist/migration/code-generation.js.map +0 -1
  444. package/dist/migration/migration-set.js.map +0 -1
  445. package/dist/migration/migrator.js.map +0 -1
  446. package/dist/migration/types.js.map +0 -1
  447. package/dist/stream/index.js.map +0 -1
  448. package/dist/stream/sse.js.map +0 -1
  449. package/dist/syncer/index.js.map +0 -1
  450. package/dist/syncer/syncer.js.map +0 -1
  451. package/dist/templates/base-template.d.ts +0 -13
  452. package/dist/templates/base-template.d.ts.map +0 -1
  453. package/dist/templates/base-template.js +0 -2
  454. package/dist/templates/base-template.js.map +0 -1
  455. package/dist/templates/entity.template.d.ts.map +0 -1
  456. package/dist/templates/entity.template.js +0 -2
  457. package/dist/templates/entity.template.js.map +0 -1
  458. package/dist/templates/generated.template.d.ts.map +0 -1
  459. package/dist/templates/generated.template.js +0 -2
  460. package/dist/templates/generated.template.js.map +0 -1
  461. package/dist/templates/generated_http.template.d.ts.map +0 -1
  462. package/dist/templates/generated_http.template.js +0 -2
  463. package/dist/templates/generated_http.template.js.map +0 -1
  464. package/dist/templates/generated_sso.template.d.ts.map +0 -1
  465. package/dist/templates/generated_sso.template.js +0 -2
  466. package/dist/templates/generated_sso.template.js.map +0 -1
  467. package/dist/templates/index.d.ts +0 -2
  468. package/dist/templates/index.d.ts.map +0 -1
  469. package/dist/templates/index.js +0 -2
  470. package/dist/templates/index.js.map +0 -1
  471. package/dist/templates/init_types.template.d.ts.map +0 -1
  472. package/dist/templates/init_types.template.js +0 -2
  473. package/dist/templates/init_types.template.js.map +0 -1
  474. package/dist/templates/model.template.d.ts +0 -17
  475. package/dist/templates/model.template.d.ts.map +0 -1
  476. package/dist/templates/model.template.js +0 -2
  477. package/dist/templates/model.template.js.map +0 -1
  478. package/dist/templates/model_test.template.d.ts.map +0 -1
  479. package/dist/templates/model_test.template.js +0 -2
  480. package/dist/templates/model_test.template.js.map +0 -1
  481. package/dist/templates/service.template.d.ts.map +0 -1
  482. package/dist/templates/service.template.js +0 -2
  483. package/dist/templates/service.template.js.map +0 -1
  484. package/dist/templates/view_enums_buttonset.template.d.ts.map +0 -1
  485. package/dist/templates/view_enums_buttonset.template.js +0 -2
  486. package/dist/templates/view_enums_buttonset.template.js.map +0 -1
  487. package/dist/templates/view_enums_dropdown.template.d.ts.map +0 -1
  488. package/dist/templates/view_enums_dropdown.template.js +0 -2
  489. package/dist/templates/view_enums_dropdown.template.js.map +0 -1
  490. package/dist/templates/view_enums_select.template.d.ts.map +0 -1
  491. package/dist/templates/view_enums_select.template.js +0 -2
  492. package/dist/templates/view_enums_select.template.js.map +0 -1
  493. package/dist/templates/view_form.template.d.ts.map +0 -1
  494. package/dist/templates/view_form.template.js +0 -2
  495. package/dist/templates/view_form.template.js.map +0 -1
  496. package/dist/templates/view_id_all_select.template.d.ts.map +0 -1
  497. package/dist/templates/view_id_all_select.template.js +0 -2
  498. package/dist/templates/view_id_all_select.template.js.map +0 -1
  499. package/dist/templates/view_id_async_select.template.d.ts.map +0 -1
  500. package/dist/templates/view_id_async_select.template.js +0 -2
  501. package/dist/templates/view_id_async_select.template.js.map +0 -1
  502. package/dist/templates/view_list.template.d.ts.map +0 -1
  503. package/dist/templates/view_list.template.js +0 -2
  504. package/dist/templates/view_list.template.js.map +0 -1
  505. package/dist/templates/view_list_columns.template.d.ts +0 -17
  506. package/dist/templates/view_list_columns.template.d.ts.map +0 -1
  507. package/dist/templates/view_list_columns.template.js +0 -2
  508. package/dist/templates/view_list_columns.template.js.map +0 -1
  509. package/dist/templates/view_search_input.template.d.ts.map +0 -1
  510. package/dist/templates/view_search_input.template.js +0 -2
  511. package/dist/templates/view_search_input.template.js.map +0 -1
  512. package/dist/testing/_relation-graph.js.map +0 -1
  513. package/dist/testing/fixture-manager.js.map +0 -1
  514. package/dist/types/types.js.map +0 -1
  515. package/dist/typings/knex.d.js.map +0 -1
  516. package/dist/utils/async-utils.js.map +0 -1
  517. package/dist/utils/controller.js.map +0 -1
  518. package/dist/utils/fs-utils.js.map +0 -1
  519. package/dist/utils/lodash-able.js.map +0 -1
  520. package/dist/utils/model.js.map +0 -1
  521. package/dist/utils/sql-parser.js.map +0 -1
  522. package/dist/utils/utils.js.map +0 -1
  523. package/dist/utils/zod-error.js.map +0 -1
  524. package/src/bin/cli-wrapper.ts +0 -75
  525. package/src/database/knex-plugins/knex-on-duplicate-update.ts +0 -45
  526. package/src/entity/entity-utils.ts +0 -291
  527. package/src/templates/base-template.ts +0 -19
  528. package/src/templates/generated_sso.template.ts +0 -138
  529. package/src/templates/index.ts +0 -1
@@ -1,2 +1,546 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get ApiParamType(){return ApiParamType},get GenerateOptions(){return GenerateOptions},get PathAndCode(){return PathAndCode},get RenderingNode(){return RenderingNode},get SQLDateTimeString(){return SQLDateTimeString},get SonamuQueryMode(){return SonamuQueryMode},get TemplateKey(){return TemplateKey},get TemplateOptions(){return TemplateOptions},get isBelongsToOneRelationProp(){return isBelongsToOneRelationProp},get isBigIntegerProp(){return isBigIntegerProp},get isBooleanProp(){return isBooleanProp},get isCustomJoinClause(){return isCustomJoinClause},get isDateProp(){return isDateProp},get isDateTimeProp(){return isDateTimeProp},get isDecimalProp(){return isDecimalProp},get isDoubleProp(){return isDoubleProp},get isEnumProp(){return isEnumProp},get isFloatProp(){return isFloatProp},get isHasManyRelationProp(){return isHasManyRelationProp},get isIntegerProp(){return isIntegerProp},get isJsonProp(){return isJsonProp},get isKnexError(){return isKnexError},get isManyToManyRelationProp(){return isManyToManyRelationProp},get isOneToOneRelationProp(){return isOneToOneRelationProp},get isRelationProp(){return isRelationProp},get isStringProp(){return isStringProp},get isTextProp(){return isTextProp},get isTimeProp(){return isTimeProp},get isTimestampProp(){return isTimestampProp},get isUuidProp(){return isUuidProp},get isVirtualProp(){return isVirtualProp},get zArrayable(){return zArrayable}});var _zod=require("zod");var SQLDateTimeString=_zod.z.string().regex(/([0-9]{4}-[0-9]{2}-[0-9]{2}( [0-9]{2}:[0-9]{2}:[0-9]{2})*)$/,{message:"잘못된 SQLDate 타입"}).min(10).max(19).describe("SQLDateTimeString");function zArrayable(shape){return _zod.z.union([shape,shape.array()])}function isIntegerProp(p){return(p===null||p===void 0?void 0:p.type)==="integer"}function isBigIntegerProp(p){return(p===null||p===void 0?void 0:p.type)==="bigInteger"}function isTextProp(p){return(p===null||p===void 0?void 0:p.type)==="text"}function isStringProp(p){return(p===null||p===void 0?void 0:p.type)==="string"}function isEnumProp(p){return(p===null||p===void 0?void 0:p.type)==="enum"}function isFloatProp(p){return(p===null||p===void 0?void 0:p.type)==="float"}function isDoubleProp(p){return(p===null||p===void 0?void 0:p.type)==="double"}function isDecimalProp(p){return(p===null||p===void 0?void 0:p.type)==="decimal"}function isBooleanProp(p){return(p===null||p===void 0?void 0:p.type)==="boolean"}function isDateProp(p){return(p===null||p===void 0?void 0:p.type)==="date"}function isDateTimeProp(p){return(p===null||p===void 0?void 0:p.type)==="datetime"}function isTimeProp(p){return(p===null||p===void 0?void 0:p.type)==="time"}function isTimestampProp(p){return(p===null||p===void 0?void 0:p.type)==="timestamp"}function isJsonProp(p){return(p===null||p===void 0?void 0:p.type)==="json"}function isUuidProp(p){return(p===null||p===void 0?void 0:p.type)==="uuid"}function isVirtualProp(p){return(p===null||p===void 0?void 0:p.type)==="virtual"}function isRelationProp(p){return(p===null||p===void 0?void 0:p.type)==="relation"}function isOneToOneRelationProp(p){return(p===null||p===void 0?void 0:p.relationType)==="OneToOne"}function isBelongsToOneRelationProp(p){return(p===null||p===void 0?void 0:p.relationType)==="BelongsToOne"}function isHasManyRelationProp(p){return(p===null||p===void 0?void 0:p.relationType)==="HasMany"}function isManyToManyRelationProp(p){return(p===null||p===void 0?void 0:p.relationType)==="ManyToMany"}function isCustomJoinClause(p){return p===null||p===void 0?void 0:p.custom}var SonamuQueryMode=_zod.z.enum(["both","list","count"]);function isKnexError(e){return e.code&&e.sqlMessage&&e.sqlState}(function(ApiParamType){function isObject(v){return(v===null||v===void 0?void 0:v.t)==="object"}ApiParamType.isObject=isObject;function isUnion(v){return(v===null||v===void 0?void 0:v.t)==="union"}ApiParamType.isUnion=isUnion;function isIntersection(v){return(v===null||v===void 0?void 0:v.t)==="intersection"}ApiParamType.isIntersection=isIntersection;function isStringLiteral(v){return(v===null||v===void 0?void 0:v.t)==="string-literal"}ApiParamType.isStringLiteral=isStringLiteral;function isNumericLiteral(v){return(v===null||v===void 0?void 0:v.t)==="numeric-literal"}ApiParamType.isNumericLiteral=isNumericLiteral;function isArray(v){return(v===null||v===void 0?void 0:v.t)==="array"}ApiParamType.isArray=isArray;function isRef(v){return(v===null||v===void 0?void 0:v.t)==="ref"}ApiParamType.isRef=isRef;function isIndexedAccess(v){return(v===null||v===void 0?void 0:v.t)==="indexed-access"}ApiParamType.isIndexedAccess=isIndexedAccess;function isTupleType(v){return(v===null||v===void 0?void 0:v.t)==="tuple-type"}ApiParamType.isTupleType=isTupleType;function isPick(v){return(v===null||v===void 0?void 0:v.t)==="ref"&&v.id==="Pick"}ApiParamType.isPick=isPick;function isOmit(v){return(v===null||v===void 0?void 0:v.t)==="ref"&&v.id==="Omit"}ApiParamType.isOmit=isOmit;function isPartial(v){return(v===null||v===void 0?void 0:v.t)==="ref"&&v.id==="Partial"}ApiParamType.isPartial=isPartial;function isPromise(v){return(v===null||v===void 0?void 0:v.t)==="ref"&&v.id==="Promise"}ApiParamType.isPromise=isPromise;function isContext(v){return(v===null||v===void 0?void 0:v.t)==="ref"&&v.id==="Context"}ApiParamType.isContext=isContext;function isRefKnex(v){return(v===null||v===void 0?void 0:v.t)==="ref"&&v.id==="Knex"}ApiParamType.isRefKnex=isRefKnex;function isTypeParam(v){return(v===null||v===void 0?void 0:v.t)==="type-param"}ApiParamType.isTypeParam=isTypeParam})(ApiParamType||(ApiParamType={}));var RenderingNode=_zod.z.any();var TemplateOptions=_zod.z.object({entity:_zod.z.object({entityId:_zod.z.string(),parentId:_zod.z.string().optional(),title:_zod.z.string(),table:_zod.z.string().optional(),props:_zod.z.array(_zod.z.object({})).optional(),indexes:_zod.z.array(_zod.z.object({})).optional(),subsets:_zod.z.object({}).optional(),enums:_zod.z.object({}).optional()}),init_types:_zod.z.object({entityId:_zod.z.string()}),generated:_zod.z.object({}),generated_sso:_zod.z.object({}),generated_http:_zod.z.object({entityId:_zod.z.string()}),model:_zod.z.object({entityId:_zod.z.string(),defaultSearchField:_zod.z.string(),defaultOrderBy:_zod.z.string()}),model_test:_zod.z.object({entityId:_zod.z.string()}),bridge:_zod.z.object({entityId:_zod.z.string()}),service:_zod.z.object({namesRecord:_zod.z.object({fs:_zod.z.string(),fsPlural:_zod.z.string(),camel:_zod.z.string(),camelPlural:_zod.z.string(),capital:_zod.z.string(),capitalPlural:_zod.z.string(),upper:_zod.z.string(),constant:_zod.z.string()}),modelTsPath:_zod.z.string()}),view_list:_zod.z.object({entityId:_zod.z.string(),extra:_zod.z.unknown()}),view_list_columns:_zod.z.object({entityId:_zod.z.string(),columns:_zod.z.object({name:_zod.z.string(),label:_zod.z.string(),tc:_zod.z.string()}).array(),columnImports:_zod.z.string()}),view_search_input:_zod.z.object({entityId:_zod.z.string()}),view_form:_zod.z.object({entityId:_zod.z.string()}),view_id_all_select:_zod.z.object({entityId:_zod.z.string()}),view_id_async_select:_zod.z.object({entityId:_zod.z.string(),textField:_zod.z.string()}),view_enums_select:_zod.z.object({entityId:_zod.z.string(),enumId:_zod.z.string()}),view_enums_dropdown:_zod.z.object({entityId:_zod.z.string(),enumId:_zod.z.string()}),view_enums_buttonset:_zod.z.object({entityId:_zod.z.string(),enumId:_zod.z.string()})});var TemplateKey=_zod.z.enum(["entity","init_types","generated","generated_sso","generated_http","model","model_test","bridge","service","view_list","view_list_columns","view_search_input","view_form","view_id_all_select","view_id_async_select","view_enums_select","view_enums_dropdown","view_enums_buttonset"]);var GenerateOptions=_zod.z.object({overwrite:_zod.z.boolean().optional()});var PathAndCode=_zod.z.object({path:_zod.z.string(),code:_zod.z.string()});var ApiParamType;
2
- //# sourceMappingURL=types.js.map
1
+ import { z } from "zod";
2
+ /*
3
+ Utility Types
4
+ */ export function zArrayable(shape) {
5
+ return z.union([
6
+ shape,
7
+ shape.array()
8
+ ]);
9
+ }
10
+ /*
11
+ Prop Type Guards
12
+ */ export function isIntegerSingleProp(p) {
13
+ return p?.type === "integer";
14
+ }
15
+ export function isIntegerArrayProp(p) {
16
+ return p?.type === "integer[]";
17
+ }
18
+ export function isIntegerProp(p) {
19
+ return isIntegerSingleProp(p) || isIntegerArrayProp(p);
20
+ }
21
+ export function isBigIntegerSingleProp(p) {
22
+ return p?.type === "bigInteger";
23
+ }
24
+ export function isBigIntegerArrayProp(p) {
25
+ return p?.type === "bigInteger[]";
26
+ }
27
+ export function isBigIntegerProp(p) {
28
+ return isBigIntegerSingleProp(p) || isBigIntegerArrayProp(p);
29
+ }
30
+ export function isStringSingleProp(p) {
31
+ return p?.type === "string";
32
+ }
33
+ export function isStringArrayProp(p) {
34
+ return p?.type === "string[]";
35
+ }
36
+ export function isStringProp(p) {
37
+ return isStringSingleProp(p) || isStringArrayProp(p);
38
+ }
39
+ export function isEnumSingleProp(p) {
40
+ return p?.type === "enum";
41
+ }
42
+ export function isEnumArrayProp(p) {
43
+ return p?.type === "enum[]";
44
+ }
45
+ export function isEnumProp(p) {
46
+ return isEnumSingleProp(p) || isEnumArrayProp(p);
47
+ }
48
+ export function isNumberSingleProp(p) {
49
+ return p?.type === "number";
50
+ }
51
+ export function isNumberArrayProp(p) {
52
+ return p?.type === "number[]";
53
+ }
54
+ export function isNumberProp(p) {
55
+ return isNumberSingleProp(p) || isNumberArrayProp(p);
56
+ }
57
+ export function isNumericSingleProp(p) {
58
+ return p?.type === "numeric";
59
+ }
60
+ export function isNumericArrayProp(p) {
61
+ return p?.type === "numeric[]";
62
+ }
63
+ export function isNumericProp(p) {
64
+ return isNumericSingleProp(p) || isNumericArrayProp(p);
65
+ }
66
+ export function isBooleanSingleProp(p) {
67
+ return p?.type === "boolean";
68
+ }
69
+ export function isBooleanArrayProp(p) {
70
+ return p?.type === "boolean[]";
71
+ }
72
+ export function isBooleanProp(p) {
73
+ return isBooleanSingleProp(p) || isBooleanArrayProp(p);
74
+ }
75
+ export function isDateSingleProp(p) {
76
+ return p?.type === "date";
77
+ }
78
+ export function isDateArrayProp(p) {
79
+ return p?.type === "date[]";
80
+ }
81
+ export function isDateProp(p) {
82
+ return isDateSingleProp(p) || isDateArrayProp(p);
83
+ }
84
+ export function isUuidSingleProp(p) {
85
+ return p?.type === "uuid";
86
+ }
87
+ export function isUuidArrayProp(p) {
88
+ return p?.type === "uuid[]";
89
+ }
90
+ export function isUuidProp(p) {
91
+ return isUuidSingleProp(p) || isUuidArrayProp(p);
92
+ }
93
+ export function isJsonProp(p) {
94
+ return p?.type === "json";
95
+ }
96
+ export function isVirtualProp(p) {
97
+ return p?.type === "virtual";
98
+ }
99
+ export function isRelationProp(p) {
100
+ return p?.type === "relation";
101
+ }
102
+ export function isOneToOneRelationProp(p) {
103
+ return p?.relationType === "OneToOne";
104
+ }
105
+ export function isBelongsToOneRelationProp(p) {
106
+ return p?.relationType === "BelongsToOne";
107
+ }
108
+ export function isHasManyRelationProp(p) {
109
+ return p?.relationType === "HasMany";
110
+ }
111
+ export function isManyToManyRelationProp(p) {
112
+ return p?.relationType === "ManyToMany";
113
+ }
114
+ export function isCustomJoinClause(p) {
115
+ return !!p?.custom;
116
+ }
117
+ /* BaseModel */ export const SonamuQueryMode = z.enum([
118
+ "both",
119
+ "list",
120
+ "count"
121
+ ]);
122
+ export function isKnexError(e) {
123
+ return !!e?.code && !!e?.sqlMessage && !!e?.sqlState;
124
+ }
125
+ (function(ApiParamType) {
126
+ function isObject(v) {
127
+ return v?.t === "object";
128
+ }
129
+ ApiParamType.isObject = isObject;
130
+ function isUnion(v) {
131
+ return v?.t === "union";
132
+ }
133
+ ApiParamType.isUnion = isUnion;
134
+ function isIntersection(v) {
135
+ return v?.t === "intersection";
136
+ }
137
+ ApiParamType.isIntersection = isIntersection;
138
+ function isStringLiteral(v) {
139
+ return v?.t === "string-literal";
140
+ }
141
+ ApiParamType.isStringLiteral = isStringLiteral;
142
+ function isNumericLiteral(v) {
143
+ return v?.t === "numeric-literal";
144
+ }
145
+ ApiParamType.isNumericLiteral = isNumericLiteral;
146
+ function isArray(v) {
147
+ return v?.t === "array";
148
+ }
149
+ ApiParamType.isArray = isArray;
150
+ function isRef(v) {
151
+ return typeof v === "object" && v !== null && v.t === "ref";
152
+ }
153
+ ApiParamType.isRef = isRef;
154
+ function isIndexedAccess(v) {
155
+ return typeof v === "object" && v !== null && v.t === "indexed-access";
156
+ }
157
+ ApiParamType.isIndexedAccess = isIndexedAccess;
158
+ function isTupleType(v) {
159
+ return typeof v === "object" && v !== null && v.t === "tuple-type";
160
+ }
161
+ ApiParamType.isTupleType = isTupleType;
162
+ function isPick(v) {
163
+ return typeof v === "object" && v !== null && v.t === "ref" && v.id === "Pick";
164
+ }
165
+ ApiParamType.isPick = isPick;
166
+ function isOmit(v) {
167
+ return typeof v === "object" && v !== null && v.t === "ref" && v.id === "Omit";
168
+ }
169
+ ApiParamType.isOmit = isOmit;
170
+ function isPartial(v) {
171
+ return typeof v === "object" && v !== null && v.t === "ref" && v.id === "Partial";
172
+ }
173
+ ApiParamType.isPartial = isPartial;
174
+ function isPromise(v) {
175
+ return typeof v === "object" && v !== null && v.t === "ref" && v.id === "Promise";
176
+ }
177
+ ApiParamType.isPromise = isPromise;
178
+ function isContext(v) {
179
+ return typeof v === "object" && v !== null && v.t === "ref" && v.id === "Context";
180
+ }
181
+ ApiParamType.isContext = isContext;
182
+ function isRefKnex(v) {
183
+ return typeof v === "object" && v !== null && v.t === "ref" && v.id === "Knex";
184
+ }
185
+ ApiParamType.isRefKnex = isRefKnex;
186
+ function isTypeParam(v) {
187
+ return typeof v === "object" && v !== null && v.t === "type-param";
188
+ }
189
+ ApiParamType.isTypeParam = isTypeParam;
190
+ })(ApiParamType || (ApiParamType = {}));
191
+ /* Template */ /**
192
+ * UI 컴포넌트 렌더링을 위한 메타데이터 노드입니다.
193
+ *
194
+ * **목적**: Zod 스키마로부터 프론트엔드 UI 컴포넌트를 자동 생성하기 위한
195
+ * 렌더링 정보를 담은 트리 구조입니다. 각 필드가 어떤 UI 컴포넌트로
196
+ * 표현되어야 하는지(텍스트, 이미지, 날짜, Enum 선택 등)를 명시합니다.
197
+ *
198
+ * **변환 흐름**:
199
+ * Entity subset → EntityPropNode → Zod 스키마 → RenderingNode (UI용) → React 컴포넌트 코드 생성
200
+ *
201
+ * **주요 필드**:
202
+ * - `renderType`: UI 컴포넌트 유형 (string-plain, number-fk_id, enums, array 등)
203
+ * - `zodType`: 원본 Zod 스키마 (validation 용)
204
+ * - `children`: 중첩된 객체 필드들 (object일 때)
205
+ * - `element`: 배열 요소 타입 (array일 때)
206
+ *
207
+ * **사용 위치**:
208
+ * - zod-converter.ts의 zodTypeToRenderingNode()에서 생성
209
+ * - view_form.template.ts, view_list.template.ts 등에서 React 컴포넌트 코드 생성에 사용
210
+ */ // 셀프 참조 타입이므로 Zod 생략하고 직접 정의
211
+ export const RenderingNode = z.any();
212
+ const BasePropFields = {
213
+ name: z.string(),
214
+ desc: z.string().optional(),
215
+ nullable: z.boolean().optional(),
216
+ toFilter: z.literal(true).optional(),
217
+ dbDefault: z.union([
218
+ z.string(),
219
+ z.number(),
220
+ z.boolean()
221
+ ]).optional()
222
+ };
223
+ // 부가 필드가 필요없는 prop
224
+ const BasePropFieldsWithoutAdditional = z.object({
225
+ ...BasePropFields,
226
+ type: z.union([
227
+ z.literal("integer"),
228
+ z.literal("integer[]"),
229
+ z.literal("bigInteger"),
230
+ z.literal("bigInteger[]"),
231
+ z.literal("boolean"),
232
+ z.literal("boolean[]"),
233
+ z.literal("date"),
234
+ z.literal("date[]"),
235
+ z.literal("uuid"),
236
+ z.literal("uuid[]")
237
+ ])
238
+ }).strict();
239
+ // precision/scale 필드
240
+ const PrecisionScaleFields = {
241
+ precision: z.number().optional(),
242
+ scale: z.number().optional()
243
+ };
244
+ // 각 타입별 스키마 정의
245
+ const StringPropSchema = z.object({
246
+ ...BasePropFields,
247
+ type: z.literal("string"),
248
+ length: z.number().optional()
249
+ }).strict();
250
+ const StringArrayPropSchema = z.object({
251
+ ...BasePropFields,
252
+ type: z.literal("string[]"),
253
+ length: z.number().optional()
254
+ }).strict();
255
+ const EnumPropSchema = z.object({
256
+ ...BasePropFields,
257
+ type: z.literal("enum"),
258
+ id: z.string()
259
+ }).strict();
260
+ const EnumArrayPropSchema = z.object({
261
+ ...BasePropFields,
262
+ type: z.literal("enum[]"),
263
+ id: z.string()
264
+ }).strict();
265
+ const NumberPropSchema = z.object({
266
+ ...BasePropFields,
267
+ type: z.literal("number"),
268
+ ...PrecisionScaleFields,
269
+ numberType: z.enum([
270
+ "real",
271
+ "double precision",
272
+ "numeric"
273
+ ]).optional()
274
+ }).strict();
275
+ const NumberArrayPropSchema = z.object({
276
+ ...BasePropFields,
277
+ type: z.literal("number[]"),
278
+ ...PrecisionScaleFields,
279
+ numberType: z.enum([
280
+ "real",
281
+ "double precision",
282
+ "numeric"
283
+ ]).optional()
284
+ }).strict();
285
+ const NumericPropSchema = z.object({
286
+ ...BasePropFields,
287
+ type: z.literal("numeric"),
288
+ ...PrecisionScaleFields
289
+ }).strict();
290
+ const NumericArrayPropSchema = z.object({
291
+ ...BasePropFields,
292
+ type: z.literal("numeric[]"),
293
+ ...PrecisionScaleFields
294
+ }).strict();
295
+ const JsonPropSchema = z.object({
296
+ ...BasePropFields,
297
+ type: z.literal("json"),
298
+ id: z.string()
299
+ }).strict();
300
+ const VirtualPropSchema = z.object({
301
+ ...BasePropFields,
302
+ type: z.literal("virtual"),
303
+ id: z.string()
304
+ }).strict();
305
+ // Relation 타입은 relationType에 따라 세분화
306
+ const BaseRelationFields = {
307
+ ...BasePropFields,
308
+ type: z.literal("relation"),
309
+ with: z.string()
310
+ };
311
+ // RelationOn 타입
312
+ const RelationOnSchema = z.enum([
313
+ "CASCADE",
314
+ "SET NULL",
315
+ "NO ACTION",
316
+ "SET DEFAULT",
317
+ "RESTRICT"
318
+ ]);
319
+ const BelongsToOneRelationPropSchema = z.object({
320
+ ...BaseRelationFields,
321
+ relationType: z.literal("BelongsToOne"),
322
+ customJoinClause: z.string().optional(),
323
+ useConstraint: z.boolean().optional(),
324
+ onUpdate: RelationOnSchema.optional(),
325
+ onDelete: RelationOnSchema.optional()
326
+ }).strict();
327
+ const HasManyRelationPropSchema = z.object({
328
+ ...BaseRelationFields,
329
+ relationType: z.literal("HasMany"),
330
+ joinColumn: z.string(),
331
+ fromColumn: z.string().optional()
332
+ }).strict();
333
+ const ManyToManyRelationPropSchema = z.object({
334
+ ...BaseRelationFields,
335
+ relationType: z.literal("ManyToMany"),
336
+ joinTable: z.string(),
337
+ onUpdate: RelationOnSchema,
338
+ onDelete: RelationOnSchema
339
+ }).strict();
340
+ const OneToOneRelationPropSchema = z.object({
341
+ ...BaseRelationFields,
342
+ relationType: z.literal("OneToOne"),
343
+ customJoinClause: z.string().optional(),
344
+ hasJoinColumn: z.boolean().optional(),
345
+ useConstraint: z.boolean().optional(),
346
+ onUpdate: RelationOnSchema.optional(),
347
+ onDelete: RelationOnSchema.optional()
348
+ }).strict();
349
+ const RelationTypes = [
350
+ "BelongsToOne",
351
+ "HasMany",
352
+ "ManyToMany",
353
+ "OneToOne"
354
+ ];
355
+ export const RelationPropSchema = z.discriminatedUnion("relationType", [
356
+ BelongsToOneRelationPropSchema,
357
+ HasManyRelationPropSchema,
358
+ ManyToManyRelationPropSchema,
359
+ OneToOneRelationPropSchema
360
+ ], {
361
+ error: (iss)=>`relationType은 ${RelationTypes.map((t)=>`'${t}'`).join(", ")} 중 하나여야 합니다. 입력값: "${iss.input?.relationType}"`
362
+ });
363
+ const NormalPropTypes = [
364
+ "integer",
365
+ "integer[]",
366
+ "bigInteger",
367
+ "bigInteger[]",
368
+ "string",
369
+ "string[]",
370
+ "enum",
371
+ "enum[]",
372
+ "number",
373
+ "number[]",
374
+ "numeric",
375
+ "numeric[]",
376
+ "boolean",
377
+ "boolean[]",
378
+ "date",
379
+ "date[]",
380
+ "uuid",
381
+ "uuid[]",
382
+ "json",
383
+ "virtual"
384
+ ];
385
+ export const NormalPropSchema = z.discriminatedUnion("type", [
386
+ BasePropFieldsWithoutAdditional,
387
+ StringPropSchema,
388
+ StringArrayPropSchema,
389
+ EnumPropSchema,
390
+ EnumArrayPropSchema,
391
+ NumberPropSchema,
392
+ NumberArrayPropSchema,
393
+ NumericPropSchema,
394
+ NumericArrayPropSchema,
395
+ JsonPropSchema,
396
+ VirtualPropSchema
397
+ ], {
398
+ error: (iss)=>`type은 ${NormalPropTypes.map((t)=>`'${t}'`).join(", ")} 중 하나여야 합니다. 입력값: "${iss.input?.type}"`
399
+ });
400
+ const AllPropTypes = [
401
+ ...NormalPropTypes,
402
+ "relation"
403
+ ];
404
+ const EntityPropSchema = z.discriminatedUnion("type", [
405
+ NormalPropSchema,
406
+ RelationPropSchema
407
+ ], {
408
+ error: (iss)=>`type은 ${AllPropTypes.map((t)=>`'${t}'`).join(", ")} 중 하나여야 합니다. 입력값: "${iss.input?.type}"`
409
+ });
410
+ // EntityIndex 스키마 정의
411
+ const EntityIndexSchema = z.object({
412
+ type: z.enum([
413
+ "index",
414
+ "unique",
415
+ "fulltext"
416
+ ]),
417
+ columns: z.array(z.string()),
418
+ name: z.string().optional(),
419
+ parser: z.enum([
420
+ "built-in",
421
+ "ngram"
422
+ ]).optional()
423
+ }).strict();
424
+ export const EntityJsonSchema = z.object({
425
+ id: z.string().describe("PascalCase로 된 Entity ID"),
426
+ title: z.string().describe("Entity 이름"),
427
+ table: z.string().describe("snake_case로 된 테이블명"),
428
+ parentId: z.string().optional().describe("부모 Entity ID"),
429
+ props: z.array(EntityPropSchema),
430
+ indexes: z.array(EntityIndexSchema),
431
+ subsets: z.record(z.string(), z.array(z.string())),
432
+ enums: z.record(z.string(), z.record(z.string(), z.string()))
433
+ }).strict();
434
+ export const TemplateOptions = z.object({
435
+ entity: EntityJsonSchema.omit({
436
+ id: true
437
+ }).extend({
438
+ entityId: z.string()
439
+ }).partial({
440
+ table: true,
441
+ props: true,
442
+ indexes: true,
443
+ subsets: true,
444
+ enums: true
445
+ }),
446
+ init_types: z.object({
447
+ entityId: z.string()
448
+ }),
449
+ generated: z.object({}),
450
+ generated_sso: z.object({}),
451
+ generated_http: z.object({
452
+ entityId: z.string()
453
+ }),
454
+ model: z.object({
455
+ entityId: z.string(),
456
+ defaultSearchField: z.string().optional(),
457
+ defaultOrderBy: z.string().optional()
458
+ }),
459
+ model_test: z.object({
460
+ entityId: z.string()
461
+ }),
462
+ bridge: z.object({
463
+ entityId: z.string()
464
+ }),
465
+ service: z.object({
466
+ namesRecord: z.object({
467
+ fs: z.string(),
468
+ fsPlural: z.string(),
469
+ camel: z.string(),
470
+ camelPlural: z.string(),
471
+ capital: z.string(),
472
+ capitalPlural: z.string(),
473
+ upper: z.string(),
474
+ constant: z.string()
475
+ }),
476
+ modelTsPath: z.string()
477
+ }),
478
+ view_list: z.object({
479
+ entityId: z.string(),
480
+ extra: z.unknown()
481
+ }),
482
+ view_list_columns: z.object({
483
+ entityId: z.string(),
484
+ columns: z.object({
485
+ name: z.string(),
486
+ label: z.string(),
487
+ tc: z.string()
488
+ }).array(),
489
+ columnImports: z.string()
490
+ }),
491
+ view_search_input: z.object({
492
+ entityId: z.string()
493
+ }),
494
+ view_form: z.object({
495
+ entityId: z.string()
496
+ }),
497
+ view_id_all_select: z.object({
498
+ entityId: z.string()
499
+ }),
500
+ view_id_async_select: z.object({
501
+ entityId: z.string(),
502
+ textField: z.string()
503
+ }),
504
+ view_enums_select: z.object({
505
+ entityId: z.string(),
506
+ enumId: z.string()
507
+ }),
508
+ view_enums_dropdown: z.object({
509
+ entityId: z.string(),
510
+ enumId: z.string()
511
+ }),
512
+ view_enums_buttonset: z.object({
513
+ entityId: z.string(),
514
+ enumId: z.string()
515
+ })
516
+ });
517
+ export const TemplateKey = z.enum([
518
+ "entity",
519
+ "init_types",
520
+ "generated",
521
+ "generated_sso",
522
+ "generated_http",
523
+ "model",
524
+ "model_test",
525
+ "bridge",
526
+ "service",
527
+ "view_list",
528
+ "view_list_columns",
529
+ "view_search_input",
530
+ "view_form",
531
+ "view_id_all_select",
532
+ "view_id_async_select",
533
+ "view_enums_select",
534
+ "view_enums_dropdown",
535
+ "view_enums_buttonset"
536
+ ]);
537
+ export const GenerateOptions = z.object({
538
+ overwrite: z.boolean().optional()
539
+ });
540
+ export const PathAndCode = z.object({
541
+ path: z.string(),
542
+ code: z.string()
543
+ });
544
+ export var ApiParamType;
545
+
546
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy90eXBlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEZhc3RpZnlSZXBseSwgRmFzdGlmeVJlcXVlc3QgfSBmcm9tIFwiZmFzdGlmeVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgQXBpRGVjb3JhdG9yT3B0aW9ucywgQXV0aENvbnRleHQsIENvbnRleHQgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgdHlwZSB7IEd1YXJkS2V5IH0gZnJvbSBcIi4vLi4vYXBpL2RlY29yYXRvcnNcIjtcblxuLypcbiAgVXRpbGl0eSBUeXBlc1xuKi9cbmV4cG9ydCBmdW5jdGlvbiB6QXJyYXlhYmxlPFQgZXh0ZW5kcyB6LlpvZFR5cGVBbnk+KHNoYXBlOiBUKTogei5ab2RVbmlvbjxbVCwgei5ab2RBcnJheTxUPl0+IHtcbiAgcmV0dXJuIHoudW5pb24oW3NoYXBlLCBzaGFwZS5hcnJheSgpXSk7XG59XG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IGFueSBpcyB1c2VkIHRvIG1ha2UgdGhlIHR5cGUgZGlzdHJpYnV0aXZlXG5leHBvcnQgdHlwZSBEaXN0cmlidXRpdmVPbWl0PFQsIEsgZXh0ZW5kcyBrZXlvZiBhbnk+ID0gVCBleHRlbmRzIGFueSA/IE9taXQ8VCwgSz4gOiBuZXZlcjtcblxuLypcbiAgTW9kZWwtRGVmaW50aW9uXG4qL1xuZXhwb3J0IHR5cGUgQ29tbW9uUHJvcCA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBudWxsYWJsZT86IGJvb2xlYW47XG4gIHRvRmlsdGVyPzogdHJ1ZTtcbiAgZGVzYz86IHN0cmluZztcbiAgZGJEZWZhdWx0Pzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIEludGVnZXJQcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJpbnRlZ2VyXCI7XG59OyAvLyBQRzogaW50ZWdlciAvIFRTOiBudW1iZXIgLyBKU09OOiBudW1iZXJcbmV4cG9ydCB0eXBlIEludGVnZXJBcnJheVByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcImludGVnZXJbXVwiO1xufTsgLy8gUEc6IGludGVnZXJbXSAvIFRTOiBudW1iZXJbXSAvIEpTT046IG51bWJlcltdXG5leHBvcnQgdHlwZSBCaWdJbnRlZ2VyUHJvcCA9IENvbW1vblByb3AgJiB7XG4gIHR5cGU6IFwiYmlnSW50ZWdlclwiO1xufTsgLy8gUEc6IGJpZ2ludCAvIFRTOiBiaWdpbnQgLyBKU09OOiBiaWdpbnRcbmV4cG9ydCB0eXBlIEJpZ0ludGVnZXJBcnJheVByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcImJpZ0ludGVnZXJbXVwiO1xufTsgLy8gUEc6IGJpZ2ludFtdIC8gVFM6IGJpZ2ludFtdIC8gSlNPTjogYmlnaW50W11cbmV4cG9ydCB0eXBlIFN0cmluZ1Byb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcInN0cmluZ1wiO1xuICBsZW5ndGg/OiBudW1iZXI7IC8vIFBHOiB2YXJjaGFyKG4pLCB0ZXh0IC8gVFM6IHN0cmluZyAvIEpTT046IHN0cmluZ1xufTsgLy8gUEc6IHRleHQgLyBUUzogc3RyaW5nIC8gSlNPTjogc3RyaW5nXG5leHBvcnQgdHlwZSBTdHJpbmdBcnJheVByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcInN0cmluZ1tdXCI7XG4gIGxlbmd0aD86IG51bWJlcjsgLy8gUEc6IHZhcmNoYXIobilbXSwgdGV4dFtdIC8gVFM6IHN0cmluZ1tdIC8gSlNPTjogc3RyaW5nW11cbn07IC8vIFBHOiB2YXJjaGFyKG4pW10sIHRleHRbXSAvIFRTOiBzdHJpbmdbXSAvIEpTT046IHN0cmluZ1tdXG5leHBvcnQgdHlwZSBFbnVtUHJvcCA9IENvbW1vblByb3AgJiB7XG4gIHR5cGU6IFwiZW51bVwiO1xuICBpZDogc3RyaW5nO1xuICBsZW5ndGg/OiBudW1iZXI7XG59OyAvLyBQRzogdGV4dCAvIFRTOiBzdHJpbmcgLyBKU09OOiBzdHJpbmdcbmV4cG9ydCB0eXBlIEVudW1BcnJheVByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcImVudW1bXVwiO1xuICBpZDogc3RyaW5nO1xufTsgLy8gUEc6IHRleHRbXSAvIFRTOiBzdHJpbmdbXSAvIEpTT046IHN0cmluZ1tdXG5leHBvcnQgdHlwZSBOdW1iZXJQcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJudW1iZXJcIjtcbiAgcHJlY2lzaW9uPzogbnVtYmVyOyAvLyBQRzogbnVtZXJpYyhwLCBzKSAvIFRTOiBudW1iZXIgLyBKU09OOiBudW1iZXJcbiAgc2NhbGU/OiBudW1iZXI7IC8vIFBHOiBudW1lcmljKHAsIHMpIC8gVFM6IG51bWJlciAvIEpTT046IG51bWJlclxuICBudW1iZXJUeXBlPzogXCJyZWFsXCIgfCBcImRvdWJsZSBwcmVjaXNpb25cIiB8IFwibnVtZXJpY1wiOyAvLyDquLDrs7jqsJI6IG51bWVyaWNcbn07IC8vIFBHOiBudW1lcmljKHAsIHMpIC8gVFM6IG51bWJlciAvIEpTT046IG51bWJlclxuZXhwb3J0IHR5cGUgTnVtYmVyQXJyYXlQcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJudW1iZXJbXVwiO1xuICBwcmVjaXNpb24/OiBudW1iZXI7XG4gIHNjYWxlPzogbnVtYmVyO1xuICBudW1iZXJUeXBlPzogXCJyZWFsXCIgfCBcImRvdWJsZSBwcmVjaXNpb25cIiB8IFwibnVtZXJpY1wiOyAvLyDquLDrs7jqsJI6IG51bWVyaWNcbn07IC8vIFBHOiBudW1lcmljKHAsIHMpW10gLyBUUzogbnVtYmVyW10gLyBKU09OOiBudW1iZXJbXVxuZXhwb3J0IHR5cGUgTnVtZXJpY1Byb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcIm51bWVyaWNcIjtcbiAgcHJlY2lzaW9uPzogbnVtYmVyO1xuICBzY2FsZT86IG51bWJlcjtcbn07IC8vIFBHOiBudW1lcmljKHAsIHMpIC8gVFM6IHN0cmluZyAvIEpTT046IHN0cmluZ1xuZXhwb3J0IHR5cGUgTnVtZXJpY0FycmF5UHJvcCA9IENvbW1vblByb3AgJiB7XG4gIHR5cGU6IFwibnVtZXJpY1tdXCI7XG4gIHByZWNpc2lvbj86IG51bWJlcjtcbiAgc2NhbGU/OiBudW1iZXI7XG59OyAvLyBQRzogbnVtZXJpYyhwLCBzKVtdIC8gVFM6IHN0cmluZ1tdIC8gSlNPTjogc3RyaW5nW11cbmV4cG9ydCB0eXBlIEJvb2xlYW5Qcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJib29sZWFuXCI7XG59OyAvLyBQRzogYm9vbGVhbiAvIFRTOiBib29sZWFuIC8gSlNPTjogYm9vbGVhblxuZXhwb3J0IHR5cGUgQm9vbGVhbkFycmF5UHJvcCA9IENvbW1vblByb3AgJiB7XG4gIHR5cGU6IFwiYm9vbGVhbltdXCI7XG59OyAvLyBQRzogYm9vbGVhbltdIC8gVFM6IGJvb2xlYW5bXSAvIEpTT046IGJvb2xlYW5bXVxuZXhwb3J0IHR5cGUgRGF0ZVByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcImRhdGVcIjtcbn07IC8vIFBHOiB0aW1lc3RhbXB6IC8gVFM6IERhdGUgLyBKU09OOiBzdHJpbmcoSVNPU3RyaW5nKVxuZXhwb3J0IHR5cGUgRGF0ZUFycmF5UHJvcCA9IENvbW1vblByb3AgJiB7XG4gIHR5cGU6IFwiZGF0ZVtdXCI7XG59OyAvLyBQRzogdGltZXN0YW1wdHpbXSAvIFRTOiBEYXRlW10gLyBKU09OOiBzdHJpbmdbXVxuZXhwb3J0IHR5cGUgSnNvblByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcImpzb25cIjtcbiAgaWQ6IHN0cmluZztcbn07IC8vIFBHOiBqc29uIC8gVFM6IGFueShpZCkgLyBKU09OOiBhbnlcbmV4cG9ydCB0eXBlIFV1aWRQcm9wID0gQ29tbW9uUHJvcCAmIHtcbiAgdHlwZTogXCJ1dWlkXCI7XG59OyAvLyBQRzogdXVpZCAvIFRTOiBzdHJpbmcgLyBKU09OOiBzdHJpbmdcbmV4cG9ydCB0eXBlIFV1aWRBcnJheVByb3AgPSBDb21tb25Qcm9wICYge1xuICB0eXBlOiBcInV1aWRbXVwiO1xufTsgLy8gUEc6IHV1aWRbXSAvIFRTOiBzdHJpbmdbXSAvIEpTT046IHN0cmluZ1tdXG5leHBvcnQgdHlwZSBWaXJ0dWFsUHJvcCA9IENvbW1vblByb3AgJiB7XG4gIHR5cGU6IFwidmlydHVhbFwiO1xuICBpZDogc3RyaW5nO1xufTsgLy8gUEc6IG5vbmUgLyBUUzogYW55KGlkKSAvIEpTT046IGFueVxuXG5leHBvcnQgdHlwZSBSZWxhdGlvblR5cGUgPSBcIkhhc01hbnlcIiB8IFwiQmVsb25nc1RvT25lXCIgfCBcIk1hbnlUb01hbnlcIiB8IFwiT25lVG9PbmVcIjtcbmV4cG9ydCB0eXBlIFJlbGF0aW9uT24gPSBcIkNBU0NBREVcIiB8IFwiU0VUIE5VTExcIiB8IFwiTk8gQUNUSU9OXCIgfCBcIlNFVCBERUZBVUxUXCIgfCBcIlJFU1RSSUNUXCI7XG50eXBlIF9SZWxhdGlvblByb3AgPSB7XG4gIHR5cGU6IFwicmVsYXRpb25cIjtcbiAgbmFtZTogc3RyaW5nO1xuICB3aXRoOiBzdHJpbmc7XG4gIG51bGxhYmxlPzogYm9vbGVhbjsgLy8gREVGQVVMVDogZmFsc2VcbiAgdG9GaWx0ZXI/OiB0cnVlOyAvLyBERUZBVUxUOiBmYWxzZVxuICBkZXNjPzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIE9uZVRvT25lUmVsYXRpb25Qcm9wID0gX1JlbGF0aW9uUHJvcCAmIHtcbiAgcmVsYXRpb25UeXBlOiBcIk9uZVRvT25lXCI7XG4gIGN1c3RvbUpvaW5DbGF1c2U/OiBzdHJpbmc7XG59ICYgKFxuICAgIHwge1xuICAgICAgICBoYXNKb2luQ29sdW1uOiB0cnVlO1xuICAgICAgICB1c2VDb25zdHJhaW50PzogYm9vbGVhbjsgLy8gREVGQVVMVDogdHJ1ZVxuICAgICAgICBvblVwZGF0ZT86IFJlbGF0aW9uT247IC8vIERFRkFVTFQ6IFJFU1RSSUNUXG4gICAgICAgIG9uRGVsZXRlPzogUmVsYXRpb25PbjsgLy8gREVGQVVMVDogUkVTVFJJQ1RcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgaGFzSm9pbkNvbHVtbjogZmFsc2U7XG4gICAgICB9XG4gICk7XG5leHBvcnQgdHlwZSBCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AgPSBfUmVsYXRpb25Qcm9wICYge1xuICByZWxhdGlvblR5cGU6IFwiQmVsb25nc1RvT25lXCI7XG4gIGN1c3RvbUpvaW5DbGF1c2U/OiBzdHJpbmc7XG4gIHVzZUNvbnN0cmFpbnQ/OiBib29sZWFuOyAvLyBERUZBVUxUOiB0cnVlXG4gIG9uVXBkYXRlPzogUmVsYXRpb25PbjsgLy8gREVGQVVMVDogUkVTVFJJQ1RcbiAgb25EZWxldGU/OiBSZWxhdGlvbk9uOyAvLyBERUZBVUxUOiBSRVNUUklDVFxufTtcbmV4cG9ydCB0eXBlIEhhc01hbnlSZWxhdGlvblByb3AgPSBfUmVsYXRpb25Qcm9wICYge1xuICByZWxhdGlvblR5cGU6IFwiSGFzTWFueVwiO1xuICBqb2luQ29sdW1uOiBzdHJpbmc7XG4gIGZyb21Db2x1bW4/OiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgTWFueVRvTWFueVJlbGF0aW9uUHJvcCA9IF9SZWxhdGlvblByb3AgJiB7XG4gIHJlbGF0aW9uVHlwZTogXCJNYW55VG9NYW55XCI7XG4gIGpvaW5UYWJsZTogYCR7c3RyaW5nfV9fJHtzdHJpbmd9YDtcbiAgb25VcGRhdGU6IFJlbGF0aW9uT247XG4gIG9uRGVsZXRlOiBSZWxhdGlvbk9uO1xufTtcbmV4cG9ydCB0eXBlIFJlbGF0aW9uUHJvcCA9XG4gIHwgT25lVG9PbmVSZWxhdGlvblByb3BcbiAgfCBCZWxvbmdzVG9PbmVSZWxhdGlvblByb3BcbiAgfCBIYXNNYW55UmVsYXRpb25Qcm9wXG4gIHwgTWFueVRvTWFueVJlbGF0aW9uUHJvcDtcblxuZXhwb3J0IHR5cGUgRW50aXR5UHJvcCA9XG4gIHwgSW50ZWdlclByb3BcbiAgfCBJbnRlZ2VyQXJyYXlQcm9wXG4gIHwgQmlnSW50ZWdlclByb3BcbiAgfCBCaWdJbnRlZ2VyQXJyYXlQcm9wXG4gIHwgU3RyaW5nUHJvcFxuICB8IFN0cmluZ0FycmF5UHJvcFxuICB8IEVudW1Qcm9wXG4gIHwgRW51bUFycmF5UHJvcFxuICB8IE51bWJlclByb3BcbiAgfCBOdW1iZXJBcnJheVByb3BcbiAgfCBOdW1lcmljUHJvcFxuICB8IE51bWVyaWNBcnJheVByb3BcbiAgfCBOdW1lcmljUHJvcFxuICB8IEJvb2xlYW5Qcm9wXG4gIHwgQm9vbGVhbkFycmF5UHJvcFxuICB8IERhdGVQcm9wXG4gIHwgRGF0ZUFycmF5UHJvcFxuICB8IFV1aWRQcm9wXG4gIHwgVXVpZEFycmF5UHJvcFxuICB8IEpzb25Qcm9wXG4gIHwgVmlydHVhbFByb3BcbiAgfCBSZWxhdGlvblByb3A7XG5cbmV4cG9ydCB0eXBlIEVudGl0eUluZGV4ID0ge1xuICB0eXBlOiBcImluZGV4XCIgfCBcInVuaXF1ZVwiIHwgXCJmdWxsdGV4dFwiO1xuICBjb2x1bW5zOiBzdHJpbmdbXTtcbiAgbmFtZT86IHN0cmluZztcbiAgcGFyc2VyPzogXCJidWlsdC1pblwiIHwgXCJuZ3JhbVwiO1xufTtcbmV4cG9ydCB0eXBlIEVudGl0eUpzb24gPSB7XG4gIGlkOiBzdHJpbmc7XG4gIHBhcmVudElkPzogc3RyaW5nO1xuICB0YWJsZTogc3RyaW5nO1xuICB0aXRsZT86IHN0cmluZztcbiAgcHJvcHM6IEVudGl0eVByb3BbXTtcbiAgaW5kZXhlczogRW50aXR5SW5kZXhbXTtcbiAgc3Vic2V0czoge1xuICAgIFtzdWJzZXQ6IHN0cmluZ106IHN0cmluZ1tdO1xuICB9O1xuICBlbnVtczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgICB9O1xuICB9O1xufTtcbmV4cG9ydCB0eXBlIEVudGl0eVN1YnNldFJvdyA9IHtcbiAgZmllbGQ6IHN0cmluZztcbiAgaGFzOiB7XG4gICAgW2tleTogc3RyaW5nXTogYm9vbGVhbjtcbiAgfTtcbiAgY2hpbGRyZW46IEVudGl0eVN1YnNldFJvd1tdO1xuICBwcmVmaXhlczogc3RyaW5nW107XG4gIHJlbGF0aW9uRW50aXR5Pzogc3RyaW5nO1xuICBpc09wZW4/OiBib29sZWFuO1xufTtcbmV4cG9ydCB0eXBlIEZsYXR0ZW5TdWJzZXRSb3cgPSBPbWl0PEVudGl0eVN1YnNldFJvdywgXCJjaGlsZHJlblwiPjtcblxuLypcbiAgUHJvcE5vZGVcbiovXG5cbi8qKlxuICog7JeU7Yuw7Yuw7J2YIO2VhOuTnCDqtazsobDrpbwg7Yq466asIO2Yle2DnOuhnCDtkZztmITtlZjripQg7KSR6rCEIOuFuOuTnOyeheuLiOuLpC5cbiAqXG4gKiAqKuuqqeyggSoqOiBFbnRpdHnsnZggc3Vic2V0IO2VhOuTnCDtkZztmITsi50o7JiIOiBcImlkXCIsIFwidXNlci5uYW1lXCIsIFwidGFnc1tdXCIp7J2EXG4gKiDsnqzqt4DsoIHsnbgg7Yq466asIOq1rOyhsOuhnCDtjIzsi7HtlZjsl6wgWm9kIOyKpO2CpOuniCDsg53shLHsnZgg7KSR6rCEIOuLqOqzhOuhnCDsgqzsmqntlanri4jri6QuXG4gKlxuICogKirrs4DtmZgg7Z2Q66aEKio6XG4gKiBFbnRpdHkgc3Vic2V0IOKGkiBFbnRpdHlQcm9wTm9kZSAo7Yq466asIOq1rOyhsCkg4oaSIFpvZCDsiqTtgqTrp4gg4oaSIFJlbmRlcmluZ05vZGUgKFVJ7JqpKVxuICpcbiAqICoqbm9kZVR5cGUqKjpcbiAqIC0gXCJwbGFpblwiOiDri6jsnbwg7ZWE65OcICjsmIg6IFwiaWRcIiwgXCJuYW1lXCIpXG4gKiAtIFwib2JqZWN0XCI6IOykkeyyqSDqsJ3ssrQgKOyYiDogXCJ1c2VyLm5hbWVcIiDihpIgdXNlciDqsJ3ssrQpXG4gKiAtIFwiYXJyYXlcIjog67Cw7Je0ICjsmIg6IFwidGFnc1tdXCIg4oaSIHRhZ3Mg67Cw7Je0KVxuICpcbiAqICoq7IKs7JqpIOychOy5mCoqOiBlbnRpdHktY29udmVydGVyLnRz7J2YIHByb3BOb2RlVG9ab2RUeXBlKClcbiAqL1xuZXhwb3J0IHR5cGUgRW50aXR5UHJvcE5vZGUgPVxuICB8IHtcbiAgICAgIG5vZGVUeXBlOiBcInBsYWluXCI7XG4gICAgICBwcm9wOiBFbnRpdHlQcm9wO1xuICAgIH1cbiAgfCB7XG4gICAgICBub2RlVHlwZTogXCJvYmplY3RcIiB8IFwiYXJyYXlcIjtcbiAgICAgIHByb3A/OiBFbnRpdHlQcm9wO1xuICAgICAgY2hpbGRyZW46IEVudGl0eVByb3BOb2RlW107XG4gICAgfTtcblxuLypcbiAgUHJvcCBUeXBlIEd1YXJkc1xuKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0ludGVnZXJTaW5nbGVQcm9wKHA6IHVua25vd24pOiBwIGlzIEludGVnZXJQcm9wIHtcbiAgcmV0dXJuIChwIGFzIEludGVnZXJQcm9wKT8udHlwZSA9PT0gXCJpbnRlZ2VyXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNJbnRlZ2VyQXJyYXlQcm9wKHA6IHVua25vd24pOiBwIGlzIEludGVnZXJBcnJheVByb3Age1xuICByZXR1cm4gKHAgYXMgSW50ZWdlckFycmF5UHJvcCk/LnR5cGUgPT09IFwiaW50ZWdlcltdXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNJbnRlZ2VyUHJvcChwOiB1bmtub3duKTogcCBpcyBJbnRlZ2VyUHJvcCB8IEludGVnZXJBcnJheVByb3Age1xuICByZXR1cm4gaXNJbnRlZ2VyU2luZ2xlUHJvcChwKSB8fCBpc0ludGVnZXJBcnJheVByb3AocCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcChwOiB1bmtub3duKTogcCBpcyBCaWdJbnRlZ2VyUHJvcCB7XG4gIHJldHVybiAocCBhcyBCaWdJbnRlZ2VyUHJvcCk/LnR5cGUgPT09IFwiYmlnSW50ZWdlclwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQmlnSW50ZWdlckFycmF5UHJvcChwOiB1bmtub3duKTogcCBpcyBCaWdJbnRlZ2VyQXJyYXlQcm9wIHtcbiAgcmV0dXJuIChwIGFzIEJpZ0ludGVnZXJBcnJheVByb3ApPy50eXBlID09PSBcImJpZ0ludGVnZXJbXVwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQmlnSW50ZWdlclByb3AocDogdW5rbm93bik6IHAgaXMgQmlnSW50ZWdlclByb3AgfCBCaWdJbnRlZ2VyQXJyYXlQcm9wIHtcbiAgcmV0dXJuIGlzQmlnSW50ZWdlclNpbmdsZVByb3AocCkgfHwgaXNCaWdJbnRlZ2VyQXJyYXlQcm9wKHApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nU2luZ2xlUHJvcChwOiB1bmtub3duKTogcCBpcyBTdHJpbmdQcm9wIHtcbiAgcmV0dXJuIChwIGFzIFN0cmluZ1Byb3ApPy50eXBlID09PSBcInN0cmluZ1wiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nQXJyYXlQcm9wKHA6IHVua25vd24pOiBwIGlzIFN0cmluZ0FycmF5UHJvcCB7XG4gIHJldHVybiAocCBhcyBTdHJpbmdBcnJheVByb3ApPy50eXBlID09PSBcInN0cmluZ1tdXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmdQcm9wKHA6IHVua25vd24pOiBwIGlzIFN0cmluZ1Byb3AgfCBTdHJpbmdBcnJheVByb3Age1xuICByZXR1cm4gaXNTdHJpbmdTaW5nbGVQcm9wKHApIHx8IGlzU3RyaW5nQXJyYXlQcm9wKHApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRW51bVNpbmdsZVByb3AocDogdW5rbm93bik6IHAgaXMgRW51bVByb3Age1xuICByZXR1cm4gKHAgYXMgRW51bVByb3ApPy50eXBlID09PSBcImVudW1cIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0VudW1BcnJheVByb3AocDogdW5rbm93bik6IHAgaXMgRW51bUFycmF5UHJvcCB7XG4gIHJldHVybiAocCBhcyBFbnVtQXJyYXlQcm9wKT8udHlwZSA9PT0gXCJlbnVtW11cIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0VudW1Qcm9wKHA6IHVua25vd24pOiBwIGlzIEVudW1Qcm9wIHwgRW51bUFycmF5UHJvcCB7XG4gIHJldHVybiBpc0VudW1TaW5nbGVQcm9wKHApIHx8IGlzRW51bUFycmF5UHJvcChwKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlclNpbmdsZVByb3AocDogdW5rbm93bik6IHAgaXMgTnVtYmVyUHJvcCB7XG4gIHJldHVybiAocCBhcyBOdW1iZXJQcm9wKT8udHlwZSA9PT0gXCJudW1iZXJcIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlckFycmF5UHJvcChwOiB1bmtub3duKTogcCBpcyBOdW1iZXJBcnJheVByb3Age1xuICByZXR1cm4gKHAgYXMgTnVtYmVyQXJyYXlQcm9wKT8udHlwZSA9PT0gXCJudW1iZXJbXVwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyUHJvcChwOiB1bmtub3duKTogcCBpcyBOdW1iZXJQcm9wIHwgTnVtYmVyQXJyYXlQcm9wIHtcbiAgcmV0dXJuIGlzTnVtYmVyU2luZ2xlUHJvcChwKSB8fCBpc051bWJlckFycmF5UHJvcChwKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc051bWVyaWNTaW5nbGVQcm9wKHA6IHVua25vd24pOiBwIGlzIE51bWVyaWNQcm9wIHtcbiAgcmV0dXJuIChwIGFzIE51bWVyaWNQcm9wKT8udHlwZSA9PT0gXCJudW1lcmljXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1lcmljQXJyYXlQcm9wKHA6IHVua25vd24pOiBwIGlzIE51bWVyaWNBcnJheVByb3Age1xuICByZXR1cm4gKHAgYXMgTnVtZXJpY0FycmF5UHJvcCk/LnR5cGUgPT09IFwibnVtZXJpY1tdXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1lcmljUHJvcChwOiB1bmtub3duKTogcCBpcyBOdW1lcmljUHJvcCB8IE51bWVyaWNBcnJheVByb3Age1xuICByZXR1cm4gaXNOdW1lcmljU2luZ2xlUHJvcChwKSB8fCBpc051bWVyaWNBcnJheVByb3AocCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNCb29sZWFuU2luZ2xlUHJvcChwOiB1bmtub3duKTogcCBpcyBCb29sZWFuUHJvcCB7XG4gIHJldHVybiAocCBhcyBCb29sZWFuUHJvcCk/LnR5cGUgPT09IFwiYm9vbGVhblwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQm9vbGVhbkFycmF5UHJvcChwOiB1bmtub3duKTogcCBpcyBCb29sZWFuQXJyYXlQcm9wIHtcbiAgcmV0dXJuIChwIGFzIEJvb2xlYW5BcnJheVByb3ApPy50eXBlID09PSBcImJvb2xlYW5bXVwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQm9vbGVhblByb3AocDogdW5rbm93bik6IHAgaXMgQm9vbGVhblByb3AgfCBCb29sZWFuQXJyYXlQcm9wIHtcbiAgcmV0dXJuIGlzQm9vbGVhblNpbmdsZVByb3AocCkgfHwgaXNCb29sZWFuQXJyYXlQcm9wKHApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0ZVNpbmdsZVByb3AocDogdW5rbm93bik6IHAgaXMgRGF0ZVByb3Age1xuICByZXR1cm4gKHAgYXMgRGF0ZVByb3ApPy50eXBlID09PSBcImRhdGVcIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGVBcnJheVByb3AocDogdW5rbm93bik6IHAgaXMgRGF0ZUFycmF5UHJvcCB7XG4gIHJldHVybiAocCBhcyBEYXRlQXJyYXlQcm9wKT8udHlwZSA9PT0gXCJkYXRlW11cIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGVQcm9wKHA6IHVua25vd24pOiBwIGlzIERhdGVQcm9wIHwgRGF0ZUFycmF5UHJvcCB7XG4gIHJldHVybiBpc0RhdGVTaW5nbGVQcm9wKHApIHx8IGlzRGF0ZUFycmF5UHJvcChwKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1V1aWRTaW5nbGVQcm9wKHA6IHVua25vd24pOiBwIGlzIFV1aWRQcm9wIHtcbiAgcmV0dXJuIChwIGFzIFV1aWRQcm9wKT8udHlwZSA9PT0gXCJ1dWlkXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNVdWlkQXJyYXlQcm9wKHA6IHVua25vd24pOiBwIGlzIFV1aWRBcnJheVByb3Age1xuICByZXR1cm4gKHAgYXMgVXVpZEFycmF5UHJvcCk/LnR5cGUgPT09IFwidXVpZFtdXCI7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNVdWlkUHJvcChwOiB1bmtub3duKTogcCBpcyBVdWlkUHJvcCB8IFV1aWRBcnJheVByb3Age1xuICByZXR1cm4gaXNVdWlkU2luZ2xlUHJvcChwKSB8fCBpc1V1aWRBcnJheVByb3AocCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNKc29uUHJvcChwOiB1bmtub3duKTogcCBpcyBKc29uUHJvcCB7XG4gIHJldHVybiAocCBhcyBKc29uUHJvcCk/LnR5cGUgPT09IFwianNvblwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVmlydHVhbFByb3AocDogdW5rbm93bik6IHAgaXMgVmlydHVhbFByb3Age1xuICByZXR1cm4gKHAgYXMgVmlydHVhbFByb3ApPy50eXBlID09PSBcInZpcnR1YWxcIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1JlbGF0aW9uUHJvcChwOiB1bmtub3duKTogcCBpcyBSZWxhdGlvblByb3Age1xuICByZXR1cm4gKHAgYXMgUmVsYXRpb25Qcm9wKT8udHlwZSA9PT0gXCJyZWxhdGlvblwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzT25lVG9PbmVSZWxhdGlvblByb3AocDogdW5rbm93bik6IHAgaXMgT25lVG9PbmVSZWxhdGlvblByb3Age1xuICByZXR1cm4gKHAgYXMgT25lVG9PbmVSZWxhdGlvblByb3ApPy5yZWxhdGlvblR5cGUgPT09IFwiT25lVG9PbmVcIjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwOiB1bmtub3duKTogcCBpcyBCZWxvbmdzVG9PbmVSZWxhdGlvblByb3Age1xuICByZXR1cm4gKHAgYXMgQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKT8ucmVsYXRpb25UeXBlID09PSBcIkJlbG9uZ3NUb09uZVwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzSGFzTWFueVJlbGF0aW9uUHJvcChwOiB1bmtub3duKTogcCBpcyBIYXNNYW55UmVsYXRpb25Qcm9wIHtcbiAgcmV0dXJuIChwIGFzIEhhc01hbnlSZWxhdGlvblByb3ApPy5yZWxhdGlvblR5cGUgPT09IFwiSGFzTWFueVwiO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChwOiB1bmtub3duKTogcCBpcyBNYW55VG9NYW55UmVsYXRpb25Qcm9wIHtcbiAgcmV0dXJuIChwIGFzIE1hbnlUb01hbnlSZWxhdGlvblByb3ApPy5yZWxhdGlvblR5cGUgPT09IFwiTWFueVRvTWFueVwiO1xufVxuXG50eXBlIEpvaW5DbGF1c2UgPVxuICB8IHtcbiAgICAgIGZyb206IHN0cmluZztcbiAgICAgIHRvOiBzdHJpbmc7XG4gICAgfVxuICB8IHtcbiAgICAgIGN1c3RvbTogc3RyaW5nO1xuICAgIH07XG5leHBvcnQgZnVuY3Rpb24gaXNDdXN0b21Kb2luQ2xhdXNlKHA6IHVua25vd24pOiBwIGlzIHsgY3VzdG9tOiBzdHJpbmcgfSB7XG4gIHJldHVybiAhIShwIGFzIHsgY3VzdG9tOiBzdHJpbmcgfSk/LmN1c3RvbTtcbn1cblxudHlwZSBTdWJzZXRMb2FkZXIgPSB7XG4gIGFzOiBzdHJpbmc7XG4gIHRhYmxlOiBzdHJpbmc7XG4gIG1hbnlKb2luOiB7XG4gICAgZnJvbVRhYmxlOiBzdHJpbmc7XG4gICAgZnJvbUNvbDogc3RyaW5nO1xuICAgIGlkRmllbGQ6IHN0cmluZztcbiAgICB0b1RhYmxlOiBzdHJpbmc7XG4gICAgdG9Db2w6IHN0cmluZztcbiAgICB0aHJvdWdoPzoge1xuICAgICAgdGFibGU6IHN0cmluZztcbiAgICAgIGZyb21Db2w6IHN0cmluZztcbiAgICAgIHRvQ29sOiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbiAgb25lSm9pbnM6ICh7XG4gICAgYXM6IHN0cmluZztcbiAgICBqb2luOiBcImlubmVyXCIgfCBcIm91dGVyXCI7XG4gICAgdGFibGU6IHN0cmluZztcbiAgfSAmIEpvaW5DbGF1c2UpW107XG4gIHNlbGVjdDogc3RyaW5nW107XG4gIGxvYWRlcnM/OiBTdWJzZXRMb2FkZXJbXTtcbn07XG5cbmV4cG9ydCB0eXBlIFN1YnNldFF1ZXJ5ID0ge1xuICBzZWxlY3Q6IHN0cmluZ1tdO1xuICB2aXJ0dWFsOiBzdHJpbmdbXTtcbiAgam9pbnM6ICh7XG4gICAgYXM6IHN0cmluZztcbiAgICBqb2luOiBcImlubmVyXCIgfCBcIm91dGVyXCI7XG4gICAgdGFibGU6IHN0cmluZztcbiAgfSAmIEpvaW5DbGF1c2UpW107XG4gIGxvYWRlcnM6IFN1YnNldExvYWRlcltdO1xufTtcblxuLyogQmFzZU1vZGVsICovXG5leHBvcnQgY29uc3QgU29uYW11UXVlcnlNb2RlID0gei5lbnVtKFtcImJvdGhcIiwgXCJsaXN0XCIsIFwiY291bnRcIl0pO1xuZXhwb3J0IHR5cGUgU29uYW11UXVlcnlNb2RlID0gei5pbmZlcjx0eXBlb2YgU29uYW11UXVlcnlNb2RlPjtcblxuLyogS25leCBNaWdyYXRpb24gKi9cbmV4cG9ydCB0eXBlIEtuZXhFcnJvciA9IHtcbiAgY29kZTogc3RyaW5nO1xuICBlcnJubzogbnVtYmVyO1xuICBzcWw6IHN0cmluZztcbiAgc3FsTWVzc2FnZTogc3RyaW5nO1xuICBzcWxTdGF0ZTogc3RyaW5nO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBpc0tuZXhFcnJvcihlOiB1bmtub3duKTogZSBpcyBLbmV4RXJyb3Ige1xuICByZXR1cm4gISEoZSBhcyBLbmV4RXJyb3IpPy5jb2RlICYmICEhKGUgYXMgS25leEVycm9yKT8uc3FsTWVzc2FnZSAmJiAhIShlIGFzIEtuZXhFcnJvcik/LnNxbFN0YXRlO1xufVxuXG5leHBvcnQgdHlwZSBLbmV4Q29sdW1uVHlwZSA9XG4gIHwgXCJzdHJpbmdcIlxuICB8IFwidGV4dFwiXG4gIHwgXCJzbWFsbHRleHRcIlxuICB8IFwibWVkaXVtdGV4dFwiXG4gIHwgXCJsb25ndGV4dFwiXG4gIHwgXCJpbnRlZ2VyXCJcbiAgfCBcImJpZ0ludGVnZXJcIlxuICB8IFwiZGVjaW1hbFwiXG4gIHwgXCJ0aW1lc3RhbXBcIlxuICB8IFwiYm9vbGVhblwiXG4gIHwgXCJmb3JlaWduXCJcbiAgfCBcInV1aWRcIlxuICB8IFwianNvblwiXG4gIHwgXCJmbG9hdFwiXG4gIHwgXCJkYXRlXCJcbiAgfCBcInRpbWVcIlxuICB8IFwiZGF0ZXRpbWVcIjtcbmV4cG9ydCB0eXBlIE1pZ3JhdGlvbkNvbHVtblR5cGUgPVxuICB8IFwic3RyaW5nXCJcbiAgfCBcInN0cmluZ1tdXCJcbiAgfCBcImludGVnZXJcIlxuICB8IFwiaW50ZWdlcltdXCJcbiAgfCBcImJpZ0ludGVnZXJcIlxuICB8IFwiYmlnSW50ZWdlcltdXCJcbiAgfCBcIm51bWJlck9yTnVtZXJpY1wiXG4gIHwgXCJudW1iZXJPck51bWVyaWNbXVwiXG4gIHwgXCJib29sZWFuXCJcbiAgfCBcImJvb2xlYW5bXVwiXG4gIHwgXCJkYXRlXCJcbiAgfCBcImRhdGVbXVwiXG4gIHwgXCJ1dWlkXCJcbiAgfCBcInV1aWRbXVwiXG4gIHwgXCJqc29uXCI7XG5leHBvcnQgdHlwZSBNaWdyYXRpb25Db2x1bW4gPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogTWlncmF0aW9uQ29sdW1uVHlwZTtcbiAgbnVsbGFibGU6IGJvb2xlYW47XG4gIG51bWJlclR5cGU/OiBcInJlYWxcIiB8IFwiZG91YmxlIHByZWNpc2lvblwiIHwgXCJudW1lcmljXCI7XG4gIGxlbmd0aD86IG51bWJlcjtcbiAgZGVmYXVsdFRvPzogc3RyaW5nO1xuICBwcmVjaXNpb24/OiBudW1iZXI7XG4gIHNjYWxlPzogbnVtYmVyO1xufTtcbmV4cG9ydCB0eXBlIE1pZ3JhdGlvbkluZGV4ID0ge1xuICBjb2x1bW5zOiBzdHJpbmdbXTtcbiAgdHlwZTogXCJ1bmlxdWVcIiB8IFwiaW5kZXhcIiB8IFwiZnVsbHRleHRcIjtcbiAgcGFyc2VyPzogXCJidWlsdC1pblwiIHwgXCJuZ3JhbVwiO1xufTtcbmV4cG9ydCB0eXBlIE1pZ3JhdGlvbkZvcmVpZ24gPSB7XG4gIGNvbHVtbnM6IHN0cmluZ1tdO1xuICB0bzogc3RyaW5nO1xuICBvblVwZGF0ZTogUmVsYXRpb25PbjtcbiAgb25EZWxldGU6IFJlbGF0aW9uT247XG59O1xuZXhwb3J0IHR5cGUgTWlncmF0aW9uSm9pblRhYmxlID0ge1xuICB0YWJsZTogc3RyaW5nO1xuICBpbmRleGVzOiBNaWdyYXRpb25JbmRleFtdO1xuICBjb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXTtcbiAgZm9yZWlnbnM6IE1pZ3JhdGlvbkZvcmVpZ25bXTtcbn07XG5leHBvcnQgdHlwZSBNaWdyYXRpb25TZXQgPSB7XG4gIHRhYmxlOiBzdHJpbmc7XG4gIGNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdO1xuICBpbmRleGVzOiBNaWdyYXRpb25JbmRleFtdO1xuICBmb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdO1xufTtcbmV4cG9ydCB0eXBlIE1pZ3JhdGlvblNldEFuZEpvaW5UYWJsZSA9IE1pZ3JhdGlvblNldCAmIHtcbiAgam9pblRhYmxlczogTWlncmF0aW9uSm9pblRhYmxlW107XG59O1xuZXhwb3J0IHR5cGUgR2VuTWlncmF0aW9uQ29kZSA9IHtcbiAgdGl0bGU6IHN0cmluZztcbiAgdGFibGU6IHN0cmluZztcbiAgdHlwZTogXCJub3JtYWxcIiB8IFwiZm9yZWlnblwiO1xuICBmb3JtYXR0ZWQ6IHN0cmluZyB8IG51bGw7XG59O1xuXG4vKiBBcGkgKi9cbmV4cG9ydCB0eXBlIEFwaVBhcmFtID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU6IEFwaVBhcmFtVHlwZTtcbiAgb3B0aW9uYWw6IGJvb2xlYW47XG4gIGRlZmF1bHREZWY/OiBzdHJpbmc7XG59O1xuZXhwb3J0IG5hbWVzcGFjZSBBcGlQYXJhbVR5cGUge1xuICBleHBvcnQgdHlwZSBPYmplY3QgPSB7XG4gICAgdDogXCJvYmplY3RcIjtcbiAgICBwcm9wczogQXBpUGFyYW1bXTtcbiAgfTtcbiAgZXhwb3J0IHR5cGUgVW5pb24gPSB7XG4gICAgdDogXCJ1bmlvblwiO1xuICAgIHR5cGVzOiBBcGlQYXJhbVR5cGVbXTtcbiAgfTtcbiAgZXhwb3J0IHR5cGUgSW50ZXJzZWN0aW9uID0ge1xuICAgIHQ6IFwiaW50ZXJzZWN0aW9uXCI7XG4gICAgdHlwZXM6IEFwaVBhcmFtVHlwZVtdO1xuICB9O1xuICBleHBvcnQgdHlwZSBTdHJpbmdMaXRlcmFsID0ge1xuICAgIHQ6IFwic3RyaW5nLWxpdGVyYWxcIjtcbiAgICB2YWx1ZTogc3RyaW5nO1xuICB9O1xuICBleHBvcnQgdHlwZSBOdW1lcmljTGl0ZXJhbCA9IHtcbiAgICB0OiBcIm51bWVyaWMtbGl0ZXJhbFwiO1xuICAgIHZhbHVlOiBudW1iZXI7XG4gIH07XG4gIGV4cG9ydCB0eXBlIEFycmF5ID0ge1xuICAgIHQ6IFwiYXJyYXlcIjtcbiAgICBlbGVtZW50c1R5cGU6IEFwaVBhcmFtVHlwZTtcbiAgfTtcbiAgZXhwb3J0IHR5cGUgUmVmID0ge1xuICAgIHQ6IFwicmVmXCI7XG4gICAgaWQ6IHN0cmluZztcbiAgICBhcmdzPzogQXBpUGFyYW1UeXBlW107XG4gIH07XG4gIGV4cG9ydCB0eXBlIEluZGV4ZWRBY2Nlc3MgPSB7XG4gICAgdDogXCJpbmRleGVkLWFjY2Vzc1wiO1xuICAgIG9iamVjdDogQXBpUGFyYW1UeXBlO1xuICAgIGluZGV4OiBBcGlQYXJhbVR5cGU7XG4gIH07XG4gIGV4cG9ydCB0eXBlIFR1cGxlVHlwZSA9IHtcbiAgICB0OiBcInR1cGxlLXR5cGVcIjtcbiAgICBlbGVtZW50czogQXBpUGFyYW1UeXBlW107XG4gIH07XG4gIGV4cG9ydCB0eXBlIFBpY2sgPSBSZWYgJiB7XG4gICAgdDogXCJyZWZcIjtcbiAgICBpZDogXCJQaWNrXCI7XG4gIH07XG4gIGV4cG9ydCB0eXBlIE9taXQgPSBSZWYgJiB7XG4gICAgdDogXCJyZWZcIjtcbiAgICBpZDogXCJPbWl0XCI7XG4gIH07XG4gIGV4cG9ydCB0eXBlIFBhcnRpYWwgPSBSZWYgJiB7XG4gICAgdDogXCJyZWZcIjtcbiAgICBpZDogXCJQYXJ0aWFsXCI7XG4gIH07XG4gIGV4cG9ydCB0eXBlIFByb21pc2UgPSBSZWYgJiB7XG4gICAgdDogXCJyZWZcIjtcbiAgICBpZDogXCJQcm9taXNlXCI7XG4gIH07XG4gIGV4cG9ydCB0eXBlIENvbnRleHQgPSBSZWYgJiB7XG4gICAgdDogXCJyZWZcIjtcbiAgICBpZDogXCJDb250ZXh0XCI7XG4gIH07XG4gIGV4cG9ydCB0eXBlIFR5cGVQYXJhbSA9IHtcbiAgICB0OiBcInR5cGUtcGFyYW1cIjtcbiAgICBpZDogc3RyaW5nO1xuICAgIGNvbnN0cmFpbnQ/OiBBcGlQYXJhbVR5cGU7XG4gIH07XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5PYmplY3Qge1xuICAgIHJldHVybiAodiBhcyBBcGlQYXJhbVR5cGUuT2JqZWN0KT8udCA9PT0gXCJvYmplY3RcIjtcbiAgfVxuICBleHBvcnQgZnVuY3Rpb24gaXNVbmlvbih2OiB1bmtub3duKTogdiBpcyBBcGlQYXJhbVR5cGUuVW5pb24ge1xuICAgIHJldHVybiAodiBhcyBBcGlQYXJhbVR5cGUuVW5pb24pPy50ID09PSBcInVuaW9uXCI7XG4gIH1cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzSW50ZXJzZWN0aW9uKHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5JbnRlcnNlY3Rpb24ge1xuICAgIHJldHVybiAodiBhcyBBcGlQYXJhbVR5cGUuSW50ZXJzZWN0aW9uKT8udCA9PT0gXCJpbnRlcnNlY3Rpb25cIjtcbiAgfVxuICBleHBvcnQgZnVuY3Rpb24gaXNTdHJpbmdMaXRlcmFsKHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5TdHJpbmdMaXRlcmFsIHtcbiAgICByZXR1cm4gKHYgYXMgQXBpUGFyYW1UeXBlLlN0cmluZ0xpdGVyYWwpPy50ID09PSBcInN0cmluZy1saXRlcmFsXCI7XG4gIH1cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzTnVtZXJpY0xpdGVyYWwodjogdW5rbm93bik6IHYgaXMgQXBpUGFyYW1UeXBlLk51bWVyaWNMaXRlcmFsIHtcbiAgICByZXR1cm4gKHYgYXMgQXBpUGFyYW1UeXBlLk51bWVyaWNMaXRlcmFsKT8udCA9PT0gXCJudW1lcmljLWxpdGVyYWxcIjtcbiAgfVxuICBleHBvcnQgZnVuY3Rpb24gaXNBcnJheSh2OiB1bmtub3duKTogdiBpcyBBcGlQYXJhbVR5cGUuQXJyYXkge1xuICAgIHJldHVybiAodiBhcyBBcGlQYXJhbVR5cGUuQXJyYXkpPy50ID09PSBcImFycmF5XCI7XG4gIH1cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzUmVmKHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5SZWYge1xuICAgIHJldHVybiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2ICE9PSBudWxsICYmICh2IGFzIHsgdD86IHVua25vd24gfSkudCA9PT0gXCJyZWZcIjtcbiAgfVxuICBleHBvcnQgZnVuY3Rpb24gaXNJbmRleGVkQWNjZXNzKHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5JbmRleGVkQWNjZXNzIHtcbiAgICByZXR1cm4gdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiYgdiAhPT0gbnVsbCAmJiAodiBhcyB7IHQ/OiB1bmtub3duIH0pLnQgPT09IFwiaW5kZXhlZC1hY2Nlc3NcIjtcbiAgfVxuICBleHBvcnQgZnVuY3Rpb24gaXNUdXBsZVR5cGUodjogdW5rbm93bik6IHYgaXMgQXBpUGFyYW1UeXBlLlR1cGxlVHlwZSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT09IG51bGwgJiYgKHYgYXMgeyB0PzogdW5rbm93biB9KS50ID09PSBcInR1cGxlLXR5cGVcIjtcbiAgfVxuICBleHBvcnQgZnVuY3Rpb24gaXNQaWNrKHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5QaWNrIHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIHYgIT09IG51bGwgJiZcbiAgICAgICh2IGFzIHsgdD86IHVua25vd24gfSkudCA9PT0gXCJyZWZcIiAmJlxuICAgICAgKHYgYXMgeyBpZD86IHVua25vd24gfSkuaWQgPT09IFwiUGlja1wiXG4gICAgKTtcbiAgfVxuICBleHBvcnQgZnVuY3Rpb24gaXNPbWl0KHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5PbWl0IHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIHYgIT09IG51bGwgJiZcbiAgICAgICh2IGFzIHsgdD86IHVua25vd24gfSkudCA9PT0gXCJyZWZcIiAmJlxuICAgICAgKHYgYXMgeyBpZD86IHVua25vd24gfSkuaWQgPT09IFwiT21pdFwiXG4gICAgKTtcbiAgfVxuICBleHBvcnQgZnVuY3Rpb24gaXNQYXJ0aWFsKHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5QYXJ0aWFsIHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIHYgIT09IG51bGwgJiZcbiAgICAgICh2IGFzIHsgdD86IHVua25vd24gfSkudCA9PT0gXCJyZWZcIiAmJlxuICAgICAgKHYgYXMgeyBpZD86IHVua25vd24gfSkuaWQgPT09IFwiUGFydGlhbFwiXG4gICAgKTtcbiAgfVxuICBleHBvcnQgZnVuY3Rpb24gaXNQcm9taXNlKHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5Qcm9taXNlIHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIHYgIT09IG51bGwgJiZcbiAgICAgICh2IGFzIHsgdD86IHVua25vd24gfSkudCA9PT0gXCJyZWZcIiAmJlxuICAgICAgKHYgYXMgeyBpZD86IHVua25vd24gfSkuaWQgPT09IFwiUHJvbWlzZVwiXG4gICAgKTtcbiAgfVxuICBleHBvcnQgZnVuY3Rpb24gaXNDb250ZXh0KHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5Db250ZXh0IHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIHYgIT09IG51bGwgJiZcbiAgICAgICh2IGFzIHsgdD86IHVua25vd24gfSkudCA9PT0gXCJyZWZcIiAmJlxuICAgICAgKHYgYXMgeyBpZD86IHVua25vd24gfSkuaWQgPT09IFwiQ29udGV4dFwiXG4gICAgKTtcbiAgfVxuICBleHBvcnQgZnVuY3Rpb24gaXNSZWZLbmV4KHY6IHVua25vd24pOiB2IGlzIEFwaVBhcmFtVHlwZS5SZWYge1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgdiAhPT0gbnVsbCAmJlxuICAgICAgKHYgYXMgeyB0PzogdW5rbm93biB9KS50ID09PSBcInJlZlwiICYmXG4gICAgICAodiBhcyB7IGlkPzogdW5rbm93biB9KS5pZCA9PT0gXCJLbmV4XCJcbiAgICApO1xuICB9XG4gIGV4cG9ydCBmdW5jdGlvbiBpc1R5cGVQYXJhbSh2OiB1bmtub3duKTogdiBpcyBBcGlQYXJhbVR5cGUuVHlwZVBhcmFtIHtcbiAgICByZXR1cm4gdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiYgdiAhPT0gbnVsbCAmJiAodiBhcyB7IHQ/OiB1bmtub3duIH0pLnQgPT09IFwidHlwZS1wYXJhbVwiO1xuICB9XG59XG5leHBvcnQgdHlwZSBBcGlQYXJhbVR5cGUgPVxuICB8IFwic3RyaW5nXCJcbiAgfCBcIm51bWJlclwiXG4gIHwgXCJib29sZWFuXCJcbiAgfCBcIm51bGxcIlxuICB8IFwidW5kZWZpbmVkXCJcbiAgfCBcInZvaWRcIlxuICB8IFwiYW55XCJcbiAgfCBcInVua25vd25cIlxuICB8IFwidHJ1ZVwiXG4gIHwgXCJmYWxzZVwiXG4gIHwgQXBpUGFyYW1UeXBlLlN0cmluZ0xpdGVyYWxcbiAgfCBBcGlQYXJhbVR5cGUuTnVtZXJpY0xpdGVyYWxcbiAgfCBBcGlQYXJhbVR5cGUuT2JqZWN0XG4gIHwgQXBpUGFyYW1UeXBlLlVuaW9uXG4gIHwgQXBpUGFyYW1UeXBlLkludGVyc2VjdGlvblxuICB8IEFwaVBhcmFtVHlwZS5BcnJheVxuICB8IEFwaVBhcmFtVHlwZS5SZWZcbiAgfCBBcGlQYXJhbVR5cGUuSW5kZXhlZEFjY2Vzc1xuICB8IEFwaVBhcmFtVHlwZS5UeXBlUGFyYW1cbiAgfCBBcGlQYXJhbVR5cGUuVHVwbGVUeXBlO1xuXG4vKiBUZW1wbGF0ZSAqL1xuLyoqXG4gKiBVSSDsu7Ttj6zrhIztirgg66CM642U66eB7J2EIOychO2VnCDrqZTtg4DrjbDsnbTthLAg64W465Oc7J6F64uI64ukLlxuICpcbiAqICoq66qp7KCBKio6IFpvZCDsiqTtgqTrp4jroZzrtoDthLAg7ZSE66Gg7Yq47JeU65OcIFVJIOy7tO2PrOuEjO2KuOulvCDsnpDrj5kg7IOd7ISx7ZWY6riwIOychO2VnFxuICog66CM642U66eBIOygleuztOulvCDri7TsnYAg7Yq466asIOq1rOyhsOyeheuLiOuLpC4g6rCBIO2VhOuTnOqwgCDslrTrlqQgVUkg7Lu07Y+s64SM7Yq466GcXG4gKiDtkZztmITrkJjslrTslbwg7ZWY64qU7KeAKO2FjeyKpO2KuCwg7J2066+47KeALCDrgqDsp5wsIEVudW0g7ISg7YOdIOuTsSnrpbwg66qF7Iuc7ZWp64uI64ukLlxuICpcbiAqICoq67OA7ZmYIO2dkOumhCoqOlxuICogRW50aXR5IHN1YnNldCDihpIgRW50aXR5UHJvcE5vZGUg4oaSIFpvZCDsiqTtgqTrp4gg4oaSIFJlbmRlcmluZ05vZGUgKFVJ7JqpKSDihpIgUmVhY3Qg7Lu07Y+s64SM7Yq4IOy9lOuTnCDsg53shLFcbiAqXG4gKiAqKuyjvOyalCDtlYTrk5wqKjpcbiAqIC0gYHJlbmRlclR5cGVgOiBVSSDsu7Ttj6zrhIztirgg7Jyg7ZiVIChzdHJpbmctcGxhaW4sIG51bWJlci1ma19pZCwgZW51bXMsIGFycmF5IOuTsSlcbiAqIC0gYHpvZFR5cGVgOiDsm5Drs7ggWm9kIOyKpO2CpOuniCAodmFsaWRhdGlvbiDsmqkpXG4gKiAtIGBjaGlsZHJlbmA6IOykkeyyqeuQnCDqsJ3ssrQg7ZWE65Oc65OkIChvYmplY3Tsnbwg65WMKVxuICogLSBgZWxlbWVudGA6IOuwsOyXtCDsmpTshowg7YOA7J6FIChhcnJheeydvCDrlYwpXG4gKlxuICogKirsgqzsmqkg7JyE7LmYKio6XG4gKiAtIHpvZC1jb252ZXJ0ZXIudHPsnZggem9kVHlwZVRvUmVuZGVyaW5nTm9kZSgp7JeQ7IScIOyDneyEsVxuICogLSB2aWV3X2Zvcm0udGVtcGxhdGUudHMsIHZpZXdfbGlzdC50ZW1wbGF0ZS50cyDrk7Hsl5DshJwgUmVhY3Qg7Lu07Y+s64SM7Yq4IOy9lOuTnCDsg53shLHsl5Ag7IKs7JqpXG4gKi9cbi8vIOyFgO2UhCDssLjsobAg7YOA7J6F7J2066+A66GcIFpvZCDsg53rnrXtlZjqs6Ag7KeB7KCRIOygleydmFxuZXhwb3J0IGNvbnN0IFJlbmRlcmluZ05vZGUgPSB6LmFueSgpO1xuZXhwb3J0IHR5cGUgUmVuZGVyaW5nTm9kZSA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICByZW5kZXJUeXBlOlxuICAgIHwgXCJzdHJpbmctcGxhaW5cIlxuICAgIHwgXCJzdHJpbmctaW1hZ2VcIlxuICAgIHwgXCJzdHJpbmctZGF0ZXRpbWVcIlxuICAgIHwgXCJzdHJpbmctZGF0ZVwiXG4gICAgfCBcImRhdGV0aW1lXCJcbiAgICB8IFwibnVtYmVyLXBsYWluXCJcbiAgICB8IFwibnVtYmVyLWlkXCJcbiAgICB8IFwibnVtYmVyLWZrX2lkXCJcbiAgICB8IFwiYm9vbGVhblwiXG4gICAgfCBcImVudW1zXCJcbiAgICB8IFwiYXJyYXlcIlxuICAgIHwgXCJhcnJheS1pbWFnZXNcIlxuICAgIHwgXCJvYmplY3RcIlxuICAgIHwgXCJvYmplY3QtcGlja1wiXG4gICAgfCBcInJlY29yZFwiO1xuICB6b2RUeXBlOiB6LlpvZFR5cGVBbnk7XG4gIGVsZW1lbnQ/OiBSZW5kZXJpbmdOb2RlO1xuICBjaGlsZHJlbj86IFJlbmRlcmluZ05vZGVbXTtcbiAgY29uZmlnPzoge1xuICAgIHBpY2tlZDogc3RyaW5nO1xuICB9O1xuICBvcHRpb25hbD86IGJvb2xlYW47XG4gIG51bGxhYmxlPzogYm9vbGVhbjtcbn07XG5cbmNvbnN0IEJhc2VQcm9wRmllbGRzID0ge1xuICBuYW1lOiB6LnN0cmluZygpLFxuICBkZXNjOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIG51bGxhYmxlOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICB0b0ZpbHRlcjogei5saXRlcmFsKHRydWUpLm9wdGlvbmFsKCksXG4gIGRiRGVmYXVsdDogei51bmlvbihbei5zdHJpbmcoKSwgei5udW1iZXIoKSwgei5ib29sZWFuKCldKS5vcHRpb25hbCgpLFxufTtcblxuLy8g67aA6rCAIO2VhOuTnOqwgCDtlYTsmpTsl4bripQgcHJvcFxuY29uc3QgQmFzZVByb3BGaWVsZHNXaXRob3V0QWRkaXRpb25hbCA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVByb3BGaWVsZHMsXG4gICAgdHlwZTogei51bmlvbihbXG4gICAgICB6LmxpdGVyYWwoXCJpbnRlZ2VyXCIpLFxuICAgICAgei5saXRlcmFsKFwiaW50ZWdlcltdXCIpLFxuICAgICAgei5saXRlcmFsKFwiYmlnSW50ZWdlclwiKSxcbiAgICAgIHoubGl0ZXJhbChcImJpZ0ludGVnZXJbXVwiKSxcbiAgICAgIHoubGl0ZXJhbChcImJvb2xlYW5cIiksXG4gICAgICB6LmxpdGVyYWwoXCJib29sZWFuW11cIiksXG4gICAgICB6LmxpdGVyYWwoXCJkYXRlXCIpLFxuICAgICAgei5saXRlcmFsKFwiZGF0ZVtdXCIpLFxuICAgICAgei5saXRlcmFsKFwidXVpZFwiKSxcbiAgICAgIHoubGl0ZXJhbChcInV1aWRbXVwiKSxcbiAgICBdKSxcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG4vLyBwcmVjaXNpb24vc2NhbGUg7ZWE65OcXG5jb25zdCBQcmVjaXNpb25TY2FsZUZpZWxkcyA9IHtcbiAgcHJlY2lzaW9uOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIHNjYWxlOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG59O1xuXG4vLyDqsIEg7YOA7J6F67OEIOyKpO2CpOuniCDsoJXsnZhcblxuY29uc3QgU3RyaW5nUHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVByb3BGaWVsZHMsXG4gICAgdHlwZTogei5saXRlcmFsKFwic3RyaW5nXCIpLFxuICAgIGxlbmd0aDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5jb25zdCBTdHJpbmdBcnJheVByb3BTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIC4uLkJhc2VQcm9wRmllbGRzLFxuICAgIHR5cGU6IHoubGl0ZXJhbChcInN0cmluZ1tdXCIpLFxuICAgIGxlbmd0aDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IEVudW1Qcm9wU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICAuLi5CYXNlUHJvcEZpZWxkcyxcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJlbnVtXCIpLFxuICAgIGlkOiB6LnN0cmluZygpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5jb25zdCBFbnVtQXJyYXlQcm9wU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICAuLi5CYXNlUHJvcEZpZWxkcyxcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJlbnVtW11cIiksXG4gICAgaWQ6IHouc3RyaW5nKCksXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgTnVtYmVyUHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVByb3BGaWVsZHMsXG4gICAgdHlwZTogei5saXRlcmFsKFwibnVtYmVyXCIpLFxuICAgIC4uLlByZWNpc2lvblNjYWxlRmllbGRzLFxuICAgIG51bWJlclR5cGU6IHouZW51bShbXCJyZWFsXCIsIFwiZG91YmxlIHByZWNpc2lvblwiLCBcIm51bWVyaWNcIl0pLm9wdGlvbmFsKCksXG4gIH0pXG4gIC5zdHJpY3QoKTtcbmNvbnN0IE51bWJlckFycmF5UHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVByb3BGaWVsZHMsXG4gICAgdHlwZTogei5saXRlcmFsKFwibnVtYmVyW11cIiksXG4gICAgLi4uUHJlY2lzaW9uU2NhbGVGaWVsZHMsXG4gICAgbnVtYmVyVHlwZTogei5lbnVtKFtcInJlYWxcIiwgXCJkb3VibGUgcHJlY2lzaW9uXCIsIFwibnVtZXJpY1wiXSkub3B0aW9uYWwoKSxcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG5jb25zdCBOdW1lcmljUHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVByb3BGaWVsZHMsXG4gICAgdHlwZTogei5saXRlcmFsKFwibnVtZXJpY1wiKSxcbiAgICAuLi5QcmVjaXNpb25TY2FsZUZpZWxkcyxcbiAgfSlcbiAgLnN0cmljdCgpO1xuY29uc3QgTnVtZXJpY0FycmF5UHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVByb3BGaWVsZHMsXG4gICAgdHlwZTogei5saXRlcmFsKFwibnVtZXJpY1tdXCIpLFxuICAgIC4uLlByZWNpc2lvblNjYWxlRmllbGRzLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IEpzb25Qcm9wU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICAuLi5CYXNlUHJvcEZpZWxkcyxcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJqc29uXCIpLFxuICAgIGlkOiB6LnN0cmluZygpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IFZpcnR1YWxQcm9wU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICAuLi5CYXNlUHJvcEZpZWxkcyxcbiAgICB0eXBlOiB6LmxpdGVyYWwoXCJ2aXJ0dWFsXCIpLFxuICAgIGlkOiB6LnN0cmluZygpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbi8vIFJlbGF0aW9uIO2DgOyeheydgCByZWxhdGlvblR5cGXsl5Ag65Sw6528IOyEuOu2hO2ZlFxuY29uc3QgQmFzZVJlbGF0aW9uRmllbGRzID0ge1xuICAuLi5CYXNlUHJvcEZpZWxkcyxcbiAgdHlwZTogei5saXRlcmFsKFwicmVsYXRpb25cIiksXG4gIHdpdGg6IHouc3RyaW5nKCksXG59O1xuXG4vLyBSZWxhdGlvbk9uIO2DgOyehVxuY29uc3QgUmVsYXRpb25PblNjaGVtYSA9IHouZW51bShbXCJDQVNDQURFXCIsIFwiU0VUIE5VTExcIiwgXCJOTyBBQ1RJT05cIiwgXCJTRVQgREVGQVVMVFwiLCBcIlJFU1RSSUNUXCJdKTtcblxuY29uc3QgQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICAuLi5CYXNlUmVsYXRpb25GaWVsZHMsXG4gICAgcmVsYXRpb25UeXBlOiB6LmxpdGVyYWwoXCJCZWxvbmdzVG9PbmVcIiksXG4gICAgY3VzdG9tSm9pbkNsYXVzZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIHVzZUNvbnN0cmFpbnQ6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgb25VcGRhdGU6IFJlbGF0aW9uT25TY2hlbWEub3B0aW9uYWwoKSxcbiAgICBvbkRlbGV0ZTogUmVsYXRpb25PblNjaGVtYS5vcHRpb25hbCgpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IEhhc01hbnlSZWxhdGlvblByb3BTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIC4uLkJhc2VSZWxhdGlvbkZpZWxkcyxcbiAgICByZWxhdGlvblR5cGU6IHoubGl0ZXJhbChcIkhhc01hbnlcIiksXG4gICAgam9pbkNvbHVtbjogei5zdHJpbmcoKSxcbiAgICBmcm9tQ29sdW1uOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgTWFueVRvTWFueVJlbGF0aW9uUHJvcFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgLi4uQmFzZVJlbGF0aW9uRmllbGRzLFxuICAgIHJlbGF0aW9uVHlwZTogei5saXRlcmFsKFwiTWFueVRvTWFueVwiKSxcbiAgICBqb2luVGFibGU6IHouc3RyaW5nKCksXG4gICAgb25VcGRhdGU6IFJlbGF0aW9uT25TY2hlbWEsXG4gICAgb25EZWxldGU6IFJlbGF0aW9uT25TY2hlbWEsXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgT25lVG9PbmVSZWxhdGlvblByb3BTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIC4uLkJhc2VSZWxhdGlvbkZpZWxkcyxcbiAgICByZWxhdGlvblR5cGU6IHoubGl0ZXJhbChcIk9uZVRvT25lXCIpLFxuICAgIGN1c3RvbUpvaW5DbGF1c2U6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBoYXNKb2luQ29sdW1uOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgIHVzZUNvbnN0cmFpbnQ6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgb25VcGRhdGU6IFJlbGF0aW9uT25TY2hlbWEub3B0aW9uYWwoKSxcbiAgICBvbkRlbGV0ZTogUmVsYXRpb25PblNjaGVtYS5vcHRpb25hbCgpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IFJlbGF0aW9uVHlwZXMgPSBbXCJCZWxvbmdzVG9PbmVcIiwgXCJIYXNNYW55XCIsIFwiTWFueVRvTWFueVwiLCBcIk9uZVRvT25lXCJdIGFzIGNvbnN0O1xuZXhwb3J0IGNvbnN0IFJlbGF0aW9uUHJvcFNjaGVtYSA9IHouZGlzY3JpbWluYXRlZFVuaW9uKFxuICBcInJlbGF0aW9uVHlwZVwiLFxuICBbXG4gICAgQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wU2NoZW1hLFxuICAgIEhhc01hbnlSZWxhdGlvblByb3BTY2hlbWEsXG4gICAgTWFueVRvTWFueVJlbGF0aW9uUHJvcFNjaGVtYSxcbiAgICBPbmVUb09uZVJlbGF0aW9uUHJvcFNjaGVtYSxcbiAgXSxcbiAge1xuICAgIGVycm9yOiAoaXNzKSA9PlxuICAgICAgYHJlbGF0aW9uVHlwZeydgCAke1JlbGF0aW9uVHlwZXMubWFwKCh0KSA9PiBgJyR7dH0nYCkuam9pbihcIiwgXCIpfSDspJEg7ZWY64KY7Jes7JW8IO2VqeuLiOuLpC4g7J6F66Cl6rCSOiBcIiR7KGlzcy5pbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik/LnJlbGF0aW9uVHlwZX1cImAsXG4gIH0sXG4pO1xuXG5jb25zdCBOb3JtYWxQcm9wVHlwZXMgPSBbXG4gIFwiaW50ZWdlclwiLFxuICBcImludGVnZXJbXVwiLFxuICBcImJpZ0ludGVnZXJcIixcbiAgXCJiaWdJbnRlZ2VyW11cIixcbiAgXCJzdHJpbmdcIixcbiAgXCJzdHJpbmdbXVwiLFxuICBcImVudW1cIixcbiAgXCJlbnVtW11cIixcbiAgXCJudW1iZXJcIixcbiAgXCJudW1iZXJbXVwiLFxuICBcIm51bWVyaWNcIixcbiAgXCJudW1lcmljW11cIixcbiAgXCJib29sZWFuXCIsXG4gIFwiYm9vbGVhbltdXCIsXG4gIFwiZGF0ZVwiLFxuICBcImRhdGVbXVwiLFxuICBcInV1aWRcIixcbiAgXCJ1dWlkW11cIixcbiAgXCJqc29uXCIsXG4gIFwidmlydHVhbFwiLFxuXSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBOb3JtYWxQcm9wU2NoZW1hID0gei5kaXNjcmltaW5hdGVkVW5pb24oXG4gIFwidHlwZVwiLFxuICBbXG4gICAgQmFzZVByb3BGaWVsZHNXaXRob3V0QWRkaXRpb25hbCxcbiAgICBTdHJpbmdQcm9wU2NoZW1hLFxuICAgIFN0cmluZ0FycmF5UHJvcFNjaGVtYSxcbiAgICBFbnVtUHJvcFNjaGVtYSxcbiAgICBFbnVtQXJyYXlQcm9wU2NoZW1hLFxuICAgIE51bWJlclByb3BTY2hlbWEsXG4gICAgTnVtYmVyQXJyYXlQcm9wU2NoZW1hLFxuICAgIE51bWVyaWNQcm9wU2NoZW1hLFxuICAgIE51bWVyaWNBcnJheVByb3BTY2hlbWEsXG4gICAgSnNvblByb3BTY2hlbWEsXG4gICAgVmlydHVhbFByb3BTY2hlbWEsXG4gIF0sXG4gIHtcbiAgICBlcnJvcjogKGlzcykgPT5cbiAgICAgIGB0eXBl7J2AICR7Tm9ybWFsUHJvcFR5cGVzLm1hcCgodCkgPT4gYCcke3R9J2ApLmpvaW4oXCIsIFwiKX0g7KSRIO2VmOuCmOyXrOyVvCDtlanri4jri6QuIOyeheugpeqwkjogXCIkeyhpc3MuaW5wdXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pPy50eXBlfVwiYCxcbiAgfSxcbik7XG5cbmNvbnN0IEFsbFByb3BUeXBlcyA9IFsuLi5Ob3JtYWxQcm9wVHlwZXMsIFwicmVsYXRpb25cIl0gYXMgY29uc3Q7XG5jb25zdCBFbnRpdHlQcm9wU2NoZW1hID0gei5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtOb3JtYWxQcm9wU2NoZW1hLCBSZWxhdGlvblByb3BTY2hlbWFdLCB7XG4gIGVycm9yOiAoaXNzKSA9PlxuICAgIGB0eXBl7J2AICR7QWxsUHJvcFR5cGVzLm1hcCgodCkgPT4gYCcke3R9J2ApLmpvaW4oXCIsIFwiKX0g7KSRIO2VmOuCmOyXrOyVvCDtlanri4jri6QuIOyeheugpeqwkjogXCIkeyhpc3MuaW5wdXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pPy50eXBlfVwiYCxcbn0pO1xuXG4vLyBFbnRpdHlJbmRleCDsiqTtgqTrp4gg7KCV7J2YXG5jb25zdCBFbnRpdHlJbmRleFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgdHlwZTogei5lbnVtKFtcImluZGV4XCIsIFwidW5pcXVlXCIsIFwiZnVsbHRleHRcIl0pLFxuICAgIGNvbHVtbnM6IHouYXJyYXkoei5zdHJpbmcoKSksXG4gICAgbmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIHBhcnNlcjogei5lbnVtKFtcImJ1aWx0LWluXCIsIFwibmdyYW1cIl0pLm9wdGlvbmFsKCksXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuZXhwb3J0IGNvbnN0IEVudGl0eUpzb25TY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIGlkOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiUGFzY2FsQ2FzZeuhnCDrkJwgRW50aXR5IElEXCIpLFxuICAgIHRpdGxlOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiRW50aXR5IOydtOumhFwiKSxcbiAgICB0YWJsZTogei5zdHJpbmcoKS5kZXNjcmliZShcInNuYWtlX2Nhc2XroZwg65CcIO2FjOydtOu4lOuqhVwiKSxcbiAgICBwYXJlbnRJZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwi67aA66qoIEVudGl0eSBJRFwiKSxcbiAgICBwcm9wczogei5hcnJheShFbnRpdHlQcm9wU2NoZW1hKSxcbiAgICBpbmRleGVzOiB6LmFycmF5KEVudGl0eUluZGV4U2NoZW1hKSxcbiAgICBzdWJzZXRzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LmFycmF5KHouc3RyaW5nKCkpKSxcbiAgICBlbnVtczogei5yZWNvcmQoei5zdHJpbmcoKSwgei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkpLFxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmV4cG9ydCBjb25zdCBUZW1wbGF0ZU9wdGlvbnMgPSB6Lm9iamVjdCh7XG4gIGVudGl0eTogRW50aXR5SnNvblNjaGVtYS5vbWl0KHsgaWQ6IHRydWUgfSlcbiAgICAuZXh0ZW5kKHtcbiAgICAgIGVudGl0eUlkOiB6LnN0cmluZygpLFxuICAgIH0pXG4gICAgLnBhcnRpYWwoe1xuICAgICAgdGFibGU6IHRydWUsXG4gICAgICBwcm9wczogdHJ1ZSxcbiAgICAgIGluZGV4ZXM6IHRydWUsXG4gICAgICBzdWJzZXRzOiB0cnVlLFxuICAgICAgZW51bXM6IHRydWUsXG4gICAgfSksXG4gIGluaXRfdHlwZXM6IHoub2JqZWN0KHtcbiAgICBlbnRpdHlJZDogei5zdHJpbmcoKSxcbiAgfSksXG4gIGdlbmVyYXRlZDogei5vYmplY3Qoe30pLFxuICBnZW5lcmF0ZWRfc3NvOiB6Lm9iamVjdCh7fSksXG4gIGdlbmVyYXRlZF9odHRwOiB6Lm9iamVjdCh7XG4gICAgZW50aXR5SWQ6IHouc3RyaW5nKCksXG4gIH0pLFxuICBtb2RlbDogei5vYmplY3Qoe1xuICAgIGVudGl0eUlkOiB6LnN0cmluZygpLFxuICAgIGRlZmF1bHRTZWFyY2hGaWVsZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGRlZmF1bHRPcmRlckJ5OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIH0pLFxuICBtb2RlbF90ZXN0OiB6Lm9iamVjdCh7XG4gICAgZW50aXR5SWQ6IHouc3RyaW5nKCksXG4gIH0pLFxuICBicmlkZ2U6IHoub2JqZWN0KHtcbiAgICBlbnRpdHlJZDogei5zdHJpbmcoKSxcbiAgfSksXG4gIHNlcnZpY2U6IHoub2JqZWN0KHtcbiAgICBuYW1lc1JlY29yZDogei5vYmplY3Qoe1xuICAgICAgZnM6IHouc3RyaW5nKCksXG4gICAgICBmc1BsdXJhbDogei5zdHJpbmcoKSxcbiAgICAgIGNhbWVsOiB6LnN0cmluZygpLFxuICAgICAgY2FtZWxQbHVyYWw6IHouc3RyaW5nKCksXG4gICAgICBjYXBpdGFsOiB6LnN0cmluZygpLFxuICAgICAgY2FwaXRhbFBsdXJhbDogei5zdHJpbmcoKSxcbiAgICAgIHVwcGVyOiB6LnN0cmluZygpLFxuICAgICAgY29uc3RhbnQ6IHouc3RyaW5nKCksXG4gICAgfSksXG4gICAgbW9kZWxUc1BhdGg6IHouc3RyaW5nKCksXG4gIH0pLFxuICB2aWV3X2xpc3Q6IHoub2JqZWN0KHtcbiAgICBlbnRpdHlJZDogei5zdHJpbmcoKSxcbiAgICBleHRyYTogei51bmtub3duKCksXG4gIH0pLFxuICB2aWV3X2xpc3RfY29sdW1uczogei5vYmplY3Qoe1xuICAgIGVudGl0eUlkOiB6LnN0cmluZygpLFxuICAgIGNvbHVtbnM6IHpcbiAgICAgIC5vYmplY3Qoe1xuICAgICAgICBuYW1lOiB6LnN0cmluZygpLFxuICAgICAgICBsYWJlbDogei5zdHJpbmcoKSxcbiAgICAgICAgdGM6IHouc3RyaW5nKCksXG4gICAgICB9KVxuICAgICAgLmFycmF5KCksXG4gICAgY29sdW1uSW1wb3J0czogei5zdHJpbmcoKSxcbiAgfSksXG4gIHZpZXdfc2VhcmNoX2lucHV0OiB6Lm9iamVjdCh7XG4gICAgZW50aXR5SWQ6IHouc3RyaW5nKCksXG4gIH0pLFxuICB2aWV3X2Zvcm06IHoub2JqZWN0KHtcbiAgICBlbnRpdHlJZDogei5zdHJpbmcoKSxcbiAgfSksXG4gIHZpZXdfaWRfYWxsX3NlbGVjdDogei5vYmplY3Qoe1xuICAgIGVudGl0eUlkOiB6LnN0cmluZygpLFxuICB9KSxcbiAgdmlld19pZF9hc3luY19zZWxlY3Q6IHoub2JqZWN0KHtcbiAgICBlbnRpdHlJZDogei5zdHJpbmcoKSxcbiAgICB0ZXh0RmllbGQ6IHouc3RyaW5nKCksXG4gIH0pLFxuICB2aWV3X2VudW1zX3NlbGVjdDogei5vYmplY3Qoe1xuICAgIGVudGl0eUlkOiB6LnN0cmluZygpLFxuICAgIGVudW1JZDogei5zdHJpbmcoKSxcbiAgfSksXG4gIHZpZXdfZW51bXNfZHJvcGRvd246IHoub2JqZWN0KHtcbiAgICBlbnRpdHlJZDogei5zdHJpbmcoKSxcbiAgICBlbnVtSWQ6IHouc3RyaW5nKCksXG4gIH0pLFxuICB2aWV3X2VudW1zX2J1dHRvbnNldDogei5vYmplY3Qoe1xuICAgIGVudGl0eUlkOiB6LnN0cmluZygpLFxuICAgIGVudW1JZDogei5zdHJpbmcoKSxcbiAgfSksXG59KTtcbmV4cG9ydCB0eXBlIFRlbXBsYXRlT3B0aW9ucyA9IHouaW5mZXI8dHlwZW9mIFRlbXBsYXRlT3B0aW9ucz47XG5cbmV4cG9ydCBjb25zdCBUZW1wbGF0ZUtleSA9IHouZW51bShbXG4gIFwiZW50aXR5XCIsXG4gIFwiaW5pdF90eXBlc1wiLFxuICBcImdlbmVyYXRlZFwiLFxuICBcImdlbmVyYXRlZF9zc29cIixcbiAgXCJnZW5lcmF0ZWRfaHR0cFwiLFxuICBcIm1vZGVsXCIsXG4gIFwibW9kZWxfdGVzdFwiLFxuICBcImJyaWRnZVwiLFxuICBcInNlcnZpY2VcIixcbiAgXCJ2aWV3X2xpc3RcIixcbiAgXCJ2aWV3X2xpc3RfY29sdW1uc1wiLFxuICBcInZpZXdfc2VhcmNoX2lucHV0XCIsXG4gIFwidmlld19mb3JtXCIsXG4gIFwidmlld19pZF9hbGxfc2VsZWN0XCIsXG4gIFwidmlld19pZF9hc3luY19zZWxlY3RcIixcbiAgXCJ2aWV3X2VudW1zX3NlbGVjdFwiLFxuICBcInZpZXdfZW51bXNfZHJvcGRvd25cIixcbiAgXCJ2aWV3X2VudW1zX2J1dHRvbnNldFwiLFxuXSk7XG5leHBvcnQgdHlwZSBUZW1wbGF0ZUtleSA9IHouaW5mZXI8dHlwZW9mIFRlbXBsYXRlS2V5PjtcblxuZXhwb3J0IGNvbnN0IEdlbmVyYXRlT3B0aW9ucyA9IHoub2JqZWN0KHtcbiAgb3ZlcndyaXRlOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxufSk7XG5leHBvcnQgdHlwZSBHZW5lcmF0ZU9wdGlvbnMgPSB6LmluZmVyPHR5cGVvZiBHZW5lcmF0ZU9wdGlvbnM+O1xuXG5leHBvcnQgY29uc3QgUGF0aEFuZENvZGUgPSB6Lm9iamVjdCh7XG4gIHBhdGg6IHouc3RyaW5nKCksXG4gIGNvZGU6IHouc3RyaW5nKCksXG59KTtcbmV4cG9ydCB0eXBlIFBhdGhBbmRDb2RlID0gei5pbmZlcjx0eXBlb2YgUGF0aEFuZENvZGU+O1xuXG5leHBvcnQgdHlwZSBGaXh0dXJlU2VhcmNoT3B0aW9ucyA9IHtcbiAgZW50aXR5SWQ6IHN0cmluZztcbiAgZmllbGQ6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgc2VhcmNoVHlwZTogXCJlcXVhbHNcIiB8IFwibGlrZVwiO1xufTtcblxudHlwZSBDb2x1bW5WYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlIHwgbnVsbDtcbmV4cG9ydCB0eXBlIEZpeHR1cmVSZWNvcmQgPSB7XG4gIGZpeHR1cmVJZDogc3RyaW5nO1xuICBlbnRpdHlJZDogc3RyaW5nO1xuICBpZDogbnVtYmVyO1xuICBjb2x1bW5zOiB7XG4gICAgW2tleTogc3RyaW5nXToge1xuICAgICAgcHJvcDogRW50aXR5UHJvcDtcbiAgICAgIHZhbHVlOiBDb2x1bW5WYWx1ZSB8IENvbHVtblZhbHVlW107XG4gICAgfTtcbiAgfTtcbiAgZmV0Y2hlZFJlY29yZHM6IHN0cmluZ1tdO1xuICBiZWxvbmdzUmVjb3Jkczogc3RyaW5nW107XG4gIHRhcmdldD86IEZpeHR1cmVSZWNvcmQ7IC8vIEltcG9ydCDrjIDsg4EgREIg66CI7L2U65OcKGlk6rCAIOqwmeydgClcbiAgdW5pcXVlPzogRml4dHVyZVJlY29yZDsgLy8gSW1wb3J0IOuMgOyDgSBEQiDroIjsvZTrk5wodW5pcXVlIGtleeqwgCDqsJnsnYApXG4gIG92ZXJyaWRlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIEZpeHR1cmVJbXBvcnRSZXN1bHQgPSB7XG4gIGVudGl0eUlkOiBzdHJpbmc7XG4gIGRhdGE6IHtcbiAgICBba2V5OiBzdHJpbmddOiBDb2x1bW5WYWx1ZTtcbiAgfTtcbn07XG5cbmV4cG9ydCB0eXBlIFJlbGF0aW9uTm9kZSA9IHtcbiAgZml4dHVyZUlkOiBzdHJpbmc7XG4gIGVudGl0eUlkOiBzdHJpbmc7XG4gIHJlbGF0ZWQ6IFNldDxzdHJpbmc+O1xufTtcblxuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0VtcHR5SW50ZXJmYWNlOiBzb25hbXUuZ2VuZXJhdGVkLnNzbyDsl5DshJwg7ZmV7J6l7J2EIOychO2VtCDspIDruYTrkJwg67mIIOyduO2EsO2OmOydtOyKpFxuZXhwb3J0IGludGVyZmFjZSBEYXRhYmFzZVNjaGVtYUV4dGVuZCB7fVxuZXhwb3J0IHR5cGUgTWFueVRvTWFueUJhc2VTY2hlbWE8RnJvbUlkS2V5IGV4dGVuZHMgc3RyaW5nLCBUb0lkS2V5IGV4dGVuZHMgc3RyaW5nPiA9IHtcbiAgaWQ6IG51bWJlcjtcbn0gJiB7XG4gIFtLIGluIGAke0Zyb21JZEtleX1faWRgXTogbnVtYmVyO1xufSAmIHtcbiAgW0sgaW4gYCR7VG9JZEtleX1faWRgXTogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgU29uYW11RmFzdGlmeUNvbmZpZyA9IHtcbiAgY29udGV4dFByb3ZpZGVyOiAoXG4gICAgZGVmYXVsdENvbnRleHQ6IFBpY2s8Q29udGV4dCwgXCJyZXF1ZXN0XCIgfCBcInJlcGx5XCIgfCBcImhlYWRlcnNcIiB8IFwiY3JlYXRlU1NFXCIgfCBcIm5haXRlU3RvcmVcIj4gJlxuICAgICAgQXV0aENvbnRleHQsXG4gICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgKSA9PiBDb250ZXh0IHwgUHJvbWlzZTxDb250ZXh0PjtcbiAgZ3VhcmRIYW5kbGVyOiAoXG4gICAgZ3VhcmQ6IEd1YXJkS2V5LFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIGFwaToge1xuICAgICAgdHlwZVBhcmFtZXRlcnM6IEFwaVBhcmFtVHlwZS5UeXBlUGFyYW1bXTtcbiAgICAgIHBhcmFtZXRlcnM6IEFwaVBhcmFtW107XG4gICAgICByZXR1cm5UeXBlOiBBcGlQYXJhbVR5cGU7XG4gICAgICBtb2RlbE5hbWU6IHN0cmluZztcbiAgICAgIG1ldGhvZE5hbWU6IHN0cmluZztcbiAgICAgIHBhdGg6IHN0cmluZztcbiAgICAgIG9wdGlvbnM6IEFwaURlY29yYXRvck9wdGlvbnM7XG4gICAgfSxcbiAgKSA9PiB2b2lkO1xuICBjYWNoZT86IHtcbiAgICBnZXQ6IChrZXk6IHN0cmluZykgPT4gUHJvbWlzZTx1bmtub3duIHwgbnVsbD47XG4gICAgcHV0OiAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCB0dGw/OiBudW1iZXIpID0+IFByb21pc2U8dm9pZD47XG4gICAgcmVzb2x2ZUtleTogKFxuICAgICAgcGF0aDogc3RyaW5nLFxuICAgICAgcmVxQm9keToge1xuICAgICAgICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xuICAgICAgfSxcbiAgICApID0+XG4gICAgICB8IHtcbiAgICAgICAgICBjYWNoZTogZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIHwge1xuICAgICAgICAgIGNhY2hlOiB0cnVlO1xuICAgICAgICAgIGtleTogc3RyaW5nO1xuICAgICAgICAgIHR0bD86IG51bWJlcjtcbiAgICAgICAgfTtcbiAgfTtcbn07XG4iXSwibmFtZXMiOlsieiIsInpBcnJheWFibGUiLCJzaGFwZSIsInVuaW9uIiwiYXJyYXkiLCJpc0ludGVnZXJTaW5nbGVQcm9wIiwicCIsInR5cGUiLCJpc0ludGVnZXJBcnJheVByb3AiLCJpc0ludGVnZXJQcm9wIiwiaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcCIsImlzQmlnSW50ZWdlckFycmF5UHJvcCIsImlzQmlnSW50ZWdlclByb3AiLCJpc1N0cmluZ1NpbmdsZVByb3AiLCJpc1N0cmluZ0FycmF5UHJvcCIsImlzU3RyaW5nUHJvcCIsImlzRW51bVNpbmdsZVByb3AiLCJpc0VudW1BcnJheVByb3AiLCJpc0VudW1Qcm9wIiwiaXNOdW1iZXJTaW5nbGVQcm9wIiwiaXNOdW1iZXJBcnJheVByb3AiLCJpc051bWJlclByb3AiLCJpc051bWVyaWNTaW5nbGVQcm9wIiwiaXNOdW1lcmljQXJyYXlQcm9wIiwiaXNOdW1lcmljUHJvcCIsImlzQm9vbGVhblNpbmdsZVByb3AiLCJpc0Jvb2xlYW5BcnJheVByb3AiLCJpc0Jvb2xlYW5Qcm9wIiwiaXNEYXRlU2luZ2xlUHJvcCIsImlzRGF0ZUFycmF5UHJvcCIsImlzRGF0ZVByb3AiLCJpc1V1aWRTaW5nbGVQcm9wIiwiaXNVdWlkQXJyYXlQcm9wIiwiaXNVdWlkUHJvcCIsImlzSnNvblByb3AiLCJpc1ZpcnR1YWxQcm9wIiwiaXNSZWxhdGlvblByb3AiLCJpc09uZVRvT25lUmVsYXRpb25Qcm9wIiwicmVsYXRpb25UeXBlIiwiaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AiLCJpc0hhc01hbnlSZWxhdGlvblByb3AiLCJpc01hbnlUb01hbnlSZWxhdGlvblByb3AiLCJpc0N1c3RvbUpvaW5DbGF1c2UiLCJjdXN0b20iLCJTb25hbXVRdWVyeU1vZGUiLCJlbnVtIiwiaXNLbmV4RXJyb3IiLCJlIiwiY29kZSIsInNxbE1lc3NhZ2UiLCJzcWxTdGF0ZSIsIkFwaVBhcmFtVHlwZSIsImlzT2JqZWN0IiwidiIsInQiLCJpc1VuaW9uIiwiaXNJbnRlcnNlY3Rpb24iLCJpc1N0cmluZ0xpdGVyYWwiLCJpc051bWVyaWNMaXRlcmFsIiwiaXNBcnJheSIsImlzUmVmIiwiaXNJbmRleGVkQWNjZXNzIiwiaXNUdXBsZVR5cGUiLCJpc1BpY2siLCJpZCIsImlzT21pdCIsImlzUGFydGlhbCIsImlzUHJvbWlzZSIsImlzQ29udGV4dCIsImlzUmVmS25leCIsImlzVHlwZVBhcmFtIiwiUmVuZGVyaW5nTm9kZSIsImFueSIsIkJhc2VQcm9wRmllbGRzIiwibmFtZSIsInN0cmluZyIsImRlc2MiLCJvcHRpb25hbCIsIm51bGxhYmxlIiwiYm9vbGVhbiIsInRvRmlsdGVyIiwibGl0ZXJhbCIsImRiRGVmYXVsdCIsIm51bWJlciIsIkJhc2VQcm9wRmllbGRzV2l0aG91dEFkZGl0aW9uYWwiLCJvYmplY3QiLCJzdHJpY3QiLCJQcmVjaXNpb25TY2FsZUZpZWxkcyIsInByZWNpc2lvbiIsInNjYWxlIiwiU3RyaW5nUHJvcFNjaGVtYSIsImxlbmd0aCIsIlN0cmluZ0FycmF5UHJvcFNjaGVtYSIsIkVudW1Qcm9wU2NoZW1hIiwiRW51bUFycmF5UHJvcFNjaGVtYSIsIk51bWJlclByb3BTY2hlbWEiLCJudW1iZXJUeXBlIiwiTnVtYmVyQXJyYXlQcm9wU2NoZW1hIiwiTnVtZXJpY1Byb3BTY2hlbWEiLCJOdW1lcmljQXJyYXlQcm9wU2NoZW1hIiwiSnNvblByb3BTY2hlbWEiLCJWaXJ0dWFsUHJvcFNjaGVtYSIsIkJhc2VSZWxhdGlvbkZpZWxkcyIsIndpdGgiLCJSZWxhdGlvbk9uU2NoZW1hIiwiQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wU2NoZW1hIiwiY3VzdG9tSm9pbkNsYXVzZSIsInVzZUNvbnN0cmFpbnQiLCJvblVwZGF0ZSIsIm9uRGVsZXRlIiwiSGFzTWFueVJlbGF0aW9uUHJvcFNjaGVtYSIsImpvaW5Db2x1bW4iLCJmcm9tQ29sdW1uIiwiTWFueVRvTWFueVJlbGF0aW9uUHJvcFNjaGVtYSIsImpvaW5UYWJsZSIsIk9uZVRvT25lUmVsYXRpb25Qcm9wU2NoZW1hIiwiaGFzSm9pbkNvbHVtbiIsIlJlbGF0aW9uVHlwZXMiLCJSZWxhdGlvblByb3BTY2hlbWEiLCJkaXNjcmltaW5hdGVkVW5pb24iLCJlcnJvciIsImlzcyIsIm1hcCIsImpvaW4iLCJpbnB1dCIsIk5vcm1hbFByb3BUeXBlcyIsIk5vcm1hbFByb3BTY2hlbWEiLCJBbGxQcm9wVHlwZXMiLCJFbnRpdHlQcm9wU2NoZW1hIiwiRW50aXR5SW5kZXhTY2hlbWEiLCJjb2x1bW5zIiwicGFyc2VyIiwiRW50aXR5SnNvblNjaGVtYSIsImRlc2NyaWJlIiwidGl0bGUiLCJ0YWJsZSIsInBhcmVudElkIiwicHJvcHMiLCJpbmRleGVzIiwic3Vic2V0cyIsInJlY29yZCIsImVudW1zIiwiVGVtcGxhdGVPcHRpb25zIiwiZW50aXR5Iiwib21pdCIsImV4dGVuZCIsImVudGl0eUlkIiwicGFydGlhbCIsImluaXRfdHlwZXMiLCJnZW5lcmF0ZWQiLCJnZW5lcmF0ZWRfc3NvIiwiZ2VuZXJhdGVkX2h0dHAiLCJtb2RlbCIsImRlZmF1bHRTZWFyY2hGaWVsZCIsImRlZmF1bHRPcmRlckJ5IiwibW9kZWxfdGVzdCIsImJyaWRnZSIsInNlcnZpY2UiLCJuYW1lc1JlY29yZCIsImZzIiwiZnNQbHVyYWwiLCJjYW1lbCIsImNhbWVsUGx1cmFsIiwiY2FwaXRhbCIsImNhcGl0YWxQbHVyYWwiLCJ1cHBlciIsImNvbnN0YW50IiwibW9kZWxUc1BhdGgiLCJ2aWV3X2xpc3QiLCJleHRyYSIsInVua25vd24iLCJ2aWV3X2xpc3RfY29sdW1ucyIsImxhYmVsIiwidGMiLCJjb2x1bW5JbXBvcnRzIiwidmlld19zZWFyY2hfaW5wdXQiLCJ2aWV3X2Zvcm0iLCJ2aWV3X2lkX2FsbF9zZWxlY3QiLCJ2aWV3X2lkX2FzeW5jX3NlbGVjdCIsInRleHRGaWVsZCIsInZpZXdfZW51bXNfc2VsZWN0IiwiZW51bUlkIiwidmlld19lbnVtc19kcm9wZG93biIsInZpZXdfZW51bXNfYnV0dG9uc2V0IiwiVGVtcGxhdGVLZXkiLCJHZW5lcmF0ZU9wdGlvbnMiLCJvdmVyd3JpdGUiLCJQ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