sonamu 0.9.19 → 0.10.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 (282) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +36 -0
  2. package/dist/ai/agents/agent.js +5 -7
  3. package/dist/ai/agents/index.js +1 -2
  4. package/dist/ai/agents/types.js +1 -1
  5. package/dist/ai/index.js +1 -2
  6. package/dist/ai/providers/rtzr/api.js +2 -3
  7. package/dist/ai/providers/rtzr/error.js +14 -29
  8. package/dist/ai/providers/rtzr/index.js +1 -2
  9. package/dist/ai/providers/rtzr/model.js +13 -20
  10. package/dist/ai/providers/rtzr/options.js +2 -3
  11. package/dist/ai/providers/rtzr/provider.js +2 -3
  12. package/dist/ai/providers/rtzr/utils.js +12 -21
  13. package/dist/api/base-frame.js +4 -4
  14. package/dist/api/caster.js +21 -38
  15. package/dist/api/code-converters.js +41 -98
  16. package/dist/api/config.d.ts +1 -10
  17. package/dist/api/config.d.ts.map +1 -1
  18. package/dist/api/config.js +9 -8
  19. package/dist/api/context.js +2 -3
  20. package/dist/api/decorators.js +80 -116
  21. package/dist/api/index.js +2 -3
  22. package/dist/api/secret.js +6 -10
  23. package/dist/api/sonamu.d.ts.map +1 -1
  24. package/dist/api/sonamu.js +200 -387
  25. package/dist/api/validator.js +5 -8
  26. package/dist/api/websocket-helpers.js +21 -32
  27. package/dist/auth/audit-log/builders.js +2 -3
  28. package/dist/auth/audit-log/events.js +2 -2
  29. package/dist/auth/audit-log/plugin.js +30 -61
  30. package/dist/auth/audit-log-ingestor.js +19 -41
  31. package/dist/auth/auth-generator.js +16 -41
  32. package/dist/auth/better-auth-entities.js +3 -4
  33. package/dist/auth/index.js +2 -3
  34. package/dist/auth/knex-adapter.js +18 -45
  35. package/dist/auth/plugins/entity-definitions/admin.js +2 -2
  36. package/dist/auth/plugins/entity-definitions/anonymous.js +2 -2
  37. package/dist/auth/plugins/entity-definitions/api-key.js +2 -2
  38. package/dist/auth/plugins/entity-definitions/audit-log.js +2 -2
  39. package/dist/auth/plugins/entity-definitions/index.js +2 -3
  40. package/dist/auth/plugins/entity-definitions/jwt.js +2 -2
  41. package/dist/auth/plugins/entity-definitions/organization.js +2 -2
  42. package/dist/auth/plugins/entity-definitions/passkey.js +2 -2
  43. package/dist/auth/plugins/entity-definitions/phone-number.js +2 -2
  44. package/dist/auth/plugins/entity-definitions/sso.js +2 -2
  45. package/dist/auth/plugins/entity-definitions/two-factor.js +2 -2
  46. package/dist/auth/plugins/entity-definitions/types.js +1 -1
  47. package/dist/auth/plugins/entity-definitions/username.js +2 -2
  48. package/dist/auth/plugins/index.js +1 -2
  49. package/dist/auth/plugins/wrappers/admin.js +2 -3
  50. package/dist/auth/plugins/wrappers/anonymous.js +2 -3
  51. package/dist/auth/plugins/wrappers/api-key.js +2 -3
  52. package/dist/auth/plugins/wrappers/index.js +1 -2
  53. package/dist/auth/plugins/wrappers/jwt.js +2 -3
  54. package/dist/auth/plugins/wrappers/organization.js +2 -3
  55. package/dist/auth/plugins/wrappers/passkey.js +2 -3
  56. package/dist/auth/plugins/wrappers/phone-number.js +2 -3
  57. package/dist/auth/plugins/wrappers/sso.js +2 -3
  58. package/dist/auth/plugins/wrappers/two-factor.js +2 -3
  59. package/dist/auth/plugins/wrappers/username.js +2 -3
  60. package/dist/bin/build-config.js +2 -2
  61. package/dist/bin/cli.js +151 -258
  62. package/dist/bin/fixture.d.ts.map +1 -1
  63. package/dist/bin/fixture.js +55 -97
  64. package/dist/bin/hmr-hook-register.js +3 -3
  65. package/dist/bin/migrate-targets.d.ts +3 -0
  66. package/dist/bin/migrate-targets.d.ts.map +1 -0
  67. package/dist/bin/migrate-targets.js +11 -0
  68. package/dist/bin/test-command.js +25 -55
  69. package/dist/bin/ts-loader-register.js +5 -6
  70. package/dist/bin/ts-loader-registration.js +6 -13
  71. package/dist/cache/cache-manager.js +3 -4
  72. package/dist/cache/decorator.js +11 -21
  73. package/dist/cache/drivers.js +2 -3
  74. package/dist/cache/index.js +2 -3
  75. package/dist/cache/types.js +1 -1
  76. package/dist/cache-control/cache-control.js +21 -34
  77. package/dist/cache-control/types.js +1 -1
  78. package/dist/compress/compress.js +10 -10
  79. package/dist/compress/index.js +1 -2
  80. package/dist/compress/types.js +1 -1
  81. package/dist/cone/cone-generator.js +25 -63
  82. package/dist/database/_batch_update.js +26 -46
  83. package/dist/database/base-model.js +44 -97
  84. package/dist/database/base-model.types.js +1 -1
  85. package/dist/database/db.d.ts +8 -14
  86. package/dist/database/db.d.ts.map +1 -1
  87. package/dist/database/db.js +127 -72
  88. package/dist/database/knex.js +5 -8
  89. package/dist/database/puri-subset.types.js +1 -1
  90. package/dist/database/puri-wrapper.js +11 -15
  91. package/dist/database/puri.js +117 -234
  92. package/dist/database/puri.types.js +3 -4
  93. package/dist/database/transaction-context.js +4 -5
  94. package/dist/database/upsert-builder.js +109 -176
  95. package/dist/dict/en.d.ts +1 -0
  96. package/dist/dict/en.d.ts.map +1 -1
  97. package/dist/dict/en.js +4 -4
  98. package/dist/dict/index.js +2 -3
  99. package/dist/dict/ko.d.ts +1 -0
  100. package/dist/dict/ko.d.ts.map +1 -1
  101. package/dist/dict/ko.js +4 -4
  102. package/dist/dict/rc-keys.js +3 -4
  103. package/dist/dict/sd.js +8 -19
  104. package/dist/dict/sonamu-dictionary.js +141 -284
  105. package/dist/dict/types.js +1 -1
  106. package/dist/dict/utils.js +4 -5
  107. package/dist/entity/entity-manager.d.ts +2 -2
  108. package/dist/entity/entity-manager.js +34 -82
  109. package/dist/entity/entity-template-cone.js +33 -66
  110. package/dist/entity/entity.js +156 -310
  111. package/dist/env.d.ts +14 -0
  112. package/dist/env.d.ts.map +1 -0
  113. package/dist/env.js +75 -0
  114. package/dist/exceptions/error-handler.js +2 -3
  115. package/dist/exceptions/so-exceptions.js +7 -5
  116. package/dist/filter/index.js +1 -2
  117. package/dist/filter/types.js +3 -4
  118. package/dist/filter/utils.js +21 -54
  119. package/dist/index.js +8 -7
  120. package/dist/logger/category.js +6 -12
  121. package/dist/logger/configure.js +23 -34
  122. package/dist/migration/code-generation.js +146 -314
  123. package/dist/migration/index-where-predicate.js +52 -144
  124. package/dist/migration/migration-set.js +19 -33
  125. package/dist/migration/migrator.d.ts +2 -0
  126. package/dist/migration/migrator.d.ts.map +1 -1
  127. package/dist/migration/migrator.js +69 -53
  128. package/dist/migration/postgresql-schema-reader.js +126 -225
  129. package/dist/migration/slack-confirm.d.ts +1 -0
  130. package/dist/migration/slack-confirm.d.ts.map +1 -1
  131. package/dist/migration/slack-confirm.js +28 -38
  132. package/dist/migration/types.js +1 -1
  133. package/dist/naite/messaging-types.js +1 -1
  134. package/dist/naite/naite-reporter.js +15 -32
  135. package/dist/naite/naite.js +43 -76
  136. package/dist/ssr/index.js +6 -9
  137. package/dist/ssr/registry.js +10 -18
  138. package/dist/ssr/renderer.js +10 -21
  139. package/dist/ssr/types.js +1 -1
  140. package/dist/storage/base-file.js +5 -10
  141. package/dist/storage/buffered-file.js +3 -4
  142. package/dist/storage/drivers.js +2 -3
  143. package/dist/storage/index.js +2 -3
  144. package/dist/storage/s3-driver.js +5 -9
  145. package/dist/storage/storage-manager.js +5 -5
  146. package/dist/storage/types.js +1 -1
  147. package/dist/storage/uploaded-file.js +4 -6
  148. package/dist/stream/index.js +1 -2
  149. package/dist/stream/sse.js +8 -13
  150. package/dist/stream/ws-audience-resolver.js +5 -5
  151. package/dist/stream/ws-audience.js +3 -4
  152. package/dist/stream/ws-cluster-bus.js +3 -4
  153. package/dist/stream/ws-core.js +1 -1
  154. package/dist/stream/ws-delivery.js +11 -25
  155. package/dist/stream/ws-local-connection-store.js +9 -18
  156. package/dist/stream/ws-presence-store.js +43 -97
  157. package/dist/stream/ws-registry.js +17 -22
  158. package/dist/stream/ws-telemetry-memory.js +38 -45
  159. package/dist/stream/ws-telemetry-trace.js +4 -6
  160. package/dist/stream/ws-telemetry.js +82 -135
  161. package/dist/stream/ws.js +47 -91
  162. package/dist/syncer/api-parser.js +81 -147
  163. package/dist/syncer/checksum.js +9 -20
  164. package/dist/syncer/code-generator.js +29 -47
  165. package/dist/syncer/entity-operations.js +17 -27
  166. package/dist/syncer/event-batcher.js +8 -15
  167. package/dist/syncer/file-patterns.js +3 -4
  168. package/dist/syncer/file-tracking.js +6 -10
  169. package/dist/syncer/index.js +1 -2
  170. package/dist/syncer/module-loader.js +10 -26
  171. package/dist/syncer/syncer-actions.js +19 -37
  172. package/dist/syncer/syncer.js +46 -98
  173. package/dist/syncer/watcher.js +12 -26
  174. package/dist/tasks/decorator.js +7 -11
  175. package/dist/tasks/step-wrapper.js +7 -8
  176. package/dist/tasks/workflow-manager.js +18 -25
  177. package/dist/template/entity-converter.js +40 -64
  178. package/dist/template/helpers.js +32 -63
  179. package/dist/template/implementations/entity.template.js +7 -11
  180. package/dist/template/implementations/entry-server.template.js +2 -3
  181. package/dist/template/implementations/generated.template.js +25 -51
  182. package/dist/template/implementations/generated_http.template.js +31 -58
  183. package/dist/template/implementations/generated_sso.template.js +45 -85
  184. package/dist/template/implementations/init_types.template.js +4 -7
  185. package/dist/template/implementations/model.template.js +5 -10
  186. package/dist/template/implementations/model_test.template.js +2 -3
  187. package/dist/template/implementations/queries.template.js +4 -7
  188. package/dist/template/implementations/sd.template.js +17 -35
  189. package/dist/template/implementations/services.template.js +18 -30
  190. package/dist/template/implementations/view_form.template.js +72 -125
  191. package/dist/template/implementations/view_id_all_select.template.js +2 -3
  192. package/dist/template/implementations/view_list.template.js +86 -143
  193. package/dist/template/implementations/view_search_input.template.js +2 -3
  194. package/dist/template/index.js +5 -8
  195. package/dist/template/template-manager.js +13 -26
  196. package/dist/template/template-types.js +2 -3
  197. package/dist/template/template.js +7 -11
  198. package/dist/template/zod-converter.js +173 -348
  199. package/dist/testing/_relation-graph.js +18 -37
  200. package/dist/testing/bootstrap.js +5 -8
  201. package/dist/testing/data-explorer.js +34 -78
  202. package/dist/testing/dev-test-routes.js +54 -60
  203. package/dist/testing/dev-vitest-manager.js +33 -84
  204. package/dist/testing/faker-mappings.js +3 -4
  205. package/dist/testing/fixture-generator.d.ts +2 -1
  206. package/dist/testing/fixture-generator.d.ts.map +1 -1
  207. package/dist/testing/fixture-generator.js +159 -321
  208. package/dist/testing/fixture-loader.js +2 -2
  209. package/dist/testing/fixture-manager.d.ts.map +1 -1
  210. package/dist/testing/fixture-manager.js +124 -227
  211. package/dist/testing/global-setup.d.ts.map +1 -1
  212. package/dist/testing/global-setup.js +29 -17
  213. package/dist/testing/index.js +1 -2
  214. package/dist/testing/naite-vitest-reporter.js +2 -3
  215. package/dist/testing/parallel-db-manager.js +5 -3
  216. package/dist/testing/vitest-helpers.d.ts.map +1 -1
  217. package/dist/testing/vitest-helpers.js +15 -12
  218. package/dist/types/types.d.ts +14 -14
  219. package/dist/types/types.js +27 -50
  220. package/dist/ui/ai-api.js +6 -11
  221. package/dist/ui/ai-client.js +86 -134
  222. package/dist/ui/api.js +99 -195
  223. package/dist/ui/cdd-service.js +78 -130
  224. package/dist/ui/cdd-types.js +1 -1
  225. package/dist/ui-web/assets/{index-Df8q-fhb.js → index-DFStGyd0.js} +49 -49
  226. package/dist/ui-web/assets/index-Dx4ap5i4.css +1 -0
  227. package/dist/ui-web/index.html +2 -2
  228. package/dist/utils/async-utils.js +13 -25
  229. package/dist/utils/class-name.js +3 -4
  230. package/dist/utils/console-util.js +11 -26
  231. package/dist/utils/controller.d.ts.map +1 -1
  232. package/dist/utils/controller.js +14 -12
  233. package/dist/utils/esm-utils.js +5 -8
  234. package/dist/utils/formatter.js +10 -22
  235. package/dist/utils/fs-utils.js +14 -25
  236. package/dist/utils/lodash-able.js +3 -4
  237. package/dist/utils/model.js +7 -14
  238. package/dist/utils/object-utils.js +41 -73
  239. package/dist/utils/path-utils.js +5 -9
  240. package/dist/utils/process-utils.js +4 -7
  241. package/dist/utils/sql-parser.js +6 -13
  242. package/dist/utils/type-utils.js +16 -26
  243. package/dist/utils/utils.js +18 -40
  244. package/dist/utils/zod-error.js +9 -16
  245. package/dist/vector/chunking.js +24 -37
  246. package/dist/vector/config.js +2 -2
  247. package/dist/vector/embedding.js +8 -19
  248. package/dist/vector/index.js +1 -2
  249. package/dist/vector/types.js +1 -1
  250. package/package.json +7 -7
  251. package/src/__tests__/env.test.ts +127 -0
  252. package/src/api/__tests__/config.test.ts +10 -1
  253. package/src/api/config.ts +4 -12
  254. package/src/api/sonamu.ts +14 -4
  255. package/src/bin/__tests__/migrate-targets.test.ts +28 -0
  256. package/src/bin/__tests__/test-command.test.ts +82 -1
  257. package/src/bin/cli.ts +9 -18
  258. package/src/bin/fixture.ts +5 -4
  259. package/src/bin/migrate-targets.ts +7 -0
  260. package/src/bin/test-command.ts +2 -2
  261. package/src/database/__tests__/db.test.ts +175 -0
  262. package/src/database/db.ts +193 -71
  263. package/src/dict/en.ts +2 -0
  264. package/src/dict/ko.ts +2 -0
  265. package/src/env.ts +123 -0
  266. package/src/migration/__tests__/migrator.test.ts +149 -0
  267. package/src/migration/migrator.ts +74 -17
  268. package/src/migration/slack-confirm.ts +21 -0
  269. package/src/skills/sonamu/database.md +1 -1
  270. package/src/skills/sonamu/entity-basic.md +31 -0
  271. package/src/skills/sonamu/puri.md +22 -0
  272. package/src/skills/sonamu/testing-devrunner.md +1 -1
  273. package/src/skills/sonamu/upsert.md +53 -6
  274. package/src/stream/ws-telemetry-memory.ts +2 -2
  275. package/src/testing/fixture-generator.ts +2 -1
  276. package/src/testing/fixture-manager.ts +3 -4
  277. package/src/testing/global-setup.ts +42 -18
  278. package/src/testing/vitest-helpers.ts +14 -0
  279. package/src/utils/controller.ts +14 -7
  280. package/tsdown.api.config.ts +6 -0
  281. package/dist/_virtual/rolldown_runtime.js +0 -39
  282. package/dist/ui-web/assets/index-D4rYm-Xz.css +0 -1
@@ -13,6 +13,7 @@ export type SlackConfirmPendingResult = {
13
13
  };
14
14
  export declare class SlackConfirm {
15
15
  private config;
16
+ private validateConfiguredTargets;
16
17
  /**
17
18
  * 설정이 있는지 확인합니다.
18
19
  */
@@ -1 +1 @@
1
- {"version":3,"file":"slack-confirm.d.ts","sourceRoot":"","sources":["../../src/migration/slack-confirm.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,gBAAgB,GAAG,OAAO,CAAC;IACzE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAA8B;IAE5C;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;OAEG;IACH,wBAAwB,CAAC,MAAM,EAAE,MAAM,cAAc,GAAG,OAAO;IAI/D;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM;IAK/C;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;OAEG;IACG,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAgB/F;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnF;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACG,mBAAmB,CACvB,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAqC3C;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;OAEG;IACG,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,GACT,OAAO,CAAC;QACT,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IA0CF;;OAEG;IACG,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IAyChB;;OAEG;IACG,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,eAAe,EACxB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;CAmCjB"}
1
+ {"version":3,"file":"slack-confirm.d.ts","sourceRoot":"","sources":["../../src/migration/slack-confirm.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,gBAAgB,GAAG,OAAO,CAAC;IACzE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAA8B;IAE5C,OAAO,CAAC,yBAAyB;IAkBjC;;OAEG;IACH,YAAY,IAAI,OAAO;IAKvB;;OAEG;IACH,wBAAwB,CAAC,MAAM,EAAE,MAAM,cAAc,GAAG,OAAO;IAK/D;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM;IAK/C;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;OAEG;IACG,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAgB/F;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnF;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACG,mBAAmB,CACvB,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAsC3C;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;OAEG;IACG,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,GACT,OAAO,CAAC;QACT,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IA0CF;;OAEG;IACG,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IAyChB;;OAEG;IACG,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,eAAe,EACxB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;CAmCjB"}
@@ -1,12 +1,11 @@
1
- import { __esmMin } from "../_virtual/rolldown_runtime.js";
1
+ import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
2
  import { SD, init_sd } from "../dict/sd.js";
3
3
  import { Sonamu, init_sonamu } from "../api/sonamu.js";
4
4
  import assert from "assert";
5
+ import path from "path";
5
6
  import crypto from "crypto";
6
7
  import fs from "fs/promises";
7
- import path from "path";
8
8
  import os from "os";
9
-
10
9
  //#region src/migration/slack-confirm.ts
11
10
  var SlackConfirm;
12
11
  var init_slack_confirm = __esmMin((() => {
@@ -14,16 +13,24 @@ var init_slack_confirm = __esmMin((() => {
14
13
  init_sd();
15
14
  SlackConfirm = class {
16
15
  config = Sonamu.config.slackConfirm;
16
+ validateConfiguredTargets() {
17
+ if (!this.config) return;
18
+ const validTargets = Object.keys(Sonamu.dbConfig);
19
+ const invalidTargets = this.config.targets.filter((target) => !validTargets.includes(target));
20
+ if (invalidTargets.length > 0) assert.fail(SD("sonamu.error.slackConfirmInvalidTargets")(invalidTargets.join(", "), validTargets.join(", ")));
21
+ }
17
22
  /**
18
23
  * 설정이 있는지 확인합니다.
19
24
  */
20
25
  isConfigured() {
26
+ this.validateConfiguredTargets();
21
27
  return !!(this.config?.botToken && this.config?.channelId);
22
28
  }
23
29
  /**
24
30
  * 해당 target이 승인 대상인지 확인합니다.
25
31
  */
26
32
  isTargetRequiresApproval(target) {
33
+ this.validateConfiguredTargets();
27
34
  return this.config?.targets?.includes(target) ?? false;
28
35
  }
29
36
  /**
@@ -46,14 +53,11 @@ var init_slack_confirm = __esmMin((() => {
46
53
  const hash = this.getMigrationsHash(migrations);
47
54
  const filePath = this.getConfirmFilePath(hash);
48
55
  try {
49
- const content = await fs.readFile(filePath, "utf-8");
50
- const [channel, ts] = content.trim().split(":");
51
- if (channel && ts) {
52
- return {
53
- channel,
54
- ts
55
- };
56
- }
56
+ const [channel, ts] = (await fs.readFile(filePath, "utf-8")).trim().split(":");
57
+ if (channel && ts) return {
58
+ channel,
59
+ ts
60
+ };
57
61
  return null;
58
62
  } catch {
59
63
  return null;
@@ -78,6 +82,7 @@ var init_slack_confirm = __esmMin((() => {
78
82
  */
79
83
  async postApprovalRequest(migrations, targets, requestor) {
80
84
  assert(this.config, SD("sonamu.error.slackConfirmNotConfigured"));
85
+ this.validateConfiguredTargets();
81
86
  const response = await fetch("https://slack.com/api/chat.postMessage", {
82
87
  method: "POST",
83
88
  headers: {
@@ -91,13 +96,9 @@ var init_slack_confirm = __esmMin((() => {
91
96
  unfurl_media: false
92
97
  })
93
98
  });
94
- if (!response.ok) {
95
- throw new Error(`Slack API HTTP error: ${response.status}`);
96
- }
99
+ if (!response.ok) throw new Error(`Slack API HTTP error: ${response.status}`);
97
100
  const data = await response.json();
98
- if (!data.ok) {
99
- throw new Error(`Slack API error: ${data.error}`);
100
- }
101
+ if (!data.ok) throw new Error(`Slack API error: ${data.error}`);
101
102
  return {
102
103
  channel: data.channel,
103
104
  ts: data.ts
@@ -108,13 +109,12 @@ var init_slack_confirm = __esmMin((() => {
108
109
  */
109
110
  buildMessageText(migrations, targets, requestor) {
110
111
  const projectName = Sonamu.config.projectName ?? "Unknown";
111
- const timestamp = new Date().toLocaleString("ko-KR", { timeZone: "Asia/Seoul" });
112
+ const timestamp = (/* @__PURE__ */ new Date()).toLocaleString("ko-KR", { timeZone: "Asia/Seoul" });
112
113
  const migrationsText = migrations.map((m) => `• ${m}`).join("\n");
113
- const targetsText = targets.join(", ");
114
114
  return `🗄️ *[${projectName}] Production 마이그레이션 승인 요청*
115
115
 
116
116
  *요청자:* ${requestor}
117
- *대상 DB:* ${targetsText}
117
+ *대상 DB:* ${targets.join(", ")}
118
118
  *시간:* ${timestamp}
119
119
 
120
120
  *적용 예정 마이그레이션:*
@@ -129,13 +129,9 @@ ${migrationsText}`;
129
129
  method: "GET",
130
130
  headers: { Authorization: `Bearer ${this.config.botToken}` }
131
131
  });
132
- if (!response.ok) {
133
- throw new Error(`Slack API HTTP error: ${response.status}`);
134
- }
132
+ if (!response.ok) throw new Error(`Slack API HTTP error: ${response.status}`);
135
133
  const data = await response.json();
136
- if (!data.ok) {
137
- throw new Error(`Slack API error: ${data.error}`);
138
- }
134
+ if (!data.ok) throw new Error(`Slack API error: ${data.error}`);
139
135
  const reactions = data.message?.reactions ?? [];
140
136
  const approved = reactions.find((r) => r.name === "white_check_mark");
141
137
  const rejected = reactions.find((r) => r.name === "x");
@@ -163,9 +159,7 @@ ${migrationsText}`;
163
159
  name: "white_check_mark"
164
160
  })
165
161
  });
166
- if (!addReactionResponse.ok) {
167
- throw new Error(`Slack API HTTP error: ${addReactionResponse.status}`);
168
- }
162
+ if (!addReactionResponse.ok) throw new Error(`Slack API HTTP error: ${addReactionResponse.status}`);
169
163
  const postMessageResponse = await fetch("https://slack.com/api/chat.postMessage", {
170
164
  method: "POST",
171
165
  headers: {
@@ -178,9 +172,7 @@ ${migrationsText}`;
178
172
  text: `⚠️ *Force 승인*\n요청자: ${actualRequestor}\n사유: ${reason}`
179
173
  })
180
174
  });
181
- if (!postMessageResponse.ok) {
182
- throw new Error(`Slack API HTTP error: ${postMessageResponse.status}`);
183
- }
175
+ if (!postMessageResponse.ok) throw new Error(`Slack API HTTP error: ${postMessageResponse.status}`);
184
176
  }
185
177
  /**
186
178
  * 실행 완료 로그를 남깁니다.
@@ -189,7 +181,7 @@ ${migrationsText}`;
189
181
  const config = this.config;
190
182
  assert(config, SD("sonamu.error.slackConfirmNotConfigured"));
191
183
  const actualRequestor = requestor ?? this.getRequestor();
192
- const timestamp = new Date().toLocaleString("ko-KR", { timeZone: "Asia/Seoul" });
184
+ const timestamp = (/* @__PURE__ */ new Date()).toLocaleString("ko-KR", { timeZone: "Asia/Seoul" });
193
185
  const appliedText = results.length > 0 ? results.filter((r) => r.applied.length > 0).map((r) => `[${r.connKey}]\n${r.applied.map((m) => `• ${m}`).join("\n")}`).join("\n\n") : "(없음)";
194
186
  const response = await fetch("https://slack.com/api/chat.postMessage", {
195
187
  method: "POST",
@@ -203,14 +195,12 @@ ${migrationsText}`;
203
195
  text: `✅ *마이그레이션 실행 완료*\n실행자: ${actualRequestor}\n시간: ${timestamp}\n\n적용됨:\n${appliedText}`
204
196
  })
205
197
  });
206
- if (!response.ok) {
207
- throw new Error(`Slack API HTTP error: ${response.status}`);
208
- }
198
+ if (!response.ok) throw new Error(`Slack API HTTP error: ${response.status}`);
209
199
  }
210
200
  };
211
201
  }));
212
-
213
202
  //#endregion
214
203
  init_slack_confirm();
215
204
  export { SlackConfirm, init_slack_confirm };
216
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhY2stY29uZmlybS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlncmF0aW9uL3NsYWNrLWNvbmZpcm0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY3J5cHRvIGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBTRCB9IGZyb20gXCIuLi9kaWN0L3NkXCI7XG5pbXBvcnQgeyB0eXBlIE1pZ3JhdGlvblJlc3VsdCB9IGZyb20gXCIuL21pZ3JhdG9yXCI7XG5cbmV4cG9ydCB0eXBlIFNsYWNrQ29uZmlybVJlc3VsdCA9IHtcbiAgc3RhdHVzOiBcImFwcHJvdmVkXCIgfCBcInJlamVjdGVkXCIgfCBcInBlbmRpbmdcIiB8IFwibm90X2NvbmZpZ3VyZWRcIiB8IFwiZXJyb3JcIjtcbiAgdHM/OiBzdHJpbmc7XG4gIGNoYW5uZWw/OiBzdHJpbmc7XG4gIGVycm9yPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgU2xhY2tDb25maXJtUGVuZGluZ1Jlc3VsdCA9IHtcbiAgdHlwZTogXCJwZW5kaW5nXCI7XG4gIGNoYW5uZWw6IHN0cmluZztcbiAgdHM6IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBTbGFja0NvbmZpcm0ge1xuICBwcml2YXRlIGNvbmZpZyA9IFNvbmFtdS5jb25maWcuc2xhY2tDb25maXJtO1xuXG4gIC8qKlxuICAgKiDshKTsoJXsnbQg7J6I64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICovXG4gIGlzQ29uZmlndXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5jb25maWc/LmJvdFRva2VuICYmIHRoaXMuY29uZmlnPy5jaGFubmVsSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VtOuLuSB0YXJnZXTsnbQg7Iq57J24IOuMgOyDgeyduOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqL1xuICBpc1RhcmdldFJlcXVpcmVzQXBwcm92YWwodGFyZ2V0OiBrZXlvZiBTb25hbXVEQkNvbmZpZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZz8udGFyZ2V0cz8uaW5jbHVkZXModGFyZ2V0KSA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrp4jsnbTqt7jroIjsnbTshZgg66qp66Gd7J2YIO2VtOyLnOulvCDsg53shLHtlanri4jri6QuXG4gICAqL1xuICBnZXRNaWdyYXRpb25zSGFzaChtaWdyYXRpb25zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgY29uc3Qgc29ydGVkID0gWy4uLm1pZ3JhdGlvbnNdLnRvU29ydGVkKCk7XG4gICAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKFwibWQ1XCIpLnVwZGF0ZShzb3J0ZWQuam9pbihcIixcIikpLmRpZ2VzdChcImhleFwiKS5zbGljZSgwLCAxMik7XG4gIH1cblxuICAvKipcbiAgICog66Gc7LusIO2MjOydvCDqsr3roZzrpbwg67CY7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDb25maXJtRmlsZVBhdGgoaGFzaDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJtaWdyYXRpb25zXCIsIGAuc2xhY2stY29uZmlybS0ke2hhc2h9YCk7XG4gIH1cblxuICAvKipcbiAgICog6riw7KG0IOyKueyduCDsmpTssq3snYQg7KGw7ZqM7ZWp64uI64ukLlxuICAgKi9cbiAgYXN5bmMgZ2V0RXhpc3RpbmdSZXF1ZXN0KG1pZ3JhdGlvbnM6IHN0cmluZ1tdKTogUHJvbWlzZTx7IGNoYW5uZWw6IHN0cmluZzsgdHM6IHN0cmluZyB9IHwgbnVsbD4ge1xuICAgIGNvbnN0IGhhc2ggPSB0aGlzLmdldE1pZ3JhdGlvbnNIYXNoKG1pZ3JhdGlvbnMpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gdGhpcy5nZXRDb25maXJtRmlsZVBhdGgoaGFzaCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoLCBcInV0Zi04XCIpO1xuICAgICAgY29uc3QgW2NoYW5uZWwsIHRzXSA9IGNvbnRlbnQudHJpbSgpLnNwbGl0KFwiOlwiKTtcbiAgICAgIGlmIChjaGFubmVsICYmIHRzKSB7XG4gICAgICAgIHJldHVybiB7IGNoYW5uZWwsIHRzIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDsirnsnbgg7JqU7LKt7J2EIOyggOyepe2VqeuLiOuLpC5cbiAgICovXG4gIGFzeW5jIHNhdmVSZXF1ZXN0KG1pZ3JhdGlvbnM6IHN0cmluZ1tdLCBjaGFubmVsOiBzdHJpbmcsIHRzOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBoYXNoID0gdGhpcy5nZXRNaWdyYXRpb25zSGFzaChtaWdyYXRpb25zKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHRoaXMuZ2V0Q29uZmlybUZpbGVQYXRoKGhhc2gpO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgYCR7Y2hhbm5lbH06JHt0c31gLCBcInV0Zi04XCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2YhOyerCDsgqzsmqnsnpAg7J2066aE7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZ2V0UmVxdWVzdG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LlVTRVIgPz8gb3MudXNlckluZm8oKS51c2VybmFtZSA/PyBcIlVua25vd25cIjtcbiAgfVxuXG4gIC8qKlxuICAgKiDsiqzrnpkg66mU7Iuc7KeA66W8IOuwnOyGoe2VqeuLiOuLpC5cbiAgICovXG4gIGFzeW5jIHBvc3RBcHByb3ZhbFJlcXVlc3QoXG4gICAgbWlncmF0aW9uczogc3RyaW5nW10sXG4gICAgdGFyZ2V0czogc3RyaW5nW10sXG4gICAgcmVxdWVzdG9yPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHsgY2hhbm5lbDogc3RyaW5nOyB0czogc3RyaW5nIH0+IHtcbiAgICBhc3NlcnQodGhpcy5jb25maWcsIFNEKFwic29uYW11LmVycm9yLnNsYWNrQ29uZmlybU5vdENvbmZpZ3VyZWRcIikpO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vc2xhY2suY29tL2FwaS9jaGF0LnBvc3RNZXNzYWdlXCIsIHtcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmNvbmZpZy5ib3RUb2tlbn1gLFxuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGNoYW5uZWw6IHRoaXMuY29uZmlnLmNoYW5uZWxJZCxcbiAgICAgICAgdGV4dDogdGhpcy5idWlsZE1lc3NhZ2VUZXh0KG1pZ3JhdGlvbnMsIHRhcmdldHMsIHJlcXVlc3RvciA/PyB0aGlzLmdldFJlcXVlc3RvcigpKSxcbiAgICAgICAgdW5mdXJsX2xpbmtzOiBmYWxzZSxcbiAgICAgICAgdW5mdXJsX21lZGlhOiBmYWxzZSxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTbGFjayBBUEkgSFRUUCBlcnJvcjogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHtcbiAgICAgIG9rOiBib29sZWFuO1xuICAgICAgZXJyb3I/OiBzdHJpbmc7XG4gICAgICBjaGFubmVsOiBzdHJpbmc7XG4gICAgICB0czogc3RyaW5nO1xuICAgIH07XG4gICAgaWYgKCFkYXRhLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNsYWNrIEFQSSBlcnJvcjogJHtkYXRhLmVycm9yfWApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjaGFubmVsOiBkYXRhLmNoYW5uZWwsXG4gICAgICB0czogZGF0YS50cyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOuplOyLnOyngCDthY3siqTtirjrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZE1lc3NhZ2VUZXh0KG1pZ3JhdGlvbnM6IHN0cmluZ1tdLCB0YXJnZXRzOiBzdHJpbmdbXSwgcmVxdWVzdG9yOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHByb2plY3ROYW1lID0gU29uYW11LmNvbmZpZy5wcm9qZWN0TmFtZSA/PyBcIlVua25vd25cIjtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLnRvTG9jYWxlU3RyaW5nKFwia28tS1JcIiwge1xuICAgICAgdGltZVpvbmU6IFwiQXNpYS9TZW91bFwiLFxuICAgIH0pO1xuICAgIGNvbnN0IG1pZ3JhdGlvbnNUZXh0ID0gbWlncmF0aW9ucy5tYXAoKG0pID0+IGDigKIgJHttfWApLmpvaW4oXCJcXG5cIik7XG4gICAgY29uc3QgdGFyZ2V0c1RleHQgPSB0YXJnZXRzLmpvaW4oXCIsIFwiKTtcblxuICAgIHJldHVybiBg8J+XhO+4jyAqWyR7cHJvamVjdE5hbWV9XSBQcm9kdWN0aW9uIOuniOydtOq3uOugiOydtOyFmCDsirnsnbgg7JqU7LKtKlxuXG4q7JqU7LKt7J6QOiogJHtyZXF1ZXN0b3J9XG4q64yA7IOBIERCOiogJHt0YXJnZXRzVGV4dH1cbirsi5zqsIQ6KiAke3RpbWVzdGFtcH1cblxuKuyggeyaqSDsmIjsoJUg66eI7J206re466CI7J207IWYOipcbiR7bWlncmF0aW9uc1RleHR9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiDsirnsnbgg7IOB7YOc66W8IO2ZleyduO2VqeuLiOuLpCAocmVhY3Rpb25zLmdldCkuXG4gICAqL1xuICBhc3luYyBjaGVja0FwcHJvdmFsKFxuICAgIGNoYW5uZWw6IHN0cmluZyxcbiAgICB0czogc3RyaW5nLFxuICApOiBQcm9taXNlPHtcbiAgICBhcHByb3ZlZDogYm9vbGVhbjtcbiAgICByZWplY3RlZDogYm9vbGVhbjtcbiAgICBhcHByb3Zlcj86IHN0cmluZztcbiAgfT4ge1xuICAgIGFzc2VydCh0aGlzLmNvbmZpZywgU0QoXCJzb25hbXUuZXJyb3Iuc2xhY2tDb25maXJtTm90Q29uZmlndXJlZFwiKSk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgYGh0dHBzOi8vc2xhY2suY29tL2FwaS9yZWFjdGlvbnMuZ2V0P2NoYW5uZWw9JHtjaGFubmVsfSZ0aW1lc3RhbXA9JHt0c31gLFxuICAgICAge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5jb25maWcuYm90VG9rZW59YCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2xhY2sgQVBJIEhUVFAgZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7XG4gICAgICBvazogYm9vbGVhbjtcbiAgICAgIGVycm9yPzogc3RyaW5nO1xuICAgICAgbWVzc2FnZT86IHtcbiAgICAgICAgcmVhY3Rpb25zPzogQXJyYXk8e1xuICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICB1c2Vycz86IHN0cmluZ1tdO1xuICAgICAgICB9PjtcbiAgICAgIH07XG4gICAgfTtcbiAgICBpZiAoIWRhdGEub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2xhY2sgQVBJIGVycm9yOiAke2RhdGEuZXJyb3J9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVhY3Rpb25zID0gZGF0YS5tZXNzYWdlPy5yZWFjdGlvbnMgPz8gW107XG4gICAgY29uc3QgYXBwcm92ZWQgPSByZWFjdGlvbnMuZmluZCgocikgPT4gci5uYW1lID09PSBcIndoaXRlX2NoZWNrX21hcmtcIik7XG4gICAgY29uc3QgcmVqZWN0ZWQgPSByZWFjdGlvbnMuZmluZCgocikgPT4gci5uYW1lID09PSBcInhcIik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYXBwcm92ZWQ6ICEhYXBwcm92ZWQsXG4gICAgICByZWplY3RlZDogISFyZWplY3RlZCxcbiAgICAgIGFwcHJvdmVyOiBhcHByb3ZlZD8udXNlcnM/LlswXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlIOyKueyduCDsspjrpqzrpbwg7IiY7ZaJ7ZWp64uI64ukICjrs7jsnbjsnbQg4pyFIOywjeqzoCDsiqTroIjrk5zsl5Ag7IKs7JygIOuCqOq5gCkuXG4gICAqL1xuICBhc3luYyBmb3JjZUFwcHJvdmFsKFxuICAgIGNoYW5uZWw6IHN0cmluZyxcbiAgICB0czogc3RyaW5nLFxuICAgIHJlYXNvbjogc3RyaW5nLFxuICAgIHJlcXVlc3Rvcj86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXNzZXJ0KHRoaXMuY29uZmlnLCBTRChcInNvbmFtdS5lcnJvci5zbGFja0NvbmZpcm1Ob3RDb25maWd1cmVkXCIpKTtcbiAgICBjb25zdCBhY3R1YWxSZXF1ZXN0b3IgPSByZXF1ZXN0b3IgPz8gdGhpcy5nZXRSZXF1ZXN0b3IoKTtcblxuICAgIC8vIDEuIOKchSDsnbTrqqjsp4Ag7LaU6rCAXG4gICAgY29uc3QgYWRkUmVhY3Rpb25SZXNwb25zZSA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9zbGFjay5jb20vYXBpL3JlYWN0aW9ucy5hZGRcIiwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMuY29uZmlnLmJvdFRva2VufWAsXG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgdGltZXN0YW1wOiB0cyxcbiAgICAgICAgbmFtZTogXCJ3aGl0ZV9jaGVja19tYXJrXCIsXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGlmICghYWRkUmVhY3Rpb25SZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTbGFjayBBUEkgSFRUUCBlcnJvcjogJHthZGRSZWFjdGlvblJlc3BvbnNlLnN0YXR1c31gKTtcbiAgICB9XG5cbiAgICAvLyAyLiDsiqTroIjrk5zsl5Ag7IKs7JygIOuCqOq5gFxuICAgIGNvbnN0IHBvc3RNZXNzYWdlUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vc2xhY2suY29tL2FwaS9jaGF0LnBvc3RNZXNzYWdlXCIsIHtcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmNvbmZpZy5ib3RUb2tlbn1gLFxuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGNoYW5uZWwsXG4gICAgICAgIHRocmVhZF90czogdHMsXG4gICAgICAgIHRleHQ6IGDimqDvuI8gKkZvcmNlIOyKueyduCpcXG7smpTssq3snpA6ICR7YWN0dWFsUmVxdWVzdG9yfVxcbuyCrOycoDogJHtyZWFzb259YCxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgaWYgKCFwb3N0TWVzc2FnZVJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNsYWNrIEFQSSBIVFRQIGVycm9yOiAke3Bvc3RNZXNzYWdlUmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDsi6Ttlokg7JmE66OMIOuhnOq3uOulvCDrgqjquYHri4jri6QuXG4gICAqL1xuICBhc3luYyBsb2dFeGVjdXRpb24oXG4gICAgY2hhbm5lbDogc3RyaW5nLFxuICAgIHRzOiBzdHJpbmcsXG4gICAgcmVzdWx0czogTWlncmF0aW9uUmVzdWx0LFxuICAgIHJlcXVlc3Rvcj86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgYXNzZXJ0KGNvbmZpZywgU0QoXCJzb25hbXUuZXJyb3Iuc2xhY2tDb25maXJtTm90Q29uZmlndXJlZFwiKSk7XG5cbiAgICBjb25zdCBhY3R1YWxSZXF1ZXN0b3IgPSByZXF1ZXN0b3IgPz8gdGhpcy5nZXRSZXF1ZXN0b3IoKTtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLnRvTG9jYWxlU3RyaW5nKFwia28tS1JcIiwge1xuICAgICAgdGltZVpvbmU6IFwiQXNpYS9TZW91bFwiLFxuICAgIH0pO1xuXG4gICAgLy8gRELrs4TroZwg6re466O57ZmU7ZWY7JesIO2RnOyLnO2VqeuLiOuLpC5cbiAgICBjb25zdCBhcHBsaWVkVGV4dCA9XG4gICAgICByZXN1bHRzLmxlbmd0aCA+IDBcbiAgICAgICAgPyByZXN1bHRzXG4gICAgICAgICAgICAuZmlsdGVyKChyKSA9PiByLmFwcGxpZWQubGVuZ3RoID4gMClcbiAgICAgICAgICAgIC5tYXAoKHIpID0+IGBbJHtyLmNvbm5LZXl9XVxcbiR7ci5hcHBsaWVkLm1hcCgobSkgPT4gYOKAoiAke219YCkuam9pbihcIlxcblwiKX1gKVxuICAgICAgICAgICAgLmpvaW4oXCJcXG5cXG5cIilcbiAgICAgICAgOiBcIijsl4bsnYwpXCI7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9zbGFjay5jb20vYXBpL2NoYXQucG9zdE1lc3NhZ2VcIiwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2NvbmZpZy5ib3RUb2tlbn1gLFxuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGNoYW5uZWwsXG4gICAgICAgIHRocmVhZF90czogdHMsXG4gICAgICAgIHRleHQ6IGDinIUgKuuniOydtOq3uOugiOydtOyFmCDsi6Ttlokg7JmE66OMKlxcbuyLpO2WieyekDogJHthY3R1YWxSZXF1ZXN0b3J9XFxu7Iuc6rCEOiAke3RpbWVzdGFtcH1cXG5cXG7soIHsmqnrkKg6XFxuJHthcHBsaWVkVGV4dH1gLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNsYWNrIEFQSSBIVFRQIGVycm9yOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O2NBTXVDO1VBRVA7Q0FnQm5CLGVBQWIsTUFBMEI7RUFDeEIsQUFBUSxTQUFTLE9BQU8sT0FBTzs7OztFQUsvQixlQUF3QjtBQUN0QixVQUFPLENBQUMsRUFBRSxLQUFLLFFBQVEsWUFBWSxLQUFLLFFBQVE7Ozs7O0VBTWxELHlCQUF5QixRQUF1QztBQUM5RCxVQUFPLEtBQUssUUFBUSxT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
205
+
206
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhY2stY29uZmlybS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlncmF0aW9uL3NsYWNrLWNvbmZpcm0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY3J5cHRvIGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBTRCB9IGZyb20gXCIuLi9kaWN0L3NkXCI7XG5pbXBvcnQgeyB0eXBlIE1pZ3JhdGlvblJlc3VsdCB9IGZyb20gXCIuL21pZ3JhdG9yXCI7XG5cbmV4cG9ydCB0eXBlIFNsYWNrQ29uZmlybVJlc3VsdCA9IHtcbiAgc3RhdHVzOiBcImFwcHJvdmVkXCIgfCBcInJlamVjdGVkXCIgfCBcInBlbmRpbmdcIiB8IFwibm90X2NvbmZpZ3VyZWRcIiB8IFwiZXJyb3JcIjtcbiAgdHM/OiBzdHJpbmc7XG4gIGNoYW5uZWw/OiBzdHJpbmc7XG4gIGVycm9yPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgU2xhY2tDb25maXJtUGVuZGluZ1Jlc3VsdCA9IHtcbiAgdHlwZTogXCJwZW5kaW5nXCI7XG4gIGNoYW5uZWw6IHN0cmluZztcbiAgdHM6IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBTbGFja0NvbmZpcm0ge1xuICBwcml2YXRlIGNvbmZpZyA9IFNvbmFtdS5jb25maWcuc2xhY2tDb25maXJtO1xuXG4gIHByaXZhdGUgdmFsaWRhdGVDb25maWd1cmVkVGFyZ2V0cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRUYXJnZXRzID0gT2JqZWN0LmtleXMoU29uYW11LmRiQ29uZmlnKTtcbiAgICBjb25zdCBpbnZhbGlkVGFyZ2V0cyA9IHRoaXMuY29uZmlnLnRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+ICF2YWxpZFRhcmdldHMuaW5jbHVkZXModGFyZ2V0KSk7XG5cbiAgICBpZiAoaW52YWxpZFRhcmdldHMubGVuZ3RoID4gMCkge1xuICAgICAgYXNzZXJ0LmZhaWwoXG4gICAgICAgIFNEKFwic29uYW11LmVycm9yLnNsYWNrQ29uZmlybUludmFsaWRUYXJnZXRzXCIpKFxuICAgICAgICAgIGludmFsaWRUYXJnZXRzLmpvaW4oXCIsIFwiKSxcbiAgICAgICAgICB2YWxpZFRhcmdldHMuam9pbihcIiwgXCIpLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7ISk7KCV7J20IOyeiOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqL1xuICBpc0NvbmZpZ3VyZWQoKTogYm9vbGVhbiB7XG4gICAgdGhpcy52YWxpZGF0ZUNvbmZpZ3VyZWRUYXJnZXRzKCk7XG4gICAgcmV0dXJuICEhKHRoaXMuY29uZmlnPy5ib3RUb2tlbiAmJiB0aGlzLmNvbmZpZz8uY2hhbm5lbElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlbTri7kgdGFyZ2V07J20IOyKueyduCDrjIDsg4Hsnbjsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgKi9cbiAgaXNUYXJnZXRSZXF1aXJlc0FwcHJvdmFsKHRhcmdldDoga2V5b2YgU29uYW11REJDb25maWcpOiBib29sZWFuIHtcbiAgICB0aGlzLnZhbGlkYXRlQ29uZmlndXJlZFRhcmdldHMoKTtcbiAgICByZXR1cm4gdGhpcy5jb25maWc/LnRhcmdldHM/LmluY2x1ZGVzKHRhcmdldCkgPz8gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICog66eI7J206re466CI7J207IWYIOuqqeuhneydmCDtlbTsi5zrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKi9cbiAgZ2V0TWlncmF0aW9uc0hhc2gobWlncmF0aW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5taWdyYXRpb25zXS50b1NvcnRlZCgpO1xuICAgIHJldHVybiBjcnlwdG8uY3JlYXRlSGFzaChcIm1kNVwiKS51cGRhdGUoc29ydGVkLmpvaW4oXCIsXCIpKS5kaWdlc3QoXCJoZXhcIikuc2xpY2UoMCwgMTIpO1xuICB9XG5cbiAgLyoqXG4gICAqIOuhnOy7rCDtjIzsnbwg6rK966Gc66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZ2V0Q29uZmlybUZpbGVQYXRoKGhhc2g6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjXCIsIFwibWlncmF0aW9uc1wiLCBgLnNsYWNrLWNvbmZpcm0tJHtoYXNofWApO1xuICB9XG5cbiAgLyoqXG4gICAqIOq4sOyhtCDsirnsnbgg7JqU7LKt7J2EIOyhsO2ajO2VqeuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGdldEV4aXN0aW5nUmVxdWVzdChtaWdyYXRpb25zOiBzdHJpbmdbXSk6IFByb21pc2U8eyBjaGFubmVsOiBzdHJpbmc7IHRzOiBzdHJpbmcgfSB8IG51bGw+IHtcbiAgICBjb25zdCBoYXNoID0gdGhpcy5nZXRNaWdyYXRpb25zSGFzaChtaWdyYXRpb25zKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHRoaXMuZ2V0Q29uZmlybUZpbGVQYXRoKGhhc2gpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICAgIGNvbnN0IFtjaGFubmVsLCB0c10gPSBjb250ZW50LnRyaW0oKS5zcGxpdChcIjpcIik7XG4gICAgICBpZiAoY2hhbm5lbCAmJiB0cykge1xuICAgICAgICByZXR1cm4geyBjaGFubmVsLCB0cyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7Iq57J24IOyalOyyreydhCDsoIDsnqXtlanri4jri6QuXG4gICAqL1xuICBhc3luYyBzYXZlUmVxdWVzdChtaWdyYXRpb25zOiBzdHJpbmdbXSwgY2hhbm5lbDogc3RyaW5nLCB0czogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaGFzaCA9IHRoaXMuZ2V0TWlncmF0aW9uc0hhc2gobWlncmF0aW9ucyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSB0aGlzLmdldENvbmZpcm1GaWxlUGF0aChoYXNoKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZVBhdGgsIGAke2NoYW5uZWx9OiR7dHN9YCwgXCJ1dGYtOFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtmITsnqwg7IKs7Jqp7J6QIOydtOumhOydhCDrsJjtmZjtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGdldFJlcXVlc3RvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5VU0VSID8/IG9zLnVzZXJJbmZvKCkudXNlcm5hbWUgPz8gXCJVbmtub3duXCI7XG4gIH1cblxuICAvKipcbiAgICog7Iqs656ZIOuplOyLnOyngOulvCDrsJzshqHtlanri4jri6QuXG4gICAqL1xuICBhc3luYyBwb3N0QXBwcm92YWxSZXF1ZXN0KFxuICAgIG1pZ3JhdGlvbnM6IHN0cmluZ1tdLFxuICAgIHRhcmdldHM6IHN0cmluZ1tdLFxuICAgIHJlcXVlc3Rvcj86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IGNoYW5uZWw6IHN0cmluZzsgdHM6IHN0cmluZyB9PiB7XG4gICAgYXNzZXJ0KHRoaXMuY29uZmlnLCBTRChcInNvbmFtdS5lcnJvci5zbGFja0NvbmZpcm1Ob3RDb25maWd1cmVkXCIpKTtcbiAgICB0aGlzLnZhbGlkYXRlQ29uZmlndXJlZFRhcmdldHMoKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXCJodHRwczovL3NsYWNrLmNvbS9hcGkvY2hhdC5wb3N0TWVzc2FnZVwiLCB7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5jb25maWcuYm90VG9rZW59YCxcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjaGFubmVsOiB0aGlzLmNvbmZpZy5jaGFubmVsSWQsXG4gICAgICAgIHRleHQ6IHRoaXMuYnVpbGRNZXNzYWdlVGV4dChtaWdyYXRpb25zLCB0YXJnZXRzLCByZXF1ZXN0b3IgPz8gdGhpcy5nZXRSZXF1ZXN0b3IoKSksXG4gICAgICAgIHVuZnVybF9saW5rczogZmFsc2UsXG4gICAgICAgIHVuZnVybF9tZWRpYTogZmFsc2UsXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2xhY2sgQVBJIEhUVFAgZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7XG4gICAgICBvazogYm9vbGVhbjtcbiAgICAgIGVycm9yPzogc3RyaW5nO1xuICAgICAgY2hhbm5lbDogc3RyaW5nO1xuICAgICAgdHM6IHN0cmluZztcbiAgICB9O1xuICAgIGlmICghZGF0YS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTbGFjayBBUEkgZXJyb3I6ICR7ZGF0YS5lcnJvcn1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY2hhbm5lbDogZGF0YS5jaGFubmVsLFxuICAgICAgdHM6IGRhdGEudHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrqZTsi5zsp4Ag7YWN7Iqk7Yq466W8IOyDneyEse2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRNZXNzYWdlVGV4dChtaWdyYXRpb25zOiBzdHJpbmdbXSwgdGFyZ2V0czogc3RyaW5nW10sIHJlcXVlc3Rvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcm9qZWN0TmFtZSA9IFNvbmFtdS5jb25maWcucHJvamVjdE5hbWUgPz8gXCJVbmtub3duXCI7XG4gICAgY29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS50b0xvY2FsZVN0cmluZyhcImtvLUtSXCIsIHtcbiAgICAgIHRpbWVab25lOiBcIkFzaWEvU2VvdWxcIixcbiAgICB9KTtcbiAgICBjb25zdCBtaWdyYXRpb25zVGV4dCA9IG1pZ3JhdGlvbnMubWFwKChtKSA9PiBg4oCiICR7bX1gKS5qb2luKFwiXFxuXCIpO1xuICAgIGNvbnN0IHRhcmdldHNUZXh0ID0gdGFyZ2V0cy5qb2luKFwiLCBcIik7XG5cbiAgICByZXR1cm4gYPCfl4TvuI8gKlske3Byb2plY3ROYW1lfV0gUHJvZHVjdGlvbiDrp4jsnbTqt7jroIjsnbTshZgg7Iq57J24IOyalOyyrSpcblxuKuyalOyyreyekDoqICR7cmVxdWVzdG9yfVxuKuuMgOyDgSBEQjoqICR7dGFyZ2V0c1RleHR9XG4q7Iuc6rCEOiogJHt0aW1lc3RhbXB9XG5cbirsoIHsmqkg7JiI7KCVIOuniOydtOq3uOugiOydtOyFmDoqXG4ke21pZ3JhdGlvbnNUZXh0fWA7XG4gIH1cblxuICAvKipcbiAgICog7Iq57J24IOyDge2DnOulvCDtmZXsnbjtlanri4jri6QgKHJlYWN0aW9ucy5nZXQpLlxuICAgKi9cbiAgYXN5bmMgY2hlY2tBcHByb3ZhbChcbiAgICBjaGFubmVsOiBzdHJpbmcsXG4gICAgdHM6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7XG4gICAgYXBwcm92ZWQ6IGJvb2xlYW47XG4gICAgcmVqZWN0ZWQ6IGJvb2xlYW47XG4gICAgYXBwcm92ZXI/OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBhc3NlcnQodGhpcy5jb25maWcsIFNEKFwic29uYW11LmVycm9yLnNsYWNrQ29uZmlybU5vdENvbmZpZ3VyZWRcIikpO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgIGBodHRwczovL3NsYWNrLmNvbS9hcGkvcmVhY3Rpb25zLmdldD9jaGFubmVsPSR7Y2hhbm5lbH0mdGltZXN0YW1wPSR7dHN9YCxcbiAgICAgIHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMuY29uZmlnLmJvdFRva2VufWAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNsYWNrIEFQSSBIVFRQIGVycm9yOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMge1xuICAgICAgb2s6IGJvb2xlYW47XG4gICAgICBlcnJvcj86IHN0cmluZztcbiAgICAgIG1lc3NhZ2U/OiB7XG4gICAgICAgIHJlYWN0aW9ucz86IEFycmF5PHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgdXNlcnM/OiBzdHJpbmdbXTtcbiAgICAgICAgfT47XG4gICAgICB9O1xuICAgIH07XG4gICAgaWYgKCFkYXRhLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNsYWNrIEFQSSBlcnJvcjogJHtkYXRhLmVycm9yfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlYWN0aW9ucyA9IGRhdGEubWVzc2FnZT8ucmVhY3Rpb25zID8/IFtdO1xuICAgIGNvbnN0IGFwcHJvdmVkID0gcmVhY3Rpb25zLmZpbmQoKHIpID0+IHIubmFtZSA9PT0gXCJ3aGl0ZV9jaGVja19tYXJrXCIpO1xuICAgIGNvbnN0IHJlamVjdGVkID0gcmVhY3Rpb25zLmZpbmQoKHIpID0+IHIubmFtZSA9PT0gXCJ4XCIpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFwcHJvdmVkOiAhIWFwcHJvdmVkLFxuICAgICAgcmVqZWN0ZWQ6ICEhcmVqZWN0ZWQsXG4gICAgICBhcHByb3ZlcjogYXBwcm92ZWQ/LnVzZXJzPy5bMF0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZSDsirnsnbgg7LKY66as66W8IOyImO2Wie2VqeuLiOuLpCAo67O47J247J20IOKchSDssI3qs6Ag7Iqk66CI65Oc7JeQIOyCrOycoCDrgqjquYApLlxuICAgKi9cbiAgYXN5bmMgZm9yY2VBcHByb3ZhbChcbiAgICBjaGFubmVsOiBzdHJpbmcsXG4gICAgdHM6IHN0cmluZyxcbiAgICByZWFzb246IHN0cmluZyxcbiAgICByZXF1ZXN0b3I/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGFzc2VydCh0aGlzLmNvbmZpZywgU0QoXCJzb25hbXUuZXJyb3Iuc2xhY2tDb25maXJtTm90Q29uZmlndXJlZFwiKSk7XG4gICAgY29uc3QgYWN0dWFsUmVxdWVzdG9yID0gcmVxdWVzdG9yID8/IHRoaXMuZ2V0UmVxdWVzdG9yKCk7XG5cbiAgICAvLyAxLiDinIUg7J2066qo7KeAIOy2lOqwgFxuICAgIGNvbnN0IGFkZFJlYWN0aW9uUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vc2xhY2suY29tL2FwaS9yZWFjdGlvbnMuYWRkXCIsIHtcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmNvbmZpZy5ib3RUb2tlbn1gLFxuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGNoYW5uZWwsXG4gICAgICAgIHRpbWVzdGFtcDogdHMsXG4gICAgICAgIG5hbWU6IFwid2hpdGVfY2hlY2tfbWFya1wiLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBpZiAoIWFkZFJlYWN0aW9uUmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2xhY2sgQVBJIEhUVFAgZXJyb3I6ICR7YWRkUmVhY3Rpb25SZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgfVxuXG4gICAgLy8gMi4g7Iqk66CI65Oc7JeQIOyCrOycoCDrgqjquYBcbiAgICBjb25zdCBwb3N0TWVzc2FnZVJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXCJodHRwczovL3NsYWNrLmNvbS9hcGkvY2hhdC5wb3N0TWVzc2FnZVwiLCB7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5jb25maWcuYm90VG9rZW59YCxcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjaGFubmVsLFxuICAgICAgICB0aHJlYWRfdHM6IHRzLFxuICAgICAgICB0ZXh0OiBg4pqg77iPICpGb3JjZSDsirnsnbgqXFxu7JqU7LKt7J6QOiAke2FjdHVhbFJlcXVlc3Rvcn1cXG7sgqzsnKA6ICR7cmVhc29ufWAsXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGlmICghcG9zdE1lc3NhZ2VSZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTbGFjayBBUEkgSFRUUCBlcnJvcjogJHtwb3N0TWVzc2FnZVJlc3BvbnNlLnN0YXR1c31gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7Iuk7ZaJIOyZhOujjCDroZzqt7jrpbwg64Ko6rmB64uI64ukLlxuICAgKi9cbiAgYXN5bmMgbG9nRXhlY3V0aW9uKFxuICAgIGNoYW5uZWw6IHN0cmluZyxcbiAgICB0czogc3RyaW5nLFxuICAgIHJlc3VsdHM6IE1pZ3JhdGlvblJlc3VsdCxcbiAgICByZXF1ZXN0b3I/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnO1xuICAgIGFzc2VydChjb25maWcsIFNEKFwic29uYW11LmVycm9yLnNsYWNrQ29uZmlybU5vdENvbmZpZ3VyZWRcIikpO1xuXG4gICAgY29uc3QgYWN0dWFsUmVxdWVzdG9yID0gcmVxdWVzdG9yID8/IHRoaXMuZ2V0UmVxdWVzdG9yKCk7XG4gICAgY29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS50b0xvY2FsZVN0cmluZyhcImtvLUtSXCIsIHtcbiAgICAgIHRpbWVab25lOiBcIkFzaWEvU2VvdWxcIixcbiAgICB9KTtcblxuICAgIC8vIERC67OE66GcIOq3uOujue2ZlO2VmOyXrCDtkZzsi5ztlanri4jri6QuXG4gICAgY29uc3QgYXBwbGllZFRleHQgPVxuICAgICAgcmVzdWx0cy5sZW5ndGggPiAwXG4gICAgICAgID8gcmVzdWx0c1xuICAgICAgICAgICAgLmZpbHRlcigocikgPT4gci5hcHBsaWVkLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAubWFwKChyKSA9PiBgWyR7ci5jb25uS2V5fV1cXG4ke3IuYXBwbGllZC5tYXAoKG0pID0+IGDigKIgJHttfWApLmpvaW4oXCJcXG5cIil9YClcbiAgICAgICAgICAgIC5qb2luKFwiXFxuXFxuXCIpXG4gICAgICAgIDogXCIo7JeG7J2MKVwiO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vc2xhY2suY29tL2FwaS9jaGF0LnBvc3RNZXNzYWdlXCIsIHtcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtjb25maWcuYm90VG9rZW59YCxcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjaGFubmVsLFxuICAgICAgICB0aHJlYWRfdHM6IHRzLFxuICAgICAgICB0ZXh0OiBg4pyFICrrp4jsnbTqt7jroIjsnbTshZgg7Iuk7ZaJIOyZhOujjCpcXG7si6TtlonsnpA6ICR7YWN0dWFsUmVxdWVzdG9yfVxcbuyLnOqwhDogJHt0aW1lc3RhbXB9XFxuXFxu7KCB7Jqp65CoOlxcbiR7YXBwbGllZFRleHR9YCxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTbGFjayBBUEkgSFRUUCBlcnJvcjogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O2FBTXNDO1NBRVA7Q0FnQmxCLGVBQWIsTUFBMEI7RUFDeEIsU0FBaUIsT0FBTyxPQUFPO0VBRS9CLDRCQUEwQztHQUN4QyxJQUFJLENBQUMsS0FBSyxRQUNSO0dBR0YsTUFBTSxlQUFlLE9BQU8sS0FBSyxPQUFPLFFBQVE7R0FDaEQsTUFBTSxpQkFBaUIsS0FBSyxPQUFPLFFBQVEsUUFBUSxXQUFXLENBQUMsYUFBYSxTQUFTLE1BQU0sQ0FBQztHQUU1RixJQUFJLGVBQWUsU0FBUyxHQUMxQixPQUFPLEtBQ0wsR0FBRyx5Q0FBeUMsQ0FBQyxDQUMzQyxlQUFlLEtBQUssSUFBSSxHQUN4QixhQUFhLEtBQUssSUFBSSxDQUN4QixDQUNGO0VBRUo7Ozs7RUFLQSxlQUF3QjtHQUN0QixLQUFLLDBCQUEwQjtHQUMvQixPQUFPLENBQUMsRUFBRSxLQUFLLFFBQVEsWUFBWSxLQUFLLFFBQVE7RUFDbEQ7Ozs7RUFLQSx5QkFBeUIsUUFBdUM7R0FDOUQsS0FBSywwQkFBMEI7R0FDL0IsT0FBTyxLQUFLLFFBQVEsU0FBUyxTQUFTLE1B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
@@ -1 +1 @@
1
- export { };
1
+ export {};
@@ -1 +1 @@
1
- export { };
1
+ export {};
@@ -1,9 +1,8 @@
1
1
  import { findApiRootPath, init_utils } from "../utils/utils.js";
2
- import { createHash } from "crypto";
3
2
  import { join } from "path";
3
+ import { createHash } from "crypto";
4
4
  import { homedir } from "os";
5
5
  import { connect } from "net";
6
-
7
6
  //#region src/naite/naite-reporter.ts
8
7
  /**
9
8
  * NaiteReporter
@@ -28,8 +27,7 @@ function getProjectHash(configPath) {
28
27
  * Sonamu.apiRootPath가 설정된 후에 호출해야 합니다.
29
28
  */
30
29
  function getSocketPath() {
31
- const configPath = join(findApiRootPath(), "src", "sonamu.config.ts");
32
- const hash = getProjectHash(configPath);
30
+ const hash = getProjectHash(join(findApiRootPath(), "src", "sonamu.config.ts"));
33
31
  return process.platform === "win32" ? `\\\\.\\pipe\\naite-${hash}` : join(homedir(), ".sonamu", `naite-${hash}.sock`);
34
32
  }
35
33
  var NaiteReporterClass = class {
@@ -41,19 +39,13 @@ var NaiteReporterClass = class {
41
39
  * 소켓 연결 시도
42
40
  */
43
41
  async ensureConnection() {
44
- if (this.connected || this.socket) {
45
- return;
46
- }
42
+ if (this.connected || this.socket) return;
47
43
  return new Promise((res, rej) => {
48
- if (!this.socketPath) {
49
- this.socketPath = getSocketPath();
50
- }
44
+ if (!this.socketPath) this.socketPath = getSocketPath();
51
45
  this.socket = connect(this.socketPath);
52
46
  this.socket.on("connect", () => {
53
47
  this.connected = true;
54
- for (const msg of this.buffer) {
55
- this.socket?.write(msg);
56
- }
48
+ for (const msg of this.buffer) this.socket?.write(msg);
57
49
  this.buffer = [];
58
50
  res();
59
51
  });
@@ -74,23 +66,18 @@ var NaiteReporterClass = class {
74
66
  async send(data) {
75
67
  const msg = `${JSON.stringify(data)}\n`;
76
68
  await this.ensureConnection().catch((_) => {});
77
- if (this.connected && this.socket) {
78
- this.socket.write(msg);
79
- } else {
80
- this.buffer.push(msg);
81
- }
69
+ if (this.connected && this.socket) this.socket.write(msg);
70
+ else this.buffer.push(msg);
82
71
  }
83
72
  /**
84
73
  * beforeAll에서 호출합니다.
85
74
  * 테스트 run 시작을 알립니다 (데이터 클리어 신호).
86
75
  */
87
76
  async startTestRun() {
88
- if (process.env.CI) {
89
- return;
90
- }
77
+ if (process.env.CI) return;
91
78
  await this.send({
92
79
  type: "run/start",
93
- startedAt: new Date().toISOString()
80
+ startedAt: (/* @__PURE__ */ new Date()).toISOString()
94
81
  });
95
82
  }
96
83
  /**
@@ -98,12 +85,10 @@ var NaiteReporterClass = class {
98
85
  * 테스트 케이스 결과를 traces와 함께 전송합니다.
99
86
  */
100
87
  async reportTestResult(result) {
101
- if (process.env.CI) {
102
- return;
103
- }
88
+ if (process.env.CI) return;
104
89
  await this.send({
105
90
  type: "test/result",
106
- receivedAt: new Date().toISOString(),
91
+ receivedAt: (/* @__PURE__ */ new Date()).toISOString(),
107
92
  ...result
108
93
  });
109
94
  }
@@ -112,12 +97,10 @@ var NaiteReporterClass = class {
112
97
  * 테스트 run 종료를 알립니다.
113
98
  */
114
99
  async endTestRun() {
115
- if (process.env.CI) {
116
- return;
117
- }
100
+ if (process.env.CI) return;
118
101
  await this.send({
119
102
  type: "run/end",
120
- endedAt: new Date().toISOString()
103
+ endedAt: (/* @__PURE__ */ new Date()).toISOString()
121
104
  });
122
105
  if (this.socket) {
123
106
  this.socket.end();
@@ -127,7 +110,7 @@ var NaiteReporterClass = class {
127
110
  }
128
111
  };
129
112
  const NaiteReporter = new NaiteReporterClass();
130
-
131
113
  //#endregion
132
114
  export { NaiteReporter };
133
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFpdGUtcmVwb3J0ZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL25haXRlL25haXRlLXJlcG9ydGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTmFpdGVSZXBvcnRlclxuICpcbiAqIO2FjOyKpO2KuCDqsrDqs7zsmYAgVHJhY2Ug7KCV67O066W8IFVuaXggU29ja2V07Jy866GcIFZTIENvZGUgZXh0ZW5zaW9u7JeQIOyghOuLrO2VqeuLiOuLpC5cbiAqIGV4dGVuc2lvbuydtCB+Ly5zb25hbXUvbmFpdGUte2hhc2h9LnNvY2vsl5Ag7IaM7LyTIOyEnOuyhOulvCDsl7TslrTrkaHri4jri6QuXG4gKlxuICog7ZSE66Gc7KCd7Yq467OE66GcIOqzoOycoO2VnCDshozsvJPsnYQg7IKs7Jqp7ZWY6riwIOychO2VtCBzb25hbXUuY29uZmlnLnRzIOqyveuhnOydmCDtlbTsi5zrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICpcbiAqIGZzIG1vY2sg7Lap64+M7J2EIO2UvO2VmOq4sCDsnITtlbQgbmV0IOuqqOuTiOunjCDsgqzsmqntlanri4jri6QuXG4gKi9cbi8qIG94bGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi8gLy8gTmFpdGXripQgZXhwZWN07JmAIO2YuOydke2VmOuPhOuhnSBhbnnrpbwg7ZeI7Jqp7ZWoXG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyBjb25uZWN0IH0gZnJvbSBcIm5ldFwiO1xuaW1wb3J0IHsgdHlwZSBTb2NrZXQgfSBmcm9tIFwibmV0XCI7XG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSBcIm9zXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgZmluZEFwaVJvb3RQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIE5haXRlTWVzc2FnaW5nVHlwZXMgfSBmcm9tIFwiLi9tZXNzYWdpbmctdHlwZXNcIjtcblxuLyoqXG4gKiBzb25hbXUuY29uZmlnLnRzIOqyveuhnOulvCDrsJvslYTshJwg7ZSE66Gc7KCd7Yq467OEIOqzoOycoCDtlbTsi5zrpbwg7IOd7ISx7ZWp64uI64ukLlxuICog7J217Iqk7YWQ7IWY6rO8IOuPmeydvO2VnCDrsKnsi53snLzroZwg6rOE7IKw7ZW07JW8IO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZ2V0UHJvamVjdEhhc2goY29uZmlnUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyZWF0ZUhhc2goXCJtZDVcIikudXBkYXRlKGNvbmZpZ1BhdGgpLmRpZ2VzdChcImhleFwiKS5zbGljZSgwLCA4KTtcbn1cblxuLyoqXG4gKiDtmITsnqwg7ZSE66Gc7KCd7Yq47J2YIOyGjOy8kyDqsr3roZzrpbwg6rOE7IKw7ZWp64uI64ukLlxuICogU29uYW11LmFwaVJvb3RQYXRo6rCAIOyEpOygleuQnCDtm4Tsl5Ag7Zi47Lac7ZW07JW8IO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZ2V0U29ja2V0UGF0aCgpOiBzdHJpbmcge1xuICAvLyBzb25hbXUuY29uZmlnLnRz7J2YIOygiOuMgCDqsr3roZwg6rOE7IKwXG4gIC8vIGFwaVJvb3RQYXRo64qUIC9wcm9qZWN0L2FwaSDtmJXtg5zsnbTqs6AsIGNvbmZpZ+uKlCAvcHJvamVjdC9hcGkvc3JjL3NvbmFtdS5jb25maWcudHPsl5Ag7J6I7J2MXG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKGZpbmRBcGlSb290UGF0aCgpLCBcInNyY1wiLCBcInNvbmFtdS5jb25maWcudHNcIik7XG4gIGNvbnN0IGhhc2ggPSBnZXRQcm9qZWN0SGFzaChjb25maWdQYXRoKTtcblxuICByZXR1cm4gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiXG4gICAgPyBgXFxcXFxcXFwuXFxcXHBpcGVcXFxcbmFpdGUtJHtoYXNofWBcbiAgICA6IGpvaW4oaG9tZWRpcigpLCBcIi5zb25hbXVcIiwgYG5haXRlLSR7aGFzaH0uc29ja2ApO1xufVxuXG5jbGFzcyBOYWl0ZVJlcG9ydGVyQ2xhc3Mge1xuICBwcml2YXRlIHNvY2tldFBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNvY2tldDogU29ja2V0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XG4gIHByaXZhdGUgYnVmZmVyOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiDshozsvJMg7Jew6rKwIOyLnOuPhFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVDb25uZWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNvbm5lY3RlZCB8fCB0aGlzLnNvY2tldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHtcbiAgICAgIGlmICghdGhpcy5zb2NrZXRQYXRoKSB7XG4gICAgICAgIHRoaXMuc29ja2V0UGF0aCA9IGdldFNvY2tldFBhdGgoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc29ja2V0ID0gY29ubmVjdCh0aGlzLnNvY2tldFBhdGgpO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbihcImNvbm5lY3RcIiwgKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgIC8vIOuyhO2NvOyXkCDsjJPsnbgg66mU7Iuc7KeAIOyghOyGoVxuICAgICAgICBmb3IgKGNvbnN0IG1zZyBvZiB0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgIHRoaXMuc29ja2V0Py53cml0ZShtc2cpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVmZmVyID0gW107XG4gICAgICAgIHJlcygpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uKFwiZXJyb3JcIiwgKGUpID0+IHtcbiAgICAgICAgLy8g7Jew6rKwIOyLpO2MqCDrrLTsi5wgKGV4dGVuc2lvbuydtCDqurzsoLjsnojsnYQg7IiYIOyeiOydjClcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgICAgICByZWooZSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQub24oXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gbnVsbDtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOuplOyLnOyngCDsoITshqEgKOykhOuwlOq/iOycvOuhnCDqtazrtoQpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmQoZGF0YTogTmFpdGVNZXNzYWdpbmdUeXBlcy5OYWl0ZU1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtc2cgPSBgJHtKU09OLnN0cmluZ2lmeShkYXRhKX1cXG5gO1xuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVDb25uZWN0aW9uKCkuY2F0Y2goKF8pID0+IHt9KTtcblxuICAgIGlmICh0aGlzLmNvbm5lY3RlZCAmJiB0aGlzLnNvY2tldCkge1xuICAgICAgdGhpcy5zb2NrZXQud3JpdGUobXNnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g7Jew6rKwIOuMgOq4sCDspJHsnbTrqbQg67KE7Y287JeQIOyggOyepVxuICAgICAgdGhpcy5idWZmZXIucHVzaChtc2cpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiZWZvcmVBbGzsl5DshJwg7Zi47Lac7ZWp64uI64ukLlxuICAgKiDthYzsiqTtirggcnVuIOyLnOyekeydhCDslYzrpr3ri4jri6QgKOuNsOydtO2EsCDtgbTrpqzslrQg7Iug7Zi4KS5cbiAgICovXG4gIGFzeW5jIHN0YXJ0VGVzdFJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQ0kpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNlbmQoe1xuICAgICAgdHlwZTogXCJydW4vc3RhcnRcIixcbiAgICAgIHN0YXJ0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGFmdGVyRWFjaOyXkOyEnCDtmLjstpztlanri4jri6QuXG4gICAqIO2FjOyKpO2KuCDsvIDsnbTsiqQg6rKw6rO866W8IHRyYWNlc+yZgCDtlajqu5gg7KCE7Iah7ZWp64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVwb3J0VGVzdFJlc3VsdChcbiAgICByZXN1bHQ6IE9taXQ8TmFpdGVNZXNzYWdpbmdUeXBlcy5UZXN0UmVzdWx0LCBcInJlY2VpdmVkQXRcIj4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChwcm9jZXNzLmVudi5DSSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICB0eXBlOiBcInRlc3QvcmVzdWx0XCIsXG4gICAgICByZWNlaXZlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAuLi5yZXN1bHQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogYWZ0ZXJBbGzsl5DshJwg7Zi47Lac7ZWp64uI64ukLlxuICAgKiDthYzsiqTtirggcnVuIOyiheujjOulvCDslYzrpr3ri4jri6QuXG4gICAqL1xuICBhc3luYyBlbmRUZXN0UnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChwcm9jZXNzLmVudi5DSSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICB0eXBlOiBcInJ1bi9lbmRcIixcbiAgICAgIGVuZGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9KTtcblxuICAgIC8vIOyXsOqysCDsooXro4xcbiAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgIHRoaXMuc29ja2V0LmVuZCgpO1xuICAgICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IE5haXRlUmVwb3J0ZXIgPSBuZXcgTmFpdGVSZXBvcnRlckNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O1lBa0JpRDs7Ozs7QUFPakQsU0FBUyxlQUFlLFlBQTRCO0FBQ2xELFFBQU8sV0FBVyxNQUFNLENBQUMsT0FBTyxXQUFXLENBQUMsT0FBTyxNQUFNLENBQUMsTUFBTSxHQUFHLEVBQUU7Ozs7OztBQU92RSxTQUFTLGdCQUF3QjtDQUcvQixNQUFNLGFBQWEsS0FBSyxpQkFBaUIsRUFBRSxPQUFPLG1CQUFtQjtDQUNyRSxNQUFNLE9BQU8sZUFBZSxXQUFXO0FBRXZDLFFBQU8sUUFBUSxhQUFhLFVBQ3hCLHNCQUFzQixTQUN0QixLQUFLLFNBQVMsRUFBRSxXQUFXLFNBQVMsS0FBSyxPQUFPOztBQUd0RCxJQUFNLHFCQUFOLE1BQXlCO0NBQ3ZCLEFBQVEsYUFBNEI7Q0FDcEMsQUFBUSxTQUF3QjtDQUNoQyxBQUFRLFlBQVk7Q0FDcEIsQUFBUSxTQUFtQixFQUFFOzs7O0NBSzdCLE1BQWMsbUJBQWtDO0FBQzlDLE1BQUksS0FBSyxhQUFhLEtBQUssUUFBUTtBQUNqQzs7QUFHRixTQUFPLElBQUksU0FBUyxLQUFLLFFBQVE7QUFDL0IsT0FBSSxDQUFDLEtBQUssWUFBWTtBQUNwQixTQUFLLGFBQWEsZUFBZTs7QUFFbkMsUUFBSyxTQUFTLFFBQVEsS0FBSyxXQUFXO0FBRXRDLFFBQUssT0FBTyxHQUFHLGlCQUFpQjtBQUM5QixTQUFLLFlBQVk7QUFFakIsU0FBSyxNQUFNLE9BQU8sS0FBSyxRQUFRO0FBQzdCLFVBQUssUUFBUSxNQUFNLElBQUk7O0FBRXpCLFNBQUssU0FBUyxFQUFFO0FBQ2hCLFNBQUs7S0FDTDtBQUVGLFFBQUssT0FBTyxHQUFHLFVBQVUsTUFBTTtBQUU3QixTQUFLLFlBQVk7QUFDakIsU0FBSyxTQUFTO0FBQ2QsUUFBSSxFQUFFO0tBQ047QUFFRixRQUFLLE9BQU8sR0FBRyxlQUFlO0FBQzVCLFNBQUssWUFBWTtBQUNqQixTQUFLLFNBQVM7S0FDZDtJQUNGOzs7OztDQU1KLE1BQWMsS0FBSyxNQUF1RDtFQUN4RSxNQUFNLE1BQU0sR0FBRyxLQUFLLFVBQVUsS0FBSyxDQUFDO0FBRXBDLFFBQU0sS0FBSyxrQkFBa0IsQ0FBQyxPQUFPLE1BQU0sR0FBRztBQUU5QyxNQUFJLEtBQUssYUFBYSxLQUFLLFFBQVE7QUFDakMsUUFBSyxPQUFPLE1BQU0sSUFBSTtTQUNqQjtBQUVMLFFBQUssT0FBTyxLQUFLLElBQUk7Ozs7Ozs7Q0FRekIsTUFBTSxlQUE4QjtBQUNsQyxNQUFJLFFBQVEsSUFBSSxJQUFJO0FBQ2xCOztBQUdGLFFBQU0sS0FBSyxLQUFLO0dBQ2QsTUFBTTtHQUNOLFdBQVcsSUFBSSxNQUFNLENBQUMsYUFBYTtHQUNwQyxDQUFDOzs7Ozs7Q0FPSixNQUFNLGlCQUNKLFFBQ2U7QUFDZixNQUFJLFFBQVEsSUFBSSxJQUFJO0FBQ2xCOztBQUdGLFFBQU0sS0FBSyxLQUFLO0dBQ2QsTUFBTTtHQUNOLFlBQVksSUFBSSxNQUFNLENBQUMsYUFBYTtHQUNwQyxHQUFHO0dBQ0osQ0FBQzs7Ozs7O0NBT0osTUFBTSxhQUE0QjtBQUNoQyxNQUFJLFFBQVEsSUFBSSxJQUFJO0FBQ2xCOztBQUdGLFFBQU0sS0FBSyxLQUFLO0dBQ2QsTUFBTTtHQUNOLFNBQVMsSUFBSSxNQUFNLENBQUMsYUFBYTtHQUNsQyxDQUFDO0FBR0YsTUFBSSxLQUFLLFFBQVE7QUFDZixRQUFLLE9BQU8sS0FBSztBQUNqQixRQUFLLFNBQVM7QUFDZCxRQUFLLFlBQVk7Ozs7QUFLdkIsTUFBYSxnQkFBZ0IsSUFBSSxvQkFBb0IifQ==
115
+
116
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFpdGUtcmVwb3J0ZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL25haXRlL25haXRlLXJlcG9ydGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTmFpdGVSZXBvcnRlclxuICpcbiAqIO2FjOyKpO2KuCDqsrDqs7zsmYAgVHJhY2Ug7KCV67O066W8IFVuaXggU29ja2V07Jy866GcIFZTIENvZGUgZXh0ZW5zaW9u7JeQIOyghOuLrO2VqeuLiOuLpC5cbiAqIGV4dGVuc2lvbuydtCB+Ly5zb25hbXUvbmFpdGUte2hhc2h9LnNvY2vsl5Ag7IaM7LyTIOyEnOuyhOulvCDsl7TslrTrkaHri4jri6QuXG4gKlxuICog7ZSE66Gc7KCd7Yq467OE66GcIOqzoOycoO2VnCDshozsvJPsnYQg7IKs7Jqp7ZWY6riwIOychO2VtCBzb25hbXUuY29uZmlnLnRzIOqyveuhnOydmCDtlbTsi5zrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICpcbiAqIGZzIG1vY2sg7Lap64+M7J2EIO2UvO2VmOq4sCDsnITtlbQgbmV0IOuqqOuTiOunjCDsgqzsmqntlanri4jri6QuXG4gKi9cbi8qIG94bGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi8gLy8gTmFpdGXripQgZXhwZWN07JmAIO2YuOydke2VmOuPhOuhnSBhbnnrpbwg7ZeI7Jqp7ZWoXG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyBjb25uZWN0IH0gZnJvbSBcIm5ldFwiO1xuaW1wb3J0IHsgdHlwZSBTb2NrZXQgfSBmcm9tIFwibmV0XCI7XG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSBcIm9zXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgZmluZEFwaVJvb3RQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIE5haXRlTWVzc2FnaW5nVHlwZXMgfSBmcm9tIFwiLi9tZXNzYWdpbmctdHlwZXNcIjtcblxuLyoqXG4gKiBzb25hbXUuY29uZmlnLnRzIOqyveuhnOulvCDrsJvslYTshJwg7ZSE66Gc7KCd7Yq467OEIOqzoOycoCDtlbTsi5zrpbwg7IOd7ISx7ZWp64uI64ukLlxuICog7J217Iqk7YWQ7IWY6rO8IOuPmeydvO2VnCDrsKnsi53snLzroZwg6rOE7IKw7ZW07JW8IO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZ2V0UHJvamVjdEhhc2goY29uZmlnUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyZWF0ZUhhc2goXCJtZDVcIikudXBkYXRlKGNvbmZpZ1BhdGgpLmRpZ2VzdChcImhleFwiKS5zbGljZSgwLCA4KTtcbn1cblxuLyoqXG4gKiDtmITsnqwg7ZSE66Gc7KCd7Yq47J2YIOyGjOy8kyDqsr3roZzrpbwg6rOE7IKw7ZWp64uI64ukLlxuICogU29uYW11LmFwaVJvb3RQYXRo6rCAIOyEpOygleuQnCDtm4Tsl5Ag7Zi47Lac7ZW07JW8IO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZ2V0U29ja2V0UGF0aCgpOiBzdHJpbmcge1xuICAvLyBzb25hbXUuY29uZmlnLnRz7J2YIOygiOuMgCDqsr3roZwg6rOE7IKwXG4gIC8vIGFwaVJvb3RQYXRo64qUIC9wcm9qZWN0L2FwaSDtmJXtg5zsnbTqs6AsIGNvbmZpZ+uKlCAvcHJvamVjdC9hcGkvc3JjL3NvbmFtdS5jb25maWcudHPsl5Ag7J6I7J2MXG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKGZpbmRBcGlSb290UGF0aCgpLCBcInNyY1wiLCBcInNvbmFtdS5jb25maWcudHNcIik7XG4gIGNvbnN0IGhhc2ggPSBnZXRQcm9qZWN0SGFzaChjb25maWdQYXRoKTtcblxuICByZXR1cm4gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiXG4gICAgPyBgXFxcXFxcXFwuXFxcXHBpcGVcXFxcbmFpdGUtJHtoYXNofWBcbiAgICA6IGpvaW4oaG9tZWRpcigpLCBcIi5zb25hbXVcIiwgYG5haXRlLSR7aGFzaH0uc29ja2ApO1xufVxuXG5jbGFzcyBOYWl0ZVJlcG9ydGVyQ2xhc3Mge1xuICBwcml2YXRlIHNvY2tldFBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNvY2tldDogU29ja2V0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XG4gIHByaXZhdGUgYnVmZmVyOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiDshozsvJMg7Jew6rKwIOyLnOuPhFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVDb25uZWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNvbm5lY3RlZCB8fCB0aGlzLnNvY2tldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHtcbiAgICAgIGlmICghdGhpcy5zb2NrZXRQYXRoKSB7XG4gICAgICAgIHRoaXMuc29ja2V0UGF0aCA9IGdldFNvY2tldFBhdGgoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc29ja2V0ID0gY29ubmVjdCh0aGlzLnNvY2tldFBhdGgpO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbihcImNvbm5lY3RcIiwgKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgIC8vIOuyhO2NvOyXkCDsjJPsnbgg66mU7Iuc7KeAIOyghOyGoVxuICAgICAgICBmb3IgKGNvbnN0IG1zZyBvZiB0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgIHRoaXMuc29ja2V0Py53cml0ZShtc2cpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVmZmVyID0gW107XG4gICAgICAgIHJlcygpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uKFwiZXJyb3JcIiwgKGUpID0+IHtcbiAgICAgICAgLy8g7Jew6rKwIOyLpO2MqCDrrLTsi5wgKGV4dGVuc2lvbuydtCDqurzsoLjsnojsnYQg7IiYIOyeiOydjClcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgICAgICByZWooZSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQub24oXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gbnVsbDtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOuplOyLnOyngCDsoITshqEgKOykhOuwlOq/iOycvOuhnCDqtazrtoQpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmQoZGF0YTogTmFpdGVNZXNzYWdpbmdUeXBlcy5OYWl0ZU1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtc2cgPSBgJHtKU09OLnN0cmluZ2lmeShkYXRhKX1cXG5gO1xuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVDb25uZWN0aW9uKCkuY2F0Y2goKF8pID0+IHt9KTtcblxuICAgIGlmICh0aGlzLmNvbm5lY3RlZCAmJiB0aGlzLnNvY2tldCkge1xuICAgICAgdGhpcy5zb2NrZXQud3JpdGUobXNnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g7Jew6rKwIOuMgOq4sCDspJHsnbTrqbQg67KE7Y287JeQIOyggOyepVxuICAgICAgdGhpcy5idWZmZXIucHVzaChtc2cpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiZWZvcmVBbGzsl5DshJwg7Zi47Lac7ZWp64uI64ukLlxuICAgKiDthYzsiqTtirggcnVuIOyLnOyekeydhCDslYzrpr3ri4jri6QgKOuNsOydtO2EsCDtgbTrpqzslrQg7Iug7Zi4KS5cbiAgICovXG4gIGFzeW5jIHN0YXJ0VGVzdFJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQ0kpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNlbmQoe1xuICAgICAgdHlwZTogXCJydW4vc3RhcnRcIixcbiAgICAgIHN0YXJ0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGFmdGVyRWFjaOyXkOyEnCDtmLjstpztlanri4jri6QuXG4gICAqIO2FjOyKpO2KuCDsvIDsnbTsiqQg6rKw6rO866W8IHRyYWNlc+yZgCDtlajqu5gg7KCE7Iah7ZWp64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVwb3J0VGVzdFJlc3VsdChcbiAgICByZXN1bHQ6IE9taXQ8TmFpdGVNZXNzYWdpbmdUeXBlcy5UZXN0UmVzdWx0LCBcInJlY2VpdmVkQXRcIj4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChwcm9jZXNzLmVudi5DSSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICB0eXBlOiBcInRlc3QvcmVzdWx0XCIsXG4gICAgICByZWNlaXZlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAuLi5yZXN1bHQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogYWZ0ZXJBbGzsl5DshJwg7Zi47Lac7ZWp64uI64ukLlxuICAgKiDthYzsiqTtirggcnVuIOyiheujjOulvCDslYzrpr3ri4jri6QuXG4gICAqL1xuICBhc3luYyBlbmRUZXN0UnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChwcm9jZXNzLmVudi5DSSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICB0eXBlOiBcInJ1bi9lbmRcIixcbiAgICAgIGVuZGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9KTtcblxuICAgIC8vIOyXsOqysCDsooXro4xcbiAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgIHRoaXMuc29ja2V0LmVuZCgpO1xuICAgICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IE5haXRlUmVwb3J0ZXIgPSBuZXcgTmFpdGVSZXBvcnRlckNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7V0FrQmdEOzs7OztBQU9oRCxTQUFTLGVBQWUsWUFBNEI7Q0FDbEQsT0FBTyxXQUFXLEtBQUssQ0FBQyxDQUFDLE9BQU8sVUFBVSxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztBQUN0RTs7Ozs7QUFNQSxTQUFTLGdCQUF3QjtDQUkvQixNQUFNLE9BQU8sZUFETSxLQUFLLGdCQUFnQixHQUFHLE9BQU8sa0JBQ3RCLENBQVU7Q0FFdEMsT0FBTyxRQUFRLGFBQWEsVUFDeEIsc0JBQXNCLFNBQ3RCLEtBQUssUUFBUSxHQUFHLFdBQVcsU0FBUyxLQUFLLE1BQU07QUFDckQ7QUFFQSxJQUFNLHFCQUFOLE1BQXlCO0NBQ3ZCLGFBQW9DO0NBQ3BDLFNBQWdDO0NBQ2hDLFlBQW9CO0NBQ3BCLFNBQTJCLENBQUM7Ozs7Q0FLNUIsTUFBYyxtQkFBa0M7RUFDOUMsSUFBSSxLQUFLLGFBQWEsS0FBSyxRQUN6QjtFQUdGLE9BQU8sSUFBSSxTQUFTLEtBQUssUUFBUTtHQUMvQixJQUFJLENBQUMsS0FBSyxZQUNSLEtBQUssYUFBYSxjQUFjO0dBRWxDLEtBQUssU0FBUyxRQUFRLEtBQUssVUFBVTtHQUVyQyxLQUFLLE9BQU8sR0FBRyxpQkFBaUI7SUFDOUIsS0FBSyxZQUFZO0lBRWpCLEtBQUssTUFBTSxPQUFPLEtBQUssUUFDckIsS0FBSyxRQUFRLE1BQU0sR0FBRztJQUV4QixLQUFLLFNBQVMsQ0FBQztJQUNmLElBQUk7R0FDTixDQUFDO0dBRUQsS0FBSyxPQUFPLEdBQUcsVUFBVSxNQUFNO0lBRTdCLEtBQUssWUFBWTtJQUNqQixLQUFLLFNBQVM7SUFDZCxJQUFJLENBQUM7R0FDUCxDQUFDO0dBRUQsS0FBSyxPQUFPLEdBQUcsZUFBZTtJQUM1QixLQUFLLFlBQVk7SUFDakIsS0FBSyxTQUFTO0dBQ2hCLENBQUM7RUFDSCxDQUFDO0NBQ0g7Ozs7Q0FLQSxNQUFjLEtBQUssTUFBdUQ7RUFDeEUsTUFBTSxNQUFNLEdBQUcsS0FBSyxVQUFVLElBQUksRUFBRTtFQUVwQyxNQUFNLEtBQUssaUJBQWlCLENBQUMsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxDQUFDO0VBRTdDLElBQUksS0FBSyxhQUFhLEtBQUssUUFDekIsS0FBSyxPQUFPLE1BQU0sR0FBRztPQUdyQixLQUFLLE9BQU8sS0FBSyxHQUFHO0NBRXhCOzs7OztDQU1BLE1BQU0sZUFBOEI7RUFDbEMsSUFBSSxRQUFRLElBQUksSUFDZDtFQUdGLE1BQU0sS0FBSyxLQUFLO0dBQ2QsTUFBTTtHQUNOLDRCQUFXLElBQUksS0FBSyxFQUFDLENBQUMsWUFBWTtFQUNwQyxDQUFDO0NBQ0g7Ozs7O0NBTUEsTUFBTSxpQkFDSixRQUNlO0VBQ2YsSUFBSSxRQUFRLElBQUksSUFDZDtFQUdGLE1BQU0sS0FBSyxLQUFLO0dBQ2QsTUFBTTtHQUNOLDZCQUFZLElBQUksS0FBSyxFQUFDLENBQUMsWUFBWTtHQUNuQyxHQUFHO0VBQ0wsQ0FBQztDQUNIOzs7OztDQU1BLE1BQU0sYUFBNEI7RUFDaEMsSUFBSSxRQUFRLElBQUksSUFDZDtFQUdGLE1BQU0sS0FBSyxLQUFLO0dBQ2QsTUFBTTtHQUNOLDBCQUFTLElBQUksS0FBSyxFQUFDLENBQUMsWUFBWTtFQUNsQyxDQUFDO0VBR0QsSUFBSSxLQUFLLFFBQVE7R0FDZixLQUFLLE9BQU8sSUFBSTtHQUNoQixLQUFLLFNBQVM7R0FDZCxLQUFLLFlBQVk7RUFDbkI7Q0FDRjtBQUNGO0FBRUEsTUFBYSxnQkFBZ0IsSUFBSSxtQkFBbUIifQ==