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
@@ -1,36 +1,29 @@
1
- import { __esmMin } from "../_virtual/rolldown_runtime.js";
1
+ import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
2
  import { init_types, isBelongsToOneRelationProp, isManyToManyRelationProp, isOneToOneRelationProp, isRelationProp } from "../types/types.js";
3
3
  import { EntityManager, init_entity_manager } from "../entity/entity-manager.js";
4
-
5
4
  //#region src/testing/_relation-graph.ts
6
5
  var RelationGraph;
7
6
  var init__relation_graph = __esmMin((() => {
8
7
  init_entity_manager();
9
8
  init_types();
10
9
  RelationGraph = class {
11
- graph = new Map();
10
+ graph = /* @__PURE__ */ new Map();
12
11
  buildGraph(fixtures) {
13
12
  this.graph.clear();
14
- for (const fixture of fixtures) {
15
- this.graph.set(fixture.fixtureId, {
16
- fixtureId: fixture.fixtureId,
17
- entityId: fixture.entityId,
18
- related: new Set()
19
- });
20
- }
13
+ for (const fixture of fixtures) this.graph.set(fixture.fixtureId, {
14
+ fixtureId: fixture.fixtureId,
15
+ entityId: fixture.entityId,
16
+ related: /* @__PURE__ */ new Set()
17
+ });
21
18
  for (const fixture of fixtures) {
22
19
  const node = this.graph.get(fixture.fixtureId);
23
- if (node === undefined) {
24
- throw new Error(`Node not found for fixture ${fixture.fixtureId}`);
25
- }
20
+ if (node === void 0) throw new Error(`Node not found for fixture ${fixture.fixtureId}`);
26
21
  for (const [, column] of Object.entries(fixture.columns)) {
27
22
  const prop = column.prop;
28
23
  if (isRelationProp(prop)) {
29
24
  if (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn) {
30
25
  const relatedFixtureId = `${prop.with}#${column.value}`;
31
- if (this.graph.has(relatedFixtureId)) {
32
- node.related.add(relatedFixtureId);
33
- }
26
+ if (this.graph.has(relatedFixtureId)) node.related.add(relatedFixtureId);
34
27
  } else if (isManyToManyRelationProp(prop)) {
35
28
  const relatedIds = column.value;
36
29
  for (const relatedId of relatedIds) {
@@ -46,9 +39,9 @@ var init__relation_graph = __esmMin((() => {
46
39
  }
47
40
  }
48
41
  getInsertionOrder() {
49
- const visited = new Set();
42
+ const visited = /* @__PURE__ */ new Set();
50
43
  const order = [];
51
- const tempVisited = new Set();
44
+ const tempVisited = /* @__PURE__ */ new Set();
52
45
  const visit = (fixtureId) => {
53
46
  if (visited.has(fixtureId)) return;
54
47
  if (tempVisited.has(fixtureId)) {
@@ -57,38 +50,26 @@ var init__relation_graph = __esmMin((() => {
57
50
  }
58
51
  tempVisited.add(fixtureId);
59
52
  const node = this.graph.get(fixtureId);
60
- if (node === undefined) {
61
- throw new Error(`Node not found for fixture ${fixtureId}`);
62
- }
53
+ if (node === void 0) throw new Error(`Node not found for fixture ${fixtureId}`);
63
54
  const entity = EntityManager.get(node.entityId);
64
55
  for (const depId of node.related) {
65
56
  const depNode = this.graph.get(depId);
66
- if (depNode === undefined) {
67
- throw new Error(`Node not found for fixture ${depId}`);
68
- }
57
+ if (depNode === void 0) throw new Error(`Node not found for fixture ${depId}`);
69
58
  const relationProp = entity.props.find((prop) => isRelationProp(prop) && (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn) && prop.with === depNode.entityId);
70
- if (relationProp && !relationProp.nullable) {
71
- visit(depId);
72
- }
59
+ if (relationProp && !relationProp.nullable) visit(depId);
73
60
  }
74
61
  tempVisited.delete(fixtureId);
75
62
  visited.add(fixtureId);
76
63
  order.push(fixtureId);
77
64
  };
78
- for (const fixtureId of this.graph.keys()) {
79
- visit(fixtureId);
80
- }
81
- for (const fixtureId of this.graph.keys()) {
82
- if (!visited.has(fixtureId)) {
83
- order.push(fixtureId);
84
- }
85
- }
65
+ for (const fixtureId of this.graph.keys()) visit(fixtureId);
66
+ for (const fixtureId of this.graph.keys()) if (!visited.has(fixtureId)) order.push(fixtureId);
86
67
  return order;
87
68
  }
88
69
  };
89
70
  }));
90
-
91
71
  //#endregion
92
72
  init__relation_graph();
93
73
  export { RelationGraph, init__relation_graph };
94
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3JlbGF0aW9uLWdyYXBoLmpzIiwibmFtZXMiOlsib3JkZXI6IHN0cmluZ1tdIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3RpbmcvX3JlbGF0aW9uLWdyYXBoLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIEZpeHR1cmVSZWNvcmQsIHR5cGUgUmVsYXRpb25Ob2RlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQge1xuICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wLFxuICBpc09uZVRvT25lUmVsYXRpb25Qcm9wLFxuICBpc1JlbGF0aW9uUHJvcCxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5cbi8vIOq0gOqzhCDqt7jrnpjtlIQg7LKY66as66W8IOuzhOuPhCDtgbTrnpjsiqTroZwg67aE66asXG5leHBvcnQgY2xhc3MgUmVsYXRpb25HcmFwaCB7XG4gIHByaXZhdGUgZ3JhcGg6IE1hcDxzdHJpbmcsIFJlbGF0aW9uTm9kZT4gPSBuZXcgTWFwKCk7XG5cbiAgYnVpbGRHcmFwaChmaXh0dXJlczogRml4dHVyZVJlY29yZFtdKTogdm9pZCB7XG4gICAgdGhpcy5ncmFwaC5jbGVhcigpO1xuXG4gICAgLy8gMS4g64W465OcIOy2lOqwgFxuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgdGhpcy5ncmFwaC5zZXQoZml4dHVyZS5maXh0dXJlSWQsIHtcbiAgICAgICAgZml4dHVyZUlkOiBmaXh0dXJlLmZpeHR1cmVJZCxcbiAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgIHJlbGF0ZWQ6IG5ldyBTZXQoKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIDIuIOydmOyhtOyEsSDstpTqsIBcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdyYXBoLmdldChmaXh0dXJlLmZpeHR1cmVJZCk7XG4gICAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSBub3QgZm91bmQgZm9yIGZpeHR1cmUgJHtmaXh0dXJlLmZpeHR1cmVJZH1gKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBbLCBjb2x1bW5dIG9mIE9iamVjdC5lbnRyaWVzKGZpeHR1cmUuY29sdW1ucykpIHtcbiAgICAgICAgY29uc3QgcHJvcCA9IGNvbHVtbi5wcm9wO1xuXG4gICAgICAgIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8XG4gICAgICAgICAgICAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkRml4dHVyZUlkID0gYCR7cHJvcC53aXRofSMke2NvbHVtbi52YWx1ZX1gO1xuICAgICAgICAgICAgaWYgKHRoaXMuZ3JhcGguaGFzKHJlbGF0ZWRGaXh0dXJlSWQpKSB7XG4gICAgICAgICAgICAgIG5vZGUucmVsYXRlZC5hZGQocmVsYXRlZEZpeHR1cmVJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChpc01hbnlUb01hbnlSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICAgIC8vIE1hbnlUb01hbnkg6rSA6rOE7J2YIOqyveyasCDslpHrsKntlqUg7J2Y7KG07ISxIOy2lOqwgFxuICAgICAgICAgICAgY29uc3QgcmVsYXRlZElkcyA9IGNvbHVtbi52YWx1ZSBhcyB1bmtub3duIGFzIChudW1iZXIgfCBzdHJpbmcpW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlbGF0ZWRJZCBvZiByZWxhdGVkSWRzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRGaXh0dXJlSWQgPSBgJHtwcm9wLndpdGh9IyR7cmVsYXRlZElkfWA7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmdyYXBoLmhhcyhyZWxhdGVkRml4dHVyZUlkKSkge1xuICAgICAgICAgICAgICAgIG5vZGUucmVsYXRlZC5hZGQocmVsYXRlZEZpeHR1cmVJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmFwaC5nZXQocmVsYXRlZEZpeHR1cmVJZCk/LnJlbGF0ZWQuYWRkKGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldEluc2VydGlvbk9yZGVyKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3Qgb3JkZXI6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgdGVtcFZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0IHZpc2l0ID0gKGZpeHR1cmVJZDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAodmlzaXRlZC5oYXMoZml4dHVyZUlkKSkgcmV0dXJuO1xuICAgICAgaWYgKHRlbXBWaXNpdGVkLmhhcyhmaXh0dXJlSWQpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgQ2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZCBpbnZvbHZpbmc6ICR7Zml4dHVyZUlkfWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRlbXBWaXNpdGVkLmFkZChmaXh0dXJlSWQpO1xuXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5ncmFwaC5nZXQoZml4dHVyZUlkKTtcbiAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlIG5vdCBmb3VuZCBmb3IgZml4dHVyZSAke2ZpeHR1cmVJZH1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KG5vZGUuZW50aXR5SWQpO1xuXG4gICAgICBmb3IgKGNvbnN0IGRlcElkIG9mIG5vZGUucmVsYXRlZCkge1xuICAgICAgICBjb25zdCBkZXBOb2RlID0gdGhpcy5ncmFwaC5nZXQoZGVwSWQpO1xuICAgICAgICBpZiAoZGVwTm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlIG5vdCBmb3VuZCBmb3IgZml4dHVyZSAke2RlcElkfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmVsb25nc1RvT25lIOq0gOqzhOydtOuptOyEnCBudWxsYWJsZeydtCDslYTri4wg6rK97JqwIOuovOyggCDrsKnrrLhcbiAgICAgICAgY29uc3QgcmVsYXRpb25Qcm9wID0gZW50aXR5LnByb3BzLmZpbmQoXG4gICAgICAgICAgKHByb3ApID0+XG4gICAgICAgICAgICBpc1JlbGF0aW9uUHJvcChwcm9wKSAmJlxuICAgICAgICAgICAgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8XG4gICAgICAgICAgICAgIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbikpICYmXG4gICAgICAgICAgICBwcm9wLndpdGggPT09IGRlcE5vZGUuZW50aXR5SWQsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZWxhdGlvblByb3AgJiYgIXJlbGF0aW9uUHJvcC5udWxsYWJsZSkge1xuICAgICAgICAgIHZpc2l0KGRlcElkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0ZW1wVmlzaXRlZC5kZWxldGUoZml4dHVyZUlkKTtcbiAgICAgIHZpc2l0ZWQuYWRkKGZpeHR1cmVJZCk7XG4gICAgICBvcmRlci5wdXNoKGZpeHR1cmVJZCk7XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgZml4dHVyZUlkIG9mIHRoaXMuZ3JhcGgua2V5cygpKSB7XG4gICAgICB2aXNpdChmaXh0dXJlSWQpO1xuICAgIH1cblxuICAgIC8vIGNpcmN1bGFyIGRlcGVuZGVuY3nroZwg7J247ZW0IOuwqeusuOuQmOyngCDslYrsnYAgZml4dHVyZUlkIOy2lOqwgFxuICAgIGZvciAoY29uc3QgZml4dHVyZUlkIG9mIHRoaXMuZ3JhcGgua2V5cygpKSB7XG4gICAgICBpZiAoIXZpc2l0ZWQuaGFzKGZpeHR1cmVJZCkpIHtcbiAgICAgICAgb3JkZXIucHVzaChmaXh0dXJlSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvcmRlcjtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O3NCQUF5RDthQU9qQztDQUdYLGdCQUFiLE1BQTJCO0VBQ3pCLEFBQVEsUUFBbUMsSUFBSSxLQUFLO0VBRXBELFdBQVcsVUFBaUM7QUFDMUMsUUFBSyxNQUFNLE9BQU87QUFHbEIsUUFBSyxNQUFNLFdBQVcsVUFBVTtBQUM5QixTQUFLLE1BQU0sSUFBSSxRQUFRLFdBQVc7S0FDaEMsV0FBVyxRQUFRO0tBQ25CLFVBQVUsUUFBUTtLQUNsQixTQUFTLElBQUksS0FBSztLQUNuQixDQUFDOztBQUlKLFFBQUssTUFBTSxXQUFXLFVBQVU7SUFDOUIsTUFBTSxPQUFPLEtBQUssTUFBTSxJQUFJLFFBQVEsVUFBVTtBQUM5QyxRQUFJLFNBQVMsV0FBVztBQUN0QixXQUFNLElBQUksTUFBTSw4QkFBOEIsUUFBUSxZQUFZOztBQUdwRSxTQUFLLE1BQU0sR0FBRyxXQUFXLE9BQU8sUUFBUSxRQUFRLFFBQVEsRUFBRTtLQUN4RCxNQUFNLE9BQU8sT0FBTztBQUVwQixTQUFJLGVBQWUsS0FBSyxFQUFFO0FBQ3hCLFVBQ0UsMkJBQTJCLEtBQUssSUFDL0IsdUJBQXVCLEtBQUssSUFBSSxLQUFLLGVBQ3RDO09BQ0EsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLEtBQUssR0FBRyxPQUFPO0FBQ2hELFdBQUksS0FBSyxNQUFNLElBQUksaUJBQWlCLEVBQUU7QUFDcEMsYUFBSyxRQUFRLElBQUksaUJBQWlCOztpQkFFM0IseUJBQXlCLEtBQUssRUFBRTtPQUV6QyxNQUFNLGFBQWEsT0FBTztBQUMxQixZQUFLLE1BQU0sYUFBYSxZQUFZO1FBQ2xDLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxLQUFLLEdBQUc7QUFDekMsWUFBSSxLQUFLLE1BQU0sSUFBSSxpQkFBaUIsRUFBRTtBQUNwQyxjQUFLLFFBQVEsSUFBSSxpQkFBaUI7QUFDbEMsY0FBSyxNQUFNLElBQUksaUJBQWlCLEVBQUUsUUFBUSxJQUFJLFFBQVEsVUFBVTs7Ozs7Ozs7RUFTOUUsb0JBQThCO0dBQzVCLE1BQU0sVUFBVSxJQUFJLEtBQWE7R0FDakMsTUFBTUEsUUFBa0IsRUFBRTtHQUMxQixNQUFNLGNBQWMsSUFBSSxLQUFhO0dBRXJDLE1BQU0sU0FBUyxjQUFzQjtBQUNuQyxRQUFJLFFBQVEsSUFBSSxVQUFVLENBQUU7QUFDNUIsUUFBSSxZQUFZLElBQUksVUFBVSxFQUFFO0FBQzlCLGFBQVEsS0FBSywyQ0FBMkMsWUFBWTtBQUNwRTs7QUFHRixnQkFBWSxJQUFJLFVBQVU7SUFFMUIsTUFBTSxPQUFPLEtBQUssTUFBTSxJQUFJLFVBQVU7QUFDdEMsUUFBSSxTQUFTLFdBQVc7QUFDdEIsV0FBTSxJQUFJLE1BQU0sOEJBQThCLFlBQVk7O0lBRTVELE1BQU0sU0FBUyxjQUFjLElBQUksS0FBSyxTQUFTO0FBRS9DLFNBQUssTUFBTSxTQUFTLEtBQUssU0FBUztLQUNoQyxNQUFNLFVBQVUsS0FBSyxNQUFNLElBQUksTUFBTTtBQUNyQyxTQUFJLFlBQVksV0FBVztBQUN6QixZQUFNLElBQUksTUFBTSw4QkFBOEIsUUFBUTs7S0FJeEQsTUFBTSxlQUFlLE9BQU8sTUFBTSxNQUMvQixTQUNDLGVBQWUsS0FBSyxLQUNuQiwyQkFBMkIsS0FBSyxJQUM5Qix1QkFBdUIsS0FBSyxJQUFJLEtBQUssa0JBQ3hDLEtBQUssU0FBUyxRQUFRLFNBQ3pCO0FBQ0QsU0FBSSxnQkFBZ0IsQ0FBQyxhQUFhLFVBQVU7QUFDMUMsWUFBTSxNQUFNOzs7QUFJaEIsZ0JBQVksT0FBTyxVQUFVO0FBQzdCLFlBQVEsSUFBSSxVQUFVO0FBQ3RCLFVBQU0sS0FBSyxVQUFVOztBQUd2QixRQUFLLE1BQU0sYUFBYSxLQUFLLE1BQU0sTUFBTSxFQUFFO0FBQ3pDLFVBQU0sVUFBVTs7QUFJbEIsUUFBSyxNQUFNLGFBQWEsS0FBSyxNQUFNLE1BQU0sRUFBRTtBQUN6QyxRQUFJLENBQUMsUUFBUSxJQUFJLFVBQVUsRUFBRTtBQUMzQixXQUFNLEtBQUssVUFBVTs7O0FBSXpCLFVBQU8ifQ==
74
+
75
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3JlbGF0aW9uLWdyYXBoLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL19yZWxhdGlvbi1ncmFwaC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBGaXh0dXJlUmVjb3JkLCB0eXBlIFJlbGF0aW9uTm9kZSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuXG4vLyDqtIDqs4Qg6re4656Y7ZSEIOyymOumrOulvCDrs4Trj4Qg7YG0656Y7Iqk66GcIOu2hOumrFxuZXhwb3J0IGNsYXNzIFJlbGF0aW9uR3JhcGgge1xuICBwcml2YXRlIGdyYXBoOiBNYXA8c3RyaW5nLCBSZWxhdGlvbk5vZGU+ID0gbmV3IE1hcCgpO1xuXG4gIGJ1aWxkR3JhcGgoZml4dHVyZXM6IEZpeHR1cmVSZWNvcmRbXSk6IHZvaWQge1xuICAgIHRoaXMuZ3JhcGguY2xlYXIoKTtcblxuICAgIC8vIDEuIOuFuOuTnCDstpTqsIBcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgIHRoaXMuZ3JhcGguc2V0KGZpeHR1cmUuZml4dHVyZUlkLCB7XG4gICAgICAgIGZpeHR1cmVJZDogZml4dHVyZS5maXh0dXJlSWQsXG4gICAgICAgIGVudGl0eUlkOiBmaXh0dXJlLmVudGl0eUlkLFxuICAgICAgICByZWxhdGVkOiBuZXcgU2V0KCksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAyLiDsnZjsobTshLEg7LaU6rCAXG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICBjb25zdCBub2RlID0gdGhpcy5ncmFwaC5nZXQoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgbm90IGZvdW5kIGZvciBmaXh0dXJlICR7Zml4dHVyZS5maXh0dXJlSWR9YCk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgWywgY29sdW1uXSBvZiBPYmplY3QuZW50cmllcyhmaXh0dXJlLmNvbHVtbnMpKSB7XG4gICAgICAgIGNvbnN0IHByb3AgPSBjb2x1bW4ucHJvcDtcblxuICAgICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtjb2x1bW4udmFsdWV9YDtcbiAgICAgICAgICAgIGlmICh0aGlzLmdyYXBoLmhhcyhyZWxhdGVkRml4dHVyZUlkKSkge1xuICAgICAgICAgICAgICBub2RlLnJlbGF0ZWQuYWRkKHJlbGF0ZWRGaXh0dXJlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgICAvLyBNYW55VG9NYW55IOq0gOqzhOydmCDqsr3smrAg7JaR67Cp7ZalIOydmOyhtOyEsSDstpTqsIBcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBjb2x1bW4udmFsdWUgYXMgdW5rbm93biBhcyAobnVtYmVyIHwgc3RyaW5nKVtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCByZWxhdGVkSWQgb2YgcmVsYXRlZElkcykge1xuICAgICAgICAgICAgICBjb25zdCByZWxhdGVkRml4dHVyZUlkID0gYCR7cHJvcC53aXRofSMke3JlbGF0ZWRJZH1gO1xuICAgICAgICAgICAgICBpZiAodGhpcy5ncmFwaC5oYXMocmVsYXRlZEZpeHR1cmVJZCkpIHtcbiAgICAgICAgICAgICAgICBub2RlLnJlbGF0ZWQuYWRkKHJlbGF0ZWRGaXh0dXJlSWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JhcGguZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpPy5yZWxhdGVkLmFkZChmaXh0dXJlLmZpeHR1cmVJZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRJbnNlcnRpb25PcmRlcigpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IG9yZGVyOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHRlbXBWaXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCB2aXNpdCA9IChmaXh0dXJlSWQ6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKHZpc2l0ZWQuaGFzKGZpeHR1cmVJZCkpIHJldHVybjtcbiAgICAgIGlmICh0ZW1wVmlzaXRlZC5oYXMoZml4dHVyZUlkKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYENpcmN1bGFyIGRlcGVuZGVuY3kgZGV0ZWN0ZWQgaW52b2x2aW5nOiAke2ZpeHR1cmVJZH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0ZW1wVmlzaXRlZC5hZGQoZml4dHVyZUlkKTtcblxuICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ3JhcGguZ2V0KGZpeHR1cmVJZCk7XG4gICAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSBub3QgZm91bmQgZm9yIGZpeHR1cmUgJHtmaXh0dXJlSWR9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChub2RlLmVudGl0eUlkKTtcblxuICAgICAgZm9yIChjb25zdCBkZXBJZCBvZiBub2RlLnJlbGF0ZWQpIHtcbiAgICAgICAgY29uc3QgZGVwTm9kZSA9IHRoaXMuZ3JhcGguZ2V0KGRlcElkKTtcbiAgICAgICAgaWYgKGRlcE5vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSBub3QgZm91bmQgZm9yIGZpeHR1cmUgJHtkZXBJZH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJlbG9uZ3NUb09uZSDqtIDqs4TsnbTrqbTshJwgbnVsbGFibGXsnbQg7JWE64uMIOqyveyasCDrqLzsoIAg67Cp66y4XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uUHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKFxuICAgICAgICAgIChwcm9wKSA9PlxuICAgICAgICAgICAgaXNSZWxhdGlvblByb3AocHJvcCkgJiZcbiAgICAgICAgICAgIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgICAgICAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pKSAmJlxuICAgICAgICAgICAgcHJvcC53aXRoID09PSBkZXBOb2RlLmVudGl0eUlkLFxuICAgICAgICApO1xuICAgICAgICBpZiAocmVsYXRpb25Qcm9wICYmICFyZWxhdGlvblByb3AubnVsbGFibGUpIHtcbiAgICAgICAgICB2aXNpdChkZXBJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGVtcFZpc2l0ZWQuZGVsZXRlKGZpeHR1cmVJZCk7XG4gICAgICB2aXNpdGVkLmFkZChmaXh0dXJlSWQpO1xuICAgICAgb3JkZXIucHVzaChmaXh0dXJlSWQpO1xuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IGZpeHR1cmVJZCBvZiB0aGlzLmdyYXBoLmtleXMoKSkge1xuICAgICAgdmlzaXQoZml4dHVyZUlkKTtcbiAgICB9XG5cbiAgICAvLyBjaXJjdWxhciBkZXBlbmRlbmN566GcIOyduO2VtCDrsKnrrLjrkJjsp4Ag7JWK7J2AIGZpeHR1cmVJZCDstpTqsIBcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmVJZCBvZiB0aGlzLmdyYXBoLmtleXMoKSkge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhmaXh0dXJlSWQpKSB7XG4gICAgICAgIG9yZGVyLnB1c2goZml4dHVyZUlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3JkZXI7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O3FCQUF3RDtZQU9qQztDQUdWLGdCQUFiLE1BQTJCO0VBQ3pCLHdCQUEyQyxJQUFJLElBQUk7RUFFbkQsV0FBVyxVQUFpQztHQUMxQyxLQUFLLE1BQU0sTUFBTTtHQUdqQixLQUFLLE1BQU0sV0FBVyxVQUNwQixLQUFLLE1BQU0sSUFBSSxRQUFRLFdBQVc7SUFDaEMsV0FBVyxRQUFRO0lBQ25CLFVBQVUsUUFBUTtJQUNsQix5QkFBUyxJQUFJLElBQUk7R0FDbkIsQ0FBQztHQUlILEtBQUssTUFBTSxXQUFXLFVBQVU7SUFDOUIsTUFBTSxPQUFPLEtBQUssTUFBTSxJQUFJLFFBQVEsU0FBUztJQUM3QyxJQUFJLFNBQVMsUUFDWCxNQUFNLElBQUksTUFBTSw4QkFBOEIsUUFBUSxXQUFXO0lBR25FLEtBQUssTUFBTSxHQUFHLFdBQVcsT0FBTyxRQUFRLFFBQVEsT0FBTyxHQUFHO0tBQ3hELE1BQU0sT0FBTyxPQUFPO0tBRXBCLElBQUksZUFBZSxJQUFJLEdBQ3JCO1VBQ0UsMkJBQTJCLElBQUksS0FDOUIsdUJBQXVCLElBQUksS0FBSyxLQUFLLGVBQ3RDO09BQ0EsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLEtBQUssR0FBRyxPQUFPO09BQ2hELElBQUksS0FBSyxNQUFNLElBQUksZ0JBQWdCLEdBQ2pDLEtBQUssUUFBUSxJQUFJLGdCQUFnQjtNQUVyQyxPQUFPLElBQUkseUJBQXlCLElBQUksR0FBRztPQUV6QyxNQUFNLGFBQWEsT0FBTztPQUMxQixLQUFLLE1BQU0sYUFBYSxZQUFZO1FBQ2xDLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxLQUFLLEdBQUc7UUFDekMsSUFBSSxLQUFLLE1BQU0sSUFBSSxnQkFBZ0IsR0FBRztTQUNwQyxLQUFLLFFBQVEsSUFBSSxnQkFBZ0I7U0FDakMsS0FBSyxNQUFNLElBQUksZ0JBQWdCLENBQUMsRUFBRSxRQUFRLElBQUksUUFBUSxTQUFTO1FBQ2pFO09BQ0Y7TUFDRjs7SUFFSjtHQUNGO0VBQ0Y7RUFFQSxvQkFBOEI7R0FDNUIsTUFBTSwwQkFBVSxJQUFJLElBQVk7R0FDaEMsTUFBTSxRQUFrQixDQUFDO0dBQ3pCLE1BQU0sOEJBQWMsSUFBSSxJQUFZO0dBRXBDLE1BQU0sU0FBUyxjQUFzQjtJQUNuQyxJQUFJLFFBQVEsSUFBSSxTQUFTLEdBQUc7SUFDNUIsSUFBSSxZQUFZLElBQUksU0FBUyxHQUFHO0tBQzlCLFFBQVEsS0FBSywyQ0FBMkMsV0FBVztLQUNuRTtJQUNGO0lBRUEsWUFBWSxJQUFJLFNBQVM7SUFFekIsTUFBTSxPQUFPLEtBQUssTUFBTSxJQUFJLFNBQVM7SUFDckMsSUFBSSxTQUFTLFFBQ1gsTUFBTSxJQUFJLE1BQU0sOEJBQThCLFdBQVc7SUFFM0QsTUFBTSxTQUFTLGNBQWMsSUFBSSxLQUFLLFFBQVE7SUFFOUMsS0FBSyxNQUFNLFNBQVMsS0FBSyxTQUFTO0tBQ2hDLE1BQU0sVUFBVSxLQUFLLE1BQU0sSUFBSSxLQUFLO0tBQ3BDLElBQUksWUFBWSxRQUNkLE1BQU0sSUFBSSxNQUFNLDhCQUE4QixPQUFPO0tBSXZELE1BQU0sZUFBZSxPQUFPLE1BQU0sTUFDL0IsU0FDQyxlQUFlLElBQUksTUFDbEIsMkJBQTJCLElBQUksS0FDN0IsdUJBQXVCLElBQUksS0FBSyxLQUFLLGtCQUN4QyxLQUFLLFNBQVMsUUFBUSxRQUMxQjtLQUNBLElBQUksZ0JBQWdCLENBQUMsYUFBYSxVQUNoQyxNQUFNLEtBQUs7SUFFZjtJQUVBLFlBQVksT0FBTyxTQUFTO0lBQzVCLFFBQVEsSUFBSSxTQUFTO0lBQ3JCLE1BQU0sS0FBSyxTQUFTO0dBQ3RCO0dBRUEsS0FBSyxNQUFNLGFBQWEsS0FBSyxNQUFNLEtBQUssR0FDdEMsTUFBTSxTQUFTO0dBSWpCLEtBQUssTUFBTSxhQUFhLEtBQUssTUFBTSxLQUFLLEdBQ3RDLElBQUksQ0FBQyxRQUFRLElBQUksU0FBUyxHQUN4QixNQUFNLEtBQUssU0FBUztHQUl4QixPQUFPO0VBQ1Q7Q0FDRiJ9
@@ -3,7 +3,6 @@ import { Sonamu, init_sonamu } from "../api/sonamu.js";
3
3
  import { Naite, init_naite } from "../naite/naite.js";
4
4
  import { NaiteReporter } from "../naite/naite-reporter.js";
5
5
  import { afterAll, afterEach, beforeAll, beforeEach, test as test$1 } from "vitest";
6
-
7
6
  //#region src/testing/bootstrap.ts
8
7
  init_sonamu();
9
8
  init_db();
@@ -11,10 +10,8 @@ init_naite();
11
10
  function bootstrap(vi, options) {
12
11
  const forTesting = options?.forTesting ?? true;
13
12
  beforeAll(async () => {
14
- if (!forTesting) {
15
- Sonamu.isInitialized = false;
16
- }
17
- await Sonamu.init(true, false, undefined, forTesting);
13
+ if (!forTesting) Sonamu.isInitialized = false;
14
+ await Sonamu.init(true, false, void 0, forTesting);
18
15
  });
19
16
  beforeEach(async () => {
20
17
  await DB.createTestTransaction();
@@ -33,7 +30,7 @@ function bootstrap(vi, options) {
33
30
  error: task.result?.errors?.[0] ? {
34
31
  message: task.result.errors[0].message,
35
32
  stack: task.result.errors[0].stack
36
- } : undefined,
33
+ } : void 0,
37
34
  traces: task.meta?.traces ?? []
38
35
  });
39
36
  });
@@ -126,7 +123,7 @@ const testAs = Object.assign(async (user, title, fn, options) => {
126
123
  },
127
124
  todo: (title) => test$1.todo(title)
128
125
  });
129
-
130
126
  //#endregion
131
127
  export { bootstrap, runWithContext, runWithMockContext, test, testAs };
132
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLmpzIiwibmFtZXMiOlsiZWFjaDogVGVzdEVhY2giLCJ2aXRlc3RUZXN0IiwidGVzdDogVGVzdFdyYXBwZXIiLCJlOiB1bmtub3duIiwidGVzdEFzOiBUZXN0QXNXcmFwcGVyIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3RpbmcvYm9vdHN0cmFwLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFmdGVyQWxsLCBhZnRlckVhY2gsIGJlZm9yZUFsbCwgYmVmb3JlRWFjaCwgdGVzdCBhcyB2aXRlc3RUZXN0IH0gZnJvbSBcInZpdGVzdFwiO1xuaW1wb3J0IHsgdHlwZSBUZXN0RnVuY3Rpb24sIHR5cGUgVGVzdE9wdGlvbnMsIHR5cGUgVml0ZXN0VXRpbHMgfSBmcm9tIFwidml0ZXN0XCI7XG5cbmltcG9ydCB7IHR5cGUgQ29udGV4dCB9IGZyb20gXCIuLi9hcGkvY29udGV4dFwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgdHlwZSBTZXJpYWxpemVkVHJhY2UgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB7IE5haXRlUmVwb3J0ZXIgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGUtcmVwb3J0ZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBCb290c3RyYXBPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNvbmFtdSDstIjquLDtmZQg66qo65Oc66W8IOyngOygle2VqeuLiOuLpC5cbiAgICogLSB0cnVlICjquLDrs7jqsJIpOiDthYzsiqTtjIUg66qo65Oc66GcIOy0iOq4sO2ZlCAo67mg66aELCBTeW5jZXIvVGFzayDsg53rnrUpXG4gICAqIC0gZmFsc2U6IOyghOyytCDstIjquLDtmZQgKFN5bmNlciwgVGFzaywgRW50aXR5TWFuYWdlciDrk7Eg66qo65GQIOuhnOuTnClcbiAgICpcbiAgICogbWlncmF0b3IsIHN5bmNlciwgdGVtcGxhdGUg65Ox7J2YIO2FjOyKpO2KuOyXkOyEnOuKlCBmYWxzZeulvCDsgqzsmqntlanri4jri6QuXG4gICAqL1xuICBmb3JUZXN0aW5nPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJvb3RzdHJhcCh2aTogVml0ZXN0VXRpbHMsIG9wdGlvbnM/OiBCb290c3RyYXBPcHRpb25zKSB7XG4gIGNvbnN0IGZvclRlc3RpbmcgPSBvcHRpb25zPy5mb3JUZXN0aW5nID8/IHRydWU7XG5cbiAgYmVmb3JlQWxsKGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWZvclRlc3RpbmcpIHtcbiAgICAgIC8vIGZvclRlc3Rpbmc6IGZhbHNl7J24IOqyveyasCDsnqzstIjquLDtmZTqsIAg7ZWE7JqU7ZWY66+A66GcIO2UjOuemOq3uCDtlbTsoJxcbiAgICAgIFNvbmFtdS5pc0luaXRpYWxpemVkID0gZmFsc2U7XG4gICAgfVxuICAgIGF3YWl0IFNvbmFtdS5pbml0KHRydWUsIGZhbHNlLCB1bmRlZmluZWQsIGZvclRlc3RpbmcpO1xuICB9KTtcbiAgYmVmb3JlRWFjaChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgREIuY3JlYXRlVGVzdFRyYW5zYWN0aW9uKCk7XG4gIH0pO1xuICBhZnRlckVhY2goYXN5bmMgKHsgdGFzayB9KSA9PiB7XG4gICAgdmkudXNlUmVhbFRpbWVycygpO1xuICAgIGF3YWl0IERCLmNsZWFyVGVzdFRyYW5zYWN0aW9uKCk7XG5cbiAgICBhd2FpdCBOYWl0ZVJlcG9ydGVyLnJlcG9ydFRlc3RSZXN1bHQoe1xuICAgICAgc3VpdGVOYW1lOiB0YXNrLnN1aXRlPy5uYW1lID8/IFwiKG5vIHN1aXRlKVwiLFxuICAgICAgc3VpdGVGaWxlUGF0aDogdGFzay5maWxlPy5maWxlcGF0aCxcbiAgICAgIHRlc3ROYW1lOiB0YXNrLm5hbWUsXG4gICAgICB0ZXN0RmlsZVBhdGg6IHRhc2suZmlsZT8uZmlsZXBhdGggPz8gXCJcIixcbiAgICAgIHRlc3RMaW5lOiB0YXNrLmxvY2F0aW9uPy5saW5lID8/IDAsXG4gICAgICBzdGF0dXM6IHRhc2sucmVzdWx0Py5zdGF0ZSA/PyBcInBhc3NcIixcbiAgICAgIGR1cmF0aW9uOiB0YXNrLnJlc3VsdD8uZHVyYXRpb24gPz8gMCxcbiAgICAgIGVycm9yOiB0YXNrLnJlc3VsdD8uZXJyb3JzPy5bMF1cbiAgICAgICAgPyB7XG4gICAgICAgICAgICBtZXNzYWdlOiB0YXNrLnJlc3VsdC5lcnJvcnNbMF0ubWVzc2FnZSxcbiAgICAgICAgICAgIHN0YWNrOiB0YXNrLnJlc3VsdC5lcnJvcnNbMF0uc3RhY2ssXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHRyYWNlczogdGFzay5tZXRhPy50cmFjZXMgPz8gW10sXG4gICAgfSk7XG4gIH0pO1xuICBhZnRlckFsbCgoKSA9PiB7fSk7XG59XG5cbmZ1bmN0aW9uIGdldE1vY2tDb250ZXh0KCk6IENvbnRleHQge1xuICByZXR1cm4ge1xuICAgIHRyYW5zcG9ydDogXCJodHRwXCIsXG4gICAgcmVxdWVzdDogbnVsbCBhcyB1bmtub3duIGFzIENvbnRleHRbXCJyZXF1ZXN0XCJdLFxuICAgIHJlcGx5OiBudWxsIGFzIHVua25vd24gYXMgQ29udGV4dFtcInJlcGx5XCJdLFxuICAgIGhlYWRlcnM6IHt9LFxuICAgIGNyZWF0ZVNTRTogKCgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImNyZWF0ZVNTRSBpcyBub3QgYXZhaWxhYmxlIGluIG1vY2sgY29udGV4dFwiKTtcbiAgICB9KSBhcyBDb250ZXh0W1wiY3JlYXRlU1NFXCJdLFxuICAgIHNlc3Npb246IG51bGwsXG4gICAgdXNlcjogbnVsbCxcbiAgICBuYWl0ZVN0b3JlOiBOYWl0ZS5jcmVhdGVTdG9yZSgpLFxuICAgIGxvY2FsZTogXCJcIixcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhDb250ZXh0KGNvbnRleHQ6IENvbnRleHQgfCBudWxsLCBmbjogKCkgPT4gUHJvbWlzZTx2b2lkPikge1xuICAvLyBTb25hbXUuYXN5bmNMb2NhbFN0b3JhZ2UucnVu7Jy866GcIGNvbnRleHQg7ISk7KCVXG4gIGF3YWl0IFNvbmFtdS5hc3luY0xvY2FsU3RvcmFnZS5ydW4oeyBjb250ZXh0OiBjb250ZXh0ID8/IGdldE1vY2tDb250ZXh0KCkgfSwgZm4pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aE1vY2tDb250ZXh0KGZuOiAoKSA9PiBQcm9taXNlPHZvaWQ+KSB7XG4gIGF3YWl0IHJ1bldpdGhDb250ZXh0KGdldE1vY2tDb250ZXh0KCksIGZuKTtcbn1cblxudHlwZSBUZXN0UmVzdWx0ID0gUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiB2aXRlc3RUZXN0Pj47XG50eXBlIFRlc3RDYWxsYmFja1Jlc3VsdCA9IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xudHlwZSBUZXN0RWFjaCA9IDxUQXJncyBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXT4oXG4gIGNhc2VzOiByZWFkb25seSBUQXJnc1tdLFxuKSA9PiAodGl0bGU6IHN0cmluZywgZm46ICguLi5hcmdzOiBUQXJncykgPT4gVGVzdENhbGxiYWNrUmVzdWx0KSA9PiB2b2lkO1xuXG50eXBlIFRlc3RXcmFwcGVyID0ge1xuICAodGl0bGU6IHN0cmluZywgZm46IFRlc3RGdW5jdGlvbiwgb3B0aW9ucz86IFRlc3RPcHRpb25zKTogVGVzdFJlc3VsdDtcbiAgc2tpcDogKHRpdGxlOiBzdHJpbmcsIGZuOiBUZXN0RnVuY3Rpb24sIG9wdGlvbnM/OiBUZXN0T3B0aW9ucykgPT4gVGVzdFJlc3VsdDtcbiAgb25seTogKHRpdGxlOiBzdHJpbmcsIGZuOiBUZXN0RnVuY3Rpb24sIG9wdGlvbnM/OiBUZXN0T3B0aW9ucykgPT4gVGVzdFJlc3VsdDtcbiAgdG9kbzogKHRpdGxlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIGVhY2g6IFRlc3RFYWNoO1xufTtcblxudHlwZSBUZXN0QXNXcmFwcGVyID0ge1xuICA8VXNlciBleHRlbmRzIENvbnRleHRbXCJ1c2VyXCJdPihcbiAgICB1c2VyOiBVc2VyLFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgZm46IFRlc3RGdW5jdGlvbixcbiAgICBvcHRpb25zPzogVGVzdE9wdGlvbnMsXG4gICk6IFRlc3RSZXN1bHQ7XG4gIHNraXA6IDxVc2VyIGV4dGVuZHMgQ29udGV4dFtcInVzZXJcIl0+KFxuICAgIHVzZXI6IFVzZXIsXG4gICAgdGl0bGU6IHN0cmluZyxcbiAgICBmbjogVGVzdEZ1bmN0aW9uLFxuICAgIG9wdGlvbnM/OiBUZXN0T3B0aW9ucyxcbiAgKSA9PiBUZXN0UmVzdWx0O1xuICBvbmx5OiA8VXNlciBleHRlbmRzIENvbnRleHRbXCJ1c2VyXCJdPihcbiAgICB1c2VyOiBVc2VyLFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgZm46IFRlc3RGdW5jdGlvbixcbiAgICBvcHRpb25zPzogVGVzdE9wdGlvbnMsXG4gICkgPT4gVGVzdFJlc3VsdDtcbiAgdG9kbzogKHRpdGxlOiBzdHJpbmcpID0+IHZvaWQ7XG59O1xuXG5jb25zdCBlYWNoOiBUZXN0RWFjaCA9IHZpdGVzdFRlc3QuZWFjaC5iaW5kKHZpdGVzdFRlc3QpO1xuXG5kZWNsYXJlIG1vZHVsZSBcInZpdGVzdFwiIHtcbiAgaW50ZXJmYWNlIFRhc2tNZXRhIHtcbiAgICB0cmFjZXM6IFNlcmlhbGl6ZWRUcmFjZVtdO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB0ZXN0OiBUZXN0V3JhcHBlciA9IE9iamVjdC5hc3NpZ24oXG4gIGFzeW5jICh0aXRsZTogc3RyaW5nLCBmbjogVGVzdEZ1bmN0aW9uLCBvcHRpb25zPzogVGVzdE9wdGlvbnMpID0+IHtcbiAgICByZXR1cm4gdml0ZXN0VGVzdCh0aXRsZSwgb3B0aW9ucywgYXN5bmMgKGNvbnRleHQpID0+IHtcbiAgICAgIGF3YWl0IHJ1bldpdGhNb2NrQ29udGV4dChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZm4oY29udGV4dCk7XG4gICAgICAgICAgY29udGV4dC50YXNrLm1ldGEudHJhY2VzID0gTmFpdGUuZ2V0QWxsVHJhY2VzKCk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICBjb250ZXh0LnRhc2subWV0YS50cmFjZXMgPSBOYWl0ZS5nZXRBbGxUcmFjZXMoKTtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSxcbiAge1xuICAgIHNraXA6IGFzeW5jICh0aXRsZTogc3RyaW5nLCBmbjogVGVzdEZ1bmN0aW9uLCBvcHRpb25zPzogVGVzdE9wdGlvbnMpID0+XG4gICAgICB2aXRlc3RUZXN0LnNraXAodGl0bGUsIG9wdGlvbnMsIGZuKSxcbiAgICBvbmx5OiBhc3luYyAodGl0bGU6IHN0cmluZywgZm46IFRlc3RGdW5jdGlvbiwgb3B0aW9ucz86IFRlc3RPcHRpb25zKSA9PiB7XG4gICAgICByZXR1cm4gdml0ZXN0VGVzdC5vbmx5KHRpdGxlLCBvcHRpb25zLCBhc3luYyAoY29udGV4dCkgPT4ge1xuICAgICAgICBhd2FpdCBydW5XaXRoTW9ja0NvbnRleHQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmbihjb250ZXh0KTtcbiAgICAgICAgICAgIGNvbnRleHQudGFzay5tZXRhLnRyYWNlcyA9IE5haXRlLmdldEFsbFRyYWNlcygpO1xuICAgICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICAgIGNvbnRleHQudGFzay5tZXRhLnRyYWNlcyA9IE5haXRlLmdldEFsbFRyYWNlcygpO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICB0b2RvOiAodGl0bGU6IHN0cmluZykgPT4gdml0ZXN0VGVzdC50b2RvKHRpdGxlKSxcbiAgICBlYWNoLFxuICB9LFxuKTtcblxuZXhwb3J0IGNvbnN0IHRlc3RBczogVGVzdEFzV3JhcHBlciA9IE9iamVjdC5hc3NpZ24oXG4gIGFzeW5jIDxVc2VyIGV4dGVuZHMgQ29udGV4dFtcInVzZXJcIl0+KFxuICAgIHVzZXI6IFVzZXIsXG4gICAgdGl0bGU6IHN0cmluZyxcbiAgICBmbjogVGVzdEZ1bmN0aW9uLFxuICAgIG9wdGlvbnM/OiBUZXN0T3B0aW9ucyxcbiAgKSA9PiB7XG4gICAgcmV0dXJuIHZpdGVzdFRlc3QodGl0bGUsIG9wdGlvbnMsIGFzeW5jIChjb250ZXh0KSA9PiB7XG4gICAgICBhd2FpdCBydW5XaXRoQ29udGV4dChcbiAgICAgICAge1xuICAgICAgICAgIC4uLmdldE1vY2tDb250ZXh0KCksXG4gICAgICAgICAgdXNlcixcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmbihjb250ZXh0KTtcbiAgICAgICAgICAgIGNvbnRleHQudGFzay5tZXRhLnRyYWNlcyA9IE5haXRlLmdldEFsbFRyYWNlcygpO1xuICAgICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICAgIGNvbnRleHQudGFzay5tZXRhLnRyYWNlcyA9IE5haXRlLmdldEFsbFRyYWNlcygpO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0pO1xuICB9LFxuICB7XG4gICAgc2tpcDogYXN5bmMgPFVzZXIgZXh0ZW5kcyBDb250ZXh0W1widXNlclwiXT4oXG4gICAgICBfdXNlcjogVXNlcixcbiAgICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgICBmbjogVGVzdEZ1bmN0aW9uLFxuICAgICAgb3B0aW9ucz86IFRlc3RPcHRpb25zLFxuICAgICkgPT4gdml0ZXN0VGVzdC5za2lwKHRpdGxlLCBvcHRpb25zLCBmbiksXG4gICAgb25seTogYXN5bmMgPFVzZXIgZXh0ZW5kcyBDb250ZXh0W1widXNlclwiXT4oXG4gICAgICB1c2VyOiBVc2VyLFxuICAgICAgdGl0bGU6IHN0cmluZyxcbiAgICAgIGZuOiBUZXN0RnVuY3Rpb24sXG4gICAgICBvcHRpb25zPzogVGVzdE9wdGlvbnMsXG4gICAgKSA9PiB7XG4gICAgICByZXR1cm4gdml0ZXN0VGVzdC5vbmx5KHRpdGxlLCBvcHRpb25zLCBhc3luYyAoY29udGV4dCkgPT4ge1xuICAgICAgICBhd2FpdCBydW5XaXRoQ29udGV4dChcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi5nZXRNb2NrQ29udGV4dCgpLFxuICAgICAgICAgICAgdXNlcixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IGZuKGNvbnRleHQpO1xuICAgICAgICAgICAgICBjb250ZXh0LnRhc2subWV0YS50cmFjZXMgPSBOYWl0ZS5nZXRBbGxUcmFjZXMoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICAgICAgY29udGV4dC50YXNrLm1ldGEudHJhY2VzID0gTmFpdGUuZ2V0QWxsVHJhY2VzKCk7XG4gICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgdG9kbzogKHRpdGxlOiBzdHJpbmcpID0+IHZpdGVzdFRlc3QudG9kbyh0aXRsZSksXG4gIH0sXG4pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O2FBSXVDO1NBQ0g7WUFDRztBQWV2QyxTQUFnQixVQUFVLElBQWlCLFNBQTRCO0NBQ3JFLE1BQU0sYUFBYSxTQUFTLGNBQWM7QUFFMUMsV0FBVSxZQUFZO0FBQ3BCLE1BQUksQ0FBQyxZQUFZO0FBRWYsVUFBTyxnQkFBZ0I7O0FBRXpCLFFBQU0sT0FBTyxLQUFLLE1BQU0sT0FBTyxXQUFXLFdBQVc7R0FD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
128
+
129
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLmpzIiwibmFtZXMiOlsidml0ZXN0VGVzdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2Jvb3RzdHJhcC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhZnRlckFsbCwgYWZ0ZXJFYWNoLCBiZWZvcmVBbGwsIGJlZm9yZUVhY2gsIHRlc3QgYXMgdml0ZXN0VGVzdCB9IGZyb20gXCJ2aXRlc3RcIjtcbmltcG9ydCB7IHR5cGUgVGVzdEZ1bmN0aW9uLCB0eXBlIFRlc3RPcHRpb25zLCB0eXBlIFZpdGVzdFV0aWxzIH0gZnJvbSBcInZpdGVzdFwiO1xuXG5pbXBvcnQgeyB0eXBlIENvbnRleHQgfSBmcm9tIFwiLi4vYXBpL2NvbnRleHRcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBEQiB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB7IHR5cGUgU2VyaWFsaXplZFRyYWNlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyBOYWl0ZVJlcG9ydGVyIH0gZnJvbSBcIi4uL25haXRlL25haXRlLXJlcG9ydGVyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQm9vdHN0cmFwT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTb25hbXUg7LSI6riw7ZmUIOuqqOuTnOulvCDsp4DsoJXtlanri4jri6QuXG4gICAqIC0gdHJ1ZSAo6riw67O46rCSKTog7YWM7Iqk7YyFIOuqqOuTnOuhnCDstIjquLDtmZQgKOu5oOumhCwgU3luY2VyL1Rhc2sg7IOd6561KVxuICAgKiAtIGZhbHNlOiDsoITssrQg7LSI6riw7ZmUIChTeW5jZXIsIFRhc2ssIEVudGl0eU1hbmFnZXIg65OxIOuqqOuRkCDroZzrk5wpXG4gICAqXG4gICAqIG1pZ3JhdG9yLCBzeW5jZXIsIHRlbXBsYXRlIOuTseydmCDthYzsiqTtirjsl5DshJzripQgZmFsc2Xrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICAgKi9cbiAgZm9yVGVzdGluZz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBib290c3RyYXAodmk6IFZpdGVzdFV0aWxzLCBvcHRpb25zPzogQm9vdHN0cmFwT3B0aW9ucykge1xuICBjb25zdCBmb3JUZXN0aW5nID0gb3B0aW9ucz8uZm9yVGVzdGluZyA/PyB0cnVlO1xuXG4gIGJlZm9yZUFsbChhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFmb3JUZXN0aW5nKSB7XG4gICAgICAvLyBmb3JUZXN0aW5nOiBmYWxzZeyduCDqsr3smrAg7J6s7LSI6riw7ZmU6rCAIO2VhOyalO2VmOuvgOuhnCDtlIzrnpjqt7gg7ZW07KCcXG4gICAgICBTb25hbXUuaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIH1cbiAgICBhd2FpdCBTb25hbXUuaW5pdCh0cnVlLCBmYWxzZSwgdW5kZWZpbmVkLCBmb3JUZXN0aW5nKTtcbiAgfSk7XG4gIGJlZm9yZUVhY2goYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IERCLmNyZWF0ZVRlc3RUcmFuc2FjdGlvbigpO1xuICB9KTtcbiAgYWZ0ZXJFYWNoKGFzeW5jICh7IHRhc2sgfSkgPT4ge1xuICAgIHZpLnVzZVJlYWxUaW1lcnMoKTtcbiAgICBhd2FpdCBEQi5jbGVhclRlc3RUcmFuc2FjdGlvbigpO1xuXG4gICAgYXdhaXQgTmFpdGVSZXBvcnRlci5yZXBvcnRUZXN0UmVzdWx0KHtcbiAgICAgIHN1aXRlTmFtZTogdGFzay5zdWl0ZT8ubmFtZSA/PyBcIihubyBzdWl0ZSlcIixcbiAgICAgIHN1aXRlRmlsZVBhdGg6IHRhc2suZmlsZT8uZmlsZXBhdGgsXG4gICAgICB0ZXN0TmFtZTogdGFzay5uYW1lLFxuICAgICAgdGVzdEZpbGVQYXRoOiB0YXNrLmZpbGU/LmZpbGVwYXRoID8/IFwiXCIsXG4gICAgICB0ZXN0TGluZTogdGFzay5sb2NhdGlvbj8ubGluZSA/PyAwLFxuICAgICAgc3RhdHVzOiB0YXNrLnJlc3VsdD8uc3RhdGUgPz8gXCJwYXNzXCIsXG4gICAgICBkdXJhdGlvbjogdGFzay5yZXN1bHQ/LmR1cmF0aW9uID8/IDAsXG4gICAgICBlcnJvcjogdGFzay5yZXN1bHQ/LmVycm9ycz8uWzBdXG4gICAgICAgID8ge1xuICAgICAgICAgICAgbWVzc2FnZTogdGFzay5yZXN1bHQuZXJyb3JzWzBdLm1lc3NhZ2UsXG4gICAgICAgICAgICBzdGFjazogdGFzay5yZXN1bHQuZXJyb3JzWzBdLnN0YWNrLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICB0cmFjZXM6IHRhc2subWV0YT8udHJhY2VzID8/IFtdLFxuICAgIH0pO1xuICB9KTtcbiAgYWZ0ZXJBbGwoKCkgPT4ge30pO1xufVxuXG5mdW5jdGlvbiBnZXRNb2NrQ29udGV4dCgpOiBDb250ZXh0IHtcbiAgcmV0dXJuIHtcbiAgICB0cmFuc3BvcnQ6IFwiaHR0cFwiLFxuICAgIHJlcXVlc3Q6IG51bGwgYXMgdW5rbm93biBhcyBDb250ZXh0W1wicmVxdWVzdFwiXSxcbiAgICByZXBseTogbnVsbCBhcyB1bmtub3duIGFzIENvbnRleHRbXCJyZXBseVwiXSxcbiAgICBoZWFkZXJzOiB7fSxcbiAgICBjcmVhdGVTU0U6ICgoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjcmVhdGVTU0UgaXMgbm90IGF2YWlsYWJsZSBpbiBtb2NrIGNvbnRleHRcIik7XG4gICAgfSkgYXMgQ29udGV4dFtcImNyZWF0ZVNTRVwiXSxcbiAgICBzZXNzaW9uOiBudWxsLFxuICAgIHVzZXI6IG51bGwsXG4gICAgbmFpdGVTdG9yZTogTmFpdGUuY3JlYXRlU3RvcmUoKSxcbiAgICBsb2NhbGU6IFwiXCIsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XaXRoQ29udGV4dChjb250ZXh0OiBDb250ZXh0IHwgbnVsbCwgZm46ICgpID0+IFByb21pc2U8dm9pZD4pIHtcbiAgLy8gU29uYW11LmFzeW5jTG9jYWxTdG9yYWdlLnJ1buycvOuhnCBjb250ZXh0IOyEpOyglVxuICBhd2FpdCBTb25hbXUuYXN5bmNMb2NhbFN0b3JhZ2UucnVuKHsgY29udGV4dDogY29udGV4dCA/PyBnZXRNb2NrQ29udGV4dCgpIH0sIGZuKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhNb2NrQ29udGV4dChmbjogKCkgPT4gUHJvbWlzZTx2b2lkPikge1xuICBhd2FpdCBydW5XaXRoQ29udGV4dChnZXRNb2NrQ29udGV4dCgpLCBmbik7XG59XG5cbnR5cGUgVGVzdFJlc3VsdCA9IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2Ygdml0ZXN0VGVzdD4+O1xudHlwZSBUZXN0Q2FsbGJhY2tSZXN1bHQgPSB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbnR5cGUgVGVzdEVhY2ggPSA8VEFyZ3MgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10+KFxuICBjYXNlczogcmVhZG9ubHkgVEFyZ3NbXSxcbikgPT4gKHRpdGxlOiBzdHJpbmcsIGZuOiAoLi4uYXJnczogVEFyZ3MpID0+IFRlc3RDYWxsYmFja1Jlc3VsdCkgPT4gdm9pZDtcblxudHlwZSBUZXN0V3JhcHBlciA9IHtcbiAgKHRpdGxlOiBzdHJpbmcsIGZuOiBUZXN0RnVuY3Rpb24sIG9wdGlvbnM/OiBUZXN0T3B0aW9ucyk6IFRlc3RSZXN1bHQ7XG4gIHNraXA6ICh0aXRsZTogc3RyaW5nLCBmbjogVGVzdEZ1bmN0aW9uLCBvcHRpb25zPzogVGVzdE9wdGlvbnMpID0+IFRlc3RSZXN1bHQ7XG4gIG9ubHk6ICh0aXRsZTogc3RyaW5nLCBmbjogVGVzdEZ1bmN0aW9uLCBvcHRpb25zPzogVGVzdE9wdGlvbnMpID0+IFRlc3RSZXN1bHQ7XG4gIHRvZG86ICh0aXRsZTogc3RyaW5nKSA9PiB2b2lkO1xuICBlYWNoOiBUZXN0RWFjaDtcbn07XG5cbnR5cGUgVGVzdEFzV3JhcHBlciA9IHtcbiAgPFVzZXIgZXh0ZW5kcyBDb250ZXh0W1widXNlclwiXT4oXG4gICAgdXNlcjogVXNlcixcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIGZuOiBUZXN0RnVuY3Rpb24sXG4gICAgb3B0aW9ucz86IFRlc3RPcHRpb25zLFxuICApOiBUZXN0UmVzdWx0O1xuICBza2lwOiA8VXNlciBleHRlbmRzIENvbnRleHRbXCJ1c2VyXCJdPihcbiAgICB1c2VyOiBVc2VyLFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgZm46IFRlc3RGdW5jdGlvbixcbiAgICBvcHRpb25zPzogVGVzdE9wdGlvbnMsXG4gICkgPT4gVGVzdFJlc3VsdDtcbiAgb25seTogPFVzZXIgZXh0ZW5kcyBDb250ZXh0W1widXNlclwiXT4oXG4gICAgdXNlcjogVXNlcixcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIGZuOiBUZXN0RnVuY3Rpb24sXG4gICAgb3B0aW9ucz86IFRlc3RPcHRpb25zLFxuICApID0+IFRlc3RSZXN1bHQ7XG4gIHRvZG86ICh0aXRsZTogc3RyaW5nKSA9PiB2b2lkO1xufTtcblxuY29uc3QgZWFjaDogVGVzdEVhY2ggPSB2aXRlc3RUZXN0LmVhY2guYmluZCh2aXRlc3RUZXN0KTtcblxuZGVjbGFyZSBtb2R1bGUgXCJ2aXRlc3RcIiB7XG4gIGludGVyZmFjZSBUYXNrTWV0YSB7XG4gICAgdHJhY2VzOiBTZXJpYWxpemVkVHJhY2VbXTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgdGVzdDogVGVzdFdyYXBwZXIgPSBPYmplY3QuYXNzaWduKFxuICBhc3luYyAodGl0bGU6IHN0cmluZywgZm46IFRlc3RGdW5jdGlvbiwgb3B0aW9ucz86IFRlc3RPcHRpb25zKSA9PiB7XG4gICAgcmV0dXJuIHZpdGVzdFRlc3QodGl0bGUsIG9wdGlvbnMsIGFzeW5jIChjb250ZXh0KSA9PiB7XG4gICAgICBhd2FpdCBydW5XaXRoTW9ja0NvbnRleHQoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZuKGNvbnRleHQpO1xuICAgICAgICAgIGNvbnRleHQudGFzay5tZXRhLnRyYWNlcyA9IE5haXRlLmdldEFsbFRyYWNlcygpO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgY29udGV4dC50YXNrLm1ldGEudHJhY2VzID0gTmFpdGUuZ2V0QWxsVHJhY2VzKCk7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG4gIHtcbiAgICBza2lwOiBhc3luYyAodGl0bGU6IHN0cmluZywgZm46IFRlc3RGdW5jdGlvbiwgb3B0aW9ucz86IFRlc3RPcHRpb25zKSA9PlxuICAgICAgdml0ZXN0VGVzdC5za2lwKHRpdGxlLCBvcHRpb25zLCBmbiksXG4gICAgb25seTogYXN5bmMgKHRpdGxlOiBzdHJpbmcsIGZuOiBUZXN0RnVuY3Rpb24sIG9wdGlvbnM/OiBUZXN0T3B0aW9ucykgPT4ge1xuICAgICAgcmV0dXJuIHZpdGVzdFRlc3Qub25seSh0aXRsZSwgb3B0aW9ucywgYXN5bmMgKGNvbnRleHQpID0+IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aE1vY2tDb250ZXh0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZm4oY29udGV4dCk7XG4gICAgICAgICAgICBjb250ZXh0LnRhc2subWV0YS50cmFjZXMgPSBOYWl0ZS5nZXRBbGxUcmFjZXMoKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICBjb250ZXh0LnRhc2subWV0YS50cmFjZXMgPSBOYWl0ZS5nZXRBbGxUcmFjZXMoKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgdG9kbzogKHRpdGxlOiBzdHJpbmcpID0+IHZpdGVzdFRlc3QudG9kbyh0aXRsZSksXG4gICAgZWFjaCxcbiAgfSxcbik7XG5cbmV4cG9ydCBjb25zdCB0ZXN0QXM6IFRlc3RBc1dyYXBwZXIgPSBPYmplY3QuYXNzaWduKFxuICBhc3luYyA8VXNlciBleHRlbmRzIENvbnRleHRbXCJ1c2VyXCJdPihcbiAgICB1c2VyOiBVc2VyLFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgZm46IFRlc3RGdW5jdGlvbixcbiAgICBvcHRpb25zPzogVGVzdE9wdGlvbnMsXG4gICkgPT4ge1xuICAgIHJldHVybiB2aXRlc3RUZXN0KHRpdGxlLCBvcHRpb25zLCBhc3luYyAoY29udGV4dCkgPT4ge1xuICAgICAgYXdhaXQgcnVuV2l0aENvbnRleHQoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5nZXRNb2NrQ29udGV4dCgpLFxuICAgICAgICAgIHVzZXIsXG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZm4oY29udGV4dCk7XG4gICAgICAgICAgICBjb250ZXh0LnRhc2subWV0YS50cmFjZXMgPSBOYWl0ZS5nZXRBbGxUcmFjZXMoKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICBjb250ZXh0LnRhc2subWV0YS50cmFjZXMgPSBOYWl0ZS5nZXRBbGxUcmFjZXMoKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSxcbiAge1xuICAgIHNraXA6IGFzeW5jIDxVc2VyIGV4dGVuZHMgQ29udGV4dFtcInVzZXJcIl0+KFxuICAgICAgX3VzZXI6IFVzZXIsXG4gICAgICB0aXRsZTogc3RyaW5nLFxuICAgICAgZm46IFRlc3RGdW5jdGlvbixcbiAgICAgIG9wdGlvbnM/OiBUZXN0T3B0aW9ucyxcbiAgICApID0+IHZpdGVzdFRlc3Quc2tpcCh0aXRsZSwgb3B0aW9ucywgZm4pLFxuICAgIG9ubHk6IGFzeW5jIDxVc2VyIGV4dGVuZHMgQ29udGV4dFtcInVzZXJcIl0+KFxuICAgICAgdXNlcjogVXNlcixcbiAgICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgICBmbjogVGVzdEZ1bmN0aW9uLFxuICAgICAgb3B0aW9ucz86IFRlc3RPcHRpb25zLFxuICAgICkgPT4ge1xuICAgICAgcmV0dXJuIHZpdGVzdFRlc3Qub25seSh0aXRsZSwgb3B0aW9ucywgYXN5bmMgKGNvbnRleHQpID0+IHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aENvbnRleHQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uZ2V0TW9ja0NvbnRleHQoKSxcbiAgICAgICAgICAgIHVzZXIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCBmbihjb250ZXh0KTtcbiAgICAgICAgICAgICAgY29udGV4dC50YXNrLm1ldGEudHJhY2VzID0gTmFpdGUuZ2V0QWxsVHJhY2VzKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICAgIGNvbnRleHQudGFzay5tZXRhLnRyYWNlcyA9IE5haXRlLmdldEFsbFRyYWNlcygpO1xuICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHRvZG86ICh0aXRsZTogc3RyaW5nKSA9PiB2aXRlc3RUZXN0LnRvZG8odGl0bGUpLFxuICB9LFxuKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O1lBSXNDO1FBQ0g7V0FDRztBQWV0QyxTQUFnQixVQUFVLElBQWlCLFNBQTRCO0NBQ3JFLE1BQU0sYUFBYSxTQUFTLGNBQWM7Q0FFMUMsVUFBVSxZQUFZO0VBQ3BCLElBQUksQ0FBQyxZQUVILE9BQU8sZ0JBQWdCO0VBRXpCLE1BQU0sT0FBTyxLQUFLLE1BQU0sT0FBTyxRQUFXLFVBQVU7Q0FDdEQsQ0FBQztDQUNELFdBQVcsWUFBWTtFQUNyQixNQUFNLEdBQUcsc0JBQXNCO0NBQ2pDLENBQUM7Q0FDRCxVQUFVLE9BQU8sRUFBRSxXQUFX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
@@ -1,13 +1,14 @@
1
- import { __esmMin } from "../_virtual/rolldown_runtime.js";
1
+ import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
2
  import { init_utils, nonNullable } from "../utils/utils.js";
3
3
  import { init_types, isBelongsToOneRelationProp, isOneToOneRelationProp, isRelationProp } from "../types/types.js";
4
-
5
4
  //#region src/testing/data-explorer.ts
6
5
  var DataExplorer;
7
6
  var init_data_explorer = __esmMin((() => {
8
7
  init_types();
9
8
  init_utils();
10
9
  DataExplorer = class {
10
+ db;
11
+ entityManager;
11
12
  cache;
12
13
  constructor(db, entityManager, cacheManager) {
13
14
  this.db = db;
@@ -16,9 +17,7 @@ var init_data_explorer = __esmMin((() => {
16
17
  }
17
18
  async explore(entityName, options) {
18
19
  const entity = this.entityManager.get(entityName);
19
- if (!entity) {
20
- throw new Error(`Entity not found: ${entityName}`);
21
- }
20
+ if (!entity) throw new Error(`Entity not found: ${entityName}`);
22
21
  if (options.useCache && this.cache) {
23
22
  const cacheKey = this.generateCacheKey(entityName, options);
24
23
  return this.cache.getOrSet({
@@ -35,34 +34,23 @@ var init_data_explorer = __esmMin((() => {
35
34
  case "sample": return await this.sampleData(query, options.limit || 10);
36
35
  case "recent": {
37
36
  const createdAtCol = this.findTimestampColumn(entity, "created_at");
38
- if (createdAtCol) {
39
- query.orderBy(createdAtCol, "desc");
40
- }
37
+ if (createdAtCol) query.orderBy(createdAtCol, "desc");
41
38
  return await query.limit(options.limit || 10);
42
39
  }
43
40
  case "random": return await this.randomSample(query, options.limit || 10);
44
41
  case "ids":
45
- if (options.ids && options.ids.length > 0) {
46
- query.whereIn("id", options.ids);
47
- }
42
+ if (options.ids && options.ids.length > 0) query.whereIn("id", options.ids);
48
43
  return await query;
49
44
  case "query":
50
- if (options.where) {
51
- query.where(options.where);
52
- }
45
+ if (options.where) query.where(options.where);
53
46
  if (options.orderBy) {
54
47
  const [col, dir = "asc"] = options.orderBy.split(":");
55
- if (col === "id") {
56
- query.orderByRaw(`CAST(?? AS INTEGER) ${dir}`, [col]);
57
- } else {
58
- query.orderBy(col, dir);
59
- }
48
+ if (col === "id") query.orderByRaw(`CAST(?? AS INTEGER) ${dir}`, [col]);
49
+ else query.orderBy(col, dir);
60
50
  }
61
51
  return await query.limit(options.limit || 10);
62
52
  case "file":
63
- if (!options.filePath) {
64
- throw new Error("filePath is required for file strategy");
65
- }
53
+ if (!options.filePath) throw new Error("filePath is required for file strategy");
66
54
  return this.loadFromFile(options.filePath);
67
55
  default: throw new Error(`Unknown strategy: ${options.strategy}`);
68
56
  }
@@ -70,15 +58,11 @@ var init_data_explorer = __esmMin((() => {
70
58
  async sampleData(query, limit) {
71
59
  const [{ count }] = await query.clone().count("* as count");
72
60
  const total = Number(count);
73
- if (total <= limit) {
74
- return await query.limit(limit);
75
- }
61
+ if (total <= limit) return await query.limit(limit);
76
62
  const interval = Math.floor(total / limit);
77
63
  const tableName = query.toString().match(/from\s+"?(\w+)"?/i)?.[1];
78
- if (!tableName) {
79
- throw new Error("Could not extract table name from query");
80
- }
81
- const result = await this.db.raw(`
64
+ if (!tableName) throw new Error("Could not extract table name from query");
65
+ return (await this.db.raw(`
82
66
  WITH numbered_rows AS (
83
67
  SELECT *, ROW_NUMBER() OVER (ORDER BY id) as rn
84
68
  FROM ??
@@ -90,24 +74,19 @@ var init_data_explorer = __esmMin((() => {
90
74
  tableName,
91
75
  interval,
92
76
  limit
93
- ]);
94
- return result.rows;
77
+ ])).rows;
95
78
  }
96
79
  async randomSample(query, limit) {
97
80
  return await query.orderByRaw("RANDOM()").limit(limit);
98
81
  }
99
82
  findTimestampColumn(entity, columnName) {
100
- const prop = entity.props.find((p) => p.name === columnName);
101
- return prop?.name || null;
83
+ return entity.props.find((p) => p.name === columnName)?.name || null;
102
84
  }
103
85
  async loadFromFile(filePath) {
104
- const fs = await import("fs/promises");
105
- const content = await fs.readFile(filePath, "utf-8");
86
+ const content = await (await import("fs/promises")).readFile(filePath, "utf-8");
106
87
  if (filePath.endsWith(".json")) {
107
88
  const parsed = JSON.parse(content);
108
- if (!Array.isArray(parsed)) {
109
- throw new Error("JSON file must contain an array");
110
- }
89
+ if (!Array.isArray(parsed)) throw new Error("JSON file must contain an array");
111
90
  return parsed;
112
91
  } else if (filePath.endsWith(".csv")) {
113
92
  const lines = content.split("\n").filter((line) => line.trim());
@@ -124,11 +103,8 @@ var init_data_explorer = __esmMin((() => {
124
103
  throw new Error(`Unsupported file format: ${filePath}`);
125
104
  }
126
105
  async exploreRelation(entityName, relationProp, options) {
127
- const entity = this.entityManager.get(entityName);
128
- const prop = entity.props.find((p) => p.name === relationProp);
129
- if (!prop || !isRelationProp(prop)) {
130
- throw new Error(`Relation property not found: ${entityName}.${relationProp}`);
131
- }
106
+ const prop = this.entityManager.get(entityName).props.find((p) => p.name === relationProp);
107
+ if (!prop || !isRelationProp(prop)) throw new Error(`Relation property not found: ${entityName}.${relationProp}`);
132
108
  const dataSource = prop.cone?.dataSource;
133
109
  const strategy = dataSource?.strategy || options?.strategy || "sample";
134
110
  const config = dataSource?.config && typeof dataSource.config === "object" ? dataSource.config : {};
@@ -144,8 +120,7 @@ var init_data_explorer = __esmMin((() => {
144
120
  */
145
121
  async exploreRelations(entityName, relationProps, options) {
146
122
  const results = await Promise.all(relationProps.map(async (prop) => {
147
- const data = await this.exploreRelation(entityName, prop, options);
148
- return [prop, data];
123
+ return [prop, await this.exploreRelation(entityName, prop, options)];
149
124
  }));
150
125
  return Object.fromEntries(results);
151
126
  }
@@ -155,15 +130,9 @@ var init_data_explorer = __esmMin((() => {
155
130
  options.strategy,
156
131
  options.limit?.toString() || "default"
157
132
  ];
158
- if (options.where) {
159
- parts.push(JSON.stringify(options.where));
160
- }
161
- if (options.orderBy) {
162
- parts.push(options.orderBy);
163
- }
164
- if (options.ids) {
165
- parts.push(options.ids.join(","));
166
- }
133
+ if (options.where) parts.push(JSON.stringify(options.where));
134
+ if (options.orderBy) parts.push(options.orderBy);
135
+ if (options.ids) parts.push(options.ids.join(","));
167
136
  return parts.join(":");
168
137
  }
169
138
  /**
@@ -179,12 +148,10 @@ var init_data_explorer = __esmMin((() => {
179
148
  entityId: entityName,
180
149
  records: mainRecords
181
150
  },
182
- related: new Map()
151
+ related: /* @__PURE__ */ new Map()
183
152
  };
184
- if (!includeRelations || maxDepth <= 0) {
185
- return result;
186
- }
187
- const visited = new Set([entityName]);
153
+ if (!includeRelations || maxDepth <= 0) return result;
154
+ const visited = /* @__PURE__ */ new Set([entityName]);
188
155
  await this.collectRelatedData(entityName, mainRecords, result.related, visited, maxDepth);
189
156
  return result;
190
157
  }
@@ -192,23 +159,17 @@ var init_data_explorer = __esmMin((() => {
192
159
  * 관련 데이터를 재귀적으로 수집합니다 (private helper)
193
160
  */
194
161
  async collectRelatedData(entityName, records, relatedMap, visited, remainingDepth) {
195
- if (remainingDepth <= 0 || records.length === 0) {
196
- return;
197
- }
162
+ if (remainingDepth <= 0 || records.length === 0) return;
198
163
  const entity = this.entityManager.get(entityName);
199
164
  const recordIds = records.map((r) => r.id).filter(nonNullable);
200
165
  const forwardRelationProps = entity.props.filter((prop) => isRelationProp(prop) && (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn));
201
166
  for (const prop of forwardRelationProps) {
202
167
  if (!isRelationProp(prop)) continue;
203
168
  const targetEntityName = prop.with;
204
- if (visited.has(targetEntityName)) {
205
- continue;
206
- }
169
+ if (visited.has(targetEntityName)) continue;
207
170
  const foreignKeyName = `${prop.name}_id`;
208
171
  const referencedIds = records.map((record) => record[foreignKeyName]).filter(Boolean);
209
- if (referencedIds.length === 0) {
210
- continue;
211
- }
172
+ if (referencedIds.length === 0) continue;
212
173
  const uniqueIds = [...new Set(referencedIds)];
213
174
  const referencedRecords = await this.explore(targetEntityName, {
214
175
  strategy: "ids",
@@ -221,18 +182,13 @@ var init_data_explorer = __esmMin((() => {
221
182
  const allEntities = this.entityManager.getAllEntities();
222
183
  for (const otherEntity of allEntities) {
223
184
  const otherEntityName = otherEntity.id;
224
- if (visited.has(otherEntityName) || otherEntityName === entityName) {
225
- continue;
226
- }
185
+ if (visited.has(otherEntityName) || otherEntityName === entityName) continue;
227
186
  const backwardRelations = otherEntity.props.filter((prop) => isRelationProp(prop) && prop.with === entityName && (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop) && prop.hasJoinColumn));
228
187
  for (const prop of backwardRelations) {
229
188
  if (!isRelationProp(prop)) continue;
230
189
  const foreignKeyName = `${prop.name}_id`;
231
- const query = this.db(otherEntity.table).whereIn(foreignKeyName, recordIds);
232
- const backwardRecords = await query;
233
- if (backwardRecords.length === 0) {
234
- continue;
235
- }
190
+ const backwardRecords = await this.db(otherEntity.table).whereIn(foreignKeyName, recordIds);
191
+ if (backwardRecords.length === 0) continue;
236
192
  relatedMap.set(otherEntityName, backwardRecords);
237
193
  visited.add(otherEntityName);
238
194
  await this.collectRelatedData(otherEntityName, backwardRecords, relatedMap, visited, remainingDepth - 1);
@@ -241,8 +197,8 @@ var init_data_explorer = __esmMin((() => {
241
197
  }
242
198
  };
243
199
  }));
244
-
245
200
  //#endregion
246
201
  init_data_explorer();
247
202
  export { DataExplorer, init_data_explorer };
248
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1leHBsb3Jlci5qcyIsIm5hbWVzIjpbImRiOiBLbmV4IiwiZW50aXR5TWFuYWdlcjogdHlwZW9mIEVudGl0eU1hbmFnZXIiLCJyZXN1bHQ6IEV4cGxvcmVXaXRoUmVsYXRpb25zUmVzdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3RpbmcvZGF0YS1leHBsb3Jlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuXG5pbXBvcnQgeyB0eXBlIENhY2hlTWFuYWdlciB9IGZyb20gXCIuLi9jYWNoZS90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eVwiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsIGlzT25lVG9PbmVSZWxhdGlvblByb3AsIGlzUmVsYXRpb25Qcm9wIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBub25OdWxsYWJsZSB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuXG5leHBvcnQgdHlwZSBEYXRhRXhwbG9yZXJTdHJhdGVneSA9IFwic2FtcGxlXCIgfCBcImlkc1wiIHwgXCJxdWVyeVwiIHwgXCJmaWxlXCIgfCBcInJlY2VudFwiIHwgXCJyYW5kb21cIjtcblxuLyoqIFdIRVJFIOyhsOqxtCDtg4DsnoUgKOqwneyytCDrmJDripQgS25leCBRdWVyeUJ1aWxkZXIg7ZWo7IiYKSAqL1xuZXhwb3J0IHR5cGUgV2hlcmVDb25kaXRpb24gPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8ICgocXVlcnlCdWlsZGVyOiBLbmV4LlF1ZXJ5QnVpbGRlcikgPT4gdm9pZCk7XG5cbmV4cG9ydCB0eXBlIERhdGFFeHBsb3Jlck9wdGlvbnMgPSB7XG4gIHN0cmF0ZWd5OiBEYXRhRXhwbG9yZXJTdHJhdGVneTtcbiAgbGltaXQ/OiBudW1iZXI7XG4gIHdoZXJlPzogV2hlcmVDb25kaXRpb247XG4gIG9yZGVyQnk/OiBzdHJpbmc7XG4gIGlkcz86IG51bWJlcltdO1xuICBmaWxlUGF0aD86IHN0cmluZztcbiAgLyoqIOy6kOyLsSDsgqzsmqkg7Jes67aAICjquLDrs7jqsJI6IGZhbHNlKSAqL1xuICB1c2VDYWNoZT86IGJvb2xlYW47XG4gIC8qKiDsupDsi5wgVFRMICjstIgg64uo7JyELCDquLDrs7jqsJI6IDMwMCkgKi9cbiAgY2FjaGVUdGw/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBFeHBsb3JlV2l0aFJlbGF0aW9uc09wdGlvbnMgPSBEYXRhRXhwbG9yZXJPcHRpb25zICYge1xuICAvKiog6rSA66CoIOuNsOydtO2EsCDtj6ztlagg7Jes67aAICjquLDrs7jqsJI6IHRydWUpICovXG4gIGluY2x1ZGVSZWxhdGlvbnM/OiBib29sZWFuO1xuICAvKiog7J6s6reAIO2DkOyDiSDstZzrjIAg6rmK7J20ICjquLDrs7jqsJI6IDIpICovXG4gIG1heERlcHRoPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgRXhwbG9yZVdpdGhSZWxhdGlvbnNSZXN1bHQgPSB7XG4gIC8qKiDrqZTsnbggZW50aXR5IOuNsOydtO2EsCAqL1xuICBtYWluOiB7XG4gICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICByZWNvcmRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xuICB9O1xuICAvKiog6rSA66CoIGVudGl0eSDrjbDsnbTthLAgKGVudGl0eUlkIC0+IHJlY29yZHMpICovXG4gIHJlbGF0ZWQ6IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+W10+O1xufTtcblxuLy8g6riw7KG0IERCIOuNsOydtO2EsOulvCDtg5Dsg4ntlZjsl6wgZml4dHVyZSDsg53shLEg7IucIOywuOyhsO2VoCDsiJgg7J6I64qUIOyLnOyKpO2FnFxuZXhwb3J0IGNsYXNzIERhdGFFeHBsb3JlciB7XG4gIHByaXZhdGUgY2FjaGU/OiBDYWNoZU1hbmFnZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBkYjogS25leCxcbiAgICBwcml2YXRlIGVudGl0eU1hbmFnZXI6IHR5cGVvZiBFbnRpdHlNYW5hZ2VyLFxuICAgIGNhY2hlTWFuYWdlcj86IENhY2hlTWFuYWdlcixcbiAgKSB7XG4gICAgdGhpcy5jYWNoZSA9IGNhY2hlTWFuYWdlcjtcbiAgfVxuXG4gIGFzeW5jIGV4cGxvcmUoXG4gICAgZW50aXR5TmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IERhdGFFeHBsb3Jlck9wdGlvbnMsXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj5bXT4ge1xuICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoZW50aXR5TmFtZSk7XG4gICAgaWYgKCFlbnRpdHkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW50aXR5IG5vdCBmb3VuZDogJHtlbnRpdHlOYW1lfWApO1xuICAgIH1cblxuICAgIC8vIOy6kOyLsSDsp4Dsm5BcbiAgICBpZiAob3B0aW9ucy51c2VDYWNoZSAmJiB0aGlzLmNhY2hlKSB7XG4gICAgICBjb25zdCBjYWNoZUtleSA9IHRoaXMuZ2VuZXJhdGVDYWNoZUtleShlbnRpdHlOYW1lLCBvcHRpb25zKTtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldE9yU2V0KHtcbiAgICAgICAga2V5OiBjYWNoZUtleSxcbiAgICAgICAgdHRsOiBvcHRpb25zLmNhY2hlVHRsIHx8IDMwMCxcbiAgICAgICAgZmFjdG9yeTogKCkgPT4gdGhpcy5leHBsb3JlSW50ZXJuYWwoZW50aXR5LCBvcHRpb25zKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4cGxvcmVJbnRlcm5hbChlbnRpdHksIG9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBleHBsb3JlSW50ZXJuYWwoXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgb3B0aW9uczogRGF0YUV4cGxvcmVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdPiB7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLmRiKGVudGl0eS50YWJsZSk7XG5cbiAgICBzd2l0Y2ggKG9wdGlvbnMuc3RyYXRlZ3kpIHtcbiAgICAgIGNhc2UgXCJzYW1wbGVcIjpcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2FtcGxlRGF0YShxdWVyeSwgb3B0aW9ucy5saW1pdCB8fCAxMCk7XG5cbiAgICAgIGNhc2UgXCJyZWNlbnRcIjoge1xuICAgICAgICBjb25zdCBjcmVhdGVkQXRDb2wgPSB0aGlzLmZpbmRUaW1lc3RhbXBDb2x1bW4oZW50aXR5LCBcImNyZWF0ZWRfYXRcIik7XG4gICAgICAgIGlmIChjcmVhdGVkQXRDb2wpIHtcbiAgICAgICAgICBxdWVyeS5vcmRlckJ5KGNyZWF0ZWRBdENvbCwgXCJkZXNjXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBxdWVyeS5saW1pdChvcHRpb25zLmxpbWl0IHx8IDEwKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBcInJhbmRvbVwiOlxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yYW5kb21TYW1wbGUocXVlcnksIG9wdGlvbnMubGltaXQgfHwgMTApO1xuXG4gICAgICBjYXNlIFwiaWRzXCI6XG4gICAgICAgIGlmIChvcHRpb25zLmlkcyAmJiBvcHRpb25zLmlkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcXVlcnkud2hlcmVJbihcImlkXCIsIG9wdGlvbnMuaWRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgcXVlcnk7XG5cbiAgICAgIGNhc2UgXCJxdWVyeVwiOlxuICAgICAgICBpZiAob3B0aW9ucy53aGVyZSkge1xuICAgICAgICAgIHF1ZXJ5LndoZXJlKG9wdGlvbnMud2hlcmUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLm9yZGVyQnkpIHtcbiAgICAgICAgICBjb25zdCBbY29sLCBkaXIgPSBcImFzY1wiXSA9IG9wdGlvbnMub3JkZXJCeS5zcGxpdChcIjpcIik7XG4gICAgICAgICAgLy8gaWQg7Lus65+87J2AIOyIq+yekOuhnCDsupDsiqTtjIXtlZjsl6wg7KCV66Cs7ZWp64uI64ukICjrrLjsnpDsl7Qg7KCV66CsIOuwqeyngClcbiAgICAgICAgICBpZiAoY29sID09PSBcImlkXCIpIHtcbiAgICAgICAgICAgIHF1ZXJ5Lm9yZGVyQnlSYXcoYENBU1QoPz8gQVMgSU5URUdFUikgJHtkaXJ9YCwgW2NvbF0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBxdWVyeS5vcmRlckJ5KGNvbCwgZGlyIGFzIFwiYXNjXCIgfCBcImRlc2NcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBxdWVyeS5saW1pdChvcHRpb25zLmxpbWl0IHx8IDEwKTtcblxuICAgICAgY2FzZSBcImZpbGVcIjpcbiAgICAgICAgaWYgKCFvcHRpb25zLmZpbGVQYXRoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZmlsZVBhdGggaXMgcmVxdWlyZWQgZm9yIGZpbGUgc3RyYXRlZ3lcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZEZyb21GaWxlKG9wdGlvbnMuZmlsZVBhdGgpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RyYXRlZ3k6ICR7b3B0aW9ucy5zdHJhdGVneX1gKTtcbiAgICB9XG4gIH1cblxuICAvLyDqt6Drk7Eg7IOY7ZSM66eBIChQb3N0Z3JlU1FMIFJPV19OVU1CRVIg7IKs7JqpKVxuICBwcml2YXRlIGFzeW5jIHNhbXBsZURhdGEoXG4gICAgcXVlcnk6IEtuZXguUXVlcnlCdWlsZGVyLFxuICAgIGxpbWl0OiBudW1iZXIsXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj5bXT4ge1xuICAgIGNvbnN0IFt7IGNvdW50IH1dID0gYXdhaXQgcXVlcnkuY2xvbmUoKS5jb3VudChcIiogYXMgY291bnRcIik7XG4gICAgY29uc3QgdG90YWwgPSBOdW1iZXIoY291bnQpO1xuXG4gICAgaWYgKHRvdGFsIDw9IGxpbWl0KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcXVlcnkubGltaXQobGltaXQpO1xuICAgIH1cblxuICAgIC8vIOq3oOuTsSDqsITqsqkg6rOE7IKwXG4gICAgY29uc3QgaW50ZXJ2YWwgPSBNYXRoLmZsb29yKHRvdGFsIC8gbGltaXQpO1xuXG4gICAgLy8g7YWM7J2067iU66qFIOy2lOy2nFxuICAgIGNvbnN0IHRhYmxlTmFtZSA9IHF1ZXJ5LnRvU3RyaW5nKCkubWF0Y2goL2Zyb21cXHMrXCI/KFxcdyspXCI/L2kpPy5bMV07XG4gICAgaWYgKCF0YWJsZU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBleHRyYWN0IHRhYmxlIG5hbWUgZnJvbSBxdWVyeVwiKTtcbiAgICB9XG5cbiAgICAvLyBST1dfTlVNQkVSKCnroZwg7ZWcIOuyiOyXkCDqt6Drk7Eg7IOY7ZSM66eBICjri6jsnbwg7L+866asKVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZGIucmF3KFxuICAgICAgYFxuICAgICAgV0lUSCBudW1iZXJlZF9yb3dzIEFTIChcbiAgICAgICAgU0VMRUNUICosIFJPV19OVU1CRVIoKSBPVkVSIChPUkRFUiBCWSBpZCkgYXMgcm5cbiAgICAgICAgRlJPTSA/P1xuICAgICAgKVxuICAgICAgU0VMRUNUICogRlJPTSBudW1iZXJlZF9yb3dzXG4gICAgICBXSEVSRSBNT0Qocm4gLSAxLCA/KSA9IDBcbiAgICAgIExJTUlUID9cbiAgICBgLFxuICAgICAgW3RhYmxlTmFtZSwgaW50ZXJ2YWwsIGxpbWl0XSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlc3VsdC5yb3dzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByYW5kb21TYW1wbGUoXG4gICAgcXVlcnk6IEtuZXguUXVlcnlCdWlsZGVyLFxuICAgIGxpbWl0OiBudW1iZXIsXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj5bXT4ge1xuICAgIHJldHVybiBhd2FpdCBxdWVyeS5vcmRlckJ5UmF3KFwiUkFORE9NKClcIikubGltaXQobGltaXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kVGltZXN0YW1wQ29sdW1uKGVudGl0eTogRW50aXR5LCBjb2x1bW5OYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBwcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gY29sdW1uTmFtZSk7XG4gICAgcmV0dXJuIHByb3A/Lm5hbWUgfHwgbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZEZyb21GaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+W10+IHtcbiAgICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydChcImZzL3Byb21pc2VzXCIpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgXCJ1dGYtOFwiKTtcblxuICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcnNlZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSlNPTiBmaWxlIG11c3QgY29udGFpbiBhbiBhcnJheVwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJzZWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcbiAgICB9IGVsc2UgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKFwiLmNzdlwiKSkge1xuICAgICAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpLmZpbHRlcigobGluZSkgPT4gbGluZS50cmltKCkpO1xuICAgICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gICAgICBjb25zdCBoZWFkZXJzID0gbGluZXNbMF0uc3BsaXQoXCIsXCIpLm1hcCgoaCkgPT4gaC50cmltKCkpO1xuICAgICAgcmV0dXJuIGxpbmVzLnNsaWNlKDEpLm1hcCgobGluZSkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBsaW5lLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgcmV0dXJuIGhlYWRlcnMucmVkdWNlKFxuICAgICAgICAgIChvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBoZWFkZXI6IHN0cmluZywgaTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBvYmpbaGVhZGVyXSA9IHZhbHVlc1tpXT8udHJpbSgpO1xuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBmaWxlIGZvcm1hdDogJHtmaWxlUGF0aH1gKTtcbiAgfVxuXG4gIGFzeW5jIGV4cGxvcmVSZWxhdGlvbihcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgcmVsYXRpb25Qcm9wOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFBhcnRpYWw8RGF0YUV4cGxvcmVyT3B0aW9ucz4sXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj5bXT4ge1xuICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoZW50aXR5TmFtZSk7XG4gICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IHJlbGF0aW9uUHJvcCk7XG5cbiAgICBpZiAoIXByb3AgfHwgIWlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlbGF0aW9uIHByb3BlcnR5IG5vdCBmb3VuZDogJHtlbnRpdHlOYW1lfS4ke3JlbGF0aW9uUHJvcH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhU291cmNlID0gcHJvcC5jb25lPy5kYXRhU291cmNlO1xuICAgIGNvbnN0IHN0cmF0ZWd5ID0gZGF0YVNvdXJjZT8uc3RyYXRlZ3kgfHwgb3B0aW9ucz8uc3RyYXRlZ3kgfHwgXCJzYW1wbGVcIjtcbiAgICBjb25zdCBjb25maWcgPVxuICAgICAgZGF0YVNvdXJjZT8uY29uZmlnICYmIHR5cGVvZiBkYXRhU291cmNlLmNvbmZpZyA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IChkYXRhU291cmNlLmNvbmZpZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgICAgOiB7fTtcblxuICAgIHJldHVybiB0aGlzLmV4cGxvcmUocHJvcC53aXRoLCB7XG4gICAgICBzdHJhdGVneSxcbiAgICAgIGxpbWl0OiBvcHRpb25zPy5saW1pdCB8fCAodHlwZW9mIGNvbmZpZy5saW1pdCA9PT0gXCJudW1iZXJcIiA/IGNvbmZpZy5saW1pdCA6IDEwKSxcbiAgICAgIC4uLih0eXBlb2YgY29uZmlnID09PSBcIm9iamVjdFwiID8gY29uZmlnIDoge30pLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsl6zrn6wgcmVsYXRpb27snYQg67OR66Cs66GcIOyhsO2ajO2VqeuLiOuLpCAoTisxIOusuOygnCDtlbTqsrApXG4gICAqL1xuICBhc3luYyBleHBsb3JlUmVsYXRpb25zKFxuICAgIGVudGl0eU5hbWU6IHN0cmluZyxcbiAgICByZWxhdGlvblByb3BzOiBzdHJpbmdbXSxcbiAgICBvcHRpb25zPzogUGFydGlhbDxEYXRhRXhwbG9yZXJPcHRpb25zPixcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdPj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHJlbGF0aW9uUHJvcHMubWFwKGFzeW5jIChwcm9wKSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmV4cGxvcmVSZWxhdGlvbihlbnRpdHlOYW1lLCBwcm9wLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIFtwcm9wLCBkYXRhXSBhcyBjb25zdDtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHJlc3VsdHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZUNhY2hlS2V5KGVudGl0eU5hbWU6IHN0cmluZywgb3B0aW9uczogRGF0YUV4cGxvcmVyT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHMgPSBbXG4gICAgICBgRGF0YUV4cGxvcmVyOiR7ZW50aXR5TmFtZX1gLFxuICAgICAgb3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIG9wdGlvbnMubGltaXQ/LnRvU3RyaW5nKCkgfHwgXCJkZWZhdWx0XCIsXG4gICAgXTtcblxuICAgIGlmIChvcHRpb25zLndoZXJlKSB7XG4gICAgICBwYXJ0cy5wdXNoKEpTT04uc3RyaW5naWZ5KG9wdGlvbnMud2hlcmUpKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMub3JkZXJCeSkge1xuICAgICAgcGFydHMucHVzaChvcHRpb25zLm9yZGVyQnkpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pZHMpIHtcbiAgICAgIHBhcnRzLnB1c2gob3B0aW9ucy5pZHMuam9pbihcIixcIikpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJ0cy5qb2luKFwiOlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnRpdHnsmYAg6rSA66Co65CcIOuNsOydtO2EsOulvCDsnqzqt4DsoIHsnLzroZwg7YOQ7IOJ7ZWp64uI64ukLlxuICAgKiBCZWxvbmdzVG9PbmUsIE9uZVRvT25lKGhhc0pvaW5Db2x1bW4pIHJlbGF0aW9u7J2EIOuUsOudvOqwgOupsCDssLjsobAg642w7J207YSw66W8IOyImOynke2VqeuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGV4cGxvcmVXaXRoUmVsYXRpb25zKFxuICAgIGVudGl0eU5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBFeHBsb3JlV2l0aFJlbGF0aW9uc09wdGlvbnMsXG4gICk6IFByb21pc2U8RXhwbG9yZVdpdGhSZWxhdGlvbnNSZXN1bHQ+IHtcbiAgICBjb25zdCBpbmNsdWRlUmVsYXRpb25zID0gb3B0aW9ucy5pbmNsdWRlUmVsYXRpb25zID8/IHRydWU7XG4gICAgY29uc3QgbWF4RGVwdGggPSBvcHRpb25zLm1heERlcHRoID8/IDI7XG5cbiAgICAvLyDrqZTsnbggZW50aXR5IOyhsO2ajFxuICAgIGNvbnN0IG1haW5SZWNvcmRzID0gYXdhaXQgdGhpcy5leHBsb3JlKGVudGl0eU5hbWUsIG9wdGlvbnMpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBFeHBsb3JlV2l0aFJlbGF0aW9uc1Jlc3VsdCA9IHtcbiAgICAgIG1haW46IHtcbiAgICAgICAgZW50aXR5SWQ6IGVudGl0eU5hbWUsXG4gICAgICAgIHJlY29yZHM6IG1haW5SZWNvcmRzLFxuICAgICAgfSxcbiAgICAgIHJlbGF0ZWQ6IG5ldyBNYXAoKSxcbiAgICB9O1xuXG4gICAgLy8g6rSA66CoIOuNsOydtO2EsCDsiJjsp5HtlZjsp4Ag7JWK7Jy866m0IOuwlOuhnCDrpqzthLRcbiAgICBpZiAoIWluY2x1ZGVSZWxhdGlvbnMgfHwgbWF4RGVwdGggPD0gMCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyDsnbTrr7gg7KGw7ZqM7ZWcIGVudGl0eSDstpTsoIEgKOykkeuztSDrsKnsp4ApXG4gICAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPihbZW50aXR5TmFtZV0pO1xuXG4gICAgLy8g7J6s6reA7KCB7Jy866GcIOq0gOugqCDrjbDsnbTthLAg7IiY7KeRXG4gICAgYXdhaXQgdGhpcy5jb2xsZWN0UmVsYXRlZERhdGEoZW50aXR5TmFtZSwgbWFpblJlY29yZHMsIHJlc3VsdC5yZWxhdGVkLCB2aXNpdGVkLCBtYXhEZXB0aCk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIOq0gOugqCDrjbDsnbTthLDrpbwg7J6s6reA7KCB7Jy866GcIOyImOynke2VqeuLiOuLpCAocHJpdmF0ZSBoZWxwZXIpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvbGxlY3RSZWxhdGVkRGF0YShcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgcmVjb3JkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcbiAgICByZWxhdGVkTWFwOiBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdPixcbiAgICB2aXNpdGVkOiBTZXQ8c3RyaW5nPixcbiAgICByZW1haW5pbmdEZXB0aDogbnVtYmVyLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocmVtYWluaW5nRGVwdGggPD0gMCB8fCByZWNvcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoZW50aXR5TmFtZSk7XG4gICAgY29uc3QgcmVjb3JkSWRzID0gcmVjb3Jkcy5tYXAoKHIpID0+IHIuaWQpLmZpbHRlcihub25OdWxsYWJsZSk7XG5cbiAgICAvLyAxLiBGb3J3YXJkIHJlZmVyZW5jZXM6IOydtCBlbnRpdHnqsIAg7LC47KGw7ZWY64qUIOuLpOuluCBlbnRpdHlcbiAgICBjb25zdCBmb3J3YXJkUmVsYXRpb25Qcm9wcyA9IGVudGl0eS5wcm9wcy5maWx0ZXIoXG4gICAgICAocHJvcCkgPT5cbiAgICAgICAgaXNSZWxhdGlvblByb3AocHJvcCkgJiZcbiAgICAgICAgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8IChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbikpLFxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgZm9yd2FyZFJlbGF0aW9uUHJvcHMpIHtcbiAgICAgIGlmICghaXNSZWxhdGlvblByb3AocHJvcCkpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCB0YXJnZXRFbnRpdHlOYW1lID0gcHJvcC53aXRoO1xuXG4gICAgICAvLyDsnbTrr7gg7KGw7ZqM7ZWcIGVudGl0eeuKlCDsiqTtgrUgKOyInO2ZmCDssLjsobAg67Cp7KeAKVxuICAgICAgaWYgKHZpc2l0ZWQuaGFzKHRhcmdldEVudGl0eU5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyDssLjsobDtlZjripQgSUTrk6Qg7IiY7KeRXG4gICAgICBjb25zdCBmb3JlaWduS2V5TmFtZSA9IGAke3Byb3AubmFtZX1faWRgO1xuICAgICAgY29uc3QgcmVmZXJlbmNlZElkcyA9IHJlY29yZHNcbiAgICAgICAgLm1hcCgocmVjb3JkKSA9PiByZWNvcmRbZm9yZWlnbktleU5hbWVdKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIG51bWJlcltdO1xuXG4gICAgICBpZiAocmVmZXJlbmNlZElkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIOykkeuztSDsoJzqsbBcbiAgICAgIGNvbnN0IHVuaXF1ZUlkcyA9IFsuLi5uZXcgU2V0KHJlZmVyZW5jZWRJZHMpXTtcblxuICAgICAgLy8g7LC47KGwIOuNsOydtO2EsCDsobDtmoxcbiAgICAgIGNvbnN0IHJlZmVyZW5jZWRSZWNvcmRzID0gYXdhaXQgdGhpcy5leHBsb3JlKHRhcmdldEVudGl0eU5hbWUsIHtcbiAgICAgICAgc3RyYXRlZ3k6IFwiaWRzXCIsXG4gICAgICAgIGlkczogdW5pcXVlSWRzLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIOqysOqzvOyXkCDstpTqsIBcbiAgICAgIHJlbGF0ZWRNYXAuc2V0KHRhcmdldEVudGl0eU5hbWUsIHJlZmVyZW5jZWRSZWNvcmRzKTtcbiAgICAgIHZpc2l0ZWQuYWRkKHRhcmdldEVudGl0eU5hbWUpO1xuXG4gICAgICAvLyDsnqzqt4A6IOywuOyhsOuQnCDrjbDsnbTthLDsnZgg6rSA66CoIOuNsOydtO2EsOuPhCDsiJjsp5FcbiAgICAgIGF3YWl0IHRoaXMuY29sbGVjdFJlbGF0ZWREYXRhKFxuICAgICAgICB0YXJnZXRFbnRpdHlOYW1lLFxuICAgICAgICByZWZlcmVuY2VkUmVjb3JkcyxcbiAgICAgICAgcmVsYXRlZE1hcCxcbiAgICAgICAgdmlzaXRlZCxcbiAgICAgICAgcmVtYWluaW5nRGVwdGggLSAxLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAyLiBCYWNrd2FyZCByZWZlcmVuY2VzOiDsnbQgZW50aXR566W8IOywuOyhsO2VmOuKlCDri6TrpbggZW50aXR5XG4gICAgLy8g66qo65OgIGVudGl0eeulvCDsiJztmoztlZjrqbAg7ZiE7J6sIGVudGl0eeulvCDssLjsobDtlZjripQgcmVsYXRpb24g7LC+6riwXG4gICAgY29uc3QgYWxsRW50aXRpZXMgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0QWxsRW50aXRpZXMoKTtcblxuICAgIGZvciAoY29uc3Qgb3RoZXJFbnRpdHkgb2YgYWxsRW50aXRpZXMpIHtcbiAgICAgIGNvbnN0IG90aGVyRW50aXR5TmFtZSA9IG90aGVyRW50aXR5LmlkO1xuXG4gICAgICAvLyDsnbTrr7gg7KGw7ZqM7ZaI6rGw64KYIOyekOq4sCDsnpDsi6DsnbTrqbQg7Iqk7YK1XG4gICAgICBpZiAodmlzaXRlZC5oYXMob3RoZXJFbnRpdHlOYW1lKSB8fCBvdGhlckVudGl0eU5hbWUgPT09IGVudGl0eU5hbWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIO2YhOyerCBlbnRpdHnrpbwg7LC47KGw7ZWY64qUIHJlbGF0aW9uIHByb3Ag7LC+6riwXG4gICAgICBjb25zdCBiYWNrd2FyZFJlbGF0aW9ucyA9IG90aGVyRW50aXR5LnByb3BzLmZpbHRlcihcbiAgICAgICAgKHByb3ApID0+XG4gICAgICAgICAgaXNSZWxhdGlvblByb3AocHJvcCkgJiZcbiAgICAgICAgICBwcm9wLndpdGggPT09IGVudGl0eU5hbWUgJiZcbiAgICAgICAgICAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHxcbiAgICAgICAgICAgIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbikpLFxuICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGJhY2t3YXJkUmVsYXRpb25zKSB7XG4gICAgICAgIGlmICghaXNSZWxhdGlvblByb3AocHJvcCkpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIG90aGVyRW50aXR56rCAIO2YhOyerCBlbnRpdHnrpbwg7LC47KGw7ZWY64qUIEZLIOy7rOufvFxuICAgICAgICBjb25zdCBmb3JlaWduS2V5TmFtZSA9IGAke3Byb3AubmFtZX1faWRgO1xuXG4gICAgICAgIC8vIO2YhOyerCDroIjsvZTrk5zrk6TsnYQg7LC47KGw7ZWY64qUIG90aGVyRW50aXR5IOugiOy9lOuTnCDsobDtmoxcbiAgICAgICAgY29uc3QgcXVlcnkgPSB0aGlzLmRiKG90aGVyRW50aXR5LnRhYmxlKS53aGVyZUluKGZvcmVpZ25LZXlOYW1lLCByZWNvcmRJZHMpO1xuICAgICAgICBjb25zdCBiYWNrd2FyZFJlY29yZHMgPSBhd2FpdCBxdWVyeTtcblxuICAgICAgICBpZiAoYmFja3dhcmRSZWNvcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g6rKw6rO87JeQIOy2lOqwgFxuICAgICAgICByZWxhdGVkTWFwLnNldChvdGhlckVudGl0eU5hbWUsIGJhY2t3YXJkUmVjb3Jkcyk7XG4gICAgICAgIHZpc2l0ZWQuYWRkKG90aGVyRW50aXR5TmFtZSk7XG5cbiAgICAgICAgLy8g7J6s6reAOiDsl63ssLjsobAg642w7J207YSw7J2YIOq0gOugqCDrjbDsnbTthLDrj4Qg7IiY7KeRXG4gICAgICAgIGF3YWl0IHRoaXMuY29sbGVjdFJlbGF0ZWREYXRhKFxuICAgICAgICAgIG90aGVyRW50aXR5TmFtZSxcbiAgICAgICAgICBiYWNrd2FyZFJlY29yZHMsXG4gICAgICAgICAgcmVsYXRlZE1hcCxcbiAgICAgICAgICB2aXNpdGVkLFxuICAgICAgICAgIHJlbWFpbmluZ0RlcHRoIC0gMSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OzthQUtvRzthQUN2RDtDQXNDaEMsZUFBYixNQUEwQjtFQUN4QixBQUFRO0VBRVIsWUFDRSxBQUFRQSxJQUNSLEFBQVFDLGVBQ1IsY0FDQTtHQUhRO0dBQ0E7QUFHUixRQUFLLFFBQVE7O0VBR2YsTUFBTSxRQUNKLFlBQ0EsU0FDb0M7R0FDcEMsTUFBTSxTQUFTLEtBQUssY0FBYyxJQUFJLFdBQVc7QUFDakQsT0FBSSxDQUFDLFFBQVE7QUFDWCxVQUFNLElBQUksTUFBTSxxQkFBcUIsYUFBYTs7QUFJcEQsT0FBSSxRQUFRLFlBQVksS0FBSyxPQUFPO0lBQ2xDLE1BQU0sV0FBVyxLQUFLLGlCQUFpQixZQUFZLFFBQVE7QUFDM0QsV0FBTyxLQUFLLE1BQU0sU0FBUztLQUN6QixLQUFLO0tBQ0wsS0FBSyxRQUFRLFlBQVk7S0FDekIsZUFBZSxLQUFLLGdCQUFnQixRQUFRLFFBQVE7S0FDckQsQ0FBQzs7QUFHSixVQUFPLEtBQUssZ0JBQWdCLFFBQVEsUUFBUTs7RUFHOUMsTUFBYyxnQkFDWixRQUNBLFNBQ29DO0dBQ3BDLE1BQU0sUUFBUSxLQUFLLEdBQUcsT0FBTyxNQUFNO0FBRW5DLFdBQVEsUUFBUSxVQUFoQjtJQUNFLEtBQUssU0FDSCxRQUFPLE1BQU0sS0FBSyxXQUFXLE9BQU8sUUFBUSxTQUFTLEdBQUc7SUFFMUQsS0FBSyxVQUFVO0tBQ2IsTUFBTSxlQUFlLEtBQUssb0JBQW9CLFFBQVEsYUFBYTtBQUNuRSxTQUFJLGNBQWM7QUFDaEIsWUFBTSxRQUFRLGNBQWMsT0FBTzs7QUFFckMsWUFBTyxNQUFNLE1BQU0sTUFBTSxRQUFRLFNBQVMsR0FBRzs7SUFHL0MsS0FBSyxTQUNILFFBQU8sTUFBTSxLQUFLLGFBQWEsT0FBTyxRQUFRLFNBQVMsR0FBRztJQUU1RCxLQUFLO0FBQ0gsU0FBSSxRQUFRLE9BQU8sUUFBUSxJQUFJLFNBQVMsR0FBRztBQUN6QyxZQUFNLFFBQVEsTUFBTSxRQUFRLElBQUk7O0FBRWxDLFlBQU8sTUFBTTtJQUVmLEtBQUs7QUFDSCxTQUFJLFFBQVEsT0FBTztBQUNqQixZQUFNLE1BQU0sUUFBUSxNQUFNOztBQUU1QixTQUFJLFFBQVEsU0FBUztNQUNuQixNQUFNLENBQUMsS0FBSyxNQUFNLFNBQVMsUUFBUSxRQUFRLE1BQU0sSUFBSTtBQUVyRCxVQUFJLFFBQVEsTUFBTTtBQUNoQixhQUFNLFdBQVcsdUJBQXVCLE9BQU8sQ0FBQyxJQUFJLENBQUM7YUFDaEQ7QUFDTCxhQUFNLFFBQVEsS0FBSyxJQUFzQjs7O0FBRzdDLFlBQU8sTUFBTSxNQUFNLE1BQU0sUUFBUSxTQUFTLEdBQUc7SUFFL0MsS0FBSztBQUNILFNBQUksQ0FBQyxRQUFRLFVBQVU7QUFDckIsWUFBTSxJQUFJLE1BQU0seUNBQXlDOztBQUUzRCxZQUFPLEtBQUssYUFBYSxRQUFRLFNBQVM7SUFFNUMsUUFDRSxPQUFNLElBQUksTUFBTSxxQkFBcUIsUUFBUSxXQUFXOzs7RUFLOUQsTUFBYyxXQUNaLE9BQ0EsT0FDb0M7R0FDcEMsTUFBTSxDQUFDLEVBQUUsV0FBVyxNQUFNLE1BQU0sT0FBTyxDQUFDLE1BQU0sYUFBYTtHQUMzRCxNQUFNLFFBQVEsT0FBTyxNQUFNO0FBRTNCLE9BQUksU0FBUyxPQUFPO0FBQ2xCLFdBQU8sTUFBTSxNQUFNLE1BQU0sTUFBTTs7R0FJakMsTUFBTSxXQUFXLEtBQUssTUFBTSxRQUFRLE1BQU07R0FHMUMsTUFBTSxZQUFZLE1BQU0sVUFBVSxDQUFDLE1BQU0sb0JBQW9CLEdBQUc7QUFDaEUsT0FBSSxDQUFDLFdBQVc7QUFDZCxVQUFNLElBQUksTUFBTSwwQ0FBMEM7O0dBSTVELE1BQU0sU0FBUyxNQUFNLEtBQUssR0FBRyxJQUMzQjs7Ozs7Ozs7T0FTQTtJQUFDO0lBQVc7SUFBVTtJQUFNLENBQzdCO0FBRUQsVUFBTyxPQUFPOztFQUdoQixNQUFjLGFBQ1osT0FDQSxPQUNvQztBQUNwQyxVQUFPLE1BQU0sTUFBTSxXQUFXLFdBQVcsQ0FBQyxNQUFNLE1BQU07O0VBR3hELEFBQVEsb0JBQW9CLFFBQWdCLFlBQW1DO0dBQzdFLE1BQU0sT0FBTyxPQUFPLE1BQU0sTUFBTSxNQUFNLEVBQUUsU0FBUyxXQUFXO0FBQzVELFVBQU8sTUFBTSxRQUFROztFQUd2QixNQUFjLGFBQWEsVUFBc0Q7R0FDL0UsTUFBTSxLQUFLLE1BQU0sT0FBTztHQUN4QixNQUFNLFVBQVUsTUFBTSxHQUFHLFNBQVMsVUFBVSxRQUFRO0FBRXBELE9BQUksU0FBUyxTQUFTLFFBQVEsRUFBRTtJQUM5QixNQUFNLFNBQVMsS0FBSyxNQUFNLFFBQVE7QUFDbEMsUUFBSSxDQUFDLE1BQU0sUUFBUSxPQUFPLEVBQUU7QUFDMUIsV0FBTSxJQUFJLE1BQU0sa0NBQWtDOztBQUVwRCxXQUFPO2NBQ0UsU0FBUyxTQUFTLE9BQU8sRUFBRTtJQUNwQyxNQUFNLFFBQVEsUUFBUSxNQUFNLEtBQUssQ0FBQyxRQUFRLFNBQVMsS0FBSyxNQUFNLENBQUM7QUFDL0QsUUFBSSxNQUFNLFdBQVcsRUFBRyxRQUFPLEVBQUU7SUFFakMsTUFBTSxVQUFVLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLE1BQU0sRUFBRSxNQUFNLENBQUM7QUFDeEQsV0FBTyxNQUFNLE1BQU0sRUFBRSxDQUFDLEtBQUssU0FBUztLQUNsQyxNQUFNLFNBQVMsS0FBSyxNQUFNLElBQUk7QUFDOUIsWUFBTyxRQUFRLFFBQ1osS0FBOEIsUUFBZ0IsTUFBYztBQUMzRCxVQUFJLFVBQVUsT0FBTyxJQUFJLE1BQU07QUFDL0IsYUFBTztRQUVULEVBQUUsQ0FDSDtNQUNEOztBQUdKLFNBQU0sSUFBSSxNQUFNLDRCQUE0QixXQUFXOztFQUd6RCxNQUFNLGdCQUNKLFlBQ0EsY0FDQSxTQUNvQztHQUNwQyxNQUFNLFNBQVMsS0FBSyxjQUFjLElBQUksV0FBVztHQUNqRCxNQUFNLE9BQU8sT0FBTyxNQUFNLE1BQU0sTUFBTSxFQUFFLFNBQVMsYUFBYTtBQUU5RCxPQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsS0FBSyxFQUFFO0FBQ2xDLFVBQU0sSUFBSSxNQUFNLGdDQUFnQyxXQUFXLEdBQUcsZUFBZTs7R0FHL0UsTUFBTSxhQUFhLEtBQUssTUFBTTtHQUM5QixNQUFNLFdBQVcsWUFBWSxZQUFZLFNBQVMsWUFBWTtHQUM5RCxNQUFNLFNBQ0osWUFBWSxVQUFVLE9BQU8sV0FBVyxXQUFXLFdBQzlDLFdBQVcsU0FDWixFQUFFO0FBRVIsVUFBTyxLQUFLLFFBQVEsS0FBSyxNQUFNO0lBQzdCO0lBQ0EsT0FBTyxTQUFTLFVBQVUsT0FBTyxPQUFPLFVBQVUsV0FBVyxPQUFPLFFBQVE7SUFDNUUsR0FBSSxPQUFPLFdBQVcsV0FBVyxTQUFTLEVBQUU7SUFDNUMsR0FBRztJQUNKLENBQUM7Ozs7O0VBTUosTUFBTSxpQkFDSixZQUNBLGVBQ0EsU0FDb0Q7R0FDcEQsTUFBTSxVQUFVLE1BQU0sUUFBUSxJQUM1QixjQUFjLElBQUksT0FBTyxTQUFTO0lBQ2hDLE1BQU0sT0FBTyxNQUFNLEtBQUssZ0JBQWdCLFlBQVksTUFBTSxRQUFRO0FBQ2xFLFdBQU8sQ0FBQyxNQUFNLEtBQUs7S0FDbkIsQ0FDSDtBQUVELFVBQU8sT0FBTyxZQUFZLFFBQVE7O0VBR3BDLEFBQVEsaUJBQWlCLFlBQW9CLFNBQXNDO0dBQ2pGLE1BQU0sUUFBUTtJQUNaLGdCQUFnQjtJQUNoQixRQUFRO0lBQ1IsUUFBUSxPQUFPLFVBQVUsSUFBSTtJQUM5QjtBQUVELE9BQUksUUFBUSxPQUFPO0FBQ2pCLFVBQU0sS0FBSyxLQUFLLFVBQVUsUUFBUSxNQUFNLENBQUM7O0FBRTNDLE9BQUksUUFBUSxTQUFTO0FBQ25CLFVBQU0sS0FBSyxRQUFRLFFBQVE7O0FBRTdCLE9BQUksUUFBUSxLQUFLO0FBQ2YsVUFBTSxLQUFLLFFBQVEsSUFBSSxLQUFLLElBQUksQ0FBQzs7QUFHbkMsVUFBTyxNQUFNLEtBQUssSUFBSTs7Ozs7O0VBT3hCLE1BQU0scUJBQ0osWUFDQSxTQUNxQztHQUNyQyxNQUFNLG1CQUFtQixRQUFRLG9CQUFvQjtHQUNyRCxNQUFNLFdBQVcsUUFBUSxZQUFZO0dBR3JDLE1BQU0sY0FBYyxNQUFNLEtBQUssUUFBUSxZQUFZLFFBQVE7R0FFM0QsTUFBTUMsU0FBcUM7SUFDekMsTUFBTTtLQUNKLFVBQVU7S0FDVixTQUFTO0tBQ1Y7SUFDRCxTQUFTLElBQUksS0FBSztJQUNuQjtBQUdELE9BQUksQ0FBQyxvQkFBb0IsWUFBWSxHQUFHO0FBQ3RDLFdBQU87O0dBSVQsTUFBTSxVQUFVLElBQUksSUFBWSxDQUFDLFdBQVcsQ0FBQztBQUc3QyxTQUFNLEtBQUssbUJBQW1CLFlBQVksYUFBYSxPQUFPLFNBQVMsU0FBUyxTQUFTO0FBRXpGLFVBQU87Ozs7O0VBTVQsTUFBYyxtQkFDWixZQUNBLFNBQ0EsWUFDQSxTQUNBLGdCQUNlO0FBQ2YsT0FBSSxrQkFBa0IsS0FBSyxRQUFRLFdBQVcsR0FBRztBQUMvQzs7R0FHRixNQUFNLFNBQVMsS0FBSyxjQUFjLElBQUksV0FBVztHQUNqRCxNQUFNLFlBQVksUUFBUSxLQUFLLE1BQU0sRUFBRSxHQUFHLENBQUMsT0FBTyxZQUFZO0dBRzlELE1BQU0sdUJBQXVCLE9BQU8sTUFBTSxRQUN2QyxTQUNDLGVBQWUsS0FBSyxLQUNuQiwyQkFBMkIsS0FBSyxJQUFLLHVCQUF1QixLQUFLLElBQUksS0FBSyxlQUM5RTtBQUVELFFBQUssTUFBTSxRQUFRLHNCQUFzQjtBQUN2QyxRQUFJLENBQUMsZUFBZSxLQUFLLENBQUU7SUFFM0IsTUFBTSxtQkFBbUIsS0FBSztBQUc5QixRQUFJLFFBQVEsSUFBSSxpQkFBaUIsRUFBRTtBQUNqQzs7SUFJRixNQUFNLGlCQUFpQixHQUFHLEtBQUssS0FBSztJQUNwQyxNQUFNLGdCQUFnQixRQUNuQixLQUFLLFdBQVcsT0FBTyxnQkFBZ0IsQ0FDdkMsT0FBTyxRQUFRO0FBRWxCLFFBQUksY0FBYyxXQUFXLEdBQUc7QUFDOUI7O0lBSUYsTUFBTSxZQUFZLENBQUMsR0FBRyxJQUFJLElBQUksY0FBYyxDQUFDO0lBRzdDLE1BQU0sb0JBQW9CLE1BQU0sS0FBSyxRQUFRLGtCQUFrQjtLQUM3RCxVQUFVO0tBQ1YsS0FBSztLQUNOLENBQUM7QUFHRixlQUFXLElBQUksa0JBQWtCLGtCQUFrQjtBQUNuRCxZQUFRLElBQUksaUJBQWlCO0FBRzdCLFVBQU0sS0FBSyxtQkFDVCxrQkFDQSxtQkFDQSxZQUNBLFNBQ0EsaUJBQWlCLEVBQ2xCOztHQUtILE1BQU0sY0FBYyxLQUFLLGNBQWMsZ0JBQWdCO0FBRXZELFFBQUssTUFBTSxlQUFlLGFBQWE7SUFDckMsTUFBTSxrQkFBa0IsWUFBWTtBQUdwQyxRQUFJLFFBQVEsSUFBSSxnQkFBZ0IsSUFBSSxvQkFBb0IsWUFBWTtBQUNsRTs7SUFJRixNQUFNLG9CQUFvQixZQUFZLE1BQU0sUUFDekMsU0FDQyxlQUFlLEtBQUssSUFDcEIsS0FBSyxTQUFTLGVBQ2IsMkJBQTJCLEtBQUssSUFDOUIsdUJBQXVCLEtBQUssSUFBSSxLQUFLLGVBQzNDO0FBRUQsU0FBSyxNQUFNLFFBQVEsbUJBQW1CO0FBQ3BDLFNBQUksQ0FBQyxlQUFlLEtBQUssQ0FBRTtLQUczQixNQUFNLGlCQUFpQixHQUFHLEtBQUssS0FBSztLQUdwQyxNQUFNLFFBQVEsS0FBSyxHQUFHLFlBQVksTUFBTSxDQUFDLFFBQVEsZ0JBQWdCLFVBQVU7S0FDM0UsTUFBTSxrQkFBa0IsTUFBTTtBQUU5QixTQUFJLGdCQUFnQixXQUFXLEdBQUc7QUFDaEM7O0FBSUYsZ0JBQVcsSUFBSSxpQkFBaUIsZ0JBQWdCO0FBQ2hELGFBQVEsSUFBSSxnQkFBZ0I7QUFHNUIsV0FBTSxLQUFLLG1CQUNULGlCQUNBLGlCQUNBLFlBQ0EsU0FDQSxpQkFBaUIsRUFDbEIifQ==
203
+
204
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1leHBsb3Jlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9kYXRhLWV4cGxvcmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbmltcG9ydCB7IHR5cGUgQ2FjaGVNYW5hZ2VyIH0gZnJvbSBcIi4uL2NhY2hlL3R5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eSB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5XCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCwgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCwgaXNSZWxhdGlvblByb3AgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG5vbk51bGxhYmxlIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5cbmV4cG9ydCB0eXBlIERhdGFFeHBsb3JlclN0cmF0ZWd5ID0gXCJzYW1wbGVcIiB8IFwiaWRzXCIgfCBcInF1ZXJ5XCIgfCBcImZpbGVcIiB8IFwicmVjZW50XCIgfCBcInJhbmRvbVwiO1xuXG4vKiogV0hFUkUg7KGw6rG0IO2DgOyehSAo6rCd7LK0IOuYkOuKlCBLbmV4IFF1ZXJ5QnVpbGRlciDtlajsiJgpICovXG5leHBvcnQgdHlwZSBXaGVyZUNvbmRpdGlvbiA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgKChxdWVyeUJ1aWxkZXI6IEtuZXguUXVlcnlCdWlsZGVyKSA9PiB2b2lkKTtcblxuZXhwb3J0IHR5cGUgRGF0YUV4cGxvcmVyT3B0aW9ucyA9IHtcbiAgc3RyYXRlZ3k6IERhdGFFeHBsb3JlclN0cmF0ZWd5O1xuICBsaW1pdD86IG51bWJlcjtcbiAgd2hlcmU/OiBXaGVyZUNvbmRpdGlvbjtcbiAgb3JkZXJCeT86IHN0cmluZztcbiAgaWRzPzogbnVtYmVyW107XG4gIGZpbGVQYXRoPzogc3RyaW5nO1xuICAvKiog7LqQ7IuxIOyCrOyaqSDsl6zrtoAgKOq4sOuzuOqwkjogZmFsc2UpICovXG4gIHVzZUNhY2hlPzogYm9vbGVhbjtcbiAgLyoqIOy6kOyLnCBUVEwgKOy0iCDri6jsnIQsIOq4sOuzuOqwkjogMzAwKSAqL1xuICBjYWNoZVR0bD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIEV4cGxvcmVXaXRoUmVsYXRpb25zT3B0aW9ucyA9IERhdGFFeHBsb3Jlck9wdGlvbnMgJiB7XG4gIC8qKiDqtIDroKgg642w7J207YSwIO2PrO2VqCDsl6zrtoAgKOq4sOuzuOqwkjogdHJ1ZSkgKi9cbiAgaW5jbHVkZVJlbGF0aW9ucz86IGJvb2xlYW47XG4gIC8qKiDsnqzqt4Ag7YOQ7IOJIOy1nOuMgCDquYrsnbQgKOq4sOuzuOqwkjogMikgKi9cbiAgbWF4RGVwdGg/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBFeHBsb3JlV2l0aFJlbGF0aW9uc1Jlc3VsdCA9IHtcbiAgLyoqIOuplOyduCBlbnRpdHkg642w7J207YSwICovXG4gIG1haW46IHtcbiAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgIHJlY29yZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG4gIH07XG4gIC8qKiDqtIDroKggZW50aXR5IOuNsOydtO2EsCAoZW50aXR5SWQgLT4gcmVjb3JkcykgKi9cbiAgcmVsYXRlZDogTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXT47XG59O1xuXG4vLyDquLDsobQgREIg642w7J207YSw66W8IO2DkOyDie2VmOyXrCBmaXh0dXJlIOyDneyEsSDsi5wg7LC47KGw7ZWgIOyImCDsnojripQg7Iuc7Iqk7YWcXG5leHBvcnQgY2xhc3MgRGF0YUV4cGxvcmVyIHtcbiAgcHJpdmF0ZSBjYWNoZT86IENhY2hlTWFuYWdlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRiOiBLbmV4LFxuICAgIHByaXZhdGUgZW50aXR5TWFuYWdlcjogdHlwZW9mIEVudGl0eU1hbmFnZXIsXG4gICAgY2FjaGVNYW5hZ2VyPzogQ2FjaGVNYW5hZ2VyLFxuICApIHtcbiAgICB0aGlzLmNhY2hlID0gY2FjaGVNYW5hZ2VyO1xuICB9XG5cbiAgYXN5bmMgZXhwbG9yZShcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczogRGF0YUV4cGxvcmVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdPiB7XG4gICAgY29uc3QgZW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlOYW1lKTtcbiAgICBpZiAoIWVudGl0eSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbnRpdHkgbm90IGZvdW5kOiAke2VudGl0eU5hbWV9YCk7XG4gICAgfVxuXG4gICAgLy8g7LqQ7IuxIOyngOybkFxuICAgIGlmIChvcHRpb25zLnVzZUNhY2hlICYmIHRoaXMuY2FjaGUpIHtcbiAgICAgIGNvbnN0IGNhY2hlS2V5ID0gdGhpcy5nZW5lcmF0ZUNhY2hlS2V5KGVudGl0eU5hbWUsIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0T3JTZXQoe1xuICAgICAgICBrZXk6IGNhY2hlS2V5LFxuICAgICAgICB0dGw6IG9wdGlvbnMuY2FjaGVUdGwgfHwgMzAwLFxuICAgICAgICBmYWN0b3J5OiAoKSA9PiB0aGlzLmV4cGxvcmVJbnRlcm5hbChlbnRpdHksIG9wdGlvbnMpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhwbG9yZUludGVybmFsKGVudGl0eSwgb3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4cGxvcmVJbnRlcm5hbChcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICBvcHRpb25zOiBEYXRhRXhwbG9yZXJPcHRpb25zLFxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+W10+IHtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuZGIoZW50aXR5LnRhYmxlKTtcblxuICAgIHN3aXRjaCAob3B0aW9ucy5zdHJhdGVneSkge1xuICAgICAgY2FzZSBcInNhbXBsZVwiOlxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5zYW1wbGVEYXRhKHF1ZXJ5LCBvcHRpb25zLmxpbWl0IHx8IDEwKTtcblxuICAgICAgY2FzZSBcInJlY2VudFwiOiB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZWRBdENvbCA9IHRoaXMuZmluZFRpbWVzdGFtcENvbHVtbihlbnRpdHksIFwiY3JlYXRlZF9hdFwiKTtcbiAgICAgICAgaWYgKGNyZWF0ZWRBdENvbCkge1xuICAgICAgICAgIHF1ZXJ5Lm9yZGVyQnkoY3JlYXRlZEF0Q29sLCBcImRlc2NcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHF1ZXJ5LmxpbWl0KG9wdGlvbnMubGltaXQgfHwgMTApO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwicmFuZG9tXCI6XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJhbmRvbVNhbXBsZShxdWVyeSwgb3B0aW9ucy5saW1pdCB8fCAxMCk7XG5cbiAgICAgIGNhc2UgXCJpZHNcIjpcbiAgICAgICAgaWYgKG9wdGlvbnMuaWRzICYmIG9wdGlvbnMuaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBxdWVyeS53aGVyZUluKFwiaWRcIiwgb3B0aW9ucy5pZHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBxdWVyeTtcblxuICAgICAgY2FzZSBcInF1ZXJ5XCI6XG4gICAgICAgIGlmIChvcHRpb25zLndoZXJlKSB7XG4gICAgICAgICAgcXVlcnkud2hlcmUob3B0aW9ucy53aGVyZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMub3JkZXJCeSkge1xuICAgICAgICAgIGNvbnN0IFtjb2wsIGRpciA9IFwiYXNjXCJdID0gb3B0aW9ucy5vcmRlckJ5LnNwbGl0KFwiOlwiKTtcbiAgICAgICAgICAvLyBpZCDsu6zrn7zsnYAg7Iir7J6Q66GcIOy6kOyKpO2Mhe2VmOyXrCDsoJXroKztlanri4jri6QgKOusuOyekOyXtCDsoJXroKwg67Cp7KeAKVxuICAgICAgICAgIGlmIChjb2wgPT09IFwiaWRcIikge1xuICAgICAgICAgICAgcXVlcnkub3JkZXJCeVJhdyhgQ0FTVCg/PyBBUyBJTlRFR0VSKSAke2Rpcn1gLCBbY29sXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHF1ZXJ5Lm9yZGVyQnkoY29sLCBkaXIgYXMgXCJhc2NcIiB8IFwiZGVzY1wiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHF1ZXJ5LmxpbWl0KG9wdGlvbnMubGltaXQgfHwgMTApO1xuXG4gICAgICBjYXNlIFwiZmlsZVwiOlxuICAgICAgICBpZiAoIW9wdGlvbnMuZmlsZVBhdGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmaWxlUGF0aCBpcyByZXF1aXJlZCBmb3IgZmlsZSBzdHJhdGVneVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sb2FkRnJvbUZpbGUob3B0aW9ucy5maWxlUGF0aCk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzdHJhdGVneTogJHtvcHRpb25zLnN0cmF0ZWd5fWApO1xuICAgIH1cbiAgfVxuXG4gIC8vIOq3oOuTsSDsg5jtlIzrp4EgKFBvc3RncmVTUUwgUk9XX05VTUJFUiDsgqzsmqkpXG4gIHByaXZhdGUgYXN5bmMgc2FtcGxlRGF0YShcbiAgICBxdWVyeTogS25leC5RdWVyeUJ1aWxkZXIsXG4gICAgbGltaXQ6IG51bWJlcixcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdPiB7XG4gICAgY29uc3QgW3sgY291bnQgfV0gPSBhd2FpdCBxdWVyeS5jbG9uZSgpLmNvdW50KFwiKiBhcyBjb3VudFwiKTtcbiAgICBjb25zdCB0b3RhbCA9IE51bWJlcihjb3VudCk7XG5cbiAgICBpZiAodG90YWwgPD0gbGltaXQpIHtcbiAgICAgIHJldHVybiBhd2FpdCBxdWVyeS5saW1pdChsaW1pdCk7XG4gICAgfVxuXG4gICAgLy8g6reg65OxIOqwhOqyqSDqs4TsgrBcbiAgICBjb25zdCBpbnRlcnZhbCA9IE1hdGguZmxvb3IodG90YWwgLyBsaW1pdCk7XG5cbiAgICAvLyDthYzsnbTruJTrqoUg7LaU7LacXG4gICAgY29uc3QgdGFibGVOYW1lID0gcXVlcnkudG9TdHJpbmcoKS5tYXRjaCgvZnJvbVxccytcIj8oXFx3KylcIj8vaSk/LlsxXTtcbiAgICBpZiAoIXRhYmxlTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGV4dHJhY3QgdGFibGUgbmFtZSBmcm9tIHF1ZXJ5XCIpO1xuICAgIH1cblxuICAgIC8vIFJPV19OVU1CRVIoKeuhnCDtlZwg67KI7JeQIOq3oOuTsSDsg5jtlIzrp4EgKOuLqOydvCDsv7zrpqwpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5kYi5yYXcoXG4gICAgICBgXG4gICAgICBXSVRIIG51bWJlcmVkX3Jvd3MgQVMgKFxuICAgICAgICBTRUxFQ1QgKiwgUk9XX05VTUJFUigpIE9WRVIgKE9SREVSIEJZIGlkKSBhcyByblxuICAgICAgICBGUk9NID8/XG4gICAgICApXG4gICAgICBTRUxFQ1QgKiBGUk9NIG51bWJlcmVkX3Jvd3NcbiAgICAgIFdIRVJFIE1PRChybiAtIDEsID8pID0gMFxuICAgICAgTElNSVQgP1xuICAgIGAsXG4gICAgICBbdGFibGVOYW1lLCBpbnRlcnZhbCwgbGltaXRdLFxuICAgICk7XG5cbiAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJhbmRvbVNhbXBsZShcbiAgICBxdWVyeTogS25leC5RdWVyeUJ1aWxkZXIsXG4gICAgbGltaXQ6IG51bWJlcixcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdPiB7XG4gICAgcmV0dXJuIGF3YWl0IHF1ZXJ5Lm9yZGVyQnlSYXcoXCJSQU5ET00oKVwiKS5saW1pdChsaW1pdCk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRUaW1lc3RhbXBDb2x1bW4oZW50aXR5OiBFbnRpdHksIGNvbHVtbk5hbWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBjb2x1bW5OYW1lKTtcbiAgICByZXR1cm4gcHJvcD8ubmFtZSB8fCBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkRnJvbUZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj5bXT4ge1xuICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0KFwiZnMvcHJvbWlzZXNcIik7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoLCBcInV0Zi04XCIpO1xuXG4gICAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29udGVudCk7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyc2VkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJKU09OIGZpbGUgbXVzdCBjb250YWluIGFuIGFycmF5XCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcnNlZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xuICAgIH0gZWxzZSBpZiAoZmlsZVBhdGguZW5kc1dpdGgoXCIuY3N2XCIpKSB7XG4gICAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIikuZmlsdGVyKChsaW5lKSA9PiBsaW5lLnRyaW0oKSk7XG4gICAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBsaW5lc1swXS5zcGxpdChcIixcIikubWFwKChoKSA9PiBoLnRyaW0oKSk7XG4gICAgICByZXR1cm4gbGluZXMuc2xpY2UoMSkubWFwKChsaW5lKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGxpbmUuc3BsaXQoXCIsXCIpO1xuICAgICAgICByZXR1cm4gaGVhZGVycy5yZWR1Y2UoXG4gICAgICAgICAgKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGhlYWRlcjogc3RyaW5nLCBpOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIG9ialtoZWFkZXJdID0gdmFsdWVzW2ldPy50cmltKCk7XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICAgIH0sXG4gICAgICAgICAge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGZpbGUgZm9ybWF0OiAke2ZpbGVQYXRofWApO1xuICB9XG5cbiAgYXN5bmMgZXhwbG9yZVJlbGF0aW9uKFxuICAgIGVudGl0eU5hbWU6IHN0cmluZyxcbiAgICByZWxhdGlvblByb3A6IHN0cmluZyxcbiAgICBvcHRpb25zPzogUGFydGlhbDxEYXRhRXhwbG9yZXJPcHRpb25zPixcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdPiB7XG4gICAgY29uc3QgZW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlOYW1lKTtcbiAgICBjb25zdCBwcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gcmVsYXRpb25Qcm9wKTtcblxuICAgIGlmICghcHJvcCB8fCAhaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUmVsYXRpb24gcHJvcGVydHkgbm90IGZvdW5kOiAke2VudGl0eU5hbWV9LiR7cmVsYXRpb25Qcm9wfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBwcm9wLmNvbmU/LmRhdGFTb3VyY2U7XG4gICAgY29uc3Qgc3RyYXRlZ3kgPSBkYXRhU291cmNlPy5zdHJhdGVneSB8fCBvcHRpb25zPy5zdHJhdGVneSB8fCBcInNhbXBsZVwiO1xuICAgIGNvbnN0IGNvbmZpZyA9XG4gICAgICBkYXRhU291cmNlPy5jb25maWcgJiYgdHlwZW9mIGRhdGFTb3VyY2UuY29uZmlnID09PSBcIm9iamVjdFwiXG4gICAgICAgID8gKGRhdGFTb3VyY2UuY29uZmlnIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgICA6IHt9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhwbG9yZShwcm9wLndpdGgsIHtcbiAgICAgIHN0cmF0ZWd5LFxuICAgICAgbGltaXQ6IG9wdGlvbnM/LmxpbWl0IHx8ICh0eXBlb2YgY29uZmlnLmxpbWl0ID09PSBcIm51bWJlclwiID8gY29uZmlnLmxpbWl0IDogMTApLFxuICAgICAgLi4uKHR5cGVvZiBjb25maWcgPT09IFwib2JqZWN0XCIgPyBjb25maWcgOiB7fSksXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOyXrOufrCByZWxhdGlvbuydhCDrs5HroKzroZwg7KGw7ZqM7ZWp64uI64ukIChOKzEg66y47KCcIO2VtOqysClcbiAgICovXG4gIGFzeW5jIGV4cGxvcmVSZWxhdGlvbnMoXG4gICAgZW50aXR5TmFtZTogc3RyaW5nLFxuICAgIHJlbGF0aW9uUHJvcHM6IHN0cmluZ1tdLFxuICAgIG9wdGlvbnM/OiBQYXJ0aWFsPERhdGFFeHBsb3Jlck9wdGlvbnM+LFxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+W10+PiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgcmVsYXRpb25Qcm9wcy5tYXAoYXN5bmMgKHByb3ApID0+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuZXhwbG9yZVJlbGF0aW9uKGVudGl0eU5hbWUsIHByb3AsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gW3Byb3AsIGRhdGFdIGFzIGNvbnN0O1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMocmVzdWx0cyk7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlQ2FjaGVLZXkoZW50aXR5TmFtZTogc3RyaW5nLCBvcHRpb25zOiBEYXRhRXhwbG9yZXJPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJ0cyA9IFtcbiAgICAgIGBEYXRhRXhwbG9yZXI6JHtlbnRpdHlOYW1lfWAsXG4gICAgICBvcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgb3B0aW9ucy5saW1pdD8udG9TdHJpbmcoKSB8fCBcImRlZmF1bHRcIixcbiAgICBdO1xuXG4gICAgaWYgKG9wdGlvbnMud2hlcmUpIHtcbiAgICAgIHBhcnRzLnB1c2goSlNPTi5zdHJpbmdpZnkob3B0aW9ucy53aGVyZSkpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5vcmRlckJ5KSB7XG4gICAgICBwYXJ0cy5wdXNoKG9wdGlvbnMub3JkZXJCeSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmlkcykge1xuICAgICAgcGFydHMucHVzaChvcHRpb25zLmlkcy5qb2luKFwiLFwiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oXCI6XCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVudGl0eeyZgCDqtIDroKjrkJwg642w7J207YSw66W8IOyerOq3gOyggeycvOuhnCDtg5Dsg4ntlanri4jri6QuXG4gICAqIEJlbG9uZ3NUb09uZSwgT25lVG9PbmUoaGFzSm9pbkNvbHVtbikgcmVsYXRpb27snYQg65Sw65286rCA66mwIOywuOyhsCDrjbDsnbTthLDrpbwg7IiY7KeR7ZWp64uI64ukLlxuICAgKi9cbiAgYXN5bmMgZXhwbG9yZVdpdGhSZWxhdGlvbnMoXG4gICAgZW50aXR5TmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IEV4cGxvcmVXaXRoUmVsYXRpb25zT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxFeHBsb3JlV2l0aFJlbGF0aW9uc1Jlc3VsdD4ge1xuICAgIGNvbnN0IGluY2x1ZGVSZWxhdGlvbnMgPSBvcHRpb25zLmluY2x1ZGVSZWxhdGlvbnMgPz8gdHJ1ZTtcbiAgICBjb25zdCBtYXhEZXB0aCA9IG9wdGlvbnMubWF4RGVwdGggPz8gMjtcblxuICAgIC8vIOuplOyduCBlbnRpdHkg7KGw7ZqMXG4gICAgY29uc3QgbWFpblJlY29yZHMgPSBhd2FpdCB0aGlzLmV4cGxvcmUoZW50aXR5TmFtZSwgb3B0aW9ucyk7XG5cbiAgICBjb25zdCByZXN1bHQ6IEV4cGxvcmVXaXRoUmVsYXRpb25zUmVzdWx0ID0ge1xuICAgICAgbWFpbjoge1xuICAgICAgICBlbnRpdHlJZDogZW50aXR5TmFtZSxcbiAgICAgICAgcmVjb3JkczogbWFpblJlY29yZHMsXG4gICAgICB9LFxuICAgICAgcmVsYXRlZDogbmV3IE1hcCgpLFxuICAgIH07XG5cbiAgICAvLyDqtIDroKgg642w7J207YSwIOyImOynke2VmOyngCDslYrsnLzrqbQg67CU66GcIOumrO2EtFxuICAgIGlmICghaW5jbHVkZVJlbGF0aW9ucyB8fCBtYXhEZXB0aCA8PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIOydtOuvuCDsobDtmoztlZwgZW50aXR5IOy2lOyggSAo7KSR67O1IOuwqeyngClcbiAgICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KFtlbnRpdHlOYW1lXSk7XG5cbiAgICAvLyDsnqzqt4DsoIHsnLzroZwg6rSA66CoIOuNsOydtO2EsCDsiJjsp5FcbiAgICBhd2FpdCB0aGlzLmNvbGxlY3RSZWxhdGVkRGF0YShlbnRpdHlOYW1lLCBtYWluUmVjb3JkcywgcmVzdWx0LnJlbGF0ZWQsIHZpc2l0ZWQsIG1heERlcHRoKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICog6rSA66CoIOuNsOydtO2EsOulvCDsnqzqt4DsoIHsnLzroZwg7IiY7KeR7ZWp64uI64ukIChwcml2YXRlIGhlbHBlcilcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29sbGVjdFJlbGF0ZWREYXRhKFxuICAgIGVudGl0eU5hbWU6IHN0cmluZyxcbiAgICByZWNvcmRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuICAgIHJlbGF0ZWRNYXA6IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+W10+LFxuICAgIHZpc2l0ZWQ6IFNldDxzdHJpbmc+LFxuICAgIHJlbWFpbmluZ0RlcHRoOiBudW1iZXIsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChyZW1haW5pbmdEZXB0aCA8PSAwIHx8IHJlY29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlOYW1lKTtcbiAgICBjb25zdCByZWNvcmRJZHMgPSByZWNvcmRzLm1hcCgocikgPT4gci5pZCkuZmlsdGVyKG5vbk51bGxhYmxlKTtcblxuICAgIC8vIDEuIEZvcndhcmQgcmVmZXJlbmNlczog7J20IGVudGl0eeqwgCDssLjsobDtlZjripQg64uk66W4IGVudGl0eVxuICAgIGNvbnN0IGZvcndhcmRSZWxhdGlvblByb3BzID0gZW50aXR5LnByb3BzLmZpbHRlcihcbiAgICAgIChwcm9wKSA9PlxuICAgICAgICBpc1JlbGF0aW9uUHJvcChwcm9wKSAmJlxuICAgICAgICAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSksXG4gICAgKTtcblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBmb3J3YXJkUmVsYXRpb25Qcm9wcykge1xuICAgICAgaWYgKCFpc1JlbGF0aW9uUHJvcChwcm9wKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHRhcmdldEVudGl0eU5hbWUgPSBwcm9wLndpdGg7XG5cbiAgICAgIC8vIOydtOuvuCDsobDtmoztlZwgZW50aXR564qUIOyKpO2CtSAo7Iic7ZmYIOywuOyhsCDrsKnsp4ApXG4gICAgICBpZiAodmlzaXRlZC5oYXModGFyZ2V0RW50aXR5TmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIOywuOyhsO2VmOuKlCBJROuTpCDsiJjsp5FcbiAgICAgIGNvbnN0IGZvcmVpZ25LZXlOYW1lID0gYCR7cHJvcC5uYW1lfV9pZGA7XG4gICAgICBjb25zdCByZWZlcmVuY2VkSWRzID0gcmVjb3Jkc1xuICAgICAgICAubWFwKChyZWNvcmQpID0+IHJlY29yZFtmb3JlaWduS2V5TmFtZV0pXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgbnVtYmVyW107XG5cbiAgICAgIGlmIChyZWZlcmVuY2VkSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8g7KSR67O1IOygnOqxsFxuICAgICAgY29uc3QgdW5pcXVlSWRzID0gWy4uLm5ldyBTZXQocmVmZXJlbmNlZElkcyldO1xuXG4gICAgICAvLyDssLjsobAg642w7J207YSwIOyhsO2ajFxuICAgICAgY29uc3QgcmVmZXJlbmNlZFJlY29yZHMgPSBhd2FpdCB0aGlzLmV4cGxvcmUodGFyZ2V0RW50aXR5TmFtZSwge1xuICAgICAgICBzdHJhdGVneTogXCJpZHNcIixcbiAgICAgICAgaWRzOiB1bmlxdWVJZHMsXG4gICAgICB9KTtcblxuICAgICAgLy8g6rKw6rO87JeQIOy2lOqwgFxuICAgICAgcmVsYXRlZE1hcC5zZXQodGFyZ2V0RW50aXR5TmFtZSwgcmVmZXJlbmNlZFJlY29yZHMpO1xuICAgICAgdmlzaXRlZC5hZGQodGFyZ2V0RW50aXR5TmFtZSk7XG5cbiAgICAgIC8vIOyerOq3gDog7LC47KGw65CcIOuNsOydtO2EsOydmCDqtIDroKgg642w7J207YSw64+EIOyImOynkVxuICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0UmVsYXRlZERhdGEoXG4gICAgICAgIHRhcmdldEVudGl0eU5hbWUsXG4gICAgICAgIHJlZmVyZW5jZWRSZWNvcmRzLFxuICAgICAgICByZWxhdGVkTWFwLFxuICAgICAgICB2aXNpdGVkLFxuICAgICAgICByZW1haW5pbmdEZXB0aCAtIDEsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDIuIEJhY2t3YXJkIHJlZmVyZW5jZXM6IOydtCBlbnRpdHnrpbwg7LC47KGw7ZWY64qUIOuLpOuluCBlbnRpdHlcbiAgICAvLyDrqqjrk6AgZW50aXR566W8IOyInO2ajO2VmOupsCDtmITsnqwgZW50aXR566W8IOywuOyhsO2VmOuKlCByZWxhdGlvbiDssL7quLBcbiAgICBjb25zdCBhbGxFbnRpdGllcyA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXRBbGxFbnRpdGllcygpO1xuXG4gICAgZm9yIChjb25zdCBvdGhlckVudGl0eSBvZiBhbGxFbnRpdGllcykge1xuICAgICAgY29uc3Qgb3RoZXJFbnRpdHlOYW1lID0gb3RoZXJFbnRpdHkuaWQ7XG5cbiAgICAgIC8vIOydtOuvuCDsobDtmoztlojqsbDrgpgg7J6Q6riwIOyekOyLoOydtOuptCDsiqTtgrVcbiAgICAgIGlmICh2aXNpdGVkLmhhcyhvdGhlckVudGl0eU5hbWUpIHx8IG90aGVyRW50aXR5TmFtZSA9PT0gZW50aXR5TmFtZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8g7ZiE7J6sIGVudGl0eeulvCDssLjsobDtlZjripQgcmVsYXRpb24gcHJvcCDssL7quLBcbiAgICAgIGNvbnN0IGJhY2t3YXJkUmVsYXRpb25zID0gb3RoZXJFbnRpdHkucHJvcHMuZmlsdGVyKFxuICAgICAgICAocHJvcCkgPT5cbiAgICAgICAgICBpc1JlbGF0aW9uUHJvcChwcm9wKSAmJlxuICAgICAgICAgIHByb3Aud2l0aCA9PT0gZW50aXR5TmFtZSAmJlxuICAgICAgICAgIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSksXG4gICAgICApO1xuXG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgYmFja3dhcmRSZWxhdGlvbnMpIHtcbiAgICAgICAgaWYgKCFpc1JlbGF0aW9uUHJvcChwcm9wKSkgY29udGludWU7XG5cbiAgICAgICAgLy8gb3RoZXJFbnRpdHnqsIAg7ZiE7J6sIGVudGl0eeulvCDssLjsobDtlZjripQgRksg7Lus65+8XG4gICAgICAgIGNvbnN0IGZvcmVpZ25LZXlOYW1lID0gYCR7cHJvcC5uYW1lfV9pZGA7XG5cbiAgICAgICAgLy8g7ZiE7J6sIOugiOy9lOuTnOuTpOydhCDssLjsobDtlZjripQgb3RoZXJFbnRpdHkg66CI7L2U65OcIOyhsO2ajFxuICAgICAgICBjb25zdCBxdWVyeSA9IHRoaXMuZGIob3RoZXJFbnRpdHkudGFibGUpLndoZXJlSW4oZm9yZWlnbktleU5hbWUsIHJlY29yZElkcyk7XG4gICAgICAgIGNvbnN0IGJhY2t3YXJkUmVjb3JkcyA9IGF3YWl0IHF1ZXJ5O1xuXG4gICAgICAgIGlmIChiYWNrd2FyZFJlY29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDqsrDqs7zsl5Ag7LaU6rCAXG4gICAgICAgIHJlbGF0ZWRNYXAuc2V0KG90aGVyRW50aXR5TmFtZSwgYmFja3dhcmRSZWNvcmRzKTtcbiAgICAgICAgdmlzaXRlZC5hZGQob3RoZXJFbnRpdHlOYW1lKTtcblxuICAgICAgICAvLyDsnqzqt4A6IOyXreywuOyhsCDrjbDsnbTthLDsnZgg6rSA66CoIOuNsOydtO2EsOuPhCDsiJjsp5FcbiAgICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0UmVsYXRlZERhdGEoXG4gICAgICAgICAgb3RoZXJFbnRpdHlOYW1lLFxuICAgICAgICAgIGJhY2t3YXJkUmVjb3JkcyxcbiAgICAgICAgICByZWxhdGVkTWFwLFxuICAgICAgICAgIHZpc2l0ZWQsXG4gICAgICAgICAgcmVtYWluaW5nRGVwdGggLSAxLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7WUFLbUc7WUFDdkQ7Q0FzQy9CLGVBQWIsTUFBMEI7RUFJZDtFQUNBO0VBSlY7RUFFQSxZQUNFLElBQ0EsZUFDQSxjQUNBO0dBSFEsS0FBQSxLQUFBO0dBQ0EsS0FBQSxnQkFBQTtHQUdSLEtBQUssUUFBUTtFQUNmO0VBRUEsTUFBTSxRQUNKLFlBQ0EsU0FDb0M7R0FDcEMsTUFBTSxTQUFTLEtBQUssY0FBYyxJQUFJLFVBQVU7R0FDaEQsSUFBSSxDQUFDLFFBQ0gsTUFBTSxJQUFJLE1BQU0scUJBQXFCLFlBQVk7R0FJbkQsSUFBSSxRQUFRLFlBQVksS0FBSyxPQUFPO0lBQ2xDLE1BQU0sV0FBVyxLQUFLLGlCQUFpQixZQUFZLE9BQU87SUFDMUQsT0FBTyxLQUFLLE1BQU0sU0FBUztLQUN6QixLQUFLO0tBQ0wsS0FBSyxRQUFRLFlBQVk7S0FDekIsZUFBZSxLQUFLLGdCQUFnQixRQUFRLE9BQU87SUFDckQsQ0FBQztHQUNIO0dBRUEsT0FBTyxLQUFLLGdCQUFnQixRQUFRLE9BQU87RUFDN0M7RUFFQSxNQUFjLGdCQUNaLFFBQ0EsU0FDb0M7R0FDcEMsTUFBTSxRQUFRLEtBQUssR0FBRyxPQUFPLEtBQUs7R0FFbEMsUUFBUSxRQUFRLFVBQWhCO0lBQ0UsS0FBSyxVQUNILE9BQU8sTUFBTSxLQUFLLFdBQVcsT0FBTyxRQUFRLFNBQVMsRUFBRTtJQUV6RCxLQUFLLFVBQVU7S0FDYixNQUFNLGVBQWUsS0FBSyxvQkFBb0IsUUFBUSxZQUFZO0tBQ2xFLElBQUksY0FDRixNQUFNLFFBQVEsY0FBYyxNQUFNO0tBRXBDLE9BQU8sTUFBTSxNQUFNLE1BQU0sUUFBUSxTQUFTLEVBQUU7SUFDOUM7SUFFQSxLQUFL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