sonamu 0.10.11 → 0.10.13
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/ai/agents/agent.d.ts +1 -1
- package/dist/ai/agents/agent.d.ts.map +1 -1
- package/dist/ai/agents/agent.js +5 -6
- package/dist/ai/agents/types.d.ts +1 -1
- package/dist/ai/agents/types.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/api.js +18 -18
- package/dist/ai/providers/rtzr/error.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/error.js +17 -15
- package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/model.js +3 -2
- package/dist/ai/providers/rtzr/options.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/options.js +16 -16
- package/dist/ai/providers/rtzr/provider.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/provider.js +9 -9
- package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/utils.js +1 -1
- package/dist/api/caster.d.ts.map +1 -1
- package/dist/api/caster.js +17 -17
- package/dist/api/code-converters.d.ts +4 -2
- package/dist/api/code-converters.d.ts.map +1 -1
- package/dist/api/code-converters.js +100 -19
- package/dist/api/config.d.ts +16 -1
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +28 -21
- package/dist/api/context.d.ts +2 -2
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +1 -1
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +18 -11
- package/dist/api/http-validator.d.ts +36 -0
- package/dist/api/http-validator.d.ts.map +1 -0
- package/dist/api/http-validator.js +72 -0
- package/dist/api/index.js +6 -4
- package/dist/api/sonamu.d.ts +59 -20
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +250 -106
- package/dist/api/websocket-helpers.d.ts +7 -5
- package/dist/api/websocket-helpers.d.ts.map +1 -1
- package/dist/api/websocket-helpers.js +6 -6
- package/dist/auth/audit-log/builders.d.ts.map +1 -1
- package/dist/auth/audit-log/builders.js +1 -1
- package/dist/auth/audit-log/client-ip.d.ts +1 -1
- package/dist/auth/audit-log/client-ip.d.ts.map +1 -1
- package/dist/auth/audit-log/client-ip.js +4 -2
- package/dist/auth/audit-log/events.d.ts +5 -1
- package/dist/auth/audit-log/events.d.ts.map +1 -1
- package/dist/auth/audit-log/events.js +1 -1
- package/dist/auth/audit-log/plugin.d.ts +0 -8
- package/dist/auth/audit-log/plugin.d.ts.map +1 -1
- package/dist/auth/audit-log/plugin.js +48 -52
- package/dist/auth/audit-log-ingestor.d.ts.map +1 -1
- package/dist/auth/audit-log-ingestor.js +16 -12
- package/dist/auth/auth-generator.d.ts.map +1 -1
- package/dist/auth/auth-generator.js +1 -1
- package/dist/auth/better-auth-request.d.ts.map +1 -1
- package/dist/auth/better-auth-request.js +6 -5
- package/dist/auth/knex-adapter.js +1 -1
- package/dist/auth/plugins/entity-definitions/index.d.ts +13 -1
- package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/index.js +1 -1
- package/dist/auth/plugins/wrappers/admin.d.ts +1 -1
- package/dist/bin/build-config.d.ts +25 -0
- package/dist/bin/build-config.d.ts.map +1 -1
- package/dist/bin/build-config.js +105 -2
- package/dist/bin/cli.js +133 -29
- package/dist/bin/compiler-policy.d.ts +3 -0
- package/dist/bin/compiler-policy.d.ts.map +1 -0
- package/dist/bin/compiler-policy.js +24 -0
- package/dist/bin/fixture.d.ts.map +1 -1
- package/dist/bin/fixture.js +5 -3
- package/dist/bin/test-command.d.ts +22 -1
- package/dist/bin/test-command.d.ts.map +1 -1
- package/dist/bin/test-command.js +18 -10
- package/dist/bin/ts-loader-registration.d.ts +7 -1
- package/dist/bin/ts-loader-registration.d.ts.map +1 -1
- package/dist/bin/ts-loader-registration.js +13 -4
- package/dist/cache/decorator.d.ts.map +1 -1
- package/dist/cache/decorator.js +11 -4
- package/dist/compress/compress.d.ts.map +1 -1
- package/dist/compress/compress.js +1 -1
- package/dist/cone/cone-generator.d.ts +14 -1
- package/dist/cone/cone-generator.d.ts.map +1 -1
- package/dist/cone/cone-generator.js +13 -9
- package/dist/database/_batch_update.js +1 -1
- package/dist/database/base-model.d.ts +22 -10
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +26 -16
- package/dist/database/base-model.types.d.ts +15 -3
- package/dist/database/base-model.types.d.ts.map +1 -1
- package/dist/database/db.d.ts +12 -2
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +10 -7
- package/dist/database/knex.d.ts.map +1 -1
- package/dist/database/knex.js +17 -14
- package/dist/database/puri.d.ts +11 -9
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +93 -79
- package/dist/database/puri.types.d.ts +21 -21
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +1 -1
- package/dist/database/upsert-builder.d.ts +12 -10
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +20 -12
- package/dist/dict/sd.d.ts.map +1 -1
- package/dist/dict/sd.js +1 -1
- package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
- package/dist/dict/sonamu-dictionary.js +1 -1
- package/dist/dict/utils.d.ts.map +1 -1
- package/dist/dict/utils.js +7 -2
- package/dist/entity/entity-manager.d.ts +13 -4
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +19 -11
- package/dist/entity/entity-template-cone.d.ts +73 -5
- package/dist/entity/entity-template-cone.d.ts.map +1 -1
- package/dist/entity/entity-template-cone.js +4 -2
- package/dist/entity/entity.d.ts +6 -2
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +30 -28
- package/dist/env.d.ts +3 -1
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +1 -1
- package/dist/exceptions/error-handler.d.ts.map +1 -1
- package/dist/exceptions/error-handler.js +7 -2
- package/dist/exceptions/so-exceptions.d.ts +24 -20
- package/dist/exceptions/so-exceptions.d.ts.map +1 -1
- package/dist/exceptions/so-exceptions.js +4 -2
- package/dist/filter/utils.d.ts +7 -2
- package/dist/filter/utils.d.ts.map +1 -1
- package/dist/filter/utils.js +8 -6
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -7
- package/dist/logger/configure.d.ts.map +1 -1
- package/dist/logger/configure.js +10 -10
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +50 -46
- package/dist/migration/index-where-predicate.d.ts.map +1 -1
- package/dist/migration/index-where-predicate.js +22 -8
- package/dist/migration/migration-set.d.ts.map +1 -1
- package/dist/migration/migration-set.js +1 -1
- package/dist/migration/migrator.d.ts +61 -36
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +276 -167
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/postgresql-schema-reader.js +51 -36
- package/dist/migration/slack-confirm.d.ts.map +1 -1
- package/dist/migration/slack-confirm.js +1 -1
- package/dist/migration/types.d.ts +54 -0
- package/dist/migration/types.d.ts.map +1 -1
- package/dist/naite/naite-reporter.js +2 -2
- package/dist/naite/naite.d.ts +74 -15
- package/dist/naite/naite.d.ts.map +1 -1
- package/dist/naite/naite.js +5 -19
- package/dist/runtime-type.d.ts +6 -0
- package/dist/runtime-type.d.ts.map +1 -0
- package/dist/runtime-type.js +26 -0
- package/dist/ssr/hmr-opt-out.d.ts +26 -0
- package/dist/ssr/hmr-opt-out.d.ts.map +1 -0
- package/dist/ssr/hmr-opt-out.js +59 -0
- package/dist/ssr/renderer.d.ts.map +1 -1
- package/dist/ssr/renderer.js +4 -1
- package/dist/storage/base-file.js +14 -14
- package/dist/storage/buffered-file.d.ts +2 -2
- package/dist/storage/buffered-file.d.ts.map +1 -1
- package/dist/storage/buffered-file.js +12 -12
- package/dist/storage/s3-driver.d.ts.map +1 -1
- package/dist/storage/s3-driver.js +1 -1
- package/dist/storage/uploaded-file.d.ts +2 -2
- package/dist/storage/uploaded-file.d.ts.map +1 -1
- package/dist/storage/uploaded-file.js +8 -8
- package/dist/stream/sse.js +11 -11
- package/dist/stream/ws-core.d.ts +1 -1
- package/dist/stream/ws-core.d.ts.map +1 -1
- package/dist/stream/ws-delivery.d.ts +1 -1
- package/dist/stream/ws-delivery.d.ts.map +1 -1
- package/dist/stream/ws-delivery.js +6 -4
- package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
- package/dist/stream/ws-local-connection-store.js +4 -2
- package/dist/stream/ws-presence-store.js +1 -1
- package/dist/stream/ws-registry.d.ts +4 -4
- package/dist/stream/ws-registry.d.ts.map +1 -1
- package/dist/stream/ws-registry.js +4 -2
- package/dist/stream/ws-telemetry.d.ts +16 -12
- package/dist/stream/ws-telemetry.d.ts.map +1 -1
- package/dist/stream/ws-telemetry.js +22 -18
- package/dist/stream/ws.d.ts +18 -12
- package/dist/stream/ws.d.ts.map +1 -1
- package/dist/stream/ws.js +26 -22
- package/dist/syncer/api-parser.js +1 -1
- package/dist/syncer/checksum.d.ts.map +1 -1
- package/dist/syncer/checksum.js +7 -8
- package/dist/syncer/code-generator.d.ts.map +1 -1
- package/dist/syncer/code-generator.js +13 -14
- package/dist/syncer/entity-operations.d.ts.map +1 -1
- package/dist/syncer/entity-operations.js +5 -6
- package/dist/syncer/file-copy.d.ts +5 -0
- package/dist/syncer/file-copy.d.ts.map +1 -0
- package/dist/syncer/file-copy.js +36 -0
- package/dist/syncer/file-patterns.d.ts +1 -0
- package/dist/syncer/file-patterns.d.ts.map +1 -1
- package/dist/syncer/file-patterns.js +5 -2
- package/dist/syncer/file-tracking.d.ts.map +1 -1
- package/dist/syncer/file-tracking.js +5 -4
- package/dist/syncer/filesystem-dependencies.d.ts +15 -0
- package/dist/syncer/filesystem-dependencies.d.ts.map +1 -0
- package/dist/syncer/filesystem-dependencies.js +53 -0
- package/dist/syncer/module-loader.d.ts +1 -1
- package/dist/syncer/module-loader.d.ts.map +1 -1
- package/dist/syncer/module-loader.js +6 -4
- package/dist/syncer/syncer-actions.d.ts +4 -0
- package/dist/syncer/syncer-actions.d.ts.map +1 -1
- package/dist/syncer/syncer-actions.js +34 -17
- package/dist/syncer/syncer.d.ts +17 -6
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +71 -29
- package/dist/syncer/watcher.d.ts.map +1 -1
- package/dist/syncer/watcher.js +3 -3
- package/dist/tasks/decorator.d.ts +6 -6
- package/dist/tasks/decorator.d.ts.map +1 -1
- package/dist/tasks/decorator.js +4 -4
- package/dist/tasks/step-wrapper.d.ts +6 -4
- package/dist/tasks/step-wrapper.d.ts.map +1 -1
- package/dist/tasks/step-wrapper.js +5 -5
- package/dist/tasks/workflow-manager.d.ts.map +1 -1
- package/dist/tasks/workflow-manager.js +13 -7
- package/dist/template/entity-converter.d.ts +1 -1
- package/dist/template/entity-converter.d.ts.map +1 -1
- package/dist/template/entity-converter.js +2 -2
- package/dist/template/helpers.d.ts +8 -6
- package/dist/template/helpers.d.ts.map +1 -1
- package/dist/template/helpers.js +1 -1
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +4 -4
- package/dist/template/implementations/generated_http.template.d.ts +7 -4
- package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_http.template.js +21 -21
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_sso.template.js +6 -3
- package/dist/template/implementations/http_validators.template.d.ts +18 -0
- package/dist/template/implementations/http_validators.template.d.ts.map +1 -0
- package/dist/template/implementations/http_validators.template.js +127 -0
- package/dist/template/implementations/model.template.d.ts.map +1 -1
- package/dist/template/implementations/model.template.js +1 -1
- package/dist/template/implementations/queries.template.js +1 -1
- package/dist/template/implementations/sd.template.d.ts.map +1 -1
- package/dist/template/implementations/sd.template.js +79 -39
- package/dist/template/implementations/services.template.d.ts.map +1 -1
- package/dist/template/implementations/services.template.js +6 -4
- package/dist/template/implementations/view_form.template.d.ts +6 -1
- package/dist/template/implementations/view_form.template.d.ts.map +1 -1
- package/dist/template/implementations/view_form.template.js +23 -15
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.js +11 -6
- package/dist/template/template-manager.d.ts.map +1 -1
- package/dist/template/template-manager.js +9 -7
- package/dist/template/template-types.d.ts +12 -5
- package/dist/template/template-types.d.ts.map +1 -1
- package/dist/template/template-types.js +1 -1
- package/dist/template/template.d.ts +2 -2
- package/dist/template/template.d.ts.map +1 -1
- package/dist/template/template.js +6 -4
- package/dist/template/zod-converter.d.ts +0 -19
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +100 -84
- package/dist/testing/_relation-graph.d.ts.map +1 -1
- package/dist/testing/_relation-graph.js +2 -1
- package/dist/testing/bootstrap.d.ts.map +1 -1
- package/dist/testing/bootstrap.js +9 -6
- package/dist/testing/data-explorer.d.ts +32 -7
- package/dist/testing/data-explorer.d.ts.map +1 -1
- package/dist/testing/data-explorer.js +77 -31
- package/dist/testing/dev-test-routes.d.ts +8 -1
- package/dist/testing/dev-test-routes.d.ts.map +1 -1
- package/dist/testing/dev-test-routes.js +125 -108
- package/dist/testing/dev-vitest-manager.d.ts +54 -8
- package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
- package/dist/testing/dev-vitest-manager.js +24 -9
- package/dist/testing/faker-mappings.d.ts +412 -1
- package/dist/testing/faker-mappings.d.ts.map +1 -1
- package/dist/testing/faker-mappings.js +1 -1
- package/dist/testing/filesystem.d.ts +2 -0
- package/dist/testing/filesystem.d.ts.map +1 -0
- package/dist/testing/filesystem.js +7 -0
- package/dist/testing/fixture-generator.d.ts +25 -8
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +132 -73
- package/dist/testing/fixture-loader.d.ts +3 -1
- package/dist/testing/fixture-loader.d.ts.map +1 -1
- package/dist/testing/fixture-loader.js +1 -20
- package/dist/testing/fixture-manager.d.ts +8 -7
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +91 -59
- package/dist/testing/global-setup.d.ts.map +1 -1
- package/dist/testing/global-setup.js +5 -2
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +6 -3
- package/dist/types/types.d.ts +101 -99
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +234 -225
- package/dist/ui/ai-api.d.ts.map +1 -1
- package/dist/ui/ai-api.js +1 -1
- package/dist/ui/ai-client.d.ts.map +1 -1
- package/dist/ui/ai-client.js +28 -18
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +146 -210
- package/dist/ui/async-route.d.ts +3 -0
- package/dist/ui/async-route.d.ts.map +1 -0
- package/dist/ui/async-route.js +12 -0
- package/dist/ui/cdd-service.d.ts +9 -7
- package/dist/ui/cdd-service.d.ts.map +1 -1
- package/dist/ui/cdd-service.js +7 -5
- package/dist/ui/migrations-api.d.ts +3 -0
- package/dist/ui/migrations-api.d.ts.map +1 -0
- package/dist/ui/migrations-api.js +215 -0
- package/dist/ui-web/assets/index-D3QNH-Dv.css +1 -0
- package/dist/ui-web/assets/index-DV1AAq6W.js +178 -0
- package/dist/ui-web/index.html +2 -2
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +7 -5
- package/dist/utils/fs-utils.d.ts +3 -3
- package/dist/utils/fs-utils.d.ts.map +1 -1
- package/dist/utils/fs-utils.js +6 -6
- package/dist/utils/model.d.ts +3 -5
- package/dist/utils/model.d.ts.map +1 -1
- package/dist/utils/model.js +1 -1
- package/dist/utils/object-utils.d.ts +1 -1
- package/dist/utils/object-utils.d.ts.map +1 -1
- package/dist/utils/object-utils.js +17 -16
- package/dist/utils/process-utils.d.ts.map +1 -1
- package/dist/utils/process-utils.js +4 -2
- package/dist/utils/runtime-value.d.ts +13 -0
- package/dist/utils/runtime-value.d.ts.map +1 -0
- package/dist/utils/runtime-value.js +40 -0
- package/dist/utils/sql-parser.d.ts +8 -1
- package/dist/utils/sql-parser.d.ts.map +1 -1
- package/dist/utils/sql-parser.js +6 -3
- package/dist/utils/type-utils.d.ts.map +1 -1
- package/dist/utils/type-utils.js +10 -8
- package/dist/utils/utils.d.ts +2 -2
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +11 -8
- package/dist/utils/zod-error.d.ts.map +1 -1
- package/dist/utils/zod-error.js +7 -4
- package/dist/vector/chunking.d.ts.map +1 -1
- package/dist/vector/chunking.js +1 -1
- package/dist/vector/embedding.d.ts.map +1 -1
- package/dist/vector/embedding.js +1 -1
- package/dist/vector/types.d.ts +3 -2
- package/dist/vector/types.d.ts.map +1 -1
- package/package.json +11 -7
- package/src/ai/agents/agent.ts +5 -5
- package/src/ai/agents/types.ts +1 -1
- package/src/ai/providers/rtzr/__tests__/model.test.ts +2 -2
- package/src/ai/providers/rtzr/error.ts +5 -3
- package/src/ai/providers/rtzr/model.ts +3 -2
- package/src/ai/providers/rtzr/options.ts +10 -5
- package/src/ai/providers/rtzr/provider.ts +10 -10
- package/src/ai/providers/rtzr/utils.ts +3 -1
- package/src/api/__tests__/config.test.ts +11 -21
- package/src/api/__tests__/sonamu.http-validator.test.ts +512 -0
- package/src/api/__tests__/sonamu.websocket.test.ts +51 -41
- package/src/api/__tests__/zod-compiler-policy.test.ts +95 -0
- package/src/api/caster.ts +6 -8
- package/src/api/code-converters.ts +136 -36
- package/src/api/config.ts +62 -4
- package/src/api/context.ts +3 -3
- package/src/api/decorators.ts +28 -17
- package/src/api/http-validator.ts +149 -0
- package/src/api/sonamu.ts +459 -152
- package/src/api/websocket-helpers.ts +24 -17
- package/src/auth/audit-log/builders.ts +3 -2
- package/src/auth/audit-log/client-ip.ts +4 -2
- package/src/auth/audit-log/events.ts +15 -1
- package/src/auth/audit-log/plugin.ts +129 -200
- package/src/auth/audit-log-ingestor.ts +19 -15
- package/src/auth/auth-generator.ts +10 -5
- package/src/auth/better-auth-request.ts +4 -3
- package/src/auth/knex-adapter.ts +8 -2
- package/src/auth/plugins/entity-definitions/index.ts +6 -5
- package/src/bin/__tests__/http-validator-benchmark.test.ts +94 -0
- package/src/bin/__tests__/test-command.test.ts +9 -15
- package/src/bin/__tests__/ts-loader-register.test.ts +15 -17
- package/src/bin/__tests__/zod-compiler-build.test.ts +307 -0
- package/src/bin/build-config.ts +167 -0
- package/src/bin/cli.ts +155 -38
- package/src/bin/compiler-policy.ts +35 -0
- package/src/bin/fixture.ts +14 -3
- package/src/bin/test-command.ts +74 -29
- package/src/bin/ts-loader-registration.ts +22 -4
- package/src/cache/decorator.ts +10 -3
- package/src/compress/compress.ts +17 -4
- package/src/cone/cone-generator.ts +34 -6
- package/src/database/__tests__/db.test.ts +1 -0
- package/src/database/__tests__/puri.test.ts +16 -15
- package/src/database/__tests__/transaction-scope.test.ts +5 -0
- package/src/database/_batch_update.ts +1 -0
- package/src/database/base-model.ts +81 -50
- package/src/database/base-model.types.ts +6 -6
- package/src/database/db.ts +29 -19
- package/src/database/knex.ts +30 -17
- package/src/database/puri-subset.test-d.ts +17 -0
- package/src/database/puri.ts +181 -143
- package/src/database/puri.types.test-d.ts +31 -1
- package/src/database/puri.types.ts +23 -21
- package/src/database/upsert-builder.ts +75 -53
- package/src/dict/sd.ts +15 -5
- package/src/dict/sonamu-dictionary.ts +6 -6
- package/src/dict/utils.ts +9 -1
- package/src/entity/entity-manager.ts +26 -9
- package/src/entity/entity-template-cone.ts +5 -10
- package/src/entity/entity.ts +50 -34
- package/src/env.ts +7 -3
- package/src/exceptions/error-handler.ts +17 -2
- package/src/exceptions/so-exceptions.ts +26 -20
- package/src/filter/utils.ts +21 -11
- package/src/index.ts +3 -0
- package/src/logger/configure.ts +26 -18
- package/src/migration/__tests__/migrator.test.ts +50 -57
- package/src/migration/code-generation.ts +132 -104
- package/src/migration/index-where-predicate.ts +51 -24
- package/src/migration/migration-set.ts +11 -5
- package/src/migration/migrator.ts +392 -244
- package/src/migration/postgresql-schema-reader.ts +52 -47
- package/src/migration/slack-confirm.ts +17 -15
- package/src/migration/types.ts +57 -0
- package/src/naite/naite-reporter.ts +1 -1
- package/src/naite/naite.ts +97 -24
- package/src/runtime-type.ts +34 -0
- package/src/ssr/hmr-opt-out.ts +78 -0
- package/src/ssr/renderer.ts +6 -0
- package/src/storage/base-file.ts +13 -13
- package/src/storage/buffered-file.ts +11 -11
- package/src/storage/s3-driver.ts +4 -1
- package/src/storage/uploaded-file.ts +8 -8
- package/src/stream/__tests__/ws-contracts.test.ts +4 -2
- package/src/stream/__tests__/ws-telemetry.test.ts +1 -1
- package/src/stream/__tests__/ws.test.ts +30 -6
- package/src/stream/sse.ts +12 -11
- package/src/stream/ws-core.ts +1 -1
- package/src/stream/ws-delivery.ts +16 -7
- package/src/stream/ws-local-connection-store.ts +2 -3
- package/src/stream/ws-presence-store.ts +6 -1
- package/src/stream/ws-registry.ts +16 -7
- package/src/stream/ws-telemetry.ts +66 -43
- package/src/stream/ws.ts +73 -39
- package/src/syncer/__tests__/api-parser.websocket-type-ref.test.ts +3 -2
- package/src/syncer/__tests__/http-validator-registry.test.ts +137 -0
- package/src/syncer/api-parser.ts +67 -27
- package/src/syncer/checksum.ts +17 -11
- package/src/syncer/code-generator.ts +25 -17
- package/src/syncer/entity-operations.ts +3 -5
- package/src/syncer/file-copy.ts +46 -0
- package/src/syncer/file-patterns.ts +11 -8
- package/src/syncer/file-tracking.ts +3 -4
- package/src/syncer/filesystem-dependencies.ts +73 -0
- package/src/syncer/module-loader.ts +8 -4
- package/src/syncer/syncer-actions.ts +56 -18
- package/src/syncer/syncer.ts +116 -43
- package/src/syncer/watcher.ts +8 -4
- package/src/tasks/decorator.ts +20 -12
- package/src/tasks/step-wrapper.ts +19 -9
- package/src/tasks/workflow-manager.ts +15 -9
- package/src/template/__tests__/http_validators.template.test.ts +160 -0
- package/src/template/__tests__/services.template.mutation.test.ts +24 -23
- package/src/template/__tests__/services.template.websocket.test.ts +21 -25
- package/src/template/entity-converter.ts +5 -2
- package/src/template/helpers.ts +8 -9
- package/src/template/implementations/generated.template.ts +5 -4
- package/src/template/implementations/generated_http.template.ts +61 -15
- package/src/template/implementations/generated_sso.template.ts +15 -4
- package/src/template/implementations/http_validators.template.ts +175 -0
- package/src/template/implementations/model.template.ts +3 -1
- package/src/template/implementations/sd.template.ts +81 -41
- package/src/template/implementations/services.template.ts +2 -2
- package/src/template/implementations/view_form.template.ts +56 -39
- package/src/template/implementations/view_list.template.ts +31 -23
- package/src/template/template-manager.ts +15 -13
- package/src/template/template-types.ts +13 -5
- package/src/template/template.ts +4 -3
- package/src/template/zod-converter.ts +206 -91
- package/src/testing/__tests__/dev-test-routes.test.ts +85 -25
- package/src/testing/__tests__/dev-vitest-manager.test.ts +15 -15
- package/src/testing/_relation-graph.ts +4 -1
- package/src/testing/bootstrap.ts +12 -5
- package/src/testing/data-explorer.ts +102 -53
- package/src/testing/dev-test-routes.ts +87 -50
- package/src/testing/dev-vitest-manager.ts +88 -32
- package/src/testing/faker-mappings.ts +2 -2
- package/src/testing/filesystem.ts +1 -0
- package/src/testing/fixture-generator.ts +191 -131
- package/src/testing/fixture-loader.ts +5 -1
- package/src/testing/fixture-manager.ts +129 -90
- package/src/testing/global-setup.ts +7 -3
- package/src/testing/index.ts +5 -0
- package/src/types/__tests__/entity-json-schema-search-text.test.ts +9 -3
- package/src/types/types.ts +184 -158
- package/src/ui/ai-api.ts +9 -7
- package/src/ui/ai-client.ts +61 -56
- package/src/ui/api.ts +726 -770
- package/src/ui/async-route.ts +4 -0
- package/src/ui/cdd-service.ts +35 -12
- package/src/ui/migrations-api.ts +381 -0
- package/src/utils/formatter.ts +7 -3
- package/src/utils/fs-utils.ts +5 -5
- package/src/utils/model.ts +4 -5
- package/src/utils/object-utils.ts +32 -22
- package/src/utils/process-utils.ts +4 -1
- package/src/utils/runtime-value.ts +43 -0
- package/src/utils/sql-parser.ts +13 -6
- package/src/utils/type-utils.ts +9 -7
- package/src/utils/utils.ts +19 -21
- package/src/utils/zod-error.ts +4 -2
- package/src/vector/chunking.ts +6 -1
- package/src/vector/embedding.ts +2 -1
- package/src/vector/types.ts +4 -2
- package/tsdown.api.config.ts +5 -2
- package/dist/ui-web/assets/index-CJf8uJYf.js +0 -176
- package/dist/ui-web/assets/index-GMMIVGja.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgresql-schema-reader.d.ts","sourceRoot":"","sources":["../../src/migration/postgresql-schema-reader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAGjC,OAAO,EACL,KAAK,eAAe,EAGpB,KAAK,YAAY,EACjB,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAC;AAExB;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,mBAAmB;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yBAAyB;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB;IACnB,QAAQ,EAAE,UAAU,CAAC;IACrB,mBAAmB;IACnB,QAAQ,EAAE,UAAU,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC,CAAC;AAEF,KAAK,OAAO,GAAG;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,KAAK,GAAG,MAAM,CAAC;IAC3B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF,KAAK,SAAS,GAAG;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,KAAK,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAExC,cAAM,2BAA2B;IAC/B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAyD;IAE3F;;;;;OAKG;IACG,qBAAqB,CACzB,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"postgresql-schema-reader.d.ts","sourceRoot":"","sources":["../../src/migration/postgresql-schema-reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -55,33 +55,44 @@ var init_postgresql_schema_reader = __esmMin((() => {
|
|
|
55
55
|
};
|
|
56
56
|
});
|
|
57
57
|
const dbIndexesGroup = group(dbIndexes.filter((dbIndex) => !dbIndex.is_primary && !dbForeigns.find((dbForeign) => dbIndex.index_name.includes(dbForeign.constraint_name))), (dbIndex) => dbIndex.index_name);
|
|
58
|
+
const indexes = [];
|
|
59
|
+
for (const indexName of Object.keys(dbIndexesGroup)) {
|
|
60
|
+
const currentIndexes = dbIndexesGroup[indexName]?.toSorted((left, right) => left.column_order - right.column_order);
|
|
61
|
+
assert(currentIndexes);
|
|
62
|
+
const firstIndex = currentIndexes[0];
|
|
63
|
+
const parsedIndexDefinition = this.parseIndexDefinition(firstIndex.index_definition);
|
|
64
|
+
const restoredIndexType = this.restoreMigrationIndexType(firstIndex, parsedIndexDefinition.accessMethod);
|
|
65
|
+
const using = this.restoreGenericUsing(parsedIndexDefinition.accessMethod ?? firstIndex.index_type);
|
|
66
|
+
const indexColumns = [];
|
|
67
|
+
for (const currentIndex of currentIndexes) {
|
|
68
|
+
const opclass = this.extractIndexColumnOpclass(parsedIndexDefinition.columnDefinitions[currentIndex.column_order - 1]);
|
|
69
|
+
const column = { name: currentIndex.column_name };
|
|
70
|
+
if (opclass) Object.assign(column, { opclass });
|
|
71
|
+
switch (using) {
|
|
72
|
+
case "btree":
|
|
73
|
+
Object.assign(column, {
|
|
74
|
+
sortOrder: currentIndex.sort_order,
|
|
75
|
+
nullsFirst: currentIndex.nulls_first
|
|
76
|
+
});
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
indexColumns.push(column);
|
|
80
|
+
}
|
|
81
|
+
const index = {
|
|
82
|
+
type: restoredIndexType,
|
|
83
|
+
name: indexName,
|
|
84
|
+
columns: indexColumns,
|
|
85
|
+
nullsNotDistinct: firstIndex.nulls_not_distinct,
|
|
86
|
+
...this.parseVectorIndexOptions(restoredIndexType, parsedIndexDefinition.withOptions)
|
|
87
|
+
};
|
|
88
|
+
if (firstIndex.predicate) index.where = firstIndex.predicate;
|
|
89
|
+
if (using) index.using = using;
|
|
90
|
+
indexes.push(index);
|
|
91
|
+
}
|
|
58
92
|
return {
|
|
59
93
|
table,
|
|
60
94
|
columns,
|
|
61
|
-
indexes
|
|
62
|
-
const currentIndexes = dbIndexesGroup[indexName]?.toSorted((left, right) => left.column_order - right.column_order);
|
|
63
|
-
assert(currentIndexes);
|
|
64
|
-
const firstIndex = currentIndexes[0];
|
|
65
|
-
const parsedIndexDefinition = this.parseIndexDefinition(firstIndex.index_definition);
|
|
66
|
-
const restoredIndexType = this.restoreMigrationIndexType(firstIndex, parsedIndexDefinition.accessMethod);
|
|
67
|
-
const using = this.restoreGenericUsing(parsedIndexDefinition.accessMethod ?? firstIndex.index_type);
|
|
68
|
-
return {
|
|
69
|
-
type: restoredIndexType,
|
|
70
|
-
name: indexName,
|
|
71
|
-
columns: currentIndexes.map((idx) => ({
|
|
72
|
-
name: idx.column_name,
|
|
73
|
-
...this.extractIndexColumnOpclass(parsedIndexDefinition.columnDefinitions[idx.column_order - 1]) ? { opclass: this.extractIndexColumnOpclass(parsedIndexDefinition.columnDefinitions[idx.column_order - 1]) } : {},
|
|
74
|
-
...using === "btree" ? {
|
|
75
|
-
sortOrder: idx.sort_order,
|
|
76
|
-
nullsFirst: idx.nulls_first
|
|
77
|
-
} : {}
|
|
78
|
-
})),
|
|
79
|
-
nullsNotDistinct: firstIndex.nulls_not_distinct,
|
|
80
|
-
...firstIndex.predicate ? { where: firstIndex.predicate } : {},
|
|
81
|
-
...using ? { using } : {},
|
|
82
|
-
...this.parseVectorIndexOptions(restoredIndexType, parsedIndexDefinition.withOptions)
|
|
83
|
-
};
|
|
84
|
-
}),
|
|
95
|
+
indexes,
|
|
85
96
|
foreigns: dbForeigns.map((dbForeign) => {
|
|
86
97
|
return {
|
|
87
98
|
columns: [dbForeign.column_name],
|
|
@@ -96,13 +107,13 @@ var init_postgresql_schema_reader = __esmMin((() => {
|
|
|
96
107
|
* PostgreSQL의 constraint action을 Knex 형식으로 변환
|
|
97
108
|
*/
|
|
98
109
|
mapConstraintAction(action) {
|
|
99
|
-
return
|
|
100
|
-
"NO ACTION"
|
|
101
|
-
RESTRICT
|
|
102
|
-
CASCADE
|
|
103
|
-
"SET NULL"
|
|
104
|
-
"SET DEFAULT"
|
|
105
|
-
|
|
110
|
+
return (/* @__PURE__ */ new Map([
|
|
111
|
+
["NO ACTION", "NO ACTION"],
|
|
112
|
+
["RESTRICT", "RESTRICT"],
|
|
113
|
+
["CASCADE", "CASCADE"],
|
|
114
|
+
["SET NULL", "SET NULL"],
|
|
115
|
+
["SET DEFAULT", "SET DEFAULT"]
|
|
116
|
+
])).get(action) ?? "NO ACTION";
|
|
106
117
|
}
|
|
107
118
|
/**
|
|
108
119
|
* 기존 테이블 읽어서 cols, indexes, foreigns 반환
|
|
@@ -235,10 +246,14 @@ var init_postgresql_schema_reader = __esmMin((() => {
|
|
|
235
246
|
return normalized;
|
|
236
247
|
}
|
|
237
248
|
parseVectorIndexOptions(type, withOptions) {
|
|
238
|
-
if (type === "hnsw")
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
249
|
+
if (type === "hnsw") {
|
|
250
|
+
const options = {};
|
|
251
|
+
const m = this.parseIntegerOption(withOptions.m);
|
|
252
|
+
const efConstruction = this.parseIntegerOption(withOptions.ef_construction);
|
|
253
|
+
if (m !== void 0) options.m = m;
|
|
254
|
+
if (efConstruction !== void 0) options.efConstruction = efConstruction;
|
|
255
|
+
return options;
|
|
256
|
+
}
|
|
242
257
|
if (type === "ivfflat") return this.parseIntegerOption(withOptions.lists) !== void 0 ? { lists: this.parseIntegerOption(withOptions.lists) } : {};
|
|
243
258
|
return {};
|
|
244
259
|
}
|
|
@@ -545,4 +560,4 @@ var init_postgresql_schema_reader = __esmMin((() => {
|
|
|
545
560
|
init_postgresql_schema_reader();
|
|
546
561
|
export { PostgreSQLSchemaReader, init_postgresql_schema_reader };
|
|
547
562
|
|
|
548
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXNxbC1zY2hlbWEtcmVhZGVyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vcG9zdGdyZXNxbC1zY2hlbWEtcmVhZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuXG5pbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgZ3JvdXAgfSBmcm9tIFwicmFkYXNoaVwiO1xuXG5pbXBvcnQge1xuICB0eXBlIE1pZ3JhdGlvbkNvbHVtbixcbiAgdHlwZSBNaWdyYXRpb25Gb3JlaWduLFxuICB0eXBlIE1pZ3JhdGlvbkluZGV4LFxuICB0eXBlIE1pZ3JhdGlvblNldCxcbiAgdHlwZSBSZWxhdGlvbk9uLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcblxuLyoqXG4gKiDtirnsoJUg7YWM7J2067iU7J2YIFBL66W8IOywuOyhsO2VmOuKlCDri6Trpbgg7YWM7J2067iU7J2YIEZLIOygleuztOyeheuLiOuLpC5cbiAqIFBLIO2DgOyehSDrs4Dqsr0g7IucIOq0gOugqCBGSyDsoJzslb3sobDqsbTsnYQg7LKY66as7ZWY6riwIOychO2VtCDsgqzsmqnrkKnri4jri6QuXG4gKi9cbmV4cG9ydCB0eXBlIFJlZmVyZW5jaW5nRm9yZWlnbktleSA9IHtcbiAgLyoqIEZL6rCAIOygleydmOuQnCDthYzsnbTruJTrqoUgKi9cbiAgdGFibGVOYW1lOiBzdHJpbmc7XG4gIC8qKiBGSyDsoJzslb3sobDqsbQg7J2066aEICovXG4gIGNvbnN0cmFpbnROYW1lOiBzdHJpbmc7XG4gIC8qKiBGSyDsu6zrn7zrqoUgKi9cbiAgY29sdW1uTmFtZTogc3RyaW5nO1xuICAvKiog7LC47KGw7ZWY64qUIO2FjOydtOu4lOuqhSAoUEvqsIAg7J6I64qUIO2FjOydtOu4lCkgKi9cbiAgcmVmZXJlbmNlZFRhYmxlTmFtZTogc3RyaW5nO1xuICAvKiog7LC47KGw7ZWY64qUIOy7rOufvOuqhSAo67O07Ya1ICdpZCcpICovXG4gIHJlZmVyZW5jZWRDb2x1bW5OYW1lOiBzdHJpbmc7XG4gIC8qKiBPTiBVUERBVEUg7JWh7IWYICovXG4gIG9uVXBkYXRlOiBSZWxhdGlvbk9uO1xuICAvKiogT04gREVMRVRFIOyVoeyFmCAqL1xuICBvbkRlbGV0ZTogUmVsYXRpb25Pbjtcbn07XG5cbmV4cG9ydCB0eXBlIFBnQ29sdW1uID0ge1xuICBjb2x1bW5fbmFtZTogc3RyaW5nO1xuICBkYXRhX3R5cGU6IHN0cmluZztcbiAgdWR0X25hbWU6IHN0cmluZztcbiAgY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoOiBudW1iZXIgfCBudWxsO1xuICBwcmVjaXNpb246IG51bWJlciB8IG51bGw7XG4gIG51bWVyaWNfc2NhbGU6IG51bWJlciB8IG51bGw7XG4gIGlzX251bGxhYmxlOiBzdHJpbmc7XG4gIGNvbHVtbl9kZWZhdWx0OiBzdHJpbmcgfCBudWxsO1xuICBpc19nZW5lcmF0ZWQ6IHN0cmluZzsgLy8gJ3MnID0gU1RPUkVELCAndicgPSBWSVJUVUFMLCAnJyA9IG5vbmVcbiAgZ2VuZXJhdGlvbl9leHByZXNzaW9uOiBzdHJpbmcgfCBudWxsO1xufTtcblxudHlwZSBQZ0luZGV4ID0ge1xuICBpbmRleF9uYW1lOiBzdHJpbmc7XG4gIGNvbHVtbl9uYW1lOiBzdHJpbmc7XG4gIGlzX3VuaXF1ZTogYm9vbGVhbjtcbiAgaXNfcHJpbWFyeTogYm9vbGVhbjtcbiAgaW5kZXhfdHlwZTogc3RyaW5nO1xuICBudWxsc19maXJzdDogYm9vbGVhbjtcbiAgc29ydF9vcmRlcjogXCJBU0NcIiB8IFwiREVTQ1wiO1xuICBudWxsc19ub3RfZGlzdGluY3Q6IGJvb2xlYW47XG4gIGNvbHVtbl9vcmRlcjogbnVtYmVyO1xuICBpbmRleF9kZWZpbml0aW9uOiBzdHJpbmc7XG4gIHByZWRpY2F0ZT86IHN0cmluZyB8IG51bGw7XG59O1xuXG50eXBlIFBnRm9yZWlnbiA9IHtcbiAgY29uc3RyYWludF9uYW1lOiBzdHJpbmc7XG4gIGNvbHVtbl9uYW1lOiBzdHJpbmc7XG4gIGZvcmVpZ25fdGFibGVfbmFtZTogc3RyaW5nO1xuICBmb3JlaWduX2NvbHVtbl9uYW1lOiBzdHJpbmc7XG4gIHVwZGF0ZV9ydWxlOiBzdHJpbmc7XG4gIGRlbGV0ZV9ydWxlOiBzdHJpbmc7XG59O1xuXG50eXBlIFJhd0NhcGFibGVLbmV4ID0gUGljazxLbmV4LCBcInJhd1wiPjtcblxuY2xhc3MgUG9zdGdyZVNRTFNjaGVtYVJlYWRlckNsYXNzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBnZW5lcmljSW5kZXhUeXBlcyA9IG5ldyBTZXQoW1wiYnRyZWVcIiwgXCJoYXNoXCIsIFwiZ2luXCIsIFwiZ2lzdFwiLCBcInBncm9vbmdhXCJdKTtcblxuICAvKipcbiAgICogRELsl5DshJwg7YWM7J2067iUIOygleuztOulvCDsnb3slrTshJwgTWlncmF0aW9uU2V07J2EIOunjOuTpOyWtOyYteuLiOuLpC5cbiAgICogQHBhcmFtIGNvbXBhcmVEQiBLbmV4IOyduOyKpO2EtOyKpFxuICAgKiBAcGFyYW0gdGFibGUg7YWM7J2067iUIOydtOumhFxuICAgKiBAcmV0dXJucyBNaWdyYXRpb25TZXQg6rCd7LK0XG4gICAqL1xuICBhc3luYyBnZXRNaWdyYXRpb25TZXRGcm9tREIoXG4gICAgY29tcGFyZURCOiBSYXdDYXBhYmxlS25leCxcbiAgICB0YWJsZTogc3RyaW5nLFxuICApOiBQcm9taXNlPE1pZ3JhdGlvblNldCB8IG51bGw+IHtcbiAgICBsZXQgZGJDb2x1bW5zOiBQZ0NvbHVtbltdLCBkYkluZGV4ZXM6IFBnSW5kZXhbXSwgZGJGb3JlaWduczogUGdGb3JlaWduW107XG4gICAgdHJ5IHtcbiAgICAgIFtkYkNvbHVtbnMsIGRiSW5kZXhlcywgZGJGb3JlaWduc10gPSBhd2FpdCB0aGlzLnJlYWRUYWJsZShjb21wYXJlREIsIHRhYmxlKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUubWVzc2FnZS5pbmNsdWRlcyhcIlRhYmxlIG5vdCBmb3VuZFwiKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgLy8gdmVjdG9yIOy7rOufvOydmCBkaW1lbnNpb25zIOyhsO2ajFxuICAgIGNvbnN0IHZlY3RvckRpbWVuc2lvbnMgPSBhd2FpdCB0aGlzLmdldFZlY3RvckRpbWVuc2lvbnMoY29tcGFyZURCLCB0YWJsZSk7XG5cbiAgICBjb25zdCBjb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSA9IGRiQ29sdW1ucy5tYXAoKGRiQ29sdW1uKSA9PiB7XG4gICAgICBjb25zdCBkYkNvbFR5cGUgPSB0aGlzLnJlc29sdmVEQkNvbFR5cGUoZGJDb2x1bW4pO1xuXG4gICAgICAvLyB2ZWN0b3Ig7YOA7J6F7J24IOqyveyasCBkaW1lbnNpb25zIOyEpOyglVxuICAgICAgaWYgKGRiQ29sVHlwZS50eXBlID09PSBcInZlY3RvclwiKSB7XG4gICAgICAgIGRiQ29sVHlwZS5kaW1lbnNpb25zID0gdmVjdG9yRGltZW5zaW9uc1tkYkNvbHVtbi5jb2x1bW5fbmFtZV0gPz8gMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZGJDb2x1bW4uY29sdW1uX25hbWUsXG4gICAgICAgIG51bGxhYmxlOiBkYkNvbHVtbi5pc19udWxsYWJsZSA9PT0gXCJZRVNcIixcbiAgICAgICAgLi4uZGJDb2xUeXBlLFxuICAgICAgICAvLyBHZW5lcmF0ZWQgQ29sdW1uIOyymOumrFxuICAgICAgICAuLi4oKCkgPT4ge1xuICAgICAgICAgIGlmIChkYkNvbHVtbi5pc19nZW5lcmF0ZWQgPT09IFwic1wiIHx8IGRiQ29sdW1uLmlzX2dlbmVyYXRlZCA9PT0gXCJ2XCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgICAgIHR5cGU6IGRiQ29sdW1uLmlzX2dlbmVyYXRlZCA9PT0gXCJzXCIgPyBcIlNUT1JFRFwiIDogXCJWSVJUVUFMXCIsXG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogZGJDb2x1bW4uZ2VuZXJhdGlvbl9leHByZXNzaW9uID8/IFwiXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH0pKCksXG4gICAgICAgIC8vIERlZmF1bHQg6rCSIOyymOumrCAoR2VuZXJhdGVkIENvbHVtbuydtCDslYTri4wg6rK97Jqw66eMKVxuICAgICAgICAuLi4oKCkgPT4ge1xuICAgICAgICAgIC8vIEdlbmVyYXRlZCBDb2x1bW7snYAgZGVmYXVsdCDqsJLsnbQg7JeG7J2MXG4gICAgICAgICAgaWYgKGRiQ29sdW1uLmlzX2dlbmVyYXRlZCA9PT0gXCJzXCIgfHwgZGJDb2x1bW4uaXNfZ2VuZXJhdGVkID09PSBcInZcIikge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkYkNvbHVtbi5jb2x1bW5fZGVmYXVsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gUG9zdGdyZVNRTCBkZWZhdWx0IOqwkiDsoJXrpqwgKG5leHR2YWwsIENVUlJFTlRfVElNRVNUQU1QIOuTsSlcbiAgICAgICAgICAgIGxldCBkZWZhdWx0VmFsdWUgPSBkYkNvbHVtbi5jb2x1bW5fZGVmYXVsdDtcblxuICAgICAgICAgICAgLy8gbmV4dHZhbCDsoJzqsbAgKFNFUklBTCDtg4DsnoUpXG4gICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlLnN0YXJ0c1dpdGgoXCJuZXh0dmFsKFwiKSkge1xuICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIO2DgOyehSDsupDsiqTtjIUg7KCc6rGwICjsmIg6ICcxJzo6aW50ZWdlciDihpIgMSlcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZS5yZXBsYWNlKC86OltcXHdcXHNdKyQvZywgXCJcIik7XG5cbiAgICAgICAgICAgIC8vIOuUsOyYtO2RnOqwgCBzaW5nbGUgcXVvdGXsnbgg6rK97JqwIGRvdWJsZSBxdW90ZeuhnCDrs4DtmZhcbiAgICAgICAgICAgIGlmIChkZWZhdWx0VmFsdWUuc3RhcnRzV2l0aChcIidcIikgJiYgZGVmYXVsdFZhbHVlLmVuZHNXaXRoKFwiJ1wiKSkge1xuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWUucmVwbGFjZUFsbChcIidcIiwgJ1wiJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGRlZmF1bHRUbzogZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9KSgpLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIFBSSU1BUlkgS0VZ7JmAIGZvcmVpZ24ga2V57JqpIOyduOuNseyKpCDsoJzsmbhcbiAgICBjb25zdCBkYkluZGV4ZXNHcm91cCA9IGdyb3VwKFxuICAgICAgZGJJbmRleGVzLmZpbHRlcihcbiAgICAgICAgKGRiSW5kZXgpID0+XG4gICAgICAgICAgIWRiSW5kZXguaXNfcHJpbWFyeSAmJlxuICAgICAgICAgICFkYkZvcmVpZ25zLmZpbmQoKGRiRm9yZWlnbikgPT4gZGJJbmRleC5pbmRleF9uYW1lLmluY2x1ZGVzKGRiRm9yZWlnbi5jb25zdHJhaW50X25hbWUpKSxcbiAgICAgICksXG4gICAgICAoZGJJbmRleCkgPT4gZGJJbmRleC5pbmRleF9uYW1lLFxuICAgICk7XG5cbiAgICAvLyBpbmRleGVzIOyymOumrFxuICAgIGNvbnN0IGluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10gPSBPYmplY3Qua2V5cyhkYkluZGV4ZXNHcm91cCkubWFwKChpbmRleE5hbWUpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleGVzID0gZGJJbmRleGVzR3JvdXBbaW5kZXhOYW1lXT8udG9Tb3J0ZWQoXG4gICAgICAgIChsZWZ0LCByaWdodCkgPT4gbGVmdC5jb2x1bW5fb3JkZXIgLSByaWdodC5jb2x1bW5fb3JkZXIsXG4gICAgICApO1xuICAgICAgYXNzZXJ0KGN1cnJlbnRJbmRleGVzKTtcblxuICAgICAgY29uc3QgZmlyc3RJbmRleCA9IGN1cnJlbnRJbmRleGVzWzBdO1xuICAgICAgY29uc3QgcGFyc2VkSW5kZXhEZWZpbml0aW9uID0gdGhpcy5wYXJzZUluZGV4RGVmaW5pdGlvbihmaXJzdEluZGV4LmluZGV4X2RlZmluaXRpb24pO1xuICAgICAgY29uc3QgcmVzdG9yZWRJbmRleFR5cGUgPSB0aGlzLnJlc3RvcmVNaWdyYXRpb25JbmRleFR5cGUoXG4gICAgICAgIGZpcnN0SW5kZXgsXG4gICAgICAgIHBhcnNlZEluZGV4RGVmaW5pdGlvbi5hY2Nlc3NNZXRob2QsXG4gICAgICApO1xuICAgICAgY29uc3QgdXNpbmcgPSB0aGlzLnJlc3RvcmVHZW5lcmljVXNpbmcoXG4gICAgICAgIHBhcnNlZEluZGV4RGVmaW5pdGlvbi5hY2Nlc3NNZXRob2QgPz8gZmlyc3RJbmRleC5pbmRleF90eXBlLFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogcmVzdG9yZWRJbmRleFR5cGUsXG4gICAgICAgIG5hbWU6IGluZGV4TmFtZSxcbiAgICAgICAgY29sdW1uczogY3VycmVudEluZGV4ZXMubWFwKChpZHgpID0+ICh7XG4gICAgICAgICAgbmFtZTogaWR4LmNvbHVtbl9uYW1lLFxuICAgICAgICAgIC4uLih0aGlzLmV4dHJhY3RJbmRleENvbHVtbk9wY2xhc3MoXG4gICAgICAgICAgICBwYXJzZWRJbmRleERlZmluaXRpb24uY29sdW1uRGVmaW5pdGlvbnNbaWR4LmNvbHVtbl9vcmRlciAtIDFdLFxuICAgICAgICAgIClcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIG9wY2xhc3M6IHRoaXMuZXh0cmFjdEluZGV4Q29sdW1uT3BjbGFzcyhcbiAgICAgICAgICAgICAgICAgIHBhcnNlZEluZGV4RGVmaW5pdGlvbi5jb2x1bW5EZWZpbml0aW9uc1tpZHguY29sdW1uX29yZGVyIC0gMV0sXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgLi4uKHVzaW5nID09PSBcImJ0cmVlXCJcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIHNvcnRPcmRlcjogaWR4LnNvcnRfb3JkZXIsXG4gICAgICAgICAgICAgICAgbnVsbHNGaXJzdDogaWR4Lm51bGxzX2ZpcnN0LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfSkpLFxuXG4gICAgICAgIG51bGxzTm90RGlzdGluY3Q6IGZpcnN0SW5kZXgubnVsbHNfbm90X2Rpc3RpbmN0LFxuICAgICAgICAuLi4oZmlyc3RJbmRleC5wcmVkaWNhdGUgPyB7IHdoZXJlOiBmaXJzdEluZGV4LnByZWRpY2F0ZSB9IDoge30pLFxuICAgICAgICAuLi4odXNpbmcgPyB7IHVzaW5nIH0gOiB7fSksXG4gICAgICAgIC4uLnRoaXMucGFyc2VWZWN0b3JJbmRleE9wdGlvbnMocmVzdG9yZWRJbmRleFR5cGUsIHBhcnNlZEluZGV4RGVmaW5pdGlvbi53aXRoT3B0aW9ucyksXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gZm9yZWlnbnMg7LKY66asXG4gICAgY29uc3QgZm9yZWlnbnM6IE1pZ3JhdGlvbkZvcmVpZ25bXSA9IGRiRm9yZWlnbnMubWFwKChkYkZvcmVpZ24pID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbHVtbnM6IFtkYkZvcmVpZ24uY29sdW1uX25hbWVdLFxuICAgICAgICB0bzogYCR7ZGJGb3JlaWduLmZvcmVpZ25fdGFibGVfbmFtZX0uJHtkYkZvcmVpZ24uZm9yZWlnbl9jb2x1bW5fbmFtZX1gLFxuICAgICAgICBvblVwZGF0ZTogdGhpcy5tYXBDb25zdHJhaW50QWN0aW9uKGRiRm9yZWlnbi51cGRhdGVfcnVsZSksXG4gICAgICAgIG9uRGVsZXRlOiB0aGlzLm1hcENvbnN0cmFpbnRBY3Rpb24oZGJGb3JlaWduLmRlbGV0ZV9ydWxlKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGFibGUsXG4gICAgICBjb2x1bW5zLFxuICAgICAgaW5kZXhlcyxcbiAgICAgIGZvcmVpZ25zLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUG9zdGdyZVNRTOydmCBjb25zdHJhaW50IGFjdGlvbuydhCBLbmV4IO2YleyLneycvOuhnCDrs4DtmZhcbiAgICovXG4gIHByaXZhdGUgbWFwQ29uc3RyYWludEFjdGlvbihhY3Rpb246IHN0cmluZyk6IFJlbGF0aW9uT24ge1xuICAgIGNvbnN0IGFjdGlvbk1hcDogUmVjb3JkPHN0cmluZywgUmVsYXRpb25Pbj4gPSB7XG4gICAgICBcIk5PIEFDVElPTlwiOiBcIk5PIEFDVElPTlwiLFxuICAgICAgUkVTVFJJQ1Q6IFwiUkVTVFJJQ1RcIixcbiAgICAgIENBU0NBREU6IFwiQ0FTQ0FERVwiLFxuICAgICAgXCJTRVQgTlVMTFwiOiBcIlNFVCBOVUxMXCIsXG4gICAgICBcIlNFVCBERUZBVUxUXCI6IFwiU0VUIERFRkFVTFRcIixcbiAgICB9O1xuICAgIHJldHVybiBhY3Rpb25NYXBbYWN0aW9uXSA/PyBcIk5PIEFDVElPTlwiO1xuICB9XG5cbiAgLyoqXG4gICAqIOq4sOyhtCDthYzsnbTruJQg7J297Ja07IScIGNvbHMsIGluZGV4ZXMsIGZvcmVpZ25zIOuwmO2ZmFxuICAgKi9cbiAgYXN5bmMgcmVhZFRhYmxlKFxuICAgIGNvbXBhcmVEQjogUmF3Q2FwYWJsZUtuZXgsXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICk6IFByb21pc2U8W1BnQ29sdW1uW10sIFBnSW5kZXhbXSwgUGdGb3JlaWduW11dPiB7XG4gICAgLy8gQ29sdW1ucyDsobDtmowgKEdlbmVyYXRlZCBDb2x1bW4g7KCV67O0IO2PrO2VqClcbiAgICBjb25zdCBjb2x1bW5zUXVlcnkgPSBgXG4gICAgICBTRUxFQ1RcbiAgICAgICAgYy5jb2x1bW5fbmFtZSxcbiAgICAgICAgYy5kYXRhX3R5cGUsXG4gICAgICAgIGMudWR0X25hbWUsXG4gICAgICAgIENPQUxFU0NFKFxuICAgICAgICAgIGMuY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoLFxuICAgICAgICAgIENBU0UgV0hFTiBjLmRhdGFfdHlwZSA9ICdBUlJBWScgQU5EIGEuYXR0dHlwbW9kID4gMFxuICAgICAgICAgICAgVEhFTiBhLmF0dHR5cG1vZCAtIDRcbiAgICAgICAgICAgIEVMU0UgTlVMTFxuICAgICAgICAgIEVORFxuICAgICAgICApIEFTIGNoYXJhY3Rlcl9tYXhpbXVtX2xlbmd0aCxcbiAgICAgICAgQ09BTEVTQ0UoYy5kYXRldGltZV9wcmVjaXNpb24sIGMubnVtZXJpY19wcmVjaXNpb24pIEFTIHByZWNpc2lvbixcbiAgICAgICAgYy5udW1lcmljX3NjYWxlLFxuICAgICAgICBjLmlzX251bGxhYmxlLFxuICAgICAgICBjLmNvbHVtbl9kZWZhdWx0LFxuICAgICAgICBDT0FMRVNDRShhLmF0dGdlbmVyYXRlZCwgJycpIGFzIGlzX2dlbmVyYXRlZCxcbiAgICAgICAgYy5nZW5lcmF0aW9uX2V4cHJlc3Npb25cbiAgICAgIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgY1xuICAgICAgTEVGVCBKT0lOIHBnX2F0dHJpYnV0ZSBhIE9OIGEuYXR0bmFtZSA9IGMuY29sdW1uX25hbWVcbiAgICAgICAgQU5EIGEuYXR0cmVsaWQgPSAoXG4gICAgICAgICAgU0VMRUNUIG9pZCBGUk9NIHBnX2NsYXNzIFdIRVJFIHJlbG5hbWUgPSBjLnRhYmxlX25hbWVcbiAgICAgICAgICBBTkQgcmVsbmFtZXNwYWNlID0gKFNFTEVDVCBvaWQgRlJPTSBwZ19uYW1lc3BhY2UgV0hFUkUgbnNwbmFtZSA9IGMudGFibGVfc2NoZW1hKVxuICAgICAgICApXG4gICAgICBXSEVSRSBjLnRhYmxlX25hbWUgPSA/XG4gICAgICAgIEFORCBjLnRhYmxlX3NjaGVtYSA9ICdwdWJsaWMnXG4gICAgICBPUkRFUiBCWSBjLm9yZGluYWxfcG9zaXRpb25cbiAgICBgO1xuICAgIGNvbnN0IGNvbHVtbnMgPSAoYXdhaXQgY29tcGFyZURCLnJhdyhjb2x1bW5zUXVlcnksIFt0YWJsZU5hbWVdKSkucm93cyBhcyBQZ0NvbHVtbltdO1xuICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBub3QgZm91bmQ6ICR7dGFibGVOYW1lfWApO1xuICAgIH1cblxuICAgIC8vIEluZGV4ZXMg7KGw7ZqMIChQR3Jvb25nYSDtkZztmITsi50g7J24642x7IqkIO2PrO2VqClcbiAgICBjb25zdCBpbmRleGVzUXVlcnkgPSBgXG4gICAgICBTRUxFQ1RcbiAgICAgICAgICBpLnJlbG5hbWUgQVMgaW5kZXhfbmFtZSxcbiAgICAgICAgICBDQVNFXG4gICAgICAgICAgICAgIFdIRU4gYW0uYW1uYW1lID0gJ3Bncm9vbmdhJyBBTkQgdS5hdHRudW0gPSAwIFRIRU5cbiAgICAgICAgICAgICAgICAgIHJlZ2V4cF9yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4cF9yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBUUklNKHBncm9vbmdhX2NvbC5jb2x1bW5fZXhwciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICc6OnRleHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAnWygpXScsXG4gICAgICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAgICAgJ2cnXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIEVMU0UgYS5hdHRuYW1lXG4gICAgICAgICAgRU5EIEFTIGNvbHVtbl9uYW1lLFxuICAgICAgICAgIGl4LmluZGlzdW5pcXVlIEFTIGlzX3VuaXF1ZSxcbiAgICAgICAgICBpeC5pbmRpc3ByaW1hcnkgQVMgaXNfcHJpbWFyeSxcbiAgICAgICAgICBhbS5hbW5hbWUgQVMgaW5kZXhfdHlwZSxcbiAgICAgICAgICBDT0FMRVNDRSgodS5vcHQgJiAyKSA9IDIsIEZBTFNFKSBBUyBudWxsc19maXJzdCxcbiAgICAgICAgICBDQVNFIFxuICAgICAgICAgICAgICBXSEVOICh1Lm9wdCAmIDEpID0gMSBUSEVOICdERVNDJ1xuICAgICAgICAgICAgICBFTFNFICdBU0MnXG4gICAgICAgICAgRU5EIEFTIHNvcnRfb3JkZXIsXG4gICAgICAgICAgaXguaW5kbnVsbHNub3RkaXN0aW5jdCBBUyBudWxsc19ub3RfZGlzdGluY3QsXG4gICAgICAgICAgdS5vcmQgQVMgY29sdW1uX29yZGVyLFxuICAgICAgICAgIHBnX2dldF9pbmRleGRlZihpeC5pbmRleHJlbGlkKSBBUyBpbmRleF9kZWZpbml0aW9uLFxuICAgICAgICAgIHBnX2dldF9leHByKGl4LmluZHByZWQsIGl4LmluZHJlbGlkKSBBUyBwcmVkaWNhdGVcbiAgICAgIEZST00gcGdfY2xhc3MgdFxuICAgICAgSk9JTiBwZ19pbmRleCBpeCBPTiB0Lm9pZCA9IGl4LmluZHJlbGlkXG4gICAgICBKT0lOIHBnX2NsYXNzIGkgT04gaS5vaWQgPSBpeC5pbmRleHJlbGlkXG4gICAgICBKT0lOIHBnX2FtIGFtIE9OIGkucmVsYW0gPSBhbS5vaWRcbiAgICAgIEpPSU4gTEFURVJBTCB1bm5lc3QoaXguaW5ka2V5LCBpeC5pbmRvcHRpb24pXG4gICAgICAgICAgV0lUSCBPUkRJTkFMSVRZIEFTIHUoYXR0bnVtLCBvcHQsIG9yZCkgT04gdHJ1ZVxuICAgICAgTEVGVCBKT0lOIHBnX2F0dHJpYnV0ZSBhIE9OIGEuYXR0cmVsaWQgPSB0Lm9pZCBcbiAgICAgICAgICBBTkQgYS5hdHRudW0gPSB1LmF0dG51bSBcbiAgICAgICAgICBBTkQgdS5hdHRudW0gPiAwXG4gICAgICBMRUZUIEpPSU4gTEFURVJBTCAoXG4gICAgICAgICAgU0VMRUNUIFxuICAgICAgICAgICAgICB1bm5lc3QoXG4gICAgICAgICAgICAgICAgICBDQVNFIFxuICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGdfZ2V0X2V4cHIoaXguaW5kZXhwcnMsIGl4LmluZHJlbGlkKSB+ICdeQVJSQVlcXFxcWycgVEhFTlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdG9fYXJyYXkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleHBfcmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfZXhwcihpeC5pbmRleHBycywgaXguaW5kcmVsaWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdeQVJSQVlcXFxcWyguKilcXFxcXSQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXFxcMSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICBFTFNFXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZW3BnX2dldF9leHByKGl4LmluZGV4cHJzLCBpeC5pbmRyZWxpZCldXG4gICAgICAgICAgICAgICAgICBFTkRcbiAgICAgICAgICAgICAgKSBhcyBjb2x1bW5fZXhwclxuICAgICAgKSBwZ3Jvb25nYV9jb2wgT04gYW0uYW1uYW1lID0gJ3Bncm9vbmdhJyBBTkQgdS5hdHRudW0gPSAwXG4gICAgICBXSEVSRSB0LnJlbG5hbWUgPSA/XG4gICAgICAgICAgQU5EICh1LmF0dG51bSA+IDAgT1IgKGFtLmFtbmFtZSA9ICdwZ3Jvb25nYScgQU5EIHUuYXR0bnVtID0gMCkpXG4gICAgICBPUkRFUiBCWSBpLnJlbG5hbWUsIHUub3JkO1xuYDtcbiAgICBjb25zdCBpbmRleGVzID0gKGF3YWl0IGNvbXBhcmVEQi5yYXcoaW5kZXhlc1F1ZXJ5LCBbdGFibGVOYW1lXSkpLnJvd3M7XG5cbiAgICAvLyBGb3JlaWduIEtleXMg7KGw7ZqMXG4gICAgY29uc3QgZm9yZWlnbnNRdWVyeSA9IGBcbiAgICAgIFNFTEVDVFxuICAgICAgICB0Yy5jb25zdHJhaW50X25hbWUsXG4gICAgICAgIGtjdS5jb2x1bW5fbmFtZSxcbiAgICAgICAgY2N1LnRhYmxlX25hbWUgQVMgZm9yZWlnbl90YWJsZV9uYW1lLFxuICAgICAgICBjY3UuY29sdW1uX25hbWUgQVMgZm9yZWlnbl9jb2x1bW5fbmFtZSxcbiAgICAgICAgcmMudXBkYXRlX3J1bGUsXG4gICAgICAgIHJjLmRlbGV0ZV9ydWxlXG4gICAgICBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZV9jb25zdHJhaW50cyBBUyB0Y1xuICAgICAgSk9JTiBpbmZvcm1hdGlvbl9zY2hlbWEua2V5X2NvbHVtbl91c2FnZSBBUyBrY3VcbiAgICAgICAgT04gdGMuY29uc3RyYWludF9uYW1lID0ga2N1LmNvbnN0cmFpbnRfbmFtZVxuICAgICAgICBBTkQgdGMudGFibGVfc2NoZW1hID0ga2N1LnRhYmxlX3NjaGVtYVxuICAgICAgSk9JTiBpbmZvcm1hdGlvbl9zY2hlbWEuY29uc3RyYWludF9jb2x1bW5fdXNhZ2UgQVMgY2N1XG4gICAgICAgIE9OIGNjdS5jb25zdHJhaW50X25hbWUgPSB0Yy5jb25zdHJhaW50X25hbWVcbiAgICAgICAgQU5EIGNjdS50YWJsZV9zY2hlbWEgPSB0Yy50YWJsZV9zY2hlbWFcbiAgICAgIEpPSU4gaW5mb3JtYXRpb25fc2NoZW1hLnJlZmVyZW50aWFsX2NvbnN0cmFpbnRzIEFTIHJjXG4gICAgICAgIE9OIHJjLmNvbnN0cmFpbnRfbmFtZSA9IHRjLmNvbnN0cmFpbnRfbmFtZVxuICAgICAgICBBTkQgcmMuY29uc3RyYWludF9zY2hlbWEgPSB0Yy50YWJsZV9zY2hlbWFcbiAgICAgIFdIRVJFIHRjLmNvbnN0cmFpbnRfdHlwZSA9ICdGT1JFSUdOIEtFWSdcbiAgICAgICAgQU5EIHRjLnRhYmxlX25hbWUgPSA/XG4gICAgYDtcbiAgICBjb25zdCBmb3JlaWducyA9IChhd2FpdCBjb21wYXJlREIucmF3KGZvcmVpZ25zUXVlcnksIFt0YWJsZU5hbWVdKSkucm93cztcblxuICAgIHJldHVybiBbY29sdW1ucywgaW5kZXhlcywgZm9yZWlnbnNdO1xuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlTWlncmF0aW9uSW5kZXhUeXBlKFxuICAgIGluZGV4OiBQaWNrPFBnSW5kZXgsIFwiaXNfdW5pcXVlXCIgfCBcImluZGV4X3R5cGVcIj4sXG4gICAgYWNjZXNzTWV0aG9kPzogc3RyaW5nLFxuICApOiBNaWdyYXRpb25JbmRleFtcInR5cGVcIl0ge1xuICAgIGNvbnN0IHJlc29sdmVkQWNjZXNzTWV0aG9kID0gKGFjY2Vzc01ldGhvZCA/PyBpbmRleC5pbmRleF90eXBlKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKHJlc29sdmVkQWNjZXNzTWV0aG9kID09PSBcImhuc3dcIiB8fCByZXNvbHZlZEFjY2Vzc01ldGhvZCA9PT0gXCJpdmZmbGF0XCIpIHtcbiAgICAgIHJldHVybiByZXNvbHZlZEFjY2Vzc01ldGhvZDtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5kZXguaXNfdW5pcXVlID8gXCJ1bmlxdWVcIiA6IFwiaW5kZXhcIjtcbiAgfVxuXG4gIHByaXZhdGUgcmVzdG9yZUdlbmVyaWNVc2luZyhcbiAgICBhY2Nlc3NNZXRob2Q6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgKTogTWlncmF0aW9uSW5kZXhbXCJ1c2luZ1wiXSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFhY2Nlc3NNZXRob2QpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IGFjY2Vzc01ldGhvZC50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICghdGhpcy5nZW5lcmljSW5kZXhUeXBlcy5oYXMobm9ybWFsaXplZCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQgYXMgTWlncmF0aW9uSW5kZXhbXCJ1c2luZ1wiXTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VWZWN0b3JJbmRleE9wdGlvbnMoXG4gICAgdHlwZTogTWlncmF0aW9uSW5kZXhbXCJ0eXBlXCJdLFxuICAgIHdpdGhPcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICApOiBQaWNrPE1pZ3JhdGlvbkluZGV4LCBcIm1cIiB8IFwiZWZDb25zdHJ1Y3Rpb25cIiB8IFwibGlzdHNcIj4ge1xuICAgIGlmICh0eXBlID09PSBcImhuc3dcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uKHRoaXMucGFyc2VJbnRlZ2VyT3B0aW9uKHdpdGhPcHRpb25zLm0pICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHsgbTogdGhpcy5wYXJzZUludGVnZXJPcHRpb24od2l0aE9wdGlvbnMubSkgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICAuLi4odGhpcy5wYXJzZUludGVnZXJPcHRpb24od2l0aE9wdGlvbnMuZWZfY29uc3RydWN0aW9uKSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB7IGVmQ29uc3RydWN0aW9uOiB0aGlzLnBhcnNlSW50ZWdlck9wdGlvbih3aXRoT3B0aW9ucy5lZl9jb25zdHJ1Y3Rpb24pIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09IFwiaXZmZmxhdFwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUludGVnZXJPcHRpb24od2l0aE9wdGlvbnMubGlzdHMpICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB7IGxpc3RzOiB0aGlzLnBhcnNlSW50ZWdlck9wdGlvbih3aXRoT3B0aW9ucy5saXN0cykgfVxuICAgICAgICA6IHt9O1xuICAgIH1cblxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VJbnRlZ2VyT3B0aW9uKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgcmV0dXJuIE51bWJlci5pc05hTihwYXJzZWQpID8gdW5kZWZpbmVkIDogcGFyc2VkO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0SW5kZXhDb2x1bW5PcGNsYXNzKGNvbHVtbkRlZmluaXRpb246IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFjb2x1bW5EZWZpbml0aW9uKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHRyaW1tZWQgPSBjb2x1bW5EZWZpbml0aW9uXG4gICAgICAucmVwbGFjZSgvXFxzK05VTExTXFxzKyhGSVJTVHxMQVNUKVxccyokL2ksIFwiXCIpXG4gICAgICAucmVwbGFjZSgvXFxzKyhBU0N8REVTQylcXHMqJC9pLCBcIlwiKVxuICAgICAgLnRyaW0oKTtcbiAgICBjb25zdCB0b2tlbnMgPSB0aGlzLnRva2VuaXplVG9wTGV2ZWwodHJpbW1lZCk7XG5cbiAgICBpZiAodG9rZW5zLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMl0/LnRvVXBwZXJDYXNlKCkgPT09IFwiQ09MTEFURVwiKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB0b2tlbnMuYXQoLTEpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUluZGV4RGVmaW5pdGlvbihpbmRleERlZmluaXRpb246IHN0cmluZyk6IHtcbiAgICBhY2Nlc3NNZXRob2Q/OiBzdHJpbmc7XG4gICAgY29sdW1uRGVmaW5pdGlvbnM6IHN0cmluZ1tdO1xuICAgIHdpdGhPcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICB9IHtcbiAgICBjb25zdCBhY2Nlc3NNZXRob2QgPSBpbmRleERlZmluaXRpb24ubWF0Y2goL1xcYlVTSU5HXFxzKyhbYS16X11bXFx3XSopL2kpPy5bMV0/LnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgdXNpbmdNYXRjaEluZGV4ID0gaW5kZXhEZWZpbml0aW9uLnNlYXJjaCgvXFxiVVNJTkdcXGIvaSk7XG4gICAgY29uc3QgY29sdW1uc1N0YXJ0ID0gdXNpbmdNYXRjaEluZGV4ID49IDAgPyBpbmRleERlZmluaXRpb24uaW5kZXhPZihcIihcIiwgdXNpbmdNYXRjaEluZGV4KSA6IC0xO1xuICAgIGNvbnN0IGNvbHVtbnNFbmQgPVxuICAgICAgY29sdW1uc1N0YXJ0ID49IDAgPyB0aGlzLmZpbmRNYXRjaGluZ1BhcmVudGhlc2lzKGluZGV4RGVmaW5pdGlvbiwgY29sdW1uc1N0YXJ0KSA6IC0xO1xuICAgIGNvbnN0IGNvbHVtbkRlZmluaXRpb25zID1cbiAgICAgIGNvbHVtbnNTdGFydCA+PSAwICYmIGNvbHVtbnNFbmQgPiBjb2x1bW5zU3RhcnRcbiAgICAgICAgPyB0aGlzLnNwbGl0VG9wTGV2ZWwoaW5kZXhEZWZpbml0aW9uLnNsaWNlKGNvbHVtbnNTdGFydCArIDEsIGNvbHVtbnNFbmQpLCBcIixcIilcbiAgICAgICAgOiBbXTtcblxuICAgIGNvbnN0IHdpdGhNYXRjaCA9IC9cXGJXSVRIXFxzKlxcKC9pLmV4ZWMoaW5kZXhEZWZpbml0aW9uKTtcbiAgICBjb25zdCB3aXRoU3RhcnQgPSB3aXRoTWF0Y2ggPyBpbmRleERlZmluaXRpb24uaW5kZXhPZihcIihcIiwgd2l0aE1hdGNoLmluZGV4KSA6IC0xO1xuICAgIGNvbnN0IHdpdGhFbmQgPSB3aXRoU3RhcnQgPj0gMCA/IHRoaXMuZmluZE1hdGNoaW5nUGFyZW50aGVzaXMoaW5kZXhEZWZpbml0aW9uLCB3aXRoU3RhcnQpIDogLTE7XG4gICAgY29uc3Qgd2l0aE9wdGlvbnMgPVxuICAgICAgd2l0aFN0YXJ0ID49IDAgJiYgd2l0aEVuZCA+IHdpdGhTdGFydFxuICAgICAgICA/IHRoaXMucGFyc2VJbmRleE9wdGlvbkVudHJpZXMoaW5kZXhEZWZpbml0aW9uLnNsaWNlKHdpdGhTdGFydCArIDEsIHdpdGhFbmQpKVxuICAgICAgICA6IHt9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjY2Vzc01ldGhvZCxcbiAgICAgIGNvbHVtbkRlZmluaXRpb25zLFxuICAgICAgd2l0aE9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VJbmRleE9wdGlvbkVudHJpZXMob3B0aW9uU291cmNlOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5zcGxpdFRvcExldmVsKG9wdGlvblNvdXJjZSwgXCIsXCIpLnJlZHVjZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigocmVzdWx0LCBlbnRyeSkgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hlZCA9IGVudHJ5LnRyaW0oKS5tYXRjaCgvXihbYS16X11bXFx3XSopXFxzKj1cXHMqKC4rKSQvaSk7XG4gICAgICBpZiAoIW1hdGNoZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgWywga2V5LCByYXdWYWx1ZV0gPSBtYXRjaGVkO1xuICAgICAgcmVzdWx0W2tleS50b0xvd2VyQ2FzZSgpXSA9IHJhd1ZhbHVlLnRyaW0oKS5yZXBsYWNlKC9eWydcIl18WydcIl0kL2csIFwiXCIpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LCB7fSk7XG4gIH1cblxuICBwcml2YXRlIHNwbGl0VG9wTGV2ZWwoc291cmNlOiBzdHJpbmcsIGRlbGltaXRlcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGl0ZW1zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBzdGFydCA9IDA7XG4gICAgbGV0IHBhcmVuRGVwdGggPSAwO1xuICAgIGxldCBicmFja2V0RGVwdGggPSAwO1xuICAgIGxldCBpblNpbmdsZVF1b3RlID0gZmFsc2U7XG4gICAgbGV0IGluRG91YmxlUXVvdGUgPSBmYWxzZTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzb3VyY2UubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBjb25zdCBjaGFyID0gc291cmNlW2luZGV4XTtcbiAgICAgIGNvbnN0IG5leHRDaGFyID0gc291cmNlW2luZGV4ICsgMV07XG5cbiAgICAgIGlmIChjaGFyID09PSBcIidcIiAmJiAhaW5Eb3VibGVRdW90ZSkge1xuICAgICAgICBpZiAoaW5TaW5nbGVRdW90ZSAmJiBuZXh0Q2hhciA9PT0gXCInXCIpIHtcbiAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGluU2luZ2xlUXVvdGUgPSAhaW5TaW5nbGVRdW90ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSAnXCInICYmICFpblNpbmdsZVF1b3RlKSB7XG4gICAgICAgIGlmIChpbkRvdWJsZVF1b3RlICYmIG5leHRDaGFyID09PSAnXCInKSB7XG4gICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpbkRvdWJsZVF1b3RlID0gIWluRG91YmxlUXVvdGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5TaW5nbGVRdW90ZSB8fCBpbkRvdWJsZVF1b3RlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gXCIoXCIpIHtcbiAgICAgICAgcGFyZW5EZXB0aCArPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFyID09PSBcIilcIikge1xuICAgICAgICBwYXJlbkRlcHRoIC09IDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYXIgPT09IFwiW1wiKSB7XG4gICAgICAgIGJyYWNrZXREZXB0aCArPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFyID09PSBcIl1cIikge1xuICAgICAgICBicmFja2V0RGVwdGggLT0gMTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSBkZWxpbWl0ZXIgJiYgcGFyZW5EZXB0aCA9PT0gMCAmJiBicmFja2V0RGVwdGggPT09IDApIHtcbiAgICAgICAgaXRlbXMucHVzaChzb3VyY2Uuc2xpY2Uoc3RhcnQsIGluZGV4KS50cmltKCkpO1xuICAgICAgICBzdGFydCA9IGluZGV4ICsgMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0YWlsID0gc291cmNlLnNsaWNlKHN0YXJ0KS50cmltKCk7XG4gICAgaWYgKHRhaWwubGVuZ3RoID4gMCkge1xuICAgICAgaXRlbXMucHVzaCh0YWlsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBwcml2YXRlIHRva2VuaXplVG9wTGV2ZWwoc291cmNlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBzdGFydCA9IC0xO1xuICAgIGxldCBwYXJlbkRlcHRoID0gMDtcbiAgICBsZXQgYnJhY2tldERlcHRoID0gMDtcbiAgICBsZXQgaW5TaW5nbGVRdW90ZSA9IGZhbHNlO1xuICAgIGxldCBpbkRvdWJsZVF1b3RlID0gZmFsc2U7XG5cbiAgICBjb25zdCBwdXNoVG9rZW4gPSAoZW5kSW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRva2VuID0gc291cmNlLnNsaWNlKHN0YXJ0LCBlbmRJbmRleCkudHJpbSgpO1xuICAgICAgaWYgKHRva2VuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgfVxuICAgICAgc3RhcnQgPSAtMTtcbiAgICB9O1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNvdXJjZS5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IGNoYXIgPSBzb3VyY2VbaW5kZXhdO1xuICAgICAgY29uc3QgbmV4dENoYXIgPSBzb3VyY2VbaW5kZXggKyAxXTtcblxuICAgICAgaWYgKGNoYXIgPT09IFwiJ1wiICYmICFpbkRvdWJsZVF1b3RlKSB7XG4gICAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgICBzdGFydCA9IGluZGV4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpblNpbmdsZVF1b3RlICYmIG5leHRDaGFyID09PSBcIidcIikge1xuICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5TaW5nbGVRdW90ZSA9ICFpblNpbmdsZVF1b3RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09ICdcIicgJiYgIWluU2luZ2xlUXVvdGUpIHtcbiAgICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICAgIHN0YXJ0ID0gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluRG91YmxlUXVvdGUgJiYgbmV4dENoYXIgPT09ICdcIicpIHtcbiAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGluRG91YmxlUXVvdGUgPSAhaW5Eb3VibGVRdW90ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaW5TaW5nbGVRdW90ZSAmJiAhaW5Eb3VibGVRdW90ZSkge1xuICAgICAgICBpZiAoY2hhciA9PT0gXCIoXCIpIHtcbiAgICAgICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgICAgICBzdGFydCA9IGluZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXJlbkRlcHRoICs9IDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXIgPT09IFwiKVwiKSB7XG4gICAgICAgICAgcGFyZW5EZXB0aCAtPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFyID09PSBcIltcIikge1xuICAgICAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gaW5kZXg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyYWNrZXREZXB0aCArPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFyID09PSBcIl1cIikge1xuICAgICAgICAgIGJyYWNrZXREZXB0aCAtPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKC9cXHMvLnRlc3QoY2hhcikgJiYgcGFyZW5EZXB0aCA9PT0gMCAmJiBicmFja2V0RGVwdGggPT09IDApIHtcbiAgICAgICAgICBwdXNoVG9rZW4oaW5kZXgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgc3RhcnQgPSBpbmRleDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoVG9rZW4oc291cmNlLmxlbmd0aCk7XG4gICAgcmV0dXJuIHRva2VucztcbiAgfVxuXG4gIHByaXZhdGUgZmluZE1hdGNoaW5nUGFyZW50aGVzaXMoc291cmNlOiBzdHJpbmcsIG9wZW5JbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgZGVwdGggPSAwO1xuICAgIGxldCBpblNpbmdsZVF1b3RlID0gZmFsc2U7XG4gICAgbGV0IGluRG91YmxlUXVvdGUgPSBmYWxzZTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gb3BlbkluZGV4OyBpbmRleCA8IHNvdXJjZS5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IGNoYXIgPSBzb3VyY2VbaW5kZXhdO1xuICAgICAgY29uc3QgbmV4dENoYXIgPSBzb3VyY2VbaW5kZXggKyAxXTtcblxuICAgICAgaWYgKGNoYXIgPT09IFwiJ1wiICYmICFpbkRvdWJsZVF1b3RlKSB7XG4gICAgICAgIGlmIChpblNpbmdsZVF1b3RlICYmIG5leHRDaGFyID09PSBcIidcIikge1xuICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5TaW5nbGVRdW90ZSA9ICFpblNpbmdsZVF1b3RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09ICdcIicgJiYgIWluU2luZ2xlUXVvdGUpIHtcbiAgICAgICAgaWYgKGluRG91YmxlUXVvdGUgJiYgbmV4dENoYXIgPT09ICdcIicpIHtcbiAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGluRG91YmxlUXVvdGUgPSAhaW5Eb3VibGVRdW90ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpblNpbmdsZVF1b3RlIHx8IGluRG91YmxlUXVvdGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSBcIihcIikge1xuICAgICAgICBkZXB0aCArPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09IFwiKVwiKSB7XG4gICAgICAgIGRlcHRoIC09IDE7XG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtirnsoJUg7YWM7J2067iU7J2YIFBL66W8IOywuOyhsO2VmOuKlCDri6Trpbgg7YWM7J2067iU7J2YIEZLIOuqqeuhneydhCDsobDtmoztlanri4jri6QuXG4gICAqIFBLIO2DgOyehSDrs4Dqsr0g7IucIOq0gOugqCBGSyDsoJzslb3sobDqsbTsnYQg7IKt7KCcL+uzteq1rO2VmOq4sCDsnITtlbQg7IKs7Jqp65Cp64uI64ukLlxuICAgKi9cbiAgYXN5bmMgZ2V0UmVmZXJlbmNpbmdGb3JlaWduS2V5cyhkYjogS25leCwgdGFibGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlZmVyZW5jaW5nRm9yZWlnbktleVtdPiB7XG4gICAgY29uc3QgcXVlcnkgPSBgXG4gICAgICBTRUxFQ1RcbiAgICAgICAgdGMudGFibGVfbmFtZSxcbiAgICAgICAgdGMuY29uc3RyYWludF9uYW1lLFxuICAgICAgICBrY3UuY29sdW1uX25hbWUsXG4gICAgICAgIGNjdS50YWJsZV9uYW1lIEFTIHJlZmVyZW5jZWRfdGFibGVfbmFtZSxcbiAgICAgICAgY2N1LmNvbHVtbl9uYW1lIEFTIHJlZmVyZW5jZWRfY29sdW1uX25hbWUsXG4gICAgICAgIHJjLnVwZGF0ZV9ydWxlLFxuICAgICAgICByYy5kZWxldGVfcnVsZVxuICAgICAgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVfY29uc3RyYWludHMgQVMgdGNcbiAgICAgIEpPSU4gaW5mb3JtYXRpb25fc2NoZW1hLmtleV9jb2x1bW5fdXNhZ2UgQVMga2N1XG4gICAgICAgIE9OIHRjLmNvbnN0cmFpbnRfbmFtZSA9IGtjdS5jb25zdHJhaW50X25hbWVcbiAgICAgICAgQU5EIHRjLnRhYmxlX3NjaGVtYSA9IGtjdS50YWJsZV9zY2hlbWFcbiAgICAgIEpPSU4gaW5mb3JtYXRpb25fc2NoZW1hLmNvbnN0cmFpbnRfY29sdW1uX3VzYWdlIEFTIGNjdVxuICAgICAgICBPTiBjY3UuY29uc3RyYWludF9uYW1lID0gdGMuY29uc3RyYWludF9uYW1lXG4gICAgICAgIEFORCBjY3UudGFibGVfc2NoZW1hID0gdGMudGFibGVfc2NoZW1hXG4gICAgICBKT0lOIGluZm9ybWF0aW9uX3NjaGVtYS5yZWZlcmVudGlhbF9jb25zdHJhaW50cyBBUyByY1xuICAgICAgICBPTiByYy5jb25zdHJhaW50X25hbWUgPSB0Yy5jb25zdHJhaW50X25hbWVcbiAgICAgICAgQU5EIHJjLmNvbnN0cmFpbnRfc2NoZW1hID0gdGMudGFibGVfc2NoZW1hXG4gICAgICBXSEVSRSB0Yy5jb25zdHJhaW50X3R5cGUgPSAnRk9SRUlHTiBLRVknXG4gICAgICAgIEFORCBjY3UudGFibGVfbmFtZSA9ID9cbiAgICAgICAgQU5EIHRjLnRhYmxlX3NjaGVtYSA9ICdwdWJsaWMnXG4gICAgYDtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiLnJhdyhxdWVyeSwgW3RhYmxlTmFtZV0pO1xuICAgIHJldHVybiByZXN1bHQucm93cy5tYXAoXG4gICAgICAocm93OiB7XG4gICAgICAgIHRhYmxlX25hbWU6IHN0cmluZztcbiAgICAgICAgY29uc3RyYWludF9uYW1lOiBzdHJpbmc7XG4gICAgICAgIGNvbHVtbl9uYW1lOiBzdHJpbmc7XG4gICAgICAgIHJlZmVyZW5jZWRfdGFibGVfbmFtZTogc3RyaW5nO1xuICAgICAgICByZWZlcmVuY2VkX2NvbHVtbl9uYW1lOiBzdHJpbmc7XG4gICAgICAgIHVwZGF0ZV9ydWxlOiBzdHJpbmc7XG4gICAgICAgIGRlbGV0ZV9ydWxlOiBzdHJpbmc7XG4gICAgICB9KSA9PiAoe1xuICAgICAgICB0YWJsZU5hbWU6IHJvdy50YWJsZV9uYW1lLFxuICAgICAgICBjb25zdHJhaW50TmFtZTogcm93LmNvbnN0cmFpbnRfbmFtZSxcbiAgICAgICAgY29sdW1uTmFtZTogcm93LmNvbHVtbl9uYW1lLFxuICAgICAgICByZWZlcmVuY2VkVGFibGVOYW1lOiByb3cucmVmZXJlbmNlZF90YWJsZV9uYW1lLFxuICAgICAgICByZWZlcmVuY2VkQ29sdW1uTmFtZTogcm93LnJlZmVyZW5jZWRfY29sdW1uX25hbWUsXG4gICAgICAgIG9uVXBkYXRlOiB0aGlzLm1hcENvbnN0cmFpbnRBY3Rpb24ocm93LnVwZGF0ZV9ydWxlKSxcbiAgICAgICAgb25EZWxldGU6IHRoaXMubWFwQ29uc3RyYWludEFjdGlvbihyb3cuZGVsZXRlX3J1bGUpLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB2ZWN0b3Ig7Lus65+87J2YIGRpbWVuc2lvbnPrpbwg7KGw7ZqM7ZWp64uI64ukLlxuICAgKiBwZ19hdHRyaWJ1dGXsnZggYXR0dHlwbW9k7JeQ7IScIOywqOybkCDsiJjrpbwg7LaU7Lac7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRWZWN0b3JEaW1lbnNpb25zKFxuICAgIGNvbXBhcmVEQjogUmF3Q2FwYWJsZUtuZXgsXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gYFxuICAgICAgU0VMRUNUXG4gICAgICAgIGEuYXR0bmFtZSBhcyBjb2x1bW5fbmFtZSxcbiAgICAgICAgYS5hdHR0eXBtb2QgYXMgZGltZW5zaW9uc1xuICAgICAgRlJPTSBwZ19hdHRyaWJ1dGUgYVxuICAgICAgSk9JTiBwZ19jbGFzcyBjIE9OIGEuYXR0cmVsaWQgPSBjLm9pZFxuICAgICAgSk9JTiBwZ190eXBlIHQgT04gYS5hdHR0eXBpZCA9IHQub2lkXG4gICAgICBXSEVSRSBjLnJlbG5hbWUgPSA/XG4gICAgICAgIEFORCB0LnR5cG5hbWUgPSAndmVjdG9yJ1xuICAgICAgICBBTkQgYS5hdHRudW0gPiAwXG4gICAgYDtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb21wYXJlREIucmF3KHF1ZXJ5LCBbdGFibGVOYW1lXSk7XG4gICAgY29uc3QgZGltZW5zaW9uczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJlc3VsdC5yb3dzKSB7XG4gICAgICAvLyBhdHR0eXBtb2Tsl5DshJwg7Iuk7KCcIGRpbWVuc2lvbnMg6rCSIOy2lOy2nFxuICAgICAgZGltZW5zaW9uc1tyb3cuY29sdW1uX25hbWVdID0gcm93LmRpbWVuc2lvbnMgPiAwID8gcm93LmRpbWVuc2lvbnMgOiAwO1xuICAgIH1cbiAgICByZXR1cm4gZGltZW5zaW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3N0Z3JlU1FMIOy7rOufvCDtg4DsnoXsnYQg67aE7ISd7ZWY7JesIE1pZ3JhdGlvbkNvbHVtbiDqsJ3ssrTroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgcmVzb2x2ZURCQ29sVHlwZShcbiAgICBkYkNvbHVtbjogUGdDb2x1bW4sXG4gICk6IFBpY2s8XG4gICAgTWlncmF0aW9uQ29sdW1uLFxuICAgIFwidHlwZVwiIHwgXCJsZW5ndGhcIiB8IFwicHJlY2lzaW9uXCIgfCBcInNjYWxlXCIgfCBcIm51bWJlclR5cGVcIiB8IFwiZGltZW5zaW9uc1wiXG4gID4ge1xuICAgIGNvbnN0IHsgdWR0X25hbWU6IF91ZHRfbmFtZSwgY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoLCBwcmVjaXNpb24sIG51bWVyaWNfc2NhbGUgfSA9IGRiQ29sdW1uO1xuXG4gICAgY29uc3QgeyB1ZHRfbmFtZSwgc2luZ2xlT3JBcnJheSB9ID0gKCgpID0+IHtcbiAgICAgIGlmIChfdWR0X25hbWUuc3RhcnRzV2l0aChcIl9cIikpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1ZHRfbmFtZTogX3VkdF9uYW1lLnN1YnN0cmluZygxKSxcbiAgICAgICAgICBzaW5nbGVPckFycmF5OiBcIltdXCIgYXMgY29uc3QsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1ZHRfbmFtZTogX3VkdF9uYW1lLFxuICAgICAgICBzaW5nbGVPckFycmF5OiBcIlwiIGFzIGNvbnN0LFxuICAgICAgfTtcbiAgICB9KSgpO1xuXG4gICAgLy8gVVVJRFxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGB1dWlkJHtzaW5nbGVPckFycmF5fWAgfTtcbiAgICB9XG5cbiAgICAvLyBJbnRlZ2VyIHR5cGVzXG4gICAgaWYgKHVkdF9uYW1lID09PSBcImludDRcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYGludGVnZXIke3NpbmdsZU9yQXJyYXl9YCB9O1xuICAgIH1cbiAgICBpZiAodWR0X25hbWUgPT09IFwiaW50OFwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBgYmlnSW50ZWdlciR7c2luZ2xlT3JBcnJheX1gIH07XG4gICAgfVxuXG4gICAgLy8gU3RyaW5nIHR5cGVzXG4gICAgaWYgKHVkdF9uYW1lID09PSBcInZhcmNoYXJcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogYHN0cmluZyR7c2luZ2xlT3JBcnJheX1gLFxuICAgICAgICAuLi4oY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoICYmIHtcbiAgICAgICAgICBsZW5ndGg6IGNoYXJhY3Rlcl9tYXhpbXVtX2xlbmd0aCxcbiAgICAgICAgfSksXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodWR0X25hbWUgPT09IFwidGV4dFwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBgc3RyaW5nJHtzaW5nbGVPckFycmF5fWAgfTsgLy8gU3RyaW5nUHJvcCB3aXRob3V0IGxlbmd0aFxuICAgIH1cblxuICAgIC8vIE51bWJlck9yTnVtZXJpYyB0eXBlc1xuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJudW1lcmljXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IGBudW1iZXJPck51bWVyaWMke3NpbmdsZU9yQXJyYXl9YCxcbiAgICAgICAgbnVtYmVyVHlwZTogXCJudW1lcmljXCIsXG4gICAgICAgIC4uLihwcmVjaXNpb24gIT09IG51bGwgJiZcbiAgICAgICAgICBudW1lcmljX3NjYWxlICE9PSBudWxsICYmIHtcbiAgICAgICAgICAgIHByZWNpc2lvbjogcHJlY2lzaW9uLFxuICAgICAgICAgICAgc2NhbGU6IG51bWVyaWNfc2NhbGUsXG4gICAgICAgICAgfSksXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodWR0X25hbWUgPT09IFwiZmxvYXQ0XCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGBudW1iZXJPck51bWVyaWMke3NpbmdsZU9yQXJyYXl9YCwgbnVtYmVyVHlwZTogXCJyZWFsXCIgfTtcbiAgICB9XG4gICAgaWYgKHVkdF9uYW1lID09PSBcImZsb2F0OFwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBgbnVtYmVyT3JOdW1lcmljJHtzaW5nbGVPckFycmF5fWAsIG51bWJlclR5cGU6IFwiZG91YmxlIHByZWNpc2lvblwiIH07XG4gICAgfVxuXG4gICAgLy8gQm9vbGVhblxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJib29sXCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGBib29sZWFuJHtzaW5nbGVPckFycmF5fWAgfTtcbiAgICB9XG5cbiAgICAvLyBUaW1lc3RhbXB6IHR5cGVzXG4gICAgaWYgKHVkdF9uYW1lID09PSBcInRpbWVzdGFtcHR6XCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IGBkYXRlJHtzaW5nbGVPckFycmF5fWAsXG4gICAgICAgIC4uLihwcmVjaXNpb24gIT09IG51bGwgJiYge1xuICAgICAgICAgIHByZWNpc2lvbjogcHJlY2lzaW9uLFxuICAgICAgICB9KSxcbiAgICAgIH07IC8vIERhdGVQcm9wIOKGkiB0aW1lc3RhbXB0elxuICAgIH1cblxuICAgIC8vIEpTT05cbiAgICBpZiAodWR0X25hbWUgPT09IFwianNvblwiIHx8IHVkdF9uYW1lID09PSBcImpzb25iXCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwianNvblwiIH07XG4gICAgfVxuXG4gICAgLy8gVmVjdG9yIChwZ3ZlY3RvcilcbiAgICBpZiAodWR0X25hbWUgPT09IFwidmVjdG9yXCIpIHtcbiAgICAgIC8vIHZlY3RvciDtg4DsnoXsnZgg7LCo7JuQIOyImOuKlCBjb2x1bW5fZGVmYXVsdOuCmCDrs4Trj4Qg7L+866as66GcIO2ZleyduO2VtOyVvCDtlahcbiAgICAgIC8vIO2YhOyerOuKlCDquLDrs7jqsJIgMOycvOuhnCDshKTsoJUgKOyLpOygnCBkaW1lbnNpb25z64qUIGdldE1pZ3JhdGlvblNldEZyb21EQuyXkOyEnCDrs4Trj4Qg7L+866as66GcIO2ZleyduClcbiAgICAgIHJldHVybiB7IHR5cGU6IGB2ZWN0b3Ike3NpbmdsZU9yQXJyYXl9YCwgZGltZW5zaW9uczogMCB9O1xuICAgIH1cblxuICAgIC8vIHRzdmVjdG9yIChQb3N0Z3JlU1FMIOyghOusuCDqsoDsg4nsmqkg7YOA7J6FKVxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJ0c3ZlY3RvclwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcInRzdmVjdG9yXCIgfTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYHJlc29sdmUg67aI6rCA64ql7ZWcIFBvc3RncmVTUUwg7Lus65+8IO2DgOyehTogJHt1ZHRfbmFtZX1gKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgUG9zdGdyZVNRTFNjaGVtYVJlYWRlciA9IG5ldyBQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyQ2xhc3MoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0NBd0VNLDhCQUFOLE1BQWtDO0VBQ2hDLG9DQUFxQyxJQUFJLElBQUk7R0FBQztHQUFTO0dBQVE7R0FBTztHQUFRO0VBQVUsQ0FBQzs7Ozs7OztFQVF6RixNQUFNLHNCQUNKLFdBQ0EsT0FDOEI7R0FDOUIsSUFBSSxXQUF1QixXQUFzQjtHQUNqRCxJQUFJO0lBQ0YsQ0FBQyxX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
|
|
563
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXNxbC1zY2hlbWEtcmVhZGVyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vcG9zdGdyZXNxbC1zY2hlbWEtcmVhZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuXG5pbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgZ3JvdXAgfSBmcm9tIFwicmFkYXNoaVwiO1xuXG5pbXBvcnQge1xuICB0eXBlIE1pZ3JhdGlvbkNvbHVtbixcbiAgdHlwZSBNaWdyYXRpb25Gb3JlaWduLFxuICB0eXBlIE1pZ3JhdGlvbkluZGV4LFxuICB0eXBlIE1pZ3JhdGlvblNldCxcbiAgdHlwZSBSZWxhdGlvbk9uLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcblxuLyoqXG4gKiDtirnsoJUg7YWM7J2067iU7J2YIFBL66W8IOywuOyhsO2VmOuKlCDri6Trpbgg7YWM7J2067iU7J2YIEZLIOygleuztOyeheuLiOuLpC5cbiAqIFBLIO2DgOyehSDrs4Dqsr0g7IucIOq0gOugqCBGSyDsoJzslb3sobDqsbTsnYQg7LKY66as7ZWY6riwIOychO2VtCDsgqzsmqnrkKnri4jri6QuXG4gKi9cbmV4cG9ydCB0eXBlIFJlZmVyZW5jaW5nRm9yZWlnbktleSA9IHtcbiAgLyoqIEZL6rCAIOygleydmOuQnCDthYzsnbTruJTrqoUgKi9cbiAgdGFibGVOYW1lOiBzdHJpbmc7XG4gIC8qKiBGSyDsoJzslb3sobDqsbQg7J2066aEICovXG4gIGNvbnN0cmFpbnROYW1lOiBzdHJpbmc7XG4gIC8qKiBGSyDsu6zrn7zrqoUgKi9cbiAgY29sdW1uTmFtZTogc3RyaW5nO1xuICAvKiog7LC47KGw7ZWY64qUIO2FjOydtOu4lOuqhSAoUEvqsIAg7J6I64qUIO2FjOydtOu4lCkgKi9cbiAgcmVmZXJlbmNlZFRhYmxlTmFtZTogc3RyaW5nO1xuICAvKiog7LC47KGw7ZWY64qUIOy7rOufvOuqhSAo67O07Ya1ICdpZCcpICovXG4gIHJlZmVyZW5jZWRDb2x1bW5OYW1lOiBzdHJpbmc7XG4gIC8qKiBPTiBVUERBVEUg7JWh7IWYICovXG4gIG9uVXBkYXRlOiBSZWxhdGlvbk9uO1xuICAvKiogT04gREVMRVRFIOyVoeyFmCAqL1xuICBvbkRlbGV0ZTogUmVsYXRpb25Pbjtcbn07XG5cbmV4cG9ydCB0eXBlIFBnQ29sdW1uID0ge1xuICBjb2x1bW5fbmFtZTogc3RyaW5nO1xuICBkYXRhX3R5cGU6IHN0cmluZztcbiAgdWR0X25hbWU6IHN0cmluZztcbiAgY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoOiBudW1iZXIgfCBudWxsO1xuICBwcmVjaXNpb246IG51bWJlciB8IG51bGw7XG4gIG51bWVyaWNfc2NhbGU6IG51bWJlciB8IG51bGw7XG4gIGlzX251bGxhYmxlOiBzdHJpbmc7XG4gIGNvbHVtbl9kZWZhdWx0OiBzdHJpbmcgfCBudWxsO1xuICBpc19nZW5lcmF0ZWQ6IHN0cmluZzsgLy8gJ3MnID0gU1RPUkVELCAndicgPSBWSVJUVUFMLCAnJyA9IG5vbmVcbiAgZ2VuZXJhdGlvbl9leHByZXNzaW9uOiBzdHJpbmcgfCBudWxsO1xufTtcblxudHlwZSBQZ0luZGV4ID0ge1xuICBpbmRleF9uYW1lOiBzdHJpbmc7XG4gIGNvbHVtbl9uYW1lOiBzdHJpbmc7XG4gIGlzX3VuaXF1ZTogYm9vbGVhbjtcbiAgaXNfcHJpbWFyeTogYm9vbGVhbjtcbiAgaW5kZXhfdHlwZTogc3RyaW5nO1xuICBudWxsc19maXJzdDogYm9vbGVhbjtcbiAgc29ydF9vcmRlcjogXCJBU0NcIiB8IFwiREVTQ1wiO1xuICBudWxsc19ub3RfZGlzdGluY3Q6IGJvb2xlYW47XG4gIGNvbHVtbl9vcmRlcjogbnVtYmVyO1xuICBpbmRleF9kZWZpbml0aW9uOiBzdHJpbmc7XG4gIHByZWRpY2F0ZT86IHN0cmluZyB8IG51bGw7XG59O1xuXG50eXBlIFBnRm9yZWlnbiA9IHtcbiAgY29uc3RyYWludF9uYW1lOiBzdHJpbmc7XG4gIGNvbHVtbl9uYW1lOiBzdHJpbmc7XG4gIGZvcmVpZ25fdGFibGVfbmFtZTogc3RyaW5nO1xuICBmb3JlaWduX2NvbHVtbl9uYW1lOiBzdHJpbmc7XG4gIHVwZGF0ZV9ydWxlOiBzdHJpbmc7XG4gIGRlbGV0ZV9ydWxlOiBzdHJpbmc7XG59O1xuXG50eXBlIFJhd0NhcGFibGVLbmV4ID0gUGljazxLbmV4LCBcInJhd1wiPjtcblxuY2xhc3MgUG9zdGdyZVNRTFNjaGVtYVJlYWRlckNsYXNzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBnZW5lcmljSW5kZXhUeXBlcyA9IG5ldyBTZXQoW1wiYnRyZWVcIiwgXCJoYXNoXCIsIFwiZ2luXCIsIFwiZ2lzdFwiLCBcInBncm9vbmdhXCJdKTtcblxuICAvKipcbiAgICogRELsl5DshJwg7YWM7J2067iUIOygleuztOulvCDsnb3slrTshJwgTWlncmF0aW9uU2V07J2EIOunjOuTpOyWtOyYteuLiOuLpC5cbiAgICogQHBhcmFtIGNvbXBhcmVEQiBLbmV4IOyduOyKpO2EtOyKpFxuICAgKiBAcGFyYW0gdGFibGUg7YWM7J2067iUIOydtOumhFxuICAgKiBAcmV0dXJucyBNaWdyYXRpb25TZXQg6rCd7LK0XG4gICAqL1xuICBhc3luYyBnZXRNaWdyYXRpb25TZXRGcm9tREIoXG4gICAgY29tcGFyZURCOiBSYXdDYXBhYmxlS25leCxcbiAgICB0YWJsZTogc3RyaW5nLFxuICApOiBQcm9taXNlPE1pZ3JhdGlvblNldCB8IG51bGw+IHtcbiAgICBsZXQgZGJDb2x1bW5zOiBQZ0NvbHVtbltdLCBkYkluZGV4ZXM6IFBnSW5kZXhbXSwgZGJGb3JlaWduczogUGdGb3JlaWduW107XG4gICAgdHJ5IHtcbiAgICAgIFtkYkNvbHVtbnMsIGRiSW5kZXhlcywgZGJGb3JlaWduc10gPSBhd2FpdCB0aGlzLnJlYWRUYWJsZShjb21wYXJlREIsIHRhYmxlKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUubWVzc2FnZS5pbmNsdWRlcyhcIlRhYmxlIG5vdCBmb3VuZFwiKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgLy8gdmVjdG9yIOy7rOufvOydmCBkaW1lbnNpb25zIOyhsO2ajFxuICAgIGNvbnN0IHZlY3RvckRpbWVuc2lvbnMgPSBhd2FpdCB0aGlzLmdldFZlY3RvckRpbWVuc2lvbnMoY29tcGFyZURCLCB0YWJsZSk7XG5cbiAgICBjb25zdCBjb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSA9IGRiQ29sdW1ucy5tYXAoKGRiQ29sdW1uKSA9PiB7XG4gICAgICBjb25zdCBkYkNvbFR5cGUgPSB0aGlzLnJlc29sdmVEQkNvbFR5cGUoZGJDb2x1bW4pO1xuXG4gICAgICAvLyB2ZWN0b3Ig7YOA7J6F7J24IOqyveyasCBkaW1lbnNpb25zIOyEpOyglVxuICAgICAgaWYgKGRiQ29sVHlwZS50eXBlID09PSBcInZlY3RvclwiKSB7XG4gICAgICAgIGRiQ29sVHlwZS5kaW1lbnNpb25zID0gdmVjdG9yRGltZW5zaW9uc1tkYkNvbHVtbi5jb2x1bW5fbmFtZV0gPz8gMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZGJDb2x1bW4uY29sdW1uX25hbWUsXG4gICAgICAgIG51bGxhYmxlOiBkYkNvbHVtbi5pc19udWxsYWJsZSA9PT0gXCJZRVNcIixcbiAgICAgICAgLi4uZGJDb2xUeXBlLFxuICAgICAgICAvLyBHZW5lcmF0ZWQgQ29sdW1uIOyymOumrFxuICAgICAgICAuLi4oKCkgPT4ge1xuICAgICAgICAgIGlmIChkYkNvbHVtbi5pc19nZW5lcmF0ZWQgPT09IFwic1wiIHx8IGRiQ29sdW1uLmlzX2dlbmVyYXRlZCA9PT0gXCJ2XCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgICAgIHR5cGU6IGRiQ29sdW1uLmlzX2dlbmVyYXRlZCA9PT0gXCJzXCIgPyBcIlNUT1JFRFwiIDogXCJWSVJUVUFMXCIsXG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogZGJDb2x1bW4uZ2VuZXJhdGlvbl9leHByZXNzaW9uID8/IFwiXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH0pKCksXG4gICAgICAgIC8vIERlZmF1bHQg6rCSIOyymOumrCAoR2VuZXJhdGVkIENvbHVtbuydtCDslYTri4wg6rK97Jqw66eMKVxuICAgICAgICAuLi4oKCkgPT4ge1xuICAgICAgICAgIC8vIEdlbmVyYXRlZCBDb2x1bW7snYAgZGVmYXVsdCDqsJLsnbQg7JeG7J2MXG4gICAgICAgICAgaWYgKGRiQ29sdW1uLmlzX2dlbmVyYXRlZCA9PT0gXCJzXCIgfHwgZGJDb2x1bW4uaXNfZ2VuZXJhdGVkID09PSBcInZcIikge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkYkNvbHVtbi5jb2x1bW5fZGVmYXVsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gUG9zdGdyZVNRTCBkZWZhdWx0IOqwkiDsoJXrpqwgKG5leHR2YWwsIENVUlJFTlRfVElNRVNUQU1QIOuTsSlcbiAgICAgICAgICAgIGxldCBkZWZhdWx0VmFsdWUgPSBkYkNvbHVtbi5jb2x1bW5fZGVmYXVsdDtcblxuICAgICAgICAgICAgLy8gbmV4dHZhbCDsoJzqsbAgKFNFUklBTCDtg4DsnoUpXG4gICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlLnN0YXJ0c1dpdGgoXCJuZXh0dmFsKFwiKSkge1xuICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIO2DgOyehSDsupDsiqTtjIUg7KCc6rGwICjsmIg6ICcxJzo6aW50ZWdlciDihpIgMSlcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZS5yZXBsYWNlKC86OltcXHdcXHNdKyQvZywgXCJcIik7XG5cbiAgICAgICAgICAgIC8vIOuUsOyYtO2RnOqwgCBzaW5nbGUgcXVvdGXsnbgg6rK97JqwIGRvdWJsZSBxdW90ZeuhnCDrs4DtmZhcbiAgICAgICAgICAgIGlmIChkZWZhdWx0VmFsdWUuc3RhcnRzV2l0aChcIidcIikgJiYgZGVmYXVsdFZhbHVlLmVuZHNXaXRoKFwiJ1wiKSkge1xuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWUucmVwbGFjZUFsbChcIidcIiwgJ1wiJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGRlZmF1bHRUbzogZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9KSgpLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIFBSSU1BUlkgS0VZ7JmAIGZvcmVpZ24ga2V57JqpIOyduOuNseyKpCDsoJzsmbhcbiAgICBjb25zdCBkYkluZGV4ZXNHcm91cCA9IGdyb3VwKFxuICAgICAgZGJJbmRleGVzLmZpbHRlcihcbiAgICAgICAgKGRiSW5kZXgpID0+XG4gICAgICAgICAgIWRiSW5kZXguaXNfcHJpbWFyeSAmJlxuICAgICAgICAgICFkYkZvcmVpZ25zLmZpbmQoKGRiRm9yZWlnbikgPT4gZGJJbmRleC5pbmRleF9uYW1lLmluY2x1ZGVzKGRiRm9yZWlnbi5jb25zdHJhaW50X25hbWUpKSxcbiAgICAgICksXG4gICAgICAoZGJJbmRleCkgPT4gZGJJbmRleC5pbmRleF9uYW1lLFxuICAgICk7XG5cbiAgICAvLyBpbmRleGVzIOyymOumrFxuICAgIGNvbnN0IGluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGluZGV4TmFtZSBvZiBPYmplY3Qua2V5cyhkYkluZGV4ZXNHcm91cCkpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleGVzID0gZGJJbmRleGVzR3JvdXBbaW5kZXhOYW1lXT8udG9Tb3J0ZWQoXG4gICAgICAgIChsZWZ0LCByaWdodCkgPT4gbGVmdC5jb2x1bW5fb3JkZXIgLSByaWdodC5jb2x1bW5fb3JkZXIsXG4gICAgICApO1xuICAgICAgYXNzZXJ0KGN1cnJlbnRJbmRleGVzKTtcblxuICAgICAgY29uc3QgZmlyc3RJbmRleCA9IGN1cnJlbnRJbmRleGVzWzBdO1xuICAgICAgY29uc3QgcGFyc2VkSW5kZXhEZWZpbml0aW9uID0gdGhpcy5wYXJzZUluZGV4RGVmaW5pdGlvbihmaXJzdEluZGV4LmluZGV4X2RlZmluaXRpb24pO1xuICAgICAgY29uc3QgcmVzdG9yZWRJbmRleFR5cGUgPSB0aGlzLnJlc3RvcmVNaWdyYXRpb25JbmRleFR5cGUoXG4gICAgICAgIGZpcnN0SW5kZXgsXG4gICAgICAgIHBhcnNlZEluZGV4RGVmaW5pdGlvbi5hY2Nlc3NNZXRob2QsXG4gICAgICApO1xuICAgICAgY29uc3QgdXNpbmcgPSB0aGlzLnJlc3RvcmVHZW5lcmljVXNpbmcoXG4gICAgICAgIHBhcnNlZEluZGV4RGVmaW5pdGlvbi5hY2Nlc3NNZXRob2QgPz8gZmlyc3RJbmRleC5pbmRleF90eXBlLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgaW5kZXhDb2x1bW5zOiBNaWdyYXRpb25JbmRleFtcImNvbHVtbnNcIl0gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgY3VycmVudEluZGV4IG9mIGN1cnJlbnRJbmRleGVzKSB7XG4gICAgICAgIGNvbnN0IG9wY2xhc3MgPSB0aGlzLmV4dHJhY3RJbmRleENvbHVtbk9wY2xhc3MoXG4gICAgICAgICAgcGFyc2VkSW5kZXhEZWZpbml0aW9uLmNvbHVtbkRlZmluaXRpb25zW2N1cnJlbnRJbmRleC5jb2x1bW5fb3JkZXIgLSAxXSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY29sdW1uOiBNaWdyYXRpb25JbmRleFtcImNvbHVtbnNcIl1bbnVtYmVyXSA9IHtcbiAgICAgICAgICBuYW1lOiBjdXJyZW50SW5kZXguY29sdW1uX25hbWUsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcGNsYXNzKSB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihjb2x1bW4sIHsgb3BjbGFzcyB9KTtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHVzaW5nKSB7XG4gICAgICAgICAgY2FzZSBcImJ0cmVlXCI6XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGNvbHVtbiwge1xuICAgICAgICAgICAgICBzb3J0T3JkZXI6IGN1cnJlbnRJbmRleC5zb3J0X29yZGVyLFxuICAgICAgICAgICAgICBudWxsc0ZpcnN0OiBjdXJyZW50SW5kZXgubnVsbHNfZmlyc3QsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4Q29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICB9XG4gICAgICBjb25zdCBpbmRleDogTWlncmF0aW9uSW5kZXggPSB7XG4gICAgICAgIHR5cGU6IHJlc3RvcmVkSW5kZXhUeXBlLFxuICAgICAgICBuYW1lOiBpbmRleE5hbWUsXG4gICAgICAgIGNvbHVtbnM6IGluZGV4Q29sdW1ucyxcbiAgICAgICAgbnVsbHNOb3REaXN0aW5jdDogZmlyc3RJbmRleC5udWxsc19ub3RfZGlzdGluY3QsXG4gICAgICAgIC4uLnRoaXMucGFyc2VWZWN0b3JJbmRleE9wdGlvbnMocmVzdG9yZWRJbmRleFR5cGUsIHBhcnNlZEluZGV4RGVmaW5pdGlvbi53aXRoT3B0aW9ucyksXG4gICAgICB9O1xuICAgICAgaWYgKGZpcnN0SW5kZXgucHJlZGljYXRlKSB7XG4gICAgICAgIGluZGV4LndoZXJlID0gZmlyc3RJbmRleC5wcmVkaWNhdGU7XG4gICAgICB9XG4gICAgICBpZiAodXNpbmcpIHtcbiAgICAgICAgaW5kZXgudXNpbmcgPSB1c2luZztcbiAgICAgIH1cbiAgICAgIGluZGV4ZXMucHVzaChpbmRleCk7XG4gICAgfVxuXG4gICAgLy8gZm9yZWlnbnMg7LKY66asXG4gICAgY29uc3QgZm9yZWlnbnM6IE1pZ3JhdGlvbkZvcmVpZ25bXSA9IGRiRm9yZWlnbnMubWFwKChkYkZvcmVpZ24pID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbHVtbnM6IFtkYkZvcmVpZ24uY29sdW1uX25hbWVdLFxuICAgICAgICB0bzogYCR7ZGJGb3JlaWduLmZvcmVpZ25fdGFibGVfbmFtZX0uJHtkYkZvcmVpZ24uZm9yZWlnbl9jb2x1bW5fbmFtZX1gLFxuICAgICAgICBvblVwZGF0ZTogdGhpcy5tYXBDb25zdHJhaW50QWN0aW9uKGRiRm9yZWlnbi51cGRhdGVfcnVsZSksXG4gICAgICAgIG9uRGVsZXRlOiB0aGlzLm1hcENvbnN0cmFpbnRBY3Rpb24oZGJGb3JlaWduLmRlbGV0ZV9ydWxlKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGFibGUsXG4gICAgICBjb2x1bW5zLFxuICAgICAgaW5kZXhlcyxcbiAgICAgIGZvcmVpZ25zLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUG9zdGdyZVNRTOydmCBjb25zdHJhaW50IGFjdGlvbuydhCBLbmV4IO2YleyLneycvOuhnCDrs4DtmZhcbiAgICovXG4gIHByaXZhdGUgbWFwQ29uc3RyYWludEFjdGlvbihhY3Rpb246IHN0cmluZyk6IFJlbGF0aW9uT24ge1xuICAgIGNvbnN0IGFjdGlvbk1hcCA9IG5ldyBNYXA8c3RyaW5nLCBSZWxhdGlvbk9uPihbXG4gICAgICBbXCJOTyBBQ1RJT05cIiwgXCJOTyBBQ1RJT05cIl0sXG4gICAgICBbXCJSRVNUUklDVFwiLCBcIlJFU1RSSUNUXCJdLFxuICAgICAgW1wiQ0FTQ0FERVwiLCBcIkNBU0NBREVcIl0sXG4gICAgICBbXCJTRVQgTlVMTFwiLCBcIlNFVCBOVUxMXCJdLFxuICAgICAgW1wiU0VUIERFRkFVTFRcIiwgXCJTRVQgREVGQVVMVFwiXSxcbiAgICBdKTtcbiAgICByZXR1cm4gYWN0aW9uTWFwLmdldChhY3Rpb24pID8/IFwiTk8gQUNUSU9OXCI7XG4gIH1cblxuICAvKipcbiAgICog6riw7KG0IO2FjOydtOu4lCDsnb3slrTshJwgY29scywgaW5kZXhlcywgZm9yZWlnbnMg67CY7ZmYXG4gICAqL1xuICBhc3luYyByZWFkVGFibGUoXG4gICAgY29tcGFyZURCOiBSYXdDYXBhYmxlS25leCxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxbUGdDb2x1bW5bXSwgUGdJbmRleFtdLCBQZ0ZvcmVpZ25bXV0+IHtcbiAgICAvLyBDb2x1bW5zIOyhsO2ajCAoR2VuZXJhdGVkIENvbHVtbiDsoJXrs7Qg7Y+s7ZWoKVxuICAgIGNvbnN0IGNvbHVtbnNRdWVyeSA9IGBcbiAgICAgIFNFTEVDVFxuICAgICAgICBjLmNvbHVtbl9uYW1lLFxuICAgICAgICBjLmRhdGFfdHlwZSxcbiAgICAgICAgYy51ZHRfbmFtZSxcbiAgICAgICAgQ09BTEVTQ0UoXG4gICAgICAgICAgYy5jaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGgsXG4gICAgICAgICAgQ0FTRSBXSEVOIGMuZGF0YV90eXBlID0gJ0FSUkFZJyBBTkQgYS5hdHR0eXBtb2QgPiAwXG4gICAgICAgICAgICBUSEVOIGEuYXR0dHlwbW9kIC0gNFxuICAgICAgICAgICAgRUxTRSBOVUxMXG4gICAgICAgICAgRU5EXG4gICAgICAgICkgQVMgY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoLFxuICAgICAgICBDT0FMRVNDRShjLmRhdGV0aW1lX3ByZWNpc2lvbiwgYy5udW1lcmljX3ByZWNpc2lvbikgQVMgcHJlY2lzaW9uLFxuICAgICAgICBjLm51bWVyaWNfc2NhbGUsXG4gICAgICAgIGMuaXNfbnVsbGFibGUsXG4gICAgICAgIGMuY29sdW1uX2RlZmF1bHQsXG4gICAgICAgIENPQUxFU0NFKGEuYXR0Z2VuZXJhdGVkLCAnJykgYXMgaXNfZ2VuZXJhdGVkLFxuICAgICAgICBjLmdlbmVyYXRpb25fZXhwcmVzc2lvblxuICAgICAgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuY29sdW1ucyBjXG4gICAgICBMRUZUIEpPSU4gcGdfYXR0cmlidXRlIGEgT04gYS5hdHRuYW1lID0gYy5jb2x1bW5fbmFtZVxuICAgICAgICBBTkQgYS5hdHRyZWxpZCA9IChcbiAgICAgICAgICBTRUxFQ1Qgb2lkIEZST00gcGdfY2xhc3MgV0hFUkUgcmVsbmFtZSA9IGMudGFibGVfbmFtZVxuICAgICAgICAgIEFORCByZWxuYW1lc3BhY2UgPSAoU0VMRUNUIG9pZCBGUk9NIHBnX25hbWVzcGFjZSBXSEVSRSBuc3BuYW1lID0gYy50YWJsZV9zY2hlbWEpXG4gICAgICAgIClcbiAgICAgIFdIRVJFIGMudGFibGVfbmFtZSA9ID9cbiAgICAgICAgQU5EIGMudGFibGVfc2NoZW1hID0gJ3B1YmxpYydcbiAgICAgIE9SREVSIEJZIGMub3JkaW5hbF9wb3NpdGlvblxuICAgIGA7XG4gICAgY29uc3QgY29sdW1ucyA9IC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgYXdhaXQgY29tcGFyZURCLnJhdyhjb2x1bW5zUXVlcnksIFt0YWJsZU5hbWVdKVxuICAgICkucm93cyBhcyBQZ0NvbHVtbltdO1xuICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBub3QgZm91bmQ6ICR7dGFibGVOYW1lfWApO1xuICAgIH1cblxuICAgIC8vIEluZGV4ZXMg7KGw7ZqMIChQR3Jvb25nYSDtkZztmITsi50g7J24642x7IqkIO2PrO2VqClcbiAgICBjb25zdCBpbmRleGVzUXVlcnkgPSBgXG4gICAgICBTRUxFQ1RcbiAgICAgICAgICBpLnJlbG5hbWUgQVMgaW5kZXhfbmFtZSxcbiAgICAgICAgICBDQVNFXG4gICAgICAgICAgICAgIFdIRU4gYW0uYW1uYW1lID0gJ3Bncm9vbmdhJyBBTkQgdS5hdHRudW0gPSAwIFRIRU5cbiAgICAgICAgICAgICAgICAgIHJlZ2V4cF9yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4cF9yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBUUklNKHBncm9vbmdhX2NvbC5jb2x1bW5fZXhwciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICc6OnRleHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAnWygpXScsXG4gICAgICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAgICAgJ2cnXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIEVMU0UgYS5hdHRuYW1lXG4gICAgICAgICAgRU5EIEFTIGNvbHVtbl9uYW1lLFxuICAgICAgICAgIGl4LmluZGlzdW5pcXVlIEFTIGlzX3VuaXF1ZSxcbiAgICAgICAgICBpeC5pbmRpc3ByaW1hcnkgQVMgaXNfcHJpbWFyeSxcbiAgICAgICAgICBhbS5hbW5hbWUgQVMgaW5kZXhfdHlwZSxcbiAgICAgICAgICBDT0FMRVNDRSgodS5vcHQgJiAyKSA9IDIsIEZBTFNFKSBBUyBudWxsc19maXJzdCxcbiAgICAgICAgICBDQVNFIFxuICAgICAgICAgICAgICBXSEVOICh1Lm9wdCAmIDEpID0gMSBUSEVOICdERVNDJ1xuICAgICAgICAgICAgICBFTFNFICdBU0MnXG4gICAgICAgICAgRU5EIEFTIHNvcnRfb3JkZXIsXG4gICAgICAgICAgaXguaW5kbnVsbHNub3RkaXN0aW5jdCBBUyBudWxsc19ub3RfZGlzdGluY3QsXG4gICAgICAgICAgdS5vcmQgQVMgY29sdW1uX29yZGVyLFxuICAgICAgICAgIHBnX2dldF9pbmRleGRlZihpeC5pbmRleHJlbGlkKSBBUyBpbmRleF9kZWZpbml0aW9uLFxuICAgICAgICAgIHBnX2dldF9leHByKGl4LmluZHByZWQsIGl4LmluZHJlbGlkKSBBUyBwcmVkaWNhdGVcbiAgICAgIEZST00gcGdfY2xhc3MgdFxuICAgICAgSk9JTiBwZ19pbmRleCBpeCBPTiB0Lm9pZCA9IGl4LmluZHJlbGlkXG4gICAgICBKT0lOIHBnX2NsYXNzIGkgT04gaS5vaWQgPSBpeC5pbmRleHJlbGlkXG4gICAgICBKT0lOIHBnX2FtIGFtIE9OIGkucmVsYW0gPSBhbS5vaWRcbiAgICAgIEpPSU4gTEFURVJBTCB1bm5lc3QoaXguaW5ka2V5LCBpeC5pbmRvcHRpb24pXG4gICAgICAgICAgV0lUSCBPUkRJTkFMSVRZIEFTIHUoYXR0bnVtLCBvcHQsIG9yZCkgT04gdHJ1ZVxuICAgICAgTEVGVCBKT0lOIHBnX2F0dHJpYnV0ZSBhIE9OIGEuYXR0cmVsaWQgPSB0Lm9pZCBcbiAgICAgICAgICBBTkQgYS5hdHRudW0gPSB1LmF0dG51bSBcbiAgICAgICAgICBBTkQgdS5hdHRudW0gPiAwXG4gICAgICBMRUZUIEpPSU4gTEFURVJBTCAoXG4gICAgICAgICAgU0VMRUNUIFxuICAgICAgICAgICAgICB1bm5lc3QoXG4gICAgICAgICAgICAgICAgICBDQVNFIFxuICAgICAgICAgICAgICAgICAgICAgIFdIRU4gcGdfZ2V0X2V4cHIoaXguaW5kZXhwcnMsIGl4LmluZHJlbGlkKSB+ICdeQVJSQVlcXFxcWycgVEhFTlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdG9fYXJyYXkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleHBfcmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfZXhwcihpeC5pbmRleHBycywgaXguaW5kcmVsaWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdeQVJSQVlcXFxcWyguKilcXFxcXSQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXFxcMSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICBFTFNFXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZW3BnX2dldF9leHByKGl4LmluZGV4cHJzLCBpeC5pbmRyZWxpZCldXG4gICAgICAgICAgICAgICAgICBFTkRcbiAgICAgICAgICAgICAgKSBhcyBjb2x1bW5fZXhwclxuICAgICAgKSBwZ3Jvb25nYV9jb2wgT04gYW0uYW1uYW1lID0gJ3Bncm9vbmdhJyBBTkQgdS5hdHRudW0gPSAwXG4gICAgICBXSEVSRSB0LnJlbG5hbWUgPSA/XG4gICAgICAgICAgQU5EICh1LmF0dG51bSA+IDAgT1IgKGFtLmFtbmFtZSA9ICdwZ3Jvb25nYScgQU5EIHUuYXR0bnVtID0gMCkpXG4gICAgICBPUkRFUiBCWSBpLnJlbG5hbWUsIHUub3JkO1xuYDtcbiAgICBjb25zdCBpbmRleGVzID0gKGF3YWl0IGNvbXBhcmVEQi5yYXcoaW5kZXhlc1F1ZXJ5LCBbdGFibGVOYW1lXSkpLnJvd3M7XG5cbiAgICAvLyBGb3JlaWduIEtleXMg7KGw7ZqMXG4gICAgY29uc3QgZm9yZWlnbnNRdWVyeSA9IGBcbiAgICAgIFNFTEVDVFxuICAgICAgICB0Yy5jb25zdHJhaW50X25hbWUsXG4gICAgICAgIGtjdS5jb2x1bW5fbmFtZSxcbiAgICAgICAgY2N1LnRhYmxlX25hbWUgQVMgZm9yZWlnbl90YWJsZV9uYW1lLFxuICAgICAgICBjY3UuY29sdW1uX25hbWUgQVMgZm9yZWlnbl9jb2x1bW5fbmFtZSxcbiAgICAgICAgcmMudXBkYXRlX3J1bGUsXG4gICAgICAgIHJjLmRlbGV0ZV9ydWxlXG4gICAgICBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZV9jb25zdHJhaW50cyBBUyB0Y1xuICAgICAgSk9JTiBpbmZvcm1hdGlvbl9zY2hlbWEua2V5X2NvbHVtbl91c2FnZSBBUyBrY3VcbiAgICAgICAgT04gdGMuY29uc3RyYWludF9uYW1lID0ga2N1LmNvbnN0cmFpbnRfbmFtZVxuICAgICAgICBBTkQgdGMudGFibGVfc2NoZW1hID0ga2N1LnRhYmxlX3NjaGVtYVxuICAgICAgSk9JTiBpbmZvcm1hdGlvbl9zY2hlbWEuY29uc3RyYWludF9jb2x1bW5fdXNhZ2UgQVMgY2N1XG4gICAgICAgIE9OIGNjdS5jb25zdHJhaW50X25hbWUgPSB0Yy5jb25zdHJhaW50X25hbWVcbiAgICAgICAgQU5EIGNjdS50YWJsZV9zY2hlbWEgPSB0Yy50YWJsZV9zY2hlbWFcbiAgICAgIEpPSU4gaW5mb3JtYXRpb25fc2NoZW1hLnJlZmVyZW50aWFsX2NvbnN0cmFpbnRzIEFTIHJjXG4gICAgICAgIE9OIHJjLmNvbnN0cmFpbnRfbmFtZSA9IHRjLmNvbnN0cmFpbnRfbmFtZVxuICAgICAgICBBTkQgcmMuY29uc3RyYWludF9zY2hlbWEgPSB0Yy50YWJsZV9zY2hlbWFcbiAgICAgIFdIRVJFIHRjLmNvbnN0cmFpbnRfdHlwZSA9ICdGT1JFSUdOIEtFWSdcbiAgICAgICAgQU5EIHRjLnRhYmxlX25hbWUgPSA/XG4gICAgYDtcbiAgICBjb25zdCBmb3JlaWducyA9IChhd2FpdCBjb21wYXJlREIucmF3KGZvcmVpZ25zUXVlcnksIFt0YWJsZU5hbWVdKSkucm93cztcblxuICAgIHJldHVybiBbY29sdW1ucywgaW5kZXhlcywgZm9yZWlnbnNdO1xuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlTWlncmF0aW9uSW5kZXhUeXBlKFxuICAgIGluZGV4OiBQaWNrPFBnSW5kZXgsIFwiaXNfdW5pcXVlXCIgfCBcImluZGV4X3R5cGVcIj4sXG4gICAgYWNjZXNzTWV0aG9kPzogc3RyaW5nLFxuICApOiBNaWdyYXRpb25JbmRleFtcInR5cGVcIl0ge1xuICAgIGNvbnN0IHJlc29sdmVkQWNjZXNzTWV0aG9kID0gKGFjY2Vzc01ldGhvZCA/PyBpbmRleC5pbmRleF90eXBlKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKHJlc29sdmVkQWNjZXNzTWV0aG9kID09PSBcImhuc3dcIiB8fCByZXNvbHZlZEFjY2Vzc01ldGhvZCA9PT0gXCJpdmZmbGF0XCIpIHtcbiAgICAgIHJldHVybiByZXNvbHZlZEFjY2Vzc01ldGhvZDtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5kZXguaXNfdW5pcXVlID8gXCJ1bmlxdWVcIiA6IFwiaW5kZXhcIjtcbiAgfVxuXG4gIHByaXZhdGUgcmVzdG9yZUdlbmVyaWNVc2luZyhcbiAgICBhY2Nlc3NNZXRob2Q6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgKTogTWlncmF0aW9uSW5kZXhbXCJ1c2luZ1wiXSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFhY2Nlc3NNZXRob2QpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IGFjY2Vzc01ldGhvZC50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICghdGhpcy5nZW5lcmljSW5kZXhUeXBlcy5oYXMobm9ybWFsaXplZCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gbm9ybWFsaXplZCBhcyBNaWdyYXRpb25JbmRleFtcInVzaW5nXCJdO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVZlY3RvckluZGV4T3B0aW9ucyhcbiAgICB0eXBlOiBNaWdyYXRpb25JbmRleFtcInR5cGVcIl0sXG4gICAgd2l0aE9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICk6IFBpY2s8TWlncmF0aW9uSW5kZXgsIFwibVwiIHwgXCJlZkNvbnN0cnVjdGlvblwiIHwgXCJsaXN0c1wiPiB7XG4gICAgaWYgKHR5cGUgPT09IFwiaG5zd1wiKSB7XG4gICAgICBjb25zdCBvcHRpb25zOiBQaWNrPE1pZ3JhdGlvbkluZGV4LCBcIm1cIiB8IFwiZWZDb25zdHJ1Y3Rpb25cIj4gPSB7fTtcbiAgICAgIGNvbnN0IG0gPSB0aGlzLnBhcnNlSW50ZWdlck9wdGlvbih3aXRoT3B0aW9ucy5tKTtcbiAgICAgIGNvbnN0IGVmQ29uc3RydWN0aW9uID0gdGhpcy5wYXJzZUludGVnZXJPcHRpb24od2l0aE9wdGlvbnMuZWZfY29uc3RydWN0aW9uKTtcbiAgICAgIGlmIChtICE9PSB1bmRlZmluZWQpIG9wdGlvbnMubSA9IG07XG4gICAgICBpZiAoZWZDb25zdHJ1Y3Rpb24gIT09IHVuZGVmaW5lZCkgb3B0aW9ucy5lZkNvbnN0cnVjdGlvbiA9IGVmQ29uc3RydWN0aW9uO1xuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09IFwiaXZmZmxhdFwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUludGVnZXJPcHRpb24od2l0aE9wdGlvbnMubGlzdHMpICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB7IGxpc3RzOiB0aGlzLnBhcnNlSW50ZWdlck9wdGlvbih3aXRoT3B0aW9ucy5saXN0cykgfVxuICAgICAgICA6IHt9O1xuICAgIH1cblxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VJbnRlZ2VyT3B0aW9uKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgcmV0dXJuIE51bWJlci5pc05hTihwYXJzZWQpID8gdW5kZWZpbmVkIDogcGFyc2VkO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0SW5kZXhDb2x1bW5PcGNsYXNzKGNvbHVtbkRlZmluaXRpb246IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFjb2x1bW5EZWZpbml0aW9uKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHRyaW1tZWQgPSBjb2x1bW5EZWZpbml0aW9uXG4gICAgICAucmVwbGFjZSgvXFxzK05VTExTXFxzKyhGSVJTVHxMQVNUKVxccyokL2ksIFwiXCIpXG4gICAgICAucmVwbGFjZSgvXFxzKyhBU0N8REVTQylcXHMqJC9pLCBcIlwiKVxuICAgICAgLnRyaW0oKTtcbiAgICBjb25zdCB0b2tlbnMgPSB0aGlzLnRva2VuaXplVG9wTGV2ZWwodHJpbW1lZCk7XG5cbiAgICBpZiAodG9rZW5zLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMl0/LnRvVXBwZXJDYXNlKCkgPT09IFwiQ09MTEFURVwiKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB0b2tlbnMuYXQoLTEpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUluZGV4RGVmaW5pdGlvbihpbmRleERlZmluaXRpb246IHN0cmluZykge1xuICAgIGNvbnN0IGFjY2Vzc01ldGhvZCA9IGluZGV4RGVmaW5pdGlvbi5tYXRjaCgvXFxiVVNJTkdcXHMrKFthLXpfXVtcXHddKikvaSk/LlsxXT8udG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCB1c2luZ01hdGNoSW5kZXggPSBpbmRleERlZmluaXRpb24uc2VhcmNoKC9cXGJVU0lOR1xcYi9pKTtcbiAgICBjb25zdCBjb2x1bW5zU3RhcnQgPSB1c2luZ01hdGNoSW5kZXggPj0gMCA/IGluZGV4RGVmaW5pdGlvbi5pbmRleE9mKFwiKFwiLCB1c2luZ01hdGNoSW5kZXgpIDogLTE7XG4gICAgY29uc3QgY29sdW1uc0VuZCA9XG4gICAgICBjb2x1bW5zU3RhcnQgPj0gMCA/IHRoaXMuZmluZE1hdGNoaW5nUGFyZW50aGVzaXMoaW5kZXhEZWZpbml0aW9uLCBjb2x1bW5zU3RhcnQpIDogLTE7XG4gICAgY29uc3QgY29sdW1uRGVmaW5pdGlvbnMgPVxuICAgICAgY29sdW1uc1N0YXJ0ID49IDAgJiYgY29sdW1uc0VuZCA+IGNvbHVtbnNTdGFydFxuICAgICAgICA/IHRoaXMuc3BsaXRUb3BMZXZlbChpbmRleERlZmluaXRpb24uc2xpY2UoY29sdW1uc1N0YXJ0ICsgMSwgY29sdW1uc0VuZCksIFwiLFwiKVxuICAgICAgICA6IFtdO1xuXG4gICAgY29uc3Qgd2l0aE1hdGNoID0gL1xcYldJVEhcXHMqXFwoL2kuZXhlYyhpbmRleERlZmluaXRpb24pO1xuICAgIGNvbnN0IHdpdGhTdGFydCA9IHdpdGhNYXRjaCA/IGluZGV4RGVmaW5pdGlvbi5pbmRleE9mKFwiKFwiLCB3aXRoTWF0Y2guaW5kZXgpIDogLTE7XG4gICAgY29uc3Qgd2l0aEVuZCA9IHdpdGhTdGFydCA+PSAwID8gdGhpcy5maW5kTWF0Y2hpbmdQYXJlbnRoZXNpcyhpbmRleERlZmluaXRpb24sIHdpdGhTdGFydCkgOiAtMTtcbiAgICBjb25zdCB3aXRoT3B0aW9ucyA9XG4gICAgICB3aXRoU3RhcnQgPj0gMCAmJiB3aXRoRW5kID4gd2l0aFN0YXJ0XG4gICAgICAgID8gdGhpcy5wYXJzZUluZGV4T3B0aW9uRW50cmllcyhpbmRleERlZmluaXRpb24uc2xpY2Uod2l0aFN0YXJ0ICsgMSwgd2l0aEVuZCkpXG4gICAgICAgIDoge307XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWNjZXNzTWV0aG9kLFxuICAgICAgY29sdW1uRGVmaW5pdGlvbnMsXG4gICAgICB3aXRoT3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUluZGV4T3B0aW9uRW50cmllcyhvcHRpb25Tb3VyY2U6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnNwbGl0VG9wTGV2ZWwob3B0aW9uU291cmNlLCBcIixcIikucmVkdWNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KChyZXN1bHQsIGVudHJ5KSA9PiB7XG4gICAgICBjb25zdCBtYXRjaGVkID0gZW50cnkudHJpbSgpLm1hdGNoKC9eKFthLXpfXVtcXHddKilcXHMqPVxccyooLispJC9pKTtcbiAgICAgIGlmICghbWF0Y2hlZCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBbLCBrZXksIHJhd1ZhbHVlXSA9IG1hdGNoZWQ7XG4gICAgICByZXN1bHRba2V5LnRvTG93ZXJDYXNlKCldID0gcmF3VmFsdWUudHJpbSgpLnJlcGxhY2UoL15bJ1wiXXxbJ1wiXSQvZywgXCJcIik7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3BsaXRUb3BMZXZlbChzb3VyY2U6IHN0cmluZywgZGVsaW1pdGVyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgaXRlbXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBsZXQgcGFyZW5EZXB0aCA9IDA7XG4gICAgbGV0IGJyYWNrZXREZXB0aCA9IDA7XG4gICAgbGV0IGluU2luZ2xlUXVvdGUgPSBmYWxzZTtcbiAgICBsZXQgaW5Eb3VibGVRdW90ZSA9IGZhbHNlO1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNvdXJjZS5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IGNoYXIgPSBzb3VyY2VbaW5kZXhdO1xuICAgICAgY29uc3QgbmV4dENoYXIgPSBzb3VyY2VbaW5kZXggKyAxXTtcblxuICAgICAgaWYgKGNoYXIgPT09IFwiJ1wiICYmICFpbkRvdWJsZVF1b3RlKSB7XG4gICAgICAgIGlmIChpblNpbmdsZVF1b3RlICYmIG5leHRDaGFyID09PSBcIidcIikge1xuICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5TaW5nbGVRdW90ZSA9ICFpblNpbmdsZVF1b3RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09ICdcIicgJiYgIWluU2luZ2xlUXVvdGUpIHtcbiAgICAgICAgaWYgKGluRG91YmxlUXVvdGUgJiYgbmV4dENoYXIgPT09ICdcIicpIHtcbiAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGluRG91YmxlUXVvdGUgPSAhaW5Eb3VibGVRdW90ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpblNpbmdsZVF1b3RlIHx8IGluRG91YmxlUXVvdGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSBcIihcIikge1xuICAgICAgICBwYXJlbkRlcHRoICs9IDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYXIgPT09IFwiKVwiKSB7XG4gICAgICAgIHBhcmVuRGVwdGggLT0gMTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhciA9PT0gXCJbXCIpIHtcbiAgICAgICAgYnJhY2tldERlcHRoICs9IDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYXIgPT09IFwiXVwiKSB7XG4gICAgICAgIGJyYWNrZXREZXB0aCAtPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09IGRlbGltaXRlciAmJiBwYXJlbkRlcHRoID09PSAwICYmIGJyYWNrZXREZXB0aCA9PT0gMCkge1xuICAgICAgICBpdGVtcy5wdXNoKHNvdXJjZS5zbGljZShzdGFydCwgaW5kZXgpLnRyaW0oKSk7XG4gICAgICAgIHN0YXJ0ID0gaW5kZXggKyAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRhaWwgPSBzb3VyY2Uuc2xpY2Uoc3RhcnQpLnRyaW0oKTtcbiAgICBpZiAodGFpbC5sZW5ndGggPiAwKSB7XG4gICAgICBpdGVtcy5wdXNoKHRhaWwpO1xuICAgIH1cblxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIHByaXZhdGUgdG9rZW5pemVUb3BMZXZlbChzb3VyY2U6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB0b2tlbnM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHN0YXJ0ID0gLTE7XG4gICAgbGV0IHBhcmVuRGVwdGggPSAwO1xuICAgIGxldCBicmFja2V0RGVwdGggPSAwO1xuICAgIGxldCBpblNpbmdsZVF1b3RlID0gZmFsc2U7XG4gICAgbGV0IGluRG91YmxlUXVvdGUgPSBmYWxzZTtcblxuICAgIGNvbnN0IHB1c2hUb2tlbiA9IChlbmRJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdG9rZW4gPSBzb3VyY2Uuc2xpY2Uoc3RhcnQsIGVuZEluZGV4KS50cmltKCk7XG4gICAgICBpZiAodG9rZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICB9XG4gICAgICBzdGFydCA9IC0xO1xuICAgIH07XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc291cmNlLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgY29uc3QgY2hhciA9IHNvdXJjZVtpbmRleF07XG4gICAgICBjb25zdCBuZXh0Q2hhciA9IHNvdXJjZVtpbmRleCArIDFdO1xuXG4gICAgICBpZiAoY2hhciA9PT0gXCInXCIgJiYgIWluRG91YmxlUXVvdGUpIHtcbiAgICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICAgIHN0YXJ0ID0gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluU2luZ2xlUXVvdGUgJiYgbmV4dENoYXIgPT09IFwiJ1wiKSB7XG4gICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpblNpbmdsZVF1b3RlID0gIWluU2luZ2xlUXVvdGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gJ1wiJyAmJiAhaW5TaW5nbGVRdW90ZSkge1xuICAgICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgICAgc3RhcnQgPSBpbmRleDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5Eb3VibGVRdW90ZSAmJiBuZXh0Q2hhciA9PT0gJ1wiJykge1xuICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5Eb3VibGVRdW90ZSA9ICFpbkRvdWJsZVF1b3RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpblNpbmdsZVF1b3RlICYmICFpbkRvdWJsZVF1b3RlKSB7XG4gICAgICAgIGlmIChjaGFyID09PSBcIihcIikge1xuICAgICAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gaW5kZXg7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhcmVuRGVwdGggKz0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhciA9PT0gXCIpXCIpIHtcbiAgICAgICAgICBwYXJlbkRlcHRoIC09IDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXIgPT09IFwiW1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICAgICAgc3RhcnQgPSBpbmRleDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJhY2tldERlcHRoICs9IDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXIgPT09IFwiXVwiKSB7XG4gICAgICAgICAgYnJhY2tldERlcHRoIC09IDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoL1xccy8udGVzdChjaGFyKSAmJiBwYXJlbkRlcHRoID09PSAwICYmIGJyYWNrZXREZXB0aCA9PT0gMCkge1xuICAgICAgICAgIHB1c2hUb2tlbihpbmRleCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICBzdGFydCA9IGluZGV4O1xuICAgICAgfVxuICAgIH1cblxuICAgIHB1c2hUb2tlbihzb3VyY2UubGVuZ3RoKTtcbiAgICByZXR1cm4gdG9rZW5zO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kTWF0Y2hpbmdQYXJlbnRoZXNpcyhzb3VyY2U6IHN0cmluZywgb3BlbkluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGxldCBkZXB0aCA9IDA7XG4gICAgbGV0IGluU2luZ2xlUXVvdGUgPSBmYWxzZTtcbiAgICBsZXQgaW5Eb3VibGVRdW90ZSA9IGZhbHNlO1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSBvcGVuSW5kZXg7IGluZGV4IDwgc291cmNlLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgY29uc3QgY2hhciA9IHNvdXJjZVtpbmRleF07XG4gICAgICBjb25zdCBuZXh0Q2hhciA9IHNvdXJjZVtpbmRleCArIDFdO1xuXG4gICAgICBpZiAoY2hhciA9PT0gXCInXCIgJiYgIWluRG91YmxlUXVvdGUpIHtcbiAgICAgICAgaWYgKGluU2luZ2xlUXVvdGUgJiYgbmV4dENoYXIgPT09IFwiJ1wiKSB7XG4gICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpblNpbmdsZVF1b3RlID0gIWluU2luZ2xlUXVvdGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gJ1wiJyAmJiAhaW5TaW5nbGVRdW90ZSkge1xuICAgICAgICBpZiAoaW5Eb3VibGVRdW90ZSAmJiBuZXh0Q2hhciA9PT0gJ1wiJykge1xuICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5Eb3VibGVRdW90ZSA9ICFpbkRvdWJsZVF1b3RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluU2luZ2xlUXVvdGUgfHwgaW5Eb3VibGVRdW90ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09IFwiKFwiKSB7XG4gICAgICAgIGRlcHRoICs9IDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gXCIpXCIpIHtcbiAgICAgICAgZGVwdGggLT0gMTtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIO2KueyglSDthYzsnbTruJTsnZggUEvrpbwg7LC47KGw7ZWY64qUIOuLpOuluCDthYzsnbTruJTsnZggRksg66qp66Gd7J2EIOyhsO2ajO2VqeuLiOuLpC5cbiAgICogUEsg7YOA7J6FIOuzgOqyvSDsi5wg6rSA66CoIEZLIOygnOyVveyhsOqxtOydhCDsgq3soJwv67O16rWs7ZWY6riwIOychO2VtCDsgqzsmqnrkKnri4jri6QuXG4gICAqL1xuICBhc3luYyBnZXRSZWZlcmVuY2luZ0ZvcmVpZ25LZXlzKGRiOiBLbmV4LCB0YWJsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVmZXJlbmNpbmdGb3JlaWduS2V5W10+IHtcbiAgICBjb25zdCBxdWVyeSA9IGBcbiAgICAgIFNFTEVDVFxuICAgICAgICB0Yy50YWJsZV9uYW1lLFxuICAgICAgICB0Yy5jb25zdHJhaW50X25hbWUsXG4gICAgICAgIGtjdS5jb2x1bW5fbmFtZSxcbiAgICAgICAgY2N1LnRhYmxlX25hbWUgQVMgcmVmZXJlbmNlZF90YWJsZV9uYW1lLFxuICAgICAgICBjY3UuY29sdW1uX25hbWUgQVMgcmVmZXJlbmNlZF9jb2x1bW5fbmFtZSxcbiAgICAgICAgcmMudXBkYXRlX3J1bGUsXG4gICAgICAgIHJjLmRlbGV0ZV9ydWxlXG4gICAgICBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZV9jb25zdHJhaW50cyBBUyB0Y1xuICAgICAgSk9JTiBpbmZvcm1hdGlvbl9zY2hlbWEua2V5X2NvbHVtbl91c2FnZSBBUyBrY3VcbiAgICAgICAgT04gdGMuY29uc3RyYWludF9uYW1lID0ga2N1LmNvbnN0cmFpbnRfbmFtZVxuICAgICAgICBBTkQgdGMudGFibGVfc2NoZW1hID0ga2N1LnRhYmxlX3NjaGVtYVxuICAgICAgSk9JTiBpbmZvcm1hdGlvbl9zY2hlbWEuY29uc3RyYWludF9jb2x1bW5fdXNhZ2UgQVMgY2N1XG4gICAgICAgIE9OIGNjdS5jb25zdHJhaW50X25hbWUgPSB0Yy5jb25zdHJhaW50X25hbWVcbiAgICAgICAgQU5EIGNjdS50YWJsZV9zY2hlbWEgPSB0Yy50YWJsZV9zY2hlbWFcbiAgICAgIEpPSU4gaW5mb3JtYXRpb25fc2NoZW1hLnJlZmVyZW50aWFsX2NvbnN0cmFpbnRzIEFTIHJjXG4gICAgICAgIE9OIHJjLmNvbnN0cmFpbnRfbmFtZSA9IHRjLmNvbnN0cmFpbnRfbmFtZVxuICAgICAgICBBTkQgcmMuY29uc3RyYWludF9zY2hlbWEgPSB0Yy50YWJsZV9zY2hlbWFcbiAgICAgIFdIRVJFIHRjLmNvbnN0cmFpbnRfdHlwZSA9ICdGT1JFSUdOIEtFWSdcbiAgICAgICAgQU5EIGNjdS50YWJsZV9uYW1lID0gP1xuICAgICAgICBBTkQgdGMudGFibGVfc2NoZW1hID0gJ3B1YmxpYydcbiAgICBgO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIucmF3KHF1ZXJ5LCBbdGFibGVOYW1lXSk7XG4gICAgcmV0dXJuIHJlc3VsdC5yb3dzLm1hcChcbiAgICAgIChyb3c6IHtcbiAgICAgICAgdGFibGVfbmFtZTogc3RyaW5nO1xuICAgICAgICBjb25zdHJhaW50X25hbWU6IHN0cmluZztcbiAgICAgICAgY29sdW1uX25hbWU6IHN0cmluZztcbiAgICAgICAgcmVmZXJlbmNlZF90YWJsZV9uYW1lOiBzdHJpbmc7XG4gICAgICAgIHJlZmVyZW5jZWRfY29sdW1uX25hbWU6IHN0cmluZztcbiAgICAgICAgdXBkYXRlX3J1bGU6IHN0cmluZztcbiAgICAgICAgZGVsZXRlX3J1bGU6IHN0cmluZztcbiAgICAgIH0pID0+ICh7XG4gICAgICAgIHRhYmxlTmFtZTogcm93LnRhYmxlX25hbWUsXG4gICAgICAgIGNvbnN0cmFpbnROYW1lOiByb3cuY29uc3RyYWludF9uYW1lLFxuICAgICAgICBjb2x1bW5OYW1lOiByb3cuY29sdW1uX25hbWUsXG4gICAgICAgIHJlZmVyZW5jZWRUYWJsZU5hbWU6IHJvdy5yZWZlcmVuY2VkX3RhYmxlX25hbWUsXG4gICAgICAgIHJlZmVyZW5jZWRDb2x1bW5OYW1lOiByb3cucmVmZXJlbmNlZF9jb2x1bW5fbmFtZSxcbiAgICAgICAgb25VcGRhdGU6IHRoaXMubWFwQ29uc3RyYWludEFjdGlvbihyb3cudXBkYXRlX3J1bGUpLFxuICAgICAgICBvbkRlbGV0ZTogdGhpcy5tYXBDb25zdHJhaW50QWN0aW9uKHJvdy5kZWxldGVfcnVsZSksXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIHZlY3RvciDsu6zrn7zsnZggZGltZW5zaW9uc+ulvCDsobDtmoztlanri4jri6QuXG4gICAqIHBnX2F0dHJpYnV0ZeydmCBhdHR0eXBtb2Tsl5DshJwg7LCo7JuQIOyImOulvCDstpTstpztlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldFZlY3RvckRpbWVuc2lvbnMoXG4gICAgY29tcGFyZURCOiBSYXdDYXBhYmxlS25leCxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PiB7XG4gICAgY29uc3QgcXVlcnkgPSBgXG4gICAgICBTRUxFQ1RcbiAgICAgICAgYS5hdHRuYW1lIGFzIGNvbHVtbl9uYW1lLFxuICAgICAgICBhLmF0dHR5cG1vZCBhcyBkaW1lbnNpb25zXG4gICAgICBGUk9NIHBnX2F0dHJpYnV0ZSBhXG4gICAgICBKT0lOIHBnX2NsYXNzIGMgT04gYS5hdHRyZWxpZCA9IGMub2lkXG4gICAgICBKT0lOIHBnX3R5cGUgdCBPTiBhLmF0dHR5cGlkID0gdC5vaWRcbiAgICAgIFdIRVJFIGMucmVsbmFtZSA9ID9cbiAgICAgICAgQU5EIHQudHlwbmFtZSA9ICd2ZWN0b3InXG4gICAgICAgIEFORCBhLmF0dG51bSA+IDBcbiAgICBgO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvbXBhcmVEQi5yYXcocXVlcnksIFt0YWJsZU5hbWVdKTtcbiAgICBjb25zdCBkaW1lbnNpb25zOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgZm9yIChjb25zdCByb3cgb2YgcmVzdWx0LnJvd3MpIHtcbiAgICAgIC8vIGF0dHR5cG1vZOyXkOyEnCDsi6TsoJwgZGltZW5zaW9ucyDqsJIg7LaU7LacXG4gICAgICBkaW1lbnNpb25zW3Jvdy5jb2x1bW5fbmFtZV0gPSByb3cuZGltZW5zaW9ucyA+IDAgPyByb3cuZGltZW5zaW9ucyA6IDA7XG4gICAgfVxuICAgIHJldHVybiBkaW1lbnNpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvc3RncmVTUUwg7Lus65+8IO2DgOyeheydhCDrtoTshJ3tlZjsl6wgTWlncmF0aW9uQ29sdW1uIOqwneyytOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqL1xuICByZXNvbHZlREJDb2xUeXBlKFxuICAgIGRiQ29sdW1uOiBQZ0NvbHVtbixcbiAgKTogUGljazxcbiAgICBNaWdyYXRpb25Db2x1bW4sXG4gICAgXCJ0eXBlXCIgfCBcImxlbmd0aFwiIHwgXCJwcmVjaXNpb25cIiB8IFwic2NhbGVcIiB8IFwibnVtYmVyVHlwZVwiIHwgXCJkaW1lbnNpb25zXCJcbiAgPiB7XG4gICAgY29uc3QgeyB1ZHRfbmFtZTogX3VkdF9uYW1lLCBjaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGgsIHByZWNpc2lvbiwgbnVtZXJpY19zY2FsZSB9ID0gZGJDb2x1bW47XG5cbiAgICBjb25zdCB7IHVkdF9uYW1lLCBzaW5nbGVPckFycmF5IH0gPSAoKCkgPT4ge1xuICAgICAgaWYgKF91ZHRfbmFtZS5zdGFydHNXaXRoKFwiX1wiKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVkdF9uYW1lOiBfdWR0X25hbWUuc3Vic3RyaW5nKDEpLFxuICAgICAgICAgIHNpbmdsZU9yQXJyYXk6IFwiW11cIiBhcyBjb25zdCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVkdF9uYW1lOiBfdWR0X25hbWUsXG4gICAgICAgIHNpbmdsZU9yQXJyYXk6IFwiXCIgYXMgY29uc3QsXG4gICAgICB9O1xuICAgIH0pKCk7XG5cbiAgICAvLyBVVUlEXG4gICAgaWYgKHVkdF9uYW1lID09PSBcInV1aWRcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYHV1aWQke3NpbmdsZU9yQXJyYXl9YCB9O1xuICAgIH1cblxuICAgIC8vIEludGVnZXIgdHlwZXNcbiAgICBpZiAodWR0X25hbWUgPT09IFwiaW50NFwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBgaW50ZWdlciR7c2luZ2xlT3JBcnJheX1gIH07XG4gICAgfVxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJpbnQ4XCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGBiaWdJbnRlZ2VyJHtzaW5nbGVPckFycmF5fWAgfTtcbiAgICB9XG5cbiAgICAvLyBTdHJpbmcgdHlwZXNcbiAgICBpZiAodWR0X25hbWUgPT09IFwidmFyY2hhclwiKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBgc3RyaW5nJHtzaW5nbGVPckFycmF5fWAsXG4gICAgICAgIC4uLihjaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGggJiYge1xuICAgICAgICAgIGxlbmd0aDogY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoLFxuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGBzdHJpbmcke3NpbmdsZU9yQXJyYXl9YCB9OyAvLyBTdHJpbmdQcm9wIHdpdGhvdXQgbGVuZ3RoXG4gICAgfVxuXG4gICAgLy8gTnVtYmVyT3JOdW1lcmljIHR5cGVzXG4gICAgaWYgKHVkdF9uYW1lID09PSBcIm51bWVyaWNcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogYG51bWJlck9yTnVtZXJpYyR7c2luZ2xlT3JBcnJheX1gLFxuICAgICAgICBudW1iZXJUeXBlOiBcIm51bWVyaWNcIixcbiAgICAgICAgLi4uKHByZWNpc2lvbiAhPT0gbnVsbCAmJlxuICAgICAgICAgIG51bWVyaWNfc2NhbGUgIT09IG51bGwgJiYge1xuICAgICAgICAgICAgcHJlY2lzaW9uOiBwcmVjaXNpb24sXG4gICAgICAgICAgICBzY2FsZTogbnVtZXJpY19zY2FsZSxcbiAgICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJmbG9hdDRcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYG51bWJlck9yTnVtZXJpYyR7c2luZ2xlT3JBcnJheX1gLCBudW1iZXJUeXBlOiBcInJlYWxcIiB9O1xuICAgIH1cbiAgICBpZiAodWR0X25hbWUgPT09IFwiZmxvYXQ4XCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGBudW1iZXJPck51bWVyaWMke3NpbmdsZU9yQXJyYXl9YCwgbnVtYmVyVHlwZTogXCJkb3VibGUgcHJlY2lzaW9uXCIgfTtcbiAgICB9XG5cbiAgICAvLyBCb29sZWFuXG4gICAgaWYgKHVkdF9uYW1lID09PSBcImJvb2xcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYGJvb2xlYW4ke3NpbmdsZU9yQXJyYXl9YCB9O1xuICAgIH1cblxuICAgIC8vIFRpbWVzdGFtcHogdHlwZXNcbiAgICBpZiAodWR0X25hbWUgPT09IFwidGltZXN0YW1wdHpcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogYGRhdGUke3NpbmdsZU9yQXJyYXl9YCxcbiAgICAgICAgLi4uKHByZWNpc2lvbiAhPT0gbnVsbCAmJiB7XG4gICAgICAgICAgcHJlY2lzaW9uOiBwcmVjaXNpb24sXG4gICAgICAgIH0pLFxuICAgICAgfTsgLy8gRGF0ZVByb3Ag4oaSIHRpbWVzdGFtcHR6XG4gICAgfVxuXG4gICAgLy8gSlNPTlxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJqc29uXCIgfHwgdWR0X25hbWUgPT09IFwianNvbmJcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJqc29uXCIgfTtcbiAgICB9XG5cbiAgICAvLyBWZWN0b3IgKHBndmVjdG9yKVxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJ2ZWN0b3JcIikge1xuICAgICAgLy8gdmVjdG9yIO2DgOyeheydmCDssKjsm5Ag7IiY64qUIGNvbHVtbl9kZWZhdWx064KYIOuzhOuPhCDsv7zrpqzroZwg7ZmV7J247ZW07JW8IO2VqFxuICAgICAgLy8g7ZiE7J6s64qUIOq4sOuzuOqwkiAw7Jy866GcIOyEpOyglSAo7Iuk7KCcIGRpbWVuc2lvbnPripQgZ2V0TWlncmF0aW9uU2V0RnJvbURC7JeQ7IScIOuzhOuPhCDsv7zrpqzroZwg7ZmV7J24KVxuICAgICAgcmV0dXJuIHsgdHlwZTogYHZlY3RvciR7c2luZ2xlT3JBcnJheX1gLCBkaW1lbnNpb25zOiAwIH07XG4gICAgfVxuXG4gICAgLy8gdHN2ZWN0b3IgKFBvc3RncmVTUUwg7KCE66y4IOqygOyDieyaqSDtg4DsnoUpXG4gICAgaWYgKHVkdF9uYW1lID09PSBcInRzdmVjdG9yXCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwidHN2ZWN0b3JcIiB9O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgcmVzb2x2ZSDrtojqsIDriqXtlZwgUG9zdGdyZVNRTCDsu6zrn7wg7YOA7J6FOiAke3VkdF9uYW1lfWApO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyID0gbmV3IFBvc3RncmVTUUxTY2hlbWFSZWFkZXJDbGFzcygpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Q0F3RU0sOEJBQU4sTUFBa0M7RUFDaEMsb0NBQXFDLElBQUksSUFBSTtHQUFDO0dBQVM7R0FBUTtHQUFPO0dBQVE7RUFBVSxDQUFDOzs7Ozs7O0VBUXpGLE1BQU0sc0JBQ0osV0FDQSxPQUM4QjtHQUM5QixJQUFJLFdBQXVCLFdBQXNCO0dBQ2pELElBQUk7SUFDRixDQUFDLFdBQVcsV0FBVyxjQUFjLE1BQU0sS0FBSyxVQUFVLFdBQVcsS0FBSztHQUM1RSxTQUFTLEdBQVk7SUFDbkIsSUFBSSxhQUFhLFNBQVMsRUFBRSxRQUFRLFNBQVMsaUJBQWlCLEdBQzVELE9BQU87SUFFVCxNQUFNO0dBQ1I7R0FHQSxNQUFNLG1CQUFtQixNQUFNLEtBQUssb0JBQW9CLFdBQVcsS0FBSztHQUV4RSxNQUFNLFVBQTZCLFVBQVUsS0FBSyxhQUFhO0lBQzdELE1BQU0sWUFBWSxLQUFLLGlCQUFpQixRQUFRO0lBR2hELElBQUksVUFBVSxTQUFTLFVBQ3JCLFVBQVUsYUFBYSxpQkFBaUIsU0FBUyxnQkFBZ0I7SUFHbkUsT0FBTztLQUNMLE1BQU0sU0FBUztLQUNmLFVBQVUsU0FBUyxnQkFBZ0I7S0FDbkMsR0FBRztLQUVILFVBQVU7TUFDUixJQUFJLFNBQVMsaUJBQWlCLE9BQU8sU0FBUyxpQkFBaUIsS0FDN0QsT0FBTyxFQUNMLFdBQVc7T0FDVCxNQUFNLFNBQVMsaUJBQWlCLE1BQU0sV0FBVztPQUNqRCxZQUFZLFNBQVMseUJBQXlCO01BQ2hELEVBQ0Y7TUFFRixPQUFPLENBQUM7S0FDVixFQUFBLENBQUc7S0FF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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack-confirm.d.ts","sourceRoot":"","sources":["../../src/migration/slack-confirm.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,gBAAgB,GAAG,OAAO,CAAC;IACzE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAA8B;IAE5C,OAAO,CAAC,yBAAyB;IAkBjC;;OAEG;IACH,YAAY,IAAI,OAAO;IAKvB;;OAEG;IACH,wBAAwB,CAAC,MAAM,EAAE,MAAM,cAAc,GAAG,OAAO;IAK/D;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM;IAK/C;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;OAEG;IACG,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAgB/F;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnF;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACG,mBAAmB,CACvB,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"slack-confirm.d.ts","sourceRoot":"","sources":["../../src/migration/slack-confirm.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,gBAAgB,GAAG,OAAO,CAAC;IACzE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAA8B;IAE5C,OAAO,CAAC,yBAAyB;IAkBjC;;OAEG;IACH,YAAY,IAAI,OAAO;IAKvB;;OAEG;IACH,wBAAwB,CAAC,MAAM,EAAE,MAAM,cAAc,GAAG,OAAO;IAK/D;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM;IAK/C;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;OAEG;IACG,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAgB/F;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnF;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACG,mBAAmB,CACvB,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAuC3C;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;OAEG;IACG,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,GACT,OAAO,CAAC;QACT,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IA2CF;;OAEG;IACG,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IAyChB;;OAEG;IACG,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,eAAe,EACxB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;CAmCjB"}
|
|
@@ -203,4 +203,4 @@ ${migrationsText}`;
|
|
|
203
203
|
init_slack_confirm();
|
|
204
204
|
export { SlackConfirm, init_slack_confirm };
|
|
205
205
|
|
|
206
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhY2stY29uZmlybS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlncmF0aW9uL3NsYWNrLWNvbmZpcm0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY3J5cHRvIGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBTRCB9IGZyb20gXCIuLi9kaWN0L3NkXCI7XG5pbXBvcnQgeyB0eXBlIE1pZ3JhdGlvblJlc3VsdCB9IGZyb20gXCIuL21pZ3JhdG9yXCI7XG5cbmV4cG9ydCB0eXBlIFNsYWNrQ29uZmlybVJlc3VsdCA9IHtcbiAgc3RhdHVzOiBcImFwcHJvdmVkXCIgfCBcInJlamVjdGVkXCIgfCBcInBlbmRpbmdcIiB8IFwibm90X2NvbmZpZ3VyZWRcIiB8IFwiZXJyb3JcIjtcbiAgdHM/OiBzdHJpbmc7XG4gIGNoYW5uZWw/OiBzdHJpbmc7XG4gIGVycm9yPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgU2xhY2tDb25maXJtUGVuZGluZ1Jlc3VsdCA9IHtcbiAgdHlwZTogXCJwZW5kaW5nXCI7XG4gIGNoYW5uZWw6IHN0cmluZztcbiAgdHM6IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBTbGFja0NvbmZpcm0ge1xuICBwcml2YXRlIGNvbmZpZyA9IFNvbmFtdS5jb25maWcuc2xhY2tDb25maXJtO1xuXG4gIHByaXZhdGUgdmFsaWRhdGVDb25maWd1cmVkVGFyZ2V0cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRUYXJnZXRzID0gT2JqZWN0LmtleXMoU29uYW11LmRiQ29uZmlnKTtcbiAgICBjb25zdCBpbnZhbGlkVGFyZ2V0cyA9IHRoaXMuY29uZmlnLnRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+ICF2YWxpZFRhcmdldHMuaW5jbHVkZXModGFyZ2V0KSk7XG5cbiAgICBpZiAoaW52YWxpZFRhcmdldHMubGVuZ3RoID4gMCkge1xuICAgICAgYXNzZXJ0LmZhaWwoXG4gICAgICAgIFNEKFwic29uYW11LmVycm9yLnNsYWNrQ29uZmlybUludmFsaWRUYXJnZXRzXCIpKFxuICAgICAgICAgIGludmFsaWRUYXJnZXRzLmpvaW4oXCIsIFwiKSxcbiAgICAgICAgICB2YWxpZFRhcmdldHMuam9pbihcIiwgXCIpLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7ISk7KCV7J20IOyeiOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqL1xuICBpc0NvbmZpZ3VyZWQoKTogYm9vbGVhbiB7XG4gICAgdGhpcy52YWxpZGF0ZUNvbmZpZ3VyZWRUYXJnZXRzKCk7XG4gICAgcmV0dXJuICEhKHRoaXMuY29uZmlnPy5ib3RUb2tlbiAmJiB0aGlzLmNvbmZpZz8uY2hhbm5lbElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlbTri7kgdGFyZ2V07J20IOyKueyduCDrjIDsg4Hsnbjsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgKi9cbiAgaXNUYXJnZXRSZXF1aXJlc0FwcHJvdmFsKHRhcmdldDoga2V5b2YgU29uYW11REJDb25maWcpOiBib29sZWFuIHtcbiAgICB0aGlzLnZhbGlkYXRlQ29uZmlndXJlZFRhcmdldHMoKTtcbiAgICByZXR1cm4gdGhpcy5jb25maWc/LnRhcmdldHM/LmluY2x1ZGVzKHRhcmdldCkgPz8gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICog66eI7J206re466CI7J207IWYIOuqqeuhneydmCDtlbTsi5zrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKi9cbiAgZ2V0TWlncmF0aW9uc0hhc2gobWlncmF0aW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5taWdyYXRpb25zXS50b1NvcnRlZCgpO1xuICAgIHJldHVybiBjcnlwdG8uY3JlYXRlSGFzaChcIm1kNVwiKS51cGRhdGUoc29ydGVkLmpvaW4oXCIsXCIpKS5kaWdlc3QoXCJoZXhcIikuc2xpY2UoMCwgMTIpO1xuICB9XG5cbiAgLyoqXG4gICAqIOuhnOy7rCDtjIzsnbwg6rK966Gc66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZ2V0Q29uZmlybUZpbGVQYXRoKGhhc2g6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjXCIsIFwibWlncmF0aW9uc1wiLCBgLnNsYWNrLWNvbmZpcm0tJHtoYXNofWApO1xuICB9XG5cbiAgLyoqXG4gICAqIOq4sOyhtCDsirnsnbgg7JqU7LKt7J2EIOyhsO2ajO2VqeuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGdldEV4aXN0aW5nUmVxdWVzdChtaWdyYXRpb25zOiBzdHJpbmdbXSk6IFByb21pc2U8eyBjaGFubmVsOiBzdHJpbmc7IHRzOiBzdHJpbmcgfSB8IG51bGw+IHtcbiAgICBjb25zdCBoYXNoID0gdGhpcy5nZXRNaWdyYXRpb25zSGFzaChtaWdyYXRpb25zKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHRoaXMuZ2V0Q29uZmlybUZpbGVQYXRoKGhhc2gpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICAgIGNvbnN0IFtjaGFubmVsLCB0c10gPSBjb250ZW50LnRyaW0oKS5zcGxpdChcIjpcIik7XG4gICAgICBpZiAoY2hhbm5lbCAmJiB0cykge1xuICAgICAgICByZXR1cm4geyBjaGFubmVsLCB0cyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7Iq57J24IOyalOyyreydhCDsoIDsnqXtlanri4jri6QuXG4gICAqL1xuICBhc3luYyBzYXZlUmVxdWVzdChtaWdyYXRpb25zOiBzdHJpbmdbXSwgY2hhbm5lbDogc3RyaW5nLCB0czogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaGFzaCA9IHRoaXMuZ2V0TWlncmF0aW9uc0hhc2gobWlncmF0aW9ucyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSB0aGlzLmdldENvbmZpcm1GaWxlUGF0aChoYXNoKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZVBhdGgsIGAke2NoYW5uZWx9OiR7dHN9YCwgXCJ1dGYtOFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtmITsnqwg7IKs7Jqp7J6QIOydtOumhOydhCDrsJjtmZjtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGdldFJlcXVlc3RvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5VU0VSID8/IG9zLnVzZXJJbmZvKCkudXNlcm5hbWUgPz8gXCJVbmtub3duXCI7XG4gIH1cblxuICAvKipcbiAgICog7Iqs656ZIOuplOyLnOyngOulvCDrsJzshqHtlanri4jri6QuXG4gICAqL1xuICBhc3luYyBwb3N0QXBwcm92YWxSZXF1ZXN0KFxuICAgIG1pZ3JhdGlvbnM6IHN0cmluZ1tdLFxuICAgIHRhcmdldHM6IHN0cmluZ1tdLFxuICAgIHJlcXVlc3Rvcj86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IGNoYW5uZWw6IHN0cmluZzsgdHM6IHN0cmluZyB9PiB7XG4gICAgYXNzZXJ0KHRoaXMuY29uZmlnLCBTRChcInNvbmFtdS5lcnJvci5zbGFja0NvbmZpcm1Ob3RDb25maWd1cmVkXCIpKTtcbiAgICB0aGlzLnZhbGlkYXRlQ29uZmlndXJlZFRhcmdldHMoKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXCJodHRwczovL3NsYWNrLmNvbS9hcGkvY2hhdC5wb3N0TWVzc2FnZVwiLCB7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5jb25maWcuYm90VG9rZW59YCxcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjaGFubmVsOiB0aGlzLmNvbmZpZy5jaGFubmVsSWQsXG4gICAgICAgIHRleHQ6IHRoaXMuYnVpbGRNZXNzYWdlVGV4dChtaWdyYXRpb25zLCB0YXJnZXRzLCByZXF1ZXN0b3IgPz8gdGhpcy5nZXRSZXF1ZXN0b3IoKSksXG4gICAgICAgIHVuZnVybF9saW5rczogZmFsc2UsXG4gICAgICAgIHVuZnVybF9tZWRpYTogZmFsc2UsXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2xhY2sgQVBJIEhUVFAgZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7XG4gICAgICBvazogYm9vbGVhbjtcbiAgICAgIGVycm9yPzogc3RyaW5nO1xuICAgICAgY2hhbm5lbDogc3RyaW5nO1xuICAgICAgdHM6IHN0cmluZztcbiAgICB9O1xuICAgIGlmICghZGF0YS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTbGFjayBBUEkgZXJyb3I6ICR7ZGF0YS5lcnJvcn1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY2hhbm5lbDogZGF0YS5jaGFubmVsLFxuICAgICAgdHM6IGRhdGEudHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrqZTsi5zsp4Ag7YWN7Iqk7Yq466W8IOyDneyEse2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRNZXNzYWdlVGV4dChtaWdyYXRpb25zOiBzdHJpbmdbXSwgdGFyZ2V0czogc3RyaW5nW10sIHJlcXVlc3Rvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcm9qZWN0TmFtZSA9IFNvbmFtdS5jb25maWcucHJvamVjdE5hbWUgPz8gXCJVbmtub3duXCI7XG4gICAgY29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS50b0xvY2FsZVN0cmluZyhcImtvLUtSXCIsIHtcbiAgICAgIHRpbWVab25lOiBcIkFzaWEvU2VvdWxcIixcbiAgICB9KTtcbiAgICBjb25zdCBtaWdyYXRpb25zVGV4dCA9IG1pZ3JhdGlvbnMubWFwKChtKSA9PiBg4oCiICR7bX1gKS5qb2luKFwiXFxuXCIpO1xuICAgIGNvbnN0IHRhcmdldHNUZXh0ID0gdGFyZ2V0cy5qb2luKFwiLCBcIik7XG5cbiAgICByZXR1cm4gYPCfl4TvuI8gKlske3Byb2plY3ROYW1lfV0gUHJvZHVjdGlvbiDrp4jsnbTqt7jroIjsnbTshZgg7Iq57J24IOyalOyyrSpcblxuKuyalOyyreyekDoqICR7cmVxdWVzdG9yfVxuKuuMgOyDgSBEQjoqICR7dGFyZ2V0c1RleHR9XG4q7Iuc6rCEOiogJHt0aW1lc3RhbXB9XG5cbirsoIHsmqkg7JiI7KCVIOuniOydtOq3uOugiOydtOyFmDoqXG4ke21pZ3JhdGlvbnNUZXh0fWA7XG4gIH1cblxuICAvKipcbiAgICog7Iq57J24IOyDge2DnOulvCDtmZXsnbjtlanri4jri6QgKHJlYWN0aW9ucy5nZXQpLlxuICAgKi9cbiAgYXN5bmMgY2hlY2tBcHByb3ZhbChcbiAgICBjaGFubmVsOiBzdHJpbmcsXG4gICAgdHM6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7XG4gICAgYXBwcm92ZWQ6IGJvb2xlYW47XG4gICAgcmVqZWN0ZWQ6IGJvb2xlYW47XG4gICAgYXBwcm92ZXI/OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBhc3NlcnQodGhpcy5jb25maWcsIFNEKFwic29uYW11LmVycm9yLnNsYWNrQ29uZmlybU5vdENvbmZpZ3VyZWRcIikpO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgIGBodHRwczovL3NsYWNrLmNvbS9hcGkvcmVhY3Rpb25zLmdldD9jaGFubmVsPSR7Y2hhbm5lbH0mdGltZXN0YW1wPSR7dHN9YCxcbiAgICAgIHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMuY29uZmlnLmJvdFRva2VufWAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNsYWNrIEFQSSBIVFRQIGVycm9yOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMge1xuICAgICAgb2s6IGJvb2xlYW47XG4gICAgICBlcnJvcj86IHN0cmluZztcbiAgICAgIG1lc3NhZ2U/OiB7XG4gICAgICAgIHJlYWN0aW9ucz86IEFycmF5PHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgdXNlcnM/OiBzdHJpbmdbXTtcbiAgICAgICAgfT47XG4gICAgICB9O1xuICAgIH07XG4gICAgaWYgKCFkYXRhLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNsYWNrIEFQSSBlcnJvcjogJHtkYXRhLmVycm9yfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlYWN0aW9ucyA9IGRhdGEubWVzc2FnZT8ucmVhY3Rpb25zID8/IFtdO1xuICAgIGNvbnN0IGFwcHJvdmVkID0gcmVhY3Rpb25zLmZpbmQoKHIpID0+IHIubmFtZSA9PT0gXCJ3aGl0ZV9jaGVja19tYXJrXCIpO1xuICAgIGNvbnN0IHJlamVjdGVkID0gcmVhY3Rpb25zLmZpbmQoKHIpID0+IHIubmFtZSA9PT0gXCJ4XCIpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFwcHJvdmVkOiAhIWFwcHJvdmVkLFxuICAgICAgcmVqZWN0ZWQ6ICEhcmVqZWN0ZWQsXG4gICAgICBhcHByb3ZlcjogYXBwcm92ZWQ/LnVzZXJzPy5bMF0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZSDsirnsnbgg7LKY66as66W8IOyImO2Wie2VqeuLiOuLpCAo67O47J247J20IOKchSDssI3qs6Ag7Iqk66CI65Oc7JeQIOyCrOycoCDrgqjquYApLlxuICAgKi9cbiAgYXN5bmMgZm9yY2VBcHByb3ZhbChcbiAgICBjaGFubmVsOiBzdHJpbmcsXG4gICAgdHM6IHN0cmluZyxcbiAgICByZWFzb246IHN0cmluZyxcbiAgICByZXF1ZXN0b3I/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGFzc2VydCh0aGlzLmNvbmZpZywgU0QoXCJzb25hbXUuZXJyb3Iuc2xhY2tDb25maXJtTm90Q29uZmlndXJlZFwiKSk7XG4gICAgY29uc3QgYWN0dWFsUmVxdWVzdG9yID0gcmVxdWVzdG9yID8/IHRoaXMuZ2V0UmVxdWVzdG9yKCk7XG5cbiAgICAvLyAxLiDinIUg7J2066qo7KeAIOy2lOqwgFxuICAgIGNvbnN0IGFkZFJlYWN0aW9uUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vc2xhY2suY29tL2FwaS9yZWFjdGlvbnMuYWRkXCIsIHtcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmNvbmZpZy5ib3RUb2tlbn1gLFxuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGNoYW5uZWwsXG4gICAgICAgIHRpbWVzdGFtcDogdHMsXG4gICAgICAgIG5hbWU6IFwid2hpdGVfY2hlY2tfbWFya1wiLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBpZiAoIWFkZFJlYWN0aW9uUmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2xhY2sgQVBJIEhUVFAgZXJyb3I6ICR7YWRkUmVhY3Rpb25SZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgfVxuXG4gICAgLy8gMi4g7Iqk66CI65Oc7JeQIOyCrOycoCDrgqjquYBcbiAgICBjb25zdCBwb3N0TWVzc2FnZVJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXCJodHRwczovL3NsYWNrLmNvbS9hcGkvY2hhdC5wb3N0TWVzc2FnZVwiLCB7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5jb25maWcuYm90VG9rZW59YCxcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjaGFubmVsLFxuICAgICAgICB0aHJlYWRfdHM6IHRzLFxuICAgICAgICB0ZXh0OiBg4pqg77iPICpGb3JjZSDsirnsnbgqXFxu7JqU7LKt7J6QOiAke2FjdHVhbFJlcXVlc3Rvcn1cXG7sgqzsnKA6ICR7cmVhc29ufWAsXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGlmICghcG9zdE1lc3NhZ2VSZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTbGFjayBBUEkgSFRUUCBlcnJvcjogJHtwb3N0TWVzc2FnZVJlc3BvbnNlLnN0YXR1c31gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7Iuk7ZaJIOyZhOujjCDroZzqt7jrpbwg64Ko6rmB64uI64ukLlxuICAgKi9cbiAgYXN5bmMgbG9nRXhlY3V0aW9uKFxuICAgIGNoYW5uZWw6IHN0cmluZyxcbiAgICB0czogc3RyaW5nLFxuICAgIHJlc3VsdHM6IE1pZ3JhdGlvblJlc3VsdCxcbiAgICByZXF1ZXN0b3I/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnO1xuICAgIGFzc2VydChjb25maWcsIFNEKFwic29uYW11LmVycm9yLnNsYWNrQ29uZmlybU5vdENvbmZpZ3VyZWRcIikpO1xuXG4gICAgY29uc3QgYWN0dWFsUmVxdWVzdG9yID0gcmVxdWVzdG9yID8/IHRoaXMuZ2V0UmVxdWVzdG9yKCk7XG4gICAgY29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS50b0xvY2FsZVN0cmluZyhcImtvLUtSXCIsIHtcbiAgICAgIHRpbWVab25lOiBcIkFzaWEvU2VvdWxcIixcbiAgICB9KTtcblxuICAgIC8vIERC67OE66GcIOq3uOujue2ZlO2VmOyXrCDtkZzsi5ztlanri4jri6QuXG4gICAgY29uc3QgYXBwbGllZFRleHQgPVxuICAgICAgcmVzdWx0cy5sZW5ndGggPiAwXG4gICAgICAgID8gcmVzdWx0c1xuICAgICAgICAgICAgLmZpbHRlcigocikgPT4gci5hcHBsaWVkLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAubWFwKChyKSA9PiBgWyR7ci5jb25uS2V5fV1cXG4ke3IuYXBwbGllZC5tYXAoKG0pID0+IGDigKIgJHttfWApLmpvaW4oXCJcXG5cIil9YClcbiAgICAgICAgICAgIC5qb2luKFwiXFxuXFxuXCIpXG4gICAgICAgIDogXCIo7JeG7J2MKVwiO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vc2xhY2suY29tL2FwaS9jaGF0LnBvc3RNZXNzYWdlXCIsIHtcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtjb25maWcuYm90VG9rZW59YCxcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjaGFubmVsLFxuICAgICAgICB0aHJlYWRfdHM6IHRzLFxuICAgICAgICB0ZXh0OiBg4pyFICrrp4jsnbTqt7jroIjsnbTshZgg7Iuk7ZaJIOyZhOujjCpcXG7si6TtlonsnpA6ICR7YWN0dWFsUmVxdWVzdG9yfVxcbuyLnOqwhDogJHt0aW1lc3RhbXB9XFxuXFxu7KCB7Jqp65CoOlxcbiR7YXBwbGllZFRleHR9YCxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTbGFjayBBUEkgSFRUUCBlcnJvcjogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O2FBTXNDO1NBRVA7Q0FnQmxCLGVBQWIsTUFBMEI7RUFDeEIsU0FBaUIsT0FBTyxPQUFPO0VBRS9CLDRCQUEwQztHQUN4QyxJQUFJLENBQUMsS0FBSyxRQUNSO0dBR0YsTUFBTSxlQUFlLE9BQU8sS0FBSyxPQUFPLFFBQVE7R0FDaEQsTUFBTSxpQkFBaUIsS0FBSyxPQUFPLFFBQVEsUUFBUSxXQUFXLENBQUMsYUFBYSxTQUFTLE1BQU0sQ0FBQztHQUU1RixJQUFJLGVBQWUsU0FBUyxHQUMxQixPQUFPLEtBQ0wsR0FBRyx5Q0FBeUMsQ0FBQyxDQUMzQyxlQUFlLEtBQUssSUFBSSxHQUN4QixhQUFhLEtBQUssSUFBSSxDQUN4QixDQUNGO0VBRUo7Ozs7RUFLQSxlQUF3QjtHQUN0QixLQUFLLDBCQUEwQjtHQUMvQixPQUFPLENBQUMsRUFBRSxLQUFLLFFBQVEsWUFBWSxLQUFLLFFBQVE7RUFDbEQ7Ozs7RUFLQSx5QkFBeUIsUUFBdUM7R0FDOUQsS0FBSywwQkFBMEI7R0FDL0IsT0FBTyxLQUFLLFFBQVEsU0FBUyxTQUFTLE1B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
|
|
206
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhY2stY29uZmlybS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlncmF0aW9uL3NsYWNrLWNvbmZpcm0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY3J5cHRvIGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBTRCB9IGZyb20gXCIuLi9kaWN0L3NkXCI7XG5pbXBvcnQgeyB0eXBlIE1pZ3JhdGlvblJlc3VsdCB9IGZyb20gXCIuL21pZ3JhdG9yXCI7XG5cbmV4cG9ydCB0eXBlIFNsYWNrQ29uZmlybVJlc3VsdCA9IHtcbiAgc3RhdHVzOiBcImFwcHJvdmVkXCIgfCBcInJlamVjdGVkXCIgfCBcInBlbmRpbmdcIiB8IFwibm90X2NvbmZpZ3VyZWRcIiB8IFwiZXJyb3JcIjtcbiAgdHM/OiBzdHJpbmc7XG4gIGNoYW5uZWw/OiBzdHJpbmc7XG4gIGVycm9yPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgU2xhY2tDb25maXJtUGVuZGluZ1Jlc3VsdCA9IHtcbiAgdHlwZTogXCJwZW5kaW5nXCI7XG4gIGNoYW5uZWw6IHN0cmluZztcbiAgdHM6IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBTbGFja0NvbmZpcm0ge1xuICBwcml2YXRlIGNvbmZpZyA9IFNvbmFtdS5jb25maWcuc2xhY2tDb25maXJtO1xuXG4gIHByaXZhdGUgdmFsaWRhdGVDb25maWd1cmVkVGFyZ2V0cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRUYXJnZXRzID0gT2JqZWN0LmtleXMoU29uYW11LmRiQ29uZmlnKTtcbiAgICBjb25zdCBpbnZhbGlkVGFyZ2V0cyA9IHRoaXMuY29uZmlnLnRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+ICF2YWxpZFRhcmdldHMuaW5jbHVkZXModGFyZ2V0KSk7XG5cbiAgICBpZiAoaW52YWxpZFRhcmdldHMubGVuZ3RoID4gMCkge1xuICAgICAgYXNzZXJ0LmZhaWwoXG4gICAgICAgIFNEKFwic29uYW11LmVycm9yLnNsYWNrQ29uZmlybUludmFsaWRUYXJnZXRzXCIpKFxuICAgICAgICAgIGludmFsaWRUYXJnZXRzLmpvaW4oXCIsIFwiKSxcbiAgICAgICAgICB2YWxpZFRhcmdldHMuam9pbihcIiwgXCIpLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7ISk7KCV7J20IOyeiOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqL1xuICBpc0NvbmZpZ3VyZWQoKTogYm9vbGVhbiB7XG4gICAgdGhpcy52YWxpZGF0ZUNvbmZpZ3VyZWRUYXJnZXRzKCk7XG4gICAgcmV0dXJuICEhKHRoaXMuY29uZmlnPy5ib3RUb2tlbiAmJiB0aGlzLmNvbmZpZz8uY2hhbm5lbElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlbTri7kgdGFyZ2V07J20IOyKueyduCDrjIDsg4Hsnbjsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgKi9cbiAgaXNUYXJnZXRSZXF1aXJlc0FwcHJvdmFsKHRhcmdldDoga2V5b2YgU29uYW11REJDb25maWcpOiBib29sZWFuIHtcbiAgICB0aGlzLnZhbGlkYXRlQ29uZmlndXJlZFRhcmdldHMoKTtcbiAgICByZXR1cm4gdGhpcy5jb25maWc/LnRhcmdldHM/LmluY2x1ZGVzKHRhcmdldCkgPz8gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICog66eI7J206re466CI7J207IWYIOuqqeuhneydmCDtlbTsi5zrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKi9cbiAgZ2V0TWlncmF0aW9uc0hhc2gobWlncmF0aW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5taWdyYXRpb25zXS50b1NvcnRlZCgpO1xuICAgIHJldHVybiBjcnlwdG8uY3JlYXRlSGFzaChcIm1kNVwiKS51cGRhdGUoc29ydGVkLmpvaW4oXCIsXCIpKS5kaWdlc3QoXCJoZXhcIikuc2xpY2UoMCwgMTIpO1xuICB9XG5cbiAgLyoqXG4gICAqIOuhnOy7rCDtjIzsnbwg6rK966Gc66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZ2V0Q29uZmlybUZpbGVQYXRoKGhhc2g6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjXCIsIFwibWlncmF0aW9uc1wiLCBgLnNsYWNrLWNvbmZpcm0tJHtoYXNofWApO1xuICB9XG5cbiAgLyoqXG4gICAqIOq4sOyhtCDsirnsnbgg7JqU7LKt7J2EIOyhsO2ajO2VqeuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGdldEV4aXN0aW5nUmVxdWVzdChtaWdyYXRpb25zOiBzdHJpbmdbXSk6IFByb21pc2U8eyBjaGFubmVsOiBzdHJpbmc7IHRzOiBzdHJpbmcgfSB8IG51bGw+IHtcbiAgICBjb25zdCBoYXNoID0gdGhpcy5nZXRNaWdyYXRpb25zSGFzaChtaWdyYXRpb25zKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHRoaXMuZ2V0Q29uZmlybUZpbGVQYXRoKGhhc2gpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICAgIGNvbnN0IFtjaGFubmVsLCB0c10gPSBjb250ZW50LnRyaW0oKS5zcGxpdChcIjpcIik7XG4gICAgICBpZiAoY2hhbm5lbCAmJiB0cykge1xuICAgICAgICByZXR1cm4geyBjaGFubmVsLCB0cyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7Iq57J24IOyalOyyreydhCDsoIDsnqXtlanri4jri6QuXG4gICAqL1xuICBhc3luYyBzYXZlUmVxdWVzdChtaWdyYXRpb25zOiBzdHJpbmdbXSwgY2hhbm5lbDogc3RyaW5nLCB0czogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaGFzaCA9IHRoaXMuZ2V0TWlncmF0aW9uc0hhc2gobWlncmF0aW9ucyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSB0aGlzLmdldENvbmZpcm1GaWxlUGF0aChoYXNoKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZVBhdGgsIGAke2NoYW5uZWx9OiR7dHN9YCwgXCJ1dGYtOFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtmITsnqwg7IKs7Jqp7J6QIOydtOumhOydhCDrsJjtmZjtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGdldFJlcXVlc3RvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5VU0VSID8/IG9zLnVzZXJJbmZvKCkudXNlcm5hbWUgPz8gXCJVbmtub3duXCI7XG4gIH1cblxuICAvKipcbiAgICog7Iqs656ZIOuplOyLnOyngOulvCDrsJzshqHtlanri4jri6QuXG4gICAqL1xuICBhc3luYyBwb3N0QXBwcm92YWxSZXF1ZXN0KFxuICAgIG1pZ3JhdGlvbnM6IHN0cmluZ1tdLFxuICAgIHRhcmdldHM6IHN0cmluZ1tdLFxuICAgIHJlcXVlc3Rvcj86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IGNoYW5uZWw6IHN0cmluZzsgdHM6IHN0cmluZyB9PiB7XG4gICAgYXNzZXJ0KHRoaXMuY29uZmlnLCBTRChcInNvbmFtdS5lcnJvci5zbGFja0NvbmZpcm1Ob3RDb25maWd1cmVkXCIpKTtcbiAgICB0aGlzLnZhbGlkYXRlQ29uZmlndXJlZFRhcmdldHMoKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXCJodHRwczovL3NsYWNrLmNvbS9hcGkvY2hhdC5wb3N0TWVzc2FnZVwiLCB7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5jb25maWcuYm90VG9rZW59YCxcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjaGFubmVsOiB0aGlzLmNvbmZpZy5jaGFubmVsSWQsXG4gICAgICAgIHRleHQ6IHRoaXMuYnVpbGRNZXNzYWdlVGV4dChtaWdyYXRpb25zLCB0YXJnZXRzLCByZXF1ZXN0b3IgPz8gdGhpcy5nZXRSZXF1ZXN0b3IoKSksXG4gICAgICAgIHVuZnVybF9saW5rczogZmFsc2UsXG4gICAgICAgIHVuZnVybF9tZWRpYTogZmFsc2UsXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2xhY2sgQVBJIEhUVFAgZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPVxuICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7XG4gICAgICAgIG9rOiBib29sZWFuO1xuICAgICAgICBlcnJvcj86IHN0cmluZztcbiAgICAgICAgY2hhbm5lbDogc3RyaW5nO1xuICAgICAgICB0czogc3RyaW5nO1xuICAgICAgfTtcbiAgICBpZiAoIWRhdGEub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2xhY2sgQVBJIGVycm9yOiAke2RhdGEuZXJyb3J9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNoYW5uZWw6IGRhdGEuY2hhbm5lbCxcbiAgICAgIHRzOiBkYXRhLnRzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog66mU7Iuc7KeAIO2FjeyKpO2KuOulvCDsg53shLHtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTWVzc2FnZVRleHQobWlncmF0aW9uczogc3RyaW5nW10sIHRhcmdldHM6IHN0cmluZ1tdLCByZXF1ZXN0b3I6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJvamVjdE5hbWUgPSBTb25hbXUuY29uZmlnLnByb2plY3ROYW1lID8/IFwiVW5rbm93blwiO1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoXCJrby1LUlwiLCB7XG4gICAgICB0aW1lWm9uZTogXCJBc2lhL1Nlb3VsXCIsXG4gICAgfSk7XG4gICAgY29uc3QgbWlncmF0aW9uc1RleHQgPSBtaWdyYXRpb25zLm1hcCgobSkgPT4gYOKAoiAke219YCkuam9pbihcIlxcblwiKTtcbiAgICBjb25zdCB0YXJnZXRzVGV4dCA9IHRhcmdldHMuam9pbihcIiwgXCIpO1xuXG4gICAgcmV0dXJuIGDwn5eE77iPICpbJHtwcm9qZWN0TmFtZX1dIFByb2R1Y3Rpb24g66eI7J206re466CI7J207IWYIOyKueyduCDsmpTssq0qXG5cbirsmpTssq3snpA6KiAke3JlcXVlc3Rvcn1cbirrjIDsg4EgREI6KiAke3RhcmdldHNUZXh0fVxuKuyLnOqwhDoqICR7dGltZXN0YW1wfVxuXG4q7KCB7JqpIOyYiOyglSDrp4jsnbTqt7jroIjsnbTshZg6KlxuJHttaWdyYXRpb25zVGV4dH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIOyKueyduCDsg4Htg5zrpbwg7ZmV7J247ZWp64uI64ukIChyZWFjdGlvbnMuZ2V0KS5cbiAgICovXG4gIGFzeW5jIGNoZWNrQXBwcm92YWwoXG4gICAgY2hhbm5lbDogc3RyaW5nLFxuICAgIHRzOiBzdHJpbmcsXG4gICk6IFByb21pc2U8e1xuICAgIGFwcHJvdmVkOiBib29sZWFuO1xuICAgIHJlamVjdGVkOiBib29sZWFuO1xuICAgIGFwcHJvdmVyPzogc3RyaW5nO1xuICB9PiB7XG4gICAgYXNzZXJ0KHRoaXMuY29uZmlnLCBTRChcInNvbmFtdS5lcnJvci5zbGFja0NvbmZpcm1Ob3RDb25maWd1cmVkXCIpKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXG4gICAgICBgaHR0cHM6Ly9zbGFjay5jb20vYXBpL3JlYWN0aW9ucy5nZXQ/Y2hhbm5lbD0ke2NoYW5uZWx9JnRpbWVzdGFtcD0ke3RzfWAsXG4gICAgICB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmNvbmZpZy5ib3RUb2tlbn1gLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTbGFjayBBUEkgSFRUUCBlcnJvcjogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9XG4gICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHtcbiAgICAgICAgb2s6IGJvb2xlYW47XG4gICAgICAgIGVycm9yPzogc3RyaW5nO1xuICAgICAgICBtZXNzYWdlPzoge1xuICAgICAgICAgIHJlYWN0aW9ucz86IEFycmF5PHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIHVzZXJzPzogc3RyaW5nW107XG4gICAgICAgICAgfT47XG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIGlmICghZGF0YS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTbGFjayBBUEkgZXJyb3I6ICR7ZGF0YS5lcnJvcn1gKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWFjdGlvbnMgPSBkYXRhLm1lc3NhZ2U/LnJlYWN0aW9ucyA/PyBbXTtcbiAgICBjb25zdCBhcHByb3ZlZCA9IHJlYWN0aW9ucy5maW5kKChyKSA9PiByLm5hbWUgPT09IFwid2hpdGVfY2hlY2tfbWFya1wiKTtcbiAgICBjb25zdCByZWplY3RlZCA9IHJlYWN0aW9ucy5maW5kKChyKSA9PiByLm5hbWUgPT09IFwieFwiKTtcblxuICAgIHJldHVybiB7XG4gICAgICBhcHByb3ZlZDogISFhcHByb3ZlZCxcbiAgICAgIHJlamVjdGVkOiAhIXJlamVjdGVkLFxuICAgICAgYXBwcm92ZXI6IGFwcHJvdmVkPy51c2Vycz8uWzBdLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRm9yY2Ug7Iq57J24IOyymOumrOulvCDsiJjtlontlanri4jri6QgKOuzuOyduOydtCDinIUg7LCN6rOgIOyKpOugiOuTnOyXkCDsgqzsnKAg64Ko6rmAKS5cbiAgICovXG4gIGFzeW5jIGZvcmNlQXBwcm92YWwoXG4gICAgY2hhbm5lbDogc3RyaW5nLFxuICAgIHRzOiBzdHJpbmcsXG4gICAgcmVhc29uOiBzdHJpbmcsXG4gICAgcmVxdWVzdG9yPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhc3NlcnQodGhpcy5jb25maWcsIFNEKFwic29uYW11LmVycm9yLnNsYWNrQ29uZmlybU5vdENvbmZpZ3VyZWRcIikpO1xuICAgIGNvbnN0IGFjdHVhbFJlcXVlc3RvciA9IHJlcXVlc3RvciA/PyB0aGlzLmdldFJlcXVlc3RvcigpO1xuXG4gICAgLy8gMS4g4pyFIOydtOuqqOyngCDstpTqsIBcbiAgICBjb25zdCBhZGRSZWFjdGlvblJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXCJodHRwczovL3NsYWNrLmNvbS9hcGkvcmVhY3Rpb25zLmFkZFwiLCB7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5jb25maWcuYm90VG9rZW59YCxcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjaGFubmVsLFxuICAgICAgICB0aW1lc3RhbXA6IHRzLFxuICAgICAgICBuYW1lOiBcIndoaXRlX2NoZWNrX21hcmtcIixcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgaWYgKCFhZGRSZWFjdGlvblJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNsYWNrIEFQSSBIVFRQIGVycm9yOiAke2FkZFJlYWN0aW9uUmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIH1cblxuICAgIC8vIDIuIOyKpOugiOuTnOyXkCDsgqzsnKAg64Ko6rmAXG4gICAgY29uc3QgcG9zdE1lc3NhZ2VSZXNwb25zZSA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9zbGFjay5jb20vYXBpL2NoYXQucG9zdE1lc3NhZ2VcIiwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMuY29uZmlnLmJvdFRva2VufWAsXG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgdGhyZWFkX3RzOiB0cyxcbiAgICAgICAgdGV4dDogYOKaoO+4jyAqRm9yY2Ug7Iq57J24KlxcbuyalOyyreyekDogJHthY3R1YWxSZXF1ZXN0b3J9XFxu7IKs7JygOiAke3JlYXNvbn1gLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBpZiAoIXBvc3RNZXNzYWdlUmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2xhY2sgQVBJIEhUVFAgZXJyb3I6ICR7cG9zdE1lc3NhZ2VSZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOyLpO2WiSDsmYTro4wg66Gc6re466W8IOuCqOq5geuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGxvZ0V4ZWN1dGlvbihcbiAgICBjaGFubmVsOiBzdHJpbmcsXG4gICAgdHM6IHN0cmluZyxcbiAgICByZXN1bHRzOiBNaWdyYXRpb25SZXN1bHQsXG4gICAgcmVxdWVzdG9yPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICBhc3NlcnQoY29uZmlnLCBTRChcInNvbmFtdS5lcnJvci5zbGFja0NvbmZpcm1Ob3RDb25maWd1cmVkXCIpKTtcblxuICAgIGNvbnN0IGFjdHVhbFJlcXVlc3RvciA9IHJlcXVlc3RvciA/PyB0aGlzLmdldFJlcXVlc3RvcigpO1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoXCJrby1LUlwiLCB7XG4gICAgICB0aW1lWm9uZTogXCJBc2lhL1Nlb3VsXCIsXG4gICAgfSk7XG5cbiAgICAvLyBEQuuzhOuhnCDqt7jro7ntmZTtlZjsl6wg7ZGc7Iuc7ZWp64uI64ukLlxuICAgIGNvbnN0IGFwcGxpZWRUZXh0ID1cbiAgICAgIHJlc3VsdHMubGVuZ3RoID4gMFxuICAgICAgICA/IHJlc3VsdHNcbiAgICAgICAgICAgIC5maWx0ZXIoKHIpID0+IHIuYXBwbGllZC5sZW5ndGggPiAwKVxuICAgICAgICAgICAgLm1hcCgocikgPT4gYFske3IuY29ubktleX1dXFxuJHtyLmFwcGxpZWQubWFwKChtKSA9PiBg4oCiICR7bX1gKS5qb2luKFwiXFxuXCIpfWApXG4gICAgICAgICAgICAuam9pbihcIlxcblxcblwiKVxuICAgICAgICA6IFwiKOyXhuydjClcIjtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goXCJodHRwczovL3NsYWNrLmNvbS9hcGkvY2hhdC5wb3N0TWVzc2FnZVwiLCB7XG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7Y29uZmlnLmJvdFRva2VufWAsXG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgdGhyZWFkX3RzOiB0cyxcbiAgICAgICAgdGV4dDogYOKchSAq66eI7J206re466CI7J207IWYIOyLpO2WiSDsmYTro4wqXFxu7Iuk7ZaJ7J6QOiAke2FjdHVhbFJlcXVlc3Rvcn1cXG7si5zqsIQ6ICR7dGltZXN0YW1wfVxcblxcbuyggeyaqeuQqDpcXG4ke2FwcGxpZWRUZXh0fWAsXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2xhY2sgQVBJIEhUVFAgZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OzthQU1zQztTQUVQO0NBZ0JsQixlQUFiLE1BQTBCO0VBQ3hCLFNBQWlCLE9BQU8sT0FBTztFQUUvQiw0QkFBMEM7R0FDeEMsSUFBSSxDQUFDLEtBQUssUUFDUjtHQUdGLE1BQU0sZUFBZSxPQUFPLEtBQUssT0FBTyxRQUFRO0dBQ2hELE1BQU0saUJBQWlCLEtBQUssT0FBTyxRQUFRLFFBQVEsV0FBVyxDQUFDLGFBQWEsU0FBUyxNQUFNLENBQUM7R0FFNUYsSUFBSSxlQUFlLFNBQVMsR0FDMUIsT0FBTyxLQUNM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
|
|
@@ -4,6 +4,60 @@ export type MigrationCode = {
|
|
|
4
4
|
name: string;
|
|
5
5
|
path: string;
|
|
6
6
|
};
|
|
7
|
+
export type MigrationTarget = keyof SonamuDBConfig;
|
|
8
|
+
export type MigrationConnectionMeta = {
|
|
9
|
+
connKey: MigrationTarget;
|
|
10
|
+
name: string;
|
|
11
|
+
host: string;
|
|
12
|
+
port: number;
|
|
13
|
+
database: string;
|
|
14
|
+
remote: boolean;
|
|
15
|
+
requiresApproval: boolean;
|
|
16
|
+
};
|
|
17
|
+
export type MigrationConnectionStatus = {
|
|
18
|
+
connKey: MigrationTarget;
|
|
19
|
+
currentVersion: string | "none" | "error";
|
|
20
|
+
status: number | "error";
|
|
21
|
+
pending: string[];
|
|
22
|
+
latencyMs: number;
|
|
23
|
+
error?: string;
|
|
24
|
+
};
|
|
25
|
+
export type MigrationAction = "shadow" | "apply" | "rollback";
|
|
26
|
+
export type MigrationProgressEvent = {
|
|
27
|
+
type: "target-start";
|
|
28
|
+
action: MigrationAction;
|
|
29
|
+
connKey: MigrationTarget | "shadow";
|
|
30
|
+
files: string[];
|
|
31
|
+
} | {
|
|
32
|
+
type: "file-start" | "file-executed";
|
|
33
|
+
action: MigrationAction;
|
|
34
|
+
connKey: MigrationTarget | "shadow";
|
|
35
|
+
file: string;
|
|
36
|
+
index: number;
|
|
37
|
+
total: number;
|
|
38
|
+
} | {
|
|
39
|
+
type: "target-complete";
|
|
40
|
+
action: MigrationAction;
|
|
41
|
+
connKey: MigrationTarget | "shadow";
|
|
42
|
+
batchNo: number;
|
|
43
|
+
files: string[];
|
|
44
|
+
};
|
|
45
|
+
export type MigrationRunOptions = {
|
|
46
|
+
/** 트랜잭션과 migration lock을 연장하지 않는 동기 observer입니다. */
|
|
47
|
+
onProgress?: (event: MigrationProgressEvent) => void;
|
|
48
|
+
};
|
|
49
|
+
export type MigrationStreamEvent = MigrationProgressEvent | {
|
|
50
|
+
type: "complete";
|
|
51
|
+
result: import("./migrator").MigrationResult;
|
|
52
|
+
} | {
|
|
53
|
+
type: "error";
|
|
54
|
+
action: MigrationAction;
|
|
55
|
+
message: string;
|
|
56
|
+
connKey?: MigrationTarget | "shadow";
|
|
57
|
+
file?: string;
|
|
58
|
+
completedTargets: MigrationTarget[];
|
|
59
|
+
pendingTargets: MigrationTarget[];
|
|
60
|
+
};
|
|
7
61
|
export type ConnString = `${"pg"}://${string}@${string}:${number}/${string}`;
|
|
8
62
|
export type MigrationStatus = {
|
|
9
63
|
codes: MigrationCode[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/migration/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AACF,MAAM,MAAM,UAAU,GAAG,GAAG,IAAI,MAAM,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;AAC7E,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,cAAc,CAAC;QAC9B,UAAU,EAAE,UAAU,CAAC;QACvB,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC;QACjC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QACzB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,EAAE,CAAC;IACJ,aAAa,EAAE,gBAAgB,EAAE,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/migration/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -75,7 +75,7 @@ var NaiteReporterClass = class {
|
|
|
75
75
|
*/
|
|
76
76
|
async send(data) {
|
|
77
77
|
const msg = `${JSON.stringify(data)}\n`;
|
|
78
|
-
await this.ensureConnection().catch((
|
|
78
|
+
await this.ensureConnection().catch(() => {});
|
|
79
79
|
if (this.connected && this.socket) this.socket.write(msg);
|
|
80
80
|
else {
|
|
81
81
|
this.buffer.push(msg);
|
|
@@ -126,4 +126,4 @@ const NaiteReporter = new NaiteReporterClass();
|
|
|
126
126
|
//#endregion
|
|
127
127
|
export { NaiteReporter };
|
|
128
128
|
|
|
129
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFpdGUtcmVwb3J0ZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL25haXRlL25haXRlLXJlcG9ydGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTmFpdGVSZXBvcnRlclxuICpcbiAqIO2FjOyKpO2KuCDqsrDqs7zsmYAgVHJhY2Ug7KCV67O066W8IFVuaXggU29ja2V07Jy866GcIFZTIENvZGUgZXh0ZW5zaW9u7JeQIOyghOuLrO2VqeuLiOuLpC5cbiAqIGV4dGVuc2lvbuydtCB+Ly5zb25hbXUvbmFpdGUte2hhc2h9LnNvY2vsl5Ag7IaM7LyTIOyEnOuyhOulvCDsl7TslrTrkaHri4jri6QuXG4gKlxuICog7ZSE66Gc7KCd7Yq467OE66GcIOqzoOycoO2VnCDshozsvJPsnYQg7IKs7Jqp7ZWY6riwIOychO2VtCBzb25hbXUuY29uZmlnLnRzIOqyveuhnOydmCDtlbTsi5zrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICpcbiAqIOuqqOuTiCDsi7HquIDthLTsnbTsp4Drp4wg7J247Iqk7YS07Iqk64qUIO2UhOuhnOyEuOyKpOuniOuLpCDrs4TqsJzsnoXri4jri6QuIHJ1bi9zdGFydMK3cnVuL2VuZOuKlFxuICogVml0ZXN0IOuplOyduCDtlITroZzshLjsiqQoTmFpdGVWaXRlc3RSZXBvcnRlciDsu6TsiqTthYAg66as7Y+s7YSwKeyXkOyEnCwgdGVzdC9yZXN1bHTripRcbiAqIOqwgSB3b3JrZXIg7ZSE66Gc7IS47IqkKGJvb3RzdHJhcOydmCBhZnRlckVhY2gp7JeQ7IScIOyghOyGoeuQmOuvgOuhnCBidWZmZXLsmYAg7IaM7LyTXG4gKiDsl7DqsrDsnYQg7ISc66GcIOqzteycoO2VmOyngCDslYrsirXri4jri6QuXG4gKlxuICogZnMgbW9jayDstqnrj4zsnYQg7ZS87ZWY6riwIOychO2VtCBuZXQg66qo65OI66eMIOyCrOyaqe2VqeuLiOuLpC5cbiAqL1xuLyogb3hsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqLyAvLyBOYWl0ZeuKlCBleHBlY3TsmYAg7Zi47J2R7ZWY64+E66GdIGFueeulvCDtl4jsmqntlahcblxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7IGNvbm5lY3QgfSBmcm9tIFwibmV0XCI7XG5pbXBvcnQgeyB0eXBlIFNvY2tldCB9IGZyb20gXCJuZXRcIjtcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tIFwib3NcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgeyBmaW5kQXBpUm9vdFBhdGggfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IHR5cGUgTmFpdGVNZXNzYWdpbmdUeXBlcyB9IGZyb20gXCIuL21lc3NhZ2luZy10eXBlc1wiO1xuXG4vKipcbiAqIHNvbmFtdS5jb25maWcudHMg6rK966Gc66W8IOuwm+yVhOyEnCDtlITroZzsoJ3tirjrs4Qg6rOg7JygIO2VtOyLnOulvCDsg53shLHtlanri4jri6QuXG4gKiDsnbXsiqTthZDshZjqs7wg64+Z7J287ZWcIOuwqeyLneycvOuhnCDqs4TsgrDtlbTslbwg7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBnZXRQcm9qZWN0SGFzaChjb25maWdQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY3JlYXRlSGFzaChcIm1kNVwiKS51cGRhdGUoY29uZmlnUGF0aCkuZGlnZXN0KFwiaGV4XCIpLnNsaWNlKDAsIDgpO1xufVxuXG4vKipcbiAqIO2YhOyerCDtlITroZzsoJ3tirjsnZgg7IaM7LyTIOqyveuhnOulvCDqs4TsgrDtlanri4jri6QuXG4gKiBTb25hbXUuYXBpUm9vdFBhdGjqsIAg7ISk7KCV65CcIO2bhOyXkCDtmLjstpztlbTslbwg7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBnZXRTb2NrZXRQYXRoKCk6IHN0cmluZyB7XG4gIC8vIHNvbmFtdS5jb25maWcudHPsnZgg7KCI64yAIOqyveuhnCDqs4TsgrBcbiAgLy8gYXBpUm9vdFBhdGjripQgL3Byb2plY3QvYXBpIO2Yle2DnOydtOqzoCwgY29uZmln64qUIC9wcm9qZWN0L2FwaS9zcmMvc29uYW11LmNvbmZpZy50c+yXkCDsnojsnYxcbiAgY29uc3QgY29uZmlnUGF0aCA9IGpvaW4oZmluZEFwaVJvb3RQYXRoKCksIFwic3JjXCIsIFwic29uYW11LmNvbmZpZy50c1wiKTtcbiAgY29uc3QgaGFzaCA9IGdldFByb2plY3RIYXNoKGNvbmZpZ1BhdGgpO1xuXG4gIHJldHVybiBwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCJcbiAgICA/IGBcXFxcXFxcXC5cXFxccGlwZVxcXFxuYWl0ZS0ke2hhc2h9YFxuICAgIDogam9pbihob21lZGlyKCksIFwiLnNvbmFtdVwiLCBgbmFpdGUtJHtoYXNofS5zb2NrYCk7XG59XG5cbi8qKlxuICog7Jew6rKwIOyLpO2MqOqwgCDsp4Dsho3rkKAg65WMKGV4dGVuc2lvbiDrr7jsi6Ttlokg65OxKSBidWZmZXLqsIAg66y07ZWc7Z6IIOy7pOyngOyngCDslYrrj4TroZ1cbiAqIOy1nOq3vCDrqZTsi5zsp4Drp4wg7J20IOqwnOyImOunjO2BvCDsnKDsp4Dtlanri4jri6QuXG4gKi9cbmNvbnN0IE1BWF9CVUZGRVJFRF9NRVNTQUdFUyA9IDEwMDA7XG5cbmNsYXNzIE5haXRlUmVwb3J0ZXJDbGFzcyB7XG4gIHByaXZhdGUgc29ja2V0UGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc29ja2V0OiBTb2NrZXQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb25uZWN0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBidWZmZXI6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqXG4gICAqIOyGjOy8kyDsl7DqsrAg7Iuc64+EXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUNvbm5lY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY29ubmVjdGVkIHx8IHRoaXMuc29ja2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4ge1xuICAgICAgaWYgKCF0aGlzLnNvY2tldFBhdGgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXRQYXRoID0gZ2V0U29ja2V0UGF0aCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5zb2NrZXQgPSBjb25uZWN0KHRoaXMuc29ja2V0UGF0aCk7XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uKFwiY29ubmVjdFwiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgLy8g67KE7Y287JeQIOyMk+yduCDrqZTsi5zsp4Ag7KCE7IahXG4gICAgICAgIGZvciAoY29uc3QgbXNnIG9mIHRoaXMuYnVmZmVyKSB7XG4gICAgICAgICAgdGhpcy5zb2NrZXQ/LndyaXRlKG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5idWZmZXIgPSBbXTtcbiAgICAgICAgcmVzKCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQub24oXCJlcnJvclwiLCAoZSkgPT4ge1xuICAgICAgICAvLyDsl7DqsrAg7Iuk7YyoIOustOyLnCAoZXh0ZW5zaW9u7J20IOq6vOyguOyeiOydhCDsiJgg7J6I7J2MKVxuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNvY2tldCA9IG51bGw7XG4gICAgICAgIHJlaihlKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbihcImNsb3NlXCIsICgpID0+IHtcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog66mU7Iuc7KeAIOyghOyGoSAo7KSE67CU6r+
|
|
129
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFpdGUtcmVwb3J0ZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL25haXRlL25haXRlLXJlcG9ydGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTmFpdGVSZXBvcnRlclxuICpcbiAqIO2FjOyKpO2KuCDqsrDqs7zsmYAgVHJhY2Ug7KCV67O066W8IFVuaXggU29ja2V07Jy866GcIFZTIENvZGUgZXh0ZW5zaW9u7JeQIOyghOuLrO2VqeuLiOuLpC5cbiAqIGV4dGVuc2lvbuydtCB+Ly5zb25hbXUvbmFpdGUte2hhc2h9LnNvY2vsl5Ag7IaM7LyTIOyEnOuyhOulvCDsl7TslrTrkaHri4jri6QuXG4gKlxuICog7ZSE66Gc7KCd7Yq467OE66GcIOqzoOycoO2VnCDshozsvJPsnYQg7IKs7Jqp7ZWY6riwIOychO2VtCBzb25hbXUuY29uZmlnLnRzIOqyveuhnOydmCDtlbTsi5zrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICpcbiAqIOuqqOuTiCDsi7HquIDthLTsnbTsp4Drp4wg7J247Iqk7YS07Iqk64qUIO2UhOuhnOyEuOyKpOuniOuLpCDrs4TqsJzsnoXri4jri6QuIHJ1bi9zdGFydMK3cnVuL2VuZOuKlFxuICogVml0ZXN0IOuplOyduCDtlITroZzshLjsiqQoTmFpdGVWaXRlc3RSZXBvcnRlciDsu6TsiqTthYAg66as7Y+s7YSwKeyXkOyEnCwgdGVzdC9yZXN1bHTripRcbiAqIOqwgSB3b3JrZXIg7ZSE66Gc7IS47IqkKGJvb3RzdHJhcOydmCBhZnRlckVhY2gp7JeQ7IScIOyghOyGoeuQmOuvgOuhnCBidWZmZXLsmYAg7IaM7LyTXG4gKiDsl7DqsrDsnYQg7ISc66GcIOqzteycoO2VmOyngCDslYrsirXri4jri6QuXG4gKlxuICogZnMgbW9jayDstqnrj4zsnYQg7ZS87ZWY6riwIOychO2VtCBuZXQg66qo65OI66eMIOyCrOyaqe2VqeuLiOuLpC5cbiAqL1xuLyogb3hsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqLyAvLyBOYWl0ZeuKlCBleHBlY3TsmYAg7Zi47J2R7ZWY64+E66GdIGFueeulvCDtl4jsmqntlahcblxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7IGNvbm5lY3QgfSBmcm9tIFwibmV0XCI7XG5pbXBvcnQgeyB0eXBlIFNvY2tldCB9IGZyb20gXCJuZXRcIjtcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tIFwib3NcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgeyBmaW5kQXBpUm9vdFBhdGggfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IHR5cGUgTmFpdGVNZXNzYWdpbmdUeXBlcyB9IGZyb20gXCIuL21lc3NhZ2luZy10eXBlc1wiO1xuXG4vKipcbiAqIHNvbmFtdS5jb25maWcudHMg6rK966Gc66W8IOuwm+yVhOyEnCDtlITroZzsoJ3tirjrs4Qg6rOg7JygIO2VtOyLnOulvCDsg53shLHtlanri4jri6QuXG4gKiDsnbXsiqTthZDshZjqs7wg64+Z7J287ZWcIOuwqeyLneycvOuhnCDqs4TsgrDtlbTslbwg7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBnZXRQcm9qZWN0SGFzaChjb25maWdQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY3JlYXRlSGFzaChcIm1kNVwiKS51cGRhdGUoY29uZmlnUGF0aCkuZGlnZXN0KFwiaGV4XCIpLnNsaWNlKDAsIDgpO1xufVxuXG4vKipcbiAqIO2YhOyerCDtlITroZzsoJ3tirjsnZgg7IaM7LyTIOqyveuhnOulvCDqs4TsgrDtlanri4jri6QuXG4gKiBTb25hbXUuYXBpUm9vdFBhdGjqsIAg7ISk7KCV65CcIO2bhOyXkCDtmLjstpztlbTslbwg7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBnZXRTb2NrZXRQYXRoKCk6IHN0cmluZyB7XG4gIC8vIHNvbmFtdS5jb25maWcudHPsnZgg7KCI64yAIOqyveuhnCDqs4TsgrBcbiAgLy8gYXBpUm9vdFBhdGjripQgL3Byb2plY3QvYXBpIO2Yle2DnOydtOqzoCwgY29uZmln64qUIC9wcm9qZWN0L2FwaS9zcmMvc29uYW11LmNvbmZpZy50c+yXkCDsnojsnYxcbiAgY29uc3QgY29uZmlnUGF0aCA9IGpvaW4oZmluZEFwaVJvb3RQYXRoKCksIFwic3JjXCIsIFwic29uYW11LmNvbmZpZy50c1wiKTtcbiAgY29uc3QgaGFzaCA9IGdldFByb2plY3RIYXNoKGNvbmZpZ1BhdGgpO1xuXG4gIHJldHVybiBwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCJcbiAgICA/IGBcXFxcXFxcXC5cXFxccGlwZVxcXFxuYWl0ZS0ke2hhc2h9YFxuICAgIDogam9pbihob21lZGlyKCksIFwiLnNvbmFtdVwiLCBgbmFpdGUtJHtoYXNofS5zb2NrYCk7XG59XG5cbi8qKlxuICog7Jew6rKwIOyLpO2MqOqwgCDsp4Dsho3rkKAg65WMKGV4dGVuc2lvbiDrr7jsi6Ttlokg65OxKSBidWZmZXLqsIAg66y07ZWc7Z6IIOy7pOyngOyngCDslYrrj4TroZ1cbiAqIOy1nOq3vCDrqZTsi5zsp4Drp4wg7J20IOqwnOyImOunjO2BvCDsnKDsp4Dtlanri4jri6QuXG4gKi9cbmNvbnN0IE1BWF9CVUZGRVJFRF9NRVNTQUdFUyA9IDEwMDA7XG5cbmNsYXNzIE5haXRlUmVwb3J0ZXJDbGFzcyB7XG4gIHByaXZhdGUgc29ja2V0UGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc29ja2V0OiBTb2NrZXQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb25uZWN0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBidWZmZXI6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqXG4gICAqIOyGjOy8kyDsl7DqsrAg7Iuc64+EXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUNvbm5lY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY29ubmVjdGVkIHx8IHRoaXMuc29ja2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4ge1xuICAgICAgaWYgKCF0aGlzLnNvY2tldFBhdGgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXRQYXRoID0gZ2V0U29ja2V0UGF0aCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5zb2NrZXQgPSBjb25uZWN0KHRoaXMuc29ja2V0UGF0aCk7XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uKFwiY29ubmVjdFwiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgLy8g67KE7Y287JeQIOyMk+yduCDrqZTsi5zsp4Ag7KCE7IahXG4gICAgICAgIGZvciAoY29uc3QgbXNnIG9mIHRoaXMuYnVmZmVyKSB7XG4gICAgICAgICAgdGhpcy5zb2NrZXQ/LndyaXRlKG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5idWZmZXIgPSBbXTtcbiAgICAgICAgcmVzKCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQub24oXCJlcnJvclwiLCAoZSkgPT4ge1xuICAgICAgICAvLyDsl7DqsrAg7Iuk7YyoIOustOyLnCAoZXh0ZW5zaW9u7J20IOq6vOyguOyeiOydhCDsiJgg7J6I7J2MKVxuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNvY2tldCA9IG51bGw7XG4gICAgICAgIHJlaihlKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbihcImNsb3NlXCIsICgpID0+IHtcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog66mU7Iuc7KeAIOyghOyGoSAo7KSE67CU6r+I7Jy866GcIOq1rOu2hClcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VuZChkYXRhOiBOYWl0ZU1lc3NhZ2luZ1R5cGVzLk5haXRlTWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1zZyA9IGAke0pTT04uc3RyaW5naWZ5KGRhdGEpfVxcbmA7XG5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZUNvbm5lY3Rpb24oKS5jYXRjaCgoKSA9PiB7fSk7XG5cbiAgICBpZiAodGhpcy5jb25uZWN0ZWQgJiYgdGhpcy5zb2NrZXQpIHtcbiAgICAgIHRoaXMuc29ja2V0LndyaXRlKG1zZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOyXsOqysCDrjIDquLAg7KSR7J2066m0IOuyhO2NvOyXkCDsoIDsnqUsIOyDge2VnCDstIjqs7wg7IucIOyYpOuemOuQnCDrqZTsi5zsp4DrtoDthLAg7Y+Q6riwXG4gICAgICB0aGlzLmJ1ZmZlci5wdXNoKG1zZyk7XG4gICAgICBpZiAodGhpcy5idWZmZXIubGVuZ3RoID4gTUFYX0JVRkZFUkVEX01FU1NBR0VTKSB7XG4gICAgICAgIHRoaXMuYnVmZmVyLnNoaWZ0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZpdGVzdCDsu6TsiqTthYAg66as7Y+s7YSwKE5haXRlVml0ZXN0UmVwb3J0ZXIp7J2YIG9uVGVzdFJ1blN0YXJ07JeQ7IScIO2YuOy2nO2VqeuLiOuLpC5cbiAgICog7YWM7Iqk7Yq4IHJ1biDsi5zsnpHsnYQg7JWM66a964uI64ukICjrjbDsnbTthLAg7YG066as7Ja0IOyLoO2YuCkuXG4gICAqL1xuICBhc3luYyBzdGFydFRlc3RSdW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHByb2Nlc3MuZW52LkNJKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zZW5kKHtcbiAgICAgIHR5cGU6IFwicnVuL3N0YXJ0XCIsXG4gICAgICBzdGFydGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBib290c3RyYXAoKeydmCBhZnRlckVhY2jsl5DshJwg7Zi47Lac7ZWp64uI64ukLlxuICAgKiDthYzsiqTtirgg7LyA7J207IqkIOqysOqzvOulvCB0cmFjZXPsmYAg7ZWo6ruYIOyghOyGoe2VqeuLiOuLpC5cbiAgICovXG4gIGFzeW5jIHJlcG9ydFRlc3RSZXN1bHQoXG4gICAgcmVzdWx0OiBPbWl0PE5haXRlTWVzc2FnaW5nVHlwZXMuVGVzdFJlc3VsdCwgXCJyZWNlaXZlZEF0XCI+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQ0kpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNlbmQoe1xuICAgICAgdHlwZTogXCJ0ZXN0L3Jlc3VsdFwiLFxuICAgICAgcmVjZWl2ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgLi4ucmVzdWx0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZpdGVzdCDsu6TsiqTthYAg66as7Y+s7YSwKE5haXRlVml0ZXN0UmVwb3J0ZXIp7J2YIG9uVGVzdFJ1bkVuZOyXkOyEnCDtmLjstpztlanri4jri6QuXG4gICAqIO2FjOyKpO2KuCBydW4g7KKF66OM66W8IOyVjOumveuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGVuZFRlc3RSdW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHByb2Nlc3MuZW52LkNJKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zZW5kKHtcbiAgICAgIHR5cGU6IFwicnVuL2VuZFwiLFxuICAgICAgZW5kZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH0pO1xuXG4gICAgLy8g7Jew6rKwIOyiheujjFxuICAgIGlmICh0aGlzLnNvY2tldCkge1xuICAgICAgdGhpcy5zb2NrZXQuZW5kKCk7XG4gICAgICB0aGlzLnNvY2tldCA9IG51bGw7XG4gICAgICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3Qg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
|