sonamu 0.9.19 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +7 -7
- 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/entity-basic.md +31 -0
- package/src/skills/sonamu/puri.md +22 -0
- package/src/skills/sonamu/testing-devrunner.md +1 -1
- package/src/skills/sonamu/upsert.md +53 -6
- 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,10 +1,9 @@
|
|
|
1
|
-
import { __esmMin } from "../_virtual/
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { createSSEFactory, init_sse } from "../stream/sse.js";
|
|
3
3
|
import { Sonamu, init_sonamu } from "../api/sonamu.js";
|
|
4
4
|
import { DevVitestManager, init_dev_vitest_manager } from "./dev-vitest-manager.js";
|
|
5
5
|
import { z as z$1 } from "zod";
|
|
6
6
|
import { randomUUID } from "crypto";
|
|
7
|
-
|
|
8
7
|
//#region src/testing/dev-test-routes.ts
|
|
9
8
|
function toPathPrefix(basePath) {
|
|
10
9
|
return basePath.endsWith("/") ? basePath : `${basePath}/`;
|
|
@@ -43,47 +42,45 @@ async function registerDevTestRoutes(server, config) {
|
|
|
43
42
|
await manager.start(config.vitestConfigPath);
|
|
44
43
|
Sonamu.devVitestManager = manager;
|
|
45
44
|
const sseAvailable = !!Sonamu.config.server.plugins?.sse;
|
|
46
|
-
if (sseAvailable) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
45
|
+
if (sseAvailable) server.get(`${prefix}/events`, (request, reply) => {
|
|
46
|
+
const sse = createSSEFactory(request.socket, reply, TestEventSchema);
|
|
47
|
+
const status = manager.getStatus();
|
|
48
|
+
sse.publish("snapshot", {
|
|
49
|
+
schemaVersion: SCHEMA_VERSION,
|
|
50
|
+
serverTime: (/* @__PURE__ */ new Date()).toISOString(),
|
|
51
|
+
status
|
|
52
|
+
});
|
|
53
|
+
const heartbeatTimer = setInterval(() => {
|
|
54
|
+
sse.publish("heartbeat", {
|
|
51
55
|
schemaVersion: SCHEMA_VERSION,
|
|
52
|
-
|
|
53
|
-
status
|
|
56
|
+
at: (/* @__PURE__ */ new Date()).toISOString()
|
|
54
57
|
});
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
manager.removeEventListener(listener);
|
|
82
|
-
};
|
|
83
|
-
request.socket.on("close", cleanup);
|
|
84
|
-
request.socket.on("error", cleanup);
|
|
85
|
-
});
|
|
86
|
-
}
|
|
58
|
+
}, HEARTBEAT_INTERVAL_MS);
|
|
59
|
+
const basePath = Sonamu.apiRootPath;
|
|
60
|
+
const listener = (event, data) => {
|
|
61
|
+
const key = event;
|
|
62
|
+
if (key === "runNodeProgress") {
|
|
63
|
+
if (!isRunNodeProgressData(data)) return;
|
|
64
|
+
const relativized = {
|
|
65
|
+
...data,
|
|
66
|
+
node: relativizeNode(data.node, basePath)
|
|
67
|
+
};
|
|
68
|
+
sse.publish(key, relativized);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
sse.publish(key, data);
|
|
72
|
+
};
|
|
73
|
+
manager.addEventListener(listener);
|
|
74
|
+
let cleaned = false;
|
|
75
|
+
const cleanup = () => {
|
|
76
|
+
if (cleaned) return;
|
|
77
|
+
cleaned = true;
|
|
78
|
+
clearInterval(heartbeatTimer);
|
|
79
|
+
manager.removeEventListener(listener);
|
|
80
|
+
};
|
|
81
|
+
request.socket.on("close", cleanup);
|
|
82
|
+
request.socket.on("error", cleanup);
|
|
83
|
+
});
|
|
87
84
|
server.post(`${prefix}/run`, async (request, reply) => {
|
|
88
85
|
if (!Sonamu.devVitestManager) {
|
|
89
86
|
reply.status(503);
|
|
@@ -101,19 +98,18 @@ async function registerDevTestRoutes(server, config) {
|
|
|
101
98
|
manager.emitEvent("runQueued", {
|
|
102
99
|
schemaVersion: SCHEMA_VERSION,
|
|
103
100
|
runId,
|
|
104
|
-
queuedAt: new Date().toISOString(),
|
|
101
|
+
queuedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
105
102
|
request: runRequest
|
|
106
103
|
});
|
|
107
104
|
try {
|
|
108
|
-
const startedAt = new Date().toISOString();
|
|
105
|
+
const startedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
109
106
|
manager.emitEvent("runStarted", {
|
|
110
107
|
schemaVersion: SCHEMA_VERSION,
|
|
111
108
|
runId,
|
|
112
109
|
startedAt
|
|
113
110
|
});
|
|
114
|
-
const
|
|
115
|
-
const
|
|
116
|
-
const finishedAt = new Date().toISOString();
|
|
111
|
+
const result = relativizeResult(await Sonamu.devVitestManager.run(runRequest, runId), Sonamu.apiRootPath);
|
|
112
|
+
const finishedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
117
113
|
manager.emitEvent("runCompleted", {
|
|
118
114
|
schemaVersion: SCHEMA_VERSION,
|
|
119
115
|
runId,
|
|
@@ -123,14 +119,14 @@ async function registerDevTestRoutes(server, config) {
|
|
|
123
119
|
});
|
|
124
120
|
return result;
|
|
125
121
|
} catch (err) {
|
|
126
|
-
const finishedAt = new Date().toISOString();
|
|
122
|
+
const finishedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
127
123
|
manager.emitEvent("runErrored", {
|
|
128
124
|
schemaVersion: SCHEMA_VERSION,
|
|
129
125
|
runId,
|
|
130
126
|
finishedAt,
|
|
131
127
|
error: {
|
|
132
128
|
message: err instanceof Error ? err.message : String(err),
|
|
133
|
-
stack: err instanceof Error ? err.stack :
|
|
129
|
+
stack: err instanceof Error ? err.stack : void 0
|
|
134
130
|
}
|
|
135
131
|
});
|
|
136
132
|
reply.status(500);
|
|
@@ -141,13 +137,12 @@ async function registerDevTestRoutes(server, config) {
|
|
|
141
137
|
}
|
|
142
138
|
});
|
|
143
139
|
server.get(`${prefix}/status`, async () => {
|
|
144
|
-
const status = Sonamu.devVitestManager?.getStatus() ?? {
|
|
145
|
-
ready: false,
|
|
146
|
-
running: false,
|
|
147
|
-
lastRunAt: null
|
|
148
|
-
};
|
|
149
140
|
return {
|
|
150
|
-
...
|
|
141
|
+
...Sonamu.devVitestManager?.getStatus() ?? {
|
|
142
|
+
ready: false,
|
|
143
|
+
running: false,
|
|
144
|
+
lastRunAt: null
|
|
145
|
+
},
|
|
151
146
|
sseAvailable
|
|
152
147
|
};
|
|
153
148
|
});
|
|
@@ -157,7 +152,8 @@ async function registerDevTestRoutes(server, config) {
|
|
|
157
152
|
});
|
|
158
153
|
}
|
|
159
154
|
var SCHEMA_VERSION, HEARTBEAT_INTERVAL_MS, SerializedTraceSchema, TestCaseResultSchema, TestEventSchema;
|
|
160
|
-
|
|
155
|
+
//#endregion
|
|
156
|
+
__esmMin((() => {
|
|
161
157
|
init_sonamu();
|
|
162
158
|
init_sse();
|
|
163
159
|
init_dev_vitest_manager();
|
|
@@ -263,9 +259,7 @@ var init_dev_test_routes = __esmMin((() => {
|
|
|
263
259
|
at: z$1.string()
|
|
264
260
|
})
|
|
265
261
|
});
|
|
266
|
-
}));
|
|
267
|
-
|
|
268
|
-
//#endregion
|
|
269
|
-
init_dev_test_routes();
|
|
262
|
+
}))();
|
|
270
263
|
export { registerDevTestRoutes };
|
|
271
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2LXRlc3Qtcm91dGVzLmpzIiwibmFtZXMiOlsic3NlOiBTU0VDb25uZWN0aW9uPHR5cGVvZiBUZXN0RXZlbnRTY2hlbWE+Iiwic3RhdHVzOiBNYW5hZ2VyU3RhdHVzIiwicmF3UmVzdWx0OiBSdW5SZXN1bHQiLCJ6IiwiVGVzdENhc2VSZXN1bHRTY2hlbWE6IHouWm9kVHlwZTxUZXN0Q2FzZVJlc3VsdD4iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9kZXYtdGVzdC1yb3V0ZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gXCJjcnlwdG9cIjtcblxuaW1wb3J0IHsgdHlwZSBGYXN0aWZ5SW5zdGFuY2UgfSBmcm9tIFwiZmFzdGlmeVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgdHlwZSBTb25hbXVEZXZSdW5uZXJDb25maWcgfSBmcm9tIFwiLi4vYXBpL2NvbmZpZ1wiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IHR5cGUgU2VyaWFsaXplZFRyYWNlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyBjcmVhdGVTU0VGYWN0b3J5IH0gZnJvbSBcIi4uL3N0cmVhbS9zc2VcIjtcbmltcG9ydCB7IHR5cGUgU1NFQ29ubmVjdGlvbiB9IGZyb20gXCIuLi9zdHJlYW0vc3NlXCI7XG5pbXBvcnQgeyB0eXBlIE1hbmFnZXJTdGF0dXMsIHR5cGUgUnVuUmVzdWx0LCB0eXBlIFRlc3RDYXNlUmVzdWx0IH0gZnJvbSBcIi4vZGV2LXZpdGVzdC1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBEZXZWaXRlc3RNYW5hZ2VyIH0gZnJvbSBcIi4vZGV2LXZpdGVzdC1tYW5hZ2VyXCI7XG5cbmNvbnN0IFNDSEVNQV9WRVJTSU9OID0gMTtcbmNvbnN0IEhFQVJUQkVBVF9JTlRFUlZBTF9NUyA9IDMwXzAwMDtcblxuY29uc3QgU2VyaWFsaXplZFRyYWNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBrZXk6IHouc3RyaW5nKCksXG4gIHZhbHVlOiB6LnVua25vd24oKSxcbiAgZmlsZVBhdGg6IHouc3RyaW5nKCksXG4gIGxpbmVOdW1iZXI6IHoubnVtYmVyKCksXG4gIGF0OiB6LnN0cmluZygpLFxufSk7XG5cbmNvbnN0IFRlc3RDYXNlUmVzdWx0U2NoZW1hOiB6LlpvZFR5cGU8VGVzdENhc2VSZXN1bHQ+ID0gei5sYXp5KCgpID0+XG4gIHoub2JqZWN0KHtcbiAgICBpZDogei5zdHJpbmcoKSxcbiAgICBraW5kOiB6LmVudW0oW1wiZmlsZVwiLCBcInN1aXRlXCIsIFwidGVzdFwiXSksXG4gICAgbmFtZTogei5zdHJpbmcoKSxcbiAgICBmdWxsTmFtZTogei5zdHJpbmcoKSxcbiAgICBmaWxlOiB6LnN0cmluZygpLFxuICAgIHN0YXRlOiB6LmVudW0oW1wicGFzc2VkXCIsIFwiZmFpbGVkXCIsIFwic2tpcHBlZFwiLCBcInRvZG9cIiwgXCJydW5uaW5nXCIsIFwidW5rbm93blwiXSksXG4gICAgZHVyYXRpb25Nczogei5udW1iZXIoKS5udWxsYWJsZSgpLFxuICAgIGNvdW50czogei5vYmplY3Qoe1xuICAgICAgdG90YWw6IHoubnVtYmVyKCksXG4gICAgICBwYXNzZWQ6IHoubnVtYmVyKCksXG4gICAgICBmYWlsZWQ6IHoubnVtYmVyKCksXG4gICAgICBza2lwcGVkOiB6Lm51bWJlcigpLFxuICAgIH0pLFxuICAgIGVycm9yOiB6XG4gICAgICAub2JqZWN0KHtcbiAgICAgICAgbWVzc2FnZTogei5zdHJpbmcoKSxcbiAgICAgICAgc3RhY2s6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIH0pXG4gICAgICAubnVsbGFibGUoKSxcbiAgICB0cmFjZXM6IHouYXJyYXkoU2VyaWFsaXplZFRyYWNlU2NoZW1hKSxcbiAgICBjaGlsZHJlbjogei5hcnJheShUZXN0Q2FzZVJlc3VsdFNjaGVtYSksXG4gIH0pLFxuKTtcblxuY29uc3QgVGVzdEV2ZW50U2NoZW1hID0gei5vYmplY3Qoe1xuICBzbmFwc2hvdDogei5vYmplY3Qoe1xuICAgIHNjaGVtYVZlcnNpb246IHoubnVtYmVyKCksXG4gICAgc2VydmVyVGltZTogei5zdHJpbmcoKSxcbiAgICBzdGF0dXM6IHoub2JqZWN0KHtcbiAgICAgIHJlYWR5OiB6LmJvb2xlYW4oKSxcbiAgICAgIHJ1bm5pbmc6IHouYm9vbGVhbigpLFxuICAgICAgbGFzdFJ1bkF0OiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gICAgfSksXG4gIH0pLFxuICBydW5RdWV1ZWQ6IHoub2JqZWN0KHtcbiAgICBzY2hlbWFWZXJzaW9uOiB6Lm51bWJlcigpLFxuICAgIHJ1bklkOiB6LnN0cmluZygpLFxuICAgIHF1ZXVlZEF0OiB6LnN0cmluZygpLFxuICAgIHJlcXVlc3Q6IHoub2JqZWN0KHtcbiAgICAgIGZpbGVzOiB6LmFycmF5KHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICBwYXR0ZXJuOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgfSksXG4gIH0pLFxuICBydW5TdGFydGVkOiB6Lm9iamVjdCh7XG4gICAgc2NoZW1hVmVyc2lvbjogei5udW1iZXIoKSxcbiAgICBydW5JZDogei5zdHJpbmcoKSxcbiAgICBzdGFydGVkQXQ6IHouc3RyaW5nKCksXG4gIH0pLFxuICBydW5Db21wbGV0ZWQ6IHoub2JqZWN0KHtcbiAgICBzY2hlbWFWZXJzaW9uOiB6Lm51bWJlcigpLFxuICAgIHJ1bklkOiB6LnN0cmluZygpLFxuICAgIHN0YXJ0ZWRBdDogei5zdHJpbmcoKSxcbiAgICBmaW5pc2hlZEF0OiB6LnN0cmluZygpLFxuICAgIHJlc3VsdDogei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpLFxuICB9KSxcbiAgcnVuRXJyb3JlZDogei5vYmplY3Qoe1xuICAgIHNjaGVtYVZlcnNpb246IHoubnVtYmVyKCksXG4gICAgcnVuSWQ6IHouc3RyaW5nKCksXG4gICAgZmluaXNoZWRBdDogei5zdHJpbmcoKSxcbiAgICBlcnJvcjogei5vYmplY3Qoe1xuICAgICAgbWVzc2FnZTogei5zdHJpbmcoKSxcbiAgICAgIHN0YWNrOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgfSksXG4gIH0pLFxuICBydW5Ob2RlUHJvZ3Jlc3M6IHoub2JqZWN0KHtcbiAgICBzY2hlbWFWZXJzaW9uOiB6LmxpdGVyYWwoMSksXG4gICAgcnVuSWQ6IHouc3RyaW5nKCksXG4gICAgc3RhcnRlZEF0OiB6LnN0cmluZygpLFxuICAgIGF0OiB6LnN0cmluZygpLFxuICAgIGtpbmQ6IHouZW51bShbXCJmaWxlXCIsIFwic3VpdGVcIiwgXCJ0ZXN0XCJdKSxcbiAgICBwaGFzZTogei5lbnVtKFtcInJlYWR5XCIsIFwicmVzdWx0XCJdKSxcbiAgICBmaWxlSWQ6IHouc3RyaW5nKCksXG4gICAgbm9kZUlkOiB6LnN0cmluZygpLFxuICAgIHBhcmVudElkOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gICAgbm9kZTogVGVzdENhc2VSZXN1bHRTY2hlbWEsXG4gIH0pLFxuICBoZWFydGJlYXQ6IHoub2JqZWN0KHtcbiAgICBzY2hlbWFWZXJzaW9uOiB6Lm51bWJlcigpLFxuICAgIGF0OiB6LnN0cmluZygpLFxuICB9KSxcbn0pO1xuXG50eXBlIFRlc3RFdmVudHMgPSB6LmluZmVyPHR5cGVvZiBUZXN0RXZlbnRTY2hlbWE+O1xuXG5mdW5jdGlvbiB0b1BhdGhQcmVmaXgoYmFzZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBiYXNlUGF0aC5lbmRzV2l0aChcIi9cIikgPyBiYXNlUGF0aCA6IGAke2Jhc2VQYXRofS9gO1xufVxuXG5mdW5jdGlvbiByZWxhdGl2aXplVHJhY2UodHJhY2U6IFNlcmlhbGl6ZWRUcmFjZSwgcHJlZml4OiBzdHJpbmcpOiBTZXJpYWxpemVkVHJhY2Uge1xuICByZXR1cm4geyAuLi50cmFjZSwgZmlsZVBhdGg6IHRyYWNlLmZpbGVQYXRoLnJlcGxhY2UocHJlZml4LCBcIlwiKSB9O1xufVxuXG5mdW5jdGlvbiByZWxhdGl2aXplTm9kZShub2RlOiBUZXN0Q2FzZVJlc3VsdCwgYmFzZVBhdGg6IHN0cmluZyk6IFRlc3RDYXNlUmVzdWx0IHtcbiAgY29uc3QgcHJlZml4ID0gdG9QYXRoUHJlZml4KGJhc2VQYXRoKTtcbiAgcmV0dXJuIHtcbiAgICAuLi5ub2RlLFxuICAgIG5hbWU6IG5vZGUubmFtZS5yZXBsYWNlKHByZWZpeCwgXCJcIiksXG4gICAgZmlsZTogbm9kZS5maWxlLnJlcGxhY2UocHJlZml4LCBcIlwiKSxcbiAgICB0cmFjZXM6IG5vZGUudHJhY2VzLm1hcCgodCkgPT4gcmVsYXRpdml6ZVRyYWNlKHQsIHByZWZpeCkpLFxuICAgIGNoaWxkcmVuOiBub2RlLmNoaWxkcmVuLm1hcCgoYykgPT4gcmVsYXRpdml6ZU5vZGUoYywgcHJlZml4KSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzUnVuTm9kZVByb2dyZXNzRGF0YShkYXRhOiB1bmtub3duKTogZGF0YSBpcyBUZXN0RXZlbnRzW1wicnVuTm9kZVByb2dyZXNzXCJdIHtcbiAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZCA9IGRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiAoXG4gICAgZC5zY2hlbWFWZXJzaW9uID09PSAxICYmXG4gICAgdHlwZW9mIGQucnVuSWQgPT09IFwic3RyaW5nXCIgJiZcbiAgICB0eXBlb2YgZC5zdGFydGVkQXQgPT09IFwic3RyaW5nXCIgJiZcbiAgICB0eXBlb2YgZC5hdCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIChkLmtpbmQgPT09IFwiZmlsZVwiIHx8IGQua2luZCA9PT0gXCJzdWl0ZVwiIHx8IGQua2luZCA9PT0gXCJ0ZXN0XCIpICYmXG4gICAgKGQucGhhc2UgPT09IFwicmVhZHlcIiB8fCBkLnBoYXNlID09PSBcInJlc3VsdFwiKSAmJlxuICAgIHR5cGVvZiBkLmZpbGVJZCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIHR5cGVvZiBkLm5vZGVJZCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIChkLnBhcmVudElkID09PSBudWxsIHx8IHR5cGVvZiBkLnBhcmVudElkID09PSBcInN0cmluZ1wiKSAmJlxuICAgIHR5cGVvZiBkLm5vZGUgPT09IFwib2JqZWN0XCIgJiZcbiAgICBkLm5vZGUgIT09IG51bGxcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVsYXRpdml6ZVJlc3VsdChyZXN1bHQ6IFJ1blJlc3VsdCwgYmFzZVBhdGg6IHN0cmluZyk6IFJ1blJlc3VsdCB7XG4gIGNvbnN0IHByZWZpeCA9IHRvUGF0aFByZWZpeChiYXNlUGF0aCk7XG4gIHJldHVybiB7XG4gICAgLi4ucmVzdWx0LFxuICAgIHJlc3VsdHM6IHJlc3VsdC5yZXN1bHRzLm1hcCgobikgPT4gcmVsYXRpdml6ZU5vZGUobiwgcHJlZml4KSksXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWdpc3RlckRldlRlc3RSb3V0ZXMoXG4gIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLFxuICBjb25maWc6IFNvbmFtdURldlJ1bm5lckNvbmZpZyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcmVmaXggPSBjb25maWcucm91dGVQcmVmaXggPz8gXCIvX190ZXN0X19cIjtcblxuICBjb25zdCBtYW5hZ2VyID0gbmV3IERldlZpdGVzdE1hbmFnZXIoKTtcbiAgYXdhaXQgbWFuYWdlci5zdGFydChjb25maWcudml0ZXN0Q29uZmlnUGF0aCk7XG4gIFNvbmFtdS5kZXZWaXRlc3RNYW5hZ2VyID0gbWFuYWdlcjtcblxuICBjb25zdCBzc2VBdmFpbGFibGUgPSAhIVNvbmFtdS5jb25maWcuc2VydmVyLnBsdWdpbnM/LnNzZTtcblxuICBpZiAoc3NlQXZhaWxhYmxlKSB7XG4gICAgc2VydmVyLmdldChgJHtwcmVmaXh9L2V2ZW50c2AsIChyZXF1ZXN0LCByZXBseSk6IHZvaWQgPT4ge1xuICAgICAgY29uc3Qgc3NlOiBTU0VDb25uZWN0aW9uPHR5cGVvZiBUZXN0RXZlbnRTY2hlbWE+ID0gY3JlYXRlU1NFRmFjdG9yeShcbiAgICAgICAgcmVxdWVzdC5zb2NrZXQsXG4gICAgICAgIHJlcGx5LFxuICAgICAgICBUZXN0RXZlbnRTY2hlbWEsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBzdGF0dXM6IE1hbmFnZXJTdGF0dXMgPSBtYW5hZ2VyLmdldFN0YXR1cygpO1xuICAgICAgc3NlLnB1Ymxpc2goXCJzbmFwc2hvdFwiLCB7XG4gICAgICAgIHNjaGVtYVZlcnNpb246IFNDSEVNQV9WRVJTSU9OLFxuICAgICAgICBzZXJ2ZXJUaW1lOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHN0YXR1cyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBoZWFydGJlYXRUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgc3NlLnB1Ymxpc2goXCJoZWFydGJlYXRcIiwge1xuICAgICAgICAgIHNjaGVtYVZlcnNpb246IFNDSEVNQV9WRVJTSU9OLFxuICAgICAgICAgIGF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH0pO1xuICAgICAgfSwgSEVBUlRCRUFUX0lOVEVSVkFMX01TKTtcblxuICAgICAgY29uc3QgYmFzZVBhdGggPSBTb25hbXUuYXBpUm9vdFBhdGg7XG4gICAgICBjb25zdCBsaXN0ZW5lciA9IChldmVudDogc3RyaW5nLCBkYXRhOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IGV2ZW50IGFzIGtleW9mIFRlc3RFdmVudHM7XG4gICAgICAgIGlmIChrZXkgPT09IFwicnVuTm9kZVByb2dyZXNzXCIpIHtcbiAgICAgICAgICBpZiAoIWlzUnVuTm9kZVByb2dyZXNzRGF0YShkYXRhKSkgcmV0dXJuO1xuICAgICAgICAgIGNvbnN0IHJlbGF0aXZpemVkID0ge1xuICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgIG5vZGU6IHJlbGF0aXZpemVOb2RlKGRhdGEubm9kZSwgYmFzZVBhdGgpLFxuICAgICAgICAgIH07XG4gICAgICAgICAgc3NlLnB1Ymxpc2goa2V5LCByZWxhdGl2aXplZCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNzZS5wdWJsaXNoKGtleSwgZGF0YSBhcyBUZXN0RXZlbnRzW3R5cGVvZiBrZXldKTtcbiAgICAgIH07XG4gICAgICBtYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIobGlzdGVuZXIpO1xuXG4gICAgICBsZXQgY2xlYW5lZCA9IGZhbHNlO1xuICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgaWYgKGNsZWFuZWQpIHJldHVybjtcbiAgICAgICAgY2xlYW5lZCA9IHRydWU7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaGVhcnRiZWF0VGltZXIpO1xuICAgICAgICBtYW5hZ2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIobGlzdGVuZXIpO1xuICAgICAgfTtcbiAgICAgIHJlcXVlc3Quc29ja2V0Lm9uKFwiY2xvc2VcIiwgY2xlYW51cCk7XG4gICAgICByZXF1ZXN0LnNvY2tldC5vbihcImVycm9yXCIsIGNsZWFudXApO1xuICAgIH0pO1xuICB9XG5cbiAgc2VydmVyLnBvc3QoYCR7cHJlZml4fS9ydW5gLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICBpZiAoIVNvbmFtdS5kZXZWaXRlc3RNYW5hZ2VyKSB7XG4gICAgICByZXBseS5zdGF0dXMoNTAzKTtcbiAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgZXJyb3I6IFwiRGV2Vml0ZXN0TWFuYWdlciBpcyBub3QgaW5pdGlhbGl6ZWRcIiB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJ1bklkID0gcmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IGJvZHkgPSByZXF1ZXN0LmJvZHkgYXMgeyBmaWxlcz86IHN0cmluZ1tdOyBwYXR0ZXJuPzogc3RyaW5nIH0gfCBudWxsO1xuICAgIGNvbnN0IHJ1blJlcXVlc3QgPSB7XG4gICAgICBmaWxlczogYm9keT8uZmlsZXMsXG4gICAgICBwYXR0ZXJuOiBib2R5Py5wYXR0ZXJuLFxuICAgIH07XG5cbiAgICBtYW5hZ2VyLmVtaXRFdmVudChcInJ1blF1ZXVlZFwiLCB7XG4gICAgICBzY2hlbWFWZXJzaW9uOiBTQ0hFTUFfVkVSU0lPTixcbiAgICAgIHJ1bklkLFxuICAgICAgcXVldWVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHJlcXVlc3Q6IHJ1blJlcXVlc3QsXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgbWFuYWdlci5lbWl0RXZlbnQoXCJydW5TdGFydGVkXCIsIHtcbiAgICAgICAgc2NoZW1hVmVyc2lvbjogU0NIRU1BX1ZFUlNJT04sXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBzdGFydGVkQXQsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmF3UmVzdWx0OiBSdW5SZXN1bHQgPSBhd2FpdCBTb25hbXUuZGV2Vml0ZXN0TWFuYWdlci5ydW4ocnVuUmVxdWVzdCwgcnVuSWQpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVsYXRpdml6ZVJlc3VsdChyYXdSZXN1bHQsIFNvbmFtdS5hcGlSb290UGF0aCk7XG5cbiAgICAgIGNvbnN0IGZpbmlzaGVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICBtYW5hZ2VyLmVtaXRFdmVudChcInJ1bkNvbXBsZXRlZFwiLCB7XG4gICAgICAgIHNjaGVtYVZlcnNpb246IFNDSEVNQV9WRVJTSU9OLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgc3RhcnRlZEF0LFxuICAgICAgICBmaW5pc2hlZEF0LFxuICAgICAgICByZXN1bHQsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IGZpbmlzaGVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICBtYW5hZ2VyLmVtaXRFdmVudChcInJ1bkVycm9yZWRcIiwge1xuICAgICAgICBzY2hlbWFWZXJzaW9uOiBTQ0hFTUFfVkVSU0lPTixcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIGZpbmlzaGVkQXQsXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgbWVzc2FnZTogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgIHN0YWNrOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5zdGFjayA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICByZXBseS5zdGF0dXMoNTAwKTtcbiAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9O1xuICAgIH1cbiAgfSk7XG5cbiAgc2VydmVyLmdldChgJHtwcmVmaXh9L3N0YXR1c2AsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzdGF0dXM6IE1hbmFnZXJTdGF0dXMgPSBTb25hbXUuZGV2Vml0ZXN0TWFuYWdlcj8uZ2V0U3RhdHVzKCkgPz8ge1xuICAgICAgcmVhZHk6IGZhbHNlLFxuICAgICAgcnVubmluZzogZmFsc2UsXG4gICAgICBsYXN0UnVuQXQ6IG51bGwsXG4gICAgfTtcbiAgICByZXR1cm4geyAuLi5zdGF0dXMsIHNzZUF2YWlsYWJsZSB9O1xuICB9KTtcblxuICBzZXJ2ZXIuYWRkSG9vayhcIm9uQ2xvc2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IFNvbmFtdS5kZXZWaXRlc3RNYW5hZ2VyPy5zaHV0ZG93bigpO1xuICAgIFNvbmFtdS5kZXZWaXRlc3RNYW5hZ2VyID0gbnVsbDtcbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBOEdBLFNBQVMsYUFBYSxVQUEwQjtBQUM5QyxRQUFPLFNBQVMsU0FB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
|
|
264
|
+
|
|
265
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2LXRlc3Qtcm91dGVzLmpzIiwibmFtZXMiOlsieiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2Rldi10ZXN0LXJvdXRlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcImNyeXB0b1wiO1xuXG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlJbnN0YW5jZSB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyB0eXBlIFNvbmFtdURldlJ1bm5lckNvbmZpZyB9IGZyb20gXCIuLi9hcGkvY29uZmlnXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgdHlwZSBTZXJpYWxpemVkVHJhY2UgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB7IGNyZWF0ZVNTRUZhY3RvcnkgfSBmcm9tIFwiLi4vc3RyZWFtL3NzZVwiO1xuaW1wb3J0IHsgdHlwZSBTU0VDb25uZWN0aW9uIH0gZnJvbSBcIi4uL3N0cmVhbS9zc2VcIjtcbmltcG9ydCB7IHR5cGUgTWFuYWdlclN0YXR1cywgdHlwZSBSdW5SZXN1bHQsIHR5cGUgVGVzdENhc2VSZXN1bHQgfSBmcm9tIFwiLi9kZXYtdml0ZXN0LW1hbmFnZXJcIjtcbmltcG9ydCB7IERldlZpdGVzdE1hbmFnZXIgfSBmcm9tIFwiLi9kZXYtdml0ZXN0LW1hbmFnZXJcIjtcblxuY29uc3QgU0NIRU1BX1ZFUlNJT04gPSAxO1xuY29uc3QgSEVBUlRCRUFUX0lOVEVSVkFMX01TID0gMzBfMDAwO1xuXG5jb25zdCBTZXJpYWxpemVkVHJhY2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGtleTogei5zdHJpbmcoKSxcbiAgdmFsdWU6IHoudW5rbm93bigpLFxuICBmaWxlUGF0aDogei5zdHJpbmcoKSxcbiAgbGluZU51bWJlcjogei5udW1iZXIoKSxcbiAgYXQ6IHouc3RyaW5nKCksXG59KTtcblxuY29uc3QgVGVzdENhc2VSZXN1bHRTY2hlbWE6IHouWm9kVHlwZTxUZXN0Q2FzZVJlc3VsdD4gPSB6LmxhenkoKCkgPT5cbiAgei5vYmplY3Qoe1xuICAgIGlkOiB6LnN0cmluZygpLFxuICAgIGtpbmQ6IHouZW51bShbXCJmaWxlXCIsIFwic3VpdGVcIiwgXCJ0ZXN0XCJdKSxcbiAgICBuYW1lOiB6LnN0cmluZygpLFxuICAgIGZ1bGxOYW1lOiB6LnN0cmluZygpLFxuICAgIGZpbGU6IHouc3RyaW5nKCksXG4gICAgc3RhdGU6IHouZW51bShbXCJwYXNzZWRcIiwgXCJmYWlsZWRcIiwgXCJza2lwcGVkXCIsIFwidG9kb1wiLCBcInJ1bm5pbmdcIiwgXCJ1bmtub3duXCJdKSxcbiAgICBkdXJhdGlvbk1zOiB6Lm51bWJlcigpLm51bGxhYmxlKCksXG4gICAgY291bnRzOiB6Lm9iamVjdCh7XG4gICAgICB0b3RhbDogei5udW1iZXIoKSxcbiAgICAgIHBhc3NlZDogei5udW1iZXIoKSxcbiAgICAgIGZhaWxlZDogei5udW1iZXIoKSxcbiAgICAgIHNraXBwZWQ6IHoubnVtYmVyKCksXG4gICAgfSksXG4gICAgZXJyb3I6IHpcbiAgICAgIC5vYmplY3Qoe1xuICAgICAgICBtZXNzYWdlOiB6LnN0cmluZygpLFxuICAgICAgICBzdGFjazogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgfSlcbiAgICAgIC5udWxsYWJsZSgpLFxuICAgIHRyYWNlczogei5hcnJheShTZXJpYWxpemVkVHJhY2VTY2hlbWEpLFxuICAgIGNoaWxkcmVuOiB6LmFycmF5KFRlc3RDYXNlUmVzdWx0U2NoZW1hKSxcbiAgfSksXG4pO1xuXG5jb25zdCBUZXN0RXZlbnRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHNuYXBzaG90OiB6Lm9iamVjdCh7XG4gICAgc2NoZW1hVmVyc2lvbjogei5udW1iZXIoKSxcbiAgICBzZXJ2ZXJUaW1lOiB6LnN0cmluZygpLFxuICAgIHN0YXR1czogei5vYmplY3Qoe1xuICAgICAgcmVhZHk6IHouYm9vbGVhbigpLFxuICAgICAgcnVubmluZzogei5ib29sZWFuKCksXG4gICAgICBsYXN0UnVuQXQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgICB9KSxcbiAgfSksXG4gIHJ1blF1ZXVlZDogei5vYmplY3Qoe1xuICAgIHNjaGVtYVZlcnNpb246IHoubnVtYmVyKCksXG4gICAgcnVuSWQ6IHouc3RyaW5nKCksXG4gICAgcXVldWVkQXQ6IHouc3RyaW5nKCksXG4gICAgcmVxdWVzdDogei5vYmplY3Qoe1xuICAgICAgZmlsZXM6IHouYXJyYXkoei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHBhdHRlcm46IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgfSksXG4gIHJ1blN0YXJ0ZWQ6IHoub2JqZWN0KHtcbiAgICBzY2hlbWFWZXJzaW9uOiB6Lm51bWJlcigpLFxuICAgIHJ1bklkOiB6LnN0cmluZygpLFxuICAgIHN0YXJ0ZWRBdDogei5zdHJpbmcoKSxcbiAgfSksXG4gIHJ1bkNvbXBsZXRlZDogei5vYmplY3Qoe1xuICAgIHNjaGVtYVZlcnNpb246IHoubnVtYmVyKCksXG4gICAgcnVuSWQ6IHouc3RyaW5nKCksXG4gICAgc3RhcnRlZEF0OiB6LnN0cmluZygpLFxuICAgIGZpbmlzaGVkQXQ6IHouc3RyaW5nKCksXG4gICAgcmVzdWx0OiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSksXG4gIH0pLFxuICBydW5FcnJvcmVkOiB6Lm9iamVjdCh7XG4gICAgc2NoZW1hVmVyc2lvbjogei5udW1iZXIoKSxcbiAgICBydW5JZDogei5zdHJpbmcoKSxcbiAgICBmaW5pc2hlZEF0OiB6LnN0cmluZygpLFxuICAgIGVycm9yOiB6Lm9iamVjdCh7XG4gICAgICBtZXNzYWdlOiB6LnN0cmluZygpLFxuICAgICAgc3RhY2s6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICB9KSxcbiAgfSksXG4gIHJ1bk5vZGVQcm9ncmVzczogei5vYmplY3Qoe1xuICAgIHNjaGVtYVZlcnNpb246IHoubGl0ZXJhbCgxKSxcbiAgICBydW5JZDogei5zdHJpbmcoKSxcbiAgICBzdGFydGVkQXQ6IHouc3RyaW5nKCksXG4gICAgYXQ6IHouc3RyaW5nKCksXG4gICAga2luZDogei5lbnVtKFtcImZpbGVcIiwgXCJzdWl0ZVwiLCBcInRlc3RcIl0pLFxuICAgIHBoYXNlOiB6LmVudW0oW1wicmVhZHlcIiwgXCJyZXN1bHRcIl0pLFxuICAgIGZpbGVJZDogei5zdHJpbmcoKSxcbiAgICBub2RlSWQ6IHouc3RyaW5nKCksXG4gICAgcGFyZW50SWQ6IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgICBub2RlOiBUZXN0Q2FzZVJlc3VsdFNjaGVtYSxcbiAgfSksXG4gIGhlYXJ0YmVhdDogei5vYmplY3Qoe1xuICAgIHNjaGVtYVZlcnNpb246IHoubnVtYmVyKCksXG4gICAgYXQ6IHouc3RyaW5nKCksXG4gIH0pLFxufSk7XG5cbnR5cGUgVGVzdEV2ZW50cyA9IHouaW5mZXI8dHlwZW9mIFRlc3RFdmVudFNjaGVtYT47XG5cbmZ1bmN0aW9uIHRvUGF0aFByZWZpeChiYXNlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJhc2VQYXRoLmVuZHNXaXRoKFwiL1wiKSA/IGJhc2VQYXRoIDogYCR7YmFzZVBhdGh9L2A7XG59XG5cbmZ1bmN0aW9uIHJlbGF0aXZpemVUcmFjZSh0cmFjZTogU2VyaWFsaXplZFRyYWNlLCBwcmVmaXg6IHN0cmluZyk6IFNlcmlhbGl6ZWRUcmFjZSB7XG4gIHJldHVybiB7IC4uLnRyYWNlLCBmaWxlUGF0aDogdHJhY2UuZmlsZVBhdGgucmVwbGFjZShwcmVmaXgsIFwiXCIpIH07XG59XG5cbmZ1bmN0aW9uIHJlbGF0aXZpemVOb2RlKG5vZGU6IFRlc3RDYXNlUmVzdWx0LCBiYXNlUGF0aDogc3RyaW5nKTogVGVzdENhc2VSZXN1bHQge1xuICBjb25zdCBwcmVmaXggPSB0b1BhdGhQcmVmaXgoYmFzZVBhdGgpO1xuICByZXR1cm4ge1xuICAgIC4uLm5vZGUsXG4gICAgbmFtZTogbm9kZS5uYW1lLnJlcGxhY2UocHJlZml4LCBcIlwiKSxcbiAgICBmaWxlOiBub2RlLmZpbGUucmVwbGFjZShwcmVmaXgsIFwiXCIpLFxuICAgIHRyYWNlczogbm9kZS50cmFjZXMubWFwKCh0KSA9PiByZWxhdGl2aXplVHJhY2UodCwgcHJlZml4KSksXG4gICAgY2hpbGRyZW46IG5vZGUuY2hpbGRyZW4ubWFwKChjKSA9PiByZWxhdGl2aXplTm9kZShjLCBwcmVmaXgpKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNSdW5Ob2RlUHJvZ3Jlc3NEYXRhKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIFRlc3RFdmVudHNbXCJydW5Ob2RlUHJvZ3Jlc3NcIl0ge1xuICBpZiAodHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBkID0gZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmV0dXJuIChcbiAgICBkLnNjaGVtYVZlcnNpb24gPT09IDEgJiZcbiAgICB0eXBlb2YgZC5ydW5JZCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIHR5cGVvZiBkLnN0YXJ0ZWRBdCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIHR5cGVvZiBkLmF0ID09PSBcInN0cmluZ1wiICYmXG4gICAgKGQua2luZCA9PT0gXCJmaWxlXCIgfHwgZC5raW5kID09PSBcInN1aXRlXCIgfHwgZC5raW5kID09PSBcInRlc3RcIikgJiZcbiAgICAoZC5waGFzZSA9PT0gXCJyZWFkeVwiIHx8IGQucGhhc2UgPT09IFwicmVzdWx0XCIpICYmXG4gICAgdHlwZW9mIGQuZmlsZUlkID09PSBcInN0cmluZ1wiICYmXG4gICAgdHlwZW9mIGQubm9kZUlkID09PSBcInN0cmluZ1wiICYmXG4gICAgKGQucGFyZW50SWQgPT09IG51bGwgfHwgdHlwZW9mIGQucGFyZW50SWQgPT09IFwic3RyaW5nXCIpICYmXG4gICAgdHlwZW9mIGQubm9kZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIGQubm9kZSAhPT0gbnVsbFxuICApO1xufVxuXG5mdW5jdGlvbiByZWxhdGl2aXplUmVzdWx0KHJlc3VsdDogUnVuUmVzdWx0LCBiYXNlUGF0aDogc3RyaW5nKTogUnVuUmVzdWx0IHtcbiAgY29uc3QgcHJlZml4ID0gdG9QYXRoUHJlZml4KGJhc2VQYXRoKTtcbiAgcmV0dXJuIHtcbiAgICAuLi5yZXN1bHQsXG4gICAgcmVzdWx0czogcmVzdWx0LnJlc3VsdHMubWFwKChuKSA9PiByZWxhdGl2aXplTm9kZShuLCBwcmVmaXgpKSxcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlZ2lzdGVyRGV2VGVzdFJvdXRlcyhcbiAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UsXG4gIGNvbmZpZzogU29uYW11RGV2UnVubmVyQ29uZmlnLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByZWZpeCA9IGNvbmZpZy5yb3V0ZVByZWZpeCA/PyBcIi9fX3Rlc3RfX1wiO1xuXG4gIGNvbnN0IG1hbmFnZXIgPSBuZXcgRGV2Vml0ZXN0TWFuYWdlcigpO1xuICBhd2FpdCBtYW5hZ2VyLnN0YXJ0KGNvbmZpZy52aXRlc3RDb25maWdQYXRoKTtcbiAgU29uYW11LmRldlZpdGVzdE1hbmFnZXIgPSBtYW5hZ2VyO1xuXG4gIGNvbnN0IHNzZUF2YWlsYWJsZSA9ICEhU29uYW11LmNvbmZpZy5zZXJ2ZXIucGx1Z2lucz8uc3NlO1xuXG4gIGlmIChzc2VBdmFpbGFibGUpIHtcbiAgICBzZXJ2ZXIuZ2V0KGAke3ByZWZpeH0vZXZlbnRzYCwgKHJlcXVlc3QsIHJlcGx5KTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBzc2U6IFNTRUNvbm5lY3Rpb248dHlwZW9mIFRlc3RFdmVudFNjaGVtYT4gPSBjcmVhdGVTU0VGYWN0b3J5KFxuICAgICAgICByZXF1ZXN0LnNvY2tldCxcbiAgICAgICAgcmVwbHksXG4gICAgICAgIFRlc3RFdmVudFNjaGVtYSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN0YXR1czogTWFuYWdlclN0YXR1cyA9IG1hbmFnZXIuZ2V0U3RhdHVzKCk7XG4gICAgICBzc2UucHVibGlzaChcInNuYXBzaG90XCIsIHtcbiAgICAgICAgc2NoZW1hVmVyc2lvbjogU0NIRU1BX1ZFUlNJT04sXG4gICAgICAgIHNlcnZlclRpbWU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgc3RhdHVzLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGhlYXJ0YmVhdFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICBzc2UucHVibGlzaChcImhlYXJ0YmVhdFwiLCB7XG4gICAgICAgICAgc2NoZW1hVmVyc2lvbjogU0NIRU1BX1ZFUlNJT04sXG4gICAgICAgICAgYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfSk7XG4gICAgICB9LCBIRUFSVEJFQVRfSU5URVJWQUxfTVMpO1xuXG4gICAgICBjb25zdCBiYXNlUGF0aCA9IFNvbmFtdS5hcGlSb290UGF0aDtcbiAgICAgIGNvbnN0IGxpc3RlbmVyID0gKGV2ZW50OiBzdHJpbmcsIGRhdGE6IHVua25vd24pID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gZXZlbnQgYXMga2V5b2YgVGVzdEV2ZW50cztcbiAgICAgICAgaWYgKGtleSA9PT0gXCJydW5Ob2RlUHJvZ3Jlc3NcIikge1xuICAgICAgICAgIGlmICghaXNSdW5Ob2RlUHJvZ3Jlc3NEYXRhKGRhdGEpKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgcmVsYXRpdml6ZWQgPSB7XG4gICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgbm9kZTogcmVsYXRpdml6ZU5vZGUoZGF0YS5ub2RlLCBiYXNlUGF0aCksXG4gICAgICAgICAgfTtcbiAgICAgICAgICBzc2UucHVibGlzaChrZXksIHJlbGF0aXZpemVkKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc3NlLnB1Ymxpc2goa2V5LCBkYXRhIGFzIFRlc3RFdmVudHNbdHlwZW9mIGtleV0pO1xuICAgICAgfTtcbiAgICAgIG1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgICAgIGxldCBjbGVhbmVkID0gZmFsc2U7XG4gICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICBpZiAoY2xlYW5lZCkgcmV0dXJuO1xuICAgICAgICBjbGVhbmVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYXJJbnRlcnZhbChoZWFydGJlYXRUaW1lcik7XG4gICAgICAgIG1hbmFnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgICB9O1xuICAgICAgcmVxdWVzdC5zb2NrZXQub24oXCJjbG9zZVwiLCBjbGVhbnVwKTtcbiAgICAgIHJlcXVlc3Quc29ja2V0Lm9uKFwiZXJyb3JcIiwgY2xlYW51cCk7XG4gICAgfSk7XG4gIH1cblxuICBzZXJ2ZXIucG9zdChgJHtwcmVmaXh9L3J1bmAsIGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgIGlmICghU29uYW11LmRldlZpdGVzdE1hbmFnZXIpIHtcbiAgICAgIHJlcGx5LnN0YXR1cyg1MDMpO1xuICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBlcnJvcjogXCJEZXZWaXRlc3RNYW5hZ2VyIGlzIG5vdCBpbml0aWFsaXplZFwiIH07XG4gICAgfVxuXG4gICAgY29uc3QgcnVuSWQgPSByYW5kb21VVUlEKCk7XG4gICAgY29uc3QgYm9keSA9IHJlcXVlc3QuYm9keSBhcyB7IGZpbGVzPzogc3RyaW5nW107IHBhdHRlcm4/OiBzdHJpbmcgfSB8IG51bGw7XG4gICAgY29uc3QgcnVuUmVxdWVzdCA9IHtcbiAgICAgIGZpbGVzOiBib2R5Py5maWxlcyxcbiAgICAgIHBhdHRlcm46IGJvZHk/LnBhdHRlcm4sXG4gICAgfTtcblxuICAgIG1hbmFnZXIuZW1pdEV2ZW50KFwicnVuUXVldWVkXCIsIHtcbiAgICAgIHNjaGVtYVZlcnNpb246IFNDSEVNQV9WRVJTSU9OLFxuICAgICAgcnVuSWQsXG4gICAgICBxdWV1ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgcmVxdWVzdDogcnVuUmVxdWVzdCxcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFydGVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICBtYW5hZ2VyLmVtaXRFdmVudChcInJ1blN0YXJ0ZWRcIiwge1xuICAgICAgICBzY2hlbWFWZXJzaW9uOiBTQ0hFTUFfVkVSU0lPTixcbiAgICAgICAgcnVuSWQsXG4gICAgICAgIHN0YXJ0ZWRBdCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByYXdSZXN1bHQ6IFJ1blJlc3VsdCA9IGF3YWl0IFNvbmFtdS5kZXZWaXRlc3RNYW5hZ2VyLnJ1bihydW5SZXF1ZXN0LCBydW5JZCk7XG4gICAgICBjb25zdCByZXN1bHQgPSByZWxhdGl2aXplUmVzdWx0KHJhd1Jlc3VsdCwgU29uYW11LmFwaVJvb3RQYXRoKTtcblxuICAgICAgY29uc3QgZmluaXNoZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgIG1hbmFnZXIuZW1pdEV2ZW50KFwicnVuQ29tcGxldGVkXCIsIHtcbiAgICAgICAgc2NoZW1hVmVyc2lvbjogU0NIRU1BX1ZFUlNJT04sXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBzdGFydGVkQXQsXG4gICAgICAgIGZpbmlzaGVkQXQsXG4gICAgICAgIHJlc3VsdCxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgZmluaXNoZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgIG1hbmFnZXIuZW1pdEV2ZW50KFwicnVuRXJyb3JlZFwiLCB7XG4gICAgICAgIHNjaGVtYVZlcnNpb246IFNDSEVNQV9WRVJTSU9OLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgZmluaXNoZWRBdCxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBtZXNzYWdlOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgc3RhY2s6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLnN0YWNrIDogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHJlcGx5LnN0YXR1cyg1MDApO1xuICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH07XG4gICAgfVxuICB9KTtcblxuICBzZXJ2ZXIuZ2V0KGAke3ByZWZpeH0vc3RhdHVzYCwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHN0YXR1czogTWFuYWdlclN0YXR1cyA9IFNvbmFtdS5kZXZWaXRlc3RNYW5hZ2VyPy5nZXRTdGF0dXMoKSA/PyB7XG4gICAgICByZWFkeTogZmFsc2UsXG4gICAgICBydW5uaW5nOiBmYWxzZSxcbiAgICAgIGxhc3RSdW5BdDogbnVsbCxcbiAgICB9O1xuICAgIHJldHVybiB7IC4uLnN0YXR1cywgc3NlQXZhaWxhYmxlIH07XG4gIH0pO1xuXG4gIHNlcnZlci5hZGRIb29rKFwib25DbG9zZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgU29uYW11LmRldlZpdGVzdE1hbmFnZXI/LnNodXRkb3duKCk7XG4gICAgU29uYW11LmRldlZpdGVzdE1hbmFnZXIgPSBudWxsO1xuICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQThHQSxTQUFTLGFBQWEsVUFBMEI7Q0FDOUMsT0FBTyxTQUFTLFNBQVMsR0FBRyxJQUFJLFdBQVcsR0FBRyxTQUFTO0FBQ3pEO0FBRUEsU0FBUyxnQkFBZ0IsT0FBd0IsUUFBaUM7Q0FDaEYsT0FBTztFQUFFLEdBQUc7RUFBTyxVQUFVLE1BQU0sU0FBUyxRQUFRLFFBQVEsRUFBRTtDQUFFO0FBQ2xFO0FBRUEsU0FBUyxlQUFlLE1BQXNCLFVBQWtDO0NBQzlFLE1BQU0sU0FBUyxhQUFhLFFBQVE7Q0FDcEMsT0FBTztFQUNMLEdBQUc7RUFDSCxNQUFNLEtBQUssS0FBSyxRQUFRLFFBQVEsRUFBRTtFQUNsQyxNQUFNLEtBQUssS0FBSyxRQUFRLFFBQVEsRUFBRTtFQUNsQyxRQUFRLEtBQUssT0FBTyxLQUFLLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDO0VBQ3pELFVBQVUsS0FBSyxTQUFTLEtBQUssTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDO0NBQzlEO0FBQ0Y7QUFFQSxTQUFTLHNCQUFzQixNQUFzRDtDQUNuRixJQUFJLE9BQU8sU0FBUyxZQUFZLFNBQVMsTUFBTSxPQUFPO0NBQ3RELE1BQU0sSUFBSTtDQUNWLE9BQ0UsRUFBRSxrQkFBa0IsS0FDcEIsT0FBTyxFQUFFLFVBQVUsWUFDbkIsT0FBTyxFQUFFLGNBQWMsWUFDdkIsT0FBTyxFQUFFLE9BQU8sYUFDZixFQUFFLFNBQVMsVUFBVSxFQUFFLFNBQVMsV0FBVyxFQUFFLFNBQVMsWUFDdEQsRUFBRSxVQUFVLFdBQVcsRUFBRSxVQUFVLGFBQ3BDLE9BQU8sRUFBRSxXQUFXLFlBQ3BCLE9BQU8sRUFBRSxXQUFXLGFBQ25CLEVBQUUsYUFBYSxRQUFRLE9BQU8sRUFBRSxhQUFhLGFBQzlDLE9BQU8sRUFBRSxTQUFTLFlBQ2xCLEVBQUUsU0FBUztBQUVmO0FBRUEsU0FBUyxpQkFBaUIsUUFBbUIsVUFBNkI7Q0FDeEUsTUFBTSxTQUFTLGFBQWEsUUFBUTtDQUNwQyxPQUFPO0VBQ0wsR0FBRztFQUNILFNBQVMsT0FBTyxRQUFRLEtBQUssTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDO0NBQzlEO0FBQ0Y7QUFFQSxlQUFzQixzQkFDcEIsUUFDQSxRQUNlO0NBQ2YsTUFBTSxTQUFTLE9BQU8sZUFBZTtDQUVyQyxNQUFNLFVBQVUsSUFBSSxpQkFBaUI7Q0FDckMsTUFBTSxRQUFRLE1BQU0sT0FBTyxnQkFBZ0I7Q0FDM0MsT0FBTyxtQkFBbUI7Q0FFMUIsTUFBTSxlQUFlLENBQUMsQ0FBQyxPQUFPLE9BQU8sT0FBTyxTQUFTO0NBRXJELElBQUksY0FDRixPQUFPLElBQUksR0FBRyxPQUFPLFdBQVcsU0FBUyxVQUFnQjtFQUN2RCxNQUFNLE1BQTZDLGlCQUNqRCxRQUFRLFFBQ1IsT0FDQSxlQUNGO0VBRUEsTUFBTSxTQUF3QixRQUFRLFVBQVU7RUFDaEQsSUFBSSxRQUFRLFlBQVk7R0FDdEIsZUFBZTtHQUNmLDZCQUFZLElBQUksS0FBSyxFQUFDLENBQUMsWUFBWTtHQUNuQztFQUNGLENBQUM7RUFFRCxNQUFNLGlCQUFpQixrQkFBa0I7R0FDdkMsSUFBSSxRQUFRLGFBQWE7SUFDdkIsZUFBZTtJQUNmLHFCQUFJLElBQUksS0FBSyxFQUFDLENBQUMsWUFBWTtHQUM3QixDQUFDO0VBQ0gsR0FBRyxxQkFBcUI7RUFFeEIsTUFBTSxXQUFXLE9BQU87RUFDeEIsTUFBTSxZQUFZLE9BQWUsU0FBa0I7R0FDakQsTUFBTSxNQUFNO0dBQ1osSUFBSSxRQUFRLG1CQUFtQjtJQUM3QixJQUFJLENBQUMsc0JBQXNCLElBQUksR0FBRztJQUNsQyxNQUFNLGNBQWM7S0FDbEIsR0FBRztLQUNILE1BQU0sZUFBZSxLQUFLLE1BQU0sUUFBUTtJQUMxQztJQUNBLElBQUksUUFBUSxLQUFLLFdBQVc7SUFDNUI7R0FDRjtHQUNBLElBQUksUUFBUSxLQUFLLElBQThCO0VBQ2pEO0VBQ0EsUUFBUSxpQkFBaUIsUUFBUTtFQUVqQyxJQUFJLFVBQVU7RUFDZCxNQUFNLGdCQUFnQjtHQUNwQixJQUFJLFNBQVM7R0FDYixVQUFVO0dBQ1YsY0FBYyxjQUFjO0dBQzVCLFFBQVEsb0JBQW9CLFFBQVE7RUFDdEM7RUFDQSxRQUFRLE9BQU8sR0FBRyxTQUFTLE9BQU87RUFDbEMsUUFBUSxPQUFPLEdBQUcsU0FBUyxPQUFPO0NBQ3BDLENBQUM7Q0FHSCxPQUFPLEtBQUssR0FBRyxPQUFPLE9BQU8sT0FBTyxTQUFTLFVBQVU7RUFDckQsSUFBSSxDQUFDLE9BQU8sa0JBQWtCO0dBQzVCLE1BQU0sT0FBTyxHQUFHO0dBQ2hCLE9BQU87SUFBRSxJQUFJO0lBQU8sT0FBTztHQUFzQztFQUNuRTtFQUVBLE1BQU0sUUFBUSxXQUFXO0VBQ3pCLE1BQU0sT0FBTyxRQUFRO0VBQ3JCLE1BQU0sYUFBYTtHQUNqQixPQUFPLE1BQU07R0FDYixTQUFTLE1BQU07RUFDakI7RUFFQSxRQUFRLFVBQVUsYUFBYTtHQUM3QixlQUFlO0dBQ2Y7R0FDQSwyQkFBVSxJQUFJLEtBQUssRUFBQyxDQUFDLFlBQVk7R0FDakMsU0FBUztFQUNYLENBQUM7RUFFRCxJQUFJO0dBQ0YsTUFBTSw2QkFBWSxJQUFJLEtBQUssRUFBQyxDQUFDLFlBQVk7R0FDekMsUUFBUSxVQUFVLGNBQWM7SUFDOUIsZUFBZTtJQUNmO0lBQ0E7R0FDRixDQUFDO0dBR0QsTUFBTSxTQUFTLGlCQUFpQixNQURHLE9BQU8saUJBQWlCLElBQUksWUFBWSxLQUFLLEdBQ3JDLE9BQU8sV0FBVztHQUU3RCxNQUFNLDhCQUFhLElBQUksS0FBSyxFQUFDLENBQUMsWUFBWTtHQUMxQyxRQUFRLFVBQVUsZ0JBQWdCO0lBQ2hDLGVBQWU7SUFDZjtJQUNBO0lBQ0E7SUFDQTtHQUNGLENBQUM7R0FFRCxPQUFPO0VBQ1QsU0FBUyxLQUFLO0dBQ1osTUFBTSw4QkFBYSxJQUFJLEtBQUssRUFBQyxDQUFDLFlBQVk7R0FDMUMsUUFBUSxVQUFVLGNBQWM7SUFDOUIsZUFBZTtJQUNmO0lBQ0E7SUFDQSxPQUFPO0tBQ0wsU0FBUyxlQUFlLFFBQVEsSUFBSSxVQUFVLE9BQU8sR0FBRztLQUN4RCxPQUFPLGVBQWUsUUFBUSxJQUFJLFFBQVE7SUFDNUM7R0FDRixDQUFDO0dBRUQsTUFBTSxPQUFPLEdBQUc7R0FDaEIsT0FBTztJQUFFLElBQUk7SUFBTyxPQUFPLGVBQWUsUUFBUSxJQUFJLFVBQVUsT0FBTyxHQUFHO0dBQUU7RUFDOUU7Q0FDRixDQUFDO0NBRUQsT0FBTyxJQUFJLEdBQUcsT0FBTyxVQUFVLFlBQVk7RUFNekMsT0FBTztHQUFFLEdBTHFCLE9BQU8sa0JBQWtCLFVBQVUsS0FBSztJQUNwRSxPQUFPO0lBQ1AsU0FBUztJQUNULFdBQVc7R0FDYjtHQUNvQjtFQUFhO0NBQ25DLENBQUM7Q0FFRCxPQUFPLFFBQVEsV0FBVyxZQUFZO0VBQ3BDLE1BQU0sT0FBTyxrQkFBa0IsU0FBUztFQUN4QyxPQUFPLG1CQUFtQjtDQUM1QixDQUFDO0FBQ0g7Ozs7YUExUnNDO1VBRVU7eUJBR087Q0FFakQsaUJBQWlCO0NBQ2pCLHdCQUF3QjtDQUV4Qix3QkFBd0JBLElBQUUsT0FBTztFQUNyQyxLQUFLQSxJQUFFLE9BQU87RUFDZCxPQUFPQSxJQUFFLFFBQVE7RUFDakIsVUFBVUEsSUFBRSxPQUFPO0VBQ25CLFlBQVlBLElBQUUsT0FBTztFQUNyQixJQUFJQSxJQUFFLE9BQU87Q0FDZixDQUFDO0NBRUssdUJBQWtEQSxJQUFFLFdBQ3hEQSxJQUFFLE9BQU87RUFDUCxJQUFJQSxJQUFFLE9BQU87RUFDYixNQUFNQSxJQUFFLEtBQUs7R0FBQztHQUFRO0dBQVM7RUFBTSxDQUFDO0VBQ3RDLE1BQU1BLElBQUUsT0FBTztFQUNmLFVBQVVBLElBQUUsT0FBTztFQUNuQixNQUFNQSxJQUFFLE9BQU87RUFDZixPQUFPQSxJQUFFLEtBQUs7R0FBQztHQUFVO0dBQVU7R0FBVztHQUFRO0dBQVc7RUFBUyxDQUFDO0VBQzNFLFlBQVlBLElBQUUsT0FBTyxDQUFDLENBQUMsU0FBUztFQUNoQyxRQUFRQSxJQUFFLE9BQU87R0FDZixPQUFPQSxJQUFFLE9BQU87R0FDaEIsUUFBUUEsSUFBRSxPQUFPO0dBQ2pCLFFBQVFBLElBQUUsT0FBTztHQUNqQixTQUFTQSxJQUFFLE9BQU87RUFDcEIsQ0FBQztFQUNELE9BQU9BLElBQ0osT0FBTztHQUNOLFNBQVNBLElBQUUsT0FBTztHQUNsQixPQUFPQSxJQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVM7RUFDN0IsQ0FBQyxDQUFDLENBQ0QsU0FBUztFQUNaLFFBQVFBLElBQUUsTUFBTSxxQkFBcUI7RUFDckMsVUFBVUEsSUFBRSxNQUFNLG9CQUFvQjtDQUN4QyxDQUFDLENBQ0g7Q0FFTSxrQkFBa0JBLElBQUUsT0FBTztFQUMvQixVQUFVQSxJQUFFLE9BQU87R0FDakIsZUFBZUEsSUFBRSxPQUFPO0dBQ3hCLFlBQVlBLElBQUUsT0FBTztHQUNyQixRQUFRQSxJQUFFLE9BQU87SUFDZixPQUFPQSxJQUFFLFFBQVE7SUFDakIsU0FBU0EsSUFBRSxRQUFRO0lBQ25CLFdBQVdBLElBQUUsT0FBTyxDQUFDLENBQUMsU0FBUztHQUNqQyxDQUFDO0VBQ0gsQ0FBQztFQUNELFdBQVdBLElBQUUsT0FBTztHQUNsQixlQUFlQSxJQUFFLE9BQU87R0FDeEIsT0FBT0EsSUFBRSxPQUFPO0dBQ2hCLFVBQVVBLElBQUUsT0FBTztHQUNuQixTQUFTQSxJQUFFLE9BQU87SUFDaEIsT0FBT0EsSUFBRSxNQUFNQSxJQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUztJQUNwQyxTQUFTQSxJQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVM7R0FDL0IsQ0FBQztFQUNILENBQUM7RUFDRCxZQUFZQSxJQUFFLE9BQU87R0FDbkIsZUFBZUEsSUFBRSxPQUFPO0dBQ3hCLE9BQU9BLElBQUUsT0FBTztHQUNoQixXQUFXQSxJQUFFLE9BQU87RUFDdEIsQ0FBQztFQUNELGNBQWNBLElBQUUsT0FBTztHQUNyQixlQUFlQSxJQUFFLE9BQU87R0FDeEIsT0FBT0EsSUFBRSxPQUFPO0dBQ2hCLFdBQVdBLElBQUUsT0FBTztHQUNwQixZQUFZQSxJQUFFLE9BQU87R0FDckIsUUFBUUEsSUFBRSxPQUFPQSxJQUFFLE9BQU8sR0FBR0EsSUFBRSxRQUFRLENBQUM7RUFDMUMsQ0FBQztFQUNELFlBQVlBLElBQUUsT0FBTztHQUNuQixlQUFlQSxJQUFFLE9BQU87R0FDeEIsT0FBT0EsSUFBRSxPQUFPO0dBQ2hCLFlBQVlBLElBQUUsT0FBTztHQUNyQixPQUFPQSxJQUFFLE9BQU87SUFDZCxTQUFTQSxJQUFFLE9BQU87SUFDbEIsT0FBT0EsSUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0dBQzdCLENBQUM7RUFDSCxDQUFDO0VBQ0QsaUJBQWlCQSxJQUFFLE9BQU87R0FDeEIsZUFBZUEsSUFBRSxRQUFRLENBQUM7R0FDMUIsT0FBT0EsSUFBRSxPQUFPO0dBQ2hCLFdBQVdBLElBQUUsT0FBTztHQUNwQixJQUFJQSxJQUFFLE9BQU87R0FDYixNQUFNQSxJQUFFLEtBQUs7SUFBQztJQUFRO0lBQVM7R0FBTSxDQUFDO0dBQ3RDLE9BQU9BLElBQUUsS0FBSyxDQUFDLFNBQVMsUUFBUSxDQUFDO0dBQ2pDLFFBQVFBLElBQUUsT0FBTztHQUNqQixRQUFRQSxJQUFFLE9BQU87R0FDakIsVUFBVUEsSUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0dBQzlCLE1BQU07RUFDUixDQUFDO0VBQ0QsV0FBV0EsSUFBRSxPQUFPO0dBQ2xCLGVBQWVBLElBQUUsT0FBTztHQUN4QixJQUFJQSxJQUFFLE9BQU87RUFDZixDQUFDO0NBQ0gsQ0FBQyJ9
|