sonamu 0.9.19 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/_rolldown/runtime.js +36 -0
- package/dist/ai/agents/agent.js +5 -7
- package/dist/ai/agents/index.js +1 -2
- package/dist/ai/agents/types.js +1 -1
- package/dist/ai/index.js +1 -2
- package/dist/ai/providers/rtzr/api.js +2 -3
- package/dist/ai/providers/rtzr/error.js +14 -29
- package/dist/ai/providers/rtzr/index.js +1 -2
- package/dist/ai/providers/rtzr/model.js +13 -20
- package/dist/ai/providers/rtzr/options.js +2 -3
- package/dist/ai/providers/rtzr/provider.js +2 -3
- package/dist/ai/providers/rtzr/utils.js +12 -21
- package/dist/api/base-frame.js +4 -4
- package/dist/api/caster.js +21 -38
- package/dist/api/code-converters.js +41 -98
- package/dist/api/config.d.ts +1 -10
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +9 -8
- package/dist/api/context.js +2 -3
- package/dist/api/decorators.js +80 -116
- package/dist/api/index.js +2 -3
- package/dist/api/secret.js +6 -10
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +200 -387
- package/dist/api/validator.js +5 -8
- package/dist/api/websocket-helpers.js +21 -32
- package/dist/auth/audit-log/builders.js +2 -3
- package/dist/auth/audit-log/events.js +2 -2
- package/dist/auth/audit-log/plugin.js +30 -61
- package/dist/auth/audit-log-ingestor.js +19 -41
- package/dist/auth/auth-generator.js +16 -41
- package/dist/auth/better-auth-entities.js +3 -4
- package/dist/auth/index.js +2 -3
- package/dist/auth/knex-adapter.js +18 -45
- package/dist/auth/plugins/entity-definitions/admin.js +2 -2
- package/dist/auth/plugins/entity-definitions/anonymous.js +2 -2
- package/dist/auth/plugins/entity-definitions/api-key.js +2 -2
- package/dist/auth/plugins/entity-definitions/audit-log.js +2 -2
- package/dist/auth/plugins/entity-definitions/index.js +2 -3
- package/dist/auth/plugins/entity-definitions/jwt.js +2 -2
- package/dist/auth/plugins/entity-definitions/organization.js +2 -2
- package/dist/auth/plugins/entity-definitions/passkey.js +2 -2
- package/dist/auth/plugins/entity-definitions/phone-number.js +2 -2
- package/dist/auth/plugins/entity-definitions/sso.js +2 -2
- package/dist/auth/plugins/entity-definitions/two-factor.js +2 -2
- package/dist/auth/plugins/entity-definitions/types.js +1 -1
- package/dist/auth/plugins/entity-definitions/username.js +2 -2
- package/dist/auth/plugins/index.js +1 -2
- package/dist/auth/plugins/wrappers/admin.js +2 -3
- package/dist/auth/plugins/wrappers/anonymous.js +2 -3
- package/dist/auth/plugins/wrappers/api-key.js +2 -3
- package/dist/auth/plugins/wrappers/index.js +1 -2
- package/dist/auth/plugins/wrappers/jwt.js +2 -3
- package/dist/auth/plugins/wrappers/organization.js +2 -3
- package/dist/auth/plugins/wrappers/passkey.js +2 -3
- package/dist/auth/plugins/wrappers/phone-number.js +2 -3
- package/dist/auth/plugins/wrappers/sso.js +2 -3
- package/dist/auth/plugins/wrappers/two-factor.js +2 -3
- package/dist/auth/plugins/wrappers/username.js +2 -3
- package/dist/bin/build-config.js +2 -2
- package/dist/bin/cli.js +151 -258
- package/dist/bin/fixture.d.ts.map +1 -1
- package/dist/bin/fixture.js +55 -97
- package/dist/bin/hmr-hook-register.js +3 -3
- package/dist/bin/migrate-targets.d.ts +3 -0
- package/dist/bin/migrate-targets.d.ts.map +1 -0
- package/dist/bin/migrate-targets.js +11 -0
- package/dist/bin/test-command.js +25 -55
- package/dist/bin/ts-loader-register.js +5 -6
- package/dist/bin/ts-loader-registration.js +6 -13
- package/dist/cache/cache-manager.js +3 -4
- package/dist/cache/decorator.js +11 -21
- package/dist/cache/drivers.js +2 -3
- package/dist/cache/index.js +2 -3
- package/dist/cache/types.js +1 -1
- package/dist/cache-control/cache-control.js +21 -34
- package/dist/cache-control/types.js +1 -1
- package/dist/compress/compress.js +10 -10
- package/dist/compress/index.js +1 -2
- package/dist/compress/types.js +1 -1
- package/dist/cone/cone-generator.js +25 -63
- package/dist/database/_batch_update.js +26 -46
- package/dist/database/base-model.js +44 -97
- package/dist/database/base-model.types.js +1 -1
- package/dist/database/db.d.ts +8 -14
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +127 -72
- package/dist/database/knex.js +5 -8
- package/dist/database/puri-subset.types.js +1 -1
- package/dist/database/puri-wrapper.js +11 -15
- package/dist/database/puri.js +117 -234
- package/dist/database/puri.types.js +3 -4
- package/dist/database/transaction-context.js +4 -5
- package/dist/database/upsert-builder.js +109 -176
- package/dist/dict/en.d.ts +1 -0
- package/dist/dict/en.d.ts.map +1 -1
- package/dist/dict/en.js +4 -4
- package/dist/dict/index.js +2 -3
- package/dist/dict/ko.d.ts +1 -0
- package/dist/dict/ko.d.ts.map +1 -1
- package/dist/dict/ko.js +4 -4
- package/dist/dict/rc-keys.js +3 -4
- package/dist/dict/sd.js +8 -19
- package/dist/dict/sonamu-dictionary.js +141 -284
- package/dist/dict/types.js +1 -1
- package/dist/dict/utils.js +4 -5
- package/dist/entity/entity-manager.d.ts +2 -2
- package/dist/entity/entity-manager.js +34 -82
- package/dist/entity/entity-template-cone.js +33 -66
- package/dist/entity/entity.js +156 -310
- package/dist/env.d.ts +14 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +75 -0
- package/dist/exceptions/error-handler.js +2 -3
- package/dist/exceptions/so-exceptions.js +7 -5
- package/dist/filter/index.js +1 -2
- package/dist/filter/types.js +3 -4
- package/dist/filter/utils.js +21 -54
- package/dist/index.js +8 -7
- package/dist/logger/category.js +6 -12
- package/dist/logger/configure.js +23 -34
- package/dist/migration/code-generation.js +146 -314
- package/dist/migration/index-where-predicate.js +52 -144
- package/dist/migration/migration-set.js +19 -33
- package/dist/migration/migrator.d.ts +2 -0
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +69 -53
- package/dist/migration/postgresql-schema-reader.js +126 -225
- package/dist/migration/slack-confirm.d.ts +1 -0
- package/dist/migration/slack-confirm.d.ts.map +1 -1
- package/dist/migration/slack-confirm.js +28 -38
- package/dist/migration/types.js +1 -1
- package/dist/naite/messaging-types.js +1 -1
- package/dist/naite/naite-reporter.js +15 -32
- package/dist/naite/naite.js +43 -76
- package/dist/ssr/index.js +6 -9
- package/dist/ssr/registry.js +10 -18
- package/dist/ssr/renderer.js +10 -21
- package/dist/ssr/types.js +1 -1
- package/dist/storage/base-file.js +5 -10
- package/dist/storage/buffered-file.js +3 -4
- package/dist/storage/drivers.js +2 -3
- package/dist/storage/index.js +2 -3
- package/dist/storage/s3-driver.js +5 -9
- package/dist/storage/storage-manager.js +5 -5
- package/dist/storage/types.js +1 -1
- package/dist/storage/uploaded-file.js +4 -6
- package/dist/stream/index.js +1 -2
- package/dist/stream/sse.js +8 -13
- package/dist/stream/ws-audience-resolver.js +5 -5
- package/dist/stream/ws-audience.js +3 -4
- package/dist/stream/ws-cluster-bus.js +3 -4
- package/dist/stream/ws-core.js +1 -1
- package/dist/stream/ws-delivery.js +11 -25
- package/dist/stream/ws-local-connection-store.js +9 -18
- package/dist/stream/ws-presence-store.js +43 -97
- package/dist/stream/ws-registry.js +17 -22
- package/dist/stream/ws-telemetry-memory.js +38 -45
- package/dist/stream/ws-telemetry-trace.js +4 -6
- package/dist/stream/ws-telemetry.js +82 -135
- package/dist/stream/ws.js +47 -91
- package/dist/syncer/api-parser.js +81 -147
- package/dist/syncer/checksum.js +9 -20
- package/dist/syncer/code-generator.js +29 -47
- package/dist/syncer/entity-operations.js +17 -27
- package/dist/syncer/event-batcher.js +8 -15
- package/dist/syncer/file-patterns.js +3 -4
- package/dist/syncer/file-tracking.js +6 -10
- package/dist/syncer/index.js +1 -2
- package/dist/syncer/module-loader.js +10 -26
- package/dist/syncer/syncer-actions.js +19 -37
- package/dist/syncer/syncer.js +46 -98
- package/dist/syncer/watcher.js +12 -26
- package/dist/tasks/decorator.js +7 -11
- package/dist/tasks/step-wrapper.js +7 -8
- package/dist/tasks/workflow-manager.js +18 -25
- package/dist/template/entity-converter.js +40 -64
- package/dist/template/helpers.js +32 -63
- package/dist/template/implementations/entity.template.js +7 -11
- package/dist/template/implementations/entry-server.template.js +2 -3
- package/dist/template/implementations/generated.template.js +25 -51
- package/dist/template/implementations/generated_http.template.js +31 -58
- package/dist/template/implementations/generated_sso.template.js +45 -85
- package/dist/template/implementations/init_types.template.js +4 -7
- package/dist/template/implementations/model.template.js +5 -10
- package/dist/template/implementations/model_test.template.js +2 -3
- package/dist/template/implementations/queries.template.js +4 -7
- package/dist/template/implementations/sd.template.js +17 -35
- package/dist/template/implementations/services.template.js +18 -30
- package/dist/template/implementations/view_form.template.js +72 -125
- package/dist/template/implementations/view_id_all_select.template.js +2 -3
- package/dist/template/implementations/view_list.template.js +86 -143
- package/dist/template/implementations/view_search_input.template.js +2 -3
- package/dist/template/index.js +5 -8
- package/dist/template/template-manager.js +13 -26
- package/dist/template/template-types.js +2 -3
- package/dist/template/template.js +7 -11
- package/dist/template/zod-converter.js +173 -348
- package/dist/testing/_relation-graph.js +18 -37
- package/dist/testing/bootstrap.js +5 -8
- package/dist/testing/data-explorer.js +34 -78
- package/dist/testing/dev-test-routes.js +54 -60
- package/dist/testing/dev-vitest-manager.js +33 -84
- package/dist/testing/faker-mappings.js +3 -4
- package/dist/testing/fixture-generator.d.ts +2 -1
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +159 -321
- package/dist/testing/fixture-loader.js +2 -2
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +124 -227
- package/dist/testing/global-setup.d.ts.map +1 -1
- package/dist/testing/global-setup.js +29 -17
- package/dist/testing/index.js +1 -2
- package/dist/testing/naite-vitest-reporter.js +2 -3
- package/dist/testing/parallel-db-manager.js +5 -3
- package/dist/testing/vitest-helpers.d.ts.map +1 -1
- package/dist/testing/vitest-helpers.js +15 -12
- package/dist/types/types.d.ts +14 -14
- package/dist/types/types.js +27 -50
- package/dist/ui/ai-api.js +6 -11
- package/dist/ui/ai-client.js +86 -134
- package/dist/ui/api.js +99 -195
- package/dist/ui/cdd-service.js +78 -130
- package/dist/ui/cdd-types.js +1 -1
- package/dist/ui-web/assets/{index-Df8q-fhb.js → index-DFStGyd0.js} +49 -49
- package/dist/ui-web/assets/index-Dx4ap5i4.css +1 -0
- package/dist/ui-web/index.html +2 -2
- package/dist/utils/async-utils.js +13 -25
- package/dist/utils/class-name.js +3 -4
- package/dist/utils/console-util.js +11 -26
- package/dist/utils/controller.d.ts.map +1 -1
- package/dist/utils/controller.js +14 -12
- package/dist/utils/esm-utils.js +5 -8
- package/dist/utils/formatter.js +10 -22
- package/dist/utils/fs-utils.js +14 -25
- package/dist/utils/lodash-able.js +3 -4
- package/dist/utils/model.js +7 -14
- package/dist/utils/object-utils.js +41 -73
- package/dist/utils/path-utils.js +5 -9
- package/dist/utils/process-utils.js +4 -7
- package/dist/utils/sql-parser.js +6 -13
- package/dist/utils/type-utils.js +16 -26
- package/dist/utils/utils.js +18 -40
- package/dist/utils/zod-error.js +9 -16
- package/dist/vector/chunking.js +24 -37
- package/dist/vector/config.js +2 -2
- package/dist/vector/embedding.js +8 -19
- package/dist/vector/index.js +1 -2
- package/dist/vector/types.js +1 -1
- package/package.json +7 -7
- package/src/__tests__/env.test.ts +127 -0
- package/src/api/__tests__/config.test.ts +10 -1
- package/src/api/config.ts +4 -12
- package/src/api/sonamu.ts +14 -4
- package/src/bin/__tests__/migrate-targets.test.ts +28 -0
- package/src/bin/__tests__/test-command.test.ts +82 -1
- package/src/bin/cli.ts +9 -18
- package/src/bin/fixture.ts +5 -4
- package/src/bin/migrate-targets.ts +7 -0
- package/src/bin/test-command.ts +2 -2
- package/src/database/__tests__/db.test.ts +175 -0
- package/src/database/db.ts +193 -71
- package/src/dict/en.ts +2 -0
- package/src/dict/ko.ts +2 -0
- package/src/env.ts +123 -0
- package/src/migration/__tests__/migrator.test.ts +149 -0
- package/src/migration/migrator.ts +74 -17
- package/src/migration/slack-confirm.ts +21 -0
- package/src/skills/sonamu/database.md +1 -1
- package/src/skills/sonamu/entity-basic.md +31 -0
- package/src/skills/sonamu/puri.md +22 -0
- package/src/skills/sonamu/testing-devrunner.md +1 -1
- package/src/skills/sonamu/upsert.md +53 -6
- package/src/stream/ws-telemetry-memory.ts +2 -2
- package/src/testing/fixture-generator.ts +2 -1
- package/src/testing/fixture-manager.ts +3 -4
- package/src/testing/global-setup.ts +42 -18
- package/src/testing/vitest-helpers.ts +14 -0
- package/src/utils/controller.ts +14 -7
- package/tsdown.api.config.ts +6 -0
- package/dist/_virtual/rolldown_runtime.js +0 -39
- package/dist/ui-web/assets/index-D4rYm-Xz.css +0 -1
package/dist/api/context.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { __esmMin } from "../_virtual/
|
|
2
|
-
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
3
2
|
//#region src/api/context.ts
|
|
4
3
|
var init_context = __esmMin((() => {}));
|
|
5
|
-
|
|
6
4
|
//#endregion
|
|
7
5
|
init_context();
|
|
8
6
|
export { init_context };
|
|
7
|
+
|
|
9
8
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2NvbnRleHQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBJbmNvbWluZ0h0dHBIZWFkZXJzLFxuICB0eXBlIEluY29taW5nTWVzc2FnZSxcbiAgdHlwZSBTZXJ2ZXIsXG4gIHR5cGUgU2VydmVyUmVzcG9uc2UsXG59IGZyb20gXCJodHRwXCI7XG5cbmltcG9ydCB7IHR5cGUgU2Vzc2lvbiwgdHlwZSBVc2VyIH0gZnJvbSBcImJldHRlci1hdXRoXCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSwgdHlwZSBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyB0eXBlIFJvdXRlR2VuZXJpY0ludGVyZmFjZSB9IGZyb20gXCJmYXN0aWZ5L3R5cGVzL3JvdXRlXCI7XG5pbXBvcnQgeyB0eXBlIFpvZE9iamVjdCB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgdHlwZSBOYWl0ZVN0b3JlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyB0eXBlIEJ1ZmZlcmVkRmlsZSB9IGZyb20gXCIuLi9zdG9yYWdlL2J1ZmZlcmVkLWZpbGVcIjtcbmltcG9ydCB7IHR5cGUgVXBsb2FkZWRGaWxlIH0gZnJvbSBcIi4uL3N0b3JhZ2UvdXBsb2FkZWQtZmlsZVwiO1xuaW1wb3J0IHsgdHlwZSBjcmVhdGVTU0VGYWN0b3J5IH0gZnJvbSBcIi4uL3N0cmVhbS9zc2VcIjtcbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0Q29ubmVjdGlvbiwgdHlwZSBXZWJTb2NrZXRFdmVudE1hcCB9IGZyb20gXCIuLi9zdHJlYW0vd3NcIjtcblxuLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1pbnRlcmZhY2UgLS0gQ29udGV4dCDtmZXsnqUg7YOA7J6FXG5leHBvcnQgaW50ZXJmYWNlIENvbnRleHRFeHRlbmQge31cbnR5cGUgQmFzZUNvbnRleHQgPSB7XG4gIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0O1xuICBoZWFkZXJzOiBJbmNvbWluZ0h0dHBIZWFkZXJzO1xuICBuYWl0ZVN0b3JlOiBOYWl0ZVN0b3JlO1xuICAvKiog7ZiE7J6sIOyalOyyreydmCBsb2NhbGUgKi9cbiAgbG9jYWxlOiBzdHJpbmc7XG4gIC8qKiDtmITsnqwg66Gc6re47J247ZWcIOyCrOyaqeyekCAobnVsbOydtOuptCDrr7jsnbjspp0pICovXG4gIHVzZXI6IFVzZXIgfCBudWxsO1xuICAvKiog7ZiE7J6sIOyEuOyFmCDsoJXrs7QgKG51bGzsnbTrqbQg66+47J247KadKSAqL1xuICBzZXNzaW9uOiBTZXNzaW9uIHwgbnVsbDtcbn07XG5cbmV4cG9ydCB0eXBlIENvbnRleHQgPSBCYXNlQ29udGV4dCAmIHtcbiAgdHJhbnNwb3J0OiBcImh0dHBcIjtcbiAgcmVwbHk6IEZhc3RpZnlSZXBseTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2UsIFJvdXRlR2VuZXJpY0ludGVyZmFjZT47XG4gIGNyZWF0ZVNTRTogPFQgZXh0ZW5kcyBab2RPYmplY3Q+KGV2ZW50czogVCkgPT4gUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlU1NFRmFjdG9yeTxUPj47XG4gIC8qKiBidWZmZXIg66qo65Oc7JeQ7IScIOyXheuhnOuTnOuQnCDtjIzsnbwgKi9cbiAgYnVmZmVyZWRGaWxlcz86IEJ1ZmZlcmVkRmlsZVtdO1xuICAvKiogc3RyZWFtIOuqqOuTnOyXkOyEnCDsl4XroZzrk5zrkJwg7YyM7J28ICovXG4gIHVwbG9hZGVkRmlsZXM/OiBVcGxvYWRlZEZpbGVbXTtcbn0gJiBDb250ZXh0RXh0ZW5kO1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRDb250ZXh0PFxuICBUT3V0IGV4dGVuZHMgV2ViU29ja2V0RXZlbnRNYXAgPSBXZWJTb2NrZXRFdmVudE1hcCxcbiAgVEluIGV4dGVuZHMgV2ViU29ja2V0RXZlbnRNYXAgPSBXZWJTb2NrZXRFdmVudE1hcCxcbj4gPSBCYXNlQ29udGV4dCAmIHtcbiAgdHJhbnNwb3J0OiBcIndzXCI7XG4gIHdzOiBXZWJTb2NrZXRDb25uZWN0aW9uPFRPdXQsIFRJbj47XG59ICYgQ29udGV4dEV4dGVuZDtcblxuZXhwb3J0IHR5cGUgUnVudGltZUNvbnRleHQgPSBDb250ZXh0IHwgV2ViU29ja2V0Q29udGV4dDtcbiJdLCJtYXBwaW5ncyI6IiJ9
|
package/dist/api/decorators.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __esmMin } from "../_virtual/
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { convertDomainToCategory, init_category } from "../logger/category.js";
|
|
3
3
|
import { getModelNameFromClassName, init_class_name } from "../utils/class-name.js";
|
|
4
4
|
import { DB, init_db } from "../database/db.js";
|
|
@@ -10,15 +10,11 @@ import { getLogger } from "@logtape/logtape";
|
|
|
10
10
|
import inflection from "inflection";
|
|
11
11
|
import { isEqual } from "radashi";
|
|
12
12
|
import assert from "assert";
|
|
13
|
-
|
|
14
13
|
//#region src/api/decorators.ts
|
|
15
14
|
function checkSingleDecorator(target, propertyKey, decoratorType) {
|
|
16
15
|
const method = target[propertyKey];
|
|
17
|
-
if (method?.__decoratorType && method?.__decoratorType !== decoratorType) {
|
|
18
|
-
|
|
19
|
-
} else {
|
|
20
|
-
method.__decoratorType = decoratorType;
|
|
21
|
-
}
|
|
16
|
+
if (method?.__decoratorType && method?.__decoratorType !== decoratorType) throw new Error(`@${decoratorType.description ?? String(decoratorType)} decorator can only be used once on ${target.constructor.name}.${propertyKey}. You can use only one of @api, @stream, @websocket, or @upload decorator on the same method.`);
|
|
17
|
+
else method.__decoratorType = decoratorType;
|
|
22
18
|
}
|
|
23
19
|
function api(options = {}) {
|
|
24
20
|
options = {
|
|
@@ -34,7 +30,7 @@ function api(options = {}) {
|
|
|
34
30
|
checkSingleDecorator(target, propertyKey, DECORATOR_TYPES.API);
|
|
35
31
|
const defaultPath = `/${inflection.camelize(modelName.replace(/Model$/, "").replace(/Frame$/, ""), true)}/${inflection.camelize(propertyKey, true)}`;
|
|
36
32
|
const path = options.path ?? defaultPath;
|
|
37
|
-
const existingApi = registeredApis.find((api
|
|
33
|
+
const existingApi = registeredApis.find((api) => api.modelName === modelName && api.methodName === methodName);
|
|
38
34
|
if (existingApi) {
|
|
39
35
|
assertNoConflictingPath("api", modelName, methodName, existingApi.path, path);
|
|
40
36
|
existingApi.path = path;
|
|
@@ -43,30 +39,24 @@ function api(options = {}) {
|
|
|
43
39
|
...existingApi.options,
|
|
44
40
|
...options
|
|
45
41
|
};
|
|
46
|
-
} else {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
});
|
|
53
|
-
}
|
|
42
|
+
} else registeredApis.push({
|
|
43
|
+
modelName,
|
|
44
|
+
methodName,
|
|
45
|
+
path,
|
|
46
|
+
options
|
|
47
|
+
});
|
|
54
48
|
const originalMethod = descriptor.value;
|
|
55
49
|
descriptor.value = async function(...args) {
|
|
56
|
-
if (this instanceof BaseModelClass) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
model: modelName,
|
|
67
|
-
method: methodName
|
|
68
|
-
});
|
|
69
|
-
}
|
|
50
|
+
if (this instanceof BaseModelClass) getLogger(convertDomainToCategory(this.modelName, "model")).debug("api: {httpMethod} {model}.{method}", {
|
|
51
|
+
httpMethod: options.httpMethod,
|
|
52
|
+
model: modelName,
|
|
53
|
+
method: methodName
|
|
54
|
+
});
|
|
55
|
+
if (this instanceof BaseFrameClass) getLogger(convertDomainToCategory(this.frameName, "frame")).debug("api: {httpMethod} {model}.{method}", {
|
|
56
|
+
httpMethod: options.httpMethod,
|
|
57
|
+
model: modelName,
|
|
58
|
+
method: methodName
|
|
59
|
+
});
|
|
70
60
|
return originalMethod.apply(this, args);
|
|
71
61
|
};
|
|
72
62
|
};
|
|
@@ -84,7 +74,7 @@ function stream(options) {
|
|
|
84
74
|
...apiOptions,
|
|
85
75
|
httpMethod: "GET"
|
|
86
76
|
};
|
|
87
|
-
const existingApi = registeredApis.find((api
|
|
77
|
+
const existingApi = registeredApis.find((api) => api.modelName === modelName && api.methodName === methodName);
|
|
88
78
|
if (existingApi) {
|
|
89
79
|
assertNoConflictingPath("stream", modelName, methodName, existingApi.path, path);
|
|
90
80
|
existingApi.path = path;
|
|
@@ -94,29 +84,23 @@ function stream(options) {
|
|
|
94
84
|
...optionsWithDefaults
|
|
95
85
|
};
|
|
96
86
|
existingApi.streamOptions = options;
|
|
97
|
-
} else {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
});
|
|
105
|
-
}
|
|
87
|
+
} else registeredApis.push({
|
|
88
|
+
modelName,
|
|
89
|
+
methodName,
|
|
90
|
+
path,
|
|
91
|
+
options: optionsWithDefaults,
|
|
92
|
+
streamOptions: options
|
|
93
|
+
});
|
|
106
94
|
const originalMethod = descriptor.value;
|
|
107
95
|
descriptor.value = async function(...args) {
|
|
108
|
-
if (this instanceof BaseModelClass) {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
model: modelName,
|
|
117
|
-
method: methodName
|
|
118
|
-
});
|
|
119
|
-
}
|
|
96
|
+
if (this instanceof BaseModelClass) getLogger(convertDomainToCategory(this.modelName, "model")).debug("stream: {model}.{method}", {
|
|
97
|
+
model: modelName,
|
|
98
|
+
method: methodName
|
|
99
|
+
});
|
|
100
|
+
if (this instanceof BaseFrameClass) getLogger(convertDomainToCategory(this.frameName, "frame")).debug("stream: {model}.{method}", {
|
|
101
|
+
model: modelName,
|
|
102
|
+
method: methodName
|
|
103
|
+
});
|
|
120
104
|
return originalMethod.apply(this, args);
|
|
121
105
|
};
|
|
122
106
|
};
|
|
@@ -134,7 +118,7 @@ function websocket(options) {
|
|
|
134
118
|
...apiOptions,
|
|
135
119
|
httpMethod: "GET"
|
|
136
120
|
};
|
|
137
|
-
const existingApi = registeredApis.find((api
|
|
121
|
+
const existingApi = registeredApis.find((api) => api.modelName === modelName && api.methodName === methodName);
|
|
138
122
|
if (existingApi) {
|
|
139
123
|
assertNoConflictingPath("websocket", modelName, methodName, existingApi.path, path);
|
|
140
124
|
existingApi.path = path;
|
|
@@ -144,29 +128,23 @@ function websocket(options) {
|
|
|
144
128
|
...optionsWithDefaults
|
|
145
129
|
};
|
|
146
130
|
existingApi.websocketOptions = options;
|
|
147
|
-
} else {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
});
|
|
155
|
-
}
|
|
131
|
+
} else registeredApis.push({
|
|
132
|
+
modelName,
|
|
133
|
+
methodName,
|
|
134
|
+
path,
|
|
135
|
+
options: optionsWithDefaults,
|
|
136
|
+
websocketOptions: options
|
|
137
|
+
});
|
|
156
138
|
const originalMethod = descriptor.value;
|
|
157
139
|
descriptor.value = async function(...args) {
|
|
158
|
-
if (this instanceof BaseModelClass) {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
model: modelName,
|
|
167
|
-
method: methodName
|
|
168
|
-
});
|
|
169
|
-
}
|
|
140
|
+
if (this instanceof BaseModelClass) getLogger(convertDomainToCategory(this.modelName, "model")).debug("websocket: {model}.{method}", {
|
|
141
|
+
model: modelName,
|
|
142
|
+
method: methodName
|
|
143
|
+
});
|
|
144
|
+
if (this instanceof BaseFrameClass) getLogger(convertDomainToCategory(this.frameName, "frame")).debug("websocket: {model}.{method}", {
|
|
145
|
+
model: modelName,
|
|
146
|
+
method: methodName
|
|
147
|
+
});
|
|
170
148
|
return originalMethod.apply(this, args);
|
|
171
149
|
};
|
|
172
150
|
};
|
|
@@ -185,8 +163,7 @@ function transactional(options = {}) {
|
|
|
185
163
|
});
|
|
186
164
|
const existingContext = DB.transactionStorage.getStore();
|
|
187
165
|
const startTransaction = async () => {
|
|
188
|
-
|
|
189
|
-
return puri.knex.transaction(async (trx) => {
|
|
166
|
+
return this.getPuri(dbPreset).knex.transaction(async (trx) => {
|
|
190
167
|
this.logger.debug("new transaction context: {dbPreset}", { dbPreset });
|
|
191
168
|
const trxWrapper = new PuriTransactionWrapper(trx, new UpsertBuilder());
|
|
192
169
|
DB.getTransactionContext().setTransaction(dbPreset, trxWrapper);
|
|
@@ -201,9 +178,7 @@ function transactional(options = {}) {
|
|
|
201
178
|
readOnly
|
|
202
179
|
});
|
|
203
180
|
};
|
|
204
|
-
if (!existingContext)
|
|
205
|
-
return DB.runWithTransaction(startTransaction);
|
|
206
|
-
}
|
|
181
|
+
if (!existingContext) return DB.runWithTransaction(startTransaction);
|
|
207
182
|
if (existingContext?.getTransaction(dbPreset)) {
|
|
208
183
|
this.logger.debug("reuse transaction context: {dbPreset}", { dbPreset });
|
|
209
184
|
return originalMethod.apply(this, args);
|
|
@@ -226,36 +201,29 @@ function upload(options = { consume: "buffer" }) {
|
|
|
226
201
|
const methodName = propertyKey;
|
|
227
202
|
checkSingleDecorator(target, propertyKey, DECORATOR_TYPES.UPLOAD);
|
|
228
203
|
const defaultPath = `/${inflection.camelize(modelName.replace(/Model$/, "").replace(/Frame$/, ""), true)}/${inflection.camelize(methodName, true)}`;
|
|
229
|
-
const existingApi = registeredApis.find((api
|
|
230
|
-
if (existingApi)
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
uploadOptions: options
|
|
244
|
-
});
|
|
245
|
-
}
|
|
204
|
+
const existingApi = registeredApis.find((api) => api.modelName === modelName && api.methodName === methodName);
|
|
205
|
+
if (existingApi) existingApi.uploadOptions = options;
|
|
206
|
+
else registeredApis.push({
|
|
207
|
+
modelName,
|
|
208
|
+
methodName,
|
|
209
|
+
path: defaultPath,
|
|
210
|
+
options: {
|
|
211
|
+
httpMethod: "POST",
|
|
212
|
+
clients: ["axios-multipart", "tanstack-mutation-multipart"],
|
|
213
|
+
guards: options.guards,
|
|
214
|
+
description: options.description
|
|
215
|
+
},
|
|
216
|
+
uploadOptions: options
|
|
217
|
+
});
|
|
246
218
|
descriptor.value = async function(...args) {
|
|
247
|
-
if (this instanceof BaseModelClass) {
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
model: modelName,
|
|
256
|
-
method: methodName
|
|
257
|
-
});
|
|
258
|
-
}
|
|
219
|
+
if (this instanceof BaseModelClass) getLogger(convertDomainToCategory(this.modelName, "model")).debug("upload: {model}.{method}", {
|
|
220
|
+
model: modelName,
|
|
221
|
+
method: methodName
|
|
222
|
+
});
|
|
223
|
+
if (this instanceof BaseFrameClass) getLogger(convertDomainToCategory(this.frameName, "frame")).debug("upload: {model}.{method}", {
|
|
224
|
+
model: modelName,
|
|
225
|
+
method: methodName
|
|
226
|
+
});
|
|
259
227
|
return originalMethod.apply(this, args);
|
|
260
228
|
};
|
|
261
229
|
return descriptor;
|
|
@@ -270,9 +238,7 @@ function upload(options = { consume: "buffer" }) {
|
|
|
270
238
|
* @param newPath 새로운 path
|
|
271
239
|
*/
|
|
272
240
|
function assertNoConflictingPath(decoratorName, modelName, methodName, existingPath, newPath) {
|
|
273
|
-
if (existingPath !== "" && newPath !== "" && existingPath !== newPath) {
|
|
274
|
-
throw new Error(`@${decoratorName} decorator on ${modelName}.${methodName} has conflicting path: ${newPath}. The decorator is trying to override the existing path(${existingPath}) with the new path(${newPath}).`);
|
|
275
|
-
}
|
|
241
|
+
if (existingPath !== "" && newPath !== "" && existingPath !== newPath) throw new Error(`@${decoratorName} decorator on ${modelName}.${methodName} has conflicting path: ${newPath}. The decorator is trying to override the existing path(${existingPath}) with the new path(${newPath}).`);
|
|
276
242
|
}
|
|
277
243
|
/**
|
|
278
244
|
* 기존의 옵션과 새로운 옵션이 겹치는 부분이 있다면 에러를 터뜨려줍니다.
|
|
@@ -284,9 +250,7 @@ function assertNoConflictingPath(decoratorName, modelName, methodName, existingP
|
|
|
284
250
|
*/
|
|
285
251
|
function assertNoConflictingOptions(decoratorName, modelName, methodName, existingOptions, newOptions) {
|
|
286
252
|
Object.keys(newOptions).forEach((key) => {
|
|
287
|
-
if (existingOptions[key] && !isEqual(existingOptions[key], newOptions[key])) {
|
|
288
|
-
throw new Error(`@${decoratorName} decorator on ${modelName}.${methodName} has conflicting options: ${key}. The decorator is trying to override the existing option(${JSON.stringify(existingOptions[key])}) with the new option(${JSON.stringify(newOptions[key])}).`);
|
|
289
|
-
}
|
|
253
|
+
if (existingOptions[key] && !isEqual(existingOptions[key], newOptions[key])) throw new Error(`@${decoratorName} decorator on ${modelName}.${methodName} has conflicting options: ${key}. The decorator is trying to override the existing option(${JSON.stringify(existingOptions[key])}) with the new option(${JSON.stringify(newOptions[key])}).`);
|
|
290
254
|
});
|
|
291
255
|
}
|
|
292
256
|
var registeredApis, DECORATOR_TYPES;
|
|
@@ -306,8 +270,8 @@ var init_decorators = __esmMin((() => {
|
|
|
306
270
|
UPLOAD: Symbol("upload")
|
|
307
271
|
};
|
|
308
272
|
}));
|
|
309
|
-
|
|
310
273
|
//#endregion
|
|
311
274
|
init_decorators();
|
|
312
275
|
export { api, init_decorators, registeredApis, stream, transactional, upload, websocket };
|
|
313
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsIm5hbWVzIjpbImFwaSIsInJlZ2lzdGVyZWRBcGlzOiB7XG4gIC8qKlxuICAgKiBtb2RlbE5hbWXsnYAg66qo6424IO2BtOuemOyKpCDsnbTrpoTsnoXri4jri6QuIChleC4gXCJVc2VyTW9kZWxcIilcbiAgICovXG4gIG1vZGVsTmFtZTogc3RyaW5nO1xuICBtZXRob2ROYW1lOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgb3B0aW9uczogQXBpRGVjb3JhdG9yT3B0aW9ucztcbiAgc3RyZWFtT3B0aW9ucz86IFN0cmVhbURlY29yYXRvck9wdGlvbnM7XG4gIHdlYnNvY2tldE9wdGlvbnM/OiBSZXNvbHZlZFdlYlNvY2tldERlY29yYXRvck9wdGlvbnM7XG4gIHVwbG9hZE9wdGlvbnM/OiBVcGxvYWREZWNvcmF0b3JPcHRpb25zO1xufVtdIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9kZWNvcmF0b3JzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuXG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlNdWx0aXBhcnRCYXNlT3B0aW9ucyB9IGZyb20gXCJAZmFzdGlmeS9tdWx0aXBhcnRcIjtcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIEhUVFBNZXRob2RzIH0gZnJvbSBcImZhc3RpZnlcIjtcbmltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7IHR5cGUgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgdHlwZSBDYWNoZUNvbnRyb2xDb25maWcgfSBmcm9tIFwiLi4vY2FjaGUtY29udHJvbC90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBDb21wcmVzc0NvbmZpZyB9IGZyb20gXCIuLi9jb21wcmVzcy90eXBlc1wiO1xuaW1wb3J0IHsgQmFzZU1vZGVsQ2xhc3MgfSBmcm9tIFwiLi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiO1xuaW1wb3J0IHsgREIgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IFB1cmlUcmFuc2FjdGlvbldyYXBwZXIgfSBmcm9tIFwiLi4vZGF0YWJhc2UvcHVyaS13cmFwcGVyXCI7XG5pbXBvcnQgeyB0eXBlIFRyYW5zYWN0aW9uYWxPcHRpb25zIH0gZnJvbSBcIi4uL2RhdGFiYXNlL3B1cmktd3JhcHBlclwiO1xuaW1wb3J0IHsgVXBzZXJ0QnVpbGRlciB9IGZyb20gXCIuLi9kYXRhYmFzZS91cHNlcnQtYnVpbGRlclwiO1xuaW1wb3J0IHsgY29udmVydERvbWFpblRvQ2F0ZWdvcnkgfSBmcm9tIFwiLi4vbG9nZ2VyL2NhdGVnb3J5XCI7XG5pbXBvcnQgeyB0eXBlIERyaXZlcktleSB9IGZyb20gXCIuLi9zdG9yYWdlL2RyaXZlcnNcIjtcbmltcG9ydCB7IHR5cGUgS2V5R2VuZXJhdG9yIH0gZnJvbSBcIi4uL3N0b3JhZ2UvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgQXBpUGFyYW0sIHR5cGUgQXBpUGFyYW1UeXBlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRNb2RlbE5hbWVGcm9tQ2xhc3NOYW1lIH0gZnJvbSBcIi4uL3V0aWxzL2NsYXNzLW5hbWVcIjtcbmltcG9ydCB7IEJhc2VGcmFtZUNsYXNzIH0gZnJvbSBcIi4vYmFzZS1mcmFtZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEd1YXJkS2V5cyB7XG4gIHF1ZXJ5OiB0cnVlO1xuICBhZG1pbjogdHJ1ZTtcbiAgdXNlcjogdHJ1ZTtcbn1cbmV4cG9ydCB0eXBlIEd1YXJkS2V5ID0ga2V5b2YgR3VhcmRLZXlzO1xuZXhwb3J0IHR5cGUgU2VydmljZUNsaWVudCA9XG4gIHwgXCJheGlvc1wiXG4gIHwgXCJheGlvcy1tdWx0aXBhcnRcIlxuICB8IFwidGFuc3RhY2stcXVlcnlcIlxuICB8IFwidGFuc3RhY2stbXV0YXRpb25cIlxuICB8IFwidGFuc3RhY2stbXV0YXRpb24tbXVsdGlwYXJ0XCJcbiAgfCBcIndpbmRvdy1mZXRjaFwiO1xuZXhwb3J0IHR5cGUgQXBpRGVjb3JhdG9yT3B0aW9ucyA9IHtcbiAgaHR0cE1ldGhvZD86IEhUVFBNZXRob2RzO1xuICBjb250ZW50VHlwZT86XG4gICAgfCBcInRleHQvcGxhaW5cIlxuICAgIHwgXCJ0ZXh0L2h0bWxcIlxuICAgIHwgXCJ0ZXh0L3htbFwiXG4gICAgfCBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgIHwgXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIjtcbiAgY2xpZW50cz86IFNlcnZpY2VDbGllbnRbXTtcbiAgcGF0aD86IHN0cmluZztcbiAgcmVzb3VyY2VOYW1lPzogc3RyaW5nO1xuICBndWFyZHM/OiBHdWFyZEtleVtdO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgdGltZW91dD86IG51bWJlcjtcbiAgLyoqIEFQSSDsnZHri7XsnZggQ2FjaGUtQ29udHJvbCDtl6TrjZQg7ISk7KCVLiDshKTsoJXtlZjsp4Ag7JWK7Jy866m0IGNhY2hlQ29udHJvbEhhbmRsZXIg65iQ64qUIOq4sOuzuOqwkuydtCDsoIHsmqnrkKnri4jri6QuICovXG4gIGNhY2hlQ29udHJvbD86IENhY2hlQ29udHJvbENvbmZpZztcbiAgLyoqIEFQSSDsnZHri7XsnZgg7JWV7LaVIOyEpOyglS4gZmFsc2XroZwg7ISk7KCV7ZWY66m0IOyVley2leydhCDruYTtmZzshLHtmZTtlanri4jri6QuICovXG4gIGNvbXByZXNzPzogQ29tcHJlc3NDb25maWc7XG59O1xuZXhwb3J0IHR5cGUgU3RyZWFtRGVjb3JhdG9yT3B0aW9ucyA9IHtcbiAgdHlwZTogXCJzc2VcIjtcbiAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0g7J2067Kk7Yq4IO2CpOuzhOuhnCDrhJjqsqjso7zripQg6rCS7J2066+A66GcIOyWtOuWpCDtg4DsnoXsnbTrk6Ag7IOB6rSA7JeG7J2MXG4gIGV2ZW50czogei5ab2RPYmplY3Q8YW55PjtcbiAgcGF0aD86IHN0cmluZztcbiAgcmVzb3VyY2VOYW1lPzogc3RyaW5nO1xuICBndWFyZHM/OiBHdWFyZEtleVtdO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBXZWJTb2NrZXREZWNvcmF0b3JPcHRpb25zID0ge1xuICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSDsnbTrsqTtirgg7YKk67OE66GcIOuEmOqyqOyjvOuKlCDqsJLsnbTrr4DroZwg7Ja065akIO2DgOyeheydtOuToCDsg4HqtIDsl4bsnYxcbiAgb3V0RXZlbnRzOiB6LlpvZE9iamVjdDxhbnk+O1xuICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSDsnbTrsqTtirgg7YKk67OE66GcIOuEmOqyqOyjvOuKlCDqsJLsnbTrr4DroZwg7Ja065akIO2DgOyeheydtOuToCDsg4HqtIDsl4bsnYxcbiAgaW5FdmVudHM6IHouWm9kT2JqZWN0PGFueT47XG4gIHBhdGg/OiBzdHJpbmc7XG4gIHJlc291cmNlTmFtZT86IHN0cmluZztcbiAgZ3VhcmRzPzogR3VhcmRLZXlbXTtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGhlYXJ0YmVhdD86IG51bWJlcjtcbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFJlc29sdmVkV2ViU29ja2V0RGVjb3JhdG9yT3B0aW9ucyA9IFdlYlNvY2tldERlY29yYXRvck9wdGlvbnMgJiB7XG4gIC8vIGNvZGVnZW7snbQg7YOA7J6FIOydtOumhOydhCDsnqzsgqzsmqntlaAg7IiYIOyeiOuPhOuhnSBzeW5jZXLqsIAgQVNU7JeQ7IScIOuztOqwle2VmOuKlCDrqZTtg4DrjbDsnbTthLBcbiAgb3V0RXZlbnRzVHlwZVJlZj86IEFwaVBhcmFtVHlwZS5SZWY7XG4gIGluRXZlbnRzVHlwZVJlZj86IEFwaVBhcmFtVHlwZS5SZWY7XG59O1xuXG50eXBlIEJ1ZmZlclVwbG9hZE9wdGlvbnMgPSB7XG4gIGNvbnN1bWU/OiBcImJ1ZmZlclwiO1xufTtcbnR5cGUgU3RyZWFtVXBsb2FkT3B0aW9ucyA9IHtcbiAgY29uc3VtZTogXCJzdHJlYW1cIjtcbiAgZGVzdGluYXRpb246IERyaXZlcktleTtcbiAga2V5R2VuZXJhdG9yPzogS2V5R2VuZXJhdG9yO1xufTtcbmV4cG9ydCB0eXBlIFVwbG9hZERlY29yYXRvck9wdGlvbnMgPSB7XG4gIGd1YXJkcz86IEd1YXJkS2V5W107XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBsaW1pdHM/OiBGYXN0aWZ5TXVsdGlwYXJ0QmFzZU9wdGlvbnNbXCJsaW1pdHNcIl07XG59ICYgKEJ1ZmZlclVwbG9hZE9wdGlvbnMgfCBTdHJlYW1VcGxvYWRPcHRpb25zKTtcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyZWRBcGlzOiB7XG4gIC8qKlxuICAgKiBtb2RlbE5hbWXsnYAg66qo6424IO2BtOuemOyKpCDsnbTrpoTsnoXri4jri6QuIChleC4gXCJVc2VyTW9kZWxcIilcbiAgICovXG4gIG1vZGVsTmFtZTogc3RyaW5nO1xuICBtZXRob2ROYW1lOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgb3B0aW9uczogQXBpRGVjb3JhdG9yT3B0aW9ucztcbiAgc3RyZWFtT3B0aW9ucz86IFN0cmVhbURlY29yYXRvck9wdGlvbnM7XG4gIHdlYnNvY2tldE9wdGlvbnM/OiBSZXNvbHZlZFdlYlNvY2tldERlY29yYXRvck9wdGlvbnM7XG4gIHVwbG9hZE9wdGlvbnM/OiBVcGxvYWREZWNvcmF0b3JPcHRpb25zO1xufVtdID0gW107XG5leHBvcnQgdHlwZSBFeHRlbmRlZEFwaSA9IHtcbiAgbW9kZWxOYW1lOiBzdHJpbmc7XG4gIG1ldGhvZE5hbWU6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBvcHRpb25zOiBBcGlEZWNvcmF0b3JPcHRpb25zO1xuICBzdHJlYW1PcHRpb25zPzogU3RyZWFtRGVjb3JhdG9yT3B0aW9ucztcbiAgd2Vic29ja2V0T3B0aW9ucz86IFJlc29sdmVkV2ViU29ja2V0RGVjb3JhdG9yT3B0aW9ucztcbiAgdXBsb2FkT3B0aW9ucz86IFVwbG9hZERlY29yYXRvck9wdGlvbnM7XG4gIHR5cGVQYXJhbWV0ZXJzOiBBcGlQYXJhbVR5cGUuVHlwZVBhcmFtW107XG4gIHBhcmFtZXRlcnM6IEFwaVBhcmFtW107XG4gIHJldHVyblR5cGU6IEFwaVBhcmFtVHlwZTtcbn07XG50eXBlIERlY29yYXRvclRhcmdldCA9IHsgY29uc3RydWN0b3I6IHsgbmFtZTogc3RyaW5nIH0gfTtcblxuY29uc3QgREVDT1JBVE9SX1RZUEVTID0ge1xuICBBUEk6IFN5bWJvbChcImFwaVwiKSxcbiAgU1RSRUFNOiBTeW1ib2woXCJzdHJlYW1cIiksXG4gIFdFQlNPQ0tFVDogU3ltYm9sKFwid2Vic29ja2V0XCIpLFxuICBVUExPQUQ6IFN5bWJvbChcInVwbG9hZFwiKSxcbn0gYXMgY29uc3Q7XG5cbmZ1bmN0aW9uIGNoZWNrU2luZ2xlRGVjb3JhdG9yKHRhcmdldDogRGVjb3JhdG9yVGFyZ2V0LCBwcm9wZXJ0eUtleTogc3RyaW5nLCBkZWNvcmF0b3JUeXBlOiBzeW1ib2wpIHtcbiAgY29uc3QgbWV0aG9kID0gdGFyZ2V0W3Byb3BlcnR5S2V5IGFzIGtleW9mIHR5cGVvZiB0YXJnZXRdIGFzIHsgX19kZWNvcmF0b3JUeXBlPzogc3ltYm9sIH07XG4gIGlmIChtZXRob2Q/Ll9fZGVjb3JhdG9yVHlwZSAmJiBtZXRob2Q/Ll9fZGVjb3JhdG9yVHlwZSAhPT0gZGVjb3JhdG9yVHlwZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBAJHtkZWNvcmF0b3JUeXBlLmRlc2NyaXB0aW9uID8/IFN0cmluZyhkZWNvcmF0b3JUeXBlKX0gZGVjb3JhdG9yIGNhbiBvbmx5IGJlIHVzZWQgb25jZSBvbiAke3RhcmdldC5jb25zdHJ1Y3Rvci5uYW1lfS4ke3Byb3BlcnR5S2V5fS4gWW91IGNhbiB1c2Ugb25seSBvbmUgb2YgQGFwaSwgQHN0cmVhbSwgQHdlYnNvY2tldCwgb3IgQHVwbG9hZCBkZWNvcmF0b3Igb24gdGhlIHNhbWUgbWV0aG9kLmAsXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBtZXRob2QuX19kZWNvcmF0b3JUeXBlID0gZGVjb3JhdG9yVHlwZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBpKG9wdGlvbnM6IEFwaURlY29yYXRvck9wdGlvbnMgPSB7fSkge1xuICBvcHRpb25zID0ge1xuICAgIGh0dHBNZXRob2Q6IFwiR0VUXCIsXG4gICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgIGNsaWVudHM6IFtcImF4aW9zXCJdLFxuICAgIC4uLm9wdGlvbnMsXG4gIH07XG5cbiAgcmV0dXJuICh0YXJnZXQ6IERlY29yYXRvclRhcmdldCwgcHJvcGVydHlLZXk6IHN0cmluZywgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yKSA9PiB7XG4gICAgY29uc3QgbW9kZWxOYW1lID0gZ2V0TW9kZWxOYW1lRnJvbUNsYXNzTmFtZSh0YXJnZXQuY29uc3RydWN0b3IubmFtZSk7XG4gICAgYXNzZXJ0KFxuICAgICAgbW9kZWxOYW1lLFxuICAgICAgYG1vZGVsTmFtZSBpcyByZXF1aXJlZCBvbiBAYXBpIGRlY29yYXRvciBvbiAke3RhcmdldC5jb25zdHJ1Y3Rvci5uYW1lfS4ke3Byb3BlcnR5S2V5fWAsXG4gICAgKTtcbiAgICBjb25zdCBtZXRob2ROYW1lID0gcHJvcGVydHlLZXk7XG5cbiAgICAvLyDrqZTshJzrk5zsl5Ag6rG466awIOuNsOy9lOugiOydtO2EsCDspJHrs7Ug7LK07YGsXG4gICAgY2hlY2tTaW5nbGVEZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSwgREVDT1JBVE9SX1RZUEVTLkFQSSk7XG5cbiAgICBjb25zdCBkZWZhdWx0UGF0aCA9IGAvJHtpbmZsZWN0aW9uLmNhbWVsaXplKFxuICAgICAgbW9kZWxOYW1lLnJlcGxhY2UoL01vZGVsJC8sIFwiXCIpLnJlcGxhY2UoL0ZyYW1lJC8sIFwiXCIpLFxuICAgICAgdHJ1ZSxcbiAgICApfS8ke2luZmxlY3Rpb24uY2FtZWxpemUocHJvcGVydHlLZXksIHRydWUpfWA7XG4gICAgY29uc3QgcGF0aCA9IG9wdGlvbnMucGF0aCA/PyBkZWZhdWx0UGF0aDtcblxuICAgIC8vIOq4sOyhtCDrj5nsnbztlZwg66mU7ISc65Oc6rCAIOyeiOuKlOyngCDtmZXsnbgg7ZuEIOyeiOuKlCDqsr3smrAgb3ZlcnJpZGVcbiAgICBjb25zdCBleGlzdGluZ0FwaSA9IHJlZ2lzdGVyZWRBcGlzLmZpbmQoXG4gICAgICAoYXBpKSA9PiBhcGkubW9kZWxOYW1lID09PSBtb2RlbE5hbWUgJiYgYXBpLm1ldGhvZE5hbWUgPT09IG1ldGhvZE5hbWUsXG4gICAgKTtcbiAgICBpZiAoZXhpc3RpbmdBcGkpIHtcbiAgICAgIC8vIOq4sOyhtOydmCBwYXRo7JmAIOyDiOuhnOyatCBwYXRo6rCAIOuLpOultOuLpOuptCg967mIIOyKpO2KuOungeydtCDslYTri4jsl4jripTrjbAg64uk66W4IOyKpO2KuOungeycvOuhnCDrsJTrgIzqsowg65Cc64uk66m0KSDsl5Drn6zrpbwg7YSw65yo66Ck7KSN64uI64ukLlxuICAgICAgYXNzZXJ0Tm9Db25mbGljdGluZ1BhdGgoXCJhcGlcIiwgbW9kZWxOYW1lLCBtZXRob2ROYW1lLCBleGlzdGluZ0FwaS5wYXRoLCBwYXRoKTtcbiAgICAgIGV4aXN0aW5nQXBpLnBhdGggPSBwYXRoO1xuXG4gICAgICAvLyDquLDsobTsnZgg7Ji17IWY6rO8IOyDiOuhnOyatCDsmLXshZjsnbQg6rK57LmY64qUIOu2gOu2hOydtCDsnojri6TrqbQg7JeQ65+s66W8IO2EsOucqOugpOykjeuLiOuLpC5cbiAgICAgIGFzc2VydE5vQ29uZmxpY3RpbmdPcHRpb25zKFwiYXBpXCIsIG1vZGVsTmFtZSwgbWV0aG9kTmFtZSwgZXhpc3RpbmdBcGkub3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICBleGlzdGluZ0FwaS5vcHRpb25zID0ge1xuICAgICAgICAuLi5leGlzdGluZ0FwaS5vcHRpb25zLCAvLyDquLDsobTsnZgg7Ji17IWY7J2EIOyhtOykke2VmOuQmFxuICAgICAgICAuLi5vcHRpb25zLCAvLyBAYXBpIOuNsOy9lOugiOydtO2EsOydmCDsmLXshZjsnYQg7LaU6rCA7ZWp64uI64ukLlxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVnaXN0ZXJlZEFwaXMucHVzaCh7XG4gICAgICAgIG1vZGVsTmFtZSxcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gYXN5bmMgZnVuY3Rpb24gKHRoaXM6IEJhc2VNb2RlbENsYXNzIHwgQmFzZUZyYW1lQ2xhc3MsIC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBCYXNlTW9kZWxDbGFzcykge1xuICAgICAgICBnZXRMb2dnZXIoY29udmVydERvbWFpblRvQ2F0ZWdvcnkodGhpcy5tb2RlbE5hbWUsIFwibW9kZWxcIikpLmRlYnVnKFxuICAgICAgICAgIFwiYXBpOiB7aHR0cE1ldGhvZH0ge21vZGVsfS57bWV0aG9kfVwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGh0dHBNZXRob2Q6IG9wdGlvbnMuaHR0cE1ldGhvZCxcbiAgICAgICAgICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZE5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBCYXNlRnJhbWVDbGFzcykge1xuICAgICAgICBnZXRMb2dnZXIoY29udmVydERvbWFpblRvQ2F0ZWdvcnkodGhpcy5mcmFtZU5hbWUsIFwiZnJhbWVcIikpLmRlYnVnKFxuICAgICAgICAgIFwiYXBpOiB7aHR0cE1ldGhvZH0ge21vZGVsfS57bWV0aG9kfVwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGh0dHBNZXRob2Q6IG9wdGlvbnMuaHR0cE1ldGhvZCxcbiAgICAgICAgICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZE5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJlYW0ob3B0aW9uczogU3RyZWFtRGVjb3JhdG9yT3B0aW9ucykge1xuICByZXR1cm4gKHRhcmdldDogRGVjb3JhdG9yVGFyZ2V0LCBwcm9wZXJ0eUtleTogc3RyaW5nLCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IpID0+IHtcbiAgICBjb25zdCBtb2RlbE5hbWUgPSBnZXRNb2RlbE5hbWVGcm9tQ2xhc3NOYW1lKHRhcmdldC5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICBhc3NlcnQoXG4gICAgICBtb2RlbE5hbWUsXG4gICAgICBgbW9kZWxOYW1lIGlzIHJlcXVpcmVkIG9uIEBzdHJlYW0gZGVjb3JhdG9yIG9uICR7dGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWV9LiR7cHJvcGVydHlLZXl9YCxcbiAgICApO1xuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBwcm9wZXJ0eUtleTtcblxuICAgIC8vIOuplOyEnOuTnOyXkCDqsbjrprAg642w7L2U66CI7J207YSwIOykkeuztSDssrTtgaxcbiAgICBjaGVja1NpbmdsZURlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5S2V5LCBERUNPUkFUT1JfVFlQRVMuU1RSRUFNKTtcblxuICAgIGNvbnN0IGRlZmF1bHRQYXRoID0gYC8ke2luZmxlY3Rpb24uY2FtZWxpemUoXG4gICAgICBtb2RlbE5hbWUucmVwbGFjZSgvTW9kZWwkLywgXCJcIikucmVwbGFjZSgvRnJhbWUkLywgXCJcIiksXG4gICAgICB0cnVlLFxuICAgICl9LyR7aW5mbGVjdGlvbi5jYW1lbGl6ZShwcm9wZXJ0eUtleSwgdHJ1ZSl9YDtcbiAgICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoID8/IGRlZmF1bHRQYXRoO1xuICAgIC8vIHN0cmVhbSDsoITsmqkg7ZWE65OcKGV2ZW50cywgdHlwZSnripQgQXBpRGVjb3JhdG9yT3B0aW9uc+yXkCDsho3tlZjsp4Ag7JWK7Jy866+A66GcIOygnOyZuFxuICAgIGNvbnN0IHsgZXZlbnRzOiBfLCB0eXBlOiBfdHlwZSwgLi4uYXBpT3B0aW9ucyB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBvcHRpb25zV2l0aERlZmF1bHRzID0ge1xuICAgICAgLi4uYXBpT3B0aW9ucyxcbiAgICAgIGh0dHBNZXRob2Q6IFwiR0VUXCIgYXMgSFRUUE1ldGhvZHMsXG4gICAgfTtcblxuICAgIGNvbnN0IGV4aXN0aW5nQXBpID0gcmVnaXN0ZXJlZEFwaXMuZmluZChcbiAgICAgIChhcGkpID0+IGFwaS5tb2RlbE5hbWUgPT09IG1vZGVsTmFtZSAmJiBhcGkubWV0aG9kTmFtZSA9PT0gbWV0aG9kTmFtZSxcbiAgICApO1xuICAgIGlmIChleGlzdGluZ0FwaSkge1xuICAgICAgLy8g6riw7KG07J2YIHBhdGjsmYAg7IOI66Gc7Jq0IHBhdGjqsIAg64uk66W064uk66m0KD3ruYgg7Iqk7Yq466eB7J20IOyVhOuLiOyXiOuKlOuNsCDri6Trpbgg7Iqk7Yq466eB7Jy866GcIOuwlOuAjOqyjCDrkJzri6TrqbQpIOyXkOufrOulvCDthLDrnKjroKTspI3ri4jri6QuXG4gICAgICBhc3NlcnROb0NvbmZsaWN0aW5nUGF0aChcInN0cmVhbVwiLCBtb2RlbE5hbWUsIG1ldGhvZE5hbWUsIGV4aXN0aW5nQXBpLnBhdGgsIHBhdGgpO1xuICAgICAgZXhpc3RpbmdBcGkucGF0aCA9IHBhdGg7XG5cbiAgICAgIC8vIOq4sOyhtOydmCDsmLXshZjqs7wg7IOI66Gc7Jq0IOyYteyFmOydtCDqsrnsuZjripQg67aA67aE7J20IOyeiOuLpOuptCDsl5Drn6zrpbwg7YSw65yo66Ck7KSN64uI64ukLlxuICAgICAgYXNzZXJ0Tm9Db25mbGljdGluZ09wdGlvbnMoXG4gICAgICAgIFwic3RyZWFtXCIsXG4gICAgICAgIG1vZGVsTmFtZSxcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgZXhpc3RpbmdBcGkub3B0aW9ucyxcbiAgICAgICAgb3B0aW9uc1dpdGhEZWZhdWx0cyxcbiAgICAgICk7XG4gICAgICBleGlzdGluZ0FwaS5vcHRpb25zID0ge1xuICAgICAgICAuLi5leGlzdGluZ0FwaS5vcHRpb25zLCAvLyDquLDsobTsnZgg7Ji17IWY7J2EIOyhtOykke2VmOuQmFxuICAgICAgICAuLi5vcHRpb25zV2l0aERlZmF1bHRzLCAvLyBAc3RyZWFtIOuNsOy9lOugiOydtO2EsOydmCDsmLXshZjsnYQg7LaU6rCA7ZWp64uI64ukLlxuICAgICAgfTtcblxuICAgICAgZXhpc3RpbmdBcGkuc3RyZWFtT3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZ2lzdGVyZWRBcGlzLnB1c2goe1xuICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIG9wdGlvbnM6IG9wdGlvbnNXaXRoRGVmYXVsdHMsXG4gICAgICAgIHN0cmVhbU9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGFzeW5jIGZ1bmN0aW9uICh0aGlzOiBCYXNlTW9kZWxDbGFzcyB8IEJhc2VGcmFtZUNsYXNzLCAuLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQmFzZU1vZGVsQ2xhc3MpIHtcbiAgICAgICAgZ2V0TG9nZ2VyKGNvbnZlcnREb21haW5Ub0NhdGVnb3J5KHRoaXMubW9kZWxOYW1lLCBcIm1vZGVsXCIpKS5kZWJ1ZyhcbiAgICAgICAgICBcInN0cmVhbToge21vZGVsfS57bWV0aG9kfVwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZE5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBCYXNlRnJhbWVDbGFzcykge1xuICAgICAgICBnZXRMb2dnZXIoY29udmVydERvbWFpblRvQ2F0ZWdvcnkodGhpcy5mcmFtZU5hbWUsIFwiZnJhbWVcIikpLmRlYnVnKFxuICAgICAgICAgIFwic3RyZWFtOiB7bW9kZWx9LnttZXRob2R9XCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdlYnNvY2tldChvcHRpb25zOiBXZWJTb2NrZXREZWNvcmF0b3JPcHRpb25zKSB7XG4gIHJldHVybiAodGFyZ2V0OiBEZWNvcmF0b3JUYXJnZXQsIHByb3BlcnR5S2V5OiBzdHJpbmcsIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcikgPT4ge1xuICAgIGNvbnN0IG1vZGVsTmFtZSA9IGdldE1vZGVsTmFtZUZyb21DbGFzc05hbWUodGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGFzc2VydChcbiAgICAgIG1vZGVsTmFtZSxcbiAgICAgIGBtb2RlbE5hbWUgaXMgcmVxdWlyZWQgb24gQHdlYnNvY2tldCBkZWNvcmF0b3Igb24gJHt0YXJnZXQuY29uc3RydWN0b3IubmFtZX0uJHtwcm9wZXJ0eUtleX1gLFxuICAgICk7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHByb3BlcnR5S2V5O1xuXG4gICAgY2hlY2tTaW5nbGVEZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSwgREVDT1JBVE9SX1RZUEVTLldFQlNPQ0tFVCk7XG5cbiAgICBjb25zdCBkZWZhdWx0UGF0aCA9IGAvJHtpbmZsZWN0aW9uLmNhbWVsaXplKFxuICAgICAgbW9kZWxOYW1lLnJlcGxhY2UoL01vZGVsJC8sIFwiXCIpLnJlcGxhY2UoL0ZyYW1lJC8sIFwiXCIpLFxuICAgICAgdHJ1ZSxcbiAgICApfS8ke2luZmxlY3Rpb24uY2FtZWxpemUocHJvcGVydHlLZXksIHRydWUpfWA7XG4gICAgY29uc3QgcGF0aCA9IG9wdGlvbnMucGF0aCA/PyBkZWZhdWx0UGF0aDtcbiAgICBjb25zdCB7IG91dEV2ZW50czogX291dEV2ZW50cywgaW5FdmVudHM6IF9pbkV2ZW50cywgLi4uYXBpT3B0aW9ucyB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBvcHRpb25zV2l0aERlZmF1bHRzID0ge1xuICAgICAgLi4uYXBpT3B0aW9ucyxcbiAgICAgIGh0dHBNZXRob2Q6IFwiR0VUXCIgYXMgSFRUUE1ldGhvZHMsXG4gICAgfTtcblxuICAgIGNvbnN0IGV4aXN0aW5nQXBpID0gcmVnaXN0ZXJlZEFwaXMuZmluZChcbiAgICAgIChhcGkpID0+IGFwaS5tb2RlbE5hbWUgPT09IG1vZGVsTmFtZSAmJiBhcGkubWV0aG9kTmFtZSA9PT0gbWV0aG9kTmFtZSxcbiAgICApO1xuICAgIGlmIChleGlzdGluZ0FwaSkge1xuICAgICAgYXNzZXJ0Tm9Db25mbGljdGluZ1BhdGgoXCJ3ZWJzb2NrZXRcIiwgbW9kZWxOYW1lLCBtZXRob2ROYW1lLCBleGlzdGluZ0FwaS5wYXRoLCBwYXRoKTtcbiAgICAgIGV4aXN0aW5nQXBpLnBhdGggPSBwYXRoO1xuXG4gICAgICBhc3NlcnROb0NvbmZsaWN0aW5nT3B0aW9ucyhcbiAgICAgICAgXCJ3ZWJzb2NrZXRcIixcbiAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBleGlzdGluZ0FwaS5vcHRpb25zLFxuICAgICAgICBvcHRpb25zV2l0aERlZmF1bHRzLFxuICAgICAgKTtcbiAgICAgIGV4aXN0aW5nQXBpLm9wdGlvbnMgPSB7XG4gICAgICAgIC4uLmV4aXN0aW5nQXBpLm9wdGlvbnMsXG4gICAgICAgIC4uLm9wdGlvbnNXaXRoRGVmYXVsdHMsXG4gICAgICB9O1xuXG4gICAgICBleGlzdGluZ0FwaS53ZWJzb2NrZXRPcHRpb25zID0gb3B0aW9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgcmVnaXN0ZXJlZEFwaXMucHVzaCh7XG4gICAgICAgIG1vZGVsTmFtZSxcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgb3B0aW9uczogb3B0aW9uc1dpdGhEZWZhdWx0cyxcbiAgICAgICAgd2Vic29ja2V0T3B0aW9uczogb3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gYXN5bmMgZnVuY3Rpb24gKHRoaXM6IEJhc2VNb2RlbENsYXNzIHwgQmFzZUZyYW1lQ2xhc3MsIC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBCYXNlTW9kZWxDbGFzcykge1xuICAgICAgICBnZXRMb2dnZXIoY29udmVydERvbWFpblRvQ2F0ZWdvcnkodGhpcy5tb2RlbE5hbWUsIFwibW9kZWxcIikpLmRlYnVnKFxuICAgICAgICAgIFwid2Vic29ja2V0OiB7bW9kZWx9LnttZXRob2R9XCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEJhc2VGcmFtZUNsYXNzKSB7XG4gICAgICAgIGdldExvZ2dlcihjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSh0aGlzLmZyYW1lTmFtZSwgXCJmcmFtZVwiKSkuZGVidWcoXG4gICAgICAgICAgXCJ3ZWJzb2NrZXQ6IHttb2RlbH0ue21ldGhvZH1cIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2RlbDogbW9kZWxOYW1lLFxuICAgICAgICAgICAgbWV0aG9kOiBtZXRob2ROYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNhY3Rpb25hbChvcHRpb25zOiBUcmFuc2FjdGlvbmFsT3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHsgaXNvbGF0aW9uLCByZWFkT25seSwgZGJQcmVzZXQgPSBcIndcIiB9ID0gb3B0aW9ucztcblxuICByZXR1cm4gKHRhcmdldDogRGVjb3JhdG9yVGFyZ2V0LCBwcm9wZXJ0eUtleTogc3RyaW5nLCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IpID0+IHtcbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgY29uc3QgbW9kZWxOYW1lID0gZ2V0TW9kZWxOYW1lRnJvbUNsYXNzTmFtZSh0YXJnZXQuY29uc3RydWN0b3IubmFtZSk7XG4gICAgYXNzZXJ0KFxuICAgICAgbW9kZWxOYW1lLFxuICAgICAgYG1vZGVsTmFtZSBpcyByZXF1aXJlZCBvbiBAdHJhbnNhY3Rpb25hbCBkZWNvcmF0b3Igb24gJHt0YXJnZXQuY29uc3RydWN0b3IubmFtZX0uJHtwcm9wZXJ0eUtleX1gLFxuICAgICk7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHByb3BlcnR5S2V5O1xuXG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGFzeW5jIGZ1bmN0aW9uICh0aGlzOiBCYXNlTW9kZWxDbGFzcywgLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcInRyYW5zYWN0aW9uYWw6IHttb2RlbH0ue21ldGhvZH1cIiwge1xuICAgICAgICBtb2RlbDogbW9kZWxOYW1lLFxuICAgICAgICBtZXRob2Q6IG1ldGhvZE5hbWUsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZXh0ID0gREIudHJhbnNhY3Rpb25TdG9yYWdlLmdldFN0b3JlKCk7XG5cbiAgICAgIC8vIEFzeW5jTG9jYWxTdG9yYWdlIOy7qO2FjeyKpO2KuCDsl4bqsbDrgpgg7ZW064u5IHByZXNldOydmCDtirjrnpzsnq3shZjsnbQg7JeG7Jy866m0IOyDiOuhnCDsi5zsnpFcbiAgICAgIGNvbnN0IHN0YXJ0VHJhbnNhY3Rpb24gPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHB1cmkgPSB0aGlzLmdldFB1cmkoZGJQcmVzZXQpO1xuXG4gICAgICAgIHJldHVybiBwdXJpLmtuZXgudHJhbnNhY3Rpb24oXG4gICAgICAgICAgYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXCJuZXcgdHJhbnNhY3Rpb24gY29udGV4dDoge2RiUHJlc2V0fVwiLCB7IGRiUHJlc2V0IH0pO1xuICAgICAgICAgICAgY29uc3QgdHJ4V3JhcHBlciA9IG5ldyBQdXJpVHJhbnNhY3Rpb25XcmFwcGVyKHRyeCwgbmV3IFVwc2VydEJ1aWxkZXIoKSk7XG4gICAgICAgICAgICAvLyBUcmFuc2FjdGlvbkNvbnRleHTsl5Ag7Yq4656c7J6t7IWYIOyggOyepVxuICAgICAgICAgICAgREIuZ2V0VHJhbnNhY3Rpb25Db250ZXh0KCkuc2V0VHJhbnNhY3Rpb24oZGJQcmVzZXQsIHRyeFdyYXBwZXIpO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAvLyDtirjrnpzsnq3shZgg7KCc6rGwXG4gICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFwiZGVsZXRlIHRyYW5zYWN0aW9uIGNvbnRleHQ6IHtkYlByZXNldH1cIiwgeyBkYlByZXNldCB9KTtcbiAgICAgICAgICAgICAgREIuZ2V0VHJhbnNhY3Rpb25Db250ZXh0KCkuZGVsZXRlVHJhbnNhY3Rpb24oZGJQcmVzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBpc29sYXRpb25MZXZlbDogaXNvbGF0aW9uLCByZWFkT25seSB9LFxuICAgICAgICApO1xuICAgICAgfTtcblxuICAgICAgLy8gQXN5bmNMb2NhbFN0b3JhZ2Ug7Luo7YWN7Iqk7Yq46rCAIOyXhuycvOuptCDsg4jroZwg7IOd7ISxXG4gICAgICBpZiAoIWV4aXN0aW5nQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gREIucnVuV2l0aFRyYW5zYWN0aW9uKHN0YXJ0VHJhbnNhY3Rpb24pO1xuICAgICAgfVxuXG4gICAgICAvLyDsnbTrr7ggQXN5bmNMb2NhbFN0b3JhZ2Ug7Luo7YWN7Iqk7Yq4IOyViOyXkCDsnojripTsp4Ag7ZmV7J24IO2bhCDtlbTri7kgcHJlc2V07J2YIO2KuOuenOyereyFmOydtCDsnbTrr7gg7J6I7Jy866m0IOyerOyCrOyaqVxuICAgICAgaWYgKGV4aXN0aW5nQ29udGV4dD8uZ2V0VHJhbnNhY3Rpb24oZGJQcmVzZXQpKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFwicmV1c2UgdHJhbnNhY3Rpb24gY29udGV4dDoge2RiUHJlc2V0fVwiLCB7IGRiUHJlc2V0IH0pO1xuICAgICAgICByZXR1cm4gb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICB9XG5cbiAgICAgIC8vIOy7qO2FjeyKpO2KuOuKlCDsnojsp4Drp4wg7J20IHByZXNldOydmCDtirjrnpzsnq3shZjsnYAg7JeG64qUIOqyveyasCAo6rCZ7J2AIOy7qO2FjeyKpO2KuCDrgrTsl5DshJwg7Iuk7ZaJKVxuICAgICAgcmV0dXJuIHN0YXJ0VHJhbnNhY3Rpb24oKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gIH07XG59XG5cbi8qKlxuICog7YyM7J28IOyXheuhnOuTnCBBUEnrpbwg7IOd7ISx7ZW07KSN64uI64ukLiAoQGFwaSDrjbDsvZTroIjsnbTthLAg7JeG7J20IOuPheumveyggeycvOuhnCDsgqzsmqkpXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwbG9hZChvcHRpb25zOiBVcGxvYWREZWNvcmF0b3JPcHRpb25zID0geyBjb25zdW1lOiBcImJ1ZmZlclwiIH0pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IERlY29yYXRvclRhcmdldCwgcHJvcGVydHlLZXk6IHN0cmluZywgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yKSA9PiB7XG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIGNvbnN0IG1vZGVsTmFtZSA9IGdldE1vZGVsTmFtZUZyb21DbGFzc05hbWUodGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGFzc2VydChcbiAgICAgIG1vZGVsTmFtZSxcbiAgICAgIGBtb2RlbE5hbWUgaXMgcmVxdWlyZWQgb24gQHVwbG9hZCBkZWNvcmF0b3Igb24gJHt0YXJnZXQuY29uc3RydWN0b3IubmFtZX0uJHtwcm9wZXJ0eUtleX1gLFxuICAgICk7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHByb3BlcnR5S2V5O1xuXG4gICAgLy8g66mU7ISc65Oc7JeQIOqxuOumsCDrjbDsvZTroIjsnbTthLAg7KSR67O1IOyytO2BrFxuICAgIGNoZWNrU2luZ2xlRGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHlLZXksIERFQ09SQVRPUl9UWVBFUy5VUExPQUQpO1xuXG4gICAgY29uc3QgZGVmYXVsdFBhdGggPSBgLyR7aW5mbGVjdGlvbi5jYW1lbGl6ZShcbiAgICAgIG1vZGVsTmFtZS5yZXBsYWNlKC9Nb2RlbCQvLCBcIlwiKS5yZXBsYWNlKC9GcmFtZSQvLCBcIlwiKSxcbiAgICAgIHRydWUsXG4gICAgKX0vJHtpbmZsZWN0aW9uLmNhbWVsaXplKG1ldGhvZE5hbWUsIHRydWUpfWA7XG5cbiAgICAvLyByZWdpc3RlcmVkQXBpc+yXkOyEnCDtlbTri7kgQVBJIOywvuyVhOyEnCB1cGxvYWRPcHRpb25zIOy2lOqwgFxuICAgIGNvbnN0IGV4aXN0aW5nQXBpID0gcmVnaXN0ZXJlZEFwaXMuZmluZChcbiAgICAgIChhcGkpID0+IGFwaS5tb2RlbE5hbWUgPT09IG1vZGVsTmFtZSAmJiBhcGkubWV0aG9kTmFtZSA9PT0gbWV0aG9kTmFtZSxcbiAgICApO1xuXG4gICAgaWYgKGV4aXN0aW5nQXBpKSB7XG4gICAgICAvLyDsnqzrk7HroZ0g7IucIOyXheuhnOuTnCDsmLXshZjrp4wg6rCx7IugXG4gICAgICBleGlzdGluZ0FwaS51cGxvYWRPcHRpb25zID0gb3B0aW9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g7IOI66GcIOuTseuhnVxuICAgICAgcmVnaXN0ZXJlZEFwaXMucHVzaCh7XG4gICAgICAgIG1vZGVsTmFtZSxcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgcGF0aDogZGVmYXVsdFBhdGgsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBodHRwTWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICBjbGllbnRzOiBbXCJheGlvcy1tdWx0aXBhcnRcIiwgXCJ0YW5zdGFjay1tdXRhdGlvbi1tdWx0aXBhcnRcIl0sXG4gICAgICAgICAgZ3VhcmRzOiBvcHRpb25zLmd1YXJkcyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogb3B0aW9ucy5kZXNjcmlwdGlvbixcbiAgICAgICAgfSxcbiAgICAgICAgdXBsb2FkT3B0aW9uczogb3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGRlc2NyaXB0b3IudmFsdWUgPSBhc3luYyBmdW5jdGlvbiAodGhpczogQmFzZU1vZGVsQ2xhc3MgfCBCYXNlRnJhbWVDbGFzcywgLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEJhc2VNb2RlbENsYXNzKSB7XG4gICAgICAgIGdldExvZ2dlcihjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSh0aGlzLm1vZGVsTmFtZSwgXCJtb2RlbFwiKSkuZGVidWcoXG4gICAgICAgICAgXCJ1cGxvYWQ6IHttb2RlbH0ue21ldGhvZH1cIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2RlbDogbW9kZWxOYW1lLFxuICAgICAgICAgICAgbWV0aG9kOiBtZXRob2ROYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQmFzZUZyYW1lQ2xhc3MpIHtcbiAgICAgICAgZ2V0TG9nZ2VyKGNvbnZlcnREb21haW5Ub0NhdGVnb3J5KHRoaXMuZnJhbWVOYW1lLCBcImZyYW1lXCIpKS5kZWJ1ZyhcbiAgICAgICAgICBcInVwbG9hZDoge21vZGVsfS57bWV0aG9kfVwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZE5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfTtcbn1cblxuLyoqXG4gKiDquLDsobTsnZggcGF0aOyZgCDsg4jroZzsmrQgcGF0aOqwgCDri6TrpbTri6TrqbQoPeqwkuydtCDsnojrjZgg7Iqk7Yq466eB7J20IOuLpOuluCDqsJLsnbQg7J6I64qUIOyKpO2KuOungeycvOuhnCDrsJTrgIzqsowg65Cc64uk66m0KSDsl5Drn6zrpbwg7YSw65yo66Ck7KSN64uI64ukLlxuICogQHBhcmFtIGRlY29yYXRvck5hbWUg642w7L2U66CI7J207YSwIOydtOumhFxuICogQHBhcmFtIG1vZGVsTmFtZSDrqqjrjbgg7J2066aEXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSDrqZTshJzrk5wg7J2066aEXG4gKiBAcGFyYW0gZXhpc3RpbmdQYXRoIOq4sOyhtOydmCBwYXRoXG4gKiBAcGFyYW0gbmV3UGF0aCDsg4jroZzsmrQgcGF0aFxuICovXG5mdW5jdGlvbiBhc3NlcnROb0NvbmZsaWN0aW5nUGF0aChcbiAgZGVjb3JhdG9yTmFtZTogc3RyaW5nLFxuICBtb2RlbE5hbWU6IHN0cmluZyxcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICBleGlzdGluZ1BhdGg6IHN0cmluZyxcbiAgbmV3UGF0aDogc3RyaW5nLFxuKSB7XG4gIGlmIChleGlzdGluZ1BhdGggIT09IFwiXCIgJiYgbmV3UGF0aCAhPT0gXCJcIiAmJiBleGlzdGluZ1BhdGggIT09IG5ld1BhdGgpIHtcbiAgICAvLyDsnbTqsoPsnbQg66y07IqoIOyDge2ZqeydtOuDkOuptOyalCwgYXBpLnBhdGjqsIAg642u7Ja07JSM7JuM7KeA64qUIOyDge2ZqeyeheuLiOuLpC5cbiAgICAvLyDqsIDroLkgQGFwaSh7IHBhdGg6IFwiL2FwaS92MS91c2Vyc1wiIH0pIOuNsOy9lOugiOydtO2EsOqwgCDrtpnslrTsnojripQg66mU7ISc65Oc7JeQXG4gICAgLy8gQHN0cmVhbSh7IHBhdGg6IFwiL2FwaS92MS91c2Vycy9zdHJlYW1cIiB9KSDqsJnsnYAg6rKD7J20IOu2meyWtCDsnojripQg7IOB7Zmp7J6F64uI64ukLlxuICAgIC8vIOydtOugh+qyjCDrkJjrqbQg65GQIOuNsOy9lOugiOydtO2EsOqwgCDqsJnsnYAgYXBp7J2YIHBhdGgg7ZWE65Oc66W8IOqxtOuTnOumrOqyjCDrkJjrr4DroZwsIOyXkOufrOulvCDthLDrnKjroKTspI3ri4jri6QuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEAke2RlY29yYXRvck5hbWV9IGRlY29yYXRvciBvbiAke21vZGVsTmFtZX0uJHttZXRob2ROYW1lfSBoYXMgY29uZmxpY3RpbmcgcGF0aDogJHtuZXdQYXRofS4gVGhlIGRlY29yYXRvciBpcyB0cnlpbmcgdG8gb3ZlcnJpZGUgdGhlIGV4aXN0aW5nIHBhdGgoJHtleGlzdGluZ1BhdGh9KSB3aXRoIHRoZSBuZXcgcGF0aCgke25ld1BhdGh9KS5gLFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiDquLDsobTsnZgg7Ji17IWY6rO8IOyDiOuhnOyatCDsmLXshZjsnbQg6rK57LmY64qUIOu2gOu2hOydtCDsnojri6TrqbQg7JeQ65+s66W8IO2EsOucqOugpOykjeuLiOuLpC5cbiAqIEBwYXJhbSBkZWNvcmF0b3JOYW1lIOuNsOy9lOugiOydtO2EsCDsnbTrpoRcbiAqIEBwYXJhbSBtb2RlbE5hbWUg66qo6424IOydtOumhFxuICogQHBhcmFtIG1ldGhvZE5hbWUg66mU7ISc65OcIOydtOumhFxuICogQHBhcmFtIGV4aXN0aW5nT3B0aW9ucyDquLDsobTsnZgg7Ji17IWYXG4gKiBAcGFyYW0gbmV3T3B0aW9ucyDsg4jroZzsmrQg7Ji17IWYXG4gKi9cbmZ1bmN0aW9uIGFzc2VydE5vQ29uZmxpY3RpbmdPcHRpb25zKFxuICBkZWNvcmF0b3JOYW1lOiBzdHJpbmcsXG4gIG1vZGVsTmFtZTogc3RyaW5nLFxuICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55IC0tIDzslYQg7Im96rKM7Im96rKMIOyigCDqsJHsi5zri6Q+XG4gIGV4aXN0aW5nT3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PixcbiAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0gPOydtOuftCDrlYwg7JWE64uI66m0IGFueSDslrjsoJwg7JSB64uI6rmMPlxuICBuZXdPcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuKSB7XG4gIE9iamVjdC5rZXlzKG5ld09wdGlvbnMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGlmIChleGlzdGluZ09wdGlvbnNba2V5XSAmJiAhaXNFcXVhbChleGlzdGluZ09wdGlvbnNba2V5XSwgbmV3T3B0aW9uc1trZXldKSkge1xuICAgICAgLy8g7J206rKD7J20IOustOyKqCDsg4HtmansnbTrg5DrqbTsmpQsIGFwaS5vcHRpb25z6rCAIOuNruyWtOyUjOybjOyngOuKlCDsg4HtmansnoXri4jri6QuXG4gICAgICAvLyDqsIDroLkgQGFwaSh7IHJlc291cmNlTmFtZTogXCJVc2Vyc1wiIH0pIOuNsOy9lOugiOydtO2EsOqwgCDrtpnslrTsnojripQg66mU7ISc65Oc7JeQXG4gICAgICAvLyBAc3RyZWFtKHsgcmVzb3VyY2VOYW1lOiBcIlBvc3RzXCIgfSkg6rCZ7J2AIOqyg+ydtCDrtpnslrQg7J6I64qUIOyDge2ZqeyeheuLiOuLpC5cbiAgICAgIC8vIOydtOugh+qyjCDrkJjrqbQg65GQIOuNsOy9lOugiOydtO2EsOqwgCDqsJnsnYAgYXBp7J2YIG9wdGlvbnMg7IaNIOqwmeydgCDtlYTrk5zrpbwg6rG065Oc66as6rKMIOuQmOuvgOuhnCwg7JeQ65+s66W8IO2EsOucqOugpOykjeuLiOuLpC5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEAke2RlY29yYXRvck5hbWV9IGRlY29yYXRvciBvbiAke21vZGVsTmFtZX0uJHttZXRob2ROYW1lfSBoYXMgY29uZmxpY3Rpbmcgb3B0aW9uczogJHtrZXl9LiBUaGUgZGVjb3JhdG9yIGlzIHRyeWluZyB0byBvdmVycmlkZSB0aGUgZXhpc3Rpbmcgb3B0aW9uKCR7SlNPTi5zdHJpbmdpZnkoZXhpc3RpbmdPcHRpb25zW2tleV0pfSkgd2l0aCB0aGUgbmV3IG9wdGlvbigke0pTT04uc3RyaW5naWZ5KG5ld09wdGlvbnNba2V5XSl9KS5gLFxuICAgICAgKTtcbiAgICB9XG4gIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQWlJQSxTQUFTLHFCQUFxQixRQUF5QixhQUFxQixlQUF1QjtDQUNqRyxNQUFNLFNBQVMsT0FBTztBQUN0QixLQUFJLFFBQVEsbUJBQW1CLFFBQVEsb0JBQW9CLGVBQWU7QUFDeEUsUUFBTSxJQUFJLE1BQ1IsSUFBSSxjQUFjLGVBQWUsT0FBTyxjQUFjLENBQUMsc0NBQXNDLE9BQU8sWUFBWSxLQUFLLEdBQUcsWUFBWSwrRkFDckk7UUFDSTtBQUNMLFNBQU8sa0JBQWtCOzs7QUFJN0IsU0FBZ0IsSUFBSSxVQUErQixFQUFFLEVBQUU7QUFDckQsV0FBVTtFQUNSLFlBQVk7RUFDWixhQUFhO0VBQ2IsU0FBUyxDQUFDLFFBQVE7RUFDbEIsR0FBRztFQUNKO0FBRUQsU0FBUSxRQUF5QixhQUFxQixlQUFtQztFQUN2RixNQUFNLFlBQVksMEJBQTBCLE9BQU8sWUFBWSxLQUFLO0FBQ3BFLFNBQ0UsV0FDQSw4Q0FBOEMsT0FBTyxZQUFZLEtBQUssR0FBRyxjQUMxRTtFQUNELE1BQU0sYUFBYTtBQUduQix1QkFBcUIsUUFBUSxhQUFhLGdCQUFnQixJQUFJO0VBRTlELE1BQU0sY0FBYyxJQUFJLFdBQVcsU0FDakMsVUFBVSxRQUFRLFVBQVUsR0FBRyxDQUFDLFFBQVEsVUFBVSxHQUFHLEVBQ3JELEtBQ0QsQ0FBQyxHQUFHLFdBQVcsU0FBUyxhQUFhLEtBQUs7RUFDM0MsTUFBTSxPQUFPLFFBQVEsUUFBUTtFQUc3QixNQUFNLGNBQWMsZUFBZSxNQUNoQyxVQUFRQSxNQUFJLGNBQWMsYUFBYUEsTUFBSSxlQUFlLFdBQzVEO0FBQ0QsTUFBSSxhQUFhO0FBRWYsMkJBQXdCLE9BQU8sV0FBVyxZQUFZLFlBQVksTUFBTSxLQUFLO0FBQzdFLGVBQVksT0FBTztBQUdu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
|
|
276
|
+
|
|
277
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2RlY29yYXRvcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5cbmltcG9ydCB7IHR5cGUgRmFzdGlmeU11bHRpcGFydEJhc2VPcHRpb25zIH0gZnJvbSBcIkBmYXN0aWZ5L211bHRpcGFydFwiO1xuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IHR5cGUgSFRUUE1ldGhvZHMgfSBmcm9tIFwiZmFzdGlmeVwiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgdHlwZSB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyB0eXBlIENhY2hlQ29udHJvbENvbmZpZyB9IGZyb20gXCIuLi9jYWNoZS1jb250cm9sL3R5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIENvbXByZXNzQ29uZmlnIH0gZnJvbSBcIi4uL2NvbXByZXNzL3R5cGVzXCI7XG5pbXBvcnQgeyBCYXNlTW9kZWxDbGFzcyB9IGZyb20gXCIuLi9kYXRhYmFzZS9iYXNlLW1vZGVsXCI7XG5pbXBvcnQgeyBEQiB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgUHVyaVRyYW5zYWN0aW9uV3JhcHBlciB9IGZyb20gXCIuLi9kYXRhYmFzZS9wdXJpLXdyYXBwZXJcIjtcbmltcG9ydCB7IHR5cGUgVHJhbnNhY3Rpb25hbE9wdGlvbnMgfSBmcm9tIFwiLi4vZGF0YWJhc2UvcHVyaS13cmFwcGVyXCI7XG5pbXBvcnQgeyBVcHNlcnRCdWlsZGVyIH0gZnJvbSBcIi4uL2RhdGFiYXNlL3Vwc2VydC1idWlsZGVyXCI7XG5pbXBvcnQgeyBjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSB9IGZyb20gXCIuLi9sb2dnZXIvY2F0ZWdvcnlcIjtcbmltcG9ydCB7IHR5cGUgRHJpdmVyS2V5IH0gZnJvbSBcIi4uL3N0b3JhZ2UvZHJpdmVyc1wiO1xuaW1wb3J0IHsgdHlwZSBLZXlHZW5lcmF0b3IgfSBmcm9tIFwiLi4vc3RvcmFnZS90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBBcGlQYXJhbSwgdHlwZSBBcGlQYXJhbVR5cGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGdldE1vZGVsTmFtZUZyb21DbGFzc05hbWUgfSBmcm9tIFwiLi4vdXRpbHMvY2xhc3MtbmFtZVwiO1xuaW1wb3J0IHsgQmFzZUZyYW1lQ2xhc3MgfSBmcm9tIFwiLi9iYXNlLWZyYW1lXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VhcmRLZXlzIHtcbiAgcXVlcnk6IHRydWU7XG4gIGFkbWluOiB0cnVlO1xuICB1c2VyOiB0cnVlO1xufVxuZXhwb3J0IHR5cGUgR3VhcmRLZXkgPSBrZXlvZiBHdWFyZEtleXM7XG5leHBvcnQgdHlwZSBTZXJ2aWNlQ2xpZW50ID1cbiAgfCBcImF4aW9zXCJcbiAgfCBcImF4aW9zLW11bHRpcGFydFwiXG4gIHwgXCJ0YW5zdGFjay1xdWVyeVwiXG4gIHwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXG4gIHwgXCJ0YW5zdGFjay1tdXRhdGlvbi1tdWx0aXBhcnRcIlxuICB8IFwid2luZG93LWZldGNoXCI7XG5leHBvcnQgdHlwZSBBcGlEZWNvcmF0b3JPcHRpb25zID0ge1xuICBodHRwTWV0aG9kPzogSFRUUE1ldGhvZHM7XG4gIGNvbnRlbnRUeXBlPzpcbiAgICB8IFwidGV4dC9wbGFpblwiXG4gICAgfCBcInRleHQvaHRtbFwiXG4gICAgfCBcInRleHQveG1sXCJcbiAgICB8IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgfCBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiO1xuICBjbGllbnRzPzogU2VydmljZUNsaWVudFtdO1xuICBwYXRoPzogc3RyaW5nO1xuICByZXNvdXJjZU5hbWU/OiBzdHJpbmc7XG4gIGd1YXJkcz86IEd1YXJkS2V5W107XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKiogQVBJIOydkeuLteydmCBDYWNoZS1Db250cm9sIO2XpOuNlCDshKTsoJUuIOyEpOygle2VmOyngCDslYrsnLzrqbQgY2FjaGVDb250cm9sSGFuZGxlciDrmJDripQg6riw67O46rCS7J20IOyggeyaqeuQqeuLiOuLpC4gKi9cbiAgY2FjaGVDb250cm9sPzogQ2FjaGVDb250cm9sQ29uZmlnO1xuICAvKiogQVBJIOydkeuLteydmCDslZXstpUg7ISk7KCVLiBmYWxzZeuhnCDshKTsoJXtlZjrqbQg7JWV7LaV7J2EIOu5hO2ZnOyEse2ZlO2VqeuLiOuLpC4gKi9cbiAgY29tcHJlc3M/OiBDb21wcmVzc0NvbmZpZztcbn07XG5leHBvcnQgdHlwZSBTdHJlYW1EZWNvcmF0b3JPcHRpb25zID0ge1xuICB0eXBlOiBcInNzZVwiO1xuICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSDsnbTrsqTtirgg7YKk67OE66GcIOuEmOqyqOyjvOuKlCDqsJLsnbTrr4DroZwg7Ja065akIO2DgOyeheydtOuToCDsg4HqtIDsl4bsnYxcbiAgZXZlbnRzOiB6LlpvZE9iamVjdDxhbnk+O1xuICBwYXRoPzogc3RyaW5nO1xuICByZXNvdXJjZU5hbWU/OiBzdHJpbmc7XG4gIGd1YXJkcz86IEd1YXJkS2V5W107XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFdlYlNvY2tldERlY29yYXRvck9wdGlvbnMgPSB7XG4gIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55IC0tIOydtOuypO2KuCDtgqTrs4TroZwg64SY6rKo7KO864qUIOqwkuydtOuvgOuhnCDslrTrlqQg7YOA7J6F7J2065OgIOyDgeq0gOyXhuydjFxuICBvdXRFdmVudHM6IHouWm9kT2JqZWN0PGFueT47XG4gIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55IC0tIOydtOuypO2KuCDtgqTrs4TroZwg64SY6rKo7KO864qUIOqwkuydtOuvgOuhnCDslrTrlqQg7YOA7J6F7J2065OgIOyDgeq0gOyXhuydjFxuICBpbkV2ZW50czogei5ab2RPYmplY3Q8YW55PjtcbiAgcGF0aD86IHN0cmluZztcbiAgcmVzb3VyY2VOYW1lPzogc3RyaW5nO1xuICBndWFyZHM/OiBHdWFyZEtleVtdO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgaGVhcnRiZWF0PzogbnVtYmVyO1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgUmVzb2x2ZWRXZWJTb2NrZXREZWNvcmF0b3JPcHRpb25zID0gV2ViU29ja2V0RGVjb3JhdG9yT3B0aW9ucyAmIHtcbiAgLy8gY29kZWdlbuydtCDtg4DsnoUg7J2066aE7J2EIOyerOyCrOyaqe2VoCDsiJgg7J6I64+E66GdIHN5bmNlcuqwgCBBU1Tsl5DshJwg67O06rCV7ZWY64qUIOuplO2DgOuNsOydtO2EsFxuICBvdXRFdmVudHNUeXBlUmVmPzogQXBpUGFyYW1UeXBlLlJlZjtcbiAgaW5FdmVudHNUeXBlUmVmPzogQXBpUGFyYW1UeXBlLlJlZjtcbn07XG5cbnR5cGUgQnVmZmVyVXBsb2FkT3B0aW9ucyA9IHtcbiAgY29uc3VtZT86IFwiYnVmZmVyXCI7XG59O1xudHlwZSBTdHJlYW1VcGxvYWRPcHRpb25zID0ge1xuICBjb25zdW1lOiBcInN0cmVhbVwiO1xuICBkZXN0aW5hdGlvbjogRHJpdmVyS2V5O1xuICBrZXlHZW5lcmF0b3I/OiBLZXlHZW5lcmF0b3I7XG59O1xuZXhwb3J0IHR5cGUgVXBsb2FkRGVjb3JhdG9yT3B0aW9ucyA9IHtcbiAgZ3VhcmRzPzogR3VhcmRLZXlbXTtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGxpbWl0cz86IEZhc3RpZnlNdWx0aXBhcnRCYXNlT3B0aW9uc1tcImxpbWl0c1wiXTtcbn0gJiAoQnVmZmVyVXBsb2FkT3B0aW9ucyB8IFN0cmVhbVVwbG9hZE9wdGlvbnMpO1xuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJlZEFwaXM6IHtcbiAgLyoqXG4gICAqIG1vZGVsTmFtZeydgCDrqqjrjbgg7YG0656Y7IqkIOydtOumhOyeheuLiOuLpC4gKGV4LiBcIlVzZXJNb2RlbFwiKVxuICAgKi9cbiAgbW9kZWxOYW1lOiBzdHJpbmc7XG4gIG1ldGhvZE5hbWU6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBvcHRpb25zOiBBcGlEZWNvcmF0b3JPcHRpb25zO1xuICBzdHJlYW1PcHRpb25zPzogU3RyZWFtRGVjb3JhdG9yT3B0aW9ucztcbiAgd2Vic29ja2V0T3B0aW9ucz86IFJlc29sdmVkV2ViU29ja2V0RGVjb3JhdG9yT3B0aW9ucztcbiAgdXBsb2FkT3B0aW9ucz86IFVwbG9hZERlY29yYXRvck9wdGlvbnM7XG59W10gPSBbXTtcbmV4cG9ydCB0eXBlIEV4dGVuZGVkQXBpID0ge1xuICBtb2RlbE5hbWU6IHN0cmluZztcbiAgbWV0aG9kTmFtZTogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIG9wdGlvbnM6IEFwaURlY29yYXRvck9wdGlvbnM7XG4gIHN0cmVhbU9wdGlvbnM/OiBTdHJlYW1EZWNvcmF0b3JPcHRpb25zO1xuICB3ZWJzb2NrZXRPcHRpb25zPzogUmVzb2x2ZWRXZWJTb2NrZXREZWNvcmF0b3JPcHRpb25zO1xuICB1cGxvYWRPcHRpb25zPzogVXBsb2FkRGVjb3JhdG9yT3B0aW9ucztcbiAgdHlwZVBhcmFtZXRlcnM6IEFwaVBhcmFtVHlwZS5UeXBlUGFyYW1bXTtcbiAgcGFyYW1ldGVyczogQXBpUGFyYW1bXTtcbiAgcmV0dXJuVHlwZTogQXBpUGFyYW1UeXBlO1xufTtcbnR5cGUgRGVjb3JhdG9yVGFyZ2V0ID0geyBjb25zdHJ1Y3RvcjogeyBuYW1lOiBzdHJpbmcgfSB9O1xuXG5jb25zdCBERUNPUkFUT1JfVFlQRVMgPSB7XG4gIEFQSTogU3ltYm9sKFwiYXBpXCIpLFxuICBTVFJFQU06IFN5bWJvbChcInN0cmVhbVwiKSxcbiAgV0VCU09DS0VUOiBTeW1ib2woXCJ3ZWJzb2NrZXRcIiksXG4gIFVQTE9BRDogU3ltYm9sKFwidXBsb2FkXCIpLFxufSBhcyBjb25zdDtcblxuZnVuY3Rpb24gY2hlY2tTaW5nbGVEZWNvcmF0b3IodGFyZ2V0OiBEZWNvcmF0b3JUYXJnZXQsIHByb3BlcnR5S2V5OiBzdHJpbmcsIGRlY29yYXRvclR5cGU6IHN5bWJvbCkge1xuICBjb25zdCBtZXRob2QgPSB0YXJnZXRbcHJvcGVydHlLZXkgYXMga2V5b2YgdHlwZW9mIHRhcmdldF0gYXMgeyBfX2RlY29yYXRvclR5cGU/OiBzeW1ib2wgfTtcbiAgaWYgKG1ldGhvZD8uX19kZWNvcmF0b3JUeXBlICYmIG1ldGhvZD8uX19kZWNvcmF0b3JUeXBlICE9PSBkZWNvcmF0b3JUeXBlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEAke2RlY29yYXRvclR5cGUuZGVzY3JpcHRpb24gPz8gU3RyaW5nKGRlY29yYXRvclR5cGUpfSBkZWNvcmF0b3IgY2FuIG9ubHkgYmUgdXNlZCBvbmNlIG9uICR7dGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWV9LiR7cHJvcGVydHlLZXl9LiBZb3UgY2FuIHVzZSBvbmx5IG9uZSBvZiBAYXBpLCBAc3RyZWFtLCBAd2Vic29ja2V0LCBvciBAdXBsb2FkIGRlY29yYXRvciBvbiB0aGUgc2FtZSBtZXRob2QuYCxcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIG1ldGhvZC5fX2RlY29yYXRvclR5cGUgPSBkZWNvcmF0b3JUeXBlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcGkob3B0aW9uczogQXBpRGVjb3JhdG9yT3B0aW9ucyA9IHt9KSB7XG4gIG9wdGlvbnMgPSB7XG4gICAgaHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgY2xpZW50czogW1wiYXhpb3NcIl0sXG4gICAgLi4ub3B0aW9ucyxcbiAgfTtcblxuICByZXR1cm4gKHRhcmdldDogRGVjb3JhdG9yVGFyZ2V0LCBwcm9wZXJ0eUtleTogc3RyaW5nLCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IpID0+IHtcbiAgICBjb25zdCBtb2RlbE5hbWUgPSBnZXRNb2RlbE5hbWVGcm9tQ2xhc3NOYW1lKHRhcmdldC5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICBhc3NlcnQoXG4gICAgICBtb2RlbE5hbWUsXG4gICAgICBgbW9kZWxOYW1lIGlzIHJlcXVpcmVkIG9uIEBhcGkgZGVjb3JhdG9yIG9uICR7dGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWV9LiR7cHJvcGVydHlLZXl9YCxcbiAgICApO1xuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBwcm9wZXJ0eUtleTtcblxuICAgIC8vIOuplOyEnOuTnOyXkCDqsbjrprAg642w7L2U66CI7J207YSwIOykkeuztSDssrTtgaxcbiAgICBjaGVja1NpbmdsZURlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5S2V5LCBERUNPUkFUT1JfVFlQRVMuQVBJKTtcblxuICAgIGNvbnN0IGRlZmF1bHRQYXRoID0gYC8ke2luZmxlY3Rpb24uY2FtZWxpemUoXG4gICAgICBtb2RlbE5hbWUucmVwbGFjZSgvTW9kZWwkLywgXCJcIikucmVwbGFjZSgvRnJhbWUkLywgXCJcIiksXG4gICAgICB0cnVlLFxuICAgICl9LyR7aW5mbGVjdGlvbi5jYW1lbGl6ZShwcm9wZXJ0eUtleSwgdHJ1ZSl9YDtcbiAgICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoID8/IGRlZmF1bHRQYXRoO1xuXG4gICAgLy8g6riw7KG0IOuPmeydvO2VnCDrqZTshJzrk5zqsIAg7J6I64qU7KeAIO2ZleyduCDtm4Qg7J6I64qUIOqyveyasCBvdmVycmlkZVxuICAgIGNvbnN0IGV4aXN0aW5nQXBpID0gcmVnaXN0ZXJlZEFwaXMuZmluZChcbiAgICAgIChhcGkpID0+IGFwaS5tb2RlbE5hbWUgPT09IG1vZGVsTmFtZSAmJiBhcGkubWV0aG9kTmFtZSA9PT0gbWV0aG9kTmFtZSxcbiAgICApO1xuICAgIGlmIChleGlzdGluZ0FwaSkge1xuICAgICAgLy8g6riw7KG07J2YIHBhdGjsmYAg7IOI66Gc7Jq0IHBhdGjqsIAg64uk66W064uk66m0KD3ruYgg7Iqk7Yq466eB7J20IOyVhOuLiOyXiOuKlOuNsCDri6Trpbgg7Iqk7Yq466eB7Jy866GcIOuwlOuAjOqyjCDrkJzri6TrqbQpIOyXkOufrOulvCDthLDrnKjroKTspI3ri4jri6QuXG4gICAgICBhc3NlcnROb0NvbmZsaWN0aW5nUGF0aChcImFwaVwiLCBtb2RlbE5hbWUsIG1ldGhvZE5hbWUsIGV4aXN0aW5nQXBpLnBhdGgsIHBhdGgpO1xuICAgICAgZXhpc3RpbmdBcGkucGF0aCA9IHBhdGg7XG5cbiAgICAgIC8vIOq4sOyhtOydmCDsmLXshZjqs7wg7IOI66Gc7Jq0IOyYteyFmOydtCDqsrnsuZjripQg67aA67aE7J20IOyeiOuLpOuptCDsl5Drn6zrpbwg7YSw65yo66Ck7KSN64uI64ukLlxuICAgICAgYXNzZXJ0Tm9Db25mbGljdGluZ09wdGlvbnMoXCJhcGlcIiwgbW9kZWxOYW1lLCBtZXRob2ROYW1lLCBleGlzdGluZ0FwaS5vcHRpb25zLCBvcHRpb25zKTtcbiAgICAgIGV4aXN0aW5nQXBpLm9wdGlvbnMgPSB7XG4gICAgICAgIC4uLmV4aXN0aW5nQXBpLm9wdGlvbnMsIC8vIOq4sOyhtOydmCDsmLXshZjsnYQg7KG07KSR7ZWY65CYXG4gICAgICAgIC4uLm9wdGlvbnMsIC8vIEBhcGkg642w7L2U66CI7J207YSw7J2YIOyYteyFmOydhCDstpTqsIDtlanri4jri6QuXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZWdpc3RlcmVkQXBpcy5wdXNoKHtcbiAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBwYXRoLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIGRlc2NyaXB0b3IudmFsdWUgPSBhc3luYyBmdW5jdGlvbiAodGhpczogQmFzZU1vZGVsQ2xhc3MgfCBCYXNlRnJhbWVDbGFzcywgLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEJhc2VNb2RlbENsYXNzKSB7XG4gICAgICAgIGdldExvZ2dlcihjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSh0aGlzLm1vZGVsTmFtZSwgXCJtb2RlbFwiKSkuZGVidWcoXG4gICAgICAgICAgXCJhcGk6IHtodHRwTWV0aG9kfSB7bW9kZWx9LnttZXRob2R9XCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaHR0cE1ldGhvZDogb3B0aW9ucy5odHRwTWV0aG9kLFxuICAgICAgICAgICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEJhc2VGcmFtZUNsYXNzKSB7XG4gICAgICAgIGdldExvZ2dlcihjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSh0aGlzLmZyYW1lTmFtZSwgXCJmcmFtZVwiKSkuZGVidWcoXG4gICAgICAgICAgXCJhcGk6IHtodHRwTWV0aG9kfSB7bW9kZWx9LnttZXRob2R9XCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaHR0cE1ldGhvZDogb3B0aW9ucy5odHRwTWV0aG9kLFxuICAgICAgICAgICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmVhbShvcHRpb25zOiBTdHJlYW1EZWNvcmF0b3JPcHRpb25zKSB7XG4gIHJldHVybiAodGFyZ2V0OiBEZWNvcmF0b3JUYXJnZXQsIHByb3BlcnR5S2V5OiBzdHJpbmcsIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcikgPT4ge1xuICAgIGNvbnN0IG1vZGVsTmFtZSA9IGdldE1vZGVsTmFtZUZyb21DbGFzc05hbWUodGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGFzc2VydChcbiAgICAgIG1vZGVsTmFtZSxcbiAgICAgIGBtb2RlbE5hbWUgaXMgcmVxdWlyZWQgb24gQHN0cmVhbSBkZWNvcmF0b3Igb24gJHt0YXJnZXQuY29uc3RydWN0b3IubmFtZX0uJHtwcm9wZXJ0eUtleX1gLFxuICAgICk7XG4gICAgY29uc3QgbWV0aG9kTmFtZSA9IHByb3BlcnR5S2V5O1xuXG4gICAgLy8g66mU7ISc65Oc7JeQIOqxuOumsCDrjbDsvZTroIjsnbTthLAg7KSR67O1IOyytO2BrFxuICAgIGNoZWNrU2luZ2xlRGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHlLZXksIERFQ09SQVRPUl9UWVBFUy5TVFJFQU0pO1xuXG4gICAgY29uc3QgZGVmYXVsdFBhdGggPSBgLyR7aW5mbGVjdGlvbi5jYW1lbGl6ZShcbiAgICAgIG1vZGVsTmFtZS5yZXBsYWNlKC9Nb2RlbCQvLCBcIlwiKS5yZXBsYWNlKC9GcmFtZSQvLCBcIlwiKSxcbiAgICAgIHRydWUsXG4gICAgKX0vJHtpbmZsZWN0aW9uLmNhbWVsaXplKHByb3BlcnR5S2V5LCB0cnVlKX1gO1xuICAgIGNvbnN0IHBhdGggPSBvcHRpb25zLnBhdGggPz8gZGVmYXVsdFBhdGg7XG4gICAgLy8gc3RyZWFtIOyghOyaqSDtlYTrk5woZXZlbnRzLCB0eXBlKeuKlCBBcGlEZWNvcmF0b3JPcHRpb25z7JeQIOyGje2VmOyngCDslYrsnLzrr4DroZwg7KCc7Jm4XG4gICAgY29uc3QgeyBldmVudHM6IF8sIHR5cGU6IF90eXBlLCAuLi5hcGlPcHRpb25zIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IG9wdGlvbnNXaXRoRGVmYXVsdHMgPSB7XG4gICAgICAuLi5hcGlPcHRpb25zLFxuICAgICAgaHR0cE1ldGhvZDogXCJHRVRcIiBhcyBIVFRQTWV0aG9kcyxcbiAgICB9O1xuXG4gICAgY29uc3QgZXhpc3RpbmdBcGkgPSByZWdpc3RlcmVkQXBpcy5maW5kKFxuICAgICAgKGFwaSkgPT4gYXBpLm1vZGVsTmFtZSA9PT0gbW9kZWxOYW1lICYmIGFwaS5tZXRob2ROYW1lID09PSBtZXRob2ROYW1lLFxuICAgICk7XG4gICAgaWYgKGV4aXN0aW5nQXBpKSB7XG4gICAgICAvLyDquLDsobTsnZggcGF0aOyZgCDsg4jroZzsmrQgcGF0aOqwgCDri6TrpbTri6TrqbQoPeu5iCDsiqTtirjrp4HsnbQg7JWE64uI7JeI64qU642wIOuLpOuluCDsiqTtirjrp4HsnLzroZwg67CU64CM6rKMIOuQnOuLpOuptCkg7JeQ65+s66W8IO2EsOucqOugpOykjeuLiOuLpC5cbiAgICAgIGFzc2VydE5vQ29uZmxpY3RpbmdQYXRoKFwic3RyZWFtXCIsIG1vZGVsTmFtZSwgbWV0aG9kTmFtZSwgZXhpc3RpbmdBcGkucGF0aCwgcGF0aCk7XG4gICAgICBleGlzdGluZ0FwaS5wYXRoID0gcGF0aDtcblxuICAgICAgLy8g6riw7KG07J2YIOyYteyFmOqzvCDsg4jroZzsmrQg7Ji17IWY7J20IOqyuey5mOuKlCDrtoDrtoTsnbQg7J6I64uk66m0IOyXkOufrOulvCDthLDrnKjroKTspI3ri4jri6QuXG4gICAgICBhc3NlcnROb0NvbmZsaWN0aW5nT3B0aW9ucyhcbiAgICAgICAgXCJzdHJlYW1cIixcbiAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBleGlzdGluZ0FwaS5vcHRpb25zLFxuICAgICAgICBvcHRpb25zV2l0aERlZmF1bHRzLFxuICAgICAgKTtcbiAgICAgIGV4aXN0aW5nQXBpLm9wdGlvbnMgPSB7XG4gICAgICAgIC4uLmV4aXN0aW5nQXBpLm9wdGlvbnMsIC8vIOq4sOyhtOydmCDsmLXshZjsnYQg7KG07KSR7ZWY65CYXG4gICAgICAgIC4uLm9wdGlvbnNXaXRoRGVmYXVsdHMsIC8vIEBzdHJlYW0g642w7L2U66CI7J207YSw7J2YIOyYteyFmOydhCDstpTqsIDtlanri4jri6QuXG4gICAgICB9O1xuXG4gICAgICBleGlzdGluZ0FwaS5zdHJlYW1PcHRpb25zID0gb3B0aW9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgcmVnaXN0ZXJlZEFwaXMucHVzaCh7XG4gICAgICAgIG1vZGVsTmFtZSxcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgb3B0aW9uczogb3B0aW9uc1dpdGhEZWZhdWx0cyxcbiAgICAgICAgc3RyZWFtT3B0aW9uczogb3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gYXN5bmMgZnVuY3Rpb24gKHRoaXM6IEJhc2VNb2RlbENsYXNzIHwgQmFzZUZyYW1lQ2xhc3MsIC4uLmFyZ3M6IHVua25vd25bXSkge1xuICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBCYXNlTW9kZWxDbGFzcykge1xuICAgICAgICBnZXRMb2dnZXIoY29udmVydERvbWFpblRvQ2F0ZWdvcnkodGhpcy5tb2RlbE5hbWUsIFwibW9kZWxcIikpLmRlYnVnKFxuICAgICAgICAgIFwic3RyZWFtOiB7bW9kZWx9LnttZXRob2R9XCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEJhc2VGcmFtZUNsYXNzKSB7XG4gICAgICAgIGdldExvZ2dlcihjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSh0aGlzLmZyYW1lTmFtZSwgXCJmcmFtZVwiKSkuZGVidWcoXG4gICAgICAgICAgXCJzdHJlYW06IHttb2RlbH0ue21ldGhvZH1cIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2RlbDogbW9kZWxOYW1lLFxuICAgICAgICAgICAgbWV0aG9kOiBtZXRob2ROYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2Vic29ja2V0KG9wdGlvbnM6IFdlYlNvY2tldERlY29yYXRvck9wdGlvbnMpIHtcbiAgcmV0dXJuICh0YXJnZXQ6IERlY29yYXRvclRhcmdldCwgcHJvcGVydHlLZXk6IHN0cmluZywgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yKSA9PiB7XG4gICAgY29uc3QgbW9kZWxOYW1lID0gZ2V0TW9kZWxOYW1lRnJvbUNsYXNzTmFtZSh0YXJnZXQuY29uc3RydWN0b3IubmFtZSk7XG4gICAgYXNzZXJ0KFxuICAgICAgbW9kZWxOYW1lLFxuICAgICAgYG1vZGVsTmFtZSBpcyByZXF1aXJlZCBvbiBAd2Vic29ja2V0IGRlY29yYXRvciBvbiAke3RhcmdldC5jb25zdHJ1Y3Rvci5uYW1lfS4ke3Byb3BlcnR5S2V5fWAsXG4gICAgKTtcbiAgICBjb25zdCBtZXRob2ROYW1lID0gcHJvcGVydHlLZXk7XG5cbiAgICBjaGVja1NpbmdsZURlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5S2V5LCBERUNPUkFUT1JfVFlQRVMuV0VCU09DS0VUKTtcblxuICAgIGNvbnN0IGRlZmF1bHRQYXRoID0gYC8ke2luZmxlY3Rpb24uY2FtZWxpemUoXG4gICAgICBtb2RlbE5hbWUucmVwbGFjZSgvTW9kZWwkLywgXCJcIikucmVwbGFjZSgvRnJhbWUkLywgXCJcIiksXG4gICAgICB0cnVlLFxuICAgICl9LyR7aW5mbGVjdGlvbi5jYW1lbGl6ZShwcm9wZXJ0eUtleSwgdHJ1ZSl9YDtcbiAgICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoID8/IGRlZmF1bHRQYXRoO1xuICAgIGNvbnN0IHsgb3V0RXZlbnRzOiBfb3V0RXZlbnRzLCBpbkV2ZW50czogX2luRXZlbnRzLCAuLi5hcGlPcHRpb25zIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IG9wdGlvbnNXaXRoRGVmYXVsdHMgPSB7XG4gICAgICAuLi5hcGlPcHRpb25zLFxuICAgICAgaHR0cE1ldGhvZDogXCJHRVRcIiBhcyBIVFRQTWV0aG9kcyxcbiAgICB9O1xuXG4gICAgY29uc3QgZXhpc3RpbmdBcGkgPSByZWdpc3RlcmVkQXBpcy5maW5kKFxuICAgICAgKGFwaSkgPT4gYXBpLm1vZGVsTmFtZSA9PT0gbW9kZWxOYW1lICYmIGFwaS5tZXRob2ROYW1lID09PSBtZXRob2ROYW1lLFxuICAgICk7XG4gICAgaWYgKGV4aXN0aW5nQXBpKSB7XG4gICAgICBhc3NlcnROb0NvbmZsaWN0aW5nUGF0aChcIndlYnNvY2tldFwiLCBtb2RlbE5hbWUsIG1ldGhvZE5hbWUsIGV4aXN0aW5nQXBpLnBhdGgsIHBhdGgpO1xuICAgICAgZXhpc3RpbmdBcGkucGF0aCA9IHBhdGg7XG5cbiAgICAgIGFzc2VydE5vQ29uZmxpY3RpbmdPcHRpb25zKFxuICAgICAgICBcIndlYnNvY2tldFwiLFxuICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIGV4aXN0aW5nQXBpLm9wdGlvbnMsXG4gICAgICAgIG9wdGlvbnNXaXRoRGVmYXVsdHMsXG4gICAgICApO1xuICAgICAgZXhpc3RpbmdBcGkub3B0aW9ucyA9IHtcbiAgICAgICAgLi4uZXhpc3RpbmdBcGkub3B0aW9ucyxcbiAgICAgICAgLi4ub3B0aW9uc1dpdGhEZWZhdWx0cyxcbiAgICAgIH07XG5cbiAgICAgIGV4aXN0aW5nQXBpLndlYnNvY2tldE9wdGlvbnMgPSBvcHRpb25zO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWdpc3RlcmVkQXBpcy5wdXNoKHtcbiAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBwYXRoLFxuICAgICAgICBvcHRpb25zOiBvcHRpb25zV2l0aERlZmF1bHRzLFxuICAgICAgICB3ZWJzb2NrZXRPcHRpb25zOiBvcHRpb25zLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIGRlc2NyaXB0b3IudmFsdWUgPSBhc3luYyBmdW5jdGlvbiAodGhpczogQmFzZU1vZGVsQ2xhc3MgfCBCYXNlRnJhbWVDbGFzcywgLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEJhc2VNb2RlbENsYXNzKSB7XG4gICAgICAgIGdldExvZ2dlcihjb252ZXJ0RG9tYWluVG9DYXRlZ29yeSh0aGlzLm1vZGVsTmFtZSwgXCJtb2RlbFwiKSkuZGVidWcoXG4gICAgICAgICAgXCJ3ZWJzb2NrZXQ6IHttb2RlbH0ue21ldGhvZH1cIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2RlbDogbW9kZWxOYW1lLFxuICAgICAgICAgICAgbWV0aG9kOiBtZXRob2ROYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQmFzZUZyYW1lQ2xhc3MpIHtcbiAgICAgICAgZ2V0TG9nZ2VyKGNvbnZlcnREb21haW5Ub0NhdGVnb3J5KHRoaXMuZnJhbWVOYW1lLCBcImZyYW1lXCIpKS5kZWJ1ZyhcbiAgICAgICAgICBcIndlYnNvY2tldDoge21vZGVsfS57bWV0aG9kfVwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZE5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2FjdGlvbmFsKG9wdGlvbnM6IFRyYW5zYWN0aW9uYWxPcHRpb25zID0ge30pIHtcbiAgY29uc3QgeyBpc29sYXRpb24sIHJlYWRPbmx5LCBkYlByZXNldCA9IFwid1wiIH0gPSBvcHRpb25zO1xuXG4gIHJldHVybiAodGFyZ2V0OiBEZWNvcmF0b3JUYXJnZXQsIHByb3BlcnR5S2V5OiBzdHJpbmcsIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcikgPT4ge1xuICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICBjb25zdCBtb2RlbE5hbWUgPSBnZXRNb2RlbE5hbWVGcm9tQ2xhc3NOYW1lKHRhcmdldC5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICBhc3NlcnQoXG4gICAgICBtb2RlbE5hbWUsXG4gICAgICBgbW9kZWxOYW1lIGlzIHJlcXVpcmVkIG9uIEB0cmFuc2FjdGlvbmFsIGRlY29yYXRvciBvbiAke3RhcmdldC5jb25zdHJ1Y3Rvci5uYW1lfS4ke3Byb3BlcnR5S2V5fWAsXG4gICAgKTtcbiAgICBjb25zdCBtZXRob2ROYW1lID0gcHJvcGVydHlLZXk7XG5cbiAgICBkZXNjcmlwdG9yLnZhbHVlID0gYXN5bmMgZnVuY3Rpb24gKHRoaXM6IEJhc2VNb2RlbENsYXNzLCAuLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFwidHJhbnNhY3Rpb25hbDoge21vZGVsfS57bWV0aG9kfVwiLCB7XG4gICAgICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gICAgICAgIG1ldGhvZDogbWV0aG9kTmFtZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRleHQgPSBEQi50cmFuc2FjdGlvblN0b3JhZ2UuZ2V0U3RvcmUoKTtcblxuICAgICAgLy8gQXN5bmNMb2NhbFN0b3JhZ2Ug7Luo7YWN7Iqk7Yq4IOyXhuqxsOuCmCDtlbTri7kgcHJlc2V07J2YIO2KuOuenOyereyFmOydtCDsl4bsnLzrqbQg7IOI66GcIOyLnOyekVxuICAgICAgY29uc3Qgc3RhcnRUcmFuc2FjdGlvbiA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcHVyaSA9IHRoaXMuZ2V0UHVyaShkYlByZXNldCk7XG5cbiAgICAgICAgcmV0dXJuIHB1cmkua25leC50cmFuc2FjdGlvbihcbiAgICAgICAgICBhc3luYyAodHJ4KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcIm5ldyB0cmFuc2FjdGlvbiBjb250ZXh0OiB7ZGJQcmVzZXR9XCIsIHsgZGJQcmVzZXQgfSk7XG4gICAgICAgICAgICBjb25zdCB0cnhXcmFwcGVyID0gbmV3IFB1cmlUcmFuc2FjdGlvbldyYXBwZXIodHJ4LCBuZXcgVXBzZXJ0QnVpbGRlcigpKTtcbiAgICAgICAgICAgIC8vIFRyYW5zYWN0aW9uQ29udGV4dOyXkCDtirjrnpzsnq3shZgg7KCA7J6lXG4gICAgICAgICAgICBEQi5nZXRUcmFuc2FjdGlvbkNvbnRleHQoKS5zZXRUcmFuc2FjdGlvbihkYlByZXNldCwgdHJ4V3JhcHBlcik7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIC8vIO2KuOuenOyereyFmCDsoJzqsbBcbiAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXCJkZWxldGUgdHJhbnNhY3Rpb24gY29udGV4dDoge2RiUHJlc2V0fVwiLCB7IGRiUHJlc2V0IH0pO1xuICAgICAgICAgICAgICBEQi5nZXRUcmFuc2FjdGlvbkNvbnRleHQoKS5kZWxldGVUcmFuc2FjdGlvbihkYlByZXNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IGlzb2xhdGlvbkxldmVsOiBpc29sYXRpb24sIHJlYWRPbmx5IH0sXG4gICAgICAgICk7XG4gICAgICB9O1xuXG4gICAgICAvLyBBc3luY0xvY2FsU3RvcmFnZSDsu6jthY3siqTtirjqsIAg7JeG7Jy866m0IOyDiOuhnCDsg53shLFcbiAgICAgIGlmICghZXhpc3RpbmdDb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBEQi5ydW5XaXRoVHJhbnNhY3Rpb24oc3RhcnRUcmFuc2FjdGlvbik7XG4gICAgICB9XG5cbiAgICAgIC8vIOydtOuvuCBBc3luY0xvY2FsU3RvcmFnZSDsu6jthY3siqTtirgg7JWI7JeQIOyeiOuKlOyngCDtmZXsnbgg7ZuEIO2VtOuLuSBwcmVzZXTsnZgg7Yq4656c7J6t7IWY7J20IOydtOuvuCDsnojsnLzrqbQg7J6s7IKs7JqpXG4gICAgICBpZiAoZXhpc3RpbmdDb250ZXh0Py5nZXRUcmFuc2FjdGlvbihkYlByZXNldCkpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXCJyZXVzZSB0cmFuc2FjdGlvbiBjb250ZXh0OiB7ZGJQcmVzZXR9XCIsIHsgZGJQcmVzZXQgfSk7XG4gICAgICAgIHJldHVybiBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIH1cblxuICAgICAgLy8g7Luo7YWN7Iqk7Yq464qUIOyeiOyngOunjCDsnbQgcHJlc2V07J2YIO2KuOuenOyereyFmOydgCDsl4bripQg6rK97JqwICjqsJnsnYAg7Luo7YWN7Iqk7Yq4IOuCtOyXkOyEnCDsi6TtlokpXG4gICAgICByZXR1cm4gc3RhcnRUcmFuc2FjdGlvbigpO1xuICAgIH07XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfTtcbn1cblxuLyoqXG4gKiDtjIzsnbwg7JeF66Gc65OcIEFQSeulvCDsg53shLHtlbTspI3ri4jri6QuIChAYXBpIOuNsOy9lOugiOydtO2EsCDsl4bsnbQg64+F66a97KCB7Jy866GcIOyCrOyaqSlcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXBsb2FkKG9wdGlvbnM6IFVwbG9hZERlY29yYXRvck9wdGlvbnMgPSB7IGNvbnN1bWU6IFwiYnVmZmVyXCIgfSkge1xuICByZXR1cm4gKHRhcmdldDogRGVjb3JhdG9yVGFyZ2V0LCBwcm9wZXJ0eUtleTogc3RyaW5nLCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IpID0+IHtcbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgY29uc3QgbW9kZWxOYW1lID0gZ2V0TW9kZWxOYW1lRnJvbUNsYXNzTmFtZSh0YXJnZXQuY29uc3RydWN0b3IubmFtZSk7XG4gICAgYXNzZXJ0KFxuICAgICAgbW9kZWxOYW1lLFxuICAgICAgYG1vZGVsTmFtZSBpcyByZXF1aXJlZCBvbiBAdXBsb2FkIGRlY29yYXRvciBvbiAke3RhcmdldC5jb25zdHJ1Y3Rvci5uYW1lfS4ke3Byb3BlcnR5S2V5fWAsXG4gICAgKTtcbiAgICBjb25zdCBtZXRob2ROYW1lID0gcHJvcGVydHlLZXk7XG5cbiAgICAvLyDrqZTshJzrk5zsl5Ag6rG466awIOuNsOy9lOugiOydtO2EsCDspJHrs7Ug7LK07YGsXG4gICAgY2hlY2tTaW5nbGVEZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSwgREVDT1JBVE9SX1RZUEVTLlVQTE9BRCk7XG5cbiAgICBjb25zdCBkZWZhdWx0UGF0aCA9IGAvJHtpbmZsZWN0aW9uLmNhbWVsaXplKFxuICAgICAgbW9kZWxOYW1lLnJlcGxhY2UoL01vZGVsJC8sIFwiXCIpLnJlcGxhY2UoL0ZyYW1lJC8sIFwiXCIpLFxuICAgICAgdHJ1ZSxcbiAgICApfS8ke2luZmxlY3Rpb24uY2FtZWxpemUobWV0aG9kTmFtZSwgdHJ1ZSl9YDtcblxuICAgIC8vIHJlZ2lzdGVyZWRBcGlz7JeQ7IScIO2VtOuLuSBBUEkg7LC+7JWE7IScIHVwbG9hZE9wdGlvbnMg7LaU6rCAXG4gICAgY29uc3QgZXhpc3RpbmdBcGkgPSByZWdpc3RlcmVkQXBpcy5maW5kKFxuICAgICAgKGFwaSkgPT4gYXBpLm1vZGVsTmFtZSA9PT0gbW9kZWxOYW1lICYmIGFwaS5tZXRob2ROYW1lID09PSBtZXRob2ROYW1lLFxuICAgICk7XG5cbiAgICBpZiAoZXhpc3RpbmdBcGkpIHtcbiAgICAgIC8vIOyerOuTseuhnSDsi5wg7JeF66Gc65OcIOyYteyFmOunjCDqsLHsi6BcbiAgICAgIGV4aXN0aW5nQXBpLnVwbG9hZE9wdGlvbnMgPSBvcHRpb25zO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDsg4jroZwg65Ox66GdXG4gICAgICByZWdpc3RlcmVkQXBpcy5wdXNoKHtcbiAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBwYXRoOiBkZWZhdWx0UGF0aCxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGh0dHBNZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgIGNsaWVudHM6IFtcImF4aW9zLW11bHRpcGFydFwiLCBcInRhbnN0YWNrLW11dGF0aW9uLW11bHRpcGFydFwiXSxcbiAgICAgICAgICBndWFyZHM6IG9wdGlvbnMuZ3VhcmRzLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uLFxuICAgICAgICB9LFxuICAgICAgICB1cGxvYWRPcHRpb25zOiBvcHRpb25zLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGFzeW5jIGZ1bmN0aW9uICh0aGlzOiBCYXNlTW9kZWxDbGFzcyB8IEJhc2VGcmFtZUNsYXNzLCAuLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQmFzZU1vZGVsQ2xhc3MpIHtcbiAgICAgICAgZ2V0TG9nZ2VyKGNvbnZlcnREb21haW5Ub0NhdGVnb3J5KHRoaXMubW9kZWxOYW1lLCBcIm1vZGVsXCIpKS5kZWJ1ZyhcbiAgICAgICAgICBcInVwbG9hZDoge21vZGVsfS57bWV0aG9kfVwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZE5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBCYXNlRnJhbWVDbGFzcykge1xuICAgICAgICBnZXRMb2dnZXIoY29udmVydERvbWFpblRvQ2F0ZWdvcnkodGhpcy5mcmFtZU5hbWUsIFwiZnJhbWVcIikpLmRlYnVnKFxuICAgICAgICAgIFwidXBsb2FkOiB7bW9kZWx9LnttZXRob2R9XCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfTtcblxuICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICB9O1xufVxuXG4vKipcbiAqIOq4sOyhtOydmCBwYXRo7JmAIOyDiOuhnOyatCBwYXRo6rCAIOuLpOultOuLpOuptCg96rCS7J20IOyeiOuNmCDsiqTtirjrp4HsnbQg64uk66W4IOqwkuydtCDsnojripQg7Iqk7Yq466eB7Jy866GcIOuwlOuAjOqyjCDrkJzri6TrqbQpIOyXkOufrOulvCDthLDrnKjroKTspI3ri4jri6QuXG4gKiBAcGFyYW0gZGVjb3JhdG9yTmFtZSDrjbDsvZTroIjsnbTthLAg7J2066aEXG4gKiBAcGFyYW0gbW9kZWxOYW1lIOuqqOuNuCDsnbTrpoRcbiAqIEBwYXJhbSBtZXRob2ROYW1lIOuplOyEnOuTnCDsnbTrpoRcbiAqIEBwYXJhbSBleGlzdGluZ1BhdGgg6riw7KG07J2YIHBhdGhcbiAqIEBwYXJhbSBuZXdQYXRoIOyDiOuhnOyatCBwYXRoXG4gKi9cbmZ1bmN0aW9uIGFzc2VydE5vQ29uZmxpY3RpbmdQYXRoKFxuICBkZWNvcmF0b3JOYW1lOiBzdHJpbmcsXG4gIG1vZGVsTmFtZTogc3RyaW5nLFxuICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gIGV4aXN0aW5nUGF0aDogc3RyaW5nLFxuICBuZXdQYXRoOiBzdHJpbmcsXG4pIHtcbiAgaWYgKGV4aXN0aW5nUGF0aCAhPT0gXCJcIiAmJiBuZXdQYXRoICE9PSBcIlwiICYmIGV4aXN0aW5nUGF0aCAhPT0gbmV3UGF0aCkge1xuICAgIC8vIOydtOqyg+ydtCDrrLTsiqgg7IOB7Zmp7J2064OQ66m07JqULCBhcGkucGF0aOqwgCDrja7slrTslIzsm4zsp4DripQg7IOB7Zmp7J6F64uI64ukLlxuICAgIC8vIOqwgOuguSBAYXBpKHsgcGF0aDogXCIvYXBpL3YxL3VzZXJzXCIgfSkg642w7L2U66CI7J207YSw6rCAIOu2meyWtOyeiOuKlCDrqZTshJzrk5zsl5BcbiAgICAvLyBAc3RyZWFtKHsgcGF0aDogXCIvYXBpL3YxL3VzZXJzL3N0cmVhbVwiIH0pIOqwmeydgCDqsoPsnbQg67aZ7Ja0IOyeiOuKlCDsg4HtmansnoXri4jri6QuXG4gICAgLy8g7J2066CH6rKMIOuQmOuptCDrkZAg642w7L2U66CI7J207YSw6rCAIOqwmeydgCBhcGnsnZggcGF0aCDtlYTrk5zrpbwg6rG065Oc66as6rKMIOuQmOuvgOuhnCwg7JeQ65+s66W8IO2EsOucqOugpOykjeuLiOuLpC5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQCR7ZGVjb3JhdG9yTmFtZX0gZGVjb3JhdG9yIG9uICR7bW9kZWxOYW1lfS4ke21ldGhvZE5hbWV9IGhhcyBjb25mbGljdGluZyBwYXRoOiAke25ld1BhdGh9LiBUaGUgZGVjb3JhdG9yIGlzIHRyeWluZyB0byBvdmVycmlkZSB0aGUgZXhpc3RpbmcgcGF0aCgke2V4aXN0aW5nUGF0aH0pIHdpdGggdGhlIG5ldyBwYXRoKCR7bmV3UGF0aH0pLmAsXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIOq4sOyhtOydmCDsmLXshZjqs7wg7IOI66Gc7Jq0IOyYteyFmOydtCDqsrnsuZjripQg67aA67aE7J20IOyeiOuLpOuptCDsl5Drn6zrpbwg7YSw65yo66Ck7KSN64uI64ukLlxuICogQHBhcmFtIGRlY29yYXRvck5hbWUg642w7L2U66CI7J207YSwIOydtOumhFxuICogQHBhcmFtIG1vZGVsTmFtZSDrqqjrjbgg7J2066aEXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSDrqZTshJzrk5wg7J2066aEXG4gKiBAcGFyYW0gZXhpc3RpbmdPcHRpb25zIOq4sOyhtOydmCDsmLXshZhcbiAqIEBwYXJhbSBuZXdPcHRpb25zIOyDiOuhnOyatCDsmLXshZhcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0Tm9Db25mbGljdGluZ09wdGlvbnMoXG4gIGRlY29yYXRvck5hbWU6IHN0cmluZyxcbiAgbW9kZWxOYW1lOiBzdHJpbmcsXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0gPOyVhCDsib3qsozsib3qsowg7KKAIOqwkeyLnOuLpD5cbiAgZXhpc3RpbmdPcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSA87J2065+0IOuVjCDslYTri4jrqbQgYW55IOyWuOygnCDslIHri4jquYw+XG4gIG5ld09wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4pIHtcbiAgT2JqZWN0LmtleXMobmV3T3B0aW9ucykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgaWYgKGV4aXN0aW5nT3B0aW9uc1trZXldICYmICFpc0VxdWFsKGV4aXN0aW5nT3B0aW9uc1trZXldLCBuZXdPcHRpb25zW2tleV0pKSB7XG4gICAgICAvLyDsnbTqsoPsnbQg66y07IqoIOyDge2ZqeydtOuDkOuptOyalCwgYXBpLm9wdGlvbnPqsIAg642u7Ja07JSM7JuM7KeA64qUIOyDge2ZqeyeheuLiOuLpC5cbiAgICAgIC8vIOqwgOuguSBAYXBpKHsgcmVzb3VyY2VOYW1lOiBcIlVzZXJzXCIgfSkg642w7L2U66CI7J207YSw6rCAIOu2meyWtOyeiOuKlCDrqZTshJzrk5zsl5BcbiAgICAgIC8vIEBzdHJlYW0oeyByZXNvdXJjZU5hbWU6IFwiUG9zdHNcIiB9KSDqsJnsnYAg6rKD7J20IOu2meyWtCDsnojripQg7IOB7Zmp7J6F64uI64ukLlxuICAgICAgLy8g7J2066CH6rKMIOuQmOuptCDrkZAg642w7L2U66CI7J207YSw6rCAIOqwmeydgCBhcGnsnZggb3B0aW9ucyDsho0g6rCZ7J2AIO2VhOuTnOulvCDqsbTrk5zrpqzqsowg65CY66+A66GcLCDsl5Drn6zrpbwg7YSw65yo66Ck7KSN64uI64ukLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQCR7ZGVjb3JhdG9yTmFtZX0gZGVjb3JhdG9yIG9uICR7bW9kZWxOYW1lfS4ke21ldGhvZE5hbWV9IGhhcyBjb25mbGljdGluZyBvcHRpb25zOiAke2tleX0uIFRoZSBkZWNvcmF0b3IgaXMgdHJ5aW5nIHRvIG92ZXJyaWRlIHRoZSBleGlzdGluZyBvcHRpb24oJHtKU09OLnN0cmluZ2lmeShleGlzdGluZ09wdGlvbnNba2V5XSl9KSB3aXRoIHRoZSBuZXcgb3B0aW9uKCR7SlNPTi5zdHJpbmdpZnkobmV3T3B0aW9uc1trZXldKX0pLmAsXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFpSUEsU0FBUyxxQkFBcUIsUUFBeUIsYUFBcUIsZUFBdUI7Q0FDakcsTUFBTSxTQUFTLE9BQU87Q0FDdEIsSUFBSSxRQUFRLG1CQUFtQixRQUFRLG9CQUFvQixlQUN6RCxNQUFNLElBQUksTUFDUixJQUFJLGNBQWMsZUFBZSxPQUFPLGFBQWEsRUFBRSxzQ0FBc0MsT0FBTyxZQUFZLEtBQUssR0FBRyxZQUFZLDhGQUN0STtNQUVBLE9BQU8sa0JBQWtCO0FBRTdCO0FBRUEsU0FBZ0IsSUFBSSxVQUErQixDQUFDLEdBQUc7Q0FDckQsVUFBVTtFQUNSLFlBQVk7RUFDWixhQUFhO0VBQ2IsU0FBUyxDQUFDLE9BQU87RUFDakIsR0FBRztDQUNMO0NBRUEsUUFBUSxRQUF5QixhQUFxQixlQUFtQztFQUN2RixNQUFNLFlBQVksMEJBQTBCLE9BQU8sWUFBWSxJQUFJO0VBQ25FLE9BQ0UsV0FDQSw4Q0FBOEMsT0FBTyxZQUFZLEtBQUssR0FBRyxhQUMzRTtFQUNBLE1BQU0sYUFBYTtFQUduQixxQkFBcUIsUUFBUSxhQUFhLGdCQUFnQixHQUFHO0VBRTdELE1BQU0sY0FBYyxJQUFJLFdBQVcsU0FDakMsVUFBVSxRQUFRLFVBQVUsRUFBRSxDQUFDLENBQUMsUUFBUSxVQUFVLEVBQUUsR0FDcEQsSUFDRixFQUFFLEdBQUcsV0FBVyxTQUFTLGFBQWEsSUFBSTtFQUMxQyxNQUFNLE9BQU8sUUFBUSxRQUFRO0VBRzdCLE1BQU0sY0FBYyxlQUFlLE1BQ2hDLFFBQVEsSUFBSSxjQUFjLGFBQWEsSUFBSSxlQUFlLFVBQzdEO0VBQ0EsSUFBSSxhQUFhO0dBRWYsd0JBQXdCLE9BQU8sV0FBVyxZQUFZLFlBQVksTUFBTSxJQUFJO0dBQzVFLFlBQVksT0FBTztHQUduQiwyQkFBMkIsT0FBTyxXQUFXLFlBQVksWUFBWSxTQUFTLE9BQU87R0FDckYsWUFBWSxVQUFVO0lBQ3BCLEdBQUcsWUFBWTtJQUNmLEdBQUc7R0FDTDtFQUNGLE9BQ0UsZUFBZSxLQUFLO0dBQ2xCO0dBQ0E7R0FDQTtHQUNBO0VBQ0YsQ0FBQztFQUdILE1BQU0saUJBQWlCLFdBQVc7RUFDbEMsV0FBVyxRQUFRLGVBQXVELEdBQUcsTUFBaUI7R0FDNUYsSUFBSSxnQkFBZ0IsZ0JBQ2xCLFVBQVUsd0JBQXdCLEtBQUssV0FBVyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQzFELHNDQUNBO0lBQ0UsWUFBWSxRQUFRO0lBQ3BCLE9BQU87SUFDUCxRQUFRO0dBQ1YsQ0FDRjtHQUdGLElBQUksZ0JBQWdCLGdCQUNsQixVQUFVLHdCQUF3QixLQUFLLFdBQVcsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUMxRCxzQ0FDQTtJQUNFLFlBQVksUUFBUTtJQUNwQixPQUFPO0lBQ1AsUUFBUTtHQUNWLENBQ0Y7R0FHRixPQUFPLGVBQWUsTUFBTSxNQUFNLElBQUk7RUFDeEM7Q0FDRjtBQUNGO0FBRUEsU0FBZ0IsT0FBTyxTQUFpQztDQUN0RCxRQUFRLFFBQXlCLGFBQXFCLGVBQW1DO0VBQ3ZGLE1BQU0sWUFBWSwwQkFBMEIsT0FBTyxZQUFZLElBQUk7RUFDbkUsT0FDRSxXQUNBLGlEQUFpRCxPQUFPLFlBQVksS0FBSyxHQUFHLGFBQzlFO0VBQ0EsTUFBTSxhQUFhO0VBR25CLHFCQUFxQixRQUFRLGFBQWEsZ0JBQWdCLE1BQU07RUFFaEUsTUFBTSxjQUFjLElBQUksV0FBVyxTQUNqQyxVQUFVLFFBQVEsVUFBVSxFQUFFLENBQUMsQ0FBQyxRQUFRLFVBQVUsRUFBRSxHQUNwRCxJQUNGLEVBQUUsR0FBRyxXQUFXLFNBQVMsYUFBYSxJQUFJO0VBQzFDLE1BQU0sT0FBTyxRQUFRLFFBQVE7RUFFN0IsTUFBTSxFQUFFLFFBQVEsR0FBRyxNQUFNLE9BQU8sR0FBRyxlQUFlO0VBQ2xELE1BQU0sc0JBQXNCO0dBQzFCLEdBQUc7R0FDSCxZQUFZO0VBQ2Q7RUFFQSxNQUFNLGNBQWMsZUFBZSxNQUNoQyxRQUFRLElBQUksY0FBYyxhQUFhLElBQUksZUFBZSxVQUM3RDtFQUNBLElBQUksYUFBYTtHQUVmLHdCQUF3QixVQUFVLFdBQVcsWUFBWSxZQUFZLE1BQU0sSUFBSTtHQUMvRSxZQUFZLE9BQU87R0FHbkIsMkJBQ0UsVUFDQSxXQUNBLFlBQ0EsWUFBWSxTQUNaLG1CQUNGO0dBQ0EsWUFBWSxVQUFVO0lBQ3BCLEdBQUcsWUFBWTtJQUNmLEdBQUc7R0FDTDtHQUVBLFlBQVksZ0JBQWdCO0VBQzlCLE9BQ0UsZUFBZSxLQUFLO0dBQ2xCO0dBQ0E7R0FDQTtHQUNBLFNBQVM7R0FDVCxlQUFlO0VBQ2pCLENBQUM7RUFHSCxNQUFNLGlCQUFpQixXQUFXO0VBQ2xDLFdBQVcsUUFBUSxlQUF1RCxHQUFHLE1BQWlCO0dBQzVGLElBQUksZ0JBQWdCLGdCQUNsQixVQUFVLHdCQUF3QixLQUFLLFdBQVcsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUMxRCw0QkFDQTtJQUNFLE9BQU87SUFDUCxRQUFRO0dBQ1YsQ0FDRjtHQUdGLElBQUksZ0JBQWdCLGdCQUNsQixVQUFVLHdCQUF3QixLQUFLLFdBQVcsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUMxRCw0QkFDQTtJQUNFLE9BQU87SUFDUCxRQUFRO0dBQ1YsQ0FDRjtHQUdGLE9BQU8sZUFBZSxNQUFNLE1BQU0sSUFBSTtFQUN4QztDQUNGO0FBQ0Y7QUFFQSxTQUFnQixVQUFVLFNBQW9DO0NBQzVELFFBQVEsUUFBeUIsYUFBcUIsZUFBbUM7RUFDdkYsTUFBTSxZQUFZLDBCQUEwQixPQUFPLFlBQVksSUFBSTtFQUNuRSxPQUNFLFdBQ0Esb0RBQW9ELE9BQU8sWUFBWSxLQUFLLEdBQUcsYUFDakY7RUFDQSxNQUFNLGFBQWE7RUFFbkIscUJBQXFCLFFBQVEsYUFBYSxnQkFBZ0IsU0FBUztFQUVuRSxNQUFNLGNBQWMsSUFBSSxXQUFXLFNBQ2pDLFVBQVUsUUFBUSxVQUFVLEVBQUUsQ0FBQyxDQUFDLFFBQVEsVUFBVSxFQUFFLEdBQ3BELElBQ0YsRUFBRSxHQUFHLFdBQVcsU0FBUyxhQUFhLElBQUk7RUFDMUMsTUFBTSxPQUFPLFFBQVEsUUFBUTtFQUM3QixNQUFNLEVBQUUsV0FBVyxZQUFZLFVBQVUsV0FBVyxHQUFHLGVBQWU7RUFDdEUsTUFBTSxzQkFBc0I7R0FDMUIsR0FBRztHQUNILFlBQVk7RUFDZDtFQUVBLE1BQU0sY0FBYyxlQUFlLE1BQ2hDLFFBQVEsSUFBSSxjQUFjLGFBQWEsSUFBSSxlQUFlLFVBQzdEO0VBQ0EsSUFBSSxhQUFhO0dBQ2Ysd0JBQXdCLGFBQWEsV0FBVyxZQUFZLFlBQVksTUFBTSxJQUFJO0dBQ2xGLFlBQVksT0FBTztHQUVuQiwyQkFDRSxhQUNBLFdBQ0EsWUFDQSxZQUFZLFNBQ1osbUJBQ0Y7R0FDQSxZQUFZLFVBQVU7SUFDcEIsR0FBRyxZQUFZO0lBQ2YsR0FBRztHQUNMO0dBRUEsWUFBWSxtQkFBbUI7RUFDakMsT0FDRSxlQUFlLEtBQUs7R0FDbEI7R0FDQTtHQUNBO0dBQ0EsU0FBUztHQUNULGtCQUFrQjtFQUNwQixDQUFDO0VBR0gsTUFBTSxpQkFBaUIsV0FBVztFQUNsQyxXQUFXLFFBQVEsZUFBdUQsR0FBRyxNQUFpQjtHQUM1RixJQUFJLGdCQUFnQixnQkFDbEIsVUFBVSx3QkFBd0IsS0FBSyxXQUFXLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFDMUQsK0JBQ0E7SUFDRSxPQUFPO0lBQ1AsUUFBUTtHQUNWLENBQ0Y7R0FHRixJQUFJLGdCQUFnQixnQkFDbEIsVUFBVSx3QkFBd0IsS0FBSyxXQUFXLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFDMUQsK0JBQ0E7SUFDRSxPQUFPO0lBQ1AsUUFBUTtHQUNWLENBQ0Y7R0FHRixPQUFPLGVBQWUsTUFBTSxNQUFNLElBQUk7RUFDeEM7Q0FDRjtBQUNGO0FBRUEsU0FBZ0IsY0FBYyxVQUFnQyxDQUFDLEdBQUc7Q0FDaEUsTUFBTSxFQUFFLFdBQVcsVUFBVSxXQUFXLFFBQVE7Q0FFaEQsUUFBUSxRQUF5QixhQUFxQixlQUFtQztFQUN2RixNQUFNLGlCQUFpQixXQUFXO0VBQ2xDLE1BQU0sWUFBWSwwQkFBMEIsT0FBTyxZQUFZLElBQUk7RUFDbkUsT0FDRSxXQUNBLHdEQUF3RCxPQUFPLFlBQVksS0FBSyxHQUFHLGFBQ3JGO0VBQ0EsTUFBTSxhQUFhO0VBRW5CLFdBQVcsUUFBUSxlQUFzQyxHQUFHLE1BQWlCO0dBQzNFLEtBQUssT0FBTyxNQUFNLG1DQUFtQztJQUNuRCxPQUFPO0lBQ1AsUUFBUTtHQUNWLENBQUM7R0FFRCxNQUFNLGtCQUFrQixHQUFHLG1CQUFtQixTQUFTO0dBR3ZELE1BQU0sbUJBQW1CLFlBQVk7SUFHbkMsT0FGYSxLQUFLLFFBQVEsUUFFbkIsQ0FBQSxDQUFLLEtBQUssWUFDZixPQUFPLFFBQVE7S0FDYixLQUFLLE9BQU8sTUFBTSx1Q0FBdUMsRUFBRSxTQUFTLENBQUM7S0FDckUsTUFBTSxhQUFhLElBQUksdUJBQXVCLEtBQUssSUFBSSxjQUFjLENBQUM7S0FFdEUsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDLGVBQWUsVUFBVSxVQUFVO0tBRTlELElBQUk7TUFDRixPQUFPLE1BQU0sZUFBZSxNQUFNLE1BQU0sSUFBSTtLQUM5QyxVQUFVO01BRVIsS0FBSyxPQUFPLE1BQU0sMENBQTBDLEVBQUUsU0FBUyxDQUFDO01BQ3hFLEdBQUcsc0JBQXNCLENBQUMsQ0FBQyxrQkFBa0IsUUFBUTtLQUN2RDtJQUNGLEdBQ0E7S0FBRSxnQkFBZ0I7S0FBVztJQUFTLENBQ3hDO0dBQ0Y7R0FHQSxJQUFJLENBQUMsaUJBQ0gsT0FBTyxHQUFHLG1CQUFtQixnQkFBZ0I7R0FJL0MsSUFBSSxpQkFBaUIsZUFBZSxRQUFRLEdBQUc7SUFDN0MsS0FBSyxPQUFPLE1BQU0seUNBQXlDLEVBQUUsU0FBUyxDQUFDO0lBQ3ZFLE9BQU8sZUFBZSxNQUFNLE1BQU0sSUFBSTtHQUN4QztHQUdBLE9BQU8saUJBQWlCO0VBQzFCO0VBRUEsT0FBTztDQUNUO0FBQ0Y7Ozs7OztBQU9BLFNBQWdCLE9BQU8sVUFBa0MsRUFBRSxTQUFTLFNBQVMsR0FBRztDQUM5RSxRQUFRLFFBQXlCLGFBQXFCLGVBQW1DO0VBQ3ZGLE1BQU0saUJBQWlCLFdBQVc7RUFDbEMsTUFBTSxZQUFZLDBCQUEwQixPQUFPLFlBQVksSUFBSTtFQUNuRSxPQUNFLFdBQ0EsaURBQWlELE9BQU8sWUFBWSxLQUFLLEdBQUcsYUFDOUU7RUFDQSxNQUFNLGFBQWE7RUFHbkIscUJBQXFCLFFBQVEsYUFBYSxnQkFBZ0IsTUFBTTtFQUVoRSxNQUFNLGNBQWMsSUFBSSxXQUFXLFNBQ2pDLFVBQVUsUUFBUSxVQUFVLEVBQUUsQ0FBQyxDQUFDLFFBQVEsVUFBVSxFQUFFLEdBQ3BELElBQ0YsRUFBRSxHQUFHLFdBQVcsU0FBUyxZQUFZLElBQUk7RUFHekMsTUFBTSxjQUFjLGVBQWUsTUFDaEMsUUFBUSxJQUFJLGNBQWMsYUFBYSxJQUFJLGVBQWUsVUFDN0Q7RUFFQSxJQUFJLGFBRUYsWUFBWSxnQkFBZ0I7T0FHNUIsZUFBZSxLQUFLO0dBQ2xCO0dBQ0E7R0FDQSxNQUFNO0dBQ04sU0FBUztJQUNQLFlBQVk7SUFDWixTQUFTLENBQUMsbUJBQW1CLDZCQUE2QjtJQUMxRCxRQUFRLFFBQVE7SUFDaEIsYUFBYSxRQUFRO0dBQ3ZCO0dBQ0EsZUFBZTtFQUNqQixDQUFDO0VBR0gsV0FBVyxRQUFRLGVBQXVELEdBQUcsTUFBaUI7R0FDNUYsSUFBSSxnQkFBZ0IsZ0JBQ2xCLFVBQVUsd0JBQXdCLEtBQUssV0FBVyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQzFELDRCQUNBO0lBQ0UsT0FBTztJQUNQLFFBQVE7R0FDVixDQUNGO0dBR0YsSUFBSSxnQkFBZ0IsZ0JBQ2xCLFVBQVUsd0JBQXdCLEtBQUssV0FBVyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQzFELDRCQUNBO0lBQ0UsT0FBTztJQUNQLFFBQVE7R0FDVixDQUNGO0dBR0YsT0FBTyxlQUFlLE1BQU0sTUFBTSxJQUFJO0VBQ3hDO0VBRUEsT0FBTztDQUNUO0FBQ0Y7Ozs7Ozs7OztBQVVBLFNBQVMsd0JBQ1AsZUFDQSxXQUNBLFlBQ0EsY0FDQSxTQUNBO0NBQ0EsSUFBSSxpQkFBaUIsTUFBTSxZQUFZLE1BQU0saUJBQWlCLFNBSzVELE1BQU0sSUFBSSxNQUNSLElBQUksY0FBYyxnQkFBZ0IsVUFBVSxHQUFHLFdBQVcseUJBQXlCLFFBQVEsMERBQTBELGFBQWEsc0JBQXNCLFFBQVEsR0FDbE07QUFFSjs7Ozs7Ozs7O0FBVUEsU0FBUywyQkFDUCxlQUNBLFdBQ0EsWUFFQSxpQkFFQSxZQUNBO0NBQ0EsT0FBTyxLQUFLLFVBQVUsQ0FBQyxDQUFDLFNBQVMsUUFBUTtFQUN2QyxJQUFJLGdCQUFnQixRQUFRLENBQUMsUUFBUSxnQkFBZ0IsTUFBTSxXQUFXLElBQUksR0FLeEUsTUFBTSxJQUFJLE1BQ1IsSUFBSSxjQUFjLGdCQUFnQixVQUFVLEdBQUcsV0FBVyw0QkFBNEIsSUFBSSw0REFBNEQsS0FBSyxVQUFVLGdCQUFnQixJQUFJLEVBQUUsd0JBQXdCLEtBQUssVUFBVSxXQUFXLElBQUksRUFBRSxHQUNyUDtDQUVKLENBQUM7QUFDSDs7O2lCQWhqQnVEO1NBQ3BCO21CQUM4QjtxQkFFUDtlQUNFO2lCQUlHO2lCQUNsQjtDQTJFaEMsaUJBV1AsQ0FBQztDQWVELGtCQUFrQjtFQUN0QixLQUFLLE9BQU8sS0FBSztFQUNqQixRQUFRLE9BQU8sUUFBUTtFQUN2QixXQUFXLE9BQU8sV0FBVztFQUM3QixRQUFRLE9BQU8sUUFBUTtDQUN6QiJ9
|
package/dist/api/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __esmMin, __exportAll } from "../_virtual/
|
|
1
|
+
import { __esmMin, __exportAll } from "../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { getSecrets, init_secret } from "./secret.js";
|
|
3
3
|
import { createWebSocketReplyStub, resolveWebSocketCloseDescriptor, resolveWebSocketPluginOptions } from "./websocket-helpers.js";
|
|
4
4
|
import { Sonamu, init_sonamu } from "./sonamu.js";
|
|
@@ -6,7 +6,6 @@ import { caster, fastifyCaster, init_caster } from "./caster.js";
|
|
|
6
6
|
import { apiParamToTsCode, apiParamToTsCodeAsObject, apiParamTypeToTsType, getZodObjectFromApi, getZodObjectFromApiParams, getZodTypeFromApiParamType, init_code_converters, unwrapPromiseOnce } from "./code-converters.js";
|
|
7
7
|
import { init_context } from "./context.js";
|
|
8
8
|
import { api, init_decorators, registeredApis, stream, transactional, upload, websocket } from "./decorators.js";
|
|
9
|
-
|
|
10
9
|
//#region src/api/index.ts
|
|
11
10
|
var api_exports = /* @__PURE__ */ __exportAll({
|
|
12
11
|
Sonamu: () => Sonamu,
|
|
@@ -38,8 +37,8 @@ var init_api = __esmMin((() => {
|
|
|
38
37
|
init_secret();
|
|
39
38
|
init_sonamu();
|
|
40
39
|
}));
|
|
41
|
-
|
|
42
40
|
//#endregion
|
|
43
41
|
init_api();
|
|
44
42
|
export { Sonamu, api, apiParamToTsCode, apiParamToTsCodeAsObject, apiParamTypeToTsType, api_exports, caster, createWebSocketReplyStub, fastifyCaster, getSecrets, getZodObjectFromApi, getZodObjectFromApiParams, getZodTypeFromApiParamType, init_api, registeredApis, resolveWebSocketCloseDescriptor, resolveWebSocketPluginOptions, stream, transactional, unwrapPromiseOnce, upload, websocket };
|
|
43
|
+
|
|
45
44
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9jYXN0ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvZGUtY29udmVydGVyc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29udGV4dFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2VjcmV0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zb25hbXVcIjtcbiJdLCJtYXBwaW5ncyI6IiJ9
|
package/dist/api/secret.js
CHANGED
|
@@ -1,24 +1,20 @@
|
|
|
1
|
-
import { __esmMin } from "../_virtual/
|
|
2
|
-
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
3
2
|
//#region src/api/secret.ts
|
|
4
3
|
function getSecrets() {
|
|
5
4
|
const secrets = {};
|
|
6
|
-
const
|
|
5
|
+
for (const key of [
|
|
7
6
|
"anthropic_api_key",
|
|
8
7
|
"voyage_api_key",
|
|
9
8
|
"openai_api_key"
|
|
10
|
-
]
|
|
11
|
-
for (const key of secretKeys) {
|
|
9
|
+
]) {
|
|
12
10
|
const envKey = key.toUpperCase();
|
|
13
|
-
if (envKey in process.env)
|
|
14
|
-
secrets[key] = process.env[envKey];
|
|
15
|
-
}
|
|
11
|
+
if (envKey in process.env) secrets[key] = process.env[envKey];
|
|
16
12
|
}
|
|
17
13
|
return secrets;
|
|
18
14
|
}
|
|
19
15
|
var init_secret = __esmMin((() => {}));
|
|
20
|
-
|
|
21
16
|
//#endregion
|
|
22
17
|
init_secret();
|
|
23
18
|
export { getSecrets, init_secret };
|
|
24
|
-
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjcmV0LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvc2VjcmV0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFNvbmFtdVNlY3JldHMgPSB7XG4gIGFudGhyb3BpY19hcGlfa2V5Pzogc3RyaW5nO1xuICB2b3lhZ2VfYXBpX2tleT86IHN0cmluZztcbiAgb3BlbmFpX2FwaV9rZXk/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VjcmV0cygpOiBTb25hbXVTZWNyZXRzIHtcbiAgY29uc3Qgc2VjcmV0czogU29uYW11U2VjcmV0cyA9IHt9O1xuICBjb25zdCBzZWNyZXRLZXlzOiAoa2V5b2YgU29uYW11U2VjcmV0cylbXSA9IFtcbiAgICBcImFudGhyb3BpY19hcGlfa2V5XCIsXG4gICAgXCJ2b3lhZ2VfYXBpX2tleVwiLFxuICAgIFwib3BlbmFpX2FwaV9rZXlcIixcbiAgXSBhcyBjb25zdDtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBzZWNyZXRLZXlzKSB7XG4gICAgY29uc3QgZW52S2V5ID0ga2V5LnRvVXBwZXJDYXNlKCk7XG4gICAgaWYgKGVudktleSBpbiBwcm9jZXNzLmVudikge1xuICAgICAgc2VjcmV0c1trZXldID0gcHJvY2Vzcy5lbnZbZW52S2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2VjcmV0cztcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7QUFNQSxTQUFnQixhQUE0QjtDQUMxQyxNQUFNLFVBQXlCLENBQUM7Q0FPaEMsS0FBSyxNQUFNLE9BQU87RUFMaEI7RUFDQTtFQUNBO0NBR2dCLEdBQVk7RUFDNUIsTUFBTSxTQUFTLElBQUksWUFBWTtFQUMvQixJQUFJLFVBQVUsUUFBUSxLQUNwQixRQUFRLE9BQU8sUUFBUSxJQUFJO0NBRS9CO0NBRUEsT0FBTztBQUNUIn0=
|
package/dist/api/sonamu.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sonamu.d.ts","sourceRoot":"","sources":["../../src/api/sonamu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,MAAM,CAAC;AAM9E,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AAQvF,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAIrE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"sonamu.d.ts","sourceRoot":"","sources":["../../src/api/sonamu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,MAAM,CAAC;AAM9E,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AAQvF,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAIrE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAMrD,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAIjE,OAAO,EAAE,gBAAgB,EAAoD,MAAM,cAAc,CAAC;AAKlG,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAI1D,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,KAAK,YAAY,EAAoD,MAAM,UAAU,CAAC;AAC/F,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACrF,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAQ9C,OAAO,EACL,wBAAwB,EACxB,+BAA+B,EAC/B,6BAA6B,GAC9B,MAAM,qBAAqB,CAAC;AAE7B,cAAM,WAAW;IACR,aAAa,EAAE,OAAO,CAAS;IAC/B,UAAU,EAAE,OAAO,CAAS;IAC5B,iBAAiB,EAAE,iBAAiB,CAAC;QAC1C,OAAO,EAAE,cAAc,CAAC;KACzB,CAAC,CAA2B;IAEtB,UAAU,CAAC,CAAC,SAAS,cAAc,GAAG,OAAO,KAAK,CAAC;IAwB1D,OAAO,CAAC,YAAY,CAA6B;IACjD,IAAI,WAAW,CAAC,WAAW,EAAE,YAAY,EAExC;IACD,IAAI,WAAW,IAAI,YAAY,CAK9B;IACD,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,OAAO,CAAC,SAAS,CAA+B;IAChD,IAAI,QAAQ,CAAC,QAAQ,EAAE,cAAc,EAEpC;IACD,IAAI,QAAQ,IAAI,cAAc,CAK7B;IAED,OAAO,CAAC,OAAO,CAAuB;IACtC,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAExB;IACD,IAAI,MAAM,IAAI,MAAM,CAKnB;IAED,OAAO,CAAC,OAAO,CAA6B;IAC5C,IAAI,MAAM,CAAC,MAAM,EAAE,YAAY,EAE9B;IACD,IAAI,MAAM,IAAI,YAAY,CAKzB;IAED,SAAgB,OAAO,EAAE,aAAa,CAAgB;IAEtD,OAAO,CAAC,QAAQ,CAA+B;IAC/C;;OAEG;IACH,IAAI,OAAO,IAAI,cAAc,CAK5B;IAED,OAAO,CAAC,MAAM,CAA6B;IAC3C;;OAEG;IACH,IAAI,KAAK,IAAI,YAAY,CAKxB;IAED,OAAO,CAAC,UAAU,CAAgC;IAClD,IAAI,SAAS,IAAI,eAAe,CAM/B;IAED,OAAO,CAAC,KAAK,CAAwC;IACrD,IAAI,IAAI,IAAI,IAAI,CAAC,iBAAiB,CAAC,CAKlC;IAED,OAAO,CAAC,iBAAiB,CAAiC;IAC1D,IAAI,gBAAgB,IAAI,gBAAgB,GAAG,IAAI,CAE9C;IACD,IAAI,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,EAEpD;IAGD,OAAO,CAAC,iBAAiB,CAAiC;IAE1D,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAEnC;IACJ,IAAI,gBAAgB,IAAI,gBAAgB,CAKvC;IACD,IAAI,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,EAEpD;IAGM,OAAO,EAAE,SAAS,GAAG,IAAI,CAAQ;IAEjC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAQ;IAEvC,cAAc;IAId,IAAI,CACR,QAAQ,GAAE,OAAe,EACzB,UAAU,GAAE,OAAc,EAC1B,WAAW,CAAC,EAAE,YAAY,EAC1B,UAAU,GAAE,OAAe;IA0G7B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,cAAc,CAAK;IAErB,YAAY,CAAC,WAAW,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE;IAmDvE,WAAW,CACf,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,eAAe,EAAE,cAAc,CAAC,EAChE,MAAM,EAAE,mBAAmB,EAC3B,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB;IA6HH;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB;IAkB3B,OAAO,CAAC,cAAc;IAoBtB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAkCtB,OAAO,CAAC,UAAU,CAAa;IAE/B;;;OAGG;YACW,sBAAsB;YA6HtB,oBAAoB;IA2KlC,gBAAgB,CACd,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,mBAAmB,GAC1B,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,OAAO,CAAC;IA4JrE,OAAO,CAAC,qCAAqC;YAS/B,yBAAyB;IAmCvC,OAAO,CAAC,sBAAsB;IAyG9B,OAAO,CAAC,+BAA+B;YAkIzB,2BAA2B;IA2BzC;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,kBAAkB;IAsB1B,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,wBAAwB;IAkBhC;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IA0B1B;;;OAGG;IACG,eAAe,CACnB,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,GAAG,EAAE,EACb,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,OAAO,CAAC;IAqBb,iBAAiB,CACrB,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,OAAO,EAAE,EACf,KAAK,CAAC,EAAE,YAAY,GACnB,OAAO,CAAC,OAAO,CAAC;IAQb,aAAa,CACjB,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,OAAO,CAAC;IAyCb,sBAAsB,CAC1B,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,cAAc,EACvB,EAAE,EAAE,gBAAgB,CAAC,IAAI,CAAC,GACzB,OAAO,CAAC,gBAAgB,CAAC;IAoE5B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAed,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAMnC;;;OAGG;YACW,eAAe;IAoBvB,SAAS,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC;YASzB,eAAe;YA4Df,qBAAqB;IA2BnC,OAAO,CAAC,wCAAwC;IA4BhD;;;OAGG;YACW,kBAAkB;YA8ClB,mBAAmB;YAwCnB,eAAe;YAuBf,mBAAmB;YAuBnB,IAAI;IAwCZ,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAmB/B;AAkBD,eAAO,MAAM,MAAM,aAAoB,CAAC"}
|