sonamu 0.11.16 → 0.13.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 +1 -2
- package/dist/ai/agents/agent.js +2 -3
- package/dist/ai/agents/index.js +1 -2
- package/dist/ai/index.js +1 -2
- package/dist/ai/providers/rtzr/api.js +1 -2
- package/dist/ai/providers/rtzr/error.js +2 -3
- package/dist/ai/providers/rtzr/model.js +1 -2
- package/dist/ai/providers/rtzr/options.js +1 -2
- package/dist/ai/providers/rtzr/provider.js +1 -2
- package/dist/ai/providers/rtzr/utils.js +1 -2
- package/dist/api/base-frame.js +4 -4
- package/dist/api/caster.d.ts +1 -1
- package/dist/api/caster.d.ts.map +1 -1
- package/dist/api/caster.js +9 -9
- package/dist/api/code-converters.js +6 -5
- package/dist/api/config.d.ts +1 -1
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +2 -3
- package/dist/api/context.d.ts +2 -3
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +2 -3
- package/dist/api/decorators.js +2 -3
- package/dist/api/http-validator.js +2 -3
- package/dist/api/index.js +8 -3
- package/dist/api/secret.js +1 -2
- package/dist/api/sonamu.d.ts +3 -5
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +30 -24
- package/dist/api/validator.js +1 -2
- package/dist/api/websocket-helpers.js +2 -3
- package/dist/auth/audit-log/builders.js +1 -2
- package/dist/auth/audit-log/client-ip.js +2 -3
- package/dist/auth/audit-log/events.js +1 -2
- package/dist/auth/audit-log/plugin.d.ts.map +1 -1
- package/dist/auth/audit-log/plugin.js +2 -3
- package/dist/auth/audit-log-ingestor.js +2 -3
- package/dist/auth/auth-generator.js +2 -3
- package/dist/auth/better-auth-entities.js +1 -2
- package/dist/auth/better-auth-request.js +2 -3
- package/dist/auth/index.js +2 -3
- package/dist/auth/knex-adapter.js +2 -3
- package/dist/auth/plugins/entity-definitions/admin.js +1 -2
- package/dist/auth/plugins/entity-definitions/anonymous.js +1 -2
- package/dist/auth/plugins/entity-definitions/api-key.js +1 -2
- package/dist/auth/plugins/entity-definitions/audit-log.js +1 -2
- package/dist/auth/plugins/entity-definitions/index.js +1 -2
- package/dist/auth/plugins/entity-definitions/jwt.js +1 -2
- package/dist/auth/plugins/entity-definitions/organization.js +1 -2
- package/dist/auth/plugins/entity-definitions/passkey.js +1 -2
- package/dist/auth/plugins/entity-definitions/phone-number.js +1 -2
- package/dist/auth/plugins/entity-definitions/sso.js +1 -2
- package/dist/auth/plugins/entity-definitions/two-factor.js +1 -2
- package/dist/auth/plugins/entity-definitions/username.js +1 -2
- package/dist/auth/plugins/wrappers/admin.d.ts +33 -32
- package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
- 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/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.d.ts +43 -1
- package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/phone-number.js +2 -3
- package/dist/auth/plugins/wrappers/sso.d.ts +138 -187
- package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/sso.js +1 -2
- package/dist/auth/plugins/wrappers/two-factor.d.ts +51 -10
- package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/two-factor.js +2 -3
- package/dist/auth/plugins/wrappers/username.d.ts +39 -5
- package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/username.js +2 -3
- package/dist/bin/build-config.js +5 -5
- package/dist/bin/compiler-policy.js +2 -3
- package/dist/bin/fixture.js +7 -5
- package/dist/bin/hmr-hook-register.js +1 -2
- package/dist/bin/migrate-targets.js +2 -3
- package/dist/bin/test-command.js +2 -3
- package/dist/bin/ts-loader-register.js +2 -3
- package/dist/bin/ts-loader-registration.js +2 -3
- package/dist/bin/typecheck-web.js +2 -3
- package/dist/cache/cache-manager.js +1 -2
- package/dist/cache/decorator.js +2 -3
- package/dist/cache/drivers.js +1 -2
- package/dist/cache/index.js +2 -3
- package/dist/cache-control/cache-control.js +1 -2
- package/dist/code-formatting/index.js +2 -3
- package/dist/code-formatting/oxfmt.js +2 -3
- package/dist/code-formatting/oxlint.js +2 -3
- package/dist/compress/compress.js +1 -2
- package/dist/compress/index.js +2 -2
- package/dist/compress/types.d.ts +1 -1
- package/dist/compress/types.d.ts.map +1 -1
- package/dist/cone/cone-generator.js +2 -3
- package/dist/database/_batch_update.js +1 -2
- package/dist/database/base-model.js +4 -4
- package/dist/database/db.js +4 -4
- package/dist/database/knex.js +2 -3
- package/dist/database/puri-wrapper.js +2 -3
- package/dist/database/puri.js +23 -22
- package/dist/database/puri.types.js +1 -2
- package/dist/database/transaction-context.js +1 -2
- package/dist/database/upsert-builder.js +2 -3
- package/dist/dict/en.js +2 -3
- package/dist/dict/index.js +3 -3
- package/dist/dict/ko.js +2 -3
- package/dist/dict/rc-keys.js +1 -2
- package/dist/dict/sd.js +2 -3
- package/dist/dict/sonamu-dictionary.js +7 -6
- package/dist/dict/utils.js +2 -3
- package/dist/entity/entity-manager.d.ts +66 -66
- package/dist/entity/entity-manager.js +4 -4
- package/dist/entity/entity-template-cone.js +2 -3
- package/dist/entity/entity.js +21 -18
- package/dist/env.js +1 -2
- package/dist/exceptions/error-handler.d.ts.map +1 -1
- package/dist/exceptions/error-handler.js +2 -3
- package/dist/exceptions/so-exceptions.js +2 -3
- package/dist/filter/index.js +3 -2
- package/dist/filter/types.js +1 -2
- package/dist/filter/utils.js +7 -6
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +42 -6
- package/dist/logger/category.js +2 -3
- package/dist/logger/configure.js +5 -5
- package/dist/migration/code-generation.js +23 -16
- package/dist/migration/index-where-predicate.js +2 -3
- package/dist/migration/migration-set.js +2 -3
- package/dist/migration/migrator.js +2 -3
- package/dist/migration/postgresql-schema-reader.js +6 -9
- package/dist/migration/slack-confirm.js +2 -3
- package/dist/naite/naite-reporter.js +2 -3
- package/dist/naite/naite.js +10 -8
- package/dist/runtime-type.js +2 -3
- package/dist/ssr/hmr-opt-out.js +1 -2
- package/dist/ssr/index.js +7 -4
- package/dist/ssr/registry.js +1 -2
- package/dist/ssr/renderer.js +2 -3
- package/dist/storage/base-file.js +1 -2
- package/dist/storage/buffered-file.js +2 -3
- package/dist/storage/drivers.js +1 -2
- package/dist/storage/index.js +2 -3
- package/dist/storage/s3-driver.js +1 -2
- package/dist/storage/storage-manager.js +2 -3
- package/dist/storage/uploaded-file.js +2 -3
- package/dist/stream/__tests__/ws-test-helpers.d.ts +108 -0
- package/dist/stream/__tests__/ws-test-helpers.d.ts.map +1 -0
- package/dist/stream/__tests__/ws-test-helpers.js +259 -0
- package/dist/stream/index.d.ts +1 -0
- package/dist/stream/index.d.ts.map +1 -1
- package/dist/stream/index.js +15 -4
- package/dist/stream/sse.js +1 -2
- package/dist/stream/ws-audience-resolver.d.ts +8 -5
- package/dist/stream/ws-audience-resolver.d.ts.map +1 -1
- package/dist/stream/ws-audience-resolver.js +17 -15
- package/dist/stream/ws-audience.js +1 -2
- package/dist/stream/ws-cluster-bus.d.ts +9 -4
- package/dist/stream/ws-cluster-bus.d.ts.map +1 -1
- package/dist/stream/ws-cluster-bus.js +2 -3
- package/dist/stream/ws-core.d.ts +10 -0
- package/dist/stream/ws-core.d.ts.map +1 -1
- package/dist/stream/ws-delivery.d.ts +30 -4
- package/dist/stream/ws-delivery.d.ts.map +1 -1
- package/dist/stream/ws-delivery.js +200 -54
- package/dist/stream/ws-frame.d.ts +15 -0
- package/dist/stream/ws-frame.d.ts.map +1 -0
- package/dist/stream/ws-frame.js +28 -0
- package/dist/stream/ws-local-connection-store.d.ts +4 -4
- package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
- package/dist/stream/ws-local-connection-store.js +3 -4
- package/dist/stream/ws-presence-index.d.ts +36 -0
- package/dist/stream/ws-presence-index.d.ts.map +1 -0
- package/dist/stream/ws-presence-index.js +176 -0
- package/dist/stream/ws-presence-store.d.ts +39 -39
- package/dist/stream/ws-presence-store.d.ts.map +1 -1
- package/dist/stream/ws-presence-store.js +23 -154
- package/dist/stream/ws-registry.d.ts +45 -17
- package/dist/stream/ws-registry.d.ts.map +1 -1
- package/dist/stream/ws-registry.js +170 -62
- package/dist/stream/ws-session-id.d.ts +14 -0
- package/dist/stream/ws-session-id.d.ts.map +1 -0
- package/dist/stream/ws-session-id.js +36 -0
- package/dist/stream/ws-telemetry-memory.js +3 -4
- package/dist/stream/ws-telemetry-trace.js +1 -2
- package/dist/stream/ws-telemetry.js +2 -3
- package/dist/stream/ws.d.ts +20 -10
- package/dist/stream/ws.d.ts.map +1 -1
- package/dist/stream/ws.js +60 -38
- package/dist/syncer/api-parser.js +2 -3
- package/dist/syncer/checksum.js +4 -4
- package/dist/syncer/code-generator.js +4 -4
- package/dist/syncer/entity-operations.js +2 -3
- package/dist/syncer/event-batcher.js +1 -2
- package/dist/syncer/file-copy.js +2 -3
- package/dist/syncer/file-patterns.js +2 -3
- package/dist/syncer/file-tracking.js +2 -3
- package/dist/syncer/filesystem-dependencies.js +1 -2
- package/dist/syncer/index.js +8 -2
- package/dist/syncer/module-loader.js +8 -6
- package/dist/syncer/syncer-actions.js +8 -7
- package/dist/syncer/syncer.js +13 -8
- package/dist/syncer/watcher.js +2 -3
- package/dist/tasks/decorator.js +1 -2
- package/dist/tasks/step-wrapper.js +2 -3
- package/dist/tasks/workflow-manager.js +2 -3
- package/dist/template/entity-converter.js +17 -16
- package/dist/template/helpers.js +2 -3
- package/dist/template/implementations/entity.template.js +2 -3
- package/dist/template/implementations/entry-server.template.js +2 -3
- package/dist/template/implementations/generated.template.js +2 -3
- package/dist/template/implementations/generated_http.template.js +6 -6
- package/dist/template/implementations/generated_sso.template.js +2 -3
- package/dist/template/implementations/http_validators.template.js +2 -3
- package/dist/template/implementations/init_types.template.js +2 -3
- package/dist/template/implementations/model.template.js +4 -4
- package/dist/template/implementations/model_test.template.js +2 -3
- package/dist/template/implementations/queries.template.js +2 -3
- package/dist/template/implementations/sd.template.js +2 -3
- package/dist/template/implementations/services.template.js +2 -3
- package/dist/template/implementations/view_form.template.js +12 -9
- package/dist/template/implementations/view_id_all_select.template.js +2 -3
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.js +19 -17
- package/dist/template/implementations/view_search_input.template.js +2 -3
- package/dist/template/index.js +9 -3
- package/dist/template/template-manager.js +2 -3
- package/dist/template/template-types.js +1 -2
- package/dist/template/template.js +2 -3
- package/dist/template/zod-converter.js +54 -47
- package/dist/testing/_relation-graph.js +2 -3
- package/dist/testing/bootstrap.js +2 -3
- package/dist/testing/data-explorer.js +2 -3
- package/dist/testing/dev-test-routes.js +2 -3
- package/dist/testing/dev-vitest-manager.js +15 -12
- package/dist/testing/faker-mappings.js +1 -2
- package/dist/testing/filesystem.js +2 -3
- package/dist/testing/fixture-generator.js +2 -3
- package/dist/testing/fixture-loader.js +1 -2
- package/dist/testing/fixture-manager.js +12 -9
- package/dist/testing/global-setup.js +5 -5
- package/dist/testing/index.js +6 -3
- package/dist/testing/naite-vitest-reporter.js +1 -2
- package/dist/testing/parallel-db-manager.js +2 -3
- package/dist/testing/vitest-helpers.js +2 -3
- package/dist/tooling/__tests__/helpers/sonamu-test-root.js +2 -3
- package/dist/tooling/cdd-service.js +1 -2
- package/dist/tooling/cli-tooling.js +1 -2
- package/dist/tooling/fixture-service.js +1 -2
- package/dist/tooling/index.js +1 -2
- package/dist/tooling/test-run-client.js +2 -3
- package/dist/tsdown.api.config.js +1 -2
- package/dist/types/types.js +2 -3
- package/dist/ui/ai-api.d.ts.map +1 -1
- package/dist/ui/ai-api.js +4 -5
- package/dist/ui/ai-client.d.ts +2 -2
- package/dist/ui/ai-client.d.ts.map +1 -1
- package/dist/ui/ai-client.js +9 -8
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +11 -8
- package/dist/ui/async-route.js +1 -2
- package/dist/ui/cdd-service.js +22 -21
- package/dist/ui/migrations-api.js +6 -5
- package/dist/ui-web/assets/index-QDMyy31K.js +180 -0
- package/dist/ui-web/assets/index-dV7akMFB.css +1 -0
- package/dist/ui-web/index.html +2 -2
- package/dist/utils/async-utils.js +1 -2
- package/dist/utils/class-name.js +1 -2
- package/dist/utils/console-util.js +1 -2
- package/dist/utils/controller.js +2 -3
- package/dist/utils/esm-utils.js +1 -2
- package/dist/utils/fs-utils.js +2 -3
- package/dist/utils/lodash-able.js +1 -2
- package/dist/utils/model.js +1 -2
- package/dist/utils/object-utils.js +2 -3
- package/dist/utils/path-utils.js +2 -3
- package/dist/utils/process-utils.js +2 -3
- package/dist/utils/runtime-value.js +1 -2
- package/dist/utils/sql-parser.js +2 -3
- package/dist/utils/type-utils.js +8 -8
- package/dist/utils/utils.js +2 -3
- package/dist/utils/zod-error.js +2 -3
- package/dist/vector/chunking.js +1 -2
- package/dist/vector/config.js +1 -2
- package/dist/vector/embedding.js +4 -4
- package/package.json +63 -63
- package/src/ai/agents/agent.ts +1 -1
- package/src/api/__tests__/sonamu.plugins.test.ts +11 -1
- package/src/api/__tests__/sonamu.websocket-routes.test.ts +234 -0
- package/src/api/__tests__/sonamu.websocket.test.ts +241 -24
- package/src/api/config.ts +1 -1
- package/src/api/context.ts +2 -8
- package/src/api/sonamu.ts +46 -28
- package/src/auth/audit-log/plugin.ts +2 -0
- package/src/compress/types.ts +1 -1
- package/src/exceptions/error-handler.ts +3 -2
- package/src/index.ts +1 -0
- package/src/stream/__tests__/ws-contracts.test.ts +483 -265
- package/src/stream/__tests__/ws-multinode.test.ts +326 -0
- package/src/stream/__tests__/ws-registry-async.test.ts +855 -0
- package/src/stream/__tests__/ws-test-helpers.ts +360 -0
- package/src/stream/__tests__/ws.test.ts +342 -145
- package/src/stream/index.ts +1 -0
- package/src/stream/ws-audience-resolver.ts +21 -19
- package/src/stream/ws-cluster-bus.ts +12 -4
- package/src/stream/ws-core.ts +14 -0
- package/src/stream/ws-delivery.ts +321 -97
- package/src/stream/ws-frame.ts +39 -0
- package/src/stream/ws-local-connection-store.ts +10 -9
- package/src/stream/ws-presence-index.ts +273 -0
- package/src/stream/ws-presence-store.ts +64 -284
- package/src/stream/ws-registry.ts +272 -85
- package/src/stream/ws-session-id.ts +39 -0
- package/src/stream/ws.ts +91 -50
- package/src/template/implementations/model.template.ts +3 -3
- package/src/template/implementations/view_list.template.ts +12 -13
- package/src/ui/ai-api.ts +4 -2
- package/src/ui/ai-client.ts +2 -2
- package/src/ui/api.ts +58 -62
- package/dist/ui-web/assets/index-BMdIyKXS.css +0 -1
- package/dist/ui-web/assets/index-LpE8u19O.js +0 -178
package/dist/api/sonamu.js
CHANGED
|
@@ -29,7 +29,7 @@ import fs from "fs/promises";
|
|
|
29
29
|
import os from "os";
|
|
30
30
|
import "@fastify/websocket";
|
|
31
31
|
import mime, { lookup } from "mime-types";
|
|
32
|
-
|
|
32
|
+
// src/api/sonamu.ts
|
|
33
33
|
function toApiArgument(value) {
|
|
34
34
|
if (value === null) return null;
|
|
35
35
|
if (value === void 0) return void 0;
|
|
@@ -304,9 +304,10 @@ var init_sonamu = __esmMin((() => {
|
|
|
304
304
|
const options = this.config.server;
|
|
305
305
|
const { default: fastify } = await import("fastify");
|
|
306
306
|
const { getLogTapeFastifyLogger } = await import("@logtape/fastify");
|
|
307
|
+
const loggerInstance = this.config.logging !== false ? getLogTapeFastifyLogger({ category: this.config.logging?.fastifyCategory ?? ["fastify"] }) : void 0;
|
|
307
308
|
const server = fastify({
|
|
308
309
|
...options.fastify,
|
|
309
|
-
|
|
310
|
+
loggerInstance
|
|
310
311
|
});
|
|
311
312
|
this.server = server;
|
|
312
313
|
this.websocketRuntime = new WebSocketRuntime(options.websocket);
|
|
@@ -434,13 +435,12 @@ var init_sonamu = __esmMin((() => {
|
|
|
434
435
|
if (handler) return handler(request, reply);
|
|
435
436
|
throw new NotFoundException(SD("error.api.notFound"));
|
|
436
437
|
},
|
|
437
|
-
wsHandler: async (
|
|
438
|
-
await this.handleDevWebSocketRequest(
|
|
438
|
+
wsHandler: async (socket, request) => {
|
|
439
|
+
await this.handleDevWebSocketRequest(socket, request, config);
|
|
439
440
|
}
|
|
440
441
|
});
|
|
441
442
|
server.route({
|
|
442
443
|
method: [
|
|
443
|
-
"HEAD",
|
|
444
444
|
"POST",
|
|
445
445
|
"PUT",
|
|
446
446
|
"DELETE",
|
|
@@ -487,13 +487,12 @@ var init_sonamu = __esmMin((() => {
|
|
|
487
487
|
if (result) return result(request, reply);
|
|
488
488
|
throw new NotFoundException(SD("error.api.notFound"));
|
|
489
489
|
},
|
|
490
|
-
wsHandler: async (
|
|
491
|
-
await this.handleDevWebSocketRequest(
|
|
490
|
+
wsHandler: async (socket, request) => {
|
|
491
|
+
await this.handleDevWebSocketRequest(socket, request, config);
|
|
492
492
|
}
|
|
493
493
|
});
|
|
494
494
|
server.route({
|
|
495
495
|
method: [
|
|
496
|
-
"HEAD",
|
|
497
496
|
"POST",
|
|
498
497
|
"PUT",
|
|
499
498
|
"DELETE",
|
|
@@ -554,10 +553,12 @@ var init_sonamu = __esmMin((() => {
|
|
|
554
553
|
console.warn(`⚠ SSR entry not found: ${ssrEntryPath}`);
|
|
555
554
|
console.warn(" SSR will be disabled. Only CSR will work.");
|
|
556
555
|
}
|
|
557
|
-
if (ssrAvailable)
|
|
558
|
-
await
|
|
559
|
-
|
|
560
|
-
|
|
556
|
+
if (ssrAvailable) {
|
|
557
|
+
if (await exists(ssrRoutesPath)) {
|
|
558
|
+
await import(ssrRoutesPath);
|
|
559
|
+
console.log("✓ SSR routes loaded");
|
|
560
|
+
} else console.warn(`⚠ SSR routes not found: ${ssrRoutesPath}`);
|
|
561
|
+
}
|
|
561
562
|
server.get("/assets/:filename", async (request, reply) => {
|
|
562
563
|
const requestedFile = request.params.filename;
|
|
563
564
|
const assetsDir = path.join(webDistPath, "assets");
|
|
@@ -613,7 +614,8 @@ var init_sonamu = __esmMin((() => {
|
|
|
613
614
|
handler: async (request, reply) => {
|
|
614
615
|
const url = request.url;
|
|
615
616
|
console.log(`[SSR] Matched route: ${route.path}`);
|
|
616
|
-
const
|
|
617
|
+
const params = this.extractPathParams(route.path, url);
|
|
618
|
+
const html = await renderSSR(url, route, params, request, reply, config);
|
|
617
619
|
reply.type("text/html");
|
|
618
620
|
return html;
|
|
619
621
|
}
|
|
@@ -804,6 +806,10 @@ var init_sonamu = __esmMin((() => {
|
|
|
804
806
|
this.aotHttpValidatorRegistry = nextAotRegistry;
|
|
805
807
|
this.preparedApis = nextApis;
|
|
806
808
|
this.preparedModels = nextModels;
|
|
809
|
+
this.websocketRuntimeValue?.replaceRoutes(nextApis.flatMap((api) => api.websocketOptions ? [{
|
|
810
|
+
routeKey: api.path,
|
|
811
|
+
outEvents: api.websocketOptions.outEvents
|
|
812
|
+
}] : []));
|
|
807
813
|
}
|
|
808
814
|
createWebSocketUpgradeRequiredHandler() {
|
|
809
815
|
return async (_request, reply) => {
|
|
@@ -829,14 +835,13 @@ var init_sonamu = __esmMin((() => {
|
|
|
829
835
|
socket.close(1008, "WebSocket route not found");
|
|
830
836
|
return;
|
|
831
837
|
}
|
|
832
|
-
await this.createWebSocketHandler(matchedApi, config)(
|
|
838
|
+
await this.createWebSocketHandler(matchedApi, config)(socket, request);
|
|
833
839
|
}
|
|
834
840
|
createWebSocketHandlerForTesting(api, config) {
|
|
835
841
|
return this.createWebSocketHandler(api, config);
|
|
836
842
|
}
|
|
837
843
|
createWebSocketHandler(api, config) {
|
|
838
|
-
return async (
|
|
839
|
-
const socket = connection.socket;
|
|
844
|
+
return async (socket, request) => {
|
|
840
845
|
let wsContext = null;
|
|
841
846
|
let rawWs = null;
|
|
842
847
|
let preRegisterPhase = "guard";
|
|
@@ -846,7 +851,8 @@ var init_sonamu = __esmMin((() => {
|
|
|
846
851
|
preRegisterPhase = "query";
|
|
847
852
|
const reqBody = await this.parseWebSocketRequestParams(api, request);
|
|
848
853
|
preRegisterPhase = "register";
|
|
849
|
-
rawWs = this.websocketRuntime.registerConnection(socket, {
|
|
854
|
+
rawWs = await this.websocketRuntime.registerConnection(socket, {
|
|
855
|
+
routeKey: api.path,
|
|
850
856
|
outEvents: api.websocketOptions.outEvents,
|
|
851
857
|
inEvents: api.websocketOptions.inEvents,
|
|
852
858
|
namespace: api.websocketOptions.namespace,
|
|
@@ -867,7 +873,7 @@ var init_sonamu = __esmMin((() => {
|
|
|
867
873
|
api
|
|
868
874
|
});
|
|
869
875
|
});
|
|
870
|
-
this.websocketRuntime.activateConnection(rawWs.id);
|
|
876
|
+
await this.websocketRuntime.activateConnection(rawWs.id);
|
|
871
877
|
preRegisterPhase = "handler";
|
|
872
878
|
const { ApiParamType } = await import("../types/types.js");
|
|
873
879
|
const args = api.parameters.map((param) => {
|
|
@@ -1010,16 +1016,16 @@ var init_sonamu = __esmMin((() => {
|
|
|
1010
1016
|
return ws.waitForClose();
|
|
1011
1017
|
},
|
|
1012
1018
|
join(roomId) {
|
|
1013
|
-
ws.join(roomId);
|
|
1019
|
+
return ws.join(roomId);
|
|
1014
1020
|
},
|
|
1015
1021
|
leave(roomId) {
|
|
1016
|
-
ws.leave(roomId);
|
|
1022
|
+
return ws.leave(roomId);
|
|
1017
1023
|
},
|
|
1018
1024
|
setUserId(userId) {
|
|
1019
|
-
ws.setUserId(userId);
|
|
1025
|
+
return ws.setUserId(userId);
|
|
1020
1026
|
},
|
|
1021
1027
|
clearUserId() {
|
|
1022
|
-
ws.clearUserId();
|
|
1028
|
+
return ws.clearUserId();
|
|
1023
1029
|
}
|
|
1024
1030
|
};
|
|
1025
1031
|
}
|
|
@@ -1404,8 +1410,8 @@ var init_sonamu = __esmMin((() => {
|
|
|
1404
1410
|
"::1"
|
|
1405
1411
|
]);
|
|
1406
1412
|
}));
|
|
1407
|
-
|
|
1413
|
+
init_websocket_helpers();
|
|
1408
1414
|
init_sonamu();
|
|
1409
1415
|
export { Sonamu, createWebSocketReplyStub, defaultSonamuHttpValidatorDependencies, init_sonamu, resolveWebSocketCloseDescriptor, resolveWebSocketPluginOptions };
|
|
1410
1416
|
|
|
1411
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmpzIiwibmFtZXMiOlsibWltZUxvb2t1cCIsImxvZ3RhcGVEaXNwb3NlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zb25hbXUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiYXN5bmNfaG9va3NcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IHR5cGUgSW5jb21pbmdNZXNzYWdlLCB0eXBlIFNlcnZlciwgdHlwZSBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gXCJodHRwXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgXCJAZmFzdGlmeS93ZWJzb2NrZXRcIjtcbmltcG9ydCB7IGRpc3Bvc2UgYXMgbG9ndGFwZURpc3Bvc2UgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgdHlwZSBBdXRoLCB0eXBlIEJldHRlckF1dGhPcHRpb25zIH0gZnJvbSBcImJldHRlci1hdXRoXCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyB0eXBlIEZTV2F0Y2hlciB9IGZyb20gXCJjaG9raWRhclwiO1xuaW1wb3J0IHsgdHlwZSBGYXN0aWZ5SW5zdGFuY2UsIHR5cGUgRmFzdGlmeVJlcGx5LCB0eXBlIEZhc3RpZnlSZXF1ZXN0IH0gZnJvbSBcImZhc3RpZnlcIjtcbmltcG9ydCBtaW1lLCB7IGxvb2t1cCBhcyBtaW1lTG9va3VwIH0gZnJvbSBcIm1pbWUtdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0IH0gZnJvbSBcIndzXCI7XG5pbXBvcnQgeyB0eXBlIFpvZE9iamVjdCB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgQkFTRV9GSUVMRF9NQVBQSU5HUyB9IGZyb20gXCIuLi9hdXRoL2JldHRlci1hdXRoLWVudGl0aWVzXCI7XG5pbXBvcnQgeyBjcmVhdGVCZXR0ZXJBdXRoUmVxdWVzdCB9IGZyb20gXCIuLi9hdXRoL2JldHRlci1hdXRoLXJlcXVlc3RcIjtcbmltcG9ydCB7IGFwcGx5Q2FjaGVIZWFkZXJzLCBDYWNoZVByZXNldHMgfSBmcm9tIFwiLi4vY2FjaGUtY29udHJvbC9jYWNoZS1jb250cm9sXCI7XG5pbXBvcnQgeyB0eXBlIENhY2hlQ29udHJvbENvbmZpZywgdHlwZSBDYWNoZUNvbnRyb2xSZXF1ZXN0IH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgQ2FjaGVDb25maWcsIHR5cGUgQ2FjaGVNYW5hZ2VyIH0gZnJvbSBcIi4uL2NhY2hlL3R5cGVzXCI7XG5pbXBvcnQgeyB0b0Zhc3RpZnlDb21wcmVzc09wdGlvbiB9IGZyb20gXCIuLi9jb21wcmVzcy9jb21wcmVzc1wiO1xuaW1wb3J0IHsgdHlwZSBDb21wcmVzc09wdGlvbnMgfSBmcm9tIFwiLi4vY29tcHJlc3MvdHlwZXNcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBTRCwgc2V0U0RDb25maWcgfSBmcm9tIFwiLi4vZGljdC9zZFwiO1xuaW1wb3J0IHsgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgfSBmcm9tIFwiLi4vZGljdC90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0U29uYW11RW52aXJvbm1lbnQsIHJlYWRBbGxFbnZpcm9ubWVudFNuYXBzaG90cyB9IGZyb20gXCIuLi9lbnZcIjtcbmltcG9ydCB7IE5vdEZvdW5kRXhjZXB0aW9uIH0gZnJvbSBcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHsgcnVudGltZVR5cGVPZiB9IGZyb20gXCIuLi9ydW50aW1lLXR5cGVcIjtcbmltcG9ydCB7IEJ1ZmZlcmVkRmlsZSB9IGZyb20gXCIuLi9zdG9yYWdlL2J1ZmZlcmVkLWZpbGVcIjtcbmltcG9ydCB7IHR5cGUgU3RvcmFnZU1hbmFnZXIgfSBmcm9tIFwiLi4vc3RvcmFnZS9zdG9yYWdlLW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgS2V5R2VuZXJhdG9yIH0gZnJvbSBcIi4uL3N0b3JhZ2UvdHlwZXNcIjtcbmltcG9ydCB7IFVwbG9hZGVkRmlsZSB9IGZyb20gXCIuLi9zdG9yYWdlL3VwbG9hZGVkLWZpbGVcIjtcbmltcG9ydCB7IGNyZWF0ZU1vY2tTU0VGYWN0b3J5IH0gZnJvbSBcIi4uL3N0cmVhbS9zc2VcIjtcbmltcG9ydCB7XG4gIHR5cGUgQW55V2ViU29ja2V0Q29ubmVjdGlvbixcbiAgV2ViU29ja2V0UnVudGltZSxcbiAgdHlwZSBXZWJTb2NrZXRDb25uZWN0aW9uLFxufSBmcm9tIFwiLi4vc3RyZWFtL3dzXCI7XG5pbXBvcnQge1xuICB0eXBlIFRlbGVtZXRyeUNvbnRleHRQcm92aWRlcixcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCxcbn0gZnJvbSBcIi4uL3N0cmVhbS93cy10ZWxlbWV0cnlcIjtcbmltcG9ydCB7IHR5cGUgTG9hZGVkTW9kZWxzIH0gZnJvbSBcIi4uL3N5bmNlci9tb2R1bGUtbG9hZGVyXCI7XG5pbXBvcnQgeyB0eXBlIFN5bmNlciB9IGZyb20gXCIuLi9zeW5jZXIvc3luY2VyXCI7XG5pbXBvcnQgeyB0eXBlIFdvcmtmbG93TWFuYWdlciB9IGZyb20gXCIuLi90YXNrcy93b3JrZmxvdy1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIERldlZpdGVzdE1hbmFnZXIgfSBmcm9tIFwiLi4vdGVzdGluZy9kZXYtdml0ZXN0LW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgU29uYW11RmFzdGlmeUNvbmZpZyB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgY2VudGVyVGV4dCB9IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGlzRGFlbW9uU2VydmVyIH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IGV4aXN0cywgZmlsZUV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IHsgdHlwZSBBYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuaW1wb3J0IHtcbiAgaXNCaWdJbnRWYWx1ZSxcbiAgaXNGdW5jdGlvblZhbHVlLFxuICBpc051bWJlclZhbHVlLFxuICBpc09iamVjdFZhbHVlLFxuICBpc1N0cmluZ1ZhbHVlLFxuICBpc1N5bWJvbFZhbHVlLFxufSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgY29udmVydEZhc3RpZnlIZWFkZXJzVG9TdGFuZGFyZCwgbWVyZ2UgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZVpvZENvbXBpbGVyUG9saWN5LFxuICB0eXBlIFNvbmFtdUNvbmZpZyxcbiAgdHlwZSBTb25hbXVTZXJ2ZXJPcHRpb25zLFxuICB0eXBlIFNvbmFtdVRhc2tPcHRpb25zLFxufSBmcm9tIFwiLi9jb25maWdcIjtcbmltcG9ydCB7IHR5cGUgQ29udGV4dCwgdHlwZSBSdW50aW1lQ29udGV4dCwgdHlwZSBXZWJTb2NrZXRDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiO1xuaW1wb3J0IHsgdHlwZSBFeHRlbmRlZEFwaSB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIGFzc2VydEh0dHBWYWxpZGF0b3JSZWdpc3RyeSxcbiAgY3JlYXRlSHR0cFZhbGlkYXRvcixcbiAgZ2V0SHR0cFZhbGlkYXRvclJvdXRlS2V5LFxuICB0eXBlIEh0dHBWYWxpZGF0b3IsXG4gIHR5cGUgSHR0cFZhbGlkYXRvclJlZ2lzdHJ5LFxufSBmcm9tIFwiLi9odHRwLXZhbGlkYXRvclwiO1xuaW1wb3J0IHsgZ2V0U2VjcmV0cyB9IGZyb20gXCIuL3NlY3JldFwiO1xuaW1wb3J0IHsgdHlwZSBTb25hbXVTZWNyZXRzIH0gZnJvbSBcIi4vc2VjcmV0XCI7XG5pbXBvcnQge1xuICBjcmVhdGVXZWJTb2NrZXRSZXBseVN0dWIsXG4gIHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3IsXG4gIHJlc29sdmVXZWJTb2NrZXRQbHVnaW5PcHRpb25zLFxuICByZXNvbHZlSW50ZWdyYXRlZFZpdGVIbXJPcHRpb25zLFxufSBmcm9tIFwiLi93ZWJzb2NrZXQtaGVscGVyc1wiO1xuXG5leHBvcnQge1xuICBjcmVhdGVXZWJTb2NrZXRSZXBseVN0dWIsXG4gIHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3IsXG4gIHJlc29sdmVXZWJTb2NrZXRQbHVnaW5PcHRpb25zLFxufSBmcm9tIFwiLi93ZWJzb2NrZXQtaGVscGVyc1wiO1xuXG5pbnRlcmZhY2UgVXBsb2FkZWRSZXF1ZXN0RmlsZXMge1xuICBidWZmZXJlZEZpbGVzOiBCdWZmZXJlZEZpbGVbXTtcbiAgdXBsb2FkZWRGaWxlczogVXBsb2FkZWRGaWxlW107XG59XG5cbnR5cGUgQXBpQXJndW1lbnQgPVxuICB8IHN0cmluZ1xuICB8IG51bWJlclxuICB8IGJvb2xlYW5cbiAgfCBiaWdpbnRcbiAgfCBzeW1ib2xcbiAgfCBDYWxsYWJsZUZ1bmN0aW9uXG4gIHwgb2JqZWN0XG4gIHwgbnVsbFxuICB8IHVuZGVmaW5lZDtcbnR5cGUgQXBpTWV0aG9kUmVzdWx0ID0gQXBpQXJndW1lbnQgfCB2b2lkO1xuXG5mdW5jdGlvbiB0b0FwaUFyZ3VtZW50PFZhbHVlPih2YWx1ZTogVmFsdWUpOiBBcGlBcmd1bWVudCB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodmFsdWUgPT09IHRydWUpIHJldHVybiB0cnVlO1xuICBpZiAodmFsdWUgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gIGlmIChpc1N0cmluZ1ZhbHVlKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICBpZiAoaXNOdW1iZXJWYWx1ZSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgaWYgKGlzQmlnSW50VmFsdWUodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIGlmIChpc1N5bWJvbFZhbHVlKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICBpZiAoaXNGdW5jdGlvblZhbHVlKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICBpZiAoaXNPYmplY3RWYWx1ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwi7KeA7JuQ7ZWY7KeAIOyViuuKlCBBUEkg7J247IiYIO2DgOyeheyeheuLiOuLpC5cIik7XG59XG5cbmZ1bmN0aW9uIHRvQXBpQXJndW1lbnRNYXA8VmFsdWUgZXh0ZW5kcyBvYmplY3Q+KHZhbHVlOiBWYWx1ZSk6IE1hcDxzdHJpbmcsIEFwaUFyZ3VtZW50PiB7XG4gIHJldHVybiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKHZhbHVlKS5tYXAoKFtrZXksIGl0ZW1dKSA9PiBba2V5LCB0b0FwaUFyZ3VtZW50KGl0ZW0pXSkpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVVbmF2YWlsYWJsZVNTRTxUIGV4dGVuZHMgWm9kT2JqZWN0PihfZXZlbnRzOiBUKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgXCJjcmVhdGVTU0UgaXMgbm90IGF2YWlsYWJsZSBpbiB3ZWJzb2NrZXQgY29udGV4dC4gRGVmaW5lIHdlYnNvY2tldENvbnRleHRQcm92aWRlciBpZiB5b3VyIGNvbnRleHQgc2V0dXAgZGVwZW5kcyBvbiBTU0UgaGVscGVycy5cIixcbiAgKTtcbn1cblxuZnVuY3Rpb24gcHJpbnREaW1TdW1tYXJ5KG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYOKckyAke21lc3NhZ2V9YCkpO1xufVxuXG5mdW5jdGlvbiBwcmludEdyZWVuU3VtbWFyeShtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyAke21lc3NhZ2V9YCkpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvbmFtdVRlc3RpbmdTbmFwc2hvdCB7XG4gIGFwaVJvb3RQYXRoOiBBYnNvbHV0ZVBhdGggfCBudWxsO1xuICBjb25maWc6IFNvbmFtdUNvbmZpZyB8IG51bGw7XG4gIHN5bmNlcjogU3luY2VyIHwgbnVsbDtcbiAgaHR0cFZhbGlkYXRvcnM6IFdlYWtNYXA8RXh0ZW5kZWRBcGksIEh0dHBWYWxpZGF0b3I+O1xuICBwZW5kaW5nSHR0cFZhbGlkYXRvcnM6IFdlYWtNYXA8RXh0ZW5kZWRBcGksIFByb21pc2U8SHR0cFZhbGlkYXRvcj4+O1xuICBhb3RIdHRwVmFsaWRhdG9yUmVnaXN0cnk6IEh0dHBWYWxpZGF0b3JSZWdpc3RyeSB8IHVuZGVmaW5lZDtcbiAgcHJlcGFyZWRBcGlzOiByZWFkb25seSBFeHRlbmRlZEFwaVtdO1xuICBwcmVwYXJlZE1vZGVsczogTG9hZGVkTW9kZWxzO1xuICB3ZWJzb2NrZXRSdW50aW1lOiBXZWJTb2NrZXRSdW50aW1lIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTb25hbXVIdHRwVmFsaWRhdG9yRGVwZW5kZW5jaWVzIHtcbiAgY3JlYXRlVmFsaWRhdG9yOiB0eXBlb2YgY3JlYXRlSHR0cFZhbGlkYXRvcjtcbiAgYXNzZXJ0UmVnaXN0cnk6IHR5cGVvZiBhc3NlcnRIdHRwVmFsaWRhdG9yUmVnaXN0cnk7XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0U29uYW11SHR0cFZhbGlkYXRvckRlcGVuZGVuY2llczogU29uYW11SHR0cFZhbGlkYXRvckRlcGVuZGVuY2llcyA9IHtcbiAgY3JlYXRlVmFsaWRhdG9yOiBjcmVhdGVIdHRwVmFsaWRhdG9yLFxuICBhc3NlcnRSZWdpc3RyeTogYXNzZXJ0SHR0cFZhbGlkYXRvclJlZ2lzdHJ5LFxufTtcblxuY2xhc3MgU29uYW11Q2xhc3Mge1xuICBwdWJsaWMgaXNJbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgZm9yVGVzdGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgYXN5bmNMb2NhbFN0b3JhZ2U6IEFzeW5jTG9jYWxTdG9yYWdlPHtcbiAgICBjb250ZXh0OiBSdW50aW1lQ29udGV4dDtcbiAgfT4gPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2UoKTtcbiAgcHJpdmF0ZSBodHRwVmFsaWRhdG9yczogV2Vha01hcDxFeHRlbmRlZEFwaSwgSHR0cFZhbGlkYXRvcj4gPSBuZXcgV2Vha01hcCgpO1xuICBwcml2YXRlIHBlbmRpbmdIdHRwVmFsaWRhdG9yczogV2Vha01hcDxFeHRlbmRlZEFwaSwgUHJvbWlzZTxIdHRwVmFsaWRhdG9yPj4gPSBuZXcgV2Vha01hcCgpO1xuICBwcml2YXRlIGFvdEh0dHBWYWxpZGF0b3JSZWdpc3RyeTogSHR0cFZhbGlkYXRvclJlZ2lzdHJ5IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHByZXBhcmVkQXBpczogcmVhZG9ubHkgRXh0ZW5kZWRBcGlbXSA9IFtdO1xuICBwcml2YXRlIHByZXBhcmVkTW9kZWxzOiBMb2FkZWRNb2RlbHMgPSB7fTtcblxuICBwdWJsaWMgZ2V0Q29udGV4dDxUIGV4dGVuZHMgUnVudGltZUNvbnRleHQgPSBDb250ZXh0PigpOiBUIHtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICBpZiAoc3RvcmU/LmNvbnRleHQpIHtcbiAgICAgIHJldHVybiAvKiBTQUZFVFk6IEFQSSDrjbDsvZTroIjsnbTthLDsmYAgWm9kIOqygOymneq4sCDrk7HroZ0g6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gc3RvcmUuY29udGV4dCBhcyBUO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCIpIHtcbiAgICAgIC8vIO2FjOyKpO2MhSDtmZjqsr3sl5DshJwg7Luo7YWN7Iqk7Yq46rCAIOyjvOyeheuQmOyngCDslYrsnYAg6rK97JqwIOu5iCDsu6jthY3siqTtirgg66as7YS0XG4gICAgICBjb25zdCBtb2NrQ29udGV4dCA9IHtcbiAgICAgICAgdHJhbnNwb3J0OiBcImh0dHBcIixcbiAgICAgICAgcmVxdWVzdDogbnVsbCxcbiAgICAgICAgcmVwbHk6IG51bGwsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBjcmVhdGVTU0U6IChzY2hlbWE6IFpvZE9iamVjdCkgPT4gY3JlYXRlTW9ja1NTRUZhY3Rvcnkoc2NoZW1hKSxcbiAgICAgICAgbG9jYWxlOiBcIlwiLFxuICAgICAgICB1c2VyOiBudWxsLFxuICAgICAgICBzZXNzaW9uOiBudWxsLFxuICAgICAgICBuYWl0ZVN0b3JlOiBuZXcgTWFwPHN0cmluZywgYW55PigpLFxuICAgICAgfTtcbiAgICAgIC8vIFNBRkVUWTog7YWM7Iqk7Yq4IOq4sOuzuCDsu6jthY3siqTtirjripQgSFRUUCBDb250ZXh07J2066mwIOq4sOuzuCDsoJzrhKTrpq3qs7wg7J287LmY7ZWc64ukLlxuICAgICAgcmV0dXJuIC8qIFNBRkVUWTog7YWM7Iqk7Yq4IOq4sOuzuCDsu6jthY3siqTtirjripQg7JqU7LKtIOuylOychOqwgCDsl4bripQgSFRUUCDsu6jthY3siqTtirgg64yA7LK06rCS7J6F64uI64ukLiAqLyBtb2NrQ29udGV4dCBhcyBUICZcbiAgICAgICAgdHlwZW9mIG1vY2tDb250ZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgY2Fubm90IGZpbmQgY29udGV4dFwiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwaVJvb3RQYXRoVmFsdWU6IEFic29sdXRlUGF0aCB8IG51bGwgPSBudWxsO1xuICBzZXQgYXBpUm9vdFBhdGgoYXBpUm9vdFBhdGg6IEFic29sdXRlUGF0aCkge1xuICAgIHRoaXMuYXBpUm9vdFBhdGhWYWx1ZSA9IGFwaVJvb3RQYXRoO1xuICB9XG4gIGdldCBhcGlSb290UGF0aCgpOiBBYnNvbHV0ZVBhdGgge1xuICAgIGlmICh0aGlzLmFwaVJvb3RQYXRoVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFwaVJvb3RQYXRoVmFsdWU7XG4gIH1cbiAgZ2V0IGFwcFJvb3RQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXBpUm9vdFBhdGguc3BsaXQocGF0aC5zZXApLnNsaWNlKDAsIC0xKS5qb2luKHBhdGguc2VwKTtcbiAgfVxuXG4gIHByaXZhdGUgZGJDb25maWdWYWx1ZTogU29uYW11REJDb25maWcgfCBudWxsID0gbnVsbDtcbiAgc2V0IGRiQ29uZmlnKGRiQ29uZmlnOiBTb25hbXVEQkNvbmZpZykge1xuICAgIHRoaXMuZGJDb25maWdWYWx1ZSA9IGRiQ29uZmlnO1xuICB9XG4gIGdldCBkYkNvbmZpZygpOiBTb25hbXVEQkNvbmZpZyB7XG4gICAgaWYgKHRoaXMuZGJDb25maWdWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGJDb25maWdWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3luY2VyVmFsdWU6IFN5bmNlciB8IG51bGwgPSBudWxsO1xuICBzZXQgc3luY2VyKHN5bmNlcjogU3luY2VyKSB7XG4gICAgdGhpcy5zeW5jZXJWYWx1ZSA9IHN5bmNlcjtcbiAgfVxuICBnZXQgc3luY2VyKCk6IFN5bmNlciB7XG4gICAgaWYgKHRoaXMuc3luY2VyVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN5bmNlclZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25maWdWYWx1ZTogU29uYW11Q29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHNldCBjb25maWcoY29uZmlnOiBTb25hbXVDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZ1ZhbHVlID0gY29uZmlnO1xuICB9XG4gIGdldCBjb25maWcoKTogU29uYW11Q29uZmlnIHtcbiAgICBpZiAodGhpcy5jb25maWdWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgc2VjcmV0czogU29uYW11U2VjcmV0cyA9IGdldFNlY3JldHMoKTtcblxuICBwcml2YXRlIHN0b3JhZ2VWYWx1ZTogU3RvcmFnZU1hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFN0b3JhZ2VNYW5hZ2VyIOyduOyKpO2EtOyKpFxuICAgKi9cbiAgZ2V0IHN0b3JhZ2UoKTogU3RvcmFnZU1hbmFnZXIge1xuICAgIGlmICghdGhpcy5zdG9yYWdlVmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0b3JhZ2UgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiBDaGVjayBzdG9yYWdlIGNvbmZpZy5cIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0b3JhZ2VWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgY2FjaGVWYWx1ZTogQ2FjaGVNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBDYWNoZU1hbmFnZXIg7J247Iqk7YS07IqkIChCZW50b0NhY2hlKVxuICAgKi9cbiAgZ2V0IGNhY2hlKCk6IENhY2hlTWFuYWdlciB7XG4gICAgaWYgKCF0aGlzLmNhY2hlVmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhY2hlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gQ2hlY2sgY2FjaGUgY29uZmlnIGluIHNvbmFtdS5jb25maWcudHMuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jYWNoZVZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSB3b3JrZmxvd3NWYWx1ZTogV29ya2Zsb3dNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIGdldCB3b3JrZmxvd3MoKTogV29ya2Zsb3dNYW5hZ2VyIHtcbiAgICBpZiAodGhpcy53b3JrZmxvd3NWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy53b3JrZmxvd3NWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXV0aFZhbHVlOiBBdXRoPEJldHRlckF1dGhPcHRpb25zPiB8IG51bGwgPSBudWxsO1xuICBnZXQgYXV0aCgpOiBBdXRoPEJldHRlckF1dGhPcHRpb25zPiB7XG4gICAgaWYgKCF0aGlzLmF1dGhWYWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXV0aCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuIENoZWNrIGF1dGggY29uZmlnIGluIHNvbmFtdS5jb25maWcudHMuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hdXRoVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGRldlZpdGVzdE1hbmFnZXJWYWx1ZTogRGV2Vml0ZXN0TWFuYWdlciB8IG51bGwgPSBudWxsO1xuICBnZXQgZGV2Vml0ZXN0TWFuYWdlcigpOiBEZXZWaXRlc3RNYW5hZ2VyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZGV2Vml0ZXN0TWFuYWdlclZhbHVlO1xuICB9XG4gIHNldCBkZXZWaXRlc3RNYW5hZ2VyKG1hbmFnZXI6IERldlZpdGVzdE1hbmFnZXIgfCBudWxsKSB7XG4gICAgdGhpcy5kZXZWaXRlc3RNYW5hZ2VyVmFsdWUgPSBtYW5hZ2VyO1xuICB9XG5cbiAgLy8gU29uYW116rCAIHJ1bnRpbWXsnYQg7KeB7KCRIOyGjOycoO2VtCByZWdpc3RyeS9jb25uZWN0aW9uIGxpZmVjeWNsZeydhCDslaDtlIzrpqzsvIDsnbTshZgg7IiY66qF7KO86riw7JmAIOuPmeq4sO2ZlO2VqFxuICBwcml2YXRlIHdlYnNvY2tldFJ1bnRpbWVWYWx1ZTogV2ViU29ja2V0UnVudGltZSB8IG51bGwgPSBudWxsO1xuICAvLyDqsJnsnYAgRmFzdGlmeSDsnbjsiqTthLTsiqTsl5AgQGZhc3RpZnkvd2Vic29ja2V07J2EIOykkeuztSDrk7HroZ3tlZjripQg6rKD7J2EIFdlYWtTZXTsnLzroZwg7LCo64uo7ZWoXG4gIHByaXZhdGUgcmVhZG9ubHkgd2Vic29ja2V0UGx1Z2luU2VydmVycyA9IG5ldyBXZWFrU2V0PFxuICAgIEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+XG4gID4oKTtcbiAgZ2V0IHdlYnNvY2tldFJ1bnRpbWUoKTogV2ViU29ja2V0UnVudGltZSB7XG4gICAgaWYgKCF0aGlzLndlYnNvY2tldFJ1bnRpbWVWYWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV2ViU29ja2V0IHJ1bnRpbWUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMud2Vic29ja2V0UnVudGltZVZhbHVlO1xuICB9XG4gIHNldCB3ZWJzb2NrZXRSdW50aW1lKHJ1bnRpbWU6IFdlYlNvY2tldFJ1bnRpbWUgfCBudWxsKSB7XG4gICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lVmFsdWUgPSBydW50aW1lO1xuICB9XG5cbiAgY2FwdHVyZVRlc3RpbmdTbmFwc2hvdCgpOiBTb25hbXVUZXN0aW5nU25hcHNob3Qge1xuICAgIHJldHVybiB7XG4gICAgICBhcGlSb290UGF0aDogdGhpcy5hcGlSb290UGF0aFZhbHVlLFxuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZ1ZhbHVlLFxuICAgICAgc3luY2VyOiB0aGlzLnN5bmNlclZhbHVlLFxuICAgICAgaHR0cFZhbGlkYXRvcnM6IHRoaXMuaHR0cFZhbGlkYXRvcnMsXG4gICAgICBwZW5kaW5nSHR0cFZhbGlkYXRvcnM6IHRoaXMucGVuZGluZ0h0dHBWYWxpZGF0b3JzLFxuICAgICAgYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5OiB0aGlzLmFvdEh0dHBWYWxpZGF0b3JSZWdpc3RyeSxcbiAgICAgIHByZXBhcmVkQXBpczogdGhpcy5wcmVwYXJlZEFwaXMsXG4gICAgICBwcmVwYXJlZE1vZGVsczogdGhpcy5wcmVwYXJlZE1vZGVscyxcbiAgICAgIHdlYnNvY2tldFJ1bnRpbWU6IHRoaXMud2Vic29ja2V0UnVudGltZVZhbHVlLFxuICAgIH07XG4gIH1cblxuICByZXN0b3JlVGVzdGluZ1NuYXBzaG90KHNuYXBzaG90OiBTb25hbXVUZXN0aW5nU25hcHNob3QpOiB2b2lkIHtcbiAgICB0aGlzLmFwaVJvb3RQYXRoVmFsdWUgPSBzbmFwc2hvdC5hcGlSb290UGF0aDtcbiAgICB0aGlzLmNvbmZpZ1ZhbHVlID0gc25hcHNob3QuY29uZmlnO1xuICAgIHRoaXMuc3luY2VyVmFsdWUgPSBzbmFwc2hvdC5zeW5jZXI7XG4gICAgdGhpcy5odHRwVmFsaWRhdG9ycyA9IHNuYXBzaG90Lmh0dHBWYWxpZGF0b3JzO1xuICAgIHRoaXMucGVuZGluZ0h0dHBWYWxpZGF0b3JzID0gc25hcHNob3QucGVuZGluZ0h0dHBWYWxpZGF0b3JzO1xuICAgIHRoaXMuYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5ID0gc25hcHNob3QuYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5O1xuICAgIHRoaXMucHJlcGFyZWRBcGlzID0gc25hcHNob3QucHJlcGFyZWRBcGlzO1xuICAgIHRoaXMucHJlcGFyZWRNb2RlbHMgPSBzbmFwc2hvdC5wcmVwYXJlZE1vZGVscztcbiAgICB0aGlzLndlYnNvY2tldFJ1bnRpbWVWYWx1ZSA9IHNuYXBzaG90LndlYnNvY2tldFJ1bnRpbWU7XG4gIH1cblxuICAvLyBITVIg7LKY66asOiDtjIzsnbwg7Iuc7Iqk7YWcIOqwkOyLnCArIEhNUi9zeW5jIOyCrOydtO2BtCDsi6TtlonsnYAgd2F0Y2hlciDrqqjrk4jroZwg7JyE7J6E7ZWp64uI64ukLlxuICBwdWJsaWMgd2F0Y2hlcjogRlNXYXRjaGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlIHwgbnVsbCA9IG51bGw7XG5cbiAgYXN5bmMgaW5pdEZvclRlc3RpbmcoKSB7XG4gICAgYXdhaXQgdGhpcy5pbml0KHRydWUsIGZhbHNlLCB1bmRlZmluZWQsIHRydWUpO1xuICB9XG5cbiAgYXN5bmMgaW5pdChcbiAgICBkb1NpbGVudDogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGVuYWJsZVN5bmM6IGJvb2xlYW4gPSB0cnVlLFxuICAgIGFwaVJvb3RQYXRoPzogQWJzb2x1dGVQYXRoLFxuICAgIGZvclRlc3Rpbmc6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKSB7XG4gICAgdGhpcy5mb3JUZXN0aW5nID0gZm9yVGVzdGluZztcblxuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpbml0U3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICAgIC8vIEFQSSDro6jtirgg7Yyo7IqkXG4gICAgY29uc3QgeyBmaW5kQXBpUm9vdFBhdGggfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3V0aWxzXCIpO1xuICAgIHRoaXMuYXBpUm9vdFBhdGggPSBhcGlSb290UGF0aCA/PyBmaW5kQXBpUm9vdFBhdGgoKTtcbiAgICBjb25zdCBiYXNlRW52QmVmb3JlQ29uZmlnTG9hZCA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcblxuICAgIC8vIOyEpOygleydhCDroZzrlKntlZjripQg6rKD67aA7YSwIOyLnOyekVxuICAgIGNvbnN0IGNvbmZpZ1N0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgeyBsb2FkQ29uZmlnIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2NvbmZpZ1wiKTtcbiAgICB0aGlzLmNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcodGhpcy5hcGlSb290UGF0aCk7XG4gICAgY29uc3QgY29uZmlnVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gY29uZmlnU3RhcnQ7XG4gICAgc2V0U0RDb25maWcodGhpcy5jb25maWcuaTE4bik7XG4gICAgLy8gc29uYW11LmNvbmZpZy50cyDquLDrs7jqsJIg7ISk7KCVXG4gICAgdGhpcy5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSA/PyBcInBnXCI7XG4gICAgdGhpcy5jb25maWcuZGF0YWJhc2UuZGVmYXVsdE9wdGlvbnMgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kZWZhdWx0T3B0aW9ucyA/PyB7fTtcbiAgICB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kZWZhdWx0T3B0aW9ucy5jbGllbnQgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSA/PyBcInBnXCI7XG5cbiAgICAvLyDroZzquYUg7ISk7KCVXG4gICAgY29uc3QgeyBjb25maWd1cmVMb2dUYXBlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9sb2dnZXIvY29uZmlndXJlXCIpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5sb2dnaW5nICE9PSBmYWxzZSkge1xuICAgICAgYXdhaXQgY29uZmlndXJlTG9nVGFwZSh7XG4gICAgICAgIC4uLnRoaXMuY29uZmlnLmxvZ2dpbmcsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEQiDroZzrk5xcbiAgICBjb25zdCB7IERCOiBSdW50aW1lREIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2RiXCIpO1xuICAgIGNvbnN0IHsgaXNMb2NhbDogaXNMb2NhbEVudmlyb25tZW50IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGNvbnN0IGVudmlyb25tZW50U25hcHNob3RzID0gaXNMb2NhbEVudmlyb25tZW50KClcbiAgICAgID8gcmVhZEFsbEVudmlyb25tZW50U25hcHNob3RzKHRoaXMuYXBpUm9vdFBhdGgsIGJhc2VFbnZCZWZvcmVDb25maWdMb2FkKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5kYkNvbmZpZyA9IFJ1bnRpbWVEQi5nZW5lcmF0ZURCQ29uZmlnKFxuICAgICAgdGhpcy5jb25maWcuZGF0YWJhc2UsXG4gICAgICB0aGlzLmNvbmZpZy5wcm9qZWN0TmFtZSxcbiAgICAgIGVudmlyb25tZW50U25hcHNob3RzLFxuICAgICk7XG4gICAgUnVudGltZURCLnNldENvbmZpZyh0aGlzLmRiQ29uZmlnKTtcblxuICAgIC8vIEVudGl0eSDroZzrk5xcbiAgICAvLyDthYzsiqTtirjsl5DshJzrj4QgRW50aXR5IOygleuztOuKlCDtlYTsmpTtlanri4jri6QuXG4gICAgLy8gdXBzZXJ06rCAIOygnOuMgOuhnCDsnpHrj5ntlZjroKTrqbQgZW50aXR57J2YIHVuaXF1ZSBpbmRleCDsoJXrs7TqsIAg7ZWE7JqU7ZWY6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICBjb25zdCB7IEVudGl0eU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiKTtcbiAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKGRvU2lsZW50KTtcblxuICAgIC8vIENhY2hlIOy0iOq4sO2ZlFxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZUNhY2hlKHRoaXMuY29uZmlnLnNlcnZlci5jYWNoZSwgZm9yVGVzdGluZyk7XG5cbiAgICAvLyBCZXR0ZXJBdXRoIOy0iOq4sO2ZlFxuICAgIGNvbnN0IGF1dGhDb25maWcgPSB0aGlzLmNvbmZpZy5zZXJ2ZXIuYXV0aDtcbiAgICBpZiAoYXV0aENvbmZpZykge1xuICAgICAgLy8g7IKs7Jqp7J6QIOyEpOygleqzvCDquLDrs7jqsJLsnYQgbWVyZ2VcbiAgICAgIGNvbnN0IG1lcmdlZEZpZWxkTWFwcGluZ3MgPSBtZXJnZShCQVNFX0ZJRUxEX01BUFBJTkdTLCBhdXRoQ29uZmlnKTtcblxuICAgICAgLy8gYmV0dGVyLWF1dGgg7J247Iqk7YS07IqkIOyDneyEsVxuICAgICAgY29uc3QgeyBiZXR0ZXJBdXRoIH0gPSBhd2FpdCBpbXBvcnQoXCJiZXR0ZXItYXV0aFwiKTtcbiAgICAgIGNvbnN0IHsgc29uYW11S25leEFkYXB0ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2F1dGgva25leC1hZGFwdGVyXCIpO1xuXG4gICAgICBjb25zdCBhdXRoT3B0aW9uczogQmV0dGVyQXV0aE9wdGlvbnMgPSB7XG4gICAgICAgIGRhdGFiYXNlOiBzb25hbXVLbmV4QWRhcHRlcigpLFxuICAgICAgICAuLi5tZXJnZWRGaWVsZE1hcHBpbmdzLFxuICAgICAgfTtcbiAgICAgIHRoaXMuYXV0aFZhbHVlID0gYmV0dGVyQXV0aChhdXRoT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8g7YWM7Iqk7YyF7J24IOqyveyasCDsi7Htgawg7JeG7J20IOykkeuLqFxuICAgIGlmIChmb3JUZXN0aW5nKSB7XG4gICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRhc2sg65Ox66GdXG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplV29ya2Zsb3dzKHRoaXMuY29uZmlnLnRhc2tzKTtcblxuICAgIC8vIFN5bmNlclxuICAgIGNvbnN0IHsgU3luY2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zeW5jZXIvc3luY2VyXCIpO1xuICAgIHRoaXMuc3luY2VyID0gbmV3IFN5bmNlcigpO1xuXG4gICAgLy8gQXV0b2xvYWQ6IE1vZGVscyAvIFR5cGVzIC8gQVBJcyAvIFdvcmtmbG93cyAvIFRlbXBsYXRlcyAvIFNTUiBSb3V0ZXNcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRNb2RlbHMoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZEFwaXMoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZFdvcmtmbG93cygpO1xuICAgIGNvbnN0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90ZW1wbGF0ZVwiKTtcbiAgICBhd2FpdCBUZW1wbGF0ZU1hbmFnZXIuYXV0b2xvYWQoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZFNzclJvdXRlcygpO1xuXG4gICAgY29uc3QgeyBpc0xvY2FsLCBpc1Rlc3QsIGlzSG90UmVsb2FkU2VydmVyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGlmIChpc0xvY2FsKCkgJiYgIWlzVGVzdCgpICYmIGlzSG90UmVsb2FkU2VydmVyKCkgJiYgZW5hYmxlU3luYykge1xuICAgICAgYXdhaXQgdGhpcy5zeW5jZXIuc3luYygpO1xuICAgICAgYXdhaXQgdGhpcy5zdGFydFdhdGNoZXIoKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIHRoaXMuaW5pdEVsYXBzZWQgPSBwZXJmb3JtYW5jZS5ub3coKSAtIGluaXRTdGFydDtcbiAgICB0aGlzLmNvbmZpZ0VsYXBzZWQgPSBjb25maWdUaW1lO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0RWxhcHNlZCA9IDA7XG4gIHByaXZhdGUgY29uZmlnRWxhcHNlZCA9IDA7XG5cbiAgYXN5bmMgY3JlYXRlU2VydmVyKGluaXRPcHRpb25zPzogeyBlbmFibGVTeW5jPzogYm9vbGVhbjsgZG9TaWxlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0KGluaXRPcHRpb25zPy5kb1NpbGVudCwgaW5pdE9wdGlvbnM/LmVuYWJsZVN5bmMpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmNvbmZpZy5zZXJ2ZXI7XG4gICAgY29uc3QgeyBkZWZhdWx0OiBmYXN0aWZ5IH0gPSBhd2FpdCBpbXBvcnQoXCJmYXN0aWZ5XCIpO1xuICAgIGNvbnN0IHsgZ2V0TG9nVGFwZUZhc3RpZnlMb2dnZXIgfSA9IGF3YWl0IGltcG9ydChcIkBsb2d0YXBlL2Zhc3RpZnlcIik7XG4gICAgY29uc3Qgc2VydmVyID0gZmFzdGlmeSh7XG4gICAgICAuLi5vcHRpb25zLmZhc3RpZnksXG4gICAgICBsb2dnZXI6XG4gICAgICAgIHRoaXMuY29uZmlnLmxvZ2dpbmcgIT09IGZhbHNlXG4gICAgICAgICAgPyBnZXRMb2dUYXBlRmFzdGlmeUxvZ2dlcih7XG4gICAgICAgICAgICAgIGNhdGVnb3J5OiB0aGlzLmNvbmZpZy5sb2dnaW5nPy5mYXN0aWZ5Q2F0ZWdvcnkgPz8gW1wiZmFzdGlmeVwiXSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lID0gbmV3IFdlYlNvY2tldFJ1bnRpbWUob3B0aW9ucy53ZWJzb2NrZXQpO1xuXG4gICAgLy8gU3RvcmFnZSDshKTsoJUg4oaSIFN0b3JhZ2VNYW5hZ2VyIOyDneyEsVxuICAgIGlmIChvcHRpb25zLnN0b3JhZ2UpIHtcbiAgICAgIGNvbnN0IHsgU3RvcmFnZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N0b3JhZ2Uvc3RvcmFnZS1tYW5hZ2VyXCIpO1xuICAgICAgdGhpcy5zdG9yYWdlVmFsdWUgPSBuZXcgU3RvcmFnZU1hbmFnZXIob3B0aW9ucy5zdG9yYWdlKTtcbiAgICB9XG5cbiAgICAvLyDtlIzrn6zqt7jsnbgg65Ox66GdXG4gICAgaWYgKG9wdGlvbnMucGx1Z2lucykge1xuICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlclBsdWdpbnMoc2VydmVyLCBvcHRpb25zLnBsdWdpbnMpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmF1dGgpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJCZXR0ZXJBdXRoKHNlcnZlciwgb3B0aW9ucy5hdXRoKTtcbiAgICB9XG5cbiAgICAvLyBBUEkg65287Jqw7YyFIOyEpOyglVxuICAgIGF3YWl0IHRoaXMud2l0aEZhc3RpZnkoc2VydmVyLCBvcHRpb25zLmFwaUNvbmZpZywge1xuICAgICAgZW5hYmxlU3luYzogaW5pdE9wdGlvbnM/LmVuYWJsZVN5bmMsXG4gICAgICBkb1NpbGVudDogaW5pdE9wdGlvbnM/LmRvU2lsZW50LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyLnOyekVxuICAgIGF3YWl0IHRoaXMuYm9vdChzZXJ2ZXIsIG9wdGlvbnMpO1xuXG4gICAgaWYgKCFpbml0T3B0aW9ucz8uZG9TaWxlbnQpIHtcbiAgICAgIHRoaXMucHJpbnRTdGFydHVwU3VtbWFyeSgpO1xuICAgIH1cblxuICAgIHJldHVybiBzZXJ2ZXI7XG4gIH1cblxuICBhc3luYyB3aXRoRmFzdGlmeShcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgZW5hYmxlU3luYz86IGJvb2xlYW47XG4gICAgICBkb1NpbGVudD86IGJvb2xlYW47XG4gICAgfSxcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdChvcHRpb25zPy5kb1NpbGVudCwgb3B0aW9ucz8uZW5hYmxlU3luYyk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lID8/PSBuZXcgV2ViU29ja2V0UnVudGltZSh0aGlzLmNvbmZpZy5zZXJ2ZXIud2Vic29ja2V0KTtcbiAgICBhd2FpdCB0aGlzLnJlZnJlc2hIdHRwVmFsaWRhdG9ycygpO1xuXG4gICAgLy8gdGltZXpvbmUg7ISk7KCVXG4gICAgY29uc3QgdGltZXpvbmUgPSB0aGlzLmNvbmZpZy5hcGkudGltZXpvbmU7XG4gICAgaWYgKHRpbWV6b25lKSB7XG4gICAgICAvLyDtg4DsnoTsobTsl5Ag66ee6rKMIOydkeuLtSDrgqDsp5wg7Iqk7Yq466eB7J2EIOuzgO2ZmO2VtOyjvOyWtOyVvCDtlanri4jri6QuXG4gICAgICAvLyDqsIDroLkgdGltZXpvbmXsnbQgXCJBc2lhL1Nlb3VsXCIg7J2066m0XG4gICAgICAvLyBcIjIwMjUtMTEtMjFUMDA6MDA6MDAuMDAwWlwiIOulvCBcIjIwMjUtMTEtMjFUMDk6MDA6MDArMDk6MDBcIiDsnLzroZwg67OA7ZmY7ZW07KO87Ja07JW8IO2VqeuLiOuLpC5cbiAgICAgIGNvbnN0IHsgZm9ybWF0SW5UaW1lWm9uZSB9ID0gYXdhaXQgaW1wb3J0KFwiZGF0ZS1mbnMtdHpcIik7XG5cbiAgICAgIC8vIElTTyA4NjAxIOuCoOynnCDtmJXsi50g7KCV6rec7IudICjsmIg6IDIwMjQtMDEtMTVUMDk6MzA6MDAuMDAwWilcbiAgICAgIGNvbnN0IElTT19EQVRFX1JFR0VYID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfShcXC5cXGR7M30pP1okLztcblxuICAgICAgLy8gVOulvCDrkZjrn6zsi7wg7J6R7J2A65Sw7Ji07ZGc6rCAIOyXhuuLpOuptCBcIjIwMjUtMTEtMTkxNzYzNTQ2MTg5MDAwMTg6NTY6MjkrMDk6MDBcIuyZgCDqsJnsnYAg6rKw6rO86rCAIOuCmOyYteuLiOuLpC5cbiAgICAgIC8vIOydtOuKlCBkYXRlLWZucyDtirnsnoXri4jri6QuXG4gICAgICAvLyDsnbTroIfqsowg7ZW064+EIOq0nOywruyKteuLiOuLpC4gXCIyMDI1LTExLTE5VDE4OjU2OjI5KzA5OjAwXCIg66qo7JaR7Jy866GcIOyemCDrgpjsmLXri4jri6QuXG4gICAgICBjb25zdCBEQVRFX0ZPUk1BVCA9IFwieXl5eS1NTS1kZCdUJ0hIOm1tOnNzWFhYXCI7XG5cbiAgICAgIHNlcnZlci5zZXRSZXBseVNlcmlhbGl6ZXIoKHBheWxvYWQpID0+IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBheWxvYWQsIChfa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHZhbHVlKSAmJiBJU09fREFURV9SRUdFWC50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdEluVGltZVpvbmUoXG4gICAgICAgICAgICAgIG5ldyBEYXRlKHZhbHVlKSxcbiAgICAgICAgICAgICAgLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHRpbWV6b25lIGFzIGAke3N0cmluZ30vJHtzdHJpbmd9YCxcbiAgICAgICAgICAgICAgREFURV9GT1JNQVQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICAvLyBUaW1lem9uZSDroZzqt7jripQgcHJpbnRTdGFydHVwU3VtbWFyeeyXkOyEnCDthrXtlakg7Lac66ClXG4gICAgfVxuXG4gICAgLy8g7KCE7LK0IOudvOyasO2MhSDrpqzsiqTtirhcbiAgICBzZXJ2ZXIuZ2V0KFxuICAgICAgYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vcm91dGVzYCxcbiAgICAgIGFzeW5jIChfcmVxdWVzdCwgX3JlcGx5KTogUHJvbWlzZTx0eXBlb2YgdGhpcy5zeW5jZXIuYXBpcz4gPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jZXIuYXBpcztcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIEhlYWx0aGNoZWNrIEFQSVxuICAgIHNlcnZlci5nZXQoXG4gICAgICBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS9oZWFsdGhjaGVja2AsXG4gICAgICBhc3luYyAoX3JlcXVlc3QsIF9yZXBseSk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgICAgIHJldHVybiBcIm9rXCI7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBTb25hbXUgVUkgQVBJICjroZzsu6wg7ZmY6rK97JeQ7ISc66eMKVxuICAgIGNvbnN0IHsgaXNMb2NhbCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBpZiAoaXNMb2NhbCgpKSB7XG4gICAgICBjb25zdCB7IHNvbmFtdVVJQXBpUGx1Z2luIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91aS9hcGlcIik7XG4gICAgICBzZXJ2ZXIucmVnaXN0ZXIoc29uYW11VUlBcGlQbHVnaW4pO1xuICAgIH1cblxuICAgIC8vIERldlJ1bm5lciDthYzsiqTtirgg7JeU65Oc7Y+s7J247Yq4ICjroZzsu6wg7ZmY6rK9ICsgZGV2UnVubmVyIO2ZnOyEse2ZlCDsi5wpXG4gICAgaWYgKGlzTG9jYWwoKSAmJiB0aGlzLmNvbmZpZy50ZXN0Py5kZXZSdW5uZXI/LmVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IHsgcmVnaXN0ZXJEZXZUZXN0Um91dGVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90ZXN0aW5nL2Rldi10ZXN0LXJvdXRlc1wiKTtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyRGV2VGVzdFJvdXRlcyhzZXJ2ZXIsIHRoaXMuY29uZmlnLnRlc3QuZGV2UnVubmVyKTtcbiAgICB9XG5cbiAgICBjb25zdCB3ZWJQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBwUm9vdFBhdGgsIFwid2ViXCIpO1xuICAgIGNvbnN0IGhhc1dlYiA9IGF3YWl0IGV4aXN0cyh3ZWJQYXRoKTtcblxuICAgIC8vIOyghOyXrSBjb21wcmVzcyDsmLXshZgg6rOE7IKwIChyb3V0ZS5jb21wcmVzczogdHJ1ZeydvCDrlYwg7IKs7JqpKVxuICAgIGNvbnN0IHBsdWdpbkNvbXByZXNzID0gdGhpcy5jb25maWcuc2VydmVyLnBsdWdpbnM/LmNvbXByZXNzO1xuICAgIGNvbnN0IGdsb2JhbENvbXByZXNzT3B0aW9uczogQ29tcHJlc3NPcHRpb25zIHwgdW5kZWZpbmVkID0gcGx1Z2luQ29tcHJlc3NcbiAgICAgID8gcGx1Z2luQ29tcHJlc3MgPT09IHRydWVcbiAgICAgICAgPyB7IHRocmVzaG9sZDogMTAyNCwgZW5jb2RpbmdzOiBbXCJiclwiLCBcImd6aXBcIiwgXCJkZWZsYXRlXCJdIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICB0aHJlc2hvbGQ6IHBsdWdpbkNvbXByZXNzLnRocmVzaG9sZCxcbiAgICAgICAgICAgIGVuY29kaW5nczogcGx1Z2luQ29tcHJlc3MuZW5jb2RpbmdzLFxuICAgICAgICAgICAgY3VzdG9tVHlwZXM6IHBsdWdpbkNvbXByZXNzLmN1c3RvbVR5cGVzLFxuICAgICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlzTG9jYWwoKSkge1xuICAgICAgLy8g66Gc7LusIOqwnOuwnCDtmZjqsr06IGNhdGNoLWFsbOuhnCBBUEnrpbwg64+Z7KCBIOunpOy5re2VmOyXrCBITVLsnYQg7KeA7JuQ7ZWp64uI64ukLlxuICAgICAgLy8gU09OQU1VX0RJU0FCTEVfSU5URUdSQVRFRF9XRUI9eWVz66GcIOyEpOygle2VmOuptCBkZXZfYXBpIOuqqOuTnOyXkOyEnCBWaXRlIO2Gte2VqeydhCDruYTtmZzshLHtmZTtlaAg7IiYIOyeiOyKteuLiOuLpC5cbiAgICAgIGNvbnN0IGRpc2FibGVJbnRlZ3JhdGVkV2ViID0gcHJvY2Vzcy5lbnYuU09OQU1VX0RJU0FCTEVfSU5URUdSQVRFRF9XRUIgPT09IFwieWVzXCI7XG4gICAgICBpZiAoaGFzV2ViICYmICFkaXNhYmxlSW50ZWdyYXRlZFdlYikge1xuICAgICAgICBhd2FpdCB0aGlzLnNldHVwRGV2U2VydmVyV2l0aFZpdGUoc2VydmVyLCB3ZWJQYXRoLCBjb25maWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXR1cERldlNlcnZlcihzZXJ2ZXIsIGNvbmZpZyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIO2UhOuhnOuNleyFmCDtmZjqsr06IOqwnOuzhCBBUEkg65287Jqw7Yq4ICsg7KCV7KCBIO2MjOydvCDshJzruZlcbiAgICAgIGZvciAoY29uc3QgYXBpIG9mIHRoaXMuc3luY2VyLmFwaXMpIHtcbiAgICAgICAgaWYgKHRoaXMuc3luY2VyLm1vZGVsc1thcGkubW9kZWxOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsoJXsnZjrkJjsp4Ag7JWK7J2AIOuqqOuNuOyXkCDsoJHqt7wgJHthcGkubW9kZWxOYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHdlYnNvY2tldCByb3V0ZeuKlCB3c0hhbmRsZXLroZwg65Ox66Gd7ZWY6rOgLCDqsJnsnYAgcGF0aOydmCDsnbzrsJggSFRUUCBHRVTsnYAgNDI2IOydkeuLteycvOuhnCB1cGdyYWRl66W8IOqwleygnO2VqFxuICAgICAgICBpZiAoYXBpLndlYnNvY2tldE9wdGlvbnMpIHtcbiAgICAgICAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgdXJsOiB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGgsXG4gICAgICAgICAgICBoYW5kbGVyOiB0aGlzLmNyZWF0ZVdlYlNvY2tldFVwZ3JhZGVSZXF1aXJlZEhhbmRsZXIoKSxcbiAgICAgICAgICAgIHdzSGFuZGxlcjogdGhpcy5jcmVhdGVXZWJTb2NrZXRIYW5kbGVyKGFwaSwgY29uZmlnKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICAgICAgbWV0aG9kOiBhcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCIsXG4gICAgICAgICAgdXJsOiB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGgsXG4gICAgICAgICAgaGFuZGxlcjogYXdhaXQgdGhpcy5jcmVhdGVBcGlIYW5kbGVyKGFwaSwgY29uZmlnKSxcbiAgICAgICAgICBjb21wcmVzczogdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24oYXBpLm9wdGlvbnMuY29tcHJlc3MsIGdsb2JhbENvbXByZXNzT3B0aW9ucyksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyDtlITroZzrjZXshZjsl5DshJzripQgd2ViIOyGjOyKpChhcHBSb290L3dlYikg7Jyg66y07JmAIOustOq0gO2VmOqyjCxcbiAgICAgIC8vIGFwaS93ZWItZGlzdCDsobTsnqwg7Jes67aA66W8IHNldHVwU3RhdGljV2ViU2VydmVyIOuCtOu2gOyXkOyEnCDtjJDri6jtlanri4jri6QuXG4gICAgICBhd2FpdCB0aGlzLnNldHVwU3RhdGljV2ViU2VydmVyKHNlcnZlciwgY29uZmlnLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBkZXYg66qo65OcIOqzte2GtTogY2F0Y2gtYWxs7JeQ7IScIOuniOyngOuniSDspIDruYQg7JmE66OMIEFQSSBzbmFwc2hvdOydhCDtg5Dsg4ntlZjsl6wg7JqU7LKt7J2EIOyymOumrO2VqeuLiOuLpC5cbiAgICogc2VydmVyLnJvdXRlKCnroZwg6rCc67OEIOuTseuhne2VmOuptCBoYW5kbGVy6rCAIOqzoOygleuQmOyWtCBITVLsnbQg64+Z7J6R7ZWY7KeAIOyViuycvOuvgOuhnCxcbiAgICogcmVmcmVzaCDshLHqs7Ug7IucIOq1kOyytOuQmOuKlCBzbmFwc2hvdOydhCDrp6Qg7JqU7LKtIOyhsO2ajO2VqeuLiOuLpC5cbiAgICpcbiAgICog7JqU7LKt7J20IC9hcGko7KCV7ZmV7Z6I64qUIHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXgp66GcIOyLnOyeke2VmOyngCDslYrripQg6rK97Jqw652866m0IG51bGzsnYQg67CY7ZmY7ZWY66mwIOuBneuDheuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRGV2QXBpUmVxdWVzdChcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICk6IFByb21pc2U8KChyZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSkgPT4gUHJvbWlzZTxBcGlNZXRob2RSZXN1bHQ+KSB8IG51bGw+IHtcbiAgICBjb25zdCBtYXRjaGVkQXBpID0gdGhpcy5maW5kTWF0Y2hlZEFwaShyZXF1ZXN0LCB0aGlzLnByZXBhcmVkQXBpcywgdGhpcy5wcmVwYXJlZE1vZGVscyk7XG5cbiAgICBpZiAoIW1hdGNoZWRBcGkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmFwaS5ub3RGb3VuZFwiKSk7XG4gICAgfVxuXG4gICAgLy8gd2Vic29ja2V0IHJvdXRl66W8IOydvOuwmCBIVFRQ66GcIOyngeygkSDtmLjstpztlZwg6rK97JqwIDQyNuydhCDrj4zroKTspJggdXBncmFkZSDsl4bsnbQg7KCR6re87ZWY64qUIOqyg+ydhCDssKjri6jtlahcbiAgICBpZiAobWF0Y2hlZEFwaS53ZWJzb2NrZXRPcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVXZWJTb2NrZXRVcGdyYWRlUmVxdWlyZWRIYW5kbGVyKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlQXBpSGFuZGxlcihtYXRjaGVkQXBpLCBjb25maWcsIHRoaXMucHJlcGFyZWRNb2RlbHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kTWF0Y2hlZEFwaShcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICBhcGlzOiByZWFkb25seSBFeHRlbmRlZEFwaVtdLFxuICAgIG1vZGVsczogTG9hZGVkTW9kZWxzLFxuICApOiBFeHRlbmRlZEFwaSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5nZXRQYXRobmFtZUZyb21VcmwocmVxdWVzdC51cmwpO1xuICAgIGNvbnN0IG1ldGhvZCA9IHJlcXVlc3QubWV0aG9kO1xuXG4gICAgaWYgKCF1cmwuc3RhcnRzV2l0aCh0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4KSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gYXBpcy5maW5kKChhcGkpID0+IHtcbiAgICAgIGlmIChtb2RlbHNbYXBpLm1vZGVsTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBhcGlNZXRob2QgPSBhcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCI7XG4gICAgICBpZiAoYXBpTWV0aG9kICE9PSBtZXRob2QpIHJldHVybiBmYWxzZTtcblxuICAgICAgY29uc3QgZnVsbFBhdGggPSB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGg7XG4gICAgICByZXR1cm4gdGhpcy5pc1BhdGhQYXR0ZXJuTWF0Y2goZnVsbFBhdGgsIHVybCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogZGV2IGFwaSDrqqjrk5w6IFZpdGUg7JeG7J20IEFQSSDrj5nsoIEg65287Jqw7YyF66eMIOygnOqzte2VqeuLiOuLpC5cbiAgICogSE1S7J2EIOychO2VtCBjYXRjaC1hbGzsl5DshJwg66ekIOyalOyyreuniOuLpCDspIDruYQg7JmE66OMIEFQSSBzbmFwc2hvdOydhCDsobDtmoztlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIHNldHVwRGV2U2VydmVyKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICApOiB2b2lkIHtcbiAgICAvLyB1cGdyYWRl64qUIOyLpOyniOyggeycvOuhnCBHRVTsl5DshJzrp4wg7ISx66a97ZWY66+A66GcIEdFVCArIHdzSGFuZGxlciDsmYAg6re4IOyZuCBtZXRob2Trpbwg67OE64+EIHJvdXRl66GcIOu2hOumrO2VqFxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9LypgLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBhd2FpdCB0aGlzLmhhbmRsZURldkFwaVJlcXVlc3QocmVxdWVzdCwgY29uZmlnKTtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm4gaGFuZGxlcihyZXF1ZXN0LCByZXBseSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g65Ox66Gd65CcIEFQSeyZgCDsnbzsuZjtlZjsp4Ag7JWK64qUIOyalOyyreyXkCDrjIDtlZwgZmFsbGJhY2vsnoXri4jri6QuXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmFwaS5ub3RGb3VuZFwiKSk7XG4gICAgICB9LFxuICAgICAgd3NIYW5kbGVyOiBhc3luYyAoY29ubmVjdGlvbiwgcmVxdWVzdCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZURldldlYlNvY2tldFJlcXVlc3QoY29ubmVjdGlvbi5zb2NrZXQsIHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiSEVBRFwiLCBcIlBPU1RcIiwgXCJQVVRcIiwgXCJERUxFVEVcIiwgXCJQQVRDSFwiXSxcbiAgICAgIHVybDogYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vKmAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IGF3YWl0IHRoaXMuaGFuZGxlRGV2QXBpUmVxdWVzdChyZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIHJldHVybiBoYW5kbGVyKHJlcXVlc3QsIHJlcGx5KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5hcGkubm90Rm91bmRcIikpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdml0ZVNlcnZlcjogYW55ID0gbnVsbDtcblxuICAvKipcbiAgICogZGV2IGFsbCDrqqjrk5w6IFZpdGUgRGV2IFNlcnZlcuulvCDthrXtlantlZjsl6wgQVBJICsgU1NSICsgQ1NS7J2EIOuqqOuRkCDsoJzqs7Xtlanri4jri6QuXG4gICAqIEFQSSDrj5nsoIEg66ek7Lmt7J2AIGhhbmRsZURldkFwaVJlcXVlc3Trpbwg6rO17Jyg7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cERldlNlcnZlcldpdGhWaXRlKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgd2ViUGF0aDogc3RyaW5nLFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQGZhc3RpZnkvbWlkZGllIOuTseuhnSAoQ29ubmVjdC1zdHlsZSBtaWRkbGV3YXJlIOyngOybkClcbiAgICBhd2FpdCBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChcIkBmYXN0aWZ5L21pZGRpZVwiKSkuZGVmYXVsdCk7XG5cbiAgICBjb25zdCB2aXRlID0gYXdhaXQgaW1wb3J0KFwidml0ZVwiKTtcbiAgICAvLyBAZmFzdGlmeS93ZWJzb2NrZXQg7ZSM65+s6re47J247J20IO2ZnOyEse2ZlOuQmOuptCBITVIgd2Vic29ja2V06rO8IHNlcnZlciBzb2NrZXTsnbQg7Lap64+M7ZWY66+A66GcIGRlZGljYXRlZCDtj6ztirjroZwg67aE66as7ZWoXG4gICAgY29uc3QgcmVxdWlyZXNEZWRpY2F0ZWRIbXJTZXJ2ZXIgPSBCb29sZWFuKHRoaXMuY29uZmlnLnNlcnZlci5wbHVnaW5zPy53cyk7XG4gICAgY29uc3QgaG1yID0gcmVzb2x2ZUludGVncmF0ZWRWaXRlSG1yT3B0aW9ucyh7XG4gICAgICBodHRwU2VydmVyOiBzZXJ2ZXIuc2VydmVyLFxuICAgICAgcmVxdWlyZXNEZWRpY2F0ZWRXZWJTb2NrZXRTZXJ2ZXI6IHJlcXVpcmVzRGVkaWNhdGVkSG1yU2VydmVyLFxuICAgIH0pO1xuXG4gICAgdGhpcy52aXRlU2VydmVyID0gYXdhaXQgdml0ZS5jcmVhdGVTZXJ2ZXIoe1xuICAgICAgcm9vdDogd2ViUGF0aCxcbiAgICAgIHNlcnZlcjoge1xuICAgICAgICBtaWRkbGV3YXJlTW9kZTogdHJ1ZSxcbiAgICAgICAgaG1yLFxuICAgICAgfSxcbiAgICAgIGFwcFR5cGU6IFwiY3VzdG9tXCIsXG4gICAgfSk7XG5cbiAgICAvLyBWaXRlIG1pZGRsZXdhcmUg65Ox66GdIChWaXRlIOyXkOyFiyDsspjrpqwpXG4gICAgc2VydmVyLnVzZSgocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICAgIC8vIEFQSeyZgCBTb25hbXUgVUnripQgRmFzdGlmeSDrnbzsmrDtirjqsIAg7LKY66as7ZWY64+E66GdIHNraXBcbiAgICAgIGlmIChyZXEudXJsPy5zdGFydHNXaXRoKHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXgpIHx8IHJlcS51cmw/LnN0YXJ0c1dpdGgoXCIvc29uYW11LXVpXCIpKSB7XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgICB9XG4gICAgICAvLyDrgpjrqLjsp4DripQgVml0ZSBtaWRkbGV3YXJl66GcIOyghOuLrFxuICAgICAgcmV0dXJuIHRoaXMudml0ZVNlcnZlci5taWRkbGV3YXJlcyhyZXEsIHJlcywgbmV4dCk7XG4gICAgfSk7XG5cbiAgICAvLyBXUyB1cGdyYWRlIOqyveuhnChHRVQp7JmAIOydvOuwmCBIVFRQIOuplOyEnOuTnOulvCDrs4Trj4Qgcm91dGXroZwg67aE66as7ZW0IHdlYnNvY2tldCByb3V0ZeqwgCBIVE1MIGZhbGxiYWNr7JeQIOuoue2eiOyngCDslYrrj4TroZ0g7ZWoXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vKmAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5oYW5kbGVEZXZBcGlSZXF1ZXN0KHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0KHJlcXVlc3QsIHJlcGx5KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5hcGkubm90Rm91bmRcIikpO1xuICAgICAgfSxcbiAgICAgIHdzSGFuZGxlcjogYXN5bmMgKGNvbm5lY3Rpb24sIHJlcXVlc3QpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVEZXZXZWJTb2NrZXRSZXF1ZXN0KGNvbm5lY3Rpb24uc29ja2V0LCByZXF1ZXN0LCBjb25maWcpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkhFQURcIiwgXCJQT1NUXCIsIFwiUFVUXCIsIFwiREVMRVRFXCIsIFwiUEFUQ0hcIl0sXG4gICAgICB1cmw6IGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9LypgLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuaGFuZGxlRGV2QXBpUmVxdWVzdChyZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdChyZXF1ZXN0LCByZXBseSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuYXBpLm5vdEZvdW5kXCIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBjYXRjaC1hbGwg65287Jqw7Yq47JeQ7IScIFNTUi9DU1Ig7LKY66asXG4gICAgLy8g6rCc67CcIO2ZmOqyveyXkOyEnOuKlCDrnbzsmrDtirjrs4QgY29tcHJlc3Mg7Ji17IWY7J2EIO2PrOq4sO2VmOqzoCBITVIg7J207KCQ7J2EIOy3qO2VqeuLiOuLpC5cbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCJdLFxuICAgICAgdXJsOiBcIi8qXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgdXJsID0gcmVxdWVzdC51cmw7XG5cbiAgICAgICAgLy8gMS4gU1NSIOudvOyasO2KuCDsspjrpqxcbiAgICAgICAgY29uc3QgeyBtYXRjaFNTUlJvdXRlLCByZW5kZXJTU1IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3NzclwiKTtcbiAgICAgICAgY29uc3Qgc3NyTWF0Y2ggPSBtYXRjaFNTUlJvdXRlKHVybCk7XG4gICAgICAgIGlmIChzc3JNYXRjaCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbU1NSXSBNYXRjaGVkIHJvdXRlOiAke3Nzck1hdGNoLnJvdXRlLnBhdGh9YCk7XG4gICAgICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHJlbmRlclNTUihcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIHNzck1hdGNoLnJvdXRlLFxuICAgICAgICAgICAgc3NyTWF0Y2gucGFyYW1zLFxuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIHJlcGx5LFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgdGhpcy52aXRlU2VydmVyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmVwbHkudHlwZShcInRleHQvaHRtbFwiKTtcbiAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDIuIENTUiBmYWxsYmFja1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxldCB0ZW1wbGF0ZSA9IGF3YWl0IGZzLnJlYWRGaWxlKFxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMudml0ZVNlcnZlci5jb25maWcucm9vdCwgXCJpbmRleC5odG1sXCIpLFxuICAgICAgICAgICAgXCJ1dGYtOFwiLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGVtcGxhdGUgPSBhd2FpdCB0aGlzLnZpdGVTZXJ2ZXIudHJhbnNmb3JtSW5kZXhIdG1sKHVybCwgdGVtcGxhdGUpO1xuXG4gICAgICAgICAgLy8gP2htcj1mYWxzZeuhnCDsl7Ag7Y6Y7J207KeA64qUIEhNUiDsm7nshozsvJPrp4wg64GK7Ja0IOyDiOuhnOqzoOy5qOuQmOyngCDslYrqsowg7ZWc64ukLlxuICAgICAgICAgIGNvbnN0IHsgSE1SX09QVF9PVVRfU0NSSVBULCBpc0htckRpc2FibGVkQnlRdWVyeSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3NyL2htci1vcHQtb3V0XCIpO1xuICAgICAgICAgIGlmIChpc0htckRpc2FibGVkQnlRdWVyeSh1cmwpKSB7XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UoXCI8aGVhZD5cIiwgYDxoZWFkPlxcbiR7SE1SX09QVF9PVVRfU0NSSVBUfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlcGx5LnR5cGUoXCJ0ZXh0L2h0bWxcIik7XG4gICAgICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhpcy52aXRlU2VydmVyLnNzckZpeFN0YWNrdHJhY2UoXG4gICAgICAgICAgICAvKiBTQUZFVFk6IEFQSSDrjbDsvZTroIjsnbTthLDsmYAgWm9kIOqygOymneq4sCDrk7HroZ0g6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gZSBhcyBFcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgcmVwbHkuc3RhdHVzKDUwMCk7XG4gICAgICAgICAgcmV0dXJuIC8qIFNBRkVUWTogQVBJIOuNsOy9lOugiOydtO2EsOyZgCBab2Qg6rKA7Kad6riwIOuTseuhnSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgICBlIGFzIEVycm9yXG4gICAgICAgICAgKS5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyiheujjCDsi5wgVml0ZeuPhCDsooXro4xcbiAgICBzZXJ2ZXIuYWRkSG9vayhcIm9uQ2xvc2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy52aXRlU2VydmVyLmNsb3NlKCk7XG4gICAgfSk7XG5cbiAgICBpZiAoXCJwb3J0XCIgaW4gaG1yKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuZGltKFxuICAgICAgICAgIGDinJMgVml0ZSBITVIgdXNpbmcgZGVkaWNhdGVkIHdlYnNvY2tldCBwb3J0ICR7aG1yLnBvcnR9IHRvIGF2b2lkIEZhc3RpZnkgd2Vic29ja2V0IGNvbmZsaWN0c2AsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oXCLinJMgVml0ZSBkZXYgc2VydmVyIGludGVncmF0ZWRcIikpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cFN0YXRpY1dlYlNlcnZlcihcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICBnbG9iYWxDb21wcmVzc09wdGlvbnM6IENvbXByZXNzT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g6rK966GcIOuqhe2Zle2ZlDogYXBpL3dlYi1kaXN0L2NsaWVudCAo7KCV7KCBIO2MjOydvCksIGFwaS93ZWItZGlzdC9zZXJ2ZXIgKFNTUiBlbnRyeSksIGFwaS9kaXN0L3NzciAoU1NSIHJvdXRlcyAtIEFQSSDshozsnKApXG4gICAgY29uc3Qgd2ViRGlzdFBhdGggPSBwYXRoLmpvaW4odGhpcy5hcGlSb290UGF0aCwgXCJ3ZWItZGlzdFwiLCBcImNsaWVudFwiKTtcbiAgICBjb25zdCBzc3JQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwid2ViLWRpc3RcIiwgXCJzZXJ2ZXJcIik7XG4gICAgY29uc3Qgc3NyRW50cnlQYXRoID0gcGF0aC5qb2luKHNzclBhdGgsIFwiZW50cnktc2VydmVyLmdlbmVyYXRlZC5qc1wiKTtcbiAgICBjb25zdCBzc3JSb3V0ZXNQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwiZGlzdFwiLCBcInNzclwiLCBcInJvdXRlcy5qc1wiKTtcblxuICAgIGlmICghKGF3YWl0IGV4aXN0cyh3ZWJEaXN0UGF0aCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYOKaoCBXZWIgZGlzdCBub3QgZm91bmQ6ICR7d2ViRGlzdFBhdGh9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU1NSIGVudHJ5IOyhtOyerCDsl6zrtoAg7ZmV7J24XG4gICAgY29uc3Qgc3NyQXZhaWxhYmxlID0gYXdhaXQgZXhpc3RzKHNzckVudHJ5UGF0aCk7XG5cbiAgICBpZiAoIXNzckF2YWlsYWJsZSkge1xuICAgICAgY29uc29sZS53YXJuKGDimqAgU1NSIGVudHJ5IG5vdCBmb3VuZDogJHtzc3JFbnRyeVBhdGh9YCk7XG4gICAgICBjb25zb2xlLndhcm4oXCIgIFNTUiB3aWxsIGJlIGRpc2FibGVkLiBPbmx5IENTUiB3aWxsIHdvcmsuXCIpO1xuICAgIH1cblxuICAgIC8vIFNTUiDrnbzsmrDtirgg66Gc65OcIChwcm9kdWN0aW9u7JeQ7ISc66eMLCDsgqzsmqnsnpAg7ZSE66Gc7KCd7Yq47J2YIHNzci9yb3V0ZXMudHMpXG4gICAgaWYgKHNzckF2YWlsYWJsZSkge1xuICAgICAgaWYgKGF3YWl0IGV4aXN0cyhzc3JSb3V0ZXNQYXRoKSkge1xuICAgICAgICAvLyB0cy1sb2FkZXLrnbzrqbQgXCJmaWxlOi8vXCLroZwg7Iuc7J6R7ZWY64qUIGZ1bGx5LXJlc29sdmVkIHBhdGjrp4wg67Cb6riw7JeQIOydtOulvCDsspjrpqztlbTso7zripQgaW1wb3J0TWVtYmVyc+ulvCDsgqzsmqntlbTslbwg7ZaI6rKg7KeA66eMLFxuICAgICAgICAvLyDsl6zquLDripQg7ZSE66Gc642V7IWYIO2ZmOqyveyXkOyEnCBsb2FkZXIg7JeG7J20IOuPjOyVhOqwgOq4sCDrlYzrrLjsl5AgXCLsp4Tsp5wganMg7YyM7J28XCLsnZggXCLqt7jrg6VcIiDsoIjrjIDqsr3roZzrpbwg67CU66GcIGltcG9ydO2VtOuPhCDrkKnri4jri6QuXG4gICAgICAgIC8vIOydtCDrgrTsmqnsnYAg7J20IO2VqOyImCDrgrTsl5DshJwg7JWE656Y7JeQIOuCmOyYrCDri6TrpbggaW1wb3J0IO2YuOy2nOyXkOuPhCDrj5nsnbztlZjqsowg7KCB7Jqp65Cp64uI64ukLlxuICAgICAgICBhd2FpdCBpbXBvcnQoc3NyUm91dGVzUGF0aCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi4pyTIFNTUiByb3V0ZXMgbG9hZGVkXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGDimqAgU1NSIHJvdXRlcyBub3QgZm91bmQ6ICR7c3NyUm91dGVzUGF0aH1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDroaTrp4Eg7JeF642w7J207Yq4IOuMgOydkTogYXNzZXQgaGFzaCDrtojsnbzsuZgg7IucIO2YhOyerCDrsoTsoIQg7KeB7KCRIOyEnOu5mVxuICAgIHNlcnZlci5nZXQoXCIvYXNzZXRzLzpmaWxlbmFtZVwiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RlZEZpbGUgPVxuICAgICAgICAvKiBTQUZFVFk6IEFQSSDrjbDsvZTroIjsnbTthLDsmYAgWm9kIOqygOymneq4sCDrk7HroZ0g6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHJlcXVlc3QucGFyYW1zIGFzIHsgZmlsZW5hbWU6IHN0cmluZyB9XG4gICAgICAgICkuZmlsZW5hbWU7XG4gICAgICBjb25zdCBhc3NldHNEaXIgPSBwYXRoLmpvaW4od2ViRGlzdFBhdGgsIFwiYXNzZXRzXCIpO1xuICAgICAgY29uc3Qgc2FmZUZpbGVQYXRoID0gdGhpcy5yZXNvbHZlUGF0aFdpdGhpbkJhc2VEaXIoYXNzZXRzRGlyLCByZXF1ZXN0ZWRGaWxlKTtcbiAgICAgIGlmIChzYWZlRmlsZVBhdGggPT09IG51bGwpIHtcbiAgICAgICAgcmVwbHkuc3RhdHVzKDQwMykuc2VuZCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBub3JtYWxpemVkUmVxdWVzdGVkRmlsZSA9IHBhdGgucmVsYXRpdmUoYXNzZXRzRGlyLCBzYWZlRmlsZVBhdGgpLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpO1xuXG4gICAgICBjb25zdCBhc3NldFBhdGggPSBgL2Fzc2V0cy8ke25vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlfWA7XG5cbiAgICAgIC8vIENhY2hlLUNvbnRyb2wg7Zek642UIOqysOyglVxuICAgICAgY29uc3QgZ2V0Q2FjaGVDb250cm9sRm9yQXNzZXQgPSAoKTogQ2FjaGVDb250cm9sQ29uZmlnID0+IHtcbiAgICAgICAgY29uc3QgY2FjaGVSZXE6IENhY2hlQ29udHJvbFJlcXVlc3QgPSB7XG4gICAgICAgICAgdHlwZTogXCJhc3NldHNcIixcbiAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICAgIHBhdGg6IGFzc2V0UGF0aCxcbiAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIOyCrOyaqeyekCDsoJXsnZgg7ZW465Ok65+sIOyasOyEoFxuICAgICAgICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcihjYWNoZVJlcSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOq4sOuzuOqwkjogaW1tdXRhYmxlXG4gICAgICAgIHJldHVybiBDYWNoZVByZXNldHMuaW1tdXRhYmxlO1xuICAgICAgfTtcblxuICAgICAgLy8gaW5kZXgtKi5qcyDrmJDripQgaW5kZXgtKi5jc3Mg7JqU7LKt7J24IOqyveyasFxuICAgICAgaWYgKC9eaW5kZXgtW2EtZjAtOV0rXFwuKGpzfGNzcykkLy50ZXN0KG5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlKSkge1xuICAgICAgICBjb25zdCBleHQgPSBub3JtYWxpemVkUmVxdWVzdGVkRmlsZS5zcGxpdChcIi5cIikucG9wKCk7XG4gICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihhc3NldHNEaXIpO1xuICAgICAgICBjb25zdCBjdXJyZW50RmlsZSA9IGZpbGVzLmZpbmQoKGYpID0+IGYuc3RhcnRzV2l0aChcImluZGV4LVwiKSAmJiBmLmVuZHNXaXRoKGAuJHtleHR9YCkpO1xuXG4gICAgICAgIGlmIChjdXJyZW50RmlsZSkge1xuICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGFzc2V0c0RpciwgY3VycmVudEZpbGUpO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICAgICAgcmVwbHkudHlwZShleHQgPT09IFwianNcIiA/IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiIDogXCJ0ZXh0L2Nzc1wiKTtcbiAgICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgZ2V0Q2FjaGVDb250cm9sRm9yQXNzZXQoKSk7XG4gICAgICAgICAgcmV0dXJuIHJlcGx5LnNlbmQoY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g7J2867CYIO2MjOydvCDshJzruZlcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gc2FmZUZpbGVQYXRoO1xuICAgICAgaWYgKGF3YWl0IGV4aXN0cyhmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgY29uc3QgZXh0ID0gbm9ybWFsaXplZFJlcXVlc3RlZEZpbGUuc3BsaXQoXCIuXCIpLnBvcCgpO1xuICAgICAgICByZXBseS50eXBlKGV4dCA9PT0gXCJqc1wiID8gXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0XCIgOiBleHQgPT09IFwiY3NzXCIgPyBcInRleHQvY3NzXCIgOiBcIlwiKTtcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBnZXRDYWNoZUNvbnRyb2xGb3JBc3NldCgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVwbHkuc2VuZChjb250ZW50KTtcbiAgICAgIH1cblxuICAgICAgcmVwbHkuc3RhdHVzKDQwNCkuc2VuZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gU1NSIOudvOyasO2KuCDqsJzrs4Qg65Ox66GdIChjb21wcmVzcyDsmLXshZjsnbQg65287Jqw7Yq467OE66GcIOyggeyaqeuQmOuPhOuhnSlcbiAgICBpZiAoc3NyQXZhaWxhYmxlKSB7XG4gICAgICBjb25zdCB7IGdldFNTUlJvdXRlcyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3NyXCIpO1xuICAgICAgY29uc3QgeyByZW5kZXJTU1IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3Nzci9yZW5kZXJlclwiKTtcbiAgICAgIGNvbnN0IHNzclJvdXRlcyA9IGdldFNTUlJvdXRlcygpO1xuXG4gICAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHNzclJvdXRlcykge1xuICAgICAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiSEVBRFwiXSxcbiAgICAgICAgICB1cmw6IHJvdXRlLnBhdGgsXG4gICAgICAgICAgY29tcHJlc3M6IHRvRmFzdGlmeUNvbXByZXNzT3B0aW9uKHJvdXRlLmNvbXByZXNzID8/IHRydWUsIGdsb2JhbENvbXByZXNzT3B0aW9ucyksXG4gICAgICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSByZXF1ZXN0LnVybDtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbU1NSXSBNYXRjaGVkIHJvdXRlOiAke3JvdXRlLnBhdGh9YCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuZXh0cmFjdFBhdGhQYXJhbXMocm91dGUucGF0aCwgdXJsKTtcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCByZW5kZXJTU1IodXJsLCByb3V0ZSwgcGFyYW1zLCByZXF1ZXN0LCByZXBseSwgY29uZmlnKTtcblxuICAgICAgICAgICAgcmVwbHkudHlwZShcInRleHQvaHRtbFwiKTtcbiAgICAgICAgICAgIHJldHVybiBodG1sO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENTUiBvciBTdGF0aWMgRmlsZSBGYWxsYmFjayAoU1NSIOudvOyasO2KuOyXkCDrp6Tsua3rkJjsp4Ag7JWK64qUIOuqqOuToCDsmpTssq0pXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiSEVBRFwiXSxcbiAgICAgIHVybDogXCIqXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgLy8gL2FwaSwgL3NvbmFtdS11aeuKlCA0MDQg6re464yA66GcXG4gICAgICAgIGlmIChyZXF1ZXN0LnVybC5zdGFydHNXaXRoKFwiL2FwaVwiKSB8fCByZXF1ZXN0LnVybC5zdGFydHNXaXRoKFwiL3NvbmFtdS11aVwiKSkge1xuICAgICAgICAgIHJlcGx5LnN0YXR1cyg0MDQpLnNlbmQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDU1LsmqkgQ2FjaGUtQ29udHJvbCDtl6TrjZQg7ISk7KCVXG4gICAgICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcikge1xuICAgICAgICAgIGNvbnN0IGNzckNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgdHlwZTogXCJjc3JcIixcbiAgICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgICAgICBwYXRoOiByZXF1ZXN0LnVybC5zcGxpdChcIj9cIilbMF0sXG4gICAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgY3NyQ2FjaGVDb25maWcgPSBjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcihjc3JDYWNoZVJlcSk7XG5cbiAgICAgICAgICBpZiAoY3NyQ2FjaGVDb25maWcpIHtcbiAgICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBjc3JDYWNoZUNvbmZpZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g7KCV7KCBIO2MjOydvOydtCDsobTsnqztlaAg6rK97JqwLCDsoJXsoIEg7YyM7J287J2EIOuovOyggCDshJzruZntlbTslbztlahcbiAgICAgICAgY29uc3QgcmVxdWVzdFBhdGggPSB0aGlzLmdldFBhdGhuYW1lRnJvbVVybChyZXF1ZXN0LnVybCk7XG4gICAgICAgIGNvbnN0IHNhZmVGaWxlUGF0aCA9IHRoaXMucmVzb2x2ZVBhdGhXaXRoaW5CYXNlRGlyKHdlYkRpc3RQYXRoLCByZXF1ZXN0UGF0aCk7XG4gICAgICAgIGlmIChzYWZlRmlsZVBhdGggPT09IG51bGwpIHtcbiAgICAgICAgICByZXBseS5zdGF0dXMoNDAzKS5zZW5kKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhd2FpdCBmaWxlRXhpc3RzKHNhZmVGaWxlUGF0aCkpIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoc2FmZUZpbGVQYXRoKTtcbiAgICAgICAgICByZXR1cm4gcmVwbHkudHlwZShtaW1lTG9va3VwKHNhZmVGaWxlUGF0aCkgfHwgXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIikuc2VuZChjb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENTUiBmYWxsYmFjazogaW5kZXguaHRtbCDshJzruZlcbiAgICAgICAgY29uc3QgaW5kZXhQYXRoID0gcGF0aC5qb2luKHdlYkRpc3RQYXRoLCBcImluZGV4Lmh0bWxcIik7XG4gICAgICAgIHJldHVybiByZXBseS50eXBlKFwidGV4dC9odG1sXCIpLnNlbmQoYXdhaXQgZnMucmVhZEZpbGUoaW5kZXhQYXRoLCBcInV0Zi04XCIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhg4pyTIFN0YXRpYyB3ZWIgc2VydmVyIGNvbmZpZ3VyZWQgd2l0aCAke3NzckF2YWlsYWJsZSA/IFwiU1NSXCIgOiBcIkNTUiBvbmx5XCJ9IHN1cHBvcnRgKTtcbiAgfVxuXG4gIGNyZWF0ZUFwaUhhbmRsZXIoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgbW9kZWxzOiBMb2FkZWRNb2RlbHMgPSB0aGlzLnN5bmNlci5tb2RlbHMsXG4gICAgZGVwZW5kZW5jaWVzOiBTb25hbXVIdHRwVmFsaWRhdG9yRGVwZW5kZW5jaWVzID0gZGVmYXVsdFNvbmFtdUh0dHBWYWxpZGF0b3JEZXBlbmRlbmNpZXMsXG4gICk6IChyZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSkgPT4gUHJvbWlzZTxBcGlNZXRob2RSZXN1bHQ+IHtcbiAgICBjb25zdCBwcmVwYXJlZFZhbGlkYXRvciA9IHRoaXMuZ2V0T3JDcmVhdGVIdHRwVmFsaWRhdG9yKGFwaSwgZGVwZW5kZW5jaWVzKTtcblxuICAgIHJldHVybiBhc3luYyAocmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiBQcm9taXNlPEFwaU1ldGhvZFJlc3VsdD4gPT4ge1xuICAgICAgY29uc3QgdmFsaWRhdG9yID1cbiAgICAgICAgcHJlcGFyZWRWYWxpZGF0b3IgaW5zdGFuY2VvZiBQcm9taXNlID8gYXdhaXQgcHJlcGFyZWRWYWxpZGF0b3IgOiBwcmVwYXJlZFZhbGlkYXRvcjtcbiAgICAgIC8vIENvbnRleHQg7IOd7ISxXG4gICAgICBjb25zdCBjb250ZXh0OiBDb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVDb250ZXh0KGNvbmZpZywgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgICByZXR1cm4gdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5ydW4oeyBjb250ZXh0IH0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gZ3VhcmRzIOyymOumrFxuICAgICAgICBydW5HdWFyZHMoe1xuICAgICAgICAgIGd1YXJkczogYXBpLm9wdGlvbnMuZ3VhcmRzLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIGFwaSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gcmVxdWVzdCDtjIzsi7FcbiAgICAgICAgY29uc3Qgd2hpY2ggPSBhcGkub3B0aW9ucy5odHRwTWV0aG9kID09PSBcIkdFVFwiID8gXCJxdWVyeVwiIDogXCJib2R5XCI7XG4gICAgICAgIGxldCByZXFCb2R5ID0gbmV3IE1hcDxzdHJpbmcsIEFwaUFyZ3VtZW50PigpO1xuICAgICAgICAvLyDtjIzsnbwg7JeF66Gc65OcIOyeiOuKlCDqsr3smrAg7J6E7IucIOuNsOydtO2EsFxuICAgICAgICBjb25zdCBmaWxlczogVXBsb2FkZWRSZXF1ZXN0RmlsZXMgPSB7XG4gICAgICAgICAgYnVmZmVyZWRGaWxlczogW10sXG4gICAgICAgICAgdXBsb2FkZWRGaWxlczogW10sXG4gICAgICAgIH07XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gcmVxdWVzdFt3aGljaF0gPz8ge307XG4gICAgICAgICAgaWYgKGFwaS51cGxvYWRPcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IHJlcXVlc3QucGFydHMoe1xuICAgICAgICAgICAgICBsaW1pdHM6IGFwaS51cGxvYWRPcHRpb25zLmxpbWl0cyxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBGb3JtRGF0YeydmCBmaWVsZOuTpOydhCDsnoTsi5zroZwg7KCA7J6lXG4gICAgICAgICAgICBjb25zdCBmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgICAgICAgICAgaWYgKGFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUgPT09IFwiYnVmZmVyXCIgfHwgIWFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUpIHtcbiAgICAgICAgICAgICAgLy8gQnVmZmVyIOuqqOuTnDog66mU66qo66as7JeQIOuhnOuTnFxuICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFydC50eXBlID09PSBcImZpbGVcIikge1xuICAgICAgICAgICAgICAgICAgLy8gQ1JJVElDQUw6IO2MjOydvCDsiqTtirjrprzsnYQg7KaJ7IucIGNvbnN1bWXtlbTslbwg64uk7J2MIHBhcnTroZwg64SY7Ja06rCIIOyImCDsnojsnYxcbiAgICAgICAgICAgICAgICAgIC8vIOydtCDtmLjstpzsnbQg7JeG7Jy866m0IOyiheyihSBtdWx0aXBhcnQg7YyM7Iux7J20IHBlbmRpbmcg7IOB7YOc66GcIO2DgOyehOyVhOybgyDrsJzsg51cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHBhcnQudG9CdWZmZXIoKTtcbiAgICAgICAgICAgICAgICAgIGZpbGVzLmJ1ZmZlcmVkRmlsZXMucHVzaChuZXcgQnVmZmVyZWRGaWxlKHBhcnQsIGJ1ZmZlcikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSBcImZpZWxkXCIpIHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkc1twYXJ0LmZpZWxkbmFtZV0gPSBTdHJpbmcocGFydC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUgPT09IFwic3RyZWFtXCIpIHtcbiAgICAgICAgICAgICAgLy8gU3RyZWFtIOuqqOuTnDog7KaJ7IucIOyggOyepeyGjOuhnCDsiqTtirjrpqzrsI1cbiAgICAgICAgICAgICAgY29uc3QgZGlza05hbWUgPSBhcGkudXBsb2FkT3B0aW9ucy5kZXN0aW5hdGlvbjtcbiAgICAgICAgICAgICAgY29uc3QgZGlzayA9IHRoaXMuc3RvcmFnZS51c2UoZGlza05hbWUpO1xuXG4gICAgICAgICAgICAgIC8vIOyasOyEoOyInOychDog642w7L2U66CI7J207YSwID4g7KCE7JetIOyEpOyglSA+IOq4sOuzuOqwklxuICAgICAgICAgICAgICBjb25zdCBrZXlHZW5lcmF0b3I6IEtleUdlbmVyYXRvciA9XG4gICAgICAgICAgICAgICAgYXBpLnVwbG9hZE9wdGlvbnMua2V5R2VuZXJhdG9yID8/XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2VydmVyLnN0b3JhZ2U/LmtleUdlbmVyYXRvciA/P1xuICAgICAgICAgICAgICAgIGRlZmF1bHRLZXlHZW5lcmF0b3I7XG5cbiAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gXCJmaWxlXCIpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IGtleUdlbmVyYXRvcih7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBwYXJ0LmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICBtaW1ldHlwZTogcGFydC5taW1ldHlwZSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBhd2FpdCBkaXNrLnB1dFN0cmVhbShrZXksIHBhcnQuZmlsZSwge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogcGFydC5taW1ldHlwZSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBhd2FpdCBkaXNrLmdldFVybChrZXkpO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkVXJsID0gYXdhaXQgZGlzay5nZXRTaWduZWRVcmwoa2V5KTtcblxuICAgICAgICAgICAgICAgICAgZmlsZXMudXBsb2FkZWRGaWxlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBuZXcgVXBsb2FkZWRGaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogcGFydC5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBtaW1ldHlwZTogcGFydC5taW1ldHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICBzaXplOiBwYXJ0LmZpbGUuYnl0ZXNSZWFkLFxuICAgICAgICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICAgICAgICBzaWduZWRVcmwsXG4gICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2tOYW1lLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09IFwiZmllbGRcIikge1xuICAgICAgICAgICAgICAgICAgZmllbGRzW3BhcnQuZmllbGRuYW1lXSA9IFN0cmluZyhwYXJ0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gcXProZwg7KSR7LKpIOq1rOyhsCDtjIzsi7E6IHBhcmFtc1tjYXRlZ29yeV0g4oaSIHsgcGFyYW1zOiB7IGNhdGVnb3J5OiBcInRlc3RcIiB9IH1cbiAgICAgICAgICAgIGNvbnN0IHFzID0gYXdhaXQgaW1wb3J0KFwicXNcIik7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBxcy5kZWZhdWx0LnBhcnNlKGZpZWxkcyk7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGJvZHksIHBhcnNlZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVxQm9keSA9IHRvQXBpQXJndW1lbnRNYXAodmFsaWRhdG9yLnBhcnNlKGJvZHkpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnN0IHsgWm9kRXJyb3IgfSA9IGF3YWl0IGltcG9ydChcInpvZFwiKTtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFpvZEVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCB7IGh1bWFuaXplWm9kRXJyb3IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3pvZC1lcnJvclwiKTtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gaHVtYW5pemVab2RFcnJvcihlKVxuICAgICAgICAgICAgICAubWFwKChpc3N1ZSkgPT4gaXNzdWUubWVzc2FnZSlcbiAgICAgICAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgICAgICAgICAgY29uc3QgeyBCYWRSZXF1ZXN0RXhjZXB0aW9uIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgICAgICAgLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIG1lc3NhZ2VzIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHpvZEVycm9yOiBlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb250ZW50LVR5cGVcbiAgICAgICAgcmVwbHkudHlwZShhcGkub3B0aW9ucy5jb250ZW50VHlwZSA/PyBcImFwcGxpY2F0aW9uL2pzb25cIik7XG5cbiAgICAgICAgLy8gQ2FjaGUtQ29udHJvbCDtl6TrjZQg7ISk7KCVXG4gICAgICAgIGNvbnN0IGFwaUNhY2hlQ29uZmlnID0gdGhpcy5nZXRBcGlDYWNoZUNvbnRyb2woYXBpLCByZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAoYXBpQ2FjaGVDb25maWcpIHtcbiAgICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgYXBpQ2FjaGVDb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7JeF66Gc65OcIOyYteyFmOydtCDsnojripQg6rK97JqwIO2MjOydvCDrjbDsnbTthLDrpbwgQ29udGV4dOyXkCDstpTqsIBcbiAgICAgICAgaWYgKGFwaS51cGxvYWRPcHRpb25zKSB7XG4gICAgICAgICAgY29uc3QgY29uc3VtZSA9IGFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUgPz8gXCJidWZmZXJcIjtcbiAgICAgICAgICBpZiAoY29uc3VtZSA9PT0gXCJidWZmZXJcIikge1xuICAgICAgICAgICAgY29udGV4dC5idWZmZXJlZEZpbGVzID0gZmlsZXMuYnVmZmVyZWRGaWxlcztcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbnN1bWUgPT09IFwic3RyZWFtXCIpIHtcbiAgICAgICAgICAgIGNvbnRleHQudXBsb2FkZWRGaWxlcyA9IGZpbGVzLnVwbG9hZGVkRmlsZXM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g66qo6424IOuplOyGjOuTnCBhcmdzIOyDneyEse2VmOyXrCDtmLjstpxcbiAgICAgICAgY29uc3QgeyBBcGlQYXJhbVR5cGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpO1xuICAgICAgICBjb25zdCBhcmdzID0gYXBpLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICAgIC8vIENvbnRleHQg7J247KCd7IWYXG4gICAgICAgICAgaWYgKEFwaVBhcmFtVHlwZS5pc0NvbnRleHQocGFyYW0udHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVxQm9keS5nZXQocGFyYW0ubmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5pbnZva2VNb2RlbE1ldGhvZChhcGksIGFyZ3MsIHJlcGx5LCBtb2RlbHMpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3JDcmVhdGVIdHRwVmFsaWRhdG9yKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgZGVwZW5kZW5jaWVzOiBTb25hbXVIdHRwVmFsaWRhdG9yRGVwZW5kZW5jaWVzLFxuICApOiBIdHRwVmFsaWRhdG9yIHwgUHJvbWlzZTxIdHRwVmFsaWRhdG9yPiB7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5odHRwVmFsaWRhdG9ycy5nZXQoYXBpKTtcbiAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5wZW5kaW5nSHR0cFZhbGlkYXRvcnMuZ2V0KGFwaSk7XG4gICAgaWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMuYnVpbGRIdHRwVmFsaWRhdG9yKGFwaSwgZGVwZW5kZW5jaWVzKTtcbiAgICB0aGlzLnBlbmRpbmdIdHRwVmFsaWRhdG9ycy5zZXQoYXBpLCBwZW5kaW5nKTtcbiAgICB2b2lkIHBlbmRpbmcudGhlbihcbiAgICAgICh2YWxpZGF0b3IpID0+IHtcbiAgICAgICAgdGhpcy5odHRwVmFsaWRhdG9ycy5zZXQoYXBpLCB2YWxpZGF0b3IpO1xuICAgICAgICB0aGlzLnBlbmRpbmdIdHRwVmFsaWRhdG9ycy5kZWxldGUoYXBpKTtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMucGVuZGluZ0h0dHBWYWxpZGF0b3JzLmRlbGV0ZShhcGkpO1xuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiBwZW5kaW5nO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZEh0dHBWYWxpZGF0b3IoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICBkZXBlbmRlbmNpZXM6IFNvbmFtdUh0dHBWYWxpZGF0b3JEZXBlbmRlbmNpZXMsXG4gICk6IFByb21pc2U8SHR0cFZhbGlkYXRvcj4ge1xuICAgIGNvbnN0IHBvbGljeSA9IG5vcm1hbGl6ZVpvZENvbXBpbGVyUG9saWN5KHRoaXMuY29uZmlnLnZhbGlkYXRpb24/LnpvZENvbXBpbGVyKTtcbiAgICBjb25zdCBzb3VyY2VBb3QgPSBwcm9jZXNzLmVudi5IT1QgPT09IFwieWVzXCIgfHwgcHJvY2Vzcy5lbnYuVklURVNUID09PSBcInRydWVcIjtcbiAgICBpZiAocG9saWN5LmFwaSA9PT0gXCJhb3RcIiAmJiAhc291cmNlQW90KSB7XG4gICAgICBjb25zdCByZWdpc3RyeSA9IHRoaXMuYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5ID8/IChhd2FpdCB0aGlzLmxvYWRBb3RIdHRwVmFsaWRhdG9yUmVnaXN0cnkoKSk7XG4gICAgICByZXR1cm4gdGhpcy5nZXRBb3RIdHRwVmFsaWRhdG9yKGFwaSwgcmVnaXN0cnkpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBkZXBlbmRlbmNpZXMuY3JlYXRlVmFsaWRhdG9yKHtcbiAgICAgIGFwaSxcbiAgICAgIHBvbGljeSxcbiAgICAgIHR5cGVzOiB0aGlzLnN5bmNlci50eXBlcyxcbiAgICAgIGFsbG93QW90U291cmNlRmFsbGJhY2s6IHNvdXJjZUFvdCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QW90SHR0cFZhbGlkYXRvcihhcGk6IEV4dGVuZGVkQXBpLCByZWdpc3RyeTogSHR0cFZhbGlkYXRvclJlZ2lzdHJ5KTogSHR0cFZhbGlkYXRvciB7XG4gICAgY29uc3Qgcm91dGVLZXkgPSBnZXRIdHRwVmFsaWRhdG9yUm91dGVLZXkoYXBpKTtcbiAgICBjb25zdCB2YWxpZGF0b3IgPSByZWdpc3RyeS52YWxpZGF0b3JzLmdldChyb3V0ZUtleSk7XG4gICAgaWYgKHZhbGlkYXRvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgdmFsaWRhdG9yIHJlZ2lzdHJ5IGlzIG1pc3NpbmcgJHtyb3V0ZUtleX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkYXRvcjtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZEFvdEh0dHBWYWxpZGF0b3JSZWdpc3RyeShcbiAgICBhcGlzOiByZWFkb25seSBFeHRlbmRlZEFwaVtdID0gdGhpcy5zeW5jZXIuYXBpcyxcbiAgICBkZXBlbmRlbmNpZXM6IFNvbmFtdUh0dHBWYWxpZGF0b3JEZXBlbmRlbmNpZXMgPSBkZWZhdWx0U29uYW11SHR0cFZhbGlkYXRvckRlcGVuZGVuY2llcyxcbiAgKTogUHJvbWlzZTxIdHRwVmFsaWRhdG9yUmVnaXN0cnk+IHtcbiAgICBjb25zdCB7IHBhdGhUb0ZpbGVVUkwgfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6dXJsXCIpO1xuICAgIGNvbnN0IHJlZ2lzdHJ5UGF0aCA9IHBhdGguam9pbihcbiAgICAgIHRoaXMuYXBpUm9vdFBhdGgsXG4gICAgICBcImRpc3QvYXBwbGljYXRpb24vc29uYW11LnZhbGlkYXRvcnMuZ2VuZXJhdGVkLmpzXCIsXG4gICAgKTtcbiAgICBpZiAoIShhd2FpdCBleGlzdHMocmVnaXN0cnlQYXRoKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgR2VuZXJhdGVkIEhUVFAgdmFsaWRhdG9yIHJlZ2lzdHJ5IG5vdCBmb3VuZDogJHtyZWdpc3RyeVBhdGh9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgaW1wb3J0ZWQgPVxuICAgICAgLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChhd2FpdCBpbXBvcnQoXG4gICAgICAgIHBhdGhUb0ZpbGVVUkwocmVnaXN0cnlQYXRoKS5ocmVmXG4gICAgICApKSBhcyB7XG4gICAgICAgIGZpbmdlcnByaW50PzogdW5rbm93bjtcbiAgICAgICAgdmFsaWRhdG9ycz86IHVua25vd247XG4gICAgICB9O1xuICAgIGlmICghaXNTdHJpbmdWYWx1ZShpbXBvcnRlZC5maW5nZXJwcmludCkgfHwgIShpbXBvcnRlZC52YWxpZGF0b3JzIGluc3RhbmNlb2YgTWFwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGdlbmVyYXRlZCBIVFRQIHZhbGlkYXRvciByZWdpc3RyeTogJHtyZWdpc3RyeVBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsaWRhdG9yXSBvZiBpbXBvcnRlZC52YWxpZGF0b3JzKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFpc1N0cmluZ1ZhbHVlKGtleSkgfHxcbiAgICAgICAgIWlzT2JqZWN0VmFsdWUodmFsaWRhdG9yKSB8fFxuICAgICAgICB2YWxpZGF0b3IgPT09IG51bGwgfHxcbiAgICAgICAgIShcInBhcnNlXCIgaW4gdmFsaWRhdG9yKSB8fFxuICAgICAgICAhaXNGdW5jdGlvblZhbHVlKHZhbGlkYXRvci5wYXJzZSlcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgSFRUUCB2YWxpZGF0b3IgcmVnaXN0cnkgZW50cnk6ICR7U3RyaW5nKGtleSl9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVnaXN0cnk6IEh0dHBWYWxpZGF0b3JSZWdpc3RyeSA9IHtcbiAgICAgIGZpbmdlcnByaW50OiBpbXBvcnRlZC5maW5nZXJwcmludCxcbiAgICAgIHZhbGlkYXRvcnM6IGltcG9ydGVkLnZhbGlkYXRvcnMsXG4gICAgfTtcbiAgICBkZXBlbmRlbmNpZXMuYXNzZXJ0UmVnaXN0cnkoYXBpcywgcmVnaXN0cnkpO1xuICAgIHJldHVybiByZWdpc3RyeTtcbiAgfVxuXG4gIGFzeW5jIHJlZnJlc2hIdHRwVmFsaWRhdG9ycyhcbiAgICBkZXBlbmRlbmNpZXM6IFNvbmFtdUh0dHBWYWxpZGF0b3JEZXBlbmRlbmNpZXMgPSBkZWZhdWx0U29uYW11SHR0cFZhbGlkYXRvckRlcGVuZGVuY2llcyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcG9saWN5ID0gbm9ybWFsaXplWm9kQ29tcGlsZXJQb2xpY3kodGhpcy5jb25maWcudmFsaWRhdGlvbj8uem9kQ29tcGlsZXIpO1xuICAgIGNvbnN0IHNvdXJjZUFvdCA9IHByb2Nlc3MuZW52LkhPVCA9PT0gXCJ5ZXNcIiB8fCBwcm9jZXNzLmVudi5WSVRFU1QgPT09IFwidHJ1ZVwiO1xuICAgIGNvbnN0IG5leHRBcGlzID0gWy4uLnRoaXMuc3luY2VyLmFwaXNdO1xuICAgIGNvbnN0IG5leHRNb2RlbHMgPSB7IC4uLnRoaXMuc3luY2VyLm1vZGVscyB9O1xuICAgIGNvbnN0IHJlc3RBcGlzID0gbmV4dEFwaXMuZmlsdGVyKChhcGkpID0+IGFwaS53ZWJzb2NrZXRPcHRpb25zID09PSB1bmRlZmluZWQpO1xuICAgIGNvbnN0IG5leHQgPSBuZXcgV2Vha01hcDxFeHRlbmRlZEFwaSwgSHR0cFZhbGlkYXRvcj4oKTtcbiAgICBsZXQgbmV4dEFvdFJlZ2lzdHJ5OiBIdHRwVmFsaWRhdG9yUmVnaXN0cnkgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAocG9saWN5LmFwaSA9PT0gXCJhb3RcIiAmJiAhc291cmNlQW90KSB7XG4gICAgICBjb25zdCByZWdpc3RyeSA9IGF3YWl0IHRoaXMubG9hZEFvdEh0dHBWYWxpZGF0b3JSZWdpc3RyeShuZXh0QXBpcywgZGVwZW5kZW5jaWVzKTtcbiAgICAgIGZvciAoY29uc3QgYXBpIG9mIHJlc3RBcGlzKSB7XG4gICAgICAgIG5leHQuc2V0KGFwaSwgdGhpcy5nZXRBb3RIdHRwVmFsaWRhdG9yKGFwaSwgcmVnaXN0cnkpKTtcbiAgICAgIH1cbiAgICAgIG5leHRBb3RSZWdpc3RyeSA9IHJlZ2lzdHJ5O1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgcmVzdEFwaXMubWFwKGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSBhd2FpdCB0aGlzLmJ1aWxkSHR0cFZhbGlkYXRvcihhcGksIGRlcGVuZGVuY2llcyk7XG4gICAgICAgICAgbmV4dC5zZXQoYXBpLCB2YWxpZGF0b3IpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdG9y7JmAIOqwmeydgCByZXZpc2lvbuydmCBBUEkvbW9kZWwgc25hcHNob3TsnYQg7ZWo6ruYIOqzteqwnO2VtCBITVIg7KSR6rCEIOyDge2DnOulvCDsiKjquYHri4jri6QuXG4gICAgdGhpcy5odHRwVmFsaWRhdG9ycyA9IG5leHQ7XG4gICAgdGhpcy5wZW5kaW5nSHR0cFZhbGlkYXRvcnMgPSBuZXcgV2Vha01hcCgpO1xuICAgIHRoaXMuYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5ID0gbmV4dEFvdFJlZ2lzdHJ5O1xuICAgIHRoaXMucHJlcGFyZWRBcGlzID0gbmV4dEFwaXM7XG4gICAgdGhpcy5wcmVwYXJlZE1vZGVscyA9IG5leHRNb2RlbHM7XG4gIH1cblxuICAvLyBXUyBwYXRo66W8IOydvOuwmCBIVFRQIEdFVOycvOuhnCDtmLjstpztlZwg6rK97JqwIDQyNiArIFVwZ3JhZGUg7Zek642U66GcIOuqheyLnOyggeycvOuhnCB3ZWJzb2NrZXQg7KCR7IaN7J2EIOycoOuPhO2VqFxuICBwcml2YXRlIGNyZWF0ZVdlYlNvY2tldFVwZ3JhZGVSZXF1aXJlZEhhbmRsZXIoKSB7XG4gICAgcmV0dXJuIGFzeW5jIChfcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIHJlcGx5LmhlYWRlcihcImNvbm5lY3Rpb25cIiwgXCJVcGdyYWRlXCIpLmhlYWRlcihcInVwZ3JhZGVcIiwgXCJ3ZWJzb2NrZXRcIikuc3RhdHVzKDQyNikuc2VuZCh7XG4gICAgICAgIG1lc3NhZ2U6IFwiV2ViU29ja2V0IHVwZ3JhZGUgcmVxdWlyZWRcIixcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICAvLyBkZXYg66qo65Oc7J2YIGNhdGNoLWFsbCB3c0hhbmRsZXLsl5DshJwg7Iuk7KCcIFdTIEFQSeuhnCDrlJTsiqTtjKjsuZjtlaguIOunpOy5reuQmOuKlCByb3V0ZeqwgCDsl4bsnLzrqbQgMTAwOOuhnCDri6vsnYxcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVEZXZXZWJTb2NrZXRSZXF1ZXN0KFxuICAgIHNvY2tldDogV2ViU29ja2V0LFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWF0Y2hlZEFwaSA9IHRoaXMuZmluZE1hdGNoZWRBcGkocmVxdWVzdCwgdGhpcy5zeW5jZXIuYXBpcywgdGhpcy5zeW5jZXIubW9kZWxzKTtcbiAgICBpZiAoIW1hdGNoZWRBcGk/LndlYnNvY2tldE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHRyYWNlQ29udGV4dCA9IHRoaXMud2Vic29ja2V0UnVudGltZS50ZWxlbWV0cnlDb250cm9sbGVyLmNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0KHtcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgfSk7XG4gICAgICB0aGlzLndlYnNvY2tldFJ1bnRpbWUudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5jb25uZWN0aW9uLnJlamVjdGVkXCIsXG4gICAgICAgIGxldmVsOiBcIndhcm5cIixcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcmVhc29uOiBcInJvdXRlTm90Rm91bmRcIixcbiAgICAgICAgICBwYXRoOiByZXF1ZXN0LnVybCxcbiAgICAgICAgfSxcbiAgICAgICAgdHJhY2VJZDogdHJhY2VDb250ZXh0LnRyYWNlSWQsXG4gICAgICAgIHNwYW5JZDogdHJhY2VDb250ZXh0LnNwYW5JZCxcbiAgICAgICAgcGFyZW50U3BhbklkOiB0cmFjZUNvbnRleHQucGFyZW50U3BhbklkLFxuICAgICAgICBzYW1wbGVkOiB0cmFjZUNvbnRleHQuc2FtcGxlZCxcbiAgICAgIH0pO1xuICAgICAgc29ja2V0LmNsb3NlKDEwMDgsIFwiV2ViU29ja2V0IHJvdXRlIG5vdCBmb3VuZFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5jcmVhdGVXZWJTb2NrZXRIYW5kbGVyKG1hdGNoZWRBcGksIGNvbmZpZyk7XG4gICAgYXdhaXQgaGFuZGxlcih7IHNvY2tldCB9LCByZXF1ZXN0KTtcbiAgfVxuXG4gIC8vIFdTIHJvdXRlIO2VuOuTpOufrOydmCDsi6Ttlokg7Iic7ISc66W8IOqzoOygle2VqDpcbiAgLy8gMSkgcXVlcnkgcGFyYW0g7YyM7Iux7J2EIGFjdGl2YXRpb24g7KCE7JeQIOuBneuCtCBoYW5kc2hha2Ug7Iuk7Yyo6rCAIHJlZ2lzdHJ57JeQIOuFuOy2nOuQmOyngCDslYrqsowg7ZWoXG4gIC8vIDIpIGBhY3RpdmU6IGZhbHNlYOuhnCDrqLzsoIAg65Ox66Gd7ZWcIOuSpCBjb250ZXh0IOyViOyXkOyEnCBndWFyZOulvCDsi6TtlontlbQg7J247KadIOygleuztOulvCDssLjsobDtlaAg7IiYIOyeiOqyjCDtlahcbiAgLy8gMykgY29udGV4dC9ndWFyZCDspIDruYTqsIAg64Gd64KcIOuSpCBgYWN0aXZhdGUoKWDtlbQg67iM66Gc65Oc7LqQ7Iqk7Yq46rCAIOy0iOq4sO2ZlCDspJHqsIQg7IOB7YOc66W8IOuztOyngCDrqrvtlZjqsowg7ZWoXG4gIC8vIOyXkOufrCDrsJzsg50g7Iuc7JeQ64qUIHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3Ig7KCV7LGF7JeQIOuUsOudvCBjbG9zZSBjb2Rl66W8IOunpO2Vke2VqFxuICBjcmVhdGVXZWJTb2NrZXRIYW5kbGVyRm9yVGVzdGluZyhhcGk6IEV4dGVuZGVkQXBpLCBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVXZWJTb2NrZXRIYW5kbGVyKGFwaSwgY29uZmlnKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlV2ViU29ja2V0SGFuZGxlcihhcGk6IEV4dGVuZGVkQXBpLCBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcpIHtcbiAgICByZXR1cm4gYXN5bmMgKFxuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICBzb2NrZXQ6IFdlYlNvY2tldDtcbiAgICAgIH0sXG4gICAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGNvbnN0IHNvY2tldCA9IGNvbm5lY3Rpb24uc29ja2V0O1xuICAgICAgbGV0IHdzQ29udGV4dDogV2ViU29ja2V0Q29udGV4dDxvYmplY3QsIG9iamVjdD4gfCBudWxsID0gbnVsbDtcbiAgICAgIGxldCByYXdXczogUmV0dXJuVHlwZTxXZWJTb2NrZXRSdW50aW1lW1wicmVnaXN0ZXJDb25uZWN0aW9uXCJdPiB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IHByZVJlZ2lzdGVyUGhhc2U6IFwiZ3VhcmRcIiB8IFwicXVlcnlcIiB8IFwicmVnaXN0ZXJcIiB8IFwiaGFuZGxlclwiID0gXCJndWFyZFwiO1xuICAgICAgbGV0IHRyYWNlQ29udGV4dDogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQgPSB7fTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdHJhY2VDb250ZXh0ID0gdGhpcy53ZWJzb2NrZXRSdW50aW1lLnRlbGVtZXRyeUNvbnRyb2xsZXIuY3JlYXRlQ29ubmVjdGlvbkNvbnRleHQoe1xuICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcHJlUmVnaXN0ZXJQaGFzZSA9IFwicXVlcnlcIjtcbiAgICAgICAgY29uc3QgcmVxQm9keSA9IGF3YWl0IHRoaXMucGFyc2VXZWJTb2NrZXRSZXF1ZXN0UGFyYW1zKGFwaSwgcmVxdWVzdCk7XG4gICAgICAgIHByZVJlZ2lzdGVyUGhhc2UgPSBcInJlZ2lzdGVyXCI7XG4gICAgICAgIHJhd1dzID0gdGhpcy53ZWJzb2NrZXRSdW50aW1lLnJlZ2lzdGVyQ29ubmVjdGlvbihzb2NrZXQsIHtcbiAgICAgICAgICBvdXRFdmVudHM6IGFwaS53ZWJzb2NrZXRPcHRpb25zIS5vdXRFdmVudHMsXG4gICAgICAgICAgaW5FdmVudHM6IGFwaS53ZWJzb2NrZXRPcHRpb25zIS5pbkV2ZW50cyxcbiAgICAgICAgICBuYW1lc3BhY2U6IGFwaS53ZWJzb2NrZXRPcHRpb25zIS5uYW1lc3BhY2UsXG4gICAgICAgICAgaGVhcnRiZWF0OiBhcGkud2Vic29ja2V0T3B0aW9ucyEuaGVhcnRiZWF0LFxuICAgICAgICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgICAgICAgdHJhY2VJZDogdHJhY2VDb250ZXh0LnRyYWNlSWQsXG4gICAgICAgICAgc3BhbklkOiB0cmFjZUNvbnRleHQuc3BhbklkLFxuICAgICAgICAgIHBhcmVudFNwYW5JZDogdHJhY2VDb250ZXh0LnBhcmVudFNwYW5JZCxcbiAgICAgICAgICBzYW1wbGVkOiB0cmFjZUNvbnRleHQuc2FtcGxlZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc2NvcGVkV3MgPSB0aGlzLmNyZWF0ZVNjb3BlZFdlYlNvY2tldENvbm5lY3Rpb24ocmF3V3MsICgpID0+IHdzQ29udGV4dCk7XG4gICAgICAgIHdzQ29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlV2ViU29ja2V0Q29udGV4dChjb25maWcsIHJlcXVlc3QsIHNjb3BlZFdzKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQ6IHdzQ29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgcnVuR3VhcmRzKHtcbiAgICAgICAgICAgIGd1YXJkczogYXBpLm9wdGlvbnMuZ3VhcmRzLFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIGFwaSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lLmFjdGl2YXRlQ29ubmVjdGlvbihyYXdXcy5pZCk7XG4gICAgICAgIHByZVJlZ2lzdGVyUGhhc2UgPSBcImhhbmRsZXJcIjtcblxuICAgICAgICBjb25zdCB7IEFwaVBhcmFtVHlwZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIik7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBhcGkucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgICAgaWYgKEFwaVBhcmFtVHlwZS5pc0NvbnRleHQocGFyYW0udHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB3c0NvbnRleHQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHJlcUJvZHkuZ2V0KHBhcmFtLm5hbWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQ6IHdzQ29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5pbnZva2VNb2RlbE1ldGhvZChhcGksIGFyZ3MpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGNsb3NlRGVzY3JpcHRvciA9IHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3IoZXJyb3IpO1xuICAgICAgICBpZiAoIXJhd1dzKSB7XG4gICAgICAgICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICAgICAgICBuYW1lOiBcIndzLmNvbm5lY3Rpb24ucmVqZWN0ZWRcIixcbiAgICAgICAgICAgIGxldmVsOiBjbG9zZURlc2NyaXB0b3IubG9nTGV2ZWwgPT09IFwid2FyblwiID8gXCJ3YXJuXCIgOiBcImVycm9yXCIsXG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgcmVhc29uOiBwcmVSZWdpc3RlclBoYXNlLFxuICAgICAgICAgICAgICBjb2RlOiBjbG9zZURlc2NyaXB0b3IuY29kZSxcbiAgICAgICAgICAgICAgcGF0aDogYXBpLnBhdGgsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHJhY2VJZDogdHJhY2VDb250ZXh0LnRyYWNlSWQsXG4gICAgICAgICAgICBzcGFuSWQ6IHRyYWNlQ29udGV4dC5zcGFuSWQsXG4gICAgICAgICAgICBwYXJlbnRTcGFuSWQ6IHRyYWNlQ29udGV4dC5wYXJlbnRTcGFuSWQsXG4gICAgICAgICAgICBzYW1wbGVkOiB0cmFjZUNvbnRleHQuc2FtcGxlZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyYXdXcykge1xuICAgICAgICAgIHJhd1dzLmNsb3NlKGNsb3NlRGVzY3JpcHRvci5jb2RlLCBjbG9zZURlc2NyaXB0b3IucmVhc29uKTtcbiAgICAgICAgfSBlbHNlIGlmIChzb2NrZXQucmVhZHlTdGF0ZSA8IDIpIHtcbiAgICAgICAgICBzb2NrZXQuY2xvc2UoY2xvc2VEZXNjcmlwdG9yLmNvZGUsIGNsb3NlRGVzY3JpcHRvci5yZWFzb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2VydmVyPy5sb2cpIHtcbiAgICAgICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICAgICAgZXJyOiBlcnJvcixcbiAgICAgICAgICAgIG1vZGVsTmFtZTogYXBpLm1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1ldGhvZE5hbWU6IGFwaS5tZXRob2ROYW1lLFxuICAgICAgICAgICAgcGF0aDogYXBpLnBhdGgsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoY2xvc2VEZXNjcmlwdG9yLmxvZ0xldmVsID09PSBcIndhcm5cIikge1xuICAgICAgICAgICAgdGhpcy5zZXJ2ZXIubG9nLndhcm4ocGF5bG9hZCwgY2xvc2VEZXNjcmlwdG9yLnJlYXNvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmVyLmxvZy5lcnJvcihwYXlsb2FkLCBjbG9zZURlc2NyaXB0b3IucmVhc29uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGNsb3NlRGVzY3JpcHRvci5sb2dMZXZlbCA9PT0gXCJ3YXJuXCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihjbG9zZURlc2NyaXB0b3IucmVhc29uLCBlcnJvcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2xvc2VEZXNjcmlwdG9yLnJlYXNvbiwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBvbk1lc3NhZ2Uvb25DbG9zZeyymOufvCDri6TrpbggdGlja+yXkOyEnCDsi6TtlonrkJjripQgY2FsbGJhY2vsnYAgQUxTIGNvbnRleHTqsIAg64GK6riw66+A66GcIHdyYXBwZXLsl5DshJwgYGFzeW5jTG9jYWxTdG9yYWdlLnJ1bmDsnLzroZwg64uk7IucIOqwkOyLuCDrs7Xsm5DtlahcbiAgLy8gcHVibGlzaC9qb2luL2xlYXZlL3NldFVzZXJJZCDqsJnsnYAg7KaJ7IucIOyLpO2WiSBBUEnripQg64uo7IicIOychOyehOunjCDtlZjqs6AsIGRlZmVycmVkIGNhbGxiYWNr7JeQ66eMIGNvbnRleHQg67O17JuQ7J2EIOyggeyaqe2VqFxuICBwcml2YXRlIGNyZWF0ZVNjb3BlZFdlYlNvY2tldENvbm5lY3Rpb248VE91dCBleHRlbmRzIG9iamVjdCwgVEluIGV4dGVuZHMgb2JqZWN0PihcbiAgICB3czogV2ViU29ja2V0Q29ubmVjdGlvbjxUT3V0LCBUSW4+LFxuICAgIGdldENvbnRleHQ6ICgpID0+IFdlYlNvY2tldENvbnRleHQgfCBudWxsLFxuICApOiBXZWJTb2NrZXRDb25uZWN0aW9uPFRPdXQsIFRJbj4ge1xuICAgIGNvbnN0IHRlbGVtZXRyeUNvbnRyb2xsZXIgPSB0aGlzLndlYnNvY2tldFJ1bnRpbWVWYWx1ZT8udGVsZW1ldHJ5Q29udHJvbGxlcjtcbiAgICBjb25zdCBydW5JbkNvbnRleHQgPSA8VD4oY2FsbGJhY2s6ICgpID0+IFQpOiBUID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7XG4gICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQgfSwgY2FsbGJhY2spO1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gd3MuaWQ7XG4gICAgICB9LFxuICAgICAgZ2V0IG5hbWVzcGFjZSgpIHtcbiAgICAgICAgcmV0dXJuIHdzLm5hbWVzcGFjZTtcbiAgICAgIH0sXG4gICAgICBnZXQgY2xvc2VkKCkge1xuICAgICAgICByZXR1cm4gd3MuY2xvc2VkO1xuICAgICAgfSxcbiAgICAgIGdldCB1c2VySWQoKSB7XG4gICAgICAgIHJldHVybiB3cy51c2VySWQ7XG4gICAgICB9LFxuICAgICAgdHJhbnNwb3J0OiBcIndzXCIsXG4gICAgICBwdWJsaXNoVW50eXBlZChldmVudCwgZGF0YSkge1xuICAgICAgICB3cy5wdWJsaXNoVW50eXBlZChldmVudCwgZGF0YSk7XG4gICAgICB9LFxuICAgICAgY2xvc2UoY29kZSwgcmVhc29uKSB7XG4gICAgICAgIHdzLmNsb3NlKGNvZGUsIHJlYXNvbik7XG4gICAgICB9LFxuICAgICAgb25DbG9zZShjYWxsYmFjaykge1xuICAgICAgICB3cy5vbkNsb3NlKCgpID0+IHJ1bkluQ29udGV4dChjYWxsYmFjaykpO1xuICAgICAgfSxcbiAgICAgIG9uTWVzc2FnZShldmVudCwgaGFuZGxlcikge1xuICAgICAgICB3cy5vbk1lc3NhZ2UoZXZlbnQsIChkYXRhLCBtZXNzYWdlVHJhY2VDb250ZXh0KSA9PlxuICAgICAgICAgIHJ1bkluQ29udGV4dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBTdHJpbmcoZXZlbnQpO1xuICAgICAgICAgICAgY29uc3QgdHJhY2VDb250ZXh0ID0gbWVzc2FnZVRyYWNlQ29udGV4dCA/PyBnZXRXZWJTb2NrZXRUZWxlbWV0cnlDb250ZXh0KHdzKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gICAgICAgICAgICB0ZWxlbWV0cnlDb250cm9sbGVyPy5lbWl0KHtcbiAgICAgICAgICAgICAgbmFtZTogXCJ3cy5oYW5kbGVyLnN0YXJ0ZWRcIixcbiAgICAgICAgICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgICAgICAgICAgY29ubmVjdGlvbklkOiB3cy5pZCxcbiAgICAgICAgICAgICAgbmFtZXNwYWNlOiB3cy5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgIHVzZXJJZDogd3MudXNlcklkLFxuICAgICAgICAgICAgICBkZXRhaWw6IHsgZXZlbnQ6IGV2ZW50TmFtZSB9LFxuICAgICAgICAgICAgICAuLi50cmFjZUNvbnRleHQsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlcihkYXRhLCBtZXNzYWdlVHJhY2VDb250ZXh0KTtcbiAgICAgICAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRlZEF0O1xuICAgICAgICAgICAgICB0ZWxlbWV0cnlDb250cm9sbGVyPy5lbWl0KHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcIndzLmhhbmRsZXIuY29tcGxldGVkXCIsXG4gICAgICAgICAgICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQ6IHdzLmlkLFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogd3MubmFtZXNwYWNlLFxuICAgICAgICAgICAgICAgIHVzZXJJZDogd3MudXNlcklkLFxuICAgICAgICAgICAgICAgIGRldGFpbDogeyBldmVudDogZXZlbnROYW1lIH0sXG4gICAgICAgICAgICAgICAgLi4udHJhY2VDb250ZXh0LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdGVsZW1ldHJ5Q29udHJvbGxlcj8ucmVjb3JkU3Bhbih7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogXCJ3cy5tZXNzYWdlLnByb2Nlc3NcIixcbiAgICAgICAgICAgICAgICBraW5kOiBcImludGVybmFsXCIsXG4gICAgICAgICAgICAgICAgZHVyYXRpb25NcyxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IFwidW5zZXRcIixcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQ6IHdzLmlkLFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogd3MubmFtZXNwYWNlLFxuICAgICAgICAgICAgICAgIHVzZXJJZDogd3MudXNlcklkLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHsgZXZlbnQ6IGV2ZW50TmFtZSB9LFxuICAgICAgICAgICAgICAgIC4uLnRyYWNlQ29udGV4dCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkQXQ7XG4gICAgICAgICAgICAgIHRlbGVtZXRyeUNvbnRyb2xsZXI/LmVtaXQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IFwid3MuaGFuZGxlci5mYWlsZWRcIixcbiAgICAgICAgICAgICAgICBsZXZlbDogXCJlcnJvclwiLFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25JZDogd3MuaWQsXG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlOiB3cy5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgdXNlcklkOiB3cy51c2VySWQsXG4gICAgICAgICAgICAgICAgZGV0YWlsOiB7IGV2ZW50OiBldmVudE5hbWUgfSxcbiAgICAgICAgICAgICAgICAuLi50cmFjZUNvbnRleHQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0ZWxlbWV0cnlDb250cm9sbGVyPy5yZWNvcmRTcGFuKHtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lOiBcIndzLm1lc3NhZ2UucHJvY2Vzc1wiLFxuICAgICAgICAgICAgICAgIGtpbmQ6IFwiaW50ZXJuYWxcIixcbiAgICAgICAgICAgICAgICBkdXJhdGlvbk1zLFxuICAgICAgICAgICAgICAgIHN0YXR1czogXCJlcnJvclwiLFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25JZDogd3MuaWQsXG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlOiB3cy5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgdXNlcklkOiB3cy51c2VySWQsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogeyBldmVudDogZXZlbnROYW1lIH0sXG4gICAgICAgICAgICAgICAgZXJyb3JUeXBlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubmFtZSA6IHJ1bnRpbWVUeXBlT2YoZXJyb3IpLFxuICAgICAgICAgICAgICAgIC4uLnRyYWNlQ29udGV4dCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIHB1Ymxpc2goZXZlbnQsIGRhdGEpIHtcbiAgICAgICAgd3MucHVibGlzaChldmVudCwgZGF0YSk7XG4gICAgICB9LFxuICAgICAgd2FpdEZvckNsb3NlKCkge1xuICAgICAgICByZXR1cm4gd3Mud2FpdEZvckNsb3NlKCk7XG4gICAgICB9LFxuICAgICAgam9pbihyb29tSWQpIHtcbiAgICAgICAgd3Muam9pbihyb29tSWQpO1xuICAgICAgfSxcbiAgICAgIGxlYXZlKHJvb21JZCkge1xuICAgICAgICB3cy5sZWF2ZShyb29tSWQpO1xuICAgICAgfSxcbiAgICAgIHNldFVzZXJJZCh1c2VySWQpIHtcbiAgICAgICAgd3Muc2V0VXNlcklkKHVzZXJJZCk7XG4gICAgICB9LFxuICAgICAgY2xlYXJVc2VySWQoKSB7XG4gICAgICAgIHdzLmNsZWFyVXNlcklkKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBjcmVhdGVTY29wZWRXZWJTb2NrZXRDb25uZWN0aW9uRm9yVGVzdGluZzxUT3V0IGV4dGVuZHMgb2JqZWN0LCBUSW4gZXh0ZW5kcyBvYmplY3Q+KFxuICAgIHdzOiBXZWJTb2NrZXRDb25uZWN0aW9uPFRPdXQsIFRJbj4sXG4gICAgZ2V0Q29udGV4dDogKCkgPT4gV2ViU29ja2V0Q29udGV4dCB8IG51bGwsXG4gICk6IFdlYlNvY2tldENvbm5lY3Rpb248VE91dCwgVEluPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlU2NvcGVkV2ViU29ja2V0Q29ubmVjdGlvbih3cywgZ2V0Q29udGV4dCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBhcnNlV2ViU29ja2V0UmVxdWVzdFBhcmFtcyhcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICApOiBQcm9taXNlPE1hcDxzdHJpbmcsIEFwaUFyZ3VtZW50Pj4ge1xuICAgIGNvbnN0IHsgZ2V0Wm9kT2JqZWN0RnJvbUFwaSB9ID0gYXdhaXQgaW1wb3J0KFwiLi9jb2RlLWNvbnZlcnRlcnNcIik7XG4gICAgY29uc3QgUmVxVHlwZSA9IGdldFpvZE9iamVjdEZyb21BcGkoYXBpLCB0aGlzLnN5bmNlci50eXBlcyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBmYXN0aWZ5Q2FzdGVyIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2Nhc3RlclwiKTtcbiAgICAgIHJldHVybiB0b0FwaUFyZ3VtZW50TWFwKGZhc3RpZnlDYXN0ZXIoUmVxVHlwZSkucGFyc2UocmVxdWVzdC5xdWVyeSA/PyB7fSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IHsgWm9kRXJyb3IgfSA9IGF3YWl0IGltcG9ydChcInpvZFwiKTtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgWm9kRXJyb3IpIHtcbiAgICAgICAgY29uc3QgeyBodW1hbml6ZVpvZEVycm9yIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy96b2QtZXJyb3JcIik7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gaHVtYW5pemVab2RFcnJvcihlKVxuICAgICAgICAgIC5tYXAoKGlzc3VlKSA9PiBpc3N1ZS5tZXNzYWdlKVxuICAgICAgICAgIC5qb2luKFwiIFwiKTtcbiAgICAgICAgY29uc3QgeyBCYWRSZXF1ZXN0RXhjZXB0aW9uIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIik7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICAgIC8qIFNBRkVUWTogQVBJIOuNsOy9lOugiOydtO2EsOyZgCBab2Qg6rKA7Kad6riwIOuTseuhnSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBtZXNzYWdlcyBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgem9kRXJyb3I6IGUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVVJM7JeQ7IScIHBhdGggcGFyYW1z66W8IOy2lOy2nO2VqeuLiOuLpC5cbiAgICog7JiIOiBwYXR0ZXJuPVwiL2FkbWluL2NvbXBhbmllcy86Y29tcGFueUlkXCIsIHVybD1cIi9hZG1pbi9jb21wYW5pZXMvMTIzXCIg4oaSIHsgY29tcGFueUlkOiBcIjEyM1wiIH1cbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdFBhdGhQYXJhbXMocGF0dGVybjogc3RyaW5nLCB1cmw6IHN0cmluZykge1xuICAgIGNvbnN0IHBhdHRlcm5QYXJ0cyA9IHBhdHRlcm4uc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCB1cmxQYXJ0cyA9IHRoaXMuZ2V0UGF0aG5hbWVGcm9tVXJsKHVybCkuc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVyblBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocGF0dGVyblBhcnRzW2ldLnN0YXJ0c1dpdGgoXCI6XCIpKSB7XG4gICAgICAgIHBhcmFtc1twYXR0ZXJuUGFydHNbaV0uc2xpY2UoMSldID0gdXJsUGFydHNbaV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIGlzUGF0aFBhdHRlcm5NYXRjaChwYXR0ZXJuOiBzdHJpbmcsIHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGF0dGVyblBhcnRzID0gcGF0dGVybi5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IHVybFBhcnRzID0gdGhpcy5nZXRQYXRobmFtZUZyb21VcmwodXJsKS5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgaWYgKHBhdHRlcm5QYXJ0cy5sZW5ndGggIT09IHVybFBhcnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVyblBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwYXR0ZXJuUGFydCA9IHBhdHRlcm5QYXJ0c1tpXTtcbiAgICAgIGNvbnN0IHVybFBhcnQgPSB1cmxQYXJ0c1tpXTtcbiAgICAgIGlmIChwYXR0ZXJuUGFydC5zdGFydHNXaXRoKFwiOlwiKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXR0ZXJuUGFydCAhPT0gdXJsUGFydCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGdldFBhdGhuYW1lRnJvbVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHVybC5zcGxpdChcIj9cIilbMF07XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVQYXRoV2l0aGluQmFzZURpcihiYXNlRGlyOiBzdHJpbmcsIGlucHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVVUklDb21wb25lbnQoaW5wdXRQYXRoKS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcbiAgICAgIGlmIChkZWNvZGVkLmluY2x1ZGVzKFwiXFwwXCIpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gZGVjb2RlZC5yZXBsYWNlKC9eXFwvKy8sIFwiXCIpO1xuICAgICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcGF0aC5yZXNvbHZlKGJhc2VEaXIsIHJlbGF0aXZlUGF0aCk7XG4gICAgICBjb25zdCByZWxhdGl2ZUZyb21CYXNlID0gcGF0aC5yZWxhdGl2ZShiYXNlRGlyLCByZXNvbHZlZFBhdGgpO1xuICAgICAgaWYgKHJlbGF0aXZlRnJvbUJhc2Uuc3RhcnRzV2l0aChcIi4uXCIpIHx8IHBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZUZyb21CYXNlKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNvbHZlZFBhdGg7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQVBJIOydkeuLteyXkCDsoIHsmqntlaAgQ2FjaGUtQ29udHJvbCDshKTsoJXsnYQg6rKw7KCV7ZWp64uI64ukLlxuICAgKiDsmrDshKDsiJzsnIQ6IOqwnOuzhCDsp4DsoJUgPiBjYWNoZUNvbnRyb2xIYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIGdldEFwaUNhY2hlQ29udHJvbChcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKSB7XG4gICAgLy8g642w7L2U66CI7J207YSwIOyEpOyglSDsmrDshKBcbiAgICBpZiAoYXBpLm9wdGlvbnMuY2FjaGVDb250cm9sKSB7XG4gICAgICByZXR1cm4gYXBpLm9wdGlvbnMuY2FjaGVDb250cm9sO1xuICAgIH1cblxuICAgIC8vIOyghOyXrSDtlbjrk6Trn6xcbiAgICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIpIHtcbiAgICAgIGNvbnN0IGNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgICB0eXBlOiBcImFwaVwiLFxuICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICBwYXRoOiByZXF1ZXN0LnJvdXRlT3B0aW9ucz8udXJsID8/IHJlcXVlc3QudXJsLnNwbGl0KFwiP1wiKVswXSxcbiAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgYXBpLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKGNhY2hlUmVxKTtcbiAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU1NS7JqpIEFQSSDtmLjstpwgKEhUVFAg7Jik67KE7Zek65OcIOyXhuydtCDsp4HsoJEg7Zi47LacKVxuICAgKiBjcmVhdGVBcGlIYW5kbGVy7J2YIOuhnOyngeydhCDsnqzsgqzsmqntlZjrkJgsIHJlcXVlc3Qg7YyM7IuxIOuMgOyLoCBwYXJhbXMg7KeB7KCRIOyCrOyaqVxuICAgKi9cbiAgYXN5bmMgaW52b2tlQXBpRm9yU1NSKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgcGFyYW1zOiBhbnlbXSxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgKTogUHJvbWlzZTxBcGlNZXRob2RSZXN1bHQ+IHtcbiAgICAvLyBDb250ZXh0IOyDneyEsSAo6riw7KG0IOuplOyGjOuTnCDsnqzsgqzsmqkpXG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlQ29udGV4dChjb25maWcsIHJlcXVlc3QsIHJlcGx5KTtcblxuICAgIHJldHVybiB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gYXJncyDsg53shLE6IENvbnRleHQg7YyM652866+47YSw64qUIOyjvOyehSwg64KY66i47KeA64qUIHBhcmFtc+yXkOyEnCDqsIDsoLjsmKTquLBcbiAgICAgIGNvbnN0IHsgQXBpUGFyYW1UeXBlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90eXBlcy90eXBlc1wiKTtcbiAgICAgIGxldCBwYXJhbXNJbmRleCA9IDA7XG4gICAgICBjb25zdCBhcmdzID0gYXBpLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICBpZiAoQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJhbXNbcGFyYW1zSW5kZXgrK107XG4gICAgICB9KTtcblxuICAgICAgLy8g66qo6424IOuplOyEnOuTnCDtmLjstpwgKOq4sOyhtCDrqZTshJzrk5wg7J6s7IKs7JqpKVxuICAgICAgcmV0dXJuIHRoaXMuaW52b2tlTW9kZWxNZXRob2QoYXBpLCBhcmdzLCByZXBseSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBoYW5kbGVEZXZBcGlSZXF1ZXN0Rm9yVGVzdGluZyhyZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlRGV2QXBpUmVxdWVzdChyZXF1ZXN0LCBjb25maWcpO1xuICB9XG5cbiAgLy8gV1Mg6rK966Gc7JeQ7ISc64qUIEhUVFAgcmVwbHnqsIAg7JeG7Jy866+A66GcIHJlcGx566W8IG9wdGlvbmFs66GcIOuwm+yVhCDqs7XthrUg7Zi47LacIOqyveuhnOulvCDsnKDsp4DtlahcbiAgYXN5bmMgaW52b2tlTW9kZWxNZXRob2QoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICBhcmdzOiB1bmtub3duW10sXG4gICAgcmVwbHk/OiBGYXN0aWZ5UmVwbHksXG4gICAgbW9kZWxzOiBMb2FkZWRNb2RlbHMgPSB0aGlzLnN5bmNlci5tb2RlbHMsXG4gICk6IFByb21pc2U8QXBpTWV0aG9kUmVzdWx0PiB7XG4gICAgY29uc3QgbW9kZWwgPSBtb2RlbHNbYXBpLm1vZGVsTmFtZV07XG4gICAgaWYgKG1vZGVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgbm90IGZvdW5kOiAke2FwaS5tb2RlbE5hbWV9YCk7XG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZCA9XG4gICAgICBtb2RlbFtcbiAgICAgICAgLyogU0FGRVRZOiDrj5nquLDtmZTquLDqsIAg66qo6424IO2BtOuemOyKpOyXkOyEnCDsiJjsp5HtlZwgQVBJIOuplOyEnOuTnCDsnbTrpoTrp4wg7KCE64us7ZWc64ukLiAqLyBhcGkubWV0aG9kTmFtZSBhcyBrZXlvZiB0eXBlb2YgbW9kZWxcbiAgICAgIF07XG4gICAgaWYgKCFpc0Z1bmN0aW9uVmFsdWUobWV0aG9kKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCBtZXRob2Qgbm90IGZvdW5kOiAke2FwaS5tb2RlbE5hbWV9LiR7YXBpLm1ldGhvZE5hbWV9YCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKG1ldGhvZCwgbW9kZWwsIGFyZ3MpO1xuICAgIHJlcGx5Py50eXBlKGFwaS5vcHRpb25zLmNvbnRlbnRUeXBlID8/IFwiYXBwbGljYXRpb24vanNvblwiKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyBjcmVhdGVDb250ZXh0KFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICByZXBseTogRmFzdGlmeVJlcGx5LFxuICApOiBQcm9taXNlPENvbnRleHQ+IHtcbiAgICAvLyBjcmVhdGVTU0VGYWN0b3J5IO2VqOyImOyXkCDrr7jrpqwgcmVxdWVzdOydmCBzb2NrZXTqs7wgcmVwbHnrpbwg67CU7J2465SpLlxuICAgIGNvbnN0IHsgY3JlYXRlU1NFRmFjdG9yeSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3RyZWFtL3NzZVwiKTtcbiAgICBjb25zdCBjcmVhdGVTU0UgPSAoPFQgZXh0ZW5kcyBab2RPYmplY3Q+KFxuICAgICAgX3JlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgICAgX3JlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICAgICBfZXZlbnRzOiBULFxuICAgICkgPT4gY3JlYXRlU1NFRmFjdG9yeShfcmVxdWVzdC5zb2NrZXQsIF9yZXBseSwgX2V2ZW50cykpLmJpbmQobnVsbCwgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgLy8gbG9jYWxlIOqwkOyngFxuICAgIGNvbnN0IGxvY2FsZSA9XG4gICAgICB0aGlzLmRldGVjdExvY2FsZShyZXF1ZXN0LmhlYWRlcnNbXCJhY2NlcHQtbGFuZ3VhZ2VcIl0sIHRoaXMuY29uZmlnLmkxOG4uc3VwcG9ydGVkTG9jYWxlcykgPz9cbiAgICAgIHRoaXMuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZTtcblxuICAgIC8vIGF1dGggY29udGV4dCDstpTqsIBcbiAgICBjb25zdCBoZWFkZXJzID0gY29udmVydEZhc3RpZnlIZWFkZXJzVG9TdGFuZGFyZChyZXF1ZXN0LmhlYWRlcnMpO1xuICAgIGNvbnN0IHNlc3Npb24gPSAoYXdhaXQgdGhpcy5hdXRoVmFsdWU/LmFwaS5nZXRTZXNzaW9uKHsgaGVhZGVycyB9KSkgPz8gbnVsbDtcblxuICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoXG4gICAgICBjb25maWcuY29udGV4dFByb3ZpZGVyKFxuICAgICAgICB7XG4gICAgICAgICAgdHJhbnNwb3J0OiBcImh0dHBcIixcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIHJlcGx5LFxuICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgICBjcmVhdGVTU0UsXG4gICAgICAgICAgbmFpdGVTdG9yZTogbmV3IE1hcCgpLFxuICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAvLyBhdXRoXG4gICAgICAgICAgdXNlcjogc2Vzc2lvbj8udXNlciA/PyBudWxsLFxuICAgICAgICAgIHNlc3Npb246IHNlc3Npb24/LnNlc3Npb24gPz8gbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgcmVwbHksXG4gICAgICApLFxuICAgICk7XG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH1cblxuICAvLyBzZXNzaW9uL2xvY2FsZS9zdG9yZSDqsJnsnYAg6rO17Ya1IHN0YXRl64qUIEhUVFAgY29udGV4dOyZgCDqs7XsnKDtlZjrkJgsIHJlcGx5L2NyZWF0ZVNTRSDqsJnsnYAgSFRUUCDsoITsmqkgaGVscGVy64qUIOuFuOy2nO2VmOyngCDslYrsnYxcbiAgLy8g7IKs7Jqp7J6Q6rCAIHdlYnNvY2tldENvbnRleHRQcm92aWRlcuulvCDso7zrqbQg6re464yA66GcIOychOyehO2VmOqzoCwg7JeG7Jy866m0IOq4sOyhtCBjb250ZXh0UHJvdmlkZXLrpbwgcmVwbHkvU1NFIHN0dWLqs7wg7ZWo6ruYIOyerO2ZnOyaqe2VqFxuICBhc3luYyBjcmVhdGVXZWJTb2NrZXRDb250ZXh0KFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICB3czogQW55V2ViU29ja2V0Q29ubmVjdGlvbixcbiAgKTogUHJvbWlzZTxXZWJTb2NrZXRDb250ZXh0PiB7XG4gICAgY29uc3QgbG9jYWxlID1cbiAgICAgIHRoaXMuZGV0ZWN0TG9jYWxlKHJlcXVlc3QuaGVhZGVyc1tcImFjY2VwdC1sYW5ndWFnZVwiXSwgdGhpcy5jb25maWcuaTE4bi5zdXBwb3J0ZWRMb2NhbGVzKSA/P1xuICAgICAgdGhpcy5jb25maWcuaTE4bi5kZWZhdWx0TG9jYWxlO1xuXG4gICAgY29uc3QgaGVhZGVycyA9IGNvbnZlcnRGYXN0aWZ5SGVhZGVyc1RvU3RhbmRhcmQocmVxdWVzdC5oZWFkZXJzKTtcbiAgICBjb25zdCBzZXNzaW9uID0gKGF3YWl0IHRoaXMuYXV0aFZhbHVlPy5hcGkuZ2V0U2Vzc2lvbih7IGhlYWRlcnMgfSkpID8/IG51bGw7XG5cbiAgICBjb25zdCBkZWZhdWx0Q29udGV4dCA9IHtcbiAgICAgIHRyYW5zcG9ydDogXCJ3c1wiIGFzIGNvbnN0LFxuICAgICAgcmVxdWVzdCxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgIHdzLFxuICAgICAgbmFpdGVTdG9yZTogbmV3IE1hcCgpLFxuICAgICAgbG9jYWxlLFxuICAgICAgdXNlcjogc2Vzc2lvbj8udXNlciA/PyBudWxsLFxuICAgICAgc2Vzc2lvbjogc2Vzc2lvbj8uc2Vzc2lvbiA/PyBudWxsLFxuICAgIH07XG5cbiAgICBpZiAoY29uZmlnLndlYnNvY2tldENvbnRleHRQcm92aWRlcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uKGF3YWl0IFByb21pc2UucmVzb2x2ZShjb25maWcud2Vic29ja2V0Q29udGV4dFByb3ZpZGVyKGRlZmF1bHRDb250ZXh0LCByZXF1ZXN0KSkpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyByZXBseS9jcmVhdGVTU0Xsl5Ag7J2Y7KG07ZWY64qUIGNvbnRleHRQcm92aWRlcuqwgCDsnojsnLzrqbQg7KaJ7IucIOyXkOufrOulvCDrjZjsoLggdHJhbnNwb3J0IG1pc3VzZeulvCDruajrpqwg65Oc65+s64OEXG4gICAgY29uc3QgcmVwbHlTdHViID0gY3JlYXRlV2ViU29ja2V0UmVwbHlTdHViKCk7XG4gICAgY29uc3QgaHR0cExpa2VDb250ZXh0ID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgY29uZmlnLmNvbnRleHRQcm92aWRlcihcbiAgICAgICAge1xuICAgICAgICAgIHRyYW5zcG9ydDogXCJodHRwXCIsXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICByZXBseTogcmVwbHlTdHViLFxuICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgICBjcmVhdGVTU0U6IGNyZWF0ZVVuYXZhaWxhYmxlU1NFLFxuICAgICAgICAgIG5haXRlU3RvcmU6IGRlZmF1bHRDb250ZXh0Lm5haXRlU3RvcmUsXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgIHVzZXI6IGRlZmF1bHRDb250ZXh0LnVzZXIsXG4gICAgICAgICAgc2Vzc2lvbjogZGVmYXVsdENvbnRleHQuc2Vzc2lvbixcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgcmVwbHlTdHViLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgY29uc3Qge1xuICAgICAgdHJhbnNwb3J0OiBfdHJhbnNwb3J0LFxuICAgICAgcmVwbHk6IF9yZXBseSxcbiAgICAgIGNyZWF0ZVNTRTogX2NyZWF0ZVNTRSxcbiAgICAgIGJ1ZmZlcmVkRmlsZXM6IF9idWZmZXJlZEZpbGVzLFxuICAgICAgdXBsb2FkZWRGaWxlczogX3VwbG9hZGVkRmlsZXMsXG4gICAgICAuLi5yZXN0XG4gICAgfSA9IGh0dHBMaWtlQ29udGV4dDtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5yZXN0LFxuICAgICAgdHJhbnNwb3J0OiBcIndzXCIsXG4gICAgICByZXF1ZXN0LFxuICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgd3MsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlcHQtTGFuZ3VhZ2Ug7Zek642U7JeQ7IScIOyngOybkO2VmOuKlCBsb2NhbGXsnYQg7LC+7Iq164uI64ukLlxuICAgKiBAZXhhbXBsZSBcImtvLUtSLGtvO3E9MC45LGVuO3E9MC44XCIg4oaSIFwia29cIlxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RMb2NhbGUoXG4gICAgYWNjZXB0TGFuZ3VhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBzdXBwb3J0ZWQ6IHN0cmluZ1tdLFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghYWNjZXB0TGFuZ3VhZ2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAvLyBBY2NlcHQtTGFuZ3VhZ2U6IGtvLUtSLGtvO3E9MC45LGVuO3E9MC44XG4gICAgY29uc3QgbGFuZ3MgPSBhY2NlcHRMYW5ndWFnZS5zcGxpdChcIixcIikubWFwKChsYW5nKSA9PiB7XG4gICAgICBjb25zdCBbY29kZV0gPSBsYW5nLnNwbGl0KFwiO1wiKTtcbiAgICAgIHJldHVybiBjb2RlLnRyaW0oKS5zcGxpdChcIi1cIilbMF07IC8vIGtvLUtSIOKGkiBrb1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxhbmdzLmZpbmQoKGxhbmcpID0+IHN1cHBvcnRlZC5pbmNsdWRlcyhsYW5nKSk7XG4gIH1cblxuICBhc3luYyBzdGFydFdhdGNoZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gd2F0Y2hlciDrqqjrk4jsnYAgZmlsZS1wYXR0ZXJucyDihpIgU29uYW11IOyInO2ZmOydhCDtlLztlZjquLAg7JyE7ZW0IGR5bmFtaWMgaW1wb3J0IO2VqeuLiOuLpC5cbiAgICBjb25zdCB7IHNldHVwV2F0Y2hlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3luY2VyL3dhdGNoZXJcIik7XG4gICAgdGhpcy53YXRjaGVyID0gYXdhaXQgc2V0dXBXYXRjaGVyKChmaWxlRXZlbnRzKSA9PiB0aGlzLnJ1bkhtclN5bmNDeWNsZShmaWxlRXZlbnRzKSk7XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2hlcuqwgCAxMDBtcyBiYXRjaOuhnCDrqqjsnYAgZmlsZUV2ZW50cyDtlZjrgpjsl5Ag64yA7ZW0IO2VnCDrsojsnZggSE1SL3N5bmMg7IKs7J207YG07J2EIOuPleuLiOuLpC5cbiAgICogYmF0Y2gg7YGQ7J6JIOuNleyXkCDtlZwg7Iuc7KCQ7JeQIO2VmOuCmOunjCDsi6TtlonrkKjsnbQg67O07J6l65Cp64uI64ukIChldmVudC1iYXRjaGVy6rCAIOyngeugrO2ZlCkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJ1bkhtclN5bmNDeWNsZShmaWxlRXZlbnRzOiBNYXA8QWJzb2x1dGVQYXRoLCBcImNoYW5nZVwiIHwgXCJhZGRcIj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuXG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGV2ZW50XSBvZiBmaWxlRXZlbnRzKSB7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHRoaXMuYXBwUm9vdFBhdGgsIGZpbGVQYXRoKTtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoYERldGVjdGVkKCR7ZXZlbnR9KTogJHtjaGFsay5ibHVlKHJlbGF0aXZlUGF0aCl9YCkpO1xuICAgIH1cblxuICAgIC8vIOuzuOyytDog67OA6rK9IO2doeyImCArIOyytO2BrOyErCDqsLHsi6AuXG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuaG1yQW5kU3luYyhmaWxlRXZlbnRzKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5yZW5ld0NoZWNrc3VtcygpO1xuXG4gICAgY29uc3QgdG90YWxUaW1lID0gRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdDtcbiAgICBjb25zdCBtc2cgPSBgSE1SIERvbmUhICR7Y2hhbGsuYm9sZC53aGl0ZShgJHt0b3RhbFRpbWV9bXNgKX1gO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsYWNrLmJnR3JlZW4oY2VudGVyVGV4dChtc2cpKSk7XG4gIH1cblxuICAvKlxuICAgICBBIGZ1bmN0aW9uIHRoYXQgYXV0b21hdGljYWxseSBoYW5kbGVzIGluaXQgYW5kIGRlc3Ryb3kgd2hlbiB1c2luZyBTb25hbXUgdmlhIHNjcmlwdHMuXG4gICovXG4gIGFzeW5jIHJ1blNjcmlwdChmbjogKCkgPT4gUHJvbWlzZTx2b2lkPikge1xuICAgIGF3YWl0IHRoaXMuaW5pdCh0cnVlLCBmYWxzZSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJQbHVnaW5zKHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLCBwbHVnaW5zOiBTb25hbXVTZXJ2ZXJPcHRpb25zW1wicGx1Z2luc1wiXSkge1xuICAgIGlmICghcGx1Z2lucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHJvdXRlKCkg7Iuc7KCQ7JeQIOyLpO2WieuQmOuKlCBvblJvdXRlIO2bheydtCDshKTsuZjrkJjrj4TroZ0g7ZSM65+s6re47J24IOuTseuhnSDsmYTro4zrpbwg6riw64uk66a964uI64ukLlxuICAgIC8vIGNvbXByZXNzIO2UjOufrOq3uOyduOydgCDri6Trpbgg7ZSM65+s6re47J2467O064ukIOuovOyggCDrk7HroZ3rkJjslrTslbwg7ZWp64uI64ukLlxuICAgIGlmIChwbHVnaW5zLmNvbXByZXNzKSB7XG4gICAgICBjb25zdCBjb21wcmVzc1BsdWdpbiA9IChhd2FpdCBpbXBvcnQoXCJAZmFzdGlmeS9jb21wcmVzc1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgICB0aHJlc2hvbGQ6IDEwMjQsXG4gICAgICAgIGVuY29kaW5nczogLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFtcbiAgICAgICAgICBcImJyXCIsXG4gICAgICAgICAgXCJnemlwXCIsXG4gICAgICAgICAgXCJkZWZsYXRlXCIsXG4gICAgICAgIF0gYXMgKFwiYnJcIiB8IFwiZ3ppcFwiIHwgXCJkZWZsYXRlXCIpW10sXG4gICAgICB9O1xuXG4gICAgICBpZiAocGx1Z2lucy5jb21wcmVzcyA9PT0gdHJ1ZSkge1xuICAgICAgICBhd2FpdCBzZXJ2ZXIucmVnaXN0ZXIoY29tcHJlc3NQbHVnaW4sIGRlZmF1bHRPcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHNlcnZlci5yZWdpc3Rlcihjb21wcmVzc1BsdWdpbiwge1xuICAgICAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgICAgIC4uLnBsdWdpbnMuY29tcHJlc3MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBsdWdpbnNNb2R1bGVzID0ge1xuICAgICAgY29yczogXCJAZmFzdGlmeS9jb3JzXCIsXG4gICAgICBmb3JtYm9keTogXCJAZmFzdGlmeS9mb3JtYm9keVwiLFxuICAgICAgbXVsdGlwYXJ0OiBcIkBmYXN0aWZ5L211bHRpcGFydFwiLFxuICAgICAgcXM6IFwiZmFzdGlmeS1xc1wiLFxuICAgICAgc3NlOiBcImZhc3RpZnktc3NlLXYyXCIsXG4gICAgICBzdGF0aWM6IFwiQGZhc3RpZnkvc3RhdGljXCIsXG4gICAgfSBhcyBjb25zdDtcblxuICAgIGNvbnN0IHJlZ2lzdGVyUGx1Z2luID0gYXN5bmMgPEsgZXh0ZW5kcyBrZXlvZiBOb25OdWxsYWJsZTx0eXBlb2YgcGx1Z2lucz4+KFxuICAgICAga2V5OiBLLFxuICAgICAgcGx1Z2luTmFtZTogc3RyaW5nLFxuICAgICkgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uID0gcGx1Z2luc1trZXldO1xuICAgICAgaWYgKCFvcHRpb24pIHJldHVybjtcblxuICAgICAgaWYgKG9wdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgICBhd2FpdCBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCwgb3B0aW9uKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCBwbHVnaW5OYW1lXSBvZiBPYmplY3QuZW50cmllcyhwbHVnaW5zTW9kdWxlcykpIHtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyUGx1Z2luKFxuICAgICAgICAvKiBTQUZFVFk6IEFQSSDrjbDsvZTroIjsnbTthLDsmYAgWm9kIOqygOymneq4sCDrk7HroZ0g6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8ga2V5IGFzIGtleW9mIHR5cGVvZiBwbHVnaW5zLFxuICAgICAgICBwbHVnaW5OYW1lLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocGx1Z2lucy53cykge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVXZWJTb2NrZXRQbHVnaW4oc2VydmVyKTtcbiAgICB9XG5cbiAgICBpZiAocGx1Z2lucy5jdXN0b20pIHtcbiAgICAgIHBsdWdpbnMuY3VzdG9tKHNlcnZlcik7XG4gICAgfVxuICB9XG5cbiAgLy8gQGZhc3RpZnkvd2Vic29ja2V07J2AIHBsdWdpbnMud3PqsIAg7ISk7KCV65CcIOqyveyasOyXkOunjCDrk7HroZ3tlZjqs6AsIOqwmeydgCBzZXJ2ZXLsl5Ag7KSR67O1IOuTseuhneuQmOyngCDslYrrj4TroZ0gV2Vha1NldOycvOuhnCDquLDroZ3tlahcbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVXZWJTb2NrZXRQbHVnaW4oXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMud2Vic29ja2V0UGx1Z2luU2VydmVycy5oYXMoc2VydmVyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBsdWdpbk9wdGlvbiA9IHRoaXMuY29uZmlnLnNlcnZlci5wbHVnaW5zPy53cztcbiAgICBpZiAoIXBsdWdpbk9wdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdlYnNvY2tldFBsdWdpbiA9IChhd2FpdCBpbXBvcnQoXCJAZmFzdGlmeS93ZWJzb2NrZXRcIikpLmRlZmF1bHQ7XG4gICAgY29uc3QgcmVzb2x2ZWRQbHVnaW5PcHRpb25zID0gcmVzb2x2ZVdlYlNvY2tldFBsdWdpbk9wdGlvbnMoe1xuICAgICAgcmF3UGx1Z2luT3B0aW9uOiBwbHVnaW5PcHRpb24sXG4gICAgfSk7XG4gICAgaWYgKHJlc29sdmVkUGx1Z2luT3B0aW9ucykge1xuICAgICAgYXdhaXQgc2VydmVyLnJlZ2lzdGVyKHdlYnNvY2tldFBsdWdpbiwgcmVzb2x2ZWRQbHVnaW5PcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgc2VydmVyLnJlZ2lzdGVyKHdlYnNvY2tldFBsdWdpbik7XG4gICAgfVxuXG4gICAgdGhpcy53ZWJzb2NrZXRQbHVnaW5TZXJ2ZXJzLmFkZChzZXJ2ZXIpO1xuICAgIHRoaXMud2Fybk9uUG90ZW50aWFsV2ViU29ja2V0VGltZW91dENvbmZsaWN0cyhzZXJ2ZXIpO1xuICB9XG5cbiAgLy8gaGVhcnRiZWF0IGludGVydmFs7J20IEZhc3RpZnkga2VlcEFsaXZlVGltZW91dCDsnbTsg4HsnbTrqbQg7J247ZSE65286rCAIOuovOyggCBpZGxlIOyXsOqysOydhCDrgYrsnYQg7IiYIOyeiOyWtCDqsr3qs6Drp4wg64Ko6riw6rOgIOuEmOyWtOqwkFxuICBwcml2YXRlIHdhcm5PblBvdGVudGlhbFdlYlNvY2tldFRpbWVvdXRDb25mbGljdHMoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgaGVhcnRiZWF0cyA9IHRoaXMuc3luY2VyLmFwaXNcbiAgICAgIC5tYXAoKGFwaSkgPT4gYXBpLndlYnNvY2tldE9wdGlvbnM/LmhlYXJ0YmVhdCA/PyAzMDAwMClcbiAgICAgIC5maWx0ZXIoKGhlYXJ0YmVhdCkgPT4gaGVhcnRiZWF0ID4gMCk7XG5cbiAgICBpZiAoaGVhcnRiZWF0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBrZWVwQWxpdmVUaW1lb3V0ID0gdGhpcy5jb25maWcuc2VydmVyLmZhc3RpZnk/LmtlZXBBbGl2ZVRpbWVvdXQ7XG4gICAgaWYgKCFrZWVwQWxpdmVUaW1lb3V0IHx8IGtlZXBBbGl2ZVRpbWVvdXQgPD0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxhcmdlc3RIZWFydGJlYXQgPSBNYXRoLm1heCguLi5oZWFydGJlYXRzKTtcbiAgICBpZiAobGFyZ2VzdEhlYXJ0YmVhdCA+PSBrZWVwQWxpdmVUaW1lb3V0KSB7XG4gICAgICBzZXJ2ZXIubG9nLndhcm4oXG4gICAgICAgIHtcbiAgICAgICAgICBrZWVwQWxpdmVUaW1lb3V0LFxuICAgICAgICAgIGxhcmdlc3RIZWFydGJlYXQsXG4gICAgICAgIH0sXG4gICAgICAgIFwiV2ViU29ja2V0IGhlYXJ0YmVhdCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8ga2VlcEFsaXZlVGltZW91dDsgYWxpZ24gaW5mcmFzdHJ1Y3R1cmUgaWRsZSB0aW1lb3V0cyB0byBhdm9pZCB1bmV4cGVjdGVkIGRpc2Nvbm5lY3RzLlwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYmV0dGVyLWF1dGgg65287Jqw7Yq466W8IOuTseuhne2VqeuLiOuLpC5cbiAgICogL2FwaS9hdXRoLyog6rK966Gc66GcIOyduOymnSBBUEnqsIAg7J6Q64+ZIOuTseuhneuQqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJCZXR0ZXJBdXRoKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLFxuICAgIG9wdGlvbnM6IE5vbk51bGxhYmxlPFNvbmFtdVNlcnZlck9wdGlvbnNbXCJhdXRoXCJdPixcbiAgKSB7XG4gICAgaWYgKCFvcHRpb25zKSByZXR1cm47XG5cbiAgICBjb25zdCBiYXNlUGF0aCA9IG9wdGlvbnMuYmFzZVBhdGggPz8gXCIvYXBpL2F1dGhcIjtcblxuICAgIC8vIGJldHRlci1hdXRoIOudvOyasO2KuCDrk7HroZ1cbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJQT1NUXCJdLFxuICAgICAgdXJsOiBgJHtiYXNlUGF0aH0vKmAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGguaGFuZGxlcihcbiAgICAgICAgICBjcmVhdGVCZXR0ZXJBdXRoUmVxdWVzdChyZXF1ZXN0LCBvcHRpb25zLmFkdmFuY2VkPy5pcEFkZHJlc3M/LmlwQWRkcmVzc0hlYWRlcnMpLFxuICAgICAgICApO1xuXG4gICAgICAgIHJlcGx5LnN0YXR1cyhyZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICByZXNwb25zZS5oZWFkZXJzLmZvckVhY2goKHZhbHVlOiBzdHJpbmcsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgcmVwbHkuaGVhZGVyKGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcGx5LnNlbmQocmVzcG9uc2UuYm9keSA/IGF3YWl0IHJlc3BvbnNlLnRleHQoKSA6IG51bGwpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJpbnRTdGFydHVwU3VtbWFyeSgpIHtcbiAgICBjb25zdCBhY3RpdmVQcmVzZXQgPSBnZXRTb25hbXVFbnZpcm9ubWVudCgpO1xuXG4gICAgcHJpbnREaW1TdW1tYXJ5KGBDb25maWcgbG9hZGVkJHtmb3JtYXRUaW1lKHRoaXMuY29uZmlnRWxhcHNlZCl9YCk7XG5cbiAgICAvLyBEQiBwcmVzZXQg66qp66GdXG4gICAgcHJpbnRHcmVlblN1bW1hcnkoXCJEQlwiKTtcbiAgICBjb25zdCB7IGlzTG9jYWwgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIik7XG4gICAgY29uc3QgcHJlc2V0TmFtZXMgPVxuICAgICAgLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIE9iamVjdC5rZXlzKFxuICAgICAgICB0aGlzLmRiQ29uZmlnLFxuICAgICAgKSBhcyAoa2V5b2YgU29uYW11REJDb25maWcpW107XG4gICAgY29uc3QgbWF4TGVuID0gTWF0aC5tYXgoLi4ucHJlc2V0TmFtZXMubWFwKChuKSA9PiBuLmxlbmd0aCkpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBwcmVzZXROYW1lcykge1xuICAgICAgY29uc3QgY29ubiA9XG4gICAgICAgIC8qIFNBRkVUWTogQVBJIOuNsOy9lOugiOydtO2EsOyZgCBab2Qg6rKA7Kad6riwIOuTseuhnSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyB0aGlzXG4gICAgICAgICAgLmRiQ29uZmlnW25hbWVdLmNvbm5lY3Rpb24gYXNcbiAgICAgICAgICB8IHsgaG9zdD86IHN0cmluZzsgcG9ydD86IG51bWJlcjsgZGF0YWJhc2U/OiBzdHJpbmcgfVxuICAgICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaG9zdCA9IGNvbm4/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcbiAgICAgIGNvbnN0IGFkZHIgPSBgQCAke2hvc3R9OiR7Y29ubj8ucG9ydCA/PyA1NDMyfS8ke2Nvbm4/LmRhdGFiYXNlID8/IFwiKHVua25vd24pXCJ9YDtcbiAgICAgIGNvbnN0IHBhZGRlZCA9IG5hbWUucGFkRW5kKG1heExlbik7XG4gICAgICBjb25zdCByZW1vdGVUYWcgPSBpc0xvY2FsKCkgJiYgIWlzTG9jYWxIb3N0KGhvc3QpID8gY2hhbGsueWVsbG93KGAgXFx1MjZhMCByZW1vdGVgKSA6IFwiXCI7XG5cbiAgICAgIGlmIChuYW1lID09PSBhY3RpdmVQcmVzZXQpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYCAgXFx1MjViOCAke3BhZGRlZH0gJHthZGRyfWApICsgcmVtb3RlVGFnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICAgICR7cGFkZGVkfSAke2FkZHJ9YCkgKyByZW1vdGVUYWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5zZXJ2ZXIuYXV0aCkge1xuICAgICAgY29uc3QgYmFzZVBhdGggPSB0aGlzLmNvbmZpZy5zZXJ2ZXIuYXV0aC5iYXNlUGF0aCA/PyBcIi9hcGkvYXV0aFwiO1xuICAgICAgcHJpbnREaW1TdW1tYXJ5KGBBdXRoOiBiZXR0ZXItYXV0aCBhdCAke2Jhc2VQYXRofS8qYCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZy5hcGkudGltZXpvbmUpIHtcbiAgICAgIHByaW50RGltU3VtbWFyeShgVGltZXpvbmU6ICR7dGhpcy5jb25maWcuYXBpLnRpbWV6b25lfWApO1xuICAgIH1cbiAgICBwcmludEdyZWVuU3VtbWFyeShgU29uYW11IHJlYWR5JHtmb3JtYXRUaW1lKHRoaXMuaW5pdEVsYXBzZWQpfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplQ2FjaGUoY29uZmlnOiBDYWNoZUNvbmZpZyB8IHVuZGVmaW5lZCwgZm9yVGVzdGluZzogYm9vbGVhbikge1xuICAgIGNvbnN0IHsgc2V0Q2FjaGVNYW5hZ2VyUmVmIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jYWNoZS9kZWNvcmF0b3JcIik7XG5cbiAgICAvLyDthYzsiqTtirgg7ZmY6rK97JeQ7IScIOuplOuqqOumrCDrk5zrnbzsnbTrsoQg7J6Q64+ZIOyCrOyaqVxuICAgIGlmIChmb3JUZXN0aW5nKSB7XG4gICAgICBjb25zdCB7IGNyZWF0ZVRlc3RDYWNoZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2NhY2hlL2NhY2hlLW1hbmFnZXJcIik7XG4gICAgICB0aGlzLmNhY2hlVmFsdWUgPSBjcmVhdGVUZXN0Q2FjaGVNYW5hZ2VyKCk7XG4gICAgICBzZXRDYWNoZU1hbmFnZXJSZWYodGhpcy5jYWNoZVZhbHVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDshKTsoJXsnbQg7JeG7Jy866m0IOy6kOyLnCDruYTtmZzshLHtmZRcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgc2V0Q2FjaGVNYW5hZ2VyUmVmKG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOyEpOygleyXkCDrlLDrnbwgQ2FjaGVNYW5hZ2VyIOyDneyEsVxuICAgIGNvbnN0IHsgY3JlYXRlQ2FjaGVNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jYWNoZS9jYWNoZS1tYW5hZ2VyXCIpO1xuICAgIHRoaXMuY2FjaGVWYWx1ZSA9IGNyZWF0ZUNhY2hlTWFuYWdlcihjb25maWcpO1xuICAgIHNldENhY2hlTWFuYWdlclJlZih0aGlzLmNhY2hlVmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplV29ya2Zsb3dzKG9wdGlvbnM6IFNvbmFtdVRhc2tPcHRpb25zIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgeyBXb3JrZmxvd01hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3Rhc2tzL3dvcmtmbG93LW1hbmFnZXJcIik7XG4gICAgLy8gTk9URTogQHNvbmFtdS1raXQvdGFza3Mg7JWI7JeQ7ISgIGtuZXggY29uZmln66W8IOyImOygle2VmOq4sCDrlYzrrLjsl5AgY29ubmVjdGlvbuydtCDslYTri4wgY29uZmlnIOynuOuhnCDrs7Trg4Xri4jri6QuXG4gICAgdGhpcy53b3JrZmxvd3NWYWx1ZSA9IG5ldyBXb3JrZmxvd01hbmFnZXIoREIuZ2V0REJDb25maWcoXCJ3XCIpKTtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlbmFibGVXb3JrZXIgPSBvcHRpb25zLmVuYWJsZVdvcmtlciA/PyBpc0RhZW1vblNlcnZlcigpO1xuICAgIGNvbnN0IGRlZmF1bHRXb3JrZXJPcHRpb25zID0ge1xuICAgICAgY29uY3VycmVuY3k6IG9zLmNwdXMoKS5sZW5ndGggLSAxLFxuICAgICAgdXNlUHViU3ViOiB0cnVlLFxuICAgICAgbGlzdGVuRGVsYXk6IDUwMCxcbiAgICB9O1xuXG4gICAgaWYgKGVuYWJsZVdvcmtlcikge1xuICAgICAgdGhpcy53b3JrZmxvd3Muc2V0dXBXb3JrZXIoe1xuICAgICAgICAuLi5kZWZhdWx0V29ya2VyT3B0aW9ucyxcbiAgICAgICAgLi4ub3B0aW9ucy53b3JrZXJPcHRpb25zLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBib290KHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLCBvcHRpb25zOiBTb25hbXVTZXJ2ZXJPcHRpb25zKSB7XG4gICAgY29uc3QgcG9ydCA9IG9wdGlvbnMubGlzdGVuPy5wb3J0ID8/IDMwMDA7XG4gICAgY29uc3QgaG9zdCA9IG9wdGlvbnMubGlzdGVuPy5ob3N0ID8/IFwibG9jYWxob3N0XCI7XG5cbiAgICBzZXJ2ZXIuYWRkSG9vayhcIm9uQ2xvc2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgb3B0aW9ucy5saWZlY3ljbGU/Lm9uU2h1dGRvd24/LihzZXJ2ZXIpO1xuICAgICAgYXdhaXQgdGhpcy53b3JrZmxvd3MuZGVzdHJveSgpO1xuICAgICAgYXdhaXQgdGhpcy5kZXN0cm95KCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBzaHV0ZG93biA9IGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHNlcnZlci5jbG9zZSgpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGR1cmluZyBzaHV0ZG93bjpcIiwgZXJyKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBwcm9jZXNzLm9uKFwiU0lHSU5UXCIsIHNodXRkb3duKTtcbiAgICBwcm9jZXNzLm9uKFwiU0lHVEVSTVwiLCBzaHV0ZG93bik7XG5cbiAgICBpZiAob3B0aW9ucy5saWZlY3ljbGU/Lm9uRXJyb3IpIHtcbiAgICAgIHNlcnZlci5zZXRFcnJvckhhbmRsZXIob3B0aW9ucy5saWZlY3ljbGU/Lm9uRXJyb3IpO1xuICAgIH1cblxuICAgIHNlcnZlclxuICAgICAgLmxpc3Rlbih7IHBvcnQsIGhvc3QgfSlcbiAgICAgIC50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy53b3JrZmxvd3Muc3RhcnRXb3JrZXIoKTtcbiAgICAgICAgYXdhaXQgb3B0aW9ucy5saWZlY3ljbGU/Lm9uU3RhcnQ/LihzZXJ2ZXIpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChhc3luYyAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwiRmFpbGVkIHRvIHN0YXJ0IHNlcnZlcjpcIiwgZXJyKSk7XG4gICAgICAgIGF3YWl0IHNodXRkb3duKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBoYXNFeHRlcm5hbExvZ1RhcGVDb25maWd1cmF0aW9uIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9sb2dnZXIvY29uZmlndXJlXCIpO1xuICAgIGNvbnN0IHsgQmFzZU1vZGVsIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9kYXRhYmFzZS9iYXNlLW1vZGVsXCIpO1xuICAgIC8vIOuovOyggCDsspjrpqztlbTslbztlaguXG4gICAgYXdhaXQgQmFzZU1vZGVsLmRlc3Ryb3koKTtcbiAgICAvLyBXZWJTb2NrZXQgc2h1dGRvd24gZmlyc3QgdG8gZmx1c2ggdGVsZW1ldHJ5XG4gICAgaWYgKHRoaXMud2Vic29ja2V0UnVudGltZVZhbHVlKSB7XG4gICAgICBhd2FpdCB0aGlzLndlYnNvY2tldFJ1bnRpbWVWYWx1ZS5zaHV0ZG93bigpO1xuICAgIH1cbiAgICB0aGlzLndlYnNvY2tldFJ1bnRpbWVWYWx1ZSA9IG51bGw7XG4gICAgLy8gVGhlbiBzaHV0IGRvd24gcmVtYWluaW5nIHJlc291cmNlcyBpbiBwYXJhbGxlbFxuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICB0aGlzLndvcmtmbG93c1ZhbHVlPy5kZXN0cm95KCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICB0aGlzLmNhY2hlVmFsdWU/LmRpc2Nvbm5lY3QoKSA/PyBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgIHRoaXMuZGV2Vml0ZXN0TWFuYWdlclZhbHVlPy5zaHV0ZG93bigpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgdGhpcy53YXRjaGVyPy5jbG9zZSgpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgIF0pO1xuICAgIC8vIExvZ1RhcGUgZGlzcG9zZSBhZnRlciBXUyBzaHV0ZG93biBzbyB0ZWxlbWV0cnkgcmVjb3JkcyBhcmUgZmx1c2hlZCBmaXJzdFxuICAgIGlmICghaGFzRXh0ZXJuYWxMb2dUYXBlQ29uZmlndXJhdGlvbigpKSBhd2FpdCBsb2d0YXBlRGlzcG9zZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFdlYlNvY2tldFRlbGVtZXRyeUNvbnRleHQoXG4gIHdzOiBBbnlXZWJTb2NrZXRDb25uZWN0aW9uLFxuKTogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQge1xuICBpZiAoIWlzVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyKHdzKSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHJldHVybiB3cy5nZXRUZWxlbWV0cnlDb250ZXh0KCk7XG59XG5cbmZ1bmN0aW9uIGlzVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyKFxuICB3czogQW55V2ViU29ja2V0Q29ubmVjdGlvbixcbik6IHdzIGlzIEFueVdlYlNvY2tldENvbm5lY3Rpb24gJiBUZWxlbWV0cnlDb250ZXh0UHJvdmlkZXIge1xuICByZXR1cm4gXCJnZXRUZWxlbWV0cnlDb250ZXh0XCIgaW4gd3MgJiYgaXNGdW5jdGlvblZhbHVlKHdzLmdldFRlbGVtZXRyeUNvbnRleHQpO1xufVxuXG5leHBvcnQgY29uc3QgU29uYW11ID0gbmV3IFNvbmFtdUNsYXNzKCk7XG5cbi8qKlxuICogc3RyZWFtIOuqqOuTnOyXkOyEnCDtgqQg7IOd7ISxIO2VqOyImOqwgCDsp4DsoJXrkJjsp4Ag7JWK7JWY7J2EIOuVjCDsgqzsmqntlZjripQg6riw67O4IO2VqOyImOyeheuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdEtleUdlbmVyYXRvcihmaWxlOiB7IGZpbGVuYW1lOiBzdHJpbmc7IG1pbWV0eXBlOiBzdHJpbmcgfSk6IHN0cmluZyB7XG4gIGNvbnN0IGV4dCA9IG1pbWUuZXh0ZW5zaW9uKGZpbGUubWltZXR5cGUpIHx8IFwiYmluXCI7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHJhbmRvbSA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDgpO1xuICByZXR1cm4gYHVwbG9hZHMvJHt0aW1lc3RhbXB9LSR7cmFuZG9tfS4ke2V4dH1gO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUaW1lKG1zOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBmb3JtYXR0ZWQgPSBtcyA+PSAxMDAwID8gYCR7KG1zIC8gMTAwMCkudG9GaXhlZCgyKX1zYCA6IGAke01hdGgucm91bmQobXMpfW1zYDtcbiAgcmV0dXJuIGAgKCR7Zm9ybWF0dGVkfSlgO1xufVxuXG5jb25zdCBMT0NBTF9IT1NUUyA9IG5ldyBTZXQoW1wibG9jYWxob3N0XCIsIFwiMTI3LjAuMC4xXCIsIFwiMC4wLjAuMFwiLCBcIjo6MVwiXSk7XG5mdW5jdGlvbiBpc0xvY2FsSG9zdChob3N0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIExPQ0FMX0hPU1RTLmhhcyhob3N0KSB8fCBob3N0LmVuZHNXaXRoKFwiLmxvY2FsXCIpO1xufVxuXG4vLyBgLmV2ZXJ5KClg6rCAIOyyqyBndWFyZCDsnbTtm4Qg7Iic7ZqM66W8IOupiOy2lOuKlCDrrLjsoJzqsIAg7J6I7Ja0IGBmb3IuLi5vZmDroZwg66qo65OgIGd1YXJk66W8IOyInOyEnOuMgOuhnCDsi6TtlontlZjrj4TroZ0g6rOg7KCV7ZWoXG5mdW5jdGlvbiBydW5HdWFyZHMoe1xuICBndWFyZHMsXG4gIGNvbmZpZyxcbiAgcmVxdWVzdCxcbiAgYXBpLFxufToge1xuICBndWFyZHM6IEV4dGVuZGVkQXBpW1wib3B0aW9uc1wiXVtcImd1YXJkc1wiXSB8IHVuZGVmaW5lZDtcbiAgY29uZmlnOiBQaWNrPFNvbmFtdUZhc3RpZnlDb25maWcsIFwiZ3VhcmRIYW5kbGVyXCI+O1xuICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdDtcbiAgYXBpOiBFeHRlbmRlZEFwaTtcbn0pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBndWFyZCBvZiBndWFyZHMgPz8gW10pIHtcbiAgICBjb25maWcuZ3VhcmRIYW5kbGVyKGd1YXJkLCByZXF1ZXN0LCBhcGkpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkdBLFNBQVMsY0FBcUIsT0FBMkI7Q0FDdkQsSUFBSSxVQUFVLE1BQU0sT0FBTztDQUMzQixJQUFJLFVBQVUsUUFBVyxPQUFPO0NBQ2hDLElBQUksVUFBVSxNQUFNLE9BQU87Q0FDM0IsSUFBSSxVQUFVLE9BQU8sT0FBTztDQUM1QixJQUFJLGNBQWMsS0FBSyxHQUFHLE9BQU87Q0FDakMsSUFBSSxjQUFjLEtBQUssR0FBRyxPQUFPO0NBQ2pDLElBQUksY0FBYyxLQUFLLEdBQUcsT0FBTztDQUNqQyxJQUFJLGNBQWMsS0FBSyxHQUFHLE9BQU87Q0FDakMsSUFBSSxnQkFBZ0IsS0FBSyxHQUFHLE9BQU87Q0FDbkMsSUFBSSxjQUFjLEtBQUssR0FDckIsT0FBTztDQUVULE1BQU0sSUFBSSxNQUFNLHVCQUF1QjtBQUN6QztBQUVBLFNBQVMsaUJBQXVDLE9BQXdDO0NBQ3RGLE9BQU8sSUFBSSxJQUFJLE9BQU8sUUFBUSxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxVQUFVLENBQUMsS0FBSyxjQUFjLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDdkY7QUFFQSxTQUFTLHFCQUEwQyxTQUFtQjtDQUNwRSxNQUFNLElBQUksTUFDUixnSUFDRjtBQUNGO0FBRUEsU0FBUyxnQkFBZ0IsU0FBdUI7Q0FDOUMsUUFBUSxJQUFJLE1BQU0sSUFBSSxLQUFLLFNBQVMsQ0FBQztBQUN2QztBQUVBLFNBQVMsa0JBQWtCLFNBQXVCO0NBQ2hELFFBQVEsSUFBSSxNQUFNLE1BQU0sS0FBSyxTQUFTLENBQUM7QUFDekM7QUF3bEVBLFNBQVMsNkJBQ1AsSUFDcUM7Q0FDckMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLEdBQ2hDLE9BQU8sQ0FBQztDQUdWLE9BQU8sR0FBRyxvQkFBb0I7QUFDaEM7QUFFQSxTQUFTLDJCQUNQLElBQ3lEO0NBQ3pELE9BQU8seUJBQXlCLE1BQU0sZ0JBQWdCLEdBQUcsbUJBQW1CO0FBQzlFOzs7O0FBT0EsU0FBUyxvQkFBb0IsTUFBc0Q7Q0FDakYsTUFBTSxNQUFNLEtBQUssVUFBVSxLQUFLLFFBQVEsS0FBSztDQUc3QyxPQUFPLFdBRlcsS0FBSyxJQUVMLEVBQVUsR0FEYixLQUFLLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQ3BCLEVBQU8sR0FBRztBQUMzQztBQUVBLFNBQVMsV0FBVyxJQUFvQjtDQUV0QyxPQUFPLEtBRFcsTUFBTSxNQUFPLElBQUksS0FBSyxJQUFBLENBQU0sUUFBUSxDQUFDLEVBQUUsS0FBSyxHQUFHLEtBQUssTUFBTSxFQUFFLEVBQUUsSUFDMUQ7QUFDeEI7QUFHQSxTQUFTLFlBQVksTUFBdUI7Q0FDMUMsT0FBTyxZQUFZLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxRQUFRO0FBQ3hEO0FBR0EsU0FBUyxVQUFVLEVBQ2pCLFFBQ0EsUUFDQSxTQUNBLE9BTU87Q0FDUCxLQUFLLE1BQU0sU0FBUyxVQUFVLENBQUMsR0FDN0IsT0FBTyxhQUFhLE9BQU8sU0FBUyxHQUFHO0FBRTNDOzs7MkJBMXdFa0U7MEJBQ0c7b0JBQ1c7ZUFHbEI7U0FFM0I7U0FFUztVQUU4QjtvQkFDWDttQkFDaEI7b0JBQ1E7b0JBR0E7VUFDSDtTQUsvQjttQkFVNkI7aUJBQ0U7ZUFDRTtvQkFTdkI7WUFDd0M7YUFNdEQ7cUJBU1E7YUFDWTt3QkFPVDtDQTRFZix5Q0FBMEU7RUFDckYsaUJBQWlCO0VBQ2pCLGdCQUFnQjtDQUNsQjtDQUVNLGNBQU4sTUFBa0I7RUFDaEIsZ0JBQWdDO0VBQ2hDLGFBQTZCO0VBQzdCLG9CQUVLLElBQUksa0JBQWtCO0VBQzNCLGlDQUE4RCxJQUFJLFFBQVE7RUFDMUUsd0NBQThFLElBQUksUUFBUTtFQUMxRjtFQUNBLGVBQStDLENBQUM7RUFDaEQsaUJBQXVDLENBQUM7RUFFeEMsYUFBMkQ7R0FDekQsTUFBTSxRQUFRLEtBQUssa0JBQWtCLFNBQVM7R0FDOUMsSUFBSSxPQUFPLFNBQ1QsT0FBOEQsTUFBTTtHQUd0RSxJQUFJLFFBQVEsSUFBSSxhQUFhLFFBYzNCLE9BQThEO0lBWDVELFdBQVc7SUFDWCxTQUFTO0lBQ1QsT0FBTztJQUNQLFNBQVMsQ0FBQztJQUNWLFlBQVksV0FBc0IscUJBQXFCLE1BQU07SUFDN0QsUUFBUTtJQUNSLE1BQU07SUFDTixTQUFTO0lBQ1QsNEJBQVksSUFBSSxJQUFpQjtHQUcyQjtRQUc5RCxNQUFNLElBQUksTUFBTSw0QkFBNEI7RUFFaEQ7RUFFQSxtQkFBZ0Q7RUFDaEQsSUFBSSxZQUFZLGFBQTJCO0dBQ3pDLEtBQUssbUJBQW1CO0VBQzFCO0VBQ0EsSUFBSSxjQUE0QjtHQUM5QixJQUFJLEtBQUsscUJBQXFCLE1BQzVCLE1BQU0sSUFBSSxNQUFNLGlDQUFpQztHQUVuRCxPQUFPLEtBQUs7RUFDZDtFQUNBLElBQUksY0FBc0I7R0FDeEIsT0FBTyxLQUFLLFlBQVksTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLEtBQUssR0FBRztFQUNwRTtFQUVBLGdCQUErQztFQUMvQyxJQUFJLFNBQVMsVUFBMEI7R0FDckMsS0FBSyxnQkFBZ0I7RUFDdkI7RUFDQSxJQUFJLFdBQTJCO0dBQzdCLElBQUksS0FBSyxrQkFBa0IsTUFDekIsTUFBTSxJQUFJLE1BQU0saUNBQWlDO0dBRW5ELE9BQU8sS0FBSztFQUNkO0VBRUEsY0FBcUM7RUFDckMsSUFBSSxPQUFPLFFBQWdCO0dBQ3pCLEtBQUssY0FBYztFQUNyQjtFQUNBLElBQUksU0FBaUI7R0FDbkIsSUFBSSxLQUFLLGdCQUFnQixNQUN2QixNQUFNLElBQUksTUFBTSxpQ0FBaUM7R0FFbkQsT0FBTyxLQUFLO0VBQ2Q7RUFFQSxjQUEyQztFQUMzQyxJQUFJLE9BQU8sUUFBc0I7R0FDL0IsS0FBSyxjQUFjO0VBQ3JCO0VBQ0EsSUFBSSxTQUF1QjtHQUN6QixJQUFJLEtBQUssZ0JBQWdCLE1BQ3ZCLE1BQU0sSUFBSSxNQUFNLGlDQUFpQztHQUVuRCxPQUFPLEtBQUs7RUFDZDtFQUVBLFVBQXlDLFdBQVc7RUFFcEQsZUFBOEM7Ozs7RUFJOUMsSUFBSSxVQUEwQjtHQUM1QixJQUFJLENBQUMsS0FBSyxjQUNSLE1BQU0sSUFBSSxNQUFNLHlEQUF5RDtHQUUzRSxPQUFPLEtBQUs7RUFDZDtFQUVBLGFBQTBDOzs7O0VBSTFDLElBQUksUUFBc0I7R0FDeEIsSUFBSSxDQUFDLEtBQUssWUFDUixNQUFNLElBQUksTUFBTSx5RUFBeUU7R0FFM0YsT0FBTyxLQUFLO0VBQ2Q7RUFFQSxpQkFBaUQ7RUFDakQsSUFBSSxZQUE2QjtHQUMvQixJQUFJLEtBQUssbUJBQW1CLE1BQzFCLE1BQU0sSUFBSSxNQUFNLGlDQUFpQztHQUduRCxPQUFPLEtBQUs7RUFDZDtFQUVBLFlBQW9EO0VBQ3BELElBQUksT0FBZ0M7R0FDbEMsSUFBSSxDQUFDLEtBQUssV0FDUixNQUFNLElBQUksTUFBTSx1RUFBdUU7R0FFekYsT0FBTyxLQUFLO0VBQ2Q7RUFFQSx3QkFBeUQ7RUFDekQsSUFBSSxtQkFBNEM7R0FDOUMsT0FBTyxLQUFLO0VBQ2Q7RUFDQSxJQUFJLGlCQUFpQixTQUFrQztHQUNyRCxLQUFLLHdCQUF3QjtFQUMvQjtFQUdBLHdCQUF5RDtFQUV6RCx5Q0FBMEMsSUFBSSxRQUU1QztFQUNGLElBQUksbUJBQXFDO0dBQ3ZDLElBQUksQ0FBQyxLQUFLLHVCQUNSLE1BQU0sSUFBSSxNQUFNLDZDQUE2QztHQUUvRCxPQUFPLEtBQUs7RUFDZDtFQUNBLElBQUksaUJBQWlCLFNBQWtDO0dBQ3JELEtBQUssd0JBQXdCO0VBQy9CO0VBRUEseUJBQWdEO0dBQzlDLE9BQU87SUFDTCxhQUFhLEtBQUs7SUFDbEIsUUFBUSxLQUFLO0lBQ2IsUUFBUSxLQUFLO0lBQ2IsZ0JBQWdCLEtBQUs7SUFDckIsdUJBQXVCLEtBQUs7SUFDNUIsMEJBQTBCLEtBQUs7SUFDL0IsY0FBYyxLQUFLO0lBQ25CLGdCQUFnQixLQUFLO0lBQ3JCLGtCQUFrQixLQUFLO0dBQ3pCO0VBQ0Y7RUFFQSx1QkFBdUIsVUFBdUM7R0FDNUQsS0FBSyxtQkFBbUIsU0FBUztHQUNqQyxLQUFLLGNBQWMsU0FBUztHQUM1QixLQUFLLGNBQWMsU0FBUztHQUM1QixLQUFLLGlCQUFpQixTQUFTO0dBQy9CLEtBQUssd0JBQXdCLFNBQVM7R0FDdEMsS0FBSywyQkFBMkIsU0FBUztHQUN6QyxLQUFLLGVBQWUsU0FBUztHQUM3QixLQUFLLGlCQUFpQixTQUFTO0dBQy9CLEtBQUssd0JBQXdCLFNBQVM7RUFDeEM7RUFHQSxVQUFtQztFQUVuQyxTQUF3QztFQUV4QyxNQUFNLGlCQUFpQjtHQUNyQixNQUFNLEtBQUssS0FBSyxNQUFNLE9BQU8sUUFBVyxJQUFJO0VBQzlDO0VBRUEsTUFBTSxLQUNKLFdBQW9CLE9BQ3BCLGFBQXNCLE1BQ3RCLGFBQ0EsYUFBc0IsT0FDdEI7R0FDQSxLQUFLLGFBQWE7R0FFbEIsSUFBSSxLQUFLLGVBQ1A7R0FHRixNQUFNLFlBQVksWUFBWSxJQUFJO0dBR2xDLE1BQU0sRUFBRSxvQkFBb0IsTUFBTSxPQUFPO0dBQ3pDLEtBQUssY0FBYyxlQUFlLGdCQUFnQjtHQUNsRCxNQUFNLDBCQUEwQixFQUFFLEdBQUcsUUFBUSxJQUFJO0dBR2pELE1BQU0sY0FBYyxZQUFZLElBQUk7R0FDcEMsTUFBTSxFQUFFLGVBQWUsTUFBTSxPQUFPO0dBQ3BDLEtBQUssU0FBUyxNQUFNLFdBQVcsS0FBSyxXQUFXO0dBQy9DLE1BQU0sYUFBYSxZQUFZLElBQUksSUFBSTtHQUN2QyxZQUFZLEtBQUssT0FBTyxJQUFJO0dBRTVCLEtBQUssT0FBTyxTQUFTLFdBQVcsS0FBSyxPQUFPLFNBQVMsWUFBWTtHQUNqRSxLQUFLLE9BQU8sU0FBUyxpQkFBaUIsS0FBSyxPQUFPLFNBQVMsa0JBQWtCLENBQUM7R0FDOUUsS0FBSyxPQUFPLFNBQVMsZUFBZSxTQUFTLEtBQUssT0FBTyxTQUFTLFlBQVk7R0FHOUUsTUFBTSxFQUFFLHFCQUFxQixNQUFNLE9BQU87R0FDMUMsSUFBSSxLQUFLLE9BQU8sWUFBWSxPQUMxQixNQUFNLGlCQUFpQixFQUNyQixHQUFHLEtBQUssT0FBTyxRQUNqQixDQUFDO0dBSUgsTUFBTSxFQUFFLElBQUksY0FBYyxNQUFNLE9BQU87R0FDdkMsTUFBTSxFQUFFLFNBQVMsdUJBQXVCLE1BQU0sT0FBTztHQUNyRCxNQUFNLHVCQUF1QixtQkFBbUIsSUFDNUMsNEJBQTRCLEtBQUssYUFBYSx1QkFBdUIsSUFDckU7R0FDSixLQUFLLFdBQVcsVUFBVSxpQkFDeEIsS0FBSyxPQUFPLFVBQ1osS0FBSyxPQUFPLGFBQ1osb0JBQ0Y7R0FDQSxVQUFVLFVBQVUsS0FBSyxRQUFRO0dBS2pDLE1BQU0sRUFBRSxrQkFBa0IsTUFBTSxPQUFPO0dBQ3ZDLE1BQU0sY0FBYyxTQUFTLFFBQVE7R0FHckMsTUFBTSxLQUFLLGdCQUFnQixLQUFLLE9BQU8sT0FBTyxPQUFPLFVBQVU7R0FHL0QsTUFBTSxhQUFhLEtBQUssT0FBTyxPQUFPO0dBQ3RDLElBQUksWUFBWTtJQUVkLE1BQU0sc0JBQXNCLE1BQU0scUJBQXFCLFVBQVU7SUFHakUsTUFBTSxFQUFFLGVBQWUsTUFBTSxPQUFPO0lBQ3BDLE1BQU0sRUFBRSxzQkFBc0IsTUFBTSxPQUFPO0lBRTNDLE1BQU0sY0FBaUM7S0FDckMsVUFBVSxrQkFBa0I7S0FDNUIsR0FBRztJQUNMO0lBQ0EsS0FBSyxZQUFZLFdBQVcsV0FBVztHQUN6QztHQUdBLElBQUksWUFBWTtJQUNkLEtBQUssZ0JBQWdCO0lBQ3JCO0dBQ0Y7R0FHQSxNQUFNLEtBQUssb0JBQW9CLEtBQUssT0FBTyxLQUFLO0dBR2hELE1BQU0sRUFBRSxXQUFXLE1BQU0sT0FBTztHQUNoQyxLQUFLLFNBQVMsSUFBSSxPQUFPO0dBR3pCLE1BQU0sS0FBSyxPQUFPLGNBQWM7R0FDaEMsTUFBTSxLQUFLLE9BQU8sZUFBZTtHQUNqQyxNQUFNLEtBQUssT0FBTyxhQUFhO0dBQy9CLE1BQU0sS0FBSyxPQUFPLGtCQUFrQjtHQUNwQyxNQUFNLEVBQUUsb0JBQW9CLE1BQU0sT0FBTztHQUN6QyxNQUFNLGdCQUFnQixTQUFTO0dBQy9CLE1BQU0sS0FBSyxPQUFPLGtCQUFrQjtHQUVwQyxNQUFNLEVBQUUsU0FBUyxRQUFRLHNCQUFzQixNQUFNLE9BQU87R0FDNUQsSUFBSSxRQUFRLEtBQUssQ0FBQyxPQUFPLEtBQUssa0JBQWtCLEtBQUssWUFBWTtJQUMvRCxNQUFNLEtBQUssT0FBTyxLQUFLO0lBQ3ZCLE1BQU0sS0FBSyxhQUFhO0dBQzFCO0dBRUEsS0FBSyxnQkFBZ0I7R0FDckIsS0FBSyxjQUFjLFlBQVksSUFBSSxJQUFJO0dBQ3ZDLEtBQUssZ0JBQWdCO0VBQ3ZCO0VBRUEsY0FBc0I7RUFDdEIsZ0JBQXdCO0VBRXhCLE1BQU0sYUFBYSxhQUE0RDtHQUM3RSxJQUFJLENBQUMsS0FBSyxlQUNSLE1BQU0sS0FBSyxLQUFLLGFBQWEsVUFBVSxhQUFhLFVBQVU7R0FHaEUsTUFBTSxVQUFVLEtBQUssT0FBTztHQUM1QixNQUFNLEVBQUUsU0FBUyxZQUFZLE1BQU0sT0FBTztHQUMxQyxNQUFNLEVBQUUsNEJBQTRCLE1BQU0sT0FBTztHQUNqRCxNQUFNLFNBQVMsUUFBUTtJQUNyQixHQUFHLFFBQVE7SUFDWCxRQUNFLEtBQUssT0FBTyxZQUFZLFFBQ3BCLHdCQUF3QixFQUN0QixVQUFVLEtBQUssT0FBTyxTQUFTLG1CQUFtQixDQUFDLFNBQVMsRUFDOUQsQ0FBQyxJQUNEO0dBQ1IsQ0FBQztHQUNELEtBQUssU0FBUztHQUNkLEtBQUssbUJBQW1CLElBQUksaUJBQWlCLFFBQVEsU0FBUztHQUc5RCxJQUFJLFFBQVEsU0FBUztJQUNuQixNQUFNLEVBQUUsbUJBQW1CLE1BQU0sT0FBTztJQUN4QyxLQUFLLGVBQWUsSUFBSSxlQUFlLFFBQVEsT0FBTztHQUN4RDtHQUdBLElBQUksUUFBUSxTQUNWLE1BQU0sS0FBSyxnQkFBZ0IsUUFBUSxRQUFRLE9BQU87R0FHcEQsSUFBSSxRQUFRLE1BQ1YsTUFBTSxLQUFLLG1CQUFtQixRQUFRLFFBQVEsSUFBSTtHQUlwRCxNQUFNLEtBQUssWUFBWSxRQUFRLFFBQVEsV0FBVztJQUNoRCxZQUFZLGFBQWE7SUFDekIsVUFBVSxhQUFhO0dBQ3pCLENBQUM7R0FHRCxNQUFNLEtBQUssS0FBSyxRQUFRLE9BQU87R0FFL0IsSUFBSSxDQUFDLGFBQWEsVUFDaEIsS0FBSyxvQkFBb0I7R0FHM0IsT0FBTztFQUNUO0VBRUEsTUFBTSxZQUNKLFFBQ0EsUUFDQSxTQUlBO0dBQ0EsSUFBSSxDQUFDLEtBQUssZUFDUixNQUFNLEtBQUssS0FBSyxTQUFTLFVBQVUsU0FBUyxVQUFVO0dBR3hELEtBQUssU0FBUztHQUNkLEtBQUsscUJBQXFCLElBQUksaUJBQWlCLEtBQUssT0FBTyxPQUFPLFNBQVM7R0FDM0UsTUFBTSxLQUFLLHNCQUFzQjtHQUdqQyxNQUFNLFdBQVcsS0FBSyxPQUFPLElBQUk7R0FDakMsSUFBSSxVQUFVO0lBSVosTUFBTSxFQUFFLHFCQUFxQixNQUFNLE9BQU87SUFHMUMsTUFBTSxpQkFBaUI7SUFLdkIsTUFBTSxjQUFjO0lBRXBCLE9BQU8sb0JBQW9CLFlBQVk7S0FDckMsT0FBTyxLQUFLLFVBQVUsVUFBVSxNQUFNLFVBQVU7TUFDOUMsSUFBSSxjQUFjLEtBQUssS0FBSyxlQUFlLEtBQUssS0FBSyxHQUNuRCxPQUFPLGlCQUNMLElBQUksS0FBSyxLQUFLLEdBQ3lDLFVBQ3ZELFdBQ0Y7TUFFRixPQUFPO0tBQ1QsQ0FBQztJQUNILENBQUM7R0FFSDtHQUdBLE9BQU8sSUFDTCxHQUFHLEtBQUssT0FBTyxJQUFJLE1BQU0sT0FBTyxVQUNoQyxPQUFPLFVBQVUsV0FBNkM7SUFDNUQsT0FBTyxLQUFLLE9BQU87R0FDckIsQ0FDRjtHQUdBLE9BQU8sSUFDTCxHQUFHLEtBQUssT0FBTyxJQUFJLE1BQU0sT0FBTyxlQUNoQyxPQUFPLFVBQVUsV0FBNEI7SUFDM0MsT0FBTztHQUNULENBQ0Y7R0FHQSxNQUFNLEVBQUUsWUFBWSxNQUFNLE9BQU87R0FDakMsSUFBSSxRQUFRLEdBQUc7SUFDYixNQUFNLEVBQUUsc0JBQXNCLE1BQU0sT0FBTztJQUMzQyxPQUFPLFNBQVMsaUJBQWlCO0dBQ25DO0dBR0EsSUFBSSxRQUFRLEtBQUssS0FBSyxPQUFPLE1BQU0sV0FBVyxTQUFTO0lBQ3JELE1BQU0sRUFBRSwwQkFBMEIsTUFBTSxPQUFPO0lBQy9DLE1BQU0sc0JBQXNCLFFBQVEsS0FBSyxPQUFPLEtBQUssU0FBUztHQUNoRTtHQUVBLE1BQU0sVUFBVSxLQUFLLEtBQUssS0FBSyxhQUFhLEtBQUs7R0FDakQsTUFBTSxTQUFTLE1BQU0sT0FBTyxPQUFPO0dBR25DLE1BQU0saUJBQWlCLEtBQUssT0FBTyxPQUFPLFNBQVM7R0FDbkQsTUFBTSx3QkFBcUQsaUJBQ3ZELG1CQUFtQixPQUNqQjtJQUFFLFdBQVc7SUFBTSxXQUFXO0tBQUM7S0FBTTtLQUFRO0lBQVM7R0FBRSxJQUN4RDtJQUNFLFdBQVcsZUFBZTtJQUMxQixXQUFXLGVBQWU7SUFDMUIsYUFBYSxlQUFlO0dBQzlCLElBQ0Y7R0FFSixJQUFJLFFBQVEsR0FBRztJQUdiLE1BQU0sdUJBQXVCLFFBQVEsSUFBSSxrQ0FBa0M7SUFDM0UsSUFBSSxVQUFVLENBQUMsc0JBQ2IsTUFBTSxLQUFLLHVCQUF1QixRQUFRLFNBQVMsTUFBTTtTQUV6RCxLQUFLLGVBQWUsUUFBUSxNQUFNO0dBRXRDLE9BQU87SUFFTCxLQUFLLE1BQU0sT0FBTyxLQUFLLE9BQU8sTUFBTTtLQUNsQyxJQUFJLEtBQUssT0FBTyxPQUFPLElBQUksZUFBZSxRQUN4QyxNQUFNLElBQUksTUFBTSxrQkFBa0IsSUFBSSxXQUFXO0tBSW5ELElBQUksSUFBSSxrQkFBa0I7TUFDeEIsT0FBTyxNQUFNO09BQ1gsUUFBUTtPQUNSLEtBQUssS0FBSyxPQUFPLElBQUksTUFBTSxTQUFTLElBQUk7T0FDeEMsU0FBUyxLQUFLLHNDQUFzQztPQUNwRCxXQUFXLEtBQUssdUJBQXVCLEtBQUssTUFBTTtNQUNwRCxDQUFDO01BQ0Q7S0FDRjtLQUVBLE9BQU8sTUFBTTtNQUNYLFFBQVEsSUFBSSxRQUFRLGNBQWM7TUFDbEMsS0FBSyxLQUFLLE9BQU8sSUFBSSxNQUFNLFNBQVMsSUFBSTtNQUN4QyxTQUFTLE1BQU0sS0FBSyxpQkFBaUIsS0FBSyxNQUFNO01BQ2hELFVBQVUsd0JBQXdCLElBQUksUUFBUSxVQUFVLHFCQUFxQjtLQUMvRSxDQUFDO0lBQ0g7SUFJQSxNQUFNLEtBQUsscUJBQXFCLFFBQVEsUUFBUSxxQkFBcUI7R0FDdkU7RUFDRjs7Ozs7Ozs7RUFTQSxNQUFjLG9CQUNaLFNBQ0EsUUFDOEY7R0FDOUYsTUFBTSxhQUFhLEtBQUssZUFBZSxTQUFTLEtBQUssY0FBYyxLQUFLLGNBQWM7R0FFdEYsSUFBSSxDQUFDLFlBQ0gsTUFBTSxJQUFJLGtCQUFrQixHQUFHLG9CQUFvQixDQUFDO0dBSXRELElBQUksV0FBVyxrQkFDYixPQUFPLEtBQUssc0NBQXNDO0dBR3BELE9BQU8sTUFBTSxLQUFLLGlCQUFpQixZQUFZLFFBQVEsS0FBSyxjQUFjO0VBQzVFO0VBRUEsZUFDRSxTQUNBLE1BQ0EsUUFDeUI7R0FDekIsTUFBTSxNQUFNLEtBQUssbUJBQW1CLFFBQVEsR0FBRztHQUMvQyxNQUFNLFNBQVMsUUFBUTtHQUV2QixJQUFJLENBQUMsSUFBSSxXQUFXLEtBQUssT0FBTyxJQUFJLE1BQU0sTUFBTSxHQUM5QztHQUdGLE9BQU8sS0FBSyxNQUFNLFFBQVE7SUFDeEIsSUFBSSxPQUFPLElBQUksZUFBZSxRQUM1QixPQUFPO0lBR1QsS0FEa0IsSUFBSSxRQUFRLGNBQWMsV0FDMUIsUUFBUSxPQUFPO0lBRWpDLE1BQU0sV0FBVyxLQUFLLE9BQU8sSUFBSSxNQUFNLFNBQVMsSUFBSTtJQUNwRCxPQUFPLEtBQUssbUJBQW1CLFVBQVUsR0FBRztHQUM5QyxDQUFDO0VBQ0g7Ozs7O0VBTUEsZUFDRSxRQUNBLFFBQ007R0FFTixPQUFPLE1BQU07SUFDWCxRQUFRO0lBQ1IsS0FBSyxHQUFHLEtBQUssT0FBTyxJQUFJLE1BQU0sT0FBTztJQUNyQyxTQUFTLE9BQU8sU0FBUyxVQUFVO0tBQ2pDLE1BQU0sVUFBVSxNQUFNLEtBQUssb0JBQW9CLFNBQVMsTUFBTTtLQUM5RCxJQUFJLFNBQ0YsT0FBTyxRQUFRLFNBQVMsS0FBSztLQUcvQixNQUFNLElBQUksa0JBQWtCLEdBQUcsb0JBQW9CLENBQUM7SUFDdEQ7SUFDQSxXQUFXLE9BQU8sWUFBWSxZQUFZO0tBQ3hDLE1BQU0sS0FBSywwQkFBMEIsV0FBVyxRQUFRLFNBQVMsTUFBTTtJQUN6RTtHQUNGLENBQUM7R0FFRCxPQUFPLE1BQU07SUFDWCxRQUFRO0tBQUM7S0FBUTtLQUFRO0tBQU87S0FBVTtJQUFPO0lBQ2pELEtBQUssR0FBRyxLQUFLLE9BQU8sSUFBSSxNQUFNLE9BQU87SUFDckMsU0FBUyxPQUFPLFNBQVMsVUFBVTtLQUNqQyxNQUFNLFVBQVUsTUFBTSxLQUFLLG9CQUFvQixTQUFTLE1BQU07S0FDOUQsSUFBSSxTQUNGLE9BQU8sUUFBUSxTQUFTLEtBQUs7S0FFL0IsTUFBTSxJQUFJLGtCQUFrQixHQUFHLG9CQUFvQixDQUFDO0lBQ3REO0dBQ0YsQ0FBQztFQUNIO0VBRUEsYUFBMEI7Ozs7O0VBTTFCLE1BQWMsdUJBQ1osUUFDQSxTQUNBLFFBQ2U7R0FFZixNQUFNLE9BQU8sVUFBVSxNQUFNLE9BQU8sbUJBQUEsQ0FBb0IsT0FBTztHQUUvRCxNQUFNLE9BQU8sTUFBTSxPQUFPO0dBRTFCLE1BQU0sNkJBQTZCLFFBQVEsS0FBSyxPQUFPLE9BQU8sU0FBUyxFQUFFO0dBQ3pFLE1BQU0sTUFBTSxnQ0FBZ0M7SUFDMUMsWUFBWSxPQUFPO0lBQ25CLGtDQUFrQztHQUNwQyxDQUFDO0dBRUQsS0FBSyxhQUFhLE1BQU0sS0FBSyxhQUFhO0lBQ3hDLE1BQU07SUFDTixRQUFRO0tBQ04sZ0JBQWdCO0tBQ2hCO0lBQ0Y7SUFDQSxTQUFTO0dBQ1gsQ0FBQztHQUdELE9BQU8sS0FBSyxLQUFLLEtBQUssU0FBUztJQUU3QixJQUFJLElBQUksS0FBSyxXQUFXLEtBQUssT0FBTyxJQUFJLE1BQU0sTUFBTSxLQUFLLElBQUksS0FBSyxXQUFXLFlBQVksR0FDdkYsT0FBTyxLQUFLO0lBR2QsT0FBTyxLQUFLLFdBQVcsWUFBWSxLQUFLLEtBQUssSUFBSTtHQUNuRCxDQUFDO0dBR0QsT0FBTyxNQUFNO0lBQ1gsUUFBUTtJQUNSLEtBQUssR0FBRyxLQUFLLE9BQU8sSUFBSSxNQUFNLE9BQU87SUFDckMsU0FBUyxPQUFPLFNBQVMsVUFBVTtLQUNqQyxNQUFNLFNBQVMsTUFBTSxLQUFLLG9CQUFvQixTQUFTLE1BQU07S0FDN0QsSUFBSSxRQUNGLE9BQU8sT0FBTyxTQUFTLEtBQUs7S0FFOUIsTUFBTSxJQUFJLGtCQUFrQixHQUFHLG9CQUFvQixDQUFDO0lBQ3REO0lBQ0EsV0FBVyxPQUFPLFlBQVksWUFBWTtLQUN4QyxNQUFNLEtBQUssMEJBQTBCLFdBQVcsUUFBUSxTQUFTLE1BQU07SUFDekU7R0FDRixDQUFDO0dBRUQsT0FBTyxNQUFNO0lBQ1gsUUFBUTtLQUFDO0tBQVE7S0FBUTtLQUFPO0tBQVU7SUFBTztJQUNqRCxLQUFLLEdBQUcsS0FBSyxPQUFPLElBQUksTUFBTSxPQUFPO0lBQ3JDLFNBQVMsT0FBTyxTQUFTLFVBQVU7S0FDakMsTUFBTSxTQUFTLE1BQU0sS0FBSyxvQkFBb0IsU0FBUyxNQUFNO0tBQzdELElBQUksUUFDRixPQUFPLE9BQU8sU0FBUyxLQUFLO0tBRTlCLE1BQU0sSUFBSSxrQkFBa0IsR0FBRyxvQkFBb0IsQ0FBQztJQUN0RDtHQUNGLENBQUM7R0FJRCxPQUFPLE1BQU07SUFDWCxRQUFRLENBQUMsT0FBTyxNQUFNO0lBQ3RCLEtBQUs7SUFDTCxTQUFTLE9BQU8sU0FBUyxVQUFVO0tBQ2pDLE1BQU0sTUFBTSxRQUFRO0tBR3BCLE1BQU0sRUFBRSxlQUFlLGNBQWMsTUFBTSxPQUFPO0tBQ2xELE1BQU0sV0FBVyxjQUFjLEdBQUc7S0FDbEMsSUFBSSxVQUFVO01BQ1osUUFBUSxJQUFJLHdCQUF3QixTQUFTLE1BQU0sTUFBTTtNQUN6RCxNQUFNLE9BQU8sTUFBTSxVQUNqQixLQUNBLFNBQVMsT0FDVCxTQUFTLFFBQ1QsU0FDQSxPQUNBLFFBQ0EsS0FBSyxVQUNQO01BQ0EsTUFBTSxLQUFLLFdBQVc7TUFDdEIsT0FBTztLQUNUO0tBR0EsSUFBSTtNQUNGLElBQUksV0FBVyxNQUFNLEdBQUcsU0FDdEIsS0FBSyxLQUFLLEtBQUssV0FBVyxPQUFPLE1BQU0sWUFBWSxHQUNuRCxPQUNGO01BQ0EsV0FBVyxNQUFNLEtBQUssV0FBVyxtQkFBbUIsS0FBSyxRQUFRO01BR2pFLE1BQU0sRUFBRSxvQkFBb0IseUJBQXlCLE1BQU0sT0FBTztNQUNsRSxJQUFJLHFCQUFxQixHQUFHLEdBQzFCLFdBQVcsU0FBUyxRQUFRLFVBQVUsV0FBVyxvQkFBb0I7TUFHdkUsTUFBTSxLQUFLLFdBQVc7TUFDdEIsT0FBTztLQUNULFNBQVMsR0FBRztNQUNWLEtBQUssV0FBVyxpQkFDeUMsQ0FDekQ7TUFDQSxRQUFRLE1BQU0sQ0FBQztNQUNmLE1BQU0sT0FBTyxHQUFHO01BQ2hCLE9BQ0UsRUFDQTtLQUNKO0lBQ0Y7R0FDRixDQUFDO0dBR0QsT0FBTyxRQUFRLFdBQVcsWUFBWTtJQUNwQyxNQUFNLEtBQUssV0FBVyxNQUFNO0dBQzlCLENBQUM7R0FFRCxJQUFJLFVBQVUsS0FDWixRQUFRLElBQ04sTUFBTSxJQUNKLDZDQUE2QyxJQUFJLEtBQUssc0NBQ3hELENBQ0Y7R0FFRixRQUFRLElBQUksTUFBTSxJQUFJLDhCQUE4QixDQUFDO0VBQ3ZEO0VBRUEsTUFBYyxxQkFDWixRQUNBLFFBQ0EsdUJBQ2U7R0FFZixNQUFNLGNBQWMsS0FBSyxLQUFLLEtBQUssYUFBYSxZQUFZLFFBQVE7R0FDcEUsTUFBTSxVQUFVLEtBQUssS0FBSyxLQUFLLGFBQWEsWUFBWSxRQUFRO0dBQ2hFLE1BQU0sZUFBZSxLQUFLLEtBQUssU0FBUywyQkFBMkI7R0FDbkUsTUFBTSxnQkFBZ0IsS0FBSyxLQUFLLEtBQUssYUFBYSxRQUFRLE9BQU8sV0FBVztHQUU1RSxJQUFJLENBQUUsTUFBTSxPQUFPLFdBQVcsR0FBSTtJQUNoQyxRQUFRLEtBQUsseUJBQXlCLGFBQWE7SUFDbkQ7R0FDRjtHQUdBLE1BQU0sZUFBZSxNQUFNLE9BQU8sWUFBWTtHQUU5QyxJQUFJLENBQUMsY0FBYztJQUNqQixRQUFRLEtBQUssMEJBQTBCLGNBQWM7SUFDckQsUUFBUSxLQUFLLDZDQUE2QztHQUM1RDtHQUdBLElBQUksY0FDRixJQUFJLE1BQU0sT0FBTyxhQUFhLEdBQUc7SUFJL0IsTUFBTSxPQUFPO0lBQ2IsUUFBUSxJQUFJLHFCQUFxQjtHQUNuQyxPQUNFLFFBQVEsS0FBSywyQkFBMkIsZUFBZTtHQUszRCxPQUFPLElBQUkscUJBQXFCLE9BQU8sU0FBUyxVQUFVO0lBQ3hELE1BQU0sZ0JBRUYsUUFBUSxPQUNSO0lBQ0osTUFBTSxZQUFZLEtBQUssS0FBSyxhQUFhLFFBQVE7SUFDakQsTUFBTSxlQUFlLEtBQUsseUJBQXlCLFdBQVcsYUFBYTtJQUMzRSxJQUFJLGlCQUFpQixNQUFNO0tBQ3pCLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLO0tBQ3ZCO0lBQ0Y7SUFDQSxNQUFNLDBCQUEwQixLQUFLLFNBQVMsV0FBVyxZQUFZLENBQUMsQ0FBQyxRQUFRLE9BQU8sR0FBRztJQUV6RixNQUFNLFlBQVksV0FBVztJQUc3QixNQUFNLGdDQUFvRDtLQUN4RCxNQUFNLFdBQWdDO01BQ3BDLE1BQU07TUFDTixLQUFLLFFBQVE7TUFDYixNQUFNO01BQ04sUUFBUSxRQUFRO0tBQ2xCO0tBR0EsSUFBSSxPQUFPLHFCQUFxQjtNQUM5QixNQUFNLFNBQVMsT0FBTyxvQkFBb0IsUUFBUTtNQUNsRCxJQUFJLFFBQVEsT0FBTztLQUNyQjtLQUdBLE9BQU8sYUFBYTtJQUN0QjtJQUdBLElBQUksOEJBQThCLEtBQUssdUJBQXVCLEdBQUc7S0FDL0QsTUFBTSxNQUFNLHdCQUF3QixNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUk7S0FFbkQsTUFBTSxlQUFjLE1BREEsR0FBRyxRQUFRLFNBQVMsRUFDcEIsQ0FBTSxNQUFNLE1BQU0sRUFBRSxXQUFXLFFBQVEsS0FBSyxFQUFFLFNBQVMsSUFBSSxLQUFLLENBQUM7S0FFckYsSUFBSSxhQUFhO01BQ2YsTUFBTSxXQUFXLEtBQUssS0FBSyxXQUFXLFdBQVc7TUFDakQsTUFBTSxVQUFVLE1BQU0sR0FBRyxTQUFTLFFBQVE7TUFDMUMsTUFBTSxLQUFLLFFBQVEsT0FBTywyQkFBMkIsVUFBVTtNQUMvRCxrQkFBa0IsT0FBTyx3QkFBd0IsQ0FBQztNQUNsRCxPQUFPLE1BQU0sS0FBSyxPQUFPO0tBQzNCO0lBQ0Y7SUFHQSxNQUFNLFdBQVc7SUFDakIsSUFBSSxNQUFNLE9BQU8sUUFBUSxHQUFHO0tBQzFCLE1BQU0sVUFBVSxNQUFNLEdBQUcsU0FBUyxRQUFRO0tBQzFDLE1BQU0sTUFBTSx3QkFBd0IsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJO0tBQ25ELE1BQU0sS0FBSyxRQUFRLE9BQU8sMkJBQTJCLFFBQVEsUUFBUSxhQUFhLEVBQUU7S0FDcEYsSUFBSSx3QkFBd0IsU0FBUyxHQUFHLEdBQ3RDLGtCQUFrQixPQUFPLHdCQUF3QixDQUFDO0tBRXBELE9BQU8sTUFBTSxLQUFLLE9BQU87SUFDM0I7SUFFQSxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsS0FBSztHQUN6QixDQUFDO0dBR0QsSUFBSSxjQUFjO0lBQ2hCLE1BQU0sRUFBRSxpQkFBaUIsTUFBTSxPQUFPO0lBQ3RDLE1BQU0sRUFBRSxjQUFjLE1BQU0sT0FBTztJQUNuQyxNQUFNLFlBQVksYUFBYTtJQUUvQixLQUFLLE1BQU0sU0FBUyxXQUNsQixPQUFPLE1BQU07S0FDWCxRQUFRLENBQUMsT0FBTyxNQUFNO0tBQ3RCLEtBQUssTUFBTTtLQUNYLFVBQVUsd0JBQXdCLE1BQU0sWUFBWSxNQUFNLHFCQUFxQjtLQUMvRSxTQUFTLE9BQU8sU0FBUyxVQUFVO01BQ2pDLE1BQU0sTUFBTSxRQUFRO01BQ3BCLFFBQVEsSUFBSSx3QkFBd0IsTUFBTSxNQUFNO01BR2hELE1BQU0sT0FBTyxNQUFNLFVBQVUsS0FBSyxPQURuQixLQUFLLGtCQUFrQixNQUFNLE1BQU0sR0FDVCxHQUFRLFNBQVMsT0FBTyxNQUFNO01BRXZFLE1BQU0sS0FBSyxXQUFXO01BQ3RCLE9BQU87S0FDVDtJQUNGLENBQUM7R0FFTDtHQUdBLE9BQU8sTUFBTTtJQUNYLFFBQVEsQ0FBQyxPQUFPLE1BQU07SUFDdEIsS0FBSztJQUNMLFNBQVMsT0FBTyxTQUFTLFVBQVU7S0FFakMsSUFBSSxRQUFRLElBQUksV0FBVyxNQUFNLEtBQUssUUFBUSxJQUFJLFdBQVcsWUFBWSxHQUFHO01BQzFFLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLO01BQ3ZCO0tBQ0Y7S0FHQSxJQUFJLE9BQU8scUJBQXFCO01BQzlCLE1BQU0sY0FBbUM7T0FDdkMsTUFBTTtPQUNOLEtBQUssUUFBUTtPQUNiLE1BQU0sUUFBUSxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7T0FDN0IsUUFBUSxRQUFRO01BQ2xCO01BQ0EsTUFBTSxpQkFBaUIsT0FBTyxvQkFBb0IsV0FBVztNQUU3RCxJQUFJLGdCQUNGLGtCQUFrQixPQUFPLGNBQWM7S0FFM0M7S0FHQSxNQUFNLGNBQWMsS0FBSyxtQkFBbUIsUUFBUSxHQUFHO0tBQ3ZELE1BQU0sZUFBZSxLQUFLLHlCQUF5QixhQUFhLFdBQVc7S0FDM0UsSUFBSSxpQkFBaUIsTUFBTTtNQUN6QixNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsS0FBSztNQUN2QjtLQUNGO0tBQ0EsSUFBSSxNQUFNLFdBQVcsWUFBWSxHQUFHO01BQ2xDLE1BQU0sVUFBVSxNQUFNLEdBQUcsU0FBUyxZQUFZO01BQzlDLE9BQU8sTUFBTSxLQUFLQSxPQUFXLFlBQVksS0FBSywwQkFBMEIsQ0FBQyxDQUFDLEtBQUssT0FBTztLQUN4RjtLQUdBLE1BQU0sWUFBWSxLQUFLLEtBQUssYUFBYSxZQUFZO0tBQ3JELE9BQU8sTUFBTSxLQUFLLFdBQVcsQ0FBQyxDQUFDLEtBQUssTUFBTSxHQUFHLFNBQVMsV0FBVyxPQUFPLENBQUM7SUFDM0U7R0FDRixDQUFDO0dBRUQsUUFBUSxJQUFJLHVDQUF1QyxlQUFlLFFBQVEsV0FBVyxTQUFTO0VBQ2hHO0VBRUEsaUJBQ0UsS0FDQSxRQUNBLFNBQXVCLEtBQUssT0FBTyxRQUNuQyxlQUFnRCx3Q0FDNEI7R0FDNUUsTUFBTSxvQkFBb0IsS0FBSyx5QkFBeUIsS0FBSyxZQUFZO0dBRXpFLE9BQU8sT0FBTyxTQUF5QixVQUFrRDtJQUN2RixNQUFNLFlBQ0osNkJBQTZCLFVBQVUsTUFBTSxvQkFBb0I7SUFFbkUsTUFBTSxVQUFtQixNQUFNLEtBQUssY0FBYyxRQUFRLFNBQVMsS0FBSztJQUV4RSxPQUFPLEtBQUssa0JBQWtCLElBQUksRUFBRSxRQUFRLEdBQUcsWUFBWTtLQUV6RCxVQUFVO01BQ1IsUUFBUSxJQUFJLFFBQVE7TUFDcEI7TUFDQTtNQUNBO0tBQ0YsQ0FBQztLQUdELE1BQU0sUUFBUSxJQUFJLFFBQVEsZUFBZSxRQUFRLFVBQVU7S0FDM0QsSUFBSSwwQkFBVSxJQUFJLElBQXlCO0tBRTNDLE1BQU0sUUFBOEI7TUFDbEMsZUFBZSxDQUFDO01BQ2hCLGVBQWUsQ0FBQztLQUNsQjtLQUVBLElBQUk7TUFDRixNQUFNLE9BQU8sUUFBUSxVQUFVLENBQUM7TUFDaEMsSUFBSSxJQUFJLGVBQWU7T0FDckIsTUFBTSxRQUFRLFFBQVEsTUFBTSxFQUMxQixRQUFRLElBQUksY0FBYyxPQUM1QixDQUFDO09BR0QsTUFBTSxTQUFpQyxDQUFDO09BRXhDLElBQUksSUFBSSxjQUFjLFlBQVksWUFBWSxDQUFDLElBQUksY0FBYyxTQUUvRDttQkFBVyxNQUFNLFFBQVEsT0FDdkIsSUFBSSxLQUFLLFNBQVMsUUFBUTtTQUd4QixNQUFNLFNBQVMsTUFBTSxLQUFLLFNBQVM7U0FDbkMsTUFBTSxjQUFjLEtBQUssSUFBSSxhQUFhLE1BQU0sTUFBTSxDQUFDO1FBQ3pELE9BQU8sSUFBSSxLQUFLLFNBQVMsU0FDdkIsT0FBTyxLQUFLLGFBQWEsT0FBTyxLQUFLLEtBQUs7T0FFOUMsT0FDSyxJQUFJLElBQUksY0FBYyxZQUFZLFVBQVU7UUFFakQsTUFBTSxXQUFXLElBQUksY0FBYztRQUNuQyxNQUFNLE9BQU8sS0FBSyxRQUFRLElBQUksUUFBUTtRQUd0QyxNQUFNLGVBQ0osSUFBSSxjQUFjLGdCQUNsQixLQUFLLE9BQU8sT0FBTyxTQUFTLGdCQUM1QjtRQUVGLFdBQVcsTUFBTSxRQUFRLE9BQ3ZCLElBQUksS0FBSyxTQUFTLFFBQVE7U0FDeEIsTUFBTSxNQUFNLE1BQU0sYUFBYTtVQUM3QixVQUFVLEtBQUs7VUFDZixVQUFVLEtBQUs7U0FDakIsQ0FBQztTQUVELE1BQU0sS0FBSyxVQUFVLEtBQUssS0FBSyxNQUFNLEVBQ25DLGFBQWEsS0FBSyxTQUNwQixDQUFDO1NBRUQsTUFBTSxNQUFNLE1BQU0sS0FBSyxPQUFPLEdBQUc7U0FDakMsTUFBTSxZQUFZLE1BQU0sS0FBSyxhQUFhLEdBQUc7U0FFN0MsTUFBTSxjQUFjLEtBQ2xCLElBQUksYUFBYTtVQUNmLFVBQVUsS0FBSztVQUNmLFVBQVUsS0FBSztVQUNmLE1BQU0sS0FBSyxLQUFLO1VBQ2hCO1VBQ0E7VUFDQTtVQUNBO1NBQ0YsQ0FBQyxDQUNIO1FBQ0YsT0FBTyxJQUFJLEtBQUssU0FBUyxTQUN2QixPQUFPLEtBQUssYUFBYSxPQUFPLEtBQUssS0FBSztPQUdoRDtPQUlBLE1BQU0sVUFBUyxNQURFLE9BQU8sTUFDVCxDQUFHLFFBQVEsTUFBTSxNQUFNO09BQ3RDLE9BQU8sT0FBTyxNQUFNLE1BQU07TUFDNUI7TUFFQSxVQUFVLGlCQUFpQixVQUFVLE1BQU0sSUFBSSxDQUFDO0tBQ2xELFNBQVMsR0FBRztNQUNWLE1BQU0sRUFBRSxhQUFhLE1BQU0sT0FBTztNQUNsQyxJQUFJLGFBQWEsVUFBVTtPQUN6QixNQUFNLEVBQUUscUJBQXFCLE1BQU0sT0FBTztPQUMxQyxNQUFNLFdBQVcsaUJBQWlCLENBQUMsQ0FBQyxDQUNqQyxLQUFLLFVBQVUsTUFBTSxPQUFPLENBQUMsQ0FDN0IsS0FBSyxHQUFHO09BQ1gsTUFBTSxFQUFFLHdCQUF3QixNQUFNLE9BQU87T0FDN0MsTUFBTSxJQUFJLG9CQUMrQyxVQUN2RCxFQUNFLFVBQVUsRUFDWixDQUNGO01BQ0YsT0FDRSxNQUFNO0tBRVY7S0FHQSxNQUFNLEtBQUssSUFBSSxRQUFRLGVBQWUsa0JBQWtCO0tBR3hELE1BQU0saUJBQWlCLEtBQUssbUJBQW1CLEtBQUssU0FBUyxNQUFNO0tBQ25FLElBQUksZ0JBQ0Ysa0JBQWtCLE9BQU8sY0FBYztLQUl6QyxJQUFJLElBQUksZUFBZTtNQUNyQixNQUFNLFVBQVUsSUFBSSxjQUFjLFdBQVc7TUFDN0MsSUFBSSxZQUFZLFVBQ2QsUUFBUSxnQkFBZ0IsTUFBTTtXQUN6QixJQUFJLFlBQVksVUFDckIsUUFBUSxnQkFBZ0IsTUFBTTtLQUVsQztLQUdBLE1BQU0sRUFBRSxpQkFBaUIsTUFBTSxPQUFPO0tBQ3RDLE1BQU0sT0FBTyxJQUFJLFdBQVcsS0FBSyxVQUFVO01BRXpDLElBQUksYUFBYSxVQUFVLE1BQU0sSUFBSSxHQUNuQyxPQUFPO1dBRVAsT0FBTyxRQUFRLElBQUksTUFBTSxJQUFJO0tBRWpDLENBQUM7S0FFRCxPQUFPLEtBQUssa0JBQWtCLEtBQUssTUFBTSxPQUFPLE1BQU07SUFDeEQsQ0FBQztHQUNIO0VBQ0Y7RUFFQSx5QkFDRSxLQUNBLGNBQ3dDO0dBQ3hDLE1BQU0sU0FBUyxLQUFLLGVBQWUsSUFBSSxHQUFHO0dBQzFDLElBQUksV0FBVyxRQUNiLE9BQU87R0FFVCxNQUFNLFdBQVcsS0FBSyxzQkFBc0IsSUFBSSxHQUFHO0dBQ25ELElBQUksYUFBYSxRQUNmLE9BQU87R0FFVCxNQUFNLFVBQVUsS0FBSyxtQkFBbUIsS0FBSyxZQUFZO0dBQ3pELEtBQUssc0JBQXNCLElBQUksS0FBSyxPQUFPO0dBQzNDLEFBQUssUUFBUSxNQUNWLGNBQWM7SUFDYixLQUFLLGVBQWUsSUFBSSxLQUFLLFNBQVM7SUFDdEMsS0FBSyxzQkFBc0IsT0FBTyxHQUFHO0dBQ3ZDLFNBQ007SUFDSixLQUFLLHNCQUFzQixPQUFPLEdBQUc7R0FDdkMsQ0FDRjtHQUNBLE9BQU87RUFDVDtFQUVBLE1BQWMsbUJBQ1osS0FDQSxjQUN3QjtHQUN4QixNQUFNLFNBQVMsMkJBQTJCLEtBQUssT0FBTyxZQUFZLFdBQVc7R0FDN0UsTUFBTSxZQUFZLFFBQVEsSUFBSSxRQUFRLFNBQVMsUUFBUSxJQUFJLFdBQVc7R0FDdEUsSUFBSSxPQUFPLFFBQVEsU0FBUyxDQUFDLFdBQVc7SUFDdEMsTUFBTSxXQUFXLEtBQUssNEJBQTZCLE1BQU0sS0FBSyw2QkFBNkI7SUFDM0YsT0FBTyxLQUFLLG9CQUFvQixLQUFLLFFBQVE7R0FDL0M7R0FFQSxPQUFPLE1BQU0sYUFBYSxnQkFBZ0I7SUFDeEM7SUFDQTtJQUNBLE9BQU8sS0FBSyxPQUFPO0lBQ25CLHdCQUF3QjtHQUMxQixDQUFDO0VBQ0g7RUFFQSxvQkFBNEIsS0FBa0IsVUFBZ0Q7R0FDNUYsTUFBTSxXQUFXLHlCQUF5QixHQUFHO0dBQzdDLE1BQU0sWUFBWSxTQUFTLFdBQVcsSUFBSSxRQUFRO0dBQ2xELElBQUksY0FBYyxRQUNoQixNQUFNLElBQUksTUFBTSxzQ0FBc0MsVUFBVTtHQUVsRSxPQUFPO0VBQ1Q7RUFFQSxNQUFjLDZCQUNaLE9BQStCLEtBQUssT0FBTyxNQUMzQyxlQUFnRCx3Q0FDaEI7R0FDaEMsTUFBTSxFQUFFLGtCQUFrQixNQUFNLE9BQU87R0FDdkMsTUFBTSxlQUFlLEtBQUssS0FDeEIsS0FBSyxhQUNMLGlEQUNGO0dBQ0EsSUFBSSxDQUFFLE1BQU0sT0FBTyxZQUFZLEdBQzdCLE1BQU0sSUFBSSxNQUFNLGdEQUFnRCxjQUFjO0dBR2hGLE1BQU0sV0FDb0QsTUFBTSxPQUM1RCxjQUFjLFlBQVksQ0FBQyxDQUFDO0dBS2hDLElBQUksQ0FBQyxjQUFjLFNBQVMsV0FBVyxLQUFLLEVBQUUsU0FBUyxzQkFBc0IsTUFDM0UsTUFBTSxJQUFJLE1BQU0sOENBQThDLGNBQWM7R0FFOUUsS0FBSyxNQUFNLENBQUMsS0FBSyxjQUFjLFNBQVMsWUFDdEMsSUFDRSxDQUFDLGNBQWMsR0FBRyxLQUNsQixDQUFDLGNBQWMsU0FBUyxLQUN4QixjQUFjLFFBQ2QsRUFBRSxXQUFXLGNBQ2IsQ0FBQyxnQkFBZ0IsVUFBVSxLQUFLLEdBRWhDLE1BQU0sSUFBSSxNQUFNLDBDQUEwQyxPQUFPLEdBQUcsR0FBRztHQUkzRSxNQUFNLFdBQWtDO0lBQ3RDLGFBQWEsU0FBUztJQUN0QixZQUFZLFNBQVM7R0FDdkI7R0FDQSxhQUFhLGVBQWUsTUFBTSxRQUFRO0dBQzFDLE9BQU87RUFDVDtFQUVBLE1BQU0sc0JBQ0osZUFBZ0Qsd0NBQ2pDO0dBQ2YsTUFBTSxTQUFTLDJCQUEyQixLQUFLLE9BQU8sWUFBWSxXQUFXO0dBQzdFLE1BQU0sWUFBWSxRQUFRLElBQUksUUFBUSxTQUFTLFFBQVEsSUFBSSxXQUFXO0dBQ3RFLE1BQU0sV0FBVyxDQUFDLEdBQUcsS0FBSyxPQUFPLElBQUk7R0FDckMsTUFBTSxhQUFhLEVBQUUsR0FBRyxLQUFLLE9BQU8sT0FBTztHQUMzQyxNQUFNLFdBQVcsU0FBUyxRQUFRLFFBQVEsSUFBSSxxQkFBcUIsTUFBUztHQUM1RSxNQUFNLHVCQUFPLElBQUksUUFBb0M7R0FDckQsSUFBSTtHQUVKLElBQUksT0FBTyxRQUFRLFNBQVMsQ0FBQyxXQUFXO0lBQ3RDLE1BQU0sV0FBVyxNQUFNLEtBQUssNkJBQTZCLFVBQVUsWUFBWTtJQUMvRSxLQUFLLE1BQU0sT0FBTyxVQUNoQixLQUFLLElBQUksS0FBSyxLQUFLLG9CQUFvQixLQUFLLFFBQVEsQ0FBQztJQUV2RCxrQkFBa0I7R0FDcEIsT0FDRSxNQUFNLFFBQVEsSUFDWixTQUFTLElBQUksT0FBTyxRQUFRO0lBQzFCLE1BQU0sWUFBWSxNQUFNLEtBQUssbUJBQW1CLEtBQUssWUFBWTtJQUNqRSxLQUFLLElBQUksS0FBSyxTQUFTO0dBQ3pCLENBQUMsQ0FDSDtHQUlGLEtBQUssaUJBQWlCO0dBQ3RCLEtBQUssd0NBQXdCLElBQUksUUFBUTtHQUN6QyxLQUFLLDJCQUEyQjtHQUNoQyxLQUFLLGVBQWU7R0FDcEIsS0FBSyxpQkFBaUI7RUFDeEI7RUFHQSx3Q0FBZ0Q7R0FDOUMsT0FBTyxPQUFPLFVBQTBCLFVBQXVDO0lBQzdFLE1BQU0sT0FBTyxjQUFjLFNBQVMsQ0FBQyxDQUFDLE9BQU8sV0FBVyxXQUFXLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFDcEYsU0FBUyw2QkFDWCxDQUFDO0dBQ0g7RUFDRjtFQUdBLE1BQWMsMEJBQ1osUUFDQSxTQUNBLFFBQ2U7R0FDZixNQUFNLGFBQWEsS0FBSyxlQUFlLFNBQVMsS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU07R0FDcEYsSUFBSSxDQUFDLFlBQVksa0JBQWtCO0lBQ2pDLE1BQU0sZUFBZSxLQUFLLGlCQUFpQixvQkFBb0Isd0JBQXdCLEVBQ3JGLFNBQVMsUUFBUSxRQUNuQixDQUFDO0lBQ0QsS0FBSyxpQkFBaUIsb0JBQW9CLEtBQUs7S0FDN0MsTUFBTTtLQUNOLE9BQU87S0FDUCxRQUFRO01BQ04sUUFBUTtNQUNSLE1BQU0sUUFBUTtLQUNoQjtLQUNBLFNBQVMsYUFBYTtLQUN0QixRQUFRLGFBQWE7S0FDckIsY0FBYyxhQUFhO0tBQzNCLFNBQVMsYUFBYTtJQUN4QixDQUFDO0lBQ0QsT0FBTyxNQUFNLE1BQU0sMkJBQTJCO0lBQzlDO0dBQ0Y7R0FHQSxNQURnQixLQUFLLHVCQUF1QixZQUFZLE1BQ2xELENBQUEsQ0FBUSxFQUFFLE9BQU8sR0FBRyxPQUFPO0VBQ25DO0VBT0EsaUNBQWlDLEtBQWtCLFFBQTZCO0dBQzlFLE9BQU8sS0FBSyx1QkFBdUIsS0FBSyxNQUFNO0VBQ2hEO0VBRUEsdUJBQStCLEtBQWtCLFFBQTZCO0dBQzVFLE9BQU8sT0FDTCxZQUdBLFlBQ2tCO0lBQ2xCLE1BQU0sU0FBUyxXQUFXO0lBQzFCLElBQUksWUFBcUQ7SUFDekQsSUFBSSxRQUFtRTtJQUN2RSxJQUFJLG1CQUErRDtJQUNuRSxJQUFJLGVBQW9ELENBQUM7SUFFekQsSUFBSTtLQUNGLGVBQWUsS0FBSyxpQkFBaUIsb0JBQW9CLHdCQUF3QixFQUMvRSxTQUFTLFFBQVEsUUFDbkIsQ0FBQztLQUVELG1CQUFtQjtLQUNuQixNQUFNLFVBQVUsTUFBTSxLQUFLLDRCQUE0QixLQUFLLE9BQU87S0FDbkUsbUJBQW1CO0tBQ25CLFFBQVEsS0FBSyxpQkFBaUIsbUJBQW1CLFFBQVE7TUFDdkQsV0FBVyxJQUFJLGlCQUFrQjtNQUNqQyxVQUFVLElBQUksaUJBQWtCO01BQ2hDLFdBQVcsSUFBSSxpQkFBa0I7TUFDakMsV0FBVyxJQUFJLGlCQUFrQjtNQUNqQyxRQUFRO01BQ1IsU0FBUyxhQUFhO01BQ3RCLFFBQVEsYUFBYTtNQUNyQixjQUFjLGFBQWE7TUFDM0IsU0FBUyxhQUFhO0tBQ3hCLENBQUM7S0FFRCxNQUFNLFdBQVcsS0FBSyxnQ0FBZ0MsYUFBYSxTQUFTO0tBQzVFLFlBQVksTUFBTSxLQUFLLHVCQUF1QixRQUFRLFNBQVMsUUFBUTtLQUV2RSxNQUFNLEtBQUssa0JBQWtCLElBQUksRUFBRSxTQUFTLFVBQVUsR0FBRyxZQUFZO01BQ25FLFVBQVU7T0FDUixRQUFRLElBQUksUUFBUTtPQUNwQjtPQUNBO09BQ0E7TUFDRixDQUFDO0tBQ0gsQ0FBQztLQUVELEtBQUssaUJBQWlCLG1CQUFtQixNQUFNLEVBQUU7S0FDakQsbUJBQW1CO0tBRW5CLE1BQU0sRUFBRSxpQkFBaUIsTUFBTSxPQUFPO0tBQ3RDLE1BQU0sT0FBTyxJQUFJLFdBQVcsS0FBSyxVQUFVO01BQ3pDLElBQUksYUFBYSxVQUFVLE1BQU0sSUFBSSxHQUNuQyxPQUFPO01BR1QsT0FBTyxRQUFRLElBQUksTUFBTSxJQUFJO0tBQy9CLENBQUM7S0FFRCxNQUFNLEtBQUssa0JBQWtCLElBQUksRUFBRSxTQUFTLFVBQVUsR0FBRyxZQUFZO01BQ25FLE1BQU0sS0FBSyxrQkFBa0IsS0FBSyxJQUFJO0tBQ3hDLENBQUM7SUFDSCxTQUFTLE9BQU87S0FDZCxNQUFNLGtCQUFrQixnQ0FBZ0MsS0FBSztLQUM3RCxJQUFJLENBQUMsT0FDSCxLQUFLLGlCQUFpQixvQkFBb0IsS0FBSztNQUM3QyxNQUFNO01BQ04sT0FBTyxnQkFBZ0IsYUFBYSxTQUFTLFNBQVM7TUFDdEQsUUFBUTtPQUNOLFFBQVE7T0FDUixNQUFNLGdCQUFnQjtPQUN0QixNQUFNLElBQUk7TUFDWjtNQUNBLFNBQVMsYUFBYTtNQUN0QixRQUFRLGFBQWE7TUFDckIsY0FBYyxhQUFhO01BQzNCLFNBQVMsYUFBYTtLQUN4QixDQUFDO0tBR0gsSUFBSSxPQUNGLE1BQU0sTUFBTSxnQkFBZ0IsTUFBTSxnQkFBZ0IsTUFBTTtVQUNuRCxJQUFJLE9BQU8sYUFBYSxHQUM3QixPQUFPLE1BQU0sZ0JBQWdCLE1BQU0sZ0JBQWdCLE1BQU07S0FHM0QsSUFBSSxLQUFLLFFBQVEsS0FBSztNQUNwQixNQUFNLFVBQVU7T0FDZCxLQUFLO09BQ0wsV0FBVyxJQUFJO09BQ2YsWUFBWSxJQUFJO09BQ2hCLE1BQU0sSUFBSTtNQUNaO01BQ0EsSUFBSSxnQkFBZ0IsYUFBYSxRQUMvQixLQUFLLE9BQU8sSUFBSSxLQUFLLFNBQVMsZ0JBQWdCLE1BQU07V0FFcEQsS0FBSyxPQUFPLElBQUksTUFBTSxTQUFTLGdCQUFnQixNQUFNO0tBRXpELE9BQ0UsSUFBSSxnQkFBZ0IsYUFBYSxRQUMvQixRQUFRLEtBQUssZ0JBQWdCLFFBQVEsS0FBSztVQUUxQyxRQUFRLE1BQU0sZ0JBQWdCLFFBQVEsS0FBSztJQUdqRDtHQUNGO0VBQ0Y7RUFJQSxnQ0FDRSxJQUNBLFlBQ2dDO0dBQ2hDLE1BQU0sc0JBQXNCLEtBQUssdUJBQXVCO0dBQ3hELE1BQU0sZ0JBQW1CLGFBQXlCO0lBQ2hELE1BQU0sVUFBVSxXQUFXO0lBQzNCLElBQUksQ0FBQyxTQUNILE9BQU8sU0FBUztJQUdsQixPQUFPLEtBQUssa0JBQWtCLElBQUksRUFBRSxRQUFRLEdBQUcsUUFBUTtHQUN6RDtHQUVBLE9BQU87SUFDTCxJQUFJLEtBQUs7S0FDUCxPQUFPLEdBQUc7SUFDWjtJQUNBLElBQUksWUFBWTtLQUNkLE9BQU8sR0FBRztJQUNaO0lBQ0EsSUFBSSxTQUFTO0tBQ1gsT0FBTyxHQUFHO0lBQ1o7SUFDQSxJQUFJLFNBQVM7S0FDWCxPQUFPLEdBQUc7SUFDWjtJQUNBLFdBQVc7SUFDWCxlQUFlLE9BQU8sTUFBTTtLQUMxQixHQUFHLGVBQWUsT0FBTyxJQUFJO0lBQy9CO0lBQ0EsTUFBTSxNQUFNLFFBQVE7S0FDbEIsR0FBRyxNQUFNLE1BQU0sTUFBTTtJQUN2QjtJQUNBLFFBQVEsVUFBVTtLQUNoQixHQUFHLGNBQWMsYUFBYSxRQUFRLENBQUM7SUFDekM7SUFDQSxVQUFVLE9BQU8sU0FBUztLQUN4QixHQUFHLFVBQVUsUUFBUSxNQUFNLHdCQUN6QixhQUFhLFlBQVk7TUFDdkIsTUFBTSxZQUFZLE9BQU8sS0FBSztNQUM5QixNQUFNLGVBQWUsdUJBQXVCLDZCQUE2QixFQUFFO01BQzNFLE1BQU0sWUFBWSxZQUFZLElBQUk7TUFFbEMscUJBQXFCLEtBQUs7T0FDeEIsTUFBTTtPQUNOLE9BQU87T0FDUCxjQUFjLEdBQUc7T0FDakIsV0FBVyxHQUFHO09BQ2QsUUFBUSxHQUFHO09BQ1gsUUFBUSxFQUFFLE9BQU8sVUFBVTtPQUMzQixHQUFHO01BQ0wsQ0FBQztNQUVELElBQUk7T0FDRixNQUFNLFNBQVMsTUFBTSxRQUFRLE1BQU0sbUJBQW1CO09BQ3RELE1BQU0sYUFBYSxZQUFZLElBQUksSUFBSTtPQUN2QyxxQkFBcUIsS0FBSztRQUN4QixNQUFNO1FBQ04sT0FBTztRQUNQLGNBQWMsR0FBRztRQUNqQixXQUFXLEdBQUc7UUFDZCxRQUFRLEdBQUc7UUFDWCxRQUFRLEVBQUUsT0FBTyxVQUFVO1FBQzNCLEdBQUc7T0FDTCxDQUFDO09BQ0QscUJBQXFCLFdBQVc7UUFDOUIsZUFBZTtRQUNmLE1BQU07UUFDTjtRQUNBLFFBQVE7UUFDUixjQUFjLEdBQUc7UUFDakIsV0FBVyxHQUFHO1FBQ2QsUUFBUSxHQUFHO1FBQ1gsWUFBWSxFQUFFLE9BQU8sVUFBVTtRQUMvQixHQUFHO09BQ0wsQ0FBQztPQUNELE9BQU87TUFDVCxTQUFTLE9BQU87T0FDZCxNQUFNLGFBQWEsWUFBWSxJQUFJLElBQUk7T0FDdkMscUJBQXFCLEtBQUs7UUFDeEIsTUFBTTtRQUNOLE9BQU87UUFDUCxjQUFjLEdBQUc7UUFDakIsV0FBVyxHQUFHO1FBQ2QsUUFBUSxHQUFHO1FBQ1gsUUFBUSxFQUFFLE9BQU8sVUFBVTtRQUMzQixHQUFHO09BQ0wsQ0FBQztPQUNELHFCQUFxQixXQUFXO1FBQzlCLGVBQWU7UUFDZixNQUFNO1FBQ047UUFDQSxRQUFRO1FBQ1IsY0FBYyxHQUFHO1FBQ2pCLFdBQVcsR0FBRztRQUNkLFFBQVEsR0FBRztRQUNYLFlBQVksRUFBRSxPQUFPLFVBQVU7UUFDL0IsV0FBVyxpQkFBaUIsUUFBUSxNQUFNLE9BQU8sY0FBYyxLQUFLO1FBQ3BFLEdBQUc7T0FDTCxDQUFDO09BQ0QsTUFBTTtNQUNSO0tBQ0YsQ0FBQyxDQUNIO0lBQ0Y7SUFDQSxRQUFRLE9BQU8sTUFBTTtLQUNuQixHQUFHLFFBQVEsT0FBTyxJQUFJO0lBQ3hCO0lBQ0EsZUFBZTtLQUNiLE9BQU8sR0FBRyxhQUFhO0lBQ3pCO0lBQ0EsS0FBSyxRQUFRO0tBQ1gsR0FBRyxLQUFLLE1BQU07SUFDaEI7SUFDQSxNQUFNLFFBQVE7S0FDWixHQUFHLE1BQU0sTUFBTTtJQUNqQjtJQUNBLFVBQVUsUUFBUTtLQUNoQixHQUFHLFVBQVUsTUFBTTtJQUNyQjtJQUNBLGNBQWM7S0FDWixHQUFHLFlBQVk7SUFDakI7R0FDRjtFQUNGO0VBRUEsMENBQ0UsSUFDQSxZQUNnQztHQUNoQyxPQUFPLEtBQUssZ0NBQWdDLElBQUksVUFBVTtFQUM1RDtFQUVBLE1BQWMsNEJBQ1osS0FDQSxTQUNtQztHQUNuQyxNQUFNLEVBQUUsd0JBQXdCLE1BQU0sT0FBTztHQUM3QyxNQUFNLFVBQVUsb0JBQW9CLEtBQUssS0FBSyxPQUFPLEtBQUs7R0FFMUQsSUFBSTtJQUNGLE1BQU0sRUFBRSxrQkFBa0IsTUFBTSxPQUFPO0lBQ3ZDLE9BQU8saUJBQWlCLGNBQWMsT0FBTyxDQUFDLENBQUMsTUFBTSxRQUFRLFNBQVMsQ0FBQyxDQUFDLENBQUM7R0FDM0UsU0FBUyxHQUFHO0lBQ1YsTUFBTSxFQUFFLGFBQWEsTUFBTSxPQUFPO0lBQ2xDLElBQUksYUFBYSxVQUFVO0tBQ3pCLE1BQU0sRUFBRSxxQkFBcUIsTUFBTSxPQUFPO0tBQzFDLE1BQU0sV0FBVyxpQkFBaUIsQ0FBQyxDQUFDLENBQ2pDLEtBQUssVUFBVSxNQUFNLE9BQU8sQ0FBQyxDQUM3QixLQUFLLEdBQUc7S0FDWCxNQUFNLEVBQUUsd0JBQXdCLE1BQU0sT0FBTztLQUM3QyxNQUFNLElBQUksb0JBQytDLFVBQ3ZELEVBQ0UsVUFBVSxFQUNaLENBQ0Y7SUFDRjtJQUVBLE1BQU07R0FDUjtFQUNGOzs7OztFQU1BLGtCQUEwQixTQUFpQixLQUFhO0dBQ3RELE1BQU0sZUFBZSxRQUFRLE1BQU0sR0FBRyxDQUFDLENBQUMsT0FBTyxPQUFPO0dBQ3RELE1BQU0sV0FBVyxLQUFLLG1CQUFtQixHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE9BQU8sT0FBTztHQUN2RSxNQUFNLFNBQWlDLENBQUM7R0FFeEMsS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLGFBQWEsUUFBUSxLQUN2QyxJQUFJLGFBQWEsRUFBRSxDQUFDLFdBQVcsR0FBRyxHQUNoQyxPQUFPLGFBQWEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLFNBQVM7R0FHaEQsT0FBTztFQUNUO0VBRUEsbUJBQTJCLFNBQWlCLEtBQXNCO0dBQ2hFLE1BQU0sZUFBZSxRQUFRLE1BQU0sR0FBRyxDQUFDLENBQUMsT0FBTyxPQUFPO0dBQ3RELE1BQU0sV0FBVyxLQUFLLG1CQUFtQixHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE9BQU8sT0FBTztHQUV2RSxJQUFJLGFBQWEsV0FBVyxTQUFTLFFBQ25DLE9BQU87R0FHVCxLQUFLLElBQUksSUFBSSxHQUFHLElBQUksYUFBYSxRQUFRLEtBQUs7SUFDNUMsTUFBTSxjQUFjLGFBQWE7SUFDakMsTUFBTSxVQUFVLFNBQVM7SUFDekIsSUFBSSxZQUFZLFdBQVcsR0FBRyxHQUM1QjtJQUVGLElBQUksZ0JBQWdCLFNBQ2xCLE9BQU87R0FFWDtHQUVBLE9BQU87RUFDVDtFQUVBLG1CQUEyQixLQUFxQjtHQUM5QyxPQUFPLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztFQUN4QjtFQUVBLHlCQUFpQyxTQUFpQixXQUFrQztHQUNsRixJQUFJO0lBQ0YsTUFBTSxVQUFVLG1CQUFtQixTQUFTLENBQUMsQ0FBQyxRQUFRLE9BQU8sR0FBRztJQUNoRSxJQUFJLFFBQVEsU0FBUyxJQUFJLEdBQ3ZCLE9BQU87SUFFVCxNQUFNLGVBQWUsUUFBUSxRQUFRLFFBQVEsRUFBRTtJQUMvQyxNQUFNLGVBQWUsS0FBSyxRQUFRLFNBQVMsWUFBWTtJQUN2RCxNQUFNLG1CQUFtQixLQUFLLFNBQVMsU0FBUyxZQUFZO0lBQzVELElBQUksaUJBQWlCLFdBQVcsSUFBSSxLQUFLLEtBQUssV0FBVyxnQkFBZ0IsR0FDdkUsT0FBTztJQUVULE9BQU87R0FDVCxRQUFRO0lBQ04sT0FBTztHQUNUO0VBQ0Y7Ozs7O0VBTUEsbUJBQ0UsS0FDQSxTQUNBLFFBQ0E7R0FFQSxJQUFJLElBQUksUUFBUSxjQUNkLE9BQU8sSUFBSSxRQUFRO0dBSXJCLElBQUksT0FBTyxxQkFBcUI7SUFDOUIsTUFBTSxXQUFnQztLQUNwQyxNQUFNO0tBQ04sS0FBSyxRQUFRO0tBQ2IsTUFBTSxRQUFRLGNBQWMsT0FBTyxRQUFRLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztLQUMxRCxRQUFRLFFBQVE7S0FDaEI7SUFDRjtJQUNBLE1BQU0sU0FBUyxPQUFPLG9CQUFvQixRQUFRO0lBQ2xELElBQUksUUFBUSxPQUFPO0dBQ3JCO0dBRUEsT0FBTztFQUNUOzs7OztFQU1BLE1BQU0sZ0JBQ0osS0FDQSxRQUNBLFFBQ0EsU0FDQSxPQUMwQjtHQUUxQixNQUFNLFVBQVUsTUFBTSxLQUFLLGNBQWMsUUFBUSxTQUFTLEtBQUs7R0FFL0QsT0FBTyxLQUFLLGtCQUFrQixJQUFJLEVBQUUsUUFBUSxHQUFHLFlBQVk7SUFFekQsTUFBTSxFQUFFLGlCQUFpQixNQUFNLE9BQU87SUFDdEMsSUFBSSxjQUFjO0lBQ2xCLE1BQU0sT0FBTyxJQUFJLFdBQVcsS0FBSyxVQUFVO0tBQ3pDLElBQUksYUFBYSxVQUFVLE1BQU0sSUFBSSxHQUNuQyxPQUFPO0tBRVQsT0FBTyxPQUFPO0lBQ2hCLENBQUM7SUFHRCxPQUFPLEtBQUssa0JBQWtCLEtBQUssTUFBTSxLQUFLO0dBQ2hELENBQUM7RUFDSDtFQUVBLE1BQU0sOEJBQThCLFNBQXlCLFFBQTZCO0dBQ3hGLE9BQU8sTUFBTSxLQUFLLG9CQUFvQixTQUFTLE1BQU07RUFDdkQ7RUFHQSxNQUFNLGtCQUNKLEtBQ0EsTUFDQSxPQUNBLFNBQXVCLEtBQUssT0FBTyxRQUNUO0dBQzFCLE1BQU0sUUFBUSxPQUFPLElBQUk7R0FDekIsSUFBSSxVQUFVLFFBQ1osTUFBTSxJQUFJLE1BQU0sb0JBQW9CLElBQUksV0FBVztHQUVyRCxNQUFNLFNBQ0osTUFDcUQsSUFBSTtHQUUzRCxJQUFJLENBQUMsZ0JBQWdCLE1BQU0sR0FDekIsTUFBTSxJQUFJLE1BQU0sMkJBQTJCLElBQUksVUFBVSxHQUFHLElBQUksWUFBWTtHQUU5RSxNQUFNLFNBQVMsTUFBTSxTQUFTLFVBQVUsTUFBTSxLQUFLLFFBQVEsT0FBTyxJQUFJO0dBQ3RFLE9BQU8sS0FBSyxJQUFJLFFBQVEsZUFBZSxrQkFBa0I7R0FFekQsT0FBTztFQUNUO0VBRUEsTUFBTSxjQUNKLFFBQ0EsU0FDQSxPQUNrQjtHQUVsQixNQUFNLEVBQUUscUJBQXFCLE1BQU0sT0FBTztHQUMxQyxNQUFNLGNBQ0osVUFDQSxRQUNBLFlBQ0csaUJBQWlCLFNBQVMsUUFBUSxRQUFRLE9BQU8sRUFBQSxDQUFHLEtBQUssTUFBTSxTQUFTLEtBQUs7R0FHbEYsTUFBTSxTQUNKLEtBQUssYUFBYSxRQUFRLFFBQVEsb0JBQW9CLEtBQUssT0FBTyxLQUFLLGdCQUFnQixLQUN2RixLQUFLLE9BQU8sS0FBSztHQUduQixNQUFNLFVBQVUsZ0NBQWdDLFFBQVEsT0FBTztHQUMvRCxNQUFNLFVBQVcsTUFBTSxLQUFLLFdBQVcsSUFBSSxXQUFXLEVBQUUsUUFBUSxDQUFDLEtBQU07R0FvQnZFLE9BQU8sTUFsQndCLFFBQVEsUUFDckMsT0FBTyxnQkFDTDtJQUNFLFdBQVc7SUFDWDtJQUNBO0lBQ0EsU0FBUyxRQUFRO0lBQ2pCO0lBQ0EsNEJBQVksSUFBSSxJQUFJO0lBQ3BCO0lBRUEsTUFBTSxTQUFTLFFBQVE7SUFDdkIsU0FBUyxTQUFTLFdBQVc7R0FDL0IsR0FDQSxTQUNBLEtBQ0YsQ0FDRjtFQUVGO0VBSUEsTUFBTSx1QkFDSixRQUNBLFNBQ0EsSUFDMkI7R0FDM0IsTUFBTSxTQUNKLEtBQUssYUFBYSxRQUFRLFFBQVEsb0JBQW9CLEtBQUssT0FBTyxLQUFLLGdCQUFnQixLQUN2RixLQUFLLE9BQU8sS0FBSztHQUVuQixNQUFNLFVBQVUsZ0NBQWdDLFFBQVEsT0FBTztHQUMvRCxNQUFNLFVBQVcsTUFBTSxLQUFLLFdBQVcsSUFBSSxXQUFXLEVBQUUsUUFBUSxDQUFDLEtBQU07R0FFdkUsTUFBTSxpQkFBaUI7SUFDckIsV0FBVztJQUNYO0lBQ0EsU0FBUyxRQUFRO0lBQ2pCO0lBQ0EsNEJBQVksSUFBSSxJQUFJO0lBQ3BCO0lBQ0EsTUFBTSxTQUFTLFFBQVE7SUFDdkIsU0FBUyxTQUFTLFdBQVc7R0FDL0I7R0FFQSxJQUFJLE9BQU8sMEJBQ1QsT0FBTyxFQUNMLEdBQUksTUFBTSxRQUFRLFFBQVEsT0FBTyx5QkFBeUIsZ0JBQWdCLE9BQU8sQ0FBQyxFQUNwRjtHQUlGLE1BQU0sWUFBWSx5QkFBeUI7R0FtQjNDLE1BQU0sRUFDSixXQUFXLFlBQ1gsT0FBTyxRQUNQLFdBQVcsWUFDWCxlQUFlLGdCQUNmLGVBQWUsZ0JBQ2YsR0FBRyxTQUNELE1BekIwQixRQUFRLFFBQ3BDLE9BQU8sZ0JBQ0w7SUFDRSxXQUFXO0lBQ1g7SUFDQSxPQUFPO0lBQ1AsU0FBUyxRQUFRO0lBQ2pCLFdBQVc7SUFDWCxZQUFZLGVBQWU7SUFDM0I7SUFDQSxNQUFNLGVBQWU7SUFDckIsU0FBUyxlQUFlO0dBQzFCLEdBQ0EsU0FDQSxTQUNGLENBQ0Y7R0FXQSxPQUFPO0lBQ0wsR0FBRztJQUNILFdBQVc7SUFDWDtJQUNBLFNBQVMsUUFBUTtJQUNqQjtHQUNGO0VBQ0Y7Ozs7O0VBTUEsYUFDRSxnQkFDQSxXQUNvQjtHQUNwQixJQUFJLENBQUMsZ0JBQWdCLE9BQU87R0FRNUIsT0FMYyxlQUFlLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxTQUFTO0lBQ3BELE1BQU0sQ0FBQyxRQUFRLEtBQUssTUFBTSxHQUFHO0lBQzdCLE9BQU8sS0FBSyxLQUFLLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0dBQ2hDLENBRU8sQ0FBQSxDQUFNLE1BQU0sU0FBUyxVQUFVLFNBQVMsSUFBSSxDQUFDO0VBQ3REO0VBRUEsTUFBTSxlQUE4QjtHQUVsQyxNQUFNLEVBQUUsaUJBQWlCLE1BQU0sT0FBTztHQUN0QyxLQUFLLFVBQVUsTUFBTSxjQUFjLGVBQWUsS0FBSyxnQkFBZ0IsVUFBVSxDQUFDO0VBQ3BGOzs7OztFQU1BLE1BQWMsZ0JBQWdCLFlBQWdFO0dBQzVGLE1BQU0sWUFBWSxLQUFLLElBQUk7R0FFM0IsS0FBSyxNQUFNLENBQUMsVUFBVSxVQUFVLFlBQVk7SUFDMUMsTUFBTSxlQUFlLEtBQUssU0FBUyxLQUFLLGFBQWEsUUFBUTtJQUM3RCxRQUFRLElBQUksTUFBTSxLQUFLLFlBQVksTUFBTSxLQUFLLE1BQU0sS0FBSyxZQUFZLEdBQUcsQ0FBQztHQUMzRTtHQUdBLE1BQU0sS0FBSyxPQUFPLFdBQVcsVUFBVTtHQUN2QyxNQUFNLEtBQUssT0FBTyxlQUFlO0dBRWpDLE1BQU0sWUFBWSxLQUFLLElBQUksSUFBSTtHQUMvQixNQUFNLE1BQU0sYUFBYSxNQUFNLEtBQUssTUFBTSxHQUFHLFVBQVUsR0FBRztHQUMxRCxRQUFRLElBQUksTUFBTSxNQUFNLFFBQVEsV0FBVyxHQUFHLENBQUMsQ0FBQztFQUNsRDtFQUtBLE1BQU0sVUFBVSxJQUF5QjtHQUN2QyxNQUFNLEtBQUssS0FBSyxNQUFNLE9BQU8sUUFBVyxLQUFLO0dBQzdDLElBQUk7SUFDRixNQUFNLEdBQUc7R0FDWCxVQUFVO0lBQ1IsTUFBTSxLQUFLLFFBQVE7R0FDckI7RUFDRjtFQUVBLE1BQWMsZ0JBQWdCLFFBQXlCLFNBQXlDO0dBQzlGLElBQUksQ0FBQyxTQUNIO0dBS0YsSUFBSSxRQUFRLFVBQVU7SUFDcEIsTUFBTSxrQkFBa0IsTUFBTSxPQUFPLHFCQUFBLENBQXNCO0lBQzNELE1BQU0saUJBQWlCO0tBQ3JCLFdBQVc7S0FDWCxXQUFrRTtNQUNoRTtNQUNBO01BQ0E7S0FDRjtJQUNGO0lBRUEsSUFBSSxRQUFRLGFBQWEsTUFDdkIsTUFBTSxPQUFPLFNBQVMsZ0JBQWdCLGNBQWM7U0FFcEQsTUFBTSxPQUFPLFNBQVMsZ0JBQWdCO0tBQ3BDLEdBQUc7S0FDSCxHQUFHLFFBQVE7SUFDYixDQUFDO0dBRUw7R0FFQSxNQUFNLGlCQUFpQjtJQUNyQixNQUFNO0lBQ04sVUFBVTtJQUNWLFdBQVc7SUFDWCxJQUFJO0lBQ0osS0FBSztJQUNMLFFBQVE7R0FDVjtHQUVBLE1BQU0saUJBQWlCLE9BQ3JCLEtBQ0EsZUFDRztJQUNILE1BQU0sU0FBUyxRQUFRO0lBQ3ZCLElBQUksQ0FBQyxRQUFRO0lBRWIsSUFBSSxXQUFXLE1BQ2IsTUFBTSxPQUFPLFVBQVUsTUFBTSxPQUFPLFlBQUEsQ0FBYSxPQUFPO1NBRXhELE1BQU0sT0FBTyxVQUFVLE1BQU0sT0FBTyxZQUFBLENBQWEsU0FBUyxNQUFNO0dBRXBFO0dBRUEsS0FBSyxNQUFNLENBQUMsS0FBSyxlQUFlLE9BQU8sUUFBUSxjQUFjLEdBQzNELE1BQU0sZUFDbUQsS0FDdkQsVUFDRjtHQUdGLElBQUksUUFBUSxJQUNWLE1BQU0sS0FBSyxzQkFBc0IsTUFBTTtHQUd6QyxJQUFJLFFBQVEsUUFDVixRQUFRLE9BQU8sTUFBTTtFQUV6QjtFQUdBLE1BQWMsc0JBQ1osUUFDZTtHQUNmLElBQUksS0FBSyx1QkFBdUIsSUFBSSxNQUFNLEdBQ3hDO0dBR0YsTUFBTSxlQUFlLEtBQUssT0FBTyxPQUFPLFNBQVM7R0FDakQsSUFBSSxDQUFDLGNBQ0g7R0FHRixNQUFNLG1CQUFtQixNQUFNLE9BQU8sc0JBQUEsQ0FBdUI7R0FDN0QsTUFBTSx3QkFBd0IsOEJBQThCLEVBQzFELGlCQUFpQixhQUNuQixDQUFDO0dBQ0QsSUFBSSx1QkFDRixNQUFNLE9BQU8sU0FBUyxpQkFBaUIscUJBQXFCO1FBRTVELE1BQU0sT0FBTyxTQUFTLGVBQWU7R0FHdkMsS0FBSyx1QkFBdUIsSUFBSSxNQUFNO0dBQ3RDLEtBQUsseUNBQXlDLE1BQU07RUFDdEQ7RUFHQSx5Q0FDRSxRQUNNO0dBQ04sTUFBTSxhQUFhLEtBQUssT0FBTyxLQUM1QixLQUFLLFFBQVEsSUFBSSxrQkFBa0IsYUFBYSxHQUFLLENBQUMsQ0FDdEQsUUFBUSxjQUFjLFlBQVksQ0FBQztHQUV0QyxJQUFJLFdBQVcsV0FBVyxHQUN4QjtHQUdGLE1BQU0sbUJBQW1CLEtBQUssT0FBTyxPQUFPLFNBQVM7R0FDckQsSUFBSSxDQUFDLG9CQUFvQixvQkFBb0IsR0FDM0M7R0FHRixNQUFNLG1CQUFtQixLQUFLLElBQUksR0FBRyxVQUFVO0dBQy9DLElBQUksb0JBQW9CLGtCQUN0QixPQUFPLElBQUksS0FDVDtJQUNFO0lBQ0E7R0FDRixHQUNBLHVJQUNGO0VBRUo7Ozs7O0VBTUEsTUFBYyxtQkFDWixRQUNBLFNBQ0E7R0FDQSxJQUFJLENBQUMsU0FBUztHQUVkLE1BQU0sV0FBVyxRQUFRLFlBQVk7R0FHckMsT0FBTyxNQUFNO0lBQ1gsUUFBUSxDQUFDLE9BQU8sTUFBTTtJQUN0QixLQUFLLEdBQUcsU0FBUztJQUNqQixTQUFTLE9BQU8sU0FBUyxVQUFVO0tBQ2pDLE1BQU0sV0FBVyxNQUFNLEtBQUssS0FBSyxRQUMvQix3QkFBd0IsU0FBUyxRQUFRLFVBQVUsV0FBVyxnQkFBZ0IsQ0FDaEY7S0FFQSxNQUFNLE9BQU8sU0FBUyxNQUFNO0tBQzVCLFNBQVMsUUFBUSxTQUFTLE9BQWUsUUFBZ0I7TUFDdkQsTUFBTSxPQUFPLEtBQUssS0FBSztLQUN6QixDQUFDO0tBQ0QsT0FBTyxNQUFNLEtBQUssU0FBUyxPQUFPLE1BQU0sU0FBUyxLQUFLLElBQUksSUFBSTtJQUNoRTtHQUNGLENBQUM7RUFDSDtFQUVBLE1BQWMsc0JBQXNCO0dBQ2xDLE1BQU0sZUFBZSxxQkFBcUI7R0FFMUMsZ0JBQWdCLGdCQUFnQixXQUFXLEtBQUssYUFBYSxHQUFHO0dBR2hFLGtCQUFrQixJQUFJO0dBQ3RCLE1BQU0sRUFBRSxZQUFZLE1BQU0sT0FBTztHQUNqQyxNQUFNLGNBQ21ELE9BQU8sS0FDNUQsS0FBSyxRQUNQO0dBQ0YsTUFBTSxTQUFTLEtBQUssSUFBSSxHQUFHLFlBQVksS0FBSyxNQUFNLEVBQUUsTUFBTSxDQUFDO0dBQzNELEtBQUssTUFBTSxRQUFRLGFBQWE7SUFDOUIsTUFBTSxPQUNtRCxLQUNwRCxTQUFTLEtBQUssQ0FBQztJQUdwQixNQUFNLE9BQU8sTUFBTSxRQUFRO0lBQzNCLE1BQU0sT0FBTyxLQUFLLEtBQUssR0FBRyxNQUFNLFFBQVEsS0FBSyxHQUFHLE1BQU0sWUFBWTtJQUNsRSxNQUFNLFNBQVMsS0FBSyxPQUFPLE1BQU07SUFDakMsTUFBTSxZQUFZLFFBQVEsS0FBSyxDQUFDLFlBQVksSUFBSSxJQUFJLE1BQU0sT0FBTyxnQkFBZ0IsSUFBSTtJQUVyRixJQUFJLFNBQVMsY0FDWCxRQUFRLElBQUksTUFBTSxNQUFNLFlBQVksT0FBTyxHQUFHLE1BQU0sSUFBSSxTQUFTO1NBRWpFLFFBQVEsSUFBSSxNQUFNLElBQUksT0FBTyxPQUFPLEdBQUcsTUFBTSxJQUFJLFNBQVM7R0FFOUQ7R0FFQSxJQUFJLEtBQUssT0FBTyxPQUFPLE1BRXJCLGdCQUFnQix3QkFEQyxLQUFLLE9BQU8sT0FBTyxLQUFLLFlBQVksWUFDSixHQUFHO0dBRXRELElBQUksS0FBSyxPQUFPLElBQUksVUFDbEIsZ0JBQWdCLGFBQWEsS0FBSyxPQUFPLElBQUksVUFBVTtHQUV6RCxrQkFBa0IsZUFBZSxXQUFXLEtBQUssV0FBVyxHQUFHO0VBQ2pFO0VBRUEsTUFBYyxnQkFBZ0IsUUFBaUMsWUFBcUI7R0FDbEYsTUFBTSxFQUFFLHVCQUF1QixNQUFNLE9BQU87R0FHNUMsSUFBSSxZQUFZO0lBQ2QsTUFBTSxFQUFFLDJCQUEyQixNQUFNLE9BQU87SUFDaEQsS0FBSyxhQUFhLHVCQUF1QjtJQUN6QyxtQkFBbUIsS0FBSyxVQUFVO0lBQ2xDO0dBQ0Y7R0FHQSxJQUFJLENBQUMsUUFBUTtJQUNYLG1CQUFtQixJQUFJO0lBQ3ZCO0dBQ0Y7R0FHQSxNQUFNLEVBQUUsdUJBQXVCLE1BQU0sT0FBTztHQUM1QyxLQUFLLGFBQWEsbUJBQW1CLE1BQU07R0FDM0MsbUJBQW1CLEtBQUssVUFBVTtFQUNwQztFQUVBLE1BQWMsb0JBQW9CLFNBQXdDO0dBQ3hFLE1BQU0sRUFBRSxvQkFBb0IsTUFBTSxPQUFPO0dBRXpDLEtBQUssaUJBQWlCLElBQUksZ0JBQWdCLEdBQUcsWUFBWSxHQUFHLENBQUM7R0FDN0QsSUFBSSxDQUFDLFNBQ0g7R0FHRixNQUFNLGVBQWUsUUFBUSxnQkFBZ0IsZUFBZTtHQUM1RCxNQUFNLHVCQUF1QjtJQUMzQixhQUFhLEdBQUcsS0FBSyxDQUFDLENBQUMsU0FBUztJQUNoQyxXQUFXO0lBQ1gsYUFBYTtHQUNmO0dBRUEsSUFBSSxjQUNGLEtBQUssVUFBVSxZQUFZO0lBQ3pCLEdBQUc7SUFDSCxHQUFHLFFBQVE7R0FDYixDQUFDO0VBRUw7RUFFQSxNQUFjLEtBQUssUUFBeUIsU0FBOEI7R0FDeEUsTUFBTSxPQUFPLFFBQVEsUUFBUSxRQUFRO0dBQ3JDLE1BQU0sT0FBTyxRQUFRLFFBQVEsUUFBUTtHQUVyQyxPQUFPLFFBQVEsV0FBVyxZQUFZO0lBQ3BDLE1BQU0sUUFBUSxXQUFXLGFBQWEsTUFBTTtJQUM1QyxNQUFNLEtBQUssVUFBVSxRQUFRO0lBQzdCLE1BQU0sS0FBSyxRQUFRO0dBQ3JCLENBQUM7R0FFRCxNQUFNLFdBQVcsWUFBWTtJQUMzQixJQUFJO0tBQ0YsTUFBTSxPQUFPLE1BQU07S0FDbkIsUUFBUSxLQUFLLENBQUM7SUFDaEIsU0FBUyxLQUFLO0tBQ1osUUFBUSxNQUFNLDBCQUEwQixHQUFHO0tBQzNDLFFBQVEsS0FBSyxDQUFDO0lBQ2hCO0dBQ0Y7R0FFQSxRQUFRLEdBQUcsVUFBVSxRQUFRO0dBQzdCLFFBQVEsR0FBRyxXQUFXLFFBQVE7R0FFOUIsSUFBSSxRQUFRLFdBQVcsU0FDckIsT0FBTyxnQkFBZ0IsUUFBUSxXQUFXLE9BQU87R0FHbkQsT0FDRyxPQUFPO0lBQUU7SUFBTTtHQUFLLENBQUMsQ0FBQyxDQUN0QixLQUFLLFlBQVk7SUFDaEIsTUFBTSxLQUFLLFVBQVUsWUFBWTtJQUNqQyxNQUFNLFFBQVEsV0FBVyxVQUFVLE1BQU07R0FDM0MsQ0FBQyxDQUFDLENBQ0QsTUFBTSxPQUFPLFFBQVE7SUFDcEIsUUFBUSxNQUFNLE1BQU0sSUFBSSwyQkFBMkIsR0FBRyxDQUFDO0lBQ3ZELE1BQU0sU0FBUztHQUNqQixDQUFDO0VBQ0w7RUFFQSxNQUFNLFVBQXlCO0dBQzdCLE1BQU0sRUFBRSxvQ0FBb0MsTUFBTSxPQUFPO0dBQ3pELE1BQU0sRUFBRSxjQUFjLE1BQU0sT0FBTztHQUVuQyxNQUFNLFVBQVUsUUFBUTtHQUV4QixJQUFJLEtBQUssdUJBQ1AsTUFBTSxLQUFLLHNCQUFzQixTQUFTO0dBRTVDLEtBQUssd0JBQXdCO0dBRTdCLE1BQU0sUUFBUSxXQUFXO0lBQ3ZCLEtBQUssZ0JBQWdCLFFBQVEsS0FBSyxRQUFRLFFBQVE7SUFDbEQsS0FBSyxZQUFZLFdBQVcsS0FBSyxRQUFRLFFBQVE7SUFDakQsS0FBSyx1QkFBdUIsU0FBUyxLQUFLLFFBQVEsUUFBUTtJQUMxRCxLQUFLLFNBQVMsTUFBTSxLQUFLLFFBQVEsUUFBUTtHQUMzQyxDQUFDO0dBRUQsSUFBSSxDQUFDLGdDQUFnQyxHQUFHLE1BQU1DLFFBQWU7RUFDL0Q7Q0FDRjtDQWtCYSxTQUFTLElBQUksWUFBWTtDQWlCaEMsOEJBQWMsSUFBSSxJQUFJO0VBQUM7RUFBYTtFQUFhO0VBQVc7Q0FBSyxDQUFDIn0=
|
|
1417
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmpzIiwibmFtZXMiOlsibWltZUxvb2t1cCIsImxvZ3RhcGVEaXNwb3NlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zb25hbXUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiYXN5bmNfaG9va3NcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IHR5cGUgSW5jb21pbmdNZXNzYWdlLCB0eXBlIFNlcnZlciwgdHlwZSBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gXCJodHRwXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgXCJAZmFzdGlmeS93ZWJzb2NrZXRcIjtcbmltcG9ydCB7IGRpc3Bvc2UgYXMgbG9ndGFwZURpc3Bvc2UgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgdHlwZSBBdXRoLCB0eXBlIEJldHRlckF1dGhPcHRpb25zIH0gZnJvbSBcImJldHRlci1hdXRoXCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyB0eXBlIEZTV2F0Y2hlciB9IGZyb20gXCJjaG9raWRhclwiO1xuaW1wb3J0IHtcbiAgdHlwZSBGYXN0aWZ5QmFzZUxvZ2dlcixcbiAgdHlwZSBGYXN0aWZ5SW5zdGFuY2UsXG4gIHR5cGUgRmFzdGlmeVJlcGx5LFxuICB0eXBlIEZhc3RpZnlSZXF1ZXN0LFxufSBmcm9tIFwiZmFzdGlmeVwiO1xuaW1wb3J0IG1pbWUsIHsgbG9va3VwIGFzIG1pbWVMb29rdXAgfSBmcm9tIFwibWltZS10eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBXZWJTb2NrZXQgfSBmcm9tIFwid3NcIjtcbmltcG9ydCB7IHR5cGUgWm9kT2JqZWN0IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBCQVNFX0ZJRUxEX01BUFBJTkdTIH0gZnJvbSBcIi4uL2F1dGgvYmV0dGVyLWF1dGgtZW50aXRpZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUJldHRlckF1dGhSZXF1ZXN0IH0gZnJvbSBcIi4uL2F1dGgvYmV0dGVyLWF1dGgtcmVxdWVzdFwiO1xuaW1wb3J0IHsgYXBwbHlDYWNoZUhlYWRlcnMsIENhY2hlUHJlc2V0cyB9IGZyb20gXCIuLi9jYWNoZS1jb250cm9sL2NhY2hlLWNvbnRyb2xcIjtcbmltcG9ydCB7IHR5cGUgQ2FjaGVDb250cm9sQ29uZmlnLCB0eXBlIENhY2hlQ29udHJvbFJlcXVlc3QgfSBmcm9tIFwiLi4vY2FjaGUtY29udHJvbC90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBDYWNoZUNvbmZpZywgdHlwZSBDYWNoZU1hbmFnZXIgfSBmcm9tIFwiLi4vY2FjaGUvdHlwZXNcIjtcbmltcG9ydCB7IHRvRmFzdGlmeUNvbXByZXNzT3B0aW9uIH0gZnJvbSBcIi4uL2NvbXByZXNzL2NvbXByZXNzXCI7XG5pbXBvcnQgeyB0eXBlIENvbXByZXNzT3B0aW9ucyB9IGZyb20gXCIuLi9jb21wcmVzcy90eXBlc1wiO1xuaW1wb3J0IHsgREIgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IHR5cGUgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IFNELCBzZXRTRENvbmZpZyB9IGZyb20gXCIuLi9kaWN0L3NkXCI7XG5pbXBvcnQgeyB0eXBlIExvY2FsaXplZFN0cmluZyB9IGZyb20gXCIuLi9kaWN0L3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRTb25hbXVFbnZpcm9ubWVudCwgcmVhZEFsbEVudmlyb25tZW50U25hcHNob3RzIH0gZnJvbSBcIi4uL2VudlwiO1xuaW1wb3J0IHsgTm90Rm91bmRFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQgeyBydW50aW1lVHlwZU9mIH0gZnJvbSBcIi4uL3J1bnRpbWUtdHlwZVwiO1xuaW1wb3J0IHsgQnVmZmVyZWRGaWxlIH0gZnJvbSBcIi4uL3N0b3JhZ2UvYnVmZmVyZWQtZmlsZVwiO1xuaW1wb3J0IHsgdHlwZSBTdG9yYWdlTWFuYWdlciB9IGZyb20gXCIuLi9zdG9yYWdlL3N0b3JhZ2UtbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBLZXlHZW5lcmF0b3IgfSBmcm9tIFwiLi4vc3RvcmFnZS90eXBlc1wiO1xuaW1wb3J0IHsgVXBsb2FkZWRGaWxlIH0gZnJvbSBcIi4uL3N0b3JhZ2UvdXBsb2FkZWQtZmlsZVwiO1xuaW1wb3J0IHsgY3JlYXRlTW9ja1NTRUZhY3RvcnkgfSBmcm9tIFwiLi4vc3RyZWFtL3NzZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBBbnlXZWJTb2NrZXRDb25uZWN0aW9uLFxuICBXZWJTb2NrZXRSdW50aW1lLFxuICB0eXBlIFdlYlNvY2tldENvbm5lY3Rpb24sXG59IGZyb20gXCIuLi9zdHJlYW0vd3NcIjtcbmltcG9ydCB7XG4gIHR5cGUgVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyLFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0LFxufSBmcm9tIFwiLi4vc3RyZWFtL3dzLXRlbGVtZXRyeVwiO1xuaW1wb3J0IHsgdHlwZSBMb2FkZWRNb2RlbHMgfSBmcm9tIFwiLi4vc3luY2VyL21vZHVsZS1sb2FkZXJcIjtcbmltcG9ydCB7IHR5cGUgU3luY2VyIH0gZnJvbSBcIi4uL3N5bmNlci9zeW5jZXJcIjtcbmltcG9ydCB7IHR5cGUgV29ya2Zsb3dNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rhc2tzL3dvcmtmbG93LW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgRGV2Vml0ZXN0TWFuYWdlciB9IGZyb20gXCIuLi90ZXN0aW5nL2Rldi12aXRlc3QtbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBTb25hbXVGYXN0aWZ5Q29uZmlnIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBjZW50ZXJUZXh0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnNvbGUtdXRpbFwiO1xuaW1wb3J0IHsgaXNEYWVtb25TZXJ2ZXIgfSBmcm9tIFwiLi4vdXRpbHMvY29udHJvbGxlclwiO1xuaW1wb3J0IHsgZXhpc3RzLCBmaWxlRXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQge1xuICBpc0JpZ0ludFZhbHVlLFxuICBpc0Z1bmN0aW9uVmFsdWUsXG4gIGlzTnVtYmVyVmFsdWUsXG4gIGlzT2JqZWN0VmFsdWUsXG4gIGlzU3RyaW5nVmFsdWUsXG4gIGlzU3ltYm9sVmFsdWUsXG59IGZyb20gXCIuLi91dGlscy9ydW50aW1lLXZhbHVlXCI7XG5pbXBvcnQgeyBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkLCBtZXJnZSB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplWm9kQ29tcGlsZXJQb2xpY3ksXG4gIHR5cGUgU29uYW11Q29uZmlnLFxuICB0eXBlIFNvbmFtdVNlcnZlck9wdGlvbnMsXG4gIHR5cGUgU29uYW11VGFza09wdGlvbnMsXG59IGZyb20gXCIuL2NvbmZpZ1wiO1xuaW1wb3J0IHsgdHlwZSBDb250ZXh0LCB0eXBlIFJ1bnRpbWVDb250ZXh0LCB0eXBlIFdlYlNvY2tldENvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG5pbXBvcnQgeyB0eXBlIEV4dGVuZGVkQXBpIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtcbiAgYXNzZXJ0SHR0cFZhbGlkYXRvclJlZ2lzdHJ5LFxuICBjcmVhdGVIdHRwVmFsaWRhdG9yLFxuICBnZXRIdHRwVmFsaWRhdG9yUm91dGVLZXksXG4gIHR5cGUgSHR0cFZhbGlkYXRvcixcbiAgdHlwZSBIdHRwVmFsaWRhdG9yUmVnaXN0cnksXG59IGZyb20gXCIuL2h0dHAtdmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBnZXRTZWNyZXRzIH0gZnJvbSBcIi4vc2VjcmV0XCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdVNlY3JldHMgfSBmcm9tIFwiLi9zZWNyZXRcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZVdlYlNvY2tldFJlcGx5U3R1YixcbiAgcmVzb2x2ZVdlYlNvY2tldENsb3NlRGVzY3JpcHRvcixcbiAgcmVzb2x2ZVdlYlNvY2tldFBsdWdpbk9wdGlvbnMsXG4gIHJlc29sdmVJbnRlZ3JhdGVkVml0ZUhtck9wdGlvbnMsXG59IGZyb20gXCIuL3dlYnNvY2tldC1oZWxwZXJzXCI7XG5cbmV4cG9ydCB7XG4gIGNyZWF0ZVdlYlNvY2tldFJlcGx5U3R1YixcbiAgcmVzb2x2ZVdlYlNvY2tldENsb3NlRGVzY3JpcHRvcixcbiAgcmVzb2x2ZVdlYlNvY2tldFBsdWdpbk9wdGlvbnMsXG59IGZyb20gXCIuL3dlYnNvY2tldC1oZWxwZXJzXCI7XG5cbmludGVyZmFjZSBVcGxvYWRlZFJlcXVlc3RGaWxlcyB7XG4gIGJ1ZmZlcmVkRmlsZXM6IEJ1ZmZlcmVkRmlsZVtdO1xuICB1cGxvYWRlZEZpbGVzOiBVcGxvYWRlZEZpbGVbXTtcbn1cblxudHlwZSBBcGlBcmd1bWVudCA9XG4gIHwgc3RyaW5nXG4gIHwgbnVtYmVyXG4gIHwgYm9vbGVhblxuICB8IGJpZ2ludFxuICB8IHN5bWJvbFxuICB8IENhbGxhYmxlRnVuY3Rpb25cbiAgfCBvYmplY3RcbiAgfCBudWxsXG4gIHwgdW5kZWZpbmVkO1xudHlwZSBBcGlNZXRob2RSZXN1bHQgPSBBcGlBcmd1bWVudCB8IHZvaWQ7XG5cbmZ1bmN0aW9uIHRvQXBpQXJndW1lbnQ8VmFsdWU+KHZhbHVlOiBWYWx1ZSk6IEFwaUFyZ3VtZW50IHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh2YWx1ZSA9PT0gdHJ1ZSkgcmV0dXJuIHRydWU7XG4gIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgaWYgKGlzU3RyaW5nVmFsdWUodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIGlmIChpc051bWJlclZhbHVlKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICBpZiAoaXNCaWdJbnRWYWx1ZSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgaWYgKGlzU3ltYm9sVmFsdWUodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIGlmIChpc0Z1bmN0aW9uVmFsdWUodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIGlmIChpc09iamVjdFZhbHVlKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXCLsp4Dsm5DtlZjsp4Ag7JWK64qUIEFQSSDsnbjsiJgg7YOA7J6F7J6F64uI64ukLlwiKTtcbn1cblxuZnVuY3Rpb24gdG9BcGlBcmd1bWVudE1hcDxWYWx1ZSBleHRlbmRzIG9iamVjdD4odmFsdWU6IFZhbHVlKTogTWFwPHN0cmluZywgQXBpQXJndW1lbnQ+IHtcbiAgcmV0dXJuIG5ldyBNYXAoT2JqZWN0LmVudHJpZXModmFsdWUpLm1hcCgoW2tleSwgaXRlbV0pID0+IFtrZXksIHRvQXBpQXJndW1lbnQoaXRlbSldKSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVVuYXZhaWxhYmxlU1NFPFQgZXh0ZW5kcyBab2RPYmplY3Q+KF9ldmVudHM6IFQpOiBuZXZlciB7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBcImNyZWF0ZVNTRSBpcyBub3QgYXZhaWxhYmxlIGluIHdlYnNvY2tldCBjb250ZXh0LiBEZWZpbmUgd2Vic29ja2V0Q29udGV4dFByb3ZpZGVyIGlmIHlvdXIgY29udGV4dCBzZXR1cCBkZXBlbmRzIG9uIFNTRSBoZWxwZXJzLlwiLFxuICApO1xufVxuXG5mdW5jdGlvbiBwcmludERpbVN1bW1hcnkobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmRpbShg4pyTICR7bWVzc2FnZX1gKSk7XG59XG5cbmZ1bmN0aW9uIHByaW50R3JlZW5TdW1tYXJ5KG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTICR7bWVzc2FnZX1gKSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU29uYW11VGVzdGluZ1NuYXBzaG90IHtcbiAgYXBpUm9vdFBhdGg6IEFic29sdXRlUGF0aCB8IG51bGw7XG4gIGNvbmZpZzogU29uYW11Q29uZmlnIHwgbnVsbDtcbiAgc3luY2VyOiBTeW5jZXIgfCBudWxsO1xuICBodHRwVmFsaWRhdG9yczogV2Vha01hcDxFeHRlbmRlZEFwaSwgSHR0cFZhbGlkYXRvcj47XG4gIHBlbmRpbmdIdHRwVmFsaWRhdG9yczogV2Vha01hcDxFeHRlbmRlZEFwaSwgUHJvbWlzZTxIdHRwVmFsaWRhdG9yPj47XG4gIGFvdEh0dHBWYWxpZGF0b3JSZWdpc3RyeTogSHR0cFZhbGlkYXRvclJlZ2lzdHJ5IHwgdW5kZWZpbmVkO1xuICBwcmVwYXJlZEFwaXM6IHJlYWRvbmx5IEV4dGVuZGVkQXBpW107XG4gIHByZXBhcmVkTW9kZWxzOiBMb2FkZWRNb2RlbHM7XG4gIHdlYnNvY2tldFJ1bnRpbWU6IFdlYlNvY2tldFJ1bnRpbWUgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvbmFtdUh0dHBWYWxpZGF0b3JEZXBlbmRlbmNpZXMge1xuICBjcmVhdGVWYWxpZGF0b3I6IHR5cGVvZiBjcmVhdGVIdHRwVmFsaWRhdG9yO1xuICBhc3NlcnRSZWdpc3RyeTogdHlwZW9mIGFzc2VydEh0dHBWYWxpZGF0b3JSZWdpc3RyeTtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRTb25hbXVIdHRwVmFsaWRhdG9yRGVwZW5kZW5jaWVzOiBTb25hbXVIdHRwVmFsaWRhdG9yRGVwZW5kZW5jaWVzID0ge1xuICBjcmVhdGVWYWxpZGF0b3I6IGNyZWF0ZUh0dHBWYWxpZGF0b3IsXG4gIGFzc2VydFJlZ2lzdHJ5OiBhc3NlcnRIdHRwVmFsaWRhdG9yUmVnaXN0cnksXG59O1xuXG5jbGFzcyBTb25hbXVDbGFzcyB7XG4gIHB1YmxpYyBpc0luaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBmb3JUZXN0aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBhc3luY0xvY2FsU3RvcmFnZTogQXN5bmNMb2NhbFN0b3JhZ2U8e1xuICAgIGNvbnRleHQ6IFJ1bnRpbWVDb250ZXh0O1xuICB9PiA9IG5ldyBBc3luY0xvY2FsU3RvcmFnZSgpO1xuICBwcml2YXRlIGh0dHBWYWxpZGF0b3JzOiBXZWFrTWFwPEV4dGVuZGVkQXBpLCBIdHRwVmFsaWRhdG9yPiA9IG5ldyBXZWFrTWFwKCk7XG4gIHByaXZhdGUgcGVuZGluZ0h0dHBWYWxpZGF0b3JzOiBXZWFrTWFwPEV4dGVuZGVkQXBpLCBQcm9taXNlPEh0dHBWYWxpZGF0b3I+PiA9IG5ldyBXZWFrTWFwKCk7XG4gIHByaXZhdGUgYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5OiBIdHRwVmFsaWRhdG9yUmVnaXN0cnkgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcHJlcGFyZWRBcGlzOiByZWFkb25seSBFeHRlbmRlZEFwaVtdID0gW107XG4gIHByaXZhdGUgcHJlcGFyZWRNb2RlbHM6IExvYWRlZE1vZGVscyA9IHt9O1xuXG4gIHB1YmxpYyBnZXRDb250ZXh0PFQgZXh0ZW5kcyBSdW50aW1lQ29udGV4dCA9IENvbnRleHQ+KCk6IFQge1xuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5nZXRTdG9yZSgpO1xuICAgIGlmIChzdG9yZT8uY29udGV4dCkge1xuICAgICAgcmV0dXJuIC8qIFNBRkVUWTogQVBJIOuNsOy9lOugiOydtO2EsOyZgCBab2Qg6rKA7Kad6riwIOuTseuhnSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBzdG9yZS5jb250ZXh0IGFzIFQ7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIikge1xuICAgICAgLy8g7YWM7Iqk7YyFIO2ZmOqyveyXkOyEnCDsu6jthY3siqTtirjqsIAg7KO87J6F65CY7KeAIOyViuydgCDqsr3smrAg67mIIOy7qO2FjeyKpO2KuCDrpqzthLRcbiAgICAgIGNvbnN0IG1vY2tDb250ZXh0ID0ge1xuICAgICAgICB0cmFuc3BvcnQ6IFwiaHR0cFwiLFxuICAgICAgICByZXF1ZXN0OiBudWxsLFxuICAgICAgICByZXBseTogbnVsbCxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIGNyZWF0ZVNTRTogKHNjaGVtYTogWm9kT2JqZWN0KSA9PiBjcmVhdGVNb2NrU1NFRmFjdG9yeShzY2hlbWEpLFxuICAgICAgICBsb2NhbGU6IFwiXCIsXG4gICAgICAgIHVzZXI6IG51bGwsXG4gICAgICAgIHNlc3Npb246IG51bGwsXG4gICAgICAgIG5haXRlU3RvcmU6IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCksXG4gICAgICB9O1xuICAgICAgLy8gU0FGRVRZOiDthYzsiqTtirgg6riw67O4IOy7qO2FjeyKpO2KuOuKlCBIVFRQIENvbnRleHTsnbTrqbAg6riw67O4IOygnOuEpOumreqzvCDsnbzsuZjtlZzri6QuXG4gICAgICByZXR1cm4gLyogU0FGRVRZOiDthYzsiqTtirgg6riw67O4IOy7qO2FjeyKpO2KuOuKlCDsmpTssq0g67KU7JyE6rCAIOyXhuuKlCBIVFRQIOy7qO2FjeyKpO2KuCDrjIDssrTqsJLsnoXri4jri6QuICovIG1vY2tDb250ZXh0IGFzIFQgJlxuICAgICAgICB0eXBlb2YgbW9ja0NvbnRleHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBjYW5ub3QgZmluZCBjb250ZXh0XCIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBpUm9vdFBhdGhWYWx1ZTogQWJzb2x1dGVQYXRoIHwgbnVsbCA9IG51bGw7XG4gIHNldCBhcGlSb290UGF0aChhcGlSb290UGF0aDogQWJzb2x1dGVQYXRoKSB7XG4gICAgdGhpcy5hcGlSb290UGF0aFZhbHVlID0gYXBpUm9vdFBhdGg7XG4gIH1cbiAgZ2V0IGFwaVJvb3RQYXRoKCk6IEFic29sdXRlUGF0aCB7XG4gICAgaWYgKHRoaXMuYXBpUm9vdFBhdGhWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYXBpUm9vdFBhdGhWYWx1ZTtcbiAgfVxuICBnZXQgYXBwUm9vdFBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hcGlSb290UGF0aC5zcGxpdChwYXRoLnNlcCkuc2xpY2UoMCwgLTEpLmpvaW4ocGF0aC5zZXApO1xuICB9XG5cbiAgcHJpdmF0ZSBkYkNvbmZpZ1ZhbHVlOiBTb25hbXVEQkNvbmZpZyB8IG51bGwgPSBudWxsO1xuICBzZXQgZGJDb25maWcoZGJDb25maWc6IFNvbmFtdURCQ29uZmlnKSB7XG4gICAgdGhpcy5kYkNvbmZpZ1ZhbHVlID0gZGJDb25maWc7XG4gIH1cbiAgZ2V0IGRiQ29uZmlnKCk6IFNvbmFtdURCQ29uZmlnIHtcbiAgICBpZiAodGhpcy5kYkNvbmZpZ1ZhbHVlID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kYkNvbmZpZ1ZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jZXJWYWx1ZTogU3luY2VyIHwgbnVsbCA9IG51bGw7XG4gIHNldCBzeW5jZXIoc3luY2VyOiBTeW5jZXIpIHtcbiAgICB0aGlzLnN5bmNlclZhbHVlID0gc3luY2VyO1xuICB9XG4gIGdldCBzeW5jZXIoKTogU3luY2VyIHtcbiAgICBpZiAodGhpcy5zeW5jZXJWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3luY2VyVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGNvbmZpZ1ZhbHVlOiBTb25hbXVDb25maWcgfCBudWxsID0gbnVsbDtcbiAgc2V0IGNvbmZpZyhjb25maWc6IFNvbmFtdUNvbmZpZykge1xuICAgIHRoaXMuY29uZmlnVmFsdWUgPSBjb25maWc7XG4gIH1cbiAgZ2V0IGNvbmZpZygpOiBTb25hbXVDb25maWcge1xuICAgIGlmICh0aGlzLmNvbmZpZ1ZhbHVlID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb25maWdWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBzZWNyZXRzOiBTb25hbXVTZWNyZXRzID0gZ2V0U2VjcmV0cygpO1xuXG4gIHByaXZhdGUgc3RvcmFnZVZhbHVlOiBTdG9yYWdlTWFuYWdlciB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogU3RvcmFnZU1hbmFnZXIg7J247Iqk7YS07IqkXG4gICAqL1xuICBnZXQgc3RvcmFnZSgpOiBTdG9yYWdlTWFuYWdlciB7XG4gICAgaWYgKCF0aGlzLnN0b3JhZ2VWYWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3RvcmFnZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuIENoZWNrIHN0b3JhZ2UgY29uZmlnLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZVZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWNoZVZhbHVlOiBDYWNoZU1hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIENhY2hlTWFuYWdlciDsnbjsiqTthLTsiqQgKEJlbnRvQ2FjaGUpXG4gICAqL1xuICBnZXQgY2FjaGUoKTogQ2FjaGVNYW5hZ2VyIHtcbiAgICBpZiAoIXRoaXMuY2FjaGVWYWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FjaGUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiBDaGVjayBjYWNoZSBjb25maWcgaW4gc29uYW11LmNvbmZpZy50cy5cIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNhY2hlVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHdvcmtmbG93c1ZhbHVlOiBXb3JrZmxvd01hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgZ2V0IHdvcmtmbG93cygpOiBXb3JrZmxvd01hbmFnZXIge1xuICAgIGlmICh0aGlzLndvcmtmbG93c1ZhbHVlID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLndvcmtmbG93c1ZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBhdXRoVmFsdWU6IEF1dGg8QmV0dGVyQXV0aE9wdGlvbnM+IHwgbnVsbCA9IG51bGw7XG4gIGdldCBhdXRoKCk6IEF1dGg8QmV0dGVyQXV0aE9wdGlvbnM+IHtcbiAgICBpZiAoIXRoaXMuYXV0aFZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdXRoIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gQ2hlY2sgYXV0aCBjb25maWcgaW4gc29uYW11LmNvbmZpZy50cy5cIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmF1dGhWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZGV2Vml0ZXN0TWFuYWdlclZhbHVlOiBEZXZWaXRlc3RNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIGdldCBkZXZWaXRlc3RNYW5hZ2VyKCk6IERldlZpdGVzdE1hbmFnZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5kZXZWaXRlc3RNYW5hZ2VyVmFsdWU7XG4gIH1cbiAgc2V0IGRldlZpdGVzdE1hbmFnZXIobWFuYWdlcjogRGV2Vml0ZXN0TWFuYWdlciB8IG51bGwpIHtcbiAgICB0aGlzLmRldlZpdGVzdE1hbmFnZXJWYWx1ZSA9IG1hbmFnZXI7XG4gIH1cblxuICAvLyBTb25hbXXqsIAgcnVudGltZeydhCDsp4HsoJEg7IaM7Jyg7ZW0IHJlZ2lzdHJ5L2Nvbm5lY3Rpb24gbGlmZWN5Y2xl7J2EIOyVoO2UjOumrOy8gOydtOyFmCDsiJjrqoXso7zquLDsmYAg64+Z6riw7ZmU7ZWoXG4gIHByaXZhdGUgd2Vic29ja2V0UnVudGltZVZhbHVlOiBXZWJTb2NrZXRSdW50aW1lIHwgbnVsbCA9IG51bGw7XG4gIC8vIOqwmeydgCBGYXN0aWZ5IOyduOyKpO2EtOyKpOyXkCBAZmFzdGlmeS93ZWJzb2NrZXTsnYQg7KSR67O1IOuTseuhne2VmOuKlCDqsoPsnYQgV2Vha1NldOycvOuhnCDssKjri6jtlahcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWJzb2NrZXRQbHVnaW5TZXJ2ZXJzID0gbmV3IFdlYWtTZXQ8XG4gICAgRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT5cbiAgPigpO1xuICBnZXQgd2Vic29ja2V0UnVudGltZSgpOiBXZWJTb2NrZXRSdW50aW1lIHtcbiAgICBpZiAoIXRoaXMud2Vic29ja2V0UnVudGltZVZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXZWJTb2NrZXQgcnVudGltZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy53ZWJzb2NrZXRSdW50aW1lVmFsdWU7XG4gIH1cbiAgc2V0IHdlYnNvY2tldFJ1bnRpbWUocnVudGltZTogV2ViU29ja2V0UnVudGltZSB8IG51bGwpIHtcbiAgICB0aGlzLndlYnNvY2tldFJ1bnRpbWVWYWx1ZSA9IHJ1bnRpbWU7XG4gIH1cblxuICBjYXB0dXJlVGVzdGluZ1NuYXBzaG90KCk6IFNvbmFtdVRlc3RpbmdTbmFwc2hvdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFwaVJvb3RQYXRoOiB0aGlzLmFwaVJvb3RQYXRoVmFsdWUsXG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnVmFsdWUsXG4gICAgICBzeW5jZXI6IHRoaXMuc3luY2VyVmFsdWUsXG4gICAgICBodHRwVmFsaWRhdG9yczogdGhpcy5odHRwVmFsaWRhdG9ycyxcbiAgICAgIHBlbmRpbmdIdHRwVmFsaWRhdG9yczogdGhpcy5wZW5kaW5nSHR0cFZhbGlkYXRvcnMsXG4gICAgICBhb3RIdHRwVmFsaWRhdG9yUmVnaXN0cnk6IHRoaXMuYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5LFxuICAgICAgcHJlcGFyZWRBcGlzOiB0aGlzLnByZXBhcmVkQXBpcyxcbiAgICAgIHByZXBhcmVkTW9kZWxzOiB0aGlzLnByZXBhcmVkTW9kZWxzLFxuICAgICAgd2Vic29ja2V0UnVudGltZTogdGhpcy53ZWJzb2NrZXRSdW50aW1lVmFsdWUsXG4gICAgfTtcbiAgfVxuXG4gIHJlc3RvcmVUZXN0aW5nU25hcHNob3Qoc25hcHNob3Q6IFNvbmFtdVRlc3RpbmdTbmFwc2hvdCk6IHZvaWQge1xuICAgIHRoaXMuYXBpUm9vdFBhdGhWYWx1ZSA9IHNuYXBzaG90LmFwaVJvb3RQYXRoO1xuICAgIHRoaXMuY29uZmlnVmFsdWUgPSBzbmFwc2hvdC5jb25maWc7XG4gICAgdGhpcy5zeW5jZXJWYWx1ZSA9IHNuYXBzaG90LnN5bmNlcjtcbiAgICB0aGlzLmh0dHBWYWxpZGF0b3JzID0gc25hcHNob3QuaHR0cFZhbGlkYXRvcnM7XG4gICAgdGhpcy5wZW5kaW5nSHR0cFZhbGlkYXRvcnMgPSBzbmFwc2hvdC5wZW5kaW5nSHR0cFZhbGlkYXRvcnM7XG4gICAgdGhpcy5hb3RIdHRwVmFsaWRhdG9yUmVnaXN0cnkgPSBzbmFwc2hvdC5hb3RIdHRwVmFsaWRhdG9yUmVnaXN0cnk7XG4gICAgdGhpcy5wcmVwYXJlZEFwaXMgPSBzbmFwc2hvdC5wcmVwYXJlZEFwaXM7XG4gICAgdGhpcy5wcmVwYXJlZE1vZGVscyA9IHNuYXBzaG90LnByZXBhcmVkTW9kZWxzO1xuICAgIHRoaXMud2Vic29ja2V0UnVudGltZVZhbHVlID0gc25hcHNob3Qud2Vic29ja2V0UnVudGltZTtcbiAgfVxuXG4gIC8vIEhNUiDsspjrpqw6IO2MjOydvCDsi5zsiqTthZwg6rCQ7IucICsgSE1SL3N5bmMg7IKs7J207YG0IOyLpO2WieydgCB3YXRjaGVyIOuqqOuTiOuhnCDsnITsnoTtlanri4jri6QuXG4gIHB1YmxpYyB3YXRjaGVyOiBGU1dhdGNoZXIgfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UgfCBudWxsID0gbnVsbDtcblxuICBhc3luYyBpbml0Rm9yVGVzdGluZygpIHtcbiAgICBhd2FpdCB0aGlzLmluaXQodHJ1ZSwgZmFsc2UsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIH1cblxuICBhc3luYyBpbml0KFxuICAgIGRvU2lsZW50OiBib29sZWFuID0gZmFsc2UsXG4gICAgZW5hYmxlU3luYzogYm9vbGVhbiA9IHRydWUsXG4gICAgYXBpUm9vdFBhdGg/OiBBYnNvbHV0ZVBhdGgsXG4gICAgZm9yVGVzdGluZzogYm9vbGVhbiA9IGZhbHNlLFxuICApIHtcbiAgICB0aGlzLmZvclRlc3RpbmcgPSBmb3JUZXN0aW5nO1xuXG4gICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGluaXRTdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gICAgLy8gQVBJIOujqO2KuCDtjKjsiqRcbiAgICBjb25zdCB7IGZpbmRBcGlSb290UGF0aCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvdXRpbHNcIik7XG4gICAgdGhpcy5hcGlSb290UGF0aCA9IGFwaVJvb3RQYXRoID8/IGZpbmRBcGlSb290UGF0aCgpO1xuICAgIGNvbnN0IGJhc2VFbnZCZWZvcmVDb25maWdMb2FkID0geyAuLi5wcm9jZXNzLmVudiB9O1xuXG4gICAgLy8g7ISk7KCV7J2EIOuhnOuUqe2VmOuKlCDqsoPrtoDthLAg7Iuc7J6RXG4gICAgY29uc3QgY29uZmlnU3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICBjb25zdCB7IGxvYWRDb25maWcgfSA9IGF3YWl0IGltcG9ydChcIi4vY29uZmlnXCIpO1xuICAgIHRoaXMuY29uZmlnID0gYXdhaXQgbG9hZENvbmZpZyh0aGlzLmFwaVJvb3RQYXRoKTtcbiAgICBjb25zdCBjb25maWdUaW1lID0gcGVyZm9ybWFuY2Uubm93KCkgLSBjb25maWdTdGFydDtcbiAgICBzZXRTRENvbmZpZyh0aGlzLmNvbmZpZy5pMThuKTtcbiAgICAvLyBzb25hbXUuY29uZmlnLnRzIOq4sOuzuOqwkiDshKTsoJVcbiAgICB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSA9IHRoaXMuY29uZmlnLmRhdGFiYXNlLmRhdGFiYXNlID8/IFwicGdcIjtcbiAgICB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kZWZhdWx0T3B0aW9ucyA9IHRoaXMuY29uZmlnLmRhdGFiYXNlLmRlZmF1bHRPcHRpb25zID8/IHt9O1xuICAgIHRoaXMuY29uZmlnLmRhdGFiYXNlLmRlZmF1bHRPcHRpb25zLmNsaWVudCA9IHRoaXMuY29uZmlnLmRhdGFiYXNlLmRhdGFiYXNlID8/IFwicGdcIjtcblxuICAgIC8vIOuhnOq5hSDshKTsoJVcbiAgICBjb25zdCB7IGNvbmZpZ3VyZUxvZ1RhcGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2xvZ2dlci9jb25maWd1cmVcIik7XG4gICAgaWYgKHRoaXMuY29uZmlnLmxvZ2dpbmcgIT09IGZhbHNlKSB7XG4gICAgICBhd2FpdCBjb25maWd1cmVMb2dUYXBlKHtcbiAgICAgICAgLi4udGhpcy5jb25maWcubG9nZ2luZyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIERCIOuhnOuTnFxuICAgIGNvbnN0IHsgREI6IFJ1bnRpbWVEQiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZGF0YWJhc2UvZGJcIik7XG4gICAgY29uc3QgeyBpc0xvY2FsOiBpc0xvY2FsRW52aXJvbm1lbnQgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIik7XG4gICAgY29uc3QgZW52aXJvbm1lbnRTbmFwc2hvdHMgPSBpc0xvY2FsRW52aXJvbm1lbnQoKVxuICAgICAgPyByZWFkQWxsRW52aXJvbm1lbnRTbmFwc2hvdHModGhpcy5hcGlSb290UGF0aCwgYmFzZUVudkJlZm9yZUNvbmZpZ0xvYWQpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmRiQ29uZmlnID0gUnVudGltZURCLmdlbmVyYXRlREJDb25maWcoXG4gICAgICB0aGlzLmNvbmZpZy5kYXRhYmFzZSxcbiAgICAgIHRoaXMuY29uZmlnLnByb2plY3ROYW1lLFxuICAgICAgZW52aXJvbm1lbnRTbmFwc2hvdHMsXG4gICAgKTtcbiAgICBSdW50aW1lREIuc2V0Q29uZmlnKHRoaXMuZGJDb25maWcpO1xuXG4gICAgLy8gRW50aXR5IOuhnOuTnFxuICAgIC8vIO2FjOyKpO2KuOyXkOyEnOuPhCBFbnRpdHkg7KCV67O064qUIO2VhOyalO2VqeuLiOuLpC5cbiAgICAvLyB1cHNlcnTqsIAg7KCc64yA66GcIOyekeuPme2VmOugpOuptCBlbnRpdHnsnZggdW5pcXVlIGluZGV4IOygleuztOqwgCDtlYTsmpTtlZjquLAg65WM66y47J6F64uI64ukLlxuICAgIGNvbnN0IHsgRW50aXR5TWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCIpO1xuICAgIGF3YWl0IEVudGl0eU1hbmFnZXIuYXV0b2xvYWQoZG9TaWxlbnQpO1xuXG4gICAgLy8gQ2FjaGUg7LSI6riw7ZmUXG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplQ2FjaGUodGhpcy5jb25maWcuc2VydmVyLmNhY2hlLCBmb3JUZXN0aW5nKTtcblxuICAgIC8vIEJldHRlckF1dGgg7LSI6riw7ZmUXG4gICAgY29uc3QgYXV0aENvbmZpZyA9IHRoaXMuY29uZmlnLnNlcnZlci5hdXRoO1xuICAgIGlmIChhdXRoQ29uZmlnKSB7XG4gICAgICAvLyDsgqzsmqnsnpAg7ISk7KCV6rO8IOq4sOuzuOqwkuydhCBtZXJnZVxuICAgICAgY29uc3QgbWVyZ2VkRmllbGRNYXBwaW5ncyA9IG1lcmdlKEJBU0VfRklFTERfTUFQUElOR1MsIGF1dGhDb25maWcpO1xuXG4gICAgICAvLyBiZXR0ZXItYXV0aCDsnbjsiqTthLTsiqQg7IOd7ISxXG4gICAgICBjb25zdCB7IGJldHRlckF1dGggfSA9IGF3YWl0IGltcG9ydChcImJldHRlci1hdXRoXCIpO1xuICAgICAgY29uc3QgeyBzb25hbXVLbmV4QWRhcHRlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vYXV0aC9rbmV4LWFkYXB0ZXJcIik7XG5cbiAgICAgIGNvbnN0IGF1dGhPcHRpb25zOiBCZXR0ZXJBdXRoT3B0aW9ucyA9IHtcbiAgICAgICAgZGF0YWJhc2U6IHNvbmFtdUtuZXhBZGFwdGVyKCksXG4gICAgICAgIC4uLm1lcmdlZEZpZWxkTWFwcGluZ3MsXG4gICAgICB9O1xuICAgICAgdGhpcy5hdXRoVmFsdWUgPSBiZXR0ZXJBdXRoKGF1dGhPcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyDthYzsiqTtjIXsnbgg6rK97JqwIOyLse2BrCDsl4bsnbQg7KSR64uoXG4gICAgaWYgKGZvclRlc3RpbmcpIHtcbiAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGFzayDrk7HroZ1cbiAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVXb3JrZmxvd3ModGhpcy5jb25maWcudGFza3MpO1xuXG4gICAgLy8gU3luY2VyXG4gICAgY29uc3QgeyBTeW5jZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N5bmNlci9zeW5jZXJcIik7XG4gICAgdGhpcy5zeW5jZXIgPSBuZXcgU3luY2VyKCk7XG5cbiAgICAvLyBBdXRvbG9hZDogTW9kZWxzIC8gVHlwZXMgLyBBUElzIC8gV29ya2Zsb3dzIC8gVGVtcGxhdGVzIC8gU1NSIFJvdXRlc1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkVHlwZXMoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkQXBpcygpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkV29ya2Zsb3dzKCk7XG4gICAgY29uc3QgeyBUZW1wbGF0ZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3RlbXBsYXRlXCIpO1xuICAgIGF3YWl0IFRlbXBsYXRlTWFuYWdlci5hdXRvbG9hZCgpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkU3NyUm91dGVzKCk7XG5cbiAgICBjb25zdCB7IGlzTG9jYWwsIGlzVGVzdCwgaXNIb3RSZWxvYWRTZXJ2ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIik7XG4gICAgaWYgKGlzTG9jYWwoKSAmJiAhaXNUZXN0KCkgJiYgaXNIb3RSZWxvYWRTZXJ2ZXIoKSAmJiBlbmFibGVTeW5jKSB7XG4gICAgICBhd2FpdCB0aGlzLnN5bmNlci5zeW5jKCk7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0V2F0Y2hlcigpO1xuICAgIH1cblxuICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgdGhpcy5pbml0RWxhcHNlZCA9IHBlcmZvcm1hbmNlLm5vdygpIC0gaW5pdFN0YXJ0O1xuICAgIHRoaXMuY29uZmlnRWxhcHNlZCA9IGNvbmZpZ1RpbWU7XG4gIH1cblxuICBwcml2YXRlIGluaXRFbGFwc2VkID0gMDtcbiAgcHJpdmF0ZSBjb25maWdFbGFwc2VkID0gMDtcblxuICBhc3luYyBjcmVhdGVTZXJ2ZXIoaW5pdE9wdGlvbnM/OiB7IGVuYWJsZVN5bmM/OiBib29sZWFuOyBkb1NpbGVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICghdGhpcy5pc0luaXRpYWxpemVkKSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXQoaW5pdE9wdGlvbnM/LmRvU2lsZW50LCBpbml0T3B0aW9ucz8uZW5hYmxlU3luYyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuY29uZmlnLnNlcnZlcjtcbiAgICBjb25zdCB7IGRlZmF1bHQ6IGZhc3RpZnkgfSA9IGF3YWl0IGltcG9ydChcImZhc3RpZnlcIik7XG4gICAgY29uc3QgeyBnZXRMb2dUYXBlRmFzdGlmeUxvZ2dlciB9ID0gYXdhaXQgaW1wb3J0KFwiQGxvZ3RhcGUvZmFzdGlmeVwiKTtcbiAgICAvLyBGYXN0aWZ5IDXripQgbG9nZ2VyIOyYteyFmOyXkCDshKTsoJUg6rCd7LK066eMIOuwm+qzoCwg66Gc6rGwIOyduOyKpO2EtOyKpOuKlCBsb2dnZXJJbnN0YW5jZeuhnCDrhJjqsqjslbwg7ZWc64ukXG4gICAgLy8gU0FGRVRZOiBMb2dUYXBlIOyWtOuMke2EsOuKlCBwaW5vIO2YuO2ZmCDrqZTshJzrk5wg7KeR7ZWpKHRyYWNlfmZhdGFsLCBzaWxlbnQsIGNoaWxkKeydhCDsoJzqs7XtlZjrqbAgRmFzdGlmeSA07JeQ7ISc64+EIOqwmeydgCDqsJ3ssrTrpbwgbG9nZ2Vy66GcIOuEmOqyqCDrj5nsnpHtlojri6QuXG4gICAgY29uc3QgbG9nZ2VySW5zdGFuY2U6IEZhc3RpZnlCYXNlTG9nZ2VyIHwgdW5kZWZpbmVkID1cbiAgICAgIHRoaXMuY29uZmlnLmxvZ2dpbmcgIT09IGZhbHNlXG4gICAgICAgID8gKGdldExvZ1RhcGVGYXN0aWZ5TG9nZ2VyKHtcbiAgICAgICAgICAgIGNhdGVnb3J5OiB0aGlzLmNvbmZpZy5sb2dnaW5nPy5mYXN0aWZ5Q2F0ZWdvcnkgPz8gW1wiZmFzdGlmeVwiXSxcbiAgICAgICAgICB9KSBhcyBGYXN0aWZ5QmFzZUxvZ2dlcilcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc2VydmVyID0gZmFzdGlmeSh7XG4gICAgICAuLi5vcHRpb25zLmZhc3RpZnksXG4gICAgICBsb2dnZXJJbnN0YW5jZSxcbiAgICB9KTtcbiAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcbiAgICB0aGlzLndlYnNvY2tldFJ1bnRpbWUgPSBuZXcgV2ViU29ja2V0UnVudGltZShvcHRpb25zLndlYnNvY2tldCk7XG5cbiAgICAvLyBTdG9yYWdlIOyEpOyglSDihpIgU3RvcmFnZU1hbmFnZXIg7IOd7ISxXG4gICAgaWYgKG9wdGlvbnMuc3RvcmFnZSkge1xuICAgICAgY29uc3QgeyBTdG9yYWdlTWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3RvcmFnZS9zdG9yYWdlLW1hbmFnZXJcIik7XG4gICAgICB0aGlzLnN0b3JhZ2VWYWx1ZSA9IG5ldyBTdG9yYWdlTWFuYWdlcihvcHRpb25zLnN0b3JhZ2UpO1xuICAgIH1cblxuICAgIC8vIO2UjOufrOq3uOyduCDrk7HroZ1cbiAgICBpZiAob3B0aW9ucy5wbHVnaW5zKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyUGx1Z2lucyhzZXJ2ZXIsIG9wdGlvbnMucGx1Z2lucyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYXV0aCkge1xuICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlckJldHRlckF1dGgoc2VydmVyLCBvcHRpb25zLmF1dGgpO1xuICAgIH1cblxuICAgIC8vIEFQSSDrnbzsmrDtjIUg7ISk7KCVXG4gICAgYXdhaXQgdGhpcy53aXRoRmFzdGlmeShzZXJ2ZXIsIG9wdGlvbnMuYXBpQ29uZmlnLCB7XG4gICAgICBlbmFibGVTeW5jOiBpbml0T3B0aW9ucz8uZW5hYmxlU3luYyxcbiAgICAgIGRvU2lsZW50OiBpbml0T3B0aW9ucz8uZG9TaWxlbnQsXG4gICAgfSk7XG5cbiAgICAvLyDshJzrsoQg7Iuc7J6RXG4gICAgYXdhaXQgdGhpcy5ib290KHNlcnZlciwgb3B0aW9ucyk7XG5cbiAgICBpZiAoIWluaXRPcHRpb25zPy5kb1NpbGVudCkge1xuICAgICAgdGhpcy5wcmludFN0YXJ0dXBTdW1tYXJ5KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlcnZlcjtcbiAgfVxuXG4gIGFzeW5jIHdpdGhGYXN0aWZ5KFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBlbmFibGVTeW5jPzogYm9vbGVhbjtcbiAgICAgIGRvU2lsZW50PzogYm9vbGVhbjtcbiAgICB9LFxuICApIHtcbiAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0KG9wdGlvbnM/LmRvU2lsZW50LCBvcHRpb25zPy5lbmFibGVTeW5jKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcbiAgICB0aGlzLndlYnNvY2tldFJ1bnRpbWUgPz89IG5ldyBXZWJTb2NrZXRSdW50aW1lKHRoaXMuY29uZmlnLnNlcnZlci53ZWJzb2NrZXQpO1xuICAgIGF3YWl0IHRoaXMucmVmcmVzaEh0dHBWYWxpZGF0b3JzKCk7XG5cbiAgICAvLyB0aW1lem9uZSDshKTsoJVcbiAgICBjb25zdCB0aW1lem9uZSA9IHRoaXMuY29uZmlnLmFwaS50aW1lem9uZTtcbiAgICBpZiAodGltZXpvbmUpIHtcbiAgICAgIC8vIO2DgOyehOyhtOyXkCDrp57qsowg7J2R64u1IOuCoOynnCDsiqTtirjrp4HsnYQg67OA7ZmY7ZW07KO87Ja07JW8IO2VqeuLiOuLpC5cbiAgICAgIC8vIOqwgOuguSB0aW1lem9uZeydtCBcIkFzaWEvU2VvdWxcIiDsnbTrqbRcbiAgICAgIC8vIFwiMjAyNS0xMS0yMVQwMDowMDowMC4wMDBaXCIg66W8IFwiMjAyNS0xMS0yMVQwOTowMDowMCswOTowMFwiIOycvOuhnCDrs4DtmZjtlbTso7zslrTslbwg7ZWp64uI64ukLlxuICAgICAgY29uc3QgeyBmb3JtYXRJblRpbWVab25lIH0gPSBhd2FpdCBpbXBvcnQoXCJkYXRlLWZucy10elwiKTtcblxuICAgICAgLy8gSVNPIDg2MDEg64Kg7KecIO2YleyLnSDsoJXqt5zsi50gKOyYiDogMjAyNC0wMS0xNVQwOTozMDowMC4wMDBaKVxuICAgICAgY29uc3QgSVNPX0RBVEVfUkVHRVggPSAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9KFxcLlxcZHszfSk/WiQvO1xuXG4gICAgICAvLyBU66W8IOuRmOufrOyLvCDsnpHsnYDrlLDsmLTtkZzqsIAg7JeG64uk66m0IFwiMjAyNS0xMS0xOTE3NjM1NDYxODkwMDAxODo1NjoyOSswOTowMFwi7JmAIOqwmeydgCDqsrDqs7zqsIAg64KY7Ji164uI64ukLlxuICAgICAgLy8g7J2064qUIGRhdGUtZm5zIO2KueyeheuLiOuLpC5cbiAgICAgIC8vIOydtOugh+qyjCDtlbTrj4Qg6rSc7LCu7Iq164uI64ukLiBcIjIwMjUtMTEtMTlUMTg6NTY6MjkrMDk6MDBcIiDrqqjslpHsnLzroZwg7J6YIOuCmOyYteuLiOuLpC5cbiAgICAgIGNvbnN0IERBVEVfRk9STUFUID0gXCJ5eXl5LU1NLWRkJ1QnSEg6bW06c3NYWFhcIjtcblxuICAgICAgc2VydmVyLnNldFJlcGx5U2VyaWFsaXplcigocGF5bG9hZCkgPT4ge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGF5bG9hZCwgKF9rZXksIHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKGlzU3RyaW5nVmFsdWUodmFsdWUpICYmIElTT19EQVRFX1JFR0VYLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0SW5UaW1lWm9uZShcbiAgICAgICAgICAgICAgbmV3IERhdGUodmFsdWUpLFxuICAgICAgICAgICAgICAvKiBTQUZFVFk6IEFQSSDrjbDsvZTroIjsnbTthLDsmYAgWm9kIOqygOymneq4sCDrk7HroZ0g6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gdGltZXpvbmUgYXMgYCR7c3RyaW5nfS8ke3N0cmluZ31gLFxuICAgICAgICAgICAgICBEQVRFX0ZPUk1BVCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIC8vIFRpbWV6b25lIOuhnOq3uOuKlCBwcmludFN0YXJ0dXBTdW1tYXJ57JeQ7IScIO2Gte2VqSDstpzroKVcbiAgICB9XG5cbiAgICAvLyDsoITssrQg65287Jqw7YyFIOumrOyKpO2KuFxuICAgIHNlcnZlci5nZXQoXG4gICAgICBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS9yb3V0ZXNgLFxuICAgICAgYXN5bmMgKF9yZXF1ZXN0LCBfcmVwbHkpOiBQcm9taXNlPHR5cGVvZiB0aGlzLnN5bmNlci5hcGlzPiA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmNlci5hcGlzO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gSGVhbHRoY2hlY2sgQVBJXG4gICAgc2VydmVyLmdldChcbiAgICAgIGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9L2hlYWx0aGNoZWNrYCxcbiAgICAgIGFzeW5jIChfcmVxdWVzdCwgX3JlcGx5KTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgcmV0dXJuIFwib2tcIjtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIFNvbmFtdSBVSSBBUEkgKOuhnOy7rCDtmZjqsr3sl5DshJzrp4wpXG4gICAgY29uc3QgeyBpc0xvY2FsIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGlmIChpc0xvY2FsKCkpIHtcbiAgICAgIGNvbnN0IHsgc29uYW11VUlBcGlQbHVnaW4gfSA9IGF3YWl0IGltcG9ydChcIi4uL3VpL2FwaVwiKTtcbiAgICAgIHNlcnZlci5yZWdpc3Rlcihzb25hbXVVSUFwaVBsdWdpbik7XG4gICAgfVxuXG4gICAgLy8gRGV2UnVubmVyIO2FjOyKpO2KuCDsl5Trk5ztj6zsnbjtirggKOuhnOy7rCDtmZjqsr0gKyBkZXZSdW5uZXIg7Zmc7ISx7ZmUIOyLnClcbiAgICBpZiAoaXNMb2NhbCgpICYmIHRoaXMuY29uZmlnLnRlc3Q/LmRldlJ1bm5lcj8uZW5hYmxlZCkge1xuICAgICAgY29uc3QgeyByZWdpc3RlckRldlRlc3RSb3V0ZXMgfSA9IGF3YWl0IGltcG9ydChcIi4uL3Rlc3RpbmcvZGV2LXRlc3Qtcm91dGVzXCIpO1xuICAgICAgYXdhaXQgcmVnaXN0ZXJEZXZUZXN0Um91dGVzKHNlcnZlciwgdGhpcy5jb25maWcudGVzdC5kZXZSdW5uZXIpO1xuICAgIH1cblxuICAgIGNvbnN0IHdlYlBhdGggPSBwYXRoLmpvaW4odGhpcy5hcHBSb290UGF0aCwgXCJ3ZWJcIik7XG4gICAgY29uc3QgaGFzV2ViID0gYXdhaXQgZXhpc3RzKHdlYlBhdGgpO1xuXG4gICAgLy8g7KCE7JetIGNvbXByZXNzIOyYteyFmCDqs4TsgrAgKHJvdXRlLmNvbXByZXNzOiB0cnVl7J28IOuVjCDsgqzsmqkpXG4gICAgY29uc3QgcGx1Z2luQ29tcHJlc3MgPSB0aGlzLmNvbmZpZy5zZXJ2ZXIucGx1Z2lucz8uY29tcHJlc3M7XG4gICAgY29uc3QgZ2xvYmFsQ29tcHJlc3NPcHRpb25zOiBDb21wcmVzc09wdGlvbnMgfCB1bmRlZmluZWQgPSBwbHVnaW5Db21wcmVzc1xuICAgICAgPyBwbHVnaW5Db21wcmVzcyA9PT0gdHJ1ZVxuICAgICAgICA/IHsgdGhyZXNob2xkOiAxMDI0LCBlbmNvZGluZ3M6IFtcImJyXCIsIFwiZ3ppcFwiLCBcImRlZmxhdGVcIl0gfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIHRocmVzaG9sZDogcGx1Z2luQ29tcHJlc3MudGhyZXNob2xkLFxuICAgICAgICAgICAgZW5jb2RpbmdzOiBwbHVnaW5Db21wcmVzcy5lbmNvZGluZ3MsXG4gICAgICAgICAgICBjdXN0b21UeXBlczogcGx1Z2luQ29tcHJlc3MuY3VzdG9tVHlwZXMsXG4gICAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoaXNMb2NhbCgpKSB7XG4gICAgICAvLyDroZzsu6wg6rCc67CcIO2ZmOqyvTogY2F0Y2gtYWxs66GcIEFQSeulvCDrj5nsoIEg66ek7Lmt7ZWY7JesIEhNUuydhCDsp4Dsm5Dtlanri4jri6QuXG4gICAgICAvLyBTT05BTVVfRElTQUJMRV9JTlRFR1JBVEVEX1dFQj15ZXProZwg7ISk7KCV7ZWY66m0IGRldl9hcGkg66qo65Oc7JeQ7IScIFZpdGUg7Ya17ZWp7J2EIOu5hO2ZnOyEse2ZlO2VoCDsiJgg7J6I7Iq164uI64ukLlxuICAgICAgY29uc3QgZGlzYWJsZUludGVncmF0ZWRXZWIgPSBwcm9jZXNzLmVudi5TT05BTVVfRElTQUJMRV9JTlRFR1JBVEVEX1dFQiA9PT0gXCJ5ZXNcIjtcbiAgICAgIGlmIChoYXNXZWIgJiYgIWRpc2FibGVJbnRlZ3JhdGVkV2ViKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0dXBEZXZTZXJ2ZXJXaXRoVml0ZShzZXJ2ZXIsIHdlYlBhdGgsIGNvbmZpZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldHVwRGV2U2VydmVyKHNlcnZlciwgY29uZmlnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8g7ZSE66Gc642V7IWYIO2ZmOqyvTog6rCc67OEIEFQSSDrnbzsmrDtirggKyDsoJXsoIEg7YyM7J28IOyEnOu5mVxuICAgICAgZm9yIChjb25zdCBhcGkgb2YgdGhpcy5zeW5jZXIuYXBpcykge1xuICAgICAgICBpZiAodGhpcy5zeW5jZXIubW9kZWxzW2FwaS5tb2RlbE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOygleydmOuQmOyngCDslYrsnYAg66qo64247JeQIOygkeq3vCAke2FwaS5tb2RlbE5hbWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBAd2Vic29ja2V0IHJvdXRl64qUIHdzSGFuZGxlcuuhnCDrk7HroZ3tlZjqs6AsIOqwmeydgCBwYXRo7J2YIOydvOuwmCBIVFRQIEdFVOydgCA0MjYg7J2R64u17Jy866GcIHVwZ3JhZGXrpbwg6rCV7KCc7ZWoXG4gICAgICAgIGlmIChhcGkud2Vic29ja2V0T3B0aW9ucykge1xuICAgICAgICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgICAgICB1cmw6IHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXggKyBhcGkucGF0aCxcbiAgICAgICAgICAgIGhhbmRsZXI6IHRoaXMuY3JlYXRlV2ViU29ja2V0VXBncmFkZVJlcXVpcmVkSGFuZGxlcigpLFxuICAgICAgICAgICAgd3NIYW5kbGVyOiB0aGlzLmNyZWF0ZVdlYlNvY2tldEhhbmRsZXIoYXBpLCBjb25maWcpLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VydmVyLnJvdXRlKHtcbiAgICAgICAgICBtZXRob2Q6IGFwaS5vcHRpb25zLmh0dHBNZXRob2QgPz8gXCJHRVRcIixcbiAgICAgICAgICB1cmw6IHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXggKyBhcGkucGF0aCxcbiAgICAgICAgICBoYW5kbGVyOiBhd2FpdCB0aGlzLmNyZWF0ZUFwaUhhbmRsZXIoYXBpLCBjb25maWcpLFxuICAgICAgICAgIGNvbXByZXNzOiB0b0Zhc3RpZnlDb21wcmVzc09wdGlvbihhcGkub3B0aW9ucy5jb21wcmVzcywgZ2xvYmFsQ29tcHJlc3NPcHRpb25zKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIO2UhOuhnOuNleyFmOyXkOyEnOuKlCB3ZWIg7IaM7IqkKGFwcFJvb3Qvd2ViKSDsnKDrrLTsmYAg66y06rSA7ZWY6rKMLFxuICAgICAgLy8gYXBpL3dlYi1kaXN0IOyhtOyerCDsl6zrtoDrpbwgc2V0dXBTdGF0aWNXZWJTZXJ2ZXIg64K067aA7JeQ7IScIO2MkOuLqO2VqeuLiOuLpC5cbiAgICAgIGF3YWl0IHRoaXMuc2V0dXBTdGF0aWNXZWJTZXJ2ZXIoc2VydmVyLCBjb25maWcsIGdsb2JhbENvbXByZXNzT3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGRldiDrqqjrk5wg6rO17Ya1OiBjYXRjaC1hbGzsl5DshJwg66eI7KeA66eJIOykgOu5hCDsmYTro4wgQVBJIHNuYXBzaG907J2EIO2DkOyDie2VmOyXrCDsmpTssq3snYQg7LKY66as7ZWp64uI64ukLlxuICAgKiBzZXJ2ZXIucm91dGUoKeuhnCDqsJzrs4Qg65Ox66Gd7ZWY66m0IGhhbmRsZXLqsIAg6rOg7KCV65CY7Ja0IEhNUuydtCDrj5nsnpHtlZjsp4Ag7JWK7Jy866+A66GcLFxuICAgKiByZWZyZXNoIOyEseqztSDsi5wg6rWQ7LK065CY64qUIHNuYXBzaG907J2EIOunpCDsmpTssq0g7KGw7ZqM7ZWp64uI64ukLlxuICAgKlxuICAgKiDsmpTssq3snbQgL2FwaSjsoJXtmZXtnojripQgdGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCnroZwg7Iuc7J6R7ZWY7KeAIOyViuuKlCDqsr3smrDrnbzrqbQgbnVsbOydhCDrsJjtmZjtlZjrqbAg64Gd64OF64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVEZXZBcGlSZXF1ZXN0KFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogUHJvbWlzZTwoKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KSA9PiBQcm9taXNlPEFwaU1ldGhvZFJlc3VsdD4pIHwgbnVsbD4ge1xuICAgIGNvbnN0IG1hdGNoZWRBcGkgPSB0aGlzLmZpbmRNYXRjaGVkQXBpKHJlcXVlc3QsIHRoaXMucHJlcGFyZWRBcGlzLCB0aGlzLnByZXBhcmVkTW9kZWxzKTtcblxuICAgIGlmICghbWF0Y2hlZEFwaSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuYXBpLm5vdEZvdW5kXCIpKTtcbiAgICB9XG5cbiAgICAvLyB3ZWJzb2NrZXQgcm91dGXrpbwg7J2867CYIEhUVFDroZwg7KeB7KCRIO2YuOy2nO2VnCDqsr3smrAgNDI27J2EIOuPjOugpOykmCB1cGdyYWRlIOyXhuydtCDsoJHqt7ztlZjripQg6rKD7J2EIOywqOuLqO2VqFxuICAgIGlmIChtYXRjaGVkQXBpLndlYnNvY2tldE9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVdlYlNvY2tldFVwZ3JhZGVSZXF1aXJlZEhhbmRsZXIoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVBcGlIYW5kbGVyKG1hdGNoZWRBcGksIGNvbmZpZywgdGhpcy5wcmVwYXJlZE1vZGVscyk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRNYXRjaGVkQXBpKFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIGFwaXM6IHJlYWRvbmx5IEV4dGVuZGVkQXBpW10sXG4gICAgbW9kZWxzOiBMb2FkZWRNb2RlbHMsXG4gICk6IEV4dGVuZGVkQXBpIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLmdldFBhdGhuYW1lRnJvbVVybChyZXF1ZXN0LnVybCk7XG4gICAgY29uc3QgbWV0aG9kID0gcmVxdWVzdC5tZXRob2Q7XG5cbiAgICBpZiAoIXVybC5zdGFydHNXaXRoKHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXgpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBhcGlzLmZpbmQoKGFwaSkgPT4ge1xuICAgICAgaWYgKG1vZGVsc1thcGkubW9kZWxOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFwaU1ldGhvZCA9IGFwaS5vcHRpb25zLmh0dHBNZXRob2QgPz8gXCJHRVRcIjtcbiAgICAgIGlmIChhcGlNZXRob2QgIT09IG1ldGhvZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXggKyBhcGkucGF0aDtcbiAgICAgIHJldHVybiB0aGlzLmlzUGF0aFBhdHRlcm5NYXRjaChmdWxsUGF0aCwgdXJsKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkZXYgYXBpIOuqqOuTnDogVml0ZSDsl4bsnbQgQVBJIOuPmeyggSDrnbzsmrDtjIXrp4wg7KCc6rO17ZWp64uI64ukLlxuICAgKiBITVLsnYQg7JyE7ZW0IGNhdGNoLWFsbOyXkOyEnCDrp6Qg7JqU7LKt66eI64ukIOykgOu5hCDsmYTro4wgQVBJIHNuYXBzaG907J2EIOyhsO2ajO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgc2V0dXBEZXZTZXJ2ZXIoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICk6IHZvaWQge1xuICAgIC8vIHVwZ3JhZGXripQg7Iuk7KeI7KCB7Jy866GcIEdFVOyXkOyEnOunjCDshLHrpr3tlZjrr4DroZwgR0VUICsgd3NIYW5kbGVyIOyZgCDqt7gg7Jm4IG1ldGhvZOulvCDrs4Trj4Qgcm91dGXroZwg67aE66as7ZWoXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vKmAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IGF3YWl0IHRoaXMuaGFuZGxlRGV2QXBpUmVxdWVzdChyZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIHJldHVybiBoYW5kbGVyKHJlcXVlc3QsIHJlcGx5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyDrk7HroZ3rkJwgQVBJ7JmAIOydvOy5mO2VmOyngCDslYrripQg7JqU7LKt7JeQIOuMgO2VnCBmYWxsYmFja+yeheuLiOuLpC5cbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuYXBpLm5vdEZvdW5kXCIpKTtcbiAgICAgIH0sXG4gICAgICB3c0hhbmRsZXI6IGFzeW5jIChzb2NrZXQsIHJlcXVlc3QpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVEZXZXZWJTb2NrZXRSZXF1ZXN0KHNvY2tldCwgcmVxdWVzdCwgY29uZmlnKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBIRUFE64qUIOychCBHRVQgY2F0Y2gtYWxs7J20IGV4cG9zZUhlYWRSb3V0ZXProZwg7J6Q64+ZIOuFuOy2nO2VmOuvgOuhnCDspJHrs7Ug7ISg7Ja47ZWY66m0IEZhc3RpZnkgNeqwgCBGU1RfRVJSX0RVUExJQ0FURURfUk9VVEXrpbwg642Y7KeE64ukXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiUE9TVFwiLCBcIlBVVFwiLCBcIkRFTEVURVwiLCBcIlBBVENIXCJdLFxuICAgICAgdXJsOiBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS8qYCxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gYXdhaXQgdGhpcy5oYW5kbGVEZXZBcGlSZXF1ZXN0KHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuIGhhbmRsZXIocmVxdWVzdCwgcmVwbHkpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmFwaS5ub3RGb3VuZFwiKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB2aXRlU2VydmVyOiBhbnkgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBkZXYgYWxsIOuqqOuTnDogVml0ZSBEZXYgU2VydmVy66W8IO2Gte2Vqe2VmOyXrCBBUEkgKyBTU1IgKyBDU1LsnYQg66qo65GQIOygnOqzte2VqeuLiOuLpC5cbiAgICogQVBJIOuPmeyggSDrp6Tsua3snYAgaGFuZGxlRGV2QXBpUmVxdWVzdOulvCDqs7XsnKDtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNldHVwRGV2U2VydmVyV2l0aFZpdGUoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgICB3ZWJQYXRoOiBzdHJpbmcsXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBAZmFzdGlmeS9taWRkaWUg65Ox66GdIChDb25uZWN0LXN0eWxlIG1pZGRsZXdhcmUg7KeA7JuQKVxuICAgIGF3YWl0IHNlcnZlci5yZWdpc3RlcigoYXdhaXQgaW1wb3J0KFwiQGZhc3RpZnkvbWlkZGllXCIpKS5kZWZhdWx0KTtcblxuICAgIGNvbnN0IHZpdGUgPSBhd2FpdCBpbXBvcnQoXCJ2aXRlXCIpO1xuICAgIC8vIEBmYXN0aWZ5L3dlYnNvY2tldCDtlIzrn6zqt7jsnbjsnbQg7Zmc7ISx7ZmU65CY66m0IEhNUiB3ZWJzb2NrZXTqs7wgc2VydmVyIHNvY2tldOydtCDstqnrj4ztlZjrr4DroZwgZGVkaWNhdGVkIO2PrO2KuOuhnCDrtoTrpqztlahcbiAgICBjb25zdCByZXF1aXJlc0RlZGljYXRlZEhtclNlcnZlciA9IEJvb2xlYW4odGhpcy5jb25maWcuc2VydmVyLnBsdWdpbnM/LndzKTtcbiAgICBjb25zdCBobXIgPSByZXNvbHZlSW50ZWdyYXRlZFZpdGVIbXJPcHRpb25zKHtcbiAgICAgIGh0dHBTZXJ2ZXI6IHNlcnZlci5zZXJ2ZXIsXG4gICAgICByZXF1aXJlc0RlZGljYXRlZFdlYlNvY2tldFNlcnZlcjogcmVxdWlyZXNEZWRpY2F0ZWRIbXJTZXJ2ZXIsXG4gICAgfSk7XG5cbiAgICB0aGlzLnZpdGVTZXJ2ZXIgPSBhd2FpdCB2aXRlLmNyZWF0ZVNlcnZlcih7XG4gICAgICByb290OiB3ZWJQYXRoLFxuICAgICAgc2VydmVyOiB7XG4gICAgICAgIG1pZGRsZXdhcmVNb2RlOiB0cnVlLFxuICAgICAgICBobXIsXG4gICAgICB9LFxuICAgICAgYXBwVHlwZTogXCJjdXN0b21cIixcbiAgICB9KTtcblxuICAgIC8vIFZpdGUgbWlkZGxld2FyZSDrk7HroZ0gKFZpdGUg7JeQ7IWLIOyymOumrClcbiAgICBzZXJ2ZXIudXNlKChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICAgICAgLy8gQVBJ7JmAIFNvbmFtdSBVSeuKlCBGYXN0aWZ5IOudvOyasO2KuOqwgCDsspjrpqztlZjrj4TroZ0gc2tpcFxuICAgICAgaWYgKHJlcS51cmw/LnN0YXJ0c1dpdGgodGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCkgfHwgcmVxLnVybD8uc3RhcnRzV2l0aChcIi9zb25hbXUtdWlcIikpIHtcbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICAgIH1cbiAgICAgIC8vIOuCmOuouOyngOuKlCBWaXRlIG1pZGRsZXdhcmXroZwg7KCE64usXG4gICAgICByZXR1cm4gdGhpcy52aXRlU2VydmVyLm1pZGRsZXdhcmVzKHJlcSwgcmVzLCBuZXh0KTtcbiAgICB9KTtcblxuICAgIC8vIFdTIHVwZ3JhZGUg6rK966GcKEdFVCnsmYAg7J2867CYIEhUVFAg66mU7ISc65Oc66W8IOuzhOuPhCByb3V0ZeuhnCDrtoTrpqztlbQgd2Vic29ja2V0IHJvdXRl6rCAIEhUTUwgZmFsbGJhY2vsl5Ag66i57Z6I7KeAIOyViuuPhOuhnSDtlahcbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS8qYCxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmhhbmRsZURldkFwaVJlcXVlc3QocmVxdWVzdCwgY29uZmlnKTtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQocmVxdWVzdCwgcmVwbHkpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmFwaS5ub3RGb3VuZFwiKSk7XG4gICAgICB9LFxuICAgICAgd3NIYW5kbGVyOiBhc3luYyAoc29ja2V0LCByZXF1ZXN0KSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRGV2V2ViU29ja2V0UmVxdWVzdChzb2NrZXQsIHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gSEVBROuKlCDsnIQgR0VUIGNhdGNoLWFsbOydtCBleHBvc2VIZWFkUm91dGVz66GcIOyekOuPmSDrhbjstpztlZjrr4DroZwg7KSR67O1IOyEoOyWuO2VmOuptCBGYXN0aWZ5IDXqsIAgRlNUX0VSUl9EVVBMSUNBVEVEX1JPVVRF66W8IOuNmOynhOuLpFxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIlBPU1RcIiwgXCJQVVRcIiwgXCJERUxFVEVcIiwgXCJQQVRDSFwiXSxcbiAgICAgIHVybDogYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vKmAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5oYW5kbGVEZXZBcGlSZXF1ZXN0KHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0KHJlcXVlc3QsIHJlcGx5KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5hcGkubm90Rm91bmRcIikpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIGNhdGNoLWFsbCDrnbzsmrDtirjsl5DshJwgU1NSL0NTUiDsspjrpqxcbiAgICAvLyDqsJzrsJwg7ZmY6rK97JeQ7ISc64qUIOudvOyasO2KuOuzhCBjb21wcmVzcyDsmLXshZjsnYQg7Y+s6riw7ZWY6rOgIEhNUiDsnbTsoJDsnYQg7Leo7ZWp64uI64ukLlxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIkhFQURcIl0sXG4gICAgICB1cmw6IFwiLypcIixcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCB1cmwgPSByZXF1ZXN0LnVybDtcblxuICAgICAgICAvLyAxLiBTU1Ig65287Jqw7Yq4IOyymOumrFxuICAgICAgICBjb25zdCB7IG1hdGNoU1NSUm91dGUsIHJlbmRlclNTUiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3NyXCIpO1xuICAgICAgICBjb25zdCBzc3JNYXRjaCA9IG1hdGNoU1NSUm91dGUodXJsKTtcbiAgICAgICAgaWYgKHNzck1hdGNoKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYFtTU1JdIE1hdGNoZWQgcm91dGU6ICR7c3NyTWF0Y2gucm91dGUucGF0aH1gKTtcbiAgICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcmVuZGVyU1NSKFxuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgc3NyTWF0Y2gucm91dGUsXG4gICAgICAgICAgICBzc3JNYXRjaC5wYXJhbXMsXG4gICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgcmVwbHksXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICB0aGlzLnZpdGVTZXJ2ZXIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXBseS50eXBlKFwidGV4dC9odG1sXCIpO1xuICAgICAgICAgIHJldHVybiBodG1sO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4gQ1NSIGZhbGxiYWNrXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGV0IHRlbXBsYXRlID0gYXdhaXQgZnMucmVhZEZpbGUoXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy52aXRlU2VydmVyLmNvbmZpZy5yb290LCBcImluZGV4Lmh0bWxcIiksXG4gICAgICAgICAgICBcInV0Zi04XCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0ZW1wbGF0ZSA9IGF3YWl0IHRoaXMudml0ZVNlcnZlci50cmFuc2Zvcm1JbmRleEh0bWwodXJsLCB0ZW1wbGF0ZSk7XG5cbiAgICAgICAgICAvLyA/aG1yPWZhbHNl66GcIOyXsCDtjpjsnbTsp4DripQgSE1SIOybueyGjOy8k+unjCDrgYrslrQg7IOI66Gc6rOg7Lmo65CY7KeAIOyViuqyjCDtlZzri6QuXG4gICAgICAgICAgY29uc3QgeyBITVJfT1BUX09VVF9TQ1JJUFQsIGlzSG1yRGlzYWJsZWRCeVF1ZXJ5IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zc3IvaG1yLW9wdC1vdXRcIik7XG4gICAgICAgICAgaWYgKGlzSG1yRGlzYWJsZWRCeVF1ZXJ5KHVybCkpIHtcbiAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUucmVwbGFjZShcIjxoZWFkPlwiLCBgPGhlYWQ+XFxuJHtITVJfT1BUX09VVF9TQ1JJUFR9YCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVwbHkudHlwZShcInRleHQvaHRtbFwiKTtcbiAgICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aGlzLnZpdGVTZXJ2ZXIuc3NyRml4U3RhY2t0cmFjZShcbiAgICAgICAgICAgIC8qIFNBRkVUWTogQVBJIOuNsOy9lOugiOydtO2EsOyZgCBab2Qg6rKA7Kad6riwIOuTseuhnSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBlIGFzIEVycm9yLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICByZXBseS5zdGF0dXMoNTAwKTtcbiAgICAgICAgICByZXR1cm4gLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgICAgIGUgYXMgRXJyb3JcbiAgICAgICAgICApLm1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyDshJzrsoQg7KKF66OMIOyLnCBWaXRl64+EIOyiheujjFxuICAgIHNlcnZlci5hZGRIb29rKFwib25DbG9zZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLnZpdGVTZXJ2ZXIuY2xvc2UoKTtcbiAgICB9KTtcblxuICAgIGlmIChcInBvcnRcIiBpbiBobXIpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay5kaW0oXG4gICAgICAgICAgYOKckyBWaXRlIEhNUiB1c2luZyBkZWRpY2F0ZWQgd2Vic29ja2V0IHBvcnQgJHtobXIucG9ydH0gdG8gYXZvaWQgRmFzdGlmeSB3ZWJzb2NrZXQgY29uZmxpY3RzYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShcIuKckyBWaXRlIGRldiBzZXJ2ZXIgaW50ZWdyYXRlZFwiKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNldHVwU3RhdGljV2ViU2VydmVyKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIGdsb2JhbENvbXByZXNzT3B0aW9uczogQ29tcHJlc3NPcHRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDqsr3roZwg66qF7ZmV7ZmUOiBhcGkvd2ViLWRpc3QvY2xpZW50ICjsoJXsoIEg7YyM7J28KSwgYXBpL3dlYi1kaXN0L3NlcnZlciAoU1NSIGVudHJ5KSwgYXBpL2Rpc3Qvc3NyIChTU1Igcm91dGVzIC0gQVBJIOyGjOycoClcbiAgICBjb25zdCB3ZWJEaXN0UGF0aCA9IHBhdGguam9pbih0aGlzLmFwaVJvb3RQYXRoLCBcIndlYi1kaXN0XCIsIFwiY2xpZW50XCIpO1xuICAgIGNvbnN0IHNzclBhdGggPSBwYXRoLmpvaW4odGhpcy5hcGlSb290UGF0aCwgXCJ3ZWItZGlzdFwiLCBcInNlcnZlclwiKTtcbiAgICBjb25zdCBzc3JFbnRyeVBhdGggPSBwYXRoLmpvaW4oc3NyUGF0aCwgXCJlbnRyeS1zZXJ2ZXIuZ2VuZXJhdGVkLmpzXCIpO1xuICAgIGNvbnN0IHNzclJvdXRlc1BhdGggPSBwYXRoLmpvaW4odGhpcy5hcGlSb290UGF0aCwgXCJkaXN0XCIsIFwic3NyXCIsIFwicm91dGVzLmpzXCIpO1xuXG4gICAgaWYgKCEoYXdhaXQgZXhpc3RzKHdlYkRpc3RQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2Fybihg4pqgIFdlYiBkaXN0IG5vdCBmb3VuZDogJHt3ZWJEaXN0UGF0aH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTU1IgZW50cnkg7KG07J6sIOyXrOu2gCDtmZXsnbhcbiAgICBjb25zdCBzc3JBdmFpbGFibGUgPSBhd2FpdCBleGlzdHMoc3NyRW50cnlQYXRoKTtcblxuICAgIGlmICghc3NyQXZhaWxhYmxlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYOKaoCBTU1IgZW50cnkgbm90IGZvdW5kOiAke3NzckVudHJ5UGF0aH1gKTtcbiAgICAgIGNvbnNvbGUud2FybihcIiAgU1NSIHdpbGwgYmUgZGlzYWJsZWQuIE9ubHkgQ1NSIHdpbGwgd29yay5cIik7XG4gICAgfVxuXG4gICAgLy8gU1NSIOudvOyasO2KuCDroZzrk5wgKHByb2R1Y3Rpb27sl5DshJzrp4wsIOyCrOyaqeyekCDtlITroZzsoJ3tirjsnZggc3NyL3JvdXRlcy50cylcbiAgICBpZiAoc3NyQXZhaWxhYmxlKSB7XG4gICAgICBpZiAoYXdhaXQgZXhpc3RzKHNzclJvdXRlc1BhdGgpKSB7XG4gICAgICAgIC8vIHRzLWxvYWRlcuudvOuptCBcImZpbGU6Ly9cIuuhnCDsi5zsnpHtlZjripQgZnVsbHktcmVzb2x2ZWQgcGF0aOunjCDrsJvquLDsl5Ag7J2066W8IOyymOumrO2VtOyjvOuKlCBpbXBvcnRNZW1iZXJz66W8IOyCrOyaqe2VtOyVvCDtlojqsqDsp4Drp4wsXG4gICAgICAgIC8vIOyXrOq4sOuKlCDtlITroZzrjZXshZgg7ZmY6rK97JeQ7IScIGxvYWRlciDsl4bsnbQg64+M7JWE6rCA6riwIOuVjOusuOyXkCBcIuynhOynnCBqcyDtjIzsnbxcIuydmCBcIuq3uOuDpVwiIOygiOuMgOqyveuhnOulvCDrsJTroZwgaW1wb3J07ZW064+EIOuQqeuLiOuLpC5cbiAgICAgICAgLy8g7J20IOuCtOyaqeydgCDsnbQg7ZWo7IiYIOuCtOyXkOyEnCDslYTrnpjsl5Ag64KY7JisIOuLpOuluCBpbXBvcnQg7Zi47Lac7JeQ64+EIOuPmeydvO2VmOqyjCDsoIHsmqnrkKnri4jri6QuXG4gICAgICAgIGF3YWl0IGltcG9ydChzc3JSb3V0ZXNQYXRoKTtcbiAgICAgICAgY29uc29sZS5sb2coXCLinJMgU1NSIHJvdXRlcyBsb2FkZWRcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYOKaoCBTU1Igcm91dGVzIG5vdCBmb3VuZDogJHtzc3JSb3V0ZXNQYXRofWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOuhpOungSDsl4XrjbDsnbTtirgg64yA7J2ROiBhc3NldCBoYXNoIOu2iOydvOy5mCDsi5wg7ZiE7J6sIOuyhOyghCDsp4HsoJEg7ISc67mZXG4gICAgc2VydmVyLmdldChcIi9hc3NldHMvOmZpbGVuYW1lXCIsIGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdGVkRmlsZSA9XG4gICAgICAgIC8qIFNBRkVUWTogQVBJIOuNsOy9lOugiOydtO2EsOyZgCBab2Qg6rKA7Kad6riwIOuTseuhnSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgcmVxdWVzdC5wYXJhbXMgYXMgeyBmaWxlbmFtZTogc3RyaW5nIH1cbiAgICAgICAgKS5maWxlbmFtZTtcbiAgICAgIGNvbnN0IGFzc2V0c0RpciA9IHBhdGguam9pbih3ZWJEaXN0UGF0aCwgXCJhc3NldHNcIik7XG4gICAgICBjb25zdCBzYWZlRmlsZVBhdGggPSB0aGlzLnJlc29sdmVQYXRoV2l0aGluQmFzZURpcihhc3NldHNEaXIsIHJlcXVlc3RlZEZpbGUpO1xuICAgICAgaWYgKHNhZmVGaWxlUGF0aCA9PT0gbnVsbCkge1xuICAgICAgICByZXBseS5zdGF0dXMoNDAzKS5zZW5kKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlID0gcGF0aC5yZWxhdGl2ZShhc3NldHNEaXIsIHNhZmVGaWxlUGF0aCkucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XG5cbiAgICAgIGNvbnN0IGFzc2V0UGF0aCA9IGAvYXNzZXRzLyR7bm9ybWFsaXplZFJlcXVlc3RlZEZpbGV9YDtcblxuICAgICAgLy8gQ2FjaGUtQ29udHJvbCDtl6TrjZQg6rKw7KCVXG4gICAgICBjb25zdCBnZXRDYWNoZUNvbnRyb2xGb3JBc3NldCA9ICgpOiBDYWNoZUNvbnRyb2xDb25maWcgPT4ge1xuICAgICAgICBjb25zdCBjYWNoZVJlcTogQ2FjaGVDb250cm9sUmVxdWVzdCA9IHtcbiAgICAgICAgICB0eXBlOiBcImFzc2V0c1wiLFxuICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgICAgcGF0aDogYXNzZXRQYXRoLFxuICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8g7IKs7Jqp7J6QIOygleydmCDtlbjrk6Trn6wg7Jqw7ISgXG4gICAgICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcikge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKGNhY2hlUmVxKTtcbiAgICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g6riw67O46rCSOiBpbW11dGFibGVcbiAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5pbW11dGFibGU7XG4gICAgICB9O1xuXG4gICAgICAvLyBpbmRleC0qLmpzIOuYkOuKlCBpbmRleC0qLmNzcyDsmpTssq3snbgg6rK97JqwXG4gICAgICBpZiAoL15pbmRleC1bYS1mMC05XStcXC4oanN8Y3NzKSQvLnRlc3Qobm9ybWFsaXplZFJlcXVlc3RlZEZpbGUpKSB7XG4gICAgICAgIGNvbnN0IGV4dCA9IG5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlLnNwbGl0KFwiLlwiKS5wb3AoKTtcbiAgICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGFzc2V0c0Rpcik7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRGaWxlID0gZmlsZXMuZmluZCgoZikgPT4gZi5zdGFydHNXaXRoKFwiaW5kZXgtXCIpICYmIGYuZW5kc1dpdGgoYC4ke2V4dH1gKSk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRGaWxlKSB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oYXNzZXRzRGlyLCBjdXJyZW50RmlsZSk7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgICByZXBseS50eXBlKGV4dCA9PT0gXCJqc1wiID8gXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0XCIgOiBcInRleHQvY3NzXCIpO1xuICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBnZXRDYWNoZUNvbnRyb2xGb3JBc3NldCgpKTtcbiAgICAgICAgICByZXR1cm4gcmVwbHkuc2VuZChjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDsnbzrsJgg7YyM7J28IOyEnOu5mVxuICAgICAgY29uc3QgZmlsZVBhdGggPSBzYWZlRmlsZVBhdGg7XG4gICAgICBpZiAoYXdhaXQgZXhpc3RzKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpO1xuICAgICAgICBjb25zdCBleHQgPSBub3JtYWxpemVkUmVxdWVzdGVkRmlsZS5zcGxpdChcIi5cIikucG9wKCk7XG4gICAgICAgIHJlcGx5LnR5cGUoZXh0ID09PSBcImpzXCIgPyBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIiA6IGV4dCA9PT0gXCJjc3NcIiA/IFwidGV4dC9jc3NcIiA6IFwiXCIpO1xuICAgICAgICBpZiAobm9ybWFsaXplZFJlcXVlc3RlZEZpbGUuaW5jbHVkZXMoXCItXCIpKSB7XG4gICAgICAgICAgYXBwbHlDYWNoZUhlYWRlcnMocmVwbHksIGdldENhY2hlQ29udHJvbEZvckFzc2V0KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXBseS5zZW5kKGNvbnRlbnQpO1xuICAgICAgfVxuXG4gICAgICByZXBseS5zdGF0dXMoNDA0KS5zZW5kKCk7XG4gICAgfSk7XG5cbiAgICAvLyBTU1Ig65287Jqw7Yq4IOqwnOuzhCDrk7HroZ0gKGNvbXByZXNzIOyYteyFmOydtCDrnbzsmrDtirjrs4TroZwg7KCB7Jqp65CY64+E66GdKVxuICAgIGlmIChzc3JBdmFpbGFibGUpIHtcbiAgICAgIGNvbnN0IHsgZ2V0U1NSUm91dGVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zc3JcIik7XG4gICAgICBjb25zdCB7IHJlbmRlclNTUiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3NyL3JlbmRlcmVyXCIpO1xuICAgICAgY29uc3Qgc3NyUm91dGVzID0gZ2V0U1NSUm91dGVzKCk7XG5cbiAgICAgIGZvciAoY29uc3Qgcm91dGUgb2Ygc3NyUm91dGVzKSB7XG4gICAgICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCJdLFxuICAgICAgICAgIHVybDogcm91dGUucGF0aCxcbiAgICAgICAgICBjb21wcmVzczogdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24ocm91dGUuY29tcHJlc3MgPz8gdHJ1ZSwgZ2xvYmFsQ29tcHJlc3NPcHRpb25zKSxcbiAgICAgICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHJlcXVlc3QudXJsO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFtTU1JdIE1hdGNoZWQgcm91dGU6ICR7cm91dGUucGF0aH1gKTtcblxuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gdGhpcy5leHRyYWN0UGF0aFBhcmFtcyhyb3V0ZS5wYXRoLCB1cmwpO1xuICAgICAgICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHJlbmRlclNTUih1cmwsIHJvdXRlLCBwYXJhbXMsIHJlcXVlc3QsIHJlcGx5LCBjb25maWcpO1xuXG4gICAgICAgICAgICByZXBseS50eXBlKFwidGV4dC9odG1sXCIpO1xuICAgICAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ1NSIG9yIFN0YXRpYyBGaWxlIEZhbGxiYWNrIChTU1Ig65287Jqw7Yq47JeQIOunpOy5reuQmOyngCDslYrripQg66qo65OgIOyalOyyrSlcbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCJdLFxuICAgICAgdXJsOiBcIipcIixcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICAvLyAvYXBpLCAvc29uYW11LXVp64qUIDQwNCDqt7jrjIDroZxcbiAgICAgICAgaWYgKHJlcXVlc3QudXJsLnN0YXJ0c1dpdGgoXCIvYXBpXCIpIHx8IHJlcXVlc3QudXJsLnN0YXJ0c1dpdGgoXCIvc29uYW11LXVpXCIpKSB7XG4gICAgICAgICAgcmVwbHkuc3RhdHVzKDQwNCkuc2VuZCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENTUuyaqSBDYWNoZS1Db250cm9sIO2XpOuNlCDshKTsoJVcbiAgICAgICAgaWYgKGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKSB7XG4gICAgICAgICAgY29uc3QgY3NyQ2FjaGVSZXE6IENhY2hlQ29udHJvbFJlcXVlc3QgPSB7XG4gICAgICAgICAgICB0eXBlOiBcImNzclwiLFxuICAgICAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgICAgIHBhdGg6IHJlcXVlc3QudXJsLnNwbGl0KFwiP1wiKVswXSxcbiAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBjc3JDYWNoZUNvbmZpZyA9IGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKGNzckNhY2hlUmVxKTtcblxuICAgICAgICAgIGlmIChjc3JDYWNoZUNvbmZpZykge1xuICAgICAgICAgICAgYXBwbHlDYWNoZUhlYWRlcnMocmVwbHksIGNzckNhY2hlQ29uZmlnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDsoJXsoIEg7YyM7J287J20IOyhtOyerO2VoCDqsr3smrAsIOygleyggSDtjIzsnbzsnYQg66i87KCAIOyEnOu5me2VtOyVvO2VqFxuICAgICAgICBjb25zdCByZXF1ZXN0UGF0aCA9IHRoaXMuZ2V0UGF0aG5hbWVGcm9tVXJsKHJlcXVlc3QudXJsKTtcbiAgICAgICAgY29uc3Qgc2FmZUZpbGVQYXRoID0gdGhpcy5yZXNvbHZlUGF0aFdpdGhpbkJhc2VEaXIod2ViRGlzdFBhdGgsIHJlcXVlc3RQYXRoKTtcbiAgICAgICAgaWYgKHNhZmVGaWxlUGF0aCA9PT0gbnVsbCkge1xuICAgICAgICAgIHJlcGx5LnN0YXR1cyg0MDMpLnNlbmQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF3YWl0IGZpbGVFeGlzdHMoc2FmZUZpbGVQYXRoKSkge1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShzYWZlRmlsZVBhdGgpO1xuICAgICAgICAgIHJldHVybiByZXBseS50eXBlKG1pbWVMb29rdXAoc2FmZUZpbGVQYXRoKSB8fCBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiKS5zZW5kKGNvbnRlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ1NSIGZhbGxiYWNrOiBpbmRleC5odG1sIOyEnOu5mVxuICAgICAgICBjb25zdCBpbmRleFBhdGggPSBwYXRoLmpvaW4od2ViRGlzdFBhdGgsIFwiaW5kZXguaHRtbFwiKTtcbiAgICAgICAgcmV0dXJuIHJlcGx5LnR5cGUoXCJ0ZXh0L2h0bWxcIikuc2VuZChhd2FpdCBmcy5yZWFkRmlsZShpbmRleFBhdGgsIFwidXRmLThcIikpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKGDinJMgU3RhdGljIHdlYiBzZXJ2ZXIgY29uZmlndXJlZCB3aXRoICR7c3NyQXZhaWxhYmxlID8gXCJTU1JcIiA6IFwiQ1NSIG9ubHlcIn0gc3VwcG9ydGApO1xuICB9XG5cbiAgY3JlYXRlQXBpSGFuZGxlcihcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICBtb2RlbHM6IExvYWRlZE1vZGVscyA9IHRoaXMuc3luY2VyLm1vZGVscyxcbiAgICBkZXBlbmRlbmNpZXM6IFNvbmFtdUh0dHBWYWxpZGF0b3JEZXBlbmRlbmNpZXMgPSBkZWZhdWx0U29uYW11SHR0cFZhbGlkYXRvckRlcGVuZGVuY2llcyxcbiAgKTogKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KSA9PiBQcm9taXNlPEFwaU1ldGhvZFJlc3VsdD4ge1xuICAgIGNvbnN0IHByZXBhcmVkVmFsaWRhdG9yID0gdGhpcy5nZXRPckNyZWF0ZUh0dHBWYWxpZGF0b3IoYXBpLCBkZXBlbmRlbmNpZXMpO1xuXG4gICAgcmV0dXJuIGFzeW5jIChyZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSk6IFByb21pc2U8QXBpTWV0aG9kUmVzdWx0PiA9PiB7XG4gICAgICBjb25zdCB2YWxpZGF0b3IgPVxuICAgICAgICBwcmVwYXJlZFZhbGlkYXRvciBpbnN0YW5jZW9mIFByb21pc2UgPyBhd2FpdCBwcmVwYXJlZFZhbGlkYXRvciA6IHByZXBhcmVkVmFsaWRhdG9yO1xuICAgICAgLy8gQ29udGV4dCDsg53shLFcbiAgICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSBhd2FpdCB0aGlzLmNyZWF0ZUNvbnRleHQoY29uZmlnLCByZXF1ZXN0LCByZXBseSk7XG5cbiAgICAgIHJldHVybiB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBndWFyZHMg7LKY66asXG4gICAgICAgIHJ1bkd1YXJkcyh7XG4gICAgICAgICAgZ3VhcmRzOiBhcGkub3B0aW9ucy5ndWFyZHMsXG4gICAgICAgICAgY29uZmlnLFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgYXBpLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyByZXF1ZXN0IO2MjOyLsVxuICAgICAgICBjb25zdCB3aGljaCA9IGFwaS5vcHRpb25zLmh0dHBNZXRob2QgPT09IFwiR0VUXCIgPyBcInF1ZXJ5XCIgOiBcImJvZHlcIjtcbiAgICAgICAgbGV0IHJlcUJvZHkgPSBuZXcgTWFwPHN0cmluZywgQXBpQXJndW1lbnQ+KCk7XG4gICAgICAgIC8vIO2MjOydvCDsl4XroZzrk5wg7J6I64qUIOqyveyasCDsnoTsi5wg642w7J207YSwXG4gICAgICAgIGNvbnN0IGZpbGVzOiBVcGxvYWRlZFJlcXVlc3RGaWxlcyA9IHtcbiAgICAgICAgICBidWZmZXJlZEZpbGVzOiBbXSxcbiAgICAgICAgICB1cGxvYWRlZEZpbGVzOiBbXSxcbiAgICAgICAgfTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSByZXF1ZXN0W3doaWNoXSA/PyB7fTtcbiAgICAgICAgICBpZiAoYXBpLnVwbG9hZE9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gcmVxdWVzdC5wYXJ0cyh7XG4gICAgICAgICAgICAgIGxpbWl0czogYXBpLnVwbG9hZE9wdGlvbnMubGltaXRzLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIEZvcm1EYXRh7J2YIGZpZWxk65Ok7J2EIOyehOyLnOuhnCDsoIDsnqVcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgICAgICAgICBpZiAoYXBpLnVwbG9hZE9wdGlvbnMuY29uc3VtZSA9PT0gXCJidWZmZXJcIiB8fCAhYXBpLnVwbG9hZE9wdGlvbnMuY29uc3VtZSkge1xuICAgICAgICAgICAgICAvLyBCdWZmZXIg66qo65OcOiDrqZTrqqjrpqzsl5Ag66Gc65OcXG4gICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09IFwiZmlsZVwiKSB7XG4gICAgICAgICAgICAgICAgICAvLyBDUklUSUNBTDog7YyM7J28IOyKpO2KuOumvOydhCDsponsi5wgY29uc3VtZe2VtOyVvCDri6TsnYwgcGFydOuhnCDrhJjslrTqsIgg7IiYIOyeiOydjFxuICAgICAgICAgICAgICAgICAgLy8g7J20IO2YuOy2nOydtCDsl4bsnLzrqbQg7KKF7KKFIG11bHRpcGFydCDtjIzsi7HsnbQgcGVuZGluZyDsg4Htg5zroZwg7YOA7J6E7JWE7JuDIOuwnOyDnVxuICAgICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgcGFydC50b0J1ZmZlcigpO1xuICAgICAgICAgICAgICAgICAgZmlsZXMuYnVmZmVyZWRGaWxlcy5wdXNoKG5ldyBCdWZmZXJlZEZpbGUocGFydCwgYnVmZmVyKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09IFwiZmllbGRcIikge1xuICAgICAgICAgICAgICAgICAgZmllbGRzW3BhcnQuZmllbGRuYW1lXSA9IFN0cmluZyhwYXJ0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYXBpLnVwbG9hZE9wdGlvbnMuY29uc3VtZSA9PT0gXCJzdHJlYW1cIikge1xuICAgICAgICAgICAgICAvLyBTdHJlYW0g66qo65OcOiDsponsi5wg7KCA7J6l7IaM66GcIOyKpO2KuOumrOuwjVxuICAgICAgICAgICAgICBjb25zdCBkaXNrTmFtZSA9IGFwaS51cGxvYWRPcHRpb25zLmRlc3RpbmF0aW9uO1xuICAgICAgICAgICAgICBjb25zdCBkaXNrID0gdGhpcy5zdG9yYWdlLnVzZShkaXNrTmFtZSk7XG5cbiAgICAgICAgICAgICAgLy8g7Jqw7ISg7Iic7JyEOiDrjbDsvZTroIjsnbTthLAgPiDsoITsl60g7ISk7KCVID4g6riw67O46rCSXG4gICAgICAgICAgICAgIGNvbnN0IGtleUdlbmVyYXRvcjogS2V5R2VuZXJhdG9yID1cbiAgICAgICAgICAgICAgICBhcGkudXBsb2FkT3B0aW9ucy5rZXlHZW5lcmF0b3IgPz9cbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXJ2ZXIuc3RvcmFnZT8ua2V5R2VuZXJhdG9yID8/XG4gICAgICAgICAgICAgICAgZGVmYXVsdEtleUdlbmVyYXRvcjtcblxuICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFydC50eXBlID09PSBcImZpbGVcIikge1xuICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQga2V5R2VuZXJhdG9yKHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IHBhcnQuZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1pbWV0eXBlOiBwYXJ0Lm1pbWV0eXBlLFxuICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgIGF3YWl0IGRpc2sucHV0U3RyZWFtKGtleSwgcGFydC5maWxlLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBwYXJ0Lm1pbWV0eXBlLFxuICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IGRpc2suZ2V0VXJsKGtleSk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzaWduZWRVcmwgPSBhd2FpdCBkaXNrLmdldFNpZ25lZFVybChrZXkpO1xuXG4gICAgICAgICAgICAgICAgICBmaWxlcy51cGxvYWRlZEZpbGVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIG5ldyBVcGxvYWRlZEZpbGUoe1xuICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBwYXJ0LmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIG1pbWV0eXBlOiBwYXJ0Lm1pbWV0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgIHNpemU6IHBhcnQuZmlsZS5ieXRlc1JlYWQsXG4gICAgICAgICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZFVybCxcbiAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgZGlza05hbWUsXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQudHlwZSA9PT0gXCJmaWVsZFwiKSB7XG4gICAgICAgICAgICAgICAgICBmaWVsZHNbcGFydC5maWVsZG5hbWVdID0gU3RyaW5nKHBhcnQudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBxc+uhnCDspJHssqkg6rWs7KGwIO2MjOyLsTogcGFyYW1zW2NhdGVnb3J5XSDihpIgeyBwYXJhbXM6IHsgY2F0ZWdvcnk6IFwidGVzdFwiIH0gfVxuICAgICAgICAgICAgY29uc3QgcXMgPSBhd2FpdCBpbXBvcnQoXCJxc1wiKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHFzLmRlZmF1bHQucGFyc2UoZmllbGRzKTtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oYm9keSwgcGFyc2VkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXFCb2R5ID0gdG9BcGlBcmd1bWVudE1hcCh2YWxpZGF0b3IucGFyc2UoYm9keSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc3QgeyBab2RFcnJvciB9ID0gYXdhaXQgaW1wb3J0KFwiem9kXCIpO1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgWm9kRXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgaHVtYW5pemVab2RFcnJvciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvem9kLWVycm9yXCIpO1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZXMgPSBodW1hbml6ZVpvZEVycm9yKGUpXG4gICAgICAgICAgICAgIC5tYXAoKGlzc3VlKSA9PiBpc3N1ZS5tZXNzYWdlKVxuICAgICAgICAgICAgICAuam9pbihcIiBcIik7XG4gICAgICAgICAgICBjb25zdCB7IEJhZFJlcXVlc3RFeGNlcHRpb24gfSA9IGF3YWl0IGltcG9ydChcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICAgICAgICAvKiBTQUZFVFk6IEFQSSDrjbDsvZTroIjsnbTthLDsmYAgWm9kIOqygOymneq4sCDrk7HroZ0g6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gbWVzc2FnZXMgYXMgTG9jYWxpemVkU3RyaW5nLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgem9kRXJyb3I6IGUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnRlbnQtVHlwZVxuICAgICAgICByZXBseS50eXBlKGFwaS5vcHRpb25zLmNvbnRlbnRUeXBlID8/IFwiYXBwbGljYXRpb24vanNvblwiKTtcblxuICAgICAgICAvLyBDYWNoZS1Db250cm9sIO2XpOuNlCDshKTsoJVcbiAgICAgICAgY29uc3QgYXBpQ2FjaGVDb25maWcgPSB0aGlzLmdldEFwaUNhY2hlQ29udHJvbChhcGksIHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICAgIGlmIChhcGlDYWNoZUNvbmZpZykge1xuICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBhcGlDYWNoZUNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDsl4XroZzrk5wg7Ji17IWY7J20IOyeiOuKlCDqsr3smrAg7YyM7J28IOuNsOydtO2EsOulvCBDb250ZXh07JeQIOy2lOqwgFxuICAgICAgICBpZiAoYXBpLnVwbG9hZE9wdGlvbnMpIHtcbiAgICAgICAgICBjb25zdCBjb25zdW1lID0gYXBpLnVwbG9hZE9wdGlvbnMuY29uc3VtZSA/PyBcImJ1ZmZlclwiO1xuICAgICAgICAgIGlmIChjb25zdW1lID09PSBcImJ1ZmZlclwiKSB7XG4gICAgICAgICAgICBjb250ZXh0LmJ1ZmZlcmVkRmlsZXMgPSBmaWxlcy5idWZmZXJlZEZpbGVzO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29uc3VtZSA9PT0gXCJzdHJlYW1cIikge1xuICAgICAgICAgICAgY29udGV4dC51cGxvYWRlZEZpbGVzID0gZmlsZXMudXBsb2FkZWRGaWxlcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDrqqjrjbgg66mU7IaM65OcIGFyZ3Mg7IOd7ISx7ZWY7JesIO2YuOy2nFxuICAgICAgICBjb25zdCB7IEFwaVBhcmFtVHlwZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIik7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBhcGkucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgICAgLy8gQ29udGV4dCDsnbjsoJ3shZhcbiAgICAgICAgICBpZiAoQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXFCb2R5LmdldChwYXJhbS5uYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmludm9rZU1vZGVsTWV0aG9kKGFwaSwgYXJncywgcmVwbHksIG1vZGVscyk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPckNyZWF0ZUh0dHBWYWxpZGF0b3IoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICBkZXBlbmRlbmNpZXM6IFNvbmFtdUh0dHBWYWxpZGF0b3JEZXBlbmRlbmNpZXMsXG4gICk6IEh0dHBWYWxpZGF0b3IgfCBQcm9taXNlPEh0dHBWYWxpZGF0b3I+IHtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLmh0dHBWYWxpZGF0b3JzLmdldChhcGkpO1xuICAgIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnBlbmRpbmdIdHRwVmFsaWRhdG9ycy5nZXQoYXBpKTtcbiAgICBpZiAoZXhpc3RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH1cbiAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5idWlsZEh0dHBWYWxpZGF0b3IoYXBpLCBkZXBlbmRlbmNpZXMpO1xuICAgIHRoaXMucGVuZGluZ0h0dHBWYWxpZGF0b3JzLnNldChhcGksIHBlbmRpbmcpO1xuICAgIHZvaWQgcGVuZGluZy50aGVuKFxuICAgICAgKHZhbGlkYXRvcikgPT4ge1xuICAgICAgICB0aGlzLmh0dHBWYWxpZGF0b3JzLnNldChhcGksIHZhbGlkYXRvcik7XG4gICAgICAgIHRoaXMucGVuZGluZ0h0dHBWYWxpZGF0b3JzLmRlbGV0ZShhcGkpO1xuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5wZW5kaW5nSHR0cFZhbGlkYXRvcnMuZGVsZXRlKGFwaSk7XG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIHBlbmRpbmc7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkSHR0cFZhbGlkYXRvcihcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIGRlcGVuZGVuY2llczogU29uYW11SHR0cFZhbGlkYXRvckRlcGVuZGVuY2llcyxcbiAgKTogUHJvbWlzZTxIdHRwVmFsaWRhdG9yPiB7XG4gICAgY29uc3QgcG9saWN5ID0gbm9ybWFsaXplWm9kQ29tcGlsZXJQb2xpY3kodGhpcy5jb25maWcudmFsaWRhdGlvbj8uem9kQ29tcGlsZXIpO1xuICAgIGNvbnN0IHNvdXJjZUFvdCA9IHByb2Nlc3MuZW52LkhPVCA9PT0gXCJ5ZXNcIiB8fCBwcm9jZXNzLmVudi5WSVRFU1QgPT09IFwidHJ1ZVwiO1xuICAgIGlmIChwb2xpY3kuYXBpID09PSBcImFvdFwiICYmICFzb3VyY2VBb3QpIHtcbiAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gdGhpcy5hb3RIdHRwVmFsaWRhdG9yUmVnaXN0cnkgPz8gKGF3YWl0IHRoaXMubG9hZEFvdEh0dHBWYWxpZGF0b3JSZWdpc3RyeSgpKTtcbiAgICAgIHJldHVybiB0aGlzLmdldEFvdEh0dHBWYWxpZGF0b3IoYXBpLCByZWdpc3RyeSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IGRlcGVuZGVuY2llcy5jcmVhdGVWYWxpZGF0b3Ioe1xuICAgICAgYXBpLFxuICAgICAgcG9saWN5LFxuICAgICAgdHlwZXM6IHRoaXMuc3luY2VyLnR5cGVzLFxuICAgICAgYWxsb3dBb3RTb3VyY2VGYWxsYmFjazogc291cmNlQW90LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBb3RIdHRwVmFsaWRhdG9yKGFwaTogRXh0ZW5kZWRBcGksIHJlZ2lzdHJ5OiBIdHRwVmFsaWRhdG9yUmVnaXN0cnkpOiBIdHRwVmFsaWRhdG9yIHtcbiAgICBjb25zdCByb3V0ZUtleSA9IGdldEh0dHBWYWxpZGF0b3JSb3V0ZUtleShhcGkpO1xuICAgIGNvbnN0IHZhbGlkYXRvciA9IHJlZ2lzdHJ5LnZhbGlkYXRvcnMuZ2V0KHJvdXRlS2V5KTtcbiAgICBpZiAodmFsaWRhdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCB2YWxpZGF0b3IgcmVnaXN0cnkgaXMgbWlzc2luZyAke3JvdXRlS2V5fWApO1xuICAgIH1cbiAgICByZXR1cm4gdmFsaWRhdG9yO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkQW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5KFxuICAgIGFwaXM6IHJlYWRvbmx5IEV4dGVuZGVkQXBpW10gPSB0aGlzLnN5bmNlci5hcGlzLFxuICAgIGRlcGVuZGVuY2llczogU29uYW11SHR0cFZhbGlkYXRvckRlcGVuZGVuY2llcyA9IGRlZmF1bHRTb25hbXVIdHRwVmFsaWRhdG9yRGVwZW5kZW5jaWVzLFxuICApOiBQcm9taXNlPEh0dHBWYWxpZGF0b3JSZWdpc3RyeT4ge1xuICAgIGNvbnN0IHsgcGF0aFRvRmlsZVVSTCB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTp1cmxcIik7XG4gICAgY29uc3QgcmVnaXN0cnlQYXRoID0gcGF0aC5qb2luKFxuICAgICAgdGhpcy5hcGlSb290UGF0aCxcbiAgICAgIFwiZGlzdC9hcHBsaWNhdGlvbi9zb25hbXUudmFsaWRhdG9ycy5nZW5lcmF0ZWQuanNcIixcbiAgICApO1xuICAgIGlmICghKGF3YWl0IGV4aXN0cyhyZWdpc3RyeVBhdGgpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBHZW5lcmF0ZWQgSFRUUCB2YWxpZGF0b3IgcmVnaXN0cnkgbm90IGZvdW5kOiAke3JlZ2lzdHJ5UGF0aH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbXBvcnRlZCA9XG4gICAgICAvKiBTQUZFVFk6IEFQSSDrjbDsvZTroIjsnbTthLDsmYAgWm9kIOqygOymneq4sCDrk7HroZ0g6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKGF3YWl0IGltcG9ydChcbiAgICAgICAgcGF0aFRvRmlsZVVSTChyZWdpc3RyeVBhdGgpLmhyZWZcbiAgICAgICkpIGFzIHtcbiAgICAgICAgZmluZ2VycHJpbnQ/OiB1bmtub3duO1xuICAgICAgICB2YWxpZGF0b3JzPzogdW5rbm93bjtcbiAgICAgIH07XG4gICAgaWYgKCFpc1N0cmluZ1ZhbHVlKGltcG9ydGVkLmZpbmdlcnByaW50KSB8fCAhKGltcG9ydGVkLnZhbGlkYXRvcnMgaW5zdGFuY2VvZiBNYXApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZ2VuZXJhdGVkIEhUVFAgdmFsaWRhdG9yIHJlZ2lzdHJ5OiAke3JlZ2lzdHJ5UGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxpZGF0b3JdIG9mIGltcG9ydGVkLnZhbGlkYXRvcnMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIWlzU3RyaW5nVmFsdWUoa2V5KSB8fFxuICAgICAgICAhaXNPYmplY3RWYWx1ZSh2YWxpZGF0b3IpIHx8XG4gICAgICAgIHZhbGlkYXRvciA9PT0gbnVsbCB8fFxuICAgICAgICAhKFwicGFyc2VcIiBpbiB2YWxpZGF0b3IpIHx8XG4gICAgICAgICFpc0Z1bmN0aW9uVmFsdWUodmFsaWRhdG9yLnBhcnNlKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBIVFRQIHZhbGlkYXRvciByZWdpc3RyeSBlbnRyeTogJHtTdHJpbmcoa2V5KX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZWdpc3RyeTogSHR0cFZhbGlkYXRvclJlZ2lzdHJ5ID0ge1xuICAgICAgZmluZ2VycHJpbnQ6IGltcG9ydGVkLmZpbmdlcnByaW50LFxuICAgICAgdmFsaWRhdG9yczogaW1wb3J0ZWQudmFsaWRhdG9ycyxcbiAgICB9O1xuICAgIGRlcGVuZGVuY2llcy5hc3NlcnRSZWdpc3RyeShhcGlzLCByZWdpc3RyeSk7XG4gICAgcmV0dXJuIHJlZ2lzdHJ5O1xuICB9XG5cbiAgYXN5bmMgcmVmcmVzaEh0dHBWYWxpZGF0b3JzKFxuICAgIGRlcGVuZGVuY2llczogU29uYW11SHR0cFZhbGlkYXRvckRlcGVuZGVuY2llcyA9IGRlZmF1bHRTb25hbXVIdHRwVmFsaWRhdG9yRGVwZW5kZW5jaWVzLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwb2xpY3kgPSBub3JtYWxpemVab2RDb21waWxlclBvbGljeSh0aGlzLmNvbmZpZy52YWxpZGF0aW9uPy56b2RDb21waWxlcik7XG4gICAgY29uc3Qgc291cmNlQW90ID0gcHJvY2Vzcy5lbnYuSE9UID09PSBcInllc1wiIHx8IHByb2Nlc3MuZW52LlZJVEVTVCA9PT0gXCJ0cnVlXCI7XG4gICAgY29uc3QgbmV4dEFwaXMgPSBbLi4udGhpcy5zeW5jZXIuYXBpc107XG4gICAgY29uc3QgbmV4dE1vZGVscyA9IHsgLi4udGhpcy5zeW5jZXIubW9kZWxzIH07XG4gICAgY29uc3QgcmVzdEFwaXMgPSBuZXh0QXBpcy5maWx0ZXIoKGFwaSkgPT4gYXBpLndlYnNvY2tldE9wdGlvbnMgPT09IHVuZGVmaW5lZCk7XG4gICAgY29uc3QgbmV4dCA9IG5ldyBXZWFrTWFwPEV4dGVuZGVkQXBpLCBIdHRwVmFsaWRhdG9yPigpO1xuICAgIGxldCBuZXh0QW90UmVnaXN0cnk6IEh0dHBWYWxpZGF0b3JSZWdpc3RyeSB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChwb2xpY3kuYXBpID09PSBcImFvdFwiICYmICFzb3VyY2VBb3QpIHtcbiAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gYXdhaXQgdGhpcy5sb2FkQW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5KG5leHRBcGlzLCBkZXBlbmRlbmNpZXMpO1xuICAgICAgZm9yIChjb25zdCBhcGkgb2YgcmVzdEFwaXMpIHtcbiAgICAgICAgbmV4dC5zZXQoYXBpLCB0aGlzLmdldEFvdEh0dHBWYWxpZGF0b3IoYXBpLCByZWdpc3RyeSkpO1xuICAgICAgfVxuICAgICAgbmV4dEFvdFJlZ2lzdHJ5ID0gcmVnaXN0cnk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICByZXN0QXBpcy5tYXAoYXN5bmMgKGFwaSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRvciA9IGF3YWl0IHRoaXMuYnVpbGRIdHRwVmFsaWRhdG9yKGFwaSwgZGVwZW5kZW5jaWVzKTtcbiAgICAgICAgICBuZXh0LnNldChhcGksIHZhbGlkYXRvcik7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyB2YWxpZGF0b3LsmYAg6rCZ7J2AIHJldmlzaW9u7J2YIEFQSS9tb2RlbCBzbmFwc2hvdOydhCDtlajqu5gg6rO16rCc7ZW0IEhNUiDspJHqsIQg7IOB7YOc66W8IOyIqOq5geuLiOuLpC5cbiAgICB0aGlzLmh0dHBWYWxpZGF0b3JzID0gbmV4dDtcbiAgICB0aGlzLnBlbmRpbmdIdHRwVmFsaWRhdG9ycyA9IG5ldyBXZWFrTWFwKCk7XG4gICAgdGhpcy5hb3RIdHRwVmFsaWRhdG9yUmVnaXN0cnkgPSBuZXh0QW90UmVnaXN0cnk7XG4gICAgdGhpcy5wcmVwYXJlZEFwaXMgPSBuZXh0QXBpcztcbiAgICB0aGlzLnByZXBhcmVkTW9kZWxzID0gbmV4dE1vZGVscztcblxuICAgIC8vIEB3ZWJzb2NrZXQgcm91dGXsnZggb3V0RXZlbnRz66W8IGFwaS5wYXRoIO2CpOuhnCByb3V0ZSB0YWJsZeyXkCDrsJjsmIHtlZzri6QuXG4gICAgLy8g67Cc7ZaJIOuFuOuTnOqwgCByb3V0ZeuzhOuhnCDtlZwg67KIIOyduOy9lOuUqe2VnCBmcmFtZeydhCDsm5Dqsqkg64W465Oc6rCAIOq3uOuMgOuhnCDrs7TrgrTrr4DroZwsIEhNUiDrkqTsl5Drj4Qg7LWc7IugIOyKpO2CpOuniOulvCDsjajslbwg7ZWc64ukXG4gICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lVmFsdWU/LnJlcGxhY2VSb3V0ZXMoXG4gICAgICBuZXh0QXBpcy5mbGF0TWFwKChhcGkpID0+XG4gICAgICAgIGFwaS53ZWJzb2NrZXRPcHRpb25zXG4gICAgICAgICAgPyBbeyByb3V0ZUtleTogYXBpLnBhdGgsIG91dEV2ZW50czogYXBpLndlYnNvY2tldE9wdGlvbnMub3V0RXZlbnRzIH1dXG4gICAgICAgICAgOiBbXSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIC8vIFdTIHBhdGjrpbwg7J2867CYIEhUVFAgR0VU7Jy866GcIO2YuOy2nO2VnCDqsr3smrAgNDI2ICsgVXBncmFkZSDtl6TrjZTroZwg66qF7Iuc7KCB7Jy866GcIHdlYnNvY2tldCDsoJHsho3snYQg7Jyg64+E7ZWoXG4gIHByaXZhdGUgY3JlYXRlV2ViU29ja2V0VXBncmFkZVJlcXVpcmVkSGFuZGxlcigpIHtcbiAgICByZXR1cm4gYXN5bmMgKF9yZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgcmVwbHkuaGVhZGVyKFwiY29ubmVjdGlvblwiLCBcIlVwZ3JhZGVcIikuaGVhZGVyKFwidXBncmFkZVwiLCBcIndlYnNvY2tldFwiKS5zdGF0dXMoNDI2KS5zZW5kKHtcbiAgICAgICAgbWVzc2FnZTogXCJXZWJTb2NrZXQgdXBncmFkZSByZXF1aXJlZFwiLFxuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIGRldiDrqqjrk5zsnZggY2F0Y2gtYWxsIHdzSGFuZGxlcuyXkOyEnCDsi6TsoJwgV1MgQVBJ66GcIOuUlOyKpO2MqOy5mO2VqC4g66ek7Lmt65CY64qUIHJvdXRl6rCAIOyXhuycvOuptCAxMDA466GcIOuLq+ydjFxuICBwcml2YXRlIGFzeW5jIGhhbmRsZURldldlYlNvY2tldFJlcXVlc3QoXG4gICAgc29ja2V0OiBXZWJTb2NrZXQsXG4gICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtYXRjaGVkQXBpID0gdGhpcy5maW5kTWF0Y2hlZEFwaShyZXF1ZXN0LCB0aGlzLnN5bmNlci5hcGlzLCB0aGlzLnN5bmNlci5tb2RlbHMpO1xuICAgIGlmICghbWF0Y2hlZEFwaT8ud2Vic29ja2V0T3B0aW9ucykge1xuICAgICAgY29uc3QgdHJhY2VDb250ZXh0ID0gdGhpcy53ZWJzb2NrZXRSdW50aW1lLnRlbGVtZXRyeUNvbnRyb2xsZXIuY3JlYXRlQ29ubmVjdGlvbkNvbnRleHQoe1xuICAgICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMsXG4gICAgICB9KTtcbiAgICAgIHRoaXMud2Vic29ja2V0UnVudGltZS50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICBuYW1lOiBcIndzLmNvbm5lY3Rpb24ucmVqZWN0ZWRcIixcbiAgICAgICAgbGV2ZWw6IFwid2FyblwiLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICByZWFzb246IFwicm91dGVOb3RGb3VuZFwiLFxuICAgICAgICAgIHBhdGg6IHJlcXVlc3QudXJsLFxuICAgICAgICB9LFxuICAgICAgICB0cmFjZUlkOiB0cmFjZUNvbnRleHQudHJhY2VJZCxcbiAgICAgICAgc3BhbklkOiB0cmFjZUNvbnRleHQuc3BhbklkLFxuICAgICAgICBwYXJlbnRTcGFuSWQ6IHRyYWNlQ29udGV4dC5wYXJlbnRTcGFuSWQsXG4gICAgICAgIHNhbXBsZWQ6IHRyYWNlQ29udGV4dC5zYW1wbGVkLFxuICAgICAgfSk7XG4gICAgICBzb2NrZXQuY2xvc2UoMTAwOCwgXCJXZWJTb2NrZXQgcm91dGUgbm90IGZvdW5kXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmNyZWF0ZVdlYlNvY2tldEhhbmRsZXIobWF0Y2hlZEFwaSwgY29uZmlnKTtcbiAgICBhd2FpdCBoYW5kbGVyKHNvY2tldCwgcmVxdWVzdCk7XG4gIH1cblxuICAvLyBXUyByb3V0ZSDtlbjrk6Trn6zsnZgg7Iuk7ZaJIOyInOyEnOulvCDqs6DsoJXtlag6XG4gIC8vIDEpIHF1ZXJ5IHBhcmFtIO2MjOyLseydhCBhY3RpdmF0aW9uIOyghOyXkCDrgZ3rgrQgaGFuZHNoYWtlIOyLpO2MqOqwgCByZWdpc3RyeeyXkCDrhbjstpzrkJjsp4Ag7JWK6rKMIO2VqFxuICAvLyAyKSBgYWN0aXZlOiBmYWxzZWDroZwg66i87KCAIOuTseuhne2VnCDrkqQgY29udGV4dCDslYjsl5DshJwgZ3VhcmTrpbwg7Iuk7ZaJ7ZW0IOyduOymnSDsoJXrs7Trpbwg7LC47KGw7ZWgIOyImCDsnojqsowg7ZWoXG4gIC8vIDMpIGNvbnRleHQvZ3VhcmQg7KSA67mE6rCAIOuBneuCnCDrkqQgYGFjdGl2YXRlKClg7ZW0IOu4jOuhnOuTnOy6kOyKpO2KuOqwgCDstIjquLDtmZQg7KSR6rCEIOyDge2DnOulvCDrs7Tsp4Ag66q77ZWY6rKMIO2VqFxuICAvLyDsl5Drn6wg67Cc7IOdIOyLnOyXkOuKlCByZXNvbHZlV2ViU29ja2V0Q2xvc2VEZXNjcmlwdG9yIOygleyxheyXkCDrlLDrnbwgY2xvc2UgY29kZeulvCDrp6TtlZHtlahcbiAgY3JlYXRlV2ViU29ja2V0SGFuZGxlckZvclRlc3RpbmcoYXBpOiBFeHRlbmRlZEFwaSwgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlV2ViU29ja2V0SGFuZGxlcihhcGksIGNvbmZpZyk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVdlYlNvY2tldEhhbmRsZXIoYXBpOiBFeHRlbmRlZEFwaSwgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnKSB7XG4gICAgLy8gQGZhc3RpZnkvd2Vic29ja2V0IDEx67aA7YSwIHdzSGFuZGxlcuuKlCBjb25uZWN0aW9uIOuemO2NvCDrjIDsi6Agd3MuV2ViU29ja2V07J2EIOyngeygkSDsoITri6ztlZzri6RcbiAgICByZXR1cm4gYXN5bmMgKHNvY2tldDogV2ViU29ja2V0LCByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgbGV0IHdzQ29udGV4dDogV2ViU29ja2V0Q29udGV4dDxvYmplY3QsIG9iamVjdD4gfCBudWxsID0gbnVsbDtcbiAgICAgIGxldCByYXdXczogQXdhaXRlZDxSZXR1cm5UeXBlPFdlYlNvY2tldFJ1bnRpbWVbXCJyZWdpc3RlckNvbm5lY3Rpb25cIl0+PiB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IHByZVJlZ2lzdGVyUGhhc2U6IFwiZ3VhcmRcIiB8IFwicXVlcnlcIiB8IFwicmVnaXN0ZXJcIiB8IFwiaGFuZGxlclwiID0gXCJndWFyZFwiO1xuICAgICAgbGV0IHRyYWNlQ29udGV4dDogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQgPSB7fTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdHJhY2VDb250ZXh0ID0gdGhpcy53ZWJzb2NrZXRSdW50aW1lLnRlbGVtZXRyeUNvbnRyb2xsZXIuY3JlYXRlQ29ubmVjdGlvbkNvbnRleHQoe1xuICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcHJlUmVnaXN0ZXJQaGFzZSA9IFwicXVlcnlcIjtcbiAgICAgICAgY29uc3QgcmVxQm9keSA9IGF3YWl0IHRoaXMucGFyc2VXZWJTb2NrZXRSZXF1ZXN0UGFyYW1zKGFwaSwgcmVxdWVzdCk7XG4gICAgICAgIHByZVJlZ2lzdGVyUGhhc2UgPSBcInJlZ2lzdGVyXCI7XG4gICAgICAgIC8vIOuTseuhnShzdG9yZSDrsJjsmIEg7Y+s7ZWoKeydtCDrgZ3rgpwg65Kk7JeQIGNvbnRleHQvZ3VhcmTrpbwg7KeE7ZaJ7ZWc64ukLiDrpqzsiqTrhIjripQg65Ox66GdIOykkeyXkOuPhCDrtpnslrQg7J6I7Ja0IGNsb3Nl66W8IOuGk+y5mOyngCDslYrripTri6RcbiAgICAgICAgcmF3V3MgPSBhd2FpdCB0aGlzLndlYnNvY2tldFJ1bnRpbWUucmVnaXN0ZXJDb25uZWN0aW9uKHNvY2tldCwge1xuICAgICAgICAgIHJvdXRlS2V5OiBhcGkucGF0aCxcbiAgICAgICAgICBvdXRFdmVudHM6IGFwaS53ZWJzb2NrZXRPcHRpb25zIS5vdXRFdmVudHMsXG4gICAgICAgICAgaW5FdmVudHM6IGFwaS53ZWJzb2NrZXRPcHRpb25zIS5pbkV2ZW50cyxcbiAgICAgICAgICBuYW1lc3BhY2U6IGFwaS53ZWJzb2NrZXRPcHRpb25zIS5uYW1lc3BhY2UsXG4gICAgICAgICAgaGVhcnRiZWF0OiBhcGkud2Vic29ja2V0T3B0aW9ucyEuaGVhcnRiZWF0LFxuICAgICAgICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgICAgICAgdHJhY2VJZDogdHJhY2VDb250ZXh0LnRyYWNlSWQsXG4gICAgICAgICAgc3BhbklkOiB0cmFjZUNvbnRleHQuc3BhbklkLFxuICAgICAgICAgIHBhcmVudFNwYW5JZDogdHJhY2VDb250ZXh0LnBhcmVudFNwYW5JZCxcbiAgICAgICAgICBzYW1wbGVkOiB0cmFjZUNvbnRleHQuc2FtcGxlZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc2NvcGVkV3MgPSB0aGlzLmNyZWF0ZVNjb3BlZFdlYlNvY2tldENvbm5lY3Rpb24ocmF3V3MsICgpID0+IHdzQ29udGV4dCk7XG4gICAgICAgIHdzQ29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlV2ViU29ja2V0Q29udGV4dChjb25maWcsIHJlcXVlc3QsIHNjb3BlZFdzKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQ6IHdzQ29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgcnVuR3VhcmRzKHtcbiAgICAgICAgICAgIGd1YXJkczogYXBpLm9wdGlvbnMuZ3VhcmRzLFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIGFwaSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8g7Zmc7ISx7ZmU6rCAIHN0b3Jl7JeQIOuwmOyYgeuQnCDrkqQgaGFuZGxlcuulvCDsi6TtlontlbQgaGFuZGxlciDslYjsnZggcHVibGlzaOqwgCDsnbQg7Jew6rKw7J2EIOuMgOyDgeycvOuhnCDsnqHqsowg7ZWc64ukXG4gICAgICAgIGF3YWl0IHRoaXMud2Vic29ja2V0UnVudGltZS5hY3RpdmF0ZUNvbm5lY3Rpb24ocmF3V3MuaWQpO1xuICAgICAgICBwcmVSZWdpc3RlclBoYXNlID0gXCJoYW5kbGVyXCI7XG5cbiAgICAgICAgY29uc3QgeyBBcGlQYXJhbVR5cGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpO1xuICAgICAgICBjb25zdCBhcmdzID0gYXBpLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICAgIGlmIChBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gd3NDb250ZXh0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByZXFCb2R5LmdldChwYXJhbS5uYW1lKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5ydW4oeyBjb250ZXh0OiB3c0NvbnRleHQgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHRoaXMuaW52b2tlTW9kZWxNZXRob2QoYXBpLCBhcmdzKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBjbG9zZURlc2NyaXB0b3IgPSByZXNvbHZlV2ViU29ja2V0Q2xvc2VEZXNjcmlwdG9yKGVycm9yKTtcbiAgICAgICAgaWYgKCFyYXdXcykge1xuICAgICAgICAgIHRoaXMud2Vic29ja2V0UnVudGltZS50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICAgICAgbmFtZTogXCJ3cy5jb25uZWN0aW9uLnJlamVjdGVkXCIsXG4gICAgICAgICAgICBsZXZlbDogY2xvc2VEZXNjcmlwdG9yLmxvZ0xldmVsID09PSBcIndhcm5cIiA/IFwid2FyblwiIDogXCJlcnJvclwiLFxuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgIHJlYXNvbjogcHJlUmVnaXN0ZXJQaGFzZSxcbiAgICAgICAgICAgICAgY29kZTogY2xvc2VEZXNjcmlwdG9yLmNvZGUsXG4gICAgICAgICAgICAgIHBhdGg6IGFwaS5wYXRoLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRyYWNlSWQ6IHRyYWNlQ29udGV4dC50cmFjZUlkLFxuICAgICAgICAgICAgc3BhbklkOiB0cmFjZUNvbnRleHQuc3BhbklkLFxuICAgICAgICAgICAgcGFyZW50U3BhbklkOiB0cmFjZUNvbnRleHQucGFyZW50U3BhbklkLFxuICAgICAgICAgICAgc2FtcGxlZDogdHJhY2VDb250ZXh0LnNhbXBsZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmF3V3MpIHtcbiAgICAgICAgICByYXdXcy5jbG9zZShjbG9zZURlc2NyaXB0b3IuY29kZSwgY2xvc2VEZXNjcmlwdG9yLnJlYXNvbik7XG4gICAgICAgIH0gZWxzZSBpZiAoc29ja2V0LnJlYWR5U3RhdGUgPCAyKSB7XG4gICAgICAgICAgc29ja2V0LmNsb3NlKGNsb3NlRGVzY3JpcHRvci5jb2RlLCBjbG9zZURlc2NyaXB0b3IucmVhc29uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlcnZlcj8ubG9nKSB7XG4gICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIGVycjogZXJyb3IsXG4gICAgICAgICAgICBtb2RlbE5hbWU6IGFwaS5tb2RlbE5hbWUsXG4gICAgICAgICAgICBtZXRob2ROYW1lOiBhcGkubWV0aG9kTmFtZSxcbiAgICAgICAgICAgIHBhdGg6IGFwaS5wYXRoLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGNsb3NlRGVzY3JpcHRvci5sb2dMZXZlbCA9PT0gXCJ3YXJuXCIpIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmVyLmxvZy53YXJuKHBheWxvYWQsIGNsb3NlRGVzY3JpcHRvci5yZWFzb24pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlcnZlci5sb2cuZXJyb3IocGF5bG9hZCwgY2xvc2VEZXNjcmlwdG9yLnJlYXNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChjbG9zZURlc2NyaXB0b3IubG9nTGV2ZWwgPT09IFwid2FyblwiKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oY2xvc2VEZXNjcmlwdG9yLnJlYXNvbiwgZXJyb3IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGNsb3NlRGVzY3JpcHRvci5yZWFzb24sIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gb25NZXNzYWdlL29uQ2xvc2Xsspjrn7wg64uk66W4IHRpY2vsl5DshJwg7Iuk7ZaJ65CY64qUIGNhbGxiYWNr7J2AIEFMUyBjb250ZXh06rCAIOuBiuq4sOuvgOuhnCB3cmFwcGVy7JeQ7IScIGBhc3luY0xvY2FsU3RvcmFnZS5ydW5g7Jy866GcIOuLpOyLnCDqsJDsi7gg67O17JuQ7ZWoXG4gIC8vIHB1Ymxpc2gvam9pbi9sZWF2ZS9zZXRVc2VySWQg6rCZ7J2AIOymieyLnCDsi6TtlokgQVBJ64qUIOuLqOyInCDsnITsnoTrp4wg7ZWY6rOgLCBkZWZlcnJlZCBjYWxsYmFja+yXkOunjCBjb250ZXh0IOuzteybkOydhCDsoIHsmqntlahcbiAgcHJpdmF0ZSBjcmVhdGVTY29wZWRXZWJTb2NrZXRDb25uZWN0aW9uPFRPdXQgZXh0ZW5kcyBvYmplY3QsIFRJbiBleHRlbmRzIG9iamVjdD4oXG4gICAgd3M6IFdlYlNvY2tldENvbm5lY3Rpb248VE91dCwgVEluPixcbiAgICBnZXRDb250ZXh0OiAoKSA9PiBXZWJTb2NrZXRDb250ZXh0IHwgbnVsbCxcbiAgKTogV2ViU29ja2V0Q29ubmVjdGlvbjxUT3V0LCBUSW4+IHtcbiAgICBjb25zdCB0ZWxlbWV0cnlDb250cm9sbGVyID0gdGhpcy53ZWJzb2NrZXRSdW50aW1lVmFsdWU/LnRlbGVtZXRyeUNvbnRyb2xsZXI7XG4gICAgY29uc3QgcnVuSW5Db250ZXh0ID0gPFQ+KGNhbGxiYWNrOiAoKSA9PiBUKTogVCA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpO1xuICAgICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5ydW4oeyBjb250ZXh0IH0sIGNhbGxiYWNrKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGdldCBpZCgpIHtcbiAgICAgICAgcmV0dXJuIHdzLmlkO1xuICAgICAgfSxcbiAgICAgIGdldCBuYW1lc3BhY2UoKSB7XG4gICAgICAgIHJldHVybiB3cy5uYW1lc3BhY2U7XG4gICAgICB9LFxuICAgICAgZ2V0IGNsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHdzLmNsb3NlZDtcbiAgICAgIH0sXG4gICAgICBnZXQgdXNlcklkKCkge1xuICAgICAgICByZXR1cm4gd3MudXNlcklkO1xuICAgICAgfSxcbiAgICAgIHRyYW5zcG9ydDogXCJ3c1wiLFxuICAgICAgcHVibGlzaFVudHlwZWQoZXZlbnQsIGRhdGEpIHtcbiAgICAgICAgd3MucHVibGlzaFVudHlwZWQoZXZlbnQsIGRhdGEpO1xuICAgICAgfSxcbiAgICAgIGNsb3NlKGNvZGUsIHJlYXNvbikge1xuICAgICAgICB3cy5jbG9zZShjb2RlLCByZWFzb24pO1xuICAgICAgfSxcbiAgICAgIG9uQ2xvc2UoY2FsbGJhY2spIHtcbiAgICAgICAgd3Mub25DbG9zZSgoKSA9PiBydW5JbkNvbnRleHQoY2FsbGJhY2spKTtcbiAgICAgIH0sXG4gICAgICBvbk1lc3NhZ2UoZXZlbnQsIGhhbmRsZXIpIHtcbiAgICAgICAgd3Mub25NZXNzYWdlKGV2ZW50LCAoZGF0YSwgbWVzc2FnZVRyYWNlQ29udGV4dCkgPT5cbiAgICAgICAgICBydW5JbkNvbnRleHQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0gU3RyaW5nKGV2ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IHRyYWNlQ29udGV4dCA9IG1lc3NhZ2VUcmFjZUNvbnRleHQgPz8gZ2V0V2ViU29ja2V0VGVsZW1ldHJ5Q29udGV4dCh3cyk7XG4gICAgICAgICAgICBjb25zdCBzdGFydGVkQXQgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICAgICAgICAgICAgdGVsZW1ldHJ5Q29udHJvbGxlcj8uZW1pdCh7XG4gICAgICAgICAgICAgIG5hbWU6IFwid3MuaGFuZGxlci5zdGFydGVkXCIsXG4gICAgICAgICAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICAgICAgICAgIGNvbm5lY3Rpb25JZDogd3MuaWQsXG4gICAgICAgICAgICAgIG5hbWVzcGFjZTogd3MubmFtZXNwYWNlLFxuICAgICAgICAgICAgICB1c2VySWQ6IHdzLnVzZXJJZCxcbiAgICAgICAgICAgICAgZGV0YWlsOiB7IGV2ZW50OiBldmVudE5hbWUgfSxcbiAgICAgICAgICAgICAgLi4udHJhY2VDb250ZXh0LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIoZGF0YSwgbWVzc2FnZVRyYWNlQ29udGV4dCk7XG4gICAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWRBdDtcbiAgICAgICAgICAgICAgdGVsZW1ldHJ5Q29udHJvbGxlcj8uZW1pdCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJ3cy5oYW5kbGVyLmNvbXBsZXRlZFwiLFxuICAgICAgICAgICAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbklkOiB3cy5pZCxcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IHdzLm5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgICB1c2VySWQ6IHdzLnVzZXJJZCxcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHsgZXZlbnQ6IGV2ZW50TmFtZSB9LFxuICAgICAgICAgICAgICAgIC4uLnRyYWNlQ29udGV4dCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRlbGVtZXRyeUNvbnRyb2xsZXI/LnJlY29yZFNwYW4oe1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IFwid3MubWVzc2FnZS5wcm9jZXNzXCIsXG4gICAgICAgICAgICAgICAga2luZDogXCJpbnRlcm5hbFwiLFxuICAgICAgICAgICAgICAgIGR1cmF0aW9uTXMsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBcInVuc2V0XCIsXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbklkOiB3cy5pZCxcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IHdzLm5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgICB1c2VySWQ6IHdzLnVzZXJJZCxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7IGV2ZW50OiBldmVudE5hbWUgfSxcbiAgICAgICAgICAgICAgICAuLi50cmFjZUNvbnRleHQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRlZEF0O1xuICAgICAgICAgICAgICB0ZWxlbWV0cnlDb250cm9sbGVyPy5lbWl0KHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcIndzLmhhbmRsZXIuZmFpbGVkXCIsXG4gICAgICAgICAgICAgICAgbGV2ZWw6IFwiZXJyb3JcIixcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQ6IHdzLmlkLFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogd3MubmFtZXNwYWNlLFxuICAgICAgICAgICAgICAgIHVzZXJJZDogd3MudXNlcklkLFxuICAgICAgICAgICAgICAgIGRldGFpbDogeyBldmVudDogZXZlbnROYW1lIH0sXG4gICAgICAgICAgICAgICAgLi4udHJhY2VDb250ZXh0LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdGVsZW1ldHJ5Q29udHJvbGxlcj8ucmVjb3JkU3Bhbih7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogXCJ3cy5tZXNzYWdlLnByb2Nlc3NcIixcbiAgICAgICAgICAgICAgICBraW5kOiBcImludGVybmFsXCIsXG4gICAgICAgICAgICAgICAgZHVyYXRpb25NcyxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IFwiZXJyb3JcIixcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQ6IHdzLmlkLFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogd3MubmFtZXNwYWNlLFxuICAgICAgICAgICAgICAgIHVzZXJJZDogd3MudXNlcklkLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHsgZXZlbnQ6IGV2ZW50TmFtZSB9LFxuICAgICAgICAgICAgICAgIGVycm9yVHlwZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm5hbWUgOiBydW50aW1lVHlwZU9mKGVycm9yKSxcbiAgICAgICAgICAgICAgICAuLi50cmFjZUNvbnRleHQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBwdWJsaXNoKGV2ZW50LCBkYXRhKSB7XG4gICAgICAgIHdzLnB1Ymxpc2goZXZlbnQsIGRhdGEpO1xuICAgICAgfSxcbiAgICAgIHdhaXRGb3JDbG9zZSgpIHtcbiAgICAgICAgcmV0dXJuIHdzLndhaXRGb3JDbG9zZSgpO1xuICAgICAgfSxcbiAgICAgIGpvaW4ocm9vbUlkKSB7XG4gICAgICAgIHJldHVybiB3cy5qb2luKHJvb21JZCk7XG4gICAgICB9LFxuICAgICAgbGVhdmUocm9vbUlkKSB7XG4gICAgICAgIHJldHVybiB3cy5sZWF2ZShyb29tSWQpO1xuICAgICAgfSxcbiAgICAgIHNldFVzZXJJZCh1c2VySWQpIHtcbiAgICAgICAgcmV0dXJuIHdzLnNldFVzZXJJZCh1c2VySWQpO1xuICAgICAgfSxcbiAgICAgIGNsZWFyVXNlcklkKCkge1xuICAgICAgICByZXR1cm4gd3MuY2xlYXJVc2VySWQoKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGNyZWF0ZVNjb3BlZFdlYlNvY2tldENvbm5lY3Rpb25Gb3JUZXN0aW5nPFRPdXQgZXh0ZW5kcyBvYmplY3QsIFRJbiBleHRlbmRzIG9iamVjdD4oXG4gICAgd3M6IFdlYlNvY2tldENvbm5lY3Rpb248VE91dCwgVEluPixcbiAgICBnZXRDb250ZXh0OiAoKSA9PiBXZWJTb2NrZXRDb250ZXh0IHwgbnVsbCxcbiAgKTogV2ViU29ja2V0Q29ubmVjdGlvbjxUT3V0LCBUSW4+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTY29wZWRXZWJTb2NrZXRDb25uZWN0aW9uKHdzLCBnZXRDb250ZXh0KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcGFyc2VXZWJTb2NrZXRSZXF1ZXN0UGFyYW1zKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICk6IFByb21pc2U8TWFwPHN0cmluZywgQXBpQXJndW1lbnQ+PiB7XG4gICAgY29uc3QgeyBnZXRab2RPYmplY3RGcm9tQXBpIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2NvZGUtY29udmVydGVyc1wiKTtcbiAgICBjb25zdCBSZXFUeXBlID0gZ2V0Wm9kT2JqZWN0RnJvbUFwaShhcGksIHRoaXMuc3luY2VyLnR5cGVzKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGZhc3RpZnlDYXN0ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4vY2FzdGVyXCIpO1xuICAgICAgcmV0dXJuIHRvQXBpQXJndW1lbnRNYXAoZmFzdGlmeUNhc3RlcihSZXFUeXBlKS5wYXJzZShyZXF1ZXN0LnF1ZXJ5ID8/IHt9KSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgeyBab2RFcnJvciB9ID0gYXdhaXQgaW1wb3J0KFwiem9kXCIpO1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBab2RFcnJvcikge1xuICAgICAgICBjb25zdCB7IGh1bWFuaXplWm9kRXJyb3IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3pvZC1lcnJvclwiKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZXMgPSBodW1hbml6ZVpvZEVycm9yKGUpXG4gICAgICAgICAgLm1hcCgoaXNzdWUpID0+IGlzc3VlLm1lc3NhZ2UpXG4gICAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgICAgICBjb25zdCB7IEJhZFJlcXVlc3RFeGNlcHRpb24gfSA9IGF3YWl0IGltcG9ydChcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiKTtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgICAgLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIG1lc3NhZ2VzIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB6b2RFcnJvcjogZSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVUkzsl5DshJwgcGF0aCBwYXJhbXPrpbwg7LaU7Lac7ZWp64uI64ukLlxuICAgKiDsmIg6IHBhdHRlcm49XCIvYWRtaW4vY29tcGFuaWVzLzpjb21wYW55SWRcIiwgdXJsPVwiL2FkbWluL2NvbXBhbmllcy8xMjNcIiDihpIgeyBjb21wYW55SWQ6IFwiMTIzXCIgfVxuICAgKi9cbiAgcHJpdmF0ZSBleHRyYWN0UGF0aFBhcmFtcyhwYXR0ZXJuOiBzdHJpbmcsIHVybDogc3RyaW5nKSB7XG4gICAgY29uc3QgcGF0dGVyblBhcnRzID0gcGF0dGVybi5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IHVybFBhcnRzID0gdGhpcy5nZXRQYXRobmFtZUZyb21VcmwodXJsKS5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJuUGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChwYXR0ZXJuUGFydHNbaV0uc3RhcnRzV2l0aChcIjpcIikpIHtcbiAgICAgICAgcGFyYW1zW3BhdHRlcm5QYXJ0c1tpXS5zbGljZSgxKV0gPSB1cmxQYXJ0c1tpXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHByaXZhdGUgaXNQYXRoUGF0dGVybk1hdGNoKHBhdHRlcm46IHN0cmluZywgdXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBwYXR0ZXJuUGFydHMgPSBwYXR0ZXJuLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgdXJsUGFydHMgPSB0aGlzLmdldFBhdGhuYW1lRnJvbVVybCh1cmwpLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICBpZiAocGF0dGVyblBhcnRzLmxlbmd0aCAhPT0gdXJsUGFydHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJuUGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBhdHRlcm5QYXJ0ID0gcGF0dGVyblBhcnRzW2ldO1xuICAgICAgY29uc3QgdXJsUGFydCA9IHVybFBhcnRzW2ldO1xuICAgICAgaWYgKHBhdHRlcm5QYXJ0LnN0YXJ0c1dpdGgoXCI6XCIpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHBhdHRlcm5QYXJ0ICE9PSB1cmxQYXJ0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGF0aG5hbWVGcm9tVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdXJsLnNwbGl0KFwiP1wiKVswXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVBhdGhXaXRoaW5CYXNlRGlyKGJhc2VEaXI6IHN0cmluZywgaW5wdXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZVVSSUNvbXBvbmVudChpbnB1dFBhdGgpLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpO1xuICAgICAgaWYgKGRlY29kZWQuaW5jbHVkZXMoXCJcXDBcIikpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBkZWNvZGVkLnJlcGxhY2UoL15cXC8rLywgXCJcIik7XG4gICAgICBjb25zdCByZXNvbHZlZFBhdGggPSBwYXRoLnJlc29sdmUoYmFzZURpciwgcmVsYXRpdmVQYXRoKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlRnJvbUJhc2UgPSBwYXRoLnJlbGF0aXZlKGJhc2VEaXIsIHJlc29sdmVkUGF0aCk7XG4gICAgICBpZiAocmVsYXRpdmVGcm9tQmFzZS5zdGFydHNXaXRoKFwiLi5cIikgfHwgcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlRnJvbUJhc2UpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc29sdmVkUGF0aDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBUEkg7J2R64u17JeQIOyggeyaqe2VoCBDYWNoZS1Db250cm9sIOyEpOygleydhCDqsrDsoJXtlanri4jri6QuXG4gICAqIOyasOyEoOyInOychDog6rCc67OEIOyngOyglSA+IGNhY2hlQ29udHJvbEhhbmRsZXJcbiAgICovXG4gIHByaXZhdGUgZ2V0QXBpQ2FjaGVDb250cm9sKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICApIHtcbiAgICAvLyDrjbDsvZTroIjsnbTthLAg7ISk7KCVIOyasOyEoFxuICAgIGlmIChhcGkub3B0aW9ucy5jYWNoZUNvbnRyb2wpIHtcbiAgICAgIHJldHVybiBhcGkub3B0aW9ucy5jYWNoZUNvbnRyb2w7XG4gICAgfVxuXG4gICAgLy8g7KCE7JetIO2VuOuTpOufrFxuICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcikge1xuICAgICAgY29uc3QgY2FjaGVSZXE6IENhY2hlQ29udHJvbFJlcXVlc3QgPSB7XG4gICAgICAgIHR5cGU6IFwiYXBpXCIsXG4gICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgIHBhdGg6IHJlcXVlc3Qucm91dGVPcHRpb25zPy51cmwgPz8gcmVxdWVzdC51cmwuc3BsaXQoXCI/XCIpWzBdLFxuICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICBhcGksXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIoY2FjaGVSZXEpO1xuICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTU1LsmqkgQVBJIO2YuOy2nCAoSFRUUCDsmKTrsoTtl6Trk5wg7JeG7J20IOyngeygkSDtmLjstpwpXG4gICAqIGNyZWF0ZUFwaUhhbmRsZXLsnZgg66Gc7KeB7J2EIOyerOyCrOyaqe2VmOuQmCwgcmVxdWVzdCDtjIzsi7Eg64yA7IugIHBhcmFtcyDsp4HsoJEg7IKs7JqpXG4gICAqL1xuICBhc3luYyBpbnZva2VBcGlGb3JTU1IoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICBwYXJhbXM6IGFueVtdLFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICByZXBseTogRmFzdGlmeVJlcGx5LFxuICApOiBQcm9taXNlPEFwaU1ldGhvZFJlc3VsdD4ge1xuICAgIC8vIENvbnRleHQg7IOd7ISxICjquLDsobQg66mU7IaM65OcIOyerOyCrOyaqSlcbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVDb250ZXh0KGNvbmZpZywgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgcmV0dXJuIHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UucnVuKHsgY29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBhcmdzIOyDneyEsTogQ29udGV4dCDtjIzrnbzrr7jthLDripQg7KO87J6FLCDrgpjrqLjsp4DripQgcGFyYW1z7JeQ7IScIOqwgOyguOyYpOq4sFxuICAgICAgY29uc3QgeyBBcGlQYXJhbVR5cGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpO1xuICAgICAgbGV0IHBhcmFtc0luZGV4ID0gMDtcbiAgICAgIGNvbnN0IGFyZ3MgPSBhcGkucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgIGlmIChBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcmFtc1twYXJhbXNJbmRleCsrXTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyDrqqjrjbgg66mU7ISc65OcIO2YuOy2nCAo6riw7KG0IOuplOyEnOuTnCDsnqzsgqzsmqkpXG4gICAgICByZXR1cm4gdGhpcy5pbnZva2VNb2RlbE1ldGhvZChhcGksIGFyZ3MsIHJlcGx5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZURldkFwaVJlcXVlc3RGb3JUZXN0aW5nKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVEZXZBcGlSZXF1ZXN0KHJlcXVlc3QsIGNvbmZpZyk7XG4gIH1cblxuICAvLyBXUyDqsr3roZzsl5DshJzripQgSFRUUCByZXBseeqwgCDsl4bsnLzrr4DroZwgcmVwbHnrpbwgb3B0aW9uYWzroZwg67Cb7JWEIOqzte2GtSDtmLjstpwg6rK966Gc66W8IOycoOyngO2VqFxuICBhc3luYyBpbnZva2VNb2RlbE1ldGhvZChcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIGFyZ3M6IHVua25vd25bXSxcbiAgICByZXBseT86IEZhc3RpZnlSZXBseSxcbiAgICBtb2RlbHM6IExvYWRlZE1vZGVscyA9IHRoaXMuc3luY2VyLm1vZGVscyxcbiAgKTogUHJvbWlzZTxBcGlNZXRob2RSZXN1bHQ+IHtcbiAgICBjb25zdCBtb2RlbCA9IG1vZGVsc1thcGkubW9kZWxOYW1lXTtcbiAgICBpZiAobW9kZWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCBub3QgZm91bmQ6ICR7YXBpLm1vZGVsTmFtZX1gKTtcbiAgICB9XG4gICAgY29uc3QgbWV0aG9kID1cbiAgICAgIG1vZGVsW1xuICAgICAgICAvKiBTQUZFVFk6IOuPmeq4sO2ZlOq4sOqwgCDrqqjrjbgg7YG0656Y7Iqk7JeQ7IScIOyImOynke2VnCBBUEkg66mU7ISc65OcIOydtOumhOunjCDsoITri6ztlZzri6QuICovIGFwaS5tZXRob2ROYW1lIGFzIGtleW9mIHR5cGVvZiBtb2RlbFxuICAgICAgXTtcbiAgICBpZiAoIWlzRnVuY3Rpb25WYWx1ZShtZXRob2QpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsIG1ldGhvZCBub3QgZm91bmQ6ICR7YXBpLm1vZGVsTmFtZX0uJHthcGkubWV0aG9kTmFtZX1gKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwobWV0aG9kLCBtb2RlbCwgYXJncyk7XG4gICAgcmVwbHk/LnR5cGUoYXBpLm9wdGlvbnMuY29udGVudFR5cGUgPz8gXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUNvbnRleHQoXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIHJlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICk6IFByb21pc2U8Q29udGV4dD4ge1xuICAgIC8vIGNyZWF0ZVNTRUZhY3Rvcnkg7ZWo7IiY7JeQIOuvuOumrCByZXF1ZXN07J2YIHNvY2tldOqzvCByZXBseeulvCDrsJTsnbjrlKkuXG4gICAgY29uc3QgeyBjcmVhdGVTU0VGYWN0b3J5IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zdHJlYW0vc3NlXCIpO1xuICAgIGNvbnN0IGNyZWF0ZVNTRSA9ICg8VCBleHRlbmRzIFpvZE9iamVjdD4oXG4gICAgICBfcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgICBfcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgICAgIF9ldmVudHM6IFQsXG4gICAgKSA9PiBjcmVhdGVTU0VGYWN0b3J5KF9yZXF1ZXN0LnNvY2tldCwgX3JlcGx5LCBfZXZlbnRzKSkuYmluZChudWxsLCByZXF1ZXN0LCByZXBseSk7XG5cbiAgICAvLyBsb2NhbGUg6rCQ7KeAXG4gICAgY29uc3QgbG9jYWxlID1cbiAgICAgIHRoaXMuZGV0ZWN0TG9jYWxlKHJlcXVlc3QuaGVhZGVyc1tcImFjY2VwdC1sYW5ndWFnZVwiXSwgdGhpcy5jb25maWcuaTE4bi5zdXBwb3J0ZWRMb2NhbGVzKSA/P1xuICAgICAgdGhpcy5jb25maWcuaTE4bi5kZWZhdWx0TG9jYWxlO1xuXG4gICAgLy8gYXV0aCBjb250ZXh0IOy2lOqwgFxuICAgIGNvbnN0IGhlYWRlcnMgPSBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkKHJlcXVlc3QuaGVhZGVycyk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IChhd2FpdCB0aGlzLmF1dGhWYWx1ZT8uYXBpLmdldFNlc3Npb24oeyBoZWFkZXJzIH0pKSA/PyBudWxsO1xuXG4gICAgY29uc3QgY29udGV4dDogQ29udGV4dCA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShcbiAgICAgIGNvbmZpZy5jb250ZXh0UHJvdmlkZXIoXG4gICAgICAgIHtcbiAgICAgICAgICB0cmFuc3BvcnQ6IFwiaHR0cFwiLFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgcmVwbHksXG4gICAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICAgIGNyZWF0ZVNTRSxcbiAgICAgICAgICBuYWl0ZVN0b3JlOiBuZXcgTWFwKCksXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgIC8vIGF1dGhcbiAgICAgICAgICB1c2VyOiBzZXNzaW9uPy51c2VyID8/IG51bGwsXG4gICAgICAgICAgc2Vzc2lvbjogc2Vzc2lvbj8uc2Vzc2lvbiA/PyBudWxsLFxuICAgICAgICB9LFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICByZXBseSxcbiAgICAgICksXG4gICAgKTtcbiAgICByZXR1cm4gY29udGV4dDtcbiAgfVxuXG4gIC8vIHNlc3Npb24vbG9jYWxlL3N0b3JlIOqwmeydgCDqs7XthrUgc3RhdGXripQgSFRUUCBjb250ZXh07JmAIOqzteycoO2VmOuQmCwgcmVwbHkvY3JlYXRlU1NFIOqwmeydgCBIVFRQIOyghOyaqSBoZWxwZXLripQg64W47Lac7ZWY7KeAIOyViuydjFxuICAvLyDsgqzsmqnsnpDqsIAgd2Vic29ja2V0Q29udGV4dFByb3ZpZGVy66W8IOyjvOuptCDqt7jrjIDroZwg7JyE7J6E7ZWY6rOgLCDsl4bsnLzrqbQg6riw7KG0IGNvbnRleHRQcm92aWRlcuulvCByZXBseS9TU0Ugc3R1YuqzvCDtlajqu5gg7J6s7Zmc7Jqp7ZWoXG4gIGFzeW5jIGNyZWF0ZVdlYlNvY2tldENvbnRleHQoXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIHdzOiBBbnlXZWJTb2NrZXRDb25uZWN0aW9uLFxuICApOiBQcm9taXNlPFdlYlNvY2tldENvbnRleHQ+IHtcbiAgICBjb25zdCBsb2NhbGUgPVxuICAgICAgdGhpcy5kZXRlY3RMb2NhbGUocmVxdWVzdC5oZWFkZXJzW1wiYWNjZXB0LWxhbmd1YWdlXCJdLCB0aGlzLmNvbmZpZy5pMThuLnN1cHBvcnRlZExvY2FsZXMpID8/XG4gICAgICB0aGlzLmNvbmZpZy5pMThuLmRlZmF1bHRMb2NhbGU7XG5cbiAgICBjb25zdCBoZWFkZXJzID0gY29udmVydEZhc3RpZnlIZWFkZXJzVG9TdGFuZGFyZChyZXF1ZXN0LmhlYWRlcnMpO1xuICAgIGNvbnN0IHNlc3Npb24gPSAoYXdhaXQgdGhpcy5hdXRoVmFsdWU/LmFwaS5nZXRTZXNzaW9uKHsgaGVhZGVycyB9KSkgPz8gbnVsbDtcblxuICAgIGNvbnN0IGRlZmF1bHRDb250ZXh0ID0ge1xuICAgICAgdHJhbnNwb3J0OiBcIndzXCIgYXMgY29uc3QsXG4gICAgICByZXF1ZXN0LFxuICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgd3MsXG4gICAgICBuYWl0ZVN0b3JlOiBuZXcgTWFwKCksXG4gICAgICBsb2NhbGUsXG4gICAgICB1c2VyOiBzZXNzaW9uPy51c2VyID8/IG51bGwsXG4gICAgICBzZXNzaW9uOiBzZXNzaW9uPy5zZXNzaW9uID8/IG51bGwsXG4gICAgfTtcblxuICAgIGlmIChjb25maWcud2Vic29ja2V0Q29udGV4dFByb3ZpZGVyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi4oYXdhaXQgUHJvbWlzZS5yZXNvbHZlKGNvbmZpZy53ZWJzb2NrZXRDb250ZXh0UHJvdmlkZXIoZGVmYXVsdENvbnRleHQsIHJlcXVlc3QpKSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIHJlcGx5L2NyZWF0ZVNTReyXkCDsnZjsobTtlZjripQgY29udGV4dFByb3ZpZGVy6rCAIOyeiOycvOuptCDsponsi5wg7JeQ65+s66W8IOuNmOyguCB0cmFuc3BvcnQgbWlzdXNl66W8IOu5qOumrCDrk5zrn6zrg4RcbiAgICBjb25zdCByZXBseVN0dWIgPSBjcmVhdGVXZWJTb2NrZXRSZXBseVN0dWIoKTtcbiAgICBjb25zdCBodHRwTGlrZUNvbnRleHQgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoXG4gICAgICBjb25maWcuY29udGV4dFByb3ZpZGVyKFxuICAgICAgICB7XG4gICAgICAgICAgdHJhbnNwb3J0OiBcImh0dHBcIixcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIHJlcGx5OiByZXBseVN0dWIsXG4gICAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICAgIGNyZWF0ZVNTRTogY3JlYXRlVW5hdmFpbGFibGVTU0UsXG4gICAgICAgICAgbmFpdGVTdG9yZTogZGVmYXVsdENvbnRleHQubmFpdGVTdG9yZSxcbiAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgdXNlcjogZGVmYXVsdENvbnRleHQudXNlcixcbiAgICAgICAgICBzZXNzaW9uOiBkZWZhdWx0Q29udGV4dC5zZXNzaW9uLFxuICAgICAgICB9LFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICByZXBseVN0dWIsXG4gICAgICApLFxuICAgICk7XG5cbiAgICBjb25zdCB7XG4gICAgICB0cmFuc3BvcnQ6IF90cmFuc3BvcnQsXG4gICAgICByZXBseTogX3JlcGx5LFxuICAgICAgY3JlYXRlU1NFOiBfY3JlYXRlU1NFLFxuICAgICAgYnVmZmVyZWRGaWxlczogX2J1ZmZlcmVkRmlsZXMsXG4gICAgICB1cGxvYWRlZEZpbGVzOiBfdXBsb2FkZWRGaWxlcyxcbiAgICAgIC4uLnJlc3RcbiAgICB9ID0gaHR0cExpa2VDb250ZXh0O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlc3QsXG4gICAgICB0cmFuc3BvcnQ6IFwid3NcIixcbiAgICAgIHJlcXVlc3QsXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMsXG4gICAgICB3cyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdC1MYW5ndWFnZSDtl6TrjZTsl5DshJwg7KeA7JuQ7ZWY64qUIGxvY2FsZeydhCDssL7sirXri4jri6QuXG4gICAqIEBleGFtcGxlIFwia28tS1Isa287cT0wLjksZW47cT0wLjhcIiDihpIgXCJrb1wiXG4gICAqL1xuICBwcml2YXRlIGRldGVjdExvY2FsZShcbiAgICBhY2NlcHRMYW5ndWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHN1cHBvcnRlZDogc3RyaW5nW10sXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFhY2NlcHRMYW5ndWFnZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIC8vIEFjY2VwdC1MYW5ndWFnZToga28tS1Isa287cT0wLjksZW47cT0wLjhcbiAgICBjb25zdCBsYW5ncyA9IGFjY2VwdExhbmd1YWdlLnNwbGl0KFwiLFwiKS5tYXAoKGxhbmcpID0+IHtcbiAgICAgIGNvbnN0IFtjb2RlXSA9IGxhbmcuc3BsaXQoXCI7XCIpO1xuICAgICAgcmV0dXJuIGNvZGUudHJpbSgpLnNwbGl0KFwiLVwiKVswXTsgLy8ga28tS1Ig4oaSIGtvXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbGFuZ3MuZmluZCgobGFuZykgPT4gc3VwcG9ydGVkLmluY2x1ZGVzKGxhbmcpKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0V2F0Y2hlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyB3YXRjaGVyIOuqqOuTiOydgCBmaWxlLXBhdHRlcm5zIOKGkiBTb25hbXUg7Iic7ZmY7J2EIO2UvO2VmOq4sCDsnITtlbQgZHluYW1pYyBpbXBvcnQg7ZWp64uI64ukLlxuICAgIGNvbnN0IHsgc2V0dXBXYXRjaGVyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zeW5jZXIvd2F0Y2hlclwiKTtcbiAgICB0aGlzLndhdGNoZXIgPSBhd2FpdCBzZXR1cFdhdGNoZXIoKGZpbGVFdmVudHMpID0+IHRoaXMucnVuSG1yU3luY0N5Y2xlKGZpbGVFdmVudHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYXRjaGVy6rCAIDEwMG1zIGJhdGNo66GcIOuqqOydgCBmaWxlRXZlbnRzIO2VmOuCmOyXkCDrjIDtlbQg7ZWcIOuyiOydmCBITVIvc3luYyDsgqzsnbTtgbTsnYQg64+V64uI64ukLlxuICAgKiBiYXRjaCDtgZDsnokg642V7JeQIO2VnCDsi5zsoJDsl5Ag7ZWY64KY66eMIOyLpO2WieuQqOydtCDrs7TsnqXrkKnri4jri6QgKGV2ZW50LWJhdGNoZXLqsIAg7KeB66Cs7ZmUKS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcnVuSG1yU3luY0N5Y2xlKGZpbGVFdmVudHM6IE1hcDxBYnNvbHV0ZVBhdGgsIFwiY2hhbmdlXCIgfCBcImFkZFwiPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgZXZlbnRdIG9mIGZpbGVFdmVudHMpIHtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUodGhpcy5hcHBSb290UGF0aCwgZmlsZVBhdGgpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChgRGV0ZWN0ZWQoJHtldmVudH0pOiAke2NoYWxrLmJsdWUocmVsYXRpdmVQYXRoKX1gKSk7XG4gICAgfVxuXG4gICAgLy8g67O47LK0OiDrs4Dqsr0g7Z2h7IiYICsg7LK07YGs7ISsIOqwseyLoC5cbiAgICBhd2FpdCB0aGlzLnN5bmNlci5obXJBbmRTeW5jKGZpbGVFdmVudHMpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLnJlbmV3Q2hlY2tzdW1zKCk7XG5cbiAgICBjb25zdCB0b3RhbFRpbWUgPSBEYXRlLm5vdygpIC0gc3RhcnRlZEF0O1xuICAgIGNvbnN0IG1zZyA9IGBITVIgRG9uZSEgJHtjaGFsay5ib2xkLndoaXRlKGAke3RvdGFsVGltZX1tc2ApfWA7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYmxhY2suYmdHcmVlbihjZW50ZXJUZXh0KG1zZykpKTtcbiAgfVxuXG4gIC8qXG4gICAgIEEgZnVuY3Rpb24gdGhhdCBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgaW5pdCBhbmQgZGVzdHJveSB3aGVuIHVzaW5nIFNvbmFtdSB2aWEgc2NyaXB0cy5cbiAgKi9cbiAgYXN5bmMgcnVuU2NyaXB0KGZuOiAoKSA9PiBQcm9taXNlPHZvaWQ+KSB7XG4gICAgYXdhaXQgdGhpcy5pbml0KHRydWUsIGZhbHNlLCB1bmRlZmluZWQsIGZhbHNlKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZm4oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWdpc3RlclBsdWdpbnMoc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UsIHBsdWdpbnM6IFNvbmFtdVNlcnZlck9wdGlvbnNbXCJwbHVnaW5zXCJdKSB7XG4gICAgaWYgKCFwbHVnaW5zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gcm91dGUoKSDsi5zsoJDsl5Ag7Iuk7ZaJ65CY64qUIG9uUm91dGUg7ZuF7J20IOyEpOy5mOuQmOuPhOuhnSDtlIzrn6zqt7jsnbgg65Ox66GdIOyZhOujjOulvCDquLDri6Trpr3ri4jri6QuXG4gICAgLy8gY29tcHJlc3Mg7ZSM65+s6re47J247J2AIOuLpOuluCDtlIzrn6zqt7jsnbjrs7Tri6Qg66i87KCAIOuTseuhneuQmOyWtOyVvCDtlanri4jri6QuXG4gICAgaWYgKHBsdWdpbnMuY29tcHJlc3MpIHtcbiAgICAgIGNvbnN0IGNvbXByZXNzUGx1Z2luID0gKGF3YWl0IGltcG9ydChcIkBmYXN0aWZ5L2NvbXByZXNzXCIpKS5kZWZhdWx0O1xuICAgICAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgICAgIHRocmVzaG9sZDogMTAyNCxcbiAgICAgICAgZW5jb2RpbmdzOiAvKiBTQUZFVFk6IEFQSSDrjbDsvZTroIjsnbTthLDsmYAgWm9kIOqygOymneq4sCDrk7HroZ0g6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gW1xuICAgICAgICAgIFwiYnJcIixcbiAgICAgICAgICBcImd6aXBcIixcbiAgICAgICAgICBcImRlZmxhdGVcIixcbiAgICAgICAgXSBhcyAoXCJiclwiIHwgXCJnemlwXCIgfCBcImRlZmxhdGVcIilbXSxcbiAgICAgIH07XG5cbiAgICAgIGlmIChwbHVnaW5zLmNvbXByZXNzID09PSB0cnVlKSB7XG4gICAgICAgIGF3YWl0IHNlcnZlci5yZWdpc3Rlcihjb21wcmVzc1BsdWdpbiwgZGVmYXVsdE9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgc2VydmVyLnJlZ2lzdGVyKGNvbXByZXNzUGx1Z2luLCB7XG4gICAgICAgICAgLi4uZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgICAgLi4ucGx1Z2lucy5jb21wcmVzcyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGx1Z2luc01vZHVsZXMgPSB7XG4gICAgICBjb3JzOiBcIkBmYXN0aWZ5L2NvcnNcIixcbiAgICAgIGZvcm1ib2R5OiBcIkBmYXN0aWZ5L2Zvcm1ib2R5XCIsXG4gICAgICBtdWx0aXBhcnQ6IFwiQGZhc3RpZnkvbXVsdGlwYXJ0XCIsXG4gICAgICBxczogXCJmYXN0aWZ5LXFzXCIsXG4gICAgICBzc2U6IFwiZmFzdGlmeS1zc2UtdjJcIixcbiAgICAgIHN0YXRpYzogXCJAZmFzdGlmeS9zdGF0aWNcIixcbiAgICB9IGFzIGNvbnN0O1xuXG4gICAgY29uc3QgcmVnaXN0ZXJQbHVnaW4gPSBhc3luYyA8SyBleHRlbmRzIGtleW9mIE5vbk51bGxhYmxlPHR5cGVvZiBwbHVnaW5zPj4oXG4gICAgICBrZXk6IEssXG4gICAgICBwbHVnaW5OYW1lOiBzdHJpbmcsXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb24gPSBwbHVnaW5zW2tleV07XG4gICAgICBpZiAoIW9wdGlvbikgcmV0dXJuO1xuXG4gICAgICBpZiAob3B0aW9uID09PSB0cnVlKSB7XG4gICAgICAgIGF3YWl0IHNlcnZlci5yZWdpc3RlcigoYXdhaXQgaW1wb3J0KHBsdWdpbk5hbWUpKS5kZWZhdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHNlcnZlci5yZWdpc3RlcigoYXdhaXQgaW1wb3J0KHBsdWdpbk5hbWUpKS5kZWZhdWx0LCBvcHRpb24pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHBsdWdpbk5hbWVdIG9mIE9iamVjdC5lbnRyaWVzKHBsdWdpbnNNb2R1bGVzKSkge1xuICAgICAgYXdhaXQgcmVnaXN0ZXJQbHVnaW4oXG4gICAgICAgIC8qIFNBRkVUWTogQVBJIOuNsOy9lOugiOydtO2EsOyZgCBab2Qg6rKA7Kad6riwIOuTseuhnSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBrZXkgYXMga2V5b2YgdHlwZW9mIHBsdWdpbnMsXG4gICAgICAgIHBsdWdpbk5hbWUsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwbHVnaW5zLndzKSB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZVdlYlNvY2tldFBsdWdpbihzZXJ2ZXIpO1xuICAgIH1cblxuICAgIGlmIChwbHVnaW5zLmN1c3RvbSkge1xuICAgICAgcGx1Z2lucy5jdXN0b20oc2VydmVyKTtcbiAgICB9XG4gIH1cblxuICAvLyBAZmFzdGlmeS93ZWJzb2NrZXTsnYAgcGx1Z2lucy53c+qwgCDshKTsoJXrkJwg6rK97Jqw7JeQ66eMIOuTseuhne2VmOqzoCwg6rCZ7J2AIHNlcnZlcuyXkCDspJHrs7Ug65Ox66Gd65CY7KeAIOyViuuPhOuhnSBXZWFrU2V07Jy866GcIOq4sOuhne2VqFxuICBwcml2YXRlIGFzeW5jIGVuc3VyZVdlYlNvY2tldFBsdWdpbihcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy53ZWJzb2NrZXRQbHVnaW5TZXJ2ZXJzLmhhcyhzZXJ2ZXIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGx1Z2luT3B0aW9uID0gdGhpcy5jb25maWcuc2VydmVyLnBsdWdpbnM/LndzO1xuICAgIGlmICghcGx1Z2luT3B0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd2Vic29ja2V0UGx1Z2luID0gKGF3YWl0IGltcG9ydChcIkBmYXN0aWZ5L3dlYnNvY2tldFwiKSkuZGVmYXVsdDtcbiAgICBjb25zdCByZXNvbHZlZFBsdWdpbk9wdGlvbnMgPSByZXNvbHZlV2ViU29ja2V0UGx1Z2luT3B0aW9ucyh7XG4gICAgICByYXdQbHVnaW5PcHRpb246IHBsdWdpbk9wdGlvbixcbiAgICB9KTtcbiAgICBpZiAocmVzb2x2ZWRQbHVnaW5PcHRpb25zKSB7XG4gICAgICBhd2FpdCBzZXJ2ZXIucmVnaXN0ZXIod2Vic29ja2V0UGx1Z2luLCByZXNvbHZlZFBsdWdpbk9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBzZXJ2ZXIucmVnaXN0ZXIod2Vic29ja2V0UGx1Z2luKTtcbiAgICB9XG5cbiAgICB0aGlzLndlYnNvY2tldFBsdWdpblNlcnZlcnMuYWRkKHNlcnZlcik7XG4gICAgdGhpcy53YXJuT25Qb3RlbnRpYWxXZWJTb2NrZXRUaW1lb3V0Q29uZmxpY3RzKHNlcnZlcik7XG4gIH1cblxuICAvLyBoZWFydGJlYXQgaW50ZXJ2YWzsnbQgRmFzdGlmeSBrZWVwQWxpdmVUaW1lb3V0IOydtOyDgeydtOuptCDsnbjtlITrnbzqsIAg66i87KCAIGlkbGUg7Jew6rKw7J2EIOuBiuydhCDsiJgg7J6I7Ja0IOqyveqzoOunjCDrgqjquLDqs6Ag64SY7Ja06rCQXG4gIHByaXZhdGUgd2Fybk9uUG90ZW50aWFsV2ViU29ja2V0VGltZW91dENvbmZsaWN0cyhcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBoZWFydGJlYXRzID0gdGhpcy5zeW5jZXIuYXBpc1xuICAgICAgLm1hcCgoYXBpKSA9PiBhcGkud2Vic29ja2V0T3B0aW9ucz8uaGVhcnRiZWF0ID8/IDMwMDAwKVxuICAgICAgLmZpbHRlcigoaGVhcnRiZWF0KSA9PiBoZWFydGJlYXQgPiAwKTtcblxuICAgIGlmIChoZWFydGJlYXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGtlZXBBbGl2ZVRpbWVvdXQgPSB0aGlzLmNvbmZpZy5zZXJ2ZXIuZmFzdGlmeT8ua2VlcEFsaXZlVGltZW91dDtcbiAgICBpZiAoIWtlZXBBbGl2ZVRpbWVvdXQgfHwga2VlcEFsaXZlVGltZW91dCA8PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbGFyZ2VzdEhlYXJ0YmVhdCA9IE1hdGgubWF4KC4uLmhlYXJ0YmVhdHMpO1xuICAgIGlmIChsYXJnZXN0SGVhcnRiZWF0ID49IGtlZXBBbGl2ZVRpbWVvdXQpIHtcbiAgICAgIHNlcnZlci5sb2cud2FybihcbiAgICAgICAge1xuICAgICAgICAgIGtlZXBBbGl2ZVRpbWVvdXQsXG4gICAgICAgICAgbGFyZ2VzdEhlYXJ0YmVhdCxcbiAgICAgICAgfSxcbiAgICAgICAgXCJXZWJTb2NrZXQgaGVhcnRiZWF0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBrZWVwQWxpdmVUaW1lb3V0OyBhbGlnbiBpbmZyYXN0cnVjdHVyZSBpZGxlIHRpbWVvdXRzIHRvIGF2b2lkIHVuZXhwZWN0ZWQgZGlzY29ubmVjdHMuXCIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiZXR0ZXItYXV0aCDrnbzsmrDtirjrpbwg65Ox66Gd7ZWp64uI64ukLlxuICAgKiAvYXBpL2F1dGgvKiDqsr3roZzroZwg7J247KadIEFQSeqwgCDsnpDrj5kg65Ox66Gd65Cp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWdpc3RlckJldHRlckF1dGgoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UsXG4gICAgb3B0aW9uczogTm9uTnVsbGFibGU8U29uYW11U2VydmVyT3B0aW9uc1tcImF1dGhcIl0+LFxuICApIHtcbiAgICBpZiAoIW9wdGlvbnMpIHJldHVybjtcblxuICAgIGNvbnN0IGJhc2VQYXRoID0gb3B0aW9ucy5iYXNlUGF0aCA/PyBcIi9hcGkvYXV0aFwiO1xuXG4gICAgLy8gYmV0dGVyLWF1dGgg65287Jqw7Yq4IOuTseuhnVxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIlBPU1RcIl0sXG4gICAgICB1cmw6IGAke2Jhc2VQYXRofS8qYCxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXV0aC5oYW5kbGVyKFxuICAgICAgICAgIGNyZWF0ZUJldHRlckF1dGhSZXF1ZXN0KHJlcXVlc3QsIG9wdGlvbnMuYWR2YW5jZWQ/LmlwQWRkcmVzcz8uaXBBZGRyZXNzSGVhZGVycyksXG4gICAgICAgICk7XG5cbiAgICAgICAgcmVwbHkuc3RhdHVzKHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgIHJlc3BvbnNlLmhlYWRlcnMuZm9yRWFjaCgodmFsdWU6IHN0cmluZywga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICByZXBseS5oZWFkZXIoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVwbHkuc2VuZChyZXNwb25zZS5ib2R5ID8gYXdhaXQgcmVzcG9uc2UudGV4dCgpIDogbnVsbCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmludFN0YXJ0dXBTdW1tYXJ5KCkge1xuICAgIGNvbnN0IGFjdGl2ZVByZXNldCA9IGdldFNvbmFtdUVudmlyb25tZW50KCk7XG5cbiAgICBwcmludERpbVN1bW1hcnkoYENvbmZpZyBsb2FkZWQke2Zvcm1hdFRpbWUodGhpcy5jb25maWdFbGFwc2VkKX1gKTtcblxuICAgIC8vIERCIHByZXNldCDrqqnroZ1cbiAgICBwcmludEdyZWVuU3VtbWFyeShcIkRCXCIpO1xuICAgIGNvbnN0IHsgaXNMb2NhbCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBjb25zdCBwcmVzZXROYW1lcyA9XG4gICAgICAvKiBTQUZFVFk6IEFQSSDrjbDsvZTroIjsnbTthLDsmYAgWm9kIOqygOymneq4sCDrk7HroZ0g6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gT2JqZWN0LmtleXMoXG4gICAgICAgIHRoaXMuZGJDb25maWcsXG4gICAgICApIGFzIChrZXlvZiBTb25hbXVEQkNvbmZpZylbXTtcbiAgICBjb25zdCBtYXhMZW4gPSBNYXRoLm1heCguLi5wcmVzZXROYW1lcy5tYXAoKG4pID0+IG4ubGVuZ3RoKSk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHByZXNldE5hbWVzKSB7XG4gICAgICBjb25zdCBjb25uID1cbiAgICAgICAgLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHRoaXNcbiAgICAgICAgICAuZGJDb25maWdbbmFtZV0uY29ubmVjdGlvbiBhc1xuICAgICAgICAgIHwgeyBob3N0Pzogc3RyaW5nOyBwb3J0PzogbnVtYmVyOyBkYXRhYmFzZT86IHN0cmluZyB9XG4gICAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBob3N0ID0gY29ubj8uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuICAgICAgY29uc3QgYWRkciA9IGBAICR7aG9zdH06JHtjb25uPy5wb3J0ID8/IDU0MzJ9LyR7Y29ubj8uZGF0YWJhc2UgPz8gXCIodW5rbm93bilcIn1gO1xuICAgICAgY29uc3QgcGFkZGVkID0gbmFtZS5wYWRFbmQobWF4TGVuKTtcbiAgICAgIGNvbnN0IHJlbW90ZVRhZyA9IGlzTG9jYWwoKSAmJiAhaXNMb2NhbEhvc3QoaG9zdCkgPyBjaGFsay55ZWxsb3coYCBcXHUyNmEwIHJlbW90ZWApIDogXCJcIjtcblxuICAgICAgaWYgKG5hbWUgPT09IGFjdGl2ZVByZXNldCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgICBcXHUyNWI4ICR7cGFkZGVkfSAke2FkZHJ9YCkgKyByZW1vdGVUYWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKGAgICAgJHtwYWRkZWR9ICR7YWRkcn1gKSArIHJlbW90ZVRhZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLnNlcnZlci5hdXRoKSB7XG4gICAgICBjb25zdCBiYXNlUGF0aCA9IHRoaXMuY29uZmlnLnNlcnZlci5hdXRoLmJhc2VQYXRoID8/IFwiL2FwaS9hdXRoXCI7XG4gICAgICBwcmludERpbVN1bW1hcnkoYEF1dGg6IGJldHRlci1hdXRoIGF0ICR7YmFzZVBhdGh9LypgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29uZmlnLmFwaS50aW1lem9uZSkge1xuICAgICAgcHJpbnREaW1TdW1tYXJ5KGBUaW1lem9uZTogJHt0aGlzLmNvbmZpZy5hcGkudGltZXpvbmV9YCk7XG4gICAgfVxuICAgIHByaW50R3JlZW5TdW1tYXJ5KGBTb25hbXUgcmVhZHkke2Zvcm1hdFRpbWUodGhpcy5pbml0RWxhcHNlZCl9YCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVDYWNoZShjb25maWc6IENhY2hlQ29uZmlnIHwgdW5kZWZpbmVkLCBmb3JUZXN0aW5nOiBib29sZWFuKSB7XG4gICAgY29uc3QgeyBzZXRDYWNoZU1hbmFnZXJSZWYgfSA9IGF3YWl0IGltcG9ydChcIi4uL2NhY2hlL2RlY29yYXRvclwiKTtcblxuICAgIC8vIO2FjOyKpO2KuCDtmZjqsr3sl5DshJwg66mU66qo66asIOuTnOudvOydtOuyhCDsnpDrj5kg7IKs7JqpXG4gICAgaWYgKGZvclRlc3RpbmcpIHtcbiAgICAgIGNvbnN0IHsgY3JlYXRlVGVzdENhY2hlTWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vY2FjaGUvY2FjaGUtbWFuYWdlclwiKTtcbiAgICAgIHRoaXMuY2FjaGVWYWx1ZSA9IGNyZWF0ZVRlc3RDYWNoZU1hbmFnZXIoKTtcbiAgICAgIHNldENhY2hlTWFuYWdlclJlZih0aGlzLmNhY2hlVmFsdWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOyEpOygleydtCDsl4bsnLzrqbQg7LqQ7IucIOu5hO2ZnOyEse2ZlFxuICAgIGlmICghY29uZmlnKSB7XG4gICAgICBzZXRDYWNoZU1hbmFnZXJSZWYobnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g7ISk7KCV7JeQIOuUsOudvCBDYWNoZU1hbmFnZXIg7IOd7ISxXG4gICAgY29uc3QgeyBjcmVhdGVDYWNoZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2NhY2hlL2NhY2hlLW1hbmFnZXJcIik7XG4gICAgdGhpcy5jYWNoZVZhbHVlID0gY3JlYXRlQ2FjaGVNYW5hZ2VyKGNvbmZpZyk7XG4gICAgc2V0Q2FjaGVNYW5hZ2VyUmVmKHRoaXMuY2FjaGVWYWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVXb3JrZmxvd3Mob3B0aW9uczogU29uYW11VGFza09wdGlvbnMgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCB7IFdvcmtmbG93TWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdGFza3Mvd29ya2Zsb3ctbWFuYWdlclwiKTtcbiAgICAvLyBOT1RFOiBAc29uYW11LWtpdC90YXNrcyDslYjsl5DshKAga25leCBjb25maWfrpbwg7IiY7KCV7ZWY6riwIOuVjOusuOyXkCBjb25uZWN0aW9u7J20IOyVhOuLjCBjb25maWcg7Ke466GcIOuztOuDheuLiOuLpC5cbiAgICB0aGlzLndvcmtmbG93c1ZhbHVlID0gbmV3IFdvcmtmbG93TWFuYWdlcihEQi5nZXREQkNvbmZpZyhcIndcIikpO1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVuYWJsZVdvcmtlciA9IG9wdGlvbnMuZW5hYmxlV29ya2VyID8/IGlzRGFlbW9uU2VydmVyKCk7XG4gICAgY29uc3QgZGVmYXVsdFdvcmtlck9wdGlvbnMgPSB7XG4gICAgICBjb25jdXJyZW5jeTogb3MuY3B1cygpLmxlbmd0aCAtIDEsXG4gICAgICB1c2VQdWJTdWI6IHRydWUsXG4gICAgICBsaXN0ZW5EZWxheTogNTAwLFxuICAgIH07XG5cbiAgICBpZiAoZW5hYmxlV29ya2VyKSB7XG4gICAgICB0aGlzLndvcmtmbG93cy5zZXR1cFdvcmtlcih7XG4gICAgICAgIC4uLmRlZmF1bHRXb3JrZXJPcHRpb25zLFxuICAgICAgICAuLi5vcHRpb25zLndvcmtlck9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJvb3Qoc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UsIG9wdGlvbnM6IFNvbmFtdVNlcnZlck9wdGlvbnMpIHtcbiAgICBjb25zdCBwb3J0ID0gb3B0aW9ucy5saXN0ZW4/LnBvcnQgPz8gMzAwMDtcbiAgICBjb25zdCBob3N0ID0gb3B0aW9ucy5saXN0ZW4/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcblxuICAgIHNlcnZlci5hZGRIb29rKFwib25DbG9zZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBvcHRpb25zLmxpZmVjeWNsZT8ub25TaHV0ZG93bj8uKHNlcnZlcik7XG4gICAgICBhd2FpdCB0aGlzLndvcmtmbG93cy5kZXN0cm95KCk7XG4gICAgICBhd2FpdCB0aGlzLmRlc3Ryb3koKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNodXRkb3duID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2VydmVyLmNsb3NlKCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZHVyaW5nIHNodXRkb3duOlwiLCBlcnIpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgc2h1dGRvd24pO1xuICAgIHByb2Nlc3Mub24oXCJTSUdURVJNXCIsIHNodXRkb3duKTtcblxuICAgIGlmIChvcHRpb25zLmxpZmVjeWNsZT8ub25FcnJvcikge1xuICAgICAgc2VydmVyLnNldEVycm9ySGFuZGxlcihvcHRpb25zLmxpZmVjeWNsZT8ub25FcnJvcik7XG4gICAgfVxuXG4gICAgc2VydmVyXG4gICAgICAubGlzdGVuKHsgcG9ydCwgaG9zdCB9KVxuICAgICAgLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLndvcmtmbG93cy5zdGFydFdvcmtlcigpO1xuICAgICAgICBhd2FpdCBvcHRpb25zLmxpZmVjeWNsZT8ub25TdGFydD8uKHNlcnZlcik7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGFzeW5jIChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCJGYWlsZWQgdG8gc3RhcnQgc2VydmVyOlwiLCBlcnIpKTtcbiAgICAgICAgYXdhaXQgc2h1dGRvd24oKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZGVzdHJveSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGhhc0V4dGVybmFsTG9nVGFwZUNvbmZpZ3VyYXRpb24gfSA9IGF3YWl0IGltcG9ydChcIi4uL2xvZ2dlci9jb25maWd1cmVcIik7XG4gICAgY29uc3QgeyBCYXNlTW9kZWwgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2Jhc2UtbW9kZWxcIik7XG4gICAgLy8g66i87KCAIOyymOumrO2VtOyVvO2VqC5cbiAgICBhd2FpdCBCYXNlTW9kZWwuZGVzdHJveSgpO1xuICAgIC8vIFdlYlNvY2tldCBzaHV0ZG93biBmaXJzdCB0byBmbHVzaCB0ZWxlbWV0cnlcbiAgICBpZiAodGhpcy53ZWJzb2NrZXRSdW50aW1lVmFsdWUpIHtcbiAgICAgIGF3YWl0IHRoaXMud2Vic29ja2V0UnVudGltZVZhbHVlLnNodXRkb3duKCk7XG4gICAgfVxuICAgIHRoaXMud2Vic29ja2V0UnVudGltZVZhbHVlID0gbnVsbDtcbiAgICAvLyBUaGVuIHNodXQgZG93biByZW1haW5pbmcgcmVzb3VyY2VzIGluIHBhcmFsbGVsXG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtcbiAgICAgIHRoaXMud29ya2Zsb3dzVmFsdWU/LmRlc3Ryb3koKSA/PyBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgIHRoaXMuY2FjaGVWYWx1ZT8uZGlzY29ubmVjdCgpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgdGhpcy5kZXZWaXRlc3RNYW5hZ2VyVmFsdWU/LnNodXRkb3duKCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICB0aGlzLndhdGNoZXI/LmNsb3NlKCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgXSk7XG4gICAgLy8gTG9nVGFwZSBkaXNwb3NlIGFmdGVyIFdTIHNodXRkb3duIHNvIHRlbGVtZXRyeSByZWNvcmRzIGFyZSBmbHVzaGVkIGZpcnN0XG4gICAgaWYgKCFoYXNFeHRlcm5hbExvZ1RhcGVDb25maWd1cmF0aW9uKCkpIGF3YWl0IGxvZ3RhcGVEaXNwb3NlKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0V2ViU29ja2V0VGVsZW1ldHJ5Q29udGV4dChcbiAgd3M6IEFueVdlYlNvY2tldENvbm5lY3Rpb24sXG4pOiBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCB7XG4gIGlmICghaXNUZWxlbWV0cnlDb250ZXh0UHJvdmlkZXIod3MpKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcmV0dXJuIHdzLmdldFRlbGVtZXRyeUNvbnRleHQoKTtcbn1cblxuZnVuY3Rpb24gaXNUZWxlbWV0cnlDb250ZXh0UHJvdmlkZXIoXG4gIHdzOiBBbnlXZWJTb2NrZXRDb25uZWN0aW9uLFxuKTogd3MgaXMgQW55V2ViU29ja2V0Q29ubmVjdGlvbiAmIFRlbGVtZXRyeUNvbnRleHRQcm92aWRlciB7XG4gIHJldHVybiBcImdldFRlbGVtZXRyeUNvbnRleHRcIiBpbiB3cyAmJiBpc0Z1bmN0aW9uVmFsdWUod3MuZ2V0VGVsZW1ldHJ5Q29udGV4dCk7XG59XG5cbmV4cG9ydCBjb25zdCBTb25hbXUgPSBuZXcgU29uYW11Q2xhc3MoKTtcblxuLyoqXG4gKiBzdHJlYW0g66qo65Oc7JeQ7IScIO2CpCDsg53shLEg7ZWo7IiY6rCAIOyngOygleuQmOyngCDslYrslZjsnYQg65WMIOyCrOyaqe2VmOuKlCDquLDrs7gg7ZWo7IiY7J6F64uI64ukLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0S2V5R2VuZXJhdG9yKGZpbGU6IHsgZmlsZW5hbWU6IHN0cmluZzsgbWltZXR5cGU6IHN0cmluZyB9KTogc3RyaW5nIHtcbiAgY29uc3QgZXh0ID0gbWltZS5leHRlbnNpb24oZmlsZS5taW1ldHlwZSkgfHwgXCJiaW5cIjtcbiAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgcmFuZG9tID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCk7XG4gIHJldHVybiBgdXBsb2Fkcy8ke3RpbWVzdGFtcH0tJHtyYW5kb219LiR7ZXh0fWA7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWUobXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGZvcm1hdHRlZCA9IG1zID49IDEwMDAgPyBgJHsobXMgLyAxMDAwKS50b0ZpeGVkKDIpfXNgIDogYCR7TWF0aC5yb3VuZChtcyl9bXNgO1xuICByZXR1cm4gYCAoJHtmb3JtYXR0ZWR9KWA7XG59XG5cbmNvbnN0IExPQ0FMX0hPU1RTID0gbmV3IFNldChbXCJsb2NhbGhvc3RcIiwgXCIxMjcuMC4wLjFcIiwgXCIwLjAuMC4wXCIsIFwiOjoxXCJdKTtcbmZ1bmN0aW9uIGlzTG9jYWxIb3N0KGhvc3Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gTE9DQUxfSE9TVFMuaGFzKGhvc3QpIHx8IGhvc3QuZW5kc1dpdGgoXCIubG9jYWxcIik7XG59XG5cbi8vIGAuZXZlcnkoKWDqsIAg7LKrIGd1YXJkIOydtO2bhCDsiJztmozrpbwg66mI7LaU64qUIOusuOygnOqwgCDsnojslrQgYGZvci4uLm9mYOuhnCDrqqjrk6AgZ3VhcmTrpbwg7Iic7ISc64yA66GcIOyLpO2Wie2VmOuPhOuhnSDqs6DsoJXtlahcbmZ1bmN0aW9uIHJ1bkd1YXJkcyh7XG4gIGd1YXJkcyxcbiAgY29uZmlnLFxuICByZXF1ZXN0LFxuICBhcGksXG59OiB7XG4gIGd1YXJkczogRXh0ZW5kZWRBcGlbXCJvcHRpb25zXCJdW1wiZ3VhcmRzXCJdIHwgdW5kZWZpbmVkO1xuICBjb25maWc6IFBpY2s8U29uYW11RmFzdGlmeUNvbmZpZywgXCJndWFyZEhhbmRsZXJcIj47XG4gIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0O1xuICBhcGk6IEV4dGVuZGVkQXBpO1xufSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGd1YXJkIG9mIGd1YXJkcyA/PyBbXSkge1xuICAgIGNvbmZpZy5ndWFyZEhhbmRsZXIoZ3VhcmQsIHJlcXVlc3QsIGFwaSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrSEEsU0FBUyxjQUFxQixPQUEyQjtDQUN2RCxJQUFJLFVBQVUsTUFBTSxPQUFPO0NBQzNCLElBQUksVUFBVSxRQUFXLE9BQU87Q0FDaEMsSUFBSSxVQUFVLE1BQU0sT0FBTztDQUMzQixJQUFJLFVBQVUsT0FBTyxPQUFPO0NBQzVCLElBQUksY0FBYyxLQUFLLEdBQUcsT0FBTztDQUNqQyxJQUFJLGNBQWMsS0FBSyxHQUFHLE9BQU87Q0FDakMsSUFBSSxjQUFjLEtBQUssR0FBRyxPQUFPO0NBQ2pDLElBQUksY0FBYyxLQUFLLEdBQUcsT0FBTztDQUNqQyxJQUFJLGdCQUFnQixLQUFLLEdBQUcsT0FBTztDQUNuQyxJQUFJLGNBQWMsS0FBSyxH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
|