sonamu 0.11.16 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/_rolldown/runtime.js +1 -2
- package/dist/ai/agents/agent.js +2 -3
- package/dist/ai/agents/index.js +1 -2
- package/dist/ai/index.js +1 -2
- package/dist/ai/providers/rtzr/api.js +1 -2
- package/dist/ai/providers/rtzr/error.js +2 -3
- package/dist/ai/providers/rtzr/model.js +1 -2
- package/dist/ai/providers/rtzr/options.js +1 -2
- package/dist/ai/providers/rtzr/provider.js +1 -2
- package/dist/ai/providers/rtzr/utils.js +1 -2
- package/dist/api/base-frame.js +4 -4
- package/dist/api/caster.d.ts +1 -1
- package/dist/api/caster.d.ts.map +1 -1
- package/dist/api/caster.js +9 -9
- package/dist/api/code-converters.js +6 -5
- package/dist/api/config.d.ts +1 -1
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +2 -3
- package/dist/api/context.d.ts +2 -3
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +2 -3
- package/dist/api/decorators.js +2 -3
- package/dist/api/http-validator.js +2 -3
- package/dist/api/index.js +8 -3
- package/dist/api/secret.js +1 -2
- package/dist/api/sonamu.d.ts +3 -5
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +30 -24
- package/dist/api/validator.js +1 -2
- package/dist/api/websocket-helpers.js +2 -3
- package/dist/auth/audit-log/builders.js +1 -2
- package/dist/auth/audit-log/client-ip.js +2 -3
- package/dist/auth/audit-log/events.js +1 -2
- package/dist/auth/audit-log/plugin.d.ts.map +1 -1
- package/dist/auth/audit-log/plugin.js +2 -3
- package/dist/auth/audit-log-ingestor.js +2 -3
- package/dist/auth/auth-generator.js +2 -3
- package/dist/auth/better-auth-entities.js +1 -2
- package/dist/auth/better-auth-request.js +2 -3
- package/dist/auth/index.js +2 -3
- package/dist/auth/knex-adapter.js +2 -3
- package/dist/auth/plugins/entity-definitions/admin.js +1 -2
- package/dist/auth/plugins/entity-definitions/anonymous.js +1 -2
- package/dist/auth/plugins/entity-definitions/api-key.js +1 -2
- package/dist/auth/plugins/entity-definitions/audit-log.js +1 -2
- package/dist/auth/plugins/entity-definitions/index.js +1 -2
- package/dist/auth/plugins/entity-definitions/jwt.js +1 -2
- package/dist/auth/plugins/entity-definitions/organization.js +1 -2
- package/dist/auth/plugins/entity-definitions/passkey.js +1 -2
- package/dist/auth/plugins/entity-definitions/phone-number.js +1 -2
- package/dist/auth/plugins/entity-definitions/sso.js +1 -2
- package/dist/auth/plugins/entity-definitions/two-factor.js +1 -2
- package/dist/auth/plugins/entity-definitions/username.js +1 -2
- package/dist/auth/plugins/wrappers/admin.d.ts +33 -32
- package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/admin.js +2 -3
- package/dist/auth/plugins/wrappers/anonymous.js +2 -3
- package/dist/auth/plugins/wrappers/api-key.js +2 -3
- package/dist/auth/plugins/wrappers/jwt.js +2 -3
- package/dist/auth/plugins/wrappers/organization.js +2 -3
- package/dist/auth/plugins/wrappers/passkey.js +2 -3
- package/dist/auth/plugins/wrappers/phone-number.d.ts +43 -1
- package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/phone-number.js +2 -3
- package/dist/auth/plugins/wrappers/sso.d.ts +138 -187
- package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/sso.js +1 -2
- package/dist/auth/plugins/wrappers/two-factor.d.ts +51 -10
- package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/two-factor.js +2 -3
- package/dist/auth/plugins/wrappers/username.d.ts +39 -5
- package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/username.js +2 -3
- package/dist/bin/build-config.js +5 -5
- package/dist/bin/compiler-policy.js +2 -3
- package/dist/bin/fixture.js +7 -5
- package/dist/bin/hmr-hook-register.js +1 -2
- package/dist/bin/migrate-targets.js +2 -3
- package/dist/bin/test-command.js +2 -3
- package/dist/bin/ts-loader-register.js +2 -3
- package/dist/bin/ts-loader-registration.js +2 -3
- package/dist/bin/typecheck-web.js +2 -3
- package/dist/cache/cache-manager.js +1 -2
- package/dist/cache/decorator.js +2 -3
- package/dist/cache/drivers.js +1 -2
- package/dist/cache/index.js +2 -3
- package/dist/cache-control/cache-control.js +1 -2
- package/dist/code-formatting/index.js +2 -3
- package/dist/code-formatting/oxfmt.js +2 -3
- package/dist/code-formatting/oxlint.js +2 -3
- package/dist/compress/compress.js +1 -2
- package/dist/compress/index.js +2 -2
- package/dist/compress/types.d.ts +1 -1
- package/dist/compress/types.d.ts.map +1 -1
- package/dist/cone/cone-generator.js +2 -3
- package/dist/database/_batch_update.js +1 -2
- package/dist/database/base-model.js +4 -4
- package/dist/database/db.js +4 -4
- package/dist/database/knex.js +2 -3
- package/dist/database/puri-wrapper.js +2 -3
- package/dist/database/puri.js +23 -22
- package/dist/database/puri.types.js +1 -2
- package/dist/database/transaction-context.js +1 -2
- package/dist/database/upsert-builder.js +2 -3
- package/dist/dict/en.js +2 -3
- package/dist/dict/index.js +3 -3
- package/dist/dict/ko.js +2 -3
- package/dist/dict/rc-keys.js +1 -2
- package/dist/dict/sd.js +2 -3
- package/dist/dict/sonamu-dictionary.js +7 -6
- package/dist/dict/utils.js +2 -3
- package/dist/entity/entity-manager.d.ts +66 -66
- package/dist/entity/entity-manager.js +4 -4
- package/dist/entity/entity-template-cone.js +2 -3
- package/dist/entity/entity.js +21 -18
- package/dist/env.js +1 -2
- package/dist/exceptions/error-handler.d.ts.map +1 -1
- package/dist/exceptions/error-handler.js +2 -3
- package/dist/exceptions/so-exceptions.js +2 -3
- package/dist/filter/index.js +3 -2
- package/dist/filter/types.js +1 -2
- package/dist/filter/utils.js +7 -6
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +42 -6
- package/dist/logger/category.js +2 -3
- package/dist/logger/configure.js +5 -5
- package/dist/migration/code-generation.js +23 -16
- package/dist/migration/index-where-predicate.js +2 -3
- package/dist/migration/migration-set.js +2 -3
- package/dist/migration/migrator.js +2 -3
- package/dist/migration/postgresql-schema-reader.js +6 -9
- package/dist/migration/slack-confirm.js +2 -3
- package/dist/naite/naite-reporter.js +2 -3
- package/dist/naite/naite.js +10 -8
- package/dist/runtime-type.js +2 -3
- package/dist/ssr/hmr-opt-out.js +1 -2
- package/dist/ssr/index.js +7 -4
- package/dist/ssr/registry.js +1 -2
- package/dist/ssr/renderer.js +2 -3
- package/dist/storage/base-file.js +1 -2
- package/dist/storage/buffered-file.js +2 -3
- package/dist/storage/drivers.js +1 -2
- package/dist/storage/index.js +2 -3
- package/dist/storage/s3-driver.js +1 -2
- package/dist/storage/storage-manager.js +2 -3
- package/dist/storage/uploaded-file.js +2 -3
- package/dist/stream/__tests__/ws-test-helpers.d.ts +108 -0
- package/dist/stream/__tests__/ws-test-helpers.d.ts.map +1 -0
- package/dist/stream/__tests__/ws-test-helpers.js +259 -0
- package/dist/stream/index.d.ts +1 -0
- package/dist/stream/index.d.ts.map +1 -1
- package/dist/stream/index.js +15 -4
- package/dist/stream/sse.js +1 -2
- package/dist/stream/ws-audience-resolver.d.ts +8 -5
- package/dist/stream/ws-audience-resolver.d.ts.map +1 -1
- package/dist/stream/ws-audience-resolver.js +17 -15
- package/dist/stream/ws-audience.js +1 -2
- package/dist/stream/ws-cluster-bus.d.ts +9 -4
- package/dist/stream/ws-cluster-bus.d.ts.map +1 -1
- package/dist/stream/ws-cluster-bus.js +2 -3
- package/dist/stream/ws-core.d.ts +10 -0
- package/dist/stream/ws-core.d.ts.map +1 -1
- package/dist/stream/ws-delivery.d.ts +30 -4
- package/dist/stream/ws-delivery.d.ts.map +1 -1
- package/dist/stream/ws-delivery.js +200 -54
- package/dist/stream/ws-frame.d.ts +15 -0
- package/dist/stream/ws-frame.d.ts.map +1 -0
- package/dist/stream/ws-frame.js +28 -0
- package/dist/stream/ws-local-connection-store.d.ts +4 -4
- package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
- package/dist/stream/ws-local-connection-store.js +3 -4
- package/dist/stream/ws-presence-index.d.ts +36 -0
- package/dist/stream/ws-presence-index.d.ts.map +1 -0
- package/dist/stream/ws-presence-index.js +176 -0
- package/dist/stream/ws-presence-store.d.ts +39 -39
- package/dist/stream/ws-presence-store.d.ts.map +1 -1
- package/dist/stream/ws-presence-store.js +23 -154
- package/dist/stream/ws-registry.d.ts +45 -17
- package/dist/stream/ws-registry.d.ts.map +1 -1
- package/dist/stream/ws-registry.js +170 -62
- package/dist/stream/ws-session-id.d.ts +14 -0
- package/dist/stream/ws-session-id.d.ts.map +1 -0
- package/dist/stream/ws-session-id.js +36 -0
- package/dist/stream/ws-telemetry-memory.js +3 -4
- package/dist/stream/ws-telemetry-trace.js +1 -2
- package/dist/stream/ws-telemetry.js +2 -3
- package/dist/stream/ws.d.ts +20 -10
- package/dist/stream/ws.d.ts.map +1 -1
- package/dist/stream/ws.js +60 -38
- package/dist/syncer/api-parser.js +2 -3
- package/dist/syncer/checksum.js +4 -4
- package/dist/syncer/code-generator.js +4 -4
- package/dist/syncer/entity-operations.js +2 -3
- package/dist/syncer/event-batcher.js +1 -2
- package/dist/syncer/file-copy.js +2 -3
- package/dist/syncer/file-patterns.js +2 -3
- package/dist/syncer/file-tracking.js +2 -3
- package/dist/syncer/filesystem-dependencies.js +1 -2
- package/dist/syncer/index.js +8 -2
- package/dist/syncer/module-loader.js +8 -6
- package/dist/syncer/syncer-actions.js +8 -7
- package/dist/syncer/syncer.js +13 -8
- package/dist/syncer/watcher.js +2 -3
- package/dist/tasks/decorator.js +1 -2
- package/dist/tasks/step-wrapper.js +2 -3
- package/dist/tasks/workflow-manager.js +2 -3
- package/dist/template/entity-converter.js +17 -16
- package/dist/template/helpers.js +2 -3
- package/dist/template/implementations/entity.template.js +2 -3
- package/dist/template/implementations/entry-server.template.js +2 -3
- package/dist/template/implementations/generated.template.js +2 -3
- package/dist/template/implementations/generated_http.template.js +6 -6
- package/dist/template/implementations/generated_sso.template.js +2 -3
- package/dist/template/implementations/http_validators.template.js +2 -3
- package/dist/template/implementations/init_types.template.js +2 -3
- package/dist/template/implementations/model.template.js +4 -4
- package/dist/template/implementations/model_test.template.js +2 -3
- package/dist/template/implementations/queries.template.js +2 -3
- package/dist/template/implementations/sd.template.js +2 -3
- package/dist/template/implementations/services.template.js +2 -3
- package/dist/template/implementations/view_form.template.js +12 -9
- package/dist/template/implementations/view_id_all_select.template.js +2 -3
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.js +19 -17
- package/dist/template/implementations/view_search_input.template.js +2 -3
- package/dist/template/index.js +9 -3
- package/dist/template/template-manager.js +2 -3
- package/dist/template/template-types.js +1 -2
- package/dist/template/template.js +2 -3
- package/dist/template/zod-converter.js +54 -47
- package/dist/testing/_relation-graph.js +2 -3
- package/dist/testing/bootstrap.js +2 -3
- package/dist/testing/data-explorer.js +2 -3
- package/dist/testing/dev-test-routes.js +2 -3
- package/dist/testing/dev-vitest-manager.js +15 -12
- package/dist/testing/faker-mappings.js +1 -2
- package/dist/testing/filesystem.js +2 -3
- package/dist/testing/fixture-generator.js +2 -3
- package/dist/testing/fixture-loader.js +1 -2
- package/dist/testing/fixture-manager.js +12 -9
- package/dist/testing/global-setup.js +5 -5
- package/dist/testing/index.js +6 -3
- package/dist/testing/naite-vitest-reporter.js +1 -2
- package/dist/testing/parallel-db-manager.js +2 -3
- package/dist/testing/vitest-helpers.js +2 -3
- package/dist/tooling/__tests__/helpers/sonamu-test-root.js +2 -3
- package/dist/tooling/cdd-service.js +1 -2
- package/dist/tooling/cli-tooling.js +1 -2
- package/dist/tooling/fixture-service.js +1 -2
- package/dist/tooling/index.js +1 -2
- package/dist/tooling/test-run-client.js +2 -3
- package/dist/tsdown.api.config.js +1 -2
- package/dist/types/types.js +2 -3
- package/dist/ui/ai-api.d.ts.map +1 -1
- package/dist/ui/ai-api.js +4 -5
- package/dist/ui/ai-client.d.ts +2 -2
- package/dist/ui/ai-client.d.ts.map +1 -1
- package/dist/ui/ai-client.js +9 -8
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +11 -8
- package/dist/ui/async-route.js +1 -2
- package/dist/ui/cdd-service.js +22 -21
- package/dist/ui/migrations-api.js +6 -5
- package/dist/ui-web/assets/index-QDMyy31K.js +180 -0
- package/dist/ui-web/assets/index-dV7akMFB.css +1 -0
- package/dist/ui-web/index.html +2 -2
- package/dist/utils/async-utils.js +1 -2
- package/dist/utils/class-name.js +1 -2
- package/dist/utils/console-util.js +1 -2
- package/dist/utils/controller.js +2 -3
- package/dist/utils/esm-utils.js +1 -2
- package/dist/utils/fs-utils.js +2 -3
- package/dist/utils/lodash-able.js +1 -2
- package/dist/utils/model.js +1 -2
- package/dist/utils/object-utils.js +2 -3
- package/dist/utils/path-utils.js +2 -3
- package/dist/utils/process-utils.js +2 -3
- package/dist/utils/runtime-value.js +1 -2
- package/dist/utils/sql-parser.js +2 -3
- package/dist/utils/type-utils.js +8 -8
- package/dist/utils/utils.js +2 -3
- package/dist/utils/zod-error.js +2 -3
- package/dist/vector/chunking.js +1 -2
- package/dist/vector/config.js +1 -2
- package/dist/vector/embedding.js +4 -4
- package/package.json +63 -63
- package/src/ai/agents/agent.ts +1 -1
- package/src/api/__tests__/sonamu.plugins.test.ts +11 -1
- package/src/api/__tests__/sonamu.websocket-routes.test.ts +234 -0
- package/src/api/__tests__/sonamu.websocket.test.ts +241 -24
- package/src/api/config.ts +1 -1
- package/src/api/context.ts +2 -8
- package/src/api/sonamu.ts +46 -28
- package/src/auth/audit-log/plugin.ts +2 -0
- package/src/compress/types.ts +1 -1
- package/src/exceptions/error-handler.ts +3 -2
- package/src/index.ts +1 -0
- package/src/stream/__tests__/ws-contracts.test.ts +483 -265
- package/src/stream/__tests__/ws-multinode.test.ts +326 -0
- package/src/stream/__tests__/ws-registry-async.test.ts +855 -0
- package/src/stream/__tests__/ws-test-helpers.ts +360 -0
- package/src/stream/__tests__/ws.test.ts +342 -145
- package/src/stream/index.ts +1 -0
- package/src/stream/ws-audience-resolver.ts +21 -19
- package/src/stream/ws-cluster-bus.ts +12 -4
- package/src/stream/ws-core.ts +14 -0
- package/src/stream/ws-delivery.ts +321 -97
- package/src/stream/ws-frame.ts +39 -0
- package/src/stream/ws-local-connection-store.ts +10 -9
- package/src/stream/ws-presence-index.ts +273 -0
- package/src/stream/ws-presence-store.ts +64 -284
- package/src/stream/ws-registry.ts +272 -85
- package/src/stream/ws-session-id.ts +39 -0
- package/src/stream/ws.ts +91 -50
- package/src/template/implementations/model.template.ts +3 -3
- package/src/template/implementations/view_list.template.ts +12 -13
- package/src/ui/ai-api.ts +4 -2
- package/src/ui/ai-client.ts +2 -2
- package/src/ui/api.ts +58 -62
- package/dist/ui-web/assets/index-BMdIyKXS.css +0 -1
- package/dist/ui-web/assets/index-LpE8u19O.js +0 -178
|
@@ -2,7 +2,7 @@ import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
|
2
2
|
import { init_runtime_value, isNumberValue, isObjectValue, isStringValue } from "../utils/runtime-value.js";
|
|
3
3
|
import { init_runtime_type, isBooleanValue } from "../runtime-type.js";
|
|
4
4
|
import SqlParser from "node-sql-parser";
|
|
5
|
-
|
|
5
|
+
// src/migration/index-where-predicate.ts
|
|
6
6
|
function parseSqlAstValue(value) {
|
|
7
7
|
if (value === null) return null;
|
|
8
8
|
if (value === void 0) return void 0;
|
|
@@ -220,8 +220,7 @@ var init_index_where_predicate = __esmMin((() => {
|
|
|
220
220
|
init_runtime_value();
|
|
221
221
|
INDEX_WHERE_SQL_PARSER = new SqlParser.Parser();
|
|
222
222
|
}));
|
|
223
|
-
//#endregion
|
|
224
223
|
init_index_where_predicate();
|
|
225
224
|
export { init_index_where_predicate, normalizeIndexWherePredicate, normalizeIndexWherePredicateForComparison };
|
|
226
225
|
|
|
227
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgtd2hlcmUtcHJlZGljYXRlLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vaW5kZXgtd2hlcmUtcHJlZGljYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTcWxQYXJzZXIgZnJvbSBcIm5vZGUtc3FsLXBhcnNlclwiO1xuXG5pbXBvcnQgeyBpc0Jvb2xlYW5WYWx1ZSB9IGZyb20gXCIuLi9ydW50aW1lLXR5cGVcIjtcbmltcG9ydCB7IGlzTnVtYmVyVmFsdWUsIGlzT2JqZWN0VmFsdWUsIGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuXG5jb25zdCBJTkRFWF9XSEVSRV9TUUxfUEFSU0VSID0gbmV3IFNxbFBhcnNlci5QYXJzZXIoKTtcblxudHlwZSBTcWxBc3RWYWx1ZSA9IG51bGwgfCB1bmRlZmluZWQgfCBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nIHwgU3FsQXN0VmFsdWVbXSB8IFNxbEFzdFJlY29yZDtcbmludGVyZmFjZSBTcWxBc3RSZWNvcmQge1xuICBba2V5OiBzdHJpbmddOiBTcWxBc3RWYWx1ZTtcbn1cblxuZnVuY3Rpb24gcGFyc2VTcWxBc3RWYWx1ZTxWYWx1ZT4odmFsdWU6IFZhbHVlKTogU3FsQXN0VmFsdWUge1xuICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiBudWxsO1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGlzQm9vbGVhblZhbHVlKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICBpZiAoaXNOdW1iZXJWYWx1ZSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgaWYgKGlzU3RyaW5nVmFsdWUodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5tYXAocGFyc2VTcWxBc3RWYWx1ZSk7XG4gIH1cbiAgaWYgKGlzT2JqZWN0VmFsdWUodmFsdWUpKSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlKS5tYXAoKFtrZXksIGNoaWxkXSkgPT4gW2tleSwgcGFyc2VTcWxBc3RWYWx1ZShjaGlsZCldKSxcbiAgICApO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcIuyngOybkO2VmOyngCDslYrripQgU1FMIEFTVCDqsJLsnoXri4jri6RcIik7XG59XG5cbi8qKlxuICogTWlncmF0aW9uIERETCDstpzroKXsl5Ag7IKs7Jqp7ZWgIGluZGV4IHByZWRpY2F0ZeulvCDsoJXrpqztlZzri6QuXG4gKiDsm5Drs7ggU1FMIO2RnO2YhOydgCDrs7TsobTtlZjqs6AsIOu5iCDrrLjsnpDsl7Tqs7wg7KCE7LK066W8IOqwkOyLvCDqtITtmLjrp4wg7KCc6rGw7ZWc64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplSW5kZXhXaGVyZVByZWRpY2F0ZSh3aGVyZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF3aGVyZSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyDstpzroKUg6rK966Gc7JeQ7ISc64qUIOyCrOyaqeyekOqwgCDsnpHshLHtlZwgcHJlZGljYXRl66W8IOy1nOuMgO2VnCDqt7jrjIDroZwg7Jyg7KeA7ZWc64ukLlxuICBjb25zdCB0cmltbWVkID0gcmVtb3ZlT3V0ZXJTcWxQYXJlbnRoZXNlcyh3aGVyZS50cmltKCkpO1xuICBpZiAodHJpbW1lZC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHRyaW1tZWQ7XG59XG5cbi8qKlxuICogSW5kZXggZGlmZiDruYTqtZDsl5Ag7IKs7Jqp7ZWgIHByZWRpY2F0ZSBpZGVudGl0eeulvCDrp4zrk6Dri6QuXG4gKiBQb3N0Z3JlU1FMIGNhbm9uaWNhbCDtkZztmIQg7LCo7J2064qUIEFTVCDquLDrsJgg7KCV6rec7ZmU66GcIO2doeyImO2VnOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUluZGV4V2hlcmVQcmVkaWNhdGVGb3JDb21wYXJpc29uKFxuICB3aGVyZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZUluZGV4V2hlcmVQcmVkaWNhdGUod2hlcmUpO1xuICBpZiAoIW5vcm1hbGl6ZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8g7YyM7IuxIOqwgOuKpe2VnCBwcmVkaWNhdGXrp4wgY2Fub25pY2FsIGZvcm3snLzroZwg67CU6r646rOgLCDsi6TtjKjtlZjrqbQg6riw7KG0IHN0cmljdCDruYTqtZDrpbwg7Jyg7KeA7ZWc64ukLlxuICByZXR1cm4gbm9ybWFsaXplSW5kZXhXaGVyZVByZWRpY2F0ZUJ5QXN0KG5vcm1hbGl6ZWQpID8/IG5vcm1hbGl6ZWQ7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU91dGVyU3FsUGFyZW50aGVzZXMoc291cmNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgdHJpbW1lZCA9IHNvdXJjZS50cmltKCk7XG5cbiAgLy8g7KCE7LK0IHByZWRpY2F0ZeulvCDqsJDsi7wg6rSE7Zi466eMIOygnOqxsO2VmOqzoCDrgrTrtoAgZ3JvdXBpbmfsnYAg6rG065Oc66as7KeAIOyViuuKlOuLpC5cbiAgd2hpbGUgKHRyaW1tZWQuc3RhcnRzV2l0aChcIihcIikgJiYgdHJpbW1lZC5lbmRzV2l0aChcIilcIikpIHtcbiAgICBjb25zdCBjbG9zZUluZGV4ID0gZmluZE1hdGNoaW5nUGFyZW50aGVzaXNJblNxbCh0cmltbWVkLCAwKTtcbiAgICBpZiAoY2xvc2VJbmRleCA9PT0gdHJpbW1lZC5sZW5ndGggLSAxKSB7XG4gICAgICB0cmltbWVkID0gdHJpbW1lZC5zbGljZSgxLCAtMSkudHJpbSgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gdHJpbW1lZDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSW5kZXhXaGVyZVByZWRpY2F0ZUJ5QXN0KHdoZXJlOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIC8vIG5vZGUtc3FsLXBhcnNlcuuKlCByYXcgcHJlZGljYXRl66W8IOyngeygkSDtjIzsi7HtlZjsp4Ag7JWK7Jy866+A66GcIOyehOyLnCBTRUxFQ1QgV0hFUkXroZwg6rCQ7Iu864ukLlxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlU3FsQXN0VmFsdWUoXG4gICAgICBJTkRFWF9XSEVSRV9TUUxfUEFSU0VSLmFzdGlmeShcbiAgICAgICAgYFNFTEVDVCAqIEZST00gX19zb25hbXVfaW5kZXhfcHJlZGljYXRlX3NvdXJjZSBXSEVSRSAke3doZXJlfWAsXG4gICAgICAgIHsgZGF0YWJhc2U6IFwicG9zdGdyZXNxbFwiIH0sXG4gICAgICApLFxuICAgICk7XG4gICAgY29uc3Qgc3RhdGVtZW50ID0gQXJyYXkuaXNBcnJheShwYXJzZWQpID8gcGFyc2VkWzBdIDogcGFyc2VkO1xuICAgIGlmICghaXNTcWxBc3RSZWNvcmQoc3RhdGVtZW50KSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VyaWFsaXplSW5kZXhXaGVyZUFzdChzdGF0ZW1lbnQud2hlcmUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZUluZGV4V2hlcmVBc3Qobm9kZTogU3FsQXN0VmFsdWUpOiBzdHJpbmcge1xuICAvLyBQb3N0Z3JlU1FM7J20IElO7J2EIEFOWShBUlJBWVsuLi5dKeuhnCDsnqzsnpHshLHtlZjrr4DroZwgbWVtYmVyc2hpcOydgCDrqLzsoIAg7Yq57IiYIOyymOumrO2VnOuLpC5cbiAgY29uc3QgbWVtYmVyc2hpcCA9IHNlcmlhbGl6ZVNxbE1lbWJlcnNoaXBQcmVkaWNhdGUobm9kZSk7XG4gIGlmIChtZW1iZXJzaGlwKSB7XG4gICAgcmV0dXJuIG1lbWJlcnNoaXA7XG4gIH1cblxuICBpZiAoIWlzU3FsQXN0UmVjb3JkKG5vZGUpKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG5vZGUpO1xuICB9XG5cbiAgY29uc3QgdHlwZSA9IGdldFNxbEFzdFN0cmluZyhub2RlLCBcInR5cGVcIik7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJiaW5hcnlfZXhwclwiOiB7XG4gICAgICBjb25zdCBvcGVyYXRvciA9IG5vcm1hbGl6ZVNxbE9wZXJhdG9yKGdldFNxbEFzdFN0cmluZyhub2RlLCBcIm9wZXJhdG9yXCIpKTtcbiAgICAgIGNvbnN0IGxlZnQgPSBzZXJpYWxpemVJbmRleFdoZXJlQXN0KG5vZGUubGVmdCk7XG4gICAgICBjb25zdCByaWdodCA9IHNlcmlhbGl6ZUluZGV4V2hlcmVBc3Qobm9kZS5yaWdodCk7XG4gICAgICBpZiAob3BlcmF0b3IgPT09IFwiQU5EXCIgfHwgb3BlcmF0b3IgPT09IFwiT1JcIikge1xuICAgICAgICAvLyBBTkQvT1LripQg7Iic7ISc6rCAIGRpZmYg7J2Y66+466W8IOuwlOq+uOyngCDslYrsnLzrr4DroZwgc3RhYmxlIGlkZW50aXR566GcIOygleugrO2VnOuLpC5cbiAgICAgICAgcmV0dXJuIGAoJHtbbGVmdCwgcmlnaHRdLnRvU29ydGVkKCkuam9pbihgICR7b3BlcmF0b3J9IGApfSlgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAoJHtsZWZ0fSAke29wZXJhdG9yfSAke3JpZ2h0fSlgO1xuICAgIH1cbiAgICBjYXNlIFwidW5hcnlfZXhwclwiOiB7XG4gICAgICBjb25zdCBvcGVyYXRvciA9IG5vcm1hbGl6ZVNxbE9wZXJhdG9yKGdldFNxbEFzdFN0cmluZyhub2RlLCBcIm9wZXJhdG9yXCIpKTtcbiAgICAgIHJldHVybiBgKCR7b3BlcmF0b3J9ICR7c2VyaWFsaXplSW5kZXhXaGVyZUFzdChub2RlLmV4cHIpfSlgO1xuICAgIH1cbiAgICBjYXNlIFwiY29sdW1uX3JlZlwiOiB7XG4gICAgICByZXR1cm4gc2VyaWFsaXplU3FsQ29sdW1uUmVmKG5vZGUpO1xuICAgIH1cbiAgICBjYXNlIFwic2luZ2xlX3F1b3RlX3N0cmluZ1wiOiB7XG4gICAgICByZXR1cm4gYHN0cmluZzoke0pTT04uc3RyaW5naWZ5KGdldFNxbEFzdFN0cmluZyhub2RlLCBcInZhbHVlXCIpKX1gO1xuICAgIH1cbiAgICBjYXNlIFwibnVtYmVyXCI6IHtcbiAgICAgIHJldHVybiBgbnVtYmVyOiR7U3RyaW5nKG5vZGUudmFsdWUpfWA7XG4gICAgfVxuICAgIGNhc2UgXCJib29sXCI6IHtcbiAgICAgIHJldHVybiBgYm9vbDoke1N0cmluZyhub2RlLnZhbHVlKS50b0xvd2VyQ2FzZSgpfWA7XG4gICAgfVxuICAgIGNhc2UgXCJudWxsXCI6IHtcbiAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICB9XG4gICAgY2FzZSBcImNhc3RcIjoge1xuICAgICAgY29uc3QgdGFyZ2V0VHlwZSA9IGdldFNxbENhc3RUYXJnZXRUeXBlKG5vZGUpO1xuICAgICAgY29uc3QgZXhwciA9IG5vZGUuZXhwcjtcbiAgICAgIGlmICh0YXJnZXRUeXBlICYmIGlzVGV4dExpa2VTcWxUeXBlKHRhcmdldFR5cGUpICYmIGlzU3FsU3RyaW5nTGl0ZXJhbExpa2UoZXhwcikpIHtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZUluZGV4V2hlcmVBc3Qoc3RyaXBUZXh0TGlrZVNxbENhc3QoZXhwcikpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGBjYXN0KCR7c2VyaWFsaXplSW5kZXhXaGVyZUFzdChleHByKX0gYXMgJHt0YXJnZXRUeXBlID8/IFwidW5rbm93blwifSlgO1xuICAgIH1cbiAgICBjYXNlIFwiZnVuY3Rpb25cIjoge1xuICAgICAgcmV0dXJuIGBmbjoke2dldFNxbEZ1bmN0aW9uTmFtZShub2RlKX0oJHtzZXJpYWxpemVTcWxFeHByTGlzdChub2RlLmFyZ3MpLmpvaW4oXCIsXCIpfSlgO1xuICAgIH1cbiAgICBjYXNlIFwiYXJyYXlcIjoge1xuICAgICAgcmV0dXJuIGBhcnJheTpbJHtzZXJpYWxpemVTcWxBcnJheUVsZW1lbnRzKG5vZGUpLm1hcChzZXJpYWxpemVJbmRleFdoZXJlQXN0KS5qb2luKFwiLFwiKX1dYDtcbiAgICB9XG4gICAgY2FzZSBcImV4cHJfbGlzdFwiOiB7XG4gICAgICByZXR1cm4gYGxpc3Q6WyR7c2VyaWFsaXplU3FsRXhwckxpc3Qobm9kZSkubWFwKHNlcmlhbGl6ZUluZGV4V2hlcmVBc3QpLmpvaW4oXCIsXCIpfV1gO1xuICAgIH1cbiAgICBjYXNlIFwiZGVmYXVsdFwiOiB7XG4gICAgICByZXR1cm4gYGlkZW50OiR7bm9ybWFsaXplU3FsSWRlbnRpZmllcihnZXRTcWxBc3RTdHJpbmcobm9kZSwgXCJ2YWx1ZVwiKSA/PyBcIlwiKX1gO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gc2VyaWFsaXplVW5rbm93blNxbEFzdFJlY29yZChub2RlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplU3FsTWVtYmVyc2hpcFByZWRpY2F0ZShub2RlOiBTcWxBc3RWYWx1ZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghaXNTcWxBc3RSZWNvcmQobm9kZSkgfHwgZ2V0U3FsQXN0U3RyaW5nKG5vZGUsIFwidHlwZVwiKSAhPT0gXCJiaW5hcnlfZXhwclwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIElOICguLi4p6rO8ID0gQU5ZKEFSUkFZWy4uLl0p66W8IOuPmeydvO2VnCB1bm9yZGVyZWQgbWVtYmVyc2hpcCDtkZztmITsnLzroZwg66ee7LaY64ukLlxuICBjb25zdCBvcGVyYXRvciA9IG5vcm1hbGl6ZVNxbE9wZXJhdG9yKGdldFNxbEFzdFN0cmluZyhub2RlLCBcIm9wZXJhdG9yXCIpKTtcbiAgY29uc3QgbGVmdCA9IHNlcmlhbGl6ZUluZGV4V2hlcmVBc3Qoc3RyaXBUZXh0TGlrZVNxbENhc3Qobm9kZS5sZWZ0KSk7XG4gIGNvbnN0IHZhbHVlcyA9ICgoKSA9PiB7XG4gICAgaWYgKG9wZXJhdG9yID09PSBcIklOXCIpIHtcbiAgICAgIHJldHVybiBzZXJpYWxpemVTcWxNZW1iZXJzaGlwVmFsdWVzKHNlcmlhbGl6ZVNxbEV4cHJMaXN0KG5vZGUucmlnaHQpKTtcbiAgICB9XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IFwiPVwiKSB7XG4gICAgICByZXR1cm4gc2VyaWFsaXplU3FsTWVtYmVyc2hpcFZhbHVlcyhnZXRTcWxBbnlBcnJheUVsZW1lbnRzKG5vZGUucmlnaHQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9KSgpO1xuXG4gIGlmICghdmFsdWVzKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBgbWVtYmVyc2hpcDoke2xlZnR9OmluOlske3ZhbHVlcy5qb2luKFwiLFwiKX1dYDtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplU3FsTWVtYmVyc2hpcFZhbHVlcyh2YWx1ZXM6IFNxbEFzdFZhbHVlW10gfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIGlmICghdmFsdWVzKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIG1lbWJlcnNoaXAg6rCS7J2YIOyInOyEnOyZgCDspJHrs7XsnYAg7J2Y66+46rCAIOyXhuycvOuvgOuhnCDslYjsoJXsoIHsnbggaWRlbnRpdHnroZwg7KCV66Cs7ZWc64ukLlxuICBjb25zdCBzZXJpYWxpemVkID0gdmFsdWVzLm1hcCgodmFsdWUpID0+IHNlcmlhbGl6ZUluZGV4V2hlcmVBc3Qoc3RyaXBUZXh0TGlrZVNxbENhc3QodmFsdWUpKSk7XG4gIHJldHVybiBbLi4ubmV3IFNldChzZXJpYWxpemVkKV0udG9Tb3J0ZWQoKTtcbn1cblxuZnVuY3Rpb24gZ2V0U3FsQW55QXJyYXlFbGVtZW50cyhub2RlOiBTcWxBc3RWYWx1ZSk6IFNxbEFzdFZhbHVlW10gfCB1bmRlZmluZWQge1xuICBpZiAoIWlzU3FsQXN0UmVjb3JkKG5vZGUpIHx8IGdldFNxbEFzdFN0cmluZyhub2RlLCBcInR5cGVcIikgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKGdldFNxbEZ1bmN0aW9uTmFtZShub2RlKSAhPT0gXCJhbnlcIikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBBTlkoKeydmCDssqsg67KI7Ke4IOyduOyekOunjCBQb3N0Z3JlU1FMIOuwsOyXtCBtZW1iZXJzaGlwIOuMgOyDgeycvOuhnCDtlbTshJ3tlZzri6QuXG4gIGNvbnN0IFthcmddID0gc2VyaWFsaXplU3FsRXhwckxpc3Qobm9kZS5hcmdzKTtcbiAgaWYgKCFhcmcpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHNlcmlhbGl6ZVNxbEFycmF5RWxlbWVudHMoc3RyaXBUZXh0TGlrZVNxbENhc3QoYXJnKSk7XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVNxbEFycmF5RWxlbWVudHMobm9kZTogU3FsQXN0VmFsdWUpOiBTcWxBc3RWYWx1ZVtdIHtcbiAgaWYgKCFpc1NxbEFzdFJlY29yZChub2RlKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8vIHBhcnNlciDrsoTsoITsl5Ag65Sw6528IOuwsOyXtCDsm5DshozqsIAgYXJyYXkuZXhwcl9saXN0IOuYkOuKlCBleHByX2xpc3TroZwg65Ok7Ja07Jio64ukLlxuICBpZiAoZ2V0U3FsQXN0U3RyaW5nKG5vZGUsIFwidHlwZVwiKSA9PT0gXCJhcnJheVwiKSB7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZVNxbEV4cHJMaXN0KG5vZGUuZXhwcl9saXN0KTtcbiAgfVxuXG4gIHJldHVybiBzZXJpYWxpemVTcWxFeHByTGlzdChub2RlKTtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplU3FsRXhwckxpc3Qobm9kZTogU3FsQXN0VmFsdWUpOiBTcWxBc3RWYWx1ZVtdIHtcbiAgaWYgKCFpc1NxbEFzdFJlY29yZChub2RlKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8vIGV4cHJfbGlzdOuKlCDsi6TsoJwgQVNUIOuFuOuTnCDrsLDsl7TsnbTqs6AsIOuLqOydvCDtkZztmITsi53snYAg67Cw7Je0IO2VmOuCmOuhnCDqsJDsi7gg7Ya17J287ZWc64ukLlxuICBpZiAoZ2V0U3FsQXN0U3RyaW5nKG5vZGUsIFwidHlwZVwiKSA9PT0gXCJleHByX2xpc3RcIiAmJiBBcnJheS5pc0FycmF5KG5vZGUudmFsdWUpKSB7XG4gICAgcmV0dXJuIG5vZGUudmFsdWU7XG4gIH1cblxuICByZXR1cm4gW25vZGVdO1xufVxuXG5mdW5jdGlvbiBzdHJpcFRleHRMaWtlU3FsQ2FzdChub2RlOiBTcWxBc3RWYWx1ZSk6IFNxbEFzdFZhbHVlIHtcbiAgaWYgKCFpc1NxbEFzdFJlY29yZChub2RlKSB8fCBnZXRTcWxBc3RTdHJpbmcobm9kZSwgXCJ0eXBlXCIpICE9PSBcImNhc3RcIikge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgLy8gUG9zdGdyZVNRTOydgCB2YXJjaGFyL3RleHQgY2FzdOulvCDrsLDsl7Qg65iQ64qUIOybkOyGjCDsqr3snLzroZwg7Jiu6ri4IOyImCDsnojslrQg67mE6rWQ7JeQ7IScIOygnOqxsO2VnOuLpC5cbiAgY29uc3QgdGFyZ2V0VHlwZSA9IGdldFNxbENhc3RUYXJnZXRUeXBlKG5vZGUpO1xuICBpZiAoIXRhcmdldFR5cGUgfHwgIWlzVGV4dExpa2VTcWxUeXBlKHRhcmdldFR5cGUpKSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICByZXR1cm4gc3RyaXBUZXh0TGlrZVNxbENhc3Qobm9kZS5leHByKTtcbn1cblxuZnVuY3Rpb24gaXNTcWxTdHJpbmdMaXRlcmFsTGlrZShub2RlOiBTcWxBc3RWYWx1ZSk6IGJvb2xlYW4ge1xuICAvLyDrrLjsnpDsl7QgbGl0ZXJhbOyXkCDrtpnsnYAgdGV4dCDqs4Tsl7QgY2FzdOuKlCBtZW1iZXJzaGlwIOu5hOq1kOyXkOyEnCDsnZjrr7jqsIAg6rCZ64ukLlxuICBjb25zdCBzdHJpcHBlZCA9IHN0cmlwVGV4dExpa2VTcWxDYXN0KG5vZGUpO1xuICByZXR1cm4gaXNTcWxBc3RSZWNvcmQoc3RyaXBwZWQpICYmIGdldFNxbEFzdFN0cmluZyhzdHJpcHBlZCwgXCJ0eXBlXCIpID09PSBcInNpbmdsZV9xdW90ZV9zdHJpbmdcIjtcbn1cblxuZnVuY3Rpb24gZ2V0U3FsQ2FzdFRhcmdldFR5cGUobm9kZTogU3FsQXN0UmVjb3JkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KG5vZGUudGFyZ2V0KSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBjaGFyYWN0ZXIgdmFyeWluZ+yymOufvCDsl6zrn6wgdG9rZW7snLzroZwg7Jik64qUIO2DgOyeheuqheydhCDtlZjrgpjsnZgg7KCV6rec7ZmUIOusuOyekOyXtOuhnCDtlansuZzri6QuXG4gIGNvbnN0IGRhdGFUeXBlcyA9IG5vZGUudGFyZ2V0XG4gICAgLm1hcCgodGFyZ2V0KSA9PiAoaXNTcWxBc3RSZWNvcmQodGFyZ2V0KSA/IGdldFNxbEFzdFN0cmluZyh0YXJnZXQsIFwiZGF0YVR5cGVcIikgOiB1bmRlZmluZWQpKVxuICAgIC5maWx0ZXIoKGRhdGFUeXBlKTogZGF0YVR5cGUgaXMgc3RyaW5nID0+IGRhdGFUeXBlICE9PSB1bmRlZmluZWQpO1xuXG4gIGlmIChkYXRhVHlwZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVTcWxEYXRhVHlwZShkYXRhVHlwZXMuam9pbihcIiBcIikpO1xufVxuXG5mdW5jdGlvbiBpc1RleHRMaWtlU3FsVHlwZSh0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8g67Cw7Je0IGNhc3QodGV4dFtdKeuPhCDsm5DshowgbWVtYmVyc2hpcCDruYTqtZDsl5DshJzripQgdGV4dCDqs4Tsl7QgY2FzdOuhnCDst6jquIntlZzri6QuXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVTcWxEYXRhVHlwZSh0eXBlKS5yZXBsYWNlKC9cXFtcXF0kL2csIFwiXCIpO1xuICByZXR1cm4gbm9ybWFsaXplZCA9PT0gXCJ0ZXh0XCIgfHwgbm9ybWFsaXplZCA9PT0gXCJ2YXJjaGFyXCI7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNxbERhdGFUeXBlKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlXG4gICAgLnRyaW0oKVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoL1xccysvZywgXCIgXCIpXG4gICAgLnJlcGxhY2UoL15jaGFyYWN0ZXIgdmFyeWluZyQvLCBcInZhcmNoYXJcIik7XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVNxbENvbHVtblJlZihub2RlOiBTcWxBc3RSZWNvcmQpOiBzdHJpbmcge1xuICBjb25zdCB0YWJsZSA9IHNlcmlhbGl6ZVNxbElkZW50aWZpZXJOb2RlKG5vZGUudGFibGUpO1xuICBjb25zdCBjb2x1bW4gPSBzZXJpYWxpemVTcWxJZGVudGlmaWVyTm9kZShub2RlLmNvbHVtbik7XG4gIHJldHVybiBgY29sdW1uOiR7dGFibGUgPyBgJHt0YWJsZX0uYCA6IFwiXCJ9JHtjb2x1bW59YDtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplU3FsSWRlbnRpZmllck5vZGUobm9kZTogU3FsQXN0VmFsdWUpOiBzdHJpbmcge1xuICBpZiAoaXNTdHJpbmdWYWx1ZShub2RlKSkge1xuICAgIHJldHVybiBub3JtYWxpemVTcWxJZGVudGlmaWVyKG5vZGUpO1xuICB9XG5cbiAgLy8gcXVvdGVkIGlkZW50aWZpZXLsmYAgZnVuY3Rpb24gbmFtZeydmCBBU1Qgc2hhcGUg7LCo7J2066W8IOqwmeydgCBpZGVudGlmaWVyIOusuOyekOyXtOuhnCDtnaHsiJjtlZzri6QuXG4gIGlmIChpc1NxbEFzdFJlY29yZChub2RlKSkge1xuICAgIGlmIChpc1N0cmluZ1ZhbHVlKG5vZGUudmFsdWUpKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplU3FsSWRlbnRpZmllcihub2RlLnZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoaXNTcWxBc3RSZWNvcmQobm9kZS5leHByKSAmJiBpc1N0cmluZ1ZhbHVlKG5vZGUuZXhwci52YWx1ZSkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVTcWxJZGVudGlmaWVyKG5vZGUuZXhwci52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFwiXCI7XG59XG5cbmZ1bmN0aW9uIGdldFNxbEZ1bmN0aW9uTmFtZShub2RlOiBTcWxBc3RSZWNvcmQpOiBzdHJpbmcge1xuICBjb25zdCBuYW1lID0gbm9kZS5uYW1lO1xuICBpZiAoaXNTdHJpbmdWYWx1ZShuYW1lKSkge1xuICAgIHJldHVybiBub3JtYWxpemVTcWxJZGVudGlmaWVyKG5hbWUpO1xuICB9XG5cbiAgLy8gQU5Z7LKY65+8IG5hbWUubmFtZSDrsLDsl7TroZwg7Jik64qUIGZ1bmN0aW9uIEFTVOulvCBzY2hlbWEtcXVhbGlmaWVkIOydtOumhOq5jOyngCDsp4Dsm5DtlZzri6QuXG4gIGlmIChpc1NxbEFzdFJlY29yZChuYW1lKSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG5hbWUubmFtZSkpIHtcbiAgICAgIHJldHVybiBuYW1lLm5hbWUubWFwKHNlcmlhbGl6ZVNxbElkZW50aWZpZXJOb2RlKS5qb2luKFwiLlwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBuYW1lUGFydHMgPSBzZXJpYWxpemVTcWxFeHByTGlzdChuYW1lKTtcbiAgICBpZiAobmFtZVBhcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBuYW1lUGFydHMubWFwKHNlcmlhbGl6ZVNxbElkZW50aWZpZXJOb2RlKS5qb2luKFwiLlwiKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gXCJcIjtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3FsSWRlbnRpZmllcihpZGVudGlmaWVyOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gaWRlbnRpZmllci50cmltKCkudG9Mb3dlckNhc2UoKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3FsT3BlcmF0b3Iob3BlcmF0b3I6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiAob3BlcmF0b3IgPz8gXCJcIikudHJpbSgpLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCBcIiBcIik7XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVVua25vd25TcWxBc3RSZWNvcmQobm9kZTogU3FsQXN0UmVjb3JkKTogc3RyaW5nIHtcbiAgLy8g7JWE7KeBIOuqheyLnOyggeycvOuhnCDri6Tro6jsp4Ag7JWK64qUIEFTVCDrhbjrk5zripQga2V5IOygleugrOuhnCDstZzshoztlZwg7JWI7KCV7KCB7J24IOu5hOq1kOqwkuydhCDrp4zrk6Dri6QuXG4gIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhub2RlKVxuICAgIC5maWx0ZXIoKFtrZXldKSA9PiBrZXkgIT09IFwicGFyZW50aGVzZXNcIilcbiAgICAudG9Tb3J0ZWQoKFtsZWZ0XSwgW3JpZ2h0XSkgPT4gbGVmdC5sb2NhbGVDb21wYXJlKHJpZ2h0KSlcbiAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2tleX06JHtzZXJpYWxpemVJbmRleFdoZXJlQXN0KHZhbHVlKX1gKTtcblxuICByZXR1cm4gYHJlY29yZDp7JHtlbnRyaWVzLmpvaW4oXCIsXCIpfX1gO1xufVxuXG5mdW5jdGlvbiBpc1NxbEFzdFJlY29yZCh2YWx1ZTogU3FsQXN0VmFsdWUpOiB2YWx1ZSBpcyBTcWxBc3RSZWNvcmQge1xuICByZXR1cm4gaXNPYmplY3RWYWx1ZSh2YWx1ZSkgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBnZXRTcWxBc3RTdHJpbmcobm9kZTogU3FsQXN0UmVjb3JkLCBrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gbm9kZVtrZXldO1xuICByZXR1cm4gaXNTdHJpbmdWYWx1ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZmluZE1hdGNoaW5nUGFyZW50aGVzaXNJblNxbChzb3VyY2U6IHN0cmluZywgb3BlbkluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgZGVwdGggPSAwO1xuICBsZXQgaW5TaW5nbGVRdW90ZSA9IGZhbHNlO1xuICBsZXQgaW5Eb3VibGVRdW90ZSA9IGZhbHNlO1xuXG4gIC8vIFNRTCDrrLjsnpDsl7Tqs7wgcXVvdGVkIGlkZW50aWZpZXIg64K067aAIOq0hO2YuOuKlCBncm91cGluZyDqtITtmLjroZwg7IS47KeAIOyViuuKlOuLpC5cbiAgZm9yIChsZXQgaW5kZXggPSBvcGVuSW5kZXg7IGluZGV4IDwgc291cmNlLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGNvbnN0IGNoYXIgPSBzb3VyY2VbaW5kZXhdO1xuICAgIGNvbnN0IG5leHRDaGFyID0gc291cmNlW2luZGV4ICsgMV07XG5cbiAgICBpZiAoY2hhciA9PT0gXCInXCIgJiYgIWluRG91YmxlUXVvdGUpIHtcbiAgICAgIGlmIChpblNpbmdsZVF1b3RlICYmIG5leHRDaGFyID09PSBcIidcIikge1xuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGluU2luZ2xlUXVvdGUgPSAhaW5TaW5nbGVRdW90ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaGFyID09PSAnXCInICYmICFpblNpbmdsZVF1b3RlKSB7XG4gICAgICBpZiAoaW5Eb3VibGVRdW90ZSAmJiBuZXh0Q2hhciA9PT0gJ1wiJykge1xuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGluRG91YmxlUXVvdGUgPSAhaW5Eb3VibGVRdW90ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChpblNpbmdsZVF1b3RlIHx8IGluRG91YmxlUXVvdGUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaGFyID09PSBcIihcIikge1xuICAgICAgZGVwdGggKz0gMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaGFyID09PSBcIilcIikge1xuICAgICAgZGVwdGggLT0gMTtcbiAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQVlBLFNBQVMsaUJBQXdCLE9BQTJCO0NBQzFELElBQUksVUFBVSxNQUFNLE9BQU87Q0FDM0IsSUFBSSxVQUFVLFFBQVcsT0FBTztDQUNoQyxJQUFJLGVBQWUsS0FBSyxHQUFHLE9BQU87Q0FDbEMsSUFBSSxjQUFjLEtBQUssR0FBRyxPQUFPO0NBQ2pDLElBQUksY0FBYyxLQUFLLEdBQUcsT0FBTztDQUNqQyxJQUFJLE1BQU0sUUFBUSxLQUFLLEdBQ3JCLE9BQU8sTUFBTSxJQUFJLGdCQUFnQjtDQUVuQyxJQUFJLGNBQWMsS0FBSyxHQUNyQixPQUFPLE9BQU8sWUFDWixPQUFPLFFBQVEsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssV0FBVyxDQUFDLEtBQUssaUJBQWlCLEtBQUssQ0FBQyxDQUFDLENBQzVFO0NBRUYsTUFBTSxJQUFJLE1BQU0sc0JBQXNCO0FBQ3hDOzs7OztBQU1BLFNBQWdCLDZCQUE2QixPQUErQztDQUMxRixJQUFJLENBQUMsT0FDSDtDQUlGLE1BQU0sVUFBVSwwQkFBMEIsTUFBTSxLQUFLLENBQUM7Q0FDdEQsSUFBSSxRQUFRLFdBQVcsR0FDckI7Q0FHRixPQUFPO0FBQ1Q7Ozs7O0FBTUEsU0FBZ0IsMENBQ2QsT0FDb0I7Q0FDcEIsTUFBTSxhQUFhLDZCQUE2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
|
|
226
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgtd2hlcmUtcHJlZGljYXRlLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vaW5kZXgtd2hlcmUtcHJlZGljYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTcWxQYXJzZXIgZnJvbSBcIm5vZGUtc3FsLXBhcnNlclwiO1xuXG5pbXBvcnQgeyBpc0Jvb2xlYW5WYWx1ZSB9IGZyb20gXCIuLi9ydW50aW1lLXR5cGVcIjtcbmltcG9ydCB7IGlzTnVtYmVyVmFsdWUsIGlzT2JqZWN0VmFsdWUsIGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuXG5jb25zdCBJTkRFWF9XSEVSRV9TUUxfUEFSU0VSID0gbmV3IFNxbFBhcnNlci5QYXJzZXIoKTtcblxudHlwZSBTcWxBc3RWYWx1ZSA9IG51bGwgfCB1bmRlZmluZWQgfCBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nIHwgU3FsQXN0VmFsdWVbXSB8IFNxbEFzdFJlY29yZDtcbmludGVyZmFjZSBTcWxBc3RSZWNvcmQge1xuICBba2V5OiBzdHJpbmddOiBTcWxBc3RWYWx1ZTtcbn1cblxuZnVuY3Rpb24gcGFyc2VTcWxBc3RWYWx1ZTxWYWx1ZT4odmFsdWU6IFZhbHVlKTogU3FsQXN0VmFsdWUge1xuICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiBudWxsO1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGlzQm9vbGVhblZhbHVlKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICBpZiAoaXNOdW1iZXJWYWx1ZSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgaWYgKGlzU3RyaW5nVmFsdWUodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5tYXAocGFyc2VTcWxBc3RWYWx1ZSk7XG4gIH1cbiAgaWYgKGlzT2JqZWN0VmFsdWUodmFsdWUpKSB7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlKS5tYXAoKFtrZXksIGNoaWxkXSkgPT4gW2tleSwgcGFyc2VTcWxBc3RWYWx1ZShjaGlsZCldKSxcbiAgICApO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcIuyngOybkO2VmOyngCDslYrripQgU1FMIEFTVCDqsJLsnoXri4jri6RcIik7XG59XG5cbi8qKlxuICogTWlncmF0aW9uIERETCDstpzroKXsl5Ag7IKs7Jqp7ZWgIGluZGV4IHByZWRpY2F0ZeulvCDsoJXrpqztlZzri6QuXG4gKiDsm5Drs7ggU1FMIO2RnO2YhOydgCDrs7TsobTtlZjqs6AsIOu5iCDrrLjsnpDsl7Tqs7wg7KCE7LK066W8IOqwkOyLvCDqtITtmLjrp4wg7KCc6rGw7ZWc64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplSW5kZXhXaGVyZVByZWRpY2F0ZSh3aGVyZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF3aGVyZSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyDstpzroKUg6rK966Gc7JeQ7ISc64qUIOyCrOyaqeyekOqwgCDsnpHshLHtlZwgcHJlZGljYXRl66W8IOy1nOuMgO2VnCDqt7jrjIDroZwg7Jyg7KeA7ZWc64ukLlxuICBjb25zdCB0cmltbWVkID0gcmVtb3ZlT3V0ZXJTcWxQYXJlbnRoZXNlcyh3aGVyZS50cmltKCkpO1xuICBpZiAodHJpbW1lZC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHRyaW1tZWQ7XG59XG5cbi8qKlxuICogSW5kZXggZGlmZiDruYTqtZDsl5Ag7IKs7Jqp7ZWgIHByZWRpY2F0ZSBpZGVudGl0eeulvCDrp4zrk6Dri6QuXG4gKiBQb3N0Z3JlU1FMIGNhbm9uaWNhbCDtkZztmIQg7LCo7J2064qUIEFTVCDquLDrsJgg7KCV6rec7ZmU66GcIO2doeyImO2VnOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUluZGV4V2hlcmVQcmVkaWNhdGVGb3JDb21wYXJpc29uKFxuICB3aGVyZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZUluZGV4V2hlcmVQcmVkaWNhdGUod2hlcmUpO1xuICBpZiAoIW5vcm1hbGl6ZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8g7YyM7IuxIOqwgOuKpe2VnCBwcmVkaWNhdGXrp4wgY2Fub25pY2FsIGZvcm3snLzroZwg67CU6r646rOgLCDsi6TtjKjtlZjrqbQg6riw7KG0IHN0cmljdCDruYTqtZDrpbwg7Jyg7KeA7ZWc64ukLlxuICByZXR1cm4gbm9ybWFsaXplSW5kZXhXaGVyZVByZWRpY2F0ZUJ5QXN0KG5vcm1hbGl6ZWQpID8/IG5vcm1hbGl6ZWQ7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU91dGVyU3FsUGFyZW50aGVzZXMoc291cmNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgdHJpbW1lZCA9IHNvdXJjZS50cmltKCk7XG5cbiAgLy8g7KCE7LK0IHByZWRpY2F0ZeulvCDqsJDsi7wg6rSE7Zi466eMIOygnOqxsO2VmOqzoCDrgrTrtoAgZ3JvdXBpbmfsnYAg6rG065Oc66as7KeAIOyViuuKlOuLpC5cbiAgd2hpbGUgKHRyaW1tZWQuc3RhcnRzV2l0aChcIihcIikgJiYgdHJpbW1lZC5lbmRzV2l0aChcIilcIikpIHtcbiAgICBjb25zdCBjbG9zZUluZGV4ID0gZmluZE1hdGNoaW5nUGFyZW50aGVzaXNJblNxbCh0cmltbWVkLCAwKTtcbiAgICBpZiAoY2xvc2VJbmRleCA9PT0gdHJpbW1lZC5sZW5ndGggLSAxKSB7XG4gICAgICB0cmltbWVkID0gdHJpbW1lZC5zbGljZSgxLCAtMSkudHJpbSgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gdHJpbW1lZDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSW5kZXhXaGVyZVByZWRpY2F0ZUJ5QXN0KHdoZXJlOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIC8vIG5vZGUtc3FsLXBhcnNlcuuKlCByYXcgcHJlZGljYXRl66W8IOyngeygkSDtjIzsi7HtlZjsp4Ag7JWK7Jy866+A66GcIOyehOyLnCBTRUxFQ1QgV0hFUkXroZwg6rCQ7Iu864ukLlxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlU3FsQXN0VmFsdWUoXG4gICAgICBJTkRFWF9XSEVSRV9TUUxfUEFSU0VSLmFzdGlmeShcbiAgICAgICAgYFNFTEVDVCAqIEZST00gX19zb25hbXVfaW5kZXhfcHJlZGljYXRlX3NvdXJjZSBXSEVSRSAke3doZXJlfWAsXG4gICAgICAgIHsgZGF0YWJhc2U6IFwicG9zdGdyZXNxbFwiIH0sXG4gICAgICApLFxuICAgICk7XG4gICAgY29uc3Qgc3RhdGVtZW50ID0gQXJyYXkuaXNBcnJheShwYXJzZWQpID8gcGFyc2VkWzBdIDogcGFyc2VkO1xuICAgIGlmICghaXNTcWxBc3RSZWNvcmQoc3RhdGVtZW50KSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VyaWFsaXplSW5kZXhXaGVyZUFzdChzdGF0ZW1lbnQud2hlcmUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZUluZGV4V2hlcmVBc3Qobm9kZTogU3FsQXN0VmFsdWUpOiBzdHJpbmcge1xuICAvLyBQb3N0Z3JlU1FM7J20IElO7J2EIEFOWShBUlJBWVsuLi5dKeuhnCDsnqzsnpHshLHtlZjrr4DroZwgbWVtYmVyc2hpcOydgCDrqLzsoIAg7Yq57IiYIOyymOumrO2VnOuLpC5cbiAgY29uc3QgbWVtYmVyc2hpcCA9IHNlcmlhbGl6ZVNxbE1lbWJlcnNoaXBQcmVkaWNhdGUobm9kZSk7XG4gIGlmIChtZW1iZXJzaGlwKSB7XG4gICAgcmV0dXJuIG1lbWJlcnNoaXA7XG4gIH1cblxuICBpZiAoIWlzU3FsQXN0UmVjb3JkKG5vZGUpKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG5vZGUpO1xuICB9XG5cbiAgY29uc3QgdHlwZSA9IGdldFNxbEFzdFN0cmluZyhub2RlLCBcInR5cGVcIik7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJiaW5hcnlfZXhwclwiOiB7XG4gICAgICBjb25zdCBvcGVyYXRvciA9IG5vcm1hbGl6ZVNxbE9wZXJhdG9yKGdldFNxbEFzdFN0cmluZyhub2RlLCBcIm9wZXJhdG9yXCIpKTtcbiAgICAgIGNvbnN0IGxlZnQgPSBzZXJpYWxpemVJbmRleFdoZXJlQXN0KG5vZGUubGVmdCk7XG4gICAgICBjb25zdCByaWdodCA9IHNlcmlhbGl6ZUluZGV4V2hlcmVBc3Qobm9kZS5yaWdodCk7XG4gICAgICBpZiAob3BlcmF0b3IgPT09IFwiQU5EXCIgfHwgb3BlcmF0b3IgPT09IFwiT1JcIikge1xuICAgICAgICAvLyBBTkQvT1LripQg7Iic7ISc6rCAIGRpZmYg7J2Y66+466W8IOuwlOq+uOyngCDslYrsnLzrr4DroZwgc3RhYmxlIGlkZW50aXR566GcIOygleugrO2VnOuLpC5cbiAgICAgICAgcmV0dXJuIGAoJHtbbGVmdCwgcmlnaHRdLnRvU29ydGVkKCkuam9pbihgICR7b3BlcmF0b3J9IGApfSlgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAoJHtsZWZ0fSAke29wZXJhdG9yfSAke3JpZ2h0fSlgO1xuICAgIH1cbiAgICBjYXNlIFwidW5hcnlfZXhwclwiOiB7XG4gICAgICBjb25zdCBvcGVyYXRvciA9IG5vcm1hbGl6ZVNxbE9wZXJhdG9yKGdldFNxbEFzdFN0cmluZyhub2RlLCBcIm9wZXJhdG9yXCIpKTtcbiAgICAgIHJldHVybiBgKCR7b3BlcmF0b3J9ICR7c2VyaWFsaXplSW5kZXhXaGVyZUFzdChub2RlLmV4cHIpfSlgO1xuICAgIH1cbiAgICBjYXNlIFwiY29sdW1uX3JlZlwiOiB7XG4gICAgICByZXR1cm4gc2VyaWFsaXplU3FsQ29sdW1uUmVmKG5vZGUpO1xuICAgIH1cbiAgICBjYXNlIFwic2luZ2xlX3F1b3RlX3N0cmluZ1wiOiB7XG4gICAgICByZXR1cm4gYHN0cmluZzoke0pTT04uc3RyaW5naWZ5KGdldFNxbEFzdFN0cmluZyhub2RlLCBcInZhbHVlXCIpKX1gO1xuICAgIH1cbiAgICBjYXNlIFwibnVtYmVyXCI6IHtcbiAgICAgIHJldHVybiBgbnVtYmVyOiR7U3RyaW5nKG5vZGUudmFsdWUpfWA7XG4gICAgfVxuICAgIGNhc2UgXCJib29sXCI6IHtcbiAgICAgIHJldHVybiBgYm9vbDoke1N0cmluZyhub2RlLnZhbHVlKS50b0xvd2VyQ2FzZSgpfWA7XG4gICAgfVxuICAgIGNhc2UgXCJudWxsXCI6IHtcbiAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICB9XG4gICAgY2FzZSBcImNhc3RcIjoge1xuICAgICAgY29uc3QgdGFyZ2V0VHlwZSA9IGdldFNxbENhc3RUYXJnZXRUeXBlKG5vZGUpO1xuICAgICAgY29uc3QgZXhwciA9IG5vZGUuZXhwcjtcbiAgICAgIGlmICh0YXJnZXRUeXBlICYmIGlzVGV4dExpa2VTcWxUeXBlKHRhcmdldFR5cGUpICYmIGlzU3FsU3RyaW5nTGl0ZXJhbExpa2UoZXhwcikpIHtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZUluZGV4V2hlcmVBc3Qoc3RyaXBUZXh0TGlrZVNxbENhc3QoZXhwcikpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGBjYXN0KCR7c2VyaWFsaXplSW5kZXhXaGVyZUFzdChleHByKX0gYXMgJHt0YXJnZXRUeXBlID8/IFwidW5rbm93blwifSlgO1xuICAgIH1cbiAgICBjYXNlIFwiZnVuY3Rpb25cIjoge1xuICAgICAgcmV0dXJuIGBmbjoke2dldFNxbEZ1bmN0aW9uTmFtZShub2RlKX0oJHtzZXJpYWxpemVTcWxFeHByTGlzdChub2RlLmFyZ3MpLmpvaW4oXCIsXCIpfSlgO1xuICAgIH1cbiAgICBjYXNlIFwiYXJyYXlcIjoge1xuICAgICAgcmV0dXJuIGBhcnJheTpbJHtzZXJpYWxpemVTcWxBcnJheUVsZW1lbnRzKG5vZGUpLm1hcChzZXJpYWxpemVJbmRleFdoZXJlQXN0KS5qb2luKFwiLFwiKX1dYDtcbiAgICB9XG4gICAgY2FzZSBcImV4cHJfbGlzdFwiOiB7XG4gICAgICByZXR1cm4gYGxpc3Q6WyR7c2VyaWFsaXplU3FsRXhwckxpc3Qobm9kZSkubWFwKHNlcmlhbGl6ZUluZGV4V2hlcmVBc3QpLmpvaW4oXCIsXCIpfV1gO1xuICAgIH1cbiAgICBjYXNlIFwiZGVmYXVsdFwiOiB7XG4gICAgICByZXR1cm4gYGlkZW50OiR7bm9ybWFsaXplU3FsSWRlbnRpZmllcihnZXRTcWxBc3RTdHJpbmcobm9kZSwgXCJ2YWx1ZVwiKSA/PyBcIlwiKX1gO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gc2VyaWFsaXplVW5rbm93blNxbEFzdFJlY29yZChub2RlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplU3FsTWVtYmVyc2hpcFByZWRpY2F0ZShub2RlOiBTcWxBc3RWYWx1ZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghaXNTcWxBc3RSZWNvcmQobm9kZSkgfHwgZ2V0U3FsQXN0U3RyaW5nKG5vZGUsIFwidHlwZVwiKSAhPT0gXCJiaW5hcnlfZXhwclwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIElOICguLi4p6rO8ID0gQU5ZKEFSUkFZWy4uLl0p66W8IOuPmeydvO2VnCB1bm9yZGVyZWQgbWVtYmVyc2hpcCDtkZztmITsnLzroZwg66ee7LaY64ukLlxuICBjb25zdCBvcGVyYXRvciA9IG5vcm1hbGl6ZVNxbE9wZXJhdG9yKGdldFNxbEFzdFN0cmluZyhub2RlLCBcIm9wZXJhdG9yXCIpKTtcbiAgY29uc3QgbGVmdCA9IHNlcmlhbGl6ZUluZGV4V2hlcmVBc3Qoc3RyaXBUZXh0TGlrZVNxbENhc3Qobm9kZS5sZWZ0KSk7XG4gIGNvbnN0IHZhbHVlcyA9ICgoKSA9PiB7XG4gICAgaWYgKG9wZXJhdG9yID09PSBcIklOXCIpIHtcbiAgICAgIHJldHVybiBzZXJpYWxpemVTcWxNZW1iZXJzaGlwVmFsdWVzKHNlcmlhbGl6ZVNxbEV4cHJMaXN0KG5vZGUucmlnaHQpKTtcbiAgICB9XG5cbiAgICBpZiAob3BlcmF0b3IgPT09IFwiPVwiKSB7XG4gICAgICByZXR1cm4gc2VyaWFsaXplU3FsTWVtYmVyc2hpcFZhbHVlcyhnZXRTcWxBbnlBcnJheUVsZW1lbnRzKG5vZGUucmlnaHQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9KSgpO1xuXG4gIGlmICghdmFsdWVzKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBgbWVtYmVyc2hpcDoke2xlZnR9OmluOlske3ZhbHVlcy5qb2luKFwiLFwiKX1dYDtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplU3FsTWVtYmVyc2hpcFZhbHVlcyh2YWx1ZXM6IFNxbEFzdFZhbHVlW10gfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIGlmICghdmFsdWVzKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIG1lbWJlcnNoaXAg6rCS7J2YIOyInOyEnOyZgCDspJHrs7XsnYAg7J2Y66+46rCAIOyXhuycvOuvgOuhnCDslYjsoJXsoIHsnbggaWRlbnRpdHnroZwg7KCV66Cs7ZWc64ukLlxuICBjb25zdCBzZXJpYWxpemVkID0gdmFsdWVzLm1hcCgodmFsdWUpID0+IHNlcmlhbGl6ZUluZGV4V2hlcmVBc3Qoc3RyaXBUZXh0TGlrZVNxbENhc3QodmFsdWUpKSk7XG4gIHJldHVybiBbLi4ubmV3IFNldChzZXJpYWxpemVkKV0udG9Tb3J0ZWQoKTtcbn1cblxuZnVuY3Rpb24gZ2V0U3FsQW55QXJyYXlFbGVtZW50cyhub2RlOiBTcWxBc3RWYWx1ZSk6IFNxbEFzdFZhbHVlW10gfCB1bmRlZmluZWQge1xuICBpZiAoIWlzU3FsQXN0UmVjb3JkKG5vZGUpIHx8IGdldFNxbEFzdFN0cmluZyhub2RlLCBcInR5cGVcIikgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKGdldFNxbEZ1bmN0aW9uTmFtZShub2RlKSAhPT0gXCJhbnlcIikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBBTlkoKeydmCDssqsg67KI7Ke4IOyduOyekOunjCBQb3N0Z3JlU1FMIOuwsOyXtCBtZW1iZXJzaGlwIOuMgOyDgeycvOuhnCDtlbTshJ3tlZzri6QuXG4gIGNvbnN0IFthcmddID0gc2VyaWFsaXplU3FsRXhwckxpc3Qobm9kZS5hcmdzKTtcbiAgaWYgKCFhcmcpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHNlcmlhbGl6ZVNxbEFycmF5RWxlbWVudHMoc3RyaXBUZXh0TGlrZVNxbENhc3QoYXJnKSk7XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVNxbEFycmF5RWxlbWVudHMobm9kZTogU3FsQXN0VmFsdWUpOiBTcWxBc3RWYWx1ZVtdIHtcbiAgaWYgKCFpc1NxbEFzdFJlY29yZChub2RlKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8vIHBhcnNlciDrsoTsoITsl5Ag65Sw6528IOuwsOyXtCDsm5DshozqsIAgYXJyYXkuZXhwcl9saXN0IOuYkOuKlCBleHByX2xpc3TroZwg65Ok7Ja07Jio64ukLlxuICBpZiAoZ2V0U3FsQXN0U3RyaW5nKG5vZGUsIFwidHlwZVwiKSA9PT0gXCJhcnJheVwiKSB7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZVNxbEV4cHJMaXN0KG5vZGUuZXhwcl9saXN0KTtcbiAgfVxuXG4gIHJldHVybiBzZXJpYWxpemVTcWxFeHByTGlzdChub2RlKTtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplU3FsRXhwckxpc3Qobm9kZTogU3FsQXN0VmFsdWUpOiBTcWxBc3RWYWx1ZVtdIHtcbiAgaWYgKCFpc1NxbEFzdFJlY29yZChub2RlKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8vIGV4cHJfbGlzdOuKlCDsi6TsoJwgQVNUIOuFuOuTnCDrsLDsl7TsnbTqs6AsIOuLqOydvCDtkZztmITsi53snYAg67Cw7Je0IO2VmOuCmOuhnCDqsJDsi7gg7Ya17J287ZWc64ukLlxuICBpZiAoZ2V0U3FsQXN0U3RyaW5nKG5vZGUsIFwidHlwZVwiKSA9PT0gXCJleHByX2xpc3RcIiAmJiBBcnJheS5pc0FycmF5KG5vZGUudmFsdWUpKSB7XG4gICAgcmV0dXJuIG5vZGUudmFsdWU7XG4gIH1cblxuICByZXR1cm4gW25vZGVdO1xufVxuXG5mdW5jdGlvbiBzdHJpcFRleHRMaWtlU3FsQ2FzdChub2RlOiBTcWxBc3RWYWx1ZSk6IFNxbEFzdFZhbHVlIHtcbiAgaWYgKCFpc1NxbEFzdFJlY29yZChub2RlKSB8fCBnZXRTcWxBc3RTdHJpbmcobm9kZSwgXCJ0eXBlXCIpICE9PSBcImNhc3RcIikge1xuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgLy8gUG9zdGdyZVNRTOydgCB2YXJjaGFyL3RleHQgY2FzdOulvCDrsLDsl7Qg65iQ64qUIOybkOyGjCDsqr3snLzroZwg7Jiu6ri4IOyImCDsnojslrQg67mE6rWQ7JeQ7IScIOygnOqxsO2VnOuLpC5cbiAgY29uc3QgdGFyZ2V0VHlwZSA9IGdldFNxbENhc3RUYXJnZXRUeXBlKG5vZGUpO1xuICBpZiAoIXRhcmdldFR5cGUgfHwgIWlzVGV4dExpa2VTcWxUeXBlKHRhcmdldFR5cGUpKSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICByZXR1cm4gc3RyaXBUZXh0TGlrZVNxbENhc3Qobm9kZS5leHByKTtcbn1cblxuZnVuY3Rpb24gaXNTcWxTdHJpbmdMaXRlcmFsTGlrZShub2RlOiBTcWxBc3RWYWx1ZSk6IGJvb2xlYW4ge1xuICAvLyDrrLjsnpDsl7QgbGl0ZXJhbOyXkCDrtpnsnYAgdGV4dCDqs4Tsl7QgY2FzdOuKlCBtZW1iZXJzaGlwIOu5hOq1kOyXkOyEnCDsnZjrr7jqsIAg6rCZ64ukLlxuICBjb25zdCBzdHJpcHBlZCA9IHN0cmlwVGV4dExpa2VTcWxDYXN0KG5vZGUpO1xuICByZXR1cm4gaXNTcWxBc3RSZWNvcmQoc3RyaXBwZWQpICYmIGdldFNxbEFzdFN0cmluZyhzdHJpcHBlZCwgXCJ0eXBlXCIpID09PSBcInNpbmdsZV9xdW90ZV9zdHJpbmdcIjtcbn1cblxuZnVuY3Rpb24gZ2V0U3FsQ2FzdFRhcmdldFR5cGUobm9kZTogU3FsQXN0UmVjb3JkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KG5vZGUudGFyZ2V0KSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBjaGFyYWN0ZXIgdmFyeWluZ+yymOufvCDsl6zrn6wgdG9rZW7snLzroZwg7Jik64qUIO2DgOyeheuqheydhCDtlZjrgpjsnZgg7KCV6rec7ZmUIOusuOyekOyXtOuhnCDtlansuZzri6QuXG4gIGNvbnN0IGRhdGFUeXBlcyA9IG5vZGUudGFyZ2V0XG4gICAgLm1hcCgodGFyZ2V0KSA9PiAoaXNTcWxBc3RSZWNvcmQodGFyZ2V0KSA/IGdldFNxbEFzdFN0cmluZyh0YXJnZXQsIFwiZGF0YVR5cGVcIikgOiB1bmRlZmluZWQpKVxuICAgIC5maWx0ZXIoKGRhdGFUeXBlKTogZGF0YVR5cGUgaXMgc3RyaW5nID0+IGRhdGFUeXBlICE9PSB1bmRlZmluZWQpO1xuXG4gIGlmIChkYXRhVHlwZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVTcWxEYXRhVHlwZShkYXRhVHlwZXMuam9pbihcIiBcIikpO1xufVxuXG5mdW5jdGlvbiBpc1RleHRMaWtlU3FsVHlwZSh0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8g67Cw7Je0IGNhc3QodGV4dFtdKeuPhCDsm5DshowgbWVtYmVyc2hpcCDruYTqtZDsl5DshJzripQgdGV4dCDqs4Tsl7QgY2FzdOuhnCDst6jquIntlZzri6QuXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVTcWxEYXRhVHlwZSh0eXBlKS5yZXBsYWNlKC9cXFtcXF0kL2csIFwiXCIpO1xuICByZXR1cm4gbm9ybWFsaXplZCA9PT0gXCJ0ZXh0XCIgfHwgbm9ybWFsaXplZCA9PT0gXCJ2YXJjaGFyXCI7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNxbERhdGFUeXBlKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlXG4gICAgLnRyaW0oKVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoL1xccysvZywgXCIgXCIpXG4gICAgLnJlcGxhY2UoL15jaGFyYWN0ZXIgdmFyeWluZyQvLCBcInZhcmNoYXJcIik7XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVNxbENvbHVtblJlZihub2RlOiBTcWxBc3RSZWNvcmQpOiBzdHJpbmcge1xuICBjb25zdCB0YWJsZSA9IHNlcmlhbGl6ZVNxbElkZW50aWZpZXJOb2RlKG5vZGUudGFibGUpO1xuICBjb25zdCBjb2x1bW4gPSBzZXJpYWxpemVTcWxJZGVudGlmaWVyTm9kZShub2RlLmNvbHVtbik7XG4gIHJldHVybiBgY29sdW1uOiR7dGFibGUgPyBgJHt0YWJsZX0uYCA6IFwiXCJ9JHtjb2x1bW59YDtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplU3FsSWRlbnRpZmllck5vZGUobm9kZTogU3FsQXN0VmFsdWUpOiBzdHJpbmcge1xuICBpZiAoaXNTdHJpbmdWYWx1ZShub2RlKSkge1xuICAgIHJldHVybiBub3JtYWxpemVTcWxJZGVudGlmaWVyKG5vZGUpO1xuICB9XG5cbiAgLy8gcXVvdGVkIGlkZW50aWZpZXLsmYAgZnVuY3Rpb24gbmFtZeydmCBBU1Qgc2hhcGUg7LCo7J2066W8IOqwmeydgCBpZGVudGlmaWVyIOusuOyekOyXtOuhnCDtnaHsiJjtlZzri6QuXG4gIGlmIChpc1NxbEFzdFJlY29yZChub2RlKSkge1xuICAgIGlmIChpc1N0cmluZ1ZhbHVlKG5vZGUudmFsdWUpKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplU3FsSWRlbnRpZmllcihub2RlLnZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoaXNTcWxBc3RSZWNvcmQobm9kZS5leHByKSAmJiBpc1N0cmluZ1ZhbHVlKG5vZGUuZXhwci52YWx1ZSkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVTcWxJZGVudGlmaWVyKG5vZGUuZXhwci52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFwiXCI7XG59XG5cbmZ1bmN0aW9uIGdldFNxbEZ1bmN0aW9uTmFtZShub2RlOiBTcWxBc3RSZWNvcmQpOiBzdHJpbmcge1xuICBjb25zdCBuYW1lID0gbm9kZS5uYW1lO1xuICBpZiAoaXNTdHJpbmdWYWx1ZShuYW1lKSkge1xuICAgIHJldHVybiBub3JtYWxpemVTcWxJZGVudGlmaWVyKG5hbWUpO1xuICB9XG5cbiAgLy8gQU5Z7LKY65+8IG5hbWUubmFtZSDrsLDsl7TroZwg7Jik64qUIGZ1bmN0aW9uIEFTVOulvCBzY2hlbWEtcXVhbGlmaWVkIOydtOumhOq5jOyngCDsp4Dsm5DtlZzri6QuXG4gIGlmIChpc1NxbEFzdFJlY29yZChuYW1lKSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG5hbWUubmFtZSkpIHtcbiAgICAgIHJldHVybiBuYW1lLm5hbWUubWFwKHNlcmlhbGl6ZVNxbElkZW50aWZpZXJOb2RlKS5qb2luKFwiLlwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBuYW1lUGFydHMgPSBzZXJpYWxpemVTcWxFeHByTGlzdChuYW1lKTtcbiAgICBpZiAobmFtZVBhcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBuYW1lUGFydHMubWFwKHNlcmlhbGl6ZVNxbElkZW50aWZpZXJOb2RlKS5qb2luKFwiLlwiKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gXCJcIjtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3FsSWRlbnRpZmllcihpZGVudGlmaWVyOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gaWRlbnRpZmllci50cmltKCkudG9Mb3dlckNhc2UoKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3FsT3BlcmF0b3Iob3BlcmF0b3I6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiAob3BlcmF0b3IgPz8gXCJcIikudHJpbSgpLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCBcIiBcIik7XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVVua25vd25TcWxBc3RSZWNvcmQobm9kZTogU3FsQXN0UmVjb3JkKTogc3RyaW5nIHtcbiAgLy8g7JWE7KeBIOuqheyLnOyggeycvOuhnCDri6Tro6jsp4Ag7JWK64qUIEFTVCDrhbjrk5zripQga2V5IOygleugrOuhnCDstZzshoztlZwg7JWI7KCV7KCB7J24IOu5hOq1kOqwkuydhCDrp4zrk6Dri6QuXG4gIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhub2RlKVxuICAgIC5maWx0ZXIoKFtrZXldKSA9PiBrZXkgIT09IFwicGFyZW50aGVzZXNcIilcbiAgICAudG9Tb3J0ZWQoKFtsZWZ0XSwgW3JpZ2h0XSkgPT4gbGVmdC5sb2NhbGVDb21wYXJlKHJpZ2h0KSlcbiAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2tleX06JHtzZXJpYWxpemVJbmRleFdoZXJlQXN0KHZhbHVlKX1gKTtcblxuICByZXR1cm4gYHJlY29yZDp7JHtlbnRyaWVzLmpvaW4oXCIsXCIpfX1gO1xufVxuXG5mdW5jdGlvbiBpc1NxbEFzdFJlY29yZCh2YWx1ZTogU3FsQXN0VmFsdWUpOiB2YWx1ZSBpcyBTcWxBc3RSZWNvcmQge1xuICByZXR1cm4gaXNPYmplY3RWYWx1ZSh2YWx1ZSkgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBnZXRTcWxBc3RTdHJpbmcobm9kZTogU3FsQXN0UmVjb3JkLCBrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gbm9kZVtrZXldO1xuICByZXR1cm4gaXNTdHJpbmdWYWx1ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZmluZE1hdGNoaW5nUGFyZW50aGVzaXNJblNxbChzb3VyY2U6IHN0cmluZywgb3BlbkluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgZGVwdGggPSAwO1xuICBsZXQgaW5TaW5nbGVRdW90ZSA9IGZhbHNlO1xuICBsZXQgaW5Eb3VibGVRdW90ZSA9IGZhbHNlO1xuXG4gIC8vIFNRTCDrrLjsnpDsl7Tqs7wgcXVvdGVkIGlkZW50aWZpZXIg64K067aAIOq0hO2YuOuKlCBncm91cGluZyDqtITtmLjroZwg7IS47KeAIOyViuuKlOuLpC5cbiAgZm9yIChsZXQgaW5kZXggPSBvcGVuSW5kZXg7IGluZGV4IDwgc291cmNlLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGNvbnN0IGNoYXIgPSBzb3VyY2VbaW5kZXhdO1xuICAgIGNvbnN0IG5leHRDaGFyID0gc291cmNlW2luZGV4ICsgMV07XG5cbiAgICBpZiAoY2hhciA9PT0gXCInXCIgJiYgIWluRG91YmxlUXVvdGUpIHtcbiAgICAgIGlmIChpblNpbmdsZVF1b3RlICYmIG5leHRDaGFyID09PSBcIidcIikge1xuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGluU2luZ2xlUXVvdGUgPSAhaW5TaW5nbGVRdW90ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaGFyID09PSAnXCInICYmICFpblNpbmdsZVF1b3RlKSB7XG4gICAgICBpZiAoaW5Eb3VibGVRdW90ZSAmJiBuZXh0Q2hhciA9PT0gJ1wiJykge1xuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGluRG91YmxlUXVvdGUgPSAhaW5Eb3VibGVRdW90ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChpblNpbmdsZVF1b3RlIHx8IGluRG91YmxlUXVvdGUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaGFyID09PSBcIihcIikge1xuICAgICAgZGVwdGggKz0gMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaGFyID09PSBcIilcIikge1xuICAgICAgZGVwdGggLT0gMTtcbiAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQVlBLFNBQVMsaUJBQXdCLE9BQTJCO0NBQzFELElBQUksVUFBVSxNQUFNLE9BQU87Q0FDM0IsSUFBSSxVQUFVLFFBQVcsT0FBTztDQUNoQyxJQUFJLGVBQWUsS0FBSyxHQUFHLE9BQU87Q0FDbEMsSUFBSSxjQUFjLEtBQUssR0FBRyxPQUFPO0NBQ2pDLElBQUksY0FBYyxLQUFLLEdBQUcsT0FBTztDQUNqQyxJQUFJLE1BQU0sUUFBUSxLQUFLLEdBQ3JCLE9BQU8sTUFBTSxJQUFJLGdCQUFnQjtDQUVuQyxJQUFJLGNBQWMsS0FBSyxHQUNyQixPQUFPLE9BQU8sWUFDWixPQUFPLFFBQVEsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssV0FBVyxDQUFDLEtBQUssaUJBQWlCLEtBQUssQ0FBQyxDQUFDLENBQzVFO0NBRUYsTUFBTSxJQUFJLE1BQU0sc0JBQXNCO0FBQ3hDOzs7OztBQU1BLFNBQWdCLDZCQUE2QixPQUErQztDQUMxRixJQUFJLENBQUMsT0FDSDtDQUlGLE1BQU0sVUFBVSwwQkFBMEIsTUFBTSxLQUFLLENBQUM7Q0FDdEQsSUFBSSxRQUFRLFdBQVcsR0FDckI7Q0FHRixPQUFPO0FBQ1Q7Ozs7O0FBTUEsU0FBZ0IsMENBQ2QsT0FDb0I7Q0FDcEIsTUFBTSxhQUFhLDZCQUE2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
|
|
@@ -3,7 +3,7 @@ import { exhaustive, init_utils } from "../utils/utils.js";
|
|
|
3
3
|
import { init_types, isBelongsToOneRelationProp, isHasManyRelationProp, isManyToManyRelationProp, isNumberProp, isNumberSingleProp, isNumericProp, isNumericSingleProp, isOneToOneRelationProp, isRelationProp, isStringProp, isVectorProp, isVirtualProp } from "../types/types.js";
|
|
4
4
|
import { EntityManager, init_entity_manager } from "../entity/entity-manager.js";
|
|
5
5
|
import inflection from "inflection";
|
|
6
|
-
|
|
6
|
+
// src/migration/migration-set.ts
|
|
7
7
|
/**
|
|
8
8
|
* Entity를 읽어서 MigrationSetAndJoinTable을 만들어옵니다.
|
|
9
9
|
* @param entity Entity 객체
|
|
@@ -180,8 +180,7 @@ var init_migration_set = __esmMin((() => {
|
|
|
180
180
|
NUMERIC_DEFAULT_PRECISION = 8;
|
|
181
181
|
NUMERIC_DEFAULT_SCALE = 2;
|
|
182
182
|
}));
|
|
183
|
-
//#endregion
|
|
184
183
|
init_migration_set();
|
|
185
184
|
export { getMigrationSetFromEntity, init_migration_set };
|
|
186
185
|
|
|
187
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0aW9uLXNldC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlncmF0aW9uL21pZ3JhdGlvbi1zZXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcblxuaW1wb3J0IHsgdHlwZSBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc0hhc01hbnlSZWxhdGlvblByb3AsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNOdW1iZXJQcm9wLFxuICBpc051bWJlclNpbmdsZVByb3AsXG4gIGlzTnVtZXJpY1Byb3AsXG4gIGlzTnVtZXJpY1NpbmdsZVByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1N0cmluZ1Byb3AsXG4gIGlzVmVjdG9yUHJvcCxcbiAgaXNWaXJ0dWFsUHJvcCxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgTWlncmF0aW9uQ29sdW1uLFxuICB0eXBlIE1pZ3JhdGlvbkNvbHVtblR5cGUsXG4gIHR5cGUgTWlncmF0aW9uRm9yZWlnbixcbiAgdHlwZSBNaWdyYXRpb25JbmRleCxcbiAgdHlwZSBNaWdyYXRpb25Kb2luVGFibGUsXG4gIHR5cGUgTWlncmF0aW9uU2V0QW5kSm9pblRhYmxlLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGV4aGF1c3RpdmUgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcblxuLy8gbnVtZXJpYyDsu6zrn7zsl5DshJwgcHJlY2lzaW9uL3NjYWxl7J2EIOyDneuete2WiOydhCDrlYwg7Iuk7KCc66GcIOyDneyEseuQmOuKlCDqsJIoa25leCBkZWNpbWFs7J2YIOq4sOuzuOqwkinsnbTri6QuXG5jb25zdCBOVU1FUklDX0RFRkFVTFRfUFJFQ0lTSU9OID0gODtcbmNvbnN0IE5VTUVSSUNfREVGQVVMVF9TQ0FMRSA9IDI7XG5cbi8qKlxuICogRW50aXR566W8IOydveyWtOyEnCBNaWdyYXRpb25TZXRBbmRKb2luVGFibGXsnYQg66eM65Ok7Ja07Ji164uI64ukLlxuICogQHBhcmFtIGVudGl0eSBFbnRpdHkg6rCd7LK0XG4gKiBAcmV0dXJucyBNaWdyYXRpb25TZXRBbmRKb2luVGFibGUg6rCd7LK0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNaWdyYXRpb25TZXRGcm9tRW50aXR5KGVudGl0eTogRW50aXR5KTogTWlncmF0aW9uU2V0QW5kSm9pblRhYmxlIHtcbiAgY29uc3QgbWlncmF0aW9uU2V0OiBNaWdyYXRpb25TZXRBbmRKb2luVGFibGUgPSBlbnRpdHkucHJvcHMucmVkdWNlKFxuICAgIChyLCBwcm9wKSA9PiB7XG4gICAgICAvLyB2aXJ0dWFsIO2VhOuTnCDsoJzsmbhcbiAgICAgIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfVxuICAgICAgLy8gSGFzTWFueSDsvIDsnbTsiqTripQg7JWE66y0IOyymOumrOuPhCDtlZjsp4Ag7JWK7J2MXG4gICAgICBpZiAoaXNIYXNNYW55UmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfVxuXG4gICAgICAvLyDsnbzrsJgg7Lus65+8XG4gICAgICBpZiAoIWlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHtcbiAgICAgICAgICBuYW1lOiBwcm9wLm5hbWUsXG4gICAgICAgICAgdHlwZTogcmVzb2x2ZUVudGl0eVByb3BUeXBlVG9NaWdyYXRpb25Db2x1bW5UeXBlKHByb3ApLFxuICAgICAgICAgIG51bGxhYmxlOiBwcm9wLm51bGxhYmxlID09PSB0cnVlLFxuICAgICAgICAgIC4uLigoKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvcC5kYkRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRUbzogcHJvcC5kYkRlZmF1bHQsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgfSkoKSxcbiAgICAgICAgICAvLyBTdHJpbmcg7YOA7J6F7JeQIGxlbmd0aCDsnojripQg6rK97JqwIOy2lOqwgFxuICAgICAgICAgIC4uLihpc1N0cmluZ1Byb3AocHJvcCkgJiZcbiAgICAgICAgICAgIHByb3AubGVuZ3RoICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICAgICAgICBsZW5ndGg6IHByb3AubGVuZ3RoLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgLy8gTnVtYmVyL051bWVyaWMg7YOA7J6F7J2YIOqyveyasCBwcmVjaXNpb24sIHNjYWxlIOy2lOqwgFxuICAgICAgICAgIC4uLigoaXNOdW1iZXJQcm9wKHByb3ApIHx8IGlzTnVtZXJpY1Byb3AocHJvcCkpICYmXG4gICAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBudW1iZXJUeXBlID0gaXNOdW1iZXJQcm9wKHByb3ApID8gKHByb3AubnVtYmVyVHlwZSA/PyBcIm51bWVyaWNcIikgOiBcIm51bWVyaWNcIjtcblxuICAgICAgICAgICAgICAvLyBudW1lcmlj7JeQ7IScIHByZWNpc2lvbi9zY2FsZeydhCDsg53rnrXtlZjrqbQga25leCBkZWNpbWFs7J2YIOq4sOuzuOqwkig4LCAyKeycvOuhnCDsu6zrn7zsnbRcbiAgICAgICAgICAgICAgLy8g66eM65Ok7Ja07KeA64qU642wLCBEQuyXkOyEnOuKlCDqt7gg6rCS7J20IOq3uOuMgOuhnCDsnb3tnojrr4DroZwg7JeU7Yuw7YuwIOyqveydhCB1bmRlZmluZWTroZwg65GQ66m0XG4gICAgICAgICAgICAgIC8vIOunpOuyiCDrtojsnbzsuZjroZwg7J6h7Z6M64ukLiDruYTqtZAg7KCE7JeQIOqwmeydgCDquLDrs7jqsJLsnYQg7LGE7JuMIOyLpOygnCDsiqTtgqTrp4jsmYAg66ee7LaY64ukLlxuICAgICAgICAgICAgICBpZiAobnVtYmVyVHlwZSA9PT0gXCJudW1lcmljXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNOdW1iZXJTaW5nbGVQcm9wKHByb3ApIHx8IGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIG51bWJlclR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbjogcHJvcC5wcmVjaXNpb24gPz8gTlVNRVJJQ19ERUZBVUxUX1BSRUNJU0lPTixcbiAgICAgICAgICAgICAgICAgICAgc2NhbGU6IHByb3Auc2NhbGUgPz8gTlVNRVJJQ19ERUZBVUxUX1NDQUxFLFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgbnVtYmVyVHlwZSxcbiAgICAgICAgICAgICAgICAgIC4uLihwcm9wLnByZWNpc2lvbiAhPT0gdW5kZWZpbmVkICYmIHsgcHJlY2lzaW9uOiBwcm9wLnByZWNpc2lvbiB9KSxcbiAgICAgICAgICAgICAgICAgIC4uLihwcm9wLnNjYWxlICE9PSB1bmRlZmluZWQgJiYgeyBzY2FsZTogcHJvcC5zY2FsZSB9KSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gcmVhbC9kb3VibGUgcHJlY2lzaW9u7J2AIHByZWNpc2lvbi9zY2FsZeydhCDsk7Dsp4Ag7JWK64qU64ukKERCIOumrOuNlOuPhCDrsJjtmZjtlZjsp4Ag7JWK7J2MKS5cbiAgICAgICAgICAgICAgcmV0dXJuIHsgbnVtYmVyVHlwZSwgcHJlY2lzaW9uOiBwcm9wLnByZWNpc2lvbiwgc2NhbGU6IHByb3Auc2NhbGUgfTtcbiAgICAgICAgICAgIH0pKCkpLFxuICAgICAgICAgIC8vIFZlY3RvciDtg4DsnoXsnZgg6rK97JqwIGRpbWVuc2lvbnMg7LaU6rCAXG4gICAgICAgICAgLi4uKGlzVmVjdG9yUHJvcChwcm9wKSAmJiB7XG4gICAgICAgICAgICBkaW1lbnNpb25zOiBwcm9wLmRpbWVuc2lvbnMsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgLy8gR2VuZXJhdGVkIENvbHVtbiDsoJXrs7Qg7LaU6rCAXG4gICAgICAgICAgLi4uKHByb3AuZ2VuZXJhdGVkICYmIHtcbiAgICAgICAgICAgIGdlbmVyYXRlZDogcHJvcC5nZW5lcmF0ZWQsXG4gICAgICAgICAgfSksXG4gICAgICAgIH07XG5cbiAgICAgICAgci5jb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAvLyBNYW55VG9NYW55IOy8gOydtOyKpFxuICAgICAgICBjb25zdCByZWxNZCA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgIGNvbnN0IHRhYmxlMSA9IGVudGl0eS50YWJsZTtcbiAgICAgICAgY29uc3QgdGFibGUyID0gcmVsTWQudGFibGU7XG5cbiAgICAgICAgLy8g6rCBIOyXlO2LsO2LsOydmCBQSyDtg4DsnoUg7KCV67O0IOqwgOyguOyYpOq4sFxuICAgICAgICBjb25zdCB0aGlzUGtUeXBlID0gZW50aXR5LmdldFBrVHlwZSgpO1xuICAgICAgICBjb25zdCB0aGlzUGtQcm9wID0gZW50aXR5LmdldFBrUHJvcCgpO1xuICAgICAgICBjb25zdCByZWxQa1R5cGUgPSByZWxNZC5nZXRQa1R5cGUoKTtcbiAgICAgICAgY29uc3QgcmVsUGtQcm9wID0gcmVsTWQuZ2V0UGtQcm9wKCk7XG5cbiAgICAgICAgY29uc3Qgam9pbiA9IHtcbiAgICAgICAgICBmcm9tOiBgJHtlbnRpdHkudGFibGV9LmlkYCxcbiAgICAgICAgICB0aHJvdWdoOiB7XG4gICAgICAgICAgICBmcm9tOiBgJHtwcm9wLmpvaW5UYWJsZX0uJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHRhYmxlMSl9X2lkYCxcbiAgICAgICAgICAgIHRvOiBgJHtwcm9wLmpvaW5UYWJsZX0uJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHRhYmxlMil9X2lkYCxcbiAgICAgICAgICAgIG9uVXBkYXRlOiBwcm9wLm9uVXBkYXRlLFxuICAgICAgICAgICAgb25EZWxldGU6IHByb3Aub25EZWxldGUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0bzogYCR7cmVsTWQudGFibGV9LmlkYCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdGhyb3VnaCA9IGpvaW4udGhyb3VnaDtcbiAgICAgICAgY29uc3QgZmllbGRzID0gW3Rocm91Z2guZnJvbSwgdGhyb3VnaC50b107XG4gICAgICAgIHIuam9pblRhYmxlcy5wdXNoKHtcbiAgICAgICAgICB0YWJsZTogdGhyb3VnaC5mcm9tLnNwbGl0KFwiLlwiKVswXSxcbiAgICAgICAgICBpbmRleGVzOiBlbnRpdHkuaW5kZXhlc1xuICAgICAgICAgICAgLmZpbHRlcigoaW5kZXgpID0+IGluZGV4LmNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZS5pbmNsdWRlcyhgJHtwcm9wLmpvaW5UYWJsZX0uYCkpKVxuICAgICAgICAgICAgLm1hcCgoaW5kZXgpID0+ICh7XG4gICAgICAgICAgICAgIC4uLmluZGV4LFxuICAgICAgICAgICAgICBjb2x1bW5zOiBpbmRleC5jb2x1bW5zLm1hcCgoY29sKSA9PiAoe1xuICAgICAgICAgICAgICAgIG5hbWU6IGNvbC5uYW1lLnJlcGxhY2UoYCR7cHJvcC5qb2luVGFibGV9LmAsIFwiXCIpLFxuICAgICAgICAgICAgICAgIG51bGxzRmlyc3Q6IGNvbC5udWxsc0ZpcnN0LFxuICAgICAgICAgICAgICAgIHNvcnRPcmRlcjogY29sLnNvcnRPcmRlcixcbiAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogXCJpZFwiLFxuICAgICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgICAgICAgbnVsbGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIO2YhOyerCDsl5Tti7Dti7DsnZggRktcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZSh0YWJsZTEpfV9pZGAsXG4gICAgICAgICAgICAgIHR5cGU6IHRoaXNQa1R5cGUsXG4gICAgICAgICAgICAgIG51bGxhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgLi4uKHRoaXNQa1R5cGUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICB0aGlzUGtQcm9wLnR5cGUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICB0aGlzUGtQcm9wLmxlbmd0aCAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgICAgICAgICAgIGxlbmd0aDogdGhpc1BrUHJvcC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8g7LC47KGwIOyXlO2LsO2LsOydmCBGS1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHRhYmxlMil9X2lkYCxcbiAgICAgICAgICAgICAgdHlwZTogcmVsUGtUeXBlLFxuICAgICAgICAgICAgICBudWxsYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgIC4uLihyZWxQa1R5cGUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICByZWxQa1Byb3AudHlwZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgIHJlbFBrUHJvcC5sZW5ndGggIT09IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgICAgICAgICAgICBsZW5ndGg6IHJlbFBrUHJvcC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgZm9yZWlnbnM6IGZpZWxkcy5tYXAoKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICAvLyDtmITsnqwg7ZWE65Oc6rCAIOyWtOuWpCDthYzsnbTruJTsl5Ag7IaN7ZWY64qU7KeAIO2MkOuLqFxuICAgICAgICAgICAgY29uc3QgY29sID0gZmllbGQuc3BsaXQoXCIuXCIpWzFdO1xuICAgICAgICAgICAgY29uc3QgdG8gPSAoKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShqb2luLnRvLnNwbGl0KFwiLlwiKVswXSl9X2lkYCA9PT0gY29sKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGpvaW4udG87XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGpvaW4uZnJvbTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbHVtbnM6IFtjb2xdLFxuICAgICAgICAgICAgICB0byxcbiAgICAgICAgICAgICAgb25VcGRhdGU6IHRocm91Z2gub25VcGRhdGUsXG4gICAgICAgICAgICAgIG9uRGVsZXRlOiB0aHJvdWdoLm9uRGVsZXRlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHxcbiAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICAgKSB7XG4gICAgICAgIC8vIC1PbmVSZWxhdGlvbiDsvIDsnbTsiqRcbiAgICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgY29uc3QgcGtUeXBlID0gcmVsRW50aXR5LmdldFBrVHlwZSgpO1xuICAgICAgICBjb25zdCBwa1Byb3AgPSByZWxFbnRpdHkuZ2V0UGtQcm9wKCk7XG5cbiAgICAgICAgY29uc3QgaWRDb2x1bW5OYW1lID0gYCR7cHJvcC5uYW1lfV9pZGA7XG4gICAgICAgIHIuY29sdW1ucy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBpZENvbHVtbk5hbWUsXG4gICAgICAgICAgdHlwZTogcGtUeXBlLFxuICAgICAgICAgIG51bGxhYmxlOiBwcm9wLm51bGxhYmxlID8/IGZhbHNlLFxuICAgICAgICAgIC8vIHN0cmluZyBGS+yduCDqsr3smrAgbGVuZ3Ro64+EIOyghOuLrFxuICAgICAgICAgIC4uLihwa1R5cGUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgIHBrUHJvcC50eXBlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICBwa1Byb3AubGVuZ3RoICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICAgICAgICBsZW5ndGg6IHBrUHJvcC5sZW5ndGgsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChwcm9wLnVzZUNvbnN0cmFpbnQgPz8gdHJ1ZSkge1xuICAgICAgICAgIHIuZm9yZWlnbnMucHVzaCh7XG4gICAgICAgICAgICBjb2x1bW5zOiBbaWRDb2x1bW5OYW1lXSxcbiAgICAgICAgICAgIHRvOiBgJHtpbmZsZWN0aW9uLnVuZGVyc2NvcmUoaW5mbGVjdGlvbi5wbHVyYWxpemUocHJvcC53aXRoKSkudG9Mb3dlckNhc2UoKX0uaWRgLFxuICAgICAgICAgICAgb25VcGRhdGU6IHByb3Aub25VcGRhdGUgPz8gXCJSRVNUUklDVFwiLFxuICAgICAgICAgICAgb25EZWxldGU6IHByb3Aub25EZWxldGUgPz8gXCJSRVNUUklDVFwiLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAge1xuICAgICAgdGFibGU6IGVudGl0eS50YWJsZSxcbiAgICAgIGNvbHVtbnM6XG4gICAgICAgIC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gW10gYXMgTWlncmF0aW9uQ29sdW1uW10sXG4gICAgICBpbmRleGVzOlxuICAgICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFtdIGFzIE1pZ3JhdGlvbkluZGV4W10sXG4gICAgICBmb3JlaWduczpcbiAgICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBbXSBhcyBNaWdyYXRpb25Gb3JlaWduW10sXG4gICAgICBqb2luVGFibGVzOlxuICAgICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFtdIGFzIE1pZ3JhdGlvbkpvaW5UYWJsZVtdLFxuICAgIH0sXG4gICk7XG5cbiAgLy8gaW5kZXhlc1xuICBtaWdyYXRpb25TZXQuaW5kZXhlcyA9IGVudGl0eS5pbmRleGVzLmZpbHRlcigoaW5kZXgpID0+XG4gICAgaW5kZXguY29sdW1ucy5maW5kKChjb2wpID0+ICFjb2wubmFtZS5pbmNsdWRlcyhcIi5cIikpLFxuICApO1xuXG4gIHJldHVybiBtaWdyYXRpb25TZXQ7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVFbnRpdHlQcm9wVHlwZVRvTWlncmF0aW9uQ29sdW1uVHlwZShwcm9wOiBFbnRpdHlQcm9wKTogTWlncmF0aW9uQ29sdW1uVHlwZSB7XG4gIGlmIChwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIiB8fCBwcm9wLnR5cGUgPT09IFwidmlydHVhbFwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlc29sdmVkIGNvbHVtbiB0eXBlOiAke3Byb3AudHlwZX1gKTtcbiAgfVxuXG4gIHN3aXRjaCAocHJvcC50eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgY2FzZSBcInN0cmluZ1tdXCI6XG4gICAgICByZXR1cm4gXCJzdHJpbmdbXVwiO1xuICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICBjYXNlIFwiZW51bVtdXCI6XG4gICAgICByZXR1cm4gXCJzdHJpbmdbXVwiO1xuICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICByZXR1cm4gXCJpbnRlZ2VyXCI7XG4gICAgY2FzZSBcImludGVnZXJbXVwiOlxuICAgICAgcmV0dXJuIFwiaW50ZWdlcltdXCI7XG4gICAgY2FzZSBcImJpZ0ludGVnZXJcIjpcbiAgICAgIHJldHVybiBcImJpZ0ludGVnZXJcIjtcbiAgICBjYXNlIFwiYmlnSW50ZWdlcltdXCI6XG4gICAgICByZXR1cm4gXCJiaWdJbnRlZ2VyW11cIjtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICByZXR1cm4gXCJudW1iZXJPck51bWVyaWNcIjtcbiAgICBjYXNlIFwibnVtYmVyW11cIjpcbiAgICAgIHJldHVybiBcIm51bWJlck9yTnVtZXJpY1tdXCI7XG4gICAgY2FzZSBcIm51bWVyaWNcIjpcbiAgICAgIHJldHVybiBcIm51bWJlck9yTnVtZXJpY1wiO1xuICAgIGNhc2UgXCJudW1lcmljW11cIjpcbiAgICAgIHJldHVybiBcIm51bWJlck9yTnVtZXJpY1tdXCI7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiBcImJvb2xlYW5cIjtcbiAgICBjYXNlIFwiYm9vbGVhbltdXCI6XG4gICAgICByZXR1cm4gXCJib29sZWFuW11cIjtcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgcmV0dXJuIFwiZGF0ZVwiO1xuICAgIGNhc2UgXCJkYXRlW11cIjpcbiAgICAgIHJldHVybiBcImRhdGVbXVwiO1xuICAgIGNhc2UgXCJ1dWlkXCI6XG4gICAgICByZXR1cm4gXCJ1dWlkXCI7XG4gICAgY2FzZSBcInV1aWRbXVwiOlxuICAgICAgcmV0dXJuIFwidXVpZFtdXCI7XG4gICAgY2FzZSBcImpzb25cIjpcbiAgICAgIHJldHVybiBcImpzb25cIjtcbiAgICBjYXNlIFwic2VhcmNoVGV4dFwiOlxuICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgY2FzZSBcInZlY3RvclwiOlxuICAgICAgcmV0dXJuIFwidmVjdG9yXCI7XG4gICAgY2FzZSBcInZlY3RvcltdXCI6XG4gICAgICByZXR1cm4gXCJ2ZWN0b3JbXVwiO1xuICAgIGNhc2UgXCJ0c3ZlY3RvclwiOlxuICAgICAgcmV0dXJuIFwidHN2ZWN0b3JcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgZXhoYXVzdGl2ZShwcm9wKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFVua25vd24gZW50aXR5IHByb3AgdHlwZTogJHsvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChwcm9wIGFzIHsgdHlwZTogc3RyaW5nIH0pLnR5cGV9YCxcbiAgICAgICk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFzQ0EsU0FBZ0IsMEJBQTBCLFFBQTBDO0NBQ2xG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
|
|
186
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0aW9uLXNldC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlncmF0aW9uL21pZ3JhdGlvbi1zZXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcblxuaW1wb3J0IHsgdHlwZSBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc0hhc01hbnlSZWxhdGlvblByb3AsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNOdW1iZXJQcm9wLFxuICBpc051bWJlclNpbmdsZVByb3AsXG4gIGlzTnVtZXJpY1Byb3AsXG4gIGlzTnVtZXJpY1NpbmdsZVByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1N0cmluZ1Byb3AsXG4gIGlzVmVjdG9yUHJvcCxcbiAgaXNWaXJ0dWFsUHJvcCxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgTWlncmF0aW9uQ29sdW1uLFxuICB0eXBlIE1pZ3JhdGlvbkNvbHVtblR5cGUsXG4gIHR5cGUgTWlncmF0aW9uRm9yZWlnbixcbiAgdHlwZSBNaWdyYXRpb25JbmRleCxcbiAgdHlwZSBNaWdyYXRpb25Kb2luVGFibGUsXG4gIHR5cGUgTWlncmF0aW9uU2V0QW5kSm9pblRhYmxlLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGV4aGF1c3RpdmUgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcblxuLy8gbnVtZXJpYyDsu6zrn7zsl5DshJwgcHJlY2lzaW9uL3NjYWxl7J2EIOyDneuete2WiOydhCDrlYwg7Iuk7KCc66GcIOyDneyEseuQmOuKlCDqsJIoa25leCBkZWNpbWFs7J2YIOq4sOuzuOqwkinsnbTri6QuXG5jb25zdCBOVU1FUklDX0RFRkFVTFRfUFJFQ0lTSU9OID0gODtcbmNvbnN0IE5VTUVSSUNfREVGQVVMVF9TQ0FMRSA9IDI7XG5cbi8qKlxuICogRW50aXR566W8IOydveyWtOyEnCBNaWdyYXRpb25TZXRBbmRKb2luVGFibGXsnYQg66eM65Ok7Ja07Ji164uI64ukLlxuICogQHBhcmFtIGVudGl0eSBFbnRpdHkg6rCd7LK0XG4gKiBAcmV0dXJucyBNaWdyYXRpb25TZXRBbmRKb2luVGFibGUg6rCd7LK0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNaWdyYXRpb25TZXRGcm9tRW50aXR5KGVudGl0eTogRW50aXR5KTogTWlncmF0aW9uU2V0QW5kSm9pblRhYmxlIHtcbiAgY29uc3QgbWlncmF0aW9uU2V0OiBNaWdyYXRpb25TZXRBbmRKb2luVGFibGUgPSBlbnRpdHkucHJvcHMucmVkdWNlKFxuICAgIChyLCBwcm9wKSA9PiB7XG4gICAgICAvLyB2aXJ0dWFsIO2VhOuTnCDsoJzsmbhcbiAgICAgIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfVxuICAgICAgLy8gSGFzTWFueSDsvIDsnbTsiqTripQg7JWE66y0IOyymOumrOuPhCDtlZjsp4Ag7JWK7J2MXG4gICAgICBpZiAoaXNIYXNNYW55UmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfVxuXG4gICAgICAvLyDsnbzrsJgg7Lus65+8XG4gICAgICBpZiAoIWlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHtcbiAgICAgICAgICBuYW1lOiBwcm9wLm5hbWUsXG4gICAgICAgICAgdHlwZTogcmVzb2x2ZUVudGl0eVByb3BUeXBlVG9NaWdyYXRpb25Db2x1bW5UeXBlKHByb3ApLFxuICAgICAgICAgIG51bGxhYmxlOiBwcm9wLm51bGxhYmxlID09PSB0cnVlLFxuICAgICAgICAgIC4uLigoKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvcC5kYkRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRUbzogcHJvcC5kYkRlZmF1bHQsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgfSkoKSxcbiAgICAgICAgICAvLyBTdHJpbmcg7YOA7J6F7JeQIGxlbmd0aCDsnojripQg6rK97JqwIOy2lOqwgFxuICAgICAgICAgIC4uLihpc1N0cmluZ1Byb3AocHJvcCkgJiZcbiAgICAgICAgICAgIHByb3AubGVuZ3RoICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICAgICAgICBsZW5ndGg6IHByb3AubGVuZ3RoLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgLy8gTnVtYmVyL051bWVyaWMg7YOA7J6F7J2YIOqyveyasCBwcmVjaXNpb24sIHNjYWxlIOy2lOqwgFxuICAgICAgICAgIC4uLigoaXNOdW1iZXJQcm9wKHByb3ApIHx8IGlzTnVtZXJpY1Byb3AocHJvcCkpICYmXG4gICAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBudW1iZXJUeXBlID0gaXNOdW1iZXJQcm9wKHByb3ApID8gKHByb3AubnVtYmVyVHlwZSA/PyBcIm51bWVyaWNcIikgOiBcIm51bWVyaWNcIjtcblxuICAgICAgICAgICAgICAvLyBudW1lcmlj7JeQ7IScIHByZWNpc2lvbi9zY2FsZeydhCDsg53rnrXtlZjrqbQga25leCBkZWNpbWFs7J2YIOq4sOuzuOqwkig4LCAyKeycvOuhnCDsu6zrn7zsnbRcbiAgICAgICAgICAgICAgLy8g66eM65Ok7Ja07KeA64qU642wLCBEQuyXkOyEnOuKlCDqt7gg6rCS7J20IOq3uOuMgOuhnCDsnb3tnojrr4DroZwg7JeU7Yuw7YuwIOyqveydhCB1bmRlZmluZWTroZwg65GQ66m0XG4gICAgICAgICAgICAgIC8vIOunpOuyiCDrtojsnbzsuZjroZwg7J6h7Z6M64ukLiDruYTqtZAg7KCE7JeQIOqwmeydgCDquLDrs7jqsJLsnYQg7LGE7JuMIOyLpOygnCDsiqTtgqTrp4jsmYAg66ee7LaY64ukLlxuICAgICAgICAgICAgICBpZiAobnVtYmVyVHlwZSA9PT0gXCJudW1lcmljXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNOdW1iZXJTaW5nbGVQcm9wKHByb3ApIHx8IGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIG51bWJlclR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbjogcHJvcC5wcmVjaXNpb24gPz8gTlVNRVJJQ19ERUZBVUxUX1BSRUNJU0lPTixcbiAgICAgICAgICAgICAgICAgICAgc2NhbGU6IHByb3Auc2NhbGUgPz8gTlVNRVJJQ19ERUZBVUxUX1NDQUxFLFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgbnVtYmVyVHlwZSxcbiAgICAgICAgICAgICAgICAgIC4uLihwcm9wLnByZWNpc2lvbiAhPT0gdW5kZWZpbmVkICYmIHsgcHJlY2lzaW9uOiBwcm9wLnByZWNpc2lvbiB9KSxcbiAgICAgICAgICAgICAgICAgIC4uLihwcm9wLnNjYWxlICE9PSB1bmRlZmluZWQgJiYgeyBzY2FsZTogcHJvcC5zY2FsZSB9KSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gcmVhbC9kb3VibGUgcHJlY2lzaW9u7J2AIHByZWNpc2lvbi9zY2FsZeydhCDsk7Dsp4Ag7JWK64qU64ukKERCIOumrOuNlOuPhCDrsJjtmZjtlZjsp4Ag7JWK7J2MKS5cbiAgICAgICAgICAgICAgcmV0dXJuIHsgbnVtYmVyVHlwZSwgcHJlY2lzaW9uOiBwcm9wLnByZWNpc2lvbiwgc2NhbGU6IHByb3Auc2NhbGUgfTtcbiAgICAgICAgICAgIH0pKCkpLFxuICAgICAgICAgIC8vIFZlY3RvciDtg4DsnoXsnZgg6rK97JqwIGRpbWVuc2lvbnMg7LaU6rCAXG4gICAgICAgICAgLi4uKGlzVmVjdG9yUHJvcChwcm9wKSAmJiB7XG4gICAgICAgICAgICBkaW1lbnNpb25zOiBwcm9wLmRpbWVuc2lvbnMsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgLy8gR2VuZXJhdGVkIENvbHVtbiDsoJXrs7Qg7LaU6rCAXG4gICAgICAgICAgLi4uKHByb3AuZ2VuZXJhdGVkICYmIHtcbiAgICAgICAgICAgIGdlbmVyYXRlZDogcHJvcC5nZW5lcmF0ZWQsXG4gICAgICAgICAgfSksXG4gICAgICAgIH07XG5cbiAgICAgICAgci5jb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAvLyBNYW55VG9NYW55IOy8gOydtOyKpFxuICAgICAgICBjb25zdCByZWxNZCA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgIGNvbnN0IHRhYmxlMSA9IGVudGl0eS50YWJsZTtcbiAgICAgICAgY29uc3QgdGFibGUyID0gcmVsTWQudGFibGU7XG5cbiAgICAgICAgLy8g6rCBIOyXlO2LsO2LsOydmCBQSyDtg4DsnoUg7KCV67O0IOqwgOyguOyYpOq4sFxuICAgICAgICBjb25zdCB0aGlzUGtUeXBlID0gZW50aXR5LmdldFBrVHlwZSgpO1xuICAgICAgICBjb25zdCB0aGlzUGtQcm9wID0gZW50aXR5LmdldFBrUHJvcCgpO1xuICAgICAgICBjb25zdCByZWxQa1R5cGUgPSByZWxNZC5nZXRQa1R5cGUoKTtcbiAgICAgICAgY29uc3QgcmVsUGtQcm9wID0gcmVsTWQuZ2V0UGtQcm9wKCk7XG5cbiAgICAgICAgY29uc3Qgam9pbiA9IHtcbiAgICAgICAgICBmcm9tOiBgJHtlbnRpdHkudGFibGV9LmlkYCxcbiAgICAgICAgICB0aHJvdWdoOiB7XG4gICAgICAgICAgICBmcm9tOiBgJHtwcm9wLmpvaW5UYWJsZX0uJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHRhYmxlMSl9X2lkYCxcbiAgICAgICAgICAgIHRvOiBgJHtwcm9wLmpvaW5UYWJsZX0uJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHRhYmxlMil9X2lkYCxcbiAgICAgICAgICAgIG9uVXBkYXRlOiBwcm9wLm9uVXBkYXRlLFxuICAgICAgICAgICAgb25EZWxldGU6IHByb3Aub25EZWxldGUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0bzogYCR7cmVsTWQudGFibGV9LmlkYCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdGhyb3VnaCA9IGpvaW4udGhyb3VnaDtcbiAgICAgICAgY29uc3QgZmllbGRzID0gW3Rocm91Z2guZnJvbSwgdGhyb3VnaC50b107XG4gICAgICAgIHIuam9pblRhYmxlcy5wdXNoKHtcbiAgICAgICAgICB0YWJsZTogdGhyb3VnaC5mcm9tLnNwbGl0KFwiLlwiKVswXSxcbiAgICAgICAgICBpbmRleGVzOiBlbnRpdHkuaW5kZXhlc1xuICAgICAgICAgICAgLmZpbHRlcigoaW5kZXgpID0+IGluZGV4LmNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZS5pbmNsdWRlcyhgJHtwcm9wLmpvaW5UYWJsZX0uYCkpKVxuICAgICAgICAgICAgLm1hcCgoaW5kZXgpID0+ICh7XG4gICAgICAgICAgICAgIC4uLmluZGV4LFxuICAgICAgICAgICAgICBjb2x1bW5zOiBpbmRleC5jb2x1bW5zLm1hcCgoY29sKSA9PiAoe1xuICAgICAgICAgICAgICAgIG5hbWU6IGNvbC5uYW1lLnJlcGxhY2UoYCR7cHJvcC5qb2luVGFibGV9LmAsIFwiXCIpLFxuICAgICAgICAgICAgICAgIG51bGxzRmlyc3Q6IGNvbC5udWxsc0ZpcnN0LFxuICAgICAgICAgICAgICAgIHNvcnRPcmRlcjogY29sLnNvcnRPcmRlcixcbiAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogXCJpZFwiLFxuICAgICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgICAgICAgbnVsbGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIO2YhOyerCDsl5Tti7Dti7DsnZggRktcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZSh0YWJsZTEpfV9pZGAsXG4gICAgICAgICAgICAgIHR5cGU6IHRoaXNQa1R5cGUsXG4gICAgICAgICAgICAgIG51bGxhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgLi4uKHRoaXNQa1R5cGUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICB0aGlzUGtQcm9wLnR5cGUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICB0aGlzUGtQcm9wLmxlbmd0aCAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgICAgICAgICAgIGxlbmd0aDogdGhpc1BrUHJvcC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8g7LC47KGwIOyXlO2LsO2LsOydmCBGS1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHRhYmxlMil9X2lkYCxcbiAgICAgICAgICAgICAgdHlwZTogcmVsUGtUeXBlLFxuICAgICAgICAgICAgICBudWxsYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgIC4uLihyZWxQa1R5cGUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICByZWxQa1Byb3AudHlwZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgIHJlbFBrUHJvcC5sZW5ndGggIT09IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgICAgICAgICAgICBsZW5ndGg6IHJlbFBrUHJvcC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgZm9yZWlnbnM6IGZpZWxkcy5tYXAoKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICAvLyDtmITsnqwg7ZWE65Oc6rCAIOyWtOuWpCDthYzsnbTruJTsl5Ag7IaN7ZWY64qU7KeAIO2MkOuLqFxuICAgICAgICAgICAgY29uc3QgY29sID0gZmllbGQuc3BsaXQoXCIuXCIpWzFdO1xuICAgICAgICAgICAgY29uc3QgdG8gPSAoKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShqb2luLnRvLnNwbGl0KFwiLlwiKVswXSl9X2lkYCA9PT0gY29sKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGpvaW4udG87XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGpvaW4uZnJvbTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbHVtbnM6IFtjb2xdLFxuICAgICAgICAgICAgICB0byxcbiAgICAgICAgICAgICAgb25VcGRhdGU6IHRocm91Z2gub25VcGRhdGUsXG4gICAgICAgICAgICAgIG9uRGVsZXRlOiB0aHJvdWdoLm9uRGVsZXRlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHxcbiAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICAgKSB7XG4gICAgICAgIC8vIC1PbmVSZWxhdGlvbiDsvIDsnbTsiqRcbiAgICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgY29uc3QgcGtUeXBlID0gcmVsRW50aXR5LmdldFBrVHlwZSgpO1xuICAgICAgICBjb25zdCBwa1Byb3AgPSByZWxFbnRpdHkuZ2V0UGtQcm9wKCk7XG5cbiAgICAgICAgY29uc3QgaWRDb2x1bW5OYW1lID0gYCR7cHJvcC5uYW1lfV9pZGA7XG4gICAgICAgIHIuY29sdW1ucy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBpZENvbHVtbk5hbWUsXG4gICAgICAgICAgdHlwZTogcGtUeXBlLFxuICAgICAgICAgIG51bGxhYmxlOiBwcm9wLm51bGxhYmxlID8/IGZhbHNlLFxuICAgICAgICAgIC8vIHN0cmluZyBGS+yduCDqsr3smrAgbGVuZ3Ro64+EIOyghOuLrFxuICAgICAgICAgIC4uLihwa1R5cGUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgIHBrUHJvcC50eXBlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICBwa1Byb3AubGVuZ3RoICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICAgICAgICBsZW5ndGg6IHBrUHJvcC5sZW5ndGgsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChwcm9wLnVzZUNvbnN0cmFpbnQgPz8gdHJ1ZSkge1xuICAgICAgICAgIHIuZm9yZWlnbnMucHVzaCh7XG4gICAgICAgICAgICBjb2x1bW5zOiBbaWRDb2x1bW5OYW1lXSxcbiAgICAgICAgICAgIHRvOiBgJHtpbmZsZWN0aW9uLnVuZGVyc2NvcmUoaW5mbGVjdGlvbi5wbHVyYWxpemUocHJvcC53aXRoKSkudG9Mb3dlckNhc2UoKX0uaWRgLFxuICAgICAgICAgICAgb25VcGRhdGU6IHByb3Aub25VcGRhdGUgPz8gXCJSRVNUUklDVFwiLFxuICAgICAgICAgICAgb25EZWxldGU6IHByb3Aub25EZWxldGUgPz8gXCJSRVNUUklDVFwiLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAge1xuICAgICAgdGFibGU6IGVudGl0eS50YWJsZSxcbiAgICAgIGNvbHVtbnM6XG4gICAgICAgIC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gW10gYXMgTWlncmF0aW9uQ29sdW1uW10sXG4gICAgICBpbmRleGVzOlxuICAgICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFtdIGFzIE1pZ3JhdGlvbkluZGV4W10sXG4gICAgICBmb3JlaWduczpcbiAgICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBbXSBhcyBNaWdyYXRpb25Gb3JlaWduW10sXG4gICAgICBqb2luVGFibGVzOlxuICAgICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFtdIGFzIE1pZ3JhdGlvbkpvaW5UYWJsZVtdLFxuICAgIH0sXG4gICk7XG5cbiAgLy8gaW5kZXhlc1xuICBtaWdyYXRpb25TZXQuaW5kZXhlcyA9IGVudGl0eS5pbmRleGVzLmZpbHRlcigoaW5kZXgpID0+XG4gICAgaW5kZXguY29sdW1ucy5maW5kKChjb2wpID0+ICFjb2wubmFtZS5pbmNsdWRlcyhcIi5cIikpLFxuICApO1xuXG4gIHJldHVybiBtaWdyYXRpb25TZXQ7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVFbnRpdHlQcm9wVHlwZVRvTWlncmF0aW9uQ29sdW1uVHlwZShwcm9wOiBFbnRpdHlQcm9wKTogTWlncmF0aW9uQ29sdW1uVHlwZSB7XG4gIGlmIChwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIiB8fCBwcm9wLnR5cGUgPT09IFwidmlydHVhbFwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlc29sdmVkIGNvbHVtbiB0eXBlOiAke3Byb3AudHlwZX1gKTtcbiAgfVxuXG4gIHN3aXRjaCAocHJvcC50eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgY2FzZSBcInN0cmluZ1tdXCI6XG4gICAgICByZXR1cm4gXCJzdHJpbmdbXVwiO1xuICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICBjYXNlIFwiZW51bVtdXCI6XG4gICAgICByZXR1cm4gXCJzdHJpbmdbXVwiO1xuICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICByZXR1cm4gXCJpbnRlZ2VyXCI7XG4gICAgY2FzZSBcImludGVnZXJbXVwiOlxuICAgICAgcmV0dXJuIFwiaW50ZWdlcltdXCI7XG4gICAgY2FzZSBcImJpZ0ludGVnZXJcIjpcbiAgICAgIHJldHVybiBcImJpZ0ludGVnZXJcIjtcbiAgICBjYXNlIFwiYmlnSW50ZWdlcltdXCI6XG4gICAgICByZXR1cm4gXCJiaWdJbnRlZ2VyW11cIjtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICByZXR1cm4gXCJudW1iZXJPck51bWVyaWNcIjtcbiAgICBjYXNlIFwibnVtYmVyW11cIjpcbiAgICAgIHJldHVybiBcIm51bWJlck9yTnVtZXJpY1tdXCI7XG4gICAgY2FzZSBcIm51bWVyaWNcIjpcbiAgICAgIHJldHVybiBcIm51bWJlck9yTnVtZXJpY1wiO1xuICAgIGNhc2UgXCJudW1lcmljW11cIjpcbiAgICAgIHJldHVybiBcIm51bWJlck9yTnVtZXJpY1tdXCI7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiBcImJvb2xlYW5cIjtcbiAgICBjYXNlIFwiYm9vbGVhbltdXCI6XG4gICAgICByZXR1cm4gXCJib29sZWFuW11cIjtcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgcmV0dXJuIFwiZGF0ZVwiO1xuICAgIGNhc2UgXCJkYXRlW11cIjpcbiAgICAgIHJldHVybiBcImRhdGVbXVwiO1xuICAgIGNhc2UgXCJ1dWlkXCI6XG4gICAgICByZXR1cm4gXCJ1dWlkXCI7XG4gICAgY2FzZSBcInV1aWRbXVwiOlxuICAgICAgcmV0dXJuIFwidXVpZFtdXCI7XG4gICAgY2FzZSBcImpzb25cIjpcbiAgICAgIHJldHVybiBcImpzb25cIjtcbiAgICBjYXNlIFwic2VhcmNoVGV4dFwiOlxuICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgY2FzZSBcInZlY3RvclwiOlxuICAgICAgcmV0dXJuIFwidmVjdG9yXCI7XG4gICAgY2FzZSBcInZlY3RvcltdXCI6XG4gICAgICByZXR1cm4gXCJ2ZWN0b3JbXVwiO1xuICAgIGNhc2UgXCJ0c3ZlY3RvclwiOlxuICAgICAgcmV0dXJuIFwidHN2ZWN0b3JcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgZXhoYXVzdGl2ZShwcm9wKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFVua25vd24gZW50aXR5IHByb3AgdHlwZTogJHsvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChwcm9wIGFzIHsgdHlwZTogc3RyaW5nIH0pLnR5cGV9YCxcbiAgICAgICk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFzQ0EsU0FBZ0IsMEJBQTBCLFFBQTBDO0NBQ2xG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
|
|
@@ -19,7 +19,7 @@ import assert from "assert";
|
|
|
19
19
|
import path from "path";
|
|
20
20
|
import chalk from "chalk";
|
|
21
21
|
import { mkdir, readdir, writeFile } from "fs/promises";
|
|
22
|
-
|
|
22
|
+
// src/migration/migrator.ts
|
|
23
23
|
function padDatePart(number, size = 2) {
|
|
24
24
|
return number.toString().padStart(size, "0");
|
|
25
25
|
}
|
|
@@ -559,8 +559,7 @@ var init_migrator = __esmMin((() => {
|
|
|
559
559
|
}
|
|
560
560
|
};
|
|
561
561
|
}));
|
|
562
|
-
//#endregion
|
|
563
562
|
init_migrator();
|
|
564
563
|
export { MigrationTargetExecutionError, Migrator, init_migrator };
|
|
565
564
|
|
|
566
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0b3IuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZ3JhdGlvbi9taWdyYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IG1rZGlyLCByZWFkZGlyLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyBncm91cCwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBjcmVhdGVLbmV4SW5zdGFuY2UgfSBmcm9tIFwiLi4vZGF0YWJhc2Uva25leFwiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vZGljdC9zZFwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IGdldFNvbmFtdUVudmlyb25tZW50IH0gZnJvbSBcIi4uL2VudlwiO1xuaW1wb3J0IHsgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uIH0gZnJvbSBcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB7IHR5cGUgR2VuTWlncmF0aW9uQ29kZSwgdHlwZSBNaWdyYXRpb25TZXQgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGlzTG9jYWwsIGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IGlzT2JqZWN0VmFsdWUsIGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVBbHRlckNvZGUsIGdlbmVyYXRlQ3JlYXRlQ29kZSB9IGZyb20gXCIuL2NvZGUtZ2VuZXJhdGlvblwiO1xuaW1wb3J0IHsgZ2V0TWlncmF0aW9uU2V0RnJvbUVudGl0eSB9IGZyb20gXCIuL21pZ3JhdGlvbi1zZXRcIjtcbmltcG9ydCB7IFBvc3RncmVTUUxTY2hlbWFSZWFkZXIgfSBmcm9tIFwiLi9wb3N0Z3Jlc3FsLXNjaGVtYS1yZWFkZXJcIjtcbmltcG9ydCB7IFNsYWNrQ29uZmlybSB9IGZyb20gXCIuL3NsYWNrLWNvbmZpcm1cIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29ublN0cmluZyxcbiAgdHlwZSBNaWdyYXRpb25BY3Rpb24sXG4gIHR5cGUgTWlncmF0aW9uQ29kZSxcbiAgdHlwZSBNaWdyYXRpb25Db25uZWN0aW9uTWV0YSxcbiAgdHlwZSBNaWdyYXRpb25Db25uZWN0aW9uU3RhdHVzLFxuICB0eXBlIE1pZ3JhdGlvblByb2dyZXNzRXZlbnQsXG4gIHR5cGUgTWlncmF0aW9uUnVuT3B0aW9ucyxcbiAgdHlwZSBNaWdyYXRpb25TdGF0dXMsXG4gIHR5cGUgTWlncmF0aW9uVGFyZ2V0LFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgdHlwZSBNaWdyYXRpb25SZXN1bHQgPSB7XG4gIGNvbm5LZXk6IHN0cmluZztcbiAgYmF0Y2hObzogbnVtYmVyO1xuICBhcHBsaWVkOiBzdHJpbmdbXTtcbn1bXTtcblxudHlwZSBTaGFkb3dNaWdyYXRpb25UYXJnZXQgPSBFeHRyYWN0PE1pZ3JhdGlvblRhcmdldCwgXCJmaXh0dXJlXCIgfCBcInRlc3RcIj47XG5cbmZ1bmN0aW9uIHBhZERhdGVQYXJ0KG51bWJlcjogbnVtYmVyLCBzaXplOiBudW1iZXIgPSAyKTogc3RyaW5nIHtcbiAgcmV0dXJuIG51bWJlci50b1N0cmluZygpLnBhZFN0YXJ0KHNpemUsIFwiMFwiKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1pZ3JhdGlvblRhcmdldEV4ZWN1dGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29ubktleTogTWlncmF0aW9uVGFyZ2V0IHwgXCJzaGFkb3dcIixcbiAgICBjYXVzZTogdW5rbm93bixcbiAgKSB7XG4gICAgc3VwZXIoY2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IGNhdXNlLm1lc3NhZ2UgOiBTdHJpbmcoY2F1c2UpKTtcbiAgICB0aGlzLm5hbWUgPSBcIk1pZ3JhdGlvblRhcmdldEV4ZWN1dGlvbkVycm9yXCI7XG4gIH1cbn1cblxuLy8g66eI7J206re466CI7J207IWYIOyDge2DnCDsobDtmowg7IucIERCIOyXsOqysCDtmZXsnbgg7YOA7J6E7JWE7JuDKG1zKS5cbi8vIGNyZWF0ZUtuZXhJbnN0YW5jZeydmCDsu6TrhKXshZgg7ZqN65OdIO2DgOyehOyVhOybgygzMOy0iCnsl5Agc3RhdHVzL2xpc3QvY3VycmVudFZlcnNpb27snbRcbi8vIOqwgeqwgSDqsbjrpqzrqbQgQ0xJL1VJ6rCAIOy1nOuMgCDsiJjsi60g7LSIIGhhbmftlZzri6QuIOygleyDgSDsnZHri7XsnYAg7IiY67CxIG1z7J2066+A66GcIDXstIjrqbQg7Lap67aE7ZWY64ukLlxuY29uc3QgTUlHUkFUSU9OX0NPTk5fVElNRU9VVF9NUyA9IDUwMDA7XG5jb25zdCBMT0NBTF9EQl9IT1NUUyA9IG5ldyBTZXQoW1wibG9jYWxob3N0XCIsIFwiMTI3LjAuMC4xXCIsIFwiMC4wLjAuMFwiLCBcIjo6MVwiXSk7XG5cbi8qKlxuICog7KO87Ja07KeEIFByb21pc2XqsIAgbXMg7JWI7JeQIOyZhOujjOuQmOyngCDslYrsnLzrqbQgb25UaW1lb3V0IOyXkOufrOuhnCByZWplY3TtlZzri6QuXG4gKiDsm5Drs7ggUHJvbWlzZSDsnpDssrTripQg6rOE7IaNIOynhO2WieuQmOuvgOuhnCwg7Zi47Lac7Lih7JeQ7IScIOy7pOuEpeyFmCDsoJXrpqwoZGVzdHJveSnrpbwg7LGF7J6E7KeE64ukLlxuICovXG5mdW5jdGlvbiB3aXRoVGltZW91dDxUPihwcm9taXNlOiBQcm9taXNlPFQ+LCBtczogbnVtYmVyLCBvblRpbWVvdXQ6ICgpID0+IEVycm9yKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHJlamVjdChvblRpbWVvdXQoKSksIG1zKTtcbiAgICBwcm9taXNlLnRoZW4oXG4gICAgICAodmFsdWUpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9LFxuICAgICk7XG4gIH0pO1xufVxuXG4vKipcbiAqIE5vdGUgMjAyNi0wOC0yNiwg67OR7KSAXG4gKiDsnbQg7YG0656Y7Iqk7JeQ7IScIGRlcHJlY2F0ZWQg67aZ7Ja07J6I64qUIOy5nOq1rOuTpOydgCDtmIQgQ0xJ66W8IOychO2VnCDtlZjsnIQg7Zi47ZmY7J2064uILFxuICogQ0xJIOumrO2Mqe2GoOungSDsi5zsoJDsl5DshJwg7KCc6rGw7ZW07KO87IWU64+EIOustOuwqe2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1pZ3JhdG9yIHtcbiAgcHJpdmF0ZSBpc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yPFZhbHVlPihlcnJvcjogVmFsdWUpOiBib29sZWFuIHtcbiAgICBpZiAoIWlzT2JqZWN0VmFsdWUoZXJyb3IpIHx8IGVycm9yID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgbWF5YmVQb3N0Z3Jlc0Vycm9yID1cbiAgICAgIC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gZXJyb3IgYXMge1xuICAgICAgICBjb2RlPzogdW5rbm93bjtcbiAgICAgIH07XG4gICAgLy8gUG9zdGdyZVNRTCB1bmRlZmluZWRfdGFibGUg7L2U65Oc64qUIOyCrOyaqeyekCDsp4DsoJUgbWlncmF0aW9uIHRhYmxl7JeQ64+EIOuPmeydvO2VmOqyjCDsoIHsmqnrkKnri4jri6QuXG4gICAgcmV0dXJuIG1heWJlUG9zdGdyZXNFcnJvci5jb2RlID09PSBcIjQyUDAxXCI7XG4gIH1cblxuICAvKiog7ZiE7J6sIOyLpO2WiSDtmZjqsr3sl5DshJwg7ZeI7Jqp65CcIOuniOydtOq3uOugiOydtOyFmCDrjIDsg4Eg7YKk66W8IOuwmO2ZmO2VqeuLiOuLpC4gKi9cbiAgZ2V0TWlncmF0aW9uVGFyZ2V0S2V5cygpOiBNaWdyYXRpb25UYXJnZXRbXSB7XG4gICAgY29uc3QgY29ubktleXMgPVxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBPYmplY3Qua2V5cyhcbiAgICAgICAgU29uYW11LmRiQ29uZmlnLFxuICAgICAgKS5maWx0ZXIoKGtleSkgPT4gIWtleS5lbmRzV2l0aChcIl9yZWFkb25seVwiKSkgYXMgKGtleW9mIFNvbmFtdURCQ29uZmlnKVtdO1xuXG4gICAgaWYgKGlzTG9jYWwoKSkge1xuICAgICAgcmV0dXJuIGNvbm5LZXlzO1xuICAgIH1cblxuICAgIGNvbnN0IGVudmlyb25tZW50ID0gZ2V0U29uYW11RW52aXJvbm1lbnQoKTtcbiAgICByZXR1cm4gY29ubktleXMuZmlsdGVyKChrZXkpID0+IGtleSA9PT0gZW52aXJvbm1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5NaWdyYXRpb25zU2VxdWVudGlhbGx5KFxuICAgIGNvbm5zOiB7IGNvbm5LZXk6IGtleW9mIFNvbmFtdURCQ29uZmlnOyBrbmV4OiBLbmV4IH1bXSxcbiAgICBhY3Rpb246IFwiYXBwbHlcIiB8IFwicm9sbGJhY2tcIixcbiAgICBvcHRpb25zPzogTWlncmF0aW9uUnVuT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCByZXN1bHRzOiBNaWdyYXRpb25SZXN1bHQgPSBbXTtcblxuICAgIGZvciAoY29uc3QgeyBjb25uS2V5LCBrbmV4IH0gb2YgY29ubnMpIHtcbiAgICAgIGNvbnN0IHByb2dyZXNzID0gdGhpcy5jcmVhdGVQcm9ncmVzc0hvb2tzKGFjdGlvbiwgY29ubktleSwgb3B0aW9ucyk7XG4gICAgICBsZXQgbWlncmF0aW9uUmVzdWx0OiBbbnVtYmVyLCBzdHJpbmdbXV07XG4gICAgICB0cnkge1xuICAgICAgICBtaWdyYXRpb25SZXN1bHQgPVxuICAgICAgICAgIGFjdGlvbiA9PT0gXCJhcHBseVwiXG4gICAgICAgICAgICA/IGF3YWl0IGtuZXgubWlncmF0ZS5sYXRlc3QocHJvZ3Jlc3MpXG4gICAgICAgICAgICA6IGF3YWl0IGtuZXgubWlncmF0ZS5yb2xsYmFjayhwcm9ncmVzcyk7XG4gICAgICB9IGNhdGNoIChjYXVnaHQpIHtcbiAgICAgICAgLy8gbGlmZWN5Y2xlIGhvb2sg7J207KCE7J2YIOyXsOqysMK3bG9ja8K366qp66GdIOyhsO2ajCDsi6TtjKjrj4Qg7Iuk7KCcIOuMgOyDgSBEQuyXkCDqt4Dsho3tlanri4jri6QuXG4gICAgICAgIHRocm93IG5ldyBNaWdyYXRpb25UYXJnZXRFeGVjdXRpb25FcnJvcihjb25uS2V5LCBjYXVnaHQpO1xuICAgICAgfVxuICAgICAgY29uc3QgW2JhdGNoTm8sIGFwcGxpZWRdID0gbWlncmF0aW9uUmVzdWx0O1xuXG4gICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICBjb25uS2V5LFxuICAgICAgICBiYXRjaE5vLFxuICAgICAgICBhcHBsaWVkLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmVtaXRQcm9ncmVzcyhvcHRpb25zLCB7XG4gICAgICAgIHR5cGU6IFwidGFyZ2V0LWNvbXBsZXRlXCIsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY29ubktleSxcbiAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgZmlsZXM6IGFwcGxpZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHByaXZhdGUgbWlncmF0aW9uTmFtZTxWYWx1ZT4obWlncmF0aW9uOiBWYWx1ZSk6IHN0cmluZyB7XG4gICAgaWYgKGlzU3RyaW5nVmFsdWUobWlncmF0aW9uKSkge1xuICAgICAgcmV0dXJuIHBhdGguYmFzZW5hbWUobWlncmF0aW9uKTtcbiAgICB9XG4gICAgaWYgKGlzT2JqZWN0VmFsdWUobWlncmF0aW9uKSAmJiBtaWdyYXRpb24gIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9XG4gICAgICAgIC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gbWlncmF0aW9uIGFzIHtcbiAgICAgICAgICBmaWxlPzogdW5rbm93bjtcbiAgICAgICAgICBuYW1lPzogdW5rbm93bjtcbiAgICAgICAgfTtcbiAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKGNhbmRpZGF0ZS5maWxlKSkge1xuICAgICAgICByZXR1cm4gcGF0aC5iYXNlbmFtZShjYW5kaWRhdGUuZmlsZSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNTdHJpbmdWYWx1ZShjYW5kaWRhdGUubmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHBhdGguYmFzZW5hbWUoY2FuZGlkYXRlLm5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKG1pZ3JhdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGVtaXRQcm9ncmVzcyhvcHRpb25zOiBNaWdyYXRpb25SdW5PcHRpb25zIHwgdW5kZWZpbmVkLCBldmVudDogTWlncmF0aW9uUHJvZ3Jlc3NFdmVudCkge1xuICAgIHRyeSB7XG4gICAgICBvcHRpb25zPy5vblByb2dyZXNzPy4oZXZlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyDsp4TtlonrpaAg7IaM67mE7J6Q7J2YIOyLpO2MqOqwgCDsnbTrr7gg7Iuc7J6R7ZWcIERCIOyekeyXheqzvCDsoJXrpqzrpbwg67Cp7ZW07ZWY66m0IOyViCDrkKnri4jri6QuXG4gICAgICBjb25zb2xlLndhcm4oXCJNaWdyYXRpb24gcHJvZ3Jlc3Mgb2JzZXJ2ZXIgZmFpbGVkOlwiLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVQcm9ncmVzc0hvb2tzKFxuICAgIGFjdGlvbjogTWlncmF0aW9uQWN0aW9uLFxuICAgIGNvbm5LZXk6IE1pZ3JhdGlvblRhcmdldCB8IFwic2hhZG93XCIsXG4gICAgb3B0aW9ucz86IE1pZ3JhdGlvblJ1bk9wdGlvbnMsXG4gICk6IEtuZXguTWlncmF0b3JDb25maWdXaXRoTGlmZWN5Y2xlSG9va3Mge1xuICAgIGxldCBmaWxlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBlbWl0RmlsZSA9IDxWYWx1ZT4odHlwZTogXCJmaWxlLXN0YXJ0XCIgfCBcImZpbGUtZXhlY3V0ZWRcIiwgbWlncmF0aW9uOiBWYWx1ZSkgPT4ge1xuICAgICAgY29uc3QgZmlsZSA9IHRoaXMubWlncmF0aW9uTmFtZShtaWdyYXRpb24pO1xuICAgICAgY29uc3QgaW5kZXggPSBNYXRoLm1heChmaWxlcy5pbmRleE9mKGZpbGUpLCAwKTtcbiAgICAgIHRoaXMuZW1pdFByb2dyZXNzKG9wdGlvbnMsIHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjb25uS2V5LFxuICAgICAgICBmaWxlLFxuICAgICAgICBpbmRleCxcbiAgICAgICAgdG90YWw6IGZpbGVzLmxlbmd0aCxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgYmVmb3JlQWxsOiBhc3luYyAoX2tuZXgsIG1pZ3JhdGlvbnMpID0+IHtcbiAgICAgICAgZmlsZXMgPSBtaWdyYXRpb25zLm1hcCgobWlncmF0aW9uKSA9PiB0aGlzLm1pZ3JhdGlvbk5hbWUobWlncmF0aW9uKSk7XG4gICAgICAgIHRoaXMuZW1pdFByb2dyZXNzKG9wdGlvbnMsIHsgdHlwZTogXCJ0YXJnZXQtc3RhcnRcIiwgYWN0aW9uLCBjb25uS2V5LCBmaWxlcyB9KTtcbiAgICAgIH0sXG4gICAgICBiZWZvcmVFYWNoOiBhc3luYyAoX2tuZXgsIG1pZ3JhdGlvbnMpID0+IHtcbiAgICAgICAgbWlncmF0aW9ucy5mb3JFYWNoKChtaWdyYXRpb24pID0+IGVtaXRGaWxlKFwiZmlsZS1zdGFydFwiLCBtaWdyYXRpb24pKTtcbiAgICAgIH0sXG4gICAgICBhZnRlckVhY2g6IGFzeW5jIChfa25leCwgbWlncmF0aW9ucykgPT4ge1xuICAgICAgICBtaWdyYXRpb25zLmZvckVhY2goKG1pZ3JhdGlvbikgPT4gZW1pdEZpbGUoXCJmaWxlLWV4ZWN1dGVkXCIsIG1pZ3JhdGlvbikpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NlcnRNaWdyYXRpb25UYXJnZXQoY29ubktleTogTWlncmF0aW9uVGFyZ2V0KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmdldE1pZ3JhdGlvblRhcmdldEtleXMoKS5pbmNsdWRlcyhjb25uS2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTWlncmF0aW9uIHRhcmdldCBpcyBub3QgYWxsb3dlZCBpbiBOT0RFX0VOVj0ke2dldFNvbmFtdUVudmlyb25tZW50KCl9OiAke1N0cmluZyhjb25uS2V5KX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog66eI7J206re466CI7J207IWYIOuMgOyDgSDsu6TrhKXshZjsnZgg7KCV7KCBIOuplO2DgOuNsOydtO2EsOulvCDrsJjtmZjtlanri4jri6QuXG4gICAqIERC7JeQIOyXsOqysO2VmOyngCDslYrsnLzrr4DroZwgQ0xJ7JmAIFdlYuydtCDsg4Htg5wg7KGw7ZqMIOyghOyXkCDsponsi5wg7IKs7Jqp7ZWgIOyImCDsnojsirXri4jri6QuXG4gICAqXG4gICAqIEBjYXRlZ29yeSDrtoTrpqztmJUg66eI7J206re466CI7J207IWYIEFQSVxuICAgKi9cbiAgZ2V0Q29ubmVjdGlvbnMoKTogTWlncmF0aW9uQ29ubmVjdGlvbk1ldGFbXSB7XG4gICAgY29uc3Qgc2xhY2tDb25maXJtID0gbmV3IFNsYWNrQ29uZmlybSgpO1xuICAgIHJldHVybiB0aGlzLmdldE1pZ3JhdGlvblRhcmdldEtleXMoKS5tYXAoKGNvbm5LZXkpID0+IHtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPVxuICAgICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFNvbmFtdS5kYkNvbmZpZ1tcbiAgICAgICAgICBjb25uS2V5XG4gICAgICAgIF0uY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgICAgIGNvbnN0IGhvc3QgPSBjb25uZWN0aW9uLmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbm5LZXksXG4gICAgICAgIG5hbWU6IFN0cmluZyhjb25uS2V5KSxcbiAgICAgICAgaG9zdCxcbiAgICAgICAgcG9ydDogY29ubmVjdGlvbi5wb3J0ID8/IDU0MzIsXG4gICAgICAgIGRhdGFiYXNlOiBjb25uZWN0aW9uLmRhdGFiYXNlID8/IFwiXCIsXG4gICAgICAgIHJlbW90ZTogIUxPQ0FMX0RCX0hPU1RTLmhhcyhob3N0LnRvTG93ZXJDYXNlKCkpLFxuICAgICAgICByZXF1aXJlc0FwcHJvdmFsOiBzbGFja0NvbmZpcm0uaXNUYXJnZXRSZXF1aXJlc0FwcHJvdmFsKGNvbm5LZXkpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDshozsiqTsl5Ag7KG07J6s7ZWY64qUIOuniOydtOq3uOugiOydtOyFmCDtjIzsnbwg66qp66Gd7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBnZXRNaWdyYXRpb25Db2RlcygpOiBQcm9taXNlPE1pZ3JhdGlvbkNvZGVbXT4ge1xuICAgIGNvbnN0IHNyY01pZ3JhdGlvbnNEaXIgPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcIm1pZ3JhdGlvbnNcIik7IC8vIOydtOqxtCDtmZjqsr3sl5Ag6rSA6rOE7JeG7J20IO2VreyDgSBzcmPsl5DshJwg7LC+7JWE7JW8IO2VtOyalC5cblxuICAgIGlmICghKGF3YWl0IGV4aXN0cyhzcmNNaWdyYXRpb25zRGlyKSkpIHtcbiAgICAgIGF3YWl0IG1rZGlyKHNyY01pZ3JhdGlvbnNEaXIsIHtcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29kZXMgPSAoYXdhaXQgcmVhZGRpcihzcmNNaWdyYXRpb25zRGlyKSlcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoXCIudHNcIikpXG4gICAgICAubWFwKChmKSA9PiAoe1xuICAgICAgICBuYW1lOiBmLnJlcGxhY2UoXCIudHNcIiwgXCJcIiksXG4gICAgICAgIHBhdGg6IHBhdGguam9pbihzcmNNaWdyYXRpb25zRGlyLCBmKSxcbiAgICAgIH0pKVxuICAgICAgLnRvU29ydGVkKChhLCBiKSA9PiAoYS5uYW1lIDwgYi5uYW1lID8gMSA6IC0xKSk7IC8vIOydtOumhCDrgrTrprzssKjsiJwg7KCV66CsKOy1nOyLoOyInClcblxuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRNaWdyYXRpb25Db2RlczpyZXN1bHRzXCIsIGNvZGVzKTtcbiAgICByZXR1cm4gY29kZXM7XG4gIH1cblxuICAvKipcbiAgICog7Luk64Sl7IWYIO2VmOuCmOydmCDtmITsnqwg67KE7KCE6rO8IHBlbmRpbmcg66qp66Gd7J2EIOuPheumveyggeycvOuhnCDsobDtmoztlanri4jri6QuXG4gICAqIOyXrOufrCDrjIDsg4HsnYAg7Zi47Lac7J6Q6rCAIOuzkeugrOuhnCDsobDrpr3tlaAg7IiYIOyeiOyKteuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBnZXRDb25uZWN0aW9uU3RhdHVzKGNvbm5LZXk6IE1pZ3JhdGlvblRhcmdldCk6IFByb21pc2U8TWlncmF0aW9uQ29ubmVjdGlvblN0YXR1cz4ge1xuICAgIHRoaXMuYXNzZXJ0TWlncmF0aW9uVGFyZ2V0KGNvbm5LZXkpO1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IGNvZGVzID0gYXdhaXQgdGhpcy5nZXRNaWdyYXRpb25Db2RlcygpO1xuICAgIGNvbnN0IGtuZXhPcHRpb25zID0gU29uYW11LmRiQ29uZmlnW2Nvbm5LZXldO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPVxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBrbmV4T3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICAgIC8vIFNBRkVUWTogS25leOqwgCDsoJzqs7XtlZwgUG9zdGdyZVNRTCDsl7DqsrAg6rWs7ISx7J2EIOuzteyCrO2VtCB0aW1lb3V0IO2VhOuTnOunjCDrja7slrTsk7Tri6QuXG4gICAgY29uc3QgdENvbm4gPSBjcmVhdGVLbmV4SW5zdGFuY2Uoe1xuICAgICAgLi4ua25leE9wdGlvbnMsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLmNvbm5lY3Rpb24sXG4gICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzOiBNSUdSQVRJT05fQ09OTl9USU1FT1VUX01TLFxuICAgICAgfSxcbiAgICAgIHBvb2w6IHtcbiAgICAgICAgLi4ua25leE9wdGlvbnMucG9vbCxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBhY3F1aXJlVGltZW91dE1pbGxpczogTUlHUkFUSU9OX0NPTk5fVElNRU9VVF9NUyxcbiAgICAgICAgY3JlYXRlVGltZW91dE1pbGxpczogTUlHUkFUSU9OX0NPTk5fVElNRU9VVF9NUyxcbiAgICAgICAgcHJvcGFnYXRlQ3JlYXRlRXJyb3I6IHRydWUsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdpdGhUaW1lb3V0KHRDb25uLnJhdyhcInNlbGVjdCAxXCIpLCBNSUdSQVRJT05fQ09OTl9USU1FT1VUX01TLCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoXG4gICAgICAgICAgYERCIOyXsOqysCDsi5zqsIQg7LSI6rO8ICgke01JR1JBVElPTl9DT05OX1RJTUVPVVRfTVN9bXMpIOKAlCAke2Nvbm5lY3Rpb24uaG9zdH06JHtjb25uZWN0aW9uLnBvcnR9LyR7Y29ubmVjdGlvbi5kYXRhYmFzZX1gLFxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGxldCBlcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3Qgc3RhdHVzOiBudW1iZXIgfCBcImVycm9yXCIgPSBhd2FpdCB0Q29ubi5taWdyYXRlLnN0YXR1cygpLmNhdGNoKChjYXVnaHQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNNaXNzaW5nTWlncmF0aW9uVGFibGVFcnJvcihjYXVnaHQpKSB7XG4gICAgICAgICAgcmV0dXJuIGNvZGVzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlcnJvciA9IGNhdWdodCBpbnN0YW5jZW9mIEVycm9yID8gY2F1Z2h0Lm1lc3NhZ2UgOiBTdHJpbmcoY2F1Z2h0KTtcbiAgICAgICAgcmV0dXJuIFwiZXJyb3JcIiBhcyBjb25zdDtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcGVuZGluZzogc3RyaW5nW10gPSBhd2FpdCB0Q29ubi5taWdyYXRlLmxpc3QoKS50aGVuKFxuICAgICAgICAoWywgZmlsZXNdOiBbdW5rbm93bltdLCB7IGZpbGU6IHN0cmluZyB9W11dKSA9PlxuICAgICAgICAgIGZpbGVzLm1hcCgoeyBmaWxlIH0pID0+IGZpbGUucmVwbGFjZSgvXFwudHMkLywgXCJcIikpLFxuICAgICAgICAoY2F1c2U6IHVua25vd24pID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yKGNhdXNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvZGVzLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlcnJvciA/Pz0gY2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IGNhdXNlLm1lc3NhZ2UgOiBTdHJpbmcoY2F1c2UpO1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBjb25zdCBjdXJyZW50VmVyc2lvbjogc3RyaW5nIHwgXCJub25lXCIgfCBcImVycm9yXCIgPSBhd2FpdCB0Q29ubi5taWdyYXRlXG4gICAgICAgIC5jdXJyZW50VmVyc2lvbigpXG4gICAgICAgIC5jYXRjaCgoY2F1c2U6IHVua25vd24pID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5pc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yKGNhdXNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwibm9uZVwiIGFzIGNvbnN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlcnJvciA/Pz0gY2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IGNhdXNlLm1lc3NhZ2UgOiBTdHJpbmcoY2F1c2UpO1xuICAgICAgICAgIHJldHVybiBcImVycm9yXCIgYXMgY29uc3Q7XG4gICAgICAgIH0pO1xuICAgICAgTmFpdGUudChcIm1pZ3JhdG9yOmdldFN0YXR1czpzdGF0dXNcIiwgc3RhdHVzKTtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb25TdGF0dXM6IE1pZ3JhdGlvbkNvbm5lY3Rpb25TdGF0dXMgPSB7XG4gICAgICAgIGNvbm5LZXksXG4gICAgICAgIGN1cnJlbnRWZXJzaW9uLFxuICAgICAgICBzdGF0dXMsXG4gICAgICAgIHBlbmRpbmcsXG4gICAgICAgIGxhdGVuY3lNczogcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkQXQsXG4gICAgICB9O1xuICAgICAgaWYgKGVycm9yICE9PSB1bmRlZmluZWQpIGNvbm5lY3Rpb25TdGF0dXMuZXJyb3IgPSBlcnJvcjtcbiAgICAgIHJldHVybiBjb25uZWN0aW9uU3RhdHVzO1xuICAgIH0gY2F0Y2ggKGNhdWdodCkge1xuICAgICAgY29uc3QgZXJyb3IgPSBjYXVnaHQgaW5zdGFuY2VvZiBFcnJvciA/IGNhdWdodC5tZXNzYWdlIDogU3RyaW5nKGNhdWdodCk7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgJHtTdHJpbmcoY29ubktleSl97J2YIOuniOydtOq3uOugiOydtOyFmCDsg4Htg5zrpbwg6rCA7KC47Jik64qUIOuNsOyXkCDsi6TtjKjtlZjsmIDsirXri4jri6QuXFxuJHtlcnJvcn1gLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbm5LZXksXG4gICAgICAgIGN1cnJlbnRWZXJzaW9uOiBcImVycm9yXCIsXG4gICAgICAgIHN0YXR1czogXCJlcnJvclwiLFxuICAgICAgICBwZW5kaW5nOiBbXSxcbiAgICAgICAgbGF0ZW5jeU1zOiBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICAgICAgZXJyb3IsXG4gICAgICB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB3aXRoVGltZW91dCh0Q29ubi5kZXN0cm95KCksIE1JR1JBVElPTl9DT05OX1RJTUVPVVRfTVMsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihcImNvbm5lY3Rpb24gZGVzdHJveSB0aW1lb3V0XCIpO1xuICAgICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDrjIDsg4EgRELsl5DshJwg6rCA7J6lIOy1nOq3vOyXkCDsoIHsmqnrkJwgbWlncmF0aW9uIGJhdGNo66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBnZXRMYXRlc3RBcHBsaWVkQmF0Y2goXG4gICAgY29ubktleTogTWlncmF0aW9uVGFyZ2V0LFxuICApOiBQcm9taXNlPHsgYmF0Y2hObzogbnVtYmVyOyBmaWxlczogc3RyaW5nW10gfT4ge1xuICAgIHRoaXMuYXNzZXJ0TWlncmF0aW9uVGFyZ2V0KGNvbm5LZXkpO1xuICAgIGNvbnN0IGtuZXhPcHRpb25zID0gU29uYW11LmRiQ29uZmlnW2Nvbm5LZXldO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPVxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBrbmV4T3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICAgIGNvbnN0IHRDb25uID0gY3JlYXRlS25leEluc3RhbmNlKHtcbiAgICAgIC4uLmtuZXhPcHRpb25zLFxuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAuLi5jb25uZWN0aW9uLFxuICAgICAgICBjb25uZWN0aW9uVGltZW91dE1pbGxpczogTUlHUkFUSU9OX0NPTk5fVElNRU9VVF9NUyxcbiAgICAgIH0sXG4gICAgICBwb29sOiB7XG4gICAgICAgIC4uLmtuZXhPcHRpb25zLnBvb2wsXG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgYWNxdWlyZVRpbWVvdXRNaWxsaXM6IE1JR1JBVElPTl9DT05OX1RJTUVPVVRfTVMsXG4gICAgICAgIGNyZWF0ZVRpbWVvdXRNaWxsaXM6IE1JR1JBVElPTl9DT05OX1RJTUVPVVRfTVMsXG4gICAgICAgIHByb3BhZ2F0ZUNyZWF0ZUVycm9yOiB0cnVlLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0YWJsZU5hbWUgPSBrbmV4T3B0aW9ucy5taWdyYXRpb25zPy50YWJsZU5hbWUgPz8gXCJrbmV4X21pZ3JhdGlvbnNcIjtcbiAgICAgIGNvbnN0IHNjaGVtYU5hbWUgPSBrbmV4T3B0aW9ucy5taWdyYXRpb25zPy5zY2hlbWFOYW1lO1xuICAgICAgY29uc3QgbWlncmF0aW9uc1RhYmxlID1cbiAgICAgICAgc2NoZW1hTmFtZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB0Q29ubjx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgYmF0Y2g6IG51bWJlciB9Pih0YWJsZU5hbWUpXG4gICAgICAgICAgOiB0Q29ubjx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgYmF0Y2g6IG51bWJlciB9Pih0YWJsZU5hbWUpLndpdGhTY2hlbWEoc2NoZW1hTmFtZSk7XG4gICAgICBjb25zdCBsYXRlc3QgPSBhd2FpdCBtaWdyYXRpb25zVGFibGUuY2xvbmUoKS5zZWxlY3QoXCJiYXRjaFwiKS5vcmRlckJ5KFwiYmF0Y2hcIiwgXCJkZXNjXCIpLmZpcnN0KCk7XG4gICAgICBpZiAobGF0ZXN0ID09PSB1bmRlZmluZWQpIHJldHVybiB7IGJhdGNoTm86IDAsIGZpbGVzOiBbXSB9O1xuXG4gICAgICAvLyDqsJnsnYAgYmF0Y2gg7JWI7JeQ7ISc64qUIEtuZXgg7Iuk7ZaJIOyInOyEnOuMgOuhnCDroaTrsLEg6rOE7ZqN7J2EIOqzoOygle2VnOuLpC5cbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBtaWdyYXRpb25zVGFibGVcbiAgICAgICAgLmNsb25lKClcbiAgICAgICAgLnNlbGVjdChcIm5hbWVcIilcbiAgICAgICAgLndoZXJlKFwiYmF0Y2hcIiwgbGF0ZXN0LmJhdGNoKVxuICAgICAgICAub3JkZXJCeShcImlkXCIsIFwiYXNjXCIpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYmF0Y2hObzogbGF0ZXN0LmJhdGNoLFxuICAgICAgICBmaWxlczogcm93cy5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lLnJlcGxhY2UoL1xcLnRzJC8sIFwiXCIpKSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoY2F1Z2h0KSB7XG4gICAgICBpZiAodGhpcy5pc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yKGNhdWdodCkpIHJldHVybiB7IGJhdGNoTm86IDAsIGZpbGVzOiBbXSB9O1xuICAgICAgdGhyb3cgY2F1Z2h0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0Q29ubi5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOy1nOyLoCDsg4Htg5zsnbgg6riw7KSAIERC7JmAIOyXlO2LsO2LsCDsoJXsnZjrpbwg67mE6rWQ7ZW0IOyDneyEsSDsmIjsoJUg7L2U65Oc66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBnZXRQcmVwYXJlZENvZGVzKGNvbXBhcmVDb25uS2V5OiBNaWdyYXRpb25UYXJnZXQpOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGlvblN0YXR1cyhjb21wYXJlQ29ubktleSk7XG4gICAgaWYgKHN0YXR1cy5zdGF0dXMgIT09IDAgfHwgc3RhdHVzLmVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE1pZ3JhdGlvbiBjb21wYXJpc29uIHJlcXVpcmVzIGFuIHVwLXRvLWRhdGUgZGF0YWJhc2U6ICR7U3RyaW5nKGNvbXBhcmVDb25uS2V5KX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb21wYXJlV2l0aENvbm5lY3Rpb24oY29tcGFyZUNvbm5LZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb21wYXJlV2l0aENvbm5lY3Rpb24oY29tcGFyZUNvbm5LZXk6IE1pZ3JhdGlvblRhcmdldCkge1xuICAgIGNvbnN0IGNvbXBhcmVEQiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShTb25hbXUuZGJDb25maWdbY29tcGFyZUNvbm5LZXldKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY29tcGFyZU1pZ3JhdGlvbnMoY29tcGFyZURCKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgY29tcGFyZURCLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQg7Iug6recIFVJ7JeQ7ISc64qUIOy7pOuEpeyFmOuzhCDsobDtmowgQVBJ66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAgICog6riw7KG0IENMSeyZgCDsiqTtgazrpr3tirgg7Zi47ZmY7J2EIOychO2VtCDsoITssrQg7IOB7YOc66W8IOyhsOumve2VqeuLiOuLpC5cbiAgICogQGNhdGVnb3J5IO2YuO2ZmOyaqSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBnZXRTdGF0dXMoKTogUHJvbWlzZTxNaWdyYXRpb25TdGF0dXM+IHtcbiAgICBjb25zdCBbY29kZXMsIGNvbm5lY3Rpb25zXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHRoaXMuZ2V0TWlncmF0aW9uQ29kZXMoKSxcbiAgICAgIFByb21pc2UucmVzb2x2ZSh0aGlzLmdldENvbm5lY3Rpb25zKCkpLFxuICAgIF0pO1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRTdGF0dXM6Y29kZXNcIiwgY29kZXMpO1xuXG4gICAgY29uc3QgY29ubmVjdGlvblN0YXR1c2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjb25uZWN0aW9ucy5tYXAoKHsgY29ubktleSB9KSA9PiB0aGlzLmdldENvbm5lY3Rpb25TdGF0dXMoY29ubktleSkpLFxuICAgICk7XG4gICAgY29uc3QgY29ubnMgPSBjb25uZWN0aW9ucy5tYXAoKGNvbm5lY3Rpb24sIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBzdGF0dXMgPSBjb25uZWN0aW9uU3RhdHVzZXNbaW5kZXhdO1xuICAgICAgYXNzZXJ0KHN0YXR1cyAhPT0gdW5kZWZpbmVkKTtcbiAgICAgIGNvbnN0IGNvbmZpZ3VyZWQgPVxuICAgICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFNvbmFtdS5kYkNvbmZpZ1tcbiAgICAgICAgICBjb25uZWN0aW9uLmNvbm5LZXlcbiAgICAgICAgXS5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogY29ubmVjdGlvbi5uYW1lLFxuICAgICAgICBjb25uS2V5OiBjb25uZWN0aW9uLmNvbm5LZXksXG4gICAgICAgIGNvbm5TdHJpbmc6XG4gICAgICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBgcGc6Ly8ke2NvbmZpZ3VyZWQudXNlciA/PyBcIlwifUAke2NvbmZpZ3VyZWQuaG9zdH06JHtjb25maWd1cmVkLnBvcnR9LyR7Y29uZmlndXJlZC5kYXRhYmFzZX1gIGFzIENvbm5TdHJpbmcsXG4gICAgICAgIGN1cnJlbnRWZXJzaW9uOiBzdGF0dXMuY3VycmVudFZlcnNpb24sXG4gICAgICAgIHN0YXR1czogc3RhdHVzLnN0YXR1cyxcbiAgICAgICAgcGVuZGluZzogc3RhdHVzLnBlbmRpbmcsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRTdGF0dXM6Y29ubnNcIiwgY29ubnMpO1xuXG4gICAgY29uc3QgY29tcGFyZUNvbm4gPSBjb25uZWN0aW9uU3RhdHVzZXMuZmluZChcbiAgICAgICh7IHN0YXR1cywgZXJyb3IgfSkgPT4gc3RhdHVzID09PSAwICYmIGVycm9yID09PSB1bmRlZmluZWQsXG4gICAgKTtcbiAgICBjb25zdCBwcmVwYXJlZENvZGVzID1cbiAgICAgIGNvbXBhcmVDb25uID09PSB1bmRlZmluZWQgPyBbXSA6IGF3YWl0IHRoaXMuY29tcGFyZVdpdGhDb25uZWN0aW9uKGNvbXBhcmVDb25uLmNvbm5LZXkpO1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZXRTdGF0dXM6cHJlcGFyZWRDb2Rlc1wiLCBwcmVwYXJlZENvZGVzKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb25ucyxcbiAgICAgIGNvZGVzLFxuICAgICAgcHJlcGFyZWRDb2RlcyxcbiAgICAgIGVycm9yOiBjb25uZWN0aW9uU3RhdHVzZXMuZmluZCgoeyBlcnJvciB9KSA9PiBlcnJvciAhPT0gdW5kZWZpbmVkKT8uZXJyb3IsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrjIDsg4EgRELsl5AgcGVuZGluZyDrp4jsnbTqt7jroIjsnbTshZjsnYQg7KCB7Jqp7ZWp64uI64ukLlxuICAgKiBDTEnsmYAgV2Vi7J2AIOqwmeydgCDrqZTshJzrk5zrpbwg7IKs7Jqp7ZWY66mwLCBXZWLsnYAgYG9uUHJvZ3Jlc3Ng66W8IHN0cmVhbeycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqXG4gICAqIEBjYXRlZ29yeSDrtoTrpqztmJUg66eI7J206re466CI7J207IWYIEFQSVxuICAgKi9cbiAgYXN5bmMgYXBwbHkodGFyZ2V0czogTWlncmF0aW9uVGFyZ2V0W10sIG9wdGlvbnM/OiBNaWdyYXRpb25SdW5PcHRpb25zKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5ydW5BY3Rpb25XaXRoUHJvZ3Jlc3MoXCJhcHBseVwiLCB0YXJnZXRzLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrjIDsg4EgRELsl5DshJwg6rCA7J6lIOy1nOq3vCBtaWdyYXRpb24gYmF0Y2jrpbwg66Gk67Cx7ZWp64uI64ukLlxuICAgKiBDTEnsmYAgV2Vi7J2AIOqwmeydgCDrqZTshJzrk5zrpbwg7IKs7Jqp7ZWY66mwLCBXZWLsnYAgYG9uUHJvZ3Jlc3Ng66W8IHN0cmVhbeycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqXG4gICAqIEBjYXRlZ29yeSDrtoTrpqztmJUg66eI7J206re466CI7J207IWYIEFQSVxuICAgKi9cbiAgYXN5bmMgcm9sbGJhY2soXG4gICAgdGFyZ2V0czogTWlncmF0aW9uVGFyZ2V0W10sXG4gICAgb3B0aW9ucz86IE1pZ3JhdGlvblJ1bk9wdGlvbnMsXG4gICk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucnVuQWN0aW9uV2l0aFByb2dyZXNzKFwicm9sbGJhY2tcIiwgdGFyZ2V0cywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgYWN0aW9uIOusuOyekOyXtCDrjIDsi6Age0BsaW5rIGFwcGx5fSDrmJDripQge0BsaW5rIHJvbGxiYWNrfeydhCDsp4HsoJEg7IKs7Jqp7ZWp64uI64ukLlxuICAgKiDquLDsobQg7Jm467aAIO2YuOy2nOydmCDtlZjsnIQg7Zi47ZmY66eM7J2EIOychO2VtCDsnKDsp4Dtlanri4jri6QuXG4gICAqIEBjYXRlZ29yeSDtmLjtmZjsmqkg66eI7J206re466CI7J207IWYIEFQSVxuICAgKi9cbiAgYXN5bmMgcnVuQWN0aW9uKFxuICAgIGFjdGlvbjogXCJhcHBseVwiIHwgXCJyb2xsYmFja1wiLFxuICAgIHRhcmdldHM6IChrZXlvZiBTb25hbXVEQkNvbmZpZylbXSxcbiAgKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICByZXR1cm4gYWN0aW9uID09PSBcImFwcGx5XCIgPyB0aGlzLmFwcGx5KHRhcmdldHMpIDogdGhpcy5yb2xsYmFjayh0YXJnZXRzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuQWN0aW9uV2l0aFByb2dyZXNzKFxuICAgIGFjdGlvbjogXCJhcHBseVwiIHwgXCJyb2xsYmFja1wiLFxuICAgIHRhcmdldHM6IE1pZ3JhdGlvblRhcmdldFtdLFxuICAgIG9wdGlvbnM/OiBNaWdyYXRpb25SdW5PcHRpb25zLFxuICApOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdD4ge1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpydW5BY3Rpb246YWN0aW9uXCIsIGFjdGlvbik7XG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOnJ1bkFjdGlvbjp0YXJnZXRzXCIsIHRhcmdldHMpO1xuXG4gICAgY29uc3QgYWxsb3dlZFRhcmdldHMgPSBuZXcgU2V0KHRoaXMuZ2V0TWlncmF0aW9uVGFyZ2V0S2V5cygpKTtcbiAgICBjb25zdCBkaXNhbGxvd2VkVGFyZ2V0cyA9IHRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+ICFhbGxvd2VkVGFyZ2V0cy5oYXModGFyZ2V0KSk7XG4gICAgaWYgKGRpc2FsbG93ZWRUYXJnZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE1pZ3JhdGlvbiB0YXJnZXRzIGFyZSBub3QgYWxsb3dlZCBpbiBOT0RFX0VOVj0ke2dldFNvbmFtdUVudmlyb25tZW50KCl9OiAke2Rpc2FsbG93ZWRUYXJnZXRzLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBnZXQgdW5pcSBrbmV4IGNvbmZpZ3NcbiAgICBjb25zdCBjb25maWdzID0gdW5pcXVlKFxuICAgICAgdGFyZ2V0c1xuICAgICAgICAubWFwKCh0YXJnZXQpID0+ICh7XG4gICAgICAgICAgY29ubktleTogdGFyZ2V0LFxuICAgICAgICAgIG9wdGlvbnM6IFNvbmFtdS5kYkNvbmZpZ1t0YXJnZXRdLFxuICAgICAgICB9KSlcbiAgICAgICAgLmZpbHRlcigoYykgPT4gYy5vcHRpb25zICE9PSB1bmRlZmluZWQpLFxuICAgICAgKHsgb3B0aW9uczogZGJPcHRpb25zIH0pID0+XG4gICAgICAgIGAkey8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKGRiT3B0aW9ucy5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnKS5ob3N0fToke1xuICAgICAgICAgIC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgICAgZGJPcHRpb25zLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWdcbiAgICAgICAgICApLnBvcnQgPz8gNTQzMlxuICAgICAgICB9LyR7LyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoZGJPcHRpb25zLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWcpLmRhdGFiYXNlfWAsXG4gICAgKTtcblxuICAgIC8vIGdldCBjb25uZWN0aW9uc1xuICAgIGNvbnN0IGNvbm5zID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjb25maWdzLm1hcChhc3luYyAoY29uZmlnKSA9PiAoe1xuICAgICAgICBjb25uS2V5OiBjb25maWcuY29ubktleSxcbiAgICAgICAga25leDogY3JlYXRlS25leEluc3RhbmNlKGNvbmZpZy5vcHRpb25zKSxcbiAgICAgIH0pKSxcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuTWlncmF0aW9uc1NlcXVlbnRpYWxseShjb25ucywgYWN0aW9uLCBvcHRpb25zKTtcblxuICAgICAgTmFpdGUudChcIm1pZ3JhdG9yOnJ1bkFjdGlvbjpyZXN1bHRcIiwgcmVzdWx0KTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGNvbm5zLm1hcCgoeyBrbmV4IH0pID0+IHtcbiAgICAgICAgICByZXR1cm4ga25leC5kZXN0cm95KCk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdlbkRhdGVUYWcoaW5kZXg6IG51bWJlciwgYmFzZURhdGU6IERhdGUgPSBuZXcgRGF0ZSgpKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoYmFzZURhdGUuZ2V0VGltZSgpICsgaW5kZXggKiAxMDAwKTtcbiAgICByZXR1cm4gKFxuICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCkgK1xuICAgICAgcGFkRGF0ZVBhcnQoZGF0ZS5nZXRNb250aCgpICsgMSkgK1xuICAgICAgcGFkRGF0ZVBhcnQoZGF0ZS5nZXREYXRlKCkpICtcbiAgICAgIHBhZERhdGVQYXJ0KGRhdGUuZ2V0SG91cnMoKSkgK1xuICAgICAgcGFkRGF0ZVBhcnQoZGF0ZS5nZXRNaW51dGVzKCkpICtcbiAgICAgIHBhZERhdGVQYXJ0KGRhdGUuZ2V0U2Vjb25kcygpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog66eI7J206re466CI7J207IWYIOy9lOuTnCDtjIzsnbzsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiBTb25hbXUgVUnsl5DshJwg7IKs7Jqp65Cp64uI64ukLlxuICAgKlxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg66eI7J206re466CI7J207IWYIOy9lOuTnCDtjIzsnbwg6rCc7IiYXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZVByZXBhcmVkQ29kZXMoY29tcGFyZUNvbm5LZXk/OiBNaWdyYXRpb25UYXJnZXQpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHByZXBhcmVkQ29kZXMgPVxuICAgICAgY29tcGFyZUNvbm5LZXkgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IChhd2FpdCB0aGlzLmdldFN0YXR1cygpKS5wcmVwYXJlZENvZGVzXG4gICAgICAgIDogYXdhaXQgdGhpcy5nZXRQcmVwYXJlZENvZGVzKGNvbXBhcmVDb25uS2V5KTtcbiAgICBOYWl0ZS50KFwibWlncmF0b3I6Z2VuZXJhdGVQcmVwYXJlZENvZGVzOnByZXBhcmVkQ29kZXNcIiwgcHJlcGFyZWRDb2Rlcyk7XG4gICAgaWYgKHByZXBhcmVkQ29kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihcIlxcbu2YhOyerCDrqqjrkZAg7Iux7YGs65CcIOyDge2DnOyeheuLiOuLpC5cIikpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLy8g7Iuk7KCcIOy9lOuTnCDsg53shLFcbiAgICBjb25zdCBtaWdyYXRpb25zRGlyID0gYCR7U29uYW11LmFwaVJvb3RQYXRofS9zcmMvbWlncmF0aW9uc2A7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgcGNvZGVdIG9mIHByZXBhcmVkQ29kZXMuZW50cmllcygpKSB7XG4gICAgICBpZiAocGNvZGUuZm9ybWF0dGVkKSB7XG4gICAgICAgIGNvbnN0IGRhdGVUYWcgPSB0aGlzLmdlbkRhdGVUYWcoaW5kZXgpO1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGAke21pZ3JhdGlvbnNEaXJ9LyR7ZGF0ZVRhZ31fJHtwY29kZS50aXRsZX0udHNgO1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUoZmlsZVBhdGgsIHBjb2RlLmZvcm1hdHRlZCk7XG4gICAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgTUlHUkFUSU9OIENSRUFURUQgJHtmaWxlUGF0aH1gKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHByZXBhcmVkQ29kZXMubGVuZ3RoO1xuICB9XG5cbiAgYXN5bmMgY29tcGFyZU1pZ3JhdGlvbnMoY29tcGFyZURCOiBLbmV4KTogUHJvbWlzZTxHZW5NaWdyYXRpb25Db2RlW10+IHtcbiAgICAvLyBFbnRpdHkg7Iic7ZqM7ZWY7JesIOyLse2BrFxuICAgIGNvbnN0IGVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG5cbiAgICAvLyDsobDsnbjthYzsnbTruJQg7Y+s7ZWo7ZWY7JesIEVudGl0eeyXkOyEnCBNaWdyYXRpb25TZXQg7LaU7LacXG4gICAgY29uc3QgZW50aXR5U2V0c1dpdGhKb2luVGFibGUgPSBlbnRpdHlJZHNcbiAgICAgIC5maWx0ZXIoKGVudGl0eUlkKSA9PiBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCkucHJvcHMubGVuZ3RoID4gMClcbiAgICAgIC5tYXAoKGVudGl0eUlkKSA9PiBnZXRNaWdyYXRpb25TZXRGcm9tRW50aXR5KEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKSkpO1xuXG4gICAgLy8g7KGw7J247YWM7J2067iU66eMIOy2lOy2nFxuICAgIGNvbnN0IGpvaW5UYWJsZXNXaXRoRHVwID0gZW50aXR5U2V0c1dpdGhKb2luVGFibGUuZmxhdE1hcCgoZW50aXR5U2V0KSA9PiBlbnRpdHlTZXQuam9pblRhYmxlcyk7XG4gICAgLy8g7KSR67O1IOygnOqxsCAo7KSR67O17J24IOqyveyasCBpbmRleGVz66W8IOuzke2VqSlcbiAgICBjb25zdCBqb2luVGFibGVzID0gT2JqZWN0LnZhbHVlcyhncm91cChqb2luVGFibGVzV2l0aER1cCwgKGp0KSA9PiBqdC50YWJsZSkpLm1hcCgodGFibGVzKSA9PiB7XG4gICAgICBhc3NlcnQodGFibGVzICE9PSB1bmRlZmluZWQsIFwidGFibGVzIGlzIHVuZGVmaW5lZFwiKTtcbiAgICAgIGlmICh0YWJsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiB0YWJsZXNbMF07XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50YWJsZXNbMF0sXG4gICAgICAgIGluZGV4ZXM6IHVuaXF1ZShcbiAgICAgICAgICB0YWJsZXMuZmxhdE1hcCgodCkgPT4gdC5pbmRleGVzKSxcbiAgICAgICAgICAoaW5kZXgpID0+IFtpbmRleC50eXBlLCAuLi5pbmRleC5jb2x1bW5zXS5qb2luKFwiLVwiKSxcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyDsobDsnbjthYzsnbTruJQg7Y+s7ZWo7ZWY7JesIE1pZ3JhdGlvblNldCDrsLDsl7RcbiAgICBjb25zdCBlbnRpdHlTZXRzOiBNaWdyYXRpb25TZXRbXSA9IFsuLi5lbnRpdHlTZXRzV2l0aEpvaW5UYWJsZSwgLi4uam9pblRhYmxlc107XG5cbiAgICBjb25zdCBjb2RlczogR2VuTWlncmF0aW9uQ29kZVtdID0gW107XG4gICAgY29uc3QgYmF0Y2hTaXplID0gNDtcblxuICAgIC8vIO2FjOydtOu4lOuniOuLpCDsiqTtgqTrp4jrpbwg7KGw7ZqM7ZWY66m0IOyZleuzteydtCDthYzsnbTruJQg7IiY7JeQIOu5hOuhgO2VtCDripjslrTrgpzri6QuXG4gICAgLy8g7KKF66WY67OE66GcIO2VnCDrsojslKnrp4wg7J297Ja065GQ6rOgIOyVhOuemOyXkOyEnCDthYzsnbTruJTrqoXsnLzroZwg7LC+7JWEIOyTtOuLpC5cbiAgICBjb25zdCBkYlNldHMgPSBhd2FpdCBQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyLmdldE1pZ3JhdGlvblNldEZyb21EQkFsbChjb21wYXJlREIpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRpdHlTZXRzLmxlbmd0aDsgaSArPSBiYXRjaFNpemUpIHtcbiAgICAgIGNvbnN0IGJhdGNoQ29kZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgZW50aXR5U2V0cy5zbGljZShpLCBpICsgYmF0Y2hTaXplKS5tYXAoYXN5bmMgKGVudGl0eVNldCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRiU2V0ID0gZGJTZXRzLmdldChlbnRpdHlTZXQudGFibGUpID8/IG51bGw7XG4gICAgICAgICAgTmFpdGUudChgbWlncmF0b3I6Y29tcGFyZU1pZ3JhdGlvbnM6ZW50aXR5U2V0OiR7ZW50aXR5U2V0LnRhYmxlfWAsIGVudGl0eVNldCk7XG4gICAgICAgICAgTmFpdGUudChgbWlncmF0b3I6Y29tcGFyZU1pZ3JhdGlvbnM6ZGJTZXQ6JHtlbnRpdHlTZXQudGFibGV9YCwgZGJTZXQpO1xuXG4gICAgICAgICAgaWYgKGRiU2V0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyDquLDsobQg7YWM7J2067iUIOyXhuydjCwg7IOI66GcIO2FjOydtOu4lCDsg53shLFcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBnZW5lcmF0ZUNyZWF0ZUNvZGUoZW50aXR5U2V0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8g6riw7KG0IO2FjOydtOu4lCDsobTsnqztlZjripQg7LyA7J207IqkXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZ2VuZXJhdGVBbHRlckNvZGUoZW50aXR5U2V0LCBkYlNldCwgY29tcGFyZURCKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgY29kZXMucHVzaCguLi5iYXRjaENvZGVzLmZsYXQoKSk7XG4gICAgfVxuXG4gICAgLy8gbm9ybWFsIO2DgOyeheydtCDslZ7snLzroZwsIGZvcmVpZ27snbQg65Kk66GcXG4gICAgY29kZXMuc29ydCgoY29kZUEsIGNvZGVCKSA9PiB7XG4gICAgICBpZiAoY29kZUEudHlwZSA9PT0gXCJmb3JlaWduXCIgJiYgY29kZUIudHlwZSA9PT0gXCJub3JtYWxcIikge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH0gZWxzZSBpZiAoY29kZUEudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBjb2RlQi50eXBlID09PSBcImZvcmVpZ25cIikge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBjb2RlcztcbiAgfVxuXG4gIC8qKlxuICAgKiB0ZXN0IERC7J2YIHNuYXBzaG907Jy866GcIOyehOyLnCBTaGFkb3cgRELrpbwg66eM65Ok6rOgIOyghOyytCDrp4jsnbTqt7jroIjsnbTshZjsnYQg6rKA7Kad7ZWp64uI64ukLlxuICAgKiBDTEnsmYAgV2Vi7J2AIGBvblByb2dyZXNzYCDsnKDrrLTrp4wg64us66as7ZW0IOqwmeydgCDsi6Ttlokg7J2Y66+466W8IOqzteycoO2VoCDsiJgg7J6I7Iq164uI64ukLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkg67aE66as7ZiVIOuniOydtOq3uOugiOydtOyFmCBBUElcbiAgICovXG4gIGFzeW5jIHJ1blNoYWRvd1Rlc3QoXG4gICAgb3B0aW9ucz86IE1pZ3JhdGlvblJ1bk9wdGlvbnMgJiB7IHRhcmdldD86IE1pZ3JhdGlvblRhcmdldCB9LFxuICApOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IHRhcmdldCA9IG9wdGlvbnM/LnRhcmdldCA/PyBcInRlc3RcIjtcbiAgICBpZiAodGFyZ2V0ICE9PSBcInRlc3RcIiAmJiB0YXJnZXQgIT09IFwiZml4dHVyZVwiKSB7XG4gICAgICAvLyDsmrTsmIEg6rOE7Je0IERC64qUIOyEpOyglSDsobDtmozrgpgg7Jew6rKwIOyDneyEseuztOuLpCDrqLzsoIAg7LCo64uo7ZWc64ukLlxuICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoYOyngOybkO2VmOyngCDslYrripQgU2hhZG93IOuniOydtOq3uOugiOydtOyFmCDrjIDsg4HsnoXri4jri6Q6ICR7dGFyZ2V0fWApLCB7XG4gICAgICAgIGNvZGU6IFwiSU5WQUxJRF9TSEFET1dfTUlHUkFUSU9OX1RBUkdFVFwiLFxuICAgICAgICB0YXJnZXQsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3Qgc2hhZG93VGFyZ2V0OiBTaGFkb3dNaWdyYXRpb25UYXJnZXQgPSB0YXJnZXQ7XG4gICAgY29uc3QgYmFzZVRhcmdldENvbm4gPVxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBTb25hbXUuZGJDb25maWdbXG4gICAgICAgIHNoYWRvd1RhcmdldFxuICAgICAgXS5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICAgIGNvbnN0IGNvbmZpZ3VyZWREYXRhYmFzZSA9IGJhc2VUYXJnZXRDb25uLmRhdGFiYXNlO1xuICAgIGlmICghY29uZmlndXJlZERhdGFiYXNlKSB7XG4gICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgU2hhZG93IOuMgOyDgSBEQiDsnbTrpoTsnbQg7JeG7Iq164uI64ukOiAke3NoYWRvd1RhcmdldH1gKSwge1xuICAgICAgICBjb2RlOiBcIklOVkFMSURfU0hBRE9XX0RBVEFCQVNFX0NPTkZJR1wiLFxuICAgICAgICB0YXJnZXQ6IHNoYWRvd1RhcmdldCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB3b3JrZXJJZCA9XG4gICAgICBzaGFkb3dUYXJnZXQgPT09IFwidGVzdFwiICYmIHByb2Nlc3MuZW52LlNPTkFNVV9XT1JLRVJfREIgPT09IFwidHJ1ZVwiXG4gICAgICAgID8gcHJvY2Vzcy5lbnYuVklURVNUX1BPT0xfSURcbiAgICAgICAgOiBudWxsO1xuICAgIGNvbnN0IHRlbXBsYXRlRGF0YWJhc2UgPVxuICAgICAgd29ya2VySWQgIT09IG51bGwgPyBgJHtjb25maWd1cmVkRGF0YWJhc2V9XyR7d29ya2VySWQgPz8gXCIxXCJ9YCA6IGNvbmZpZ3VyZWREYXRhYmFzZTtcbiAgICBjb25zdCBzaGFkb3dEYXRhYmFzZSA9IGAke3RlbXBsYXRlRGF0YWJhc2V9X19taWdyYXRpb25fc2hhZG93YDtcbiAgICBjb25zdCBjcmVhdGVTaGFkb3dDb25uZWN0aW9uID0gKGRhdGFiYXNlOiBzdHJpbmcpID0+XG4gICAgICBjcmVhdGVLbmV4SW5zdGFuY2Uoe1xuICAgICAgICAuLi5Tb25hbXUuZGJDb25maWdbc2hhZG93VGFyZ2V0XSxcbiAgICAgICAgY29ubmVjdGlvbjogeyAuLi5iYXNlVGFyZ2V0Q29ubiwgZGF0YWJhc2UgfSxcbiAgICAgIH0pO1xuXG4gICAgLy8g7YWM7Iqk7Yq4IOyDge2ZqeyXkOyEnOuKlCDtirjrnpzsnq3shZjsnYQg7LSI6riw7ZmU7ZWY6rOgLCDsg4gg642w7J207YSw67Kg7J207IqkIOy7pOuEpeyFmOydhCDqsIDsoLjsmYDslbwg7ZWoXG4gICAgaWYgKGlzVGVzdCgpKSB7XG4gICAgICBhd2FpdCBEQi5jbGVhclRlc3RUcmFuc2FjdGlvbigpO1xuICAgICAgYXdhaXQgREIuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIC8vIOq4sOyhtCBTaGFkb3cgREIg7IKt7KCcIO2bhCBTaGFkb3cgREIg7IOd7ISxXG4gICAgY29uc3QgdGRiID0gY3JlYXRlU2hhZG93Q29ubmVjdGlvbihcInBvc3RncmVzXCIpO1xuICAgIHRyeSB7XG4gICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsubWFnZW50YShgJHtzaGFkb3dEYXRhYmFzZX0g7IKt7KCcYCkpO1xuICAgICAgYXdhaXQgdGRiLnJhdyhcIkRST1AgREFUQUJBU0UgSUYgRVhJU1RTID8/XCIsIFtzaGFkb3dEYXRhYmFzZV0pO1xuICAgICAgYXdhaXQgdGRiLnJhdyhcbiAgICAgICAgYFxuICAgICAgICBTRUxFQ1QgcGdfdGVybWluYXRlX2JhY2tlbmQocGdfc3RhdF9hY3Rpdml0eS5waWQpXG4gICAgICAgIEZST00gcGdfc3RhdF9hY3Rpdml0eVxuICAgICAgICBXSEVSRSBkYXRuYW1lID0gP1xuICAgICAgICAgIEFORCBwaWQgPD4gcGdfYmFja2VuZF9waWQoKTtcbiAgICAgIGAsXG4gICAgICAgIFt0ZW1wbGF0ZURhdGFiYXNlXSxcbiAgICAgICk7XG4gICAgICBhd2FpdCB0ZGIucmF3KFwiQ1JFQVRFIERBVEFCQVNFID8/IFRFTVBMQVRFID8/XCIsIFtzaGFkb3dEYXRhYmFzZSwgdGVtcGxhdGVEYXRhYmFzZV0pO1xuXG4gICAgICAvLyBTaGFkb3cgRELsl5Ag7Jew6rKwXG4gICAgICBjb25zdCBzZGIgPSBjcmVhdGVTaGFkb3dDb25uZWN0aW9uKHNoYWRvd0RhdGFiYXNlKTtcblxuICAgICAgLy8gc2hhZG93IERCIO2FjOyKpO2KuCDsp4TtlolcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByb2dyZXNzID0gdGhpcy5jcmVhdGVQcm9ncmVzc0hvb2tzKFwic2hhZG93XCIsIFwic2hhZG93XCIsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBbYmF0Y2hObywgYXBwbGllZF0gPSBhd2FpdCBzZGIubWlncmF0ZS5sYXRlc3QocHJvZ3Jlc3MpO1xuICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihcIlNoYWRvdyBEQiDthYzsiqTtirjsl5Ag7ISx6rO17ZaI7Iq164uI64ukIVwiKSwge1xuICAgICAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgICAgIGFwcGxpZWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5lbWl0UHJvZ3Jlc3Mob3B0aW9ucywge1xuICAgICAgICAgIHR5cGU6IFwidGFyZ2V0LWNvbXBsZXRlXCIsXG4gICAgICAgICAgYWN0aW9uOiBcInNoYWRvd1wiLFxuICAgICAgICAgIGNvbm5LZXk6IFwic2hhZG93XCIsXG4gICAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgICBmaWxlczogYXBwbGllZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25uS2V5OiBcInNoYWRvd1wiLFxuICAgICAgICAgICAgYmF0Y2hObyxcbiAgICAgICAgICAgIGFwcGxpZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgdGhyb3cgbmV3IE1pZ3JhdGlvblRhcmdldEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICAgIFwic2hhZG93XCIsXG4gICAgICAgICAgbmV3IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5zaGFkb3dEYlRlc3RGYWlsZWRcIikpLFxuICAgICAgICApO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgc2RiLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gU2hhZG93IERCIOyCreygnFxuICAgICAgIWlzVGVzdCgpICYmIGNvbnNvbGUubG9nKGNoYWxrLm1hZ2VudGEoYCR7c2hhZG93RGF0YWJhc2V9IOyCreygnGApKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRkYi5yYXcoXCJEUk9QIERBVEFCQVNFIElGIEVYSVNUUyA/P1wiLCBbc2hhZG93RGF0YWJhc2VdKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlNoYWRvdyBEQiDsoJXrpqwg7Iuk7YyoOlwiLCBlKTsgLy8g7J206rKMIOyXhuycvOuptCDsobDsmqntnogg64iE7IiYXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCB0ZGIuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBp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
|
|
565
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0b3IuanMiLCJuYW1lcyI6WyJtYXliZVBvc3RncmVzRXJyb3IiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlncmF0aW9uL21pZ3JhdG9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgbWtkaXIsIHJlYWRkaXIsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHsgdHlwZSBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IGdyb3VwLCB1bmlxdWUgfSBmcm9tIFwicmFkYXNoaVwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgREIgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IHR5cGUgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IGNyZWF0ZUtuZXhJbnN0YW5jZSB9IGZyb20gXCIuLi9kYXRhYmFzZS9rbmV4XCI7XG5pbXBvcnQgeyBTRCB9IGZyb20gXCIuLi9kaWN0L3NkXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgZ2V0U29uYW11RW52aXJvbm1lbnQgfSBmcm9tIFwiLi4vZW52XCI7XG5pbXBvcnQgeyBTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgdHlwZSBHZW5NaWdyYXRpb25Db2RlLCB0eXBlIE1pZ3JhdGlvblNldCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaXNMb2NhbCwgaXNUZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IGV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IHsgaXNPYmplY3RWYWx1ZSwgaXNTdHJpbmdWYWx1ZSB9IGZyb20gXCIuLi91dGlscy9ydW50aW1lLXZhbHVlXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUFsdGVyQ29kZSwgZ2VuZXJhdGVDcmVhdGVDb2RlIH0gZnJvbSBcIi4vY29kZS1nZW5lcmF0aW9uXCI7XG5pbXBvcnQgeyBnZXRNaWdyYXRpb25TZXRGcm9tRW50aXR5IH0gZnJvbSBcIi4vbWlncmF0aW9uLXNldFwiO1xuaW1wb3J0IHsgUG9zdGdyZVNRTFNjaGVtYVJlYWRlciB9IGZyb20gXCIuL3Bvc3RncmVzcWwtc2NoZW1hLXJlYWRlclwiO1xuaW1wb3J0IHsgU2xhY2tDb25maXJtIH0gZnJvbSBcIi4vc2xhY2stY29uZmlybVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBDb25uU3RyaW5nLFxuICB0eXBlIE1pZ3JhdGlvbkFjdGlvbixcbiAgdHlwZSBNaWdyYXRpb25Db2RlLFxuICB0eXBlIE1pZ3JhdGlvbkNvbm5lY3Rpb25NZXRhLFxuICB0eXBlIE1pZ3JhdGlvbkNvbm5lY3Rpb25TdGF0dXMsXG4gIHR5cGUgTWlncmF0aW9uUHJvZ3Jlc3NFdmVudCxcbiAgdHlwZSBNaWdyYXRpb25SdW5PcHRpb25zLFxuICB0eXBlIE1pZ3JhdGlvblN0YXR1cyxcbiAgdHlwZSBNaWdyYXRpb25UYXJnZXQsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCB0eXBlIE1pZ3JhdGlvblJlc3VsdCA9IHtcbiAgY29ubktleTogc3RyaW5nO1xuICBiYXRjaE5vOiBudW1iZXI7XG4gIGFwcGxpZWQ6IHN0cmluZ1tdO1xufVtdO1xuXG50eXBlIFNoYWRvd01pZ3JhdGlvblRhcmdldCA9IEV4dHJhY3Q8TWlncmF0aW9uVGFyZ2V0LCBcImZpeHR1cmVcIiB8IFwidGVzdFwiPjtcblxuZnVuY3Rpb24gcGFkRGF0ZVBhcnQobnVtYmVyOiBudW1iZXIsIHNpemU6IG51bWJlciA9IDIpOiBzdHJpbmcge1xuICByZXR1cm4gbnVtYmVyLnRvU3RyaW5nKCkucGFkU3RhcnQoc2l6ZSwgXCIwXCIpO1xufVxuXG5leHBvcnQgY2xhc3MgTWlncmF0aW9uVGFyZ2V0RXhlY3V0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBjb25uS2V5OiBNaWdyYXRpb25UYXJnZXQgfCBcInNoYWRvd1wiLFxuICAgIGNhdXNlOiB1bmtub3duLFxuICApIHtcbiAgICBzdXBlcihjYXVzZSBpbnN0YW5jZW9mIEVycm9yID8gY2F1c2UubWVzc2FnZSA6IFN0cmluZyhjYXVzZSkpO1xuICAgIHRoaXMubmFtZSA9IFwiTWlncmF0aW9uVGFyZ2V0RXhlY3V0aW9uRXJyb3JcIjtcbiAgfVxufVxuXG4vLyDrp4jsnbTqt7jroIjsnbTshZgg7IOB7YOcIOyhsO2ajCDsi5wgREIg7Jew6rKwIO2ZleyduCDtg4DsnoTslYTsm4MobXMpLlxuLy8gY3JlYXRlS25leEluc3RhbmNl7J2YIOy7pOuEpeyFmCDtmo3rk50g7YOA7J6E7JWE7JuDKDMw7LSIKeyXkCBzdGF0dXMvbGlzdC9jdXJyZW50VmVyc2lvbuydtFxuLy8g6rCB6rCBIOqxuOumrOuptCBDTEkvVUnqsIAg7LWc64yAIOyImOyLrSDstIggaGFuZ+2VnOuLpC4g7KCV7IOBIOydkeuLteydgCDsiJjrsLEgbXPsnbTrr4DroZwgNey0iOuptCDstqnrtoTtlZjri6QuXG5jb25zdCBNSUdSQVRJT05fQ09OTl9USU1FT1VUX01TID0gNTAwMDtcbmNvbnN0IExPQ0FMX0RCX0hPU1RTID0gbmV3IFNldChbXCJsb2NhbGhvc3RcIiwgXCIxMjcuMC4wLjFcIiwgXCIwLjAuMC4wXCIsIFwiOjoxXCJdKTtcblxuLyoqXG4gKiDso7zslrTsp4QgUHJvbWlzZeqwgCBtcyDslYjsl5Ag7JmE66OM65CY7KeAIOyViuycvOuptCBvblRpbWVvdXQg7JeQ65+s66GcIHJlamVjdO2VnOuLpC5cbiAqIOybkOuzuCBQcm9taXNlIOyekOyytOuKlCDqs4Tsho0g7KeE7ZaJ65CY66+A66GcLCDtmLjstpzsuKHsl5DshJwg7Luk64Sl7IWYIOygleumrChkZXN0cm95KeulvCDssYXsnoTsp4Tri6QuXG4gKi9cbmZ1bmN0aW9uIHdpdGhUaW1lb3V0PFQ+KHByb21pc2U6IFByb21pc2U8VD4sIG1zOiBudW1iZXIsIG9uVGltZW91dDogKCkgPT4gRXJyb3IpOiBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG9uVGltZW91dCgpKSwgbXMpO1xuICAgIHByb21pc2UudGhlbihcbiAgICAgICh2YWx1ZSkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgIH0sXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfSk7XG59XG5cbi8qKlxuICogTm90ZSAyMDI2LTA4LTI2LCDrs5HspIBcbiAqIOydtCDtgbTrnpjsiqTsl5DshJwgZGVwcmVjYXRlZCDrtpnslrTsnojripQg7Lmc6rWs65Ok7J2AIO2YhCBDTEnrpbwg7JyE7ZWcIO2VmOychCDtmLjtmZjsnbTri4gsXG4gKiBDTEkg66as7Yyp7Yag66eBIOyLnOygkOyXkOyEnCDsoJzqsbDtlbTso7zshZTrj4Qg66y067Cp7ZWp64uI64ukLlxuICovXG5leHBvcnQgY2xhc3MgTWlncmF0b3Ige1xuICBwcml2YXRlIGlzTWlzc2luZ01pZ3JhdGlvblRhYmxlRXJyb3I8VmFsdWU+KGVycm9yOiBWYWx1ZSk6IGJvb2xlYW4ge1xuICAgIGlmICghaXNPYmplY3RWYWx1ZShlcnJvcikgfHwgZXJyb3IgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXliZVBvc3RncmVzRXJyb3IgPVxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBlcnJvciBhcyB7XG4gICAgICAgIGNvZGU/OiB1bmtub3duO1xuICAgICAgfTtcbiAgICAvLyBQb3N0Z3JlU1FMIHVuZGVmaW5lZF90YWJsZSDsvZTrk5zripQg7IKs7Jqp7J6QIOyngOyglSBtaWdyYXRpb24gdGFibGXsl5Drj4Qg64+Z7J287ZWY6rKMIOyggeyaqeuQqeuLiOuLpC5cbiAgICByZXR1cm4gbWF5YmVQb3N0Z3Jlc0Vycm9yLmNvZGUgPT09IFwiNDJQMDFcIjtcbiAgfVxuXG4gIC8qKiDtmITsnqwg7Iuk7ZaJIO2ZmOqyveyXkOyEnCDtl4jsmqnrkJwg66eI7J206re466CI7J207IWYIOuMgOyDgSDtgqTrpbwg67CY7ZmY7ZWp64uI64ukLiAqL1xuICBnZXRNaWdyYXRpb25UYXJnZXRLZXlzKCk6IE1pZ3JhdGlvblRhcmdldFtdIHtcbiAgICBjb25zdCBjb25uS2V5cyA9XG4gICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIE9iamVjdC5rZXlzKFxuICAgICAgICBTb25hbXUuZGJDb25maWcsXG4gICAgICApLmZpbHRlcigoa2V5KSA9PiAha2V5LmVuZHNXaXRoKFwiX3JlYWRvbmx5XCIpKSBhcyAoa2V5b2YgU29uYW11REJDb25maWcpW107XG5cbiAgICBpZiAoaXNMb2NhbCgpKSB7XG4gICAgICByZXR1cm4gY29ubktleXM7XG4gICAgfVxuXG4gICAgY29uc3QgZW52aXJvbm1lbnQgPSBnZXRTb25hbXVFbnZpcm9ubWVudCgpO1xuICAgIHJldHVybiBjb25uS2V5cy5maWx0ZXIoKGtleSkgPT4ga2V5ID09PSBlbnZpcm9ubWVudCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1bk1pZ3JhdGlvbnNTZXF1ZW50aWFsbHkoXG4gICAgY29ubnM6IHsgY29ubktleToga2V5b2YgU29uYW11REJDb25maWc7IGtuZXg6IEtuZXggfVtdLFxuICAgIGFjdGlvbjogXCJhcHBseVwiIHwgXCJyb2xsYmFja1wiLFxuICAgIG9wdGlvbnM/OiBNaWdyYXRpb25SdW5PcHRpb25zLFxuICApOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IHJlc3VsdHM6IE1pZ3JhdGlvblJlc3VsdCA9IFtdO1xuXG4gICAgZm9yIChjb25zdCB7IGNvbm5LZXksIGtuZXggfSBvZiBjb25ucykge1xuICAgICAgY29uc3QgcHJvZ3Jlc3MgPSB0aGlzLmNyZWF0ZVByb2dyZXNzSG9va3MoYWN0aW9uLCBjb25uS2V5LCBvcHRpb25zKTtcbiAgICAgIGxldCBtaWdyYXRpb25SZXN1bHQ6IFtudW1iZXIsIHN0cmluZ1tdXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG1pZ3JhdGlvblJlc3VsdCA9XG4gICAgICAgICAgYWN0aW9uID09PSBcImFwcGx5XCJcbiAgICAgICAgICAgID8gYXdhaXQga25leC5taWdyYXRlLmxhdGVzdChwcm9ncmVzcylcbiAgICAgICAgICAgIDogYXdhaXQga25leC5taWdyYXRlLnJvbGxiYWNrKHByb2dyZXNzKTtcbiAgICAgIH0gY2F0Y2ggKGNhdWdodCkge1xuICAgICAgICAvLyBsaWZlY3ljbGUgaG9vayDsnbTsoITsnZgg7Jew6rKwwrdsb2NrwrfrqqnroZ0g7KGw7ZqMIOyLpO2MqOuPhCDsi6TsoJwg64yA7IOBIERC7JeQIOq3gOyGje2VqeuLiOuLpC5cbiAgICAgICAgdGhyb3cgbmV3IE1pZ3JhdGlvblRhcmdldEV4ZWN1dGlvbkVycm9yKGNvbm5LZXksIGNhdWdodCk7XG4gICAgICB9XG4gICAgICBjb25zdCBbYmF0Y2hObywgYXBwbGllZF0gPSBtaWdyYXRpb25SZXN1bHQ7XG5cbiAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgIGNvbm5LZXksXG4gICAgICAgIGJhdGNoTm8sXG4gICAgICAgIGFwcGxpZWQsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZW1pdFByb2dyZXNzKG9wdGlvbnMsIHtcbiAgICAgICAgdHlwZTogXCJ0YXJnZXQtY29tcGxldGVcIixcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjb25uS2V5LFxuICAgICAgICBiYXRjaE5vLFxuICAgICAgICBmaWxlczogYXBwbGllZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgcHJpdmF0ZSBtaWdyYXRpb25OYW1lPFZhbHVlPihtaWdyYXRpb246IFZhbHVlKTogc3RyaW5nIHtcbiAgICBpZiAoaXNTdHJpbmdWYWx1ZShtaWdyYXRpb24pKSB7XG4gICAgICByZXR1cm4gcGF0aC5iYXNlbmFtZShtaWdyYXRpb24pO1xuICAgIH1cbiAgICBpZiAoaXNPYmplY3RWYWx1ZShtaWdyYXRpb24pICYmIG1pZ3JhdGlvbiAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgY2FuZGlkYXRlID1cbiAgICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBtaWdyYXRpb24gYXMge1xuICAgICAgICAgIGZpbGU/OiB1bmtub3duO1xuICAgICAgICAgIG5hbWU/OiB1bmtub3duO1xuICAgICAgICB9O1xuICAgICAgaWYgKGlzU3RyaW5nVmFsdWUoY2FuZGlkYXRlLmZpbGUpKSB7XG4gICAgICAgIHJldHVybiBwYXRoLmJhc2VuYW1lKGNhbmRpZGF0ZS5maWxlKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKGNhbmRpZGF0ZS5uYW1lKSkge1xuICAgICAgICByZXR1cm4gcGF0aC5iYXNlbmFtZShjYW5kaWRhdGUubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcobWlncmF0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFByb2dyZXNzKG9wdGlvbnM6IE1pZ3JhdGlvblJ1bk9wdGlvbnMgfCB1bmRlZmluZWQsIGV2ZW50OiBNaWdyYXRpb25Qcm9ncmVzc0V2ZW50KSB7XG4gICAgdHJ5IHtcbiAgICAgIG9wdGlvbnM/Lm9uUHJvZ3Jlc3M/LihldmVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIOynhO2WieuloCDshozruYTsnpDsnZgg7Iuk7Yyo6rCAIOydtOuvuCDsi5zsnpHtlZwgREIg7J6R7JeF6rO8IOygleumrOulvCDrsKntlbTtlZjrqbQg7JWIIOuQqeuLiOuLpC5cbiAgICAgIGNvbnNvbGUud2FybihcIk1pZ3JhdGlvbiBwcm9ncmVzcyBvYnNlcnZlciBmYWlsZWQ6XCIsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVByb2dyZXNzSG9va3MoXG4gICAgYWN0aW9uOiBNaWdyYXRpb25BY3Rpb24sXG4gICAgY29ubktleTogTWlncmF0aW9uVGFyZ2V0IHwgXCJzaGFkb3dcIixcbiAgICBvcHRpb25zPzogTWlncmF0aW9uUnVuT3B0aW9ucyxcbiAgKTogS25leC5NaWdyYXRvckNvbmZpZ1dpdGhMaWZlY3ljbGVIb29rcyB7XG4gICAgbGV0IGZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGVtaXRGaWxlID0gPFZhbHVlPih0eXBlOiBcImZpbGUtc3RhcnRcIiB8IFwiZmlsZS1leGVjdXRlZFwiLCBtaWdyYXRpb246IFZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBmaWxlID0gdGhpcy5taWdyYXRpb25OYW1lKG1pZ3JhdGlvbik7XG4gICAgICBjb25zdCBpbmRleCA9IE1hdGgubWF4KGZpbGVzLmluZGV4T2YoZmlsZSksIDApO1xuICAgICAgdGhpcy5lbWl0UHJvZ3Jlc3Mob3B0aW9ucywge1xuICAgICAgICB0eXBlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNvbm5LZXksXG4gICAgICAgIGZpbGUsXG4gICAgICAgIGluZGV4LFxuICAgICAgICB0b3RhbDogZmlsZXMubGVuZ3RoLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBiZWZvcmVBbGw6IGFzeW5jIChfa25leCwgbWlncmF0aW9ucykgPT4ge1xuICAgICAgICBmaWxlcyA9IG1pZ3JhdGlvbnMubWFwKChtaWdyYXRpb24pID0+IHRoaXMubWlncmF0aW9uTmFtZShtaWdyYXRpb24pKTtcbiAgICAgICAgdGhpcy5lbWl0UHJvZ3Jlc3Mob3B0aW9ucywgeyB0eXBlOiBcInRhcmdldC1zdGFydFwiLCBhY3Rpb24sIGNvbm5LZXksIGZpbGVzIH0pO1xuICAgICAgfSxcbiAgICAgIGJlZm9yZUVhY2g6IGFzeW5jIChfa25leCwgbWlncmF0aW9ucykgPT4ge1xuICAgICAgICBtaWdyYXRpb25zLmZvckVhY2goKG1pZ3JhdGlvbikgPT4gZW1pdEZpbGUoXCJmaWxlLXN0YXJ0XCIsIG1pZ3JhdGlvbikpO1xuICAgICAgfSxcbiAgICAgIGFmdGVyRWFjaDogYXN5bmMgKF9rbmV4LCBtaWdyYXRpb25zKSA9PiB7XG4gICAgICAgIG1pZ3JhdGlvbnMuZm9yRWFjaCgobWlncmF0aW9uKSA9PiBlbWl0RmlsZShcImZpbGUtZXhlY3V0ZWRcIiwgbWlncmF0aW9uKSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzc2VydE1pZ3JhdGlvblRhcmdldChjb25uS2V5OiBNaWdyYXRpb25UYXJnZXQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZ2V0TWlncmF0aW9uVGFyZ2V0S2V5cygpLmluY2x1ZGVzKGNvbm5LZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNaWdyYXRpb24gdGFyZ2V0IGlzIG5vdCBhbGxvd2VkIGluIE5PREVfRU5WPSR7Z2V0U29uYW11RW52aXJvbm1lbnQoKX06ICR7U3RyaW5nKGNvbm5LZXkpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDrp4jsnbTqt7jroIjsnbTshZgg64yA7IOBIOy7pOuEpeyFmOydmCDsoJXsoIEg66mU7YOA642w7J207YSw66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICogRELsl5Ag7Jew6rKw7ZWY7KeAIOyViuycvOuvgOuhnCBDTEnsmYAgV2Vi7J20IOyDge2DnCDsobDtmowg7KCE7JeQIOymieyLnCDsgqzsmqntlaAg7IiYIOyeiOyKteuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBnZXRDb25uZWN0aW9ucygpOiBNaWdyYXRpb25Db25uZWN0aW9uTWV0YVtdIHtcbiAgICBjb25zdCBzbGFja0NvbmZpcm0gPSBuZXcgU2xhY2tDb25maXJtKCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TWlncmF0aW9uVGFyZ2V0S2V5cygpLm1hcCgoY29ubktleSkgPT4ge1xuICAgICAgY29uc3QgY29ubmVjdGlvbiA9XG4gICAgICAgIC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gU29uYW11LmRiQ29uZmlnW1xuICAgICAgICAgIGNvbm5LZXlcbiAgICAgICAgXS5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICAgICAgY29uc3QgaG9zdCA9IGNvbm5lY3Rpb24uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29ubktleSxcbiAgICAgICAgbmFtZTogU3RyaW5nKGNvbm5LZXkpLFxuICAgICAgICBob3N0LFxuICAgICAgICBwb3J0OiBjb25uZWN0aW9uLnBvcnQgPz8gNTQzMixcbiAgICAgICAgZGF0YWJhc2U6IGNvbm5lY3Rpb24uZGF0YWJhc2UgPz8gXCJcIixcbiAgICAgICAgcmVtb3RlOiAhTE9DQUxfREJfSE9TVFMuaGFzKGhvc3QudG9Mb3dlckNhc2UoKSksXG4gICAgICAgIHJlcXVpcmVzQXBwcm92YWw6IHNsYWNrQ29uZmlybS5pc1RhcmdldFJlcXVpcmVzQXBwcm92YWwoY29ubktleSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOyGjOyKpOyXkCDsobTsnqztlZjripQg66eI7J206re466CI7J207IWYIO2MjOydvCDrqqnroZ3snYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkg67aE66as7ZiVIOuniOydtOq3uOugiOydtOyFmCBBUElcbiAgICovXG4gIGFzeW5jIGdldE1pZ3JhdGlvbkNvZGVzKCk6IFByb21pc2U8TWlncmF0aW9uQ29kZVtdPiB7XG4gICAgY29uc3Qgc3JjTWlncmF0aW9uc0RpciA9IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjXCIsIFwibWlncmF0aW9uc1wiKTsgLy8g7J206rG0IO2ZmOqyveyXkCDqtIDqs4Tsl4bsnbQg7ZWt7IOBIHNyY+yXkOyEnCDssL7slYTslbwg7ZW07JqULlxuXG4gICAgaWYgKCEoYXdhaXQgZXhpc3RzKHNyY01pZ3JhdGlvbnNEaXIpKSkge1xuICAgICAgYXdhaXQgbWtkaXIoc3JjTWlncmF0aW9uc0Rpciwge1xuICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2RlcyA9IChhd2FpdCByZWFkZGlyKHNyY01pZ3JhdGlvbnNEaXIpKVxuICAgICAgLmZpbHRlcigoZikgPT4gZi5lbmRzV2l0aChcIi50c1wiKSlcbiAgICAgIC5tYXAoKGYpID0+ICh7XG4gICAgICAgIG5hbWU6IGYucmVwbGFjZShcIi50c1wiLCBcIlwiKSxcbiAgICAgICAgcGF0aDogcGF0aC5qb2luKHNyY01pZ3JhdGlvbnNEaXIsIGYpLFxuICAgICAgfSkpXG4gICAgICAudG9Tb3J0ZWQoKGEsIGIpID0+IChhLm5hbWUgPCBiLm5hbWUgPyAxIDogLTEpKTsgLy8g7J2066aEIOuCtOumvOywqOyInCDsoJXroKwo7LWc7Iug7IicKVxuXG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOmdldE1pZ3JhdGlvbkNvZGVzOnJlc3VsdHNcIiwgY29kZXMpO1xuICAgIHJldHVybiBjb2RlcztcbiAgfVxuXG4gIC8qKlxuICAgKiDsu6TrhKXshZgg7ZWY64KY7J2YIO2YhOyerCDrsoTsoITqs7wgcGVuZGluZyDrqqnroZ3snYQg64+F66a97KCB7Jy866GcIOyhsO2ajO2VqeuLiOuLpC5cbiAgICog7Jes65+sIOuMgOyDgeydgCDtmLjstpzsnpDqsIAg67OR66Cs66GcIOyhsOumve2VoCDsiJgg7J6I7Iq164uI64ukLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkg67aE66as7ZiVIOuniOydtOq3uOugiOydtOyFmCBBUElcbiAgICovXG4gIGFzeW5jIGdldENvbm5lY3Rpb25TdGF0dXMoY29ubktleTogTWlncmF0aW9uVGFyZ2V0KTogUHJvbWlzZTxNaWdyYXRpb25Db25uZWN0aW9uU3RhdHVzPiB7XG4gICAgdGhpcy5hc3NlcnRNaWdyYXRpb25UYXJnZXQoY29ubktleSk7XG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgY29kZXMgPSBhd2FpdCB0aGlzLmdldE1pZ3JhdGlvbkNvZGVzKCk7XG4gICAgY29uc3Qga25leE9wdGlvbnMgPSBTb25hbXUuZGJDb25maWdbY29ubktleV07XG4gICAgY29uc3QgY29ubmVjdGlvbiA9XG4gICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIGtuZXhPcHRpb25zLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWc7XG4gICAgLy8gU0FGRVRZOiBLbmV46rCAIOygnOqzte2VnCBQb3N0Z3JlU1FMIOyXsOqysCDqtazshLHsnYQg67O17IKs7ZW0IHRpbWVvdXQg7ZWE65Oc66eMIOuNruyWtOyTtOuLpC5cbiAgICBjb25zdCB0Q29ubiA9IGNyZWF0ZUtuZXhJbnN0YW5jZSh7XG4gICAgICAuLi5rbmV4T3B0aW9ucyxcbiAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgLi4uY29ubmVjdGlvbixcbiAgICAgICAgY29ubmVjdGlvblRpbWVvdXRNaWxsaXM6IE1JR1JBVElPTl9DT05OX1RJTUVPVVRfTVMsXG4gICAgICB9LFxuICAgICAgcG9vbDoge1xuICAgICAgICAuLi5rbmV4T3B0aW9ucy5wb29sLFxuICAgICAgICBtaW46IDAsXG4gICAgICAgIGFjcXVpcmVUaW1lb3V0TWlsbGlzOiBNSUdSQVRJT05fQ09OTl9USU1FT1VUX01TLFxuICAgICAgICBjcmVhdGVUaW1lb3V0TWlsbGlzOiBNSUdSQVRJT05fQ09OTl9USU1FT1VUX01TLFxuICAgICAgICBwcm9wYWdhdGVDcmVhdGVFcnJvcjogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2l0aFRpbWVvdXQodENvbm4ucmF3KFwic2VsZWN0IDFcIiksIE1JR1JBVElPTl9DT05OX1RJTUVPVVRfTVMsICgpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICAgICAgICBgREIg7Jew6rKwIOyLnOqwhCDstIjqs7wgKCR7TUlHUkFUSU9OX0NPTk5fVElNRU9VVF9NU31tcykg4oCUICR7Y29ubmVjdGlvbi5ob3N0fToke2Nvbm5lY3Rpb24ucG9ydH0vJHtjb25uZWN0aW9uLmRhdGFiYXNlfWAsXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgbGV0IGVycm9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBzdGF0dXM6IG51bWJlciB8IFwiZXJyb3JcIiA9IGF3YWl0IHRDb25uLm1pZ3JhdGUuc3RhdHVzKCkuY2F0Y2goKGNhdWdodCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc01pc3NpbmdNaWdyYXRpb25UYWJsZUVycm9yKGNhdWdodCkpIHtcbiAgICAgICAgICByZXR1cm4gY29kZXMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGVycm9yID0gY2F1Z2h0IGluc3RhbmNlb2YgRXJyb3IgPyBjYXVnaHQubWVzc2FnZSA6IFN0cmluZyhjYXVnaHQpO1xuICAgICAgICByZXR1cm4gXCJlcnJvclwiIGFzIGNvbnN0O1xuICAgICAgfSk7XG4gICAgICBjb25zdCBwZW5kaW5nOiBzdHJpbmdbXSA9IGF3YWl0IHRDb25uLm1pZ3JhdGUubGlzdCgpLnRoZW4oXG4gICAgICAgIChbLCBmaWxlc106IFt1bmtub3duW10sIHsgZmlsZTogc3RyaW5nIH1bXV0pID0+XG4gICAgICAgICAgZmlsZXMubWFwKCh7IGZpbGUgfSkgPT4gZmlsZS5yZXBsYWNlKC9cXC50cyQvLCBcIlwiKSksXG4gICAgICAgIChjYXVzZTogdW5rbm93bikgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmlzTWlzc2luZ01pZ3JhdGlvblRhYmxlRXJyb3IoY2F1c2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29kZXMubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVycm9yID8/PSBjYXVzZSBpbnN0YW5jZW9mIEVycm9yID8gY2F1c2UubWVzc2FnZSA6IFN0cmluZyhjYXVzZSk7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcgfCBcIm5vbmVcIiB8IFwiZXJyb3JcIiA9IGF3YWl0IHRDb25uLm1pZ3JhdGVcbiAgICAgICAgLmN1cnJlbnRWZXJzaW9uKClcbiAgICAgICAgLmNhdGNoKChjYXVzZTogdW5rbm93bikgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmlzTWlzc2luZ01pZ3JhdGlvblRhYmxlRXJyb3IoY2F1c2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJub25lXCIgYXMgY29uc3Q7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVycm9yID8/PSBjYXVzZSBpbnN0YW5jZW9mIEVycm9yID8gY2F1c2UubWVzc2FnZSA6IFN0cmluZyhjYXVzZSk7XG4gICAgICAgICAgcmV0dXJuIFwiZXJyb3JcIiBhcyBjb25zdDtcbiAgICAgICAgfSk7XG4gICAgICBOYWl0ZS50KFwibWlncmF0b3I6Z2V0U3RhdHVzOnN0YXR1c1wiLCBzdGF0dXMpO1xuICAgICAgY29uc3QgY29ubmVjdGlvblN0YXR1czogTWlncmF0aW9uQ29ubmVjdGlvblN0YXR1cyA9IHtcbiAgICAgICAgY29ubktleSxcbiAgICAgICAgY3VycmVudFZlcnNpb24sXG4gICAgICAgIHN0YXR1cyxcbiAgICAgICAgcGVuZGluZyxcbiAgICAgICAgbGF0ZW5jeU1zOiBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICAgIH07XG4gICAgICBpZiAoZXJyb3IgIT09IHVuZGVmaW5lZCkgY29ubmVjdGlvblN0YXR1cy5lcnJvciA9IGVycm9yO1xuICAgICAgcmV0dXJuIGNvbm5lY3Rpb25TdGF0dXM7XG4gICAgfSBjYXRjaCAoY2F1Z2h0KSB7XG4gICAgICBjb25zdCBlcnJvciA9IGNhdWdodCBpbnN0YW5jZW9mIEVycm9yID8gY2F1Z2h0Lm1lc3NhZ2UgOiBTdHJpbmcoY2F1Z2h0KTtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgIGAke1N0cmluZyhjb25uS2V5KX3snZgg66eI7J206re466CI7J207IWYIOyDge2DnOulvCDqsIDsoLjsmKTripQg642w7JeQIOyLpO2MqO2VmOyYgOyKteuLiOuLpC5cXG4ke2Vycm9yfWAsXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29ubktleSxcbiAgICAgICAgY3VycmVudFZlcnNpb246IFwiZXJyb3JcIixcbiAgICAgICAgc3RhdHVzOiBcImVycm9yXCIsXG4gICAgICAgIHBlbmRpbmc6IFtdLFxuICAgICAgICBsYXRlbmN5TXM6IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRlZEF0LFxuICAgICAgICBlcnJvcixcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHdpdGhUaW1lb3V0KHRDb25uLmRlc3Ryb3koKSwgTUlHUkFUSU9OX0NPTk5fVElNRU9VVF9NUywgKCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IEVycm9yKFwiY29ubmVjdGlvbiBkZXN0cm95IHRpbWVvdXRcIik7XG4gICAgICB9KS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOuMgOyDgSBEQuyXkOyEnCDqsIDsnqUg7LWc6re87JeQIOyggeyaqeuQnCBtaWdyYXRpb24gYmF0Y2jrpbwg67CY7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkg67aE66as7ZiVIOuniOydtOq3uOugiOydtOyFmCBBUElcbiAgICovXG4gIGFzeW5jIGdldExhdGVzdEFwcGxpZWRCYXRjaChcbiAgICBjb25uS2V5OiBNaWdyYXRpb25UYXJnZXQsXG4gICk6IFByb21pc2U8eyBiYXRjaE5vOiBudW1iZXI7IGZpbGVzOiBzdHJpbmdbXSB9PiB7XG4gICAgdGhpcy5hc3NlcnRNaWdyYXRpb25UYXJnZXQoY29ubktleSk7XG4gICAgY29uc3Qga25leE9wdGlvbnMgPSBTb25hbXUuZGJDb25maWdbY29ubktleV07XG4gICAgY29uc3QgY29ubmVjdGlvbiA9XG4gICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIGtuZXhPcHRpb25zLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWc7XG4gICAgY29uc3QgdENvbm4gPSBjcmVhdGVLbmV4SW5zdGFuY2Uoe1xuICAgICAgLi4ua25leE9wdGlvbnMsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLmNvbm5lY3Rpb24sXG4gICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzOiBNSUdSQVRJT05fQ09OTl9USU1FT1VUX01TLFxuICAgICAgfSxcbiAgICAgIHBvb2w6IHtcbiAgICAgICAgLi4ua25leE9wdGlvbnMucG9vbCxcbiAgICAgICAgbWluOiAwLFxuICAgICAgICBhY3F1aXJlVGltZW91dE1pbGxpczogTUlHUkFUSU9OX0NPTk5fVElNRU9VVF9NUyxcbiAgICAgICAgY3JlYXRlVGltZW91dE1pbGxpczogTUlHUkFUSU9OX0NPTk5fVElNRU9VVF9NUyxcbiAgICAgICAgcHJvcGFnYXRlQ3JlYXRlRXJyb3I6IHRydWUsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IGtuZXhPcHRpb25zLm1pZ3JhdGlvbnM/LnRhYmxlTmFtZSA/PyBcImtuZXhfbWlncmF0aW9uc1wiO1xuICAgICAgY29uc3Qgc2NoZW1hTmFtZSA9IGtuZXhPcHRpb25zLm1pZ3JhdGlvbnM/LnNjaGVtYU5hbWU7XG4gICAgICBjb25zdCBtaWdyYXRpb25zVGFibGUgPVxuICAgICAgICBzY2hlbWFOYW1lID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHRDb25uPHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBiYXRjaDogbnVtYmVyIH0+KHRhYmxlTmFtZSlcbiAgICAgICAgICA6IHRDb25uPHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBiYXRjaDogbnVtYmVyIH0+KHRhYmxlTmFtZSkud2l0aFNjaGVtYShzY2hlbWFOYW1lKTtcbiAgICAgIGNvbnN0IGxhdGVzdCA9IGF3YWl0IG1pZ3JhdGlvbnNUYWJsZS5jbG9uZSgpLnNlbGVjdChcImJhdGNoXCIpLm9yZGVyQnkoXCJiYXRjaFwiLCBcImRlc2NcIikuZmlyc3QoKTtcbiAgICAgIGlmIChsYXRlc3QgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHsgYmF0Y2hObzogMCwgZmlsZXM6IFtdIH07XG5cbiAgICAgIC8vIOqwmeydgCBiYXRjaCDslYjsl5DshJzripQgS25leCDsi6Ttlokg7Iic7ISc64yA66GcIOuhpOuwsSDqs4Ttmo3snYQg6rOg7KCV7ZWc64ukLlxuICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IG1pZ3JhdGlvbnNUYWJsZVxuICAgICAgICAuY2xvbmUoKVxuICAgICAgICAuc2VsZWN0KFwibmFtZVwiKVxuICAgICAgICAud2hlcmUoXCJiYXRjaFwiLCBsYXRlc3QuYmF0Y2gpXG4gICAgICAgIC5vcmRlckJ5KFwiaWRcIiwgXCJhc2NcIik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiYXRjaE5vOiBsYXRlc3QuYmF0Y2gsXG4gICAgICAgIGZpbGVzOiByb3dzLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUucmVwbGFjZSgvXFwudHMkLywgXCJcIikpLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChjYXVnaHQpIHtcbiAgICAgIGlmICh0aGlzLmlzTWlzc2luZ01pZ3JhdGlvblRhYmxlRXJyb3IoY2F1Z2h0KSkgcmV0dXJuIHsgYmF0Y2hObzogMCwgZmlsZXM6IFtdIH07XG4gICAgICB0aHJvdyBjYXVnaHQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRDb25uLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7LWc7IugIOyDge2DnOyduCDquLDspIAgRELsmYAg7JeU7Yuw7YuwIOygleydmOulvCDruYTqtZDtlbQg7IOd7ISxIOyYiOyglSDsvZTrk5zrpbwg67CY7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkg67aE66as7ZiVIOuniOydtOq3uOugiOydtOyFmCBBUElcbiAgICovXG4gIGFzeW5jIGdldFByZXBhcmVkQ29kZXMoY29tcGFyZUNvbm5LZXk6IE1pZ3JhdGlvblRhcmdldCk6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZVtdPiB7XG4gICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5nZXRDb25uZWN0aW9uU3RhdHVzKGNvbXBhcmVDb25uS2V5KTtcbiAgICBpZiAoc3RhdHVzLnN0YXR1cyAhPT0gMCB8fCBzdGF0dXMuZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTWlncmF0aW9uIGNvbXBhcmlzb24gcmVxdWlyZXMgYW4gdXAtdG8tZGF0ZSBkYXRhYmFzZTogJHtTdHJpbmcoY29tcGFyZUNvbm5LZXkpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbXBhcmVXaXRoQ29ubmVjdGlvbihjb21wYXJlQ29ubktleSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbXBhcmVXaXRoQ29ubmVjdGlvbihjb21wYXJlQ29ubktleTogTWlncmF0aW9uVGFyZ2V0KSB7XG4gICAgY29uc3QgY29tcGFyZURCID0gY3JlYXRlS25leEluc3RhbmNlKFNvbmFtdS5kYkNvbmZpZ1tjb21wYXJlQ29ubktleV0pO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb21wYXJlTWlncmF0aW9ucyhjb21wYXJlREIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjb21wYXJlREIuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCDsi6Dqt5wgVUnsl5DshJzripQg7Luk64Sl7IWY67OEIOyhsO2ajCBBUEnrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICAgKiDquLDsobQgQ0xJ7JmAIOyKpO2BrOumve2KuCDtmLjtmZjsnYQg7JyE7ZW0IOyghOyytCDsg4Htg5zrpbwg7KGw66a97ZWp64uI64ukLlxuICAgKiBAY2F0ZWdvcnkg7Zi47ZmY7JqpIOuniOydtOq3uOugiOydtOyFmCBBUElcbiAgICovXG4gIGFzeW5jIGdldFN0YXR1cygpOiBQcm9taXNlPE1pZ3JhdGlvblN0YXR1cz4ge1xuICAgIGNvbnN0IFtjb2RlcywgY29ubmVjdGlvbnNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgdGhpcy5nZXRNaWdyYXRpb25Db2RlcygpLFxuICAgICAgUHJvbWlzZS5yZXNvbHZlKHRoaXMuZ2V0Q29ubmVjdGlvbnMoKSksXG4gICAgXSk7XG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOmdldFN0YXR1czpjb2Rlc1wiLCBjb2Rlcyk7XG5cbiAgICBjb25zdCBjb25uZWN0aW9uU3RhdHVzZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGNvbm5lY3Rpb25zLm1hcCgoeyBjb25uS2V5IH0pID0+IHRoaXMuZ2V0Q29ubmVjdGlvblN0YXR1cyhjb25uS2V5KSksXG4gICAgKTtcbiAgICBjb25zdCBjb25ucyA9IGNvbm5lY3Rpb25zLm1hcCgoY29ubmVjdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGNvbm5lY3Rpb25TdGF0dXNlc1tpbmRleF07XG4gICAgICBhc3NlcnQoc3RhdHVzICE9PSB1bmRlZmluZWQpO1xuICAgICAgY29uc3QgY29uZmlndXJlZCA9XG4gICAgICAgIC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gU29uYW11LmRiQ29uZmlnW1xuICAgICAgICAgIGNvbm5lY3Rpb24uY29ubktleVxuICAgICAgICBdLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWc7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBjb25uZWN0aW9uLm5hbWUsXG4gICAgICAgIGNvbm5LZXk6IGNvbm5lY3Rpb24uY29ubktleSxcbiAgICAgICAgY29ublN0cmluZzpcbiAgICAgICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIGBwZzovLyR7Y29uZmlndXJlZC51c2VyID8/IFwiXCJ9QCR7Y29uZmlndXJlZC5ob3N0fToke2NvbmZpZ3VyZWQucG9ydH0vJHtjb25maWd1cmVkLmRhdGFiYXNlfWAgYXMgQ29ublN0cmluZyxcbiAgICAgICAgY3VycmVudFZlcnNpb246IHN0YXR1cy5jdXJyZW50VmVyc2lvbixcbiAgICAgICAgc3RhdHVzOiBzdGF0dXMuc3RhdHVzLFxuICAgICAgICBwZW5kaW5nOiBzdGF0dXMucGVuZGluZyxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOmdldFN0YXR1czpjb25uc1wiLCBjb25ucyk7XG5cbiAgICBjb25zdCBjb21wYXJlQ29ubiA9IGNvbm5lY3Rpb25TdGF0dXNlcy5maW5kKFxuICAgICAgKHsgc3RhdHVzLCBlcnJvciB9KSA9PiBzdGF0dXMgPT09IDAgJiYgZXJyb3IgPT09IHVuZGVmaW5lZCxcbiAgICApO1xuICAgIGNvbnN0IHByZXBhcmVkQ29kZXMgPVxuICAgICAgY29tcGFyZUNvbm4gPT09IHVuZGVmaW5lZCA/IFtdIDogYXdhaXQgdGhpcy5jb21wYXJlV2l0aENvbm5lY3Rpb24oY29tcGFyZUNvbm4uY29ubktleSk7XG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOmdldFN0YXR1czpwcmVwYXJlZENvZGVzXCIsIHByZXBhcmVkQ29kZXMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbm5zLFxuICAgICAgY29kZXMsXG4gICAgICBwcmVwYXJlZENvZGVzLFxuICAgICAgZXJyb3I6IGNvbm5lY3Rpb25TdGF0dXNlcy5maW5kKCh7IGVycm9yIH0pID0+IGVycm9yICE9PSB1bmRlZmluZWQpPy5lcnJvcixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOuMgOyDgSBEQuyXkCBwZW5kaW5nIOuniOydtOq3uOugiOydtOyFmOydhCDsoIHsmqntlanri4jri6QuXG4gICAqIENMSeyZgCBXZWLsnYAg6rCZ7J2AIOuplOyEnOuTnOulvCDsgqzsmqntlZjrqbAsIFdlYuydgCBgb25Qcm9ncmVzc2Drpbwgc3RyZWFt7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBhcHBseSh0YXJnZXRzOiBNaWdyYXRpb25UYXJnZXRbXSwgb3B0aW9ucz86IE1pZ3JhdGlvblJ1bk9wdGlvbnMpOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJ1bkFjdGlvbldpdGhQcm9ncmVzcyhcImFwcGx5XCIsIHRhcmdldHMsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIOuMgOyDgSBEQuyXkOyEnCDqsIDsnqUg7LWc6re8IG1pZ3JhdGlvbiBiYXRjaOulvCDroaTrsLHtlanri4jri6QuXG4gICAqIENMSeyZgCBXZWLsnYAg6rCZ7J2AIOuplOyEnOuTnOulvCDsgqzsmqntlZjrqbAsIFdlYuydgCBgb25Qcm9ncmVzc2Drpbwgc3RyZWFt7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICogQGNhdGVnb3J5IOu2hOumrO2YlSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyByb2xsYmFjayhcbiAgICB0YXJnZXRzOiBNaWdyYXRpb25UYXJnZXRbXSxcbiAgICBvcHRpb25zPzogTWlncmF0aW9uUnVuT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5ydW5BY3Rpb25XaXRoUHJvZ3Jlc3MoXCJyb2xsYmFja1wiLCB0YXJnZXRzLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBhY3Rpb24g66y47J6Q7Je0IOuMgOyLoCB7QGxpbmsgYXBwbHl9IOuYkOuKlCB7QGxpbmsgcm9sbGJhY2t97J2EIOyngeygkSDsgqzsmqntlanri4jri6QuXG4gICAqIOq4sOyhtCDsmbjrtoAg7Zi47Lac7J2YIO2VmOychCDtmLjtmZjrp4zsnYQg7JyE7ZW0IOycoOyngO2VqeuLiOuLpC5cbiAgICogQGNhdGVnb3J5IO2YuO2ZmOyaqSDrp4jsnbTqt7jroIjsnbTshZggQVBJXG4gICAqL1xuICBhc3luYyBydW5BY3Rpb24oXG4gICAgYWN0aW9uOiBcImFwcGx5XCIgfCBcInJvbGxiYWNrXCIsXG4gICAgdGFyZ2V0czogKGtleW9mIFNvbmFtdURCQ29uZmlnKVtdLFxuICApOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdD4ge1xuICAgIHJldHVybiBhY3Rpb24gPT09IFwiYXBwbHlcIiA/IHRoaXMuYXBwbHkodGFyZ2V0cykgOiB0aGlzLnJvbGxiYWNrKHRhcmdldHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5BY3Rpb25XaXRoUHJvZ3Jlc3MoXG4gICAgYWN0aW9uOiBcImFwcGx5XCIgfCBcInJvbGxiYWNrXCIsXG4gICAgdGFyZ2V0czogTWlncmF0aW9uVGFyZ2V0W10sXG4gICAgb3B0aW9ucz86IE1pZ3JhdGlvblJ1bk9wdGlvbnMsXG4gICk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PiB7XG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOnJ1bkFjdGlvbjphY3Rpb25cIiwgYWN0aW9uKTtcbiAgICBOYWl0ZS50KFwibWlncmF0b3I6cnVuQWN0aW9uOnRhcmdldHNcIiwgdGFyZ2V0cyk7XG5cbiAgICBjb25zdCBhbGxvd2VkVGFyZ2V0cyA9IG5ldyBTZXQodGhpcy5nZXRNaWdyYXRpb25UYXJnZXRLZXlzKCkpO1xuICAgIGNvbnN0IGRpc2FsbG93ZWRUYXJnZXRzID0gdGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gIWFsbG93ZWRUYXJnZXRzLmhhcyh0YXJnZXQpKTtcbiAgICBpZiAoZGlzYWxsb3dlZFRhcmdldHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTWlncmF0aW9uIHRhcmdldHMgYXJlIG5vdCBhbGxvd2VkIGluIE5PREVfRU5WPSR7Z2V0U29uYW11RW52aXJvbm1lbnQoKX06ICR7ZGlzYWxsb3dlZFRhcmdldHMuam9pbihcIiwgXCIpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGdldCB1bmlxIGtuZXggY29uZmlnc1xuICAgIGNvbnN0IGNvbmZpZ3MgPSB1bmlxdWUoXG4gICAgICB0YXJnZXRzXG4gICAgICAgIC5tYXAoKHRhcmdldCkgPT4gKHtcbiAgICAgICAgICBjb25uS2V5OiB0YXJnZXQsXG4gICAgICAgICAgb3B0aW9uczogU29uYW11LmRiQ29uZmlnW3RhcmdldF0sXG4gICAgICAgIH0pKVxuICAgICAgICAuZmlsdGVyKChjKSA9PiBjLm9wdGlvbnMgIT09IHVuZGVmaW5lZCksXG4gICAgICAoeyBvcHRpb25zOiBkYk9wdGlvbnMgfSkgPT5cbiAgICAgICAgYCR7LyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoZGJPcHRpb25zLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWcpLmhvc3R9OiR7XG4gICAgICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgICBkYk9wdGlvbnMuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZ1xuICAgICAgICAgICkucG9ydCA/PyA1NDMyXG4gICAgICAgIH0vJHsvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChkYk9wdGlvbnMuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZykuZGF0YWJhc2V9YCxcbiAgICApO1xuXG4gICAgLy8gZ2V0IGNvbm5lY3Rpb25zXG4gICAgY29uc3QgY29ubnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGNvbmZpZ3MubWFwKGFzeW5jIChjb25maWcpID0+ICh7XG4gICAgICAgIGNvbm5LZXk6IGNvbmZpZy5jb25uS2V5LFxuICAgICAgICBrbmV4OiBjcmVhdGVLbmV4SW5zdGFuY2UoY29uZmlnLm9wdGlvbnMpLFxuICAgICAgfSkpLFxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW5NaWdyYXRpb25zU2VxdWVudGlhbGx5KGNvbm5zLCBhY3Rpb24sIG9wdGlvbnMpO1xuXG4gICAgICBOYWl0ZS50KFwibWlncmF0b3I6cnVuQWN0aW9uOnJlc3VsdFwiLCByZXN1bHQpO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgY29ubnMubWFwKCh7IGtuZXggfSkgPT4ge1xuICAgICAgICAgIHJldHVybiBrbmV4LmRlc3Ryb3koKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2VuRGF0ZVRhZyhpbmRleDogbnVtYmVyLCBiYXNlRGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShiYXNlRGF0ZS5nZXRUaW1lKCkgKyBpbmRleCAqIDEwMDApO1xuICAgIHJldHVybiAoXG4gICAgICBkYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKSArXG4gICAgICBwYWREYXRlUGFydChkYXRlLmdldE1vbnRoKCkgKyAxKSArXG4gICAgICBwYWREYXRlUGFydChkYXRlLmdldERhdGUoKSkgK1xuICAgICAgcGFkRGF0ZVBhcnQoZGF0ZS5nZXRIb3VycygpKSArXG4gICAgICBwYWREYXRlUGFydChkYXRlLmdldE1pbnV0ZXMoKSkgK1xuICAgICAgcGFkRGF0ZVBhcnQoZGF0ZS5nZXRTZWNvbmRzKCkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrp4jsnbTqt7jroIjsnbTshZgg7L2U65OcIO2MjOydvOydhCDsg53shLHtlanri4jri6QuXG4gICAqXG4gICAqIFNvbmFtdSBVSeyXkOyEnCDsgqzsmqnrkKnri4jri6QuXG4gICAqXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDrp4jsnbTqt7jroIjsnbTshZgg7L2U65OcIO2MjOydvCDqsJzsiJhcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlUHJlcGFyZWRDb2Rlcyhjb21wYXJlQ29ubktleT86IE1pZ3JhdGlvblRhcmdldCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgcHJlcGFyZWRDb2RlcyA9XG4gICAgICBjb21wYXJlQ29ubktleSA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gKGF3YWl0IHRoaXMuZ2V0U3RhdHVzKCkpLnByZXBhcmVkQ29kZXNcbiAgICAgICAgOiBhd2FpdCB0aGlzLmdldFByZXBhcmVkQ29kZXMoY29tcGFyZUNvbm5LZXkpO1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZW5lcmF0ZVByZXBhcmVkQ29kZXM6cHJlcGFyZWRDb2Rlc1wiLCBwcmVwYXJlZENvZGVzKTtcbiAgICBpZiAocHJlcGFyZWRDb2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKFwiXFxu7ZiE7J6sIOuqqOuRkCDsi7HtgazrkJwg7IOB7YOc7J6F64uI64ukLlwiKSk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyDsi6TsoJwg7L2U65OcIOyDneyEsVxuICAgIGNvbnN0IG1pZ3JhdGlvbnNEaXIgPSBgJHtTb25hbXUuYXBpUm9vdFBhdGh9L3NyYy9taWdyYXRpb25zYDtcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCBwY29kZV0gb2YgcHJlcGFyZWRDb2Rlcy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChwY29kZS5mb3JtYXR0ZWQpIHtcbiAgICAgICAgY29uc3QgZGF0ZVRhZyA9IHRoaXMuZ2VuRGF0ZVRhZyhpbmRleCk7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gYCR7bWlncmF0aW9uc0Rpcn0vJHtkYXRlVGFnfV8ke3Bjb2RlLnRpdGxlfS50c2A7XG4gICAgICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgcGNvZGUuZm9ybWF0dGVkKTtcbiAgICAgICAgIWlzVGVzdCgpICYmIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGBNSUdSQVRJT04gQ1JFQVRFRCAke2ZpbGVQYXRofWApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHJlcGFyZWRDb2Rlcy5sZW5ndGg7XG4gIH1cblxuICBhc3luYyBjb21wYXJlTWlncmF0aW9ucyhjb21wYXJlREI6IEtuZXgpOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICAgIC8vIEVudGl0eSDsiJztmoztlZjsl6wg7Iux7YGsXG4gICAgY29uc3QgZW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcblxuICAgIC8vIOyhsOyduO2FjOydtOu4lCDtj6ztlajtlZjsl6wgRW50aXR57JeQ7IScIE1pZ3JhdGlvblNldCDstpTstpxcbiAgICBjb25zdCBlbnRpdHlTZXRzV2l0aEpvaW5UYWJsZSA9IGVudGl0eUlkc1xuICAgICAgLmZpbHRlcigoZW50aXR5SWQpID0+IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKS5wcm9wcy5sZW5ndGggPiAwKVxuICAgICAgLm1hcCgoZW50aXR5SWQpID0+IGdldE1pZ3JhdGlvblNldEZyb21FbnRpdHkoRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpKSk7XG5cbiAgICAvLyDsobDsnbjthYzsnbTruJTrp4wg7LaU7LacXG4gICAgY29uc3Qgam9pblRhYmxlc1dpdGhEdXAgPSBlbnRpdHlTZXRzV2l0aEpvaW5UYWJsZS5mbGF0TWFwKChlbnRpdHlTZXQpID0+IGVudGl0eVNldC5qb2luVGFibGVzKTtcbiAgICAvLyDspJHrs7Ug7KCc6rGwICjspJHrs7Xsnbgg6rK97JqwIGluZGV4ZXPrpbwg67OR7ZWpKVxuICAgIGNvbnN0IGpvaW5UYWJsZXMgPSBPYmplY3QudmFsdWVzKGdyb3VwKGpvaW5UYWJsZXNXaXRoRHVwLCAoanQpID0+IGp0LnRhYmxlKSkubWFwKCh0YWJsZXMpID0+IHtcbiAgICAgIGFzc2VydCh0YWJsZXMgIT09IHVuZGVmaW5lZCwgXCJ0YWJsZXMgaXMgdW5kZWZpbmVkXCIpO1xuICAgICAgaWYgKHRhYmxlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHRhYmxlc1swXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnRhYmxlc1swXSxcbiAgICAgICAgaW5kZXhlczogdW5pcXVlKFxuICAgICAgICAgIHRhYmxlcy5mbGF0TWFwKCh0KSA9PiB0LmluZGV4ZXMpLFxuICAgICAgICAgIChpbmRleCkgPT4gW2luZGV4LnR5cGUsIC4uLmluZGV4LmNvbHVtbnNdLmpvaW4oXCItXCIpLFxuICAgICAgICApLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIOyhsOyduO2FjOydtOu4lCDtj6ztlajtlZjsl6wgTWlncmF0aW9uU2V0IOuwsOyXtFxuICAgIGNvbnN0IGVudGl0eVNldHM6IE1pZ3JhdGlvblNldFtdID0gWy4uLmVudGl0eVNldHNXaXRoSm9pblRhYmxlLCAuLi5qb2luVGFibGVzXTtcblxuICAgIGNvbnN0IGNvZGVzOiBHZW5NaWdyYXRpb25Db2RlW10gPSBbXTtcbiAgICBjb25zdCBiYXRjaFNpemUgPSA0O1xuXG4gICAgLy8g7YWM7J2067iU66eI64ukIOyKpO2CpOuniOulvCDsobDtmoztlZjrqbQg7JmV67O17J20IO2FjOydtOu4lCDsiJjsl5Ag67mE66GA7ZW0IOuKmOyWtOuCnOuLpC5cbiAgICAvLyDsooXrpZjrs4TroZwg7ZWcIOuyiOyUqeunjCDsnb3slrTrkZDqs6Ag7JWE656Y7JeQ7IScIO2FjOydtOu4lOuqheycvOuhnCDssL7slYQg7JO064ukLlxuICAgIGNvbnN0IGRiU2V0cyA9IGF3YWl0IFBvc3RncmVTUUxTY2hlbWFSZWFkZXIuZ2V0TWlncmF0aW9uU2V0RnJvbURCQWxsKGNvbXBhcmVEQik7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudGl0eVNldHMubGVuZ3RoOyBpICs9IGJhdGNoU2l6ZSkge1xuICAgICAgY29uc3QgYmF0Y2hDb2RlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBlbnRpdHlTZXRzLnNsaWNlKGksIGkgKyBiYXRjaFNpemUpLm1hcChhc3luYyAoZW50aXR5U2V0KSA9PiB7XG4gICAgICAgICAgY29uc3QgZGJTZXQgPSBkYlNldHMuZ2V0KGVudGl0eVNldC50YWJsZSkgPz8gbnVsbDtcbiAgICAgICAgICBOYWl0ZS50KGBtaWdyYXRvcjpjb21wYXJlTWlncmF0aW9uczplbnRpdHlTZXQ6JHtlbnRpdHlTZXQudGFibGV9YCwgZW50aXR5U2V0KTtcbiAgICAgICAgICBOYWl0ZS50KGBtaWdyYXRvcjpjb21wYXJlTWlncmF0aW9uczpkYlNldDoke2VudGl0eVNldC50YWJsZX1gLCBkYlNldCk7XG5cbiAgICAgICAgICBpZiAoZGJTZXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIOq4sOyhtCDthYzsnbTruJQg7JeG7J2MLCDsg4jroZwg7YWM7J2067iUIOyDneyEsVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGdlbmVyYXRlQ3JlYXRlQ29kZShlbnRpdHlTZXQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyDquLDsobQg7YWM7J2067iUIOyhtOyerO2VmOuKlCDsvIDsnbTsiqRcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBnZW5lcmF0ZUFsdGVyQ29kZShlbnRpdHlTZXQsIGRiU2V0LCBjb21wYXJlREIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICBjb2Rlcy5wdXNoKC4uLmJhdGNoQ29kZXMuZmxhdCgpKTtcbiAgICB9XG5cbiAgICAvLyBub3JtYWwg7YOA7J6F7J20IOyVnuycvOuhnCwgZm9yZWlnbuydtCDrkqTroZxcbiAgICBjb2Rlcy5zb3J0KChjb2RlQSwgY29kZUIpID0+IHtcbiAgICAgIGlmIChjb2RlQS50eXBlID09PSBcImZvcmVpZ25cIiAmJiBjb2RlQi50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfSBlbHNlIGlmIChjb2RlQS50eXBlID09PSBcIm5vcm1hbFwiICYmIGNvZGVCLnR5cGUgPT09IFwiZm9yZWlnblwiKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvZGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIHRlc3QgRELsnZggc25hcHNob3TsnLzroZwg7J6E7IucIFNoYWRvdyBEQuulvCDrp4zrk6Tqs6Ag7KCE7LK0IOuniOydtOq3uOugiOydtOyFmOydhCDqsoDspp3tlanri4jri6QuXG4gICAqIENMSeyZgCBXZWLsnYAgYG9uUHJvZ3Jlc3NgIOycoOustOunjCDri6zrpqztlbQg6rCZ7J2AIOyLpO2WiSDsnZjrr7jrpbwg6rO17Jyg7ZWgIOyImCDsnojsirXri4jri6QuXG4gICAqXG4gICAqIEBjYXRlZ29yeSDrtoTrpqztmJUg66eI7J206re466CI7J207IWYIEFQSVxuICAgKi9cbiAgYXN5bmMgcnVuU2hhZG93VGVzdChcbiAgICBvcHRpb25zPzogTWlncmF0aW9uUnVuT3B0aW9ucyAmIHsgdGFyZ2V0PzogTWlncmF0aW9uVGFyZ2V0IH0sXG4gICk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gb3B0aW9ucz8udGFyZ2V0ID8/IFwidGVzdFwiO1xuICAgIGlmICh0YXJnZXQgIT09IFwidGVzdFwiICYmIHRhcmdldCAhPT0gXCJmaXh0dXJlXCIpIHtcbiAgICAgIC8vIOyatOyYgSDqs4Tsl7QgRELripQg7ISk7KCVIOyhsO2ajOuCmCDsl7DqsrAg7IOd7ISx67O064ukIOuovOyggCDssKjri6jtlZzri6QuXG4gICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihg7KeA7JuQ7ZWY7KeAIOyViuuKlCBTaGFkb3cg66eI7J206re466CI7J207IWYIOuMgOyDgeyeheuLiOuLpDogJHt0YXJnZXR9YCksIHtcbiAgICAgICAgY29kZTogXCJJTlZBTElEX1NIQURPV19NSUdSQVRJT05fVEFSR0VUXCIsXG4gICAgICAgIHRhcmdldCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBzaGFkb3dUYXJnZXQ6IFNoYWRvd01pZ3JhdGlvblRhcmdldCA9IHRhcmdldDtcbiAgICBjb25zdCBiYXNlVGFyZ2V0Q29ubiA9XG4gICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFNvbmFtdS5kYkNvbmZpZ1tcbiAgICAgICAgc2hhZG93VGFyZ2V0XG4gICAgICBdLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWc7XG4gICAgY29uc3QgY29uZmlndXJlZERhdGFiYXNlID0gYmFzZVRhcmdldENvbm4uZGF0YWJhc2U7XG4gICAgaWYgKCFjb25maWd1cmVkRGF0YWJhc2UpIHtcbiAgICAgIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGBTaGFkb3cg64yA7IOBIERCIOydtOumhOydtCDsl4bsirXri4jri6Q6ICR7c2hhZG93VGFyZ2V0fWApLCB7XG4gICAgICAgIGNvZGU6IFwiSU5WQUxJRF9TSEFET1dfREFUQUJBU0VfQ09ORklHXCIsXG4gICAgICAgIHRhcmdldDogc2hhZG93VGFyZ2V0LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHdvcmtlcklkID1cbiAgICAgIHNoYWRvd1RhcmdldCA9PT0gXCJ0ZXN0XCIgJiYgcHJvY2Vzcy5lbnYuU09OQU1VX1dPUktFUl9EQiA9PT0gXCJ0cnVlXCJcbiAgICAgICAgPyBwcm9jZXNzLmVudi5WSVRFU1RfUE9PTF9JRFxuICAgICAgICA6IG51bGw7XG4gICAgY29uc3QgdGVtcGxhdGVEYXRhYmFzZSA9XG4gICAgICB3b3JrZXJJZCAhPT0gbnVsbCA/IGAke2NvbmZpZ3VyZWREYXRhYmFzZX1fJHt3b3JrZXJJZCA/PyBcIjFcIn1gIDogY29uZmlndXJlZERhdGFiYXNlO1xuICAgIGNvbnN0IHNoYWRvd0RhdGFiYXNlID0gYCR7dGVtcGxhdGVEYXRhYmFzZX1fX21pZ3JhdGlvbl9zaGFkb3dgO1xuICAgIGNvbnN0IGNyZWF0ZVNoYWRvd0Nvbm5lY3Rpb24gPSAoZGF0YWJhc2U6IHN0cmluZykgPT5cbiAgICAgIGNyZWF0ZUtuZXhJbnN0YW5jZSh7XG4gICAgICAgIC4uLlNvbmFtdS5kYkNvbmZpZ1tzaGFkb3dUYXJnZXRdLFxuICAgICAgICBjb25uZWN0aW9uOiB7IC4uLmJhc2VUYXJnZXRDb25uLCBkYXRhYmFzZSB9LFxuICAgICAgfSk7XG5cbiAgICAvLyDthYzsiqTtirgg7IOB7Zmp7JeQ7ISc64qUIO2KuOuenOyereyFmOydhCDstIjquLDtmZTtlZjqs6AsIOyDiCDrjbDsnbTthLDrsqDsnbTsiqQg7Luk64Sl7IWY7J2EIOqwgOyguOyZgOyVvCDtlahcbiAgICBpZiAoaXNUZXN0KCkpIHtcbiAgICAgIGF3YWl0IERCLmNsZWFyVGVzdFRyYW5zYWN0aW9uKCk7XG4gICAgICBhd2FpdCBEQi5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgLy8g6riw7KG0IFNoYWRvdyBEQiDsgq3soJwg7ZuEIFNoYWRvdyBEQiDsg53shLFcbiAgICBjb25zdCB0ZGIgPSBjcmVhdGVTaGFkb3dDb25uZWN0aW9uKFwicG9zdGdyZXNcIik7XG4gICAgdHJ5IHtcbiAgICAgICFpc1Rlc3QoKSAmJiBjb25zb2xlLmxvZyhjaGFsay5tYWdlbnRhKGAke3NoYWRvd0RhdGFiYXNlfSDsgq3soJxgKSk7XG4gICAgICBhd2FpdCB0ZGIucmF3KFwiRFJPUCBEQVRBQkFTRSBJRiBFWElTVFMgPz9cIiwgW3NoYWRvd0RhdGFiYXNlXSk7XG4gICAgICBhd2FpdCB0ZGIucmF3KFxuICAgICAgICBgXG4gICAgICAgIFNFTEVDVCBwZ190ZXJtaW5hdGVfYmFja2VuZChwZ19zdGF0X2FjdGl2aXR5LnBpZClcbiAgICAgICAgRlJPTSBwZ19zdGF0X2FjdGl2aXR5XG4gICAgICAgIFdIRVJFIGRhdG5hbWUgPSA/XG4gICAgICAgICAgQU5EIHBpZCA8PiBwZ19iYWNrZW5kX3BpZCgpO1xuICAgICAgYCxcbiAgICAgICAgW3RlbXBsYXRlRGF0YWJhc2VdLFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHRkYi5yYXcoXCJDUkVBVEUgREFUQUJBU0UgPz8gVEVNUExBVEUgPz9cIiwgW3NoYWRvd0RhdGFiYXNlLCB0ZW1wbGF0ZURhdGFiYXNlXSk7XG5cbiAgICAgIC8vIFNoYWRvdyBEQuyXkCDsl7DqsrBcbiAgICAgIGNvbnN0IHNkYiA9IGNyZWF0ZVNoYWRvd0Nvbm5lY3Rpb24oc2hhZG93RGF0YWJhc2UpO1xuXG4gICAgICAvLyBzaGFkb3cgREIg7YWM7Iqk7Yq4IOynhO2WiVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSB0aGlzLmNyZWF0ZVByb2dyZXNzSG9va3MoXCJzaGFkb3dcIiwgXCJzaGFkb3dcIiwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IFtiYXRjaE5vLCBhcHBsaWVkXSA9IGF3YWl0IHNkYi5taWdyYXRlLmxhdGVzdChwcm9ncmVzcyk7XG4gICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKFwiU2hhZG93IERCIO2FjOyKpO2KuOyXkCDshLHqs7XtlojsirXri4jri6QhXCIpLCB7XG4gICAgICAgICAgICBiYXRjaE5vLFxuICAgICAgICAgICAgYXBwbGllZCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmVtaXRQcm9ncmVzcyhvcHRpb25zLCB7XG4gICAgICAgICAgdHlwZTogXCJ0YXJnZXQtY29tcGxldGVcIixcbiAgICAgICAgICBhY3Rpb246IFwic2hhZG93XCIsXG4gICAgICAgICAgY29ubktleTogXCJzaGFkb3dcIixcbiAgICAgICAgICBiYXRjaE5vLFxuICAgICAgICAgIGZpbGVzOiBhcHBsaWVkLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbm5LZXk6IFwic2hhZG93XCIsXG4gICAgICAgICAgICBiYXRjaE5vLFxuICAgICAgICAgICAgYXBwbGllZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICB0aHJvdyBuZXcgTWlncmF0aW9uVGFyZ2V0RXhlY3V0aW9uRXJyb3IoXG4gICAgICAgICAgXCJzaGFkb3dcIixcbiAgICAgICAgICBuZXcgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uKFNEKFwic29uYW11LmVycm9yLnNoYWRvd0RiVGVzdEZhaWxlZFwiKSksXG4gICAgICAgICk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCBzZGIuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBTaGFkb3cgREIg7IKt7KCcXG4gICAgICAhaXNUZXN0KCkgJiYgY29uc29sZS5sb2coY2hhbGsubWFnZW50YShgJHtzaGFkb3dEYXRhYmFzZX0g7IKt7KCcYCkpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGRiLnJhdyhcIkRST1AgREFUQUJBU0UgSUYgRVhJU1RTID8/XCIsIFtzaGFkb3dEYXRhYmFzZV0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiU2hhZG93IERCIOygleumrCDsi6TtjKg6XCIsIGUpOyAvLyDsnbTqsowg7JeG7Jy866m0IOyhsOyaqe2eiCDriITsiJhcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IHRkYi5kZXN0cm95KCk7XG4gICAgICB9XG4gICAg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
|