sonamu 0.9.20 → 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.
- package/dist/_virtual/_rolldown/runtime.js +36 -0
- package/dist/ai/agents/agent.js +5 -7
- package/dist/ai/agents/index.js +1 -2
- package/dist/ai/agents/types.js +1 -1
- package/dist/ai/index.js +1 -2
- package/dist/ai/providers/rtzr/api.js +2 -3
- package/dist/ai/providers/rtzr/error.js +14 -29
- package/dist/ai/providers/rtzr/index.js +1 -2
- package/dist/ai/providers/rtzr/model.js +13 -20
- package/dist/ai/providers/rtzr/options.js +2 -3
- package/dist/ai/providers/rtzr/provider.js +2 -3
- package/dist/ai/providers/rtzr/utils.js +12 -21
- package/dist/api/base-frame.js +4 -4
- package/dist/api/caster.js +21 -38
- package/dist/api/code-converters.js +41 -98
- package/dist/api/config.d.ts +1 -10
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +9 -8
- package/dist/api/context.js +2 -3
- package/dist/api/decorators.js +80 -116
- package/dist/api/index.js +2 -3
- package/dist/api/secret.js +6 -10
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +200 -387
- package/dist/api/validator.js +5 -8
- package/dist/api/websocket-helpers.js +21 -32
- package/dist/auth/audit-log/builders.js +2 -3
- package/dist/auth/audit-log/events.js +2 -2
- package/dist/auth/audit-log/plugin.js +30 -61
- package/dist/auth/audit-log-ingestor.js +19 -41
- package/dist/auth/auth-generator.js +16 -41
- package/dist/auth/better-auth-entities.js +3 -4
- package/dist/auth/index.js +2 -3
- package/dist/auth/knex-adapter.js +18 -45
- package/dist/auth/plugins/entity-definitions/admin.js +2 -2
- package/dist/auth/plugins/entity-definitions/anonymous.js +2 -2
- package/dist/auth/plugins/entity-definitions/api-key.js +2 -2
- package/dist/auth/plugins/entity-definitions/audit-log.js +2 -2
- package/dist/auth/plugins/entity-definitions/index.js +2 -3
- package/dist/auth/plugins/entity-definitions/jwt.js +2 -2
- package/dist/auth/plugins/entity-definitions/organization.js +2 -2
- package/dist/auth/plugins/entity-definitions/passkey.js +2 -2
- package/dist/auth/plugins/entity-definitions/phone-number.js +2 -2
- package/dist/auth/plugins/entity-definitions/sso.js +2 -2
- package/dist/auth/plugins/entity-definitions/two-factor.js +2 -2
- package/dist/auth/plugins/entity-definitions/types.js +1 -1
- package/dist/auth/plugins/entity-definitions/username.js +2 -2
- package/dist/auth/plugins/index.js +1 -2
- package/dist/auth/plugins/wrappers/admin.js +2 -3
- package/dist/auth/plugins/wrappers/anonymous.js +2 -3
- package/dist/auth/plugins/wrappers/api-key.js +2 -3
- package/dist/auth/plugins/wrappers/index.js +1 -2
- package/dist/auth/plugins/wrappers/jwt.js +2 -3
- package/dist/auth/plugins/wrappers/organization.js +2 -3
- package/dist/auth/plugins/wrappers/passkey.js +2 -3
- package/dist/auth/plugins/wrappers/phone-number.js +2 -3
- package/dist/auth/plugins/wrappers/sso.js +2 -3
- package/dist/auth/plugins/wrappers/two-factor.js +2 -3
- package/dist/auth/plugins/wrappers/username.js +2 -3
- package/dist/bin/build-config.js +2 -2
- package/dist/bin/cli.js +151 -258
- package/dist/bin/fixture.d.ts.map +1 -1
- package/dist/bin/fixture.js +55 -97
- package/dist/bin/hmr-hook-register.js +3 -3
- package/dist/bin/migrate-targets.d.ts +3 -0
- package/dist/bin/migrate-targets.d.ts.map +1 -0
- package/dist/bin/migrate-targets.js +11 -0
- package/dist/bin/test-command.js +25 -55
- package/dist/bin/ts-loader-register.js +5 -6
- package/dist/bin/ts-loader-registration.js +6 -13
- package/dist/cache/cache-manager.js +3 -4
- package/dist/cache/decorator.js +11 -21
- package/dist/cache/drivers.js +2 -3
- package/dist/cache/index.js +2 -3
- package/dist/cache/types.js +1 -1
- package/dist/cache-control/cache-control.js +21 -34
- package/dist/cache-control/types.js +1 -1
- package/dist/compress/compress.js +10 -10
- package/dist/compress/index.js +1 -2
- package/dist/compress/types.js +1 -1
- package/dist/cone/cone-generator.js +25 -63
- package/dist/database/_batch_update.js +26 -46
- package/dist/database/base-model.js +44 -97
- package/dist/database/base-model.types.js +1 -1
- package/dist/database/db.d.ts +8 -14
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +127 -72
- package/dist/database/knex.js +5 -8
- package/dist/database/puri-subset.types.js +1 -1
- package/dist/database/puri-wrapper.js +11 -15
- package/dist/database/puri.js +117 -234
- package/dist/database/puri.types.js +3 -4
- package/dist/database/transaction-context.js +4 -5
- package/dist/database/upsert-builder.js +109 -176
- package/dist/dict/en.d.ts +1 -0
- package/dist/dict/en.d.ts.map +1 -1
- package/dist/dict/en.js +4 -4
- package/dist/dict/index.js +2 -3
- package/dist/dict/ko.d.ts +1 -0
- package/dist/dict/ko.d.ts.map +1 -1
- package/dist/dict/ko.js +4 -4
- package/dist/dict/rc-keys.js +3 -4
- package/dist/dict/sd.js +8 -19
- package/dist/dict/sonamu-dictionary.js +141 -284
- package/dist/dict/types.js +1 -1
- package/dist/dict/utils.js +4 -5
- package/dist/entity/entity-manager.d.ts +2 -2
- package/dist/entity/entity-manager.js +34 -82
- package/dist/entity/entity-template-cone.js +33 -66
- package/dist/entity/entity.js +156 -310
- package/dist/env.d.ts +14 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +75 -0
- package/dist/exceptions/error-handler.js +2 -3
- package/dist/exceptions/so-exceptions.js +7 -5
- package/dist/filter/index.js +1 -2
- package/dist/filter/types.js +3 -4
- package/dist/filter/utils.js +21 -54
- package/dist/index.js +8 -7
- package/dist/logger/category.js +6 -12
- package/dist/logger/configure.js +23 -34
- package/dist/migration/code-generation.js +146 -314
- package/dist/migration/index-where-predicate.js +52 -144
- package/dist/migration/migration-set.js +19 -33
- package/dist/migration/migrator.d.ts +2 -0
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +69 -53
- package/dist/migration/postgresql-schema-reader.js +126 -225
- package/dist/migration/slack-confirm.d.ts +1 -0
- package/dist/migration/slack-confirm.d.ts.map +1 -1
- package/dist/migration/slack-confirm.js +28 -38
- package/dist/migration/types.js +1 -1
- package/dist/naite/messaging-types.js +1 -1
- package/dist/naite/naite-reporter.js +15 -32
- package/dist/naite/naite.js +43 -76
- package/dist/ssr/index.js +6 -9
- package/dist/ssr/registry.js +10 -18
- package/dist/ssr/renderer.js +10 -21
- package/dist/ssr/types.js +1 -1
- package/dist/storage/base-file.js +5 -10
- package/dist/storage/buffered-file.js +3 -4
- package/dist/storage/drivers.js +2 -3
- package/dist/storage/index.js +2 -3
- package/dist/storage/s3-driver.js +5 -9
- package/dist/storage/storage-manager.js +5 -5
- package/dist/storage/types.js +1 -1
- package/dist/storage/uploaded-file.js +4 -6
- package/dist/stream/index.js +1 -2
- package/dist/stream/sse.js +8 -13
- package/dist/stream/ws-audience-resolver.js +5 -5
- package/dist/stream/ws-audience.js +3 -4
- package/dist/stream/ws-cluster-bus.js +3 -4
- package/dist/stream/ws-core.js +1 -1
- package/dist/stream/ws-delivery.js +11 -25
- package/dist/stream/ws-local-connection-store.js +9 -18
- package/dist/stream/ws-presence-store.js +43 -97
- package/dist/stream/ws-registry.js +17 -22
- package/dist/stream/ws-telemetry-memory.js +38 -45
- package/dist/stream/ws-telemetry-trace.js +4 -6
- package/dist/stream/ws-telemetry.js +82 -135
- package/dist/stream/ws.js +47 -91
- package/dist/syncer/api-parser.js +81 -147
- package/dist/syncer/checksum.js +9 -20
- package/dist/syncer/code-generator.js +29 -47
- package/dist/syncer/entity-operations.js +17 -27
- package/dist/syncer/event-batcher.js +8 -15
- package/dist/syncer/file-patterns.js +3 -4
- package/dist/syncer/file-tracking.js +6 -10
- package/dist/syncer/index.js +1 -2
- package/dist/syncer/module-loader.js +10 -26
- package/dist/syncer/syncer-actions.js +19 -37
- package/dist/syncer/syncer.js +46 -98
- package/dist/syncer/watcher.js +12 -26
- package/dist/tasks/decorator.js +7 -11
- package/dist/tasks/step-wrapper.js +7 -8
- package/dist/tasks/workflow-manager.js +18 -25
- package/dist/template/entity-converter.js +40 -64
- package/dist/template/helpers.js +32 -63
- package/dist/template/implementations/entity.template.js +7 -11
- package/dist/template/implementations/entry-server.template.js +2 -3
- package/dist/template/implementations/generated.template.js +25 -51
- package/dist/template/implementations/generated_http.template.js +31 -58
- package/dist/template/implementations/generated_sso.template.js +45 -85
- package/dist/template/implementations/init_types.template.js +4 -7
- package/dist/template/implementations/model.template.js +5 -10
- package/dist/template/implementations/model_test.template.js +2 -3
- package/dist/template/implementations/queries.template.js +4 -7
- package/dist/template/implementations/sd.template.js +17 -35
- package/dist/template/implementations/services.template.js +18 -30
- package/dist/template/implementations/view_form.template.js +72 -125
- package/dist/template/implementations/view_id_all_select.template.js +2 -3
- package/dist/template/implementations/view_list.template.js +86 -143
- package/dist/template/implementations/view_search_input.template.js +2 -3
- package/dist/template/index.js +5 -8
- package/dist/template/template-manager.js +13 -26
- package/dist/template/template-types.js +2 -3
- package/dist/template/template.js +7 -11
- package/dist/template/zod-converter.js +173 -348
- package/dist/testing/_relation-graph.js +18 -37
- package/dist/testing/bootstrap.js +5 -8
- package/dist/testing/data-explorer.js +34 -78
- package/dist/testing/dev-test-routes.js +54 -60
- package/dist/testing/dev-vitest-manager.js +33 -84
- package/dist/testing/faker-mappings.js +3 -4
- package/dist/testing/fixture-generator.d.ts +2 -1
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +159 -321
- package/dist/testing/fixture-loader.js +2 -2
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +124 -227
- package/dist/testing/global-setup.d.ts.map +1 -1
- package/dist/testing/global-setup.js +29 -17
- package/dist/testing/index.js +1 -2
- package/dist/testing/naite-vitest-reporter.js +2 -3
- package/dist/testing/parallel-db-manager.js +5 -3
- package/dist/testing/vitest-helpers.d.ts.map +1 -1
- package/dist/testing/vitest-helpers.js +15 -12
- package/dist/types/types.d.ts +14 -14
- package/dist/types/types.js +27 -50
- package/dist/ui/ai-api.js +6 -11
- package/dist/ui/ai-client.js +86 -134
- package/dist/ui/api.js +99 -195
- package/dist/ui/cdd-service.js +78 -130
- package/dist/ui/cdd-types.js +1 -1
- package/dist/ui-web/assets/{index-Df8q-fhb.js → index-DFStGyd0.js} +49 -49
- package/dist/ui-web/assets/index-Dx4ap5i4.css +1 -0
- package/dist/ui-web/index.html +2 -2
- package/dist/utils/async-utils.js +13 -25
- package/dist/utils/class-name.js +3 -4
- package/dist/utils/console-util.js +11 -26
- package/dist/utils/controller.d.ts.map +1 -1
- package/dist/utils/controller.js +14 -12
- package/dist/utils/esm-utils.js +5 -8
- package/dist/utils/formatter.js +10 -22
- package/dist/utils/fs-utils.js +14 -25
- package/dist/utils/lodash-able.js +3 -4
- package/dist/utils/model.js +7 -14
- package/dist/utils/object-utils.js +41 -73
- package/dist/utils/path-utils.js +5 -9
- package/dist/utils/process-utils.js +4 -7
- package/dist/utils/sql-parser.js +6 -13
- package/dist/utils/type-utils.js +16 -26
- package/dist/utils/utils.js +18 -40
- package/dist/utils/zod-error.js +9 -16
- package/dist/vector/chunking.js +24 -37
- package/dist/vector/config.js +2 -2
- package/dist/vector/embedding.js +8 -19
- package/dist/vector/index.js +1 -2
- package/dist/vector/types.js +1 -1
- package/package.json +6 -6
- package/src/__tests__/env.test.ts +127 -0
- package/src/api/__tests__/config.test.ts +10 -1
- package/src/api/config.ts +4 -12
- package/src/api/sonamu.ts +14 -4
- package/src/bin/__tests__/migrate-targets.test.ts +28 -0
- package/src/bin/__tests__/test-command.test.ts +82 -1
- package/src/bin/cli.ts +9 -18
- package/src/bin/fixture.ts +5 -4
- package/src/bin/migrate-targets.ts +7 -0
- package/src/bin/test-command.ts +2 -2
- package/src/database/__tests__/db.test.ts +175 -0
- package/src/database/db.ts +193 -71
- package/src/dict/en.ts +2 -0
- package/src/dict/ko.ts +2 -0
- package/src/env.ts +123 -0
- package/src/migration/__tests__/migrator.test.ts +149 -0
- package/src/migration/migrator.ts +74 -17
- package/src/migration/slack-confirm.ts +21 -0
- package/src/skills/sonamu/database.md +1 -1
- package/src/skills/sonamu/testing-devrunner.md +1 -1
- package/src/stream/ws-telemetry-memory.ts +2 -2
- package/src/testing/fixture-generator.ts +2 -1
- package/src/testing/fixture-manager.ts +3 -4
- package/src/testing/global-setup.ts +42 -18
- package/src/testing/vitest-helpers.ts +14 -0
- package/src/utils/controller.ts +14 -7
- package/tsdown.api.config.ts +6 -0
- package/dist/_virtual/rolldown_runtime.js +0 -39
- package/dist/ui-web/assets/index-D4rYm-Xz.css +0 -1
|
@@ -1,36 +1,29 @@
|
|
|
1
|
-
import { __esmMin } from "../_virtual/
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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 ===
|
|
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 ===
|
|
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 ===
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
} :
|
|
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/
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
128
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
232
|
-
|
|
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+XG4gICAgICAgICAgaXNSZWxhdGlvblByb3AocHJvcCkgJiZcbiAgICAgICAgICBwcm9wLndpdGggPT09IGVudGl0eU5hbWUgJiZcbiAgICAgICAgICAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHxcbiAgICAgICAgICAgIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbikpLFxuICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGJhY2t3YXJkUmVsYXRpb25zKSB7XG4gICAgICAgIGlmICghaXNSZWxhdGlvblByb3AocHJvcCkpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIG90aGVyRW50aXR56rCAIO2YhOyerCBlbnRpdHnrpbwg7LC47KGw7ZWY64qUIEZLIOy7rOufvFxuICAgICAgICBjb25zdCBmb3JlaWduS2V5TmFtZSA9IGAke3Byb3AubmFtZX1faWRgO1xuXG4gICAgICAgIC8vIO2YhOyerCDroIjsvZTrk5zrk6TsnYQg7LC47KGw7ZWY64qUIG90aGVyRW50aXR5IOugiOy9lOuTnCDsobDtmoxcbiAgICAgICAgY29uc3QgcXVlcnkgPSB0aGlzLmRiKG90aGVyRW50aXR5LnRhYmxlKS53aGVyZUluKGZvcmVpZ25LZXlOYW1lLCByZWNvcmRJZHMpO1xuICAgICAgICBjb25zdCBiYWNrd2FyZFJlY29yZHMgPSBhd2FpdCBxdWVyeTtcblxuICAgICAgICBpZiAoYmFja3dhcmRSZWNvcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g6rKw6rO87JeQIOy2lOqwgFxuICAgICAgICByZWxhdGVkTWFwLnNldChvdGhlckVudGl0eU5hbWUsIGJhY2t3YXJkUmVjb3Jkcyk7XG4gICAgICAgIHZpc2l0ZWQuYWRkKG90aGVyRW50aXR5TmFtZSk7XG5cbiAgICAgICAgLy8g7J6s6reAOiDsl63ssLjsobAg642w7J207YSw7J2YIOq0gOugqCDrjbDsnbTthLDrj4Qg7IiY7KeRXG4gICAgICAgIGF3YWl0IHRoaXMuY29sbGVjdFJlbGF0ZWREYXRhKFxuICAgICAgICAgIG90aGVyRW50aXR5TmFtZSxcbiAgICAgICAgICBiYWNrd2FyZFJlY29yZHMsXG4gICAgICAgICAgcmVsYXRlZE1hcCxcbiAgICAgICAgICB2aXNpdGVkLFxuICAgICAgICAgIHJlbWFpbmluZ0RlcHRoIC0gMSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OzthQUtvRzthQUN2RDtDQXNDaEMsZUFBYixNQUEwQjtFQUN4QixBQUFRO0VBRVIsWUFDRSxBQUFRQSxJQUNSLEFBQVFDLGVBQ1IsY0FDQTtHQUhRO0dBQ0E7QUFHUixRQUFLLFFBQVE7O0VBR2YsTUFBTSxRQUNKLFlBQ0EsU0FDb0M7R0FDcEMsTUFBTSxTQUFTLEtBQUssY0FBYyxJQUFJLFdBQVc7QUFDakQsT0FBSSxDQUFDLFFBQVE7QUFDWCxVQUFNLElBQUksTUFBTSxxQkFBcUIsYUFBYTs7QUFJcEQsT0FBSSxRQUFRLFlBQVksS0FBSyxPQUFPO0lBQ2xDLE1BQU0sV0FBVyxLQUFLLGlCQUFpQixZQUFZLFFBQVE7QUFDM0QsV0FBTyxLQUFLLE1BQU0sU0FBUztLQUN6QixLQUFLO0tBQ0wsS0FBSyxRQUFRLFlBQVk7S0FDekIsZUFBZSxLQUFLLGdCQUFnQixRQUFRLFFBQVE7S0FDckQsQ0FBQzs7QUFHSixVQUFPLEtBQUssZ0JBQWdCLFFBQVEsUUFBUTs7RUFHOUMsTUFBYyxnQkFDWixRQUNBLFNBQ29DO0dBQ3BDLE1BQU0sUUFBUSxLQUFLLEdBQUcsT0FBTyxNQUFNO0FBRW5DLFdBQVEsUUFBUSxVQUFoQjtJQUNFLEtBQUssU0FDSCxRQUFPLE1BQU0sS0FBSyxXQUFXLE9BQU8sUUFBUSxTQUFTLEdBQUc7SUFFMUQsS0FBSyxVQUFVO0tBQ2IsTUFBTSxlQUFlLEtBQUssb0JBQW9CLFFBQVEsYUFBYTtBQUNuRSxTQUFJLGNBQWM7QUFDaEIsWUFB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
|
|
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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
|