@cartanova/qgrid-cli 2.10.10 → 2.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/dist/_virtual/_rolldown/runtime.js +1 -10
- package/bundle/dist/application/monit/log-buffer.js +12 -6
- package/bundle/dist/application/monit/monit.frame.js +11 -3
- package/bundle/dist/application/monit/monit.types.js +1 -1
- package/bundle/dist/application/qgrid/conv-routing.js +9 -6
- package/bundle/dist/application/qgrid/expired-token-reminder.js +2 -2
- package/bundle/dist/application/qgrid/oauth.js +31 -4
- package/bundle/dist/application/qgrid/qgrid-image-generation.js +1 -1
- package/bundle/dist/application/qgrid/qgrid-response-format.js +21 -19
- package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +40 -33
- package/bundle/dist/application/qgrid/qgrid.dispatcher.js +128 -93
- package/bundle/dist/application/qgrid/qgrid.frame.js +930 -49
- package/bundle/dist/application/qgrid/qgrid.types.js +212 -5
- package/bundle/dist/application/qgrid/schema-prompt.js +75 -48
- package/bundle/dist/application/qgrid/slack-user-map.js +1 -1
- package/bundle/dist/application/qgrid/token-death.js +1 -1
- package/bundle/dist/application/qgrid/token-subscriber.js +83 -30
- package/bundle/dist/application/qgrid/token-trigger-setup.js +1 -1
- package/bundle/dist/application/qgrid/token-window-keepalive.js +8 -6
- package/bundle/dist/application/qgrid/tool-emulation-schema.js +13 -13
- package/bundle/dist/application/qgrid/tool-emulation.js +19 -15
- package/bundle/dist/application/request-log/json-schema-type-text.js +29 -12
- package/bundle/dist/application/request-log/request-log.model.js +83 -70
- package/bundle/dist/application/request-log/request-log.types.js +1 -1
- package/bundle/dist/application/request-log/zod-code-format.js +1 -1
- package/bundle/dist/application/request-log-step/request-log-step.model.js +1 -1
- package/bundle/dist/application/request-log-step/request-log-step.types.js +1 -1
- package/bundle/dist/application/setting/setting.constant.js +1 -1
- package/bundle/dist/application/setting/setting.model.js +2 -2
- package/bundle/dist/application/setting/setting.store.js +2 -2
- package/bundle/dist/application/setting/setting.types.js +1 -1
- package/bundle/dist/application/sonamu.generated.js +32 -16
- package/bundle/dist/application/sonamu.generated.sso.js +1 -1
- package/bundle/dist/application/token/token.model.js +26 -9
- package/bundle/dist/application/token/token.types.js +20 -3
- package/bundle/dist/i18n/en.js +15 -1
- package/bundle/dist/i18n/ko.js +15 -1
- package/bundle/dist/i18n/sd.generated.js +1 -1
- package/bundle/dist/migrations/20260807133553_manual__backfill_request_log_cost.js +8 -6
- package/bundle/dist/server-bootstrap.js +4 -2
- package/bundle/dist/server-error-handler.js +1 -1
- package/bundle/dist/sonamu.config.js +37 -8
- package/bundle/dist/startup-migrations.js +17 -7
- package/bundle/dist/testing/global.js +1 -1
- package/bundle/dist/testing/schema-bench.js +0 -0
- package/bundle/dist/testing/test-database-name.js +1 -1
- package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +1 -1
- package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +11 -5
- package/bundle/dist/utils/providers/anthropic/anthropic-quota.js +4 -4
- package/bundle/dist/utils/providers/anthropic/anthropic-thinking.js +1 -1
- package/bundle/dist/utils/providers/anthropic/claude-session.js +20 -19
- package/bundle/dist/utils/providers/anthropic/fence-strip.js +1 -1
- package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +49 -23
- package/bundle/dist/utils/providers/common/credentials.js +5 -1
- package/bundle/dist/utils/providers/common/effort.js +3 -3
- package/bundle/dist/utils/providers/common/model-cost.js +69 -14
- package/bundle/dist/utils/providers/common/provider-types.js +29 -1
- package/bundle/dist/utils/providers/common/schema-validation.js +78 -40
- package/bundle/dist/utils/providers/common/smooth-weighted-round-robin.js +1 -1
- package/bundle/dist/utils/providers/common/strictifier.js +62 -43
- package/bundle/dist/utils/providers/common/thinking.js +3 -2
- package/bundle/dist/utils/providers/common/ttft.js +1 -1
- package/bundle/dist/utils/providers/grok/grok-backend-protocol.js +427 -0
- package/bundle/dist/utils/providers/grok/grok-constants.js +55 -0
- package/bundle/dist/utils/providers/grok/grok-direct-client.js +196 -0
- package/bundle/dist/utils/providers/grok/grok-dispatcher.js +1313 -0
- package/bundle/dist/utils/providers/grok/grok-headers.js +118 -0
- package/bundle/dist/utils/providers/grok/grok-media-client.js +420 -0
- package/bundle/dist/utils/providers/grok/grok-models.js +114 -0
- package/bundle/dist/utils/providers/grok/grok-oauth.js +455 -0
- package/bundle/dist/utils/providers/grok/grok-quota.js +119 -0
- package/bundle/dist/utils/providers/grok/grok-refresh.js +192 -0
- package/bundle/dist/utils/providers/grok/grok-types.js +186 -0
- package/bundle/dist/utils/providers/grok/grok-voice-client.js +199 -0
- package/bundle/dist/utils/providers/grok/index.js +11 -0
- package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +111 -83
- package/bundle/dist/utils/providers/openai/openai-callback-relay.js +3 -2
- package/bundle/dist/utils/providers/openai/openai-constants.js +1 -1
- package/bundle/dist/utils/providers/openai/openai-direct-client.js +23 -7
- package/bundle/dist/utils/providers/openai/openai-dispatcher.js +143 -106
- package/bundle/dist/utils/providers/openai/openai-image-generation.js +48 -33
- package/bundle/dist/utils/providers/openai/openai-oauth.js +28 -13
- package/bundle/dist/utils/providers/openai/openai-quota.js +38 -27
- package/bundle/dist/utils/providers/openai/openai-refresh.js +17 -9
- package/bundle/dist/utils/providers/openai/openai-sse.js +1 -1
- package/bundle/dist/utils/providers/openai/openai-transport-config.js +1 -1
- package/bundle/dist/utils/quiet-hours.js +1 -1
- package/bundle/dist/utils/slack-notify.js +14 -8
- package/bundle/dist/utils/subset-loaders.js +4 -5
- package/bundle/src/application/monit/log-buffer.ts +23 -9
- package/bundle/src/application/monit/monit.frame.ts +22 -5
- package/bundle/src/application/monit/monit.types.ts +6 -0
- package/bundle/src/application/qgrid/conv-routing.test.ts +76 -4
- package/bundle/src/application/qgrid/conv-routing.ts +35 -9
- package/bundle/src/application/qgrid/expired-token-reminder.ts +9 -1
- package/bundle/src/application/qgrid/oauth.ts +51 -15
- package/bundle/src/application/qgrid/qgrid-image-generation.ts +9 -0
- package/bundle/src/application/qgrid/qgrid-response-format.ts +50 -25
- package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +19 -0
- package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +84 -40
- package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +97 -0
- package/bundle/src/application/qgrid/qgrid.dispatcher.ts +274 -126
- package/bundle/src/application/qgrid/qgrid.frame.test.ts +1013 -3
- package/bundle/src/application/qgrid/qgrid.frame.ts +1415 -60
- package/bundle/src/application/qgrid/qgrid.types.ts +335 -0
- package/bundle/src/application/qgrid/schema-prompt.ts +105 -41
- package/bundle/src/application/qgrid/slack-user-map.ts +5 -0
- package/bundle/src/application/qgrid/token-death.ts +4 -0
- package/bundle/src/application/qgrid/token-subscriber.test.ts +21 -19
- package/bundle/src/application/qgrid/token-subscriber.ts +186 -53
- package/bundle/src/application/qgrid/token-trigger-setup.ts +2 -0
- package/bundle/src/application/qgrid/token-window-keepalive.ts +49 -6
- package/bundle/src/application/qgrid/tool-emulation-schema.ts +33 -29
- package/bundle/src/application/qgrid/tool-emulation.ts +52 -27
- package/bundle/src/application/request-log/json-schema-type-text.test.ts +5 -5
- package/bundle/src/application/request-log/json-schema-type-text.ts +81 -26
- package/bundle/src/application/request-log/request-log.model.test.ts +111 -4
- package/bundle/src/application/request-log/request-log.model.ts +277 -146
- package/bundle/src/application/request-log/request-log.types.ts +6 -0
- package/bundle/src/application/request-log/zod-code-format.ts +11 -0
- package/bundle/src/application/request-log-step/request-log-step.model.ts +1 -0
- package/bundle/src/application/request-log-step/request-log-step.types.ts +2 -0
- package/bundle/src/application/setting/setting.constant.ts +9 -0
- package/bundle/src/application/setting/setting.model.ts +12 -2
- package/bundle/src/application/setting/setting.store.ts +5 -1
- package/bundle/src/application/setting/setting.types.ts +8 -0
- package/bundle/src/application/sonamu.generated.http +133 -0
- package/bundle/src/application/sonamu.generated.sso.ts +2 -0
- package/bundle/src/application/sonamu.generated.ts +15 -0
- package/bundle/src/application/token/token.identity.test.ts +20 -0
- package/bundle/src/application/token/token.model.ts +66 -7
- package/bundle/src/application/token/token.types.ts +24 -1
- package/bundle/src/i18n/en.ts +19 -0
- package/bundle/src/i18n/ko.ts +21 -0
- package/bundle/src/i18n/sd.generated.ts +23 -2
- package/bundle/src/migrations/20260807133553_manual__backfill_request_log_cost.ts +16 -8
- package/bundle/src/server-bootstrap.ts +4 -2
- package/bundle/src/server-error-handler.ts +1 -0
- package/bundle/src/sonamu.config.ts +69 -7
- package/bundle/src/startup-migrations.ts +27 -9
- package/bundle/src/testing/global.ts +20 -0
- package/bundle/src/testing/schema-bench.ts +105 -30
- package/bundle/src/testing/test-database-name.ts +2 -0
- package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +8 -0
- package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +41 -6
- package/bundle/src/utils/providers/anthropic/anthropic-quota.ts +7 -3
- package/bundle/src/utils/providers/anthropic/anthropic-thinking.ts +6 -0
- package/bundle/src/utils/providers/anthropic/claude-session.ts +58 -24
- package/bundle/src/utils/providers/anthropic/fence-strip.ts +11 -0
- package/bundle/src/utils/providers/anthropic/stream-json-adapter.ts +110 -45
- package/bundle/src/utils/providers/common/credentials.ts +8 -0
- package/bundle/src/utils/providers/common/effort.ts +9 -2
- package/bundle/src/utils/providers/common/model-cost.test.ts +48 -1
- package/bundle/src/utils/providers/common/model-cost.ts +259 -158
- package/bundle/src/utils/providers/common/provider-dispatcher.ts +98 -2
- package/bundle/src/utils/providers/common/provider-types.ts +46 -3
- package/bundle/src/utils/providers/common/schema-validation.test.ts +5 -1
- package/bundle/src/utils/providers/common/schema-validation.ts +124 -56
- package/bundle/src/utils/providers/common/smooth-weighted-round-robin.ts +4 -0
- package/bundle/src/utils/providers/common/strictifier.ts +185 -59
- package/bundle/src/utils/providers/common/thinking.ts +2 -2
- package/bundle/src/utils/providers/common/ttft.ts +4 -2
- package/bundle/src/utils/providers/grok/__fixtures__/golden-responses-1.0.60.json +164 -0
- package/bundle/src/utils/providers/grok/grok-backend-protocol.test.ts +325 -0
- package/bundle/src/utils/providers/grok/grok-backend-protocol.ts +721 -0
- package/bundle/src/utils/providers/grok/grok-constants.ts +105 -0
- package/bundle/src/utils/providers/grok/grok-direct-client.test.ts +179 -0
- package/bundle/src/utils/providers/grok/grok-direct-client.ts +313 -0
- package/bundle/src/utils/providers/grok/grok-dispatcher.test.ts +1395 -0
- package/bundle/src/utils/providers/grok/grok-dispatcher.ts +2105 -0
- package/bundle/src/utils/providers/grok/grok-headers.test.ts +149 -0
- package/bundle/src/utils/providers/grok/grok-headers.ts +199 -0
- package/bundle/src/utils/providers/grok/grok-media-client.test.ts +446 -0
- package/bundle/src/utils/providers/grok/grok-media-client.ts +703 -0
- package/bundle/src/utils/providers/grok/grok-models.test.ts +96 -0
- package/bundle/src/utils/providers/grok/grok-models.ts +161 -0
- package/bundle/src/utils/providers/grok/grok-oauth.test.ts +406 -0
- package/bundle/src/utils/providers/grok/grok-oauth.ts +771 -0
- package/bundle/src/utils/providers/grok/grok-quota.test.ts +142 -0
- package/bundle/src/utils/providers/grok/grok-quota.ts +198 -0
- package/bundle/src/utils/providers/grok/grok-refresh.test.ts +239 -0
- package/bundle/src/utils/providers/grok/grok-refresh.ts +325 -0
- package/bundle/src/utils/providers/grok/grok-types.test.ts +252 -0
- package/bundle/src/utils/providers/grok/grok-types.ts +374 -0
- package/bundle/src/utils/providers/grok/grok-voice-client.test.ts +321 -0
- package/bundle/src/utils/providers/grok/grok-voice-client.ts +284 -0
- package/bundle/src/utils/providers/grok/index.ts +20 -0
- package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +221 -137
- package/bundle/src/utils/providers/openai/openai-callback-relay.ts +12 -1
- package/bundle/src/utils/providers/openai/openai-constants.ts +2 -0
- package/bundle/src/utils/providers/openai/openai-direct-client.ts +111 -21
- package/bundle/src/utils/providers/openai/openai-dispatcher.ts +322 -169
- package/bundle/src/utils/providers/openai/openai-image-generation.ts +116 -36
- package/bundle/src/utils/providers/openai/openai-oauth.ts +48 -20
- package/bundle/src/utils/providers/openai/openai-quota.ts +77 -46
- package/bundle/src/utils/providers/openai/openai-refresh.ts +42 -18
- package/bundle/src/utils/providers/openai/openai-sse.ts +27 -3
- package/bundle/src/utils/providers/openai/openai-transport-config.ts +2 -0
- package/bundle/src/utils/quiet-hours.ts +12 -1
- package/bundle/src/utils/slack-notify.ts +44 -13
- package/bundle/src/utils/subset-loaders.ts +7 -7
- package/bundle/web-dist/client/assets/clsx-5XM_pHvN.js +1 -0
- package/bundle/web-dist/client/assets/index-Be2qCZmI.css +1 -0
- package/bundle/web-dist/client/assets/index-C96h3feE.js +32 -0
- package/bundle/web-dist/client/assets/logs-DBM6U0QD.js +1 -0
- package/bundle/web-dist/client/assets/monit-BBjXa7vB.js +1 -0
- package/bundle/web-dist/client/assets/routes-Crz_PQzi.js +5 -0
- package/bundle/web-dist/client/assets/{services.generated-NP-ValHd.js → services.generated-B5lc3aIC.js} +5 -5
- package/bundle/web-dist/client/assets/settings-Cdwm3OBB.js +1 -0
- package/bundle/web-dist/client/assets/show-DBUhALT1.js +2 -0
- package/bundle/web-dist/client/assets/tokens-CVQAVJTo.js +1 -0
- package/bundle/web-dist/client/assets/total-cost-MnfKU8IN.js +1 -0
- package/bundle/web-dist/client/assets/use-oauth-login-flow-BfxYI4Oh.js +1 -0
- package/bundle/web-dist/client/assets/use-update-token-mutation-qKBC2sn7.js +1 -0
- package/bundle/web-dist/client/assets/{vendor-tanstack-DJRQAbrY.js → vendor-tanstack-DRPs09ai.js} +1 -1
- package/bundle/web-dist/client/index.html +5 -5
- package/bundle/web-dist/server/assets/clsx-D_N5PN_2.js +16 -0
- package/bundle/web-dist/server/assets/{lazyRouteComponent-CgBdabgd.js → lazyRouteComponent-AKiHfZWp.js} +129 -2
- package/bundle/web-dist/server/assets/{logs-BMyR98rU.js → logs-B7QmGJq3.js} +18 -14
- package/bundle/web-dist/server/assets/{monit-ZPt66W5M.js → monit-DFt7x3bh.js} +13 -12
- package/bundle/web-dist/server/assets/{plus-BZ9I0VgC.js → plus-DaYQRpBt.js} +1 -1
- package/bundle/web-dist/server/assets/{react-dom-Ds75e4Jl.js → react-dom-Cv23mm1K.js} +2 -129
- package/bundle/web-dist/server/assets/{refresh-cw-CztCFis-.js → refresh-cw-BpXNsAy-.js} +1 -1
- package/bundle/web-dist/server/assets/{request-model-DjGldb-h.js → request-model-eHE6YbaF.js} +1 -1
- package/bundle/web-dist/server/assets/{routes-Ct-k7nBA.js → routes-_Y-PJfgO.js} +110 -39
- package/bundle/web-dist/server/assets/{services.generated-BA4AcAf5.js → services.generated-CMJ8AHbO.js} +582 -172
- package/bundle/web-dist/server/assets/{settings-CBUZ47Xx.js → settings-JwJKxn2e.js} +14 -14
- package/bundle/web-dist/server/assets/{show-LSFIzvO2.js → show-BEv6z1v_.js} +90 -60
- package/bundle/web-dist/server/assets/{tokens-DxrBW512.js → tokens-CNT4mI-f.js} +162 -50
- package/bundle/web-dist/server/assets/total-cost-fTE9Xy82.js +18 -0
- package/bundle/web-dist/server/assets/use-oauth-login-flow-jkAkT3X6.js +2345 -0
- package/bundle/web-dist/server/assets/{use-update-token-mutation-pkArIzCP.js → use-update-token-mutation-Sm6kh02m.js} +1 -1
- package/bundle/web-dist/server/entry-server.generated.js +1644 -21655
- package/dist/cli.js +9 -9
- package/package.json +4 -11
- package/postinstall.mjs +12 -0
- package/skills/qgrid/SKILL.md +1 -0
- package/skills/qgrid/references/cli-env-and-server-boot.md +4 -1
- package/skills/qgrid/references/decision-rationale.md +23 -0
- package/skills/qgrid/references/grok-runtime.md +89 -0
- package/skills/qgrid/references/provider-runtime-differences.md +30 -29
- package/skills/qgrid/references/repo-map.md +10 -0
- package/skills/qgrid/references/token-auth-quota-lifecycle.md +56 -3
- package/bundle/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +0 -406
- package/bundle/dist/node_modules/.pnpm/@vitest_expect@4.1.10/node_modules/@vitest/expect/dist/index.js +0 -1507
- package/bundle/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.10/node_modules/@vitest/pretty-format/dist/index.js +0 -887
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/chunk-artifact.js +0 -2756
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/index.js +0 -8
- package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/utils.js +0 -8
- package/bundle/dist/node_modules/.pnpm/@vitest_snapshot@4.1.10/node_modules/@vitest/snapshot/dist/index.js +0 -922
- package/bundle/dist/node_modules/.pnpm/@vitest_spy@4.1.10/node_modules/@vitest/spy/dist/index.js +0 -386
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +0 -121
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/constants.js +0 -51
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/diff.js +0 -1317
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/display.js +0 -561
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/error.js +0 -40
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/helpers.js +0 -272
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/offset.js +0 -27
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/serialize.js +0 -77
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/source-map.js +0 -381
- package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/timers.js +0 -51
- package/bundle/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +0 -2986
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +0 -10
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +0 -109
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +0 -10
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +0 -10
- package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +0 -10
- package/bundle/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +0 -1126
- package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +0 -21
- package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +0 -432
- package/bundle/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +0 -517
- package/bundle/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +0 -101
- package/bundle/dist/node_modules/.pnpm/vite@8.0.3_@emnapi_core@1.11.2_@emnapi_runtime@1.11.2_@types_node@25.0.7_esbuild@0.27.4_5b35fc1fb85d2af4d105e0d74f940f50/node_modules/vite/dist/node/module-runner.js +0 -1265
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js +0 -9
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/benchmark.CX_oY03V.js +0 -41
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/evaluatedModules.Dg1zASAC.js +0 -19
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/index.Chj8NDwU.js +0 -202
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/index.DdgEv5B1.js +0 -46
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/rpc.MzXet3jl.js +0 -119
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/test.DNmyFkvJ.js +0 -3044
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.js +0 -59
- package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/index.js +0 -28
- package/bundle/dist/testing/setup-mocks.js +0 -16
- package/bundle/src/testing/setup-mocks.ts +0 -44
- package/bundle/web-dist/client/assets/index-Bw2s88Ot.css +0 -1
- package/bundle/web-dist/client/assets/index-DZwzUfI-.js +0 -106
- package/bundle/web-dist/client/assets/logs-Cog79DU5.js +0 -1
- package/bundle/web-dist/client/assets/monit-2auznBys.js +0 -1
- package/bundle/web-dist/client/assets/routes-B0lTeLK-.js +0 -5
- package/bundle/web-dist/client/assets/settings-D8ZxZGSJ.js +0 -1
- package/bundle/web-dist/client/assets/show-CFSERlnM.js +0 -2
- package/bundle/web-dist/client/assets/tokens-CZXUyI7O.js +0 -1
- package/bundle/web-dist/client/assets/use-oauth-login-flow-hboOs3wG.js +0 -1
- package/bundle/web-dist/client/assets/use-update-token-mutation-BQHS0byG.js +0 -1
- package/bundle/web-dist/server/assets/use-oauth-login-flow-Gn8flMK5.js +0 -178
- package/dist/cli.d.ts +0 -10
- /package/bundle/web-dist/client/assets/{cost-DH2jZbrw.js → cost-DB3HbU7T.js} +0 -0
- /package/bundle/web-dist/client/assets/{plus-B62CuqT8.js → plus-BsQdY7PS.js} +0 -0
- /package/bundle/web-dist/client/assets/{preload-helper-ca-nBW7U.js → preload-helper-DWTEM3RW.js} +0 -0
- /package/bundle/web-dist/client/assets/{refresh-cw-NNcU0Cmq.js → refresh-cw-D9IUmT23.js} +0 -0
- /package/bundle/web-dist/client/assets/{request-model-CojtinqK.js → request-model-Bpp_rkK8.js} +0 -0
- /package/bundle/web-dist/server/assets/{cost-eEHeTRT5.js → cost-BC9yzyA9.js} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
import { Buffer } from "node:buffer";
|
|
2
3
|
import { getLogger } from "@logtape/logtape";
|
|
3
|
-
import { z } from "zod";
|
|
4
4
|
//#region src/application/qgrid/tool-emulation.ts
|
|
5
5
|
const STRUCTURED_ENVELOPE_LIMITS = {
|
|
6
6
|
maxUtf8Bytes: 512 * 1024,
|
|
@@ -36,8 +36,9 @@ function applyToolCallEmulation(result, tools, options) {
|
|
|
36
36
|
if (!tools?.length) return answerOutput(result, result.text, images, runContext);
|
|
37
37
|
const parsed = parseEnvelope(result.text, tools, answerKind);
|
|
38
38
|
if (parsed.action === "tool_call") return toolCallOutput(result, parsed.toolCalls, images, runContext);
|
|
39
|
-
return answerOutput(result, answerKind === "text" ? parsed.answer : JSON.stringify(parsed.answer), images, runContext);
|
|
39
|
+
return answerOutput(result, answerKind === "text" ? z.string().parse(parsed.answer) : JSON.stringify(parsed.answer), images, runContext);
|
|
40
40
|
}
|
|
41
|
+
const commentaryToolCallControl = z.looseObject({ result: z.looseObject({ action: z.literal("tool_call") }) });
|
|
41
42
|
function isToolCallEnvelope(text, tools, answerKind, phase) {
|
|
42
43
|
if (phase === "commentary") {
|
|
43
44
|
let value;
|
|
@@ -46,7 +47,7 @@ function isToolCallEnvelope(text, tools, answerKind, phase) {
|
|
|
46
47
|
} catch {
|
|
47
48
|
return false;
|
|
48
49
|
}
|
|
49
|
-
if (!
|
|
50
|
+
if (!commentaryToolCallControl.safeParse(value).success) return false;
|
|
50
51
|
}
|
|
51
52
|
return parseEnvelope(text, tools, answerKind).action === "tool_call";
|
|
52
53
|
}
|
|
@@ -57,8 +58,8 @@ function parseEnvelope(text, tools, answerKind) {
|
|
|
57
58
|
value = JSON.parse(text);
|
|
58
59
|
} catch (error) {
|
|
59
60
|
const head = JSON.stringify(text.slice(0, 200));
|
|
60
|
-
logger.warn(`tool envelope parse failed: ${error.message}; head=${head}`);
|
|
61
|
-
throw new ToolCallEmulationError(`invalid tool envelope (response is not JSON — the model ignored the envelope contract; retry is the caller's decision): ${error.message}; response head: ${head}`);
|
|
61
|
+
logger.warn(`tool envelope parse failed: ${error instanceof Error ? error.message : String(error)}; head=${head}`);
|
|
62
|
+
throw new ToolCallEmulationError(`invalid tool envelope (response is not JSON — the model ignored the envelope contract; retry is the caller's decision): ${error instanceof Error ? error.message : String(error)}; response head: ${head}`);
|
|
62
63
|
}
|
|
63
64
|
assertStructuredEnvelopeComplexity(value);
|
|
64
65
|
const validation = (answerKind === "text" ? TEXT_ENVELOPE : JSON_ENVELOPE).safeParse(value);
|
|
@@ -108,13 +109,16 @@ function findUnknownTool(toolCalls, tools) {
|
|
|
108
109
|
}
|
|
109
110
|
function appendImages(content, images) {
|
|
110
111
|
if (!images?.length) return content;
|
|
111
|
-
return [...content, ...images.map((image) =>
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
112
|
+
return [...content, ...images.map((image) => {
|
|
113
|
+
const part = {
|
|
114
|
+
type: "image",
|
|
115
|
+
data: image.data,
|
|
116
|
+
revisedPrompt: image.revisedPrompt ?? null
|
|
117
|
+
};
|
|
118
|
+
if (image.mediaType) part.mediaType = image.mediaType;
|
|
119
|
+
if (image.generation) part.generation = image.generation;
|
|
120
|
+
return part;
|
|
121
|
+
})];
|
|
118
122
|
}
|
|
119
123
|
function assertStructuredEnvelopeComplexity(root) {
|
|
120
124
|
const maxDepth = STRUCTURED_ENVELOPE_LIMITS.maxDepth;
|
|
@@ -128,8 +132,8 @@ function assertStructuredEnvelopeComplexity(root) {
|
|
|
128
132
|
nodes += 1;
|
|
129
133
|
if (nodes > STRUCTURED_ENVELOPE_LIMITS.maxNodes) throw new ToolCallEmulationError(`structured-output envelope exceeds node limit of ${STRUCTURED_ENVELOPE_LIMITS.maxNodes}`);
|
|
130
134
|
if (current.depth > maxDepth) throw new ToolCallEmulationError(`structured-output envelope exceeds depth limit of ${maxDepth}`);
|
|
131
|
-
if (
|
|
132
|
-
if (current.value
|
|
135
|
+
if (current.value === Infinity || current.value === -Infinity) throw new ToolCallEmulationError("answer must be valid JSON");
|
|
136
|
+
if (!(current.value instanceof Object)) continue;
|
|
133
137
|
for (const value of Object.values(current.value)) stack.push({
|
|
134
138
|
value,
|
|
135
139
|
depth: current.depth + 1
|
|
@@ -139,4 +143,4 @@ function assertStructuredEnvelopeComplexity(root) {
|
|
|
139
143
|
//#endregion
|
|
140
144
|
export { ToolCallEmulationError, applyToolCallEmulation, isToolCallEnvelope };
|
|
141
145
|
|
|
142
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1lbXVsYXRpb24uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3Rvb2wtZW11bGF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gXCJub2RlOmJ1ZmZlclwiO1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuLy8g7J2R64u1KOuqqOuNuCDstpzroKUpIGVudmVsb3BlIOydmCDsnpDsm5Ag7ZWc64+ELiBjYWxsZXIg7Iqk7YKk66eIIOyghOyymOumrCDtlZzrj4QoQ0FMTEVSX1NDSEVNQV9MSU1JVFMp7JmAIOqwkuydtFxuLy8g6rCZ7JWEIOuztOyXrOuPhCDshJzroZwg64uk66W4IOyekOybkOydhCDsp4DtgqTripQg64+F66a9IOyDgeyImOuLpCDigJQg7Iqk7YKk66eIIOq5iuydtOuKlCDsnbjsiqTthLTsiqQg6rmK7J2066W8IGJvdW5kIO2VmOyngFxuLy8g7JWK7Jy866+A66GcKOyerOq3gCAkcmVmIO2XiOyaqSkg7LqY65+sIO2VnOuPhOulvCDsobDsoJXtlbTrj4Qg7J2R64u1IOyImOyaqSDquLDspIDsnbQg65Sw6528IOybgOyngeyXrOyEoCDslYgg65Cc64ukLlxuY29uc3QgU1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMgPSB7XG4gIG1heFV0ZjhCeXRlczogNTEyICogMTAyNCxcbiAgbWF4Tm9kZXM6IDIwXzAwMCxcbiAgbWF4RGVwdGg6IDEzMixcbn0gYXMgY29uc3Q7XG5pbXBvcnQge1xuICB0eXBlIEltYWdlR2VuZXJhdGlvbk1ldGFkYXRhLFxuICB0eXBlIFFncmlkQ29udGVudCxcbiAgdHlwZSBRZ3JpZFRocmVhZENvb3JkLFxuICB0eXBlIFFncmlkVG9vbCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbn0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwidG9vbC1lbXVsYXRpb25cIl0pO1xuXG50eXBlIEVtdWxhdGlvblJlc3VsdCA9IE9taXQ8UXVlcnlPdXRwdXQsIFwiY29udGVudFwiIHwgXCJmaW5pc2hSZWFzb25cIiB8IFwicnVuQ29udGV4dFwiPjtcbnR5cGUgVG9vbENhbGwgPSB7IHRvb2xOYW1lOiBzdHJpbmc7IGFyZ3M6IHN0cmluZyB9O1xuXG4vLyBlbnZlbG9wZSDripQge3Jlc3VsdDogPHVuaW9uPn0g7ZWcIOqyuSDqtazsobAg4oCUIOyKpO2CpOuniCDqt7zqsbDripQgdG9vbC1lbXVsYXRpb24tc2NoZW1hLnRzIOywuOyhsC5cbi8vIGFuc3dlciDtg4DsnoXrp4wg7JqU7LKtIO2Yle2DnOyXkCDrlLDrnbwg64uk66W064ukOiB0b29scy1vbmx5IOuKlCBzdHJpbmco6re464yA66GcIOuwmO2ZmCksXG4vLyB0b29scytqc29uU2NoZW1hIOuKlCDsgqzsmqnsnpAg7Iqk7YKk66eI7J2YIEpTT04g6rCSKEpTT04uc3RyaW5naWZ5IOuhnCDrsJjtmZgpLlxuZnVuY3Rpb24gYnVpbGRFbnZlbG9wZVNjaGVtYShhbnN3ZXJLaW5kOiBBbnN3ZXJLaW5kKSB7XG4gIHJldHVybiB6LnN0cmljdE9iamVjdCh7XG4gICAgcmVzdWx0OiB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcImFjdGlvblwiLCBbXG4gICAgICB6LnN0cmljdE9iamVjdCh7XG4gICAgICAgIGFjdGlvbjogei5saXRlcmFsKFwiYW5zd2VyXCIpLFxuICAgICAgICBhbnN3ZXI6XG4gICAgICAgICAgYW5zd2VyS2luZCA9PT0gXCJ0ZXh0XCJcbiAgICAgICAgICAgID8gei5zdHJpbmcoKVxuICAgICAgICAgICAgOiB6Lmpzb24oKS5yZWZpbmUoKGFuc3dlcikgPT4gYW5zd2VyICE9PSBudWxsLCB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogXCJhbnN3ZXIgbXVzdCBiZSBub24tbnVsbFwiLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgdG9vbENhbGxzOiB6Lm51bGwoKSxcbiAgICAgIH0pLFxuICAgICAgei5zdHJpY3RPYmplY3Qoe1xuICAgICAgICBhY3Rpb246IHoubGl0ZXJhbChcInRvb2xfY2FsbFwiKSxcbiAgICAgICAgYW5zd2VyOiB6Lm51bGwoKSxcbiAgICAgICAgdG9vbENhbGxzOiB6XG4gICAgICAgICAgLmFycmF5KFxuICAgICAgICAgICAgei5zdHJpY3RPYmplY3Qoe1xuICAgICAgICAgICAgICB0b29sTmFtZTogei5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgYXJnczogei5zdHJpbmcoKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIClcbiAgICAgICAgICAubWluKDEpLFxuICAgICAgfSksXG4gICAgXSksXG4gIH0pO1xufVxuXG5jb25zdCBURVhUX0VOVkVMT1BFID0gYnVpbGRFbnZlbG9wZVNjaGVtYShcInRleHRcIik7XG5jb25zdCBKU09OX0VOVkVMT1BFID0gYnVpbGRFbnZlbG9wZVNjaGVtYShcImpzb25cIik7XG50eXBlIEVudmVsb3BlUmVzcG9uc2UgPSB6LmluZmVyPHR5cGVvZiBKU09OX0VOVkVMT1BFPltcInJlc3VsdFwiXTtcblxuZXhwb3J0IGNsYXNzIFRvb2xDYWxsRW11bGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKGB0b29sLWNhbGwgZW11bGF0aW9uOiAke21lc3NhZ2V9YCk7XG4gICAgdGhpcy5uYW1lID0gXCJUb29sQ2FsbEVtdWxhdGlvbkVycm9yXCI7XG4gIH1cbn1cblxuLy8gUHJlc2VydmUgaW1hZ2UgYnl0ZXMgYW5kIHRoZSBwcm92aWRlcidzIHJlc29sdmVkIE1JTUUgdHlwZS5cbmludGVyZmFjZSBFbXVsYXRpb25JbWFnZSB7XG4gIGRhdGE6IHN0cmluZztcbiAgbWVkaWFUeXBlPzogRXh0cmFjdDxRZ3JpZENvbnRlbnQsIHsgdHlwZTogXCJpbWFnZVwiIH0+W1wibWVkaWFUeXBlXCJdO1xuICByZXZpc2VkUHJvbXB0Pzogc3RyaW5nIHwgbnVsbDtcbiAgZ2VuZXJhdGlvbj86IEltYWdlR2VuZXJhdGlvbk1ldGFkYXRhO1xufVxuXG4vLyBhbnN3ZXIg7J247L2U65SpIOyiheulmC4gZW52ZWxvcGUg65SU7L2U642U64qUIO2VnCDrsozsnbTqs6Ag7J20IOqwkuydgCBhbnN3ZXIg67iM656c7LmY7J2YIO2DgOyeheqzvFxuLy8g7LWc7KKFIOyngeugrO2ZlCh0ZXh0OiDqt7jrjIDroZwgLyBqc29uOiBKU09OLnN0cmluZ2lmeSnrp4wg6rCA66W464ukLlxuZXhwb3J0IHR5cGUgQW5zd2VyS2luZCA9IFwidGV4dFwiIHwgXCJqc29uXCI7XG5cbmludGVyZmFjZSBUb29sQ2FsbEVtdWxhdGlvbk9wdGlvbnMge1xuICB0aHJlYWRDb29yZD86IFFncmlkVGhyZWFkQ29vcmQ7XG4gIGltYWdlcz86IEVtdWxhdGlvbkltYWdlW107XG4gIC8vIO2VhOyImDog7Zi47Lac67aA6rCAIGFuc3dlciDsnbjsvZTrlKnsnYQg7ZWt7IOBIOuqheyLnO2VtOyVvCDtlZzri6QgKGlucHV0Lmpzb25TY2hlbWEg7Jyg66y066GcIO2MkOyglSkuXG4gIGFuc3dlcktpbmQ6IEFuc3dlcktpbmQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVRvb2xDYWxsRW11bGF0aW9uKFxuICByZXN1bHQ6IEVtdWxhdGlvblJlc3VsdCxcbiAgdG9vbHM6IFFncmlkVG9vbFtdIHwgdW5kZWZpbmVkLFxuICBvcHRpb25zOiBUb29sQ2FsbEVtdWxhdGlvbk9wdGlvbnMsXG4pOiBRdWVyeU91dHB1dCB7XG4gIGNvbnN0IHsgdGhyZWFkQ29vcmQsIGltYWdlcywgYW5zd2VyS2luZCB9ID0gb3B0aW9ucztcbiAgY29uc3QgcnVuQ29udGV4dCA9IHRocmVhZENvb3JkID8geyB0aHJlYWRDb29yZCB9IDogdW5kZWZpbmVkO1xuXG4gIGlmICghdG9vbHM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBhbnN3ZXJPdXRwdXQocmVzdWx0LCByZXN1bHQudGV4dCwgaW1hZ2VzLCBydW5Db250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlRW52ZWxvcGUocmVzdWx0LnRleHQsIHRvb2xzLCBhbnN3ZXJLaW5kKTtcbiAgaWYgKHBhcnNlZC5hY3Rpb24gPT09IFwidG9vbF9jYWxsXCIpIHtcbiAgICByZXR1cm4gdG9vbENhbGxPdXRwdXQocmVzdWx0LCBwYXJzZWQudG9vbENhbGxzLCBpbWFnZXMsIHJ1bkNvbnRleHQpO1xuICB9XG5cbiAgcmV0dXJuIGFuc3dlck91dHB1dChcbiAgICByZXN1bHQsXG4gICAgYW5zd2VyS2luZCA9PT0gXCJ0ZXh0XCIgPyAocGFyc2VkLmFuc3dlciBhcyBzdHJpbmcpIDogSlNPTi5zdHJpbmdpZnkocGFyc2VkLmFuc3dlciksXG4gICAgaW1hZ2VzLFxuICAgIHJ1bkNvbnRleHQsXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Rvb2xDYWxsRW52ZWxvcGUoXG4gIHRleHQ6IHN0cmluZyxcbiAgdG9vbHM6IFFncmlkVG9vbFtdLFxuICBhbnN3ZXJLaW5kOiBBbnN3ZXJLaW5kLFxuICBwaGFzZT86IHN0cmluZyxcbik6IGJvb2xlYW4ge1xuICBpZiAocGhhc2UgPT09IFwiY29tbWVudGFyeVwiKSB7XG4gICAgLy8gQ29tbWVudGFyeSBpcyBub3QgdGhlIHN0cnVjdHVyZWQgYW5zd2VyLiBPbmx5IGFuIGV4cGxpY2l0IHRvb2wgY29udHJvbFxuICAgIC8vIG9iamVjdCBpcyBlbGlnaWJsZSwgYW5kIHRoYXQgb2JqZWN0IG11c3Qgc3RpbGwgcGFzcyB0aGUgc3RyaWN0IHBhcnNlci5cbiAgICBsZXQgdmFsdWU6IHVua25vd247XG4gICAgdHJ5IHtcbiAgICAgIHZhbHVlID0gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIXZhbHVlIHx8XG4gICAgICB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHxcbiAgICAgICEoXCJyZXN1bHRcIiBpbiB2YWx1ZSkgfHxcbiAgICAgICF2YWx1ZS5yZXN1bHQgfHxcbiAgICAgIHR5cGVvZiB2YWx1ZS5yZXN1bHQgIT09IFwib2JqZWN0XCIgfHxcbiAgICAgICEoXCJhY3Rpb25cIiBpbiB2YWx1ZS5yZXN1bHQpIHx8XG4gICAgICB2YWx1ZS5yZXN1bHQuYWN0aW9uICE9PSBcInRvb2xfY2FsbFwiXG4gICAgKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBwYXJzZUVudmVsb3BlKHRleHQsIHRvb2xzLCBhbnN3ZXJLaW5kKS5hY3Rpb24gPT09IFwidG9vbF9jYWxsXCI7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRW52ZWxvcGUodGV4dDogc3RyaW5nLCB0b29sczogUWdyaWRUb29sW10sIGFuc3dlcktpbmQ6IEFuc3dlcktpbmQpIHtcbiAgaWYgKEJ1ZmZlci5ieXRlTGVuZ3RoKHRleHQsIFwidXRmOFwiKSA+IFNUUlVDVFVSRURfRU5WRUxPUEVfTElNSVRTLm1heFV0ZjhCeXRlcykge1xuICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKFxuICAgICAgYHRvb2wgZW52ZWxvcGUgZXhjZWVkcyBVVEYtOCBieXRlIGxpbWl0IG9mICR7U1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMubWF4VXRmOEJ5dGVzfWAsXG4gICAgKTtcbiAgfVxuXG4gIGxldCB2YWx1ZTogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICB2YWx1ZSA9IEpTT04ucGFyc2UodGV4dCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8g6rSA7JqpIO2PtOuwsSDsl4bsnYwuIG9wZW5haSDripQgZW52ZWxvcGUg7J20IHN0cnVjdHVyZWQgb3V0cHV0IOycvOuhnCDqsJXsoJzrkJjrr4DroZwg7Jes6riwIOuPhOuLrO2VnFxuICAgIC8vIOu5hCBKU09OIOydgCDrsoTqt7jri6QuIGFudGhyb3BpYyDsnYAg6rOE7JW97J2EIO2UhOuhrO2UhO2KuOuhnOunjCDslYjrgrTtlZjrr4DroZwoU09OLTUzMikg67mEIEpTT04g7J20XG4gICAgLy8gXCLsmIjsg4Eg6rCA64ql7ZWcIOuqqOuNuCDsi6TtjKhcIuyngOunjCwg6re4656Y64+EIOq1rOygnO2VmOyngCDslYrripTri6Qg4oCUIOqzvOqxsOydmCDthY3siqTtirgg6rWs7KCc64qUIO2HtO2ZlFxuICAgIC8vIOu0ie2IrOulvCDri7Xrs4DsnLzroZwg7Z2Y66Ck67O064K0IOyhsOyaqe2VnCDsmKTsl7zsnYQg66eM65Ok7JeI64ukKDIwMjYtMDcgbWVkcGF0aCwgMTMuNWsg6rG0KS5cbiAgICAvLyDsoJXsp4HtlZwg7Iuk7Yyo6rCAIOuztOyXrOyVvCDshozruYTsnpDqsIAg7J6s7Iuc64+E7ZWY6rGw64KYIOq3vOuzuCDsm5DsnbjsnYQg6rOg7Lmc64ukLlxuICAgIC8vIOynhOuLqOyXkOuKlCDsnITrsJgg7JuQ66y47J2YIOuouOumrOqwgCDtlYTsmpTtlZjri6QoU09OLTQ5NSDsoITroYApIOKAlCBwYXJzZSDsl5Drn6wg7JyE7LmY66eM7Jy866Gc64qUXG4gICAgLy8gXCLtlITroZzspojroZwg64u17ZaI64qU7KeAIC8g7Y6c7Iqk6rCAIOuCqOyVmOuKlOyngCAvIEpTT04g7J20IOyemOuguOuKlOyngFwi66W8IOq1rOu2hO2VoCDsiJgg7JeG64ukLlxuICAgIGNvbnN0IGhlYWQgPSBKU09OLnN0cmluZ2lmeSh0ZXh0LnNsaWNlKDAsIDIwMCkpO1xuICAgIGxvZ2dlci53YXJuKGB0b29sIGVudmVsb3BlIHBhcnNlIGZhaWxlZDogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9OyBoZWFkPSR7aGVhZH1gKTtcbiAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgIGBpbnZhbGlkIHRvb2wgZW52ZWxvcGUgKHJlc3BvbnNlIGlzIG5vdCBKU09OIOKAlCB0aGUgbW9kZWwgaWdub3JlZCB0aGUgZW52ZWxvcGUgY29udHJhY3Q7IHJldHJ5IGlzIHRoZSBjYWxsZXIncyBkZWNpc2lvbik6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfTsgcmVzcG9uc2UgaGVhZDogJHtoZWFkfWAsXG4gICAgKTtcbiAgfVxuXG4gIGFzc2VydFN0cnVjdHVyZWRFbnZlbG9wZUNvbXBsZXhpdHkodmFsdWUpO1xuICBjb25zdCBzY2hlbWEgPSBhbnN3ZXJLaW5kID09PSBcInRleHRcIiA/IFRFWFRfRU5WRUxPUEUgOiBKU09OX0VOVkVMT1BFO1xuICBjb25zdCB2YWxpZGF0aW9uID0gc2NoZW1hLnNhZmVQYXJzZSh2YWx1ZSk7XG4gIGlmICghdmFsaWRhdGlvbi5zdWNjZXNzKSB7XG4gICAgY29uc3QgaXNzdWUgPSB2YWxpZGF0aW9uLmVycm9yLmlzc3Vlc1swXTtcbiAgICBjb25zdCBwYXRoID0gaXNzdWUgJiYgaXNzdWUucGF0aC5sZW5ndGggPiAwID8gYCBhdCAke2lzc3VlLnBhdGguam9pbihcIi5cIil9YCA6IFwiXCI7XG4gICAgY29uc3QgZGV0YWlsID0gaXNzdWU/Lm1lc3NhZ2UgPz8gXCJ1bmtub3duIHZhbGlkYXRpb24gaXNzdWVcIjtcbiAgICAvLyB2YWxpZCBKU09OIOydtOyngOunjCDqs4Tslb0g7JyE67CY7J24IOqyveyasOyXkOuPhCDsm5DrrLgg66i466as66W8IOuCqOq4tOuLpCDigJQgem9kIOqyveuhnOunjOycvOuhnOuKlFxuICAgIC8vIFwi7YKkIOyDneueteyduOyngCAvIOuemO2NvOuhnCDqsJDsjIzripTsp4AgLyDtg4DsnoXsnbQg7YuA66C464qU7KeAXCLsnZgg7Iuk66y87J2EIOuzvCDsiJgg7JeG64ukLlxuICAgIGNvbnN0IGhlYWQgPSBKU09OLnN0cmluZ2lmeSh0ZXh0LnNsaWNlKDAsIDIwMCkpO1xuICAgIGxvZ2dlci53YXJuKGB0b29sIGVudmVsb3BlIHZhbGlkYXRpb24gZmFpbGVkJHtwYXRofTogJHtkZXRhaWx9OyBoZWFkPSR7aGVhZH1gKTtcbiAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgIGBpbnZhbGlkIHRvb2wgZW52ZWxvcGUke3BhdGh9OiAke2RldGFpbH07IHJlc3BvbnNlIGhlYWQ6ICR7aGVhZH1gLFxuICAgICk7XG4gIH1cblxuICAvLyBab2QgY2xvbmVzIEpTT04gb2JqZWN0cyBhbmQgZHJvcHMgb3duIFwiX19wcm90b19fXCIga2V5cy4gVGhlIHBhcnNlZCBKU09OIGlzIHNhZmUgdG8gcmV0dXJuXG4gIC8vIGFmdGVyIHZhbGlkYXRpb24gYW5kIHByZXNlcnZlcyB0aGUgY2FsbGVyJ3MgZXhhY3Qgc3RydWN0dXJlZCB2YWx1ZS5cbiAgY29uc3QgcmVzcG9uc2UgPSAodmFsdWUgYXMgeyByZXN1bHQ6IEVudmVsb3BlUmVzcG9uc2UgfSkucmVzdWx0O1xuICBpZiAocmVzcG9uc2UuYWN0aW9uID09PSBcInRvb2xfY2FsbFwiKSB7XG4gICAgY29uc3QgdW5rbm93blRvb2wgPSBmaW5kVW5rbm93blRvb2wocmVzcG9uc2UudG9vbENhbGxzLCB0b29scyk7XG4gICAgaWYgKHVua25vd25Ub29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKGB1bmtub3duIGVtdWxhdGVkIHRvb2w6ICR7dW5rbm93blRvb2x9YCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuZnVuY3Rpb24gdG9vbENhbGxPdXRwdXQoXG4gIHJlc3VsdDogRW11bGF0aW9uUmVzdWx0LFxuICB0b29sQ2FsbHM6IFRvb2xDYWxsW10sXG4gIGltYWdlczogRW11bGF0aW9uSW1hZ2VbXSB8IHVuZGVmaW5lZCxcbiAgcnVuQ29udGV4dDogUXVlcnlPdXRwdXRbXCJydW5Db250ZXh0XCJdLFxuKTogUXVlcnlPdXRwdXQge1xuICByZXR1cm4ge1xuICAgIC4uLnJlc3VsdCxcbiAgICBjb250ZW50OiBhcHBlbmRJbWFnZXMoXG4gICAgICB0b29sQ2FsbHMubWFwKCh0b29sQ2FsbCkgPT4gKHtcbiAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgdG9vbENhbGxJZDogYGNhbGxfJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMCl9YCxcbiAgICAgICAgdG9vbE5hbWU6IHRvb2xDYWxsLnRvb2xOYW1lLFxuICAgICAgICBpbnB1dDogdG9vbENhbGwuYXJncyxcbiAgICAgIH0pKSxcbiAgICAgIGltYWdlcyxcbiAgICApLFxuICAgIGZpbmlzaFJlYXNvbjogXCJ0b29sLWNhbGxzXCIsXG4gICAgcnVuQ29udGV4dCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYW5zd2VyT3V0cHV0KFxuICByZXN1bHQ6IEVtdWxhdGlvblJlc3VsdCxcbiAgdGV4dDogc3RyaW5nLFxuICBpbWFnZXM6IEVtdWxhdGlvbkltYWdlW10gfCB1bmRlZmluZWQsXG4gIHJ1bkNvbnRleHQ6IFF1ZXJ5T3V0cHV0W1wicnVuQ29udGV4dFwiXSxcbik6IFF1ZXJ5T3V0cHV0IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5yZXN1bHQsXG4gICAgdGV4dCxcbiAgICBjb250ZW50OiBhcHBlbmRJbWFnZXMoW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQgfV0sIGltYWdlcyksXG4gICAgZmluaXNoUmVhc29uOiBcInN0b3BcIixcbiAgICBydW5Db250ZXh0LFxuICB9O1xufVxuXG5mdW5jdGlvbiBmaW5kVW5rbm93blRvb2wodG9vbENhbGxzOiBUb29sQ2FsbFtdLCB0b29sczogUWdyaWRUb29sW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBrbm93blRvb2xOYW1lcyA9IG5ldyBTZXQodG9vbHMubWFwKCh0b29sKSA9PiB0b29sLm5hbWUpKTtcbiAgcmV0dXJuIHRvb2xDYWxscy5maW5kKCh0b29sQ2FsbCkgPT4gIWtub3duVG9vbE5hbWVzLmhhcyh0b29sQ2FsbC50b29sTmFtZSkpPy50b29sTmFtZTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kSW1hZ2VzKGNvbnRlbnQ6IFFncmlkQ29udGVudFtdLCBpbWFnZXM/OiBFbXVsYXRpb25JbWFnZVtdKTogUWdyaWRDb250ZW50W10ge1xuICBpZiAoIWltYWdlcz8ubGVuZ3RoKSByZXR1cm4gY29udGVudDtcbiAgcmV0dXJuIFtcbiAgICAuLi5jb250ZW50LFxuICAgIC4uLmltYWdlcy5tYXAoXG4gICAgICAoaW1hZ2UpOiBRZ3JpZENvbnRlbnQgPT4gKHtcbiAgICAgICAgdHlwZTogXCJpbWFnZVwiLFxuICAgICAgICBkYXRhOiBpbWFnZS5kYXRhLFxuICAgICAgICAuLi4oaW1hZ2UubWVkaWFUeXBlID8geyBtZWRpYVR5cGU6IGltYWdlLm1lZGlhVHlwZSB9IDoge30pLFxuICAgICAgICByZXZpc2VkUHJvbXB0OiBpbWFnZS5yZXZpc2VkUHJvbXB0ID8/IG51bGwsXG4gICAgICAgIC4uLihpbWFnZS5nZW5lcmF0aW9uID8geyBnZW5lcmF0aW9uOiBpbWFnZS5nZW5lcmF0aW9uIH0gOiB7fSksXG4gICAgICB9KSxcbiAgICApLFxuICBdO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRTdHJ1Y3R1cmVkRW52ZWxvcGVDb21wbGV4aXR5KHJvb3Q6IHVua25vd24pOiB2b2lkIHtcbiAgY29uc3QgbWF4RGVwdGggPSBTVFJVQ1RVUkVEX0VOVkVMT1BFX0xJTUlUUy5tYXhEZXB0aDtcbiAgY29uc3Qgc3RhY2sgPSBbeyB2YWx1ZTogcm9vdCwgZGVwdGg6IDAgfV07XG4gIGxldCBub2RlcyA9IDA7XG5cbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBjdXJyZW50ID0gc3RhY2sucG9wKCkhO1xuICAgIG5vZGVzICs9IDE7XG4gICAgaWYgKG5vZGVzID4gU1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMubWF4Tm9kZXMpIHtcbiAgICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKFxuICAgICAgICBgc3RydWN0dXJlZC1vdXRwdXQgZW52ZWxvcGUgZXhjZWVkcyBub2RlIGxpbWl0IG9mICR7U1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMubWF4Tm9kZXN9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChjdXJyZW50LmRlcHRoID4gbWF4RGVwdGgpIHtcbiAgICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKFxuICAgICAgICBgc3RydWN0dXJlZC1vdXRwdXQgZW52ZWxvcGUgZXhjZWVkcyBkZXB0aCBsaW1pdCBvZiAke21heERlcHRofWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGN1cnJlbnQudmFsdWUgPT09IFwibnVtYmVyXCIgJiYgIU51bWJlci5pc0Zpbml0ZShjdXJyZW50LnZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xDYWxsRW11bGF0aW9uRXJyb3IoXCJhbnN3ZXIgbXVzdCBiZSB2YWxpZCBKU09OXCIpO1xuICAgIH1cbiAgICBpZiAoY3VycmVudC52YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgY3VycmVudC52YWx1ZSAhPT0gXCJvYmplY3RcIikgY29udGludWU7XG5cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIE9iamVjdC52YWx1ZXMoY3VycmVudC52YWx1ZSkpIHtcbiAgICAgIHN0YWNrLnB1c2goeyB2YWx1ZSwgZGVwdGg6IGN1cnJlbnQuZGVwdGggKyAxIH0pO1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBUUEsTUFBTSw2QkFBNkI7Q0FDakMsY0FBYyxNQUFNO0NBQ3BCLFVBQVU7Q0FDVixVQUFVO0FBQ1o7QUFTQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsZ0JBQWdCLENBQUM7QUFRcEQsU0FBUyxvQkFBb0IsWUFBd0I7Q0FDbkQsT0FBTyxFQUFFLGFBQWEsRUFDcEIsUUFBUSxFQUFFLG1CQUFtQixVQUFVLENBQ3JDLEVBQUUsYUFBYTtFQUNiLFFBQVEsRUFBRSxRQUFRLFFBQVE7RUFDMUIsUUFDRSxlQUFlLFNBQ1gsRUFBRSxPQUFPLElBQ1QsRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLFdBQVcsV0FBVyxNQUFNLEVBQzNDLFNBQVMsMEJBQ1gsQ0FBQztFQUNQLFdBQVcsRUFBRSxLQUFLO0NB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
|
|
146
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1lbXVsYXRpb24uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3Rvb2wtZW11bGF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gXCJub2RlOmJ1ZmZlclwiO1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgdHlwZSBKc29uVmFsdWUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9wcm92aWRlci10eXBlc1wiO1xuXG4vLyDsnZHri7Uo66qo6424IOy2nOugpSkgZW52ZWxvcGUg7J2YIOyekOybkCDtlZzrj4QuIGNhbGxlciDsiqTtgqTrp4gg7KCE7LKY66asIO2VnOuPhChDQUxMRVJfU0NIRU1BX0xJTUlUUynsmYAg6rCS7J20XG4vLyDqsJnslYQg67O07Jes64+EIOyEnOuhnCDri6Trpbgg7J6Q7JuQ7J2EIOyngO2CpOuKlCDrj4Xrpr0g7IOB7IiY64ukIOKAlCDsiqTtgqTrp4gg6rmK7J2064qUIOyduOyKpO2EtOyKpCDquYrsnbTrpbwgYm91bmQg7ZWY7KeAXG4vLyDslYrsnLzrr4DroZwo7J6s6reAICRyZWYg7ZeI7JqpKSDsupjrn6wg7ZWc64+E66W8IOyhsOygle2VtOuPhCDsnZHri7Ug7IiY7JqpIOq4sOykgOydtCDrlLDrnbwg7JuA7KeB7Jes7ISgIOyViCDrkJzri6QuXG5jb25zdCBTVFJVQ1RVUkVEX0VOVkVMT1BFX0xJTUlUUyA9IHtcbiAgbWF4VXRmOEJ5dGVzOiA1MTIgKiAxMDI0LFxuICBtYXhOb2RlczogMjBfMDAwLFxuICBtYXhEZXB0aDogMTMyLFxufSBhcyBjb25zdDtcblxuaW1wb3J0IHtcbiAgdHlwZSBJbWFnZUdlbmVyYXRpb25NZXRhZGF0YSxcbiAgdHlwZSBRZ3JpZENvbnRlbnQsXG4gIHR5cGUgUWdyaWRUaHJlYWRDb29yZCxcbiAgdHlwZSBRZ3JpZFRvb2wsXG4gIHR5cGUgUXVlcnlPdXRwdXQsXG59IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInRvb2wtZW11bGF0aW9uXCJdKTtcblxudHlwZSBFbXVsYXRpb25SZXN1bHQgPSBPbWl0PFF1ZXJ5T3V0cHV0LCBcImNvbnRlbnRcIiB8IFwiZmluaXNoUmVhc29uXCIgfCBcInJ1bkNvbnRleHRcIj47XG5cbnR5cGUgVG9vbENhbGwgPSB7IHRvb2xOYW1lOiBzdHJpbmc7IGFyZ3M6IHN0cmluZyB9O1xuXG4vLyBlbnZlbG9wZSDripQge3Jlc3VsdDogPHVuaW9uPn0g7ZWcIOqyuSDqtazsobAg4oCUIOyKpO2CpOuniCDqt7zqsbDripQgdG9vbC1lbXVsYXRpb24tc2NoZW1hLnRzIOywuOyhsC5cbi8vIGFuc3dlciDtg4DsnoXrp4wg7JqU7LKtIO2Yle2DnOyXkCDrlLDrnbwg64uk66W064ukOiB0b29scy1vbmx5IOuKlCBzdHJpbmco6re464yA66GcIOuwmO2ZmCksXG4vLyB0b29scytqc29uU2NoZW1hIOuKlCDsgqzsmqnsnpAg7Iqk7YKk66eI7J2YIEpTT04g6rCSKEpTT04uc3RyaW5naWZ5IOuhnCDrsJjtmZgpLlxuZnVuY3Rpb24gYnVpbGRFbnZlbG9wZVNjaGVtYShhbnN3ZXJLaW5kOiBBbnN3ZXJLaW5kKSB7XG4gIHJldHVybiB6LnN0cmljdE9iamVjdCh7XG4gICAgcmVzdWx0OiB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcImFjdGlvblwiLCBbXG4gICAgICB6LnN0cmljdE9iamVjdCh7XG4gICAgICAgIGFjdGlvbjogei5saXRlcmFsKFwiYW5zd2VyXCIpLFxuICAgICAgICBhbnN3ZXI6XG4gICAgICAgICAgYW5zd2VyS2luZCA9PT0gXCJ0ZXh0XCJcbiAgICAgICAgICAgID8gei5zdHJpbmcoKVxuICAgICAgICAgICAgOiB6Lmpzb24oKS5yZWZpbmUoKGFuc3dlcikgPT4gYW5zd2VyICE9PSBudWxsLCB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogXCJhbnN3ZXIgbXVzdCBiZSBub24tbnVsbFwiLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgdG9vbENhbGxzOiB6Lm51bGwoKSxcbiAgICAgIH0pLFxuICAgICAgei5zdHJpY3RPYmplY3Qoe1xuICAgICAgICBhY3Rpb246IHoubGl0ZXJhbChcInRvb2xfY2FsbFwiKSxcbiAgICAgICAgYW5zd2VyOiB6Lm51bGwoKSxcbiAgICAgICAgdG9vbENhbGxzOiB6XG4gICAgICAgICAgLmFycmF5KFxuICAgICAgICAgICAgei5zdHJpY3RPYmplY3Qoe1xuICAgICAgICAgICAgICB0b29sTmFtZTogei5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgYXJnczogei5zdHJpbmcoKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIClcbiAgICAgICAgICAubWluKDEpLFxuICAgICAgfSksXG4gICAgXSksXG4gIH0pO1xufVxuXG5jb25zdCBURVhUX0VOVkVMT1BFID0gYnVpbGRFbnZlbG9wZVNjaGVtYShcInRleHRcIik7XG5jb25zdCBKU09OX0VOVkVMT1BFID0gYnVpbGRFbnZlbG9wZVNjaGVtYShcImpzb25cIik7XG5cbnR5cGUgRW52ZWxvcGVSZXNwb25zZSA9IHouaW5mZXI8dHlwZW9mIEpTT05fRU5WRUxPUEU+W1wicmVzdWx0XCJdO1xuXG5leHBvcnQgY2xhc3MgVG9vbENhbGxFbXVsYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYHRvb2wtY2FsbCBlbXVsYXRpb246ICR7bWVzc2FnZX1gKTtcbiAgICB0aGlzLm5hbWUgPSBcIlRvb2xDYWxsRW11bGF0aW9uRXJyb3JcIjtcbiAgfVxufVxuXG4vLyBQcmVzZXJ2ZSBpbWFnZSBieXRlcyBhbmQgdGhlIHByb3ZpZGVyJ3MgcmVzb2x2ZWQgTUlNRSB0eXBlLlxuaW50ZXJmYWNlIEVtdWxhdGlvbkltYWdlIHtcbiAgZGF0YTogc3RyaW5nO1xuICBtZWRpYVR5cGU/OiBFeHRyYWN0PFFncmlkQ29udGVudCwgeyB0eXBlOiBcImltYWdlXCIgfT5bXCJtZWRpYVR5cGVcIl07XG4gIHJldmlzZWRQcm9tcHQ/OiBzdHJpbmcgfCBudWxsO1xuICBnZW5lcmF0aW9uPzogSW1hZ2VHZW5lcmF0aW9uTWV0YWRhdGE7XG59XG5cbi8vIGFuc3dlciDsnbjsvZTrlKkg7KKF66WYLiBlbnZlbG9wZSDrlJTsvZTrjZTripQg7ZWcIOuyjOydtOqzoCDsnbQg6rCS7J2AIGFuc3dlciDruIzrnpzsuZjsnZgg7YOA7J6F6rO8XG4vLyDstZzsooUg7KeB66Cs7ZmUKHRleHQ6IOq3uOuMgOuhnCAvIGpzb246IEpTT04uc3RyaW5naWZ5KeunjCDqsIDrpbjri6QuXG5leHBvcnQgdHlwZSBBbnN3ZXJLaW5kID0gXCJ0ZXh0XCIgfCBcImpzb25cIjtcblxuaW50ZXJmYWNlIFRvb2xDYWxsRW11bGF0aW9uT3B0aW9ucyB7XG4gIHRocmVhZENvb3JkPzogUWdyaWRUaHJlYWRDb29yZDtcbiAgaW1hZ2VzPzogRW11bGF0aW9uSW1hZ2VbXTtcbiAgLy8g7ZWE7IiYOiDtmLjstpzrtoDqsIAgYW5zd2VyIOyduOy9lOuUqeydhCDtla3sg4Eg66qF7Iuc7ZW07JW8IO2VnOuLpCAoaW5wdXQuanNvblNjaGVtYSDsnKDrrLTroZwg7YyQ7KCVKS5cbiAgYW5zd2VyS2luZDogQW5zd2VyS2luZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5VG9vbENhbGxFbXVsYXRpb24oXG4gIHJlc3VsdDogRW11bGF0aW9uUmVzdWx0LFxuICB0b29sczogUWdyaWRUb29sW10gfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IFRvb2xDYWxsRW11bGF0aW9uT3B0aW9ucyxcbik6IFF1ZXJ5T3V0cHV0IHtcbiAgY29uc3QgeyB0aHJlYWRDb29yZCwgaW1hZ2VzLCBhbnN3ZXJLaW5kIH0gPSBvcHRpb25zO1xuICBjb25zdCBydW5Db250ZXh0ID0gdGhyZWFkQ29vcmQgPyB7IHRocmVhZENvb3JkIH0gOiB1bmRlZmluZWQ7XG5cbiAgaWYgKCF0b29scz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGFuc3dlck91dHB1dChyZXN1bHQsIHJlc3VsdC50ZXh0LCBpbWFnZXMsIHJ1bkNvbnRleHQpO1xuICB9XG5cbiAgY29uc3QgcGFyc2VkID0gcGFyc2VFbnZlbG9wZShyZXN1bHQudGV4dCwgdG9vbHMsIGFuc3dlcktpbmQpO1xuXG4gIGlmIChwYXJzZWQuYWN0aW9uID09PSBcInRvb2xfY2FsbFwiKSB7XG4gICAgcmV0dXJuIHRvb2xDYWxsT3V0cHV0KHJlc3VsdCwgcGFyc2VkLnRvb2xDYWxscywgaW1hZ2VzLCBydW5Db250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiBhbnN3ZXJPdXRwdXQoXG4gICAgcmVzdWx0LFxuICAgIGFuc3dlcktpbmQgPT09IFwidGV4dFwiID8gei5zdHJpbmcoKS5wYXJzZShwYXJzZWQuYW5zd2VyKSA6IEpTT04uc3RyaW5naWZ5KHBhcnNlZC5hbnN3ZXIpLFxuICAgIGltYWdlcyxcbiAgICBydW5Db250ZXh0LFxuICApO1xufVxuXG5jb25zdCBjb21tZW50YXJ5VG9vbENhbGxDb250cm9sID0gei5sb29zZU9iamVjdCh7XG4gIHJlc3VsdDogei5sb29zZU9iamVjdCh7IGFjdGlvbjogei5saXRlcmFsKFwidG9vbF9jYWxsXCIpIH0pLFxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Rvb2xDYWxsRW52ZWxvcGUoXG4gIHRleHQ6IHN0cmluZyxcbiAgdG9vbHM6IFFncmlkVG9vbFtdLFxuICBhbnN3ZXJLaW5kOiBBbnN3ZXJLaW5kLFxuICBwaGFzZT86IHN0cmluZyxcbik6IGJvb2xlYW4ge1xuICBpZiAocGhhc2UgPT09IFwiY29tbWVudGFyeVwiKSB7XG4gICAgLy8gQ29tbWVudGFyeSBpcyBub3QgdGhlIHN0cnVjdHVyZWQgYW5zd2VyLiBPbmx5IGFuIGV4cGxpY2l0IHRvb2wgY29udHJvbFxuICAgIC8vIG9iamVjdCBpcyBlbGlnaWJsZSwgYW5kIHRoYXQgb2JqZWN0IG11c3Qgc3RpbGwgcGFzcyB0aGUgc3RyaWN0IHBhcnNlci5cbiAgICBsZXQgdmFsdWU6IEpzb25WYWx1ZTtcblxuICAgIHRyeSB7XG4gICAgICB2YWx1ZSA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFjb21tZW50YXJ5VG9vbENhbGxDb250cm9sLnNhZmVQYXJzZSh2YWx1ZSkuc3VjY2VzcykgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlRW52ZWxvcGUodGV4dCwgdG9vbHMsIGFuc3dlcktpbmQpLmFjdGlvbiA9PT0gXCJ0b29sX2NhbGxcIjtcbn1cblxuZnVuY3Rpb24gcGFyc2VFbnZlbG9wZSh0ZXh0OiBzdHJpbmcsIHRvb2xzOiBRZ3JpZFRvb2xbXSwgYW5zd2VyS2luZDogQW5zd2VyS2luZCkge1xuICBpZiAoQnVmZmVyLmJ5dGVMZW5ndGgodGV4dCwgXCJ1dGY4XCIpID4gU1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMubWF4VXRmOEJ5dGVzKSB7XG4gICAgdGhyb3cgbmV3IFRvb2xDYWxsRW11bGF0aW9uRXJyb3IoXG4gICAgICBgdG9vbCBlbnZlbG9wZSBleGNlZWRzIFVURi04IGJ5dGUgbGltaXQgb2YgJHtTVFJVQ1RVUkVEX0VOVkVMT1BFX0xJTUlUUy5tYXhVdGY4Qnl0ZXN9YCxcbiAgICApO1xuICB9XG5cbiAgLy8gSlNPTi5wYXJzZSB3aXRob3V0IGEgcmV2aXZlciB5aWVsZHMgb25seSBKU09OIHZhbHVlcy5cbiAgbGV0IHZhbHVlOiBKc29uVmFsdWU7XG5cbiAgdHJ5IHtcbiAgICB2YWx1ZSA9IEpTT04ucGFyc2UodGV4dCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8g6rSA7JqpIO2PtOuwsSDsl4bsnYwuIG9wZW5haSDripQgZW52ZWxvcGUg7J20IHN0cnVjdHVyZWQgb3V0cHV0IOycvOuhnCDqsJXsoJzrkJjrr4DroZwg7Jes6riwIOuPhOuLrO2VnFxuICAgIC8vIOu5hCBKU09OIOydgCDrsoTqt7jri6QuIGFudGhyb3BpYyDsnYAg6rOE7JW97J2EIO2UhOuhrO2UhO2KuOuhnOunjCDslYjrgrTtlZjrr4DroZwoU09OLTUzMikg67mEIEpTT04g7J20XG4gICAgLy8gXCLsmIjsg4Eg6rCA64ql7ZWcIOuqqOuNuCDsi6TtjKhcIuyngOunjCwg6re4656Y64+EIOq1rOygnO2VmOyngCDslYrripTri6Qg4oCUIOqzvOqxsOydmCDthY3siqTtirgg6rWs7KCc64qUIO2HtO2ZlFxuICAgIC8vIOu0ie2IrOulvCDri7Xrs4DsnLzroZwg7Z2Y66Ck67O064K0IOyhsOyaqe2VnCDsmKTsl7zsnYQg66eM65Ok7JeI64ukKDIwMjYtMDcgbWVkcGF0aCwgMTMuNWsg6rG0KS5cbiAgICAvLyDsoJXsp4HtlZwg7Iuk7Yyo6rCAIOuztOyXrOyVvCDshozruYTsnpDqsIAg7J6s7Iuc64+E7ZWY6rGw64KYIOq3vOuzuCDsm5DsnbjsnYQg6rOg7Lmc64ukLlxuICAgIC8vIOynhOuLqOyXkOuKlCDsnITrsJgg7JuQ66y47J2YIOuouOumrOqwgCDtlYTsmpTtlZjri6QoU09OLTQ5NSDsoITroYApIOKAlCBwYXJzZSDsl5Drn6wg7JyE7LmY66eM7Jy866Gc64qUXG4gICAgLy8gXCLtlITroZzspojroZwg64u17ZaI64qU7KeAIC8g7Y6c7Iqk6rCAIOuCqOyVmOuKlOyngCAvIEpTT04g7J20IOyemOuguOuKlOyngFwi66W8IOq1rOu2hO2VoCDsiJgg7JeG64ukLlxuICAgIGNvbnN0IGhlYWQgPSBKU09OLnN0cmluZ2lmeSh0ZXh0LnNsaWNlKDAsIDIwMCkpO1xuICAgIGxvZ2dlci53YXJuKFxuICAgICAgYHRvb2wgZW52ZWxvcGUgcGFyc2UgZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX07IGhlYWQ9JHtoZWFkfWAsXG4gICAgKTtcbiAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgIGBpbnZhbGlkIHRvb2wgZW52ZWxvcGUgKHJlc3BvbnNlIGlzIG5vdCBKU09OIOKAlCB0aGUgbW9kZWwgaWdub3JlZCB0aGUgZW52ZWxvcGUgY29udHJhY3Q7IHJldHJ5IGlzIHRoZSBjYWxsZXIncyBkZWNpc2lvbik6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfTsgcmVzcG9uc2UgaGVhZDogJHtoZWFkfWAsXG4gICAgKTtcbiAgfVxuXG4gIGFzc2VydFN0cnVjdHVyZWRFbnZlbG9wZUNvbXBsZXhpdHkodmFsdWUpO1xuICBjb25zdCBzY2hlbWEgPSBhbnN3ZXJLaW5kID09PSBcInRleHRcIiA/IFRFWFRfRU5WRUxPUEUgOiBKU09OX0VOVkVMT1BFO1xuICBjb25zdCB2YWxpZGF0aW9uID0gc2NoZW1hLnNhZmVQYXJzZSh2YWx1ZSk7XG5cbiAgaWYgKCF2YWxpZGF0aW9uLnN1Y2Nlc3MpIHtcbiAgICBjb25zdCBpc3N1ZSA9IHZhbGlkYXRpb24uZXJyb3IuaXNzdWVzWzBdO1xuICAgIGNvbnN0IHBhdGggPSBpc3N1ZSAmJiBpc3N1ZS5wYXRoLmxlbmd0aCA+IDAgPyBgIGF0ICR7aXNzdWUucGF0aC5qb2luKFwiLlwiKX1gIDogXCJcIjtcbiAgICBjb25zdCBkZXRhaWwgPSBpc3N1ZT8ubWVzc2FnZSA/PyBcInVua25vd24gdmFsaWRhdGlvbiBpc3N1ZVwiO1xuICAgIC8vIHZhbGlkIEpTT04g7J207KeA66eMIOqzhOyVvSDsnITrsJjsnbgg6rK97Jqw7JeQ64+EIOybkOusuCDrqLjrpqzrpbwg64Ko6ri064ukIOKAlCB6b2Qg6rK966Gc66eM7Jy866Gc64qUXG4gICAgLy8gXCLtgqQg7IOd65617J247KeAIC8g656Y7Y2866GcIOqwkOyMjOuKlOyngCAvIO2DgOyeheydtCDti4DroLjripTsp4BcIuydmCDsi6TrrLzsnYQg67O8IOyImCDsl4bri6QuXG4gICAgY29uc3QgaGVhZCA9IEpTT04uc3RyaW5naWZ5KHRleHQuc2xpY2UoMCwgMjAwKSk7XG4gICAgbG9nZ2VyLndhcm4oYHRvb2wgZW52ZWxvcGUgdmFsaWRhdGlvbiBmYWlsZWQke3BhdGh9OiAke2RldGFpbH07IGhlYWQ9JHtoZWFkfWApO1xuICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKFxuICAgICAgYGludmFsaWQgdG9vbCBlbnZlbG9wZSR7cGF0aH06ICR7ZGV0YWlsfTsgcmVzcG9uc2UgaGVhZDogJHtoZWFkfWAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNBRkVUWTogc2NoZW1hLnNhZmVQYXJzZSh2YWx1ZSkgc3VjY2VlZGVkIGFib3ZlLCBzbyB2YWx1ZSBtYXRjaGVzIHsgcmVzdWx0OiBFbnZlbG9wZVJlc3BvbnNlIH0uXG4gIC8vIFpvZCBjbG9uZXMgSlNPTiBvYmplY3RzIGFuZCBkcm9wcyBvd24gXCJfX3Byb3RvX19cIiBrZXlzLCBzbyB0aGUgdmFsaWRhdGVkIHJhdyB2YWx1ZSBpcyByZXR1cm5lZFxuICAvLyB0byBwcmVzZXJ2ZSB0aGUgY2FsbGVyJ3MgZXhhY3Qgc3RydWN0dXJlZCBhbnN3ZXIuXG4gIGNvbnN0IHJlc3BvbnNlID0gKHZhbHVlIGFzIHsgcmVzdWx0OiBFbnZlbG9wZVJlc3BvbnNlIH0pLnJlc3VsdDtcblxuICBpZiAocmVzcG9uc2UuYWN0aW9uID09PSBcInRvb2xfY2FsbFwiKSB7XG4gICAgY29uc3QgdW5rbm93blRvb2wgPSBmaW5kVW5rbm93blRvb2wocmVzcG9uc2UudG9vbENhbGxzLCB0b29scyk7XG5cbiAgICBpZiAodW5rbm93blRvb2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xDYWxsRW11bGF0aW9uRXJyb3IoYHVua25vd24gZW11bGF0ZWQgdG9vbDogJHt1bmtub3duVG9vbH1gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbmZ1bmN0aW9uIHRvb2xDYWxsT3V0cHV0KFxuICByZXN1bHQ6IEVtdWxhdGlvblJlc3VsdCxcbiAgdG9vbENhbGxzOiBUb29sQ2FsbFtdLFxuICBpbWFnZXM6IEVtdWxhdGlvbkltYWdlW10gfCB1bmRlZmluZWQsXG4gIHJ1bkNvbnRleHQ6IFF1ZXJ5T3V0cHV0W1wicnVuQ29udGV4dFwiXSxcbik6IFF1ZXJ5T3V0cHV0IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5yZXN1bHQsXG4gICAgY29udGVudDogYXBwZW5kSW1hZ2VzKFxuICAgICAgdG9vbENhbGxzLm1hcCgodG9vbENhbGwpID0+ICh7XG4gICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgIHRvb2xDYWxsSWQ6IGBjYWxsXyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTApfWAsXG4gICAgICAgIHRvb2xOYW1lOiB0b29sQ2FsbC50b29sTmFtZSxcbiAgICAgICAgaW5wdXQ6IHRvb2xDYWxsLmFyZ3MsXG4gICAgICB9KSksXG4gICAgICBpbWFnZXMsXG4gICAgKSxcbiAgICBmaW5pc2hSZWFzb246IFwidG9vbC1jYWxsc1wiLFxuICAgIHJ1bkNvbnRleHQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFuc3dlck91dHB1dChcbiAgcmVzdWx0OiBFbXVsYXRpb25SZXN1bHQsXG4gIHRleHQ6IHN0cmluZyxcbiAgaW1hZ2VzOiBFbXVsYXRpb25JbWFnZVtdIHwgdW5kZWZpbmVkLFxuICBydW5Db250ZXh0OiBRdWVyeU91dHB1dFtcInJ1bkNvbnRleHRcIl0sXG4pOiBRdWVyeU91dHB1dCB7XG4gIHJldHVybiB7XG4gICAgLi4ucmVzdWx0LFxuICAgIHRleHQsXG4gICAgY29udGVudDogYXBwZW5kSW1hZ2VzKFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0IH1dLCBpbWFnZXMpLFxuICAgIGZpbmlzaFJlYXNvbjogXCJzdG9wXCIsXG4gICAgcnVuQ29udGV4dCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmluZFVua25vd25Ub29sKHRvb2xDYWxsczogVG9vbENhbGxbXSwgdG9vbHM6IFFncmlkVG9vbFtdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qga25vd25Ub29sTmFtZXMgPSBuZXcgU2V0KHRvb2xzLm1hcCgodG9vbCkgPT4gdG9vbC5uYW1lKSk7XG5cbiAgcmV0dXJuIHRvb2xDYWxscy5maW5kKCh0b29sQ2FsbCkgPT4gIWtub3duVG9vbE5hbWVzLmhhcyh0b29sQ2FsbC50b29sTmFtZSkpPy50b29sTmFtZTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kSW1hZ2VzKGNvbnRlbnQ6IFFncmlkQ29udGVudFtdLCBpbWFnZXM/OiBFbXVsYXRpb25JbWFnZVtdKTogUWdyaWRDb250ZW50W10ge1xuICBpZiAoIWltYWdlcz8ubGVuZ3RoKSByZXR1cm4gY29udGVudDtcblxuICByZXR1cm4gW1xuICAgIC4uLmNvbnRlbnQsXG4gICAgLi4uaW1hZ2VzLm1hcCgoaW1hZ2UpOiBRZ3JpZENvbnRlbnQgPT4ge1xuICAgICAgY29uc3QgcGFydDogRXh0cmFjdDxRZ3JpZENvbnRlbnQsIHsgdHlwZTogXCJpbWFnZVwiIH0+ID0ge1xuICAgICAgICB0eXBlOiBcImltYWdlXCIsXG4gICAgICAgIGRhdGE6IGltYWdlLmRhdGEsXG4gICAgICAgIHJldmlzZWRQcm9tcHQ6IGltYWdlLnJldmlzZWRQcm9tcHQgPz8gbnVsbCxcbiAgICAgIH07XG5cbiAgICAgIGlmIChpbWFnZS5tZWRpYVR5cGUpIHBhcnQubWVkaWFUeXBlID0gaW1hZ2UubWVkaWFUeXBlO1xuXG4gICAgICBpZiAoaW1hZ2UuZ2VuZXJhdGlvbikgcGFydC5nZW5lcmF0aW9uID0gaW1hZ2UuZ2VuZXJhdGlvbjtcblxuICAgICAgcmV0dXJuIHBhcnQ7XG4gICAgfSksXG4gIF07XG59XG5cbmZ1bmN0aW9uIGFzc2VydFN0cnVjdHVyZWRFbnZlbG9wZUNvbXBsZXhpdHkocm9vdDogSnNvblZhbHVlKTogdm9pZCB7XG4gIGNvbnN0IG1heERlcHRoID0gU1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMubWF4RGVwdGg7XG4gIGNvbnN0IHN0YWNrOiBBcnJheTx7IHZhbHVlOiBKc29uVmFsdWUgfCB1bmRlZmluZWQ7IGRlcHRoOiBudW1iZXIgfT4gPSBbeyB2YWx1ZTogcm9vdCwgZGVwdGg6IDAgfV07XG4gIGxldCBub2RlcyA9IDA7XG5cbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBjdXJyZW50ID0gc3RhY2sucG9wKCkhO1xuICAgIG5vZGVzICs9IDE7XG5cbiAgICBpZiAobm9kZXMgPiBTVFJVQ1RVUkVEX0VOVkVMT1BFX0xJTUlUUy5tYXhOb2Rlcykge1xuICAgICAgdGhyb3cgbmV3IFRvb2xDYWxsRW11bGF0aW9uRXJyb3IoXG4gICAgICAgIGBzdHJ1Y3R1cmVkLW91dHB1dCBlbnZlbG9wZSBleGNlZWRzIG5vZGUgbGltaXQgb2YgJHtTVFJVQ1RVUkVEX0VOVkVMT1BFX0xJTUlUUy5tYXhOb2Rlc31gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudC5kZXB0aCA+IG1heERlcHRoKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgICAgYHN0cnVjdHVyZWQtb3V0cHV0IGVudmVsb3BlIGV4Y2VlZHMgZGVwdGggbGltaXQgb2YgJHttYXhEZXB0aH1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBKU09OLnBhcnNlIHR1cm5zIG91dC1vZi1yYW5nZSBsaXRlcmFscyBzdWNoIGFzIDFlOTk5IGludG8gwrFJbmZpbml0eTsgaXQgbmV2ZXIgeWllbGRzIE5hTi5cbiAgICBpZiAoY3VycmVudC52YWx1ZSA9PT0gSW5maW5pdHkgfHwgY3VycmVudC52YWx1ZSA9PT0gLUluZmluaXR5KSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcImFuc3dlciBtdXN0IGJlIHZhbGlkIEpTT05cIik7XG4gICAgfVxuXG4gICAgLy8gT25seSBKU09OIGFycmF5cyBhbmQgb2JqZWN0cyBhcmUgT2JqZWN0IGluc3RhbmNlczsgcHJpbWl0aXZlcyBhbmQgbnVsbCBhcmUgbGVhdmVzLlxuICAgIGlmICghKGN1cnJlbnQudmFsdWUgaW5zdGFuY2VvZiBPYmplY3QpKSBjb250aW51ZTtcblxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgT2JqZWN0LnZhbHVlcyhjdXJyZW50LnZhbHVlKSkge1xuICAgICAgc3RhY2sucHVzaCh7IHZhbHVlLCBkZXB0aDogY3VycmVudC5kZXB0aCArIDEgfSk7XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFVQSxNQUFNLDZCQUE2QjtDQUNqQyxjQUFjLE1BQU07Q0FDcEIsVUFBVTtDQUNWLFVBQVU7QUFDWjtBQVVBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyxnQkFBZ0IsQ0FBQztBQVNwRCxTQUFTLG9CQUFvQixZQUF3QjtDQUNuRCxPQUFPLEVBQUUsYUFBYSxFQUNwQixRQUFRLEVBQUUsbUJBQW1CLFVBQVUsQ0FDckMsRUFBRSxhQUFhO0VBQ2IsUUFBUSxFQUFFLFFBQVEsUUFBUTtFQUMxQixRQUNFLGVBQWUsU0FDWCxFQUFFLE9BQU8sSUFDVCxFQUFFLEtBQUssQ0FBQyxDQUFDLFFBQVEsV0FBVyxXQUFXLE1BQU0sRUFDM0MsU0FBUywwQkFDWCxDQUFDO0VBQ1AsV0FBVyxFQUFFLEtBQUs7Q0FDcEIsQ0FBQyxHQUNELEVBQUUsYUFBYTtFQUNiLFFBQVEsRUFBRSxRQUFRLFdBQVc7RUFDN0IsUUFBUSxFQUFFLEtBQUs7RUFDZixXQUFXLEVBQ1IsTUFDQyxFQUFFLGFBQWE7R0FDYixVQUFVLEVBQUUsT0FBTztHQUNuQixNQUFNLEVBQUUsT0FBTztFQUNqQixDQUFDLENBQ0gsQ0FBQyxDQUNBLElBQUksQ0FBQztDQUNWLENBQUMsQ0FDSCxDQUFDLEVBQ0gsQ0FBQztBQUNIO0FBRUEsTUFBTSxnQkFBZ0Isb0JBQW9CLE1BQU07QUFDaEQsTUFBTSxnQkFBZ0Isb0JBQW9CLE1BQU07QUFJaEQsSUFBYSx5QkFBYixjQUE0QyxNQUFNO0NBQ2hELFlBQVksU0FBaUI7RUFDM0IsTUFBTSx3QkFBd0IsU0FBUztFQUN2QyxLQUFLLE9B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
|
|
@@ -1,4 +1,14 @@
|
|
|
1
|
+
import { isJsonObject } from "../../utils/providers/common/provider-types.js";
|
|
2
|
+
import { z } from "zod";
|
|
1
3
|
//#region src/application/request-log/json-schema-type-text.ts
|
|
4
|
+
/**
|
|
5
|
+
* JSON Schema → 간결한 TypeScript `type` 선언 텍스트.
|
|
6
|
+
*
|
|
7
|
+
* 라이브러리(json-schema-to-typescript 계열)는 interface + maxItems 튜플 유니온 등
|
|
8
|
+
* 장황한 출력을 내서 detail 화면 요약용으로 부적합하다. qgrid 가 받는 스키마는
|
|
9
|
+
* zod 직렬화 산물(object root, draft-07 부분집합)이라 이 정도 지원이면 충분하고,
|
|
10
|
+
* 모르는 키워드는 unknown 으로 접어 절대 던지지 않는다.
|
|
11
|
+
*/
|
|
2
12
|
/** TS/zod 표시 코드 공용 식별자 판별 — zod-code-format 의 키 unquote 도 이걸 쓴다. */
|
|
3
13
|
const IDENT_SOURCE = "[A-Za-z_$][\\w$]*";
|
|
4
14
|
const IDENT_RE = new RegExp(`^${IDENT_SOURCE}$`);
|
|
@@ -24,14 +34,21 @@ function renderZodEnum(values, enumValueLimit) {
|
|
|
24
34
|
const visibleValues = enumValueLimit === void 0 ? values : values.slice(0, Math.max(0, enumValueLimit));
|
|
25
35
|
const omittedCount = values.length - visibleValues.length;
|
|
26
36
|
const suffix = omittedCount > 0 ? ` /* +${omittedCount} */` : "";
|
|
27
|
-
if (values.every((value) =>
|
|
37
|
+
if (values.every((value) => z.string().safeParse(value).success)) return `z.enum([${visibleValues.map((value) => JSON.stringify(value)).join(", ")}${suffix}])`;
|
|
28
38
|
const literals = visibleValues.map((value) => `z.literal(${JSON.stringify(value)})`);
|
|
29
39
|
if (literals.length === 1 && omittedCount === 0) return literals[0] ?? "z.never()";
|
|
30
40
|
return `z.union([${literals.join(", ")}${suffix}])`;
|
|
31
41
|
}
|
|
42
|
+
function schemaProperties(schema) {
|
|
43
|
+
return isJsonObject(schema.properties) ? schema.properties : {};
|
|
44
|
+
}
|
|
45
|
+
function requiredKeys(schema) {
|
|
46
|
+
const required = schema.required;
|
|
47
|
+
return new Set(Array.isArray(required) ? required.flatMap((key) => z.string().safeParse(key).data ?? []) : []);
|
|
48
|
+
}
|
|
32
49
|
function renderZodNode(node, depth, enumValueLimit) {
|
|
33
50
|
if (node === true) return "z.unknown()";
|
|
34
|
-
if (!
|
|
51
|
+
if (!isJsonObject(node)) return "z.unknown()";
|
|
35
52
|
const schema = node;
|
|
36
53
|
if (Array.isArray(schema.enum)) return renderZodEnum(schema.enum, enumValueLimit);
|
|
37
54
|
if (schema.const !== void 0) return `z.literal(${JSON.stringify(schema.const)})`;
|
|
@@ -46,8 +63,8 @@ function renderZodNode(node, depth, enumValueLimit) {
|
|
|
46
63
|
return rendered.length === 1 ? rendered[0] ?? "z.unknown()" : `z.union([${rendered.join(", ")}])`;
|
|
47
64
|
}
|
|
48
65
|
if (type === "object" || type === void 0 && schema.properties) {
|
|
49
|
-
const properties = schema
|
|
50
|
-
const required =
|
|
66
|
+
const properties = schemaProperties(schema);
|
|
67
|
+
const required = requiredKeys(schema);
|
|
51
68
|
const keys = Object.keys(properties);
|
|
52
69
|
if (keys.length === 0) return "z.object({})";
|
|
53
70
|
const orderedKeys = [...keys.filter((key) => required.has(key)), ...keys.filter((key) => !required.has(key))];
|
|
@@ -56,7 +73,7 @@ function renderZodNode(node, depth, enumValueLimit) {
|
|
|
56
73
|
const propertySchema = properties[key];
|
|
57
74
|
const rendered = renderZodNode(propertySchema, depth + 1, enumValueLimit);
|
|
58
75
|
const optional = required.has(key) ? rendered : `${rendered}.optional()`;
|
|
59
|
-
const defaultValue =
|
|
76
|
+
const defaultValue = isJsonObject(propertySchema) && Object.hasOwn(propertySchema, "default") ? JSON.stringify(propertySchema.default) : void 0;
|
|
60
77
|
const defaultComment = defaultValue === void 0 ? "" : ` // default=${defaultValue}`;
|
|
61
78
|
return `${inner}${renderKey(key)}: ${optional},${defaultComment}`;
|
|
62
79
|
}).join("\n")}\n${" ".repeat(depth)}})`;
|
|
@@ -66,7 +83,7 @@ function renderZodNode(node, depth, enumValueLimit) {
|
|
|
66
83
|
}
|
|
67
84
|
function renderNode(node, depth) {
|
|
68
85
|
if (node === true) return "unknown";
|
|
69
|
-
if (!
|
|
86
|
+
if (!isJsonObject(node)) return "unknown";
|
|
70
87
|
const schema = node;
|
|
71
88
|
if (Array.isArray(schema.enum)) return schema.enum.map((value) => JSON.stringify(value)).join(" | ");
|
|
72
89
|
if (schema.const !== void 0) return JSON.stringify(schema.const);
|
|
@@ -75,8 +92,8 @@ function renderNode(node, depth) {
|
|
|
75
92
|
const type = schema.type;
|
|
76
93
|
if (Array.isArray(type)) return [...new Set(type.map(renderPrimitive))].join(" | ");
|
|
77
94
|
if (type === "object" || type === void 0 && schema.properties) {
|
|
78
|
-
const properties = schema
|
|
79
|
-
const required =
|
|
95
|
+
const properties = schemaProperties(schema);
|
|
96
|
+
const required = requiredKeys(schema);
|
|
80
97
|
const keys = Object.keys(properties);
|
|
81
98
|
if (keys.length === 0) return "Record<string, unknown>";
|
|
82
99
|
const inner = " ".repeat(depth + 1);
|
|
@@ -93,8 +110,8 @@ function renderNode(node, depth) {
|
|
|
93
110
|
function renderParsedJsonSchemaTypeText(schema, name = "Response") {
|
|
94
111
|
return `type ${name} = ${renderNode(schema, 0)}`;
|
|
95
112
|
}
|
|
96
|
-
/** Tool input 계약용 표시 전용 Zod
|
|
97
|
-
function
|
|
113
|
+
/** Tool input 계약용 표시 전용 Zod 코드. 검증 제약은 의도적으로 생략한다. */
|
|
114
|
+
function renderJsonSchemaZodText(schema, enumValueLimit) {
|
|
98
115
|
return renderZodNode(schema, 0, enumValueLimit);
|
|
99
116
|
}
|
|
100
117
|
/** 실패(파싱 불가 등) 시 null — 호출부가 표시 자체를 생략한다. */
|
|
@@ -106,6 +123,6 @@ function renderJsonSchemaTypeText(schemaJson, name = "Response") {
|
|
|
106
123
|
}
|
|
107
124
|
}
|
|
108
125
|
//#endregion
|
|
109
|
-
export { IDENT_SOURCE, renderJsonSchemaTypeText,
|
|
126
|
+
export { IDENT_SOURCE, renderJsonSchemaTypeText, renderJsonSchemaZodText, renderParsedJsonSchemaTypeText };
|
|
110
127
|
|
|
111
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi1zY2hlbWEtdHlwZS10ZXh0LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHBsaWNhdGlvbi9yZXF1ZXN0LWxvZy9qc29uLXNjaGVtYS10eXBlLXRleHQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBKU09OIFNjaGVtYSDihpIg6rCE6rKw7ZWcIFR5cGVTY3JpcHQgYHR5cGVgIOyEoOyWuCDthY3siqTtirguXG4gKlxuICog65287J2067iM65+s66asKGpzb24tc2NoZW1hLXRvLXR5cGVzY3JpcHQg6rOE7Je0KeuKlCBpbnRlcmZhY2UgKyBtYXhJdGVtcyDtipztlIwg7Jyg64uI7JioIOuTsVxuICog7J6l7Zmp7ZWcIOy2nOugpeydhCDrgrTshJwgZGV0YWlsIO2ZlOuptCDsmpTslb3smqnsnLzroZwg67aA7KCB7ZWp7ZWY64ukLiBxZ3JpZCDqsIAg67Cb64qUIOyKpO2CpOuniOuKlFxuICogem9kIOyngeugrO2ZlCDsgrDrrLwob2JqZWN0IHJvb3QsIGRyYWZ0LTA3IOu2gOu2hOynke2VqSnsnbTrnbwg7J20IOygleuPhCDsp4Dsm5DsnbTrqbQg7Lap67aE7ZWY6rOgLFxuICog66qo66W064qUIO2CpOybjOuTnOuKlCB1bmtub3duIOycvOuhnCDsoJHslrQg7KCI64yAIOuNmOyngOyngCDslYrripTri6QuXG4gKi9cblxudHlwZSBTY2hlbWFOb2RlID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbi8qKiBUUy96b2Qg7ZGc7IucIOy9lOuTnCDqs7Xsmqkg7Iud67OE7J6QIO2MkOuzhCDigJQgem9kLWNvZGUtZm9ybWF0IOydmCDtgqQgdW5xdW90ZSDrj4Qg7J206rG4IOyTtOuLpC4gKi9cbmV4cG9ydCBjb25zdCBJREVOVF9TT1VSQ0UgPSBcIltBLVphLXpfJF1bXFxcXHckXSpcIjtcbmNvbnN0IElERU5UX1JFID0gbmV3IFJlZ0V4cChgXiR7SURFTlRfU09VUkNFfSRgKTtcblxuZnVuY3Rpb24gcmVuZGVyS2V5KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIElERU5UX1JFLnRlc3Qoa2V5KSA/IGtleSA6IEpTT04uc3RyaW5naWZ5KGtleSk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclByaW1pdGl2ZSh0eXBlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGUgPT09IFwic3RyaW5nXCIpIHJldHVybiBcInN0cmluZ1wiO1xuICBpZiAodHlwZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlID09PSBcImludGVnZXJcIikgcmV0dXJuIFwibnVtYmVyXCI7XG4gIGlmICh0eXBlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIFwiYm9vbGVhblwiO1xuICBpZiAodHlwZSA9PT0gXCJudWxsXCIpIHJldHVybiBcIm51bGxcIjtcbiAgcmV0dXJuIFwidW5rbm93blwiO1xufVxuXG5mdW5jdGlvbiByZW5kZXJab2RQcmltaXRpdmUodHlwZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh0eXBlID09PSBcInN0cmluZ1wiKSByZXR1cm4gXCJ6LnN0cmluZygpXCI7XG4gIGlmICh0eXBlID09PSBcIm51bWJlclwiIHx8IHR5cGUgPT09IFwiaW50ZWdlclwiKSByZXR1cm4gXCJ6Lm51bWJlcigpXCI7XG4gIGlmICh0eXBlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIFwiei5ib29sZWFuKClcIjtcbiAgaWYgKHR5cGUgPT09IFwibnVsbFwiKSByZXR1cm4gXCJ6Lm51bGwoKVwiO1xuICByZXR1cm4gXCJ6LnVua25vd24oKVwiO1xufVxuXG5mdW5jdGlvbiByZW5kZXJab2RFbnVtKHZhbHVlczogdW5rbm93bltdLCBlbnVtVmFsdWVMaW1pdD86IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gXCJ6Lm5ldmVyKClcIjtcblxuICBjb25zdCB2aXNpYmxlVmFsdWVzID1cbiAgICBlbnVtVmFsdWVMaW1pdCA9PT0gdW5kZWZpbmVkID8gdmFsdWVzIDogdmFsdWVzLnNsaWNlKDAsIE1hdGgubWF4KDAsIGVudW1WYWx1ZUxpbWl0KSk7XG4gIGNvbnN0IG9taXR0ZWRDb3VudCA9IHZhbHVlcy5sZW5ndGggLSB2aXNpYmxlVmFsdWVzLmxlbmd0aDtcbiAgY29uc3Qgc3VmZml4ID0gb21pdHRlZENvdW50ID4gMCA/IGAgLyogKyR7b21pdHRlZENvdW50fSAqL2AgOiBcIlwiO1xuXG4gIGlmICh2YWx1ZXMuZXZlcnkoKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpKSB7XG4gICAgcmV0dXJuIGB6LmVudW0oWyR7dmlzaWJsZVZhbHVlcy5tYXAoKHZhbHVlKSA9PiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpLmpvaW4oXCIsIFwiKX0ke3N1ZmZpeH1dKWA7XG4gIH1cblxuICBjb25zdCBsaXRlcmFscyA9IHZpc2libGVWYWx1ZXMubWFwKCh2YWx1ZSkgPT4gYHoubGl0ZXJhbCgke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0pYCk7XG4gIGlmIChsaXRlcmFscy5sZW5ndGggPT09IDEgJiYgb21pdHRlZENvdW50ID09PSAwKSByZXR1cm4gbGl0ZXJhbHNbMF0gPz8gXCJ6Lm5ldmVyKClcIjtcbiAgcmV0dXJuIGB6LnVuaW9uKFske2xpdGVyYWxzLmpvaW4oXCIsIFwiKX0ke3N1ZmZpeH1dKWA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclpvZE5vZGUobm9kZTogdW5rbm93biwgZGVwdGg6IG51bWJlciwgZW51bVZhbHVlTGltaXQ/OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAobm9kZSA9PT0gdHJ1ZSkgcmV0dXJuIFwiei51bmtub3duKClcIjtcbiAgaWYgKCFub2RlIHx8IHR5cGVvZiBub2RlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobm9kZSkpIHJldHVybiBcInoudW5rbm93bigpXCI7XG4gIGNvbnN0IHNjaGVtYSA9IG5vZGUgYXMgU2NoZW1hTm9kZTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEuZW51bSkpIHJldHVybiByZW5kZXJab2RFbnVtKHNjaGVtYS5lbnVtLCBlbnVtVmFsdWVMaW1pdCk7XG4gIGlmIChzY2hlbWEuY29uc3QgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGB6LmxpdGVyYWwoJHtKU09OLnN0cmluZ2lmeShzY2hlbWEuY29uc3QpfSlgO1xuXG4gIGNvbnN0IHZhcmlhbnRzID0gKHNjaGVtYS5hbnlPZiA/PyBzY2hlbWEub25lT2YpIGFzIHVua25vd247XG4gIGlmIChBcnJheS5pc0FycmF5KHZhcmlhbnRzKSAmJiB2YXJpYW50cy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgcmVuZGVyZWQgPSBbXG4gICAgICAuLi5uZXcgU2V0KHZhcmlhbnRzLm1hcCgodmFyaWFudCkgPT4gcmVuZGVyWm9kTm9kZSh2YXJpYW50LCBkZXB0aCwgZW51bVZhbHVlTGltaXQpKSksXG4gICAgXTtcbiAgICByZXR1cm4gcmVuZGVyZWQubGVuZ3RoID09PSAxXG4gICAgICA/IChyZW5kZXJlZFswXSA/PyBcInoudW5rbm93bigpXCIpXG4gICAgICA6IGB6LnVuaW9uKFske3JlbmRlcmVkLmpvaW4oXCIsIFwiKX1dKWA7XG4gIH1cblxuICBjb25zdCB0eXBlID0gc2NoZW1hLnR5cGU7XG4gIGlmIChBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgY29uc3QgcmVuZGVyZWQgPSBbLi4ubmV3IFNldCh0eXBlLm1hcChyZW5kZXJab2RQcmltaXRpdmUpKV07XG4gICAgcmV0dXJuIHJlbmRlcmVkLmxlbmd0aCA9PT0gMVxuICAgICAgPyAocmVuZGVyZWRbMF0gPz8gXCJ6LnVua25vd24oKVwiKVxuICAgICAgOiBgei51bmlvbihbJHtyZW5kZXJlZC5qb2luKFwiLCBcIil9XSlgO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09IFwib2JqZWN0XCIgfHwgKHR5cGUgPT09IHVuZGVmaW5lZCAmJiBzY2hlbWEucHJvcGVydGllcykpIHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gKHNjaGVtYS5wcm9wZXJ0aWVzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCByZXF1aXJlZCA9IG5ldyBTZXQoQXJyYXkuaXNBcnJheShzY2hlbWEucmVxdWlyZWQpID8gKHNjaGVtYS5yZXF1aXJlZCBhcyBzdHJpbmdbXSkgOiBbXSk7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiei5vYmplY3Qoe30pXCI7XG4gICAgY29uc3Qgb3JkZXJlZEtleXMgPSBbXG4gICAgICAuLi5rZXlzLmZpbHRlcigoa2V5KSA9PiByZXF1aXJlZC5oYXMoa2V5KSksXG4gICAgICAuLi5rZXlzLmZpbHRlcigoa2V5KSA9PiAhcmVxdWlyZWQuaGFzKGtleSkpLFxuICAgIF07XG5cbiAgICBjb25zdCBpbm5lciA9IFwiICBcIi5yZXBlYXQoZGVwdGggKyAxKTtcbiAgICBjb25zdCBsaW5lcyA9IG9yZGVyZWRLZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBwcm9wZXJ0eVNjaGVtYSA9IHByb3BlcnRpZXNba2V5XTtcbiAgICAgIGNvbnN0IHJlbmRlcmVkID0gcmVuZGVyWm9kTm9kZShwcm9wZXJ0eVNjaGVtYSwgZGVwdGggKyAxLCBlbnVtVmFsdWVMaW1pdCk7XG4gICAgICBjb25zdCBvcHRpb25hbCA9IHJlcXVpcmVkLmhhcyhrZXkpID8gcmVuZGVyZWQgOiBgJHtyZW5kZXJlZH0ub3B0aW9uYWwoKWA7XG4gICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPVxuICAgICAgICBwcm9wZXJ0eVNjaGVtYSAmJlxuICAgICAgICB0eXBlb2YgcHJvcGVydHlTY2hlbWEgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkocHJvcGVydHlTY2hlbWEpICYmXG4gICAgICAgIE9iamVjdC5oYXNPd24ocHJvcGVydHlTY2hlbWEsIFwiZGVmYXVsdFwiKVxuICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkoKHByb3BlcnR5U2NoZW1hIGFzIFNjaGVtYU5vZGUpLmRlZmF1bHQpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBkZWZhdWx0Q29tbWVudCA9IGRlZmF1bHRWYWx1ZSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGAgLy8gZGVmYXVsdD0ke2RlZmF1bHRWYWx1ZX1gO1xuICAgICAgcmV0dXJuIGAke2lubmVyfSR7cmVuZGVyS2V5KGtleSl9OiAke29wdGlvbmFsfSwke2RlZmF1bHRDb21tZW50fWA7XG4gICAgfSk7XG4gICAgcmV0dXJuIGB6Lm9iamVjdCh7XFxuJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcbiR7XCIgIFwiLnJlcGVhdChkZXB0aCl9fSlgO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09IFwiYXJyYXlcIikge1xuICAgIHJldHVybiBgei5hcnJheSgke3JlbmRlclpvZE5vZGUoc2NoZW1hLml0ZW1zLCBkZXB0aCwgZW51bVZhbHVlTGltaXQpfSlgO1xuICB9XG5cbiAgcmV0dXJuIHJlbmRlclpvZFByaW1pdGl2ZSh0eXBlKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyTm9kZShub2RlOiB1bmtub3duLCBkZXB0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKG5vZGUgPT09IHRydWUpIHJldHVybiBcInVua25vd25cIjtcbiAgaWYgKCFub2RlIHx8IHR5cGVvZiBub2RlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobm9kZSkpIHJldHVybiBcInVua25vd25cIjtcbiAgY29uc3Qgc2NoZW1hID0gbm9kZSBhcyBTY2hlbWFOb2RlO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYS5lbnVtKSkge1xuICAgIHJldHVybiBzY2hlbWEuZW51bS5tYXAoKHZhbHVlKSA9PiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpLmpvaW4oXCIgfCBcIik7XG4gIH1cbiAgaWYgKHNjaGVtYS5jb25zdCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc2NoZW1hLmNvbnN0KTtcblxuICBjb25zdCB2YXJpYW50cyA9IChzY2hlbWEuYW55T2YgPz8gc2NoZW1hLm9uZU9mKSBhcyB1bmtub3duO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YXJpYW50cykgJiYgdmFyaWFudHMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBbLi4ubmV3IFNldCh2YXJpYW50cy5tYXAoKHZhcmlhbnQpID0+IHJlbmRlck5vZGUodmFyaWFudCwgZGVwdGgpKSldLmpvaW4oXCIgfCBcIik7XG4gIH1cblxuICBjb25zdCB0eXBlID0gc2NoZW1hLnR5cGU7XG4gIGlmIChBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KHR5cGUubWFwKHJlbmRlclByaW1pdGl2ZSkpXS5qb2luKFwiIHwgXCIpO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09IFwib2JqZWN0XCIgfHwgKHR5cGUgPT09IHVuZGVmaW5lZCAmJiBzY2hlbWEucHJvcGVydGllcykpIHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gKHNjaGVtYS5wcm9wZXJ0aWVzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCByZXF1aXJlZCA9IG5ldyBTZXQoQXJyYXkuaXNBcnJheShzY2hlbWEucmVxdWlyZWQpID8gKHNjaGVtYS5yZXF1aXJlZCBhcyBzdHJpbmdbXSkgOiBbXSk7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiUmVjb3JkPHN0cmluZywgdW5rbm93bj5cIjtcbiAgICBjb25zdCBpbm5lciA9IFwiICBcIi5yZXBlYXQoZGVwdGggKyAxKTtcbiAgICBjb25zdCBsaW5lcyA9IGtleXMubWFwKFxuICAgICAgKGtleSkgPT5cbiAgICAgICAgYCR7aW5uZXJ9JHtyZW5kZXJLZXkoa2V5KX0ke3JlcXVpcmVkLmhhcyhrZXkpID8gXCJcIiA6IFwiP1wifTogJHtyZW5kZXJOb2RlKHByb3BlcnRpZXNba2V5XSwgZGVwdGggKyAxKX1gLFxuICAgICk7XG4gICAgcmV0dXJuIGB7XFxuJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcbiR7XCIgIFwiLnJlcGVhdChkZXB0aCl9fWA7XG4gIH1cblxuICBpZiAodHlwZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgY29uc3QgaXRlbSA9IHJlbmRlck5vZGUoc2NoZW1hLml0ZW1zLCBkZXB0aCk7XG4gICAgLy8g7Jyg64uI7JioIOyalOyGjOuKlCDqtITtmLjqsIAg7JeG7Jy866m0IGBBIHwgQltdYCDroZwg7J6Y66q7IOydve2ejOuLpC5cbiAgICBpZiAoaXRlbS5pbmNsdWRlcyhcIiB8IFwiKSkgcmV0dXJuIGAoJHtpdGVtfSlbXWA7XG4gICAgcmV0dXJuIGAke2l0ZW19W11gO1xuICB9XG5cbiAgcmV0dXJuIHJlbmRlclByaW1pdGl2ZSh0eXBlKTtcbn1cblxuLyoqIOydtOuvuCDtjIzsi7HrkJwg7Iqk7YKk66eIIOqwkuyaqSDigJQg7Zi47Lac67aA6rCAIOqwmeydgCBKU09OIOydhCDrkZAg67KIIO2MjOyLse2VmOyngCDslYrqsowg7ZWc64ukLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclBhcnNlZEpzb25TY2hlbWFUeXBlVGV4dChzY2hlbWE6IHVua25vd24sIG5hbWUgPSBcIlJlc3BvbnNlXCIpOiBzdHJpbmcge1xuICByZXR1cm4gYHR5cGUgJHtuYW1lfSA9ICR7cmVuZGVyTm9kZShzY2hlbWEsIDApfWA7XG59XG5cbi8qKiBUb29sIGlucHV0IOqzhOyVveyaqSDtkZzsi5wg7KCE7JqpIFpvZCBzaGFwZS4g6rKA7KadIOygnOyVveydgCDsnZjrj4TsoIHsnLzroZwg7IOd65617ZWc64ukLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckpzb25TY2hlbWFab2RTaGFwZVRleHQoc2NoZW1hOiB1bmtub3duLCBlbnVtVmFsdWVMaW1pdD86IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiByZW5kZXJab2ROb2RlKHNjaGVtYSwgMCwgZW51bVZhbHVlTGltaXQpO1xufVxuXG4vKiog7Iuk7YyoKO2MjOyLsSDrtojqsIAg65OxKSDsi5wgbnVsbCDigJQg7Zi47Lac67aA6rCAIO2RnOyLnCDsnpDssrTrpbwg7IOd65617ZWc64ukLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckpzb25TY2hlbWFUeXBlVGV4dChzY2hlbWFKc29uOiBzdHJpbmcsIG5hbWUgPSBcIlJlc3BvbnNlXCIpOiBzdHJpbmcgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVuZGVyUGFyc2VkSnNvblNjaGVtYVR5cGVUZXh0KEpTT04ucGFyc2Uoc2NoZW1hSnNvbikgYXMgdW5rbm93biwgbmFtZSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBWUEsTUFBYSxlQUFlO0FBQzVCLE1BQU0sV0FBVyxJQUFJLE9BQU8sSUFBSSxhQUFhLEVBQUU7QUFFL0MsU0FBUyxVQUFVLEtBQXFCO0NBQ3RDLE9BQU8sU0FBUyxLQUFLLEdBQUcsSUFBSSxNQUFNLEtBQUssVUFBVSxHQUFHO0FBQ3REO0FBRUEsU0FBUyxnQkFBZ0IsTUFBdUI7Q0FDOUMsSUFBSSxTQUFTLFVBQVUsT0FBTztDQUM5QixJQUFJLFNBQVMsWUFBWSxTQUFTLFdBQVcsT0FBTztDQUNwRCxJQUFJLFNBQVMsV0FBVyxPQUFPO0NBQy9CLElBQUksU0FBUyxRQUFRLE9BQU87Q0FDNUIsT0FBTztBQUNUO0FBRUEsU0FBUyxtQkFBbUIsTUFBdUI7Q0FDakQsSUFBSSxTQUFTLFVBQVUsT0FBTztDQUM5QixJQUFJLFNBQVMsWUFBWSxTQUFTLFdBQVcsT0FBTztDQUNwRCxJQUFJLFNBQVMsV0FBVyxPQUFPO0NBQy9CLElBQUksU0FBUyxRQUFRLE9BQU87Q0FDNUIsT0FBTztBQUNUO0FBRUEsU0FBUyxjQUFjLFFBQW1CLGdCQUFpQztDQUN6RSxJQUFJLE9BQU8sV0FBVyxHQUFHLE9BQU87Q0FFaEMsTUFBTSxnQkFDSixtQkFBbUIsU0FBWSxTQUFTLE9BQU8sTUFBTSxHQUFHLEtBQUssSUFBSSxHQUFH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
|
|
128
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbi1zY2hlbWEtdHlwZS10ZXh0LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHBsaWNhdGlvbi9yZXF1ZXN0LWxvZy9qc29uLXNjaGVtYS10eXBlLXRleHQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBKU09OIFNjaGVtYSDihpIg6rCE6rKw7ZWcIFR5cGVTY3JpcHQgYHR5cGVgIOyEoOyWuCDthY3siqTtirguXG4gKlxuICog65287J2067iM65+s66asKGpzb24tc2NoZW1hLXRvLXR5cGVzY3JpcHQg6rOE7Je0KeuKlCBpbnRlcmZhY2UgKyBtYXhJdGVtcyDtipztlIwg7Jyg64uI7JioIOuTsVxuICog7J6l7Zmp7ZWcIOy2nOugpeydhCDrgrTshJwgZGV0YWlsIO2ZlOuptCDsmpTslb3smqnsnLzroZwg67aA7KCB7ZWp7ZWY64ukLiBxZ3JpZCDqsIAg67Cb64qUIOyKpO2CpOuniOuKlFxuICogem9kIOyngeugrO2ZlCDsgrDrrLwob2JqZWN0IHJvb3QsIGRyYWZ0LTA3IOu2gOu2hOynke2VqSnsnbTrnbwg7J20IOygleuPhCDsp4Dsm5DsnbTrqbQg7Lap67aE7ZWY6rOgLFxuICog66qo66W064qUIO2CpOybjOuTnOuKlCB1bmtub3duIOycvOuhnCDsoJHslrQg7KCI64yAIOuNmOyngOyngCDslYrripTri6QuXG4gKi9cblxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHtcbiAgaXNKc29uT2JqZWN0LFxuICB0eXBlIEpzb25PYmplY3QsXG4gIHR5cGUgSnNvblZhbHVlLFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9wcm92aWRlci10eXBlc1wiO1xuXG4vKiogVFMvem9kIO2RnOyLnCDsvZTrk5wg6rO17JqpIOyLneuzhOyekCDtjJDrs4Qg4oCUIHpvZC1jb2RlLWZvcm1hdCDsnZgg7YKkIHVucXVvdGUg64+EIOydtOqxuCDsk7Tri6QuICovXG5leHBvcnQgY29uc3QgSURFTlRfU09VUkNFID0gXCJbQS1aYS16XyRdW1xcXFx3JF0qXCI7XG5jb25zdCBJREVOVF9SRSA9IG5ldyBSZWdFeHAoYF4ke0lERU5UX1NPVVJDRX0kYCk7XG5cbmZ1bmN0aW9uIHJlbmRlcktleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBJREVOVF9SRS50ZXN0KGtleSkgPyBrZXkgOiBKU09OLnN0cmluZ2lmeShrZXkpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJQcmltaXRpdmUodHlwZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgaWYgKHR5cGUgPT09IFwic3RyaW5nXCIpIHJldHVybiBcInN0cmluZ1wiO1xuXG4gIGlmICh0eXBlID09PSBcIm51bWJlclwiIHx8IHR5cGUgPT09IFwiaW50ZWdlclwiKSByZXR1cm4gXCJudW1iZXJcIjtcblxuICBpZiAodHlwZSA9PT0gXCJib29sZWFuXCIpIHJldHVybiBcImJvb2xlYW5cIjtcblxuICBpZiAodHlwZSA9PT0gXCJudWxsXCIpIHJldHVybiBcIm51bGxcIjtcblxuICByZXR1cm4gXCJ1bmtub3duXCI7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclpvZFByaW1pdGl2ZSh0eXBlOiBKc29uVmFsdWUgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBpZiAodHlwZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIFwiei5zdHJpbmcoKVwiO1xuXG4gIGlmICh0eXBlID09PSBcIm51bWJlclwiIHx8IHR5cGUgPT09IFwiaW50ZWdlclwiKSByZXR1cm4gXCJ6Lm51bWJlcigpXCI7XG5cbiAgaWYgKHR5cGUgPT09IFwiYm9vbGVhblwiKSByZXR1cm4gXCJ6LmJvb2xlYW4oKVwiO1xuXG4gIGlmICh0eXBlID09PSBcIm51bGxcIikgcmV0dXJuIFwiei5udWxsKClcIjtcblxuICByZXR1cm4gXCJ6LnVua25vd24oKVwiO1xufVxuXG5mdW5jdGlvbiByZW5kZXJab2RFbnVtKHZhbHVlczogSnNvblZhbHVlW10sIGVudW1WYWx1ZUxpbWl0PzogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHJldHVybiBcInoubmV2ZXIoKVwiO1xuXG4gIGNvbnN0IHZpc2libGVWYWx1ZXMgPVxuICAgIGVudW1WYWx1ZUxpbWl0ID09PSB1bmRlZmluZWQgPyB2YWx1ZXMgOiB2YWx1ZXMuc2xpY2UoMCwgTWF0aC5tYXgoMCwgZW51bVZhbHVlTGltaXQpKTtcblxuICBjb25zdCBvbWl0dGVkQ291bnQgPSB2YWx1ZXMubGVuZ3RoIC0gdmlzaWJsZVZhbHVlcy5sZW5ndGg7XG4gIGNvbnN0IHN1ZmZpeCA9IG9taXR0ZWRDb3VudCA+IDAgPyBgIC8qICske29taXR0ZWRDb3VudH0gKi9gIDogXCJcIjtcblxuICBpZiAodmFsdWVzLmV2ZXJ5KCh2YWx1ZSkgPT4gei5zdHJpbmcoKS5zYWZlUGFyc2UodmFsdWUpLnN1Y2Nlc3MpKSB7XG4gICAgcmV0dXJuIGB6LmVudW0oWyR7dmlzaWJsZVZhbHVlcy5tYXAoKHZhbHVlKSA9PiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpLmpvaW4oXCIsIFwiKX0ke3N1ZmZpeH1dKWA7XG4gIH1cblxuICBjb25zdCBsaXRlcmFscyA9IHZpc2libGVWYWx1ZXMubWFwKCh2YWx1ZSkgPT4gYHoubGl0ZXJhbCgke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0pYCk7XG5cbiAgaWYgKGxpdGVyYWxzLmxlbmd0aCA9PT0gMSAmJiBvbWl0dGVkQ291bnQgPT09IDApIHJldHVybiBsaXRlcmFsc1swXSA/PyBcInoubmV2ZXIoKVwiO1xuXG4gIHJldHVybiBgei51bmlvbihbJHtsaXRlcmFscy5qb2luKFwiLCBcIil9JHtzdWZmaXh9XSlgO1xufVxuXG5mdW5jdGlvbiBzY2hlbWFQcm9wZXJ0aWVzKHNjaGVtYTogSnNvbk9iamVjdCk6IEpzb25PYmplY3Qge1xuICByZXR1cm4gaXNKc29uT2JqZWN0KHNjaGVtYS5wcm9wZXJ0aWVzKSA/IHNjaGVtYS5wcm9wZXJ0aWVzIDoge307XG59XG5cbmZ1bmN0aW9uIHJlcXVpcmVkS2V5cyhzY2hlbWE6IEpzb25PYmplY3QpOiBTZXQ8c3RyaW5nPiB7XG4gIGNvbnN0IHJlcXVpcmVkID0gc2NoZW1hLnJlcXVpcmVkO1xuXG4gIHJldHVybiBuZXcgU2V0KFxuICAgIEFycmF5LmlzQXJyYXkocmVxdWlyZWQpID8gcmVxdWlyZWQuZmxhdE1hcCgoa2V5KSA9PiB6LnN0cmluZygpLnNhZmVQYXJzZShrZXkpLmRhdGEgPz8gW10pIDogW10sXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclpvZE5vZGUoXG4gIG5vZGU6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCxcbiAgZGVwdGg6IG51bWJlcixcbiAgZW51bVZhbHVlTGltaXQ/OiBudW1iZXIsXG4pOiBzdHJpbmcge1xuICBpZiAobm9kZSA9PT0gdHJ1ZSkgcmV0dXJuIFwiei51bmtub3duKClcIjtcblxuICBpZiAoIWlzSnNvbk9iamVjdChub2RlKSkgcmV0dXJuIFwiei51bmtub3duKClcIjtcbiAgY29uc3Qgc2NoZW1hID0gbm9kZTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEuZW51bSkpIHJldHVybiByZW5kZXJab2RFbnVtKHNjaGVtYS5lbnVtLCBlbnVtVmFsdWVMaW1pdCk7XG5cbiAgaWYgKHNjaGVtYS5jb25zdCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYHoubGl0ZXJhbCgke0pTT04uc3RyaW5naWZ5KHNjaGVtYS5jb25zdCl9KWA7XG5cbiAgY29uc3QgdmFyaWFudHMgPSBzY2hlbWEuYW55T2YgPz8gc2NoZW1hLm9uZU9mO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhcmlhbnRzKSAmJiB2YXJpYW50cy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgcmVuZGVyZWQgPSBbXG4gICAgICAuLi5uZXcgU2V0KHZhcmlhbnRzLm1hcCgodmFyaWFudCkgPT4gcmVuZGVyWm9kTm9kZSh2YXJpYW50LCBkZXB0aCwgZW51bVZhbHVlTGltaXQpKSksXG4gICAgXTtcblxuICAgIHJldHVybiByZW5kZXJlZC5sZW5ndGggPT09IDFcbiAgICAgID8gKHJlbmRlcmVkWzBdID8/IFwiei51bmtub3duKClcIilcbiAgICAgIDogYHoudW5pb24oWyR7cmVuZGVyZWQuam9pbihcIiwgXCIpfV0pYDtcbiAgfVxuXG4gIGNvbnN0IHR5cGUgPSBzY2hlbWEudHlwZTtcblxuICBpZiAoQXJyYXkuaXNBcnJheSh0eXBlKSkge1xuICAgIGNvbnN0IHJlbmRlcmVkID0gWy4uLm5ldyBTZXQodHlwZS5tYXAocmVuZGVyWm9kUHJpbWl0aXZlKSldO1xuXG4gICAgcmV0dXJuIHJlbmRlcmVkLmxlbmd0aCA9PT0gMVxuICAgICAgPyAocmVuZGVyZWRbMF0gPz8gXCJ6LnVua25vd24oKVwiKVxuICAgICAgOiBgei51bmlvbihbJHtyZW5kZXJlZC5qb2luKFwiLCBcIil9XSlgO1xuICB9XG5cbiAgaWYgKHR5cGUgPT09IFwib2JqZWN0XCIgfHwgKHR5cGUgPT09IHVuZGVmaW5lZCAmJiBzY2hlbWEucHJvcGVydGllcykpIHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gc2NoZW1hUHJvcGVydGllcyhzY2hlbWEpO1xuICAgIGNvbnN0IHJlcXVpcmVkID0gcmVxdWlyZWRLZXlzKHNjaGVtYSk7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnRpZXMpO1xuXG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSByZXR1cm4gXCJ6Lm9iamVjdCh7fSlcIjtcblxuICAgIGNvbnN0IG9yZGVyZWRLZXlzID0gW1xuICAgICAgLi4ua2V5cy5maWx0ZXIoKGtleSkgPT4gcmVxdWlyZWQuaGFzKGtleSkpLFxuICAgICAgLi4ua2V5cy5maWx0ZXIoKGtleSkgPT4gIXJlcXVpcmVkLmhhcyhrZXkpKSxcbiAgICBdO1xuXG4gICAgY29uc3QgaW5uZXIgPSBcIiAgXCIucmVwZWF0KGRlcHRoICsgMSk7XG5cbiAgICBjb25zdCBsaW5lcyA9IG9yZGVyZWRLZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBwcm9wZXJ0eVNjaGVtYSA9IHByb3BlcnRpZXNba2V5XTtcbiAgICAgIGNvbnN0IHJlbmRlcmVkID0gcmVuZGVyWm9kTm9kZShwcm9wZXJ0eVNjaGVtYSwgZGVwdGggKyAxLCBlbnVtVmFsdWVMaW1pdCk7XG4gICAgICBjb25zdCBvcHRpb25hbCA9IHJlcXVpcmVkLmhhcyhrZXkpID8gcmVuZGVyZWQgOiBgJHtyZW5kZXJlZH0ub3B0aW9uYWwoKWA7XG5cbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9XG4gICAgICAgIGlzSnNvbk9iamVjdChwcm9wZXJ0eVNjaGVtYSkgJiYgT2JqZWN0Lmhhc093bihwcm9wZXJ0eVNjaGVtYSwgXCJkZWZhdWx0XCIpXG4gICAgICAgICAgPyBKU09OLnN0cmluZ2lmeShwcm9wZXJ0eVNjaGVtYS5kZWZhdWx0KVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBkZWZhdWx0Q29tbWVudCA9IGRlZmF1bHRWYWx1ZSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGAgLy8gZGVmYXVsdD0ke2RlZmF1bHRWYWx1ZX1gO1xuXG4gICAgICByZXR1cm4gYCR7aW5uZXJ9JHtyZW5kZXJLZXkoa2V5KX06ICR7b3B0aW9uYWx9LCR7ZGVmYXVsdENvbW1lbnR9YDtcbiAgICB9KTtcblxuICAgIHJldHVybiBgei5vYmplY3Qoe1xcbiR7bGluZXMuam9pbihcIlxcblwiKX1cXG4ke1wiICBcIi5yZXBlYXQoZGVwdGgpfX0pYDtcbiAgfVxuXG4gIGlmICh0eXBlID09PSBcImFycmF5XCIpIHtcbiAgICByZXR1cm4gYHouYXJyYXkoJHtyZW5kZXJab2ROb2RlKHNjaGVtYS5pdGVtcywgZGVwdGgsIGVudW1WYWx1ZUxpbWl0KX0pYDtcbiAgfVxuXG4gIHJldHVybiByZW5kZXJab2RQcmltaXRpdmUodHlwZSk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlck5vZGUobm9kZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkLCBkZXB0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKG5vZGUgPT09IHRydWUpIHJldHVybiBcInVua25vd25cIjtcblxuICBpZiAoIWlzSnNvbk9iamVjdChub2RlKSkgcmV0dXJuIFwidW5rbm93blwiO1xuICBjb25zdCBzY2hlbWEgPSBub2RlO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYS5lbnVtKSkge1xuICAgIHJldHVybiBzY2hlbWEuZW51bS5tYXAoKHZhbHVlKSA9PiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpLmpvaW4oXCIgfCBcIik7XG4gIH1cblxuICBpZiAoc2NoZW1hLmNvbnN0ICE9PSB1bmRlZmluZWQpIHJldHVybiBKU09OLnN0cmluZ2lmeShzY2hlbWEuY29uc3QpO1xuXG4gIGNvbnN0IHZhcmlhbnRzID0gc2NoZW1hLmFueU9mID8/IHNjaGVtYS5vbmVPZjtcblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YXJpYW50cykgJiYgdmFyaWFudHMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBbLi4ubmV3IFNldCh2YXJpYW50cy5tYXAoKHZhcmlhbnQpID0+IHJlbmRlck5vZGUodmFyaWFudCwgZGVwdGgpKSldLmpvaW4oXCIgfCBcIik7XG4gIH1cblxuICBjb25zdCB0eXBlID0gc2NoZW1hLnR5cGU7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodHlwZSkpIHtcbiAgICByZXR1cm4gWy4uLm5ldyBTZXQodHlwZS5tYXAocmVuZGVyUHJpbWl0aXZlKSldLmpvaW4oXCIgfCBcIik7XG4gIH1cblxuICBpZiAodHlwZSA9PT0gXCJvYmplY3RcIiB8fCAodHlwZSA9PT0gdW5kZWZpbmVkICYmIHNjaGVtYS5wcm9wZXJ0aWVzKSkge1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSBzY2hlbWFQcm9wZXJ0aWVzKHNjaGVtYSk7XG4gICAgY29uc3QgcmVxdWlyZWQgPSByZXF1aXJlZEtleXMoc2NoZW1hKTtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocHJvcGVydGllcyk7XG5cbiAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHJldHVybiBcIlJlY29yZDxzdHJpbmcsIHVua25vd24+XCI7XG4gICAgY29uc3QgaW5uZXIgPSBcIiAgXCIucmVwZWF0KGRlcHRoICsgMSk7XG5cbiAgICBjb25zdCBsaW5lcyA9IGtleXMubWFwKFxuICAgICAgKGtleSkgPT5cbiAgICAgICAgYCR7aW5uZXJ9JHtyZW5kZXJLZXkoa2V5KX0ke3JlcXVpcmVkLmhhcyhrZXkpID8gXCJcIiA6IFwiP1wifTogJHtyZW5kZXJOb2RlKHByb3BlcnRpZXNba2V5XSwgZGVwdGggKyAxKX1gLFxuICAgICk7XG5cbiAgICByZXR1cm4gYHtcXG4ke2xpbmVzLmpvaW4oXCJcXG5cIil9XFxuJHtcIiAgXCIucmVwZWF0KGRlcHRoKX19YDtcbiAgfVxuXG4gIGlmICh0eXBlID09PSBcImFycmF5XCIpIHtcbiAgICBjb25zdCBpdGVtID0gcmVuZGVyTm9kZShzY2hlbWEuaXRlbXMsIGRlcHRoKTtcblxuICAgIC8vIOycoOuLiOyYqCDsmpTshozripQg6rSE7Zi46rCAIOyXhuycvOuptCBgQSB8IEJbXWAg66GcIOyemOuquyDsnb3tnozri6QuXG4gICAgaWYgKGl0ZW0uaW5jbHVkZXMoXCIgfCBcIikpIHJldHVybiBgKCR7aXRlbX0pW11gO1xuXG4gICAgcmV0dXJuIGAke2l0ZW19W11gO1xuICB9XG5cbiAgcmV0dXJuIHJlbmRlclByaW1pdGl2ZSh0eXBlKTtcbn1cblxuLyoqIOydtOuvuCDtjIzsi7HrkJwg7Iqk7YKk66eIIOqwkuyaqSDigJQg7Zi47Lac67aA6rCAIOqwmeydgCBKU09OIOydhCDrkZAg67KIIO2MjOyLse2VmOyngCDslYrqsowg7ZWc64ukLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclBhcnNlZEpzb25TY2hlbWFUeXBlVGV4dChzY2hlbWE6IEpzb25WYWx1ZSwgbmFtZSA9IFwiUmVzcG9uc2VcIik6IHN0cmluZyB7XG4gIHJldHVybiBgdHlwZSAke25hbWV9ID0gJHtyZW5kZXJOb2RlKHNjaGVtYSwgMCl9YDtcbn1cblxuLyoqIFRvb2wgaW5wdXQg6rOE7JW97JqpIO2RnOyLnCDsoITsmqkgWm9kIOy9lOuTnC4g6rKA7KadIOygnOyVveydgCDsnZjrj4TsoIHsnLzroZwg7IOd65617ZWc64ukLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckpzb25TY2hlbWFab2RUZXh0KHNjaGVtYTogSnNvblZhbHVlLCBlbnVtVmFsdWVMaW1pdD86IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiByZW5kZXJab2ROb2RlKHNjaGVtYSwgMCwgZW51bVZhbHVlTGltaXQpO1xufVxuXG4vKiog7Iuk7YyoKO2MjOyLsSDrtojqsIAg65OxKSDsi5wgbnVsbCDigJQg7Zi47Lac67aA6rCAIO2RnOyLnCDsnpDssrTrpbwg7IOd65617ZWc64ukLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckpzb25TY2hlbWFUeXBlVGV4dChzY2hlbWFKc29uOiBzdHJpbmcsIG5hbWUgPSBcIlJlc3BvbnNlXCIpOiBzdHJpbmcgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICAvLyBKU09OLnBhcnNlIHdpdGhvdXQgYSByZXZpdmVyIHlpZWxkcyBvbmx5IEpTT04gdmFsdWVzLlxuICAgIGNvbnN0IHNjaGVtYTogSnNvblZhbHVlID0gSlNPTi5wYXJzZShzY2hlbWFKc29uKTtcblxuICAgIHJldHVybiByZW5kZXJQYXJzZWRKc29uU2NoZW1hVHlwZVRleHQoc2NoZW1hLCBuYW1lKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBa0JBLE1BQWEsZUFBZTtBQUM1QixNQUFNLFdBQVcsSUFBSSxPQUFPLElBQUksYUFBYSxFQUFFO0FBRS9DLFNBQVMsVUFBVSxLQUFxQjtDQUN0QyxPQUFPLFNBQVMsS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLFVBQVUsR0FBRztBQUN0RDtBQUVBLFNBQVMsZ0JBQWdCLE1BQXFDO0NBQzVELElBQUksU0FBUyxVQUFVLE9BQU87Q0FFOUIsSUFBSSxTQUFTLFlBQVksU0FBUyxXQUFXLE9BQU87Q0FFcEQsSUFBSSxTQUFTLFdBQVcsT0FBTztD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
|