sonamu 0.12.0 → 0.13.1
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 +19 -18
- 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.js +39 -5
- 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.js +2 -3
- package/dist/stream/index.js +11 -2
- package/dist/stream/sse.js +1 -2
- package/dist/stream/ws-audience-resolver.js +2 -3
- package/dist/stream/ws-audience.js +1 -2
- package/dist/stream/ws-cluster-bus.js +1 -2
- package/dist/stream/ws-delivery.js +2 -3
- package/dist/stream/ws-frame.js +1 -2
- package/dist/stream/ws-local-connection-store.js +2 -3
- package/dist/stream/ws-presence-index.js +1 -2
- package/dist/stream/ws-presence-store.js +2 -3
- package/dist/stream/ws-registry.js +2 -3
- package/dist/stream/ws-session-id.js +1 -2
- 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.js +2 -3
- 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 +67 -67
- package/src/ai/agents/agent.ts +1 -1
- package/src/api/__tests__/sonamu.plugins.test.ts +11 -1
- package/src/api/__tests__/sonamu.websocket.test.ts +6 -10
- package/src/api/config.ts +1 -1
- package/src/api/context.ts +2 -8
- package/src/api/sonamu.ts +26 -21
- 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/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
|
@@ -8,7 +8,7 @@ import { fakerMappings, init_faker_mappings } from "./faker-mappings.js";
|
|
|
8
8
|
import { FixtureManager, init_fixture_manager } from "./fixture-manager.js";
|
|
9
9
|
import { z } from "zod";
|
|
10
10
|
import chalk from "chalk";
|
|
11
|
-
|
|
11
|
+
// src/testing/fixture-generator.ts
|
|
12
12
|
function parseFixtureSourceRecord(record) {
|
|
13
13
|
return {
|
|
14
14
|
...record,
|
|
@@ -1133,8 +1133,7 @@ Rules:
|
|
|
1133
1133
|
}
|
|
1134
1134
|
};
|
|
1135
1135
|
}));
|
|
1136
|
-
//#endregion
|
|
1137
1136
|
init_fixture_generator();
|
|
1138
1137
|
export { FixtureGenerator, init_fixture_generator };
|
|
1139
1138
|
|
|
1140
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1nZW5lcmF0b3IuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3RpbmcvZml4dHVyZS1nZW5lcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBMYW5ndWFnZU1vZGVsIH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgdHlwZSBTb25hbXVEQlByZXNldCB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eVwiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHlQcm9wLCB0eXBlIEZpeHR1cmVJbXBvcnRSZXN1bHQsIHR5cGUgRml4dHVyZVJlY29yZCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsIGlzT25lVG9PbmVSZWxhdGlvblByb3AsIGlzUmVsYXRpb25Qcm9wIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBpc1Rlc3QgfSBmcm9tIFwiLi4vdXRpbHMvY29udHJvbGxlclwiO1xuaW1wb3J0IHsgaXNGdW5jdGlvblZhbHVlIH0gZnJvbSBcIi4uL3V0aWxzL3J1bnRpbWUtdmFsdWVcIjtcbmltcG9ydCB7IERhdGFFeHBsb3JlciwgZGF0YUV4cGxvcmVyUmVjb3JkU2NoZW1hLCBkYXRhRXhwbG9yZXJWYWx1ZVNjaGVtYSB9IGZyb20gXCIuL2RhdGEtZXhwbG9yZXJcIjtcbmltcG9ydCB7IGRhdGFTb3VyY2VDb25maWdTY2hlbWEgfSBmcm9tIFwiLi9kYXRhLWV4cGxvcmVyXCI7XG5pbXBvcnQgeyB0eXBlIERhdGFFeHBsb3JlclJlY29yZCwgdHlwZSBEYXRhRXhwbG9yZXJWYWx1ZSB9IGZyb20gXCIuL2RhdGEtZXhwbG9yZXJcIjtcbmltcG9ydCB7IHR5cGUgRXhwbG9yZVdpdGhSZWxhdGlvbnNPcHRpb25zLCB0eXBlIEV4cGxvcmVXaXRoUmVsYXRpb25zUmVzdWx0IH0gZnJvbSBcIi4vZGF0YS1leHBsb3JlclwiO1xuaW1wb3J0IHsgZmFrZXJNYXBwaW5ncyB9IGZyb20gXCIuL2Zha2VyLW1hcHBpbmdzXCI7XG5pbXBvcnQgeyB0eXBlIEZha2VyTWFwcGluZ3MgfSBmcm9tIFwiLi9mYWtlci1tYXBwaW5nc1wiO1xuaW1wb3J0IHsgRml4dHVyZU1hbmFnZXIgfSBmcm9tIFwiLi9maXh0dXJlLW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgRml4dHVyZVNvdXJjZVJlY29yZCB9IGZyb20gXCIuL2ZpeHR1cmUtbWFuYWdlclwiO1xuXG5leHBvcnQgdHlwZSBMb2NhbGUgPSBcImtvXCIgfCBcImVuXCIgfCBcImphXCI7XG5leHBvcnQgdHlwZSBGaXh0dXJlT3ZlcnJpZGVzID0gb2JqZWN0O1xuXG50eXBlIEZha2VyRnVuY3Rpb24gPSAoLi4uYXJnczogRGF0YUV4cGxvcmVyVmFsdWVbXSkgPT4gRGF0YUV4cGxvcmVyVmFsdWU7XG50eXBlIEZha2VyTmFtZXNwYWNlTWVtYmVyID0gRmFrZXJGdW5jdGlvbiB8IEZha2VyTmFtZXNwYWNlO1xudHlwZSBGYWtlck5hbWVzcGFjZSA9IHsgW25hbWU6IHN0cmluZ106IEZha2VyTmFtZXNwYWNlTWVtYmVyIH07XG5cbmNvbnN0IGZha2VyRnVuY3Rpb25TY2hlbWEgPSB6LmN1c3RvbTxGYWtlckZ1bmN0aW9uPihcbiAgaXNGdW5jdGlvblZhbHVlLFxuICBcIkZha2VyIOqyveuhnOydmCDrp4jsp4Drp4kg6rCS7J2AIO2VqOyImOyXrOyVvCDtlanri4jri6QuXCIsXG4pO1xuY29uc3QgZmFrZXJOYW1lc3BhY2VPYmplY3RTY2hlbWEgPSB6Lm9iamVjdCh7fSk7XG5jb25zdCBkeW5hbWljTmFtZXNwYWNlU2NoZW1hID0gei5jdXN0b208RmFrZXJOYW1lc3BhY2U+KFxuICAoY2FuZGlkYXRlKSA9PiBmYWtlck5hbWVzcGFjZU9iamVjdFNjaGVtYS5zYWZlUGFyc2UoY2FuZGlkYXRlKS5zdWNjZXNzLFxuICBcIkZha2VyIOqyveuhnOuKlCDqsJ3ssrQgbmFtZXNwYWNl7Jes7JW8IO2VqeuLiOuLpC5cIixcbik7XG5jb25zdCBnZW5lcmF0b3JBcmd1bWVudHNTY2hlbWEgPSB6LmFycmF5KGRhdGFFeHBsb3JlclZhbHVlU2NoZW1hKTtcbmNvbnN0IGZpeHR1cmVSZWNvcmRJZFNjaGVtYSA9IHoudW5pb24oW3oubnVtYmVyKCksIHouc3RyaW5nKCldKTtcbmNvbnN0IGZpeHR1cmVXaGVyZVZhbHVlU2NoZW1hID0gei51bmlvbihbei5zdHJpbmcoKSwgei5udW1iZXIoKSwgei5ib29sZWFuKCksIHouZGF0ZSgpLCB6Lm51bGwoKV0pO1xuXG5leHBvcnQgdHlwZSBGaXh0dXJlR2VuZXJhdGlvblNwZWMgPSB7XG4gIGVudGl0eTogc3RyaW5nO1xuICBjb3VudDogbnVtYmVyO1xuICBvdmVycmlkZXM/OiBGaXh0dXJlT3ZlcnJpZGVzO1xufTtcblxudHlwZSBHZW5lcmF0ZWRGaXh0dXJlID0ge1xuICBlbnRpdHk6IHN0cmluZztcbiAgZGF0YTogRGF0YUV4cGxvcmVyUmVjb3JkO1xuICBleHBsaWNpdElkPzogYm9vbGVhbjtcbn07XG5cbmZ1bmN0aW9uIHBhcnNlRml4dHVyZVNvdXJjZVJlY29yZChyZWNvcmQ6IERhdGFFeHBsb3JlclJlY29yZCk6IEZpeHR1cmVTb3VyY2VSZWNvcmQge1xuICByZXR1cm4ge1xuICAgIC4uLnJlY29yZCxcbiAgICBpZDogZml4dHVyZVJlY29yZElkU2NoZW1hLnBhcnNlKHJlY29yZC5pZCksXG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIEZpeHR1cmVHZW5lcmF0b3JPcHRpb25zID0ge1xuICBsb2NhbGU/OiBMb2NhbGU7XG4gIHVzZUxMTT86IGJvb2xlYW47XG4gIGVuYWJsZUxMTUNhY2hlPzogYm9vbGVhbjtcbiAgbGxtTW9kZWw/OiBzdHJpbmc7XG4gIC8qKiDthYzsiqTtirjrgpgg64yA7LK0IExMTSDqs7XquInsnpDrpbwg7JyE7ZWcIO2FjeyKpO2KuCDsg53shLEg6rWs7ZiEICovXG4gIGdlbmVyYXRlVGV4dD86IEZpeHR1cmVUZXh0R2VuZXJhdG9yO1xufTtcblxuZXhwb3J0IHR5cGUgRml4dHVyZVRleHRHZW5lcmF0b3IgPSAocmVxdWVzdDoge1xuICBtb2RlbDogTGFuZ3VhZ2VNb2RlbDtcbiAgcHJvbXB0OiBzdHJpbmc7XG59KSA9PiBQcm9taXNlPHsgdGV4dDogc3RyaW5nOyB1c2FnZT86IHsgdG90YWxUb2tlbnM/OiBudW1iZXIgfSB9PjtcblxuZXhwb3J0IHR5cGUgR2VuZXJhdG9yQ29udGV4dCA9IHtcbiAgLyoqIOyDneyEsSDspJHsnbggZml4dHVyZeuTpCAo66mU66qo66asIOyDgSkgKi9cbiAgZml4dHVyZXM6IE1hcDxzdHJpbmcsIERhdGFFeHBsb3JlclJlY29yZD47XG5cbiAgLyoqIOywuOyhsCDrjbDsnbTthLAg7LqQ7IucIChEYXRhRXhwbG9yZXIg6rKw6rO8KSAqL1xuICByZWZlcmVuY2VDYWNoZTogTWFwPHN0cmluZywgRGF0YUV4cGxvcmVyUmVjb3JkW10+O1xuXG4gIC8qKiDsnbTrr7ggaW1wb3J065CcIOugiOy9lOuTnOulvCDstpTsoIHtlZjsl6wg7KSR67O1IGltcG9ydOulvCDrsKnsp4Dtlanri4jri6QgKi9cbiAgaW1wb3J0ZWRSZWNvcmRzOiBTZXQ8c3RyaW5nPjsgLy8gXCJVc2VyIzEyM1wiXG59O1xuXG5leHBvcnQgY2xhc3MgRml4dHVyZUdlbmVyYXRvciB7XG4gIHByaXZhdGUgZGF0YUV4cGxvcmVyOiBEYXRhRXhwbG9yZXI7XG4gIHByaXZhdGUgbG9jYWxlOiBMb2NhbGU7XG4gIHByaXZhdGUgbWFwcGluZ3M6IEZha2VyTWFwcGluZ3M7XG4gIHByaXZhdGUgbGxtQ2FjaGU6IE1hcDxzdHJpbmcsIERhdGFFeHBsb3JlclZhbHVlPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBlbnRpdHlDYWNoZTogTWFwPHN0cmluZywgRW50aXR5PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBvcHRpb25zOiBGaXh0dXJlR2VuZXJhdG9yT3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNvdXJjZURiOiBLbmV4LFxuICAgIC8vIEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVz6rCAIGRiTmFtZSDrrLjsnpDsl7TsnYQg67Cb6riwIOuVjOusuOyXkCDsp4HsoJEg7IKs7Jqp7ZWY7KeAIOyViuyKteuLiOuLpFxuICAgIC8vIOuvuOuemCDtmZXsnqXshLHsnYQg7JyE7ZW0IEFQSSDsi5zqt7jri4jsspjsl5DripQg7Y+s7ZWo7Iuc7Lyw7Iq164uI64ukXG4gICAgX3RhcmdldERiOiBLbmV4LFxuICAgIHByaXZhdGUgdGFyZ2V0RGJOYW1lOiBTb25hbXVEQlByZXNldCxcbiAgICBwcml2YXRlIGVudGl0eU1hbmFnZXI6IHR5cGVvZiBFbnRpdHlNYW5hZ2VyLFxuICAgIG9wdGlvbnM/OiBGaXh0dXJlR2VuZXJhdG9yT3B0aW9ucyxcbiAgKSB7XG4gICAgdGhpcy5kYXRhRXhwbG9yZXIgPSBuZXcgRGF0YUV4cGxvcmVyKHNvdXJjZURiLCBlbnRpdHlNYW5hZ2VyKTtcbiAgICB0aGlzLmxvY2FsZSA9IG9wdGlvbnM/LmxvY2FsZSB8fCBcImtvXCI7XG4gICAgdGhpcy5tYXBwaW5ncyA9IGZha2VyTWFwcGluZ3M7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgbG9jYWxlOiBvcHRpb25zPy5sb2NhbGUgfHwgXCJrb1wiLFxuICAgICAgdXNlTExNOiBvcHRpb25zPy51c2VMTE0gfHwgZmFsc2UsXG4gICAgICBlbmFibGVMTE1DYWNoZTogb3B0aW9ucz8uZW5hYmxlTExNQ2FjaGUgIT09IGZhbHNlLFxuICAgICAgbGxtTW9kZWw6IG9wdGlvbnM/LmxsbU1vZGVsIHx8IFwiY2xhdWRlLXNvbm5ldC00LTZcIixcbiAgICAgIGdlbmVyYXRlVGV4dDogb3B0aW9ucz8uZ2VuZXJhdGVUZXh0LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRml4dHVyZSDsg53shLEgKOuLqOydvClcbiAgICogQHJldHVybnMg7IOd7ISx65CcIGZpeHR1cmUg642w7J207YSwICjrqZTrqqjrpqwg7IOBKVxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGU8T3ZlcnJpZGVzID0gdW5kZWZpbmVkPihcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgb3ZlcnJpZGVzPzogT3ZlcnJpZGVzLFxuICAgIGNvbnRleHQ6IEdlbmVyYXRvckNvbnRleHQgPSB0aGlzLmNyZWF0ZUNvbnRleHQoKSxcbiAgKTogUHJvbWlzZTxEYXRhRXhwbG9yZXJSZWNvcmQ+IHtcbiAgICBjb25zdCBwYXJzZWRPdmVycmlkZXMgPSBkYXRhRXhwbG9yZXJSZWNvcmRTY2hlbWEucGFyc2Uob3ZlcnJpZGVzID8/IHt9KTtcbiAgICAvLyBFbnRpdHkg7LqQ7IuxOiDthYzsiqTtirjsl5DshJwgZW50aXR5IGNvbmUg7IiY7KCV7J20IOuwmOyYgeuQmOuPhOuhnSDrs7TsnqVcbiAgICBsZXQgZW50aXR5ID0gdGhpcy5lbnRpdHlDYWNoZS5nZXQoZW50aXR5TmFtZSk7XG4gICAgaWYgKCFlbnRpdHkpIHtcbiAgICAgIGVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoZW50aXR5TmFtZSk7XG4gICAgICB0aGlzLmVudGl0eUNhY2hlLnNldChlbnRpdHlOYW1lLCBlbnRpdHkpO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBJZCA9IGAke2VudGl0eU5hbWV9I3RlbXAjJHtEYXRlLm5vdygpfWA7IC8vIOyehOyLnCBJRFxuXG4gICAgLy8gTExNIHJvdyDri6jsnIQg7IOd7ISx7J2EIOychO2VnCDqs6DsnKAg7YKkICjqsJnsnYAgcm937J2YIO2VhOuTnOuTpOydtCDrj5nsnbztlZwgcm93S2V566W8IOqzteycoClcbiAgICBjb25zdCByb3dLZXkgPSB0aGlzLm9wdGlvbnMudXNlTExNID8gYCR7ZW50aXR5TmFtZX0jcm93IyR7RGF0ZS5ub3coKX1gIDogdW5kZWZpbmVkO1xuXG4gICAgLy8g6rCBIHByb3Drs4Qg6rCSIOyDneyEsVxuICAgIGNvbnN0IGZpeHR1cmU6IERhdGFFeHBsb3JlclJlY29yZCA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIGVudGl0eS5wcm9wcykge1xuICAgICAgLy8gVmlydHVhbCBwcm9w7J2AIOyKpO2CtVxuICAgICAgaWYgKFwidmlydHVhbFwiIGluIHByb3AgJiYgcHJvcC52aXJ0dWFsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBpZCBwcm9wIOyymOumrFxuICAgICAgaWYgKHByb3AubmFtZSA9PT0gXCJpZFwiKSB7XG4gICAgICAgIC8vIERCIHNlcXVlbmNl6rCAIOyekOuPmSDtlaDri7k6IGludGVnZXIvYmlnSW50ZWdlcuydtOqxsOuCmCwgc3RyaW5n7J207KeA66eMIGRiRGVmYXVsdOyXkCBuZXh0dmFs7J20IOyeiOuKlCDqsr3smrBcbiAgICAgICAgY29uc3QgaGFzRGJTZXF1ZW5jZSA9XG4gICAgICAgICAgcHJvcC50eXBlID09PSBcImludGVnZXJcIiB8fFxuICAgICAgICAgIHByb3AudHlwZSA9PT0gXCJiaWdJbnRlZ2VyXCIgfHxcbiAgICAgICAgICAocHJvcC50eXBlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICBcImRiRGVmYXVsdFwiIGluIHByb3AgJiZcbiAgICAgICAgICAgIHouc3RyaW5nKCkuc2FmZVBhcnNlKHByb3AuZGJEZWZhdWx0KS5kYXRhPy5pbmNsdWRlcyhcIm5leHR2YWxcIikgPT09IHRydWUpO1xuICAgICAgICBpZiAoaGFzRGJTZXF1ZW5jZSkge1xuICAgICAgICAgIC8vIGdlbmVyYXRlQmF0Y2jsl5DshJwg7LKY66as7ZWY66+A66GcIOyXrOq4sOyEoCDsiqTtgrVcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcC50eXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgLy8gc3RyaW5nIFBLOiBhbHBoYW51bWVyaWMgMzLsnpAg7IOd7ISxIChiZXR0ZXItYXV0aCDsiqTtg4DsnbwpXG4gICAgICAgICAgY29uc3QgeyBmYWtlcjogX2Zha2VyIH0gPSBhd2FpdCBpbXBvcnQoXCJAZmFrZXItanMvZmFrZXJcIik7XG4gICAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gX2Zha2VyLnN0cmluZy5hbHBoYW51bWVyaWMoMzIpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wLnR5cGUgPT09IFwidXVpZFwiKSB7XG4gICAgICAgICAgY29uc3QgeyBmYWtlcjogX2Zha2VyIH0gPSBhd2FpdCBpbXBvcnQoXCJAZmFrZXItanMvZmFrZXJcIik7XG4gICAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gX2Zha2VyLnN0cmluZy51dWlkKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIG92ZXJyaWRl6rCAIOyeiOycvOuptCDsgqzsmqlcbiAgICAgIGlmIChwcm9wLm5hbWUgaW4gcGFyc2VkT3ZlcnJpZGVzKSB7XG4gICAgICAgIGZpeHR1cmVbcHJvcC5uYW1lXSA9IHBhcnNlZE92ZXJyaWRlc1twcm9wLm5hbWVdO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gY29uZeyXkOyEnCDsg53shLEg7KCE6561IO2ZleyduFxuICAgICAgY29uc3QgY29uZSA9IHByb3AuY29uZTtcblxuICAgICAgLy8gMS4gUmVsYXRpb24gcHJvcCDsspjrpqxcbiAgICAgIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAvLyBCZWxvbmdzVG9PbmUgLyBPbmVUb09uZShoYXNKb2luQ29sdW1uKeydgCBGSyDsu6zrn7zrqoUoe3Byb3AubmFtZX1faWQp7Jy866Gc64+EIG92ZXJyaWRl66W8IOuwm+uKlOuLpFxuICAgICAgICBjb25zdCBma0NvbE5hbWUgPSBgJHtwcm9wLm5hbWV9X2lkYDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZrQ29sTmFtZSBpbiBwYXJzZWRPdmVycmlkZXMgJiZcbiAgICAgICAgICAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZml4dHVyZVtma0NvbE5hbWVdID0gcGFyc2VkT3ZlcnJpZGVzW2ZrQ29sTmFtZV07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWxhdGlvblZhbHVlID0gYXdhaXQgdGhpcy5nZW5lcmF0ZVJlbGF0aW9uVmFsdWUoZW50aXR5LCBwcm9wLCBjb250ZXh0KTtcbiAgICAgICAgLy8gQmVsb25nc1RvT25lLCBPbmVUb09uZShoYXNKb2luQ29sdW1uKeydmCDqsr3smrAgZm9yZWlnbiBrZXkg7Lus65+866qF7Jy866GcIOyggOyepVxuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHxcbiAgICAgICAgICAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pXG4gICAgICAgICkge1xuICAgICAgICAgIGZpeHR1cmVbYCR7cHJvcC5uYW1lfV9pZGBdID0gcmVsYXRpb25WYWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaXh0dXJlW3Byb3AubmFtZV0gPSByZWxhdGlvblZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBjb25lLm5vdGUgKyBMTE0g7IKs7JqpICh1c2VMTE3snbTrqbQgZml4dHVyZUdlbmVyYXRvcuuztOuLpCDsmrDshKApXG4gICAgICBpZiAoY29uZT8ubm90ZSAmJiB0aGlzLm9wdGlvbnMudXNlTExNKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbGxtVmFsdWUgPSBhd2FpdCB0aGlzLmdlbmVyYXRlV2l0aExMTShjb25lLm5vdGUsIHByb3AsIGVudGl0eSwgcm93S2V5KTtcbiAgICAgICAgICAvLyBzdHJpbmcg7YOA7J6F7J206rOgIGxlbmd0aCDsoJzslb3snbQg7J6I7Jy866m0IOy0iOqzvCDsi5wgdHJ1bmNhdGlvblxuICAgICAgICAgIGNvbnN0IGxsbVRleHQgPSB6LnN0cmluZygpLnNhZmVQYXJzZShsbG1WYWx1ZSk7XG4gICAgICAgICAgY29uc3QgbWF4TGVuZ3RoID0gXCJsZW5ndGhcIiBpbiBwcm9wID8gei5udW1iZXIoKS5zYWZlUGFyc2UocHJvcC5sZW5ndGgpIDogdW5kZWZpbmVkO1xuICAgICAgICAgIGlmIChsbG1UZXh0LnN1Y2Nlc3MgJiYgbWF4TGVuZ3RoPy5zdWNjZXNzICYmIGxsbVRleHQuZGF0YS5sZW5ndGggPiBtYXhMZW5ndGguZGF0YSkge1xuICAgICAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gbGxtVGV4dC5kYXRhLnNsaWNlKDAsIG1heExlbmd0aC5kYXRhKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gbGxtVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBbRml4dHVyZUdlbmVyYXRvcl0gTExNIGdlbmVyYXRpb24gZmFpbGVkIGZvciAke2VudGl0eS5pZH0uJHtwcm9wLm5hbWV9LCBmYWxsaW5nIGJhY2sgdG8gZml4dHVyZUdlbmVyYXRvciBvciBkZWZhdWx0YCxcbiAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3IsXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBmYWxsYmFjazogZml4dHVyZUdlbmVyYXRvciDihpIgZml4dHVyZURlZmF1bHQg4oaSIOq4sOuzuOqwkuycvOuhnCDqs4Tsho1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAzLiBmaXh0dXJlR2VuZXJhdG9yIOyCrOyaqVxuICAgICAgaWYgKGNvbmU/LmZpeHR1cmVHZW5lcmF0b3IpIHtcbiAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gYXdhaXQgdGhpcy5leGVjdXRlR2VuZXJhdG9yKGNvbmUuZml4dHVyZUdlbmVyYXRvciwgcHJvcCwgZW50aXR5KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIDQuIGZpeHR1cmVEZWZhdWx0IOyCrOyaqVxuICAgICAgaWYgKGNvbmU/LmZpeHR1cmVEZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gZGF0YUV4cGxvcmVyVmFsdWVTY2hlbWEucGFyc2UoY29uZS5maXh0dXJlRGVmYXVsdCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyA1LiDtg4DsnoXrs4Qg6riw67O4IOyDneyEsVxuICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gYXdhaXQgdGhpcy5nZW5lcmF0ZURlZmF1bHRWYWx1ZShwcm9wLCBlbnRpdHkpO1xuICAgIH1cblxuICAgIC8vIDYuIGVtYWlsIO2VhOuTnOqwgCDsnojqs6AgbmFtZSDtlYTrk5zqsIAg7J6I7Jy866m0LCBlbWFpbOydmCDroZzsu6wg7YyM7Yq466W8IG5hbWUg6riw67CY7Jy866GcIOuztOyglVxuICAgIGNvbnN0IGVtYWlsID0gei5zdHJpbmcoKS5zYWZlUGFyc2UoZml4dHVyZS5lbWFpbCk7XG4gICAgaWYgKGVtYWlsLnN1Y2Nlc3MgJiYgIShcImVtYWlsXCIgaW4gcGFyc2VkT3ZlcnJpZGVzKSkge1xuICAgICAgY29uc3QgbmFtZVZhbHVlID0gZml4dHVyZS5uYW1lIHx8IGZpeHR1cmUudXNlcm5hbWUgfHwgZml4dHVyZS5mdWxsX25hbWUgfHwgZml4dHVyZS5uYW1lX2VuO1xuICAgICAgY29uc3QgcGFyc2VkTmFtZSA9IHouc3RyaW5nKCkuc2FmZVBhcnNlKG5hbWVWYWx1ZSk7XG4gICAgICBpZiAocGFyc2VkTmFtZS5zdWNjZXNzKSB7XG4gICAgICAgIGNvbnN0IGRvbWFpbiA9IGVtYWlsLmRhdGEuc3BsaXQoXCJAXCIpWzFdIHx8IFwiZXhhbXBsZS5jb21cIjtcbiAgICAgICAgY29uc3Qgcm9tYW5pemVkID0gYXdhaXQgdGhpcy5yb21hbml6ZU5hbWUocGFyc2VkTmFtZS5kYXRhKTtcbiAgICAgICAgZml4dHVyZS5lbWFpbCA9IGAke3JvbWFuaXplZH1AJHtkb21haW59YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA3LiBwYXNzd29yZCDtlYTrk5wg7JWU7Zi47ZmUXG4gICAgY29uc3QgcGFzc3dvcmQgPSB6LnN0cmluZygpLnNhZmVQYXJzZShmaXh0dXJlLnBhc3N3b3JkKTtcbiAgICBpZiAocGFzc3dvcmQuc3VjY2VzcyAmJiBwYXNzd29yZC5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGJjcnlwdCA9IGF3YWl0IGltcG9ydChcImJjcnlwdFwiKTtcbiAgICAgIGZpeHR1cmUucGFzc3dvcmQgPSBhd2FpdCBiY3J5cHQuaGFzaChwYXNzd29yZC5kYXRhLCAxMCk7XG4gICAgfVxuXG4gICAgY29udGV4dC5maXh0dXJlcy5zZXQodGVtcElkLCBmaXh0dXJlKTtcbiAgICByZXR1cm4gZml4dHVyZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxhdGlvbiDqsJIg7IOd7ISxICsg7J6Q64+ZIEltcG9ydFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZVJlbGF0aW9uVmFsdWUoXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgcHJvcDogRW50aXR5UHJvcCxcbiAgICBjb250ZXh0OiBHZW5lcmF0b3JDb250ZXh0LFxuICApOiBQcm9taXNlPG51bWJlciB8IHN0cmluZyB8IG51bGw+IHtcbiAgICBpZiAoIWlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpeHR1cmVHZW5lcmF0b3I6ICR7ZW50aXR5LmlkfS4ke3Byb3AubmFtZX0gaXMgbm90IGEgcmVsYXRpb24gcHJvcGApO1xuICAgIH1cblxuICAgIC8vIEJlbG9uZ3NUb09uZSwgT25lVG9PbmUoaGFzSm9pbkNvbHVtbinrp4wg7LKY66asXG4gICAgaWYgKFxuICAgICAgIWlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmXG4gICAgICAhKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZSA9IHByb3AuY29uZTtcbiAgICBjb25zdCBkYXRhU291cmNlID0gY29uZT8uZGF0YVNvdXJjZTtcblxuICAgIC8vIERhdGFFeHBsb3JlcuuhnCDssLjsobAg642w7J207YSwIOyhsO2ajCAoc291cmNlRGIpXG4gICAgLy8g6rSA6rOEIOyytOyduOydhCDrlLDrnbzqsIDquLAg7JyE7ZW0IGV4cGxvcmVXaXRoUmVsYXRpb25zIOyCrOyaqVxuICAgIGlmIChkYXRhU291cmNlKSB7XG4gICAgICBjb25zdCBjYWNoZUtleSA9IGAke3Byb3Aud2l0aH06JHtKU09OLnN0cmluZ2lmeShkYXRhU291cmNlKX1gO1xuXG4gICAgICBpZiAoIWNvbnRleHQucmVmZXJlbmNlQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgICBjb25zdCBkYXRhU291cmNlQ29uZmlnID0gZGF0YVNvdXJjZUNvbmZpZ1NjaGVtYS5wYXJzZShkYXRhU291cmNlLmNvbmZpZyA/PyB7fSk7XG4gICAgICAgIGNvbnN0IGV4cGxvcmVSZXN1bHQgPSBhd2FpdCB0aGlzLmRhdGFFeHBsb3Jlci5leHBsb3JlV2l0aFJlbGF0aW9ucyhwcm9wLndpdGgsIHtcbiAgICAgICAgICBzdHJhdGVneTogZGF0YVNvdXJjZS5zdHJhdGVneSxcbiAgICAgICAgICBsaW1pdDogZGF0YVNvdXJjZUNvbmZpZy5saW1pdCA/PyAxMCxcbiAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zOiB0cnVlLFxuICAgICAgICAgIG1heERlcHRoOiAzLFxuICAgICAgICAgIC4uLmRhdGFTb3VyY2VDb25maWcsXG4gICAgICAgIH0pO1xuICAgICAgICBjb250ZXh0LnJlZmVyZW5jZUNhY2hlLnNldChjYWNoZUtleSwgZXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMpO1xuXG4gICAgICAgIC8vIOyhsO2ajO2VnCDrjbDsnbTthLDsmYAg6rSA6rOE65CcIOuqqOuToCDsl5Tti7Dti7DrpbwgdGFyZ2V0RGLsl5AgaW1wb3J0XG4gICAgICAgIGF3YWl0IHRoaXMuaW1wb3J0RXhwbG9yZVJlc3VsdChleHBsb3JlUmVzdWx0LCBjb250ZXh0KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IGNvbnRleHQucmVmZXJlbmNlQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICAgIGlmIChjYW5kaWRhdGVzICYmIGNhbmRpZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyDrnpzrjaTtlZjqsowg7ZWY64KYIOyEoO2DnVxuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IGNhbmRpZGF0ZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2FuZGlkYXRlcy5sZW5ndGgpXTtcbiAgICAgICAgcmV0dXJuIHoudW5pb24oW3oubnVtYmVyKCksIHouc3RyaW5nKCldKS5wYXJzZShzZWxlY3RlZC5pZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0YVNvdXJjZeqwgCDsl4bsnYQg65WMIOyekOuPmeycvOuhnCBmaXh0dXJlIERC7JeQ7IScIOyhsO2ajCDsi5zrj4RcbiAgICAvLyDqtIDqs4Qg7LK07J247J2EIOuUsOudvOqwgOq4sCDsnITtlbQgZXhwbG9yZVdpdGhSZWxhdGlvbnMg7IKs7JqpXG4gICAgY29uc3QgYXV0b0tleSA9IGAke3Byb3Aud2l0aH06YXV0b2A7XG4gICAgaWYgKCFjb250ZXh0LnJlZmVyZW5jZUNhY2hlLmhhcyhhdXRvS2V5KSkge1xuICAgICAgLy8gZml4dHVyZSBEQihzb3VyY2VEYinsl5DshJwg7J6Q64+ZIOyhsO2ajCAo6rSA6rOEIO2PrO2VqClcbiAgICAgIGNvbnN0IGF1dG9FeHBsb3JlUmVzdWx0ID0gYXdhaXQgdGhpcy5kYXRhRXhwbG9yZXIuZXhwbG9yZVdpdGhSZWxhdGlvbnMocHJvcC53aXRoLCB7XG4gICAgICAgIHN0cmF0ZWd5OiBcInJhbmRvbVwiLFxuICAgICAgICBsaW1pdDogMTAsXG4gICAgICAgIGluY2x1ZGVSZWxhdGlvbnM6IHRydWUsXG4gICAgICAgIG1heERlcHRoOiAzLFxuICAgICAgfSk7XG4gICAgICBjb250ZXh0LnJlZmVyZW5jZUNhY2hlLnNldChhdXRvS2V5LCBhdXRvRXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMpO1xuXG4gICAgICAvLyDsobDtmoztlZwg642w7J207YSw7JmAIOq0gOqzhOuQnCDrqqjrk6Ag7JeU7Yuw7Yuw66W8IHRhcmdldERi7JeQIGltcG9ydFxuICAgICAgaWYgKGF1dG9FeHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW1wb3J0RXhwbG9yZVJlc3VsdChhdXRvRXhwbG9yZVJlc3VsdCwgY29udGV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYXV0b0NhbmRpZGF0ZXMgPSBjb250ZXh0LnJlZmVyZW5jZUNhY2hlLmdldChhdXRvS2V5KTtcbiAgICBpZiAoYXV0b0NhbmRpZGF0ZXMgJiYgYXV0b0NhbmRpZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8g656c642k7ZWY6rKMIO2VmOuCmCDshKDtg51cbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gYXV0b0NhbmRpZGF0ZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYXV0b0NhbmRpZGF0ZXMubGVuZ3RoKV07XG4gICAgICByZXR1cm4gei51bmlvbihbei5udW1iZXIoKSwgei5zdHJpbmcoKV0pLnBhcnNlKHNlbGVjdGVkLmlkKTtcbiAgICB9XG5cbiAgICAvLyDssLjsobAg642w7J207YSw6rCAIOyXhuycvOuptCBudWxsIOuwmO2ZmCAobnVsbGFibGXsnbgg6rK97JqwKVxuICAgIGlmIChwcm9wLm51bGxhYmxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBudWxsYWJsZeydtCDslYTri4jqs6Ag642w7J207YSw64+EIOyXhuycvOuptCDsl5Drn6xcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRml4dHVyZUdlbmVyYXRvcjogJHtlbnRpdHkuaWR9LiR7cHJvcC5uYW1lfeyXkCDtlYTsmpTtlZwgJHtwcm9wLndpdGh9IOuNsOydtO2EsOqwgCDsl4bsirXri4jri6QuIGAgK1xuICAgICAgICBg66i87KCAICR7cHJvcC53aXRofeulvCDsg53shLHtlZjqsbDrgpggY29uZS5kYXRhU291cmNl66W8IOyEpOygle2VmOyEuOyalC5gLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRXhwbG9yZVdpdGhSZWxhdGlvbnMg6rKw6rO866W8IHRhcmdldERi7JeQIGltcG9ydFxuICAgKlxuICAgKiDqtIDqs4Qg7LK07J247J2EIOuUsOudvOqwhCDqsrDqs7wobWFpbiArIHJlbGF0ZWQp66W8IOuqqOuRkCBpbXBvcnTtlanri4jri6QuXG4gICAqIOydmOyhtOyEsSDsiJzshJzripQgRml4dHVyZU1hbmFnZXIuaW5zZXJ0Rml4dHVyZXPqsIAg7J6Q64+Z7Jy866GcIOyymOumrO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW1wb3J0RXhwbG9yZVJlc3VsdChcbiAgICBleHBsb3JlUmVzdWx0OiBFeHBsb3JlV2l0aFJlbGF0aW9uc1Jlc3VsdCxcbiAgICBjb250ZXh0OiBHZW5lcmF0b3JDb250ZXh0LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhbGxGaXh0dXJlUmVjb3JkczogRml4dHVyZVJlY29yZFtdID0gW107XG5cbiAgICAvLyAxLiBSZWxhdGVkIGVudGl0aWVzIGltcG9ydCAoQ29tcGFueSwgRGVwYXJ0bWVudCDrk7EpXG4gICAgZm9yIChjb25zdCBbZW50aXR5SWQsIHJlY29yZHNdIG9mIGV4cGxvcmVSZXN1bHQucmVsYXRlZC5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgY29uc3QgcmVjb3Jkc1RvSW1wb3J0OiBEYXRhRXhwbG9yZXJSZWNvcmRbXSA9IFtdO1xuXG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsuY3lhbihgSW1wb3J0aW5nIHJlbGF0ZWQgZW50aXR5OiAke2VudGl0eUlkfSAoJHtyZWNvcmRzLmxlbmd0aH0gcmVjb3JkcylgKSxcbiAgICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgcmVjb3Jkcykge1xuICAgICAgICBjb25zdCByZWNvcmRLZXkgPSBgJHtlbnRpdHlJZH0jJHtyZWNvcmQuaWR9YDtcbiAgICAgICAgaWYgKCFjb250ZXh0LmltcG9ydGVkUmVjb3Jkcy5oYXMocmVjb3JkS2V5KSkge1xuICAgICAgICAgIHJlY29yZHNUb0ltcG9ydC5wdXNoKHJlY29yZCk7XG4gICAgICAgICAgY29udGV4dC5pbXBvcnRlZFJlY29yZHMuYWRkKHJlY29yZEtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZHNUb0ltcG9ydC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHNUb0ltcG9ydCkge1xuICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGNoYWxrLmdyYXkoXG4gICAgICAgICAgICAgICAgYCAgLSBQcm9jZXNzaW5nICR7ZW50aXR5SWR9IHJlY29yZDpgLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHJlY29yZCkuc2xpY2UoMCwgMTAwKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZml4dHVyZVJlY29yZHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5jcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgcGFyc2VGaXh0dXJlU291cmNlUmVjb3JkKHJlY29yZCksXG4gICAgICAgICAgICB7IGRiOiB0aGlzLnNvdXJjZURiLCBzaW5nbGVSZWNvcmQ6IHRydWUgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGFsbEZpeHR1cmVSZWNvcmRzLnB1c2goLi4uZml4dHVyZVJlY29yZHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMi4gTWFpbiBlbnRpdHkgaW1wb3J0IChFbXBsb3llZSDrk7EpXG4gICAgY29uc3QgbWFpbkVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoZXhwbG9yZVJlc3VsdC5tYWluLmVudGl0eUlkKTtcbiAgICBjb25zdCBtYWluUmVjb3Jkc1RvSW1wb3J0OiBEYXRhRXhwbG9yZXJSZWNvcmRbXSA9IFtdO1xuXG4gICAgIWlzVGVzdCgpICYmXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgICBgSW1wb3J0aW5nIG1haW4gZW50aXR5OiAke2V4cGxvcmVSZXN1bHQubWFpbi5lbnRpdHlJZH0gKCR7ZXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMubGVuZ3RofSByZWNvcmRzKWAsXG4gICAgICAgICksXG4gICAgICApO1xuXG4gICAgZm9yIChjb25zdCByZWNvcmQgb2YgZXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMpIHtcbiAgICAgIGNvbnN0IHJlY29yZEtleSA9IGAke2V4cGxvcmVSZXN1bHQubWFpbi5lbnRpdHlJZH0jJHtyZWNvcmQuaWR9YDtcbiAgICAgIGlmICghY29udGV4dC5pbXBvcnRlZFJlY29yZHMuaGFzKHJlY29yZEtleSkpIHtcbiAgICAgICAgbWFpblJlY29yZHNUb0ltcG9ydC5wdXNoKHJlY29yZCk7XG4gICAgICAgIGNvbnRleHQuaW1wb3J0ZWRSZWNvcmRzLmFkZChyZWNvcmRLZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtYWluUmVjb3Jkc1RvSW1wb3J0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIG1haW5SZWNvcmRzVG9JbXBvcnQpIHtcbiAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay5ncmF5KFxuICAgICAgICAgICAgICBgICAtIFByb2Nlc3NpbmcgJHtleHBsb3JlUmVzdWx0Lm1haW4uZW50aXR5SWR9IHJlY29yZDpgLFxuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShyZWNvcmQpLnNsaWNlKDAsIDEwMCksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgIGNvbnN0IGZpeHR1cmVSZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgICBtYWluRW50aXR5LFxuICAgICAgICAgIHBhcnNlRml4dHVyZVNvdXJjZVJlY29yZChyZWNvcmQpLFxuICAgICAgICAgIHsgZGI6IHRoaXMuc291cmNlRGIsIHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgICApO1xuICAgICAgICBhbGxGaXh0dXJlUmVjb3Jkcy5wdXNoKC4uLmZpeHR1cmVSZWNvcmRzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAzLiDrqqjrk6AgZml4dHVyZeulvCDtlZwg67KI7JeQIOyCveyehSAo7J2Y7KG07ISxIOyInOyEnCDsnpDrj5kg7LKY66asKVxuICAgIGlmIChhbGxGaXh0dXJlUmVjb3Jkcy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlcyh0aGlzLnRhcmdldERiTmFtZSwgYWxsRml4dHVyZVJlY29yZHMpO1xuXG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICBgQXV0by1pbXBvcnRlZCAke2V4cGxvcmVSZXN1bHQubWFpbi5lbnRpdHlJZH0gd2l0aCByZWxhdGlvbnM6IGAgK1xuICAgICAgICAgICAgICBgJHtleHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcy5sZW5ndGh9IG1haW4gKyAke2V4cGxvcmVSZXN1bHQucmVsYXRlZC5zaXplfSByZWxhdGVkIGVudGl0aWVzYCxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBmaXh0dXJlR2VuZXJhdG9yIOyLpO2WiSAoRmFrZXIuanPrp4wg7KeA7JuQKVxuICAgKlxuICAgKiBmYWtlci4qIO2YleyLneydmCDtkZztmITsi53snYQg7JWI7KCE7ZWY6rKMIO2MjOyLse2VmOyXrCDsi6Ttlontlanri4jri6QuXG4gICAqIOyYiDogXCJmYWtlci5pbnRlcm5ldC5lbWFpbCgpXCIg4oaSIGZha2VyLmludGVybmV0LmVtYWlsKClcbiAgICog7JiIOiBcImZha2VyLmxvcmVtLndvcmRzKDMpXCIg4oaSIGZha2VyLmxvcmVtLndvcmRzKDMpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVHZW5lcmF0b3IoXG4gICAgZ2VuZXJhdG9yOiBzdHJpbmcsXG4gICAgcHJvcDogRW50aXR5UHJvcCxcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgKTogUHJvbWlzZTxEYXRhRXhwbG9yZXJWYWx1ZT4ge1xuICAgIC8vIEZha2VyLmpzIO2RnO2YhOyLneunjCDsp4Dsm5BcbiAgICBpZiAoZ2VuZXJhdG9yLnN0YXJ0c1dpdGgoXCJmYWtlci5cIikpIHtcbiAgICAgIC8vIHVzZXJuYW1l7J2064KYIG5hbWUg7ZWE65Oc64qUIO2VnOq1reyWtCBmYWtlciDsgqzsmqlcbiAgICAgIGNvbnN0IGlzTmFtZUZpZWxkID0gcHJvcC5uYW1lID09PSBcInVzZXJuYW1lXCIgfHwgcHJvcC5uYW1lID09PSBcIm5hbWVcIjtcbiAgICAgIGNvbnN0IGZha2VyTW9kdWxlID0gYXdhaXQgaW1wb3J0KFwiQGZha2VyLWpzL2Zha2VyXCIpO1xuICAgICAgY29uc3QgZmFrZXIgPSBpc05hbWVGaWVsZCA/IGZha2VyTW9kdWxlLmZha2VyS08gOiBmYWtlck1vZHVsZS5mYWtlcjtcbiAgICAgIGNvbnN0IGV4cHIgPSBnZW5lcmF0b3Iuc2xpY2UoNik7IC8vIFwiZmFrZXIuXCIg7KCc6rGwXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIO2VqOyImCDqsr3roZzsmYAg7J247J6QIO2MjOyLsVxuICAgICAgICBjb25zdCBtYXRjaCA9IGV4cHIubWF0Y2goL14oW1xcdy5dKykoPzpcXCgoLio/KVxcKSk/JC8pO1xuICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEZpeHR1cmVHZW5lcmF0b3I6IEludmFsaWQgZmFrZXIgZXhwcmVzc2lvbiBmb3IgJHtwcm9wLm5hbWV9OiAke2dlbmVyYXRvcn1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBbLCBwYXRoLCBhcmdzU3RyXSA9IG1hdGNoO1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIuXCIpO1xuXG4gICAgICAgIC8vIGZha2VyIOqwneyytOyXkOyEnCDtlajsiJgg7LC+6riwXG4gICAgICAgIGxldCBtZW1iZXIgPSBkeW5hbWljTmFtZXNwYWNlU2NoZW1hLnBhcnNlKGZha2VyKTtcbiAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgaWYgKCEocGFydCBpbiBtZW1iZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpeHR1cmVHZW5lcmF0b3I6IEludmFsaWQgZmFrZXIgcGF0aCBmb3IgJHtwcm9wLm5hbWV9OiBmYWtlci4ke3BhdGh9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG5leHRNZW1iZXIgPSBtZW1iZXJbcGFydF07XG4gICAgICAgICAgaWYgKHBhcnQgIT09IHBhcnRzLmF0KC0xKSkge1xuICAgICAgICAgICAgbWVtYmVyID0gZHluYW1pY05hbWVzcGFjZVNjaGVtYS5wYXJzZShuZXh0TWVtYmVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmbiA9IGZha2VyRnVuY3Rpb25TY2hlbWEucGFyc2UobWVtYmVyW3BhcnRzLmF0KC0xKSA/PyBcIlwiXSk7XG5cbiAgICAgICAgbGV0IGFyZ3M6IERhdGFFeHBsb3JlclZhbHVlW10gPSBbXTtcbiAgICAgICAgaWYgKGFyZ3NTdHI/LnRyaW0oKSkge1xuICAgICAgICAgIGFyZ3MgPSB0aGlzLnBhcnNlR2VuZXJhdG9yQXJncyhhcmdzU3RyLCBwcm9wLm5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGFFeHBsb3JlclZhbHVlU2NoZW1hLnBhcnNlKGZuKC4uLmFyZ3MpKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGV4ZWN1dGUgZ2VuZXJhdG9yIFwiJHtnZW5lcmF0b3J9XCIgZm9yICR7cHJvcC5uYW1lfSwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQ6YCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZURlZmF1bHRWYWx1ZShwcm9wLCBlbnRpdHkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZha2VyIOydtOyZuOydmCDtkZztmITsi53snYAg7KeA7JuQ7ZWY7KeAIOyViuydjFxuICAgICFpc1Rlc3QoKSAmJlxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgVW5zdXBwb3J0ZWQgZ2VuZXJhdG9yIGV4cHJlc3Npb24gZm9yICR7cHJvcC5uYW1lfTogJHtnZW5lcmF0b3J9LiBPbmx5IGZha2VyLiogZXhwcmVzc2lvbnMgYXJlIHN1cHBvcnRlZC4gVXNpbmcgZGVmYXVsdCB2YWx1ZS5gLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZURlZmF1bHRWYWx1ZShwcm9wLCBlbnRpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VhOuTnOydmCDtg4DsnoXqs7wg7J2066aE7J2EIOu2hOyEne2VmOyXrCDsoIHsoIjtlZwg6riw67O46rCS7J2EIOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICog7Jqw7ISg7Iic7JyEOlxuICAgKiAxLiDtlYTrk5zrqoUg7Yyo7YS0IOunpOy5rSAoc2FsYXJ5LCBidWRnZXQg65OxIOydmOuvuOyeiOuKlCDrjbDsnbTthLApXG4gICAqIDIuIO2KueyImCDsvIDsnbTsiqQgKERlcGFydG1lbnQgbmFtZSDrk7Eg64+E66mU7J24IOyngOyLnSlcbiAgICogMy4g67Cw7Je0IO2DgOyehSAoSlNPTiDrsLDsl7QpXG4gICAqIDQuIEVudW0g7YOA7J6FXG4gICAqIDUuIO2DgOyeheuzhCDquLDrs7jqsJJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVEZWZhdWx0VmFsdWUoXG4gICAgcHJvcDogRW50aXR5UHJvcCxcbiAgICBlbnRpdHk/OiBFbnRpdHksXG4gICk6IFByb21pc2U8RGF0YUV4cGxvcmVyVmFsdWU+IHtcbiAgICBjb25zdCBmYWtlck1vZHVsZSA9IGF3YWl0IGltcG9ydChcIkBmYWtlci1qcy9mYWtlclwiKTtcbiAgICBjb25zdCBmYWtlciA9IGZha2VyTW9kdWxlLmZha2VyO1xuICAgIGNvbnN0IGZha2VyS08gPSBmYWtlck1vZHVsZS5mYWtlcktPO1xuICAgIGNvbnN0IGZha2VySkEgPSBmYWtlck1vZHVsZS5mYWtlckpBO1xuXG4gICAgY29uc3QgbG9jYWxlRmFrZXIgPSB0aGlzLmxvY2FsZSA9PT0gXCJrb1wiID8gZmFrZXJLTyA6IHRoaXMubG9jYWxlID09PSBcImphXCIgPyBmYWtlckpBIDogZmFrZXI7XG5cbiAgICAvKipcbiAgICAgKiAxLiBFbnRpdHktc3BlY2lmaWMg7Yq57IiYIOy8gOydtOyKpOulvCDrqLzsoIAg7LKY66as7ZWp64uI64ukLlxuICAgICAqIGZpZWxkX3BhdHRlcm5z67O064ukIOyasOyEoO2VmOyXrCwg7Yq57KCVIOyXlO2LsO2LsOydmCDtlYTrk5zsl5Ag64+E66mU7J247JeQIOunnuuKlCDqsJLsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgICAqIOyYiDogRGVwYXJ0bWVudC5uYW1lIOKGkiDtlZzqta3slrQg67aA7ISc66qFICjsgqzrnowg7J2066aE7J20IOyVhOuLmClcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIERlcGFydG1lbnQgbmFtZeydgCDtlZzqta3slrQg67aA7ISc66qFIOuqqeuhneyXkOyEnCDshKDtg53tlanri4jri6QuXG4gICAgICog6rOg7Jyg7ISx7J2EIOychO2VtCA3MCUg7ZmV66Wg66GcIHByZWZpeC9zdWZmaXjrpbwg7LaU6rCA7ZWp64uI64ukLlxuICAgICAqL1xuICAgIGlmIChlbnRpdHk/LmlkID09PSBcIkRlcGFydG1lbnRcIiAmJiBwcm9wLm5hbWUgPT09IFwibmFtZVwiKSB7XG4gICAgICBjb25zdCBkZXBhcnRtZW50cyA9IFtcbiAgICAgICAgXCLqsJzrsJztjIBcIixcbiAgICAgICAgXCLquLDtmo3tjIBcIixcbiAgICAgICAgXCLrp4jsvIDtjIXtjIBcIixcbiAgICAgICAgXCLsmIHsl4XtjIBcIixcbiAgICAgICAgXCLsnbjsgqztjIBcIixcbiAgICAgICAgXCLstJ3rrLTtjIBcIixcbiAgICAgICAgXCLsnqzrrLTtjIBcIixcbiAgICAgICAgXCLtmozqs4TtjIBcIixcbiAgICAgICAgXCLrspXrrLTtjIBcIixcbiAgICAgICAgXCLrlJTsnpDsnbjtjIBcIixcbiAgICAgICAgXCJJVO2MgFwiLFxuICAgICAgICBcIuqzoOqwneyngOybkO2MgFwiLFxuICAgICAgICBcIu2SiOyniOq0gOumrO2MgFwiLFxuICAgICAgICBcIuyXsOq1rOqwnOuwnO2MgFwiLFxuICAgICAgICBcIuyDneyCsO2MgFwiLFxuICAgICAgICBcIuq1rOunpO2MgFwiLFxuICAgICAgICBcIuusvOulmO2MgFwiLFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHByZWZpeGVzID0gW1wi7Iug6recXCIsIFwi7Ya17ZWpXCIsIFwi7KCE6561XCIsIFwi6riA66Gc67KMXCIsIFwi65SU7KeA7YS4XCIsIFwi7ZW17IusXCJdO1xuICAgICAgY29uc3Qgc3VmZml4ZXMgPSBbXCIx7YyAXCIsIFwiMu2MgFwiLCBcIjPtjIBcIiwgXCJB7YyAXCIsIFwiQu2MgFwiLCBcIuuzuOu2gFwiLCBcIuyEvO2EsFwiLCBcIuq3uOujuVwiXTtcblxuICAgICAgY29uc3QgZGVwdCA9IGZha2VyLmhlbHBlcnMuYXJyYXlFbGVtZW50KGRlcGFydG1lbnRzKTtcblxuICAgICAgY29uc3QgcmFuZG9tID0gTWF0aC5yYW5kb20oKTtcbiAgICAgIGlmIChyYW5kb20gPiAwLjcpIHtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gZmFrZXIuaGVscGVycy5hcnJheUVsZW1lbnQocHJlZml4ZXMpO1xuICAgICAgICByZXR1cm4gYCR7cHJlZml4fSAke2RlcHR9YDtcbiAgICAgIH1cbiAgICAgIGlmIChyYW5kb20gPiAwLjQpIHtcbiAgICAgICAgY29uc3Qgc3VmZml4ID0gZmFrZXIuaGVscGVycy5hcnJheUVsZW1lbnQoc3VmZml4ZXMpO1xuICAgICAgICByZXR1cm4gYCR7ZGVwdH0gJHtzdWZmaXh9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZXB0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDIuIO2VhOuTnOuqheyXkOyEnCDsnZjrr7jrpbwg7LaU66Gg7ZWY7JesIO2YhOyLpOyggeyduCDrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgICAqIOyYiDogc2FsYXJ5IOKGkiAzME1+MTUwTSAo7ZWc6rWtIOyXsOu0iSDrspTsnIQpXG4gICAgICogICAgIGJ1ZGdldCDihpIgMTBNfjUwME0gKO2UhOuhnOygne2KuCDsmIjsgrAg67KU7JyEKVxuICAgICAqL1xuICAgIGNvbnN0IGxvY2FsZU1hcHBpbmdzID0gdGhpcy5tYXBwaW5nc1t0aGlzLmxvY2FsZV0gfHwgdGhpcy5tYXBwaW5ncy5lbjtcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHByb3AubmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL18vZywgXCJcIik7XG5cbiAgICBmb3IgKGNvbnN0IFtwYXR0ZXJuLCBjb25maWddIG9mIE9iamVjdC5lbnRyaWVzKGxvY2FsZU1hcHBpbmdzLmZpZWxkX3BhdHRlcm5zKSkge1xuICAgICAgaWYgKG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKHBhdHRlcm4udG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlRmFrZXJFeHByZXNzaW9uKGNvbmZpZy5mYWtlciwgcHJvcCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gZXhlY3V0ZSBmaWVsZCBwYXR0ZXJuIFwiJHtwYXR0ZXJufVwiIGZvciAke3Byb3AubmFtZX0sIGZhbGxpbmcgYmFjazpgLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAzLiBKU09OIO2DgOyeheydtOuptOyEnCDrsLDsl7Tsnbgg6rK97JqwIChTb25hbXVGaWxlW10sIHN0cmluZ1tdIOuTsSlcbiAgICAgKiDtlYTrk5zrqoUg7Yyo7YS07J2EIOuztOqzoCDsoIHsoIjtlZwg67Cw7Je0IOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gICAgICovXG4gICAgaWYgKHByb3AudHlwZSA9PT0gXCJqc29uXCIgJiYgXCJpZFwiIGluIHByb3AgJiYgcHJvcC5pZCkge1xuICAgICAgaWYgKHByb3AuaWQuZW5kc1dpdGgoXCJbXVwiKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUFycmF5VmFsdWUocHJvcCwgZW50aXR5LCBmYWtlciwgbG9jYWxlRmFrZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiA0LiBFbnVtIO2DgOyeheydgCDsoJXsnZjrkJwg6rCSIOykkSDtlZjrgpjrpbwg656c642kIOyEoO2Dne2VqeuLiOuLpCAqL1xuICAgIGlmIChwcm9wLnR5cGUgPT09IFwiZW51bVwiKSB7XG4gICAgICBsZXQgZW51bVZhbHVlczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgaWYgKFwiZW51bVwiIGluIHByb3AgJiYgQXJyYXkuaXNBcnJheShwcm9wLmVudW0pICYmIHByb3AuZW51bS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVudW1WYWx1ZXMgPSBwcm9wLmVudW07XG4gICAgICB9IGVsc2UgaWYgKFwiaWRcIiBpbiBwcm9wICYmIHByb3AuaWQgJiYgZW50aXR5Py5lbnVtTGFiZWxzPy5bcHJvcC5pZF0pIHtcbiAgICAgICAgZW51bVZhbHVlcyA9IE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzW3Byb3AuaWRdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVudW1WYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gZmFrZXIuaGVscGVycy5hcnJheUVsZW1lbnQoZW51bVZhbHVlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcC5udWxsYWJsZSA/IG51bGwgOiBcIlVOS05PV05cIjtcbiAgICB9XG5cbiAgICBpZiAocHJvcC50eXBlID09PSBcImVudW1bXVwiKSB7XG4gICAgICBsZXQgZW51bVZhbHVlczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgaWYgKFwiZW51bVwiIGluIHByb3AgJiYgQXJyYXkuaXNBcnJheShwcm9wLmVudW0pICYmIHByb3AuZW51bS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVudW1WYWx1ZXMgPSBwcm9wLmVudW07XG4gICAgICB9IGVsc2UgaWYgKFwiaWRcIiBpbiBwcm9wICYmIHByb3AuaWQgJiYgZW50aXR5Py5lbnVtTGFiZWxzPy5bcHJvcC5pZF0pIHtcbiAgICAgICAgZW51bVZhbHVlcyA9IE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzW3Byb3AuaWRdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVudW1WYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gW2Zha2VyLmhlbHBlcnMuYXJyYXlFbGVtZW50KGVudW1WYWx1ZXMpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA1LiBWZWN0b3Ig7YOA7J6F7J2AIO2YhOyerCDsp4Dsm5DtlZjsp4Ag7JWK7Jy866+A66GcIG51bGzsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgICAqIO2Wpe2bhCBBSSBlbWJlZGRpbmcg7IOd7ISxIOq4sOuKpSDstpTqsIAg7IucIOq1rO2YhCDsmIjsoJXsnoXri4jri6QuXG4gICAgICovXG4gICAgaWYgKHByb3AudHlwZSA9PT0gXCJ2ZWN0b3JcIiB8fCBwcm9wLnR5cGUgPT09IFwidmVjdG9yW11cIiB8fCBwcm9wLnR5cGUgPT09IFwidHN2ZWN0b3JcIikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqIDYuIO2DgOyeheuzhCDquLDrs7ggRmFrZXIg7ZGc7ZiE7Iud7J2EIOyLpO2Wie2VqeuLiOuLpCAqL1xuICAgIGNvbnN0IHR5cGVEZWZhdWx0ID0gbG9jYWxlTWFwcGluZ3MudHlwZV9kZWZhdWx0c1twcm9wLnR5cGVdO1xuICAgIGlmICh0eXBlRGVmYXVsdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUZha2VyRXhwcmVzc2lvbih0eXBlRGVmYXVsdC5mYWtlciwgcHJvcCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNoYWxrLnllbGxvdyhgRmFpbGVkIHRvIGV4ZWN1dGUgdHlwZSBkZWZhdWx0IGZvciAke3Byb3AudHlwZX0sIHVzaW5nIGZhbGxiYWNrOmAsIGVycm9yKSxcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiA3LiDrp6TtlZHrkJjsp4Ag7JWK7J2AIO2DgOyeheydgCDquLDrs7ggRmFrZXIg7ZWo7IiY66GcIOyymOumrO2VqeuLiOuLpCAqL1xuICAgIHN3aXRjaCAocHJvcC50eXBlKSB7XG4gICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICBjYXNlIFwic3RyaW5nW11cIjpcbiAgICAgICAgcmV0dXJuIGZha2VyLmxvcmVtLndvcmRzKDMpO1xuICAgICAgY2FzZSBcImludGVnZXJcIjpcbiAgICAgICAgcmV0dXJuIGZha2VyLm51bWJlci5pbnQoeyBtaW46IDEsIG1heDogMTAwMCB9KTtcbiAgICAgIGNhc2UgXCJpbnRlZ2VyW11cIjpcbiAgICAgICAgcmV0dXJuIFtmYWtlci5udW1iZXIuaW50KHsgbWluOiAxLCBtYXg6IDEwMDAgfSldO1xuICAgICAgY2FzZSBcImJpZ0ludGVnZXJcIjpcbiAgICAgICAgcmV0dXJuIGZha2VyLm51bWJlci5iaWdJbnQoeyBtaW46IDFuLCBtYXg6IDEwMDBuIH0pO1xuICAgICAgY2FzZSBcImJpZ0ludGVnZXJbXVwiOlxuICAgICAgICByZXR1cm4gW2Zha2VyLm51bWJlci5iaWdJbnQoeyBtaW46IDFuLCBtYXg6IDEwMDBuIH0pXTtcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICAgIHJldHVybiBmYWtlci5udW1iZXIuZmxvYXQoeyBtaW46IDAsIG1heDogMTAwMCB9KTtcbiAgICAgIGNhc2UgXCJudW1iZXJbXVwiOlxuICAgICAgY2FzZSBcIm51bWVyaWNbXVwiOlxuICAgICAgICByZXR1cm4gW2Zha2VyLm51bWJlci5mbG9hdCh7IG1pbjogMCwgbWF4OiAxMDAwIH0pXTtcbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiBmYWtlci5kYXRhdHlwZS5ib29sZWFuKCk7XG4gICAgICBjYXNlIFwiYm9vbGVhbltdXCI6XG4gICAgICAgIHJldHVybiBbZmFrZXIuZGF0YXR5cGUuYm9vbGVhbigpXTtcbiAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICBjYXNlIFwiZGF0ZVtdXCI6XG4gICAgICAgIHJldHVybiBmYWtlci5kYXRlLnBhc3QoKTtcbiAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIGNhc2UgXCJ1dWlkXCI6XG4gICAgICBjYXNlIFwidXVpZFtdXCI6XG4gICAgICAgIHJldHVybiBmYWtlci5zdHJpbmcudXVpZCgpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOuwsOyXtCDtg4DsnoXsnZgg6rCS7J2EIOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICog7YOA7J6FIElE7JmAIO2VhOuTnOuqhSDtjKjthLTsnYQg67aE7ISd7ZWY7JesIOyggeygiO2VnCDrsLDsl7Qg642w7J207YSw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICog7JiIOiBpbWFnZV91cmxzIOKGkiBbe3VybCwgbmFtZSwgbWltZV90eXBlfSwgLi4uXVxuICAgKiAgICAgdGFnX2lkcyDihpIgWzEsIDIzLCA0NV1cbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVBcnJheVZhbHVlKFxuICAgIHByb3A6IEVudGl0eVByb3AsXG4gICAgX2VudGl0eTogRW50aXR5IHwgdW5kZWZpbmVkLFxuICAgIGZha2VyOiB0eXBlb2YgaW1wb3J0KFwiQGZha2VyLWpzL2Zha2VyXCIpLmZha2VyLFxuICAgIF9sb2NhbGVGYWtlcjogdHlwZW9mIGltcG9ydChcIkBmYWtlci1qcy9mYWtlclwiKS5mYWtlcixcbiAgKTogRGF0YUV4cGxvcmVyVmFsdWVbXSB7XG4gICAgY29uc3QgY291bnQgPSBmYWtlci5udW1iZXIuaW50KHsgbWluOiAxLCBtYXg6IDMgfSk7XG5cbiAgICAvKiogU29uYW11RmlsZVtd7J2AIFNvbmFtdSDrgrTsnqUg7YOA7J6F7Jy866GcIOq1rOyhsOqwgCDsoJXtlbTsoLgg7J6I7Iq164uI64ukICovXG4gICAgaWYgKFwiaWRcIiBpbiBwcm9wICYmIHByb3AuaWQgPT09IFwiU29uYW11RmlsZVtdXCIpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoKSA9PiAoe1xuICAgICAgICB1cmw6IGZha2VyLmltYWdlLnVybCgpLFxuICAgICAgICBuYW1lOiBmYWtlci5zeXN0ZW0uZmlsZU5hbWUoKSxcbiAgICAgICAgbWltZV90eXBlOiBmYWtlci5oZWxwZXJzLmFycmF5RWxlbWVudChbXG4gICAgICAgICAgXCJpbWFnZS9qcGVnXCIsXG4gICAgICAgICAgXCJpbWFnZS9wbmdcIixcbiAgICAgICAgICBcImltYWdlL2dpZlwiLFxuICAgICAgICAgIFwiYXBwbGljYXRpb24vcGRmXCIsXG4gICAgICAgIF0pLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8qKiDtlYTrk5zrqoXsl5DshJwg67Cw7Je07J2YIOyaqeuPhOulvCDstpTroaDtlanri4jri6QgKi9cbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHByb3AubmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL18vZywgXCJcIik7XG5cbiAgICBpZiAobm9ybWFsaXplZE5hbWUuaW5jbHVkZXMoXCJ1cmxcIikgfHwgbm9ybWFsaXplZE5hbWUuaW5jbHVkZXMoXCJpbWFnZVwiKSkge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sICgpID0+IGZha2VyLmludGVybmV0LnVybCgpKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZE5hbWUuaW5jbHVkZXMoXCJpZFwiKSAmJiBub3JtYWxpemVkTmFtZS5lbmRzV2l0aChcInNcIikpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoKSA9PiBmYWtlci5udW1iZXIuaW50KHsgbWluOiAxLCBtYXg6IDEwMCB9KSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKFwidGFnXCIpIHx8IG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKFwibmFtZVwiKSkge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sICgpID0+IGZha2VyLmxvcmVtLndvcmQoKSk7XG4gICAgfVxuXG4gICAgLyoqIO2MqO2EtCDrp6Tsua3rkJjsp4Ag7JWK7Jy866m0IOu5iCDrsLDsl7TsnYQg67CY7ZmY7ZWp64uI64ukICovXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04g66ek7ZWR7J2YIEZha2VyIO2RnO2YhOyLneydhCDtjIzsi7HtlZjsl6wg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgKlxuICAgKiDtkZztmITsi50g7JiI7IucOlxuICAgKiAtIFwiZmFrZXIuaW50ZXJuZXQuZW1haWwoKVwiIOKGkiDsnbjsnpAg7JeG7J2MXG4gICAqIC0gXCJmYWtlci5udW1iZXIuaW50KHsgbWluOiAxLCBtYXg6IDEwMCB9KVwiIOKGkiBKU09OIOyduOyekFxuICAgKiAtIFwie31cIiDihpIg66as7YSw65+0IOqwkiAoSlNPTi5wYXJzZSlcbiAgICpcbiAgICogZmFrZXJLTywgZmFrZXJKQeuPhCDsp4Dsm5DtlZjsl6wg64uk6rWt7Ja0IOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVGYWtlckV4cHJlc3Npb24oXG4gICAgZXhwcmVzc2lvbjogc3RyaW5nLFxuICAgIHByb3A6IEVudGl0eVByb3AsXG4gICk6IFByb21pc2U8RGF0YUV4cGxvcmVyVmFsdWU+IHtcbiAgICBjb25zdCBmYWtlck1vZHVsZSA9IGF3YWl0IGltcG9ydChcIkBmYWtlci1qcy9mYWtlclwiKTtcbiAgICBjb25zdCBmYWtlciA9IGZha2VyTW9kdWxlLmZha2VyO1xuICAgIGNvbnN0IGZha2VyS08gPSBmYWtlck1vZHVsZS5mYWtlcktPO1xuICAgIGNvbnN0IGZha2VySkEgPSBmYWtlck1vZHVsZS5mYWtlckpBO1xuXG4gICAgLyoqIEZha2VyIO2RnO2YhOyLneydtCDslYTri4wg66as7YSw65+0IOqwkuydgCBKU09O7Jy866GcIO2MjOyLse2VqeuLiOuLpCAqL1xuICAgIGlmICghZXhwcmVzc2lvbi5zdGFydHNXaXRoKFwiZmFrZXJcIikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkYXRhRXhwbG9yZXJWYWx1ZVNjaGVtYS5wYXJzZShKU09OLnBhcnNlKGV4cHJlc3Npb24pKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiog7ZGc7ZiE7Iud7JeQ7IScIEZha2VyIOqwneyytOyZgCDqsr3roZzrpbwg7LaU7Lac7ZWp64uI64ukICovXG4gICAgY29uc3QgbWF0Y2ggPSBleHByZXNzaW9uLm1hdGNoKC9eKGZha2VyfGZha2VyS098ZmFrZXJKQSlcXC4oLio/KSQvKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZmFrZXIgZXhwcmVzc2lvbjogJHtleHByZXNzaW9ufWApO1xuICAgIH1cblxuICAgIGNvbnN0IFssIGZha2VyTmFtZSwgZXhwcl0gPSBtYXRjaDtcbiAgICBjb25zdCBzZWxlY3RlZEZha2VyID1cbiAgICAgIGZha2VyTmFtZSA9PT0gXCJmYWtlcktPXCIgPyBmYWtlcktPIDogZmFrZXJOYW1lID09PSBcImZha2VySkFcIiA/IGZha2VySkEgOiBmYWtlcjtcblxuICAgIGNvbnN0IGZ1bmNNYXRjaCA9IGV4cHIubWF0Y2goL14oW1xcdy5dKykoPzpcXCgoLio/KVxcKSk/JC8pO1xuICAgIGlmICghZnVuY01hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZmFrZXIgZXhwcmVzc2lvbiBmb3IgJHtwcm9wLm5hbWV9OiAke2V4cHJlc3Npb259YCk7XG4gICAgfVxuXG4gICAgY29uc3QgWywgcGF0aCwgYXJnc1N0cl0gPSBmdW5jTWF0Y2g7XG4gICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcblxuICAgIC8qKiDsoJAg7ZGc6riw67KVKGRvdCBub3RhdGlvbinsnLzroZwgRmFrZXIg7ZWo7IiY66W8IOywvuyVhOqwkeuLiOuLpCAqL1xuICAgIGxldCBtZW1iZXIgPSBkeW5hbWljTmFtZXNwYWNlU2NoZW1hLnBhcnNlKHNlbGVjdGVkRmFrZXIpO1xuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgaWYgKCEocGFydCBpbiBtZW1iZXIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBmYWtlciBwYXRoIGZvciAke3Byb3AubmFtZX06ICR7ZmFrZXJOYW1lfS4ke3BhdGh9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBuZXh0TWVtYmVyID0gbWVtYmVyW3BhcnRdO1xuICAgICAgaWYgKHBhcnQgIT09IHBhcnRzLmF0KC0xKSkge1xuICAgICAgICBtZW1iZXIgPSBkeW5hbWljTmFtZXNwYWNlU2NoZW1hLnBhcnNlKG5leHRNZW1iZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZuID0gZmFrZXJGdW5jdGlvblNjaGVtYS5wYXJzZShtZW1iZXJbcGFydHMuYXQoLTEpID8/IFwiXCJdKTtcblxuICAgIGxldCBhcmdzOiBEYXRhRXhwbG9yZXJWYWx1ZVtdID0gW107XG4gICAgaWYgKGFyZ3NTdHI/LnRyaW0oKSkge1xuICAgICAgYXJncyA9IHRoaXMucGFyc2VHZW5lcmF0b3JBcmdzKGFyZ3NTdHIsIHByb3AubmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGFFeHBsb3JlclZhbHVlU2NoZW1hLnBhcnNlKGZuKC4uLmFyZ3MpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBmaXh0dXJlSGludOulvCBMTE3sl5Dqsowg7KCE64us7ZWY7JesIO2YhOyLpOyggeyduCDthYzsiqTtirgg642w7J207YSw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICogZmFrZXIuanProZzripQg7IOd7ISx7ZWY6riwIOyWtOugpOyatCDrs7XsnqHtlZwg7YWN7Iqk7Yq4KOyekOq4sOyGjOqwnCwg7ISk66qF66y4IOuTsSnrpbxcbiAgICogTExN7J2EIO2ZnOyaqe2VmOyXrCDsg53shLHtlanri4jri6QuIOuPmeydvO2VnCBoaW507JeQIOuMgO2VnCDspJHrs7Ug7Zi47Lac7J2EIOuwqeyngO2VmOq4sCDsnITtlbRcbiAgICog7LqQ7Iux7J2EIOq4sOuzuOycvOuhnCDsp4Dsm5Dtlanri4jri6QgKExMTSBBUEkg67mE7JqpIOygiOqwkCkuXG4gICAqXG4gICAqIGFpIO2MqO2CpOyngOuKlCBkeW5hbWljIGltcG9ydOuhnCDrtojrn6zsmKTrr4DroZwsIHVzZUxMTeydtCBmYWxzZeyduCDqsr3smrBcbiAgICog7J2Y7KG07ISx7J20IOyEpOy5mOuQmOyngCDslYrslYTrj4QgZml4dHVyZSDsg53shLHsnbQg7KCV7IOBIOuPmeyeke2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVXaXRoTExNKFxuICAgIGZpeHR1cmVIaW50OiBzdHJpbmcsXG4gICAgcHJvcDogRW50aXR5UHJvcCxcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICByb3dLZXk/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8RGF0YUV4cGxvcmVyVmFsdWU+IHtcbiAgICAvLyByb3dLZXnqsIAg7J6I7Jy866m0IHJvdyDri6jsnIQg7IOd7ISxIOyghOuetSDsgqzsmqlcbiAgICBpZiAocm93S2V5KSB7XG4gICAgICBjb25zdCByb3dDYWNoZUtleSA9IGAke3Jvd0tleX06JHtwcm9wLm5hbWV9YDtcblxuICAgICAgLy8g7J2066+4IOydtCByb3fsl5Ag64yA7ZWcIExMTSDtmLjstpzsnbQg7JmE66OM65CcIOqyveyasCDsupDsi5zsl5DshJwg67CU66GcIOuwmO2ZmFxuICAgICAgaWYgKHRoaXMubGxtQ2FjaGUuaGFzKHJvd0NhY2hlS2V5KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5sbG1DYWNoZS5nZXQocm93Q2FjaGVLZXkpO1xuICAgICAgfVxuXG4gICAgICAvLyDsg4ggcm93OiBMTE0g64yA7IOBIHByb3Ag7KCE7LK066W8IO2VnCDrsojsl5Ag7IOd7ISxXG4gICAgICBjb25zdCBsbG1Qcm9wcyA9IGVudGl0eS5wcm9wcy5maWx0ZXIoKHApID0+IHtcbiAgICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHApKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChwLmNvbmU/LmZpeHR1cmVHZW5lcmF0b3IpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHAubmFtZSA9PT0gXCJpZFwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiAhIXAuY29uZT8ubm90ZTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBsbG1Qcm9wc+qwgCDruYTslrTsnojsnLzrqbQg64uo7J28IO2VhOuTnCDrsKnsi53snLzroZwgZmFsbGJhY2tcbiAgICAgIGlmIChsbG1Qcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgW0ZpeHR1cmVHZW5lcmF0b3JdIGxsbVByb3BzIGlzIGVtcHR5IGZvciAke2VudGl0eS5pZH0uJHtwcm9wLm5hbWV9LCB1c2luZyBzaW5nbGUgZmllbGQgZmFsbGJhY2tgLFxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlU2luZ2xlV2l0aExMTShmaXh0dXJlSGludCwgcHJvcCwgZW50aXR5KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXBpS2V5ID0gdGhpcy5nZXRBcGlLZXkoKTtcbiAgICAgIGNvbnN0IHsgY3JlYXRlQW50aHJvcGljIH0gPSBhd2FpdCBpbXBvcnQoXCJAYWktc2RrL2FudGhyb3BpY1wiKTtcbiAgICAgIGNvbnN0IGdlbmVyYXRlVGV4dCA9IGF3YWl0IHRoaXMuZ2V0VGV4dEdlbmVyYXRvcigpO1xuXG4gICAgICBjb25zdCByb3dSZXNwb25zZSA9IGF3YWl0IGdlbmVyYXRlVGV4dCh7XG4gICAgICAgIG1vZGVsOiBjcmVhdGVBbnRocm9waWMoeyBhcGlLZXkgfSkodGhpcy5vcHRpb25zLmxsbU1vZGVsIHx8IFwiY2xhdWRlLXNvbm5ldC00LTZcIiksXG4gICAgICAgIHByb21wdDogdGhpcy5idWlsZFJvd0xMTVByb21wdChsbG1Qcm9wcywgZW50aXR5KSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgcm93UmVzcG9uc2VUZXh0ID0gei5zdHJpbmcoKS5zYWZlUGFyc2Uocm93UmVzcG9uc2U/LnRleHQpO1xuICAgICAgaWYgKCFyb3dSZXNwb25zZVRleHQuc3VjY2Vzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIExMTSByZXNwb25zZVwiKTtcbiAgICAgIH1cblxuICAgICAgLy8g7J2R64u17J2EIO2MjOyLse2VmOyXrCDqsIEg7ZWE65Oc7JeQIOuMgO2VnCDqsrDqs7zrpbwg7LqQ7Iuc7JeQIOyggOyepVxuICAgICAgY29uc3Qgcm93UmVzdWx0ID0gdGhpcy5wYXJzZVJvd0xMTVJlc3BvbnNlKHJvd1Jlc3BvbnNlVGV4dC5kYXRhLCBsbG1Qcm9wcyk7XG4gICAgICBmb3IgKGNvbnN0IFtmaWVsZE5hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyb3dSZXN1bHQpKSB7XG4gICAgICAgIHRoaXMubGxtQ2FjaGUuc2V0KGAke3Jvd0tleX06JHtmaWVsZE5hbWV9YCwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICAvLyDsmpTssq3tlZwg7ZWE65Oc7J2YIOqwkiDrsJjtmZggKOyXhuycvOuptCDri6jsnbwg7ZWE65OcIGZhbGxiYWNrKVxuICAgICAgaWYgKHRoaXMubGxtQ2FjaGUuaGFzKHJvd0NhY2hlS2V5KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5sbG1DYWNoZS5nZXQocm93Q2FjaGVLZXkpO1xuICAgICAgfVxuXG4gICAgICAvLyDrp4zslb0gcm93IOydkeuLteyXkCDsnbQg7ZWE65Oc6rCAIOuIhOudveuQnCDqsr3smrAg64uo7J28IO2VhOuTnCBmYWxsYmFja1xuICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVTaW5nbGVXaXRoTExNKGZpeHR1cmVIaW50LCBwcm9wLCBlbnRpdHkpO1xuICAgIH1cblxuICAgIC8vIHJvd0tleeqwgCDsl4bsnLzrqbQg6riw7KG0IOuLqOydvCDtlYTrk5wg67Cp7IudXG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVTaW5nbGVXaXRoTExNKGZpeHR1cmVIaW50LCBwcm9wLCBlbnRpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIOuLqOydvCDtlYTrk5zrpbwgTExN7Jy866GcIOyDneyEse2VqeuLiOuLpCAocm93S2V5IOyXhuydhCDrlYwgZmFsbGJhY2vsmqkpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlU2luZ2xlV2l0aExMTShcbiAgICBmaXh0dXJlSGludDogc3RyaW5nLFxuICAgIHByb3A6IEVudGl0eVByb3AsXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICk6IFByb21pc2U8RGF0YUV4cGxvcmVyVmFsdWU+IHtcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke2VudGl0eS5pZH06JHtwcm9wLm5hbWV9OiR7Zml4dHVyZUhpbnR9YDtcbiAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZUxMTUNhY2hlICYmIHRoaXMubGxtQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubGxtQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICB9XG5cbiAgICBjb25zdCBhcGlLZXkgPSB0aGlzLmdldEFwaUtleSgpO1xuICAgIGNvbnN0IHsgY3JlYXRlQW50aHJvcGljIH0gPSBhd2FpdCBpbXBvcnQoXCJAYWktc2RrL2FudGhyb3BpY1wiKTtcbiAgICBjb25zdCBnZW5lcmF0ZVRleHQgPSBhd2FpdCB0aGlzLmdldFRleHRHZW5lcmF0b3IoKTtcblxuICAgIGNvbnN0IHNpbmdsZVJlc3BvbnNlID0gYXdhaXQgZ2VuZXJhdGVUZXh0KHtcbiAgICAgIG1vZGVsOiBjcmVhdGVBbnRocm9waWMoeyBhcGlLZXkgfSkodGhpcy5vcHRpb25zLmxsbU1vZGVsIHx8IFwiY2xhdWRlLXNvbm5ldC00LTZcIiksXG4gICAgICBwcm9tcHQ6IHRoaXMuYnVpbGRMTE1Qcm9tcHQoZml4dHVyZUhpbnQsIHByb3AsIGVudGl0eSksXG4gICAgfSk7XG4gICAgY29uc3Qgc2luZ2xlUmVzcG9uc2VUZXh0ID0gei5zdHJpbmcoKS5zYWZlUGFyc2Uoc2luZ2xlUmVzcG9uc2U/LnRleHQpO1xuICAgIGlmICghc2luZ2xlUmVzcG9uc2VUZXh0LnN1Y2Nlc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgTExNIHJlc3BvbnNlXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5wYXJzZUxMTVJlc3BvbnNlKHNpbmdsZVJlc3BvbnNlVGV4dC5kYXRhLCBwcm9wLnR5cGUpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlTExNQ2FjaGUpIHtcbiAgICAgIHRoaXMubGxtQ2FjaGUuc2V0KGNhY2hlS2V5LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRUZXh0R2VuZXJhdG9yKCk6IFByb21pc2U8Rml4dHVyZVRleHRHZW5lcmF0b3I+IHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmdlbmVyYXRlVGV4dCkge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5nZW5lcmF0ZVRleHQ7XG4gICAgfVxuICAgIGNvbnN0IGFpID0gYXdhaXQgaW1wb3J0KFwiYWlcIik7XG4gICAgcmV0dXJuIGFzeW5jIChyZXF1ZXN0KSA9PiBhaS5nZW5lcmF0ZVRleHQocmVxdWVzdCk7XG4gIH1cblxuICAvKipcbiAgICogcm93IOyghOyytOulvCDtlZwg67KI7JeQIOyDneyEse2VmOuKlCBMTE0g7ZSE66Gs7ZSE7Yq466W8IOunjOuTreuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRSb3dMTE1Qcm9tcHQocHJvcHM6IEVudGl0eVByb3BbXSwgZW50aXR5OiBFbnRpdHkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMub3B0aW9ucy5sb2NhbGUgfHwgXCJrb1wiO1xuICAgIGNvbnN0IGxhbmd1YWdlID0gbG9jYWxlID09PSBcImtvXCIgPyBcIktvcmVhblwiIDogbG9jYWxlID09PSBcImphXCIgPyBcIkphcGFuZXNlXCIgOiBcIkVuZ2xpc2hcIjtcblxuICAgIGNvbnN0IGZpZWxkRGVzY3JpcHRpb25zID0gcHJvcHNcbiAgICAgIC5tYXAoKHApID0+IHtcbiAgICAgICAgbGV0IGRlc2MgPSBgLSAke3AubmFtZX0gKCR7cC50eXBlfSk6ICR7cC5jb25lPy5ub3RlID8/IFwiXCJ9YDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChwLnR5cGUgPT09IFwiZW51bVwiIHx8IHAudHlwZSA9PT0gXCJlbnVtW11cIikgJiZcbiAgICAgICAgICBcImlkXCIgaW4gcCAmJlxuICAgICAgICAgIHAuaWQgJiZcbiAgICAgICAgICBlbnRpdHkuZW51bUxhYmVscz8uW3AuaWRdXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzW3AuaWRdKS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgZGVzYyArPSBgIFthbGxvd2VkIHZhbHVlczogJHt2YWx1ZXN9XWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2M7XG4gICAgICB9KVxuICAgICAgLmpvaW4oXCJcXG5cIik7XG5cbiAgICAvLyBMTE0g64yA7IOB7J20IOyVhOuLjCBwcm9w65Ok64+EIOunpeudveycvOuhnCDsoJzqs7UgKHJlbGF0aW9uIOygnOyZuClcbiAgICBjb25zdCBvdGhlclByb3BzID0gZW50aXR5LnByb3BzXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAocCkgPT5cbiAgICAgICAgICAhcHJvcHMuaW5jbHVkZXMocCkgJiZcbiAgICAgICAgICAhaXNSZWxhdGlvblByb3AocCkgJiZcbiAgICAgICAgICBwLm5hbWUgIT09IFwiaWRcIiAmJlxuICAgICAgICAgICEoXCJ2aXJ0dWFsXCIgaW4gcCAmJiBwLnZpcnR1YWwpLFxuICAgICAgKVxuICAgICAgLm1hcCgocCkgPT4ge1xuICAgICAgICBsZXQgZGVzYyA9IGAtICR7cC5uYW1lfSAoJHtwLnR5cGV9KWA7XG4gICAgICAgIGlmIChwLmNvbmU/Lm5vdGUpIGRlc2MgKz0gYDogJHtwLmNvbmUubm90ZX1gO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHAudHlwZSA9PT0gXCJlbnVtXCIgfHwgcC50eXBlID09PSBcImVudW1bXVwiKSAmJlxuICAgICAgICAgIFwiaWRcIiBpbiBwICYmXG4gICAgICAgICAgcC5pZCAmJlxuICAgICAgICAgIGVudGl0eS5lbnVtTGFiZWxzPy5bcC5pZF1cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LmtleXMoZW50aXR5LmVudW1MYWJlbHNbcC5pZF0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICBkZXNjICs9IGAgW2FsbG93ZWQgdmFsdWVzOiAke3ZhbHVlc31dYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVzYztcbiAgICAgIH0pXG4gICAgICAuam9pbihcIlxcblwiKTtcbiAgICBjb25zdCBvdGhlclByb3BzQ29udGV4dCA9IG90aGVyUHJvcHNcbiAgICAgID8gYFxcblxcbk90aGVyIGZpZWxkcyBpbiB0aGlzIGVudGl0eSAoZm9yIGNvbnRleHQsIGRvIE5PVCBnZW5lcmF0ZSB0aGVzZSk6XFxuJHtvdGhlclByb3BzfWBcbiAgICAgIDogXCJcIjtcblxuICAgIGNvbnN0IHJlc3VsdFRlbXBsYXRlID0gcHJvcHMubWFwKChwKSA9PiBgICBcIiR7cC5uYW1lfVwiOiA8JHtwLnR5cGV9PmApLmpvaW4oXCIsXFxuXCIpO1xuXG4gICAgY29uc3QgZW50aXR5Q29udGV4dCA9IGVudGl0eS5jb25lPy5ub3RlID8gYFxcbkVudGl0eSBkZXNjcmlwdGlvbjogJHtlbnRpdHkuY29uZS5ub3RlfWAgOiBcIlwiO1xuXG4gICAgcmV0dXJuIGBHZW5lcmF0ZSB0ZXN0IGZpeHR1cmUgZGF0YSBmb3IgdGhlICR7ZW50aXR5LmlkfSBlbnRpdHkuIEFsbCBmaWVsZHMgbXVzdCBiZSBjb2hlcmVudCBhbmQgY29uc2lzdGVudCB3aXRoIGVhY2ggb3RoZXIuXG5cbkVudGl0eTogJHtlbnRpdHkuaWR9JHtlbnRpdHlDb250ZXh0fVxuTG9jYWxlOiAke2xvY2FsZX0gKHVzZSAke2xhbmd1YWdlfSBmb3IgdGV4dCBmaWVsZHMpXG5cbkZpZWxkcyB0byBnZW5lcmF0ZTpcbiR7ZmllbGREZXNjcmlwdGlvbnN9JHtvdGhlclByb3BzQ29udGV4dH1cblxuUnVsZXM6XG4tIEFsbCBmaWVsZHMgaW4gYSBzaW5nbGUgcm93IG11c3QgYmUgbG9naWNhbGx5IGNvbnNpc3RlbnQgKGUuZy4gbmFtZS9uYW1lX2VuL25hbWVfY24gc2hvdWxkIHJlcHJlc2VudCB0aGUgc2FtZSBwZXJzb24pXG4tIFJldHVybiBPTkxZIHZhbGlkIEpTT04sIG5vIG1hcmtkb3duIG9yIGV4cGxhbmF0aW9uXG4tIERhdGVzIGluIElTTyA4NjAxIGZvcm1hdFxuLSBVc2UgJHtsYW5ndWFnZX0gZm9yIHRleHQgdW5sZXNzIGZpZWxkIGRlc2NyaXB0aW9uIHNheXMgb3RoZXJ3aXNlXG5cblJldHVybiBleGFjdGx5IHRoaXMgSlNPTiBzaGFwZTpcbntcbiR7cmVzdWx0VGVtcGxhdGV9XG59YDtcbiAgfVxuXG4gIC8qKlxuICAgKiByb3cgTExNIOydkeuLteydhCDtjIzsi7HtlZjsl6wg7ZWE65Oc67OEIOqwkuycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIHBhcnNlUm93TExNUmVzcG9uc2UodGV4dDogc3RyaW5nLCBwcm9wczogRW50aXR5UHJvcFtdKTogRGF0YUV4cGxvcmVyUmVjb3JkIHtcbiAgICBjb25zdCBqc29uVGV4dCA9IHRleHRcbiAgICAgIC50cmltKClcbiAgICAgIC5yZXBsYWNlKC9eYGBganNvblxccyovaSwgXCJcIilcbiAgICAgIC5yZXBsYWNlKC9gYGBcXHMqJC8sIFwiXCIpXG4gICAgICAudHJpbSgpO1xuXG4gICAgbGV0IHBhcnNlZDogRGF0YUV4cGxvcmVyUmVjb3JkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWRSZWNvcmQgPSBkYXRhRXhwbG9yZXJSZWNvcmRTY2hlbWEuc2FmZVBhcnNlKEpTT04ucGFyc2UoanNvblRleHQpKTtcbiAgICAgIGlmICghcGFyc2VkUmVjb3JkLnN1Y2Nlc3MpIHtcbiAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgY29uc29sZS53YXJuKFwiW0ZpeHR1cmVHZW5lcmF0b3JdIFJvdyBMTE0gcmVzcG9uc2UgaXMgbm90IGEgcGxhaW4gb2JqZWN0OlwiLCB0ZXh0KTtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgICAgcGFyc2VkID0gcGFyc2VkUmVjb3JkLmRhdGE7XG4gICAgfSBjYXRjaCB7XG4gICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS53YXJuKFwiW0ZpeHR1cmVHZW5lcmF0b3JdIEZhaWxlZCB0byBwYXJzZSByb3cgTExNIHJlc3BvbnNlOlwiLCB0ZXh0KTtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQ6IERhdGFFeHBsb3JlclJlY29yZCA9IHt9O1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wcykge1xuICAgICAgaWYgKHByb3AubmFtZSBpbiBwYXJzZWQpIHtcbiAgICAgICAgcmVzdWx0W3Byb3AubmFtZV0gPSB0aGlzLnBhcnNlTExNUmVzcG9uc2UoU3RyaW5nKHBhcnNlZFtwcm9wLm5hbWVdID8/IFwiXCIpLCBwcm9wLnR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZExMTVByb21wdChoaW50OiBzdHJpbmcsIHByb3A6IEVudGl0eVByb3AsIGVudGl0eTogRW50aXR5KTogc3RyaW5nIHtcbiAgICBjb25zdCBsb2NhbGUgPSB0aGlzLm9wdGlvbnMubG9jYWxlIHx8IFwia29cIjtcbiAgICBjb25zdCBsYW5ndWFnZSA9IGxvY2FsZSA9PT0gXCJrb1wiID8gXCJLb3JlYW5cIiA6IGxvY2FsZSA9PT0gXCJqYVwiID8gXCJKYXBhbmVzZVwiIDogXCJFbmdsaXNoXCI7XG5cbiAgICBjb25zdCBlbnRpdHlDb250ZXh0ID0gZW50aXR5LmNvbmU/Lm5vdGUgPyBgXFxuRW50aXR5IGNvbnRleHQ6ICR7ZW50aXR5LmNvbmUubm90ZX1gIDogXCJcIjtcblxuICAgIGNvbnN0IG90aGVyRmllbGRzID0gZW50aXR5LnByb3BzXG4gICAgICAuZmlsdGVyKChwKSA9PiBwLm5hbWUgIT09IHByb3AubmFtZSAmJiAhaXNSZWxhdGlvblByb3AocCkgJiYgcC5jb25lPy5ub3RlKVxuICAgICAgLm1hcCgocCkgPT4gYC0gJHtwLm5hbWV9ICgke3AudHlwZX0pOiAke3AuY29uZT8ubm90ZX1gKVxuICAgICAgLmpvaW4oXCJcXG5cIik7XG4gICAgY29uc3Qgb3RoZXJGaWVsZHNDb250ZXh0ID0gb3RoZXJGaWVsZHNcbiAgICAgID8gYFxcblxcbk90aGVyIGZpZWxkcyBpbiB0aGlzIGVudGl0eSAoZm9yIGNvbnRleHQpOlxcbiR7b3RoZXJGaWVsZHN9YFxuICAgICAgOiBcIlwiO1xuXG4gICAgbGV0IHByb21wdCA9IGBHZW5lcmF0ZSB0ZXN0IGRhdGEgZm9yICR7ZW50aXR5LmlkfS4ke3Byb3AubmFtZX0gKHR5cGU6ICR7cHJvcC50eXBlfSkke2VudGl0eUNvbnRleHR9JHtvdGhlckZpZWxkc0NvbnRleHR9XG5cblJlcXVpcmVtZW50OiAke2hpbnR9XG5cblJ1bGVzOlxuLSBSZXR1cm4gT05MWSB0aGUgdmFsdWUsIG5vIGV4cGxhbmF0aW9uIG9yIG1hcmtkb3duXG4tIFVzZSAke2xhbmd1YWdlfSBsYW5ndWFnZSBpZiBhcHBsaWNhYmxlXG4tIEZvcm1hdDogJHt0aGlzLmdldEV4cGVjdGVkRm9ybWF0KHByb3AudHlwZSl9YDtcblxuICAgIC8vIGVudW0g7YOA7J6F7J24IOqyveyasCDqsIDriqXtlZwg6rCSIOuqqeuhnSDstpTqsIBcbiAgICBpZiAocHJvcC50eXBlID09PSBcImVudW1cIiB8fCBwcm9wLnR5cGUgPT09IFwiZW51bVtdXCIpIHtcbiAgICAgIGxldCBlbnVtVmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBpZiAoXCJlbnVtXCIgaW4gcHJvcCAmJiBBcnJheS5pc0FycmF5KHByb3AuZW51bSkgJiYgcHJvcC5lbnVtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZW51bVZhbHVlcyA9IHByb3AuZW51bTtcbiAgICAgIH0gZWxzZSBpZiAoXCJpZFwiIGluIHByb3AgJiYgcHJvcC5pZCAmJiBlbnRpdHk/LmVudW1MYWJlbHM/Lltwcm9wLmlkXSkge1xuICAgICAgICBlbnVtVmFsdWVzID0gT2JqZWN0LmtleXMoZW50aXR5LmVudW1MYWJlbHNbcHJvcC5pZF0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW51bVZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHByb21wdCArPSBgXFxuLSBJTVBPUlRBTlQ6IENob29zZSBPTkxZIGZyb20gdGhlc2UgYWxsb3dlZCB2YWx1ZXM6ICR7ZW51bVZhbHVlcy5qb2luKFwiLCBcIil9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcm9tcHQgKz0gYFxcblxcbkV4YW1wbGU6ICR7dGhpcy5nZXRFeGFtcGxlRm9yVHlwZShwcm9wLnR5cGUsIGxvY2FsZSl9YDtcblxuICAgIHJldHVybiBwcm9tcHQ7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlTExNUmVzcG9uc2UodGV4dDogc3RyaW5nLCBwcm9wVHlwZTogc3RyaW5nKTogRGF0YUV4cGxvcmVyVmFsdWUge1xuICAgIGNvbnN0IGNsZWFuZWQgPSB0ZXh0LnRyaW0oKTtcblxuICAgIC8vIOuwsOyXtCDtg4DsnoUg7LKY66asXG4gICAgaWYgKHByb3BUeXBlLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGRhdGFFeHBsb3JlclZhbHVlU2NoZW1hLnBhcnNlKEpTT04ucGFyc2UoY2xlYW5lZCkpO1xuICAgICAgICBjb25zdCBiYXNlVHlwZSA9IHByb3BUeXBlLnNsaWNlKDAsIC0yKTsgLy8gXCJpbnRlZ2VyW11cIiAtPiBcImludGVnZXJcIlxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcnNlZCkpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VkLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgLy8gbnVsbC91bmRlZmluZWTripQg7YOA7J6F67OEIOq4sOuzuOqwkuycvOuhnFxuICAgICAgICAgICAgaWYgKGl0ZW0gPT09IG51bGwgfHwgaXRlbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRWYWx1ZUZvclR5cGUoYmFzZVR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g6rCd7LK064qUIEpTT04uc3RyaW5naWZ5IO2bhCDtjIzsi7EgKGpzb24g7YOA7J6F7J24IOqyveyasClcbiAgICAgICAgICAgIGlmIChkYXRhRXhwbG9yZXJSZWNvcmRTY2hlbWEuc2FmZVBhcnNlKGl0ZW0pLnN1Y2Nlc3MgfHwgQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgICAgICAgICByZXR1cm4gYmFzZVR5cGUgPT09IFwianNvblwiXG4gICAgICAgICAgICAgICAgPyBpdGVtXG4gICAgICAgICAgICAgICAgOiB0aGlzLnBhcnNlU2NhbGFyVmFsdWUoSlNPTi5zdHJpbmdpZnkoaXRlbSksIGJhc2VUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHByaW1pdGl2ZSDqsJLsnYAg66y47J6Q7Je066GcIOuzgO2ZmCDtm4Qg7YyM7IuxXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVNjYWxhclZhbHVlKFN0cmluZyhpdGVtKSwgYmFzZVR5cGUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g64uo7J28IOqwkuydtCDsmKgg6rK97JqwIOuwsOyXtOuhnCDqsJDsi7jquLBcbiAgICAgICAgaWYgKHBhcnNlZCA9PT0gbnVsbCB8fCBwYXJzZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBbdGhpcy5nZXREZWZhdWx0VmFsdWVGb3JUeXBlKGJhc2VUeXBlKV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt0aGlzLnBhcnNlU2NhbGFyVmFsdWUoU3RyaW5nKHBhcnNlZCksIGJhc2VUeXBlKV07XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBhcnNlU2NhbGFyVmFsdWUoY2xlYW5lZCwgcHJvcFR5cGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWZhdWx0VmFsdWVGb3JUeXBlKHByb3BUeXBlOiBzdHJpbmcpOiBEYXRhRXhwbG9yZXJWYWx1ZSB7XG4gICAgc3dpdGNoIChwcm9wVHlwZSkge1xuICAgICAgY2FzZSBcImludGVnZXJcIjpcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICBjYXNlIFwiYmlnSW50ZWdlclwiOlxuICAgICAgICByZXR1cm4gMG47XG4gICAgICBjYXNlIFwiZmxvYXRcIjpcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCk7XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICByZXR1cm4ge307XG4gICAgICBjYXNlIFwidXVpZFwiOlxuICAgICAgICByZXR1cm4gXCIwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIjtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VTY2FsYXJWYWx1ZSh0ZXh0OiBzdHJpbmcsIHByb3BUeXBlOiBzdHJpbmcpOiBEYXRhRXhwbG9yZXJWYWx1ZSB7XG4gICAgY29uc3QgY2xlYW5lZCA9IHRleHQudHJpbSgpO1xuXG4gICAgc3dpdGNoIChwcm9wVHlwZSkge1xuICAgICAgY2FzZSBcImludGVnZXJcIjoge1xuICAgICAgICBjb25zdCBudW0gPSBwYXJzZUludChjbGVhbmVkLCAxMCk7XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4obnVtKSA/IDAgOiBudW07XG4gICAgICB9XG4gICAgICBjYXNlIFwiYmlnSW50ZWdlclwiOiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEJpZ0ludChjbGVhbmVkKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIDBuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlIFwiZmxvYXRcIjpcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGNhc2UgXCJudW1lcmljXCI6IHtcbiAgICAgICAgY29uc3QgbnVtID0gcGFyc2VGbG9hdChjbGVhbmVkKTtcbiAgICAgICAgcmV0dXJuIE51bWJlci5pc05hTihudW0pID8gMCA6IG51bTtcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiBjbGVhbmVkLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiO1xuICAgICAgY2FzZSBcImRhdGVcIjoge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoY2xlYW5lZCk7XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gbmV3IERhdGUoKSA6IGRhdGU7XG4gICAgICB9XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBkYXRhRXhwbG9yZXJWYWx1ZVNjaGVtYS5wYXJzZShKU09OLnBhcnNlKGNsZWFuZWQpKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIGNsZWFuZWQ7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgXCJ1dWlkXCI6XG4gICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICByZXR1cm4gY2xlYW5lZDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBjbGVhbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBmYWtlciDtlajsiJgg7J247J6QIOusuOyekOyXtOydhCDtjIzsi7HtlZjsl6wg7J247J6QIOuwsOyXtOuhnCDrsJjtmZjtlanri4jri6QuXG4gICAqXG4gICAqIDPri6jqs4Qg7KCE6561OlxuICAgKiAxLiBKU09OIOyngeygkSDtjIzsi7EgKO2RnOykgCBKU09OIO2RnO2YhOyLnSlcbiAgICogMi4gSlMg6rCd7LK0IOumrO2EsOuftCDihpIgSlNPTiDrs4DtmZgg7ZuEIOyerOyLnOuPhCAoc2luZ2xlIHF1b3RlLCB1bnF1b3RlZCBrZXkg7LKY66asKVxuICAgKiAzLiDri6jsiJwg64uo7J28IOyduOyekCDtj7TrsLEgKOyIq+yekCwg66y47J6Q7Je0KVxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZUdlbmVyYXRvckFyZ3MoYXJnc1N0cjogc3RyaW5nLCBwcm9wTmFtZTogc3RyaW5nKTogRGF0YUV4cGxvcmVyVmFsdWVbXSB7XG4gICAgLy8gMS4gSlNPTiDsp4HsoJEg7YyM7IuxXG4gICAgbGV0IHBhcnNlZEFyZ3VtZW50czogRGF0YUV4cGxvcmVyVmFsdWVbXSB8IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIHBhcnNlZEFyZ3VtZW50cyA9IGdlbmVyYXRvckFyZ3VtZW50c1NjaGVtYS5wYXJzZShKU09OLnBhcnNlKGBbJHthcmdzU3RyfV1gKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBwYXJzZWRBcmd1bWVudHMgPSBudWxsO1xuICAgIH1cbiAgICBpZiAocGFyc2VkQXJndW1lbnRzKSB7XG4gICAgICByZXR1cm4gcGFyc2VkQXJndW1lbnRzO1xuICAgIH1cblxuICAgIC8vIDIuIEpTIOqwneyytCDrpqzthLDrn7Qg4oaSIEpTT04g67OA7ZmYIO2bhCDsnqzsi5zrj4RcbiAgICB0cnkge1xuICAgICAgY29uc3QganNvblN0ciA9IHRoaXMuY29udmVydEpzTGl0ZXJhbFRvSnNvbihhcmdzU3RyKTtcbiAgICAgIHBhcnNlZEFyZ3VtZW50cyA9IGdlbmVyYXRvckFyZ3VtZW50c1NjaGVtYS5wYXJzZShKU09OLnBhcnNlKGBbJHtqc29uU3RyfV1gKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBwYXJzZWRBcmd1bWVudHMgPSBudWxsO1xuICAgIH1cbiAgICBpZiAocGFyc2VkQXJndW1lbnRzKSB7XG4gICAgICByZXR1cm4gcGFyc2VkQXJndW1lbnRzO1xuICAgIH1cblxuICAgIC8vIDMuIOuLqOyInCDri6jsnbwg7J247J6QIO2PtOuwsVxuICAgIGNvbnN0IHRyaW1tZWQgPSBhcmdzU3RyLnRyaW0oKTtcbiAgICBpZiAoIU51bWJlci5pc05hTihOdW1iZXIodHJpbW1lZCkpKSB7XG4gICAgICByZXR1cm4gW051bWJlcih0cmltbWVkKV07XG4gICAgfVxuICAgIGlmIChcbiAgICAgICh0cmltbWVkLnN0YXJ0c1dpdGgoJ1wiJykgJiYgdHJpbW1lZC5lbmRzV2l0aCgnXCInKSkgfHxcbiAgICAgICh0cmltbWVkLnN0YXJ0c1dpdGgoXCInXCIpICYmIHRyaW1tZWQuZW5kc1dpdGgoXCInXCIpKVxuICAgICkge1xuICAgICAgcmV0dXJuIFt0cmltbWVkLnNsaWNlKDEsIC0xKV07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBGaXh0dXJlR2VuZXJhdG9yOiBDYW5ub3QgcGFyc2UgYXJndW1lbnRzIGZvciAke3Byb3BOYW1lfTogJHthcmdzU3RyfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTIOqwneyytCDrpqzthLDrn7TsnYQgSlNPTuycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqXG4gICAqIOuRkCDqsIDsp4Ag67OA7ZmYOlxuICAgKiAxLiBTaW5nbGUtcXVvdGVkIOusuOyekOyXtCDihpIgZG91YmxlLXF1b3RlZCAo7J207Iqk7LyA7J207ZSEIOyymOumrCDtj6ztlagpXG4gICAqIDIuIFVucXVvdGVkIOqwneyytCDtgqQg4oaSIGRvdWJsZS1xdW90ZWRcbiAgICovXG4gIHByaXZhdGUgY29udmVydEpzTGl0ZXJhbFRvSnNvbihpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyAxLiAndmFsdWUnIOKGkiBcInZhbHVlXCIgKOuCtOu2gCBcIiDsnbTsiqTsvIDsnbTtlIQsIFxcJyDihpIgJylcbiAgICBjb25zdCB3aXRoRG91YmxlUXVvdGVzID0gaW5wdXQucmVwbGFjZShcbiAgICAgIC8nKFteJ1xcXFxdKig/OlxcXFwuW14nXFxcXF0qKSopJy9nLFxuICAgICAgKF8sIGNvbnRlbnQ6IHN0cmluZykgPT4gYFwiJHtjb250ZW50LnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXFxcJy9nLCBcIidcIil9XCJgLFxuICAgICk7XG5cbiAgICAvLyAyLiB7IGtleTog4oaSIHsgXCJrZXlcIjpcbiAgICByZXR1cm4gd2l0aERvdWJsZVF1b3Rlcy5yZXBsYWNlKC8oW3ssXVxccyopKFthLXpBLVpfJF1bXFx3JF0qKShcXHMqOikvZywgJyQxXCIkMlwiJDMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb25hbXUuc2VjcmV07J2EIOyasOyEoOycvOuhnCDtlZjqs6AsIOyXhuycvOuptCDtmZjqsr3rs4DsiJjsl5DshJwgQVBJIO2CpOulvCDsnb3sirXri4jri6QuXG4gICAqXG4gICAqIFNvbmFtdS5zZWNyZXTsnYAg7ZSE66Gc7KCd7Yq467OEIOyEpOyglShzb25hbXUuY29uZmlnLnRzKeydtOuvgOuhnCDrjZQg64aS7J2AIOyasOyEoOyInOychOulvCDqsIDsp4DrqbAsXG4gICAqIO2ZmOqyveuzgOyImOuKlCDqsJzrsJwg7ZmY6rK97J2064KYIENJL0NE7JeQ7IScIGZhbGxiYWNr7Jy866GcIOyCrOyaqeuQqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZ2V0QXBpS2V5KCk6IHN0cmluZyB7XG4gICAgbGV0IGFwaUtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgU29uYW11IH0gPSByZXF1aXJlKFwiLi4vYXBpXCIpO1xuICAgICAgYXBpS2V5ID0gU29uYW11LnNlY3JldHM/LmFudGhyb3BpY19hcGlfa2V5O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gU29uYW116rCAIOy0iOq4sO2ZlOuQmOyngCDslYrsnYAg6rK97JqwICjthYzsiqTtirgg7ZmY6rK9IOuTsSlcbiAgICB9XG5cbiAgICBpZiAoIWFwaUtleSkge1xuICAgICAgYXBpS2V5ID0gcHJvY2Vzcy5lbnYuQU5USFJPUElDX0FQSV9LRVk7XG4gICAgfVxuXG4gICAgaWYgKCFhcGlLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJBTlRIUk9QSUNfQVBJX0tFWSBub3QgZm91bmQuIFNldCBpdCBpbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb3IgU29uYW11LnNlY3JldC5hbnRocm9waWNfYXBpX2tleVwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXBpS2V5O1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNTZXF1ZW5jZURlZmF1bHQocHJvcDogRW50aXR5UHJvcCk6IGJvb2xlYW4ge1xuICAgIGlmICghKFwiZGJEZWZhdWx0XCIgaW4gcHJvcCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZGJEZWZhdWx0ID0gei5zdHJpbmcoKS5zYWZlUGFyc2UocHJvcC5kYkRlZmF1bHQpO1xuICAgIHJldHVybiBkYkRlZmF1bHQuc3VjY2VzcyAmJiBkYkRlZmF1bHQuZGF0YS5pbmNsdWRlcyhcIm5leHR2YWxcIik7XG4gIH1cblxuICBwcml2YXRlIGdldEV4cGVjdGVkRm9ybWF0KHByb3BUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIOuwsOyXtCDtg4DsnoUg7LKY66asXG4gICAgaWYgKHByb3BUeXBlLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICAgIGNvbnN0IGJhc2VUeXBlID0gcHJvcFR5cGUuc2xpY2UoMCwgLTIpO1xuICAgICAgY29uc3QgYmFzZUZvcm1hdCA9IHRoaXMuZ2V0U2NhbGFyRm9ybWF0KGJhc2VUeXBlKTtcbiAgICAgIHJldHVybiBgSlNPTiBhcnJheSBvZiAke2Jhc2VGb3JtYXR9IChlLmcuLCBbJHt0aGlzLmdldEV4YW1wbGVGb3JUeXBlKGJhc2VUeXBlLCBcImVuXCIpfSwgLi4uXSlgO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldFNjYWxhckZvcm1hdChwcm9wVHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGdldFNjYWxhckZvcm1hdChwcm9wVHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHByb3BUeXBlKSB7XG4gICAgICBjYXNlIFwiaW50ZWdlclwiOlxuICAgICAgY2FzZSBcImJpZ0ludGVnZXJcIjpcbiAgICAgICAgcmV0dXJuIFwiaW50ZWdlciBudW1iZXJzXCI7XG4gICAgICBjYXNlIFwiZmxvYXRcIjpcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICAgIHJldHVybiBcImRlY2ltYWwgbnVtYmVyc1wiO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIFwiYm9vbGVhbnMgKHRydWUgb3IgZmFsc2UpXCI7XG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICByZXR1cm4gXCJJU08gODYwMSBkYXRlIHN0cmluZ3NcIjtcbiAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgIHJldHVybiBcInZhbGlkIEpTT04gb2JqZWN0IG9yIGFycmF5XCI7XG4gICAgICBjYXNlIFwidXVpZFwiOlxuICAgICAgICByZXR1cm4gXCJVVUlEIHN0cmluZ3NcIjtcbiAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgIHJldHVybiBcIm9uZSBvZiB0aGUgYWxsb3dlZCBlbnVtIHZhbHVlc1wiO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwicGxhaW4gdGV4dCBzdHJpbmdzXCI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRFeGFtcGxlRm9yVHlwZShwcm9wVHlwZTogc3RyaW5nLCBsb2NhbGU6IExvY2FsZSk6IHN0cmluZyB7XG4gICAgLy8g67Cw7Je0IO2DgOyehSDsspjrpqxcbiAgICBpZiAocHJvcFR5cGUuZW5kc1dpdGgoXCJbXVwiKSkge1xuICAgICAgY29uc3QgYmFzZVR5cGUgPSBwcm9wVHlwZS5zbGljZSgwLCAtMik7XG4gICAgICBjb25zdCBiYXNlRXhhbXBsZSA9IHRoaXMuZ2V0U2NhbGFyRXhhbXBsZShiYXNlVHlwZSwgbG9jYWxlKTtcbiAgICAgIHJldHVybiBgWyR7YmFzZUV4YW1wbGV9XWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0U2NhbGFyRXhhbXBsZShwcm9wVHlwZSwgbG9jYWxlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2NhbGFyRXhhbXBsZShwcm9wVHlwZTogc3RyaW5nLCBsb2NhbGU6IExvY2FsZSk6IHN0cmluZyB7XG4gICAgY29uc3QgaXNLb3JlYW4gPSBsb2NhbGUgPT09IFwia29cIjtcblxuICAgIHN3aXRjaCAocHJvcFR5cGUpIHtcbiAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICBjYXNlIFwiYmlnSW50ZWdlclwiOlxuICAgICAgICByZXR1cm4gXCI0MlwiO1xuICAgICAgY2FzZSBcImZsb2F0XCI6XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgICByZXR1cm4gXCIzLjE0XCI7XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gXCJ0cnVlXCI7XG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICByZXR1cm4gXCIyMDI0LTAxLTAxXCI7XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICByZXR1cm4gJ3tcImtleVwiOiBcInZhbHVlXCJ9JztcbiAgICAgIGNhc2UgXCJ1dWlkXCI6XG4gICAgICAgIHJldHVybiBcIjU1MGU4NDAwLWUyOWItNDFkNC1hNzE2LTQ0NjY1NTQ0MDAwMFwiO1xuICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgcmV0dXJuIFwiRU5VTV9WQUxVRVwiO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGlzS29yZWFuID8gXCLslYjrhZXtlZjshLjsmpRcIiA6IFwiSGVsbG9cIjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7J2066aE7J2EIOydtOuplOydvCDroZzsu6wg7YyM7Yq47JqpIOuhnOuniOuCmOydtOymiOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiDtlZzquIAg7J2066aE7J2AIOy0iOyEsS3spJHshLEt7KKF7ISxIOu2hO2VtCDtm4Qg66Gc66eI64KY7J207KaIIOyymOumrO2VqeuLiOuLpC5cbiAgICog7JiB66y4IOydtOumhOydgCDshozrrLjsnpDroZwg67OA7ZmY7ZWY6rOgIOqzteuwseydhCDsoJAoLilcXHVjNzNj66GcIOy5mO2ZmO2VqeuLiOuLpC5cbiAgICog7JiIOiBcIuq5gOyyoOyImFwiIOKGkiBcImNoZW9sc3Uua2ltXCIsIFwiSm9obiBEb2VcIiDihpIgXCJqb2huLmRvZVwiXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJvbWFuaXplTmFtZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIC8vIO2VnOq4gCDtj6ztlagg7Jes67aAIO2ZleyduFxuICAgIGlmICgvW1xcdUFDMDAtXFx1RDdBRl0vLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvbWFuaXplS29yZWFuTmFtZShuYW1lKTtcbiAgICB9XG4gICAgLy8g7JiB66y4OiDshozrrLjsnpAgKyDsoJAg6rWs67aEXG4gICAgcmV0dXJuIG5hbWVcbiAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAucmVwbGFjZSgvXFxzKy9nLCBcIi5cIilcbiAgICAgIC5yZXBsYWNlKC9bXmEtejAtOS5dL2csIFwiXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VnOq4gCDsnbTrpoTsnYQg66Gc66eI64KY7J207KaIIOyymOumrO2VqeuLiOuLpC5cbiAgICpcbiAgICog7LSI7ISxL+ykkeyEsS/sooXshLEg66ek7ZWRIO2FjOydtOu4lOydhCDsgqzsmqntlZjsl6wg7ZWc6riA7J2EIOuhnOuniOyekOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqIOyyqyDquIDsnpDrpbwg7ISx7Jy866GcIOqwhOyjvO2VmOyXrCBcIuq5gOyyoOyImFwiIOKGkiBcImNoZW9sc3Uua2ltXCIg7ZiV7YOc66GcIOy2nOugpe2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgcm9tYW5pemVLb3JlYW5OYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgQ0hPU0VPTkcgPSBbXG4gICAgICBcImdcIixcbiAgICAgIFwia2tcIixcbiAgICAgIFwiblwiLFxuICAgICAgXCJkXCIsXG4gICAgICBcInR0XCIsXG4gICAgICBcInJcIixcbiAgICAgIFwibVwiLFxuICAgICAgXCJiXCIsXG4gICAgICBcInBwXCIsXG4gICAgICBcInNcIixcbiAgICAgIFwic3NcIixcbiAgICAgIFwiXCIsXG4gICAgICBcImpcIixcbiAgICAgIFwiampcIixcbiAgICAgIFwiY2hcIixcbiAgICAgIFwia1wiLFxuICAgICAgXCJ0XCIsXG4gICAgICBcInBcIixcbiAgICAgIFwiaFwiLFxuICAgIF07XG4gICAgY29uc3QgSlVOR1NFT05HID0gW1xuICAgICAgXCJhXCIsXG4gICAgICBcImFlXCIsXG4gICAgICBcInlhXCIsXG4gICAgICBcInlhZVwiLFxuICAgICAgXCJlb1wiLFxuICAgICAgXCJlXCIsXG4gICAgICBcInllb1wiLFxuICAgICAgXCJ5ZVwiLFxuICAgICAgXCJvXCIsXG4gICAgICBcIndhXCIsXG4gICAgICBcIndhZVwiLFxuICAgICAgXCJvZVwiLFxuICAgICAgXCJ5b1wiLFxuICAgICAgXCJ1XCIsXG4gICAgICBcIndvXCIsXG4gICAgICBcIndlXCIsXG4gICAgICBcIndpXCIsXG4gICAgICBcInl1XCIsXG4gICAgICBcImV1XCIsXG4gICAgICBcInVpXCIsXG4gICAgICBcImlcIixcbiAgICBdO1xuICAgIGNvbnN0IEpPTkdTRU9ORyA9IFtcbiAgICAgIFwiXCIsXG4gICAgICBcImtcIixcbiAgICAgIFwia1wiLFxuICAgICAgXCJrXCIsXG4gICAgICBcIm5cIixcbiAgICAgIFwiblwiLFxuICAgICAgXCJuXCIsXG4gICAgICBcInRcIixcbiAgICAgIFwibFwiLFxuICAgICAgXCJsXCIsXG4gICAgICBcImxcIixcbiAgICAgIFwibFwiLFxuICAgICAgXCJsXCIsXG4gICAgICBcImxcIixcbiAgICAgIFwibFwiLFxuICAgICAgXCJsXCIsXG4gICAgICBcIm1cIixcbiAgICAgIFwicFwiLFxuICAgICAgXCJwXCIsXG4gICAgICBcInRcIixcbiAgICAgIFwidFwiLFxuICAgICAgXCJuZ1wiLFxuICAgICAgXCJ0XCIsXG4gICAgICBcInRcIixcbiAgICAgIFwia1wiLFxuICAgICAgXCJ0XCIsXG4gICAgICBcInBcIixcbiAgICAgIFwidFwiLFxuICAgIF07XG5cbiAgICBjb25zdCByb21hbml6ZSA9IChjaGFyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgICAgY29uc3QgY29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcbiAgICAgIGlmIChjb2RlIDwgMHhhYzAwIHx8IGNvZGUgPiAweGQ3YWYpIHJldHVybiBjaGFyO1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gY29kZSAtIDB4YWMwMDtcbiAgICAgIGNvbnN0IGNobyA9IE1hdGguZmxvb3Iob2Zmc2V0IC8gNTg4KTtcbiAgICAgIGNvbnN0IGp1bmcgPSBNYXRoLmZsb29yKChvZmZzZXQgJSA1ODgpIC8gMjgpO1xuICAgICAgY29uc3Qgam9uZyA9IG9mZnNldCAlIDI4O1xuICAgICAgcmV0dXJuIENIT1NFT05HW2Nob10gKyBKVU5HU0VPTkdbanVuZ10gKyBKT05HU0VPTkdbam9uZ107XG4gICAgfTtcblxuICAgIGNvbnN0IGNoYXJzID0gWy4uLm5hbWVdO1xuICAgIC8vIOyyqyDquIDsnpDrpbwg7ISxKOWnkynsnLzroZwg6rCE7KO8XG4gICAgY29uc3QgZmFtaWx5TmFtZSA9IHJvbWFuaXplKGNoYXJzWzBdKTtcbiAgICBjb25zdCBnaXZlbk5hbWUgPSBjaGFycy5zbGljZSgxKS5tYXAocm9tYW5pemUpLmpvaW4oXCJcIik7XG5cbiAgICBpZiAoZ2l2ZW5OYW1lKSB7XG4gICAgICByZXR1cm4gYCR7Z2l2ZW5OYW1lfS4ke2ZhbWlseU5hbWV9YDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbWlseU5hbWU7XG4gIH1cblxuICAvKipcbiAgICogTExNIOy6kOyLnCDthrXqs4Trpbwg67CY7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgZ2V0TExNQ2FjaGVTdGF0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2l6ZTogdGhpcy5sbG1DYWNoZS5zaXplLFxuICAgICAgZW5hYmxlZDogdGhpcy5vcHRpb25zLmVuYWJsZUxMTUNhY2hlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTExNIOy6kOyLnOulvCDstIjquLDtmZTtlanri4jri6QuXG4gICAqL1xuICBjbGVhckxMTUNhY2hlKCkge1xuICAgIHRoaXMubGxtQ2FjaGUuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsu6jthY3siqTtirgg7IOd7ISxXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUNvbnRleHQoKTogR2VuZXJhdG9yQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpeHR1cmVzOiBuZXcgTWFwKCksXG4gICAgICByZWZlcmVuY2VDYWNoZTogbmV3IE1hcCgpLFxuICAgICAgaW1wb3J0ZWRSZWNvcmRzOiBuZXcgU2V0KCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrsLDsuZgg7IOd7ISxIOuwjyDsnpDrj5kg7KCA7J6lXG4gICAqXG4gICAqIDEuIOqwgSBzcGVj67OE66GcIGZpeHR1cmUg7IOd7ISxICjrqZTrqqjrpqwpXG4gICAqIDIuIEZpeHR1cmVSZWNvcmTroZwg67OA7ZmYXG4gICAqIDMuIEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVzKCnroZwgdGFyZ2V0RGLsl5Ag7KCA7J6lXG4gICAqXG4gICAqIEByZXR1cm5zIOyggOyepeuQnCBmaXh0dXJlIOuNsOydtO2EsCAo7Iuk7KCcIERCIElEIO2PrO2VqClcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlQmF0Y2goc3BlY3M6IEZpeHR1cmVHZW5lcmF0aW9uU3BlY1tdKTogUHJvbWlzZTxGaXh0dXJlSW1wb3J0UmVzdWx0W10+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jcmVhdGVDb250ZXh0KCk7XG4gICAgY29uc3QgZ2VuZXJhdGVkRml4dHVyZXM6IEdlbmVyYXRlZEZpeHR1cmVbXSA9IFtdO1xuXG4gICAgLy8gMS4g6rCBIHNwZWPrs4TroZwgZml4dHVyZSDsg53shLFcbiAgICBmb3IgKGNvbnN0IHNwZWMgb2Ygc3BlY3MpIHtcbiAgICAgIGNvbnN0IHNwZWNFbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KHNwZWMuZW50aXR5KTtcblxuICAgICAgaWYgKHNwZWNFbnRpdHkucGFyZW50SWQpIHtcbiAgICAgICAgLy8gcGFyZW50SWQg7JeU7Yuw7YuwOiBEQuyXkOyEnCDshJzruIztg4DsnoUg7ZaJ7J20IOyXhuuKlCDrtoDrqqggaWTrpbwg7KGw7ZqM7ZWY7JesIOyCrOyaqVxuICAgICAgICAvLyAo7IOIIOu2gOuqqCDsg53shLEg64yA7IugIOq4sOyhtCDrjbDsnbTthLAg7J6s7Zmc7JqpKVxuICAgICAgICBjb25zdCBpZFByb3AgPSBzcGVjRW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgICAgICAgY29uc3QgcGFyZW50T3ZlcnJpZGVzID0gaWRQcm9wPy5jb25lPy5maXh0dXJlUGFyZW50T3ZlcnJpZGVzID8/IHt9O1xuICAgICAgICBjb25zdCBwYXJlbnRFbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KHNwZWNFbnRpdHkucGFyZW50SWQpO1xuXG4gICAgICAgIC8vIOu2gOuqqCDthYzsnbTruJTsl5DshJwg7ISc67iM7YOA7J6FIO2FjOydtOu4lOyXkCDsl4bripQgaWTrpbwg7KGw7ZqMXG4gICAgICAgIGxldCBxdWVyeSA9IHRoaXMuc291cmNlRGIocGFyZW50RW50aXR5LnRhYmxlKS5zZWxlY3QoYCR7cGFyZW50RW50aXR5LnRhYmxlfS5pZGApO1xuICAgICAgICBmb3IgKGNvbnN0IFtjb2wsIHZhbF0gb2YgT2JqZWN0LmVudHJpZXMocGFyZW50T3ZlcnJpZGVzKSkge1xuICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoYCR7cGFyZW50RW50aXR5LnRhYmxlfS4ke2NvbH1gLCBmaXh0dXJlV2hlcmVWYWx1ZVNjaGVtYS5wYXJzZSh2YWwpKTtcbiAgICAgICAgfVxuICAgICAgICBxdWVyeSA9IHF1ZXJ5XG4gICAgICAgICAgLmxlZnRKb2luKHNwZWNFbnRpdHkudGFibGUsIGAke3NwZWNFbnRpdHkudGFibGV9LmlkYCwgYCR7cGFyZW50RW50aXR5LnRhYmxlfS5pZGApXG4gICAgICAgICAgLndoZXJlTnVsbChgJHtzcGVjRW50aXR5LnRhYmxlfS5pZGApXG4gICAgICAgICAgLmxpbWl0KHNwZWMuY291bnQpO1xuXG4gICAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBxdWVyeTtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlSWRzOiBudW1iZXJbXSA9IHJvd3MubWFwKChyOiB7IGlkOiBudW1iZXIgfSkgPT4gci5pZCk7XG5cbiAgICAgICAgaWYgKGF2YWlsYWJsZUlkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICAgIGBbcGFyZW50SWRdICR7c3BlYy5lbnRpdHl9OiDshJzruIztg4DsnoXsnbQg7JeG64qUIOu2gOuqqCDroIjsvZTrk5zqsIAg67aA7KGx7ZWp64uI64ukLiDqsbTrhIjrnIHri4jri6QuYCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yIChjb25zdCBwYXJlbnRJZCBvZiBhdmFpbGFibGVJZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpeHR1cmUgPSBhd2FpdCB0aGlzLmdlbmVyYXRlKHNwZWMuZW50aXR5LCBzcGVjLm92ZXJyaWRlcyB8fCB7fSwgY29udGV4dCk7XG4gICAgICAgICAgICBmaXh0dXJlLmlkID0gcGFyZW50SWQ7XG4gICAgICAgICAgICBnZW5lcmF0ZWRGaXh0dXJlcy5wdXNoKHsgZW50aXR5OiBzcGVjLmVudGl0eSwgZGF0YTogZml4dHVyZSwgZXhwbGljaXRJZDogdHJ1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BlYy5jb3VudDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZml4dHVyZSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGUoc3BlYy5lbnRpdHksIHNwZWMub3ZlcnJpZGVzIHx8IHt9LCBjb250ZXh0KTtcbiAgICAgICAgICBnZW5lcmF0ZWRGaXh0dXJlcy5wdXNoKHtcbiAgICAgICAgICAgIGVudGl0eTogc3BlYy5lbnRpdHksXG4gICAgICAgICAgICBkYXRhOiBmaXh0dXJlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMi4gRml4dHVyZVJlY29yZOuhnCDrs4DtmZhcbiAgICBjb25zdCBmaXh0dXJlUmVjb3JkczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgZm9yIChjb25zdCB7IGVudGl0eTogZW50aXR5TmFtZSwgZGF0YSwgZXhwbGljaXRJZCB9IG9mIGdlbmVyYXRlZEZpeHR1cmVzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eU5hbWUpO1xuXG4gICAgICAvLyBpbnRlZ2VyL2JpZ0ludGVnZXIgUEvripQg7J6E7IucIElEIOyDneyEsSAoREIg7Iuc7YCA7Iqk6rCAIOyLpOygnCBJRCDtlaDri7kpXG4gICAgICAvLyBzdHJpbmcgUEsgd2l0aCBkYkRlZmF1bHQgbmV4dHZhbOuPhCDrj5nsnbztlZjqsowg7LKY66asXG4gICAgICAvLyDqt7gg7Jm4IHN0cmluZy91dWlkIFBL64qUIGdlbmVyYXRlKCnsl5DshJwg7J2066+4IOyDneyEseuQnCBpZCDqsJLsnYQg6re464yA66GcIOyCrOyaqVxuICAgICAgLy8gcGFyZW50SWQg7JeU7Yuw7Yuw64qUIOu2gOuqqOydmCDsi6TsoJwgaWTrpbwg6re464yA66GcIOyCrOyaqSAo7Iuc7YCA7IqkIOuvuOyCrOyaqSlcbiAgICAgIGNvbnN0IGlkUHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik7XG4gICAgICBjb25zdCB1c2VzU2VxdWVuY2UgPVxuICAgICAgICAhZXhwbGljaXRJZCAmJlxuICAgICAgICAoaWRQcm9wPy50eXBlID09PSBcImludGVnZXJcIiB8fFxuICAgICAgICAgIGlkUHJvcD8udHlwZSA9PT0gXCJiaWdJbnRlZ2VyXCIgfHxcbiAgICAgICAgICAoaWRQcm9wPy50eXBlID09PSBcInN0cmluZ1wiICYmIHRoaXMuaGFzU2VxdWVuY2VEZWZhdWx0KGlkUHJvcCkpKTtcblxuICAgICAgY29uc3QgZGF0YUZvclJlY29yZCA9IHVzZXNTZXF1ZW5jZVxuICAgICAgICA/IHsgLi4uZGF0YSwgaWQ6IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDApIH1cbiAgICAgICAgOiBkYXRhO1xuXG4gICAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgZW50aXR5LFxuICAgICAgICBwYXJzZUZpeHR1cmVTb3VyY2VSZWNvcmQoZGF0YUZvclJlY29yZCksXG4gICAgICAgIHsgc2luZ2xlUmVjb3JkOiB0cnVlIH0sXG4gICAgICApO1xuICAgICAgZml4dHVyZVJlY29yZHMucHVzaCguLi5yZWNvcmRzKTtcbiAgICB9XG5cbiAgICAvLyAzLiB0YXJnZXREYuyXkCDsgr3snoUgKEZpeHR1cmVNYW5hZ2Vy6rCAIOydmOyhtOyEsSDsoJXroKwg7LKY66asKVxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlcyh0aGlzLnRhcmdldERiTmFtZSwgZml4dHVyZVJlY29yZHMpO1xuXG4gICAgLy8gNC4gY29tcGFuaW9uIGZpeHR1cmVzIOyDneyEsSAoZml4dHVyZUNvbXBhbmlvbnPqsIAg7ISg7Ja465CcIOqyveyasClcbiAgICBjb25zdCBjb21wYW5pb25SZXN1bHRzID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUNvbXBhbmlvbnMoc3BlY3MsIHJlc3VsdHMpO1xuXG4gICAgY29uc3QgdG90YWwgPSByZXN1bHRzLmxlbmd0aCArIGNvbXBhbmlvblJlc3VsdHMubGVuZ3RoO1xuICAgICFpc1Rlc3QoKSAmJlxuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYEdlbmVyYXRlZCBhbmQgc2F2ZWQgJHt0b3RhbH0gZml4dHVyZXMgdG8gJHt0aGlzLnRhcmdldERiTmFtZX1gKSk7XG4gICAgcmV0dXJuIFsuLi5yZXN1bHRzLCAuLi5jb21wYW5pb25SZXN1bHRzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrtoDrqqggZml4dHVyZSDqsrDqs7zrpbwg6riw67CY7Jy866GcIGZpeHR1cmVDb21wYW5pb25z7JeQIOyEoOyWuOuQnCBjb21wYW5pb24gRW50aXR566W8IOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICogZ2VuZXJhdGVCYXRjaCgp7JeQ7ISc66eMIO2YuOy2nOuQmOupsCwgY29tcGFuaW9uIOyDneyEsSDsi5wg7J6s6reA66W8IOuwqeyngO2VmOq4sCDsnITtlbRcbiAgICogZ2VuZXJhdGVCYXRjaCgp66W8IOuLpOyLnCDtmLjstpztlZjsp4Ag7JWK6rOgIOyngeygkSDsgr3snoXtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlQ29tcGFuaW9ucyhcbiAgICBzcGVjczogRml4dHVyZUdlbmVyYXRpb25TcGVjW10sXG4gICAgcGFyZW50UmVzdWx0czogRml4dHVyZUltcG9ydFJlc3VsdFtdLFxuICApOiBQcm9taXNlPEZpeHR1cmVJbXBvcnRSZXN1bHRbXT4ge1xuICAgIGNvbnN0IGFsbFJlc3VsdHM6IEZpeHR1cmVJbXBvcnRSZXN1bHRbXSA9IFtdO1xuICAgIGNvbnN0IHByb2Nlc3NlZEVudGl0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGNvbnN0IHNwZWMgb2Ygc3BlY3MpIHtcbiAgICAgIGlmIChwcm9jZXNzZWRFbnRpdGllcy5oYXMoc3BlYy5lbnRpdHkpKSBjb250aW51ZTtcbiAgICAgIHByb2Nlc3NlZEVudGl0aWVzLmFkZChzcGVjLmVudGl0eSk7XG5cbiAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoc3BlYy5lbnRpdHkpO1xuICAgICAgY29uc3QgaWRQcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgICAgIGNvbnN0IGNvbXBhbmlvbnMgPSBpZFByb3A/LmNvbmU/LmZpeHR1cmVDb21wYW5pb25zO1xuICAgICAgaWYgKCFjb21wYW5pb25zIHx8IGNvbXBhbmlvbnMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgZW50aXR5UmVzdWx0cyA9IHBhcmVudFJlc3VsdHMuZmlsdGVyKChyKSA9PiByLmVudGl0eUlkID09PSBzcGVjLmVudGl0eSk7XG4gICAgICBpZiAoZW50aXR5UmVzdWx0cy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICBmb3IgKGNvbnN0IGNvbXBhbmlvbiBvZiBjb21wYW5pb25zKSB7XG4gICAgICAgIC8vIGNvbXBhbmlvbiBlbnRpdHnsl5DshJwg67aA66qoIGVudGl0eeuhnOydmCBCZWxvbmdzVG9PbmUgRksg7Lus65+866qFIO2MjOyVhVxuICAgICAgICBjb25zdCBjb21wYW5pb25FbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KGNvbXBhbmlvbi5lbnRpdHkpO1xuICAgICAgICBjb25zdCBma1Byb3AgPSBjb21wYW5pb25FbnRpdHkucHJvcHMuZmluZChcbiAgICAgICAgICAocCkgPT4gaXNSZWxhdGlvblByb3AocCkgJiYgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocCkgJiYgcC53aXRoID09PSBzcGVjLmVudGl0eSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFma1Byb3ApIHtcbiAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICAgIGBbQ29tcGFuaW9uXSBObyBCZWxvbmdzVG9PbmUgcmVsYXRpb24gZnJvbSAke2NvbXBhbmlvbi5lbnRpdHl9IHRvICR7c3BlYy5lbnRpdHl9LiBTa2lwcGluZy5gLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBma0NvbE5hbWUgPSBgJHtma1Byb3AubmFtZX1faWRgO1xuXG4gICAgICAgIC8vIGNvbXBhbmlvbuydmCBpZFByb3AsIHVzZXNTZXF1ZW5jZSwgY291bnTripQgY29tcGFuaW9uIOuLqOychOuhnCDqs6DsoJVcbiAgICAgICAgY29uc3QgY29tcGFuaW9uSWRQcm9wID0gY29tcGFuaW9uRW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgICAgICAgY29uc3QgdXNlc1NlcXVlbmNlID1cbiAgICAgICAgICBjb21wYW5pb25JZFByb3A/LnR5cGUgPT09IFwiaW50ZWdlclwiIHx8XG4gICAgICAgICAgY29tcGFuaW9uSWRQcm9wPy50eXBlID09PSBcImJpZ0ludGVnZXJcIiB8fFxuICAgICAgICAgIChjb21wYW5pb25JZFByb3A/LnR5cGUgPT09IFwic3RyaW5nXCIgJiYgdGhpcy5oYXNTZXF1ZW5jZURlZmF1bHQoY29tcGFuaW9uSWRQcm9wKSk7XG4gICAgICAgIGNvbnN0IGNvbXBhbmlvbkNvdW50ID0gY29tcGFuaW9uLmNvdW50ID8/IDE7XG5cbiAgICAgICAgLy8g6rCBIHBhcmVudCByZXN1bHTsl5Ag64yA7ZW0IGNvbXBhbmlvbiBmaXh0dXJlIOyDneyEsVxuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jcmVhdGVDb250ZXh0KCk7XG4gICAgICAgIGNvbnN0IGNvbXBhbmlvbkZpeHR1cmVSZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHBhcmVudFJlc3VsdCBvZiBlbnRpdHlSZXN1bHRzKSB7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWRPdmVycmlkZXMgPSB0aGlzLnJlc29sdmVUZW1wbGF0ZU92ZXJyaWRlcyhcbiAgICAgICAgICAgIGRhdGFFeHBsb3JlclJlY29yZFNjaGVtYS5wYXJzZShjb21wYW5pb24ub3ZlcnJpZGVzID8/IHt9KSxcbiAgICAgICAgICAgIHBhcmVudFJlc3VsdC5kYXRhLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmVzb2x2ZWRPdmVycmlkZXNbZmtDb2xOYW1lXSA9IHBhcmVudFJlc3VsdC5kYXRhLmlkO1xuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21wYW5pb25Db3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBmaXh0dXJlID0gYXdhaXQgdGhpcy5nZW5lcmF0ZShjb21wYW5pb24uZW50aXR5LCByZXNvbHZlZE92ZXJyaWRlcywgY29udGV4dCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGFGb3JSZWNvcmQgPSB1c2VzU2VxdWVuY2VcbiAgICAgICAgICAgICAgPyB7IC4uLmZpeHR1cmUsIGlkOiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKSB9XG4gICAgICAgICAgICAgIDogZml4dHVyZTtcblxuICAgICAgICAgICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmNyZWF0ZUZpeHR1cmVSZWNvcmQoXG4gICAgICAgICAgICAgIGNvbXBhbmlvbkVudGl0eSxcbiAgICAgICAgICAgICAgcGFyc2VGaXh0dXJlU291cmNlUmVjb3JkKGRhdGFGb3JSZWNvcmQpLFxuICAgICAgICAgICAgICB7IHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbXBhbmlvbkZpeHR1cmVSZWNvcmRzLnB1c2goLi4ucmVjb3Jkcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tcGFuaW9uUmVzdWx0cyA9IGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVzKFxuICAgICAgICAgIHRoaXMudGFyZ2V0RGJOYW1lLFxuICAgICAgICAgIGNvbXBhbmlvbkZpeHR1cmVSZWNvcmRzLFxuICAgICAgICApO1xuICAgICAgICBhbGxSZXN1bHRzLnB1c2goLi4uY29tcGFuaW9uUmVzdWx0cyk7XG5cbiAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgICAgICAgYFtDb21wYW5pb25dIEdlbmVyYXRlZCAke2NvbXBhbmlvblJlc3VsdHMubGVuZ3RofSAke2NvbXBhbmlvbi5lbnRpdHl9IGZpeHR1cmVzYCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWxsUmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBvdmVycmlkZXMg6rCS7J2YIFwie3tmaWVsZE5hbWV9fVwiIO2FnO2UjOumv+ydhCDrtoDrqqggZml4dHVyZSDrjbDsnbTthLDroZwg7LmY7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiDsmIg6IHsgXCJhY2NvdW50X2lkXCI6IFwie3tlbWFpbH19XCIgfSDihpIgeyBcImFjY291bnRfaWRcIjogXCJ1c2VyQGV4YW1wbGUuY29tXCIgfVxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlVGVtcGxhdGVPdmVycmlkZXMoXG4gICAgb3ZlcnJpZGVzOiBEYXRhRXhwbG9yZXJSZWNvcmQsXG4gICAgcGFyZW50RGF0YTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgRGF0ZSB8IG51bGwgfSxcbiAgKTogRGF0YUV4cGxvcmVyUmVjb3JkIHtcbiAgICBjb25zdCByZXNvbHZlZDogRGF0YUV4cGxvcmVyUmVjb3JkID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3ZlcnJpZGVzKSkge1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSB6LnN0cmluZygpLnNhZmVQYXJzZSh2YWx1ZSk7XG4gICAgICBpZiAodGVtcGxhdGUuc3VjY2VzcyAmJiB0ZW1wbGF0ZS5kYXRhLnN0YXJ0c1dpdGgoXCJ7e1wiKSAmJiB0ZW1wbGF0ZS5kYXRhLmVuZHNXaXRoKFwifX1cIikpIHtcbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gdGVtcGxhdGUuZGF0YS5zbGljZSgyLCAtMikudHJpbSgpO1xuICAgICAgICBpZiAoIShmaWVsZE5hbWUgaW4gcGFyZW50RGF0YSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBg7YWc7ZSM66a/IO2VhOuTnCBcIiR7ZmllbGROYW1lfVwi7J20KOqwgCkg67aA66qoIGZpeHR1cmUg642w7J207YSw7JeQIOyhtOyerO2VmOyngCDslYrsirXri4jri6QgKG92ZXJyaWRlIGtleTogXCIke2tleX1cIilgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZWRba2V5XSA9IHBhcmVudERhdGFbZmllbGROYW1lXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmVkW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc29sdmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIOyLpOygnCBEQihzb3VyY2VEYinsl5DshJwg642w7J207YSw66W8IOyhsO2ajO2VmOyXrCBmaXh0dXJlIERCKHRhcmdldERiKeyXkCBpbXBvcnTtlanri4jri6QuXG4gICAqXG4gICAqIDEuIERhdGFFeHBsb3JlcuuhnCBzb3VyY2VEYuyXkOyEnCDrjbDsnbTthLAg7KGw7ZqMICjqtIDroKgg642w7J207YSwIO2PrO2VqClcbiAgICogMi4gRml4dHVyZVJlY29yZOuhnCDrs4DtmZhcbiAgICogMy4gdGFyZ2V0RGLsl5Ag7IK97J6FXG4gICAqXG4gICAqIEBwYXJhbSBlbnRpdHlOYW1lIC0g7KGw7ZqM7ZWgIGVudGl0eSDsnbTrpoRcbiAgICogQHBhcmFtIG9wdGlvbnMgLSDsobDtmowg7Ji17IWYIChzdHJhdGVneSwgbGltaXQsIGluY2x1ZGVSZWxhdGlvbnMg65OxKVxuICAgKiBAcmV0dXJucyDsoIDsnqXrkJwgZml4dHVyZSDrjbDsnbTthLAgKOyLpOygnCBEQiBJRCDtj6ztlagpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIO2UhOuhnOuNleyFmCBEQuyXkOyEnCBVc2VyIDEw66qFICsg6rSA66CoIEVtcGxveWVlLCBEZXBhcnRtZW50IOqwgOyguOyYpOq4sFxuICAgKiBhd2FpdCBnZW5lcmF0b3IuaW1wb3J0RnJvbVNvdXJjZShcIlVzZXJcIiwge1xuICAgKiAgIHN0cmF0ZWd5OiBcInNhbXBsZVwiLFxuICAgKiAgIGxpbWl0OiAxMCxcbiAgICogICBpbmNsdWRlUmVsYXRpb25zOiB0cnVlLFxuICAgKiAgIG1heERlcHRoOiAyXG4gICAqIH0pO1xuICAgKi9cbiAgYXN5bmMgaW1wb3J0RnJvbVNvdXJjZShcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczogRXhwbG9yZVdpdGhSZWxhdGlvbnNPcHRpb25zLFxuICApOiBQcm9taXNlPEZpeHR1cmVJbXBvcnRSZXN1bHRbXT4ge1xuICAgICFpc1Rlc3QoKSAmJlxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLmJsdWUoXG4gICAgICAgICAgYEltcG9ydGluZyAke2VudGl0eU5hbWV9IGZyb20gc291cmNlIERCIHdpdGggb3B0aW9uczogJHtKU09OLnN0cmluZ2lmeSh7IHN0cmF0ZWd5OiBvcHRpb25zLnN0cmF0ZWd5LCBsaW1pdDogb3B0aW9ucy5saW1pdCwgaW5jbHVkZVJlbGF0aW9uczogb3B0aW9ucy5pbmNsdWRlUmVsYXRpb25zLCBtYXhEZXB0aDogb3B0aW9ucy5tYXhEZXB0aCB9KX1gLFxuICAgICAgICApLFxuICAgICAgKTtcblxuICAgIC8vIDEuIERhdGFFeHBsb3JlcuuhnCBzb3VyY2VEYuyXkOyEnCDrjbDsnbTthLAg7KGw7ZqMICjqtIDroKgg642w7J207YSwIO2PrO2VqClcbiAgICBjb25zdCBleHBsb3JlUmVzdWx0ID0gYXdhaXQgdGhpcy5kYXRhRXhwbG9yZXIuZXhwbG9yZVdpdGhSZWxhdGlvbnMoZW50aXR5TmFtZSwgb3B0aW9ucyk7XG5cbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay5jeWFuKFxuICAgICAgICAgIGBGb3VuZCAke2V4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzLmxlbmd0aH0gJHtlbnRpdHlOYW1lfSByZWNvcmRzIGFuZCAke2V4cGxvcmVSZXN1bHQucmVsYXRlZC5zaXplfSByZWxhdGVkIGVudGl0aWVzYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICAvLyAyLiBGaXh0dXJlUmVjb3Jk66GcIOuzgO2ZmFxuICAgIGNvbnN0IGZpeHR1cmVSZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gPSBbXTtcblxuICAgIC8vIOuplOyduCBlbnRpdHnsnZggcmVjb3Jkc+ulvCBGaXh0dXJlUmVjb3Jk66GcIOuzgO2ZmFxuICAgIGNvbnN0IG1haW5FbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eU5hbWUpO1xuICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIGV4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzKSB7XG4gICAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgbWFpbkVudGl0eSxcbiAgICAgICAgcGFyc2VGaXh0dXJlU291cmNlUmVjb3JkKHJlY29yZCksXG4gICAgICAgIHsgZGI6IHRoaXMuc291cmNlRGIsIHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgKTtcbiAgICAgIGZpeHR1cmVSZWNvcmRzLnB1c2goLi4ucmVjb3Jkcyk7XG4gICAgfVxuXG4gICAgLy8g6rSA66CoIGVudGl0eeydmCByZWNvcmRz66W8IEZpeHR1cmVSZWNvcmTroZwg67OA7ZmYXG4gICAgZm9yIChjb25zdCBbcmVsYXRlZEVudGl0eU5hbWUsIHJlbGF0ZWRSZWNvcmRzXSBvZiBleHBsb3JlUmVzdWx0LnJlbGF0ZWQuZW50cmllcygpKSB7XG4gICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChyZWxhdGVkRW50aXR5TmFtZSk7XG4gICAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiByZWxhdGVkUmVjb3Jkcykge1xuICAgICAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgICByZWxhdGVkRW50aXR5LFxuICAgICAgICAgIHBhcnNlRml4dHVyZVNvdXJjZVJlY29yZChyZWNvcmQpLFxuICAgICAgICAgIHsgZGI6IHRoaXMuc291cmNlRGIsIHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgICApO1xuICAgICAgICBmaXh0dXJlUmVjb3Jkcy5wdXNoKC4uLnJlY29yZHMpO1xuICAgICAgfVxuXG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICAtICR7cmVsYXRlZEVudGl0eU5hbWV9OiAke3JlbGF0ZWRSZWNvcmRzLmxlbmd0aH0gcmVjb3Jkc2ApKTtcbiAgICB9XG5cbiAgICAvLyAzLiB0YXJnZXREYuyXkCDsgr3snoUgKEZpeHR1cmVNYW5hZ2Vy6rCAIOydmOyhtOyEsSDsoJXroKwg7LKY66asKVxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlcyh0aGlzLnRhcmdldERiTmFtZSwgZml4dHVyZVJlY29yZHMpO1xuXG4gICAgIWlzVGVzdCgpICYmXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgYFN1Y2Nlc3NmdWxseSBpbXBvcnRlZCAke3Jlc3VsdHMubGVuZ3RofSByZWNvcmRzIHRvICR7dGhpcy50YXJnZXREYk5hbWV9ICgke2V4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzLmxlbmd0aH0gJHtlbnRpdHlOYW1lfSArICR7cmVzdWx0cy5sZW5ndGggLSBleHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcy5sZW5ndGh9IHJlbGF0ZWQpYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQXFEQSxTQUFTLHlCQUF5QixRQUFpRDtDQUNqRixPQUFPO0VBQ0wsR0FBRztFQUNILElBQUksc0JBQXNCLE1BQU0sT0FBTyxFQUFFO0NBQzNDO0FBQ0Y7OztZQWpEbUc7aUJBQ3ZEO29CQUNZO29CQUN5QztxQkFJakQ7c0JBRUU7Q0FVNUMsc0JBQXNCLEVBQUUsT0FDNUIsaUJBQ0EsNEJBQ0Y7Q0FDTSw2QkFBNkIsRUFBRSxPQUFPLENBQUMsQ0FBQztDQUN4Qyx5QkFBeUIsRUFBRSxRQUM5QixjQUFjLDJCQUEyQixVQUFVLFNBQVMsQ0FBQyxDQUFDLFNBQy9ELCtCQUNGO0NBQ00sMkJBQTJCLEVBQUUsTUFBTSx1QkFBdUI7Q0FDMUQsd0JBQXdCLEVBQUUsTUFBTSxDQUFDLEVBQUUsT0FBTyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Q0FDeEQsMEJBQTBCLEVBQUUsTUFBTTtFQUFDLEVBQUUsT0FBTztFQUFHLEVBQUUsT0FBTztFQUFHLEVBQUUsUUFBUTtFQUFHLEVBQUUsS0FBSztFQUFHLEVBQUUsS0FBSztDQUFDLENBQUM7Q0E4Q3BGLG1CQUFiLE1BQThCO0VBU2xCO0VBSUE7RUFDQTtFQWJWO0VBQ0E7RUFDQTtFQUNBLDJCQUFtRCxJQUFJLElBQUk7RUFDM0QsOEJBQTJDLElBQUksSUFBSTtFQUNuRDtFQUVBLFlBQ0UsVUFHQSxXQUNBLGNBQ0EsZUFDQSxTQUNBO0dB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
|
|
1139
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1nZW5lcmF0b3IuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3RpbmcvZml4dHVyZS1nZW5lcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBMYW5ndWFnZU1vZGVsIH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgdHlwZSBTb25hbXVEQlByZXNldCB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eVwiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHlQcm9wLCB0eXBlIEZpeHR1cmVJbXBvcnRSZXN1bHQsIHR5cGUgRml4dHVyZVJlY29yZCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsIGlzT25lVG9PbmVSZWxhdGlvblByb3AsIGlzUmVsYXRpb25Qcm9wIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBpc1Rlc3QgfSBmcm9tIFwiLi4vdXRpbHMvY29udHJvbGxlclwiO1xuaW1wb3J0IHsgaXNGdW5jdGlvblZhbHVlIH0gZnJvbSBcIi4uL3V0aWxzL3J1bnRpbWUtdmFsdWVcIjtcbmltcG9ydCB7IERhdGFFeHBsb3JlciwgZGF0YUV4cGxvcmVyUmVjb3JkU2NoZW1hLCBkYXRhRXhwbG9yZXJWYWx1ZVNjaGVtYSB9IGZyb20gXCIuL2RhdGEtZXhwbG9yZXJcIjtcbmltcG9ydCB7IGRhdGFTb3VyY2VDb25maWdTY2hlbWEgfSBmcm9tIFwiLi9kYXRhLWV4cGxvcmVyXCI7XG5pbXBvcnQgeyB0eXBlIERhdGFFeHBsb3JlclJlY29yZCwgdHlwZSBEYXRhRXhwbG9yZXJWYWx1ZSB9IGZyb20gXCIuL2RhdGEtZXhwbG9yZXJcIjtcbmltcG9ydCB7IHR5cGUgRXhwbG9yZVdpdGhSZWxhdGlvbnNPcHRpb25zLCB0eXBlIEV4cGxvcmVXaXRoUmVsYXRpb25zUmVzdWx0IH0gZnJvbSBcIi4vZGF0YS1leHBsb3JlclwiO1xuaW1wb3J0IHsgZmFrZXJNYXBwaW5ncyB9IGZyb20gXCIuL2Zha2VyLW1hcHBpbmdzXCI7XG5pbXBvcnQgeyB0eXBlIEZha2VyTWFwcGluZ3MgfSBmcm9tIFwiLi9mYWtlci1tYXBwaW5nc1wiO1xuaW1wb3J0IHsgRml4dHVyZU1hbmFnZXIgfSBmcm9tIFwiLi9maXh0dXJlLW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgRml4dHVyZVNvdXJjZVJlY29yZCB9IGZyb20gXCIuL2ZpeHR1cmUtbWFuYWdlclwiO1xuXG5leHBvcnQgdHlwZSBMb2NhbGUgPSBcImtvXCIgfCBcImVuXCIgfCBcImphXCI7XG5leHBvcnQgdHlwZSBGaXh0dXJlT3ZlcnJpZGVzID0gb2JqZWN0O1xuXG50eXBlIEZha2VyRnVuY3Rpb24gPSAoLi4uYXJnczogRGF0YUV4cGxvcmVyVmFsdWVbXSkgPT4gRGF0YUV4cGxvcmVyVmFsdWU7XG50eXBlIEZha2VyTmFtZXNwYWNlTWVtYmVyID0gRmFrZXJGdW5jdGlvbiB8IEZha2VyTmFtZXNwYWNlO1xudHlwZSBGYWtlck5hbWVzcGFjZSA9IHsgW25hbWU6IHN0cmluZ106IEZha2VyTmFtZXNwYWNlTWVtYmVyIH07XG5cbmNvbnN0IGZha2VyRnVuY3Rpb25TY2hlbWEgPSB6LmN1c3RvbTxGYWtlckZ1bmN0aW9uPihcbiAgaXNGdW5jdGlvblZhbHVlLFxuICBcIkZha2VyIOqyveuhnOydmCDrp4jsp4Drp4kg6rCS7J2AIO2VqOyImOyXrOyVvCDtlanri4jri6QuXCIsXG4pO1xuY29uc3QgZmFrZXJOYW1lc3BhY2VPYmplY3RTY2hlbWEgPSB6Lm9iamVjdCh7fSk7XG5jb25zdCBkeW5hbWljTmFtZXNwYWNlU2NoZW1hID0gei5jdXN0b208RmFrZXJOYW1lc3BhY2U+KFxuICAoY2FuZGlkYXRlKSA9PiBmYWtlck5hbWVzcGFjZU9iamVjdFNjaGVtYS5zYWZlUGFyc2UoY2FuZGlkYXRlKS5zdWNjZXNzLFxuICBcIkZha2VyIOqyveuhnOuKlCDqsJ3ssrQgbmFtZXNwYWNl7Jes7JW8IO2VqeuLiOuLpC5cIixcbik7XG5jb25zdCBnZW5lcmF0b3JBcmd1bWVudHNTY2hlbWEgPSB6LmFycmF5KGRhdGFFeHBsb3JlclZhbHVlU2NoZW1hKTtcbmNvbnN0IGZpeHR1cmVSZWNvcmRJZFNjaGVtYSA9IHoudW5pb24oW3oubnVtYmVyKCksIHouc3RyaW5nKCldKTtcbmNvbnN0IGZpeHR1cmVXaGVyZVZhbHVlU2NoZW1hID0gei51bmlvbihbei5zdHJpbmcoKSwgei5udW1iZXIoKSwgei5ib29sZWFuKCksIHouZGF0ZSgpLCB6Lm51bGwoKV0pO1xuXG5leHBvcnQgdHlwZSBGaXh0dXJlR2VuZXJhdGlvblNwZWMgPSB7XG4gIGVudGl0eTogc3RyaW5nO1xuICBjb3VudDogbnVtYmVyO1xuICBvdmVycmlkZXM/OiBGaXh0dXJlT3ZlcnJpZGVzO1xufTtcblxudHlwZSBHZW5lcmF0ZWRGaXh0dXJlID0ge1xuICBlbnRpdHk6IHN0cmluZztcbiAgZGF0YTogRGF0YUV4cGxvcmVyUmVjb3JkO1xuICBleHBsaWNpdElkPzogYm9vbGVhbjtcbn07XG5cbmZ1bmN0aW9uIHBhcnNlRml4dHVyZVNvdXJjZVJlY29yZChyZWNvcmQ6IERhdGFFeHBsb3JlclJlY29yZCk6IEZpeHR1cmVTb3VyY2VSZWNvcmQge1xuICByZXR1cm4ge1xuICAgIC4uLnJlY29yZCxcbiAgICBpZDogZml4dHVyZVJlY29yZElkU2NoZW1hLnBhcnNlKHJlY29yZC5pZCksXG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIEZpeHR1cmVHZW5lcmF0b3JPcHRpb25zID0ge1xuICBsb2NhbGU/OiBMb2NhbGU7XG4gIHVzZUxMTT86IGJvb2xlYW47XG4gIGVuYWJsZUxMTUNhY2hlPzogYm9vbGVhbjtcbiAgbGxtTW9kZWw/OiBzdHJpbmc7XG4gIC8qKiDthYzsiqTtirjrgpgg64yA7LK0IExMTSDqs7XquInsnpDrpbwg7JyE7ZWcIO2FjeyKpO2KuCDsg53shLEg6rWs7ZiEICovXG4gIGdlbmVyYXRlVGV4dD86IEZpeHR1cmVUZXh0R2VuZXJhdG9yO1xufTtcblxuZXhwb3J0IHR5cGUgRml4dHVyZVRleHRHZW5lcmF0b3IgPSAocmVxdWVzdDoge1xuICBtb2RlbDogTGFuZ3VhZ2VNb2RlbDtcbiAgcHJvbXB0OiBzdHJpbmc7XG59KSA9PiBQcm9taXNlPHsgdGV4dDogc3RyaW5nOyB1c2FnZT86IHsgdG90YWxUb2tlbnM/OiBudW1iZXIgfSB9PjtcblxuZXhwb3J0IHR5cGUgR2VuZXJhdG9yQ29udGV4dCA9IHtcbiAgLyoqIOyDneyEsSDspJHsnbggZml4dHVyZeuTpCAo66mU66qo66asIOyDgSkgKi9cbiAgZml4dHVyZXM6IE1hcDxzdHJpbmcsIERhdGFFeHBsb3JlclJlY29yZD47XG5cbiAgLyoqIOywuOyhsCDrjbDsnbTthLAg7LqQ7IucIChEYXRhRXhwbG9yZXIg6rKw6rO8KSAqL1xuICByZWZlcmVuY2VDYWNoZTogTWFwPHN0cmluZywgRGF0YUV4cGxvcmVyUmVjb3JkW10+O1xuXG4gIC8qKiDsnbTrr7ggaW1wb3J065CcIOugiOy9lOuTnOulvCDstpTsoIHtlZjsl6wg7KSR67O1IGltcG9ydOulvCDrsKnsp4Dtlanri4jri6QgKi9cbiAgaW1wb3J0ZWRSZWNvcmRzOiBTZXQ8c3RyaW5nPjsgLy8gXCJVc2VyIzEyM1wiXG59O1xuXG5leHBvcnQgY2xhc3MgRml4dHVyZUdlbmVyYXRvciB7XG4gIHByaXZhdGUgZGF0YUV4cGxvcmVyOiBEYXRhRXhwbG9yZXI7XG4gIHByaXZhdGUgbG9jYWxlOiBMb2NhbGU7XG4gIHByaXZhdGUgbWFwcGluZ3M6IEZha2VyTWFwcGluZ3M7XG4gIHByaXZhdGUgbGxtQ2FjaGU6IE1hcDxzdHJpbmcsIERhdGFFeHBsb3JlclZhbHVlPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBlbnRpdHlDYWNoZTogTWFwPHN0cmluZywgRW50aXR5PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBvcHRpb25zOiBGaXh0dXJlR2VuZXJhdG9yT3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNvdXJjZURiOiBLbmV4LFxuICAgIC8vIEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVz6rCAIGRiTmFtZSDrrLjsnpDsl7TsnYQg67Cb6riwIOuVjOusuOyXkCDsp4HsoJEg7IKs7Jqp7ZWY7KeAIOyViuyKteuLiOuLpFxuICAgIC8vIOuvuOuemCDtmZXsnqXshLHsnYQg7JyE7ZW0IEFQSSDsi5zqt7jri4jsspjsl5DripQg7Y+s7ZWo7Iuc7Lyw7Iq164uI64ukXG4gICAgX3RhcmdldERiOiBLbmV4LFxuICAgIHByaXZhdGUgdGFyZ2V0RGJOYW1lOiBTb25hbXVEQlByZXNldCxcbiAgICBwcml2YXRlIGVudGl0eU1hbmFnZXI6IHR5cGVvZiBFbnRpdHlNYW5hZ2VyLFxuICAgIG9wdGlvbnM/OiBGaXh0dXJlR2VuZXJhdG9yT3B0aW9ucyxcbiAgKSB7XG4gICAgdGhpcy5kYXRhRXhwbG9yZXIgPSBuZXcgRGF0YUV4cGxvcmVyKHNvdXJjZURiLCBlbnRpdHlNYW5hZ2VyKTtcbiAgICB0aGlzLmxvY2FsZSA9IG9wdGlvbnM/LmxvY2FsZSB8fCBcImtvXCI7XG4gICAgdGhpcy5tYXBwaW5ncyA9IGZha2VyTWFwcGluZ3M7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgbG9jYWxlOiBvcHRpb25zPy5sb2NhbGUgfHwgXCJrb1wiLFxuICAgICAgdXNlTExNOiBvcHRpb25zPy51c2VMTE0gfHwgZmFsc2UsXG4gICAgICBlbmFibGVMTE1DYWNoZTogb3B0aW9ucz8uZW5hYmxlTExNQ2FjaGUgIT09IGZhbHNlLFxuICAgICAgbGxtTW9kZWw6IG9wdGlvbnM/LmxsbU1vZGVsIHx8IFwiY2xhdWRlLXNvbm5ldC00LTZcIixcbiAgICAgIGdlbmVyYXRlVGV4dDogb3B0aW9ucz8uZ2VuZXJhdGVUZXh0LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRml4dHVyZSDsg53shLEgKOuLqOydvClcbiAgICogQHJldHVybnMg7IOd7ISx65CcIGZpeHR1cmUg642w7J207YSwICjrqZTrqqjrpqwg7IOBKVxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGU8T3ZlcnJpZGVzID0gdW5kZWZpbmVkPihcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgb3ZlcnJpZGVzPzogT3ZlcnJpZGVzLFxuICAgIGNvbnRleHQ6IEdlbmVyYXRvckNvbnRleHQgPSB0aGlzLmNyZWF0ZUNvbnRleHQoKSxcbiAgKTogUHJvbWlzZTxEYXRhRXhwbG9yZXJSZWNvcmQ+IHtcbiAgICBjb25zdCBwYXJzZWRPdmVycmlkZXMgPSBkYXRhRXhwbG9yZXJSZWNvcmRTY2hlbWEucGFyc2Uob3ZlcnJpZGVzID8/IHt9KTtcbiAgICAvLyBFbnRpdHkg7LqQ7IuxOiDthYzsiqTtirjsl5DshJwgZW50aXR5IGNvbmUg7IiY7KCV7J20IOuwmOyYgeuQmOuPhOuhnSDrs7TsnqVcbiAgICBsZXQgZW50aXR5ID0gdGhpcy5lbnRpdHlDYWNoZS5nZXQoZW50aXR5TmFtZSk7XG4gICAgaWYgKCFlbnRpdHkpIHtcbiAgICAgIGVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoZW50aXR5TmFtZSk7XG4gICAgICB0aGlzLmVudGl0eUNhY2hlLnNldChlbnRpdHlOYW1lLCBlbnRpdHkpO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBJZCA9IGAke2VudGl0eU5hbWV9I3RlbXAjJHtEYXRlLm5vdygpfWA7IC8vIOyehOyLnCBJRFxuXG4gICAgLy8gTExNIHJvdyDri6jsnIQg7IOd7ISx7J2EIOychO2VnCDqs6DsnKAg7YKkICjqsJnsnYAgcm937J2YIO2VhOuTnOuTpOydtCDrj5nsnbztlZwgcm93S2V566W8IOqzteycoClcbiAgICBjb25zdCByb3dLZXkgPSB0aGlzLm9wdGlvbnMudXNlTExNID8gYCR7ZW50aXR5TmFtZX0jcm93IyR7RGF0ZS5ub3coKX1gIDogdW5kZWZpbmVkO1xuXG4gICAgLy8g6rCBIHByb3Drs4Qg6rCSIOyDneyEsVxuICAgIGNvbnN0IGZpeHR1cmU6IERhdGFFeHBsb3JlclJlY29yZCA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIGVudGl0eS5wcm9wcykge1xuICAgICAgLy8gVmlydHVhbCBwcm9w7J2AIOyKpO2CtVxuICAgICAgaWYgKFwidmlydHVhbFwiIGluIHByb3AgJiYgcHJvcC52aXJ0dWFsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBpZCBwcm9wIOyymOumrFxuICAgICAgaWYgKHByb3AubmFtZSA9PT0gXCJpZFwiKSB7XG4gICAgICAgIC8vIERCIHNlcXVlbmNl6rCAIOyekOuPmSDtlaDri7k6IGludGVnZXIvYmlnSW50ZWdlcuydtOqxsOuCmCwgc3RyaW5n7J207KeA66eMIGRiRGVmYXVsdOyXkCBuZXh0dmFs7J20IOyeiOuKlCDqsr3smrBcbiAgICAgICAgY29uc3QgaGFzRGJTZXF1ZW5jZSA9XG4gICAgICAgICAgcHJvcC50eXBlID09PSBcImludGVnZXJcIiB8fFxuICAgICAgICAgIHByb3AudHlwZSA9PT0gXCJiaWdJbnRlZ2VyXCIgfHxcbiAgICAgICAgICAocHJvcC50eXBlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICBcImRiRGVmYXVsdFwiIGluIHByb3AgJiZcbiAgICAgICAgICAgIHouc3RyaW5nKCkuc2FmZVBhcnNlKHByb3AuZGJEZWZhdWx0KS5kYXRhPy5pbmNsdWRlcyhcIm5leHR2YWxcIikgPT09IHRydWUpO1xuICAgICAgICBpZiAoaGFzRGJTZXF1ZW5jZSkge1xuICAgICAgICAgIC8vIGdlbmVyYXRlQmF0Y2jsl5DshJwg7LKY66as7ZWY66+A66GcIOyXrOq4sOyEoCDsiqTtgrVcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcC50eXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgLy8gc3RyaW5nIFBLOiBhbHBoYW51bWVyaWMgMzLsnpAg7IOd7ISxIChiZXR0ZXItYXV0aCDsiqTtg4DsnbwpXG4gICAgICAgICAgY29uc3QgeyBmYWtlcjogX2Zha2VyIH0gPSBhd2FpdCBpbXBvcnQoXCJAZmFrZXItanMvZmFrZXJcIik7XG4gICAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gX2Zha2VyLnN0cmluZy5hbHBoYW51bWVyaWMoMzIpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wLnR5cGUgPT09IFwidXVpZFwiKSB7XG4gICAgICAgICAgY29uc3QgeyBmYWtlcjogX2Zha2VyIH0gPSBhd2FpdCBpbXBvcnQoXCJAZmFrZXItanMvZmFrZXJcIik7XG4gICAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gX2Zha2VyLnN0cmluZy51dWlkKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIG92ZXJyaWRl6rCAIOyeiOycvOuptCDsgqzsmqlcbiAgICAgIGlmIChwcm9wLm5hbWUgaW4gcGFyc2VkT3ZlcnJpZGVzKSB7XG4gICAgICAgIGZpeHR1cmVbcHJvcC5uYW1lXSA9IHBhcnNlZE92ZXJyaWRlc1twcm9wLm5hbWVdO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gY29uZeyXkOyEnCDsg53shLEg7KCE6561IO2ZleyduFxuICAgICAgY29uc3QgY29uZSA9IHByb3AuY29uZTtcblxuICAgICAgLy8gMS4gUmVsYXRpb24gcHJvcCDsspjrpqxcbiAgICAgIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAvLyBCZWxvbmdzVG9PbmUgLyBPbmVUb09uZShoYXNKb2luQ29sdW1uKeydgCBGSyDsu6zrn7zrqoUoe3Byb3AubmFtZX1faWQp7Jy866Gc64+EIG92ZXJyaWRl66W8IOuwm+uKlOuLpFxuICAgICAgICBjb25zdCBma0NvbE5hbWUgPSBgJHtwcm9wLm5hbWV9X2lkYDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZrQ29sTmFtZSBpbiBwYXJzZWRPdmVycmlkZXMgJiZcbiAgICAgICAgICAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZml4dHVyZVtma0NvbE5hbWVdID0gcGFyc2VkT3ZlcnJpZGVzW2ZrQ29sTmFtZV07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWxhdGlvblZhbHVlID0gYXdhaXQgdGhpcy5nZW5lcmF0ZVJlbGF0aW9uVmFsdWUoZW50aXR5LCBwcm9wLCBjb250ZXh0KTtcbiAgICAgICAgLy8gQmVsb25nc1RvT25lLCBPbmVUb09uZShoYXNKb2luQ29sdW1uKeydmCDqsr3smrAgZm9yZWlnbiBrZXkg7Lus65+866qF7Jy866GcIOyggOyepVxuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHxcbiAgICAgICAgICAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pXG4gICAgICAgICkge1xuICAgICAgICAgIGZpeHR1cmVbYCR7cHJvcC5uYW1lfV9pZGBdID0gcmVsYXRpb25WYWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaXh0dXJlW3Byb3AubmFtZV0gPSByZWxhdGlvblZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBjb25lLm5vdGUgKyBMTE0g7IKs7JqpICh1c2VMTE3snbTrqbQgZml4dHVyZUdlbmVyYXRvcuuztOuLpCDsmrDshKApXG4gICAgICBpZiAoY29uZT8ubm90ZSAmJiB0aGlzLm9wdGlvbnMudXNlTExNKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbGxtVmFsdWUgPSBhd2FpdCB0aGlzLmdlbmVyYXRlV2l0aExMTShjb25lLm5vdGUsIHByb3AsIGVudGl0eSwgcm93S2V5KTtcbiAgICAgICAgICAvLyBzdHJpbmcg7YOA7J6F7J206rOgIGxlbmd0aCDsoJzslb3snbQg7J6I7Jy866m0IOy0iOqzvCDsi5wgdHJ1bmNhdGlvblxuICAgICAgICAgIGNvbnN0IGxsbVRleHQgPSB6LnN0cmluZygpLnNhZmVQYXJzZShsbG1WYWx1ZSk7XG4gICAgICAgICAgY29uc3QgbWF4TGVuZ3RoID0gXCJsZW5ndGhcIiBpbiBwcm9wID8gei5udW1iZXIoKS5zYWZlUGFyc2UocHJvcC5sZW5ndGgpIDogdW5kZWZpbmVkO1xuICAgICAgICAgIGlmIChsbG1UZXh0LnN1Y2Nlc3MgJiYgbWF4TGVuZ3RoPy5zdWNjZXNzICYmIGxsbVRleHQuZGF0YS5sZW5ndGggPiBtYXhMZW5ndGguZGF0YSkge1xuICAgICAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gbGxtVGV4dC5kYXRhLnNsaWNlKDAsIG1heExlbmd0aC5kYXRhKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gbGxtVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBbRml4dHVyZUdlbmVyYXRvcl0gTExNIGdlbmVyYXRpb24gZmFpbGVkIGZvciAke2VudGl0eS5pZH0uJHtwcm9wLm5hbWV9LCBmYWxsaW5nIGJhY2sgdG8gZml4dHVyZUdlbmVyYXRvciBvciBkZWZhdWx0YCxcbiAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3IsXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBmYWxsYmFjazogZml4dHVyZUdlbmVyYXRvciDihpIgZml4dHVyZURlZmF1bHQg4oaSIOq4sOuzuOqwkuycvOuhnCDqs4Tsho1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAzLiBmaXh0dXJlR2VuZXJhdG9yIOyCrOyaqVxuICAgICAgaWYgKGNvbmU/LmZpeHR1cmVHZW5lcmF0b3IpIHtcbiAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gYXdhaXQgdGhpcy5leGVjdXRlR2VuZXJhdG9yKGNvbmUuZml4dHVyZUdlbmVyYXRvciwgcHJvcCwgZW50aXR5KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIDQuIGZpeHR1cmVEZWZhdWx0IOyCrOyaqVxuICAgICAgaWYgKGNvbmU/LmZpeHR1cmVEZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gZGF0YUV4cGxvcmVyVmFsdWVTY2hlbWEucGFyc2UoY29uZS5maXh0dXJlRGVmYXVsdCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyA1LiDtg4DsnoXrs4Qg6riw67O4IOyDneyEsVxuICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gYXdhaXQgdGhpcy5nZW5lcmF0ZURlZmF1bHRWYWx1ZShwcm9wLCBlbnRpdHkpO1xuICAgIH1cblxuICAgIC8vIDYuIGVtYWlsIO2VhOuTnOqwgCDsnojqs6AgbmFtZSDtlYTrk5zqsIAg7J6I7Jy866m0LCBlbWFpbOydmCDroZzsu6wg7YyM7Yq466W8IG5hbWUg6riw67CY7Jy866GcIOuztOyglVxuICAgIGNvbnN0IGVtYWlsID0gei5zdHJpbmcoKS5zYWZlUGFyc2UoZml4dHVyZS5lbWFpbCk7XG4gICAgaWYgKGVtYWlsLnN1Y2Nlc3MgJiYgIShcImVtYWlsXCIgaW4gcGFyc2VkT3ZlcnJpZGVzKSkge1xuICAgICAgY29uc3QgbmFtZVZhbHVlID0gZml4dHVyZS5uYW1lIHx8IGZpeHR1cmUudXNlcm5hbWUgfHwgZml4dHVyZS5mdWxsX25hbWUgfHwgZml4dHVyZS5uYW1lX2VuO1xuICAgICAgY29uc3QgcGFyc2VkTmFtZSA9IHouc3RyaW5nKCkuc2FmZVBhcnNlKG5hbWVWYWx1ZSk7XG4gICAgICBpZiAocGFyc2VkTmFtZS5zdWNjZXNzKSB7XG4gICAgICAgIGNvbnN0IGRvbWFpbiA9IGVtYWlsLmRhdGEuc3BsaXQoXCJAXCIpWzFdIHx8IFwiZXhhbXBsZS5jb21cIjtcbiAgICAgICAgY29uc3Qgcm9tYW5pemVkID0gYXdhaXQgdGhpcy5yb21hbml6ZU5hbWUocGFyc2VkTmFtZS5kYXRhKTtcbiAgICAgICAgZml4dHVyZS5lbWFpbCA9IGAke3JvbWFuaXplZH1AJHtkb21haW59YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA3LiBwYXNzd29yZCDtlYTrk5wg7JWU7Zi47ZmUXG4gICAgY29uc3QgcGFzc3dvcmQgPSB6LnN0cmluZygpLnNhZmVQYXJzZShmaXh0dXJlLnBhc3N3b3JkKTtcbiAgICBpZiAocGFzc3dvcmQuc3VjY2VzcyAmJiBwYXNzd29yZC5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGJjcnlwdCA9IGF3YWl0IGltcG9ydChcImJjcnlwdFwiKTtcbiAgICAgIGZpeHR1cmUucGFzc3dvcmQgPSBhd2FpdCBiY3J5cHQuaGFzaChwYXNzd29yZC5kYXRhLCAxMCk7XG4gICAgfVxuXG4gICAgY29udGV4dC5maXh0dXJlcy5zZXQodGVtcElkLCBmaXh0dXJlKTtcbiAgICByZXR1cm4gZml4dHVyZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxhdGlvbiDqsJIg7IOd7ISxICsg7J6Q64+ZIEltcG9ydFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZVJlbGF0aW9uVmFsdWUoXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgcHJvcDogRW50aXR5UHJvcCxcbiAgICBjb250ZXh0OiBHZW5lcmF0b3JDb250ZXh0LFxuICApOiBQcm9taXNlPG51bWJlciB8IHN0cmluZyB8IG51bGw+IHtcbiAgICBpZiAoIWlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpeHR1cmVHZW5lcmF0b3I6ICR7ZW50aXR5LmlkfS4ke3Byb3AubmFtZX0gaXMgbm90IGEgcmVsYXRpb24gcHJvcGApO1xuICAgIH1cblxuICAgIC8vIEJlbG9uZ3NUb09uZSwgT25lVG9PbmUoaGFzSm9pbkNvbHVtbinrp4wg7LKY66asXG4gICAgaWYgKFxuICAgICAgIWlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmXG4gICAgICAhKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZSA9IHByb3AuY29uZTtcbiAgICBjb25zdCBkYXRhU291cmNlID0gY29uZT8uZGF0YVNvdXJjZTtcblxuICAgIC8vIERhdGFFeHBsb3JlcuuhnCDssLjsobAg642w7J207YSwIOyhsO2ajCAoc291cmNlRGIpXG4gICAgLy8g6rSA6rOEIOyytOyduOydhCDrlLDrnbzqsIDquLAg7JyE7ZW0IGV4cGxvcmVXaXRoUmVsYXRpb25zIOyCrOyaqVxuICAgIGlmIChkYXRhU291cmNlKSB7XG4gICAgICBjb25zdCBjYWNoZUtleSA9IGAke3Byb3Aud2l0aH06JHtKU09OLnN0cmluZ2lmeShkYXRhU291cmNlKX1gO1xuXG4gICAgICBpZiAoIWNvbnRleHQucmVmZXJlbmNlQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgICBjb25zdCBkYXRhU291cmNlQ29uZmlnID0gZGF0YVNvdXJjZUNvbmZpZ1NjaGVtYS5wYXJzZShkYXRhU291cmNlLmNvbmZpZyA/PyB7fSk7XG4gICAgICAgIGNvbnN0IGV4cGxvcmVSZXN1bHQgPSBhd2FpdCB0aGlzLmRhdGFFeHBsb3Jlci5leHBsb3JlV2l0aFJlbGF0aW9ucyhwcm9wLndpdGgsIHtcbiAgICAgICAgICBzdHJhdGVneTogZGF0YVNvdXJjZS5zdHJhdGVneSxcbiAgICAgICAgICBsaW1pdDogZGF0YVNvdXJjZUNvbmZpZy5saW1pdCA/PyAxMCxcbiAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zOiB0cnVlLFxuICAgICAgICAgIG1heERlcHRoOiAzLFxuICAgICAgICAgIC4uLmRhdGFTb3VyY2VDb25maWcsXG4gICAgICAgIH0pO1xuICAgICAgICBjb250ZXh0LnJlZmVyZW5jZUNhY2hlLnNldChjYWNoZUtleSwgZXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMpO1xuXG4gICAgICAgIC8vIOyhsO2ajO2VnCDrjbDsnbTthLDsmYAg6rSA6rOE65CcIOuqqOuToCDsl5Tti7Dti7DrpbwgdGFyZ2V0RGLsl5AgaW1wb3J0XG4gICAgICAgIGF3YWl0IHRoaXMuaW1wb3J0RXhwbG9yZVJlc3VsdChleHBsb3JlUmVzdWx0LCBjb250ZXh0KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IGNvbnRleHQucmVmZXJlbmNlQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICAgIGlmIChjYW5kaWRhdGVzICYmIGNhbmRpZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyDrnpzrjaTtlZjqsowg7ZWY64KYIOyEoO2DnVxuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IGNhbmRpZGF0ZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2FuZGlkYXRlcy5sZW5ndGgpXTtcbiAgICAgICAgcmV0dXJuIHoudW5pb24oW3oubnVtYmVyKCksIHouc3RyaW5nKCldKS5wYXJzZShzZWxlY3RlZC5pZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0YVNvdXJjZeqwgCDsl4bsnYQg65WMIOyekOuPmeycvOuhnCBmaXh0dXJlIERC7JeQ7IScIOyhsO2ajCDsi5zrj4RcbiAgICAvLyDqtIDqs4Qg7LK07J247J2EIOuUsOudvOqwgOq4sCDsnITtlbQgZXhwbG9yZVdpdGhSZWxhdGlvbnMg7IKs7JqpXG4gICAgY29uc3QgYXV0b0tleSA9IGAke3Byb3Aud2l0aH06YXV0b2A7XG4gICAgaWYgKCFjb250ZXh0LnJlZmVyZW5jZUNhY2hlLmhhcyhhdXRvS2V5KSkge1xuICAgICAgLy8gZml4dHVyZSBEQihzb3VyY2VEYinsl5DshJwg7J6Q64+ZIOyhsO2ajCAo6rSA6rOEIO2PrO2VqClcbiAgICAgIGNvbnN0IGF1dG9FeHBsb3JlUmVzdWx0ID0gYXdhaXQgdGhpcy5kYXRhRXhwbG9yZXIuZXhwbG9yZVdpdGhSZWxhdGlvbnMocHJvcC53aXRoLCB7XG4gICAgICAgIHN0cmF0ZWd5OiBcInJhbmRvbVwiLFxuICAgICAgICBsaW1pdDogMTAsXG4gICAgICAgIGluY2x1ZGVSZWxhdGlvbnM6IHRydWUsXG4gICAgICAgIG1heERlcHRoOiAzLFxuICAgICAgfSk7XG4gICAgICBjb250ZXh0LnJlZmVyZW5jZUNhY2hlLnNldChhdXRvS2V5LCBhdXRvRXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMpO1xuXG4gICAgICAvLyDsobDtmoztlZwg642w7J207YSw7JmAIOq0gOqzhOuQnCDrqqjrk6Ag7JeU7Yuw7Yuw66W8IHRhcmdldERi7JeQIGltcG9ydFxuICAgICAgaWYgKGF1dG9FeHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW1wb3J0RXhwbG9yZVJlc3VsdChhdXRvRXhwbG9yZVJlc3VsdCwgY29udGV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYXV0b0NhbmRpZGF0ZXMgPSBjb250ZXh0LnJlZmVyZW5jZUNhY2hlLmdldChhdXRvS2V5KTtcbiAgICBpZiAoYXV0b0NhbmRpZGF0ZXMgJiYgYXV0b0NhbmRpZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8g656c642k7ZWY6rKMIO2VmOuCmCDshKDtg51cbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gYXV0b0NhbmRpZGF0ZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYXV0b0NhbmRpZGF0ZXMubGVuZ3RoKV07XG4gICAgICByZXR1cm4gei51bmlvbihbei5udW1iZXIoKSwgei5zdHJpbmcoKV0pLnBhcnNlKHNlbGVjdGVkLmlkKTtcbiAgICB9XG5cbiAgICAvLyDssLjsobAg642w7J207YSw6rCAIOyXhuycvOuptCBudWxsIOuwmO2ZmCAobnVsbGFibGXsnbgg6rK97JqwKVxuICAgIGlmIChwcm9wLm51bGxhYmxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBudWxsYWJsZeydtCDslYTri4jqs6Ag642w7J207YSw64+EIOyXhuycvOuptCDsl5Drn6xcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRml4dHVyZUdlbmVyYXRvcjogJHtlbnRpdHkuaWR9LiR7cHJvcC5uYW1lfeyXkCDtlYTsmpTtlZwgJHtwcm9wLndpdGh9IOuNsOydtO2EsOqwgCDsl4bsirXri4jri6QuIGAgK1xuICAgICAgICBg66i87KCAICR7cHJvcC53aXRofeulvCDsg53shLHtlZjqsbDrgpggY29uZS5kYXRhU291cmNl66W8IOyEpOygle2VmOyEuOyalC5gLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRXhwbG9yZVdpdGhSZWxhdGlvbnMg6rKw6rO866W8IHRhcmdldERi7JeQIGltcG9ydFxuICAgKlxuICAgKiDqtIDqs4Qg7LK07J247J2EIOuUsOudvOqwhCDqsrDqs7wobWFpbiArIHJlbGF0ZWQp66W8IOuqqOuRkCBpbXBvcnTtlanri4jri6QuXG4gICAqIOydmOyhtOyEsSDsiJzshJzripQgRml4dHVyZU1hbmFnZXIuaW5zZXJ0Rml4dHVyZXPqsIAg7J6Q64+Z7Jy866GcIOyymOumrO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW1wb3J0RXhwbG9yZVJlc3VsdChcbiAgICBleHBsb3JlUmVzdWx0OiBFeHBsb3JlV2l0aFJlbGF0aW9uc1Jlc3VsdCxcbiAgICBjb250ZXh0OiBHZW5lcmF0b3JDb250ZXh0LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhbGxGaXh0dXJlUmVjb3JkczogRml4dHVyZVJlY29yZFtdID0gW107XG5cbiAgICAvLyAxLiBSZWxhdGVkIGVudGl0aWVzIGltcG9ydCAoQ29tcGFueSwgRGVwYXJ0bWVudCDrk7EpXG4gICAgZm9yIChjb25zdCBbZW50aXR5SWQsIHJlY29yZHNdIG9mIGV4cGxvcmVSZXN1bHQucmVsYXRlZC5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgY29uc3QgcmVjb3Jkc1RvSW1wb3J0OiBEYXRhRXhwbG9yZXJSZWNvcmRbXSA9IFtdO1xuXG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsuY3lhbihgSW1wb3J0aW5nIHJlbGF0ZWQgZW50aXR5OiAke2VudGl0eUlkfSAoJHtyZWNvcmRzLmxlbmd0aH0gcmVjb3JkcylgKSxcbiAgICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgcmVjb3Jkcykge1xuICAgICAgICBjb25zdCByZWNvcmRLZXkgPSBgJHtlbnRpdHlJZH0jJHtyZWNvcmQuaWR9YDtcbiAgICAgICAgaWYgKCFjb250ZXh0LmltcG9ydGVkUmVjb3Jkcy5oYXMocmVjb3JkS2V5KSkge1xuICAgICAgICAgIHJlY29yZHNUb0ltcG9ydC5wdXNoKHJlY29yZCk7XG4gICAgICAgICAgY29udGV4dC5pbXBvcnRlZFJlY29yZHMuYWRkKHJlY29yZEtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZHNUb0ltcG9ydC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHNUb0ltcG9ydCkge1xuICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGNoYWxrLmdyYXkoXG4gICAgICAgICAgICAgICAgYCAgLSBQcm9jZXNzaW5nICR7ZW50aXR5SWR9IHJlY29yZDpgLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHJlY29yZCkuc2xpY2UoMCwgMTAwKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZml4dHVyZVJlY29yZHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5jcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgcGFyc2VGaXh0dXJlU291cmNlUmVjb3JkKHJlY29yZCksXG4gICAgICAgICAgICB7IGRiOiB0aGlzLnNvdXJjZURiLCBzaW5nbGVSZWNvcmQ6IHRydWUgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGFsbEZpeHR1cmVSZWNvcmRzLnB1c2goLi4uZml4dHVyZVJlY29yZHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMi4gTWFpbiBlbnRpdHkgaW1wb3J0IChFbXBsb3llZSDrk7EpXG4gICAgY29uc3QgbWFpbkVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoZXhwbG9yZVJlc3VsdC5tYWluLmVudGl0eUlkKTtcbiAgICBjb25zdCBtYWluUmVjb3Jkc1RvSW1wb3J0OiBEYXRhRXhwbG9yZXJSZWNvcmRbXSA9IFtdO1xuXG4gICAgIWlzVGVzdCgpICYmXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgICBgSW1wb3J0aW5nIG1haW4gZW50aXR5OiAke2V4cGxvcmVSZXN1bHQubWFpbi5lbnRpdHlJZH0gKCR7ZXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMubGVuZ3RofSByZWNvcmRzKWAsXG4gICAgICAgICksXG4gICAgICApO1xuXG4gICAgZm9yIChjb25zdCByZWNvcmQgb2YgZXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMpIHtcbiAgICAgIGNvbnN0IHJlY29yZEtleSA9IGAke2V4cGxvcmVSZXN1bHQubWFpbi5lbnRpdHlJZH0jJHtyZWNvcmQuaWR9YDtcbiAgICAgIGlmICghY29udGV4dC5pbXBvcnRlZFJlY29yZHMuaGFzKHJlY29yZEtleSkpIHtcbiAgICAgICAgbWFpblJlY29yZHNUb0ltcG9ydC5wdXNoKHJlY29yZCk7XG4gICAgICAgIGNvbnRleHQuaW1wb3J0ZWRSZWNvcmRzLmFkZChyZWNvcmRLZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtYWluUmVjb3Jkc1RvSW1wb3J0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIG1haW5SZWNvcmRzVG9JbXBvcnQpIHtcbiAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay5ncmF5KFxuICAgICAgICAgICAgICBgICAtIFByb2Nlc3NpbmcgJHtleHBsb3JlUmVzdWx0Lm1haW4uZW50aXR5SWR9IHJlY29yZDpgLFxuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShyZWNvcmQpLnNsaWNlKDAsIDEwMCksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgIGNvbnN0IGZpeHR1cmVSZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgICBtYWluRW50aXR5LFxuICAgICAgICAgIHBhcnNlRml4dHVyZVNvdXJjZVJlY29yZChyZWNvcmQpLFxuICAgICAgICAgIHsgZGI6IHRoaXMuc291cmNlRGIsIHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgICApO1xuICAgICAgICBhbGxGaXh0dXJlUmVjb3Jkcy5wdXNoKC4uLmZpeHR1cmVSZWNvcmRzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAzLiDrqqjrk6AgZml4dHVyZeulvCDtlZwg67KI7JeQIOyCveyehSAo7J2Y7KG07ISxIOyInOyEnCDsnpDrj5kg7LKY66asKVxuICAgIGlmIChhbGxGaXh0dXJlUmVjb3Jkcy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlcyh0aGlzLnRhcmdldERiTmFtZSwgYWxsRml4dHVyZVJlY29yZHMpO1xuXG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICBgQXV0by1pbXBvcnRlZCAke2V4cGxvcmVSZXN1bHQubWFpbi5lbnRpdHlJZH0gd2l0aCByZWxhdGlvbnM6IGAgK1xuICAgICAgICAgICAgICBgJHtleHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcy5sZW5ndGh9IG1haW4gKyAke2V4cGxvcmVSZXN1bHQucmVsYXRlZC5zaXplfSByZWxhdGVkIGVudGl0aWVzYCxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBmaXh0dXJlR2VuZXJhdG9yIOyLpO2WiSAoRmFrZXIuanPrp4wg7KeA7JuQKVxuICAgKlxuICAgKiBmYWtlci4qIO2YleyLneydmCDtkZztmITsi53snYQg7JWI7KCE7ZWY6rKMIO2MjOyLse2VmOyXrCDsi6Ttlontlanri4jri6QuXG4gICAqIOyYiDogXCJmYWtlci5pbnRlcm5ldC5lbWFpbCgpXCIg4oaSIGZha2VyLmludGVybmV0LmVtYWlsKClcbiAgICog7JiIOiBcImZha2VyLmxvcmVtLndvcmRzKDMpXCIg4oaSIGZha2VyLmxvcmVtLndvcmRzKDMpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVHZW5lcmF0b3IoXG4gICAgZ2VuZXJhdG9yOiBzdHJpbmcsXG4gICAgcHJvcDogRW50aXR5UHJvcCxcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgKTogUHJvbWlzZTxEYXRhRXhwbG9yZXJWYWx1ZT4ge1xuICAgIC8vIEZha2VyLmpzIO2RnO2YhOyLneunjCDsp4Dsm5BcbiAgICBpZiAoZ2VuZXJhdG9yLnN0YXJ0c1dpdGgoXCJmYWtlci5cIikpIHtcbiAgICAgIC8vIHVzZXJuYW1l7J2064KYIG5hbWUg7ZWE65Oc64qUIO2VnOq1reyWtCBmYWtlciDsgqzsmqlcbiAgICAgIGNvbnN0IGlzTmFtZUZpZWxkID0gcHJvcC5uYW1lID09PSBcInVzZXJuYW1lXCIgfHwgcHJvcC5uYW1lID09PSBcIm5hbWVcIjtcbiAgICAgIGNvbnN0IGZha2VyTW9kdWxlID0gYXdhaXQgaW1wb3J0KFwiQGZha2VyLWpzL2Zha2VyXCIpO1xuICAgICAgY29uc3QgZmFrZXIgPSBpc05hbWVGaWVsZCA/IGZha2VyTW9kdWxlLmZha2VyS08gOiBmYWtlck1vZHVsZS5mYWtlcjtcbiAgICAgIGNvbnN0IGV4cHIgPSBnZW5lcmF0b3Iuc2xpY2UoNik7IC8vIFwiZmFrZXIuXCIg7KCc6rGwXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIO2VqOyImCDqsr3roZzsmYAg7J247J6QIO2MjOyLsVxuICAgICAgICBjb25zdCBtYXRjaCA9IGV4cHIubWF0Y2goL14oW1xcdy5dKykoPzpcXCgoLio/KVxcKSk/JC8pO1xuICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEZpeHR1cmVHZW5lcmF0b3I6IEludmFsaWQgZmFrZXIgZXhwcmVzc2lvbiBmb3IgJHtwcm9wLm5hbWV9OiAke2dlbmVyYXRvcn1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBbLCBwYXRoLCBhcmdzU3RyXSA9IG1hdGNoO1xuICAgICAgICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIuXCIpO1xuXG4gICAgICAgIC8vIGZha2VyIOqwneyytOyXkOyEnCDtlajsiJgg7LC+6riwXG4gICAgICAgIGxldCBtZW1iZXIgPSBkeW5hbWljTmFtZXNwYWNlU2NoZW1hLnBhcnNlKGZha2VyKTtcbiAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgaWYgKCEocGFydCBpbiBtZW1iZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpeHR1cmVHZW5lcmF0b3I6IEludmFsaWQgZmFrZXIgcGF0aCBmb3IgJHtwcm9wLm5hbWV9OiBmYWtlci4ke3BhdGh9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG5leHRNZW1iZXIgPSBtZW1iZXJbcGFydF07XG4gICAgICAgICAgaWYgKHBhcnQgIT09IHBhcnRzLmF0KC0xKSkge1xuICAgICAgICAgICAgbWVtYmVyID0gZHluYW1pY05hbWVzcGFjZVNjaGVtYS5wYXJzZShuZXh0TWVtYmVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmbiA9IGZha2VyRnVuY3Rpb25TY2hlbWEucGFyc2UobWVtYmVyW3BhcnRzLmF0KC0xKSA/PyBcIlwiXSk7XG5cbiAgICAgICAgbGV0IGFyZ3M6IERhdGFFeHBsb3JlclZhbHVlW10gPSBbXTtcbiAgICAgICAgaWYgKGFyZ3NTdHI/LnRyaW0oKSkge1xuICAgICAgICAgIGFyZ3MgPSB0aGlzLnBhcnNlR2VuZXJhdG9yQXJncyhhcmdzU3RyLCBwcm9wLm5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGFFeHBsb3JlclZhbHVlU2NoZW1hLnBhcnNlKGZuKC4uLmFyZ3MpKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGV4ZWN1dGUgZ2VuZXJhdG9yIFwiJHtnZW5lcmF0b3J9XCIgZm9yICR7cHJvcC5uYW1lfSwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQ6YCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZURlZmF1bHRWYWx1ZShwcm9wLCBlbnRpdHkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZha2VyIOydtOyZuOydmCDtkZztmITsi53snYAg7KeA7JuQ7ZWY7KeAIOyViuydjFxuICAgICFpc1Rlc3QoKSAmJlxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgVW5zdXBwb3J0ZWQgZ2VuZXJhdG9yIGV4cHJlc3Npb24gZm9yICR7cHJvcC5uYW1lfTogJHtnZW5lcmF0b3J9LiBPbmx5IGZha2VyLiogZXhwcmVzc2lvbnMgYXJlIHN1cHBvcnRlZC4gVXNpbmcgZGVmYXVsdCB2YWx1ZS5gLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZURlZmF1bHRWYWx1ZShwcm9wLCBlbnRpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VhOuTnOydmCDtg4DsnoXqs7wg7J2066aE7J2EIOu2hOyEne2VmOyXrCDsoIHsoIjtlZwg6riw67O46rCS7J2EIOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICog7Jqw7ISg7Iic7JyEOlxuICAgKiAxLiDtlYTrk5zrqoUg7Yyo7YS0IOunpOy5rSAoc2FsYXJ5LCBidWRnZXQg65OxIOydmOuvuOyeiOuKlCDrjbDsnbTthLApXG4gICAqIDIuIO2KueyImCDsvIDsnbTsiqQgKERlcGFydG1lbnQgbmFtZSDrk7Eg64+E66mU7J24IOyngOyLnSlcbiAgICogMy4g67Cw7Je0IO2DgOyehSAoSlNPTiDrsLDsl7QpXG4gICAqIDQuIEVudW0g7YOA7J6FXG4gICAqIDUuIO2DgOyeheuzhCDquLDrs7jqsJJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVEZWZhdWx0VmFsdWUoXG4gICAgcHJvcDogRW50aXR5UHJvcCxcbiAgICBlbnRpdHk/OiBFbnRpdHksXG4gICk6IFByb21pc2U8RGF0YUV4cGxvcmVyVmFsdWU+IHtcbiAgICBjb25zdCBmYWtlck1vZHVsZSA9IGF3YWl0IGltcG9ydChcIkBmYWtlci1qcy9mYWtlclwiKTtcbiAgICBjb25zdCBmYWtlciA9IGZha2VyTW9kdWxlLmZha2VyO1xuICAgIGNvbnN0IGZha2VyS08gPSBmYWtlck1vZHVsZS5mYWtlcktPO1xuICAgIGNvbnN0IGZha2VySkEgPSBmYWtlck1vZHVsZS5mYWtlckpBO1xuXG4gICAgY29uc3QgbG9jYWxlRmFrZXIgPSB0aGlzLmxvY2FsZSA9PT0gXCJrb1wiID8gZmFrZXJLTyA6IHRoaXMubG9jYWxlID09PSBcImphXCIgPyBmYWtlckpBIDogZmFrZXI7XG5cbiAgICAvKipcbiAgICAgKiAxLiBFbnRpdHktc3BlY2lmaWMg7Yq57IiYIOy8gOydtOyKpOulvCDrqLzsoIAg7LKY66as7ZWp64uI64ukLlxuICAgICAqIGZpZWxkX3BhdHRlcm5z67O064ukIOyasOyEoO2VmOyXrCwg7Yq57KCVIOyXlO2LsO2LsOydmCDtlYTrk5zsl5Ag64+E66mU7J247JeQIOunnuuKlCDqsJLsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgICAqIOyYiDogRGVwYXJ0bWVudC5uYW1lIOKGkiDtlZzqta3slrQg67aA7ISc66qFICjsgqzrnowg7J2066aE7J20IOyVhOuLmClcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIERlcGFydG1lbnQgbmFtZeydgCDtlZzqta3slrQg67aA7ISc66qFIOuqqeuhneyXkOyEnCDshKDtg53tlanri4jri6QuXG4gICAgICog6rOg7Jyg7ISx7J2EIOychO2VtCA3MCUg7ZmV66Wg66GcIHByZWZpeC9zdWZmaXjrpbwg7LaU6rCA7ZWp64uI64ukLlxuICAgICAqL1xuICAgIGlmIChlbnRpdHk/LmlkID09PSBcIkRlcGFydG1lbnRcIiAmJiBwcm9wLm5hbWUgPT09IFwibmFtZVwiKSB7XG4gICAgICBjb25zdCBkZXBhcnRtZW50cyA9IFtcbiAgICAgICAgXCLqsJzrsJztjIBcIixcbiAgICAgICAgXCLquLDtmo3tjIBcIixcbiAgICAgICAgXCLrp4jsvIDtjIXtjIBcIixcbiAgICAgICAgXCLsmIHsl4XtjIBcIixcbiAgICAgICAgXCLsnbjsgqztjIBcIixcbiAgICAgICAgXCLstJ3rrLTtjIBcIixcbiAgICAgICAgXCLsnqzrrLTtjIBcIixcbiAgICAgICAgXCLtmozqs4TtjIBcIixcbiAgICAgICAgXCLrspXrrLTtjIBcIixcbiAgICAgICAgXCLrlJTsnpDsnbjtjIBcIixcbiAgICAgICAgXCJJVO2MgFwiLFxuICAgICAgICBcIuqzoOqwneyngOybkO2MgFwiLFxuICAgICAgICBcIu2SiOyniOq0gOumrO2MgFwiLFxuICAgICAgICBcIuyXsOq1rOqwnOuwnO2MgFwiLFxuICAgICAgICBcIuyDneyCsO2MgFwiLFxuICAgICAgICBcIuq1rOunpO2MgFwiLFxuICAgICAgICBcIuusvOulmO2MgFwiLFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHByZWZpeGVzID0gW1wi7Iug6recXCIsIFwi7Ya17ZWpXCIsIFwi7KCE6561XCIsIFwi6riA66Gc67KMXCIsIFwi65SU7KeA7YS4XCIsIFwi7ZW17IusXCJdO1xuICAgICAgY29uc3Qgc3VmZml4ZXMgPSBbXCIx7YyAXCIsIFwiMu2MgFwiLCBcIjPtjIBcIiwgXCJB7YyAXCIsIFwiQu2MgFwiLCBcIuuzuOu2gFwiLCBcIuyEvO2EsFwiLCBcIuq3uOujuVwiXTtcblxuICAgICAgY29uc3QgZGVwdCA9IGZha2VyLmhlbHBlcnMuYXJyYXlFbGVtZW50KGRlcGFydG1lbnRzKTtcblxuICAgICAgY29uc3QgcmFuZG9tID0gTWF0aC5yYW5kb20oKTtcbiAgICAgIGlmIChyYW5kb20gPiAwLjcpIHtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gZmFrZXIuaGVscGVycy5hcnJheUVsZW1lbnQocHJlZml4ZXMpO1xuICAgICAgICByZXR1cm4gYCR7cHJlZml4fSAke2RlcHR9YDtcbiAgICAgIH1cbiAgICAgIGlmIChyYW5kb20gPiAwLjQpIHtcbiAgICAgICAgY29uc3Qgc3VmZml4ID0gZmFrZXIuaGVscGVycy5hcnJheUVsZW1lbnQoc3VmZml4ZXMpO1xuICAgICAgICByZXR1cm4gYCR7ZGVwdH0gJHtzdWZmaXh9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZXB0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDIuIO2VhOuTnOuqheyXkOyEnCDsnZjrr7jrpbwg7LaU66Gg7ZWY7JesIO2YhOyLpOyggeyduCDrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgICAqIOyYiDogc2FsYXJ5IOKGkiAzME1+MTUwTSAo7ZWc6rWtIOyXsOu0iSDrspTsnIQpXG4gICAgICogICAgIGJ1ZGdldCDihpIgMTBNfjUwME0gKO2UhOuhnOygne2KuCDsmIjsgrAg67KU7JyEKVxuICAgICAqL1xuICAgIGNvbnN0IGxvY2FsZU1hcHBpbmdzID0gdGhpcy5tYXBwaW5nc1t0aGlzLmxvY2FsZV0gfHwgdGhpcy5tYXBwaW5ncy5lbjtcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHByb3AubmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL18vZywgXCJcIik7XG5cbiAgICBmb3IgKGNvbnN0IFtwYXR0ZXJuLCBjb25maWddIG9mIE9iamVjdC5lbnRyaWVzKGxvY2FsZU1hcHBpbmdzLmZpZWxkX3BhdHRlcm5zKSkge1xuICAgICAgaWYgKG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKHBhdHRlcm4udG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlRmFrZXJFeHByZXNzaW9uKGNvbmZpZy5mYWtlciwgcHJvcCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gZXhlY3V0ZSBmaWVsZCBwYXR0ZXJuIFwiJHtwYXR0ZXJufVwiIGZvciAke3Byb3AubmFtZX0sIGZhbGxpbmcgYmFjazpgLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAzLiBKU09OIO2DgOyeheydtOuptOyEnCDrsLDsl7Tsnbgg6rK97JqwIChTb25hbXVGaWxlW10sIHN0cmluZ1tdIOuTsSlcbiAgICAgKiDtlYTrk5zrqoUg7Yyo7YS07J2EIOuztOqzoCDsoIHsoIjtlZwg67Cw7Je0IOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gICAgICovXG4gICAgaWYgKHByb3AudHlwZSA9PT0gXCJqc29uXCIgJiYgXCJpZFwiIGluIHByb3AgJiYgcHJvcC5pZCkge1xuICAgICAgaWYgKHByb3AuaWQuZW5kc1dpdGgoXCJbXVwiKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUFycmF5VmFsdWUocHJvcCwgZW50aXR5LCBmYWtlciwgbG9jYWxlRmFrZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiA0LiBFbnVtIO2DgOyeheydgCDsoJXsnZjrkJwg6rCSIOykkSDtlZjrgpjrpbwg656c642kIOyEoO2Dne2VqeuLiOuLpCAqL1xuICAgIGlmIChwcm9wLnR5cGUgPT09IFwiZW51bVwiKSB7XG4gICAgICBsZXQgZW51bVZhbHVlczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgaWYgKFwiZW51bVwiIGluIHByb3AgJiYgQXJyYXkuaXNBcnJheShwcm9wLmVudW0pICYmIHByb3AuZW51bS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVudW1WYWx1ZXMgPSBwcm9wLmVudW07XG4gICAgICB9IGVsc2UgaWYgKFwiaWRcIiBpbiBwcm9wICYmIHByb3AuaWQgJiYgZW50aXR5Py5lbnVtTGFiZWxzPy5bcHJvcC5pZF0pIHtcbiAgICAgICAgZW51bVZhbHVlcyA9IE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzW3Byb3AuaWRdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVudW1WYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gZmFrZXIuaGVscGVycy5hcnJheUVsZW1lbnQoZW51bVZhbHVlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcC5udWxsYWJsZSA/IG51bGwgOiBcIlVOS05PV05cIjtcbiAgICB9XG5cbiAgICBpZiAocHJvcC50eXBlID09PSBcImVudW1bXVwiKSB7XG4gICAgICBsZXQgZW51bVZhbHVlczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgaWYgKFwiZW51bVwiIGluIHByb3AgJiYgQXJyYXkuaXNBcnJheShwcm9wLmVudW0pICYmIHByb3AuZW51bS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVudW1WYWx1ZXMgPSBwcm9wLmVudW07XG4gICAgICB9IGVsc2UgaWYgKFwiaWRcIiBpbiBwcm9wICYmIHByb3AuaWQgJiYgZW50aXR5Py5lbnVtTGFiZWxzPy5bcHJvcC5pZF0pIHtcbiAgICAgICAgZW51bVZhbHVlcyA9IE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzW3Byb3AuaWRdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVudW1WYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gW2Zha2VyLmhlbHBlcnMuYXJyYXlFbGVtZW50KGVudW1WYWx1ZXMpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA1LiBWZWN0b3Ig7YOA7J6F7J2AIO2YhOyerCDsp4Dsm5DtlZjsp4Ag7JWK7Jy866+A66GcIG51bGzsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgICAqIO2Wpe2bhCBBSSBlbWJlZGRpbmcg7IOd7ISxIOq4sOuKpSDstpTqsIAg7IucIOq1rO2YhCDsmIjsoJXsnoXri4jri6QuXG4gICAgICovXG4gICAgaWYgKHByb3AudHlwZSA9PT0gXCJ2ZWN0b3JcIiB8fCBwcm9wLnR5cGUgPT09IFwidmVjdG9yW11cIiB8fCBwcm9wLnR5cGUgPT09IFwidHN2ZWN0b3JcIikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqIDYuIO2DgOyeheuzhCDquLDrs7ggRmFrZXIg7ZGc7ZiE7Iud7J2EIOyLpO2Wie2VqeuLiOuLpCAqL1xuICAgIGNvbnN0IHR5cGVEZWZhdWx0ID0gbG9jYWxlTWFwcGluZ3MudHlwZV9kZWZhdWx0c1twcm9wLnR5cGVdO1xuICAgIGlmICh0eXBlRGVmYXVsdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUZha2VyRXhwcmVzc2lvbih0eXBlRGVmYXVsdC5mYWtlciwgcHJvcCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNoYWxrLnllbGxvdyhgRmFpbGVkIHRvIGV4ZWN1dGUgdHlwZSBkZWZhdWx0IGZvciAke3Byb3AudHlwZX0sIHVzaW5nIGZhbGxiYWNrOmAsIGVycm9yKSxcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiA3LiDrp6TtlZHrkJjsp4Ag7JWK7J2AIO2DgOyeheydgCDquLDrs7ggRmFrZXIg7ZWo7IiY66GcIOyymOumrO2VqeuLiOuLpCAqL1xuICAgIHN3aXRjaCAocHJvcC50eXBlKSB7XG4gICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICBjYXNlIFwic3RyaW5nW11cIjpcbiAgICAgICAgcmV0dXJuIGZha2VyLmxvcmVtLndvcmRzKDMpO1xuICAgICAgY2FzZSBcImludGVnZXJcIjpcbiAgICAgICAgcmV0dXJuIGZha2VyLm51bWJlci5pbnQoeyBtaW46IDEsIG1heDogMTAwMCB9KTtcbiAgICAgIGNhc2UgXCJpbnRlZ2VyW11cIjpcbiAgICAgICAgcmV0dXJuIFtmYWtlci5udW1iZXIuaW50KHsgbWluOiAxLCBtYXg6IDEwMDAgfSldO1xuICAgICAgY2FzZSBcImJpZ0ludGVnZXJcIjpcbiAgICAgICAgcmV0dXJuIGZha2VyLm51bWJlci5iaWdJbnQoeyBtaW46IDFuLCBtYXg6IDEwMDBuIH0pO1xuICAgICAgY2FzZSBcImJpZ0ludGVnZXJbXVwiOlxuICAgICAgICByZXR1cm4gW2Zha2VyLm51bWJlci5iaWdJbnQoeyBtaW46IDFuLCBtYXg6IDEwMDBuIH0pXTtcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICAgIHJldHVybiBmYWtlci5udW1iZXIuZmxvYXQoeyBtaW46IDAsIG1heDogMTAwMCB9KTtcbiAgICAgIGNhc2UgXCJudW1iZXJbXVwiOlxuICAgICAgY2FzZSBcIm51bWVyaWNbXVwiOlxuICAgICAgICByZXR1cm4gW2Zha2VyLm51bWJlci5mbG9hdCh7IG1pbjogMCwgbWF4OiAxMDAwIH0pXTtcbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiBmYWtlci5kYXRhdHlwZS5ib29sZWFuKCk7XG4gICAgICBjYXNlIFwiYm9vbGVhbltdXCI6XG4gICAgICAgIHJldHVybiBbZmFrZXIuZGF0YXR5cGUuYm9vbGVhbigpXTtcbiAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICBjYXNlIFwiZGF0ZVtdXCI6XG4gICAgICAgIHJldHVybiBmYWtlci5kYXRlLnBhc3QoKTtcbiAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIGNhc2UgXCJ1dWlkXCI6XG4gICAgICBjYXNlIFwidXVpZFtdXCI6XG4gICAgICAgIHJldHVybiBmYWtlci5zdHJpbmcudXVpZCgpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOuwsOyXtCDtg4DsnoXsnZgg6rCS7J2EIOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICog7YOA7J6FIElE7JmAIO2VhOuTnOuqhSDtjKjthLTsnYQg67aE7ISd7ZWY7JesIOyggeygiO2VnCDrsLDsl7Qg642w7J207YSw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICog7JiIOiBpbWFnZV91cmxzIOKGkiBbe3VybCwgbmFtZSwgbWltZV90eXBlfSwgLi4uXVxuICAgKiAgICAgdGFnX2lkcyDihpIgWzEsIDIzLCA0NV1cbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVBcnJheVZhbHVlKFxuICAgIHByb3A6IEVudGl0eVByb3AsXG4gICAgX2VudGl0eTogRW50aXR5IHwgdW5kZWZpbmVkLFxuICAgIGZha2VyOiB0eXBlb2YgaW1wb3J0KFwiQGZha2VyLWpzL2Zha2VyXCIpLmZha2VyLFxuICAgIF9sb2NhbGVGYWtlcjogdHlwZW9mIGltcG9ydChcIkBmYWtlci1qcy9mYWtlclwiKS5mYWtlcixcbiAgKTogRGF0YUV4cGxvcmVyVmFsdWVbXSB7XG4gICAgY29uc3QgY291bnQgPSBmYWtlci5udW1iZXIuaW50KHsgbWluOiAxLCBtYXg6IDMgfSk7XG5cbiAgICAvKiogU29uYW11RmlsZVtd7J2AIFNvbmFtdSDrgrTsnqUg7YOA7J6F7Jy866GcIOq1rOyhsOqwgCDsoJXtlbTsoLgg7J6I7Iq164uI64ukICovXG4gICAgaWYgKFwiaWRcIiBpbiBwcm9wICYmIHByb3AuaWQgPT09IFwiU29uYW11RmlsZVtdXCIpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoKSA9PiAoe1xuICAgICAgICB1cmw6IGZha2VyLmltYWdlLnVybCgpLFxuICAgICAgICBuYW1lOiBmYWtlci5zeXN0ZW0uZmlsZU5hbWUoKSxcbiAgICAgICAgbWltZV90eXBlOiBmYWtlci5oZWxwZXJzLmFycmF5RWxlbWVudChbXG4gICAgICAgICAgXCJpbWFnZS9qcGVnXCIsXG4gICAgICAgICAgXCJpbWFnZS9wbmdcIixcbiAgICAgICAgICBcImltYWdlL2dpZlwiLFxuICAgICAgICAgIFwiYXBwbGljYXRpb24vcGRmXCIsXG4gICAgICAgIF0pLFxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8qKiDtlYTrk5zrqoXsl5DshJwg67Cw7Je07J2YIOyaqeuPhOulvCDstpTroaDtlanri4jri6QgKi9cbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHByb3AubmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL18vZywgXCJcIik7XG5cbiAgICBpZiAobm9ybWFsaXplZE5hbWUuaW5jbHVkZXMoXCJ1cmxcIikgfHwgbm9ybWFsaXplZE5hbWUuaW5jbHVkZXMoXCJpbWFnZVwiKSkge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sICgpID0+IGZha2VyLmludGVybmV0LnVybCgpKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZE5hbWUuaW5jbHVkZXMoXCJpZFwiKSAmJiBub3JtYWxpemVkTmFtZS5lbmRzV2l0aChcInNcIikpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoKSA9PiBmYWtlci5udW1iZXIuaW50KHsgbWluOiAxLCBtYXg6IDEwMCB9KSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKFwidGFnXCIpIHx8IG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKFwibmFtZVwiKSkge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sICgpID0+IGZha2VyLmxvcmVtLndvcmQoKSk7XG4gICAgfVxuXG4gICAgLyoqIO2MqO2EtCDrp6Tsua3rkJjsp4Ag7JWK7Jy866m0IOu5iCDrsLDsl7TsnYQg67CY7ZmY7ZWp64uI64ukICovXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04g66ek7ZWR7J2YIEZha2VyIO2RnO2YhOyLneydhCDtjIzsi7HtlZjsl6wg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgKlxuICAgKiDtkZztmITsi50g7JiI7IucOlxuICAgKiAtIFwiZmFrZXIuaW50ZXJuZXQuZW1haWwoKVwiIOKGkiDsnbjsnpAg7JeG7J2MXG4gICAqIC0gXCJmYWtlci5udW1iZXIuaW50KHsgbWluOiAxLCBtYXg6IDEwMCB9KVwiIOKGkiBKU09OIOyduOyekFxuICAgKiAtIFwie31cIiDihpIg66as7YSw65+0IOqwkiAoSlNPTi5wYXJzZSlcbiAgICpcbiAgICogZmFrZXJLTywgZmFrZXJKQeuPhCDsp4Dsm5DtlZjsl6wg64uk6rWt7Ja0IOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVGYWtlckV4cHJlc3Npb24oXG4gICAgZXhwcmVzc2lvbjogc3RyaW5nLFxuICAgIHByb3A6IEVudGl0eVByb3AsXG4gICk6IFByb21pc2U8RGF0YUV4cGxvcmVyVmFsdWU+IHtcbiAgICBjb25zdCBmYWtlck1vZHVsZSA9IGF3YWl0IGltcG9ydChcIkBmYWtlci1qcy9mYWtlclwiKTtcbiAgICBjb25zdCBmYWtlciA9IGZha2VyTW9kdWxlLmZha2VyO1xuICAgIGNvbnN0IGZha2VyS08gPSBmYWtlck1vZHVsZS5mYWtlcktPO1xuICAgIGNvbnN0IGZha2VySkEgPSBmYWtlck1vZHVsZS5mYWtlckpBO1xuXG4gICAgLyoqIEZha2VyIO2RnO2YhOyLneydtCDslYTri4wg66as7YSw65+0IOqwkuydgCBKU09O7Jy866GcIO2MjOyLse2VqeuLiOuLpCAqL1xuICAgIGlmICghZXhwcmVzc2lvbi5zdGFydHNXaXRoKFwiZmFrZXJcIikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkYXRhRXhwbG9yZXJWYWx1ZVNjaGVtYS5wYXJzZShKU09OLnBhcnNlKGV4cHJlc3Npb24pKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiog7ZGc7ZiE7Iud7JeQ7IScIEZha2VyIOqwneyytOyZgCDqsr3roZzrpbwg7LaU7Lac7ZWp64uI64ukICovXG4gICAgY29uc3QgbWF0Y2ggPSBleHByZXNzaW9uLm1hdGNoKC9eKGZha2VyfGZha2VyS098ZmFrZXJKQSlcXC4oLio/KSQvKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZmFrZXIgZXhwcmVzc2lvbjogJHtleHByZXNzaW9ufWApO1xuICAgIH1cblxuICAgIGNvbnN0IFssIGZha2VyTmFtZSwgZXhwcl0gPSBtYXRjaDtcbiAgICBjb25zdCBzZWxlY3RlZEZha2VyID1cbiAgICAgIGZha2VyTmFtZSA9PT0gXCJmYWtlcktPXCIgPyBmYWtlcktPIDogZmFrZXJOYW1lID09PSBcImZha2VySkFcIiA/IGZha2VySkEgOiBmYWtlcjtcblxuICAgIGNvbnN0IGZ1bmNNYXRjaCA9IGV4cHIubWF0Y2goL14oW1xcdy5dKykoPzpcXCgoLio/KVxcKSk/JC8pO1xuICAgIGlmICghZnVuY01hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZmFrZXIgZXhwcmVzc2lvbiBmb3IgJHtwcm9wLm5hbWV9OiAke2V4cHJlc3Npb259YCk7XG4gICAgfVxuXG4gICAgY29uc3QgWywgcGF0aCwgYXJnc1N0cl0gPSBmdW5jTWF0Y2g7XG4gICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcblxuICAgIC8qKiDsoJAg7ZGc6riw67KVKGRvdCBub3RhdGlvbinsnLzroZwgRmFrZXIg7ZWo7IiY66W8IOywvuyVhOqwkeuLiOuLpCAqL1xuICAgIGxldCBtZW1iZXIgPSBkeW5hbWljTmFtZXNwYWNlU2NoZW1hLnBhcnNlKHNlbGVjdGVkRmFrZXIpO1xuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgaWYgKCEocGFydCBpbiBtZW1iZXIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBmYWtlciBwYXRoIGZvciAke3Byb3AubmFtZX06ICR7ZmFrZXJOYW1lfS4ke3BhdGh9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBuZXh0TWVtYmVyID0gbWVtYmVyW3BhcnRdO1xuICAgICAgaWYgKHBhcnQgIT09IHBhcnRzLmF0KC0xKSkge1xuICAgICAgICBtZW1iZXIgPSBkeW5hbWljTmFtZXNwYWNlU2NoZW1hLnBhcnNlKG5leHRNZW1iZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZuID0gZmFrZXJGdW5jdGlvblNjaGVtYS5wYXJzZShtZW1iZXJbcGFydHMuYXQoLTEpID8/IFwiXCJdKTtcblxuICAgIGxldCBhcmdzOiBEYXRhRXhwbG9yZXJWYWx1ZVtdID0gW107XG4gICAgaWYgKGFyZ3NTdHI/LnRyaW0oKSkge1xuICAgICAgYXJncyA9IHRoaXMucGFyc2VHZW5lcmF0b3JBcmdzKGFyZ3NTdHIsIHByb3AubmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGFFeHBsb3JlclZhbHVlU2NoZW1hLnBhcnNlKGZuKC4uLmFyZ3MpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBmaXh0dXJlSGludOulvCBMTE3sl5Dqsowg7KCE64us7ZWY7JesIO2YhOyLpOyggeyduCDthYzsiqTtirgg642w7J207YSw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICogZmFrZXIuanProZzripQg7IOd7ISx7ZWY6riwIOyWtOugpOyatCDrs7XsnqHtlZwg7YWN7Iqk7Yq4KOyekOq4sOyGjOqwnCwg7ISk66qF66y4IOuTsSnrpbxcbiAgICogTExN7J2EIO2ZnOyaqe2VmOyXrCDsg53shLHtlanri4jri6QuIOuPmeydvO2VnCBoaW507JeQIOuMgO2VnCDspJHrs7Ug7Zi47Lac7J2EIOuwqeyngO2VmOq4sCDsnITtlbRcbiAgICog7LqQ7Iux7J2EIOq4sOuzuOycvOuhnCDsp4Dsm5Dtlanri4jri6QgKExMTSBBUEkg67mE7JqpIOygiOqwkCkuXG4gICAqXG4gICAqIGFpIO2MqO2CpOyngOuKlCBkeW5hbWljIGltcG9ydOuhnCDrtojrn6zsmKTrr4DroZwsIHVzZUxMTeydtCBmYWxzZeyduCDqsr3smrBcbiAgICog7J2Y7KG07ISx7J20IOyEpOy5mOuQmOyngCDslYrslYTrj4QgZml4dHVyZSDsg53shLHsnbQg7KCV7IOBIOuPmeyeke2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVXaXRoTExNKFxuICAgIGZpeHR1cmVIaW50OiBzdHJpbmcsXG4gICAgcHJvcDogRW50aXR5UHJvcCxcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICByb3dLZXk/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8RGF0YUV4cGxvcmVyVmFsdWU+IHtcbiAgICAvLyByb3dLZXnqsIAg7J6I7Jy866m0IHJvdyDri6jsnIQg7IOd7ISxIOyghOuetSDsgqzsmqlcbiAgICBpZiAocm93S2V5KSB7XG4gICAgICBjb25zdCByb3dDYWNoZUtleSA9IGAke3Jvd0tleX06JHtwcm9wLm5hbWV9YDtcblxuICAgICAgLy8g7J2066+4IOydtCByb3fsl5Ag64yA7ZWcIExMTSDtmLjstpzsnbQg7JmE66OM65CcIOqyveyasCDsupDsi5zsl5DshJwg67CU66GcIOuwmO2ZmFxuICAgICAgaWYgKHRoaXMubGxtQ2FjaGUuaGFzKHJvd0NhY2hlS2V5KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5sbG1DYWNoZS5nZXQocm93Q2FjaGVLZXkpO1xuICAgICAgfVxuXG4gICAgICAvLyDsg4ggcm93OiBMTE0g64yA7IOBIHByb3Ag7KCE7LK066W8IO2VnCDrsojsl5Ag7IOd7ISxXG4gICAgICBjb25zdCBsbG1Qcm9wcyA9IGVudGl0eS5wcm9wcy5maWx0ZXIoKHApID0+IHtcbiAgICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHApKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChwLmNvbmU/LmZpeHR1cmVHZW5lcmF0b3IpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHAubmFtZSA9PT0gXCJpZFwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiAhIXAuY29uZT8ubm90ZTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBsbG1Qcm9wc+qwgCDruYTslrTsnojsnLzrqbQg64uo7J28IO2VhOuTnCDrsKnsi53snLzroZwgZmFsbGJhY2tcbiAgICAgIGlmIChsbG1Qcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgW0ZpeHR1cmVHZW5lcmF0b3JdIGxsbVByb3BzIGlzIGVtcHR5IGZvciAke2VudGl0eS5pZH0uJHtwcm9wLm5hbWV9LCB1c2luZyBzaW5nbGUgZmllbGQgZmFsbGJhY2tgLFxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlU2luZ2xlV2l0aExMTShmaXh0dXJlSGludCwgcHJvcCwgZW50aXR5KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXBpS2V5ID0gdGhpcy5nZXRBcGlLZXkoKTtcbiAgICAgIGNvbnN0IHsgY3JlYXRlQW50aHJvcGljIH0gPSBhd2FpdCBpbXBvcnQoXCJAYWktc2RrL2FudGhyb3BpY1wiKTtcbiAgICAgIGNvbnN0IGdlbmVyYXRlVGV4dCA9IGF3YWl0IHRoaXMuZ2V0VGV4dEdlbmVyYXRvcigpO1xuXG4gICAgICBjb25zdCByb3dSZXNwb25zZSA9IGF3YWl0IGdlbmVyYXRlVGV4dCh7XG4gICAgICAgIG1vZGVsOiBjcmVhdGVBbnRocm9waWMoeyBhcGlLZXkgfSkodGhpcy5vcHRpb25zLmxsbU1vZGVsIHx8IFwiY2xhdWRlLXNvbm5ldC00LTZcIiksXG4gICAgICAgIHByb21wdDogdGhpcy5idWlsZFJvd0xMTVByb21wdChsbG1Qcm9wcywgZW50aXR5KSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgcm93UmVzcG9uc2VUZXh0ID0gei5zdHJpbmcoKS5zYWZlUGFyc2Uocm93UmVzcG9uc2U/LnRleHQpO1xuICAgICAgaWYgKCFyb3dSZXNwb25zZVRleHQuc3VjY2Vzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIExMTSByZXNwb25zZVwiKTtcbiAgICAgIH1cblxuICAgICAgLy8g7J2R64u17J2EIO2MjOyLse2VmOyXrCDqsIEg7ZWE65Oc7JeQIOuMgO2VnCDqsrDqs7zrpbwg7LqQ7Iuc7JeQIOyggOyepVxuICAgICAgY29uc3Qgcm93UmVzdWx0ID0gdGhpcy5wYXJzZVJvd0xMTVJlc3BvbnNlKHJvd1Jlc3BvbnNlVGV4dC5kYXRhLCBsbG1Qcm9wcyk7XG4gICAgICBmb3IgKGNvbnN0IFtmaWVsZE5hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyb3dSZXN1bHQpKSB7XG4gICAgICAgIHRoaXMubGxtQ2FjaGUuc2V0KGAke3Jvd0tleX06JHtmaWVsZE5hbWV9YCwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICAvLyDsmpTssq3tlZwg7ZWE65Oc7J2YIOqwkiDrsJjtmZggKOyXhuycvOuptCDri6jsnbwg7ZWE65OcIGZhbGxiYWNrKVxuICAgICAgaWYgKHRoaXMubGxtQ2FjaGUuaGFzKHJvd0NhY2hlS2V5KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5sbG1DYWNoZS5nZXQocm93Q2FjaGVLZXkpO1xuICAgICAgfVxuXG4gICAgICAvLyDrp4zslb0gcm93IOydkeuLteyXkCDsnbQg7ZWE65Oc6rCAIOuIhOudveuQnCDqsr3smrAg64uo7J28IO2VhOuTnCBmYWxsYmFja1xuICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVTaW5nbGVXaXRoTExNKGZpeHR1cmVIaW50LCBwcm9wLCBlbnRpdHkpO1xuICAgIH1cblxuICAgIC8vIHJvd0tleeqwgCDsl4bsnLzrqbQg6riw7KG0IOuLqOydvCDtlYTrk5wg67Cp7IudXG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVTaW5nbGVXaXRoTExNKGZpeHR1cmVIaW50LCBwcm9wLCBlbnRpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIOuLqOydvCDtlYTrk5zrpbwgTExN7Jy866GcIOyDneyEse2VqeuLiOuLpCAocm93S2V5IOyXhuydhCDrlYwgZmFsbGJhY2vsmqkpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlU2luZ2xlV2l0aExMTShcbiAgICBmaXh0dXJlSGludDogc3RyaW5nLFxuICAgIHByb3A6IEVudGl0eVByb3AsXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICk6IFByb21pc2U8RGF0YUV4cGxvcmVyVmFsdWU+IHtcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke2VudGl0eS5pZH06JHtwcm9wLm5hbWV9OiR7Zml4dHVyZUhpbnR9YDtcbiAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZUxMTUNhY2hlICYmIHRoaXMubGxtQ2FjaGUuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubGxtQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICB9XG5cbiAgICBjb25zdCBhcGlLZXkgPSB0aGlzLmdldEFwaUtleSgpO1xuICAgIGNvbnN0IHsgY3JlYXRlQW50aHJvcGljIH0gPSBhd2FpdCBpbXBvcnQoXCJAYWktc2RrL2FudGhyb3BpY1wiKTtcbiAgICBjb25zdCBnZW5lcmF0ZVRleHQgPSBhd2FpdCB0aGlzLmdldFRleHRHZW5lcmF0b3IoKTtcblxuICAgIGNvbnN0IHNpbmdsZVJlc3BvbnNlID0gYXdhaXQgZ2VuZXJhdGVUZXh0KHtcbiAgICAgIG1vZGVsOiBjcmVhdGVBbnRocm9waWMoeyBhcGlLZXkgfSkodGhpcy5vcHRpb25zLmxsbU1vZGVsIHx8IFwiY2xhdWRlLXNvbm5ldC00LTZcIiksXG4gICAgICBwcm9tcHQ6IHRoaXMuYnVpbGRMTE1Qcm9tcHQoZml4dHVyZUhpbnQsIHByb3AsIGVudGl0eSksXG4gICAgfSk7XG4gICAgY29uc3Qgc2luZ2xlUmVzcG9uc2VUZXh0ID0gei5zdHJpbmcoKS5zYWZlUGFyc2Uoc2luZ2xlUmVzcG9uc2U/LnRleHQpO1xuICAgIGlmICghc2luZ2xlUmVzcG9uc2VUZXh0LnN1Y2Nlc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgTExNIHJlc3BvbnNlXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5wYXJzZUxMTVJlc3BvbnNlKHNpbmdsZVJlc3BvbnNlVGV4dC5kYXRhLCBwcm9wLnR5cGUpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlTExNQ2FjaGUpIHtcbiAgICAgIHRoaXMubGxtQ2FjaGUuc2V0KGNhY2hlS2V5LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRUZXh0R2VuZXJhdG9yKCk6IFByb21pc2U8Rml4dHVyZVRleHRHZW5lcmF0b3I+IHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmdlbmVyYXRlVGV4dCkge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5nZW5lcmF0ZVRleHQ7XG4gICAgfVxuICAgIGNvbnN0IGFpID0gYXdhaXQgaW1wb3J0KFwiYWlcIik7XG4gICAgcmV0dXJuIGFzeW5jIChyZXF1ZXN0KSA9PiBhaS5nZW5lcmF0ZVRleHQocmVxdWVzdCk7XG4gIH1cblxuICAvKipcbiAgICogcm93IOyghOyytOulvCDtlZwg67KI7JeQIOyDneyEse2VmOuKlCBMTE0g7ZSE66Gs7ZSE7Yq466W8IOunjOuTreuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRSb3dMTE1Qcm9tcHQocHJvcHM6IEVudGl0eVByb3BbXSwgZW50aXR5OiBFbnRpdHkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMub3B0aW9ucy5sb2NhbGUgfHwgXCJrb1wiO1xuICAgIGNvbnN0IGxhbmd1YWdlID0gbG9jYWxlID09PSBcImtvXCIgPyBcIktvcmVhblwiIDogbG9jYWxlID09PSBcImphXCIgPyBcIkphcGFuZXNlXCIgOiBcIkVuZ2xpc2hcIjtcblxuICAgIGNvbnN0IGZpZWxkRGVzY3JpcHRpb25zID0gcHJvcHNcbiAgICAgIC5tYXAoKHApID0+IHtcbiAgICAgICAgbGV0IGRlc2MgPSBgLSAke3AubmFtZX0gKCR7cC50eXBlfSk6ICR7cC5jb25lPy5ub3RlID8/IFwiXCJ9YDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChwLnR5cGUgPT09IFwiZW51bVwiIHx8IHAudHlwZSA9PT0gXCJlbnVtW11cIikgJiZcbiAgICAgICAgICBcImlkXCIgaW4gcCAmJlxuICAgICAgICAgIHAuaWQgJiZcbiAgICAgICAgICBlbnRpdHkuZW51bUxhYmVscz8uW3AuaWRdXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzW3AuaWRdKS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgZGVzYyArPSBgIFthbGxvd2VkIHZhbHVlczogJHt2YWx1ZXN9XWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2M7XG4gICAgICB9KVxuICAgICAgLmpvaW4oXCJcXG5cIik7XG5cbiAgICAvLyBMTE0g64yA7IOB7J20IOyVhOuLjCBwcm9w65Ok64+EIOunpeudveycvOuhnCDsoJzqs7UgKHJlbGF0aW9uIOygnOyZuClcbiAgICBjb25zdCBvdGhlclByb3BzID0gZW50aXR5LnByb3BzXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAocCkgPT5cbiAgICAgICAgICAhcHJvcHMuaW5jbHVkZXMocCkgJiZcbiAgICAgICAgICAhaXNSZWxhdGlvblByb3AocCkgJiZcbiAgICAgICAgICBwLm5hbWUgIT09IFwiaWRcIiAmJlxuICAgICAgICAgICEoXCJ2aXJ0dWFsXCIgaW4gcCAmJiBwLnZpcnR1YWwpLFxuICAgICAgKVxuICAgICAgLm1hcCgocCkgPT4ge1xuICAgICAgICBsZXQgZGVzYyA9IGAtICR7cC5uYW1lfSAoJHtwLnR5cGV9KWA7XG4gICAgICAgIGlmIChwLmNvbmU/Lm5vdGUpIGRlc2MgKz0gYDogJHtwLmNvbmUubm90ZX1gO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHAudHlwZSA9PT0gXCJlbnVtXCIgfHwgcC50eXBlID09PSBcImVudW1bXVwiKSAmJlxuICAgICAgICAgIFwiaWRcIiBpbiBwICYmXG4gICAgICAgICAgcC5pZCAmJlxuICAgICAgICAgIGVudGl0eS5lbnVtTGFiZWxzPy5bcC5pZF1cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LmtleXMoZW50aXR5LmVudW1MYWJlbHNbcC5pZF0pLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICBkZXNjICs9IGAgW2FsbG93ZWQgdmFsdWVzOiAke3ZhbHVlc31dYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVzYztcbiAgICAgIH0pXG4gICAgICAuam9pbihcIlxcblwiKTtcbiAgICBjb25zdCBvdGhlclByb3BzQ29udGV4dCA9IG90aGVyUHJvcHNcbiAgICAgID8gYFxcblxcbk90aGVyIGZpZWxkcyBpbiB0aGlzIGVudGl0eSAoZm9yIGNvbnRleHQsIGRvIE5PVCBnZW5lcmF0ZSB0aGVzZSk6XFxuJHtvdGhlclByb3BzfWBcbiAgICAgIDogXCJcIjtcblxuICAgIGNvbnN0IHJlc3VsdFRlbXBsYXRlID0gcHJvcHMubWFwKChwKSA9PiBgICBcIiR7cC5uYW1lfVwiOiA8JHtwLnR5cGV9PmApLmpvaW4oXCIsXFxuXCIpO1xuXG4gICAgY29uc3QgZW50aXR5Q29udGV4dCA9IGVudGl0eS5jb25lPy5ub3RlID8gYFxcbkVudGl0eSBkZXNjcmlwdGlvbjogJHtlbnRpdHkuY29uZS5ub3RlfWAgOiBcIlwiO1xuXG4gICAgcmV0dXJuIGBHZW5lcmF0ZSB0ZXN0IGZpeHR1cmUgZGF0YSBmb3IgdGhlICR7ZW50aXR5LmlkfSBlbnRpdHkuIEFsbCBmaWVsZHMgbXVzdCBiZSBjb2hlcmVudCBhbmQgY29uc2lzdGVudCB3aXRoIGVhY2ggb3RoZXIuXG5cbkVudGl0eTogJHtlbnRpdHkuaWR9JHtlbnRpdHlDb250ZXh0fVxuTG9jYWxlOiAke2xvY2FsZX0gKHVzZSAke2xhbmd1YWdlfSBmb3IgdGV4dCBmaWVsZHMpXG5cbkZpZWxkcyB0byBnZW5lcmF0ZTpcbiR7ZmllbGREZXNjcmlwdGlvbnN9JHtvdGhlclByb3BzQ29udGV4dH1cblxuUnVsZXM6XG4tIEFsbCBmaWVsZHMgaW4gYSBzaW5nbGUgcm93IG11c3QgYmUgbG9naWNhbGx5IGNvbnNpc3RlbnQgKGUuZy4gbmFtZS9uYW1lX2VuL25hbWVfY24gc2hvdWxkIHJlcHJlc2VudCB0aGUgc2FtZSBwZXJzb24pXG4tIFJldHVybiBPTkxZIHZhbGlkIEpTT04sIG5vIG1hcmtkb3duIG9yIGV4cGxhbmF0aW9uXG4tIERhdGVzIGluIElTTyA4NjAxIGZvcm1hdFxuLSBVc2UgJHtsYW5ndWFnZX0gZm9yIHRleHQgdW5sZXNzIGZpZWxkIGRlc2NyaXB0aW9uIHNheXMgb3RoZXJ3aXNlXG5cblJldHVybiBleGFjdGx5IHRoaXMgSlNPTiBzaGFwZTpcbntcbiR7cmVzdWx0VGVtcGxhdGV9XG59YDtcbiAgfVxuXG4gIC8qKlxuICAgKiByb3cgTExNIOydkeuLteydhCDtjIzsi7HtlZjsl6wg7ZWE65Oc67OEIOqwkuycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIHBhcnNlUm93TExNUmVzcG9uc2UodGV4dDogc3RyaW5nLCBwcm9wczogRW50aXR5UHJvcFtdKTogRGF0YUV4cGxvcmVyUmVjb3JkIHtcbiAgICBjb25zdCBqc29uVGV4dCA9IHRleHRcbiAgICAgIC50cmltKClcbiAgICAgIC5yZXBsYWNlKC9eYGBganNvblxccyovaSwgXCJcIilcbiAgICAgIC5yZXBsYWNlKC9gYGBcXHMqJC8sIFwiXCIpXG4gICAgICAudHJpbSgpO1xuXG4gICAgbGV0IHBhcnNlZDogRGF0YUV4cGxvcmVyUmVjb3JkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWRSZWNvcmQgPSBkYXRhRXhwbG9yZXJSZWNvcmRTY2hlbWEuc2FmZVBhcnNlKEpTT04ucGFyc2UoanNvblRleHQpKTtcbiAgICAgIGlmICghcGFyc2VkUmVjb3JkLnN1Y2Nlc3MpIHtcbiAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgY29uc29sZS53YXJuKFwiW0ZpeHR1cmVHZW5lcmF0b3JdIFJvdyBMTE0gcmVzcG9uc2UgaXMgbm90IGEgcGxhaW4gb2JqZWN0OlwiLCB0ZXh0KTtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgICAgcGFyc2VkID0gcGFyc2VkUmVjb3JkLmRhdGE7XG4gICAgfSBjYXRjaCB7XG4gICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS53YXJuKFwiW0ZpeHR1cmVHZW5lcmF0b3JdIEZhaWxlZCB0byBwYXJzZSByb3cgTExNIHJlc3BvbnNlOlwiLCB0ZXh0KTtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQ6IERhdGFFeHBsb3JlclJlY29yZCA9IHt9O1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wcykge1xuICAgICAgaWYgKHByb3AubmFtZSBpbiBwYXJzZWQpIHtcbiAgICAgICAgcmVzdWx0W3Byb3AubmFtZV0gPSB0aGlzLnBhcnNlTExNUmVzcG9uc2UoU3RyaW5nKHBhcnNlZFtwcm9wLm5hbWVdID8/IFwiXCIpLCBwcm9wLnR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZExMTVByb21wdChoaW50OiBzdHJpbmcsIHByb3A6IEVudGl0eVByb3AsIGVudGl0eTogRW50aXR5KTogc3RyaW5nIHtcbiAgICBjb25zdCBsb2NhbGUgPSB0aGlzLm9wdGlvbnMubG9jYWxlIHx8IFwia29cIjtcbiAgICBjb25zdCBsYW5ndWFnZSA9IGxvY2FsZSA9PT0gXCJrb1wiID8gXCJLb3JlYW5cIiA6IGxvY2FsZSA9PT0gXCJqYVwiID8gXCJKYXBhbmVzZVwiIDogXCJFbmdsaXNoXCI7XG5cbiAgICBjb25zdCBlbnRpdHlDb250ZXh0ID0gZW50aXR5LmNvbmU/Lm5vdGUgPyBgXFxuRW50aXR5IGNvbnRleHQ6ICR7ZW50aXR5LmNvbmUubm90ZX1gIDogXCJcIjtcblxuICAgIGNvbnN0IG90aGVyRmllbGRzID0gZW50aXR5LnByb3BzXG4gICAgICAuZmlsdGVyKChwKSA9PiBwLm5hbWUgIT09IHByb3AubmFtZSAmJiAhaXNSZWxhdGlvblByb3AocCkgJiYgcC5jb25lPy5ub3RlKVxuICAgICAgLm1hcCgocCkgPT4gYC0gJHtwLm5hbWV9ICgke3AudHlwZX0pOiAke3AuY29uZT8ubm90ZX1gKVxuICAgICAgLmpvaW4oXCJcXG5cIik7XG4gICAgY29uc3Qgb3RoZXJGaWVsZHNDb250ZXh0ID0gb3RoZXJGaWVsZHNcbiAgICAgID8gYFxcblxcbk90aGVyIGZpZWxkcyBpbiB0aGlzIGVudGl0eSAoZm9yIGNvbnRleHQpOlxcbiR7b3RoZXJGaWVsZHN9YFxuICAgICAgOiBcIlwiO1xuXG4gICAgbGV0IHByb21wdCA9IGBHZW5lcmF0ZSB0ZXN0IGRhdGEgZm9yICR7ZW50aXR5LmlkfS4ke3Byb3AubmFtZX0gKHR5cGU6ICR7cHJvcC50eXBlfSkke2VudGl0eUNvbnRleHR9JHtvdGhlckZpZWxkc0NvbnRleHR9XG5cblJlcXVpcmVtZW50OiAke2hpbnR9XG5cblJ1bGVzOlxuLSBSZXR1cm4gT05MWSB0aGUgdmFsdWUsIG5vIGV4cGxhbmF0aW9uIG9yIG1hcmtkb3duXG4tIFVzZSAke2xhbmd1YWdlfSBsYW5ndWFnZSBpZiBhcHBsaWNhYmxlXG4tIEZvcm1hdDogJHt0aGlzLmdldEV4cGVjdGVkRm9ybWF0KHByb3AudHlwZSl9YDtcblxuICAgIC8vIGVudW0g7YOA7J6F7J24IOqyveyasCDqsIDriqXtlZwg6rCSIOuqqeuhnSDstpTqsIBcbiAgICBpZiAocHJvcC50eXBlID09PSBcImVudW1cIiB8fCBwcm9wLnR5cGUgPT09IFwiZW51bVtdXCIpIHtcbiAgICAgIGxldCBlbnVtVmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBpZiAoXCJlbnVtXCIgaW4gcHJvcCAmJiBBcnJheS5pc0FycmF5KHByb3AuZW51bSkgJiYgcHJvcC5lbnVtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZW51bVZhbHVlcyA9IHByb3AuZW51bTtcbiAgICAgIH0gZWxzZSBpZiAoXCJpZFwiIGluIHByb3AgJiYgcHJvcC5pZCAmJiBlbnRpdHk/LmVudW1MYWJlbHM/Lltwcm9wLmlkXSkge1xuICAgICAgICBlbnVtVmFsdWVzID0gT2JqZWN0LmtleXMoZW50aXR5LmVudW1MYWJlbHNbcHJvcC5pZF0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW51bVZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHByb21wdCArPSBgXFxuLSBJTVBPUlRBTlQ6IENob29zZSBPTkxZIGZyb20gdGhlc2UgYWxsb3dlZCB2YWx1ZXM6ICR7ZW51bVZhbHVlcy5qb2luKFwiLCBcIil9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcm9tcHQgKz0gYFxcblxcbkV4YW1wbGU6ICR7dGhpcy5nZXRFeGFtcGxlRm9yVHlwZShwcm9wLnR5cGUsIGxvY2FsZSl9YDtcblxuICAgIHJldHVybiBwcm9tcHQ7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlTExNUmVzcG9uc2UodGV4dDogc3RyaW5nLCBwcm9wVHlwZTogc3RyaW5nKTogRGF0YUV4cGxvcmVyVmFsdWUge1xuICAgIGNvbnN0IGNsZWFuZWQgPSB0ZXh0LnRyaW0oKTtcblxuICAgIC8vIOuwsOyXtCDtg4DsnoUg7LKY66asXG4gICAgaWYgKHByb3BUeXBlLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGRhdGFFeHBsb3JlclZhbHVlU2NoZW1hLnBhcnNlKEpTT04ucGFyc2UoY2xlYW5lZCkpO1xuICAgICAgICBjb25zdCBiYXNlVHlwZSA9IHByb3BUeXBlLnNsaWNlKDAsIC0yKTsgLy8gXCJpbnRlZ2VyW11cIiAtPiBcImludGVnZXJcIlxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcnNlZCkpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VkLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgLy8gbnVsbC91bmRlZmluZWTripQg7YOA7J6F67OEIOq4sOuzuOqwkuycvOuhnFxuICAgICAgICAgICAgaWYgKGl0ZW0gPT09IG51bGwgfHwgaXRlbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRWYWx1ZUZvclR5cGUoYmFzZVR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g6rCd7LK064qUIEpTT04uc3RyaW5naWZ5IO2bhCDtjIzsi7EgKGpzb24g7YOA7J6F7J24IOqyveyasClcbiAgICAgICAgICAgIGlmIChkYXRhRXhwbG9yZXJSZWNvcmRTY2hlbWEuc2FmZVBhcnNlKGl0ZW0pLnN1Y2Nlc3MgfHwgQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgICAgICAgICByZXR1cm4gYmFzZVR5cGUgPT09IFwianNvblwiXG4gICAgICAgICAgICAgICAgPyBpdGVtXG4gICAgICAgICAgICAgICAgOiB0aGlzLnBhcnNlU2NhbGFyVmFsdWUoSlNPTi5zdHJpbmdpZnkoaXRlbSksIGJhc2VUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHByaW1pdGl2ZSDqsJLsnYAg66y47J6Q7Je066GcIOuzgO2ZmCDtm4Qg7YyM7IuxXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVNjYWxhclZhbHVlKFN0cmluZyhpdGVtKSwgYmFzZVR5cGUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g64uo7J28IOqwkuydtCDsmKgg6rK97JqwIOuwsOyXtOuhnCDqsJDsi7jquLBcbiAgICAgICAgaWYgKHBhcnNlZCA9PT0gbnVsbCB8fCBwYXJzZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBbdGhpcy5nZXREZWZhdWx0VmFsdWVGb3JUeXBlKGJhc2VUeXBlKV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt0aGlzLnBhcnNlU2NhbGFyVmFsdWUoU3RyaW5nKHBhcnNlZCksIGJhc2VUeXBlKV07XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBhcnNlU2NhbGFyVmFsdWUoY2xlYW5lZCwgcHJvcFR5cGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWZhdWx0VmFsdWVGb3JUeXBlKHByb3BUeXBlOiBzdHJpbmcpOiBEYXRhRXhwbG9yZXJWYWx1ZSB7XG4gICAgc3dpdGNoIChwcm9wVHlwZSkge1xuICAgICAgY2FzZSBcImludGVnZXJcIjpcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICBjYXNlIFwiYmlnSW50ZWdlclwiOlxuICAgICAgICByZXR1cm4gMG47XG4gICAgICBjYXNlIFwiZmxvYXRcIjpcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCk7XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICByZXR1cm4ge307XG4gICAgICBjYXNlIFwidXVpZFwiOlxuICAgICAgICByZXR1cm4gXCIwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIjtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VTY2FsYXJWYWx1ZSh0ZXh0OiBzdHJpbmcsIHByb3BUeXBlOiBzdHJpbmcpOiBEYXRhRXhwbG9yZXJWYWx1ZSB7XG4gICAgY29uc3QgY2xlYW5lZCA9IHRleHQudHJpbSgpO1xuXG4gICAgc3dpdGNoIChwcm9wVHlwZSkge1xuICAgICAgY2FzZSBcImludGVnZXJcIjoge1xuICAgICAgICBjb25zdCBudW0gPSBwYXJzZUludChjbGVhbmVkLCAxMCk7XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4obnVtKSA/IDAgOiBudW07XG4gICAgICB9XG4gICAgICBjYXNlIFwiYmlnSW50ZWdlclwiOiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEJpZ0ludChjbGVhbmVkKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIDBuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlIFwiZmxvYXRcIjpcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGNhc2UgXCJudW1lcmljXCI6IHtcbiAgICAgICAgY29uc3QgbnVtID0gcGFyc2VGbG9hdChjbGVhbmVkKTtcbiAgICAgICAgcmV0dXJuIE51bWJlci5pc05hTihudW0pID8gMCA6IG51bTtcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiBjbGVhbmVkLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiO1xuICAgICAgY2FzZSBcImRhdGVcIjoge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoY2xlYW5lZCk7XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gbmV3IERhdGUoKSA6IGRhdGU7XG4gICAgICB9XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBkYXRhRXhwbG9yZXJWYWx1ZVNjaGVtYS5wYXJzZShKU09OLnBhcnNlKGNsZWFuZWQpKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIGNsZWFuZWQ7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgXCJ1dWlkXCI6XG4gICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICByZXR1cm4gY2xlYW5lZDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBjbGVhbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBmYWtlciDtlajsiJgg7J247J6QIOusuOyekOyXtOydhCDtjIzsi7HtlZjsl6wg7J247J6QIOuwsOyXtOuhnCDrsJjtmZjtlanri4jri6QuXG4gICAqXG4gICAqIDPri6jqs4Qg7KCE6561OlxuICAgKiAxLiBKU09OIOyngeygkSDtjIzsi7EgKO2RnOykgCBKU09OIO2RnO2YhOyLnSlcbiAgICogMi4gSlMg6rCd7LK0IOumrO2EsOuftCDihpIgSlNPTiDrs4DtmZgg7ZuEIOyerOyLnOuPhCAoc2luZ2xlIHF1b3RlLCB1bnF1b3RlZCBrZXkg7LKY66asKVxuICAgKiAzLiDri6jsiJwg64uo7J28IOyduOyekCDtj7TrsLEgKOyIq+yekCwg66y47J6Q7Je0KVxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZUdlbmVyYXRvckFyZ3MoYXJnc1N0cjogc3RyaW5nLCBwcm9wTmFtZTogc3RyaW5nKTogRGF0YUV4cGxvcmVyVmFsdWVbXSB7XG4gICAgLy8gMS4gSlNPTiDsp4HsoJEg7YyM7IuxXG4gICAgbGV0IHBhcnNlZEFyZ3VtZW50czogRGF0YUV4cGxvcmVyVmFsdWVbXSB8IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIHBhcnNlZEFyZ3VtZW50cyA9IGdlbmVyYXRvckFyZ3VtZW50c1NjaGVtYS5wYXJzZShKU09OLnBhcnNlKGBbJHthcmdzU3RyfV1gKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBwYXJzZWRBcmd1bWVudHMgPSBudWxsO1xuICAgIH1cbiAgICBpZiAocGFyc2VkQXJndW1lbnRzKSB7XG4gICAgICByZXR1cm4gcGFyc2VkQXJndW1lbnRzO1xuICAgIH1cblxuICAgIC8vIDIuIEpTIOqwneyytCDrpqzthLDrn7Qg4oaSIEpTT04g67OA7ZmYIO2bhCDsnqzsi5zrj4RcbiAgICB0cnkge1xuICAgICAgY29uc3QganNvblN0ciA9IHRoaXMuY29udmVydEpzTGl0ZXJhbFRvSnNvbihhcmdzU3RyKTtcbiAgICAgIHBhcnNlZEFyZ3VtZW50cyA9IGdlbmVyYXRvckFyZ3VtZW50c1NjaGVtYS5wYXJzZShKU09OLnBhcnNlKGBbJHtqc29uU3RyfV1gKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBwYXJzZWRBcmd1bWVudHMgPSBudWxsO1xuICAgIH1cbiAgICBpZiAocGFyc2VkQXJndW1lbnRzKSB7XG4gICAgICByZXR1cm4gcGFyc2VkQXJndW1lbnRzO1xuICAgIH1cblxuICAgIC8vIDMuIOuLqOyInCDri6jsnbwg7J247J6QIO2PtOuwsVxuICAgIGNvbnN0IHRyaW1tZWQgPSBhcmdzU3RyLnRyaW0oKTtcbiAgICBpZiAoIU51bWJlci5pc05hTihOdW1iZXIodHJpbW1lZCkpKSB7XG4gICAgICByZXR1cm4gW051bWJlcih0cmltbWVkKV07XG4gICAgfVxuICAgIGlmIChcbiAgICAgICh0cmltbWVkLnN0YXJ0c1dpdGgoJ1wiJykgJiYgdHJpbW1lZC5lbmRzV2l0aCgnXCInKSkgfHxcbiAgICAgICh0cmltbWVkLnN0YXJ0c1dpdGgoXCInXCIpICYmIHRyaW1tZWQuZW5kc1dpdGgoXCInXCIpKVxuICAgICkge1xuICAgICAgcmV0dXJuIFt0cmltbWVkLnNsaWNlKDEsIC0xKV07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBGaXh0dXJlR2VuZXJhdG9yOiBDYW5ub3QgcGFyc2UgYXJndW1lbnRzIGZvciAke3Byb3BOYW1lfTogJHthcmdzU3RyfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTIOqwneyytCDrpqzthLDrn7TsnYQgSlNPTuycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqXG4gICAqIOuRkCDqsIDsp4Ag67OA7ZmYOlxuICAgKiAxLiBTaW5nbGUtcXVvdGVkIOusuOyekOyXtCDihpIgZG91YmxlLXF1b3RlZCAo7J207Iqk7LyA7J207ZSEIOyymOumrCDtj6ztlagpXG4gICAqIDIuIFVucXVvdGVkIOqwneyytCDtgqQg4oaSIGRvdWJsZS1xdW90ZWRcbiAgICovXG4gIHByaXZhdGUgY29udmVydEpzTGl0ZXJhbFRvSnNvbihpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyAxLiAndmFsdWUnIOKGkiBcInZhbHVlXCIgKOuCtOu2gCBcIiDsnbTsiqTsvIDsnbTtlIQsIFxcJyDihpIgJylcbiAgICBjb25zdCB3aXRoRG91YmxlUXVvdGVzID0gaW5wdXQucmVwbGFjZShcbiAgICAgIC8nKFteJ1xcXFxdKig/OlxcXFwuW14nXFxcXF0qKSopJy9nLFxuICAgICAgKF8sIGNvbnRlbnQ6IHN0cmluZykgPT4gYFwiJHtjb250ZW50LnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXFxcJy9nLCBcIidcIil9XCJgLFxuICAgICk7XG5cbiAgICAvLyAyLiB7IGtleTog4oaSIHsgXCJrZXlcIjpcbiAgICByZXR1cm4gd2l0aERvdWJsZVF1b3Rlcy5yZXBsYWNlKC8oW3ssXVxccyopKFthLXpBLVpfJF1bXFx3JF0qKShcXHMqOikvZywgJyQxXCIkMlwiJDMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb25hbXUuc2VjcmV07J2EIOyasOyEoOycvOuhnCDtlZjqs6AsIOyXhuycvOuptCDtmZjqsr3rs4DsiJjsl5DshJwgQVBJIO2CpOulvCDsnb3sirXri4jri6QuXG4gICAqXG4gICAqIFNvbmFtdS5zZWNyZXTsnYAg7ZSE66Gc7KCd7Yq467OEIOyEpOyglShzb25hbXUuY29uZmlnLnRzKeydtOuvgOuhnCDrjZQg64aS7J2AIOyasOyEoOyInOychOulvCDqsIDsp4DrqbAsXG4gICAqIO2ZmOqyveuzgOyImOuKlCDqsJzrsJwg7ZmY6rK97J2064KYIENJL0NE7JeQ7IScIGZhbGxiYWNr7Jy866GcIOyCrOyaqeuQqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZ2V0QXBpS2V5KCk6IHN0cmluZyB7XG4gICAgbGV0IGFwaUtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgU29uYW11IH0gPSByZXF1aXJlKFwiLi4vYXBpXCIpO1xuICAgICAgYXBpS2V5ID0gU29uYW11LnNlY3JldHM/LmFudGhyb3BpY19hcGlfa2V5O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gU29uYW116rCAIOy0iOq4sO2ZlOuQmOyngCDslYrsnYAg6rK97JqwICjthYzsiqTtirgg7ZmY6rK9IOuTsSlcbiAgICB9XG5cbiAgICBpZiAoIWFwaUtleSkge1xuICAgICAgYXBpS2V5ID0gcHJvY2Vzcy5lbnYuQU5USFJPUElDX0FQSV9LRVk7XG4gICAgfVxuXG4gICAgaWYgKCFhcGlLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJBTlRIUk9QSUNfQVBJX0tFWSBub3QgZm91bmQuIFNldCBpdCBpbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb3IgU29uYW11LnNlY3JldC5hbnRocm9waWNfYXBpX2tleVwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXBpS2V5O1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNTZXF1ZW5jZURlZmF1bHQocHJvcDogRW50aXR5UHJvcCk6IGJvb2xlYW4ge1xuICAgIGlmICghKFwiZGJEZWZhdWx0XCIgaW4gcHJvcCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZGJEZWZhdWx0ID0gei5zdHJpbmcoKS5zYWZlUGFyc2UocHJvcC5kYkRlZmF1bHQpO1xuICAgIHJldHVybiBkYkRlZmF1bHQuc3VjY2VzcyAmJiBkYkRlZmF1bHQuZGF0YS5pbmNsdWRlcyhcIm5leHR2YWxcIik7XG4gIH1cblxuICBwcml2YXRlIGdldEV4cGVjdGVkRm9ybWF0KHByb3BUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIOuwsOyXtCDtg4DsnoUg7LKY66asXG4gICAgaWYgKHByb3BUeXBlLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICAgIGNvbnN0IGJhc2VUeXBlID0gcHJvcFR5cGUuc2xpY2UoMCwgLTIpO1xuICAgICAgY29uc3QgYmFzZUZvcm1hdCA9IHRoaXMuZ2V0U2NhbGFyRm9ybWF0KGJhc2VUeXBlKTtcbiAgICAgIHJldHVybiBgSlNPTiBhcnJheSBvZiAke2Jhc2VGb3JtYXR9IChlLmcuLCBbJHt0aGlzLmdldEV4YW1wbGVGb3JUeXBlKGJhc2VUeXBlLCBcImVuXCIpfSwgLi4uXSlgO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldFNjYWxhckZvcm1hdChwcm9wVHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGdldFNjYWxhckZvcm1hdChwcm9wVHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHByb3BUeXBlKSB7XG4gICAgICBjYXNlIFwiaW50ZWdlclwiOlxuICAgICAgY2FzZSBcImJpZ0ludGVnZXJcIjpcbiAgICAgICAgcmV0dXJuIFwiaW50ZWdlciBudW1iZXJzXCI7XG4gICAgICBjYXNlIFwiZmxvYXRcIjpcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICAgIHJldHVybiBcImRlY2ltYWwgbnVtYmVyc1wiO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIFwiYm9vbGVhbnMgKHRydWUgb3IgZmFsc2UpXCI7XG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICByZXR1cm4gXCJJU08gODYwMSBkYXRlIHN0cmluZ3NcIjtcbiAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgIHJldHVybiBcInZhbGlkIEpTT04gb2JqZWN0IG9yIGFycmF5XCI7XG4gICAgICBjYXNlIFwidXVpZFwiOlxuICAgICAgICByZXR1cm4gXCJVVUlEIHN0cmluZ3NcIjtcbiAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgIHJldHVybiBcIm9uZSBvZiB0aGUgYWxsb3dlZCBlbnVtIHZhbHVlc1wiO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwicGxhaW4gdGV4dCBzdHJpbmdzXCI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRFeGFtcGxlRm9yVHlwZShwcm9wVHlwZTogc3RyaW5nLCBsb2NhbGU6IExvY2FsZSk6IHN0cmluZyB7XG4gICAgLy8g67Cw7Je0IO2DgOyehSDsspjrpqxcbiAgICBpZiAocHJvcFR5cGUuZW5kc1dpdGgoXCJbXVwiKSkge1xuICAgICAgY29uc3QgYmFzZVR5cGUgPSBwcm9wVHlwZS5zbGljZSgwLCAtMik7XG4gICAgICBjb25zdCBiYXNlRXhhbXBsZSA9IHRoaXMuZ2V0U2NhbGFyRXhhbXBsZShiYXNlVHlwZSwgbG9jYWxlKTtcbiAgICAgIHJldHVybiBgWyR7YmFzZUV4YW1wbGV9XWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0U2NhbGFyRXhhbXBsZShwcm9wVHlwZSwgbG9jYWxlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2NhbGFyRXhhbXBsZShwcm9wVHlwZTogc3RyaW5nLCBsb2NhbGU6IExvY2FsZSk6IHN0cmluZyB7XG4gICAgY29uc3QgaXNLb3JlYW4gPSBsb2NhbGUgPT09IFwia29cIjtcblxuICAgIHN3aXRjaCAocHJvcFR5cGUpIHtcbiAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICBjYXNlIFwiYmlnSW50ZWdlclwiOlxuICAgICAgICByZXR1cm4gXCI0MlwiO1xuICAgICAgY2FzZSBcImZsb2F0XCI6XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgICByZXR1cm4gXCIzLjE0XCI7XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gXCJ0cnVlXCI7XG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICByZXR1cm4gXCIyMDI0LTAxLTAxXCI7XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICByZXR1cm4gJ3tcImtleVwiOiBcInZhbHVlXCJ9JztcbiAgICAgIGNhc2UgXCJ1dWlkXCI6XG4gICAgICAgIHJldHVybiBcIjU1MGU4NDAwLWUyOWItNDFkNC1hNzE2LTQ0NjY1NTQ0MDAwMFwiO1xuICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgcmV0dXJuIFwiRU5VTV9WQUxVRVwiO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGlzS29yZWFuID8gXCLslYjrhZXtlZjshLjsmpRcIiA6IFwiSGVsbG9cIjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7J2066aE7J2EIOydtOuplOydvCDroZzsu6wg7YyM7Yq47JqpIOuhnOuniOuCmOydtOymiOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiDtlZzquIAg7J2066aE7J2AIOy0iOyEsS3spJHshLEt7KKF7ISxIOu2hO2VtCDtm4Qg66Gc66eI64KY7J207KaIIOyymOumrO2VqeuLiOuLpC5cbiAgICog7JiB66y4IOydtOumhOydgCDshozrrLjsnpDroZwg67OA7ZmY7ZWY6rOgIOqzteuwseydhCDsoJAoLilcXHVjNzNj66GcIOy5mO2ZmO2VqeuLiOuLpC5cbiAgICog7JiIOiBcIuq5gOyyoOyImFwiIOKGkiBcImNoZW9sc3Uua2ltXCIsIFwiSm9obiBEb2VcIiDihpIgXCJqb2huLmRvZVwiXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJvbWFuaXplTmFtZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIC8vIO2VnOq4gCDtj6ztlagg7Jes67aAIO2ZleyduFxuICAgIGlmICgvW1xcdUFDMDAtXFx1RDdBRl0vLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvbWFuaXplS29yZWFuTmFtZShuYW1lKTtcbiAgICB9XG4gICAgLy8g7JiB66y4OiDshozrrLjsnpAgKyDsoJAg6rWs67aEXG4gICAgcmV0dXJuIG5hbWVcbiAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAucmVwbGFjZSgvXFxzKy9nLCBcIi5cIilcbiAgICAgIC5yZXBsYWNlKC9bXmEtejAtOS5dL2csIFwiXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VnOq4gCDsnbTrpoTsnYQg66Gc66eI64KY7J207KaIIOyymOumrO2VqeuLiOuLpC5cbiAgICpcbiAgICog7LSI7ISxL+ykkeyEsS/sooXshLEg66ek7ZWRIO2FjOydtOu4lOydhCDsgqzsmqntlZjsl6wg7ZWc6riA7J2EIOuhnOuniOyekOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqIOyyqyDquIDsnpDrpbwg7ISx7Jy866GcIOqwhOyjvO2VmOyXrCBcIuq5gOyyoOyImFwiIOKGkiBcImNoZW9sc3Uua2ltXCIg7ZiV7YOc66GcIOy2nOugpe2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgcm9tYW5pemVLb3JlYW5OYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgQ0hPU0VPTkcgPSBbXG4gICAgICBcImdcIixcbiAgICAgIFwia2tcIixcbiAgICAgIFwiblwiLFxuICAgICAgXCJkXCIsXG4gICAgICBcInR0XCIsXG4gICAgICBcInJcIixcbiAgICAgIFwibVwiLFxuICAgICAgXCJiXCIsXG4gICAgICBcInBwXCIsXG4gICAgICBcInNcIixcbiAgICAgIFwic3NcIixcbiAgICAgIFwiXCIsXG4gICAgICBcImpcIixcbiAgICAgIFwiampcIixcbiAgICAgIFwiY2hcIixcbiAgICAgIFwia1wiLFxuICAgICAgXCJ0XCIsXG4gICAgICBcInBcIixcbiAgICAgIFwiaFwiLFxuICAgIF07XG4gICAgY29uc3QgSlVOR1NFT05HID0gW1xuICAgICAgXCJhXCIsXG4gICAgICBcImFlXCIsXG4gICAgICBcInlhXCIsXG4gICAgICBcInlhZVwiLFxuICAgICAgXCJlb1wiLFxuICAgICAgXCJlXCIsXG4gICAgICBcInllb1wiLFxuICAgICAgXCJ5ZVwiLFxuICAgICAgXCJvXCIsXG4gICAgICBcIndhXCIsXG4gICAgICBcIndhZVwiLFxuICAgICAgXCJvZVwiLFxuICAgICAgXCJ5b1wiLFxuICAgICAgXCJ1XCIsXG4gICAgICBcIndvXCIsXG4gICAgICBcIndlXCIsXG4gICAgICBcIndpXCIsXG4gICAgICBcInl1XCIsXG4gICAgICBcImV1XCIsXG4gICAgICBcInVpXCIsXG4gICAgICBcImlcIixcbiAgICBdO1xuICAgIGNvbnN0IEpPTkdTRU9ORyA9IFtcbiAgICAgIFwiXCIsXG4gICAgICBcImtcIixcbiAgICAgIFwia1wiLFxuICAgICAgXCJrXCIsXG4gICAgICBcIm5cIixcbiAgICAgIFwiblwiLFxuICAgICAgXCJuXCIsXG4gICAgICBcInRcIixcbiAgICAgIFwibFwiLFxuICAgICAgXCJsXCIsXG4gICAgICBcImxcIixcbiAgICAgIFwibFwiLFxuICAgICAgXCJsXCIsXG4gICAgICBcImxcIixcbiAgICAgIFwibFwiLFxuICAgICAgXCJsXCIsXG4gICAgICBcIm1cIixcbiAgICAgIFwicFwiLFxuICAgICAgXCJwXCIsXG4gICAgICBcInRcIixcbiAgICAgIFwidFwiLFxuICAgICAgXCJuZ1wiLFxuICAgICAgXCJ0XCIsXG4gICAgICBcInRcIixcbiAgICAgIFwia1wiLFxuICAgICAgXCJ0XCIsXG4gICAgICBcInBcIixcbiAgICAgIFwidFwiLFxuICAgIF07XG5cbiAgICBjb25zdCByb21hbml6ZSA9IChjaGFyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgICAgY29uc3QgY29kZSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcbiAgICAgIGlmIChjb2RlIDwgMHhhYzAwIHx8IGNvZGUgPiAweGQ3YWYpIHJldHVybiBjaGFyO1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gY29kZSAtIDB4YWMwMDtcbiAgICAgIGNvbnN0IGNobyA9IE1hdGguZmxvb3Iob2Zmc2V0IC8gNTg4KTtcbiAgICAgIGNvbnN0IGp1bmcgPSBNYXRoLmZsb29yKChvZmZzZXQgJSA1ODgpIC8gMjgpO1xuICAgICAgY29uc3Qgam9uZyA9IG9mZnNldCAlIDI4O1xuICAgICAgcmV0dXJuIENIT1NFT05HW2Nob10gKyBKVU5HU0VPTkdbanVuZ10gKyBKT05HU0VPTkdbam9uZ107XG4gICAgfTtcblxuICAgIGNvbnN0IGNoYXJzID0gWy4uLm5hbWVdO1xuICAgIC8vIOyyqyDquIDsnpDrpbwg7ISxKOWnkynsnLzroZwg6rCE7KO8XG4gICAgY29uc3QgZmFtaWx5TmFtZSA9IHJvbWFuaXplKGNoYXJzWzBdKTtcbiAgICBjb25zdCBnaXZlbk5hbWUgPSBjaGFycy5zbGljZSgxKS5tYXAocm9tYW5pemUpLmpvaW4oXCJcIik7XG5cbiAgICBpZiAoZ2l2ZW5OYW1lKSB7XG4gICAgICByZXR1cm4gYCR7Z2l2ZW5OYW1lfS4ke2ZhbWlseU5hbWV9YDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbWlseU5hbWU7XG4gIH1cblxuICAvKipcbiAgICogTExNIOy6kOyLnCDthrXqs4Trpbwg67CY7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgZ2V0TExNQ2FjaGVTdGF0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2l6ZTogdGhpcy5sbG1DYWNoZS5zaXplLFxuICAgICAgZW5hYmxlZDogdGhpcy5vcHRpb25zLmVuYWJsZUxMTUNhY2hlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTExNIOy6kOyLnOulvCDstIjquLDtmZTtlanri4jri6QuXG4gICAqL1xuICBjbGVhckxMTUNhY2hlKCkge1xuICAgIHRoaXMubGxtQ2FjaGUuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsu6jthY3siqTtirgg7IOd7ISxXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUNvbnRleHQoKTogR2VuZXJhdG9yQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpeHR1cmVzOiBuZXcgTWFwKCksXG4gICAgICByZWZlcmVuY2VDYWNoZTogbmV3IE1hcCgpLFxuICAgICAgaW1wb3J0ZWRSZWNvcmRzOiBuZXcgU2V0KCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrsLDsuZgg7IOd7ISxIOuwjyDsnpDrj5kg7KCA7J6lXG4gICAqXG4gICAqIDEuIOqwgSBzcGVj67OE66GcIGZpeHR1cmUg7IOd7ISxICjrqZTrqqjrpqwpXG4gICAqIDIuIEZpeHR1cmVSZWNvcmTroZwg67OA7ZmYXG4gICAqIDMuIEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVzKCnroZwgdGFyZ2V0RGLsl5Ag7KCA7J6lXG4gICAqXG4gICAqIEByZXR1cm5zIOyggOyepeuQnCBmaXh0dXJlIOuNsOydtO2EsCAo7Iuk7KCcIERCIElEIO2PrO2VqClcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlQmF0Y2goc3BlY3M6IEZpeHR1cmVHZW5lcmF0aW9uU3BlY1tdKTogUHJvbWlzZTxGaXh0dXJlSW1wb3J0UmVzdWx0W10+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jcmVhdGVDb250ZXh0KCk7XG4gICAgY29uc3QgZ2VuZXJhdGVkRml4dHVyZXM6IEdlbmVyYXRlZEZpeHR1cmVbXSA9IFtdO1xuXG4gICAgLy8gMS4g6rCBIHNwZWPrs4TroZwgZml4dHVyZSDsg53shLFcbiAgICBmb3IgKGNvbnN0IHNwZWMgb2Ygc3BlY3MpIHtcbiAgICAgIGNvbnN0IHNwZWNFbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KHNwZWMuZW50aXR5KTtcblxuICAgICAgaWYgKHNwZWNFbnRpdHkucGFyZW50SWQpIHtcbiAgICAgICAgLy8gcGFyZW50SWQg7JeU7Yuw7YuwOiBEQuyXkOyEnCDshJzruIztg4DsnoUg7ZaJ7J20IOyXhuuKlCDrtoDrqqggaWTrpbwg7KGw7ZqM7ZWY7JesIOyCrOyaqVxuICAgICAgICAvLyAo7IOIIOu2gOuqqCDsg53shLEg64yA7IugIOq4sOyhtCDrjbDsnbTthLAg7J6s7Zmc7JqpKVxuICAgICAgICBjb25zdCBpZFByb3AgPSBzcGVjRW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgICAgICAgY29uc3QgcGFyZW50T3ZlcnJpZGVzID0gaWRQcm9wPy5jb25lPy5maXh0dXJlUGFyZW50T3ZlcnJpZGVzID8/IHt9O1xuICAgICAgICBjb25zdCBwYXJlbnRFbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KHNwZWNFbnRpdHkucGFyZW50SWQpO1xuXG4gICAgICAgIC8vIOu2gOuqqCDthYzsnbTruJTsl5DshJwg7ISc67iM7YOA7J6FIO2FjOydtOu4lOyXkCDsl4bripQgaWTrpbwg7KGw7ZqMXG4gICAgICAgIGxldCBxdWVyeSA9IHRoaXMuc291cmNlRGIocGFyZW50RW50aXR5LnRhYmxlKS5zZWxlY3QoYCR7cGFyZW50RW50aXR5LnRhYmxlfS5pZGApO1xuICAgICAgICBmb3IgKGNvbnN0IFtjb2wsIHZhbF0gb2YgT2JqZWN0LmVudHJpZXMocGFyZW50T3ZlcnJpZGVzKSkge1xuICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoYCR7cGFyZW50RW50aXR5LnRhYmxlfS4ke2NvbH1gLCBmaXh0dXJlV2hlcmVWYWx1ZVNjaGVtYS5wYXJzZSh2YWwpKTtcbiAgICAgICAgfVxuICAgICAgICBxdWVyeSA9IHF1ZXJ5XG4gICAgICAgICAgLmxlZnRKb2luKHNwZWNFbnRpdHkudGFibGUsIGAke3NwZWNFbnRpdHkudGFibGV9LmlkYCwgYCR7cGFyZW50RW50aXR5LnRhYmxlfS5pZGApXG4gICAgICAgICAgLndoZXJlTnVsbChgJHtzcGVjRW50aXR5LnRhYmxlfS5pZGApXG4gICAgICAgICAgLmxpbWl0KHNwZWMuY291bnQpO1xuXG4gICAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBxdWVyeTtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlSWRzOiBudW1iZXJbXSA9IHJvd3MubWFwKChyOiB7IGlkOiBudW1iZXIgfSkgPT4gci5pZCk7XG5cbiAgICAgICAgaWYgKGF2YWlsYWJsZUlkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICAgIGBbcGFyZW50SWRdICR7c3BlYy5lbnRpdHl9OiDshJzruIztg4DsnoXsnbQg7JeG64qUIOu2gOuqqCDroIjsvZTrk5zqsIAg67aA7KGx7ZWp64uI64ukLiDqsbTrhIjrnIHri4jri6QuYCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yIChjb25zdCBwYXJlbnRJZCBvZiBhdmFpbGFibGVJZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpeHR1cmUgPSBhd2FpdCB0aGlzLmdlbmVyYXRlKHNwZWMuZW50aXR5LCBzcGVjLm92ZXJyaWRlcyB8fCB7fSwgY29udGV4dCk7XG4gICAgICAgICAgICBmaXh0dXJlLmlkID0gcGFyZW50SWQ7XG4gICAgICAgICAgICBnZW5lcmF0ZWRGaXh0dXJlcy5wdXNoKHsgZW50aXR5OiBzcGVjLmVudGl0eSwgZGF0YTogZml4dHVyZSwgZXhwbGljaXRJZDogdHJ1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BlYy5jb3VudDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZml4dHVyZSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGUoc3BlYy5lbnRpdHksIHNwZWMub3ZlcnJpZGVzIHx8IHt9LCBjb250ZXh0KTtcbiAgICAgICAgICBnZW5lcmF0ZWRGaXh0dXJlcy5wdXNoKHtcbiAgICAgICAgICAgIGVudGl0eTogc3BlYy5lbnRpdHksXG4gICAgICAgICAgICBkYXRhOiBmaXh0dXJlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMi4gRml4dHVyZVJlY29yZOuhnCDrs4DtmZhcbiAgICBjb25zdCBmaXh0dXJlUmVjb3JkczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgZm9yIChjb25zdCB7IGVudGl0eTogZW50aXR5TmFtZSwgZGF0YSwgZXhwbGljaXRJZCB9IG9mIGdlbmVyYXRlZEZpeHR1cmVzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eU5hbWUpO1xuXG4gICAgICAvLyBpbnRlZ2VyL2JpZ0ludGVnZXIgUEvripQg7J6E7IucIElEIOyDneyEsSAoREIg7Iuc7YCA7Iqk6rCAIOyLpOygnCBJRCDtlaDri7kpXG4gICAgICAvLyBzdHJpbmcgUEsgd2l0aCBkYkRlZmF1bHQgbmV4dHZhbOuPhCDrj5nsnbztlZjqsowg7LKY66asXG4gICAgICAvLyDqt7gg7Jm4IHN0cmluZy91dWlkIFBL64qUIGdlbmVyYXRlKCnsl5DshJwg7J2066+4IOyDneyEseuQnCBpZCDqsJLsnYQg6re464yA66GcIOyCrOyaqVxuICAgICAgLy8gcGFyZW50SWQg7JeU7Yuw7Yuw64qUIOu2gOuqqOydmCDsi6TsoJwgaWTrpbwg6re464yA66GcIOyCrOyaqSAo7Iuc7YCA7IqkIOuvuOyCrOyaqSlcbiAgICAgIGNvbnN0IGlkUHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IFwiaWRcIik7XG4gICAgICBjb25zdCB1c2VzU2VxdWVuY2UgPVxuICAgICAgICAhZXhwbGljaXRJZCAmJlxuICAgICAgICAoaWRQcm9wPy50eXBlID09PSBcImludGVnZXJcIiB8fFxuICAgICAgICAgIGlkUHJvcD8udHlwZSA9PT0gXCJiaWdJbnRlZ2VyXCIgfHxcbiAgICAgICAgICAoaWRQcm9wPy50eXBlID09PSBcInN0cmluZ1wiICYmIHRoaXMuaGFzU2VxdWVuY2VEZWZhdWx0KGlkUHJvcCkpKTtcblxuICAgICAgY29uc3QgZGF0YUZvclJlY29yZCA9IHVzZXNTZXF1ZW5jZVxuICAgICAgICA/IHsgLi4uZGF0YSwgaWQ6IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDApIH1cbiAgICAgICAgOiBkYXRhO1xuXG4gICAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgZW50aXR5LFxuICAgICAgICBwYXJzZUZpeHR1cmVTb3VyY2VSZWNvcmQoZGF0YUZvclJlY29yZCksXG4gICAgICAgIHsgc2luZ2xlUmVjb3JkOiB0cnVlIH0sXG4gICAgICApO1xuICAgICAgZml4dHVyZVJlY29yZHMucHVzaCguLi5yZWNvcmRzKTtcbiAgICB9XG5cbiAgICAvLyAzLiB0YXJnZXREYuyXkCDsgr3snoUgKEZpeHR1cmVNYW5hZ2Vy6rCAIOydmOyhtOyEsSDsoJXroKwg7LKY66asKVxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlcyh0aGlzLnRhcmdldERiTmFtZSwgZml4dHVyZVJlY29yZHMpO1xuXG4gICAgLy8gNC4gY29tcGFuaW9uIGZpeHR1cmVzIOyDneyEsSAoZml4dHVyZUNvbXBhbmlvbnPqsIAg7ISg7Ja465CcIOqyveyasClcbiAgICBjb25zdCBjb21wYW5pb25SZXN1bHRzID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUNvbXBhbmlvbnMoc3BlY3MsIHJlc3VsdHMpO1xuXG4gICAgY29uc3QgdG90YWwgPSByZXN1bHRzLmxlbmd0aCArIGNvbXBhbmlvblJlc3VsdHMubGVuZ3RoO1xuICAgICFpc1Rlc3QoKSAmJlxuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYEdlbmVyYXRlZCBhbmQgc2F2ZWQgJHt0b3RhbH0gZml4dHVyZXMgdG8gJHt0aGlzLnRhcmdldERiTmFtZX1gKSk7XG4gICAgcmV0dXJuIFsuLi5yZXN1bHRzLCAuLi5jb21wYW5pb25SZXN1bHRzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrtoDrqqggZml4dHVyZSDqsrDqs7zrpbwg6riw67CY7Jy866GcIGZpeHR1cmVDb21wYW5pb25z7JeQIOyEoOyWuOuQnCBjb21wYW5pb24gRW50aXR566W8IOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICogZ2VuZXJhdGVCYXRjaCgp7JeQ7ISc66eMIO2YuOy2nOuQmOupsCwgY29tcGFuaW9uIOyDneyEsSDsi5wg7J6s6reA66W8IOuwqeyngO2VmOq4sCDsnITtlbRcbiAgICogZ2VuZXJhdGVCYXRjaCgp66W8IOuLpOyLnCDtmLjstpztlZjsp4Ag7JWK6rOgIOyngeygkSDsgr3snoXtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlQ29tcGFuaW9ucyhcbiAgICBzcGVjczogRml4dHVyZUdlbmVyYXRpb25TcGVjW10sXG4gICAgcGFyZW50UmVzdWx0czogRml4dHVyZUltcG9ydFJlc3VsdFtdLFxuICApOiBQcm9taXNlPEZpeHR1cmVJbXBvcnRSZXN1bHRbXT4ge1xuICAgIGNvbnN0IGFsbFJlc3VsdHM6IEZpeHR1cmVJbXBvcnRSZXN1bHRbXSA9IFtdO1xuICAgIGNvbnN0IHByb2Nlc3NlZEVudGl0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGNvbnN0IHNwZWMgb2Ygc3BlY3MpIHtcbiAgICAgIGlmIChwcm9jZXNzZWRFbnRpdGllcy5oYXMoc3BlYy5lbnRpdHkpKSBjb250aW51ZTtcbiAgICAgIHByb2Nlc3NlZEVudGl0aWVzLmFkZChzcGVjLmVudGl0eSk7XG5cbiAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoc3BlYy5lbnRpdHkpO1xuICAgICAgY29uc3QgaWRQcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgICAgIGNvbnN0IGNvbXBhbmlvbnMgPSBpZFByb3A/LmNvbmU/LmZpeHR1cmVDb21wYW5pb25zO1xuICAgICAgaWYgKCFjb21wYW5pb25zIHx8IGNvbXBhbmlvbnMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgZW50aXR5UmVzdWx0cyA9IHBhcmVudFJlc3VsdHMuZmlsdGVyKChyKSA9PiByLmVudGl0eUlkID09PSBzcGVjLmVudGl0eSk7XG4gICAgICBpZiAoZW50aXR5UmVzdWx0cy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICBmb3IgKGNvbnN0IGNvbXBhbmlvbiBvZiBjb21wYW5pb25zKSB7XG4gICAgICAgIC8vIGNvbXBhbmlvbiBlbnRpdHnsl5DshJwg67aA66qoIGVudGl0eeuhnOydmCBCZWxvbmdzVG9PbmUgRksg7Lus65+866qFIO2MjOyVhVxuICAgICAgICBjb25zdCBjb21wYW5pb25FbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KGNvbXBhbmlvbi5lbnRpdHkpO1xuICAgICAgICBjb25zdCBma1Byb3AgPSBjb21wYW5pb25FbnRpdHkucHJvcHMuZmluZChcbiAgICAgICAgICAocCkgPT4gaXNSZWxhdGlvblByb3AocCkgJiYgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocCkgJiYgcC53aXRoID09PSBzcGVjLmVudGl0eSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFma1Byb3ApIHtcbiAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICAgIGBbQ29tcGFuaW9uXSBObyBCZWxvbmdzVG9PbmUgcmVsYXRpb24gZnJvbSAke2NvbXBhbmlvbi5lbnRpdHl9IHRvICR7c3BlYy5lbnRpdHl9LiBTa2lwcGluZy5gLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBma0NvbE5hbWUgPSBgJHtma1Byb3AubmFtZX1faWRgO1xuXG4gICAgICAgIC8vIGNvbXBhbmlvbuydmCBpZFByb3AsIHVzZXNTZXF1ZW5jZSwgY291bnTripQgY29tcGFuaW9uIOuLqOychOuhnCDqs6DsoJVcbiAgICAgICAgY29uc3QgY29tcGFuaW9uSWRQcm9wID0gY29tcGFuaW9uRW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gXCJpZFwiKTtcbiAgICAgICAgY29uc3QgdXNlc1NlcXVlbmNlID1cbiAgICAgICAgICBjb21wYW5pb25JZFByb3A/LnR5cGUgPT09IFwiaW50ZWdlclwiIHx8XG4gICAgICAgICAgY29tcGFuaW9uSWRQcm9wPy50eXBlID09PSBcImJpZ0ludGVnZXJcIiB8fFxuICAgICAgICAgIChjb21wYW5pb25JZFByb3A/LnR5cGUgPT09IFwic3RyaW5nXCIgJiYgdGhpcy5oYXNTZXF1ZW5jZURlZmF1bHQoY29tcGFuaW9uSWRQcm9wKSk7XG4gICAgICAgIGNvbnN0IGNvbXBhbmlvbkNvdW50ID0gY29tcGFuaW9uLmNvdW50ID8/IDE7XG5cbiAgICAgICAgLy8g6rCBIHBhcmVudCByZXN1bHTsl5Ag64yA7ZW0IGNvbXBhbmlvbiBmaXh0dXJlIOyDneyEsVxuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jcmVhdGVDb250ZXh0KCk7XG4gICAgICAgIGNvbnN0IGNvbXBhbmlvbkZpeHR1cmVSZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHBhcmVudFJlc3VsdCBvZiBlbnRpdHlSZXN1bHRzKSB7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWRPdmVycmlkZXMgPSB0aGlzLnJlc29sdmVUZW1wbGF0ZU92ZXJyaWRlcyhcbiAgICAgICAgICAgIGRhdGFFeHBsb3JlclJlY29yZFNjaGVtYS5wYXJzZShjb21wYW5pb24ub3ZlcnJpZGVzID8/IHt9KSxcbiAgICAgICAgICAgIHBhcmVudFJlc3VsdC5kYXRhLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmVzb2x2ZWRPdmVycmlkZXNbZmtDb2xOYW1lXSA9IHBhcmVudFJlc3VsdC5kYXRhLmlkO1xuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21wYW5pb25Db3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBmaXh0dXJlID0gYXdhaXQgdGhpcy5nZW5lcmF0ZShjb21wYW5pb24uZW50aXR5LCByZXNvbHZlZE92ZXJyaWRlcywgY29udGV4dCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGFGb3JSZWNvcmQgPSB1c2VzU2VxdWVuY2VcbiAgICAgICAgICAgICAgPyB7IC4uLmZpeHR1cmUsIGlkOiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKSB9XG4gICAgICAgICAgICAgIDogZml4dHVyZTtcblxuICAgICAgICAgICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmNyZWF0ZUZpeHR1cmVSZWNvcmQoXG4gICAgICAgICAgICAgIGNvbXBhbmlvbkVudGl0eSxcbiAgICAgICAgICAgICAgcGFyc2VGaXh0dXJlU291cmNlUmVjb3JkKGRhdGFGb3JSZWNvcmQpLFxuICAgICAgICAgICAgICB7IHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbXBhbmlvbkZpeHR1cmVSZWNvcmRzLnB1c2goLi4ucmVjb3Jkcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tcGFuaW9uUmVzdWx0cyA9IGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVzKFxuICAgICAgICAgIHRoaXMudGFyZ2V0RGJOYW1lLFxuICAgICAgICAgIGNvbXBhbmlvbkZpeHR1cmVSZWNvcmRzLFxuICAgICAgICApO1xuICAgICAgICBhbGxSZXN1bHRzLnB1c2goLi4uY29tcGFuaW9uUmVzdWx0cyk7XG5cbiAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgICAgICAgYFtDb21wYW5pb25dIEdlbmVyYXRlZCAke2NvbXBhbmlvblJlc3VsdHMubGVuZ3RofSAke2NvbXBhbmlvbi5lbnRpdHl9IGZpeHR1cmVzYCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWxsUmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBvdmVycmlkZXMg6rCS7J2YIFwie3tmaWVsZE5hbWV9fVwiIO2FnO2UjOumv+ydhCDrtoDrqqggZml4dHVyZSDrjbDsnbTthLDroZwg7LmY7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiDsmIg6IHsgXCJhY2NvdW50X2lkXCI6IFwie3tlbWFpbH19XCIgfSDihpIgeyBcImFjY291bnRfaWRcIjogXCJ1c2VyQGV4YW1wbGUuY29tXCIgfVxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlVGVtcGxhdGVPdmVycmlkZXMoXG4gICAgb3ZlcnJpZGVzOiBEYXRhRXhwbG9yZXJSZWNvcmQsXG4gICAgcGFyZW50RGF0YTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgRGF0ZSB8IG51bGwgfSxcbiAgKTogRGF0YUV4cGxvcmVyUmVjb3JkIHtcbiAgICBjb25zdCByZXNvbHZlZDogRGF0YUV4cGxvcmVyUmVjb3JkID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3ZlcnJpZGVzKSkge1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSB6LnN0cmluZygpLnNhZmVQYXJzZSh2YWx1ZSk7XG4gICAgICBpZiAodGVtcGxhdGUuc3VjY2VzcyAmJiB0ZW1wbGF0ZS5kYXRhLnN0YXJ0c1dpdGgoXCJ7e1wiKSAmJiB0ZW1wbGF0ZS5kYXRhLmVuZHNXaXRoKFwifX1cIikpIHtcbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gdGVtcGxhdGUuZGF0YS5zbGljZSgyLCAtMikudHJpbSgpO1xuICAgICAgICBpZiAoIShmaWVsZE5hbWUgaW4gcGFyZW50RGF0YSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBg7YWc7ZSM66a/IO2VhOuTnCBcIiR7ZmllbGROYW1lfVwi7J20KOqwgCkg67aA66qoIGZpeHR1cmUg642w7J207YSw7JeQIOyhtOyerO2VmOyngCDslYrsirXri4jri6QgKG92ZXJyaWRlIGtleTogXCIke2tleX1cIilgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZWRba2V5XSA9IHBhcmVudERhdGFbZmllbGROYW1lXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmVkW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc29sdmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIOyLpOygnCBEQihzb3VyY2VEYinsl5DshJwg642w7J207YSw66W8IOyhsO2ajO2VmOyXrCBmaXh0dXJlIERCKHRhcmdldERiKeyXkCBpbXBvcnTtlanri4jri6QuXG4gICAqXG4gICAqIDEuIERhdGFFeHBsb3JlcuuhnCBzb3VyY2VEYuyXkOyEnCDrjbDsnbTthLAg7KGw7ZqMICjqtIDroKgg642w7J207YSwIO2PrO2VqClcbiAgICogMi4gRml4dHVyZVJlY29yZOuhnCDrs4DtmZhcbiAgICogMy4gdGFyZ2V0RGLsl5Ag7IK97J6FXG4gICAqXG4gICAqIEBwYXJhbSBlbnRpdHlOYW1lIC0g7KGw7ZqM7ZWgIGVudGl0eSDsnbTrpoRcbiAgICogQHBhcmFtIG9wdGlvbnMgLSDsobDtmowg7Ji17IWYIChzdHJhdGVneSwgbGltaXQsIGluY2x1ZGVSZWxhdGlvbnMg65OxKVxuICAgKiBAcmV0dXJucyDsoIDsnqXrkJwgZml4dHVyZSDrjbDsnbTthLAgKOyLpOygnCBEQiBJRCDtj6ztlagpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIO2UhOuhnOuNleyFmCBEQuyXkOyEnCBVc2VyIDEw66qFICsg6rSA66CoIEVtcGxveWVlLCBEZXBhcnRtZW50IOqwgOyguOyYpOq4sFxuICAgKiBhd2FpdCBnZW5lcmF0b3IuaW1wb3J0RnJvbVNvdXJjZShcIlVzZXJcIiwge1xuICAgKiAgIHN0cmF0ZWd5OiBcInNhbXBsZVwiLFxuICAgKiAgIGxpbWl0OiAxMCxcbiAgICogICBpbmNsdWRlUmVsYXRpb25zOiB0cnVlLFxuICAgKiAgIG1heERlcHRoOiAyXG4gICAqIH0pO1xuICAgKi9cbiAgYXN5bmMgaW1wb3J0RnJvbVNvdXJjZShcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczogRXhwbG9yZVdpdGhSZWxhdGlvbnNPcHRpb25zLFxuICApOiBQcm9taXNlPEZpeHR1cmVJbXBvcnRSZXN1bHRbXT4ge1xuICAgICFpc1Rlc3QoKSAmJlxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLmJsdWUoXG4gICAgICAgICAgYEltcG9ydGluZyAke2VudGl0eU5hbWV9IGZyb20gc291cmNlIERCIHdpdGggb3B0aW9uczogJHtKU09OLnN0cmluZ2lmeSh7IHN0cmF0ZWd5OiBvcHRpb25zLnN0cmF0ZWd5LCBsaW1pdDogb3B0aW9ucy5saW1pdCwgaW5jbHVkZVJlbGF0aW9uczogb3B0aW9ucy5pbmNsdWRlUmVsYXRpb25zLCBtYXhEZXB0aDogb3B0aW9ucy5tYXhEZXB0aCB9KX1gLFxuICAgICAgICApLFxuICAgICAgKTtcblxuICAgIC8vIDEuIERhdGFFeHBsb3JlcuuhnCBzb3VyY2VEYuyXkOyEnCDrjbDsnbTthLAg7KGw7ZqMICjqtIDroKgg642w7J207YSwIO2PrO2VqClcbiAgICBjb25zdCBleHBsb3JlUmVzdWx0ID0gYXdhaXQgdGhpcy5kYXRhRXhwbG9yZXIuZXhwbG9yZVdpdGhSZWxhdGlvbnMoZW50aXR5TmFtZSwgb3B0aW9ucyk7XG5cbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay5jeWFuKFxuICAgICAgICAgIGBGb3VuZCAke2V4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzLmxlbmd0aH0gJHtlbnRpdHlOYW1lfSByZWNvcmRzIGFuZCAke2V4cGxvcmVSZXN1bHQucmVsYXRlZC5zaXplfSByZWxhdGVkIGVudGl0aWVzYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICAvLyAyLiBGaXh0dXJlUmVjb3Jk66GcIOuzgO2ZmFxuICAgIGNvbnN0IGZpeHR1cmVSZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gPSBbXTtcblxuICAgIC8vIOuplOyduCBlbnRpdHnsnZggcmVjb3Jkc+ulvCBGaXh0dXJlUmVjb3Jk66GcIOuzgO2ZmFxuICAgIGNvbnN0IG1haW5FbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eU5hbWUpO1xuICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIGV4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzKSB7XG4gICAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgbWFpbkVudGl0eSxcbiAgICAgICAgcGFyc2VGaXh0dXJlU291cmNlUmVjb3JkKHJlY29yZCksXG4gICAgICAgIHsgZGI6IHRoaXMuc291cmNlRGIsIHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgKTtcbiAgICAgIGZpeHR1cmVSZWNvcmRzLnB1c2goLi4ucmVjb3Jkcyk7XG4gICAgfVxuXG4gICAgLy8g6rSA66CoIGVudGl0eeydmCByZWNvcmRz66W8IEZpeHR1cmVSZWNvcmTroZwg67OA7ZmYXG4gICAgZm9yIChjb25zdCBbcmVsYXRlZEVudGl0eU5hbWUsIHJlbGF0ZWRSZWNvcmRzXSBvZiBleHBsb3JlUmVzdWx0LnJlbGF0ZWQuZW50cmllcygpKSB7XG4gICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChyZWxhdGVkRW50aXR5TmFtZSk7XG4gICAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiByZWxhdGVkUmVjb3Jkcykge1xuICAgICAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgICByZWxhdGVkRW50aXR5LFxuICAgICAgICAgIHBhcnNlRml4dHVyZVNvdXJjZVJlY29yZChyZWNvcmQpLFxuICAgICAgICAgIHsgZGI6IHRoaXMuc291cmNlRGIsIHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgICApO1xuICAgICAgICBmaXh0dXJlUmVjb3Jkcy5wdXNoKC4uLnJlY29yZHMpO1xuICAgICAgfVxuXG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICAtICR7cmVsYXRlZEVudGl0eU5hbWV9OiAke3JlbGF0ZWRSZWNvcmRzLmxlbmd0aH0gcmVjb3Jkc2ApKTtcbiAgICB9XG5cbiAgICAvLyAzLiB0YXJnZXREYuyXkCDsgr3snoUgKEZpeHR1cmVNYW5hZ2Vy6rCAIOydmOyhtOyEsSDsoJXroKwg7LKY66asKVxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlcyh0aGlzLnRhcmdldERiTmFtZSwgZml4dHVyZVJlY29yZHMpO1xuXG4gICAgIWlzVGVzdCgpICYmXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgYFN1Y2Nlc3NmdWxseSBpbXBvcnRlZCAke3Jlc3VsdHMubGVuZ3RofSByZWNvcmRzIHRvICR7dGhpcy50YXJnZXREYk5hbWV9ICgke2V4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzLmxlbmd0aH0gJHtlbnRpdHlOYW1lfSArICR7cmVzdWx0cy5sZW5ndGggLSBleHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcy5sZW5ndGh9IHJlbGF0ZWQpYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQXFEQSxTQUFTLHlCQUF5QixRQUFpRDtDQUNqRixPQUFPO0VBQ0wsR0FBRztFQUNILElBQUksc0JBQXNCLE1BQU0sT0FBTyxFQUFFO0NBQzNDO0FBQ0Y7OztDQWpEbUcsV0FBQTtDQUN2RCxnQkFBQTtDQUNZLG1CQUFBO0NBQ3lDLG1CQUFBO0NBSWpELG9CQUFBO0NBRUUscUJBQUE7Q0FVNUMsc0JBQXNCLEVBQUUsT0FDNUIsaUJBQ0EsNEJBQ0Y7Q0FDTSw2QkFBNkIsRUFBRSxPQUFPLENBQUMsQ0FBQztDQUN4Qyx5QkFBeUIsRUFBRSxRQUM5QixjQUFjLDJCQUEyQixVQUFVLFNBQVMsQ0FBQyxDQUFDLFNBQy9ELCtCQUNGO0NBQ00sMkJBQTJCLEVBQUUsTUFBTSx1QkFBdUI7Q0FDMUQsd0JBQXdCLEVBQUUsTUFBTSxDQUFDLEVBQUUsT0FBTyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Q0FDeEQsMEJBQTBCLEVBQUUsTUFBTTtFQUFDLEVBQUUsT0FBTztFQUFHLEVBQUUsT0FBTztFQUFHLEVBQUUsUUFBUTtFQUFHLEVBQUUsS0FBSztFQUFHLEVBQUUsS0FBSztDQUFDLENBQUM7Q0E4Q3BGLG1CQUFiLE1BQThCO0VBU2xCO0VBSUE7RUFDQTtFQWJWO0VBQ0E7RUFDQTtFQUNBLDJCQUFtRCxJQUFJLElBQUk7RUFDM0QsOEJBQTJDLElBQUksSUFBSTtFQUNuRDtFQUVBLFlB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
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
// src/testing/fixture-loader.ts
|
|
2
2
|
function createFixtureLoader(loaders) {
|
|
3
3
|
return async function loadFixtures(names) {
|
|
4
4
|
return Object.fromEntries(await Promise.all(names.map(async (name) => [name, await loaders[name]()])));
|
|
5
5
|
};
|
|
6
6
|
}
|
|
7
|
-
//#endregion
|
|
8
7
|
export { createFixtureLoader };
|
|
9
8
|
|
|
10
9
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1sb2FkZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3RpbmcvZml4dHVyZS1sb2FkZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGaXh0dXJlIExvYWRlciBGYWN0b3J5XG4gKlxuICog7YWM7Iqk7Yq47JeQ7IScIOyCrOyaqe2VoCBmaXh0dXJl66W8IOuhnOuTnO2VmOuKlCDtlajsiJjrpbwg7IOd7ISxXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIGZpeHR1cmUudHNcbiAqIGltcG9ydCB7IGNyZWF0ZUZpeHR1cmVMb2FkZXIgfSBmcm9tIFwic29uYW11L3Rlc3RcIjtcbiAqXG4gKiBleHBvcnQgY29uc3QgbG9hZEZpeHR1cmVzID0gY3JlYXRlRml4dHVyZUxvYWRlcih7XG4gKiAgIGNvbXBhbnkwMTogYXN5bmMgKCkgPT4gQ29tcGFueU1vZGVsLmZpbmRCeUlkKFwiQVwiLCAxKSxcbiAqICAgdXNlcjAxOiBhc3luYyAoKSA9PiBVc2VyTW9kZWwuZmluZEJ5SWQoXCJBXCIsIDEpLFxuICogfSk7XG4gKlxuICogLy8gdGVzdC50c1xuICogY29uc3QgeyBjb21wYW55MDEsIHVzZXIwMSB9ID0gYXdhaXQgbG9hZEZpeHR1cmVzKFtcImNvbXBhbnkwMVwiLCBcInVzZXIwMVwiXSk7XG4gKiBgYGBcbiAqL1xudHlwZSBGaXh0dXJlTG9hZGVyVmFsdWUgPSBvYmplY3QgfCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgYmlnaW50IHwgc3ltYm9sIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZpeHR1cmVMb2FkZXI8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsICgpID0+IFByb21pc2U8Rml4dHVyZUxvYWRlclZhbHVlPj4+KFxuICBsb2FkZXJzOiBULFxuKSB7XG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiBsb2FkRml4dHVyZXM8SyBleHRlbmRzIGtleW9mIFQ+KFxuICAgIG5hbWVzOiBLW10sXG4gICk6IFByb21pc2U8eyBbUCBpbiBLXTogQXdhaXRlZDxSZXR1cm5UeXBlPFRbUF0+PiB9PiB7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKG5hbWVzLm1hcChhc3luYyAobmFtZSkgPT4gW25hbWUsIGF3YWl0IGxvYWRlcnNbbmFtZV0oKV0pKSxcbiAgICApO1xuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiO0FBcUJBLFNBQWdCLG9CQUNkLFNBQ0E7Q0FDQSxPQUFPLGVBQWUsYUFDcEIsT0FDa0Q7RUFDbEQsT0FBTyxPQUFPLFlBQ1osTUFBTSxRQUFRLElBQUksTUFBTSxJQUFJLE9BQU8sU0FBUyxDQUFDLE1BQU0sTUFBTSxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUM1RTtDQUNGO0FBQ0YifQ==
|