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
@@ -3,7 +3,6 @@ import { getZodObjectFromApi, init_code_converters } from "../../api/code-conver
3
3
  import { Template, init_template } from "../template.js";
4
4
  import { z as z$1 } from "zod";
5
5
  import qs from "qs";
6
-
7
6
  //#region src/template/implementations/generated_http.template.ts
8
7
  init_code_converters();
9
8
  init_sonamu();
@@ -24,17 +23,14 @@ var Template__generated_http = class extends Template {
24
23
  const lines = await Promise.all(apis.map(async (api) => {
25
24
  const reqObject = this.resolveApiParams(api, types);
26
25
  const dataLines = await (async () => {
27
- if ((api.options.httpMethod ?? "GET") === "GET") {
28
- return {
29
- querystring: [qs.stringify(reqObject, { encode: false }).split("&").join("\n &")],
30
- body: []
31
- };
32
- } else {
33
- return {
34
- querystring: [],
35
- body: ["", JSON.stringify(reqObject, null, 2)]
36
- };
37
- }
26
+ if ((api.options.httpMethod ?? "GET") === "GET") return {
27
+ querystring: [qs.stringify(reqObject, { encode: false }).split("&").join("\n &")],
28
+ body: []
29
+ };
30
+ else return {
31
+ querystring: [],
32
+ body: ["", JSON.stringify(reqObject, null, 2)]
33
+ };
38
34
  })();
39
35
  return [
40
36
  [`${api.options.httpMethod ?? "GET"} {{baseUrl}}${prefix}${api.path}`, ...dataLines.querystring].join("\n ?"),
@@ -50,67 +46,44 @@ var Template__generated_http = class extends Template {
50
46
  };
51
47
  }
52
48
  zodTypeToReqDefault(zodType, name) {
53
- if (zodType instanceof z$1.ZodObject) {
54
- return Object.fromEntries(Object.keys(zodType.shape).map((key) => [key, this.zodTypeToReqDefault(zodType.shape[key], key)]));
55
- } else if (zodType instanceof z$1.ZodArray) {
56
- return [this.zodTypeToReqDefault(zodType.element, name)];
57
- } else if (zodType instanceof z$1.core.$ZodString) {
58
- if (name.endsWith("_at") || name.endsWith("_date") || name === "range") {
59
- return "2000-01-01";
60
- } else {
61
- return name.toUpperCase();
62
- }
63
- } else if (zodType instanceof z$1.ZodNumber) {
64
- if (name === "num") {
65
- return 24;
66
- }
49
+ if (zodType instanceof z$1.ZodObject) return Object.fromEntries(Object.keys(zodType.shape).map((key) => [key, this.zodTypeToReqDefault(zodType.shape[key], key)]));
50
+ else if (zodType instanceof z$1.ZodArray) return [this.zodTypeToReqDefault(zodType.element, name)];
51
+ else if (zodType instanceof z$1.core.$ZodString) if (name.endsWith("_at") || name.endsWith("_date") || name === "range") return "2000-01-01";
52
+ else return name.toUpperCase();
53
+ else if (zodType instanceof z$1.ZodNumber) {
54
+ if (name === "num") return 24;
67
55
  const minValue = zodType.minValue ?? 0;
68
56
  return minValue > Number.MIN_SAFE_INTEGER ? minValue : 0;
69
- } else if (zodType instanceof z$1.ZodBoolean) {
70
- return false;
71
- } else if (zodType instanceof z$1.ZodEnum) {
72
- return zodType.options[0];
73
- } else if (zodType instanceof z$1.ZodOptional) {
74
- return this.zodTypeToReqDefault(zodType.def.innerType, name);
75
- } else if (zodType instanceof z$1.ZodNullable) {
76
- return null;
77
- } else if (zodType instanceof z$1.ZodUnion) {
78
- return this.zodTypeToReqDefault(zodType.def.options[0], name);
79
- } else if (zodType instanceof z$1.ZodUnknown) {
80
- return "unknown";
81
- } else if (zodType instanceof z$1.ZodTuple) {
82
- return zodType.def.items.map((item) => this.zodTypeToReqDefault(item, name));
83
- } else if (zodType instanceof z$1.ZodDate) {
84
- return "2000-01-01";
85
- } else if (zodType instanceof z$1.ZodLiteral) {
86
- return zodType.value;
87
- } else if (zodType instanceof z$1.ZodRecord || zodType instanceof z$1.ZodMap) {
57
+ } else if (zodType instanceof z$1.ZodBoolean) return false;
58
+ else if (zodType instanceof z$1.ZodEnum) return zodType.options[0];
59
+ else if (zodType instanceof z$1.ZodOptional) return this.zodTypeToReqDefault(zodType.def.innerType, name);
60
+ else if (zodType instanceof z$1.ZodNullable) return null;
61
+ else if (zodType instanceof z$1.ZodUnion) return this.zodTypeToReqDefault(zodType.def.options[0], name);
62
+ else if (zodType instanceof z$1.ZodUnknown) return "unknown";
63
+ else if (zodType instanceof z$1.ZodTuple) return zodType.def.items.map((item) => this.zodTypeToReqDefault(item, name));
64
+ else if (zodType instanceof z$1.ZodDate) return "2000-01-01";
65
+ else if (zodType instanceof z$1.ZodLiteral) return zodType.value;
66
+ else if (zodType instanceof z$1.ZodRecord || zodType instanceof z$1.ZodMap) {
88
67
  const kvDef = zodType.def;
89
68
  const key = this.zodTypeToReqDefault(kvDef.keyType, name);
90
69
  const value = this.zodTypeToReqDefault(kvDef.valueType, name);
91
70
  return { [key]: value };
92
- } else if (zodType instanceof z$1.ZodSet) {
93
- return [this.zodTypeToReqDefault(zodType.def.valueType, name)];
94
- } else if (zodType instanceof z$1.ZodIntersection) {
95
- return this.zodTypeToReqDefault(zodType.def.right, name);
96
- } else if (zodType instanceof z$1.ZodDefault) {
97
- return this.zodTypeToReqDefault(zodType.def.innerType, name);
98
- } else {
99
- return `unknown-${zodType.type}`;
100
- }
71
+ } else if (zodType instanceof z$1.ZodSet) return [this.zodTypeToReqDefault(zodType.def.valueType, name)];
72
+ else if (zodType instanceof z$1.ZodIntersection) return this.zodTypeToReqDefault(zodType.def.right, name);
73
+ else if (zodType instanceof z$1.ZodDefault) return this.zodTypeToReqDefault(zodType.def.innerType, name);
74
+ else return `unknown-${zodType.type}`;
101
75
  }
102
76
  resolveApiParams(api, references) {
103
77
  const reqType = getZodObjectFromApi(api, references);
104
78
  try {
105
- const def = this.zodTypeToReqDefault(reqType, "unknownName");
106
- return def;
79
+ return this.zodTypeToReqDefault(reqType, "unknownName");
107
80
  } catch (error) {
108
81
  console.error(error);
109
82
  throw new Error(`Invalid zod type detected on ${api.modelName}:${api.methodName}`, { cause: error });
110
83
  }
111
84
  }
112
85
  };
113
-
114
86
  //#endregion
115
87
  export { Template__generated_http };
116
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVkX2h0dHAudGVtcGxhdGUuanMiLCJuYW1lcyI6WyJ6Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlbXBsYXRlL2ltcGxlbWVudGF0aW9ucy9nZW5lcmF0ZWRfaHR0cC50ZW1wbGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcXMgZnJvbSBcInFzXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBnZXRab2RPYmplY3RGcm9tQXBpIH0gZnJvbSBcIi4uLy4uL2FwaS9jb2RlLWNvbnZlcnRlcnNcIjtcbmltcG9ydCB7IHR5cGUgRXh0ZW5kZWRBcGkgfSBmcm9tIFwiLi4vLi4vYXBpL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi8uLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVfX2dlbmVyYXRlZF9odHRwIGV4dGVuZHMgVGVtcGxhdGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcImdlbmVyYXRlZF9odHRwXCIpO1xuICB9XG5cbiAgZ2V0VGFyZ2V0QW5kUGF0aCgpIHtcbiAgICBjb25zdCB7IGRpciB9ID0gU29uYW11LmNvbmZpZy5hcGk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiBgJHtkaXJ9L3NyYy9hcHBsaWNhdGlvbmAsXG4gICAgICBwYXRoOiBgc29uYW11LmdlbmVyYXRlZC5odHRwYCxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHN5bmNlcjogeyB0eXBlcywgYXBpcyB9LFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGFwaToge1xuICAgICAgICAgIHJvdXRlOiB7IHByZWZpeCB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9ID0gU29uYW11O1xuXG4gICAgY29uc3QgbGluZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGFwaXMubWFwKGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgY29uc3QgcmVxT2JqZWN0ID0gdGhpcy5yZXNvbHZlQXBpUGFyYW1zKGFwaSwgdHlwZXMpO1xuXG4gICAgICAgIGNvbnN0IGRhdGFMaW5lcyA9IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKChhcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCIpID09PSBcIkdFVFwiKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBxdWVyeXN0cmluZzogW3FzLnN0cmluZ2lmeShyZXFPYmplY3QsIHsgZW5jb2RlOiBmYWxzZSB9KS5zcGxpdChcIiZcIikuam9pbihcIlxcblxcdCZcIildLFxuICAgICAgICAgICAgICBib2R5OiBbXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHF1ZXJ5c3RyaW5nOiBbXSxcbiAgICAgICAgICAgICAgYm9keTogW1wiXCIsIEpTT04uc3RyaW5naWZ5KHJlcU9iamVjdCwgbnVsbCwgMildLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBbXG4gICAgICAgICAgICBgJHthcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCJ9IHt7YmFzZVVybH19JHtwcmVmaXh9JHthcGkucGF0aH1gLFxuICAgICAgICAgICAgLi4uZGF0YUxpbmVzLnF1ZXJ5c3RyaW5nLFxuICAgICAgICAgIF0uam9pbihcIlxcblxcdD9cIiksXG4gICAgICAgICAgYENvbnRlbnQtVHlwZTogJHthcGkub3B0aW9ucy5jb250ZW50VHlwZSA/PyBcImFwcGxpY2F0aW9uL2pzb25cIn1gLFxuICAgICAgICAgIC4uLmRhdGFMaW5lcy5ib2R5LFxuICAgICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZ2V0VGFyZ2V0QW5kUGF0aCgpLFxuICAgICAgYm9keTogbGluZXMuam9pbihcIlxcblxcbiMjI1xcblxcblwiKSxcbiAgICAgIGltcG9ydEtleXM6IFtdLFxuICAgICAgY3VzdG9tSGVhZGVyczogW1wiIyBAZ2VuZXJhdGVkXCIsIFwiIyDsp4HsoJEg7IiY7KCV7ZWY7KeAIOuniOyEuOyalC5cIl0sXG4gICAgfTtcbiAgfVxuXG4gIHpvZFR5cGVUb1JlcURlZmF1bHQoem9kVHlwZTogei5ab2RUeXBlLCBuYW1lOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kT2JqZWN0KSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3Qua2V5cyh6b2RUeXBlLnNoYXBlKS5tYXAoKGtleSkgPT4gW1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICB0aGlzLnpvZFR5cGVUb1JlcURlZmF1bHQoem9kVHlwZS5zaGFwZVtrZXldLCBrZXkpLFxuICAgICAgICBdKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RBcnJheSkge1xuICAgICAgcmV0dXJuIFt0aGlzLnpvZFR5cGVUb1JlcURlZmF1bHQoKHpvZFR5cGUgYXMgei5ab2RBcnJheTx6LlpvZFR5cGU+KS5lbGVtZW50LCBuYW1lKV07XG4gICAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5jb3JlLiRab2RTdHJpbmcpIHtcbiAgICAgIC8vIE5PVEU6IHouWm9kU3RyaW5n7Jy866GcIOu5hOq1kO2VmOuptCB6LnVybCgpLCB6LmVtYWlsKCkg65Ox7J2YIO2DgOyeheyXkOyEnCDrrLjsoJzqsIAg7IOd6riw66+A66GcIHouY29yZS4kWm9kU3RyaW5n7Jy866GcIOu5hOq1kO2VqFxuICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoXCJfYXRcIikgfHwgbmFtZS5lbmRzV2l0aChcIl9kYXRlXCIpIHx8IG5hbWUgPT09IFwicmFuZ2VcIikge1xuICAgICAgICByZXR1cm4gXCIyMDAwLTAxLTAxXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVtYmVyKSB7XG4gICAgICBpZiAobmFtZSA9PT0gXCJudW1cIikge1xuICAgICAgICByZXR1cm4gMjQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1pblZhbHVlID0gem9kVHlwZS5taW5WYWx1ZSA/PyAwO1xuICAgICAgcmV0dXJuIG1pblZhbHVlID4gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIgPyBtaW5WYWx1ZSA6IDA7XG4gICAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RCb29sZWFuKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RFbnVtKSB7XG4gICAgICByZXR1cm4gem9kVHlwZS5vcHRpb25zWzBdO1xuICAgIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kT3B0aW9uYWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnpvZFR5cGVUb1JlcURlZmF1bHQoKHpvZFR5cGUgYXMgei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+KS5kZWYuaW5uZXJUeXBlLCBuYW1lKTtcbiAgICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bGxhYmxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFVuaW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy56b2RUeXBlVG9SZXFEZWZhdWx0KCh6b2RUeXBlIGFzIHouWm9kVW5pb248ei5ab2RUeXBlW10+KS5kZWYub3B0aW9uc1swXSwgbmFtZSk7XG4gICAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmtub3duKSB7XG4gICAgICByZXR1cm4gXCJ1bmtub3duXCI7XG4gICAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RUdXBsZSkge1xuICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0gWm9kVHVwbGUg7YOA7J6FIOyCrOyaqVxuICAgICAgcmV0dXJuIHpvZFR5cGUuZGVmLml0ZW1zLm1hcCgoaXRlbTogYW55KSA9PiB0aGlzLnpvZFR5cGVUb1JlcURlZmF1bHQoaXRlbSwgbmFtZSkpO1xuICAgIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRGF0ZSkge1xuICAgICAgcmV0dXJuIFwiMjAwMC0wMS0wMVwiO1xuICAgIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTGl0ZXJhbCkge1xuICAgICAgcmV0dXJuIHpvZFR5cGUudmFsdWU7XG4gICAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RSZWNvcmQgfHwgem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTWFwKSB7XG4gICAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSBab2RSZWNvcmQg7YOA7J6FIOyCrOyaqVxuICAgICAgY29uc3Qga3ZEZWYgPSAoem9kVHlwZSBhcyB6LlpvZFJlY29yZDxhbnksIHouWm9kVHlwZT4gfCB6LlpvZE1hcDx6LlpvZFR5cGUsIHouWm9kVHlwZT4pLmRlZjtcbiAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55IC0tIFpvZEludGVyc2VjdGlvbiDtg4DsnoUg7IKs7JqpXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLnpvZFR5cGVUb1JlcURlZmF1bHQoa3ZEZWYua2V5VHlwZSwgbmFtZSkgYXMgYW55O1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnpvZFR5cGVUb1JlcURlZmF1bHQoa3ZEZWYudmFsdWVUeXBlLCBuYW1lKTtcbiAgICAgIHJldHVybiB7IFtrZXldOiB2YWx1ZSB9O1xuICAgIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kU2V0KSB7XG4gICAgICByZXR1cm4gW3RoaXMuem9kVHlwZVRvUmVxRGVmYXVsdCgoem9kVHlwZSBhcyB6LlpvZFNldDx6LlpvZFR5cGU+KS5kZWYudmFsdWVUeXBlLCBuYW1lKV07XG4gICAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RJbnRlcnNlY3Rpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnpvZFR5cGVUb1JlcURlZmF1bHQoXG4gICAgICAgICh6b2RUeXBlIGFzIHouWm9kSW50ZXJzZWN0aW9uPHouWm9kVHlwZSwgei5ab2RUeXBlPikuZGVmLnJpZ2h0LFxuICAgICAgICBuYW1lLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZERlZmF1bHQpIHtcbiAgICAgIHJldHVybiB0aGlzLnpvZFR5cGVUb1JlcURlZmF1bHQoKHpvZFR5cGUgYXMgei5ab2REZWZhdWx0PHouWm9kVHlwZT4pLmRlZi5pbm5lclR5cGUsIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyh6b2RUeXBlKTtcbiAgICAgIHJldHVybiBgdW5rbm93bi0ke3pvZFR5cGUudHlwZX1gO1xuICAgIH1cbiAgfVxuXG4gIHJlc29sdmVBcGlQYXJhbXMoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICByZWZlcmVuY2VzOiB7IFt0eXBlTmFtZTogc3RyaW5nXTogei5ab2RUeXBlIH0sXG4gICk6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9IHtcbiAgICBjb25zdCByZXFUeXBlID0gZ2V0Wm9kT2JqZWN0RnJvbUFwaShhcGksIHJlZmVyZW5jZXMpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZWYgPSB0aGlzLnpvZFR5cGVUb1JlcURlZmF1bHQocmVxVHlwZSwgXCJ1bmtub3duTmFtZVwiKSBhcyB7XG4gICAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gICAgICB9O1xuICAgICAgcmV0dXJuIGRlZjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgem9kIHR5cGUgZGV0ZWN0ZWQgb24gJHthcGkubW9kZWxOYW1lfToke2FwaS5tZXRob2ROYW1lfWAsIHtcbiAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7c0JBR2dFO2FBRXRCO2VBQ0g7QUFFdkMsSUFBYSwyQkFBYixjQUE4QyxTQUFTO0NBQ3JELGNBQWM7QUFDWixRQUFNLGlCQUFpQjs7Q0FHekIsbUJBQW1CO0VBQ2pCLE1BQU0sRUFBRSxRQUFRLE9BQU8sT0FBTztBQUU5QixTQUFPO0dBQ0wsUUFBUSxHQUFHLElBQUk7R0FDZixNQUFNO0dBQ1A7O0NBR0gsTUFBTSxTQUFTO0VBQ2IsTUFBTSxFQUNKLFFBQVEsRUFBRSxPQUFPLFFBQ2pCLFFBQVEsRUFDTixLQUFLLEVBQ0gsT0FBTyxFQUFFLGlCQUdYO0VBRUosTUFBTSxRQUFRLE1BQU0sUUFBUSxJQUMxQixLQUFLLElBQUksT0FBTyxRQUFRO0dBQ3RCLE1BQU0sWUFBWSxLQUFLLGlCQUFpQixLQUFLLE1BQU07R0FFbkQsTUFBTSxZQUFZLE9BQU8sWUFBWTtBQUNuQyxTQUFLLElBQUksUUFBUSxjQUFjLFdBQVcsT0FBTztBQUMvQyxZQUFPO01BQ0wsYUFBYSxDQUFDLEdBQUcsVUFBVSxXQUFXLEVBQUUsUUFBUSxPQUFPLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLE9BQVEsQ0FBQztNQUNsRixNQUFNLEVBQUU7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
88
+
89
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVkX2h0dHAudGVtcGxhdGUuanMiLCJuYW1lcyI6WyJ6Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlbXBsYXRlL2ltcGxlbWVudGF0aW9ucy9nZW5lcmF0ZWRfaHR0cC50ZW1wbGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcXMgZnJvbSBcInFzXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBnZXRab2RPYmplY3RGcm9tQXBpIH0gZnJvbSBcIi4uLy4uL2FwaS9jb2RlLWNvbnZlcnRlcnNcIjtcbmltcG9ydCB7IHR5cGUgRXh0ZW5kZWRBcGkgfSBmcm9tIFwiLi4vLi4vYXBpL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi8uLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVfX2dlbmVyYXRlZF9odHRwIGV4dGVuZHMgVGVtcGxhdGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcImdlbmVyYXRlZF9odHRwXCIpO1xuICB9XG5cbiAgZ2V0VGFyZ2V0QW5kUGF0aCgpIHtcbiAgICBjb25zdCB7IGRpciB9ID0gU29uYW11LmNvbmZpZy5hcGk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiBgJHtkaXJ9L3NyYy9hcHBsaWNhdGlvbmAsXG4gICAgICBwYXRoOiBgc29uYW11LmdlbmVyYXRlZC5odHRwYCxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHN5bmNlcjogeyB0eXBlcywgYXBpcyB9LFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGFwaToge1xuICAgICAgICAgIHJvdXRlOiB7IHByZWZpeCB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9ID0gU29uYW11O1xuXG4gICAgY29uc3QgbGluZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGFwaXMubWFwKGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgY29uc3QgcmVxT2JqZWN0ID0gdGhpcy5yZXNvbHZlQXBpUGFyYW1zKGFwaSwgdHlwZXMpO1xuXG4gICAgICAgIGNvbnN0IGRhdGFMaW5lcyA9IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKChhcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCIpID09PSBcIkdFVFwiKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBxdWVyeXN0cmluZzogW3FzLnN0cmluZ2lmeShyZXFPYmplY3QsIHsgZW5jb2RlOiBmYWxzZSB9KS5zcGxpdChcIiZcIikuam9pbihcIlxcblxcdCZcIildLFxuICAgICAgICAgICAgICBib2R5OiBbXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHF1ZXJ5c3RyaW5nOiBbXSxcbiAgICAgICAgICAgICAgYm9keTogW1wiXCIsIEpTT04uc3RyaW5naWZ5KHJlcU9iamVjdCwgbnVsbCwgMildLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBbXG4gICAgICAgICAgICBgJHthcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCJ9IHt7YmFzZVVybH19JHtwcmVmaXh9JHthcGkucGF0aH1gLFxuICAgICAgICAgICAgLi4uZGF0YUxpbmVzLnF1ZXJ5c3RyaW5nLFxuICAgICAgICAgIF0uam9pbihcIlxcblxcdD9cIiksXG4gICAgICAgICAgYENvbnRlbnQtVHlwZTogJHthcGkub3B0aW9ucy5jb250ZW50VHlwZSA/PyBcImFwcGxpY2F0aW9uL2pzb25cIn1gLFxuICAgICAgICAgIC4uLmRhdGFMaW5lcy5ib2R5LFxuICAgICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZ2V0VGFyZ2V0QW5kUGF0aCgpLFxuICAgICAgYm9keTogbGluZXMuam9pbihcIlxcblxcbiMjI1xcblxcblwiKSxcbiAgICAgIGltcG9ydEtleXM6IFtdLFxuICAgICAgY3VzdG9tSGVhZGVyczogW1wiIyBAZ2VuZXJhdGVkXCIsIFwiIyDsp4HsoJEg7IiY7KCV7ZWY7KeAIOuniOyEuOyalC5cIl0sXG4gICAgfTtcbiAgfVxuXG4gIHpvZFR5cGVUb1JlcURlZmF1bHQoem9kVHlwZTogei5ab2RUeXBlLCBuYW1lOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kT2JqZWN0KSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3Qua2V5cyh6b2RUeXBlLnNoYXBlKS5tYXAoKGtleSkgPT4gW1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICB0aGlzLnpvZFR5cGVUb1JlcURlZmF1bHQoem9kVHlwZS5zaGFwZVtrZXldLCBrZXkpLFxuICAgICAgICBdKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RBcnJheSkge1xuICAgICAgcmV0dXJuIFt0aGlzLnpvZFR5cGVUb1JlcURlZmF1bHQoKHpvZFR5cGUgYXMgei5ab2RBcnJheTx6LlpvZFR5cGU+KS5lbGVtZW50LCBuYW1lKV07XG4gICAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5jb3JlLiRab2RTdHJpbmcpIHtcbiAgICAgIC8vIE5PVEU6IHouWm9kU3RyaW5n7Jy866GcIOu5hOq1kO2VmOuptCB6LnVybCgpLCB6LmVtYWlsKCkg65Ox7J2YIO2DgOyeheyXkOyEnCDrrLjsoJzqsIAg7IOd6riw66+A66GcIHouY29yZS4kWm9kU3RyaW5n7Jy866GcIOu5hOq1kO2VqFxuICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoXCJfYXRcIikgfHwgbmFtZS5lbmRzV2l0aChcIl9kYXRlXCIpIHx8IG5hbWUgPT09IFwicmFuZ2VcIikge1xuICAgICAgICByZXR1cm4gXCIyMDAwLTAxLTAxXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVtYmVyKSB7XG4gICAgICBpZiAobmFtZSA9PT0gXCJudW1cIikge1xuICAgICAgICByZXR1cm4gMjQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1pblZhbHVlID0gem9kVHlwZS5taW5WYWx1ZSA/PyAwO1xuICAgICAgcmV0dXJuIG1pblZhbHVlID4gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIgPyBtaW5WYWx1ZSA6IDA7XG4gICAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RCb29sZWFuKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RFbnVtKSB7XG4gICAgICByZXR1cm4gem9kVHlwZS5vcHRpb25zWzBdO1xuICAgIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kT3B0aW9uYWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnpvZFR5cGVUb1JlcURlZmF1bHQoKHpvZFR5cGUgYXMgei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+KS5kZWYuaW5uZXJUeXBlLCBuYW1lKTtcbiAgICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bGxhYmxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFVuaW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy56b2RUeXBlVG9SZXFEZWZhdWx0KCh6b2RUeXBlIGFzIHouWm9kVW5pb248ei5ab2RUeXBlW10+KS5kZWYub3B0aW9uc1swXSwgbmFtZSk7XG4gICAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmtub3duKSB7XG4gICAgICByZXR1cm4gXCJ1bmtub3duXCI7XG4gICAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RUdXBsZSkge1xuICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0gWm9kVHVwbGUg7YOA7J6FIOyCrOyaqVxuICAgICAgcmV0dXJuIHpvZFR5cGUuZGVmLml0ZW1zLm1hcCgoaXRlbTogYW55KSA9PiB0aGlzLnpvZFR5cGVUb1JlcURlZmF1bHQoaXRlbSwgbmFtZSkpO1xuICAgIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRGF0ZSkge1xuICAgICAgcmV0dXJuIFwiMjAwMC0wMS0wMVwiO1xuICAgIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTGl0ZXJhbCkge1xuICAgICAgcmV0dXJuIHpvZFR5cGUudmFsdWU7XG4gICAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RSZWNvcmQgfHwgem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTWFwKSB7XG4gICAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSBab2RSZWNvcmQg7YOA7J6FIOyCrOyaqVxuICAgICAgY29uc3Qga3ZEZWYgPSAoem9kVHlwZSBhcyB6LlpvZFJlY29yZDxhbnksIHouWm9kVHlwZT4gfCB6LlpvZE1hcDx6LlpvZFR5cGUsIHouWm9kVHlwZT4pLmRlZjtcbiAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55IC0tIFpvZEludGVyc2VjdGlvbiDtg4DsnoUg7IKs7JqpXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLnpvZFR5cGVUb1JlcURlZmF1bHQoa3ZEZWYua2V5VHlwZSwgbmFtZSkgYXMgYW55O1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnpvZFR5cGVUb1JlcURlZmF1bHQoa3ZEZWYudmFsdWVUeXBlLCBuYW1lKTtcbiAgICAgIHJldHVybiB7IFtrZXldOiB2YWx1ZSB9O1xuICAgIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kU2V0KSB7XG4gICAgICByZXR1cm4gW3RoaXMuem9kVHlwZVRvUmVxRGVmYXVsdCgoem9kVHlwZSBhcyB6LlpvZFNldDx6LlpvZFR5cGU+KS5kZWYudmFsdWVUeXBlLCBuYW1lKV07XG4gICAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RJbnRlcnNlY3Rpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnpvZFR5cGVUb1JlcURlZmF1bHQoXG4gICAgICAgICh6b2RUeXBlIGFzIHouWm9kSW50ZXJzZWN0aW9uPHouWm9kVHlwZSwgei5ab2RUeXBlPikuZGVmLnJpZ2h0LFxuICAgICAgICBuYW1lLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZERlZmF1bHQpIHtcbiAgICAgIHJldHVybiB0aGlzLnpvZFR5cGVUb1JlcURlZmF1bHQoKHpvZFR5cGUgYXMgei5ab2REZWZhdWx0PHouWm9kVHlwZT4pLmRlZi5pbm5lclR5cGUsIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyh6b2RUeXBlKTtcbiAgICAgIHJldHVybiBgdW5rbm93bi0ke3pvZFR5cGUudHlwZX1gO1xuICAgIH1cbiAgfVxuXG4gIHJlc29sdmVBcGlQYXJhbXMoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICByZWZlcmVuY2VzOiB7IFt0eXBlTmFtZTogc3RyaW5nXTogei5ab2RUeXBlIH0sXG4gICk6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9IHtcbiAgICBjb25zdCByZXFUeXBlID0gZ2V0Wm9kT2JqZWN0RnJvbUFwaShhcGksIHJlZmVyZW5jZXMpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZWYgPSB0aGlzLnpvZFR5cGVUb1JlcURlZmF1bHQocmVxVHlwZSwgXCJ1bmtub3duTmFtZVwiKSBhcyB7XG4gICAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gICAgICB9O1xuICAgICAgcmV0dXJuIGRlZjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgem9kIHR5cGUgZGV0ZWN0ZWQgb24gJHthcGkubW9kZWxOYW1lfToke2FwaS5tZXRob2ROYW1lfWAsIHtcbiAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztxQkFHK0Q7WUFFdEI7Y0FDSDtBQUV0QyxJQUFhLDJCQUFiLGNBQThDLFNBQVM7Q0FDckQsY0FBYztFQUNaLE1BQU0sZ0JBQWdCO0NBQ3hCO0NBRUEsbUJBQW1CO0VBQ2pCLE1BQU0sRUFBRSxRQUFRLE9BQU8sT0FBTztFQUU5QixPQUFPO0dBQ0wsUUFBUSxHQUFHLElBQUk7R0FDZixNQUFNO0VBQ1I7Q0FDRjtDQUVBLE1BQU0sU0FBUztFQUNiLE1BQU0sRUFDSixRQUFRLEVBQUUsT0FBTyxRQUNqQixRQUFRLEVBQ04sS0FBSyxFQUNILE9BQU8sRUFBRSxpQkFHWDtFQUVKLE1BQU0sUUFBUSxNQUFNLFFBQVEsSUFDMUIsS0FBSyxJQUFJLE9BQU8sUUFBUTtHQUN0QixNQUFNLFlBQVksS0FBSyxpQkFBaUIsS0FBSyxLQUFLO0dBRWxELE1BQU0sWUFBWSxPQUFPLFlBQVk7SUFDbkMsS0FBSyxJQUFJLFFBQVEsY0FBYyxXQUFXLE9BQ3hDLE9BQU87S0FDTCxhQUFhLENBQUMsR0FBRyxVQUFVLFdBQVcsRUFBRSxRQUFRLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLE1BQU8sQ0FBQztLQUNq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
@@ -6,7 +6,6 @@ import { Template, init_template } from "../template.js";
6
6
  import inflection from "inflection";
7
7
  import { unique } from "radashi";
8
8
  import assert from "assert";
9
-
10
9
  //#region src/template/implementations/generated_sso.template.ts
11
10
  init_api();
12
11
  init_entity_manager();
@@ -38,14 +37,12 @@ var Template__generated_sso = class extends Template {
38
37
  };
39
38
  }
40
39
  render() {
41
- const entityIds = EntityManager.getAllIds();
42
- const entities = entityIds.map((id) => EntityManager.get(id));
43
- const targetEntities = entities.filter((entity) => entity.parentId === undefined && Object.keys(entity.subsets).length > 0);
44
- const sourceCodes = targetEntities.flatMap((entity) => {
40
+ const entities = EntityManager.getAllIds().map((id) => EntityManager.get(id));
41
+ const sourceCodes = entities.filter((entity) => entity.parentId === void 0 && Object.keys(entity.subsets).length > 0).flatMap((entity) => {
45
42
  const subsetKeys = Object.keys(entity.subsets);
46
43
  const subsetKeyTypeName = `${entity.names.module}SubsetKey`;
47
44
  const entityCamelName = inflection.camelize(entity.id, true);
48
- const puriSubsetQuery = {
45
+ return [{
49
46
  label: `SubsetQuery: ${entity.id}`,
50
47
  lines: [
51
48
  `export const ${entityCamelName}SubsetQueries = {`,
@@ -56,8 +53,7 @@ var Template__generated_sso = class extends Template {
56
53
  ""
57
54
  ],
58
55
  importKeys: []
59
- };
60
- const puriLoaderQuery = {
56
+ }, {
61
57
  label: `LoaderQuery: ${entity.id}`,
62
58
  lines: [
63
59
  `export const ${entityCamelName}LoaderQueries = {`,
@@ -68,25 +64,16 @@ var Template__generated_sso = class extends Template {
68
64
  ""
69
65
  ],
70
66
  importKeys: [subsetKeyTypeName]
71
- };
72
- return [puriSubsetQuery, puriLoaderQuery];
67
+ }];
73
68
  });
74
69
  const fkTypeSourceCode = this.getForeignKeyTypeSourceCode(entities);
75
- if (fkTypeSourceCode) {
76
- sourceCodes.push(fkTypeSourceCode);
77
- }
70
+ if (fkTypeSourceCode) sourceCodes.push(fkTypeSourceCode);
78
71
  const dbSchemaSourceCode = this.getDatabaseSchemaSourceCode(entities);
79
- if (dbSchemaSourceCode) {
80
- sourceCodes.push(dbSchemaSourceCode);
81
- }
72
+ if (dbSchemaSourceCode) sourceCodes.push(dbSchemaSourceCode);
82
73
  const authUserTypeSourceCode = this.getAuthUserTypeSourceCode();
83
- if (authUserTypeSourceCode) {
84
- sourceCodes.push(authUserTypeSourceCode);
85
- }
74
+ if (authUserTypeSourceCode) sourceCodes.push(authUserTypeSourceCode);
86
75
  const sourceCode = sourceCodes.reduce((result, ts) => {
87
- if (ts === null) {
88
- return result;
89
- }
76
+ if (ts === null) return result;
90
77
  assert(result);
91
78
  return {
92
79
  lines: [
@@ -101,25 +88,20 @@ var Template__generated_sso = class extends Template {
101
88
  lines: [],
102
89
  importKeys: []
103
90
  });
104
- const body = sourceCode.lines.join("\n");
105
- const isUsingManyToManyBaseSchema = body.includes("ManyToManyBaseSchema");
106
- const sonamuImports = [
107
- "PuriWrapper",
108
- "DatabaseSchemaExtend",
109
- "PuriLoaderQueries",
110
- isUsingManyToManyBaseSchema ? "ManyToManyBaseSchema" : ""
111
- ].filter(Boolean).join(", ");
112
91
  const customHeaders = [
113
92
  "/**",
114
93
  " * @generated",
115
94
  " * 직접 수정하지 마세요.",
116
95
  " */",
117
96
  "",
118
- `import { ${sonamuImports} } from "sonamu";`
97
+ `import { ${[
98
+ "PuriWrapper",
99
+ "DatabaseSchemaExtend",
100
+ "PuriLoaderQueries",
101
+ sourceCode.lines.join("\n").includes("ManyToManyBaseSchema") ? "ManyToManyBaseSchema" : ""
102
+ ].filter(Boolean).join(", ")} } from "sonamu";`
119
103
  ];
120
- if (this.hasAuthConfig()) {
121
- customHeaders.push(`import type { User } from "better-auth";`);
122
- }
104
+ if (this.hasAuthConfig()) customHeaders.push(`import type { User } from "better-auth";`);
123
105
  return {
124
106
  ...this.getTargetAndPath(),
125
107
  body: sourceCode.lines.join("\n"),
@@ -128,9 +110,7 @@ var Template__generated_sso = class extends Template {
128
110
  };
129
111
  }
130
112
  getDatabaseSchemaSourceCode(entities) {
131
- if (entities.length === 0) {
132
- return null;
133
- }
113
+ if (entities.length === 0) return null;
134
114
  const entitySchemaLines = entities.map((entity) => `${entity.table}: ${entity.id}BaseSchema;`);
135
115
  const joinTables = unique(entities.flatMap((entity) => entity.props.filter(isManyToManyRelationProp).map((prop) => {
136
116
  const fromTableKey = inflection.singularize(entity.table);
@@ -144,12 +124,9 @@ var Template__generated_sso = class extends Template {
144
124
  toEntityId: toEntity.id
145
125
  };
146
126
  })), (joinTable) => joinTable.table);
147
- const entitiesWithFk = entities.filter((entity) => this.getForeignKeyColumns(entity).length > 0);
148
- const fkMetadataLines = entitiesWithFk.map((entity) => `${entity.table}: ${entity.id}ForeignKeys;`);
127
+ const fkMetadataLines = entities.filter((entity) => this.getForeignKeyColumns(entity).length > 0).map((entity) => `${entity.table}: ${entity.id}ForeignKeys;`);
149
128
  const contextExtendLines = [];
150
- if (this.hasAuthConfig()) {
151
- contextExtendLines.push(``, ` export interface ContextExtend {`, ` user: SonamuUser | null;`, ` }`);
152
- }
129
+ if (this.hasAuthConfig()) contextExtendLines.push(``, ` export interface ContextExtend {`, ` user: SonamuUser | null;`, ` }`);
153
130
  return {
154
131
  label: `DatabaseSchema`,
155
132
  lines: [
@@ -176,31 +153,21 @@ var Template__generated_sso = class extends Template {
176
153
  }
177
154
  getForeignKeyColumns(entity) {
178
155
  return entity.props.filter((prop) => {
179
- if (isBelongsToOneRelationProp(prop)) {
180
- return true;
181
- }
182
- if (isOneToOneRelationProp(prop) && prop.hasJoinColumn) {
183
- return true;
184
- }
156
+ if (isBelongsToOneRelationProp(prop)) return true;
157
+ if (isOneToOneRelationProp(prop) && prop.hasJoinColumn) return true;
185
158
  return false;
186
159
  }).map((prop) => `${prop.name}_id`);
187
160
  }
188
161
  getForeignKeyTypeSourceCode(entities) {
189
- if (entities.length === 0) {
190
- return null;
191
- }
162
+ if (entities.length === 0) return null;
192
163
  const entitiesWithFk = entities.filter((entity) => this.getForeignKeyColumns(entity).length > 0);
193
- if (entitiesWithFk.length === 0) {
194
- return null;
195
- }
196
- const fkTypeLines = entitiesWithFk.map((entity) => {
197
- const fkColumns = this.getForeignKeyColumns(entity);
198
- const fkTypeValue = fkColumns.map((col) => `"${col}"`).join(" | ");
199
- return `export type ${entity.id}ForeignKeys = ${fkTypeValue};`;
200
- });
164
+ if (entitiesWithFk.length === 0) return null;
201
165
  return {
202
166
  label: `ForeignKey Types`,
203
- lines: fkTypeLines,
167
+ lines: entitiesWithFk.map((entity) => {
168
+ const fkTypeValue = this.getForeignKeyColumns(entity).map((col) => `"${col}"`).join(" | ");
169
+ return `export type ${entity.id}ForeignKeys = ${fkTypeValue};`;
170
+ }),
204
171
  importKeys: []
205
172
  };
206
173
  }
@@ -210,35 +177,28 @@ var Template__generated_sso = class extends Template {
210
177
  */
211
178
  getAuthUserTypeSourceCode() {
212
179
  const authConfig = Sonamu.config.server?.auth;
213
- if (!authConfig) {
214
- return null;
215
- }
180
+ if (!authConfig) return null;
216
181
  const additionalFields = authConfig?.user?.additionalFields;
217
- if (!additionalFields || Object.keys(additionalFields).length === 0) {
218
- return {
219
- label: "Auth User Type",
220
- lines: ["export type SonamuUser = User;"],
221
- importKeys: []
222
- };
223
- }
182
+ if (!additionalFields || Object.keys(additionalFields).length === 0) return {
183
+ label: "Auth User Type",
184
+ lines: ["export type SonamuUser = User;"],
185
+ importKeys: []
186
+ };
224
187
  const importKeys = [];
225
- const fieldLines = Object.entries(additionalFields).map(([key, value]) => {
226
- const fieldConfig = value;
227
- const isRequired = fieldConfig.required !== false;
228
- let fieldType;
229
- if (fieldConfig.sonamuType) {
230
- fieldType = fieldConfig.sonamuType;
231
- importKeys.push(fieldType);
232
- } else {
233
- fieldType = mapBetterAuthFieldType(fieldConfig.type);
234
- }
235
- return ` ${key}${isRequired ? "" : "?"}: ${fieldType};`;
236
- });
237
188
  return {
238
189
  label: "Auth User Type",
239
190
  lines: [
240
191
  "export type SonamuUser = User & {",
241
- ...fieldLines,
192
+ ...Object.entries(additionalFields).map(([key, value]) => {
193
+ const fieldConfig = value;
194
+ const isRequired = fieldConfig.required !== false;
195
+ let fieldType;
196
+ if (fieldConfig.sonamuType) {
197
+ fieldType = fieldConfig.sonamuType;
198
+ importKeys.push(fieldType);
199
+ } else fieldType = mapBetterAuthFieldType(fieldConfig.type);
200
+ return ` ${key}${isRequired ? "" : "?"}: ${fieldType};`;
201
+ }),
242
202
  "};"
243
203
  ],
244
204
  importKeys
@@ -251,7 +211,7 @@ var Template__generated_sso = class extends Template {
251
211
  return !!Sonamu.config.server?.auth;
252
212
  }
253
213
  };
254
-
255
214
  //#endregion
256
215
  export { Template__generated_sso };
257
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVkX3Nzby50ZW1wbGF0ZS5qcyIsIm5hbWVzIjpbInNvdXJjZUNvZGVzOiBTb3VyY2VDb2RlW10iLCJwdXJpU3Vic2V0UXVlcnk6IFNvdXJjZUNvZGUiLCJwdXJpTG9hZGVyUXVlcnk6IFNvdXJjZUNvZGUiLCJjb250ZXh0RXh0ZW5kTGluZXM6IHN0cmluZ1tdIiwiaW1wb3J0S2V5czogc3RyaW5nW10iLCJmaWVsZFR5cGU6IHN0cmluZyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvZ2VuZXJhdGVkX3Nzby50ZW1wbGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcblxuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi8uLi9hcGlcIjtcbmltcG9ydCB7IHR5cGUgRW50aXR5IH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wLFxuICBpc09uZVRvT25lUmVsYXRpb25Qcm9wLFxufSBmcm9tIFwiLi4vLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyB0eXBlIFNvdXJjZUNvZGUgfSBmcm9tIFwiLi9nZW5lcmF0ZWQudGVtcGxhdGVcIjtcblxuLyoqXG4gKiBiZXR0ZXItYXV0aCBhZGRpdGlvbmFsRmllbGRz7J2YIHR5cGUg6rCS7J2EIFR5cGVTY3JpcHQg7YOA7J6FIOusuOyekOyXtOuhnCDrs4DtmZjtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIG1hcEJldHRlckF1dGhGaWVsZFR5cGUodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgcmV0dXJuIFwibnVtYmVyXCI7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiBcImJvb2xlYW5cIjtcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgcmV0dXJuIFwiRGF0ZVwiO1xuICAgIGNhc2UgXCJzdHJpbmdbXVwiOlxuICAgICAgcmV0dXJuIFwic3RyaW5nW11cIjtcbiAgICBjYXNlIFwibnVtYmVyW11cIjpcbiAgICAgIHJldHVybiBcIm51bWJlcltdXCI7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBcInVua25vd25cIjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVfX2dlbmVyYXRlZF9zc28gZXh0ZW5kcyBUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiZ2VuZXJhdGVkX3Nzb1wiKTtcbiAgfVxuXG4gIGdldFRhcmdldEFuZFBhdGgoKSB7XG4gICAgY29uc3QgeyBkaXIgfSA9IFNvbmFtdS5jb25maWcuYXBpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRhcmdldDogYCR7ZGlyfS9zcmMvYXBwbGljYXRpb25gLFxuICAgICAgcGF0aDogYHNvbmFtdS5nZW5lcmF0ZWQuc3NvLnRzYCxcbiAgICB9O1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IGVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gICAgY29uc3QgZW50aXRpZXMgPSBlbnRpdHlJZHMubWFwKChpZCkgPT4gRW50aXR5TWFuYWdlci5nZXQoaWQpKTtcblxuICAgIC8vIFN1YnNldFF1ZXJpZXMg7IOd7ISxIOuMgOyDgTog67aA66qoIOyXlO2LsO2LsOqwgCDsl4bqs6Ag7ISc67iM7IWL7J20IOyhtOyerFxuICAgIGNvbnN0IHRhcmdldEVudGl0aWVzID0gZW50aXRpZXMuZmlsdGVyKFxuICAgICAgKGVudGl0eSkgPT4gZW50aXR5LnBhcmVudElkID09PSB1bmRlZmluZWQgJiYgT2JqZWN0LmtleXMoZW50aXR5LnN1YnNldHMpLmxlbmd0aCA+IDAsXG4gICAgKTtcblxuICAgIC8vIFN1YnNldFF1ZXJpZXMg7IOd7ISxXG4gICAgY29uc3Qgc291cmNlQ29kZXM6IFNvdXJjZUNvZGVbXSA9IHRhcmdldEVudGl0aWVzLmZsYXRNYXAoKGVudGl0eSkgPT4ge1xuICAgICAgY29uc3Qgc3Vic2V0S2V5cyA9IE9iamVjdC5rZXlzKGVudGl0eS5zdWJzZXRzKTtcblxuICAgICAgY29uc3Qgc3Vic2V0S2V5VHlwZU5hbWUgPSBgJHtlbnRpdHkubmFtZXMubW9kdWxlfVN1YnNldEtleWA7XG4gICAgICBjb25zdCBlbnRpdHlDYW1lbE5hbWUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKGVudGl0eS5pZCwgdHJ1ZSk7XG5cbiAgICAgIC8vIFB1cmkg6riw67CYIFN1YnNldFF1ZXJ5XG4gICAgICBjb25zdCBwdXJpU3Vic2V0UXVlcnk6IFNvdXJjZUNvZGUgPSB7XG4gICAgICAgIGxhYmVsOiBgU3Vic2V0UXVlcnk6ICR7ZW50aXR5LmlkfWAsXG4gICAgICAgIGxpbmVzOiBbXG4gICAgICAgICAgYGV4cG9ydCBjb25zdCAke2VudGl0eUNhbWVsTmFtZX1TdWJzZXRRdWVyaWVzID0ge2AsXG4gICAgICAgICAgLi4uc3Vic2V0S2V5cy5tYXAoXG4gICAgICAgICAgICAoc3Vic2V0S2V5KSA9PiBgJHtzdWJzZXRLZXl9OiAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4pID0+IHtcbiAgICAgICAgICAgICR7ZW50aXR5LmdldFB1cmlTdWJzZXRRdWVyeShzdWJzZXRLZXkpfTtcbiAgICAgICAgICB9LGAsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBgfTtgLFxuICAgICAgICAgIFwiXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGltcG9ydEtleXM6IFtdLFxuICAgICAgfTtcblxuICAgICAgLy8gUHVyaSDquLDrsJggU3Vic2V0TG9hZGVyc1F1ZXJ5XG4gICAgICBjb25zdCBwdXJpTG9hZGVyUXVlcnk6IFNvdXJjZUNvZGUgPSB7XG4gICAgICAgIGxhYmVsOiBgTG9hZGVyUXVlcnk6ICR7ZW50aXR5LmlkfWAsXG4gICAgICAgIGxpbmVzOiBbXG4gICAgICAgICAgYGV4cG9ydCBjb25zdCAke2VudGl0eUNhbWVsTmFtZX1Mb2FkZXJRdWVyaWVzID0ge2AsXG4gICAgICAgICAgLi4uc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAke3N1YnNldEtleX06ICR7ZW50aXR5LmdldFB1cmlMb2FkZXJRdWVyeShzdWJzZXRLZXkpfSxgO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIGB9IGFzIGNvbnN0IHNhdGlzZmllcyBQdXJpTG9hZGVyUXVlcmllczwke3N1YnNldEtleVR5cGVOYW1lfT47YCxcbiAgICAgICAgICBcIlwiLFxuICAgICAgICBdLFxuICAgICAgICBpbXBvcnRLZXlzOiBbc3Vic2V0S2V5VHlwZU5hbWVdLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIFtwdXJpU3Vic2V0UXVlcnksIHB1cmlMb2FkZXJRdWVyeV07XG4gICAgfSk7XG5cbiAgICAvLyBGb3JlaWduS2V5IO2DgOyehSDsg53shLFcbiAgICBjb25zdCBma1R5cGVTb3VyY2VDb2RlID0gdGhpcy5nZXRGb3JlaWduS2V5VHlwZVNvdXJjZUNvZGUoZW50aXRpZXMpO1xuICAgIGlmIChma1R5cGVTb3VyY2VDb2RlKSB7XG4gICAgICBzb3VyY2VDb2Rlcy5wdXNoKGZrVHlwZVNvdXJjZUNvZGUpO1xuICAgIH1cblxuICAgIC8vIERhdGFiYXNlU2NoZW1hIOyDneyEsVxuICAgIGNvbnN0IGRiU2NoZW1hU291cmNlQ29kZSA9IHRoaXMuZ2V0RGF0YWJhc2VTY2hlbWFTb3VyY2VDb2RlKGVudGl0aWVzKTtcbiAgICBpZiAoZGJTY2hlbWFTb3VyY2VDb2RlKSB7XG4gICAgICBzb3VyY2VDb2Rlcy5wdXNoKGRiU2NoZW1hU291cmNlQ29kZSk7XG4gICAgfVxuXG4gICAgLy8gQXV0aCBVc2VyIO2DgOyehSDsg53shLFcbiAgICBjb25zdCBhdXRoVXNlclR5cGVTb3VyY2VDb2RlID0gdGhpcy5nZXRBdXRoVXNlclR5cGVTb3VyY2VDb2RlKCk7XG4gICAgaWYgKGF1dGhVc2VyVHlwZVNvdXJjZUNvZGUpIHtcbiAgICAgIHNvdXJjZUNvZGVzLnB1c2goYXV0aFVzZXJUeXBlU291cmNlQ29kZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc291cmNlQ29kZSA9IHNvdXJjZUNvZGVzLnJlZHVjZShcbiAgICAgIChyZXN1bHQsIHRzKSA9PiB7XG4gICAgICAgIGlmICh0cyA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0KHJlc3VsdCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGluZXM6IFsuLi5yZXN1bHQubGluZXMsIGAvLyAke3RzLmxhYmVsfWAsIC4uLnRzLmxpbmVzLCBcIlwiXSxcbiAgICAgICAgICBpbXBvcnRLZXlzOiB1bmlxdWUoWy4uLnJlc3VsdC5pbXBvcnRLZXlzLCAuLi50cy5pbXBvcnRLZXlzXSksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsaW5lczogW10sXG4gICAgICAgIGltcG9ydEtleXM6IFtdLFxuICAgICAgfSBhcyBPbWl0PFNvdXJjZUNvZGUsIFwibGFiZWxcIj4sXG4gICAgKTtcblxuICAgIGNvbnN0IGJvZHkgPSBzb3VyY2VDb2RlLmxpbmVzLmpvaW4oXCJcXG5cIik7XG4gICAgY29uc3QgaXNVc2luZ01hbnlUb01hbnlCYXNlU2NoZW1hID0gYm9keS5pbmNsdWRlcyhcIk1hbnlUb01hbnlCYXNlU2NoZW1hXCIpO1xuXG4gICAgY29uc3Qgc29uYW11SW1wb3J0cyA9IFtcbiAgICAgIFwiUHVyaVdyYXBwZXJcIixcbiAgICAgIFwiRGF0YWJhc2VTY2hlbWFFeHRlbmRcIixcbiAgICAgIFwiUHVyaUxvYWRlclF1ZXJpZXNcIixcbiAgICAgIGlzVXNpbmdNYW55VG9NYW55QmFzZVNjaGVtYSA/IFwiTWFueVRvTWFueUJhc2VTY2hlbWFcIiA6IFwiXCIsXG4gICAgXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmpvaW4oXCIsIFwiKTtcblxuICAgIC8vIGN1c3RvbUhlYWRlcnMg6rWs7ISxXG4gICAgY29uc3QgY3VzdG9tSGVhZGVycyA9IFtcbiAgICAgIFwiLyoqXCIsXG4gICAgICBcIiAqIEBnZW5lcmF0ZWRcIixcbiAgICAgIFwiICog7KeB7KCRIOyImOygle2VmOyngCDrp4jshLjsmpQuXCIsXG4gICAgICBcIiAqL1wiLFxuICAgICAgXCJcIixcbiAgICAgIGBpbXBvcnQgeyAke3NvbmFtdUltcG9ydHN9IH0gZnJvbSBcInNvbmFtdVwiO2AsXG4gICAgXTtcbiAgICBpZiAodGhpcy5oYXNBdXRoQ29uZmlnKCkpIHtcbiAgICAgIGN1c3RvbUhlYWRlcnMucHVzaChgaW1wb3J0IHR5cGUgeyBVc2VyIH0gZnJvbSBcImJldHRlci1hdXRoXCI7YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZ2V0VGFyZ2V0QW5kUGF0aCgpLFxuICAgICAgYm9keTogc291cmNlQ29kZS5saW5lcy5qb2luKFwiXFxuXCIpLFxuICAgICAgaW1wb3J0S2V5czogc291cmNlQ29kZS5pbXBvcnRLZXlzLFxuICAgICAgY3VzdG9tSGVhZGVycyxcbiAgICB9O1xuICB9XG5cbiAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBwcml2YXRlIEhlbHBlciBNZXRob2RzXG4gIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgcHJpdmF0ZSBnZXREYXRhYmFzZVNjaGVtYVNvdXJjZUNvZGUoZW50aXRpZXM6IEVudGl0eVtdKTogU291cmNlQ29kZSB8IG51bGwge1xuICAgIGlmIChlbnRpdGllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIERhdGFiYXNlU2NoZW1hRXh0ZW5kIC0g7YWM7J2067iUIOyKpO2CpOuniCDtg4DsnoUg7KCV7J2YXG4gICAgY29uc3QgZW50aXR5U2NoZW1hTGluZXMgPSBlbnRpdGllcy5tYXAoKGVudGl0eSkgPT4gYCR7ZW50aXR5LnRhYmxlfTogJHtlbnRpdHkuaWR9QmFzZVNjaGVtYTtgKTtcblxuICAgIGNvbnN0IGpvaW5UYWJsZXMgPSB1bmlxdWUoXG4gICAgICBlbnRpdGllcy5mbGF0TWFwKChlbnRpdHkpID0+XG4gICAgICAgIGVudGl0eS5wcm9wcy5maWx0ZXIoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKS5tYXAoKHByb3ApID0+IHtcbiAgICAgICAgICBjb25zdCBmcm9tVGFibGVLZXkgPSBpbmZsZWN0aW9uLnNpbmd1bGFyaXplKGVudGl0eS50YWJsZSk7XG4gICAgICAgICAgY29uc3QgdG9FbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHRvVGFibGVLZXkgPSBpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHRvRW50aXR5LnRhYmxlKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGFibGU6IHByb3Auam9pblRhYmxlLFxuICAgICAgICAgICAgZnJvbVRhYmxlS2V5LFxuICAgICAgICAgICAgdG9UYWJsZUtleSxcbiAgICAgICAgICAgIGZyb21FbnRpdHlJZDogZW50aXR5LmlkLFxuICAgICAgICAgICAgdG9FbnRpdHlJZDogdG9FbnRpdHkuaWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICAgKGpvaW5UYWJsZSkgPT4gam9pblRhYmxlLnRhYmxlLFxuICAgICk7XG5cbiAgICAvLyBEYXRhYmFzZUZvcmVpZ25LZXlzIC0gRksg7Lus65+87J2EIOqwgOynhCDthYzsnbTruJTrp4wg7KCV7J2YXG4gICAgY29uc3QgZW50aXRpZXNXaXRoRmsgPSBlbnRpdGllcy5maWx0ZXIoXG4gICAgICAoZW50aXR5KSA9PiB0aGlzLmdldEZvcmVpZ25LZXlDb2x1bW5zKGVudGl0eSkubGVuZ3RoID4gMCxcbiAgICApO1xuICAgIGNvbnN0IGZrTWV0YWRhdGFMaW5lcyA9IGVudGl0aWVzV2l0aEZrLm1hcChcbiAgICAgIChlbnRpdHkpID0+IGAke2VudGl0eS50YWJsZX06ICR7ZW50aXR5LmlkfUZvcmVpZ25LZXlzO2AsXG4gICAgKTtcblxuICAgIC8vIENvbnRleHRFeHRlbmQgLSBhdXRoIOyEpOygleydtCDsnojsnYQg65WM66eMIHVzZXIg7YOA7J6FIOy2lOqwgFxuICAgIGNvbnN0IGNvbnRleHRFeHRlbmRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAodGhpcy5oYXNBdXRoQ29uZmlnKCkpIHtcbiAgICAgIGNvbnRleHRFeHRlbmRMaW5lcy5wdXNoKFxuICAgICAgICBgYCxcbiAgICAgICAgYCAgZXhwb3J0IGludGVyZmFjZSBDb250ZXh0RXh0ZW5kIHtgLFxuICAgICAgICBgICAgIHVzZXI6IFNvbmFtdVVzZXIgfCBudWxsO2AsXG4gICAgICAgIGAgIH1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IGBEYXRhYmFzZVNjaGVtYWAsXG4gICAgICBsaW5lczogW1xuICAgICAgICBgZGVjbGFyZSBtb2R1bGUgXCJzb25hbXVcIiB7YCxcbiAgICAgICAgYCAgZXhwb3J0IGludGVyZmFjZSBEYXRhYmFzZVNjaGVtYUV4dGVuZCB7YCxcbiAgICAgICAgLi4uZW50aXR5U2NoZW1hTGluZXMsXG4gICAgICAgIC4uLmpvaW5UYWJsZXMubWFwKChqb2luVGFibGUpID0+IHtcbiAgICAgICAgICBjb25zdCBmcm9tRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoam9pblRhYmxlLmZyb21FbnRpdHlJZCk7XG4gICAgICAgICAgY29uc3QgdG9FbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChqb2luVGFibGUudG9FbnRpdHlJZCk7XG4gICAgICAgICAgY29uc3QgZnJvbVBrVHlwZSA9IGZyb21FbnRpdHkuZ2V0UGtUeXBlKCkgPT09IFwiaW50ZWdlclwiID8gXCJudW1iZXJcIiA6IFwic3RyaW5nXCI7XG4gICAgICAgICAgY29uc3QgdG9Qa1R5cGUgPSB0b0VudGl0eS5nZXRQa1R5cGUoKSA9PT0gXCJpbnRlZ2VyXCIgPyBcIm51bWJlclwiIDogXCJzdHJpbmdcIjtcblxuICAgICAgICAgIHJldHVybiBgJHtqb2luVGFibGUudGFibGV9OiBNYW55VG9NYW55QmFzZVNjaGVtYTxcIiR7am9pblRhYmxlLmZyb21UYWJsZUtleX1cIiwgXCIke2pvaW5UYWJsZS50b1RhYmxlS2V5fVwiLCAke2Zyb21Qa1R5cGV9LCAke3RvUGtUeXBlfT47YDtcbiAgICAgICAgfSksXG4gICAgICAgIGAgIH1gLFxuICAgICAgICBgYCxcbiAgICAgICAgYCAgZXhwb3J0IGludGVyZmFjZSBEYXRhYmFzZUZvcmVpZ25LZXlzIHtgLFxuICAgICAgICAuLi5ma01ldGFkYXRhTGluZXMsXG4gICAgICAgIGAgIH1gLFxuICAgICAgICAuLi5jb250ZXh0RXh0ZW5kTGluZXMsXG4gICAgICAgIGB9YCxcbiAgICAgIF0sXG4gICAgICBpbXBvcnRLZXlzOiBlbnRpdGllcy5tYXAoKGVudGl0eSkgPT4gYCR7ZW50aXR5LmlkfUJhc2VTY2hlbWFgKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gRksg6rSA6rOE66W8IOy7rOufvOuqheycvOuhnCDrs4DtmZggKOyYiDogY29tcGFueSDihpIgY29tcGFueV9pZClcbiAgcHJpdmF0ZSBnZXRGb3JlaWduS2V5Q29sdW1ucyhlbnRpdHk6IEVudGl0eSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gZW50aXR5LnByb3BzXG4gICAgICAuZmlsdGVyKChwcm9wKSA9PiB7XG4gICAgICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbikge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pXG4gICAgICAubWFwKChwcm9wKSA9PiBgJHtwcm9wLm5hbWV9X2lkYCk7XG4gIH1cblxuICBwcml2YXRlIGdldEZvcmVpZ25LZXlUeXBlU291cmNlQ29kZShlbnRpdGllczogRW50aXR5W10pOiBTb3VyY2VDb2RlIHwgbnVsbCB7XG4gICAgaWYgKGVudGl0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gRkvqsIAg7J6I64qUIOyXlO2LsO2LsOunjCDtg4DsnoUg7IOd7ISxXG4gICAgY29uc3QgZW50aXRpZXNXaXRoRmsgPSBlbnRpdGllcy5maWx0ZXIoXG4gICAgICAoZW50aXR5KSA9PiB0aGlzLmdldEZvcmVpZ25LZXlDb2x1bW5zKGVudGl0eSkubGVuZ3RoID4gMCxcbiAgICApO1xuXG4gICAgaWYgKGVudGl0aWVzV2l0aEZrLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZmtUeXBlTGluZXMgPSBlbnRpdGllc1dpdGhGay5tYXAoKGVudGl0eSkgPT4ge1xuICAgICAgY29uc3QgZmtDb2x1bW5zID0gdGhpcy5nZXRGb3JlaWduS2V5Q29sdW1ucyhlbnRpdHkpO1xuICAgICAgY29uc3QgZmtUeXBlVmFsdWUgPSBma0NvbHVtbnMubWFwKChjb2wpID0+IGBcIiR7Y29sfVwiYCkuam9pbihcIiB8IFwiKTtcblxuICAgICAgcmV0dXJuIGBleHBvcnQgdHlwZSAke2VudGl0eS5pZH1Gb3JlaWduS2V5cyA9ICR7ZmtUeXBlVmFsdWV9O2A7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IGBGb3JlaWduS2V5IFR5cGVzYCxcbiAgICAgIGxpbmVzOiBma1R5cGVMaW5lcyxcbiAgICAgIGltcG9ydEtleXM6IFtdLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogc29uYW11LmNvbmZpZy50c+ydmCBhdXRoLnVzZXIuYWRkaXRpb25hbEZpZWxkc+yXkOyEnCBTb25hbXVVc2VyIO2DgOyeheydhCDsg53shLHtlanri4jri6QuXG4gICAqIEByZXR1cm5zIFNvdXJjZUNvZGUgfCBudWxsIC0gYXV0aCDshKTsoJXsnbQg7JeG7Jy866m0IG51bGwg67CY7ZmYXG4gICAqL1xuICBwcml2YXRlIGdldEF1dGhVc2VyVHlwZVNvdXJjZUNvZGUoKTogU291cmNlQ29kZSB8IG51bGwge1xuICAgIGNvbnN0IGF1dGhDb25maWcgPSBTb25hbXUuY29uZmlnLnNlcnZlcj8uYXV0aDtcbiAgICBpZiAoIWF1dGhDb25maWcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55IC0tIGFkZGl0aW9uYWxGaWVsZHMg7YOA7J6F7J20IOuPmeyggeyehFxuICAgIGNvbnN0IGFkZGl0aW9uYWxGaWVsZHMgPSAoYXV0aENvbmZpZyBhcyBhbnkpPy51c2VyPy5hZGRpdGlvbmFsRmllbGRzO1xuICAgIGlmICghYWRkaXRpb25hbEZpZWxkcyB8fCBPYmplY3Qua2V5cyhhZGRpdGlvbmFsRmllbGRzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIGFkZGl0aW9uYWxGaWVsZHPqsIAg7JeG7Jy866m0IOq4sOuzuCBVc2VyIO2DgOyeheunjCDsgqzsmqlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxhYmVsOiBcIkF1dGggVXNlciBUeXBlXCIsXG4gICAgICAgIGxpbmVzOiBbXCJleHBvcnQgdHlwZSBTb25hbXVVc2VyID0gVXNlcjtcIl0sXG4gICAgICAgIGltcG9ydEtleXM6IFtdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBpbXBvcnRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gYWRkaXRpb25hbEZpZWxkc+ulvCBUeXBlU2NyaXB0IO2DgOyeheycvOuhnCDrs4DtmZhcbiAgICBjb25zdCBmaWVsZExpbmVzID0gT2JqZWN0LmVudHJpZXMoYWRkaXRpb25hbEZpZWxkcykubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55IC0tIGJldHRlci1hdXRoIGFkZGl0aW9uYWxGaWVsZHMg6rWs7KGwXG4gICAgICBjb25zdCBmaWVsZENvbmZpZyA9IHZhbHVlIGFzIGFueTtcbiAgICAgIGNvbnN0IGlzUmVxdWlyZWQgPSBmaWVsZENvbmZpZy5yZXF1aXJlZCAhPT0gZmFsc2U7XG5cbiAgICAgIGxldCBmaWVsZFR5cGU6IHN0cmluZztcblxuICAgICAgLy8gc29uYW11VHlwZeydtCDsnojsnLzrqbQgZGVzY3JpcHRpb27snYQg7YOA7J6F66qF7Jy866GcIOyCrOyaqVxuICAgICAgaWYgKGZpZWxkQ29uZmlnLnNvbmFtdVR5cGUpIHtcbiAgICAgICAgZmllbGRUeXBlID0gZmllbGRDb25maWcuc29uYW11VHlwZTtcbiAgICAgICAgaW1wb3J0S2V5cy5wdXNoKGZpZWxkVHlwZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWVsZFR5cGUgPSBtYXBCZXR0ZXJBdXRoRmllbGRUeXBlKGZpZWxkQ29uZmlnLnR5cGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYCAgJHtrZXl9JHtpc1JlcXVpcmVkID8gXCJcIiA6IFwiP1wifTogJHtmaWVsZFR5cGV9O2A7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IFwiQXV0aCBVc2VyIFR5cGVcIixcbiAgICAgIGxpbmVzOiBbXCJleHBvcnQgdHlwZSBTb25hbXVVc2VyID0gVXNlciAmIHtcIiwgLi4uZmllbGRMaW5lcywgXCJ9O1wiXSxcbiAgICAgIGltcG9ydEtleXMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBhdXRoIOyEpOygleydtCDsnojripTsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBoYXNBdXRoQ29uZmlnKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIVNvbmFtdS5jb25maWcuc2VydmVyPy5hdXRoO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7VUFLbUM7cUJBRXlCO1lBS2pDO2VBQ1k7Ozs7QUFNdkMsU0FBUyx1QkFBdUIsTUFBc0I7QUFDcEQsU0FBUSxNQUFSO0VBQ0UsS0FBSyxTQUNILFFBQU87RUFDVCxLQUFLLFNBQ0gsUUFBTztFQUNULEtBQUssVUFDSCxRQUFPO0VBQ1QsS0FBSyxPQUNILFFBQU87RUFDVCxLQUFLLFdBQ0gsUUFBTztFQUNULEtBQUssV0FDSCxRQUFPO0VBQ1QsUUFDRSxRQUFPOzs7QUFJYixJQUFhLDBCQUFiLGNBQTZDLFNBQVM7Q0FDcEQsY0FBYztBQUNaLFFBQU0sZ0JBQWdCOztDQUd4QixtQkFBbUI7RUFDakIsTUFBTSxFQUFFLFFBQVEsT0FBTyxPQUFPO0FBRTlCLFNBQU87R0FDTCxRQUFRLEdBQUcsSUFBSTtHQUNmLE1BQU07R0FDUDs7Q0FHSCxTQUFTO0VBQ1AsTUFBTSxZQUFZLGNBQWMsV0FBVztFQUMzQyxNQUFNLFdBQVcsVUFBVSxLQUFLLE9BQU8sY0FBYyxJQUFJLEdBQUcsQ0FBQztFQUc3RCxNQUFNLGlCQUFpQixTQUFTLFFBQzdCLFdBQVcsT0FBTyxhQUFhLGFBQWEsT0FBTyxLQUFLLE9BQU8sUUFBUSxDQUFDLFNBQVMsRUFDbkY7RUFHRCxNQUFNQSxjQUE0QixlQUFlLFNBQVMsV0FBVztHQUNuRSxNQUFNLGFBQWEsT0FBTyxLQUFLLE9BQU8sUUFBUTtHQUU5QyxNQUFNLG9CQUFvQixHQUFHLE9BQU8sTUFBTSxPQUFPO0dBQ2pELE1BQU0sa0JBQWtCLFdBQVcsU0FBUyxPQUFPLElBQUksS0FBSztHQUc1RCxNQUFNQyxrQkFBOEI7SUFDbEMsT0FBTyxnQkFBZ0IsT0FBTztJQUM5QixPQUFPO0tBQ0wsZ0JBQWdCLGdCQUFnQjtLQUNoQyxHQUFHLFdBQVcsS0FDWCxjQUFjLEdBQUcsVUFBVTtjQUMxQixPQUFPLG1CQUFtQixVQUFVLENBQUM7Y0FFeEM7S0FDRDtLQUNBO0tBQ0Q7SUFDRCxZQUFZLEVBQUU7SUFDZjtHQUdELE1BQU1DLGtCQUE4QjtJQUNsQyxPQUFPLGdCQUFnQixPQUFPO0lBQzlCLE9BQU87S0FDTCxnQkFBZ0IsZ0JBQWdCO0tBQ2hDLEdBQUcsV0FBVyxLQUFLLGNBQWM7QUFDL0IsYUFBTyxHQUFHLFVBQVUsSUFBSSxPQUFPLG1CQUFtQixVQUFVLENBQUM7T0FDN0Q7S0FDRiwwQ0FBMEMsa0JBQWtCO0tBQzVEO0tBQ0Q7SUFDRCxZQUFZLENBQUMsa0JBQWtCO0lBQ2hDO0FBRUQsVUFBTyxDQUFDLGlCQUFpQixnQkFBZ0I7SUFDekM7RUFHRixNQUFNLG1CQUFtQixLQUFLLDRCQUE0QixTQUFTO0FBQ25FLE1BQUksa0JBQWtCO0FBQ3BCLGVBQVksS0FBSyxpQkFBaUI7O0VBSXBDLE1BQU0scUJBQXFCLEtBQUssNEJBQTRCLFNBQVM7QUFDckUsTUFBSSxvQkFBb0I7QUFDdEIsZUFBWSxLQUFLLG1CQUFtQjs7RUFJdEMsTUFBTSx5QkFBeUIsS0FBSywyQkFBMkI7QUFDL0QsTUFBSSx3QkFBd0I7QUFDMUIsZUFBWSxLQUFLLHVCQUF1Qjs7RUFHMUMsTUFBTSxhQUFhLFlBQVksUUFDNUIsUUFBUSxPQUFPO0FBQ2QsT0FBSSxPQUFPLE1BQU07QUFDZixXQUFPOztBQUVULFVBQU8sT0FBTztBQUNkLFVBQU87SUFDTCxPQUFPO0tBQUMsR0FBRyxPQUFPO0tBQU8sTUFBTSxHQUFHO0tBQVMsR0FBRyxHQUFHO0tBQU87S0FBRztJQUMzRCxZQUFZLE9BQU8sQ0FBQyxHQUFHLE9BQU8sWUFBWSxHQUFHLEdBQUcsV0FBVyxDQUFDO0lBQzdEO0tBRUg7R0FDRSxPQUFPLEVBQUU7R0FDVCxZQUFZLEVBQUU7R0FDZixDQUNGO0VBRUQsTUFBTSxPQUFPLFdBQVcsTUFBTSxLQUFLLEtBQUs7RUFDeEMsTUFBTSw4QkFBOEIsS0FBSyxTQUFTLHVCQUF1QjtFQUV6RSxNQUFNLGdCQUFnQjtHQUNwQjtHQUNBO0dBQ0E7R0FDQSw4QkFBOEIseUJBQXlCO0dBQ3hELENBQ0UsT0FBTyxRQUFRLENBQ2YsS0FBSyxLQUFLO0VBR2IsTUFBTSxnQkFBZ0I7R0FDcEI7R0FDQTtHQUNBO0dBQ0E7R0FDQTtHQUNBLFlBQVksY0FBYztHQUMzQjtBQUNELE1BQUksS0FBSyxlQUFlLEVBQUU7QUFDeEIsaUJBQWMsS0FBSywyQ0FBMkM7O0FBR2hFLFNBQU87R0FDTCxHQUFHLEtBQUssa0JBQWtCO0dBQzFCLE1BQU0sV0FBVyxNQUFNLEtBQUssS0FBSztHQUNqQyxZQUFZLFdBQVc7R0FDdkI7R0FDRDs7Q0FNSCxBQUFRLDRCQUE0QixVQUF1QztBQUN6RSxNQUFJLFNBQVMsV0FBVyxHQUFHO0FBQ3pCLFVBQU87O0VBSVQsTUFBTSxvQkFBb0IsU0FBUyxLQUFLLFdBQVcsR0FBRyxPQUFPLE1BQU0sSUFBSSxPQUFPLEdBQUcsYUFBYTtFQUU5RixNQUFNLGFBQWEsT0FDakIsU0FBUyxTQUFTLFdBQ2hCLE9BQU8sTUFBTSxPQUFPLHlCQUF5QixDQUFDLEtBQUssU0FBUztHQUMxRCxNQUFNLGVBQWUsV0FBVyxZQUFZLE9BQU8sTUFBTTtHQUN6RCxNQUFNLFdBQVcsY0FBYyxJQUFJLEtBQUssS0FBSztHQUM3QyxNQUFNLGFBQWEsV0FBVyxZQUFZLFNBQVMsTUFBTTtBQUN6RCxVQUFPO0lBQ0wsT0FBTyxLQUFLO0lBQ1o7SUFDQTtJQUNBLGNBQWMsT0FBTztJQUNyQixZQUFZLFNBQVM7SUFDdEI7SUFDRCxDQUNILEdBQ0EsY0FBYyxVQUFVLE1BQzFCO0VBR0QsTUFBTSxpQkFBaUIsU0FBUyxRQUM3QixXQUFXLEtBQUsscUJBQXFCLE9BQU8sQ0FBQyxTQUFTLEVBQ3hEO0VBQ0QsTUFBTSxrQkFBa0IsZUFBZSxLQUNwQyxXQUFXLEdBQUcsT0FBTyxNQUFNLElBQUksT0FBTyxHQUFHLGNBQzNDO0VBR0QsTUFBTUMscUJBQStCLEVBQUU7QUFDdkMsTUFBSSxLQUFLLGVBQWUsRUFBRTtBQUN4QixzQkFBbUIsS0FDakIsSUFDQSxzQ0FDQSxnQ0FDQSxNQUNEOztBQUdILFNBQU87R0FDTCxPQUFPO0dBQ1AsT0FBTztJQUNMO0lBQ0E7SUFDQSxHQUFHO0lBQ0gsR0FBRyxXQUFXLEtBQUssY0FBYztLQUMvQixNQUFNLGFBQWEsY0FBYyxJQUFJLFVBQVUsYUFBYTtLQUM1RCxNQUFNLFdBQVcsY0FBYyxJQUFJLFVBQVUsV0FBVztLQUN4RCxNQUFNLGFBQWEsV0FBVyxXQUFXLEtBQUssWUFBWSxXQUFXO0tBQ3JFLE1BQU0sV0FBVyxTQUFTLFdBQVcsS0FBSyxZQUFZLFdBQVc7QUFFakUsWUFBTyxHQUFHLFVBQVUsTUFBTSwwQkFBMEIsVUFBVSxhQUFhLE1BQU0sVUFBVSxXQUFXLEtBQUssV0FBVyxJQUFJLFNBQVM7TUFDbkk7SUFDRjtJQUNBO0lBQ0E7SUFDQSxHQUFHO0lBQ0g7SUFDQSxHQUFHO0lBQ0g7SUFDRDtHQUNELFlBQVksU0FBUyxLQUFLLFdBQVcsR0FBRyxPQUFPLEdBQUcsWUFBWTtHQUMvRDs7Q0FJSCxBQUFRLHFCQUFxQixRQUEwQjtBQUNyRCxTQUFPLE9BQU8sTUFDWCxRQUFRLFNBQVM7QUFDaEIsT0FBSSwyQkFBMkIsS0FBSyxFQUFFO0FBQ3BDLFdBQU87O0FBRVQsT0FBSSx1QkFBdUIsS0FBSyxJQUFJLEtBQUssZUFBZTtBQUN0RCxXQUFPOztBQUVULFVBQU87SUFDUCxDQUNELEtBQUssU0FBUyxHQUFHLEtBQUssS0FBSyxLQUFLOztDQUdyQyxBQUFRLDRCQUE0QixVQUF1QztBQUN6RSxNQUFJLFNBQVMsV0FBVyxHQUFHO0FBQ3pCLFVBQU87O0VBSVQsTUFBTSxpQkFBaUIsU0FBUyxRQUM3QixXQUFXLEtBQUsscUJBQXFCLE9BQU8sQ0FBQyxTQUFTLEVBQ3hEO0FBRUQsTUFBSSxlQUFlLFdBQVcsR0FBRztBQUMvQixVQUFPOztFQUdULE1BQU0sY0FBYyxlQUFlLEtBQUssV0FBVztHQUNqRCxNQUFNLFlBQVksS0FBSyxxQkFBcUIsT0FBTztHQUNuRCxNQUFNLGNBQWMsVUFBVSxLQUFLLFFBQVEsSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLE1BQU07QUFFbEUsVUFBTyxlQUFlLE9BQU8sR0FBRyxnQkFBZ0IsWUFBWTtJQUM1RDtBQUVGLFNBQU87R0FDTCxPQUFPO0dBQ1AsT0FBTztHQUNQLFlBQVksRUFBRTtHQUNmOzs7Ozs7Q0FPSCxBQUFRLDRCQUErQztFQUNyRCxNQUFNLGFBQWEsT0FBTyxPQUFPLFFBQVE7QUFDekMsTUFBSSxDQUFDLFlBQVk7QUFDZixVQUFPOztFQUlULE1BQU0sbUJBQW9CLFlBQW9CLE1BQU07QUFDcEQsTUFBSSxDQUFDLG9CQUFvQixPQUFPLEtBQUssaUJBQWlCLENBQUMsV0FBVyxHQUFHO0FBRW5FLFVBQU87SUFDTCxPQUFPO0lBQ1AsT0FBTyxDQUFDLGlDQUFpQztJQUN6QyxZQUFZLEVBQUU7SUFDZjs7RUFHSCxNQUFNQyxhQUF1QixFQUFFO0VBRy9CLE1BQU0sYUFBYSxPQUFPLFFBQVEsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEtBQUssV0FBVztHQUV4RSxNQUFNLGNBQWM7R0FDcEIsTUFBTSxhQUFhLFlBQVksYUFBYTtHQUU1QyxJQUFJQztBQUdKLE9BQUksWUFBWSxZQUFZO0FBQzFCLGdCQUFZLFlBQVk7QUFDeEIsZUFBVyxLQUFLLFVBQVU7VUFDckI7QUFDTCxnQkFBWSx1QkFBdUIsWUFBWSxLQUFLOztBQUd0RCxVQUFPLEtBQUssTUFBTSxhQUFhLEtBQUssSUFBSSxJQUFJLFVBQVU7SUFDdEQ7QUFFRixTQUFPO0dBQ0wsT0FBTztHQUNQLE9BQU87SUFBQztJQUFxQyxHQUFHO0lBQVk7SUFBSztHQUNqRTtHQUNEOzs7OztDQU1ILEFBQVEsZ0JBQXlCO0FBQy9CLFNBQU8sQ0FBQyxDQUFDLE9BQU8sT0FBTyxRQUFRIn0=
216
+
217
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVkX3Nzby50ZW1wbGF0ZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVtcGxhdGUvaW1wbGVtZW50YXRpb25zL2dlbmVyYXRlZF9zc28udGVtcGxhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5cbmltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgeyB1bmlxdWUgfSBmcm9tIFwicmFkYXNoaVwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vLi4vYXBpXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eSB9IGZyb20gXCIuLi8uLi9lbnRpdHkvZW50aXR5XCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbn0gZnJvbSBcIi4uLy4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuaW1wb3J0IHsgdHlwZSBTb3VyY2VDb2RlIH0gZnJvbSBcIi4vZ2VuZXJhdGVkLnRlbXBsYXRlXCI7XG5cbi8qKlxuICogYmV0dGVyLWF1dGggYWRkaXRpb25hbEZpZWxkc+ydmCB0eXBlIOqwkuydhCBUeXBlU2NyaXB0IO2DgOyehSDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBtYXBCZXR0ZXJBdXRoRmllbGRUeXBlKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIHJldHVybiBcIm51bWJlclwiO1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gICAgY2FzZSBcImRhdGVcIjpcbiAgICAgIHJldHVybiBcIkRhdGVcIjtcbiAgICBjYXNlIFwic3RyaW5nW11cIjpcbiAgICAgIHJldHVybiBcInN0cmluZ1tdXCI7XG4gICAgY2FzZSBcIm51bWJlcltdXCI6XG4gICAgICByZXR1cm4gXCJudW1iZXJbXVwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gXCJ1bmtub3duXCI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19nZW5lcmF0ZWRfc3NvIGV4dGVuZHMgVGVtcGxhdGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcImdlbmVyYXRlZF9zc29cIik7XG4gIH1cblxuICBnZXRUYXJnZXRBbmRQYXRoKCkge1xuICAgIGNvbnN0IHsgZGlyIH0gPSBTb25hbXUuY29uZmlnLmFwaTtcblxuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQ6IGAke2Rpcn0vc3JjL2FwcGxpY2F0aW9uYCxcbiAgICAgIHBhdGg6IGBzb25hbXUuZ2VuZXJhdGVkLnNzby50c2AsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBlbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgIGNvbnN0IGVudGl0aWVzID0gZW50aXR5SWRzLm1hcCgoaWQpID0+IEVudGl0eU1hbmFnZXIuZ2V0KGlkKSk7XG5cbiAgICAvLyBTdWJzZXRRdWVyaWVzIOyDneyEsSDrjIDsg4E6IOu2gOuqqCDsl5Tti7Dti7DqsIAg7JeG6rOgIOyEnOu4jOyFi+ydtCDsobTsnqxcbiAgICBjb25zdCB0YXJnZXRFbnRpdGllcyA9IGVudGl0aWVzLmZpbHRlcihcbiAgICAgIChlbnRpdHkpID0+IGVudGl0eS5wYXJlbnRJZCA9PT0gdW5kZWZpbmVkICYmIE9iamVjdC5rZXlzKGVudGl0eS5zdWJzZXRzKS5sZW5ndGggPiAwLFxuICAgICk7XG5cbiAgICAvLyBTdWJzZXRRdWVyaWVzIOyDneyEsVxuICAgIGNvbnN0IHNvdXJjZUNvZGVzOiBTb3VyY2VDb2RlW10gPSB0YXJnZXRFbnRpdGllcy5mbGF0TWFwKChlbnRpdHkpID0+IHtcbiAgICAgIGNvbnN0IHN1YnNldEtleXMgPSBPYmplY3Qua2V5cyhlbnRpdHkuc3Vic2V0cyk7XG5cbiAgICAgIGNvbnN0IHN1YnNldEtleVR5cGVOYW1lID0gYCR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1TdWJzZXRLZXlgO1xuICAgICAgY29uc3QgZW50aXR5Q2FtZWxOYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShlbnRpdHkuaWQsIHRydWUpO1xuXG4gICAgICAvLyBQdXJpIOq4sOuwmCBTdWJzZXRRdWVyeVxuICAgICAgY29uc3QgcHVyaVN1YnNldFF1ZXJ5OiBTb3VyY2VDb2RlID0ge1xuICAgICAgICBsYWJlbDogYFN1YnNldFF1ZXJ5OiAke2VudGl0eS5pZH1gLFxuICAgICAgICBsaW5lczogW1xuICAgICAgICAgIGBleHBvcnQgY29uc3QgJHtlbnRpdHlDYW1lbE5hbWV9U3Vic2V0UXVlcmllcyA9IHtgLFxuICAgICAgICAgIC4uLnN1YnNldEtleXMubWFwKFxuICAgICAgICAgICAgKHN1YnNldEtleSkgPT4gYCR7c3Vic2V0S2V5fTogKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+KSA9PiB7XG4gICAgICAgICAgICAke2VudGl0eS5nZXRQdXJpU3Vic2V0UXVlcnkoc3Vic2V0S2V5KX07XG4gICAgICAgICAgfSxgLFxuICAgICAgICAgICksXG4gICAgICAgICAgYH07YCxcbiAgICAgICAgICBcIlwiLFxuICAgICAgICBdLFxuICAgICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIC8vIFB1cmkg6riw67CYIFN1YnNldExvYWRlcnNRdWVyeVxuICAgICAgY29uc3QgcHVyaUxvYWRlclF1ZXJ5OiBTb3VyY2VDb2RlID0ge1xuICAgICAgICBsYWJlbDogYExvYWRlclF1ZXJ5OiAke2VudGl0eS5pZH1gLFxuICAgICAgICBsaW5lczogW1xuICAgICAgICAgIGBleHBvcnQgY29uc3QgJHtlbnRpdHlDYW1lbE5hbWV9TG9hZGVyUXVlcmllcyA9IHtgLFxuICAgICAgICAgIC4uLnN1YnNldEtleXMubWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgJHtzdWJzZXRLZXl9OiAke2VudGl0eS5nZXRQdXJpTG9hZGVyUXVlcnkoc3Vic2V0S2V5KX0sYDtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBgfSBhcyBjb25zdCBzYXRpc2ZpZXMgUHVyaUxvYWRlclF1ZXJpZXM8JHtzdWJzZXRLZXlUeXBlTmFtZX0+O2AsXG4gICAgICAgICAgXCJcIixcbiAgICAgICAgXSxcbiAgICAgICAgaW1wb3J0S2V5czogW3N1YnNldEtleVR5cGVOYW1lXSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBbcHVyaVN1YnNldFF1ZXJ5LCBwdXJpTG9hZGVyUXVlcnldO1xuICAgIH0pO1xuXG4gICAgLy8gRm9yZWlnbktleSDtg4DsnoUg7IOd7ISxXG4gICAgY29uc3QgZmtUeXBlU291cmNlQ29kZSA9IHRoaXMuZ2V0Rm9yZWlnbktleVR5cGVTb3VyY2VDb2RlKGVudGl0aWVzKTtcbiAgICBpZiAoZmtUeXBlU291cmNlQ29kZSkge1xuICAgICAgc291cmNlQ29kZXMucHVzaChma1R5cGVTb3VyY2VDb2RlKTtcbiAgICB9XG5cbiAgICAvLyBEYXRhYmFzZVNjaGVtYSDsg53shLFcbiAgICBjb25zdCBkYlNjaGVtYVNvdXJjZUNvZGUgPSB0aGlzLmdldERhdGFiYXNlU2NoZW1hU291cmNlQ29kZShlbnRpdGllcyk7XG4gICAgaWYgKGRiU2NoZW1hU291cmNlQ29kZSkge1xuICAgICAgc291cmNlQ29kZXMucHVzaChkYlNjaGVtYVNvdXJjZUNvZGUpO1xuICAgIH1cblxuICAgIC8vIEF1dGggVXNlciDtg4DsnoUg7IOd7ISxXG4gICAgY29uc3QgYXV0aFVzZXJUeXBlU291cmNlQ29kZSA9IHRoaXMuZ2V0QXV0aFVzZXJUeXBlU291cmNlQ29kZSgpO1xuICAgIGlmIChhdXRoVXNlclR5cGVTb3VyY2VDb2RlKSB7XG4gICAgICBzb3VyY2VDb2Rlcy5wdXNoKGF1dGhVc2VyVHlwZVNvdXJjZUNvZGUpO1xuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZUNvZGUgPSBzb3VyY2VDb2Rlcy5yZWR1Y2UoXG4gICAgICAocmVzdWx0LCB0cykgPT4ge1xuICAgICAgICBpZiAodHMgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydChyZXN1bHQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxpbmVzOiBbLi4ucmVzdWx0LmxpbmVzLCBgLy8gJHt0cy5sYWJlbH1gLCAuLi50cy5saW5lcywgXCJcIl0sXG4gICAgICAgICAgaW1wb3J0S2V5czogdW5pcXVlKFsuLi5yZXN1bHQuaW1wb3J0S2V5cywgLi4udHMuaW1wb3J0S2V5c10pLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbGluZXM6IFtdLFxuICAgICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICAgIH0gYXMgT21pdDxTb3VyY2VDb2RlLCBcImxhYmVsXCI+LFxuICAgICk7XG5cbiAgICBjb25zdCBib2R5ID0gc291cmNlQ29kZS5saW5lcy5qb2luKFwiXFxuXCIpO1xuICAgIGNvbnN0IGlzVXNpbmdNYW55VG9NYW55QmFzZVNjaGVtYSA9IGJvZHkuaW5jbHVkZXMoXCJNYW55VG9NYW55QmFzZVNjaGVtYVwiKTtcblxuICAgIGNvbnN0IHNvbmFtdUltcG9ydHMgPSBbXG4gICAgICBcIlB1cmlXcmFwcGVyXCIsXG4gICAgICBcIkRhdGFiYXNlU2NoZW1hRXh0ZW5kXCIsXG4gICAgICBcIlB1cmlMb2FkZXJRdWVyaWVzXCIsXG4gICAgICBpc1VzaW5nTWFueVRvTWFueUJhc2VTY2hlbWEgPyBcIk1hbnlUb01hbnlCYXNlU2NoZW1hXCIgOiBcIlwiLFxuICAgIF1cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5qb2luKFwiLCBcIik7XG5cbiAgICAvLyBjdXN0b21IZWFkZXJzIOq1rOyEsVxuICAgIGNvbnN0IGN1c3RvbUhlYWRlcnMgPSBbXG4gICAgICBcIi8qKlwiLFxuICAgICAgXCIgKiBAZ2VuZXJhdGVkXCIsXG4gICAgICBcIiAqIOyngeygkSDsiJjsoJXtlZjsp4Ag66eI7IS47JqULlwiLFxuICAgICAgXCIgKi9cIixcbiAgICAgIFwiXCIsXG4gICAgICBgaW1wb3J0IHsgJHtzb25hbXVJbXBvcnRzfSB9IGZyb20gXCJzb25hbXVcIjtgLFxuICAgIF07XG4gICAgaWYgKHRoaXMuaGFzQXV0aENvbmZpZygpKSB7XG4gICAgICBjdXN0b21IZWFkZXJzLnB1c2goYGltcG9ydCB0eXBlIHsgVXNlciB9IGZyb20gXCJiZXR0ZXItYXV0aFwiO2ApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmdldFRhcmdldEFuZFBhdGgoKSxcbiAgICAgIGJvZHk6IHNvdXJjZUNvZGUubGluZXMuam9pbihcIlxcblwiKSxcbiAgICAgIGltcG9ydEtleXM6IHNvdXJjZUNvZGUuaW1wb3J0S2V5cyxcbiAgICAgIGN1c3RvbUhlYWRlcnMsXG4gICAgfTtcbiAgfVxuXG4gIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gcHJpdmF0ZSBIZWxwZXIgTWV0aG9kc1xuICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHByaXZhdGUgZ2V0RGF0YWJhc2VTY2hlbWFTb3VyY2VDb2RlKGVudGl0aWVzOiBFbnRpdHlbXSk6IFNvdXJjZUNvZGUgfCBudWxsIHtcbiAgICBpZiAoZW50aXRpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBEYXRhYmFzZVNjaGVtYUV4dGVuZCAtIO2FjOydtOu4lCDsiqTtgqTrp4gg7YOA7J6FIOygleydmFxuICAgIGNvbnN0IGVudGl0eVNjaGVtYUxpbmVzID0gZW50aXRpZXMubWFwKChlbnRpdHkpID0+IGAke2VudGl0eS50YWJsZX06ICR7ZW50aXR5LmlkfUJhc2VTY2hlbWE7YCk7XG5cbiAgICBjb25zdCBqb2luVGFibGVzID0gdW5pcXVlKFxuICAgICAgZW50aXRpZXMuZmxhdE1hcCgoZW50aXR5KSA9PlxuICAgICAgICBlbnRpdHkucHJvcHMuZmlsdGVyKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCkubWFwKChwcm9wKSA9PiB7XG4gICAgICAgICAgY29uc3QgZnJvbVRhYmxlS2V5ID0gaW5mbGVjdGlvbi5zaW5ndWxhcml6ZShlbnRpdHkudGFibGUpO1xuICAgICAgICAgIGNvbnN0IHRvRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICBjb25zdCB0b1RhYmxlS2V5ID0gaW5mbGVjdGlvbi5zaW5ndWxhcml6ZSh0b0VudGl0eS50YWJsZSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRhYmxlOiBwcm9wLmpvaW5UYWJsZSxcbiAgICAgICAgICAgIGZyb21UYWJsZUtleSxcbiAgICAgICAgICAgIHRvVGFibGVLZXksXG4gICAgICAgICAgICBmcm9tRW50aXR5SWQ6IGVudGl0eS5pZCxcbiAgICAgICAgICAgIHRvRW50aXR5SWQ6IHRvRW50aXR5LmlkLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICAgIChqb2luVGFibGUpID0+IGpvaW5UYWJsZS50YWJsZSxcbiAgICApO1xuXG4gICAgLy8gRGF0YWJhc2VGb3JlaWduS2V5cyAtIEZLIOy7rOufvOydhCDqsIDsp4Qg7YWM7J2067iU66eMIOygleydmFxuICAgIGNvbnN0IGVudGl0aWVzV2l0aEZrID0gZW50aXRpZXMuZmlsdGVyKFxuICAgICAgKGVudGl0eSkgPT4gdGhpcy5nZXRGb3JlaWduS2V5Q29sdW1ucyhlbnRpdHkpLmxlbmd0aCA+IDAsXG4gICAgKTtcbiAgICBjb25zdCBma01ldGFkYXRhTGluZXMgPSBlbnRpdGllc1dpdGhGay5tYXAoXG4gICAgICAoZW50aXR5KSA9PiBgJHtlbnRpdHkudGFibGV9OiAke2VudGl0eS5pZH1Gb3JlaWduS2V5cztgLFxuICAgICk7XG5cbiAgICAvLyBDb250ZXh0RXh0ZW5kIC0gYXV0aCDshKTsoJXsnbQg7J6I7J2EIOuVjOunjCB1c2VyIO2DgOyehSDstpTqsIBcbiAgICBjb25zdCBjb250ZXh0RXh0ZW5kTGluZXM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKHRoaXMuaGFzQXV0aENvbmZpZygpKSB7XG4gICAgICBjb250ZXh0RXh0ZW5kTGluZXMucHVzaChcbiAgICAgICAgYGAsXG4gICAgICAgIGAgIGV4cG9ydCBpbnRlcmZhY2UgQ29udGV4dEV4dGVuZCB7YCxcbiAgICAgICAgYCAgICB1c2VyOiBTb25hbXVVc2VyIHwgbnVsbDtgLFxuICAgICAgICBgICB9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiBgRGF0YWJhc2VTY2hlbWFgLFxuICAgICAgbGluZXM6IFtcbiAgICAgICAgYGRlY2xhcmUgbW9kdWxlIFwic29uYW11XCIge2AsXG4gICAgICAgIGAgIGV4cG9ydCBpbnRlcmZhY2UgRGF0YWJhc2VTY2hlbWFFeHRlbmQge2AsXG4gICAgICAgIC4uLmVudGl0eVNjaGVtYUxpbmVzLFxuICAgICAgICAuLi5qb2luVGFibGVzLm1hcCgoam9pblRhYmxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgZnJvbUVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGpvaW5UYWJsZS5mcm9tRW50aXR5SWQpO1xuICAgICAgICAgIGNvbnN0IHRvRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoam9pblRhYmxlLnRvRW50aXR5SWQpO1xuICAgICAgICAgIGNvbnN0IGZyb21Qa1R5cGUgPSBmcm9tRW50aXR5LmdldFBrVHlwZSgpID09PSBcImludGVnZXJcIiA/IFwibnVtYmVyXCIgOiBcInN0cmluZ1wiO1xuICAgICAgICAgIGNvbnN0IHRvUGtUeXBlID0gdG9FbnRpdHkuZ2V0UGtUeXBlKCkgPT09IFwiaW50ZWdlclwiID8gXCJudW1iZXJcIiA6IFwic3RyaW5nXCI7XG5cbiAgICAgICAgICByZXR1cm4gYCR7am9pblRhYmxlLnRhYmxlfTogTWFueVRvTWFueUJhc2VTY2hlbWE8XCIke2pvaW5UYWJsZS5mcm9tVGFibGVLZXl9XCIsIFwiJHtqb2luVGFibGUudG9UYWJsZUtleX1cIiwgJHtmcm9tUGtUeXBlfSwgJHt0b1BrVHlwZX0+O2A7XG4gICAgICAgIH0pLFxuICAgICAgICBgICB9YCxcbiAgICAgICAgYGAsXG4gICAgICAgIGAgIGV4cG9ydCBpbnRlcmZhY2UgRGF0YWJhc2VGb3JlaWduS2V5cyB7YCxcbiAgICAgICAgLi4uZmtNZXRhZGF0YUxpbmVzLFxuICAgICAgICBgICB9YCxcbiAgICAgICAgLi4uY29udGV4dEV4dGVuZExpbmVzLFxuICAgICAgICBgfWAsXG4gICAgICBdLFxuICAgICAgaW1wb3J0S2V5czogZW50aXRpZXMubWFwKChlbnRpdHkpID0+IGAke2VudGl0eS5pZH1CYXNlU2NoZW1hYCksXG4gICAgfTtcbiAgfVxuXG4gIC8vIEZLIOq0gOqzhOulvCDsu6zrn7zrqoXsnLzroZwg67OA7ZmYICjsmIg6IGNvbXBhbnkg4oaSIGNvbXBhbnlfaWQpXG4gIHByaXZhdGUgZ2V0Rm9yZWlnbktleUNvbHVtbnMoZW50aXR5OiBFbnRpdHkpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIGVudGl0eS5wcm9wc1xuICAgICAgLmZpbHRlcigocHJvcCkgPT4ge1xuICAgICAgICBpZiAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KVxuICAgICAgLm1hcCgocHJvcCkgPT4gYCR7cHJvcC5uYW1lfV9pZGApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGb3JlaWduS2V5VHlwZVNvdXJjZUNvZGUoZW50aXRpZXM6IEVudGl0eVtdKTogU291cmNlQ29kZSB8IG51bGwge1xuICAgIGlmIChlbnRpdGllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEZL6rCAIOyeiOuKlCDsl5Tti7Dti7Drp4wg7YOA7J6FIOyDneyEsVxuICAgIGNvbnN0IGVudGl0aWVzV2l0aEZrID0gZW50aXRpZXMuZmlsdGVyKFxuICAgICAgKGVudGl0eSkgPT4gdGhpcy5nZXRGb3JlaWduS2V5Q29sdW1ucyhlbnRpdHkpLmxlbmd0aCA+IDAsXG4gICAgKTtcblxuICAgIGlmIChlbnRpdGllc1dpdGhGay5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGZrVHlwZUxpbmVzID0gZW50aXRpZXNXaXRoRmsubWFwKChlbnRpdHkpID0+IHtcbiAgICAgIGNvbnN0IGZrQ29sdW1ucyA9IHRoaXMuZ2V0Rm9yZWlnbktleUNvbHVtbnMoZW50aXR5KTtcbiAgICAgIGNvbnN0IGZrVHlwZVZhbHVlID0gZmtDb2x1bW5zLm1hcCgoY29sKSA9PiBgXCIke2NvbH1cImApLmpvaW4oXCIgfCBcIik7XG5cbiAgICAgIHJldHVybiBgZXhwb3J0IHR5cGUgJHtlbnRpdHkuaWR9Rm9yZWlnbktleXMgPSAke2ZrVHlwZVZhbHVlfTtgO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiBgRm9yZWlnbktleSBUeXBlc2AsXG4gICAgICBsaW5lczogZmtUeXBlTGluZXMsXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIHNvbmFtdS5jb25maWcudHPsnZggYXV0aC51c2VyLmFkZGl0aW9uYWxGaWVsZHPsl5DshJwgU29uYW11VXNlciDtg4DsnoXsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBAcmV0dXJucyBTb3VyY2VDb2RlIHwgbnVsbCAtIGF1dGgg7ISk7KCV7J20IOyXhuycvOuptCBudWxsIOuwmO2ZmFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRBdXRoVXNlclR5cGVTb3VyY2VDb2RlKCk6IFNvdXJjZUNvZGUgfCBudWxsIHtcbiAgICBjb25zdCBhdXRoQ29uZmlnID0gU29uYW11LmNvbmZpZy5zZXJ2ZXI/LmF1dGg7XG4gICAgaWYgKCFhdXRoQ29uZmlnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSBhZGRpdGlvbmFsRmllbGRzIO2DgOyeheydtCDrj5nsoIHsnoRcbiAgICBjb25zdCBhZGRpdGlvbmFsRmllbGRzID0gKGF1dGhDb25maWcgYXMgYW55KT8udXNlcj8uYWRkaXRpb25hbEZpZWxkcztcbiAgICBpZiAoIWFkZGl0aW9uYWxGaWVsZHMgfHwgT2JqZWN0LmtleXMoYWRkaXRpb25hbEZpZWxkcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBhZGRpdGlvbmFsRmllbGRz6rCAIOyXhuycvOuptCDquLDrs7ggVXNlciDtg4DsnoXrp4wg7IKs7JqpXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYWJlbDogXCJBdXRoIFVzZXIgVHlwZVwiLFxuICAgICAgICBsaW5lczogW1wiZXhwb3J0IHR5cGUgU29uYW11VXNlciA9IFVzZXI7XCJdLFxuICAgICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgaW1wb3J0S2V5czogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIGFkZGl0aW9uYWxGaWVsZHPrpbwgVHlwZVNjcmlwdCDtg4DsnoXsnLzroZwg67OA7ZmYXG4gICAgY29uc3QgZmllbGRMaW5lcyA9IE9iamVjdC5lbnRyaWVzKGFkZGl0aW9uYWxGaWVsZHMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSBiZXR0ZXItYXV0aCBhZGRpdGlvbmFsRmllbGRzIOq1rOyhsFxuICAgICAgY29uc3QgZmllbGRDb25maWcgPSB2YWx1ZSBhcyBhbnk7XG4gICAgICBjb25zdCBpc1JlcXVpcmVkID0gZmllbGRDb25maWcucmVxdWlyZWQgIT09IGZhbHNlO1xuXG4gICAgICBsZXQgZmllbGRUeXBlOiBzdHJpbmc7XG5cbiAgICAgIC8vIHNvbmFtdVR5cGXsnbQg7J6I7Jy866m0IGRlc2NyaXB0aW9u7J2EIO2DgOyeheuqheycvOuhnCDsgqzsmqlcbiAgICAgIGlmIChmaWVsZENvbmZpZy5zb25hbXVUeXBlKSB7XG4gICAgICAgIGZpZWxkVHlwZSA9IGZpZWxkQ29uZmlnLnNvbmFtdVR5cGU7XG4gICAgICAgIGltcG9ydEtleXMucHVzaChmaWVsZFR5cGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmllbGRUeXBlID0gbWFwQmV0dGVyQXV0aEZpZWxkVHlwZShmaWVsZENvbmZpZy50eXBlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGAgICR7a2V5fSR7aXNSZXF1aXJlZCA/IFwiXCIgOiBcIj9cIn06ICR7ZmllbGRUeXBlfTtgO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiBcIkF1dGggVXNlciBUeXBlXCIsXG4gICAgICBsaW5lczogW1wiZXhwb3J0IHR5cGUgU29uYW11VXNlciA9IFVzZXIgJiB7XCIsIC4uLmZpZWxkTGluZXMsIFwifTtcIl0sXG4gICAgICBpbXBvcnRLZXlzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogYXV0aCDshKTsoJXsnbQg7J6I64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgaGFzQXV0aENvbmZpZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFTb25hbXUuY29uZmlnLnNlcnZlcj8uYXV0aDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7U0FLa0M7b0JBRXlCO1dBS2pDO2NBQ1k7Ozs7QUFNdEMsU0FBUyx1QkFBdUIsTUFBc0I7Q0FDcEQsUUFBUSxNQUFSO0VBQ0UsS0FBSyxVQUNILE9BQU87RUFDVCxLQUFLLFVBQ0gsT0FBTztFQUNULEtBQUssV0FDSCxPQUFPO0VBQ1QsS0FBSyxRQUNILE9BQU87RUFDVCxLQUFLLFlBQ0gsT0FBTztFQUNULEtBQUssWUFDSCxPQUFPO0VBQ1QsU0FDRSxPQUFPO0NBQ1g7QUFDRjtBQUVBLElBQWEsMEJBQWIsY0FBNkMsU0FBUztDQUNwRCxjQUFjO0VBQ1osTUFBTSxlQUFlO0NBQ3ZCO0NBRUEsbUJBQW1CO0VBQ2pCLE1BQU0sRUFBRSxRQUFRLE9BQU8sT0FBTztFQUU5QixPQUFPO0dBQ0wsUUFBUSxHQUFHLElBQUk7R0FDZixNQUFNO0VBQ1I7Q0FDRjtDQUVBLFNBQVM7RUFFUCxNQUFNLFdBRFksY0FBYyxVQUNmLENBQUEsQ0FBVSxLQUFLLE9BQU8sY0FBYyxJQUFJLEVBQUUsQ0FBQztFQVE1RCxNQUFNLGNBTGlCLFNBQVMsUUFDN0IsV0FBVyxPQUFPLGFBQWEsVUFBYSxPQUFPLEtBQUssT0FBTyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBSWxELENBQUEsQ0FBZSxTQUFTLFdBQVc7R0FDbkUsTUFBTSxhQUFhLE9BQU8sS0FBSyxPQUFPLE9BQU87R0FFN0MsTUFBTSxvQkFBb0IsR0FBRyxPQUFPLE1BQU0sT0FBTztHQUNqRCxNQUFNLGtCQUFrQixXQUFXLFNBQVMsT0FBTyxJQUFJLElBQUk7R0FnQzNELE9BQU8sQ0FBQztJQTVCTixPQUFPLGdCQUFnQixPQUFPO0lBQzlCLE9BQU87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
@@ -2,7 +2,6 @@ import { Sonamu } from "../../api/sonamu.js";
2
2
  import { EntityManager, init_entity_manager } from "../../entity/entity-manager.js";
3
3
  import { init_api } from "../../api/index.js";
4
4
  import { Template, init_template } from "../template.js";
5
-
6
5
  //#region src/template/implementations/init_types.template.ts
7
6
  init_api();
8
7
  init_entity_manager();
@@ -22,10 +21,8 @@ var Template__init_types = class extends Template {
22
21
  const names = EntityManager.getNamesFromId(entityId);
23
22
  const entity = EntityManager.get(entityId);
24
23
  const partialColumns = ["id"];
25
- if (entity.props.some((prop) => prop.name === "created_at")) {
26
- partialColumns.push("created_at");
27
- }
28
- const writeIneligibleColumns = entity.props.filter((prop) => prop.type !== "relation" && (prop.generated !== undefined || prop.type === "searchText")).map((prop) => prop.name);
24
+ if (entity.props.some((prop) => prop.name === "created_at")) partialColumns.push("created_at");
25
+ const writeIneligibleColumns = entity.props.filter((prop) => prop.type !== "relation" && (prop.generated !== void 0 || prop.type === "searchText")).map((prop) => prop.name);
29
26
  const omitGeneratedColumns = writeIneligibleColumns.length > 0 ? `.omit({ ${writeIneligibleColumns.map((column) => `${column}: true`).join(", ")} })` : "";
30
27
  return {
31
28
  ...this.getTargetAndPath(names),
@@ -46,7 +43,7 @@ export type ${entityId}SaveParams = z.infer<typeof ${entityId}SaveParams>;
46
43
  };
47
44
  }
48
45
  };
49
-
50
46
  //#endregion
51
47
  export { Template__init_types };
52
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdF90eXBlcy50ZW1wbGF0ZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVtcGxhdGUvaW1wbGVtZW50YXRpb25zL2luaXRfdHlwZXMudGVtcGxhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uLy4uL2FwaVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi8uLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgRW50aXR5TmFtZXNSZWNvcmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIFRlbXBsYXRlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tIFwiLi4vdGVtcGxhdGVcIjtcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19pbml0X3R5cGVzIGV4dGVuZHMgVGVtcGxhdGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcImluaXRfdHlwZXNcIik7XG4gIH1cblxuICBnZXRUYXJnZXRBbmRQYXRoKG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCkge1xuICAgIGNvbnN0IHsgZGlyIH0gPSBTb25hbXUuY29uZmlnLmFwaTtcblxuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQ6IGAke2Rpcn0vc3JjL2FwcGxpY2F0aW9uYCxcbiAgICAgIHBhdGg6IGAke25hbWVzLmZzfS8ke25hbWVzLmZzfS50eXBlcy50c2AsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcih7IGVudGl0eUlkIH06IFRlbXBsYXRlT3B0aW9uc1tcImluaXRfdHlwZXNcIl0pIHtcbiAgICBjb25zdCBuYW1lcyA9IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpO1xuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcblxuICAgIGNvbnN0IHBhcnRpYWxDb2x1bW5zID0gW1wiaWRcIl07XG4gICAgaWYgKGVudGl0eS5wcm9wcy5zb21lKChwcm9wKSA9PiBwcm9wLm5hbWUgPT09IFwiY3JlYXRlZF9hdFwiKSkge1xuICAgICAgcGFydGlhbENvbHVtbnMucHVzaChcImNyZWF0ZWRfYXRcIik7XG4gICAgfVxuXG4gICAgY29uc3Qgd3JpdGVJbmVsaWdpYmxlQ29sdW1ucyA9IGVudGl0eS5wcm9wc1xuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHByb3ApID0+XG4gICAgICAgICAgcHJvcC50eXBlICE9PSBcInJlbGF0aW9uXCIgJiYgKHByb3AuZ2VuZXJhdGVkICE9PSB1bmRlZmluZWQgfHwgcHJvcC50eXBlID09PSBcInNlYXJjaFRleHRcIiksXG4gICAgICApXG4gICAgICAubWFwKChwcm9wKSA9PiBwcm9wLm5hbWUpO1xuXG4gICAgY29uc3Qgb21pdEdlbmVyYXRlZENvbHVtbnMgPVxuICAgICAgd3JpdGVJbmVsaWdpYmxlQ29sdW1ucy5sZW5ndGggPiAwXG4gICAgICAgID8gYC5vbWl0KHsgJHt3cml0ZUluZWxpZ2libGVDb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBgJHtjb2x1bW59OiB0cnVlYCkuam9pbihcIiwgXCIpfSB9KWBcbiAgICAgICAgOiBcIlwiO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcyksXG4gICAgICBib2R5OiBgXG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgJHtlbnRpdHlJZH1CYXNlU2NoZW1hLCAke2VudGl0eUlkfUJhc2VMaXN0UGFyYW1zIH0gZnJvbSBcIi4uL3NvbmFtdS5nZW5lcmF0ZWRcIjtcblxuLy8gJHtlbnRpdHlJZH0gLSBMaXN0UGFyYW1zXG5leHBvcnQgY29uc3QgJHtlbnRpdHlJZH1MaXN0UGFyYW1zID0gJHtlbnRpdHlJZH1CYXNlTGlzdFBhcmFtcztcbmV4cG9ydCB0eXBlICR7ZW50aXR5SWR9TGlzdFBhcmFtcyA9IHouaW5mZXI8dHlwZW9mICR7ZW50aXR5SWR9TGlzdFBhcmFtcz47XG5cbi8vICR7ZW50aXR5SWR9IC0gU2F2ZVBhcmFtc1xuZXhwb3J0IGNvbnN0ICR7ZW50aXR5SWR9U2F2ZVBhcmFtcyA9ICR7ZW50aXR5SWR9QmFzZVNjaGVtYSR7b21pdEdlbmVyYXRlZENvbHVtbnN9LnBhcnRpYWwoeyAke3BhcnRpYWxDb2x1bW5zXG4gICAgICAgIC5tYXAoKGNvbHVtbikgPT4gYCR7Y29sdW1ufTogdHJ1ZWApXG4gICAgICAgIC5qb2luKFwiLCBcIil9IH0pO1xuZXhwb3J0IHR5cGUgJHtlbnRpdHlJZH1TYXZlUGFyYW1zID0gei5pbmZlcjx0eXBlb2YgJHtlbnRpdHlJZH1TYXZlUGFyYW1zPjtcblxuICAgICAgYC50cmltKCksXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICB9O1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztVQUFtQztxQkFDeUI7ZUFHckI7QUFFdkMsSUFBYSx1QkFBYixjQUEwQyxTQUFTO0NBQ2pELGNBQWM7QUFDWixRQUFNLGFBQWE7O0NBR3JCLGlCQUFpQixPQUEwQjtFQUN6QyxNQUFNLEVBQUUsUUFBUSxPQUFPLE9BQU87QUFFOUIsU0FBTztHQUNMLFFBQVEsR0FBRyxJQUFJO0dBQ2YsTUFBTSxHQUFHLE1BQU0sR0FBRyxHQUFHLE1BQU0sR0FBRztHQUMvQjs7Q0FHSCxPQUFPLEVBQUUsWUFBMkM7RUFDbEQsTUFBTSxRQUFRLGNBQWMsZUFBZSxTQUFTO0VBQ3BELE1BQU0sU0FBUyxjQUFjLElBQUksU0FBUztFQUUxQyxNQUFNLGlCQUFpQixDQUFDLEtBQUs7QUFDN0IsTUFBSSxPQUFPLE1BQU0sTUFBTSxTQUFTLEtBQUssU0FBUyxhQUFhLEVBQUU7QUFDM0Qsa0JBQWUsS0FBSyxhQUFhOztFQUduQyxNQUFNLHlCQUF5QixPQUFPLE1BQ25DLFFBQ0UsU0FDQyxLQUFLLFNBQVMsZUFBZSxLQUFLLGNBQWMsYUFBYSxLQUFLLFNBQVMsY0FDOUUsQ0FDQSxLQUFLLFNBQVMsS0FBSyxLQUFLO0VBRTNCLE1BQU0sdUJBQ0osdUJBQXVCLFNBQVMsSUFDNUIsV0FBVyx1QkFBdUIsS0FBSyxXQUFXLEdBQUcsT0FBTyxRQUFRLENBQUMsS0FBSyxLQUFLLENBQUMsT0FDaEY7QUFFTixTQUFPO0dBQ0wsR0FBRyxLQUFLLGlCQUFpQixNQUFNO0dBQy9CLE1BQU07O1dBRUQsU0FBUyxjQUFjLFNBQVM7O0tBRXRDLFNBQVM7ZUFDQyxTQUFTLGVBQWUsU0FBUztjQUNsQyxTQUFTLDhCQUE4QixTQUFTOztLQUV6RCxTQUFTO2VBQ0MsU0FBUyxlQUFlLFNBQVMsWUFBWSxxQkFBcUIsYUFBYSxlQUNyRixLQUFLLFdBQVcsR0FBRyxPQUFPLFFBQVEsQ0FDbEMsS0FBSyxLQUFLLENBQUM7Y0FDTixTQUFTLDhCQUE4QixTQUFTOztRQUV0RCxNQUFNO0dBQ1IsWUFBWSxFQUFFO0dBQ2YifQ==
48
+
49
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdF90eXBlcy50ZW1wbGF0ZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVtcGxhdGUvaW1wbGVtZW50YXRpb25zL2luaXRfdHlwZXMudGVtcGxhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uLy4uL2FwaVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi8uLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgRW50aXR5TmFtZXNSZWNvcmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIFRlbXBsYXRlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tIFwiLi4vdGVtcGxhdGVcIjtcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19pbml0X3R5cGVzIGV4dGVuZHMgVGVtcGxhdGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcImluaXRfdHlwZXNcIik7XG4gIH1cblxuICBnZXRUYXJnZXRBbmRQYXRoKG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCkge1xuICAgIGNvbnN0IHsgZGlyIH0gPSBTb25hbXUuY29uZmlnLmFwaTtcblxuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQ6IGAke2Rpcn0vc3JjL2FwcGxpY2F0aW9uYCxcbiAgICAgIHBhdGg6IGAke25hbWVzLmZzfS8ke25hbWVzLmZzfS50eXBlcy50c2AsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcih7IGVudGl0eUlkIH06IFRlbXBsYXRlT3B0aW9uc1tcImluaXRfdHlwZXNcIl0pIHtcbiAgICBjb25zdCBuYW1lcyA9IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpO1xuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcblxuICAgIGNvbnN0IHBhcnRpYWxDb2x1bW5zID0gW1wiaWRcIl07XG4gICAgaWYgKGVudGl0eS5wcm9wcy5zb21lKChwcm9wKSA9PiBwcm9wLm5hbWUgPT09IFwiY3JlYXRlZF9hdFwiKSkge1xuICAgICAgcGFydGlhbENvbHVtbnMucHVzaChcImNyZWF0ZWRfYXRcIik7XG4gICAgfVxuXG4gICAgY29uc3Qgd3JpdGVJbmVsaWdpYmxlQ29sdW1ucyA9IGVudGl0eS5wcm9wc1xuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHByb3ApID0+XG4gICAgICAgICAgcHJvcC50eXBlICE9PSBcInJlbGF0aW9uXCIgJiYgKHByb3AuZ2VuZXJhdGVkICE9PSB1bmRlZmluZWQgfHwgcHJvcC50eXBlID09PSBcInNlYXJjaFRleHRcIiksXG4gICAgICApXG4gICAgICAubWFwKChwcm9wKSA9PiBwcm9wLm5hbWUpO1xuXG4gICAgY29uc3Qgb21pdEdlbmVyYXRlZENvbHVtbnMgPVxuICAgICAgd3JpdGVJbmVsaWdpYmxlQ29sdW1ucy5sZW5ndGggPiAwXG4gICAgICAgID8gYC5vbWl0KHsgJHt3cml0ZUluZWxpZ2libGVDb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBgJHtjb2x1bW59OiB0cnVlYCkuam9pbihcIiwgXCIpfSB9KWBcbiAgICAgICAgOiBcIlwiO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcyksXG4gICAgICBib2R5OiBgXG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgJHtlbnRpdHlJZH1CYXNlU2NoZW1hLCAke2VudGl0eUlkfUJhc2VMaXN0UGFyYW1zIH0gZnJvbSBcIi4uL3NvbmFtdS5nZW5lcmF0ZWRcIjtcblxuLy8gJHtlbnRpdHlJZH0gLSBMaXN0UGFyYW1zXG5leHBvcnQgY29uc3QgJHtlbnRpdHlJZH1MaXN0UGFyYW1zID0gJHtlbnRpdHlJZH1CYXNlTGlzdFBhcmFtcztcbmV4cG9ydCB0eXBlICR7ZW50aXR5SWR9TGlzdFBhcmFtcyA9IHouaW5mZXI8dHlwZW9mICR7ZW50aXR5SWR9TGlzdFBhcmFtcz47XG5cbi8vICR7ZW50aXR5SWR9IC0gU2F2ZVBhcmFtc1xuZXhwb3J0IGNvbnN0ICR7ZW50aXR5SWR9U2F2ZVBhcmFtcyA9ICR7ZW50aXR5SWR9QmFzZVNjaGVtYSR7b21pdEdlbmVyYXRlZENvbHVtbnN9LnBhcnRpYWwoeyAke3BhcnRpYWxDb2x1bW5zXG4gICAgICAgIC5tYXAoKGNvbHVtbikgPT4gYCR7Y29sdW1ufTogdHJ1ZWApXG4gICAgICAgIC5qb2luKFwiLCBcIil9IH0pO1xuZXhwb3J0IHR5cGUgJHtlbnRpdHlJZH1TYXZlUGFyYW1zID0gei5pbmZlcjx0eXBlb2YgJHtlbnRpdHlJZH1TYXZlUGFyYW1zPjtcblxuICAgICAgYC50cmltKCksXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICB9O1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7O1NBQWtDO29CQUN5QjtjQUdyQjtBQUV0QyxJQUFhLHVCQUFiLGNBQTBDLFNBQVM7Q0FDakQsY0FBYztFQUNaLE1BQU0sWUFBWTtDQUNwQjtDQUVBLGlCQUFpQixPQUEwQjtFQUN6QyxNQUFNLEVBQUUsUUFBUSxPQUFPLE9BQU87RUFFOUIsT0FBTztHQUNMLFFBQVEsR0FBRyxJQUFJO0dBQ2YsTUFBTSxHQUFHLE1BQU0sR0FBRyxHQUFHLE1BQU0sR0FBRztFQUNoQztDQUNGO0NBRUEsT0FBTyxFQUFFLFlBQTJDO0VBQ2xELE1BQU0sUUFBUSxjQUFjLGVBQWUsUUFBUTtFQUNuRCxNQUFNLFNBQVMsY0FBYyxJQUFJLFFBQVE7RUFFekMsTUFBTSxpQkFBaUIsQ0FBQyxJQUFJO0VBQzVCLElBQUksT0FBTyxNQUFNLE1BQU0sU0FBUyxLQUFLLFNBQVMsWUFBWSxHQUN4RCxlQUFlLEtBQUssWUFBWTtFQUdsQyxNQUFNLHlCQUF5QixPQUFPLE1BQ25DLFFBQ0UsU0FDQyxLQUFLLFNBQVMsZUFBZSxLQUFLLGNBQWMsVUFBYSxLQUFLLFNBQVMsYUFDL0UsQ0FBQyxDQUNBLEtBQUssU0FBUyxLQUFLLElBQUk7RUFFMUIsTUFBTSx1QkFDSix1QkFBdUIsU0FBUyxJQUM1QixXQUFXLHVCQUF1QixLQUFLLFdBQVcsR0FBRyxPQUFPLE9BQU8sQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLE9BQ2hGO0VBRU4sT0FBTztHQUNMLEdBQUcsS0FBSyxpQkFBaUIsS0FBSztHQUM5QixNQUFNOztXQUVELFNBQVMsY0FBYyxTQUFTOztLQUV0QyxTQUFTO2VBQ0MsU0FBUyxlQUFlLFNBQVM7Y0FDbEMsU0FBUyw4QkFBOEIsU0FBUzs7S0FFekQsU0FBUztlQUNDLFNBQVMsZUFBZSxTQUFTLFlBQVkscUJBQXFCLGFBQWEsZUFDckYsS0FBSyxXQUFXLEdBQUcsT0FBTyxPQUFPLENBQUMsQ0FDbEMsS0FBSyxJQUFJLEVBQUU7Y0FDTixTQUFTLDhCQUE4QixTQUFTOztRQUV0RCxLQUFLO0dBQ1AsWUFBWSxDQUFDO0VBQ2Y7Q0FDRjtBQUNGIn0=
@@ -5,7 +5,6 @@ import { init_api } from "../../api/index.js";
5
5
  import { Template, init_template } from "../template.js";
6
6
  import { getZodTypeById, init_zod_converter, zodTypeToRenderingNode } from "../zod-converter.js";
7
7
  import { Template__view_list } from "./view_list.template.js";
8
-
9
8
  //#region src/template/implementations/model.template.ts
10
9
  init_api();
11
10
  init_entity_manager();
@@ -28,16 +27,12 @@ var Template__model = class extends Template {
28
27
  }
29
28
  async render({ entityId }) {
30
29
  Naite.t("render", { entityId });
31
- const listParamsZodType = await getZodTypeById(`${entityId}ListParams`);
32
- const listParamsNode = zodTypeToRenderingNode(listParamsZodType);
33
- const subsetKeyZodType = await getZodTypeById(`${entityId}SubsetKey`);
34
- const subsetKeys = subsetKeyZodType.enum;
30
+ const listParamsNode = zodTypeToRenderingNode(await getZodTypeById(`${entityId}ListParams`));
31
+ const subsetKeys = (await getZodTypeById(`${entityId}SubsetKey`)).enum;
35
32
  const names = EntityManager.getNamesFromId(entityId);
36
33
  const entity = EntityManager.get(entityId);
37
34
  const vlTpl = new Template__view_list();
38
- if (listParamsNode?.children === undefined) {
39
- throw new Error(`listParamsNode가 없습니다. ${entityId}`);
40
- }
35
+ if (listParamsNode?.children === void 0) throw new Error(`listParamsNode가 없습니다. ${entityId}`);
41
36
  const def = vlTpl.getDefault(listParamsNode.children);
42
37
  const notFoundError = `SD("error.entityNotFound")("${names.capital}", id)`;
43
38
  const unknownSearchFieldError = `SD("error.unknownSearchField")(params.search)`;
@@ -198,7 +193,7 @@ export const ${entityId}Model = new ${entityId}ModelClass();
198
193
  };
199
194
  }
200
195
  };
201
-
202
196
  //#endregion
203
197
  export { Template__model };
204
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwudGVtcGxhdGUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlbXBsYXRlL2ltcGxlbWVudGF0aW9ucy9tb2RlbC50ZW1wbGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB6IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uLy4uL2FwaVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi8uLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgRW50aXR5TmFtZXNSZWNvcmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi8uLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBnZXRab2RUeXBlQnlJZCwgem9kVHlwZVRvUmVuZGVyaW5nTm9kZSB9IGZyb20gXCIuLi96b2QtY29udmVydGVyXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZV9fdmlld19saXN0IH0gZnJvbSBcIi4vdmlld19saXN0LnRlbXBsYXRlXCI7XG5leHBvcnQgY2xhc3MgVGVtcGxhdGVfX21vZGVsIGV4dGVuZHMgVGVtcGxhdGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIm1vZGVsXCIpO1xuICB9XG5cbiAgZ2V0VGFyZ2V0QW5kUGF0aChuYW1lczogRW50aXR5TmFtZXNSZWNvcmQpIHtcbiAgICBjb25zdCB7IGRpciB9ID0gU29uYW11LmNvbmZpZy5hcGk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiBgJHtkaXJ9L3NyYy9hcHBsaWNhdGlvbmAsXG4gICAgICBwYXRoOiBgJHtuYW1lcy5mc30vJHtuYW1lcy5mc30ubW9kZWwudHNgLFxuICAgIH07XG4gIH1cblxuICBvdmVycmlkZSBnZXRSZXF1aXJlZERpY3RLZXlzKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgcmV0dXJuIFtcImVycm9yLmVudGl0eU5vdEZvdW5kXCIsIFwiZXJyb3IudW5rbm93blNlYXJjaEZpZWxkXCJdO1xuICB9XG5cbiAgYXN5bmMgcmVuZGVyKHsgZW50aXR5SWQgfTogVGVtcGxhdGVPcHRpb25zW1wibW9kZWxcIl0pIHtcbiAgICBOYWl0ZS50KFwicmVuZGVyXCIsIHsgZW50aXR5SWQgfSk7XG5cbiAgICBjb25zdCBsaXN0UGFyYW1zWm9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKGAke2VudGl0eUlkfUxpc3RQYXJhbXNgKTtcbiAgICBjb25zdCBsaXN0UGFyYW1zTm9kZSA9IHpvZFR5cGVUb1JlbmRlcmluZ05vZGUobGlzdFBhcmFtc1pvZFR5cGUpO1xuXG4gICAgY29uc3Qgc3Vic2V0S2V5Wm9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKGAke2VudGl0eUlkfVN1YnNldEtleWApO1xuICAgIGNvbnN0IHN1YnNldEtleXMgPSAoc3Vic2V0S2V5Wm9kVHlwZSBhcyB6LlpvZEVudW0pLmVudW07XG5cbiAgICBjb25zdCBuYW1lcyA9IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpO1xuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcblxuICAgIGNvbnN0IHZsVHBsID0gbmV3IFRlbXBsYXRlX192aWV3X2xpc3QoKTtcbiAgICBpZiAobGlzdFBhcmFtc05vZGU/LmNoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbGlzdFBhcmFtc05vZGXqsIAg7JeG7Iq164uI64ukLiAke2VudGl0eUlkfWApO1xuICAgIH1cbiAgICBjb25zdCBkZWYgPSB2bFRwbC5nZXREZWZhdWx0KGxpc3RQYXJhbXNOb2RlLmNoaWxkcmVuKTtcblxuICAgIC8vIOyXkOufrCDrqZTsi5zsp4Ag7IOd7ISxXG4gICAgY29uc3Qgbm90Rm91bmRFcnJvciA9IGBTRChcImVycm9yLmVudGl0eU5vdEZvdW5kXCIpKFwiJHtuYW1lcy5jYXBpdGFsfVwiLCBpZClgO1xuICAgIGNvbnN0IHVua25vd25TZWFyY2hGaWVsZEVycm9yID0gYFNEKFwiZXJyb3IudW5rbm93blNlYXJjaEZpZWxkXCIpKHBhcmFtcy5zZWFyY2gpYDtcblxuICAgIC8vIFBLIO2DgOyeheyXkCDrlLDrpbggVHlwZVNjcmlwdCDtg4DsnoUg6rKw7KCVXG4gICAgY29uc3QgcGtUeXBlID0gZW50aXR5LmdldFBrVHlwZSgpO1xuICAgIGNvbnN0IGlkVHNUeXBlID0gcGtUeXBlID09PSBcInN0cmluZ1wiIHx8IHBrVHlwZSA9PT0gXCJ1dWlkXCIgPyBcInN0cmluZ1wiIDogXCJudW1iZXJcIjtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmdldFRhcmdldEFuZFBhdGgobmFtZXMpLFxuICAgICAgYm9keTogYFxuaW1wb3J0IHsgQmFzZU1vZGVsQ2xhc3MsIHR5cGUgTGlzdFJlc3VsdCwgYXNBcnJheSwgTm90Rm91bmRFeGNlcHRpb24sIEJhZFJlcXVlc3RFeGNlcHRpb24sIGFwaSwgZXhoYXVzdGl2ZSB9IGZyb20gJ3NvbmFtdSc7XG5pbXBvcnQge1xuICAke2VudGl0eUlkfVN1YnNldEtleSxcbiAgJHtlbnRpdHlJZH1TdWJzZXRNYXBwaW5nLFxufSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHtcbiAgJHtuYW1lcy5jYW1lbH1TdWJzZXRRdWVyaWVzLFxuICAke25hbWVzLmNhbWVsfUxvYWRlclF1ZXJpZXMsXG59IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkLnNzb1wiO1xuaW1wb3J0IHsgJHtlbnRpdHlJZH1MaXN0UGFyYW1zLCAke2VudGl0eUlkfVNhdmVQYXJhbXMgfSBmcm9tIFwiLi8ke25hbWVzLmZzfS50eXBlc1wiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcblxuLypcbiAgJHtlbnRpdHlJZH0gTW9kZWxcbiovXG5jbGFzcyAke2VudGl0eUlkfU1vZGVsQ2xhc3MgZXh0ZW5kcyBCYXNlTW9kZWxDbGFzczxcbiAgJHtlbnRpdHlJZH1TdWJzZXRLZXksXG4gICR7ZW50aXR5SWR9U3Vic2V0TWFwcGluZyxcbiAgdHlwZW9mICR7bmFtZXMuY2FtZWx9U3Vic2V0UXVlcmllcyxcbiAgdHlwZW9mICR7bmFtZXMuY2FtZWx9TG9hZGVyUXVlcmllc1xuPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiJHtlbnRpdHlJZH1cIiwgJHtuYW1lcy5jYW1lbH1TdWJzZXRRdWVyaWVzLCAke25hbWVzLmNhbWVsfUxvYWRlclF1ZXJpZXMpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCIke2VudGl0eUlkfVwiIH0pXG4gIGFzeW5jIGZpbmRCeUlkPFQgZXh0ZW5kcyAke2VudGl0eUlkfVN1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIGlkOiAke2lkVHNUeXBlfVxuICApOiBQcm9taXNlPCR7ZW50aXR5SWR9U3Vic2V0TWFwcGluZ1tUXT4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgdGhpcy5maW5kTWFueShzdWJzZXQsIHtcbiAgICAgIGlkLFxuICAgICAgbnVtOiAxLFxuICAgICAgcGFnZTogMSxcbiAgICB9KTtcbiAgICBpZiAoIXJvd3NbMF0pIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbigke25vdEZvdW5kRXJyb3J9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm93c1swXTtcbiAgfVxuXG4gIGFzeW5jIGZpbmRPbmU8VCBleHRlbmRzICR7ZW50aXR5SWR9U3Vic2V0S2V5PihcbiAgICBzdWJzZXQ6IFQsXG4gICAgbGlzdFBhcmFtczogJHtlbnRpdHlJZH1MaXN0UGFyYW1zXG4gICk6IFByb21pc2U8JHtlbnRpdHlJZH1TdWJzZXRNYXBwaW5nW1RdIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgdGhpcy5maW5kTWFueShzdWJzZXQsIHtcbiAgICAgIC4uLmxpc3RQYXJhbXMsXG4gICAgICBudW06IDEsXG4gICAgICBwYWdlOiAxLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJvd3NbMF0gPz8gbnVsbDtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdLCByZXNvdXJjZU5hbWU6IFwiJHtuYW1lcy5jYXBpdGFsUGx1cmFsfVwiIH0pXG4gIGFzeW5jIGZpbmRNYW55PFQgZXh0ZW5kcyAke2VudGl0eUlkfVN1YnNldEtleSwgTFAgZXh0ZW5kcyAke2VudGl0eUlkfUxpc3RQYXJhbXM+KFxuICAgIHN1YnNldDogVCxcbiAgICByYXdQYXJhbXM/OiBMUCxcbiAgKTogUHJvbWlzZTxMaXN0UmVzdWx0PExQLCAke2VudGl0eUlkfVN1YnNldE1hcHBpbmdbVF0+PiB7XG4gICAgLy8gcGFyYW1zIHdpdGggZGVmYXVsdHNcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBudW06IDI0LFxuICAgICAgcGFnZTogMSxcbiAgICAgIHNlYXJjaDogXCIke2RlZi5zZWFyY2h9XCIgYXMgY29uc3QsXG4gICAgICBvcmRlckJ5OiBcIiR7ZGVmLm9yZGVyQnl9XCIgYXMgY29uc3QsXG4gICAgICAuLi5yYXdQYXJhbXMsXG4gICAgfSBzYXRpc2ZpZXMgJHtlbnRpdHlJZH1MaXN0UGFyYW1zO1xuXG4gICAgLy8gYnVpbGQgcXVlcmllc1xuICAgIGNvbnN0IHsgcWIsIG9uU3Vic2V0OiBfIH0gPSB0aGlzLmdldFN1YnNldFF1ZXJpZXMoc3Vic2V0KTtcbiAgICBcbiAgICAvLyBpZFxuICAgIGlmIChwYXJhbXMuaWQpIHtcbiAgICAgIHFiLndoZXJlSW4oXCIke2VudGl0eS50YWJsZX0uaWRcIiwgYXNBcnJheShwYXJhbXMuaWQpKTtcbiAgICB9XG5cbiAgICAvLyBzZWFyY2gta2V5d29yZFxuICAgIGlmIChwYXJhbXMuc2VhcmNoICYmIHBhcmFtcy5rZXl3b3JkICYmIHBhcmFtcy5rZXl3b3JkLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChwYXJhbXMuc2VhcmNoID09PSBcImlkXCIpIHtcbiAgICAgICAgcWIud2hlcmUoXCIke2VudGl0eS50YWJsZX0uaWRcIiwgJHtpZFRzVHlwZSA9PT0gXCJzdHJpbmdcIiA/IFwicGFyYW1zLmtleXdvcmRcIiA6IFwiTnVtYmVyKHBhcmFtcy5rZXl3b3JkKVwifSk7XG4gICAgICAgIC8vIH0gZWxzZSBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJmaWVsZFwiKSB7XG4gICAgICAgIC8vICAgcWIud2hlcmUoXCIke2VudGl0eS50YWJsZX0uZmllbGRcIiwgXCJsaWtlXCIsIFxcYCVcXCR7cGFyYW1zLmtleXdvcmR9JVxcYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbigke3Vua25vd25TZWFyY2hGaWVsZEVycm9yfSk7XG4gICAgICB9XG4gICAgfVxuICAgICAgXG4gICAgLy8gb3JkZXJCeVxuICAgIGlmIChwYXJhbXMub3JkZXJCeSkge1xuICAgICAgLy8gZGVmYXVsdCBvcmRlckJ5XG4gICAgICBpZiAocGFyYW1zLm9yZGVyQnkgPT09IFwiaWQtZGVzY1wiKSB7XG4gICAgICAgIHFiLm9yZGVyQnkoXCIke2VudGl0eS50YWJsZX0uaWRcIiwgXCJkZXNjXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhoYXVzdGl2ZShwYXJhbXMub3JkZXJCeSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZW5oYW5jZXJzID0gdGhpcy5jcmVhdGVFbmhhbmNlcnMoe1xuICAgICAgJHtPYmplY3Qua2V5cyhzdWJzZXRLZXlzKVxuICAgICAgICAubWFwKFxuICAgICAgICAgIChrZXkpID0+IGAke2tleX06IChyb3cpID0+ICh7XG4gICAgICAgICAgLi4ucm93LFxuICAgICAgICAgIC8vIOyEnOu4jOyFi+uzhOuhnCB2aXJ0dWFsIO2VhOuTnCDqs4TsgrDroZzsp4Eg7LaU6rCAXG4gICAgICAgIH0pLGAsXG4gICAgICAgIClcbiAgICAgICAgLmpvaW4oXCJcXG5cIil9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlU3Vic2V0UXVlcnkoe1xuICAgICAgc3Vic2V0LFxuICAgICAgcWIsXG4gICAgICBwYXJhbXMsXG4gICAgICBlbmhhbmNlcnMsXG4gICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgfSk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgc2F2ZShcbiAgICBzcGE6ICR7ZW50aXR5SWR9U2F2ZVBhcmFtc1tdXG4gICk6IFByb21pc2U8JHtpZFRzVHlwZX1bXT4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG5cbiAgICAvLyByZWdpc3RlclxuICAgIHNwYS5mb3JFYWNoKChzcCkgPT4ge1xuICAgICAgd2RiLnViUmVnaXN0ZXIoXCIke2VudGl0eS50YWJsZX1cIiwgc3ApO1xuICAgIH0pO1xuXG4gICAgLy8gdHJhbnNhY3Rpb25cbiAgICByZXR1cm4gd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIGNvbnN0IGlkcyA9IGF3YWl0IHRyeC51YlVwc2VydChcIiR7ZW50aXR5LnRhYmxlfVwiKTtcblxuICAgICAgcmV0dXJuIGlkcztcbiAgICB9KTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSwgZ3VhcmRzOiBbIFwiYWRtaW5cIiBdIH0pXG4gIGFzeW5jIGRlbChpZHM6ICR7aWRUc1R5cGV9W10pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG5cbiAgICAvLyB0cmFuc2FjdGlvblxuICAgIGF3YWl0IHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICByZXR1cm4gdHJ4LnRhYmxlKFwiJHtlbnRpdHkudGFibGV9XCIpLndoZXJlSW4oXCIke2VudGl0eS50YWJsZX0uaWRcIiwgaWRzKS5kZWxldGUoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBpZHMubGVuZ3RoO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCAke2VudGl0eUlkfU1vZGVsID0gbmV3ICR7ZW50aXR5SWR9TW9kZWxDbGFzcygpO1xuICAgICAgYC50cmltKCksXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICB9O1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztVQUVtQztxQkFDeUI7WUFFbEI7ZUFFSDtvQkFDbUM7QUFFMUUsSUFBYSxrQkFBYixjQUFxQyxTQUFTO0NBQzVDLGNBQWM7QUFDWixRQUFNLFFBQVE7O0NBR2hCLGlCQUFpQixPQUEwQjtFQUN6QyxNQUFNLEVBQUUsUUFBUSxPQUFPLE9BQU87QUFFOUIsU0FBTztHQUNMLFFBQVEsR0FBRyxJQUFJO0dBQ2YsTUFBTSxHQUFHLE1BQU0sR0FBRyxHQUFHLE1BQU0sR0FBRztHQUMvQjs7Q0FHSCxBQUFTLHNCQUF1QztBQUM5QyxTQUFPLENBQUMsd0JBQXdCLDJCQUEyQjs7Q0FHN0QsTUFBTSxPQUFPLEVBQUUsWUFBc0M7QUFDbkQsUUFBTSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUM7RUFFL0IsTUFBTSxvQkFBb0IsTUFBTSxlQUFlLEdBQUcsU0FBUyxZQUFZO0VBQ3ZFLE1BQU0saUJBQWlCLHVCQUF1QixrQkFBa0I7RUFFaEUsTUFBTSxtQkFBbUIsTUFBTSxlQUFlLEdBQUcsU0FBUyxXQUFXO0VBQ3JFLE1BQU0sYUFBYyxpQkFBK0I7RUFFbkQsTUFBTSxRQUFRLGNBQWMsZUFBZSxTQUFTO0VBQ3BELE1BQU0sU0FBUyxjQUFjLElBQUksU0FBUztFQUUxQyxNQUFNLFFBQVEsSUFBSSxxQkFBcUI7QUFDdkMsTUFBSSxnQkFBZ0IsYUFBYSxXQUFXO0FBQzFDLFNBQU0sSUFBSSxNQUFNLHlCQUF5QixXQUFXOztFQUV0RCxNQUFNLE1BQU0sTUFBTSxXQUFXLGVBQWUsU0FBUztFQUdyRCxNQUFNLGdCQUFnQiwrQkFBK0IsTUFBTSxRQUFRO0VBQ25FLE1BQU0sMEJBQTBCO0VBR2hDLE1BQU0sU0FBUyxPQUFPLFdBQVc7RUFDakMsTUFBTSxXQUFXLFdBQVcsWUFBWSxXQUFXLFNBQVMsV0FBVztBQUV2RSxTQUFPO0dBQ0wsR0FBRyxLQUFLLGlCQUFpQixNQUFNO0dBQy9CLE1BQU07OztJQUdSLFNBQVM7SUFDVCxTQUFTOzs7SUFHVCxNQUFNLE1BQU07SUFDWixNQUFNLE1BQU07O1dBRUwsU0FBUyxjQUFjLFNBQVMsdUJBQXVCLE1BQU0sR0FBRzs7OztJQUl2RSxTQUFTOztRQUVMLFNBQVM7SUFDYixTQUFTO0lBQ1QsU0FBUztXQUNGLE1BQU0sTUFBTTtXQUNaLE1BQU0sTUFBTTs7O2FBR1YsU0FBUyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsTUFBTSxNQUFNOzs7bUZBR2UsU0FBUzs2QkFDL0QsU0FBUzs7VUFFNUIsU0FBUztlQUNKLFNBQVM7Ozs7Ozs7b0NBT1ksY0FBYzs7Ozs7OzRCQU10QixTQUFTOztrQkFFbkIsU0FBUztlQUNaLFNBQVM7Ozs7Ozs7Ozs7bUZBVTJELE1BQU0sY0FBYzs2QkFDMUUsU0FBUyx3QkFBd0IsU0FBUzs7OzhCQUd6QyxTQUFTOzs7OztpQkFLdEIsSUFBSSxPQUFPO2tCQUNWLElBQUksUUFBUTs7a0JBRVosU0FBUzs7Ozs7OztvQkFPUCxPQUFPLE1BQU07Ozs7OztvQkFNYixPQUFPLE1BQU0sUUFBUSxhQUFhLFdBQVcsbUJBQW1CLHlCQUF5Qjs7eUJBRXBGLE9BQU8sTUFBTTs7d0NBRUUsd0JBQXdCOzs7Ozs7OztzQkFRMUMsT0FBTyxNQUFNOzs7Ozs7O1FBTzNCLE9BQU8sS0FBSyxXQUFXLENBQ3RCLEtBQ0UsUUFBUSxHQUFHLElBQUk7OzthQUlqQixDQUNBLEtBQUssS0FBSyxDQUFDOzs7Ozs7Ozs7Ozs7OztXQWNULFNBQVM7ZUFDTCxTQUFTOzs7Ozt3QkFLQSxPQUFPLE1BQU07Ozs7O3dDQUtHLE9BQU8sTUFBTTs7Ozs7OzttQkFPbEMsU0FBUzs7Ozs7MEJBS0YsT0FBTyxNQUFNLGNBQWMsT0FBTyxNQUFNOzs7Ozs7O2VBT25ELFNBQVMsY0FBYyxTQUFTO1FBQ3ZDLE1BQU07R0FDUixZQUFZLEVBQUU7R0FDZiJ9
198
+
199
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwudGVtcGxhdGUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlbXBsYXRlL2ltcGxlbWVudGF0aW9ucy9tb2RlbC50ZW1wbGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB6IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uLy4uL2FwaVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi8uLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgRW50aXR5TmFtZXNSZWNvcmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi8uLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBnZXRab2RUeXBlQnlJZCwgem9kVHlwZVRvUmVuZGVyaW5nTm9kZSB9IGZyb20gXCIuLi96b2QtY29udmVydGVyXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZV9fdmlld19saXN0IH0gZnJvbSBcIi4vdmlld19saXN0LnRlbXBsYXRlXCI7XG5leHBvcnQgY2xhc3MgVGVtcGxhdGVfX21vZGVsIGV4dGVuZHMgVGVtcGxhdGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIm1vZGVsXCIpO1xuICB9XG5cbiAgZ2V0VGFyZ2V0QW5kUGF0aChuYW1lczogRW50aXR5TmFtZXNSZWNvcmQpIHtcbiAgICBjb25zdCB7IGRpciB9ID0gU29uYW11LmNvbmZpZy5hcGk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiBgJHtkaXJ9L3NyYy9hcHBsaWNhdGlvbmAsXG4gICAgICBwYXRoOiBgJHtuYW1lcy5mc30vJHtuYW1lcy5mc30ubW9kZWwudHNgLFxuICAgIH07XG4gIH1cblxuICBvdmVycmlkZSBnZXRSZXF1aXJlZERpY3RLZXlzKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgcmV0dXJuIFtcImVycm9yLmVudGl0eU5vdEZvdW5kXCIsIFwiZXJyb3IudW5rbm93blNlYXJjaEZpZWxkXCJdO1xuICB9XG5cbiAgYXN5bmMgcmVuZGVyKHsgZW50aXR5SWQgfTogVGVtcGxhdGVPcHRpb25zW1wibW9kZWxcIl0pIHtcbiAgICBOYWl0ZS50KFwicmVuZGVyXCIsIHsgZW50aXR5SWQgfSk7XG5cbiAgICBjb25zdCBsaXN0UGFyYW1zWm9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKGAke2VudGl0eUlkfUxpc3RQYXJhbXNgKTtcbiAgICBjb25zdCBsaXN0UGFyYW1zTm9kZSA9IHpvZFR5cGVUb1JlbmRlcmluZ05vZGUobGlzdFBhcmFtc1pvZFR5cGUpO1xuXG4gICAgY29uc3Qgc3Vic2V0S2V5Wm9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKGAke2VudGl0eUlkfVN1YnNldEtleWApO1xuICAgIGNvbnN0IHN1YnNldEtleXMgPSAoc3Vic2V0S2V5Wm9kVHlwZSBhcyB6LlpvZEVudW0pLmVudW07XG5cbiAgICBjb25zdCBuYW1lcyA9IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpO1xuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcblxuICAgIGNvbnN0IHZsVHBsID0gbmV3IFRlbXBsYXRlX192aWV3X2xpc3QoKTtcbiAgICBpZiAobGlzdFBhcmFtc05vZGU/LmNoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbGlzdFBhcmFtc05vZGXqsIAg7JeG7Iq164uI64ukLiAke2VudGl0eUlkfWApO1xuICAgIH1cbiAgICBjb25zdCBkZWYgPSB2bFRwbC5nZXREZWZhdWx0KGxpc3RQYXJhbXNOb2RlLmNoaWxkcmVuKTtcblxuICAgIC8vIOyXkOufrCDrqZTsi5zsp4Ag7IOd7ISxXG4gICAgY29uc3Qgbm90Rm91bmRFcnJvciA9IGBTRChcImVycm9yLmVudGl0eU5vdEZvdW5kXCIpKFwiJHtuYW1lcy5jYXBpdGFsfVwiLCBpZClgO1xuICAgIGNvbnN0IHVua25vd25TZWFyY2hGaWVsZEVycm9yID0gYFNEKFwiZXJyb3IudW5rbm93blNlYXJjaEZpZWxkXCIpKHBhcmFtcy5zZWFyY2gpYDtcblxuICAgIC8vIFBLIO2DgOyeheyXkCDrlLDrpbggVHlwZVNjcmlwdCDtg4DsnoUg6rKw7KCVXG4gICAgY29uc3QgcGtUeXBlID0gZW50aXR5LmdldFBrVHlwZSgpO1xuICAgIGNvbnN0IGlkVHNUeXBlID0gcGtUeXBlID09PSBcInN0cmluZ1wiIHx8IHBrVHlwZSA9PT0gXCJ1dWlkXCIgPyBcInN0cmluZ1wiIDogXCJudW1iZXJcIjtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmdldFRhcmdldEFuZFBhdGgobmFtZXMpLFxuICAgICAgYm9keTogYFxuaW1wb3J0IHsgQmFzZU1vZGVsQ2xhc3MsIHR5cGUgTGlzdFJlc3VsdCwgYXNBcnJheSwgTm90Rm91bmRFeGNlcHRpb24sIEJhZFJlcXVlc3RFeGNlcHRpb24sIGFwaSwgZXhoYXVzdGl2ZSB9IGZyb20gJ3NvbmFtdSc7XG5pbXBvcnQge1xuICAke2VudGl0eUlkfVN1YnNldEtleSxcbiAgJHtlbnRpdHlJZH1TdWJzZXRNYXBwaW5nLFxufSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHtcbiAgJHtuYW1lcy5jYW1lbH1TdWJzZXRRdWVyaWVzLFxuICAke25hbWVzLmNhbWVsfUxvYWRlclF1ZXJpZXMsXG59IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkLnNzb1wiO1xuaW1wb3J0IHsgJHtlbnRpdHlJZH1MaXN0UGFyYW1zLCAke2VudGl0eUlkfVNhdmVQYXJhbXMgfSBmcm9tIFwiLi8ke25hbWVzLmZzfS50eXBlc1wiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcblxuLypcbiAgJHtlbnRpdHlJZH0gTW9kZWxcbiovXG5jbGFzcyAke2VudGl0eUlkfU1vZGVsQ2xhc3MgZXh0ZW5kcyBCYXNlTW9kZWxDbGFzczxcbiAgJHtlbnRpdHlJZH1TdWJzZXRLZXksXG4gICR7ZW50aXR5SWR9U3Vic2V0TWFwcGluZyxcbiAgdHlwZW9mICR7bmFtZXMuY2FtZWx9U3Vic2V0UXVlcmllcyxcbiAgdHlwZW9mICR7bmFtZXMuY2FtZWx9TG9hZGVyUXVlcmllc1xuPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiJHtlbnRpdHlJZH1cIiwgJHtuYW1lcy5jYW1lbH1TdWJzZXRRdWVyaWVzLCAke25hbWVzLmNhbWVsfUxvYWRlclF1ZXJpZXMpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCIke2VudGl0eUlkfVwiIH0pXG4gIGFzeW5jIGZpbmRCeUlkPFQgZXh0ZW5kcyAke2VudGl0eUlkfVN1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIGlkOiAke2lkVHNUeXBlfVxuICApOiBQcm9taXNlPCR7ZW50aXR5SWR9U3Vic2V0TWFwcGluZ1tUXT4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgdGhpcy5maW5kTWFueShzdWJzZXQsIHtcbiAgICAgIGlkLFxuICAgICAgbnVtOiAxLFxuICAgICAgcGFnZTogMSxcbiAgICB9KTtcbiAgICBpZiAoIXJvd3NbMF0pIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbigke25vdEZvdW5kRXJyb3J9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm93c1swXTtcbiAgfVxuXG4gIGFzeW5jIGZpbmRPbmU8VCBleHRlbmRzICR7ZW50aXR5SWR9U3Vic2V0S2V5PihcbiAgICBzdWJzZXQ6IFQsXG4gICAgbGlzdFBhcmFtczogJHtlbnRpdHlJZH1MaXN0UGFyYW1zXG4gICk6IFByb21pc2U8JHtlbnRpdHlJZH1TdWJzZXRNYXBwaW5nW1RdIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgdGhpcy5maW5kTWFueShzdWJzZXQsIHtcbiAgICAgIC4uLmxpc3RQYXJhbXMsXG4gICAgICBudW06IDEsXG4gICAgICBwYWdlOiAxLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJvd3NbMF0gPz8gbnVsbDtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdLCByZXNvdXJjZU5hbWU6IFwiJHtuYW1lcy5jYXBpdGFsUGx1cmFsfVwiIH0pXG4gIGFzeW5jIGZpbmRNYW55PFQgZXh0ZW5kcyAke2VudGl0eUlkfVN1YnNldEtleSwgTFAgZXh0ZW5kcyAke2VudGl0eUlkfUxpc3RQYXJhbXM+KFxuICAgIHN1YnNldDogVCxcbiAgICByYXdQYXJhbXM/OiBMUCxcbiAgKTogUHJvbWlzZTxMaXN0UmVzdWx0PExQLCAke2VudGl0eUlkfVN1YnNldE1hcHBpbmdbVF0+PiB7XG4gICAgLy8gcGFyYW1zIHdpdGggZGVmYXVsdHNcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBudW06IDI0LFxuICAgICAgcGFnZTogMSxcbiAgICAgIHNlYXJjaDogXCIke2RlZi5zZWFyY2h9XCIgYXMgY29uc3QsXG4gICAgICBvcmRlckJ5OiBcIiR7ZGVmLm9yZGVyQnl9XCIgYXMgY29uc3QsXG4gICAgICAuLi5yYXdQYXJhbXMsXG4gICAgfSBzYXRpc2ZpZXMgJHtlbnRpdHlJZH1MaXN0UGFyYW1zO1xuXG4gICAgLy8gYnVpbGQgcXVlcmllc1xuICAgIGNvbnN0IHsgcWIsIG9uU3Vic2V0OiBfIH0gPSB0aGlzLmdldFN1YnNldFF1ZXJpZXMoc3Vic2V0KTtcbiAgICBcbiAgICAvLyBpZFxuICAgIGlmIChwYXJhbXMuaWQpIHtcbiAgICAgIHFiLndoZXJlSW4oXCIke2VudGl0eS50YWJsZX0uaWRcIiwgYXNBcnJheShwYXJhbXMuaWQpKTtcbiAgICB9XG5cbiAgICAvLyBzZWFyY2gta2V5d29yZFxuICAgIGlmIChwYXJhbXMuc2VhcmNoICYmIHBhcmFtcy5rZXl3b3JkICYmIHBhcmFtcy5rZXl3b3JkLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChwYXJhbXMuc2VhcmNoID09PSBcImlkXCIpIHtcbiAgICAgICAgcWIud2hlcmUoXCIke2VudGl0eS50YWJsZX0uaWRcIiwgJHtpZFRzVHlwZSA9PT0gXCJzdHJpbmdcIiA/IFwicGFyYW1zLmtleXdvcmRcIiA6IFwiTnVtYmVyKHBhcmFtcy5rZXl3b3JkKVwifSk7XG4gICAgICAgIC8vIH0gZWxzZSBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJmaWVsZFwiKSB7XG4gICAgICAgIC8vICAgcWIud2hlcmUoXCIke2VudGl0eS50YWJsZX0uZmllbGRcIiwgXCJsaWtlXCIsIFxcYCVcXCR7cGFyYW1zLmtleXdvcmR9JVxcYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbigke3Vua25vd25TZWFyY2hGaWVsZEVycm9yfSk7XG4gICAgICB9XG4gICAgfVxuICAgICAgXG4gICAgLy8gb3JkZXJCeVxuICAgIGlmIChwYXJhbXMub3JkZXJCeSkge1xuICAgICAgLy8gZGVmYXVsdCBvcmRlckJ5XG4gICAgICBpZiAocGFyYW1zLm9yZGVyQnkgPT09IFwiaWQtZGVzY1wiKSB7XG4gICAgICAgIHFiLm9yZGVyQnkoXCIke2VudGl0eS50YWJsZX0uaWRcIiwgXCJkZXNjXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhoYXVzdGl2ZShwYXJhbXMub3JkZXJCeSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZW5oYW5jZXJzID0gdGhpcy5jcmVhdGVFbmhhbmNlcnMoe1xuICAgICAgJHtPYmplY3Qua2V5cyhzdWJzZXRLZXlzKVxuICAgICAgICAubWFwKFxuICAgICAgICAgIChrZXkpID0+IGAke2tleX06IChyb3cpID0+ICh7XG4gICAgICAgICAgLi4ucm93LFxuICAgICAgICAgIC8vIOyEnOu4jOyFi+uzhOuhnCB2aXJ0dWFsIO2VhOuTnCDqs4TsgrDroZzsp4Eg7LaU6rCAXG4gICAgICAgIH0pLGAsXG4gICAgICAgIClcbiAgICAgICAgLmpvaW4oXCJcXG5cIil9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlU3Vic2V0UXVlcnkoe1xuICAgICAgc3Vic2V0LFxuICAgICAgcWIsXG4gICAgICBwYXJhbXMsXG4gICAgICBlbmhhbmNlcnMsXG4gICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgfSk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgc2F2ZShcbiAgICBzcGE6ICR7ZW50aXR5SWR9U2F2ZVBhcmFtc1tdXG4gICk6IFByb21pc2U8JHtpZFRzVHlwZX1bXT4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG5cbiAgICAvLyByZWdpc3RlclxuICAgIHNwYS5mb3JFYWNoKChzcCkgPT4ge1xuICAgICAgd2RiLnViUmVnaXN0ZXIoXCIke2VudGl0eS50YWJsZX1cIiwgc3ApO1xuICAgIH0pO1xuXG4gICAgLy8gdHJhbnNhY3Rpb25cbiAgICByZXR1cm4gd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIGNvbnN0IGlkcyA9IGF3YWl0IHRyeC51YlVwc2VydChcIiR7ZW50aXR5LnRhYmxlfVwiKTtcblxuICAgICAgcmV0dXJuIGlkcztcbiAgICB9KTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSwgZ3VhcmRzOiBbIFwiYWRtaW5cIiBdIH0pXG4gIGFzeW5jIGRlbChpZHM6ICR7aWRUc1R5cGV9W10pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG5cbiAgICAvLyB0cmFuc2FjdGlvblxuICAgIGF3YWl0IHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICByZXR1cm4gdHJ4LnRhYmxlKFwiJHtlbnRpdHkudGFibGV9XCIpLndoZXJlSW4oXCIke2VudGl0eS50YWJsZX0uaWRcIiwgaWRzKS5kZWxldGUoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBpZHMubGVuZ3RoO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCAke2VudGl0eUlkfU1vZGVsID0gbmV3ICR7ZW50aXR5SWR9TW9kZWxDbGFzcygpO1xuICAgICAgYC50cmltKCksXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICB9O1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O1NBRWtDO29CQUN5QjtXQUVsQjtjQUVIO21CQUNtQztBQUV6RSxJQUFhLGtCQUFiLGNBQXFDLFNBQVM7Q0FDNUMsY0FBYztFQUNaLE1BQU0sT0FBTztDQUNmO0NBRUEsaUJBQWlCLE9BQTBCO0VBQ3pDLE1BQU0sRUFBRSxRQUFRLE9BQU8sT0FBTztFQUU5QixPQUFPO0dBQ0wsUUFBUSxHQUFHLElBQUk7R0FDZixNQUFNLEdBQUcsTUFBTSxHQUFHLEdBQUcsTUFBTSxHQUFHO0VBQ2hDO0NBQ0Y7Q0FFQSxzQkFBZ0Q7RUFDOUMsT0FBTyxDQUFDLHdCQUF3QiwwQkFBMEI7Q0FDNUQ7Q0FFQSxNQUFNLE9BQU8sRUFBRSxZQUFzQztFQUNuRCxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQztFQUc5QixNQUFNLGlCQUFpQix1QkFBdUIsTUFEZCxlQUFlLEdBQUcsU0FBUyxXQUFXLENBQ1A7RUFHL0QsTUFBTSxjQUFjLE1BRFcsZUFBZSxHQUFHLFNBQVMsVUFBVSxFQUNoRCxDQUErQjtFQUVuRCxNQUFNLFFBQVEsY0FBYyxlQUFlLFFBQVE7RUFDbkQsTUFBTSxTQUFTLGNBQWMsSUFBSSxRQUFRO0VBRXpDLE1BQU0sUUFBUSxJQUFJLG9CQUFvQjtFQUN0QyxJQUFJLGdCQUFnQixhQUFhLFFBQy9CLE1BQU0sSUFBSSxNQUFNLHlCQUF5QixVQUFVO0VBRXJELE1BQU0sTUFBTSxNQUFNLFdBQVcsZUFBZSxRQUFRO0VBR3BELE1BQU0sZ0JBQWdCLCtCQUErQixNQUFNLFFBQVE7RUFDbkUsTUFBTSwwQkFBMEI7RUFHaEMsTUFBTSxTQUFTLE9BQU8sVUFBVTtFQUNoQyxNQUFNLFdBQVcsV0FBVyxZQUFZLFdBQVcsU0FBUyxXQUFXO0VBRXZFLE9BQU87R0FDTCxHQUFHLEtBQUssaUJBQWlCLEtBQUs7R0FDOUIsTUFBTTs7O0lBR1IsU0FBUztJQUNULFNBQVM7OztJQUdULE1BQU0sTUFBTTtJQUNaLE1BQU0sTUFBTTs7V0FFTCxTQUFTLGNBQWMsU0FBUyx1QkFBdUIsTUFBTSxHQUFHOzs7O0lBSXZFLFNBQVM7O1FBRUwsU0FBUztJQUNiLFNBQVM7SUFDVCxTQUFTO1dBQ0YsTUFBTSxNQUFNO1dBQ1osTUFBTSxNQUFNOzs7YUFHVixTQUFTLEtBQUssTUFBTSxNQUFNLGlCQUFpQixNQUFNLE1BQU07OzttRkFHZSxTQUFTOzZCQUMvRCxTQUFTOztVQUU1QixTQUFTO2VBQ0osU0FBUzs7Ozs7OztvQ0FPWSxjQUFjOzs7Ozs7NEJBTXRCLFNBQVM7O2tCQUVuQixTQUFTO2VBQ1osU0FBUzs7Ozs7Ozs7OzttRkFVMkQsTUFBTSxjQUFjOzZCQUMxRSxTQUFTLHdCQUF3QixTQUFTOzs7OEJBR3pDLFNBQVM7Ozs7O2lCQUt0QixJQUFJLE9BQU87a0JBQ1YsSUFBSSxRQUFROztrQkFFWixTQUFTOzs7Ozs7O29CQU9QLE9BQU8sTUFBTTs7Ozs7O29CQU1iLE9BQU8sTUFBTSxRQUFRLGFBQWEsV0FBVyxtQkFBbUIseUJBQXlCOzt5QkFFcEYsT0FBTyxNQUFNOzt3Q0FFRSx3QkFBd0I7Ozs7Ozs7O3NCQVExQyxPQUFPLE1BQU07Ozs7Ozs7UUFPM0IsT0FBTyxLQUFLLFVBQVUsQ0FBQyxDQUN0QixLQUNFLFFBQVEsR0FBRyxJQUFJOzs7WUFJbEIsQ0FBQyxDQUNBLEtBQUssSUFBSSxFQUFFOzs7Ozs7Ozs7Ozs7OztXQWNULFNBQVM7ZUFDTCxTQUFTOzs7Ozt3QkFLQSxPQUFPLE1BQU07Ozs7O3dDQUtHLE9BQU8sTUFBTTs7Ozs7OzttQkFPbEMsU0FBUzs7Ozs7MEJBS0YsT0FBTyxNQUFNLGNBQWMsT0FBTyxNQUFNOzs7Ozs7O2VBT25ELFNBQVMsY0FBYyxTQUFTO1FBQ3ZDLEtBQUs7R0FDUCxZQUFZLENBQUM7RUFDZjtDQUNGO0FBQ0YifQ==