@cartanova/qgrid-cli 2.6.7 → 2.6.9
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/application/monit/monit.frame.js +2 -2
- package/bundle/dist/application/qgrid/expired-token-reminder.js +45 -15
- package/bundle/dist/application/qgrid/oauth.js +1 -1
- package/bundle/dist/application/qgrid/qgrid.frame.js +3 -3
- package/bundle/dist/application/qgrid/slack-user-map.js +5 -14
- package/bundle/dist/application/qgrid/token-death.js +3 -2
- package/bundle/dist/application/qgrid/tool-emulation.js +1 -1
- package/bundle/dist/application/queries.generated.js +8 -2
- package/bundle/dist/application/request-log/request-log.model.js +2 -2
- package/bundle/dist/application/request-log-step/request-log-step.model.js +1 -1
- package/bundle/dist/application/setting/setting.constant.js +226 -0
- package/bundle/dist/application/setting/setting.model.js +254 -0
- package/bundle/dist/application/setting/setting.store.js +66 -0
- package/bundle/dist/application/setting/setting.types.js +51 -0
- package/bundle/dist/application/sonamu.generated.js +32 -2
- package/bundle/dist/application/sonamu.generated.sso.js +12 -2
- package/bundle/dist/application/token/token.model.js +1 -1
- package/bundle/dist/i18n/en.js +3 -1
- package/bundle/dist/i18n/ko.js +3 -1
- package/bundle/dist/i18n/sd.generated.js +9 -1
- package/bundle/dist/migrations/20260808194708_create__settings.js +24 -0
- package/bundle/dist/sonamu.config.js +8 -2
- package/bundle/dist/utils/providers/openai/openai-worker-pool-config.js +21 -6
- package/bundle/dist/utils/quiet-hours.js +47 -0
- package/bundle/dist/utils/slack-notify.js +16 -5
- package/bundle/src/application/qgrid/expired-token-reminder.test.ts +147 -2
- package/bundle/src/application/qgrid/expired-token-reminder.ts +66 -16
- package/bundle/src/application/qgrid/slack-user-map.test.ts +23 -0
- package/bundle/src/application/qgrid/slack-user-map.ts +4 -14
- package/bundle/src/application/qgrid/token-death.ts +2 -0
- package/bundle/src/application/queries.generated.ts +21 -1
- package/bundle/src/application/setting/setting.constant.test.ts +109 -0
- package/bundle/src/application/setting/setting.constant.ts +250 -0
- package/bundle/src/application/setting/setting.entity.json +59 -0
- package/bundle/src/application/setting/setting.model.ts +277 -0
- package/bundle/src/application/setting/setting.store.test.ts +87 -0
- package/bundle/src/application/setting/setting.store.ts +85 -0
- package/bundle/src/application/setting/setting.types.ts +53 -0
- package/bundle/src/application/sonamu.generated.http +54 -0
- package/bundle/src/application/sonamu.generated.sso.ts +21 -0
- package/bundle/src/application/sonamu.generated.ts +51 -0
- package/bundle/src/i18n/en.ts +2 -0
- package/bundle/src/i18n/ko.ts +2 -0
- package/bundle/src/i18n/sd.generated.ts +8 -0
- package/bundle/src/migrations/20260808194708_create__settings.ts +19 -0
- package/bundle/src/sonamu.config.ts +12 -0
- package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +12 -0
- package/bundle/src/utils/providers/openai/openai-worker-pool-config.ts +43 -5
- package/bundle/src/utils/quiet-hours.ts +79 -0
- package/bundle/src/utils/slack-notify.test.ts +171 -20
- package/bundle/src/utils/slack-notify.ts +31 -4
- package/bundle/web-dist/client/assets/index-DnnliAzf.js +78 -0
- package/bundle/web-dist/client/assets/index-rdbxJinT.css +1 -0
- package/bundle/web-dist/client/assets/{logs-CUO9Q0UT.js → logs-5gACO5tJ.js} +1 -1
- package/bundle/web-dist/client/assets/{monit-Dy7UtqC2.js → monit-DRCc50GU.js} +1 -1
- package/bundle/web-dist/client/assets/plus-p4vtg6LN.js +1 -0
- package/bundle/web-dist/client/assets/{routes-B6gfQrph.js → routes-DBdI9Ba1.js} +2 -2
- package/bundle/web-dist/client/assets/{sd.generated-DYdwSB2I.js → sd.generated-Bwa7rses.js} +1 -1
- package/bundle/web-dist/client/assets/services.generated-BzwTuZRP.js +1 -0
- package/bundle/web-dist/client/assets/settings-B62_r1i4.js +1 -0
- package/bundle/web-dist/client/assets/{show-Bi0QYUVm.js → show-BCRrSc8-.js} +1 -1
- package/bundle/web-dist/client/assets/tokens-CDiXKYGf.js +1 -0
- package/bundle/web-dist/client/assets/{use-oauth-login-flow-Cx6BlvXM.js → use-oauth-login-flow-Qqg4koSg.js} +1 -1
- package/bundle/web-dist/client/index.html +3 -3
- package/bundle/web-dist/server/assets/{lazyRouteComponent-BaZaveNc.js → lazyRouteComponent-Ws7I6fL-.js} +2 -1
- package/bundle/web-dist/server/assets/{logs-DMOw3SjD.js → logs-C1rxLh8H.js} +4 -4
- package/bundle/web-dist/server/assets/{monit-UmcqHroX.js → monit-C8gx9Sar.js} +3 -2
- package/bundle/web-dist/server/assets/plus-BISXNqRU.js +19 -0
- package/bundle/web-dist/server/assets/react-dom-D7duWOwf.js +462 -0
- package/bundle/web-dist/server/assets/{routes-BfoQmYud.js → routes-ZW_Ih5Em.js} +11 -7
- package/bundle/web-dist/server/assets/{sd.generated-B0xqnHEo.js → sd.generated-LO-h1_16.js} +13 -461
- package/bundle/web-dist/server/assets/{services.generated-DqAKskAS.js → services.generated-CZIChgHV.js} +119 -2
- package/bundle/web-dist/server/assets/settings--aoatERH.js +382 -0
- package/bundle/web-dist/server/assets/{show-C-oSdzHX.js → show-BY27w9oi.js} +4 -4
- package/bundle/web-dist/server/assets/{tokens-Dkd_uXEk.js → tokens-DIObtTuZ.js} +17 -72
- package/bundle/web-dist/server/assets/{use-oauth-login-flow-YM1nsd-H.js → use-oauth-login-flow-V3k8PSqQ.js} +2 -2
- package/bundle/web-dist/server/entry-server.generated.js +54 -18
- package/package.json +1 -1
- package/skills/qgrid/references/cli-env-and-server-boot.md +17 -2
- package/skills/qgrid/references/openai-codex-runtime.md +1 -1
- package/skills/qgrid/references/sonamu-api-web-flow.md +2 -0
- package/skills/qgrid/references/token-auth-quota-lifecycle.md +2 -0
- package/bundle/web-dist/client/assets/index-B4GlN1IX.css +0 -1
- package/bundle/web-dist/client/assets/index-CV_rp3zE.js +0 -78
- package/bundle/web-dist/client/assets/services.generated-BsAvotjG.js +0 -1
- package/bundle/web-dist/client/assets/tokens-BAuYgBl6.js +0 -1
- /package/bundle/web-dist/server/assets/{cost-CSH_t17I.js → cost-DzjfVtUr.js} +0 -0
|
@@ -244,6 +244,14 @@ const entityLabels = {
|
|
|
244
244
|
"enum.RequestLogStepType.tool_call": "Tool 호출",
|
|
245
245
|
"enum.RequestLogStepOrderBy.id-asc": "ID순",
|
|
246
246
|
"enum.RequestLogStepSearchField.id": "ID",
|
|
247
|
+
"entity.Setting": "Setting",
|
|
248
|
+
"entity.Setting.id": "ID",
|
|
249
|
+
"entity.Setting.created_at": "등록일시",
|
|
250
|
+
"entity.Setting.key": "설정 키 (예: openai.maxWorkersPerToken)",
|
|
251
|
+
"entity.Setting.value": "설정 값 (문자열 저장, 앱에서 파싱·검증)",
|
|
252
|
+
"entity.Setting.updated_at": "최종 수정일시",
|
|
253
|
+
"enum.SettingOrderBy.key-asc": "키순",
|
|
254
|
+
"enum.SettingSearchField.key": "키",
|
|
247
255
|
"entity.Token": "Token",
|
|
248
256
|
"entity.Token.id": "ID",
|
|
249
257
|
"entity.Token.created_at": "등록일시",
|
|
@@ -377,4 +385,4 @@ SD.enumLabels = (enumName) => {
|
|
|
377
385
|
//#endregion
|
|
378
386
|
export { SD, defineLocale, localizedColumn };
|
|
379
387
|
|
|
380
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2QuZ2VuZXJhdGVkLmpzIiwibmFtZXMiOlsia28iLCJlbiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pMThuL3NkLmdlbmVyYXRlZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBnZW5lcmF0ZWRcbiAqIOyngeygkSDsiJjsoJXtlZjsp4Ag66eI7IS47JqULlxuICovXG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCJzb25hbXVcIjtcblxuY29uc3QgREVGQVVMVF9MT0NBTEUgPSBcImtvXCIgYXMgY29uc3Q7XG5jb25zdCBTVVBQT1JURURfTE9DQUxFUyA9IFtcImtvXCIsIFwiZW5cIl0gYXMgY29uc3Q7XG5mdW5jdGlvbiBnZXRDdXJyZW50TG9jYWxlKCk6ICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0ge1xuICB0cnkge1xuICAgIGNvbnN0IGN0eCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgcmV0dXJuIChjdHgubG9jYWxlIGFzICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0pID8/IERFRkFVTFRfTE9DQUxFO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gREVGQVVMVF9MT0NBTEU7XG4gIH1cbn1cblxuaW1wb3J0IGVuIGZyb20gXCIuL2VuXCI7XG5pbXBvcnQga28gZnJvbSBcIi4va29cIjtcblxuLy8gcmVhY3QtY29tcG9uZW50cyBpMThuIGtleXNcbmNvbnN0IHJjS2V5c0tvID0ge1xuICAvLyBBc3luY1NlbGVjdCBDb21wb25lbnRcbiAgXCJyYy5hc3luY1NlbGVjdC5sb2FkaW5nXCI6IFwi66Gc65SpIOykkS4uLlwiLFxuICBcInJjLmFzeW5jU2VsZWN0Lm5vT3B0aW9uc1wiOiBcIuyYteyFmOydtCDsl4bsirXri4jri6RcIixcbiAgXCJyYy5hc3luY1NlbGVjdC5ub1Jlc3VsdHNcIjogXCLqsoDsg4kg6rKw6rO86rCAIOyXhuyKteuLiOuLpFwiLFxuICBcInJjLmFzeW5jU2VsZWN0LnNlbGVjdFBsYWNlaG9sZGVyXCI6IFwi7ISg7YOd7ZWY7IS47JqULi4uXCIsXG5cbiAgLy8gQ29tYm9ib3ggQ29tcG9uZW50XG4gIFwicmMuY29tYm9ib3gubm9SZXN1bHRzXCI6IFwi6rKA7IOJIOqysOqzvOqwgCDsl4bsirXri4jri6RcIixcbiAgXCJyYy5jb21ib2JveC5zZWxlY3RQbGFjZWhvbGRlclwiOiBcIuyEoO2Dne2VmOyEuOyalC4uLlwiLFxuXG4gIC8vIERhdGVQaWNrZXIgQ29tcG9uZW50XG4gIFwicmMuZGF0ZVBpY2tlci5waWNrRGF0ZVwiOiBcIuuCoOynnCDshKDtg51cIixcbiAgXCJyYy5kYXRlUGlja2VyLnBsYWNlaG9sZGVyXCI6IFwi64Kg7KecIOyEoO2DnVwiLFxuICBcInJjLmRhdGVQaWNrZXIuc2VsZWN0RGF0ZVwiOiBcIuuCoOynnCDshKDtg51cIixcblxuICAvLyBEYXRlU2VsZWN0b3JNdWx0aXBsZSBDb21wb25lbnRcbiAgXCJyYy5kYXRlU2VsZWN0b3JNdWx0aXBsZS5hZGREYXRlXCI6IFwi64Kg7KecIOy2lOqwgFwiLFxuICBcInJjLmRhdGVTZWxlY3Rvck11bHRpcGxlLmRhdGVSYW5nZVwiOiBcIuq4sOqwhFwiLFxuICBcInJjLmRhdGVTZWxlY3Rvck11bHRpcGxlLnBsYWNlaG9sZGVyXCI6IFwi64Kg7KecIOyEoO2DnVwiLFxuICBcInJjLmRhdGVTZWxlY3Rvck11bHRpcGxlLnNpbmdsZURhdGVcIjogXCLri6jsnbxcIixcblxuICAvLyBGaWxlSW5wdXQgQ29tcG9uZW50XG4gIFwicmMuZmlsZUlucHV0LmJyb3dzZUZpbGVzXCI6IFwi7YyM7J28IOywvuq4sFwiLFxuICBcInJjLmZpbGVJbnB1dC5kcm9wWm9uZVwiOiBcIu2MjOydvOydhCDrk5zrnpjqt7jtlZjqsbDrgpgg7YG066at7ZWY7JesIOyXheuhnOuTnFwiLFxuICBcInJjLmZpbGVJbnB1dC5maWxlUGxhY2Vob2xkZXJcIjogXCLtjIzsnbxcIixcbiAgXCJyYy5maWxlSW5wdXQuaW1hZ2VQbGFjZWhvbGRlclwiOiBcIuydtOuvuOyngFwiLFxuICBcInJjLmZpbGVJbnB1dC5tYXhGaWxlc0V4Y2VlZGVkXCI6IChtYXhGaWxlczogbnVtYmVyKSA9PlxuICAgIGDstZzrjIAgJHttYXhGaWxlc33qsJwg7YyM7J2866eMIOyXheuhnOuTnCDqsIDriqXtlanri4jri6RgLFxuICBcInJjLmZpbGVJbnB1dC5wZW5kaW5nXCI6IFwi64yA6riwIOykkVwiLFxuICBcInJjLmZpbGVJbnB1dC5yZW1vdmVcIjogXCLsoJzqsbBcIixcbiAgXCJyYy5maWxlSW5wdXQudXBsb2FkRmFpbGVkXCI6IFwi7JeF66Gc65OcIOyLpO2MqFwiLFxuICBcInJjLmZpbGVJbnB1dC51cGxvYWRpbmdcIjogXCLsl4XroZzrk5wg7KSRLi4uXCIsXG5cbiAgLy8gTW9udGhQaWNrZXJNdWx0aXBsZSBDb21wb25lbnRcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLmFkZE1vbnRoXCI6IFwi7JuUIOy2lOqwgFwiLFxuICBcInJjLm1vbnRoUGlja2VyTXVsdGlwbGUuZGF0ZVJhbmdlXCI6IFwi6riw6rCEXCIsXG4gIFwicmMubW9udGhQaWNrZXJNdWx0aXBsZS5lbmREYXRlXCI6IFwi7KKF66OM7J28XCIsXG4gIFwicmMubW9udGhQaWNrZXJNdWx0aXBsZS5wbGFjZWhvbGRlclwiOiBcIuyblCDshKDtg51cIixcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLnNpbmdsZURhdGVcIjogXCLri6jsnbxcIixcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLnN0YXJ0RGF0ZVwiOiBcIuyLnOyekeydvFwiLFxuXG4gIC8vIE11bHRpU2VsZWN0IENvbXBvbmVudFxuICBcInJjLm11bHRpU2VsZWN0LmNsZWFyXCI6IFwi7KCE7LK0IO2VtOygnFwiLFxuICBcInJjLm11bHRpU2VsZWN0LmNsb3NlXCI6IFwi64ur6riwXCIsXG4gIFwicmMubXVsdGlTZWxlY3QubW9yZUl0ZW1zXCI6IChjb3VudDogbnVtYmVyKSA9PiBgKyR7Y291bnR96rCcIOuNlOuztOq4sGAsXG4gIFwicmMubXVsdGlTZWxlY3Qubm9PcHRpb25zXCI6IFwi7Ji17IWY7J20IOyXhuyKteuLiOuLpFwiLFxuICBcInJjLm11bHRpU2VsZWN0Lm5vT3B0aW9uc1NlbGVjdGVkXCI6IFwi7ISg7YOd65CcIOyYteyFmOydtCDsl4bsirXri4jri6RcIixcbiAgXCJyYy5tdWx0aVNlbGVjdC5ub1Jlc3VsdHNcIjogXCLqsoDsg4kg6rKw6rO86rCAIOyXhuyKteuLiOuLpFwiLFxuICBcInJjLm11bHRpU2VsZWN0Lm9wdGlvbnNDb3VudFwiOiAoY291bnQ6IG51bWJlcikgPT4gYCR7Y291bnR96rCcIOyYteyFmGAsXG4gIFwicmMubXVsdGlTZWxlY3Quc2VsZWN0QWxsXCI6IFwi7KCE7LK0IOyEoO2DnVwiLFxuICBcInJjLm11bHRpU2VsZWN0LnNlbGVjdFBsYWNlaG9sZGVyXCI6IFwi7ISg7YOd7ZWY7IS47JqULi4uXCIsXG5cbiAgLy8gUGFnaW5hdGlvbiBDb21wb25lbnRcbiAgXCJyYy5wYWdpbmF0aW9uLm5leHRcIjogXCLri6TsnYxcIixcbiAgXCJyYy5wYWdpbmF0aW9uLnByZXZpb3VzXCI6IFwi7J207KCEXCIsXG4gIFwicmMucGFnaW5hdGlvbi5zaG93aW5nXCI6IChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgdG90YWw6IG51bWJlcikgPT5cbiAgICBgJHt0b3RhbH3qsJwg7KSRICR7c3RhcnR9LSR7ZW5kfWAsXG5cbiAgLy8gQ2FsZW5kYXIgQ29tcG9uZW50XG4gIFwicmMuY2FsZW5kYXIubW9udGguMFwiOiBcIjHsm5RcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC4xXCI6IFwiMuyblFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjJcIjogXCIz7JuUXCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguM1wiOiBcIjTsm5RcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC40XCI6IFwiNeyblFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjVcIjogXCI27JuUXCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguNlwiOiBcIjfsm5RcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC43XCI6IFwiOOyblFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjhcIjogXCI57JuUXCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguOVwiOiBcIjEw7JuUXCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguMTBcIjogXCIxMeyblFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjExXCI6IFwiMTLsm5RcIixcblxuICAvLyBTb25hbXUgRmlsdGVyIENvbXBvbmVudFxuICBcInJjLnNvbmFtdUZpbHRlci50aXRsZVwiOiBcIuyGjOuCmOustCDtlYTthLBcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuYXBwbHlcIjogXCLsoIHsmqlcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIucmVzZXRcIjogXCLstIjquLDtmZRcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuYWRkUnVsZVwiOiBcIuq3nOy5mSDstpTqsIBcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIubm9SdWxlc1lldFwiOiAn7JWE7KeBIOq3nOy5meydtCDsl4bsirXri4jri6QuIFwiKyDqt5zsuZkg7LaU6rCAXCLrpbwg7YG066at7ZWY7JesIOyLnOyeke2VmOyEuOyalC4nLFxuICBcInJjLnNvbmFtdUZpbHRlci5zZWxlY3RGaWVsZFwiOiBcIu2VhOuTnCDshKDtg51cIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuc2VsZWN0T3BlcmF0b3JcIjogXCLsl7DsgrDsnpAg7ISg7YOdXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLnNlbGVjdE9wZXJhdG9yRmlyc3RcIjogXCLrqLzsoIAg7Jew7IKw7J6Q66W8IOyEoO2Dne2VmOyEuOyalFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5lbnRlclZhbHVlXCI6IFwi6rCSIOyeheugpVwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5lbnRlck51bWJlclwiOiBcIuyIq+yekCDsnoXroKVcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIubm90U3VwcG9ydGVkXCI6IFwi7KeA7JuQ7ZWY7KeAIOyViuydjFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5zdGFydERhdGVcIjogXCLsi5zsnpHsnbxcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuZW5kRGF0ZVwiOiBcIuyiheujjOydvFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5hcHBsaWVkRmlsdGVyc1wiOiBcIvCfjLIg7KCB7Jqp65CcIOyGjOuCmOustCDtlYTthLBcIixcblxuICAvLyBDb21tb25cbiAgXCJyYy5jb21tb24uY2FuY2VsXCI6IFwi7Leo7IaMXCIsXG4gIFwicmMuY29tbW9uLnNhdmVcIjogXCLsoIDsnqVcIixcbn07XG5cbmNvbnN0IHJjS2V5c0VuID0ge1xuICAvLyBBc3luY1NlbGVjdCBDb21wb25lbnRcbiAgXCJyYy5hc3luY1NlbGVjdC5sb2FkaW5nXCI6IFwiTG9hZGluZy4uLlwiLFxuICBcInJjLmFzeW5jU2VsZWN0Lm5vT3B0aW9uc1wiOiBcIk5vIG9wdGlvbnNcIixcbiAgXCJyYy5hc3luY1NlbGVjdC5ub1Jlc3VsdHNcIjogXCJObyByZXN1bHRzXCIsXG4gIFwicmMuYXN5bmNTZWxlY3Quc2VsZWN0UGxhY2Vob2xkZXJcIjogXCJTZWxlY3QuLi5cIixcblxuICAvLyBDb21ib2JveCBDb21wb25lbnRcbiAgXCJyYy5jb21ib2JveC5ub1Jlc3VsdHNcIjogXCJObyByZXN1bHRzXCIsXG4gIFwicmMuY29tYm9ib3guc2VsZWN0UGxhY2Vob2xkZXJcIjogXCJTZWxlY3QuLi5cIixcblxuICAvLyBEYXRlUGlja2VyIENvbXBvbmVudFxuICBcInJjLmRhdGVQaWNrZXIucGlja0RhdGVcIjogXCJQaWNrIGRhdGVcIixcbiAgXCJyYy5kYXRlUGlja2VyLnBsYWNlaG9sZGVyXCI6IFwiUGljayBkYXRlXCIsXG4gIFwicmMuZGF0ZVBpY2tlci5zZWxlY3REYXRlXCI6IFwiU2VsZWN0IGRhdGVcIixcblxuICAvLyBEYXRlU2VsZWN0b3JNdWx0aXBsZSBDb21wb25lbnRcbiAgXCJyYy5kYXRlU2VsZWN0b3JNdWx0aXBsZS5hZGREYXRlXCI6IFwiQWRkIGRhdGVcIixcbiAgXCJyYy5kYXRlU2VsZWN0b3JNdWx0aXBsZS5kYXRlUmFuZ2VcIjogXCJSYW5nZVwiLFxuICBcInJjLmRhdGVTZWxlY3Rvck11bHRpcGxlLnBsYWNlaG9sZGVyXCI6IFwiUGljayBkYXRlXCIsXG4gIFwicmMuZGF0ZVNlbGVjdG9yTXVsdGlwbGUuc2luZ2xlRGF0ZVwiOiBcIlNpbmdsZVwiLFxuXG4gIC8vIEZpbGVJbnB1dCBDb21wb25lbnRcbiAgXCJyYy5maWxlSW5wdXQuYnJvd3NlRmlsZXNcIjogXCJCcm93c2UgZmlsZXNcIixcbiAgXCJyYy5maWxlSW5wdXQuZHJvcFpvbmVcIjogXCJEcmFnIGZpbGVzIGhlcmUgb3IgY2xpY2sgdG8gdXBsb2FkXCIsXG4gIFwicmMuZmlsZUlucHV0LmZpbGVQbGFjZWhvbGRlclwiOiBcIkZpbGVcIixcbiAgXCJyYy5maWxlSW5wdXQuaW1hZ2VQbGFjZWhvbGRlclwiOiBcIkltYWdlXCIsXG4gIFwicmMuZmlsZUlucHV0Lm1heEZpbGVzRXhjZWVkZWRcIjogKG1heEZpbGVzOiBudW1iZXIpID0+IGBNYXhpbXVtICR7bWF4RmlsZXN9IGZpbGVzIGFsbG93ZWRgLFxuICBcInJjLmZpbGVJbnB1dC5wZW5kaW5nXCI6IFwiUGVuZGluZ1wiLFxuICBcInJjLmZpbGVJbnB1dC5yZW1vdmVcIjogXCJSZW1vdmVcIixcbiAgXCJyYy5maWxlSW5wdXQudXBsb2FkRmFpbGVkXCI6IFwiVXBsb2FkIGZhaWxlZFwiLFxuICBcInJjLmZpbGVJbnB1dC51cGxvYWRpbmdcIjogXCJVcGxvYWRpbmcuLi5cIixcblxuICAvLyBNb250aFBpY2tlck11bHRpcGxlIENvbXBvbmVudFxuICBcInJjLm1vbnRoUGlja2VyTXVsdGlwbGUuYWRkTW9udGhcIjogXCJBZGQgbW9udGhcIixcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLmRhdGVSYW5nZVwiOiBcIlJhbmdlXCIsXG4gIFwicmMubW9udGhQaWNrZXJNdWx0aXBsZS5lbmREYXRlXCI6IFwiRW5kIGRhdGVcIixcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLnBsYWNlaG9sZGVyXCI6IFwiUGljayBtb250aFwiLFxuICBcInJjLm1vbnRoUGlja2VyTXVsdGlwbGUuc2luZ2xlRGF0ZVwiOiBcIlNpbmdsZVwiLFxuICBcInJjLm1vbnRoUGlja2VyTXVsdGlwbGUuc3RhcnREYXRlXCI6IFwiU3RhcnQgZGF0ZVwiLFxuXG4gIC8vIE11bHRpU2VsZWN0IENvbXBvbmVudFxuICBcInJjLm11bHRpU2VsZWN0LmNsZWFyXCI6IFwiQ2xlYXIgYWxsXCIsXG4gIFwicmMubXVsdGlTZWxlY3QuY2xvc2VcIjogXCJDbG9zZVwiLFxuICBcInJjLm11bHRpU2VsZWN0Lm1vcmVJdGVtc1wiOiAoY291bnQ6IG51bWJlcikgPT4gYCske2NvdW50fSBtb3JlYCxcbiAgXCJyYy5tdWx0aVNlbGVjdC5ub09wdGlvbnNcIjogXCJObyBvcHRpb25zXCIsXG4gIFwicmMubXVsdGlTZWxlY3Qubm9PcHRpb25zU2VsZWN0ZWRcIjogXCJObyBvcHRpb25zIHNlbGVjdGVkXCIsXG4gIFwicmMubXVsdGlTZWxlY3Qubm9SZXN1bHRzXCI6IFwiTm8gcmVzdWx0c1wiLFxuICBcInJjLm11bHRpU2VsZWN0Lm9wdGlvbnNDb3VudFwiOiAoY291bnQ6IG51bWJlcikgPT4gYCR7Y291bnR9IG9wdGlvbnNgLFxuICBcInJjLm11bHRpU2VsZWN0LnNlbGVjdEFsbFwiOiBcIlNlbGVjdCBhbGxcIixcbiAgXCJyYy5tdWx0aVNlbGVjdC5zZWxlY3RQbGFjZWhvbGRlclwiOiBcIlNlbGVjdC4uLlwiLFxuXG4gIC8vIFBhZ2luYXRpb24gQ29tcG9uZW50XG4gIFwicmMucGFnaW5hdGlvbi5uZXh0XCI6IFwiTmV4dFwiLFxuICBcInJjLnBhZ2luYXRpb24ucHJldmlvdXNcIjogXCJQcmV2aW91c1wiLFxuICBcInJjLnBhZ2luYXRpb24uc2hvd2luZ1wiOiAoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHRvdGFsOiBudW1iZXIpID0+XG4gICAgYFNob3dpbmcgJHtzdGFydH0tJHtlbmR9IG9mICR7dG90YWx9YCxcblxuICAvLyBDYWxlbmRhciBDb21wb25lbnRcbiAgXCJyYy5jYWxlbmRhci5tb250aC4wXCI6IFwiSmFudWFyeVwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjFcIjogXCJGZWJydWFyeVwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjJcIjogXCJNYXJjaFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjNcIjogXCJBcHJpbFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjRcIjogXCJNYXlcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC41XCI6IFwiSnVuZVwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjZcIjogXCJKdWx5XCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguN1wiOiBcIkF1Z3VzdFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjhcIjogXCJTZXB0ZW1iZXJcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC45XCI6IFwiT2N0b2JlclwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjEwXCI6IFwiTm92ZW1iZXJcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC4xMVwiOiBcIkRlY2VtYmVyXCIsXG5cbiAgLy8gU29uYW11IEZpbHRlciBDb21wb25lbnRcbiAgXCJyYy5zb25hbXVGaWx0ZXIudGl0bGVcIjogXCJTb25hbXUgRmlsdGVyXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLmFwcGx5XCI6IFwiQXBwbHlcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIucmVzZXRcIjogXCJSZXNldFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5hZGRSdWxlXCI6IFwiQWRkIFJ1bGVcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIubm9SdWxlc1lldFwiOiAnTm8gcnVsZXMgeWV0LiBDbGljayBcIisgQWRkIFJ1bGVcIiB0byBzdGFydC4nLFxuICBcInJjLnNvbmFtdUZpbHRlci5zZWxlY3RGaWVsZFwiOiBcIlNlbGVjdCBmaWVsZFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5zZWxlY3RPcGVyYXRvclwiOiBcIk9wZXJhdG9yXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLnNlbGVjdE9wZXJhdG9yRmlyc3RcIjogXCJTZWxlY3Qgb3BlcmF0b3IgZmlyc3RcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuZW50ZXJWYWx1ZVwiOiBcIkVudGVyIHZhbHVlXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLmVudGVyTnVtYmVyXCI6IFwiRW50ZXIgbnVtYmVyXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLm5vdFN1cHBvcnRlZFwiOiBcIk5vdCBzdXBwb3J0ZWRcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuc3RhcnREYXRlXCI6IFwiU3RhcnQgZGF0ZVwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5lbmREYXRlXCI6IFwiRW5kIGRhdGVcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuYXBwbGllZEZpbHRlcnNcIjogXCLwn4yyIEFwcGxpZWQgU29uYW11RmlsdGVyc1wiLFxuXG4gIC8vIENvbW1vblxuICBcInJjLmNvbW1vbi5jYW5jZWxcIjogXCJDYW5jZWxcIixcbiAgXCJyYy5jb21tb24uc2F2ZVwiOiBcIlNhdmVcIixcbn0gYXMgY29uc3Q7XG5cbi8vIGVudGl0eS5qc29u7JeQ7IScIOy2lOy2nO2VnCBlbnRpdHkgbGFiZWxzIChkZWZhdWx0TG9jYWxlIOyghOyaqSlcbmNvbnN0IGVudGl0eUxhYmVscyA9IHtcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1wiOiBcIlJlcXVlc3RMb2dcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5pZFwiOiBcIklEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuY3JlYXRlZF9hdFwiOiBcIuuTseuhneydvOyLnFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnRva2VuX25hbWVcIjogXCLthqDtgbAg7J2066aEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cucHJvamVjdF9uYW1lXCI6IFwi7ZSE66Gc7KCd7Yq4IOydtOumhFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLm1vZGVsX25hbWVcIjogXCLrqqjrjbgg7J2066aEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cucmVxdWVzdGVkX21vZGVsX25hbWVcIjogXCLsmpTssq0g66qo6424IOydtOumhCAoZmFsbGJhY2sg7KCEKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmZhbGxiYWNrX2NvdW50XCI6IFwi66qo6424IGZhbGxiYWNrIO2an+yImFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnVzZXJfcHJvbXB0XCI6IFwi7IKs7Jqp7J6QIO2UhOuhrO2UhO2KuFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnN5c3RlbV9wcm9tcHRcIjogXCLsi5zsiqTthZwg7ZSE66Gs7ZSE7Yq4XCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cucmVzcG9uc2VcIjogXCJsbG0g7J2R64u1IOyghOusuFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmlucHV0X3Rva2Vuc1wiOiBcIuyeheugpSDthqDtgbBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5vdXRwdXRfdG9rZW5zXCI6IFwi7Lac66ClIO2GoO2BsFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmNhY2hlX3JlYWRfdG9rZW5zXCI6IFwi7LqQ7IucIOydveq4sCDthqDtgbBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5jYWNoZV9jcmVhdGlvbl90b2tlbnNcIjogXCLsupDsi5wg7IOd7ISxIO2GoO2BsFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiOiBcIjXrtoQgVFRMIOy6kOyLnCDsg53shLEg7Yag7YGwXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zXCI6IFwiMeyLnOqwhCBUVEwg7LqQ7IucIOyDneyEsSDthqDtgbBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5kdXJhdGlvbl9tc1wiOiBcIuydkeuLtSDshozsmpTsi5zqsIQobXMpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cudHRmdF9tc1wiOiBcImZpcnN0IGdlbiBUVEZUKG1zKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmNvc3RfdXNkXCI6IFwiQVBJIOu5hOyaqVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmNvc3Rfc291cmNlXCI6IFwi67mE7JqpIOy2nOyymChwcm92aWRlci9wcmljaW5nX3RhYmxlL21peGVkKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmltYWdlX2Nvc3RfdXNkXCI6IFwi7J2066+47KeAIOyDneyEsSDstpTsoJUg67mE7JqpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuaW1hZ2VfY29zdF9tZXRob2RcIjogXCLsnbTrr7jsp4Ag67mE7JqpIOy2lOyglSDrsKnsi51cIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5lZmZvcnRcIjogXCJlZmZvcnQgbGV2ZWxcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5oaXN0b3J5XCI6IFwiaW5qZWN0X2l0ZW1zIO2eiOyKpO2GoOumrFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnRvb2xzXCI6IFwi7JqU7LKt7JeQIOyepeywqeuQnCB0b29sIOygleydmCDrqqnroZ1cIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5zdGF0dXNcIjogXCLsi6Ttlokg7IOB7YOcXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuZXJyb3JfbWVzc2FnZVwiOiBcIuyXkOufrCDrqZTsi5zsp4BcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy50b29sX2NhbGxfY291bnRcIjogXCJ0b29sIGNhbGwg7Zqf7IiYXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuaXNfaW1hZ2VfZ2VuZXJhdGlvblwiOiBcIuydtOuvuOyngCDsg53shLEgdHVybiDsl6zrtoAgKHF1b3RhIOq3gOyGjeyaqSlcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dPcmRlckJ5LmlkLWRlc2NcIjogXCJJROy1nOyLoOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuaWQtYXNjXCI6IFwiSUTsmKTrnpjrkJzsiJxcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dPcmRlckJ5LmNyZWF0ZWRfYXQtZGVzY1wiOiBcIuuTseuhneydvOyLnOy1nOyLoOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuY3JlYXRlZF9hdC1hc2NcIjogXCLrk7HroZ3snbzsi5zsmKTrnpjrkJzsiJxcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dPcmRlckJ5LnR0ZnRfbXMtZGVzY1wiOiBcIlRURlTquLTsiJxcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dPcmRlckJ5LnR0ZnRfbXMtYXNjXCI6IFwiVFRGVOynp+ydgOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuZHVyYXRpb25fbXMtZGVzY1wiOiBcIuyGjOyalOyLnOqwhOq4tOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuZHVyYXRpb25fbXMtYXNjXCI6IFwi7IaM7JqU7Iuc6rCE7Ken7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5pbnB1dF90b2tlbnMtZGVzY1wiOiBcIuyeheugpe2GoO2BsOunjuydgOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuaW5wdXRfdG9rZW5zLWFzY1wiOiBcIuyeheugpe2GoO2BsOyggeydgOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkub3V0cHV0X3Rva2Vucy1kZXNjXCI6IFwi7Lac66Cl7Yag7YGw66eO7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5vdXRwdXRfdG9rZW5zLWFzY1wiOiBcIuy2nOugpe2GoO2BsOyggeydgOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuY2FjaGVfcmVhZF90b2tlbnMtZGVzY1wiOiBcIuy6kOyLnOydveq4sOunjuydgOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuY2FjaGVfcmVhZF90b2tlbnMtYXNjXCI6IFwi7LqQ7Iuc7J296riw7KCB7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5jYWNoZV9jcmVhdGlvbl90b2tlbnMtZGVzY1wiOiBcIuy6kOyLnOyDneyEseunjuydgOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuY2FjaGVfY3JlYXRpb25fdG9rZW5zLWFzY1wiOiBcIuy6kOyLnOyDneyEseyggeydgOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuY29zdF91c2QtZGVzY1wiOiBcIuu5hOyaqeuGkuydgOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuY29zdF91c2QtYXNjXCI6IFwi67mE7Jqp64Ku7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nU2VhcmNoRmllbGQuaWRcIjogXCJJRFwiLFxuICBcImVudW0uUmVxdWVzdExvZ1NlYXJjaEZpZWxkLnRva2VuX25hbWVcIjogXCLthqDtgbDsnbTrpoRcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dTZWFyY2hGaWVsZC51c2VyX3Byb21wdFwiOiBcIuyCrOyaqeyekCDtlITroaztlITtirhcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dTdGF0dXMucnVubmluZ1wiOiBcIuyLpO2WiSDspJFcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dTdGF0dXMuc3VjY2VlZGVkXCI6IFwi7ISx6rO1XCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nU3RhdHVzLmVycm9yXCI6IFwi7JeQ65+sXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nU3RhdHVzLmFib3J0ZWRcIjogXCLspJHri6hcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXBcIjogXCJSZXF1ZXN0TG9nU3RlcFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5pZFwiOiBcIklEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmNyZWF0ZWRfYXRcIjogXCLrk7HroZ3snbzsi5xcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAucmVxdWVzdF9sb2dcIjogXCLrtoDrqqggcmVxdWVzdCBsb2cgSURcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuc3RlcF9pbmRleFwiOiBcImFpLXNkayBzdGVwIG51bWJlciAoMC1iYXNlZClcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAudHlwZVwiOiBcInN0ZXAg7YOA7J6FXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLm1vZGVsX25hbWVcIjogXCLsi6TsoJwgc2VydmluZyDrqqjrjbhcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAucmVxdWVzdGVkX21vZGVsX25hbWVcIjogXCLsmpTssq0g66qo6424IChmYWxsYmFjayDsoIQpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmZhbGxiYWNrX2NvdW50XCI6IFwi66qo6424IGZhbGxiYWNrIO2an+yImFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5pbnB1dF90b2tlbnNcIjogXCLsnoXroKUg7Yag7YGwIChnZW5lcmF0ZSlcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAub3V0cHV0X3Rva2Vuc1wiOiBcIuy2nOugpSDthqDtgbAgKGdlbmVyYXRlKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5jYWNoZV9yZWFkX3Rva2Vuc1wiOiBcIuy6kOyLnCDsnb3quLAg7Yag7YGwXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmNhY2hlX2NyZWF0aW9uX3Rva2Vuc1wiOiBcIuy6kOyLnCDsg53shLEg7Yag7YGwXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiOiBcIjXrtoQgVFRMIOy6kOyLnCDsg53shLEg7Yag7YGwXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vuc1wiOiBcIjHsi5zqsIQgVFRMIOy6kOyLnCDsg53shLEg7Yag7YGwXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmNvc3RfdXNkXCI6IFwic3RlcCDruYTsmqkgKG1pY3JvLVVTRClcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuY29zdF9zb3VyY2VcIjogXCLruYTsmqkg7Lac7LKYKHByb3ZpZGVyL3ByaWNpbmdfdGFibGUpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmR1cmF0aW9uX21zXCI6IFwi7IaM7JqU7Iuc6rCEKG1zKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC50dGZ0X21zXCI6IFwiR2VuIFRURlQobXMpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmZpbmlzaF9yZWFzb25cIjogXCLsmYTro4wg7IKs7JygXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLnJlYXNvbmluZ190ZXh0XCI6IFwicmVhc29uaW5nIO2FjeyKpO2KuFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5yZWFzb25pbmdfdG9rZW5zXCI6IFwicmVhc29uaW5nIO2GoO2BsCDsiJhcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAudG9vbF9jYWxsX2luZGV4XCI6IFwi6rCZ7J2AIHN0ZXAg64K0IHRvb2wgY2FsbCDsiJzshJxcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAudG9vbF9jYWxsX2lkXCI6IFwidG9vbCBjYWxsIElEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLnRvb2xfbmFtZVwiOiBcInRvb2wg7J2066aEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLnRvb2xfYXJnc1wiOiBcInRvb2wg7J247J6QIChKU09OIHN0cmluZylcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAudG9vbF9yZXN1bHRcIjogXCJ0b29sIOqysOqzvCAoSlNPTiBzdHJpbmcpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLnRvb2xfZHVyYXRpb25fbXNcIjogXCJ0b29sIOyLpO2WiSDshozsmpTsi5zqsIQobXMpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmVycm9yXCI6IFwic3RlcCDsl5Drn6wg66mU7Iuc7KeAXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nU3RlcFR5cGUuZ2VuZXJhdGVcIjogXCJMTE0g7IOd7ISxXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nU3RlcFR5cGUudG9vbF9jYWxsXCI6IFwiVG9vbCDtmLjstpxcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dTdGVwT3JkZXJCeS5pZC1hc2NcIjogXCJJROyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ1N0ZXBTZWFyY2hGaWVsZC5pZFwiOiBcIklEXCIsXG4gIFwiZW50aXR5LlRva2VuXCI6IFwiVG9rZW5cIixcbiAgXCJlbnRpdHkuVG9rZW4uaWRcIjogXCJJRFwiLFxuICBcImVudGl0eS5Ub2tlbi5jcmVhdGVkX2F0XCI6IFwi65Ox66Gd7J287IucXCIsXG4gIFwiZW50aXR5LlRva2VuLnByb3ZpZGVyXCI6IFwi7ZSE66Gc67CU7J20642UXCIsXG4gIFwiZW50aXR5LlRva2VuLmNyZWRlbnRpYWxzXCI6IFwi7J247KadIOygleuztCAoSlNPTkIpXCIsXG4gIFwiZW50aXR5LlRva2VuLm5hbWVcIjogXCLthqDtgbAg7J2066aEXCIsXG4gIFwiZW50aXR5LlRva2VuLmFjdGl2ZVwiOiBcIu2ZnOyEsSDsl6zrtoBcIixcbiAgXCJlbnRpdHkuVG9rZW4ub3JkXCI6IFwi7KCV66CsIOyInOyEnFwiLFxuICBcImVudGl0eS5Ub2tlbi5xdW90YV90aHJlc2hvbGRcIjogXCJxdW90YSDsgqzsmqnrpaAg7J6E6rOE7LmYKCUpLiBudWxs7J2066m0IOuvuOyEpOyglVwiLFxuICBcImVudGl0eS5Ub2tlbi53ZWlnaHRcIjogXCLqsIDspJEg65287Jq065Oc66Gc67mIIOudvOyasO2MhSDqsIDspJHsuZggKDEuLjEwMClcIixcbiAgXCJlbnVtLlRva2VuT3JkZXJCeS5pZC1kZXNjXCI6IFwiSUTstZzsi6DsiJxcIixcbiAgXCJlbnVtLlRva2VuT3JkZXJCeS5vcmQtYXNjXCI6IFwi7Iic7ISc7IicXCIsXG4gIFwiZW51bS5Ub2tlblNlYXJjaEZpZWxkLmlkXCI6IFwiSURcIixcbiAgXCJlbnVtLlRva2VuU2VhcmNoRmllbGQubmFtZVwiOiBcIuydtOumhFwiLFxufSBhcyBjb25zdDtcblxuLy8gZGVmYXVsdExvY2FsZeydmCBkaWN0aW9uYXJ566W8IOq4sOykgOycvOuhnCDtgqQg7LaU7LacXG50eXBlIFJDS2V5cyA9IHR5cGVvZiByY0tleXNLbztcbnR5cGUgUHJvamVjdERpY3Rpb25hcnkgPSB0eXBlb2Yga287XG50eXBlIEVudGl0eUxhYmVscyA9IHR5cGVvZiBlbnRpdHlMYWJlbHM7XG50eXBlIFJhd01lcmdlZERpY3Rpb25hcnkgPSBSQ0tleXMgJlxuICBPbWl0PEVudGl0eUxhYmVscywga2V5b2YgKFJDS2V5cyAmIFByb2plY3REaWN0aW9uYXJ5KT4gJlxuICBQcm9qZWN0RGljdGlvbmFyeTtcblxuLy8g7YKk64qUIOycoOyngO2VmOuQmCwg6rCSIO2DgOyeheydgCBzdHJpbmcg65iQ64qUIO2VqOyImOuhnCDsnbzrsJjtmZQgKOuLpOuluCBsb2NhbGXsnZgg66as7YSw65+0IO2DgOyehSDstqnrj4wg67Cp7KeAKVxuZXhwb3J0IHR5cGUgTWVyZ2VkRGljdGlvbmFyeSA9IHtcbiAgW0sgaW4ga2V5b2YgUmF3TWVyZ2VkRGljdGlvbmFyeV06IFJhd01lcmdlZERpY3Rpb25hcnlbS10gZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgUCkgPT4gc3RyaW5nXG4gICAgPyAoLi4uYXJnczogUCkgPT4gc3RyaW5nXG4gICAgOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgRGljdEtleSA9IGtleW9mIE1lcmdlZERpY3Rpb25hcnk7XG5leHBvcnQgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgPSBzdHJpbmcgJiB7IF9fYnJhbmQ6IFwiTG9jYWxpemVkU3RyaW5nXCIgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUxvY2FsZShkaWN0OiBQYXJ0aWFsPE1lcmdlZERpY3Rpb25hcnk+KSB7XG4gIHJldHVybiBkaWN0O1xufVxuXG4vLyDqsIEgbG9jYWxl67OE66GcIHJjLWtleXMgKyBlbnRpdHkgbGFiZWxzICsg7ZSE66Gc7KCd7Yq4IGRpY3Qg7ZWp7LmoXG5jb25zdCBkaWN0aW9uYXJpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnRpYWw8TWVyZ2VkRGljdGlvbmFyeT4+ID0ge1xuICBrbzogeyAuLi5yY0tleXNLbywgLi4uZW50aXR5TGFiZWxzLCAuLi5rbyB9LFxuICBlbjogeyAuLi5yY0tleXNFbiwgLi4uZW4gfSxcbn07XG5cbnR5cGUgU0RSZXR1cm5UeXBlPEsgZXh0ZW5kcyBEaWN0S2V5PiA9IE1lcmdlZERpY3Rpb25hcnlbS10gZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgUCkgPT4gc3RyaW5nXG4gID8gKC4uLmFyZ3M6IFApID0+IExvY2FsaXplZFN0cmluZ1xuICA6IExvY2FsaXplZFN0cmluZztcblxuZnVuY3Rpb24gZ2V0RGljdFZhbHVlPEsgZXh0ZW5kcyBEaWN0S2V5PihrZXk6IEssIGxvY2FsZTogc3RyaW5nKTogU0RSZXR1cm5UeXBlPEs+IHtcbiAgLy8gMS4g7KeA7KCV65CcIGxvY2FsZeyXkOyEnCDsobDtmoxcbiAgY29uc3QgZGljdCA9IGRpY3Rpb25hcmllc1tsb2NhbGVdO1xuICBpZiAoZGljdD8uW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBkaWN0W2tleV0gYXMgdW5rbm93biBhcyBTRFJldHVyblR5cGU8Sz47XG4gIH1cblxuICAvLyAyLiBkZWZhdWx0IGxvY2FsZeyXkOyEnCDsobDtmoxcbiAgaWYgKGxvY2FsZSAhPT0gREVGQVVMVF9MT0NBTEUgJiYgZGljdGlvbmFyaWVzW0RFRkFVTFRfTE9DQUxFXT8uW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBkaWN0aW9uYXJpZXNbREVGQVVMVF9MT0NBTEVdW2tleV0gYXMgdW5rbm93biBhcyBTRFJldHVyblR5cGU8Sz47XG4gIH1cblxuICAvLyAzLiBzdXBwb3J0ZWQgbG9jYWxlcyDsiJztmoxcbiAgZm9yIChjb25zdCBzdXBwb3J0ZWRMb2NhbGUgb2YgU1VQUE9SVEVEX0xPQ0FMRVMpIHtcbiAgICBpZiAoc3VwcG9ydGVkTG9jYWxlICE9PSBsb2NhbGUgJiYgc3VwcG9ydGVkTG9jYWxlICE9PSBERUZBVUxUX0xPQ0FMRSkge1xuICAgICAgaWYgKGRpY3Rpb25hcmllc1tzdXBwb3J0ZWRMb2NhbGVdPy5ba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBkaWN0aW9uYXJpZXNbc3VwcG9ydGVkTG9jYWxlXVtrZXldIGFzIHVua25vd24gYXMgU0RSZXR1cm5UeXBlPEs+O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIDQuIOuqqOuRkCDsi6TtjKgg7IucIGtleSDrsJjtmZhcbiAgcmV0dXJuIGtleSBhcyB1bmtub3duIGFzIFNEUmV0dXJuVHlwZTxLPjtcbn1cblxuLyoqXG4gKiBTb25hbXUgRGljdGlvbmFyeSDtlajsiJhcbiAqIGxvY2FsZeyXkCDrp57ripQg67KI7JetIO2FjeyKpO2KuOulvCDrsJjtmZjtlanri4jri6QuXG4gKlxuICogQGV4YW1wbGVcbiAqIFNEKFwiY29tbW9uLnNhdmVcIikgIC8vIOKGkiBcIuyggOyepVwiIChMb2NhbGl6ZWRTdHJpbmcpXG4gKiBTRChcInVzZXIubm90Rm91bmRcIikoMSkgIC8vIOKGkiBcIuyhtOyerO2VmOyngCDslYrripQgVXNlciBJRCAxXCIgKExvY2FsaXplZFN0cmluZylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNEPEsgZXh0ZW5kcyBEaWN0S2V5PihrZXk6IEspOiBTRFJldHVyblR5cGU8Sz4ge1xuICBjb25zdCBsb2NhbGUgPSBnZXRDdXJyZW50TG9jYWxlKCk7XG4gIHJldHVybiBnZXREaWN0VmFsdWUoa2V5LCBsb2NhbGUpO1xufVxuXG4vKipcbiAqIO2KueyglSBsb2NhbGXsnZgg67KI7JetIO2FjeyKpO2KuOulvCDrsJjtmZjtlZjripQg7ZWo7IiY66W8IOyDneyEse2VqeuLiOuLpC5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgRU4gPSBTRC5sb2NhbGUoXCJlblwiKTtcbiAqIEVOKFwiY29tbW9uLnNhdmVcIikgIC8vIOKGkiBcIlNhdmVcIlxuICovXG5TRC5sb2NhbGUgPVxuICAobG9jYWxlOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdKSA9PlxuICA8SyBleHRlbmRzIERpY3RLZXk+KGtleTogSyk6IFNEUmV0dXJuVHlwZTxLPiA9PiB7XG4gICAgcmV0dXJuIGdldERpY3RWYWx1ZShrZXksIGxvY2FsZSk7XG4gIH07XG5cbi8vIExvY2FsaXplZCDqsIDriqXtlZwgQ29sdW1uIO2DgOyehSDqs4TsgrBcbnR5cGUgTG9jYWxpemVkQmFzZUNvbHVtbjxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVCAmIHN0cmluZ106IEsgZXh0ZW5kcyBgJHtpbmZlciBCYXNlfV8keyh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl19YFxuICAgID8gQmFzZVxuICAgIDogSztcbn1ba2V5b2YgVCAmIHN0cmluZ107XG5cbi8qKlxuICogbG9jYWxl7JeQIOuUsOudvCDsoIHsoIjtlZwg7Lus65+8IOqwkuydhCDrsJjtmZjtlanri4jri6QuXG4gKiBEQuyXkCBuYW1lLCBuYW1lX2tvLCBuYW1lX2Vu7LKY65+8IGxvY2FsaXplZCBjb2x1bW7snbQg7J6I7J2EIOuVjCDsgqzsmqntlanri4jri6QuXG4gKlxuICog7Jqw7ISg7Iic7JyEICjsp4Dsm5Ag66Gc7LyA7J287J2AIGtvL2pwL2Vu7J206rOgLCDshJzruYTsiqTsnZgg6riw67O4IOuhnOy8gOydvOydgCBrbywg7IKs7Jqp7J6Q7J2YIOuhnOy8gOydvOydgCBqcOydvCDrlYwpOiBjb2x1bW5fanAg4oaSIGNvbHVtbiDihpIgY29sdW1uX2tvIOKGkiBjb2x1bW5fZW5cbiAqIOyasOyEoOyInOychCAo7KeA7JuQIOuhnOy8gOydvOydgCBrby9qcC9lbuydtOqzoCwg7ISc67mE7Iqk7J2YIOq4sOuzuCDroZzsvIDsnbzsnYAgZW4sIOyCrOyaqeyekOydmCDroZzsvIDsnbzsnYAga2/snbwg65WMKTogY29sdW1uX2tvIOKGkiBjb2x1bW4g4oaSIGNvbHVtbl9lbiDihpIgY29sdW1uX2pwXG4gKlxuICogQGV4YW1wbGVcbiAqIGxvY2FsaXplZENvbHVtbih0YWcsIFwibmFtZVwiKVxuICovXG50eXBlIExvY2FsaXplZENvbHVtblNjYWxhclZhbHVlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IGJpZ2ludDtcbnR5cGUgTG9jYWxpemVkQ29sdW1uVmFsdWUgPSBzdHJpbmcgfCBzdHJpbmdbXTtcbnR5cGUgTmVzdGVkTG9jYWxpemVkQ29sdW1uVmFsdWVGcm9tPFY+ID0gViBleHRlbmRzIHN0cmluZ1xuICA/IHN0cmluZ1xuICA6IFYgZXh0ZW5kcyByZWFkb25seSBzdHJpbmdbXVxuICAgID8gc3RyaW5nW11cbiAgICA6IG5ldmVyO1xudHlwZSBMb2NhbGl6ZWRDb2x1bW5WYWx1ZUZyb208Vj4gPSBWIGV4dGVuZHMgc3RyaW5nXG4gID8gc3RyaW5nXG4gIDogViBleHRlbmRzIHJlYWRvbmx5IHN0cmluZ1tdXG4gICAgPyBzdHJpbmdbXVxuICAgIDogViBleHRlbmRzIG51bWJlciB8IGJvb2xlYW4gfCBiaWdpbnRcbiAgICAgID8gc3RyaW5nXG4gICAgICA6IFYgZXh0ZW5kcyBQYXJ0aWFsPFJlY29yZDwodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdLCBpbmZlciBMVj4+XG4gICAgICAgID8gTmVzdGVkTG9jYWxpemVkQ29sdW1uVmFsdWVGcm9tPExWPlxuICAgICAgICA6IG5ldmVyO1xudHlwZSBMb2NhbGl6ZWRDb2x1bW5DYW5kaWRhdGU8VCwgSyBleHRlbmRzIHN0cmluZz4gPVxuICB8IChLIGV4dGVuZHMga2V5b2YgVCA/IFRbS10gOiBuZXZlcilcbiAgfCB7XG4gICAgICBbTCBpbiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdXTogYCR7S31fJHtMfWAgZXh0ZW5kcyBrZXlvZiBUXG4gICAgICAgID8gVFtgJHtLfV8ke0x9YF1cbiAgICAgICAgOiBuZXZlcjtcbiAgICB9Wyh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl1dO1xudHlwZSBMb2NhbGl6ZWRDb2x1bW5SZXR1cm48VCwgSyBleHRlbmRzIHN0cmluZz4gPVxuICB8IExvY2FsaXplZENvbHVtblZhbHVlRnJvbTxMb2NhbGl6ZWRDb2x1bW5DYW5kaWRhdGU8VCwgSz4+XG4gIHwgdW5kZWZpbmVkO1xudHlwZSBMb2NhbGVWYWx1ZU1hcCA9IFBhcnRpYWw8UmVjb3JkPCh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0sIHVua25vd24+PjtcblxuZnVuY3Rpb24gaXNMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIExvY2FsaXplZENvbHVtblZhbHVlIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHxcbiAgICAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIExvY2FsaXplZENvbHVtblNjYWxhclZhbHVlIHtcbiAgcmV0dXJuIFtcInN0cmluZ1wiLCBcIm51bWJlclwiLCBcImJvb2xlYW5cIiwgXCJiaWdpbnRcIl0uaW5jbHVkZXModHlwZW9mIHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaXNFbXB0eUxvY2FsaXplZENvbHVtblZhbHVlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgbnVsbCB8IHVuZGVmaW5lZCB8IFwiXCIge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gXCJcIjtcbn1cblxuZnVuY3Rpb24gZ2V0TmVzdGVkTG9jYWxlVmFsdWU8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBLIGV4dGVuZHMgTG9jYWxpemVkQmFzZUNvbHVtbjxUPj4oXG4gIHJvdzogVCxcbiAgY29sdW1uOiBLLFxuICBsb2NhbGU6ICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0sXG4pOiB1bmtub3duIHtcbiAgY29uc3QgY29sdW1uVmFsdWUgPSByb3dbY29sdW1uXTtcbiAgaWYgKGNvbHVtblZhbHVlID09PSBudWxsIHx8IHR5cGVvZiBjb2x1bW5WYWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGNvbHVtblZhbHVlKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gKGNvbHVtblZhbHVlIGFzIExvY2FsZVZhbHVlTWFwKVtsb2NhbGVdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9jYWxpemVkQ29sdW1uPFxuICBUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIEsgZXh0ZW5kcyBMb2NhbGl6ZWRCYXNlQ29sdW1uPFQ+LFxuPihyb3c6IFQsIGNvbHVtbjogSyk6IExvY2FsaXplZENvbHVtblJldHVybjxULCBLPiB7XG4gIGNvbnN0IGN1cnJlbnRMb2NhbGUgPSBnZXRDdXJyZW50TG9jYWxlKCk7XG4gIGNvbnN0IGxvY2FsZSA9IFNVUFBPUlRFRF9MT0NBTEVTLmluY2x1ZGVzKGN1cnJlbnRMb2NhbGUpID8gY3VycmVudExvY2FsZSA6IERFRkFVTFRfTE9DQUxFO1xuICBjb25zdCBvdGhlckxvY2FsZXMgPSBTVVBQT1JURURfTE9DQUxFUy5maWx0ZXIoXG4gICAgKGw6IHN0cmluZykgPT4gbCAhPT0gbG9jYWxlICYmIGwgIT09IERFRkFVTFRfTE9DQUxFLFxuICApO1xuICBjb25zdCBsb2NhbGl6ZWRLZXkgPSAoY29sdW1uOiBLLCBsb2NhbGU6ICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0pID0+XG4gICAgYCR7Y29sdW1ufV8ke2xvY2FsZX1gO1xuICBjb25zdCB2YWx1ZXMgPSBbXG4gICAgeyB2YWx1ZTogcm93W2xvY2FsaXplZEtleShjb2x1bW4sIGxvY2FsZSldLCBzb3VyY2U6IFwiZGlyZWN0XCIgfSxcbiAgICB7IHZhbHVlOiBnZXROZXN0ZWRMb2NhbGVWYWx1ZShyb3csIGNvbHVtbiwgbG9jYWxlKSwgc291cmNlOiBcIm5lc3RlZFwiIH0sXG4gICAgeyB2YWx1ZTogcm93W2NvbHVtbl0sIHNvdXJjZTogXCJkaXJlY3RcIiB9LFxuICAgIHsgdmFsdWU6IHJvd1tsb2NhbGl6ZWRLZXkoY29sdW1uLCBERUZBVUxUX0xPQ0FMRSldLCBzb3VyY2U6IFwiZGlyZWN0XCIgfSxcbiAgICB7IHZhbHVlOiBnZXROZXN0ZWRMb2NhbGVWYWx1ZShyb3csIGNvbHVtbiwgREVGQVVMVF9MT0NBTEUpLCBzb3VyY2U6IFwibmVzdGVkXCIgfSxcbiAgICAuLi5vdGhlckxvY2FsZXMuZmxhdE1hcCgobCkgPT4gW1xuICAgICAgeyB2YWx1ZTogcm93W2xvY2FsaXplZEtleShjb2x1bW4sIGwpXSwgc291cmNlOiBcImRpcmVjdFwiIH0sXG4gICAgICB7IHZhbHVlOiBnZXROZXN0ZWRMb2NhbGVWYWx1ZShyb3csIGNvbHVtbiwgbCksIHNvdXJjZTogXCJuZXN0ZWRcIiB9LFxuICAgIF0pLFxuICBdO1xuXG4gIGZvciAoY29uc3QgeyB2YWx1ZSwgc291cmNlIH0gb2YgdmFsdWVzKSB7XG4gICAgaWYgKCFpc0VtcHR5TG9jYWxpemVkQ29sdW1uVmFsdWUodmFsdWUpICYmIGlzTG9jYWxpemVkQ29sdW1uVmFsdWUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUgYXMgTG9jYWxpemVkQ29sdW1uUmV0dXJuPFQsIEs+O1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBzb3VyY2UgPT09IFwiZGlyZWN0XCIgJiZcbiAgICAgICFpc0VtcHR5TG9jYWxpemVkQ29sdW1uVmFsdWUodmFsdWUpICYmXG4gICAgICBpc0xvY2FsaXplZENvbHVtblNjYWxhclZhbHVlKHZhbHVlKVxuICAgICkge1xuICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSkgYXMgTG9jYWxpemVkQ29sdW1uUmV0dXJuPFQsIEs+O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRW51beydmCBsb2NhbGl6ZWQgbGFiZWxz66W8IFByb3h566GcIOuwmO2ZmO2VqeuLiOuLpC5cbiAqIFNlbGVjdCDsu7Ttj6zrhIztirgg65Ox7JeQ7IScIEVudW1MYWJlbFtrZXldIOuMgOyLoCDsgqzsmqntlanri4jri6QuXG4gKlxuICogQGV4YW1wbGVcbiAqIFNELmVudW1MYWJlbHMoXCJUYWdPcmRlckJ5XCIpW2tleV0gIC8vIOKGkiDtmITsnqwgbG9jYWxl7J2YIOudvOuyqFxuICovXG5TRC5lbnVtTGFiZWxzID0gKGVudW1OYW1lOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBMb2NhbGl6ZWRTdHJpbmc+ID0+IHtcbiAgcmV0dXJuIG5ldyBQcm94eSh7fSBhcyBSZWNvcmQ8c3RyaW5nLCBMb2NhbGl6ZWRTdHJpbmc+LCB7XG4gICAgZ2V0KF8sIGtleTogc3RyaW5nIHwgc3ltYm9sKSB7XG4gICAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkaWN0S2V5ID0gYGVudW0uJHtlbnVtTmFtZX0uJHtrZXl9YCBhcyBEaWN0S2V5O1xuICAgICAgcmV0dXJuIGdldERpY3RWYWx1ZShkaWN0S2V5LCBnZXRDdXJyZW50TG9jYWxlKCkpO1xuICAgIH0sXG4gIH0pO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFPQSxNQUFNLGlCQUFpQjtBQUN2QixNQUFNLG9CQUFvQixDQUFDLE1BQU0sSUFBSTtBQUNyQyxTQUFTLG1CQUF1RDtDQUM5RCxJQUFJO0VBRUYsT0FEWSxPQUFPLFdBQ1gsQ0FBQSxDQUFJLFVBQWlEO0NBQy9ELFFBQVE7RUFDTixPQUFPO0NBQ1Q7QUFDRjtBQU1BLE1BQU0sV0FB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
|
|
388
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2QuZ2VuZXJhdGVkLmpzIiwibmFtZXMiOlsia28iLCJlbiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pMThuL3NkLmdlbmVyYXRlZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBnZW5lcmF0ZWRcbiAqIOyngeygkSDsiJjsoJXtlZjsp4Ag66eI7IS47JqULlxuICovXG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCJzb25hbXVcIjtcblxuY29uc3QgREVGQVVMVF9MT0NBTEUgPSBcImtvXCIgYXMgY29uc3Q7XG5jb25zdCBTVVBQT1JURURfTE9DQUxFUyA9IFtcImtvXCIsIFwiZW5cIl0gYXMgY29uc3Q7XG5mdW5jdGlvbiBnZXRDdXJyZW50TG9jYWxlKCk6ICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0ge1xuICB0cnkge1xuICAgIGNvbnN0IGN0eCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgcmV0dXJuIChjdHgubG9jYWxlIGFzICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0pID8/IERFRkFVTFRfTE9DQUxFO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gREVGQVVMVF9MT0NBTEU7XG4gIH1cbn1cblxuaW1wb3J0IGVuIGZyb20gXCIuL2VuXCI7XG5pbXBvcnQga28gZnJvbSBcIi4va29cIjtcblxuLy8gcmVhY3QtY29tcG9uZW50cyBpMThuIGtleXNcbmNvbnN0IHJjS2V5c0tvID0ge1xuICAvLyBBc3luY1NlbGVjdCBDb21wb25lbnRcbiAgXCJyYy5hc3luY1NlbGVjdC5sb2FkaW5nXCI6IFwi66Gc65SpIOykkS4uLlwiLFxuICBcInJjLmFzeW5jU2VsZWN0Lm5vT3B0aW9uc1wiOiBcIuyYteyFmOydtCDsl4bsirXri4jri6RcIixcbiAgXCJyYy5hc3luY1NlbGVjdC5ub1Jlc3VsdHNcIjogXCLqsoDsg4kg6rKw6rO86rCAIOyXhuyKteuLiOuLpFwiLFxuICBcInJjLmFzeW5jU2VsZWN0LnNlbGVjdFBsYWNlaG9sZGVyXCI6IFwi7ISg7YOd7ZWY7IS47JqULi4uXCIsXG5cbiAgLy8gQ29tYm9ib3ggQ29tcG9uZW50XG4gIFwicmMuY29tYm9ib3gubm9SZXN1bHRzXCI6IFwi6rKA7IOJIOqysOqzvOqwgCDsl4bsirXri4jri6RcIixcbiAgXCJyYy5jb21ib2JveC5zZWxlY3RQbGFjZWhvbGRlclwiOiBcIuyEoO2Dne2VmOyEuOyalC4uLlwiLFxuXG4gIC8vIERhdGVQaWNrZXIgQ29tcG9uZW50XG4gIFwicmMuZGF0ZVBpY2tlci5waWNrRGF0ZVwiOiBcIuuCoOynnCDshKDtg51cIixcbiAgXCJyYy5kYXRlUGlja2VyLnBsYWNlaG9sZGVyXCI6IFwi64Kg7KecIOyEoO2DnVwiLFxuICBcInJjLmRhdGVQaWNrZXIuc2VsZWN0RGF0ZVwiOiBcIuuCoOynnCDshKDtg51cIixcblxuICAvLyBEYXRlU2VsZWN0b3JNdWx0aXBsZSBDb21wb25lbnRcbiAgXCJyYy5kYXRlU2VsZWN0b3JNdWx0aXBsZS5hZGREYXRlXCI6IFwi64Kg7KecIOy2lOqwgFwiLFxuICBcInJjLmRhdGVTZWxlY3Rvck11bHRpcGxlLmRhdGVSYW5nZVwiOiBcIuq4sOqwhFwiLFxuICBcInJjLmRhdGVTZWxlY3Rvck11bHRpcGxlLnBsYWNlaG9sZGVyXCI6IFwi64Kg7KecIOyEoO2DnVwiLFxuICBcInJjLmRhdGVTZWxlY3Rvck11bHRpcGxlLnNpbmdsZURhdGVcIjogXCLri6jsnbxcIixcblxuICAvLyBGaWxlSW5wdXQgQ29tcG9uZW50XG4gIFwicmMuZmlsZUlucHV0LmJyb3dzZUZpbGVzXCI6IFwi7YyM7J28IOywvuq4sFwiLFxuICBcInJjLmZpbGVJbnB1dC5kcm9wWm9uZVwiOiBcIu2MjOydvOydhCDrk5zrnpjqt7jtlZjqsbDrgpgg7YG066at7ZWY7JesIOyXheuhnOuTnFwiLFxuICBcInJjLmZpbGVJbnB1dC5maWxlUGxhY2Vob2xkZXJcIjogXCLtjIzsnbxcIixcbiAgXCJyYy5maWxlSW5wdXQuaW1hZ2VQbGFjZWhvbGRlclwiOiBcIuydtOuvuOyngFwiLFxuICBcInJjLmZpbGVJbnB1dC5tYXhGaWxlc0V4Y2VlZGVkXCI6IChtYXhGaWxlczogbnVtYmVyKSA9PlxuICAgIGDstZzrjIAgJHttYXhGaWxlc33qsJwg7YyM7J2866eMIOyXheuhnOuTnCDqsIDriqXtlanri4jri6RgLFxuICBcInJjLmZpbGVJbnB1dC5wZW5kaW5nXCI6IFwi64yA6riwIOykkVwiLFxuICBcInJjLmZpbGVJbnB1dC5yZW1vdmVcIjogXCLsoJzqsbBcIixcbiAgXCJyYy5maWxlSW5wdXQudXBsb2FkRmFpbGVkXCI6IFwi7JeF66Gc65OcIOyLpO2MqFwiLFxuICBcInJjLmZpbGVJbnB1dC51cGxvYWRpbmdcIjogXCLsl4XroZzrk5wg7KSRLi4uXCIsXG5cbiAgLy8gTW9udGhQaWNrZXJNdWx0aXBsZSBDb21wb25lbnRcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLmFkZE1vbnRoXCI6IFwi7JuUIOy2lOqwgFwiLFxuICBcInJjLm1vbnRoUGlja2VyTXVsdGlwbGUuZGF0ZVJhbmdlXCI6IFwi6riw6rCEXCIsXG4gIFwicmMubW9udGhQaWNrZXJNdWx0aXBsZS5lbmREYXRlXCI6IFwi7KKF66OM7J28XCIsXG4gIFwicmMubW9udGhQaWNrZXJNdWx0aXBsZS5wbGFjZWhvbGRlclwiOiBcIuyblCDshKDtg51cIixcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLnNpbmdsZURhdGVcIjogXCLri6jsnbxcIixcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLnN0YXJ0RGF0ZVwiOiBcIuyLnOyekeydvFwiLFxuXG4gIC8vIE11bHRpU2VsZWN0IENvbXBvbmVudFxuICBcInJjLm11bHRpU2VsZWN0LmNsZWFyXCI6IFwi7KCE7LK0IO2VtOygnFwiLFxuICBcInJjLm11bHRpU2VsZWN0LmNsb3NlXCI6IFwi64ur6riwXCIsXG4gIFwicmMubXVsdGlTZWxlY3QubW9yZUl0ZW1zXCI6IChjb3VudDogbnVtYmVyKSA9PiBgKyR7Y291bnR96rCcIOuNlOuztOq4sGAsXG4gIFwicmMubXVsdGlTZWxlY3Qubm9PcHRpb25zXCI6IFwi7Ji17IWY7J20IOyXhuyKteuLiOuLpFwiLFxuICBcInJjLm11bHRpU2VsZWN0Lm5vT3B0aW9uc1NlbGVjdGVkXCI6IFwi7ISg7YOd65CcIOyYteyFmOydtCDsl4bsirXri4jri6RcIixcbiAgXCJyYy5tdWx0aVNlbGVjdC5ub1Jlc3VsdHNcIjogXCLqsoDsg4kg6rKw6rO86rCAIOyXhuyKteuLiOuLpFwiLFxuICBcInJjLm11bHRpU2VsZWN0Lm9wdGlvbnNDb3VudFwiOiAoY291bnQ6IG51bWJlcikgPT4gYCR7Y291bnR96rCcIOyYteyFmGAsXG4gIFwicmMubXVsdGlTZWxlY3Quc2VsZWN0QWxsXCI6IFwi7KCE7LK0IOyEoO2DnVwiLFxuICBcInJjLm11bHRpU2VsZWN0LnNlbGVjdFBsYWNlaG9sZGVyXCI6IFwi7ISg7YOd7ZWY7IS47JqULi4uXCIsXG5cbiAgLy8gUGFnaW5hdGlvbiBDb21wb25lbnRcbiAgXCJyYy5wYWdpbmF0aW9uLm5leHRcIjogXCLri6TsnYxcIixcbiAgXCJyYy5wYWdpbmF0aW9uLnByZXZpb3VzXCI6IFwi7J207KCEXCIsXG4gIFwicmMucGFnaW5hdGlvbi5zaG93aW5nXCI6IChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgdG90YWw6IG51bWJlcikgPT5cbiAgICBgJHt0b3RhbH3qsJwg7KSRICR7c3RhcnR9LSR7ZW5kfWAsXG5cbiAgLy8gQ2FsZW5kYXIgQ29tcG9uZW50XG4gIFwicmMuY2FsZW5kYXIubW9udGguMFwiOiBcIjHsm5RcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC4xXCI6IFwiMuyblFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjJcIjogXCIz7JuUXCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguM1wiOiBcIjTsm5RcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC40XCI6IFwiNeyblFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjVcIjogXCI27JuUXCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguNlwiOiBcIjfsm5RcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC43XCI6IFwiOOyblFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjhcIjogXCI57JuUXCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguOVwiOiBcIjEw7JuUXCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguMTBcIjogXCIxMeyblFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjExXCI6IFwiMTLsm5RcIixcblxuICAvLyBTb25hbXUgRmlsdGVyIENvbXBvbmVudFxuICBcInJjLnNvbmFtdUZpbHRlci50aXRsZVwiOiBcIuyGjOuCmOustCDtlYTthLBcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuYXBwbHlcIjogXCLsoIHsmqlcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIucmVzZXRcIjogXCLstIjquLDtmZRcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuYWRkUnVsZVwiOiBcIuq3nOy5mSDstpTqsIBcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIubm9SdWxlc1lldFwiOiAn7JWE7KeBIOq3nOy5meydtCDsl4bsirXri4jri6QuIFwiKyDqt5zsuZkg7LaU6rCAXCLrpbwg7YG066at7ZWY7JesIOyLnOyeke2VmOyEuOyalC4nLFxuICBcInJjLnNvbmFtdUZpbHRlci5zZWxlY3RGaWVsZFwiOiBcIu2VhOuTnCDshKDtg51cIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuc2VsZWN0T3BlcmF0b3JcIjogXCLsl7DsgrDsnpAg7ISg7YOdXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLnNlbGVjdE9wZXJhdG9yRmlyc3RcIjogXCLrqLzsoIAg7Jew7IKw7J6Q66W8IOyEoO2Dne2VmOyEuOyalFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5lbnRlclZhbHVlXCI6IFwi6rCSIOyeheugpVwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5lbnRlck51bWJlclwiOiBcIuyIq+yekCDsnoXroKVcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIubm90U3VwcG9ydGVkXCI6IFwi7KeA7JuQ7ZWY7KeAIOyViuydjFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5zdGFydERhdGVcIjogXCLsi5zsnpHsnbxcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuZW5kRGF0ZVwiOiBcIuyiheujjOydvFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5hcHBsaWVkRmlsdGVyc1wiOiBcIvCfjLIg7KCB7Jqp65CcIOyGjOuCmOustCDtlYTthLBcIixcblxuICAvLyBDb21tb25cbiAgXCJyYy5jb21tb24uY2FuY2VsXCI6IFwi7Leo7IaMXCIsXG4gIFwicmMuY29tbW9uLnNhdmVcIjogXCLsoIDsnqVcIixcbn07XG5cbmNvbnN0IHJjS2V5c0VuID0ge1xuICAvLyBBc3luY1NlbGVjdCBDb21wb25lbnRcbiAgXCJyYy5hc3luY1NlbGVjdC5sb2FkaW5nXCI6IFwiTG9hZGluZy4uLlwiLFxuICBcInJjLmFzeW5jU2VsZWN0Lm5vT3B0aW9uc1wiOiBcIk5vIG9wdGlvbnNcIixcbiAgXCJyYy5hc3luY1NlbGVjdC5ub1Jlc3VsdHNcIjogXCJObyByZXN1bHRzXCIsXG4gIFwicmMuYXN5bmNTZWxlY3Quc2VsZWN0UGxhY2Vob2xkZXJcIjogXCJTZWxlY3QuLi5cIixcblxuICAvLyBDb21ib2JveCBDb21wb25lbnRcbiAgXCJyYy5jb21ib2JveC5ub1Jlc3VsdHNcIjogXCJObyByZXN1bHRzXCIsXG4gIFwicmMuY29tYm9ib3guc2VsZWN0UGxhY2Vob2xkZXJcIjogXCJTZWxlY3QuLi5cIixcblxuICAvLyBEYXRlUGlja2VyIENvbXBvbmVudFxuICBcInJjLmRhdGVQaWNrZXIucGlja0RhdGVcIjogXCJQaWNrIGRhdGVcIixcbiAgXCJyYy5kYXRlUGlja2VyLnBsYWNlaG9sZGVyXCI6IFwiUGljayBkYXRlXCIsXG4gIFwicmMuZGF0ZVBpY2tlci5zZWxlY3REYXRlXCI6IFwiU2VsZWN0IGRhdGVcIixcblxuICAvLyBEYXRlU2VsZWN0b3JNdWx0aXBsZSBDb21wb25lbnRcbiAgXCJyYy5kYXRlU2VsZWN0b3JNdWx0aXBsZS5hZGREYXRlXCI6IFwiQWRkIGRhdGVcIixcbiAgXCJyYy5kYXRlU2VsZWN0b3JNdWx0aXBsZS5kYXRlUmFuZ2VcIjogXCJSYW5nZVwiLFxuICBcInJjLmRhdGVTZWxlY3Rvck11bHRpcGxlLnBsYWNlaG9sZGVyXCI6IFwiUGljayBkYXRlXCIsXG4gIFwicmMuZGF0ZVNlbGVjdG9yTXVsdGlwbGUuc2luZ2xlRGF0ZVwiOiBcIlNpbmdsZVwiLFxuXG4gIC8vIEZpbGVJbnB1dCBDb21wb25lbnRcbiAgXCJyYy5maWxlSW5wdXQuYnJvd3NlRmlsZXNcIjogXCJCcm93c2UgZmlsZXNcIixcbiAgXCJyYy5maWxlSW5wdXQuZHJvcFpvbmVcIjogXCJEcmFnIGZpbGVzIGhlcmUgb3IgY2xpY2sgdG8gdXBsb2FkXCIsXG4gIFwicmMuZmlsZUlucHV0LmZpbGVQbGFjZWhvbGRlclwiOiBcIkZpbGVcIixcbiAgXCJyYy5maWxlSW5wdXQuaW1hZ2VQbGFjZWhvbGRlclwiOiBcIkltYWdlXCIsXG4gIFwicmMuZmlsZUlucHV0Lm1heEZpbGVzRXhjZWVkZWRcIjogKG1heEZpbGVzOiBudW1iZXIpID0+IGBNYXhpbXVtICR7bWF4RmlsZXN9IGZpbGVzIGFsbG93ZWRgLFxuICBcInJjLmZpbGVJbnB1dC5wZW5kaW5nXCI6IFwiUGVuZGluZ1wiLFxuICBcInJjLmZpbGVJbnB1dC5yZW1vdmVcIjogXCJSZW1vdmVcIixcbiAgXCJyYy5maWxlSW5wdXQudXBsb2FkRmFpbGVkXCI6IFwiVXBsb2FkIGZhaWxlZFwiLFxuICBcInJjLmZpbGVJbnB1dC51cGxvYWRpbmdcIjogXCJVcGxvYWRpbmcuLi5cIixcblxuICAvLyBNb250aFBpY2tlck11bHRpcGxlIENvbXBvbmVudFxuICBcInJjLm1vbnRoUGlja2VyTXVsdGlwbGUuYWRkTW9udGhcIjogXCJBZGQgbW9udGhcIixcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLmRhdGVSYW5nZVwiOiBcIlJhbmdlXCIsXG4gIFwicmMubW9udGhQaWNrZXJNdWx0aXBsZS5lbmREYXRlXCI6IFwiRW5kIGRhdGVcIixcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLnBsYWNlaG9sZGVyXCI6IFwiUGljayBtb250aFwiLFxuICBcInJjLm1vbnRoUGlja2VyTXVsdGlwbGUuc2luZ2xlRGF0ZVwiOiBcIlNpbmdsZVwiLFxuICBcInJjLm1vbnRoUGlja2VyTXVsdGlwbGUuc3RhcnREYXRlXCI6IFwiU3RhcnQgZGF0ZVwiLFxuXG4gIC8vIE11bHRpU2VsZWN0IENvbXBvbmVudFxuICBcInJjLm11bHRpU2VsZWN0LmNsZWFyXCI6IFwiQ2xlYXIgYWxsXCIsXG4gIFwicmMubXVsdGlTZWxlY3QuY2xvc2VcIjogXCJDbG9zZVwiLFxuICBcInJjLm11bHRpU2VsZWN0Lm1vcmVJdGVtc1wiOiAoY291bnQ6IG51bWJlcikgPT4gYCske2NvdW50fSBtb3JlYCxcbiAgXCJyYy5tdWx0aVNlbGVjdC5ub09wdGlvbnNcIjogXCJObyBvcHRpb25zXCIsXG4gIFwicmMubXVsdGlTZWxlY3Qubm9PcHRpb25zU2VsZWN0ZWRcIjogXCJObyBvcHRpb25zIHNlbGVjdGVkXCIsXG4gIFwicmMubXVsdGlTZWxlY3Qubm9SZXN1bHRzXCI6IFwiTm8gcmVzdWx0c1wiLFxuICBcInJjLm11bHRpU2VsZWN0Lm9wdGlvbnNDb3VudFwiOiAoY291bnQ6IG51bWJlcikgPT4gYCR7Y291bnR9IG9wdGlvbnNgLFxuICBcInJjLm11bHRpU2VsZWN0LnNlbGVjdEFsbFwiOiBcIlNlbGVjdCBhbGxcIixcbiAgXCJyYy5tdWx0aVNlbGVjdC5zZWxlY3RQbGFjZWhvbGRlclwiOiBcIlNlbGVjdC4uLlwiLFxuXG4gIC8vIFBhZ2luYXRpb24gQ29tcG9uZW50XG4gIFwicmMucGFnaW5hdGlvbi5uZXh0XCI6IFwiTmV4dFwiLFxuICBcInJjLnBhZ2luYXRpb24ucHJldmlvdXNcIjogXCJQcmV2aW91c1wiLFxuICBcInJjLnBhZ2luYXRpb24uc2hvd2luZ1wiOiAoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHRvdGFsOiBudW1iZXIpID0+XG4gICAgYFNob3dpbmcgJHtzdGFydH0tJHtlbmR9IG9mICR7dG90YWx9YCxcblxuICAvLyBDYWxlbmRhciBDb21wb25lbnRcbiAgXCJyYy5jYWxlbmRhci5tb250aC4wXCI6IFwiSmFudWFyeVwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjFcIjogXCJGZWJydWFyeVwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjJcIjogXCJNYXJjaFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjNcIjogXCJBcHJpbFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjRcIjogXCJNYXlcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC41XCI6IFwiSnVuZVwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjZcIjogXCJKdWx5XCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguN1wiOiBcIkF1Z3VzdFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjhcIjogXCJTZXB0ZW1iZXJcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC45XCI6IFwiT2N0b2JlclwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjEwXCI6IFwiTm92ZW1iZXJcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC4xMVwiOiBcIkRlY2VtYmVyXCIsXG5cbiAgLy8gU29uYW11IEZpbHRlciBDb21wb25lbnRcbiAgXCJyYy5zb25hbXVGaWx0ZXIudGl0bGVcIjogXCJTb25hbXUgRmlsdGVyXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLmFwcGx5XCI6IFwiQXBwbHlcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIucmVzZXRcIjogXCJSZXNldFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5hZGRSdWxlXCI6IFwiQWRkIFJ1bGVcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIubm9SdWxlc1lldFwiOiAnTm8gcnVsZXMgeWV0LiBDbGljayBcIisgQWRkIFJ1bGVcIiB0byBzdGFydC4nLFxuICBcInJjLnNvbmFtdUZpbHRlci5zZWxlY3RGaWVsZFwiOiBcIlNlbGVjdCBmaWVsZFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5zZWxlY3RPcGVyYXRvclwiOiBcIk9wZXJhdG9yXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLnNlbGVjdE9wZXJhdG9yRmlyc3RcIjogXCJTZWxlY3Qgb3BlcmF0b3IgZmlyc3RcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuZW50ZXJWYWx1ZVwiOiBcIkVudGVyIHZhbHVlXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLmVudGVyTnVtYmVyXCI6IFwiRW50ZXIgbnVtYmVyXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLm5vdFN1cHBvcnRlZFwiOiBcIk5vdCBzdXBwb3J0ZWRcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuc3RhcnREYXRlXCI6IFwiU3RhcnQgZGF0ZVwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5lbmREYXRlXCI6IFwiRW5kIGRhdGVcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuYXBwbGllZEZpbHRlcnNcIjogXCLwn4yyIEFwcGxpZWQgU29uYW11RmlsdGVyc1wiLFxuXG4gIC8vIENvbW1vblxuICBcInJjLmNvbW1vbi5jYW5jZWxcIjogXCJDYW5jZWxcIixcbiAgXCJyYy5jb21tb24uc2F2ZVwiOiBcIlNhdmVcIixcbn0gYXMgY29uc3Q7XG5cbi8vIGVudGl0eS5qc29u7JeQ7IScIOy2lOy2nO2VnCBlbnRpdHkgbGFiZWxzIChkZWZhdWx0TG9jYWxlIOyghOyaqSlcbmNvbnN0IGVudGl0eUxhYmVscyA9IHtcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1wiOiBcIlJlcXVlc3RMb2dcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5pZFwiOiBcIklEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuY3JlYXRlZF9hdFwiOiBcIuuTseuhneydvOyLnFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnRva2VuX25hbWVcIjogXCLthqDtgbAg7J2066aEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cucHJvamVjdF9uYW1lXCI6IFwi7ZSE66Gc7KCd7Yq4IOydtOumhFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLm1vZGVsX25hbWVcIjogXCLrqqjrjbgg7J2066aEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cucmVxdWVzdGVkX21vZGVsX25hbWVcIjogXCLsmpTssq0g66qo6424IOydtOumhCAoZmFsbGJhY2sg7KCEKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmZhbGxiYWNrX2NvdW50XCI6IFwi66qo6424IGZhbGxiYWNrIO2an+yImFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnVzZXJfcHJvbXB0XCI6IFwi7IKs7Jqp7J6QIO2UhOuhrO2UhO2KuFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnN5c3RlbV9wcm9tcHRcIjogXCLsi5zsiqTthZwg7ZSE66Gs7ZSE7Yq4XCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cucmVzcG9uc2VcIjogXCJsbG0g7J2R64u1IOyghOusuFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmlucHV0X3Rva2Vuc1wiOiBcIuyeheugpSDthqDtgbBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5vdXRwdXRfdG9rZW5zXCI6IFwi7Lac66ClIO2GoO2BsFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmNhY2hlX3JlYWRfdG9rZW5zXCI6IFwi7LqQ7IucIOydveq4sCDthqDtgbBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5jYWNoZV9jcmVhdGlvbl90b2tlbnNcIjogXCLsupDsi5wg7IOd7ISxIO2GoO2BsFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiOiBcIjXrtoQgVFRMIOy6kOyLnCDsg53shLEg7Yag7YGwXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zXCI6IFwiMeyLnOqwhCBUVEwg7LqQ7IucIOyDneyEsSDthqDtgbBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5kdXJhdGlvbl9tc1wiOiBcIuydkeuLtSDshozsmpTsi5zqsIQobXMpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cudHRmdF9tc1wiOiBcImZpcnN0IGdlbiBUVEZUKG1zKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmNvc3RfdXNkXCI6IFwiQVBJIOu5hOyaqVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmNvc3Rfc291cmNlXCI6IFwi67mE7JqpIOy2nOyymChwcm92aWRlci9wcmljaW5nX3RhYmxlL21peGVkKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmltYWdlX2Nvc3RfdXNkXCI6IFwi7J2066+47KeAIOyDneyEsSDstpTsoJUg67mE7JqpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuaW1hZ2VfY29zdF9tZXRob2RcIjogXCLsnbTrr7jsp4Ag67mE7JqpIOy2lOyglSDrsKnsi51cIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5lZmZvcnRcIjogXCJlZmZvcnQgbGV2ZWxcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5oaXN0b3J5XCI6IFwiaW5qZWN0X2l0ZW1zIO2eiOyKpO2GoOumrFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnRvb2xzXCI6IFwi7JqU7LKt7JeQIOyepeywqeuQnCB0b29sIOygleydmCDrqqnroZ1cIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5zdGF0dXNcIjogXCLsi6Ttlokg7IOB7YOcXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuZXJyb3JfbWVzc2FnZVwiOiBcIuyXkOufrCDrqZTsi5zsp4BcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy50b29sX2NhbGxfY291bnRcIjogXCJ0b29sIGNhbGwg7Zqf7IiYXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuaXNfaW1hZ2VfZ2VuZXJhdGlvblwiOiBcIuydtOuvuOyngCDsg53shLEgdHVybiDsl6zrtoAgKHF1b3RhIOq3gOyGjeyaqSlcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dPcmRlckJ5LmlkLWRlc2NcIjogXCJJROy1nOyLoOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuaWQtYXNjXCI6IFwiSUTsmKTrnpjrkJzsiJxcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dPcmRlckJ5LmNyZWF0ZWRfYXQtZGVzY1wiOiBcIuuTseuhneydvOyLnOy1nOyLoOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuY3JlYXRlZF9hdC1hc2NcIjogXCLrk7HroZ3snbzsi5zsmKTrnpjrkJzsiJxcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dPcmRlckJ5LnR0ZnRfbXMtZGVzY1wiOiBcIlRURlTquLTsiJxcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dPcmRlckJ5LnR0ZnRfbXMtYXNjXCI6IFwiVFRGVOynp+ydgOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuZHVyYXRpb25fbXMtZGVzY1wiOiBcIuyGjOyalOyLnOqwhOq4tOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuZHVyYXRpb25fbXMtYXNjXCI6IFwi7IaM7JqU7Iuc6rCE7Ken7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5pbnB1dF90b2tlbnMtZGVzY1wiOiBcIuyeheugpe2GoO2BsOunjuydgOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuaW5wdXRfdG9rZW5zLWFzY1wiOiBcIuyeheugpe2GoO2BsOyggeydgOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkub3V0cHV0X3Rva2Vucy1kZXNjXCI6IFwi7Lac66Cl7Yag7YGw66eO7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5vdXRwdXRfdG9rZW5zLWFzY1wiOiBcIuy2nOugpe2GoO2BsOyggeydgOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuY2FjaGVfcmVhZF90b2tlbnMtZGVzY1wiOiBcIuy6kOyLnOydveq4sOunjuydgOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuY2FjaGVfcmVhZF90b2tlbnMtYXNjXCI6IFwi7LqQ7Iuc7J296riw7KCB7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5jYWNoZV9jcmVhdGlvbl90b2tlbnMtZGVzY1wiOiBcIuy6kOyLnOyDneyEseunjuydgOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuY2FjaGVfY3JlYXRpb25fdG9rZW5zLWFzY1wiOiBcIuy6kOyLnOyDneyEseyggeydgOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuY29zdF91c2QtZGVzY1wiOiBcIuu5hOyaqeuGkuydgOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuY29zdF91c2QtYXNjXCI6IFwi67mE7Jqp64Ku7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nU2VhcmNoRmllbGQuaWRcIjogXCJJRFwiLFxuICBcImVudW0uUmVxdWVzdExvZ1NlYXJjaEZpZWxkLnRva2VuX25hbWVcIjogXCLthqDtgbDsnbTrpoRcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dTZWFyY2hGaWVsZC51c2VyX3Byb21wdFwiOiBcIuyCrOyaqeyekCDtlITroaztlITtirhcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dTdGF0dXMucnVubmluZ1wiOiBcIuyLpO2WiSDspJFcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dTdGF0dXMuc3VjY2VlZGVkXCI6IFwi7ISx6rO1XCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nU3RhdHVzLmVycm9yXCI6IFwi7JeQ65+sXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nU3RhdHVzLmFib3J0ZWRcIjogXCLspJHri6hcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXBcIjogXCJSZXF1ZXN0TG9nU3RlcFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5pZFwiOiBcIklEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmNyZWF0ZWRfYXRcIjogXCLrk7HroZ3snbzsi5xcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAucmVxdWVzdF9sb2dcIjogXCLrtoDrqqggcmVxdWVzdCBsb2cgSURcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuc3RlcF9pbmRleFwiOiBcImFpLXNkayBzdGVwIG51bWJlciAoMC1iYXNlZClcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAudHlwZVwiOiBcInN0ZXAg7YOA7J6FXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLm1vZGVsX25hbWVcIjogXCLsi6TsoJwgc2VydmluZyDrqqjrjbhcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAucmVxdWVzdGVkX21vZGVsX25hbWVcIjogXCLsmpTssq0g66qo6424IChmYWxsYmFjayDsoIQpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmZhbGxiYWNrX2NvdW50XCI6IFwi66qo6424IGZhbGxiYWNrIO2an+yImFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5pbnB1dF90b2tlbnNcIjogXCLsnoXroKUg7Yag7YGwIChnZW5lcmF0ZSlcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAub3V0cHV0X3Rva2Vuc1wiOiBcIuy2nOugpSDthqDtgbAgKGdlbmVyYXRlKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5jYWNoZV9yZWFkX3Rva2Vuc1wiOiBcIuy6kOyLnCDsnb3quLAg7Yag7YGwXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmNhY2hlX2NyZWF0aW9uX3Rva2Vuc1wiOiBcIuy6kOyLnCDsg53shLEg7Yag7YGwXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiOiBcIjXrtoQgVFRMIOy6kOyLnCDsg53shLEg7Yag7YGwXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vuc1wiOiBcIjHsi5zqsIQgVFRMIOy6kOyLnCDsg53shLEg7Yag7YGwXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmNvc3RfdXNkXCI6IFwic3RlcCDruYTsmqkgKG1pY3JvLVVTRClcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuY29zdF9zb3VyY2VcIjogXCLruYTsmqkg7Lac7LKYKHByb3ZpZGVyL3ByaWNpbmdfdGFibGUpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmR1cmF0aW9uX21zXCI6IFwi7IaM7JqU7Iuc6rCEKG1zKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC50dGZ0X21zXCI6IFwiR2VuIFRURlQobXMpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmZpbmlzaF9yZWFzb25cIjogXCLsmYTro4wg7IKs7JygXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLnJlYXNvbmluZ190ZXh0XCI6IFwicmVhc29uaW5nIO2FjeyKpO2KuFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5yZWFzb25pbmdfdG9rZW5zXCI6IFwicmVhc29uaW5nIO2GoO2BsCDsiJhcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAudG9vbF9jYWxsX2luZGV4XCI6IFwi6rCZ7J2AIHN0ZXAg64K0IHRvb2wgY2FsbCDsiJzshJxcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAudG9vbF9jYWxsX2lkXCI6IFwidG9vbCBjYWxsIElEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLnRvb2xfbmFtZVwiOiBcInRvb2wg7J2066aEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLnRvb2xfYXJnc1wiOiBcInRvb2wg7J247J6QIChKU09OIHN0cmluZylcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAudG9vbF9yZXN1bHRcIjogXCJ0b29sIOqysOqzvCAoSlNPTiBzdHJpbmcpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLnRvb2xfZHVyYXRpb25fbXNcIjogXCJ0b29sIOyLpO2WiSDshozsmpTsi5zqsIQobXMpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmVycm9yXCI6IFwic3RlcCDsl5Drn6wg66mU7Iuc7KeAXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nU3RlcFR5cGUuZ2VuZXJhdGVcIjogXCJMTE0g7IOd7ISxXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nU3RlcFR5cGUudG9vbF9jYWxsXCI6IFwiVG9vbCDtmLjstpxcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dTdGVwT3JkZXJCeS5pZC1hc2NcIjogXCJJROyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ1N0ZXBTZWFyY2hGaWVsZC5pZFwiOiBcIklEXCIsXG4gIFwiZW50aXR5LlNldHRpbmdcIjogXCJTZXR0aW5nXCIsXG4gIFwiZW50aXR5LlNldHRpbmcuaWRcIjogXCJJRFwiLFxuICBcImVudGl0eS5TZXR0aW5nLmNyZWF0ZWRfYXRcIjogXCLrk7HroZ3snbzsi5xcIixcbiAgXCJlbnRpdHkuU2V0dGluZy5rZXlcIjogXCLshKTsoJUg7YKkICjsmIg6IG9wZW5haS5tYXhXb3JrZXJzUGVyVG9rZW4pXCIsXG4gIFwiZW50aXR5LlNldHRpbmcudmFsdWVcIjogXCLshKTsoJUg6rCSICjrrLjsnpDsl7Qg7KCA7J6lLCDslbHsl5DshJwg7YyM7IuxwrfqsoDspp0pXCIsXG4gIFwiZW50aXR5LlNldHRpbmcudXBkYXRlZF9hdFwiOiBcIuy1nOyihSDsiJjsoJXsnbzsi5xcIixcbiAgXCJlbnVtLlNldHRpbmdPcmRlckJ5LmtleS1hc2NcIjogXCLtgqTsiJxcIixcbiAgXCJlbnVtLlNldHRpbmdTZWFyY2hGaWVsZC5rZXlcIjogXCLtgqRcIixcbiAgXCJlbnRpdHkuVG9rZW5cIjogXCJUb2tlblwiLFxuICBcImVudGl0eS5Ub2tlbi5pZFwiOiBcIklEXCIsXG4gIFwiZW50aXR5LlRva2VuLmNyZWF0ZWRfYXRcIjogXCLrk7HroZ3snbzsi5xcIixcbiAgXCJlbnRpdHkuVG9rZW4ucHJvdmlkZXJcIjogXCLtlITroZzrsJTsnbTrjZRcIixcbiAgXCJlbnRpdHkuVG9rZW4uY3JlZGVudGlhbHNcIjogXCLsnbjspp0g7KCV67O0IChKU09OQilcIixcbiAgXCJlbnRpdHkuVG9rZW4ubmFtZVwiOiBcIu2GoO2BsCDsnbTrpoRcIixcbiAgXCJlbnRpdHkuVG9rZW4uYWN0aXZlXCI6IFwi7Zmc7ISxIOyXrOu2gFwiLFxuICBcImVudGl0eS5Ub2tlbi5vcmRcIjogXCLsoJXroKwg7Iic7IScXCIsXG4gIFwiZW50aXR5LlRva2VuLnF1b3RhX3RocmVzaG9sZFwiOiBcInF1b3RhIOyCrOyaqeuloCDsnoTqs4TsuZgoJSkuIG51bGzsnbTrqbQg66+47ISk7KCVXCIsXG4gIFwiZW50aXR5LlRva2VuLndlaWdodFwiOiBcIuqwgOykkSDrnbzsmrTrk5zroZzruYgg65287Jqw7YyFIOqwgOykkey5mCAoMS4uMTAwKVwiLFxuICBcImVudW0uVG9rZW5PcmRlckJ5LmlkLWRlc2NcIjogXCJJROy1nOyLoOyInFwiLFxuICBcImVudW0uVG9rZW5PcmRlckJ5Lm9yZC1hc2NcIjogXCLsiJzshJzsiJxcIixcbiAgXCJlbnVtLlRva2VuU2VhcmNoRmllbGQuaWRcIjogXCJJRFwiLFxuICBcImVudW0uVG9rZW5TZWFyY2hGaWVsZC5uYW1lXCI6IFwi7J2066aEXCIsXG59IGFzIGNvbnN0O1xuXG4vLyBkZWZhdWx0TG9jYWxl7J2YIGRpY3Rpb25hcnnrpbwg6riw7KSA7Jy866GcIO2CpCDstpTstpxcbnR5cGUgUkNLZXlzID0gdHlwZW9mIHJjS2V5c0tvO1xudHlwZSBQcm9qZWN0RGljdGlvbmFyeSA9IHR5cGVvZiBrbztcbnR5cGUgRW50aXR5TGFiZWxzID0gdHlwZW9mIGVudGl0eUxhYmVscztcbnR5cGUgUmF3TWVyZ2VkRGljdGlvbmFyeSA9IFJDS2V5cyAmXG4gIE9taXQ8RW50aXR5TGFiZWxzLCBrZXlvZiAoUkNLZXlzICYgUHJvamVjdERpY3Rpb25hcnkpPiAmXG4gIFByb2plY3REaWN0aW9uYXJ5O1xuXG4vLyDtgqTripQg7Jyg7KeA7ZWY65CYLCDqsJIg7YOA7J6F7J2AIHN0cmluZyDrmJDripQg7ZWo7IiY66GcIOydvOuwmO2ZlCAo64uk66W4IGxvY2FsZeydmCDrpqzthLDrn7Qg7YOA7J6FIOy2qeuPjCDrsKnsp4ApXG5leHBvcnQgdHlwZSBNZXJnZWREaWN0aW9uYXJ5ID0ge1xuICBbSyBpbiBrZXlvZiBSYXdNZXJnZWREaWN0aW9uYXJ5XTogUmF3TWVyZ2VkRGljdGlvbmFyeVtLXSBleHRlbmRzICguLi5hcmdzOiBpbmZlciBQKSA9PiBzdHJpbmdcbiAgICA/ICguLi5hcmdzOiBQKSA9PiBzdHJpbmdcbiAgICA6IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBEaWN0S2V5ID0ga2V5b2YgTWVyZ2VkRGljdGlvbmFyeTtcbmV4cG9ydCB0eXBlIExvY2FsaXplZFN0cmluZyA9IHN0cmluZyAmIHsgX19icmFuZDogXCJMb2NhbGl6ZWRTdHJpbmdcIiB9O1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lTG9jYWxlKGRpY3Q6IFBhcnRpYWw8TWVyZ2VkRGljdGlvbmFyeT4pIHtcbiAgcmV0dXJuIGRpY3Q7XG59XG5cbi8vIOqwgSBsb2NhbGXrs4TroZwgcmMta2V5cyArIGVudGl0eSBsYWJlbHMgKyDtlITroZzsoJ3tirggZGljdCDtlansuahcbmNvbnN0IGRpY3Rpb25hcmllczogUmVjb3JkPHN0cmluZywgUGFydGlhbDxNZXJnZWREaWN0aW9uYXJ5Pj4gPSB7XG4gIGtvOiB7IC4uLnJjS2V5c0tvLCAuLi5lbnRpdHlMYWJlbHMsIC4uLmtvIH0sXG4gIGVuOiB7IC4uLnJjS2V5c0VuLCAuLi5lbiB9LFxufTtcblxudHlwZSBTRFJldHVyblR5cGU8SyBleHRlbmRzIERpY3RLZXk+ID0gTWVyZ2VkRGljdGlvbmFyeVtLXSBleHRlbmRzICguLi5hcmdzOiBpbmZlciBQKSA9PiBzdHJpbmdcbiAgPyAoLi4uYXJnczogUCkgPT4gTG9jYWxpemVkU3RyaW5nXG4gIDogTG9jYWxpemVkU3RyaW5nO1xuXG5mdW5jdGlvbiBnZXREaWN0VmFsdWU8SyBleHRlbmRzIERpY3RLZXk+KGtleTogSywgbG9jYWxlOiBzdHJpbmcpOiBTRFJldHVyblR5cGU8Sz4ge1xuICAvLyAxLiDsp4DsoJXrkJwgbG9jYWxl7JeQ7IScIOyhsO2ajFxuICBjb25zdCBkaWN0ID0gZGljdGlvbmFyaWVzW2xvY2FsZV07XG4gIGlmIChkaWN0Py5ba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGRpY3Rba2V5XSBhcyB1bmtub3duIGFzIFNEUmV0dXJuVHlwZTxLPjtcbiAgfVxuXG4gIC8vIDIuIGRlZmF1bHQgbG9jYWxl7JeQ7IScIOyhsO2ajFxuICBpZiAobG9jYWxlICE9PSBERUZBVUxUX0xPQ0FMRSAmJiBkaWN0aW9uYXJpZXNbREVGQVVMVF9MT0NBTEVdPy5ba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGRpY3Rpb25hcmllc1tERUZBVUxUX0xPQ0FMRV1ba2V5XSBhcyB1bmtub3duIGFzIFNEUmV0dXJuVHlwZTxLPjtcbiAgfVxuXG4gIC8vIDMuIHN1cHBvcnRlZCBsb2NhbGVzIOyInO2ajFxuICBmb3IgKGNvbnN0IHN1cHBvcnRlZExvY2FsZSBvZiBTVVBQT1JURURfTE9DQUxFUykge1xuICAgIGlmIChzdXBwb3J0ZWRMb2NhbGUgIT09IGxvY2FsZSAmJiBzdXBwb3J0ZWRMb2NhbGUgIT09IERFRkFVTFRfTE9DQUxFKSB7XG4gICAgICBpZiAoZGljdGlvbmFyaWVzW3N1cHBvcnRlZExvY2FsZV0/LltrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGRpY3Rpb25hcmllc1tzdXBwb3J0ZWRMb2NhbGVdW2tleV0gYXMgdW5rbm93biBhcyBTRFJldHVyblR5cGU8Sz47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gNC4g66qo65GQIOyLpO2MqCDsi5wga2V5IOuwmO2ZmFxuICByZXR1cm4ga2V5IGFzIHVua25vd24gYXMgU0RSZXR1cm5UeXBlPEs+O1xufVxuXG4vKipcbiAqIFNvbmFtdSBEaWN0aW9uYXJ5IO2VqOyImFxuICogbG9jYWxl7JeQIOunnuuKlCDrsojsl60g7YWN7Iqk7Yq466W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAqXG4gKiBAZXhhbXBsZVxuICogU0QoXCJjb21tb24uc2F2ZVwiKSAgLy8g4oaSIFwi7KCA7J6lXCIgKExvY2FsaXplZFN0cmluZylcbiAqIFNEKFwidXNlci5ub3RGb3VuZFwiKSgxKSAgLy8g4oaSIFwi7KG07J6s7ZWY7KeAIOyViuuKlCBVc2VyIElEIDFcIiAoTG9jYWxpemVkU3RyaW5nKVxuICovXG5leHBvcnQgZnVuY3Rpb24gU0Q8SyBleHRlbmRzIERpY3RLZXk+KGtleTogSyk6IFNEUmV0dXJuVHlwZTxLPiB7XG4gIGNvbnN0IGxvY2FsZSA9IGdldEN1cnJlbnRMb2NhbGUoKTtcbiAgcmV0dXJuIGdldERpY3RWYWx1ZShrZXksIGxvY2FsZSk7XG59XG5cbi8qKlxuICog7Yq57KCVIGxvY2FsZeydmCDrsojsl60g7YWN7Iqk7Yq466W8IOuwmO2ZmO2VmOuKlCDtlajsiJjrpbwg7IOd7ISx7ZWp64uI64ukLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBFTiA9IFNELmxvY2FsZShcImVuXCIpO1xuICogRU4oXCJjb21tb24uc2F2ZVwiKSAgLy8g4oaSIFwiU2F2ZVwiXG4gKi9cblNELmxvY2FsZSA9XG4gIChsb2NhbGU6ICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0pID0+XG4gIDxLIGV4dGVuZHMgRGljdEtleT4oa2V5OiBLKTogU0RSZXR1cm5UeXBlPEs+ID0+IHtcbiAgICByZXR1cm4gZ2V0RGljdFZhbHVlKGtleSwgbG9jYWxlKTtcbiAgfTtcblxuLy8gTG9jYWxpemVkIOqwgOuKpe2VnCBDb2x1bW4g7YOA7J6FIOqzhOyCsFxudHlwZSBMb2NhbGl6ZWRCYXNlQ29sdW1uPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUICYgc3RyaW5nXTogSyBleHRlbmRzIGAke2luZmVyIEJhc2V9XyR7KHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXX1gXG4gICAgPyBCYXNlXG4gICAgOiBLO1xufVtrZXlvZiBUICYgc3RyaW5nXTtcblxuLyoqXG4gKiBsb2NhbGXsl5Ag65Sw6528IOyggeygiO2VnCDsu6zrn7wg6rCS7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAqIERC7JeQIG5hbWUsIG5hbWVfa28sIG5hbWVfZW7sspjrn7wgbG9jYWxpemVkIGNvbHVtbuydtCDsnojsnYQg65WMIOyCrOyaqe2VqeuLiOuLpC5cbiAqXG4gKiDsmrDshKDsiJzsnIQgKOyngOybkCDroZzsvIDsnbzsnYAga28vanAvZW7snbTqs6AsIOyEnOu5hOyKpOydmCDquLDrs7gg66Gc7LyA7J287J2AIGtvLCDsgqzsmqnsnpDsnZgg66Gc7LyA7J287J2AIGpw7J28IOuVjCk6IGNvbHVtbl9qcCDihpIgY29sdW1uIOKGkiBjb2x1bW5fa28g4oaSIGNvbHVtbl9lblxuICog7Jqw7ISg7Iic7JyEICjsp4Dsm5Ag66Gc7LyA7J287J2AIGtvL2pwL2Vu7J206rOgLCDshJzruYTsiqTsnZgg6riw67O4IOuhnOy8gOydvOydgCBlbiwg7IKs7Jqp7J6Q7J2YIOuhnOy8gOydvOydgCBrb+ydvCDrlYwpOiBjb2x1bW5fa28g4oaSIGNvbHVtbiDihpIgY29sdW1uX2VuIOKGkiBjb2x1bW5fanBcbiAqXG4gKiBAZXhhbXBsZVxuICogbG9jYWxpemVkQ29sdW1uKHRhZywgXCJuYW1lXCIpXG4gKi9cbnR5cGUgTG9jYWxpemVkQ29sdW1uU2NhbGFyVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgYmlnaW50O1xudHlwZSBMb2NhbGl6ZWRDb2x1bW5WYWx1ZSA9IHN0cmluZyB8IHN0cmluZ1tdO1xudHlwZSBOZXN0ZWRMb2NhbGl6ZWRDb2x1bW5WYWx1ZUZyb208Vj4gPSBWIGV4dGVuZHMgc3RyaW5nXG4gID8gc3RyaW5nXG4gIDogViBleHRlbmRzIHJlYWRvbmx5IHN0cmluZ1tdXG4gICAgPyBzdHJpbmdbXVxuICAgIDogbmV2ZXI7XG50eXBlIExvY2FsaXplZENvbHVtblZhbHVlRnJvbTxWPiA9IFYgZXh0ZW5kcyBzdHJpbmdcbiAgPyBzdHJpbmdcbiAgOiBWIGV4dGVuZHMgcmVhZG9ubHkgc3RyaW5nW11cbiAgICA/IHN0cmluZ1tdXG4gICAgOiBWIGV4dGVuZHMgbnVtYmVyIHwgYm9vbGVhbiB8IGJpZ2ludFxuICAgICAgPyBzdHJpbmdcbiAgICAgIDogViBleHRlbmRzIFBhcnRpYWw8UmVjb3JkPCh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0sIGluZmVyIExWPj5cbiAgICAgICAgPyBOZXN0ZWRMb2NhbGl6ZWRDb2x1bW5WYWx1ZUZyb208TFY+XG4gICAgICAgIDogbmV2ZXI7XG50eXBlIExvY2FsaXplZENvbHVtbkNhbmRpZGF0ZTxULCBLIGV4dGVuZHMgc3RyaW5nPiA9XG4gIHwgKEsgZXh0ZW5kcyBrZXlvZiBUID8gVFtLXSA6IG5ldmVyKVxuICB8IHtcbiAgICAgIFtMIGluICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl1dOiBgJHtLfV8ke0x9YCBleHRlbmRzIGtleW9mIFRcbiAgICAgICAgPyBUW2Ake0t9XyR7TH1gXVxuICAgICAgICA6IG5ldmVyO1xuICAgIH1bKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXV07XG50eXBlIExvY2FsaXplZENvbHVtblJldHVybjxULCBLIGV4dGVuZHMgc3RyaW5nPiA9XG4gIHwgTG9jYWxpemVkQ29sdW1uVmFsdWVGcm9tPExvY2FsaXplZENvbHVtbkNhbmRpZGF0ZTxULCBLPj5cbiAgfCB1bmRlZmluZWQ7XG50eXBlIExvY2FsZVZhbHVlTWFwID0gUGFydGlhbDxSZWNvcmQ8KHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSwgdW5rbm93bj4+O1xuXG5mdW5jdGlvbiBpc0xvY2FsaXplZENvbHVtblZhbHVlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgTG9jYWxpemVkQ29sdW1uVmFsdWUge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fFxuICAgIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIpKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc0xvY2FsaXplZENvbHVtblNjYWxhclZhbHVlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgTG9jYWxpemVkQ29sdW1uU2NhbGFyVmFsdWUge1xuICByZXR1cm4gW1wic3RyaW5nXCIsIFwibnVtYmVyXCIsIFwiYm9vbGVhblwiLCBcImJpZ2ludFwiXS5pbmNsdWRlcyh0eXBlb2YgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiBpc0VtcHR5TG9jYWxpemVkQ29sdW1uVmFsdWUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudWxsIHwgdW5kZWZpbmVkIHwgXCJcIiB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBcIlwiO1xufVxuXG5mdW5jdGlvbiBnZXROZXN0ZWRMb2NhbGVWYWx1ZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIEsgZXh0ZW5kcyBMb2NhbGl6ZWRCYXNlQ29sdW1uPFQ+PihcbiAgcm93OiBULFxuICBjb2x1bW46IEssXG4gIGxvY2FsZTogKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSxcbik6IHVua25vd24ge1xuICBjb25zdCBjb2x1bW5WYWx1ZSA9IHJvd1tjb2x1bW5dO1xuICBpZiAoY29sdW1uVmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIGNvbHVtblZhbHVlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoY29sdW1uVmFsdWUpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiAoY29sdW1uVmFsdWUgYXMgTG9jYWxlVmFsdWVNYXApW2xvY2FsZV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2NhbGl6ZWRDb2x1bW48XG4gIFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgSyBleHRlbmRzIExvY2FsaXplZEJhc2VDb2x1bW48VD4sXG4+KHJvdzogVCwgY29sdW1uOiBLKTogTG9jYWxpemVkQ29sdW1uUmV0dXJuPFQsIEs+IHtcbiAgY29uc3QgY3VycmVudExvY2FsZSA9IGdldEN1cnJlbnRMb2NhbGUoKTtcbiAgY29uc3QgbG9jYWxlID0gU1VQUE9SVEVEX0xPQ0FMRVMuaW5jbHVkZXMoY3VycmVudExvY2FsZSkgPyBjdXJyZW50TG9jYWxlIDogREVGQVVMVF9MT0NBTEU7XG4gIGNvbnN0IG90aGVyTG9jYWxlcyA9IFNVUFBPUlRFRF9MT0NBTEVTLmZpbHRlcihcbiAgICAobDogc3RyaW5nKSA9PiBsICE9PSBsb2NhbGUgJiYgbCAhPT0gREVGQVVMVF9MT0NBTEUsXG4gICk7XG4gIGNvbnN0IGxvY2FsaXplZEtleSA9IChjb2x1bW46IEssIGxvY2FsZTogKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSkgPT5cbiAgICBgJHtjb2x1bW59XyR7bG9jYWxlfWA7XG4gIGNvbnN0IHZhbHVlcyA9IFtcbiAgICB7IHZhbHVlOiByb3dbbG9jYWxpemVkS2V5KGNvbHVtbiwgbG9jYWxlKV0sIHNvdXJjZTogXCJkaXJlY3RcIiB9LFxuICAgIHsgdmFsdWU6IGdldE5lc3RlZExvY2FsZVZhbHVlKHJvdywgY29sdW1uLCBsb2NhbGUpLCBzb3VyY2U6IFwibmVzdGVkXCIgfSxcbiAgICB7IHZhbHVlOiByb3dbY29sdW1uXSwgc291cmNlOiBcImRpcmVjdFwiIH0sXG4gICAgeyB2YWx1ZTogcm93W2xvY2FsaXplZEtleShjb2x1bW4sIERFRkFVTFRfTE9DQUxFKV0sIHNvdXJjZTogXCJkaXJlY3RcIiB9LFxuICAgIHsgdmFsdWU6IGdldE5lc3RlZExvY2FsZVZhbHVlKHJvdywgY29sdW1uLCBERUZBVUxUX0xPQ0FMRSksIHNvdXJjZTogXCJuZXN0ZWRcIiB9LFxuICAgIC4uLm90aGVyTG9jYWxlcy5mbGF0TWFwKChsKSA9PiBbXG4gICAgICB7IHZhbHVlOiByb3dbbG9jYWxpemVkS2V5KGNvbHVtbiwgbCldLCBzb3VyY2U6IFwiZGlyZWN0XCIgfSxcbiAgICAgIHsgdmFsdWU6IGdldE5lc3RlZExvY2FsZVZhbHVlKHJvdywgY29sdW1uLCBsKSwgc291cmNlOiBcIm5lc3RlZFwiIH0sXG4gICAgXSksXG4gIF07XG5cbiAgZm9yIChjb25zdCB7IHZhbHVlLCBzb3VyY2UgfSBvZiB2YWx1ZXMpIHtcbiAgICBpZiAoIWlzRW1wdHlMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZSkgJiYgaXNMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZSBhcyBMb2NhbGl6ZWRDb2x1bW5SZXR1cm48VCwgSz47XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHNvdXJjZSA9PT0gXCJkaXJlY3RcIiAmJlxuICAgICAgIWlzRW1wdHlMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZSkgJiZcbiAgICAgIGlzTG9jYWxpemVkQ29sdW1uU2NhbGFyVmFsdWUodmFsdWUpXG4gICAgKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKSBhcyBMb2NhbGl6ZWRDb2x1bW5SZXR1cm48VCwgSz47XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBFbnVt7J2YIGxvY2FsaXplZCBsYWJlbHPrpbwgUHJveHnroZwg67CY7ZmY7ZWp64uI64ukLlxuICogU2VsZWN0IOy7tO2PrOuEjO2KuCDrk7Hsl5DshJwgRW51bUxhYmVsW2tleV0g64yA7IugIOyCrOyaqe2VqeuLiOuLpC5cbiAqXG4gKiBAZXhhbXBsZVxuICogU0QuZW51bUxhYmVscyhcIlRhZ09yZGVyQnlcIilba2V5XSAgLy8g4oaSIO2YhOyerCBsb2NhbGXsnZgg652867KoXG4gKi9cblNELmVudW1MYWJlbHMgPSAoZW51bU5hbWU6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIExvY2FsaXplZFN0cmluZz4gPT4ge1xuICByZXR1cm4gbmV3IFByb3h5KHt9IGFzIFJlY29yZDxzdHJpbmcsIExvY2FsaXplZFN0cmluZz4sIHtcbiAgICBnZXQoXywga2V5OiBzdHJpbmcgfCBzeW1ib2wpIHtcbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRpY3RLZXkgPSBgZW51bS4ke2VudW1OYW1lfS4ke2tleX1gIGFzIERpY3RLZXk7XG4gICAgICByZXR1cm4gZ2V0RGljdFZhbHVlKGRpY3RLZXksIGdldEN1cnJlbnRMb2NhbGUoKSk7XG4gICAgfSxcbiAgfSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQU9BLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0sb0JBQW9CLENBQUMsTUFBTSxJQUFJO0FBQ3JDLFNBQVMsbUJBQXVEO0NBQzlELElBQUk7RUFFRixPQURZLE9BQU8sV0FDWCxDQUFBLENBQUksVUFBaUQ7Q0FDL0QsUUFBUTtFQUNOLE9BQU87Q0FDVDtBQUNGO0FBTUEsTUFBTSxXQUFXO0NBRWYsMEJBQTBCO0NBQzFCLDRCQUE0QjtDQUM1Qiw0QkFBNEI7Q0FDNUIsb0NBQW9DO0NBR3BDLHlCQUF5QjtDQUN6QixpQ0FBaUM7Q0FHakMsMEJBQTBCO0NBQzFCLDZCQUE2QjtDQUM3Qiw0QkFBNEI7Q0FHNUIsbUNBQW1DO0NBQ25DLHFDQUFxQztDQUNyQyx1Q0FBdUM7Q0FDdkMsc0NBQXNDO0NBR3RDLDRCQUE0QjtDQUM1Qix5QkFBeUI7Q0FDekIsZ0NBQWdDO0NBQ2hDLGlDQUFpQztDQUNqQyxrQ0FBa0MsYUFDaEMsTUFBTSxTQUFTO0NBQ2pCLHdCQUF3QjtDQUN4Qix1QkFBdUI7Q0FDdkIsNkJBQTZCO0NBQzdCLDBCQUEwQjtDQUcxQixtQ0FBbUM7Q0FDbkMsb0NBQW9DO0NBQ3BDLGtDQUFrQztDQUNsQyxzQ0FBc0M7Q0FDdEMscUNBQXFDO0NBQ3JDLG9DQUFvQztDQUdwQyx3QkFBd0I7Q0FDeEIsd0JBQXdCO0NBQ3hCLDZCQUE2QixVQUFrQixJQUFJLE1BQU07Q0FDekQsNEJBQTRCO0NBQzVCLG9DQUFv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
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//#region src/migrations/20260808194708_create__settings.ts
|
|
2
|
+
async function up(knex) {
|
|
3
|
+
await knex.schema.createTable("settings", (table) => {
|
|
4
|
+
table.increments().primary();
|
|
5
|
+
table.timestamp("created_at", {
|
|
6
|
+
useTz: true,
|
|
7
|
+
precision: 3
|
|
8
|
+
}).notNullable().defaultTo(knex.raw("CURRENT_TIMESTAMP"));
|
|
9
|
+
table.string("key", 100).notNullable();
|
|
10
|
+
table.text("value").notNullable();
|
|
11
|
+
table.timestamp("updated_at", {
|
|
12
|
+
useTz: true,
|
|
13
|
+
precision: 3
|
|
14
|
+
}).nullable();
|
|
15
|
+
});
|
|
16
|
+
await knex.raw(`CREATE UNIQUE INDEX settings_key_unique ON settings USING btree(key);`);
|
|
17
|
+
}
|
|
18
|
+
async function down(knex) {
|
|
19
|
+
return knex.schema.dropTable("settings");
|
|
20
|
+
}
|
|
21
|
+
//#endregion
|
|
22
|
+
export { down, up };
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAyNjA4MDgxOTQ3MDhfY3JlYXRlX19zZXR0aW5ncy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlncmF0aW9ucy8yMDI2MDgwODE5NDcwOF9jcmVhdGVfX3NldHRpbmdzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cChrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGtuZXguc2NoZW1hLmNyZWF0ZVRhYmxlKFwic2V0dGluZ3NcIiwgKHRhYmxlKSA9PiB7XG4gICAgdGFibGUuaW5jcmVtZW50cygpLnByaW1hcnkoKTtcbiAgICB0YWJsZVxuICAgICAgLnRpbWVzdGFtcChcImNyZWF0ZWRfYXRcIiwgeyB1c2VUejogdHJ1ZSwgcHJlY2lzaW9uOiAzIH0pXG4gICAgICAubm90TnVsbGFibGUoKVxuICAgICAgLmRlZmF1bHRUbyhrbmV4LnJhdyhcIkNVUlJFTlRfVElNRVNUQU1QXCIpKTtcbiAgICB0YWJsZS5zdHJpbmcoXCJrZXlcIiwgMTAwKS5ub3ROdWxsYWJsZSgpO1xuICAgIHRhYmxlLnRleHQoXCJ2YWx1ZVwiKS5ub3ROdWxsYWJsZSgpO1xuICAgIHRhYmxlLnRpbWVzdGFtcChcInVwZGF0ZWRfYXRcIiwgeyB1c2VUejogdHJ1ZSwgcHJlY2lzaW9uOiAzIH0pLm51bGxhYmxlKCk7XG4gIH0pO1xuICBhd2FpdCBrbmV4LnJhdyhgQ1JFQVRFIFVOSVFVRSBJTkRFWCBzZXR0aW5nc19rZXlfdW5pcXVlIE9OIHNldHRpbmdzIFVTSU5HIGJ0cmVlKGtleSk7YCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3duKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGtuZXguc2NoZW1hLmRyb3BUYWJsZShcInNldHRpbmdzXCIpO1xufVxuIl0sIm1hcHBpbmdzIjoiO0FBRUEsZUFBc0IsR0FBRyxNQUEyQjtDQUNsRCxNQUFNLEtBQUssT0FBTyxZQUFZLGFBQWEsVUFBVTtFQUNuRCxNQUFNLFdBQVcsQ0FBQyxDQUFDLFFBQVE7RUFDM0IsTUFDRyxVQUFVLGNBQWM7R0FBRSxPQUFPO0dBQU0sV0FBVztFQUFFLENBQUMsQ0FBQyxDQUN0RCxZQUFZLENBQUMsQ0FDYixVQUFVLEtBQUssSUFBSSxtQkFBbUIsQ0FBQztFQUMxQyxNQUFNLE9BQU8sT0FBTyxHQUFHLENBQUMsQ0FBQyxZQUFZO0VBQ3JDLE1BQU0sS0FBSyxPQUFPLENBQUMsQ0FBQyxZQUFZO0VBQ2hDLE1BQU0sVUFBVSxjQUFjO0dBQUUsT0FBTztHQUFNLFdBQVc7RUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTO0NBQ3hFLENBQUM7Q0FDRCxNQUFNLEtBQUssSUFBSSx1RUFBdUU7QUFDeEY7QUFFQSxlQUFzQixLQUFLLE1BQTJCO0NBQ3BELE9BQU8sS0FBSyxPQUFPLFVBQVUsVUFBVTtBQUN6QyJ9
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { monitLogSink } from "./application/monit/log-buffer.js";
|
|
2
|
+
import { loadSettings, setSettingChangeHandler } from "./application/setting/setting.store.js";
|
|
2
3
|
import { QgridDispatcher } from "./application/qgrid/qgrid.dispatcher.js";
|
|
3
|
-
import { startExpiredTokenReminder, stopExpiredTokenReminder } from "./application/qgrid/expired-token-reminder.js";
|
|
4
|
+
import { rescheduleExpiredTokenReminder, startExpiredTokenReminder, stopExpiredTokenReminder } from "./application/qgrid/expired-token-reminder.js";
|
|
4
5
|
import { QgridFrame } from "./application/qgrid/qgrid.frame.js";
|
|
5
6
|
import { TokenSubscriber } from "./application/qgrid/token-subscriber.js";
|
|
6
7
|
import { ensureTokensTrigger } from "./application/qgrid/token-trigger-setup.js";
|
|
@@ -133,6 +134,10 @@ var sonamu_config_default = defineConfig({
|
|
|
133
134
|
lifecycle: {
|
|
134
135
|
onStart: async () => {
|
|
135
136
|
const log = getLogger(["qgrid", "startup"]);
|
|
137
|
+
await loadSettings();
|
|
138
|
+
setSettingChangeHandler((key) => {
|
|
139
|
+
if (key === "slack.expiryReminderMinutes" || key === "slack.remindersEnabled") rescheduleExpiredTokenReminder();
|
|
140
|
+
});
|
|
136
141
|
let triggerReady = true;
|
|
137
142
|
try {
|
|
138
143
|
await ensureTokensTrigger(connConfig);
|
|
@@ -173,6 +178,7 @@ var sonamu_config_default = defineConfig({
|
|
|
173
178
|
onShutdown: async () => {
|
|
174
179
|
const log = getLogger(["qgrid", "startup"]);
|
|
175
180
|
stopExpiredTokenReminder();
|
|
181
|
+
setSettingChangeHandler(null);
|
|
176
182
|
if (QgridDispatcher.openaiDispatcher) await QgridDispatcher.openaiDispatcher.stop();
|
|
177
183
|
if (QgridDispatcher.anthropicDispatcher) await QgridDispatcher.anthropicDispatcher.stop();
|
|
178
184
|
if (QgridDispatcher.subscriber) await QgridDispatcher.subscriber.stop();
|
|
@@ -187,4 +193,4 @@ var sonamu_config_default = defineConfig({
|
|
|
187
193
|
//#endregion
|
|
188
194
|
export { sonamu_config_default as default };
|
|
189
195
|
|
|
190
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmNvbmZpZy5qcyIsIm5hbWVzIjpbImNhY2hlRHJpdmVycyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9zb25hbXUuY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IGdldENvbnNvbGVTaW5rIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBnZXRQcmV0dHlGb3JtYXR0ZXIgfSBmcm9tIFwiQGxvZ3RhcGUvcHJldHR5XCI7XG5pbXBvcnQgeyBDYWNoZVByZXNldHMsIGRlZmluZUNvbmZpZyB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGRyaXZlcnMgYXMgY2FjaGVEcml2ZXJzLCBzdG9yZSB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHsgbW9uaXRMb2dTaW5rIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vbW9uaXQvbG9nLWJ1ZmZlclwiO1xuaW1wb3J0IHtcbiAgc3RhcnRFeHBpcmVkVG9rZW5SZW1pbmRlcixcbiAgc3RvcEV4cGlyZWRUb2tlblJlbWluZGVyLFxufSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC9leHBpcmVkLXRva2VuLXJlbWluZGVyXCI7XG5pbXBvcnQgeyBRZ3JpZERpc3BhdGNoZXIgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC5kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBRZ3JpZEZyYW1lIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZnJhbWVcIjtcbmltcG9ydCB7IFRva2VuU3Vic2NyaWJlciB9IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL3Rva2VuLXN1YnNjcmliZXJcIjtcbmltcG9ydCB7IGVuc3VyZVRva2Vuc1RyaWdnZXIgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC90b2tlbi10cmlnZ2VyLXNldHVwXCI7XG5pbXBvcnQgeyBoYW5kbGVTZXJ2ZXJFcnJvciB9IGZyb20gXCIuL3NlcnZlci1lcnJvci1oYW5kbGVyXCI7XG5pbXBvcnQgeyBBbnRocm9waWNEaXNwYXRjaGVyIH0gZnJvbSBcIi4vdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9hbnRocm9waWMtZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgT3BlbkFJRGlzcGF0Y2hlciB9IGZyb20gXCIuL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXJcIjtcblxuY29uc3QgaG9zdCA9IHByb2Nlc3MuZW52LkhPU1QgPz8gXCJsb2NhbGhvc3RcIjtcbmNvbnN0IHBvcnQgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCA/PyA0NDkwMCk7XG5cbmNvbnN0IGNvbm5Db25maWcgPSB7XG4gIGhvc3Q6IHByb2Nlc3MuZW52LlNPTkFNVV9EQl9IT1NUID8/IFwibG9jYWxob3N0XCIsXG4gIHBvcnQ6IE51bWJlcihwcm9jZXNzLmVudi5TT05BTVVfREJfUE9SVCA/PyA1NDMyKSxcbiAgdXNlcjogcHJvY2Vzcy5lbnYuU09OQU1VX0RCX1VTRVIgPz8gXCJwb3N0Z3Jlc1wiLFxuICBwYXNzd29yZDogcHJvY2Vzcy5lbnYuU09OQU1VX0RCX1BBU1NXT1JEID8/IFwicG9zdGdyZXNcIixcbiAgZGF0YWJhc2U6IHByb2Nlc3MuZW52LlNPTkFNVV9EQl9OQU1FID8/IFwicWdyaWRcIixcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7XG4gIHByb2plY3ROYW1lOiBwcm9jZXNzLmVudi5QUk9KRUNUX05BTUUgPz8gXCJRZ3JpZFwiLFxuICBkYXRhYmFzZToge1xuICAgIGRlZmF1bHRPcHRpb25zOiB7XG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLmNvbm5Db25maWcsXG4gICAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICAgICAga2VlcEFsaXZlSW5pdGlhbERlbGF5TWlsbGlzOiAxMDAwMCxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgYXBpOiB7XG4gICAgZGlyOiBcImFwaVwiLFxuICAgIHRpbWV6b25lOiBcIkFzaWEvU2VvdWxcIixcbiAgICByb3V0ZToge1xuICAgICAgcHJlZml4OiBcIi9hcGlcIixcbiAgICB9LFxuICB9LFxuICBpMThuOiB7XG4gICAgZGVmYXVsdExvY2FsZTogXCJrb1wiLFxuICAgIHN1cHBvcnRlZExvY2FsZXM6IFtcImtvXCIsIFwiZW5cIl0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICB0YXJnZXRzOiBbXCJ3ZWJcIl0sXG4gIH0sXG4gIHRlc3Q6IHtcbiAgICBwYXJhbGxlbDogdHJ1ZSxcbiAgICBtYXhXb3JrZXJzOiA0LFxuICAgIGRldlJ1bm5lcjogeyBlbmFibGVkOiB0cnVlIH0sXG4gIH0sXG4gIGxvZ2dpbmc6IHtcbiAgICBzaW5rczoge1xuICAgICAgY29uc29sZTogZ2V0Q29uc29sZVNpbmsoe1xuICAgICAgICBmb3JtYXR0ZXI6IGdldFByZXR0eUZvcm1hdHRlcih7XG4gICAgICAgICAgdGltZXN0YW1wOiBcInRpbWVcIixcbiAgICAgICAgICBjYXRlZ29yeVdpZHRoOiAyMCxcbiAgICAgICAgICBjYXRlZ29yeVRydW5jYXRlOiBcIm1pZGRsZVwiLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICAgLy8gTW9uaXQg7YOt7JqpIGluLW1lbW9yeSByaW5nIGJ1ZmZlci4g7Y+s66e37J2AIHNpbmsg67OEIOKAlCDsvZjshpQg7Lac66Cl7J2AIOq3uOuMgOuhnOuLpC5cbiAgICAgIG1vbml0OiBtb25pdExvZ1NpbmssXG4gICAgfSxcbiAgICBsb2dnZXJzOiBbXG4gICAgICAvLyBxZ3JpZCDroZzqt7ggKOyalOyyrSDrtoTrsLAsIG9hdXRoL3VzYWdlIEFQSSlcbiAgICAgIHsgY2F0ZWdvcnk6IFtcInFncmlkXCJdLCBzaW5rczogW1wiY29uc29sZVwiLCBcIm1vbml0XCJdLCBsb3dlc3RMZXZlbDogXCJpbmZvXCIgfSxcbiAgICAgIC8vIHNvbmFtdSDroZzqt7jripQgd2FybmluZyDsnbTsg4Hrp4xcbiAgICAgIHsgY2F0ZWdvcnk6IFtcInNvbmFtdVwiXSwgc2lua3M6IFtcImNvbnNvbGVcIiwgXCJtb25pdFwiXSwgbG93ZXN0TGV2ZWw6IFwid2FybmluZ1wiIH0sXG4gICAgICAvLyBmYXN0aWZ5IOuhnOq3uCDssKjri6hcbiAgICAgIHsgY2F0ZWdvcnk6IFtcImZhc3RpZnlcIl0sIHNpbmtzOiBbXSwgbG93ZXN0TGV2ZWw6IFwiZmF0YWxcIiB9LFxuICAgIF0sXG4gIH0sXG4gIHNlcnZlcjoge1xuICAgIGxpc3RlbjogeyBwb3J0LCBob3N0IH0sXG4gICAgZmFzdGlmeToge1xuICAgICAgYm9keUxpbWl0OiAxMCAqIDEwMjQgKiAxMDI0LFxuICAgIH0sXG4gICAgcGx1Z2luczoge1xuICAgICAgZm9ybWJvZHk6IHRydWUsXG4gICAgICBxczogdHJ1ZSxcbiAgICAgIHNzZTogdHJ1ZSxcbiAgICAgIG11bHRpcGFydDogeyBsaW1pdHM6IHsgZmlsZVNpemU6IDEwMjQgKiAxMDI0ICogMzAgfSB9LFxuICAgICAgc3RhdGljOiB7XG4gICAgICAgIHJvb3Q6IHBhdGguam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi8uLi9cIiwgXCJwdWJsaWNcIiksXG4gICAgICAgIHByZWZpeDogXCIvYXBpL3B1YmxpY1wiLFxuICAgICAgfSxcbiAgICAgIGN1c3RvbTogKHNlcnZlcikgPT4ge1xuICAgICAgICAvLyBPQXV0aCDsvZzrsLEg4oCUIEFudGhyb3BpY+ydtCAvY2FsbGJhY2vsnLzroZwg66as64uk7J2066CJ7Yq4XG4gICAgICAgIHNlcnZlci5nZXQoXCIvY2FsbGJhY2tcIiwgYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBjb2RlLCBzdGF0ZSB9ID0gcmVxdWVzdC5xdWVyeSBhcyB7IGNvZGU/OiBzdHJpbmc7IHN0YXRlPzogc3RyaW5nIH07XG4gICAgICAgICAgaWYgKCFjb2RlIHx8ICFzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KFwiLz9vYXV0aD1lcnJvciZyZWFzb249bWlzc2luZ19wYXJhbXNcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gUWdyaWRGcmFtZS5oYW5kbGVPQXV0aENhbGxiYWNrKGNvZGUsIHN0YXRlLCByZXBseSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KFxuICAgICAgICAgICAgICBgLz9vYXV0aD1lcnJvciZyZWFzb249JHtlbmNvZGVVUklDb21wb25lbnQoKGUgYXMgRXJyb3IpLm1lc3NhZ2UpfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gT3BlbkFJIE9BdXRoIOuKlCBjb2RleCBhcHAtc2VydmVyIOqwgCDsnpDssrQgY2FsbGJhY2sg7ISc67KE66W8IOyYrOumvFxuICAgICAgICAvLyBoYW5kbGVPcGVuQUlDYWxsYmFjayDrtojtlYTsmpQg4oCUIG9hdXRoQ29tcGxldGVPcGVuQUkgQVBJIOuhnCDsmYTro4wg7ZmV7J24XG4gICAgICB9LFxuICAgIH0sXG4gICAgYXBpQ29uZmlnOiB7XG4gICAgICBjb250ZXh0UHJvdmlkZXI6IChkZWZhdWx0Q29udGV4dCwgcmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmRlZmF1bHRDb250ZXh0LFxuICAgICAgICAgIGlwOiByZXF1ZXN0LmlwLFxuICAgICAgICAgIGJvZHk6IHJlcXVlc3QuYm9keSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBndWFyZEhhbmRsZXI6ICgpID0+IHt9LFxuICAgICAgY2FjaGVDb250cm9sSGFuZGxlcjogKHJlcSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHJlcS50eXBlKSB7XG4gICAgICAgICAgY2FzZSBcImFzc2V0c1wiOlxuICAgICAgICAgICAgLy8gSGFzaCDtj6ztlajrkJwg7YyM7J28OiDsmIHqtawg7LqQ7IucXG4gICAgICAgICAgICBpZiAocmVxLnBhdGgubWF0Y2goLy1bYS1mMC05XStcXC4vKSkge1xuICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLmltbXV0YWJsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubG9uZ0xpdmVkO1xuXG4gICAgICAgICAgY2FzZSBcImFwaVwiOlxuICAgICAgICAgICAgLy8gR0VUIOyalOyyreunjCDsupDsi7Eg6rOg66CkXG4gICAgICAgICAgICBpZiAocmVxLm1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgICAgICAgICAvLyDtirnsoJUg6rK966Gc64qUIOynp+ydgCDsupDsi5xcbiAgICAgICAgICAgICAgaWYgKHJlcS5wYXRoLnN0YXJ0c1dpdGgoXCIvYXBpL3N0YXRpYy1kYXRhXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5zaG9ydExpdmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChyZXEucGF0aC5zdGFydHNXaXRoKFwiL2FwaS90ZXJtc1wiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubWVkaXVtTGl2ZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOq4sOuzuDog7LqQ7IucIOyXhuydjFxuICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5ub0NhY2hlO1xuXG4gICAgICAgICAgY2FzZSBcInNzclwiOlxuICAgICAgICAgICAgLy8gU1NSIO2OmOydtOyngDogMTDstIgg7LqQ7IucXG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLnNzcjtcblxuICAgICAgICAgIGNhc2UgXCJjc3JcIjpcbiAgICAgICAgICAgIC8vIENTUiBmYWxsYmFjayAoaW5kZXguaHRtbCk6IDHrtoQg7LqQ7IucXG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLnNob3J0TGl2ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5ub0NhY2hlO1xuICAgICAgfSxcbiAgICB9LFxuICAgIGNhY2hlOiB7XG4gICAgICBkZWZhdWx0OiBcIm1haW5cIixcbiAgICAgIHN0b3Jlczoge1xuICAgICAgICBtYWluOiBzdG9yZSgpLnVzZUwxTGF5ZXIoY2FjaGVEcml2ZXJzLm1lbW9yeSh7IG1heFNpemU6IFwiNTBtYlwiIH0pKSxcbiAgICAgIH0sXG4gICAgICB0dGw6IFwiNW1cIixcbiAgICAgIHByZWZpeDogXCJcIixcbiAgICB9LFxuICAgIGxpZmVjeWNsZToge1xuICAgICAgb25TdGFydDogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBsb2cgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJzdGFydHVwXCJdKTtcblxuICAgICAgICBsZXQgdHJpZ2dlclJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBlbnN1cmVUb2tlbnNUcmlnZ2VyKGNvbm5Db25maWcpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdHJpZ2dlclJlYWR5ID0gZmFsc2U7XG4gICAgICAgICAgbG9nLndhcm4oYHRyaWdnZXIgc2V0dXAgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3Vic2NyaWJlciA9IG5ldyBUb2tlblN1YnNjcmliZXIoY29ubkNvbmZpZywgUWdyaWREaXNwYXRjaGVyKTtcbiAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXIgPSBzdWJzY3JpYmVyO1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0ZWQgPSBhd2FpdCBzdWJzY3JpYmVyLnN0YXJ0KCk7XG5cbiAgICAgICAgLy8g6riw64+ZIOyDge2DnOulvCDrgqjquLTri6Qg4oCUIEhUVFAg64qUIOydtOuvuCDsl7TroKQg7J6I7Ja07IScLCDspIDruYQg7KCEIOyalOyyreydtCBcIuyeoOyLnCDtm4Qg65CY64qU7KeAXCJcbiAgICAgICAgLy8gXCLsnqzsi5zrj4TtlbTrj4Qg7JWIIOuQmOuKlOyngFwi66W8IOq1rOu2hO2VtCDsnZHri7XtlbTslbwg7ZWc64ukKDUwMyB2cyA1MDApLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG9wZW5haURpc3BhdGNoZXIgPSBuZXcgT3BlbkFJRGlzcGF0Y2hlcigpO1xuICAgICAgICAgIGF3YWl0IG9wZW5haURpc3BhdGNoZXIuc3RhcnQoKTtcbiAgICAgICAgICBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlciA9IG9wZW5haURpc3BhdGNoZXI7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN0YXJ0dXBTdGF0ZS5vcGVuYWkgPSBcInJlYWR5XCI7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBRZ3JpZERpc3BhdGNoZXIuc3RhcnR1cFN0YXRlLm9wZW5haSA9IFwiZmFpbGVkXCI7XG4gICAgICAgICAgbG9nLndhcm4oYG9wZW5haSBkaXNwYXRjaGVyIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYW50aHJvcGljRGlzcGF0Y2hlciA9IG5ldyBBbnRocm9waWNEaXNwYXRjaGVyKCk7XG4gICAgICAgICAgYXdhaXQgYW50aHJvcGljRGlzcGF0Y2hlci5zdGFydCgpO1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyID0gYW50aHJvcGljRGlzcGF0Y2hlcjtcbiAgICAgICAgICBRZ3JpZERpc3BhdGNoZXIuc3RhcnR1cFN0YXRlLmFudGhyb3BpYyA9IFwicmVhZHlcIjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5zdGFydHVwU3RhdGUuYW50aHJvcGljID0gXCJmYWlsZWRcIjtcbiAgICAgICAgICBsb2cud2FybihgYW50aHJvcGljIGRpc3BhdGNoZXIgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnRFeHBpcmVkVG9rZW5SZW1pbmRlcigpO1xuXG4gICAgICAgIGNvbnN0IGFudGhyb3BpY0NvdW50ID0gUWdyaWREaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXI/LnRva2VuQ291bnQgPz8gMDtcbiAgICAgICAgY29uc3Qgb3BlbmFpUmVhZHkgPSBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcj8ucmVhZHlXb3JrZXJDb3VudCA/PyAwO1xuICAgICAgICBjb25zdCBvcGVuYWlUb3RhbCA9IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy53b3JrZXJDb3VudCA/PyAwO1xuXG4gICAgICAgIGxvZy5pbmZvKGBsaXN0ZW5pbmcgb24gaHR0cDovLyR7aG9zdH06JHtwb3J0fWApO1xuICAgICAgICBsb2cuaW5mbyhgYW50aHJvcGljOiAke2FudGhyb3BpY0NvdW50fSB0b2tlbnMgcmVhZHlgKTtcbiAgICAgICAgbG9nLmluZm8oYG9wZW5haTogJHtvcGVuYWlSZWFkeX0vJHtvcGVuYWlUb3RhbH0gdG9rZW5zIHJlYWR5YCk7XG4gICAgICAgIGxvZy5pbmZvKFxuICAgICAgICAgIGBzdWJzY3JpYmVyOiAke3N0YXJ0ZWQgPyBcIkxJU1RFTiBhY3RpdmVcIiA6IFwiZGVncmFkZWRcIn0ke3RyaWdnZXJSZWFkeSA/IFwiXCIgOiBcIiwgdHJpZ2dlciBmYWlsZWRcIn1gLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIG9uU2h1dGRvd246IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgbG9nID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwic3RhcnR1cFwiXSk7XG4gICAgICAgIHN0b3BFeHBpcmVkVG9rZW5SZW1pbmRlcigpO1xuICAgICAgICBpZiAoUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIpIHtcbiAgICAgICAgICBhd2FpdCBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlci5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyKSB7XG4gICAgICAgICAgYXdhaXQgUWdyaWREaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChRZ3JpZERpc3BhdGNoZXIuc3Vic2NyaWJlcikge1xuICAgICAgICAgIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5zdWJzY3JpYmVyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgICBsb2cuaW5mbyhcImdyYWNlZnVsIHNodXRkb3duXCIpO1xuICAgICAgfSxcbiAgICAgIG9uRXJyb3I6IChlcnJvciwgX3JlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGhhbmRsZVNlcnZlckVycm9yKGVycm9yLCByZXBseSk7XG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBcUJBLE1BQU0sT0FBTyxRQUFRLElBQUksUUFBUTtBQUNqQyxNQUFNLE9BQU8sT0FBTyxRQUFRLElBQUksUUFBUSxLQUFLO0FBRTdDLE1BQU0sYUFBYTtDQUNqQixNQUFNLFFBQVEsSUFBSSxrQkFBa0I7Q0FDcEMsTUFBTSxPQUFPLFFBQVEsSUFBSSxrQkFBa0IsSUFBSTtDQUMvQyxNQUFNLFFBQVEsSUFBSSxrQkFBa0I7Q0FDcEMsVUFBVSxRQUFRLElBQUksc0JBQXNCO0NBQzVDLFVBQVUsUUFBUSxJQUFJLGtCQUFrQjtBQUMxQztBQUVBLElBQUEsd0JBQWUsYUFBYTtDQUMxQixhQUFhLFFBQVEsSUFBSSxnQkFBZ0I7Q0FDekMsVUFBVSxFQUNSLGdCQUFnQixFQUNkLFlBQVk7RUFDVixHQUFHO0VBQ0gsV0FBVztFQUNYLDZCQUE2QjtDQUMvQixFQUNGLEVBQ0Y7Q0FD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
|
|
196
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmNvbmZpZy5qcyIsIm5hbWVzIjpbImNhY2hlRHJpdmVycyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9zb25hbXUuY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IGdldENvbnNvbGVTaW5rIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBnZXRQcmV0dHlGb3JtYXR0ZXIgfSBmcm9tIFwiQGxvZ3RhcGUvcHJldHR5XCI7XG5pbXBvcnQgeyBDYWNoZVByZXNldHMsIGRlZmluZUNvbmZpZyB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGRyaXZlcnMgYXMgY2FjaGVEcml2ZXJzLCBzdG9yZSB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHsgbW9uaXRMb2dTaW5rIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vbW9uaXQvbG9nLWJ1ZmZlclwiO1xuaW1wb3J0IHtcbiAgcmVzY2hlZHVsZUV4cGlyZWRUb2tlblJlbWluZGVyLFxuICBzdGFydEV4cGlyZWRUb2tlblJlbWluZGVyLFxuICBzdG9wRXhwaXJlZFRva2VuUmVtaW5kZXIsXG59IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL2V4cGlyZWQtdG9rZW4tcmVtaW5kZXJcIjtcbmltcG9ydCB7IFFncmlkRGlzcGF0Y2hlciB9IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IFFncmlkRnJhbWUgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC5mcmFtZVwiO1xuaW1wb3J0IHsgVG9rZW5TdWJzY3JpYmVyIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vcWdyaWQvdG9rZW4tc3Vic2NyaWJlclwiO1xuaW1wb3J0IHsgZW5zdXJlVG9rZW5zVHJpZ2dlciB9IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL3Rva2VuLXRyaWdnZXItc2V0dXBcIjtcbmltcG9ydCB7IGxvYWRTZXR0aW5ncywgc2V0U2V0dGluZ0NoYW5nZUhhbmRsZXIgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9zZXR0aW5nL3NldHRpbmcuc3RvcmVcIjtcbmltcG9ydCB7IGhhbmRsZVNlcnZlckVycm9yIH0gZnJvbSBcIi4vc2VydmVyLWVycm9yLWhhbmRsZXJcIjtcbmltcG9ydCB7IEFudGhyb3BpY0Rpc3BhdGNoZXIgfSBmcm9tIFwiLi91dGlscy9wcm92aWRlcnMvYW50aHJvcGljL2FudGhyb3BpYy1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBPcGVuQUlEaXNwYXRjaGVyIH0gZnJvbSBcIi4vdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktZGlzcGF0Y2hlclwiO1xuXG5jb25zdCBob3N0ID0gcHJvY2Vzcy5lbnYuSE9TVCA/PyBcImxvY2FsaG9zdFwiO1xuY29uc3QgcG9ydCA9IE51bWJlcihwcm9jZXNzLmVudi5QT1JUID8/IDQ0OTAwKTtcblxuY29uc3QgY29ubkNvbmZpZyA9IHtcbiAgaG9zdDogcHJvY2Vzcy5lbnYuU09OQU1VX0RCX0hPU1QgPz8gXCJsb2NhbGhvc3RcIixcbiAgcG9ydDogTnVtYmVyKHByb2Nlc3MuZW52LlNPTkFNVV9EQl9QT1JUID8/IDU0MzIpLFxuICB1c2VyOiBwcm9jZXNzLmVudi5TT05BTVVfREJfVVNFUiA/PyBcInBvc3RncmVzXCIsXG4gIHBhc3N3b3JkOiBwcm9jZXNzLmVudi5TT05BTVVfREJfUEFTU1dPUkQgPz8gXCJwb3N0Z3Jlc1wiLFxuICBkYXRhYmFzZTogcHJvY2Vzcy5lbnYuU09OQU1VX0RCX05BTUUgPz8gXCJxZ3JpZFwiLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHtcbiAgcHJvamVjdE5hbWU6IHByb2Nlc3MuZW52LlBST0pFQ1RfTkFNRSA/PyBcIlFncmlkXCIsXG4gIGRhdGFiYXNlOiB7XG4gICAgZGVmYXVsdE9wdGlvbnM6IHtcbiAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgLi4uY29ubkNvbmZpZyxcbiAgICAgICAga2VlcEFsaXZlOiB0cnVlLFxuICAgICAgICBrZWVwQWxpdmVJbml0aWFsRGVsYXlNaWxsaXM6IDEwMDAwLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBhcGk6IHtcbiAgICBkaXI6IFwiYXBpXCIsXG4gICAgdGltZXpvbmU6IFwiQXNpYS9TZW91bFwiLFxuICAgIHJvdXRlOiB7XG4gICAgICBwcmVmaXg6IFwiL2FwaVwiLFxuICAgIH0sXG4gIH0sXG4gIGkxOG46IHtcbiAgICBkZWZhdWx0TG9jYWxlOiBcImtvXCIsXG4gICAgc3VwcG9ydGVkTG9jYWxlczogW1wia29cIiwgXCJlblwiXSxcbiAgfSxcbiAgc3luYzoge1xuICAgIHRhcmdldHM6IFtcIndlYlwiXSxcbiAgfSxcbiAgdGVzdDoge1xuICAgIHBhcmFsbGVsOiB0cnVlLFxuICAgIG1heFdvcmtlcnM6IDQsXG4gICAgZGV2UnVubmVyOiB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgfSxcbiAgbG9nZ2luZzoge1xuICAgIHNpbmtzOiB7XG4gICAgICBjb25zb2xlOiBnZXRDb25zb2xlU2luayh7XG4gICAgICAgIGZvcm1hdHRlcjogZ2V0UHJldHR5Rm9ybWF0dGVyKHtcbiAgICAgICAgICB0aW1lc3RhbXA6IFwidGltZVwiLFxuICAgICAgICAgIGNhdGVnb3J5V2lkdGg6IDIwLFxuICAgICAgICAgIGNhdGVnb3J5VHJ1bmNhdGU6IFwibWlkZGxlXCIsXG4gICAgICAgIH0pLFxuICAgICAgfSksXG4gICAgICAvLyBNb25pdCDtg63smqkgaW4tbWVtb3J5IHJpbmcgYnVmZmVyLiDtj6zrp7fsnYAgc2luayDrs4Qg4oCUIOy9mOyGlCDstpzroKXsnYAg6re464yA66Gc64ukLlxuICAgICAgbW9uaXQ6IG1vbml0TG9nU2luayxcbiAgICB9LFxuICAgIGxvZ2dlcnM6IFtcbiAgICAgIC8vIHFncmlkIOuhnOq3uCAo7JqU7LKtIOu2hOuwsCwgb2F1dGgvdXNhZ2UgQVBJKVxuICAgICAgeyBjYXRlZ29yeTogW1wicWdyaWRcIl0sIHNpbmtzOiBbXCJjb25zb2xlXCIsIFwibW9uaXRcIl0sIGxvd2VzdExldmVsOiBcImluZm9cIiB9LFxuICAgICAgLy8gc29uYW11IOuhnOq3uOuKlCB3YXJuaW5nIOydtOyDgeunjFxuICAgICAgeyBjYXRlZ29yeTogW1wic29uYW11XCJdLCBzaW5rczogW1wiY29uc29sZVwiLCBcIm1vbml0XCJdLCBsb3dlc3RMZXZlbDogXCJ3YXJuaW5nXCIgfSxcbiAgICAgIC8vIGZhc3RpZnkg66Gc6re4IOywqOuLqFxuICAgICAgeyBjYXRlZ29yeTogW1wiZmFzdGlmeVwiXSwgc2lua3M6IFtdLCBsb3dlc3RMZXZlbDogXCJmYXRhbFwiIH0sXG4gICAgXSxcbiAgfSxcbiAgc2VydmVyOiB7XG4gICAgbGlzdGVuOiB7IHBvcnQsIGhvc3QgfSxcbiAgICBmYXN0aWZ5OiB7XG4gICAgICBib2R5TGltaXQ6IDEwICogMTAyNCAqIDEwMjQsXG4gICAgfSxcbiAgICBwbHVnaW5zOiB7XG4gICAgICBmb3JtYm9keTogdHJ1ZSxcbiAgICAgIHFzOiB0cnVlLFxuICAgICAgc3NlOiB0cnVlLFxuICAgICAgbXVsdGlwYXJ0OiB7IGxpbWl0czogeyBmaWxlU2l6ZTogMTAyNCAqIDEwMjQgKiAzMCB9IH0sXG4gICAgICBzdGF0aWM6IHtcbiAgICAgICAgcm9vdDogcGF0aC5qb2luKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLy4uL1wiLCBcInB1YmxpY1wiKSxcbiAgICAgICAgcHJlZml4OiBcIi9hcGkvcHVibGljXCIsXG4gICAgICB9LFxuICAgICAgY3VzdG9tOiAoc2VydmVyKSA9PiB7XG4gICAgICAgIC8vIE9BdXRoIOy9nOuwsSDigJQgQW50aHJvcGlj7J20IC9jYWxsYmFja+ycvOuhnCDrpqzri6TsnbTroIntirhcbiAgICAgICAgc2VydmVyLmdldChcIi9jYWxsYmFja1wiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGNvZGUsIHN0YXRlIH0gPSByZXF1ZXN0LnF1ZXJ5IGFzIHsgY29kZT86IHN0cmluZzsgc3RhdGU/OiBzdHJpbmcgfTtcbiAgICAgICAgICBpZiAoIWNvZGUgfHwgIXN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoXCIvP29hdXRoPWVycm9yJnJlYXNvbj1taXNzaW5nX3BhcmFtc1wiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBRZ3JpZEZyYW1lLmhhbmRsZU9BdXRoQ2FsbGJhY2soY29kZSwgc3RhdGUsIHJlcGx5KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoXG4gICAgICAgICAgICAgIGAvP29hdXRoPWVycm9yJnJlYXNvbj0ke2VuY29kZVVSSUNvbXBvbmVudCgoZSBhcyBFcnJvcikubWVzc2FnZSl9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBPcGVuQUkgT0F1dGgg64qUIGNvZGV4IGFwcC1zZXJ2ZXIg6rCAIOyekOyytCBjYWxsYmFjayDshJzrsoTrpbwg7Jis66a8XG4gICAgICAgIC8vIGhhbmRsZU9wZW5BSUNhbGxiYWNrIOu2iO2VhOyalCDigJQgb2F1dGhDb21wbGV0ZU9wZW5BSSBBUEkg66GcIOyZhOujjCDtmZXsnbhcbiAgICAgIH0sXG4gICAgfSxcbiAgICBhcGlDb25maWc6IHtcbiAgICAgIGNvbnRleHRQcm92aWRlcjogKGRlZmF1bHRDb250ZXh0LCByZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uZGVmYXVsdENvbnRleHQsXG4gICAgICAgICAgaXA6IHJlcXVlc3QuaXAsXG4gICAgICAgICAgYm9keTogcmVxdWVzdC5ib2R5LFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGd1YXJkSGFuZGxlcjogKCkgPT4ge30sXG4gICAgICBjYWNoZUNvbnRyb2xIYW5kbGVyOiAocmVxKSA9PiB7XG4gICAgICAgIHN3aXRjaCAocmVxLnR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwiYXNzZXRzXCI6XG4gICAgICAgICAgICAvLyBIYXNoIO2PrO2VqOuQnCDtjIzsnbw6IOyYgeq1rCDsupDsi5xcbiAgICAgICAgICAgIGlmIChyZXEucGF0aC5tYXRjaCgvLVthLWYwLTldK1xcLi8pKSB7XG4gICAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMuaW1tdXRhYmxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5sb25nTGl2ZWQ7XG5cbiAgICAgICAgICBjYXNlIFwiYXBpXCI6XG4gICAgICAgICAgICAvLyBHRVQg7JqU7LKt66eMIOy6kOyLsSDqs6DroKRcbiAgICAgICAgICAgIGlmIChyZXEubWV0aG9kID09PSBcIkdFVFwiKSB7XG4gICAgICAgICAgICAgIC8vIO2KueyglSDqsr3roZzripQg7Ken7J2AIOy6kOyLnFxuICAgICAgICAgICAgICBpZiAocmVxLnBhdGguc3RhcnRzV2l0aChcIi9hcGkvc3RhdGljLWRhdGFcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLnNob3J0TGl2ZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHJlcS5wYXRoLnN0YXJ0c1dpdGgoXCIvYXBpL3Rlcm1zXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5tZWRpdW1MaXZlZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g6riw67O4OiDsupDsi5wg7JeG7J2MXG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLm5vQ2FjaGU7XG5cbiAgICAgICAgICBjYXNlIFwic3NyXCI6XG4gICAgICAgICAgICAvLyBTU1Ig7Y6Y7J207KeAOiAxMOy0iCDsupDsi5xcbiAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMuc3NyO1xuXG4gICAgICAgICAgY2FzZSBcImNzclwiOlxuICAgICAgICAgICAgLy8gQ1NSIGZhbGxiYWNrIChpbmRleC5odG1sKTogMeu2hCDsupDsi5xcbiAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMuc2hvcnRMaXZlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLm5vQ2FjaGU7XG4gICAgICB9LFxuICAgIH0sXG4gICAgY2FjaGU6IHtcbiAgICAgIGRlZmF1bHQ6IFwibWFpblwiLFxuICAgICAgc3RvcmVzOiB7XG4gICAgICAgIG1haW46IHN0b3JlKCkudXNlTDFMYXllcihjYWNoZURyaXZlcnMubWVtb3J5KHsgbWF4U2l6ZTogXCI1MG1iXCIgfSkpLFxuICAgICAgfSxcbiAgICAgIHR0bDogXCI1bVwiLFxuICAgICAgcHJlZml4OiBcIlwiLFxuICAgIH0sXG4gICAgbGlmZWN5Y2xlOiB7XG4gICAgICBvblN0YXJ0OiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGxvZyA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInN0YXJ0dXBcIl0pO1xuXG4gICAgICAgIC8vIGRpc3BhdGNoZXIg6rCAIOyDneyEseyekOyXkOyEnCDsm4zsu6Qg7ISk7KCV7J2EIOydveycvOuvgOuhnCDqt7gg7KCE7JeQIOyYrOugpOyVvCDtlZzri6QuXG4gICAgICAgIGF3YWl0IGxvYWRTZXR0aW5ncygpO1xuICAgICAgICAvLyDrn7Dtg4DsnoQg7ISk7KCVIOyGjOu5hOyekOulvCDsg4HsnIQg6rOE7Li17JeQ7IScIOyXsOqysO2VtCBzZXR0aW5nIOuqqOuTiOydtCBxZ3JpZCDrpbwg7Jet7LC47KGw7ZWY7KeAIOyViuqyjCDtlZzri6QuXG4gICAgICAgIHNldFNldHRpbmdDaGFuZ2VIYW5kbGVyKChrZXkpID0+IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSBcInNsYWNrLmV4cGlyeVJlbWluZGVyTWludXRlc1wiIHx8IGtleSA9PT0gXCJzbGFjay5yZW1pbmRlcnNFbmFibGVkXCIpIHtcbiAgICAgICAgICAgIHJlc2NoZWR1bGVFeHBpcmVkVG9rZW5SZW1pbmRlcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IHRyaWdnZXJSZWFkeSA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZW5zdXJlVG9rZW5zVHJpZ2dlcihjb25uQ29uZmlnKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRyaWdnZXJSZWFkeSA9IGZhbHNlO1xuICAgICAgICAgIGxvZy53YXJuKGB0cmlnZ2VyIHNldHVwIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YnNjcmliZXIgPSBuZXcgVG9rZW5TdWJzY3JpYmVyKGNvbm5Db25maWcsIFFncmlkRGlzcGF0Y2hlcik7XG4gICAgICAgIFFncmlkRGlzcGF0Y2hlci5zdWJzY3JpYmVyID0gc3Vic2NyaWJlcjtcblxuICAgICAgICBjb25zdCBzdGFydGVkID0gYXdhaXQgc3Vic2NyaWJlci5zdGFydCgpO1xuXG4gICAgICAgIC8vIOq4sOuPmSDsg4Htg5zrpbwg64Ko6ri064ukIOKAlCBIVFRQIOuKlCDsnbTrr7gg7Je066CkIOyeiOyWtOyEnCwg7KSA67mEIOyghCDsmpTssq3snbQgXCLsnqDsi5wg7ZuEIOuQmOuKlOyngFwiXG4gICAgICAgIC8vIFwi7J6s7Iuc64+E7ZW064+EIOyViCDrkJjripTsp4BcIuulvCDqtazrtoTtlbQg7J2R64u17ZW07JW8IO2VnOuLpCg1MDMgdnMgNTAwKS5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBvcGVuYWlEaXNwYXRjaGVyID0gbmV3IE9wZW5BSURpc3BhdGNoZXIoKTtcbiAgICAgICAgICBhd2FpdCBvcGVuYWlEaXNwYXRjaGVyLnN0YXJ0KCk7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIgPSBvcGVuYWlEaXNwYXRjaGVyO1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5zdGFydHVwU3RhdGUub3BlbmFpID0gXCJyZWFkeVwiO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN0YXJ0dXBTdGF0ZS5vcGVuYWkgPSBcImZhaWxlZFwiO1xuICAgICAgICAgIGxvZy53YXJuKGBvcGVuYWkgZGlzcGF0Y2hlciBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGFudGhyb3BpY0Rpc3BhdGNoZXIgPSBuZXcgQW50aHJvcGljRGlzcGF0Y2hlcigpO1xuICAgICAgICAgIGF3YWl0IGFudGhyb3BpY0Rpc3BhdGNoZXIuc3RhcnQoKTtcbiAgICAgICAgICBRZ3JpZERpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlciA9IGFudGhyb3BpY0Rpc3BhdGNoZXI7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN0YXJ0dXBTdGF0ZS5hbnRocm9waWMgPSBcInJlYWR5XCI7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBRZ3JpZERpc3BhdGNoZXIuc3RhcnR1cFN0YXRlLmFudGhyb3BpYyA9IFwiZmFpbGVkXCI7XG4gICAgICAgICAgbG9nLndhcm4oYGFudGhyb3BpYyBkaXNwYXRjaGVyIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXJ0RXhwaXJlZFRva2VuUmVtaW5kZXIoKTtcblxuICAgICAgICBjb25zdCBhbnRocm9waWNDb3VudCA9IFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy50b2tlbkNvdW50ID8/IDA7XG4gICAgICAgIGNvbnN0IG9wZW5haVJlYWR5ID0gUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXI/LnJlYWR5V29ya2VyQ291bnQgPz8gMDtcbiAgICAgICAgY29uc3Qgb3BlbmFpVG90YWwgPSBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcj8ud29ya2VyQ291bnQgPz8gMDtcblxuICAgICAgICBsb2cuaW5mbyhgbGlzdGVuaW5nIG9uIGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH1gKTtcbiAgICAgICAgbG9nLmluZm8oYGFudGhyb3BpYzogJHthbnRocm9waWNDb3VudH0gdG9rZW5zIHJlYWR5YCk7XG4gICAgICAgIGxvZy5pbmZvKGBvcGVuYWk6ICR7b3BlbmFpUmVhZHl9LyR7b3BlbmFpVG90YWx9IHRva2VucyByZWFkeWApO1xuICAgICAgICBsb2cuaW5mbyhcbiAgICAgICAgICBgc3Vic2NyaWJlcjogJHtzdGFydGVkID8gXCJMSVNURU4gYWN0aXZlXCIgOiBcImRlZ3JhZGVkXCJ9JHt0cmlnZ2VyUmVhZHkgPyBcIlwiIDogXCIsIHRyaWdnZXIgZmFpbGVkXCJ9YCxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBvblNodXRkb3duOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGxvZyA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInN0YXJ0dXBcIl0pO1xuICAgICAgICBzdG9wRXhwaXJlZFRva2VuUmVtaW5kZXIoKTtcbiAgICAgICAgc2V0U2V0dGluZ0NoYW5nZUhhbmRsZXIobnVsbCk7XG4gICAgICAgIGlmIChRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcikge1xuICAgICAgICAgIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoUWdyaWREaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXIpIHtcbiAgICAgICAgICBhd2FpdCBRZ3JpZERpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlci5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFFncmlkRGlzcGF0Y2hlci5zdWJzY3JpYmVyKSB7XG4gICAgICAgICAgYXdhaXQgUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGxvZy5pbmZvKFwiZ3JhY2VmdWwgc2h1dGRvd25cIik7XG4gICAgICB9LFxuICAgICAgb25FcnJvcjogKGVycm9yLCBfcmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgaGFuZGxlU2VydmVyRXJyb3IoZXJyb3IsIHJlcGx5KTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBLE1BQU0sT0FBTyxRQUFRLElBQUksUUFBUTtBQUNqQyxNQUFNLE9BQU8sT0FBTyxRQUFRLElBQUksUUFBUSxLQUFLO0FBRTdDLE1BQU0sYUFBYTtDQUNqQixNQUFNLFFBQVEsSUFBSSxrQkFBa0I7Q0FDcEMsTUFBTSxPQUFPLFFBQVEsSUFBSSxrQkFBa0IsSUFBSTtDQUMvQyxNQUFNLFFBQVEsSUFBSSxrQkFBa0I7Q0FDcEMsVUFBVSxRQUFRLElBQUksc0JBQXNCO0NBQzVDLFVBQVUsUUFBUSxJQUFJLGtCQUFrQjtBQUMxQztBQUVBLElBQUEsd0JBQWUsYUFBYTtDQUMxQixhQUFhLFFBQVEsSUFBSSxnQkFBZ0I7Q0FDekMsVUFBVSxFQUNSLGdCQUFnQixFQUNkLFlBQVk7RUFDVixHQUFHO0VBQ0gsV0FBVztFQUNYLDZCQUE2QjtDQUMvQixFQUNGLEVBQ0Y7Q0FDQSxLQUFLO0VBQ0gsS0FBSztFQUNMLFVBQVU7RUFDVixPQUFPLEVBQ0wsUUFBUSxPQUNWO0NBQ0Y7Q0FDQSxNQUFNO0VBQ0osZUFBZTtFQUNmLGtCQUFrQixDQUFDLE1BQU0sSUFBSTtDQUMvQjtDQUNBLE1BQU0sRUFDSixTQUFTLENBQUMsS0FBSyxFQUNqQjtDQUNBLE1BQU07RUFDSixVQUFVO0VBQ1YsWUFBWTtFQUNaLFdBQVcsRUFBRSxTQUFTLEtBQUs7Q0FDN0I7Q0FDQSxTQUFTO0VBQ1AsT0FBTztHQUNMLFNBQVMsZUFBZSxFQUN0QixX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
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { SETTING_DEFS } from "../../../application/setting/setting.constant.js";
|
|
2
|
+
import { getSetting } from "../../../application/setting/setting.store.js";
|
|
1
3
|
//#region src/utils/providers/openai/openai-worker-pool-config.ts
|
|
2
4
|
const MAX_OPENAI_WORKERS_PER_TOKEN = 20;
|
|
3
5
|
const DEFAULT_OPENAI_MIN_WORKERS_PER_TOKEN = 1;
|
|
@@ -9,12 +11,25 @@ function boundedInteger(value, fallback, min, max) {
|
|
|
9
11
|
if (!Number.isFinite(parsed)) return fallback;
|
|
10
12
|
return Math.max(min, Math.min(Math.floor(parsed), max));
|
|
11
13
|
}
|
|
12
|
-
function boundedNumber(value, fallback, min) {
|
|
14
|
+
function boundedNumber(value, fallback, min, max) {
|
|
13
15
|
const parsed = Number(value);
|
|
14
16
|
if (!Number.isFinite(parsed)) return fallback;
|
|
15
|
-
return Math.max(min, parsed);
|
|
17
|
+
return Math.max(min, Math.min(parsed, max));
|
|
16
18
|
}
|
|
17
|
-
|
|
19
|
+
/**
|
|
20
|
+
* 설정 저장소(DB) 를 먼저 보고 없으면 env 로 떨어지는 조회 객체.
|
|
21
|
+
*
|
|
22
|
+
* 기존 파싱 로직이 `env[KEY]` 형태를 전제하므로, 소스만 바꿔 끼우고 검증·기본값 처리는
|
|
23
|
+
* 그대로 둔다. `get` 접근만 지원하므로 `in`이나 `Object.keys()`로 조회하지 않는다. 테스트는
|
|
24
|
+
* `env` 인자에 순수한 맵을 넘겨 저장소를 우회한다.
|
|
25
|
+
*/
|
|
26
|
+
function settingsBackedEnv() {
|
|
27
|
+
return new Proxy({}, { get: (_target, prop) => {
|
|
28
|
+
const def = SETTING_DEFS.find((d) => d.envKey === prop);
|
|
29
|
+
return def ? getSetting(def.key, def.envKey) : process.env[prop];
|
|
30
|
+
} });
|
|
31
|
+
}
|
|
32
|
+
function resolveOpenAIWorkerPoolConfig(env = settingsBackedEnv()) {
|
|
18
33
|
const autoscale = env.QGRID_OPENAI_AUTOSCALE !== "false" && env.QGRID_OPENAI_AUTOSCALE !== "0";
|
|
19
34
|
const minWorkersPerToken = boundedInteger(env.QGRID_OPENAI_MIN_WORKERS_PER_TOKEN, DEFAULT_OPENAI_MIN_WORKERS_PER_TOKEN, 1, 20);
|
|
20
35
|
return {
|
|
@@ -23,8 +38,8 @@ function resolveOpenAIWorkerPoolConfig(env = process.env) {
|
|
|
23
38
|
maxWorkersPerToken: autoscale ? Math.max(minWorkersPerToken, boundedInteger(env.QGRID_OPENAI_MAX_WORKERS_PER_TOKEN, DEFAULT_OPENAI_MAX_WORKERS_PER_TOKEN, 1, 20)) : minWorkersPerToken,
|
|
24
39
|
scaleIntervalMs: boundedInteger(env.QGRID_OPENAI_SCALE_INTERVAL_MS, 5e3, 250, 3e5),
|
|
25
40
|
scaleDownIdleMs: boundedInteger(env.QGRID_OPENAI_SCALE_DOWN_IDLE_MS, 10 * 6e4, 1e3, 1440 * 6e4),
|
|
26
|
-
maxEstimatedRssGiB: boundedNumber(env.QGRID_OPENAI_MAX_ESTIMATED_RSS_GIB, 16, 1),
|
|
27
|
-
minHostAvailableGiB: boundedNumber(env.QGRID_OPENAI_MIN_HOST_AVAILABLE_GIB, 20, 0)
|
|
41
|
+
maxEstimatedRssGiB: boundedNumber(env.QGRID_OPENAI_MAX_ESTIMATED_RSS_GIB, 16, 1, 32),
|
|
42
|
+
minHostAvailableGiB: boundedNumber(env.QGRID_OPENAI_MIN_HOST_AVAILABLE_GIB, 20, 0, 64)
|
|
28
43
|
};
|
|
29
44
|
}
|
|
30
45
|
function estimateOpenAIWorkerRssGiB(totalWorkers) {
|
|
@@ -33,4 +48,4 @@ function estimateOpenAIWorkerRssGiB(totalWorkers) {
|
|
|
33
48
|
//#endregion
|
|
34
49
|
export { MAX_OPENAI_WORKERS_PER_TOKEN, OPENAI_WORKER_BASE_RSS_GIB, OPENAI_WORKER_RSS_GIB, estimateOpenAIWorkerRssGiB, resolveOpenAIWorkerPoolConfig };
|
|
35
50
|
|
|
36
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
51
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLXdvcmtlci1wb29sLWNvbmZpZy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktd29ya2VyLXBvb2wtY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIE1BWF9PUEVOQUlfRVNUSU1BVEVEX1JTU19HSUIsXG4gIE1BWF9PUEVOQUlfTUlOX0hPU1RfQVZBSUxBQkxFX0dJQixcbiAgU0VUVElOR19ERUZTLFxufSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vc2V0dGluZy9zZXR0aW5nLmNvbnN0YW50XCI7XG5pbXBvcnQgeyBnZXRTZXR0aW5nIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3NldHRpbmcvc2V0dGluZy5zdG9yZVwiO1xuXG5leHBvcnQgY29uc3QgTUFYX09QRU5BSV9XT1JLRVJTX1BFUl9UT0tFTiA9IDIwO1xuY29uc3QgREVGQVVMVF9PUEVOQUlfTUlOX1dPUktFUlNfUEVSX1RPS0VOID0gMTtcbmNvbnN0IERFRkFVTFRfT1BFTkFJX01BWF9XT1JLRVJTX1BFUl9UT0tFTiA9IDM7XG5cbmV4cG9ydCBjb25zdCBPUEVOQUlfV09SS0VSX0JBU0VfUlNTX0dJQiA9IDAuNzE7XG5leHBvcnQgY29uc3QgT1BFTkFJX1dPUktFUl9SU1NfR0lCID0gMC4xNTc7XG5cbmV4cG9ydCB0eXBlIE9wZW5BSVdvcmtlclBvb2xDb25maWcgPSB7XG4gIGF1dG9zY2FsZTogYm9vbGVhbjtcbiAgbWluV29ya2Vyc1BlclRva2VuOiBudW1iZXI7XG4gIG1heFdvcmtlcnNQZXJUb2tlbjogbnVtYmVyO1xuICBzY2FsZUludGVydmFsTXM6IG51bWJlcjtcbiAgc2NhbGVEb3duSWRsZU1zOiBudW1iZXI7XG4gIG1heEVzdGltYXRlZFJzc0dpQjogbnVtYmVyO1xuICBtaW5Ib3N0QXZhaWxhYmxlR2lCOiBudW1iZXI7XG59O1xuXG5mdW5jdGlvbiBib3VuZGVkSW50ZWdlcihcbiAgdmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZmFsbGJhY2s6IG51bWJlcixcbiAgbWluOiBudW1iZXIsXG4gIG1heDogbnVtYmVyLFxuKTogbnVtYmVyIHtcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHZhbHVlKTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSkgcmV0dXJuIGZhbGxiYWNrO1xuICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihNYXRoLmZsb29yKHBhcnNlZCksIG1heCkpO1xufVxuXG5mdW5jdGlvbiBib3VuZGVkTnVtYmVyKFxuICB2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBmYWxsYmFjazogbnVtYmVyLFxuICBtaW46IG51bWJlcixcbiAgbWF4OiBudW1iZXIsXG4pOiBudW1iZXIge1xuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUpO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShwYXJzZWQpKSByZXR1cm4gZmFsbGJhY2s7XG4gIHJldHVybiBNYXRoLm1heChtaW4sIE1hdGgubWluKHBhcnNlZCwgbWF4KSk7XG59XG5cbi8qKlxuICog7ISk7KCVIOyggOyepeyGjChEQikg66W8IOuovOyggCDrs7Tqs6Ag7JeG7Jy866m0IGVudiDroZwg65ao7Ja07KeA64qUIOyhsO2ajCDqsJ3ssrQuXG4gKlxuICog6riw7KG0IO2MjOyLsSDroZzsp4HsnbQgYGVudltLRVldYCDtmJXtg5zrpbwg7KCE7KCc7ZWY66+A66GcLCDshozsiqTrp4wg67CU6r+UIOuBvOyasOqzoCDqsoDspp3Ct+q4sOuzuOqwkiDsspjrpqzripRcbiAqIOq3uOuMgOuhnCDrkZTri6QuIGBnZXRgIOygkeq3vOunjCDsp4Dsm5DtlZjrr4DroZwgYGluYOydtOuCmCBgT2JqZWN0LmtleXMoKWDroZwg7KGw7ZqM7ZWY7KeAIOyViuuKlOuLpC4g7YWM7Iqk7Yq464qUXG4gKiBgZW52YCDsnbjsnpDsl5Ag7Iic7IiY7ZWcIOunteydhCDrhJjqsqgg7KCA7J6l7IaM66W8IOyasO2ajO2VnOuLpC5cbiAqL1xuZnVuY3Rpb24gc2V0dGluZ3NCYWNrZWRFbnYoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHJldHVybiBuZXcgUHJveHkoe30gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiwge1xuICAgIGdldDogKF90YXJnZXQsIHByb3A6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgZGVmID0gU0VUVElOR19ERUZTLmZpbmQoKGQpID0+IGQuZW52S2V5ID09PSBwcm9wKTtcbiAgICAgIHJldHVybiBkZWYgPyBnZXRTZXR0aW5nKGRlZi5rZXksIGRlZi5lbnZLZXkpIDogcHJvY2Vzcy5lbnZbcHJvcF07XG4gICAgfSxcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlT3BlbkFJV29ya2VyUG9vbENvbmZpZyhcbiAgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+ID0gc2V0dGluZ3NCYWNrZWRFbnYoKSxcbik6IE9wZW5BSVdvcmtlclBvb2xDb25maWcge1xuICBjb25zdCBhdXRvc2NhbGUgPSBlbnYuUUdSSURfT1BFTkFJX0FVVE9TQ0FMRSAhPT0gXCJmYWxzZVwiICYmIGVudi5RR1JJRF9PUEVOQUlfQVVUT1NDQUxFICE9PSBcIjBcIjtcbiAgY29uc3QgbWluV29ya2Vyc1BlclRva2VuID0gYm91bmRlZEludGVnZXIoXG4gICAgZW52LlFHUklEX09QRU5BSV9NSU5fV09SS0VSU19QRVJfVE9LRU4sXG4gICAgREVGQVVMVF9PUEVOQUlfTUlOX1dPUktFUlNfUEVSX1RPS0VOLFxuICAgIDEsXG4gICAgTUFYX09QRU5BSV9XT1JLRVJTX1BFUl9UT0tFTixcbiAgKTtcbiAgcmV0dXJuIHtcbiAgICBhdXRvc2NhbGUsXG4gICAgbWluV29ya2Vyc1BlclRva2VuLFxuICAgIC8vIGF1dG9zY2FsZSDsnbQg6rq87KeA66m0IG1heCDripQgbWluIOycvOuhnCDqs6DsoJXrkJjrr4DroZwgZW52IO2MjOyLsSDsnpDssrTqsIAgYXV0b3NjYWxlIOu2hOq4sCDslYjsl5Drp4wg7J6I64ukLlxuICAgIG1heFdvcmtlcnNQZXJUb2tlbjogYXV0b3NjYWxlXG4gICAgICA/IE1hdGgubWF4KFxuICAgICAgICAgIG1pbldvcmtlcnNQZXJUb2tlbixcbiAgICAgICAgICBib3VuZGVkSW50ZWdlcihcbiAgICAgICAgICAgIGVudi5RR1JJRF9PUEVOQUlfTUFYX1dPUktFUlNfUEVSX1RPS0VOLFxuICAgICAgICAgICAgREVGQVVMVF9PUEVOQUlfTUFYX1dPUktFUlNfUEVSX1RPS0VOLFxuICAgICAgICAgICAgMSxcbiAgICAgICAgICAgIE1BWF9PUEVOQUlfV09SS0VSU19QRVJfVE9LRU4sXG4gICAgICAgICAgKSxcbiAgICAgICAgKVxuICAgICAgOiBtaW5Xb3JrZXJzUGVyVG9rZW4sXG4gICAgc2NhbGVJbnRlcnZhbE1zOiBib3VuZGVkSW50ZWdlcihlbnYuUUdSSURfT1BFTkFJX1NDQUxFX0lOVEVSVkFMX01TLCA1XzAwMCwgMjUwLCAzMDBfMDAwKSxcbiAgICBzY2FsZURvd25JZGxlTXM6IGJvdW5kZWRJbnRlZ2VyKFxuICAgICAgZW52LlFHUklEX09QRU5BSV9TQ0FMRV9ET1dOX0lETEVfTVMsXG4gICAgICAxMCAqIDYwXzAwMCxcbiAgICAgIDFfMDAwLFxuICAgICAgMjQgKiA2MCAqIDYwXzAwMCxcbiAgICApLFxuICAgIG1heEVzdGltYXRlZFJzc0dpQjogYm91bmRlZE51bWJlcihcbiAgICAgIGVudi5RR1JJRF9PUEVOQUlfTUFYX0VTVElNQVRFRF9SU1NfR0lCLFxuICAgICAgMTYsXG4gICAgICAxLFxuICAgICAgTUFYX09QRU5BSV9FU1RJTUFURURfUlNTX0dJQixcbiAgICApLFxuICAgIG1pbkhvc3RBdmFpbGFibGVHaUI6IGJvdW5kZWROdW1iZXIoXG4gICAgICBlbnYuUUdSSURfT1BFTkFJX01JTl9IT1NUX0FWQUlMQUJMRV9HSUIsXG4gICAgICAyMCxcbiAgICAgIDAsXG4gICAgICBNQVhfT1BFTkFJX01JTl9IT1NUX0FWQUlMQUJMRV9HSUIsXG4gICAgKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVzdGltYXRlT3BlbkFJV29ya2VyUnNzR2lCKHRvdGFsV29ya2VyczogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE9QRU5BSV9XT1JLRVJfQkFTRV9SU1NfR0lCICsgT1BFTkFJX1dPUktFUl9SU1NfR0lCICogdG90YWxXb3JrZXJzO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7QUFPQSxNQUFhLCtCQUErQjtBQUM1QyxNQUFNLHVDQUF1QztBQUM3QyxNQUFNLHVDQUF1QztBQUU3QyxNQUFhLDZCQUE2QjtBQUMxQyxNQUFhLHdCQUF3QjtBQVlyQyxTQUFTLGVBQ1AsT0FDQSxVQUNBLEtBQ0EsS0FDUTtDQUNSLE1BQU0sU0FBUyxPQUFPLEtBQUs7Q0FDM0IsSUFBSSxDQUFDLE9BQU8sU0FBUyxNQUFNLEdBQUcsT0FBTztDQUNyQyxPQUFPLEtBQUssSUFBSSxLQUFLLEtBQUssSUFBSSxLQUFLLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQztBQUN4RDtBQUVBLFNBQVMsY0FDUCxPQUNBLFVBQ0EsS0FDQSxLQUNRO0NBQ1IsTUFBTSxTQUFTLE9BQU8sS0FBSztDQUMzQixJQUFJLENBQUMsT0FBTyxTQUFTLE1BQU0sR0FBRyxPQUFPO0NBQ3JDLE9BQU8sS0FBSyxJQUFJLEtBQUssS0FBSyxJQUFJLFFBQVEsR0FBRyxDQUFDO0FBQzVDOzs7Ozs7OztBQVNBLFNBQVMsb0JBQXdEO0NBQy9ELE9BQU8sSUFBSSxNQUFNLENBQUMsR0FBeUMsRUFDekQsTUFBTSxTQUFTLFNBQWlCO0VBQzlCLE1BQU0sTUFBTSxhQUFhLE1BQU0sTUFBTSxFQUFFLFdBQVcsSUFBSTtFQUN0RCxPQUFPLE1BQU0sV0FBVyxJQUFJLEtBQUssSUFBSSxNQUFNLElBQUksUUFBUSxJQUFJO0NBQzdELEVBQ0YsQ0FBQztBQUNIO0FBRUEsU0FBZ0IsOEJBQ2QsTUFBMEMsa0JBQWtCLEdBQ3BDO0NBQ3hCLE1BQU0sWUFBWSxJQUFJLDJCQUEyQixXQUFXLElBQUksMkJBQTJCO0NBQzNGLE1BQU0scUJBQXFCLGVBQ3pCLElBQUksb0NBQ0osc0NBQ0EsR0FBQSxFQUVGO0NBQ0EsT0FBTztFQUNMO0VBQ0E7RUFFQSxvQkFBb0IsWUFDaEIsS0FBSyxJQUNILG9CQUNBLGVBQ0UsSUFBSSxvQ0FDSixzQ0FDQSxHQUFBLEVBRUYsQ0FDRixJQUNBO0VBQ0osaUJBQWlCLGVBQWUsSUFBSSxnQ0FBZ0MsS0FBTyxLQUFLLEdBQU87RUFDdkYsaUJBQWlCLGVBQ2YsSUFBSSxpQ0FDSixLQUFLLEtBQ0wsS0FDQSxPQUFVLEdBQ1o7RUFDQSxvQkFBb0IsY0FDbEIsSUFBSSxvQ0FDSixJQUNBLEdBQUEsRUFFRjtFQUNBLHFCQUFxQixjQUNuQixJQUFJLHFDQUNKLElBQ0EsR0FBQSxFQUVGO0NBQ0Y7QUFDRjtBQUVBLFNBQWdCLDJCQUEyQixjQUE4QjtDQUN2RSxPQUFPLDZCQUE2Qix3QkFBd0I7QUFDOUQifQ==
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
//#region src/utils/quiet-hours.ts
|
|
2
|
+
/** `setting.constant.ts` 의 두 fallback 과 같아야 한다. 일치 여부는 테스트가 지킨다. */
|
|
3
|
+
const DEFAULT_QUIET_FROM_HOUR = 20;
|
|
4
|
+
const DEFAULT_QUIET_UNTIL_HOUR = 8;
|
|
5
|
+
/**
|
|
6
|
+
* 서버가 UTC 로 돌아도 한국 시간으로 판정한다. dev0 는 UTC 이므로 `getHours()` 를 그대로
|
|
7
|
+
* 쓰면 "저녁 8시"가 한국 시간 새벽 5시가 된다.
|
|
8
|
+
*/
|
|
9
|
+
const SEOUL_FORMATTER = new Intl.DateTimeFormat("en-US", {
|
|
10
|
+
timeZone: "Asia/Seoul",
|
|
11
|
+
hour: "numeric",
|
|
12
|
+
hour12: false,
|
|
13
|
+
weekday: "short"
|
|
14
|
+
});
|
|
15
|
+
function seoulParts(at) {
|
|
16
|
+
const parts = SEOUL_FORMATTER.formatToParts(at);
|
|
17
|
+
const hour = Number(parts.find((p) => p.type === "hour")?.value ?? "0");
|
|
18
|
+
const weekday = parts.find((p) => p.type === "weekday")?.value ?? "";
|
|
19
|
+
return {
|
|
20
|
+
hour: hour % 24,
|
|
21
|
+
weekday
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/** 0..23 범위를 벗어나거나 숫자가 아니면 기본값으로 떨어진다. */
|
|
25
|
+
function boundedHour(raw, fallback) {
|
|
26
|
+
const parsed = Number(raw);
|
|
27
|
+
if (!Number.isInteger(parsed) || parsed < 0 || parsed > 23) return fallback;
|
|
28
|
+
return parsed;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 조용 시간인지 판정한다.
|
|
32
|
+
*
|
|
33
|
+
* 시작 > 종료면 자정을 넘는 구간(20시~익일 8시), 시작 < 종료면 같은 날 구간(0시~8시처럼)
|
|
34
|
+
* 으로 읽는다. 야간 근무처럼 낮에 조용하고 싶은 팀도 있어 뒤집힌 값을 막지 않는다.
|
|
35
|
+
*/
|
|
36
|
+
function isQuietHours(at, readSetting) {
|
|
37
|
+
const { hour, weekday } = seoulParts(at);
|
|
38
|
+
if ((weekday === "Sat" || weekday === "Sun") && readSetting("slack.notifyOnWeekends", "SLACK_NOTIFY_ON_WEEKENDS") !== "true") return true;
|
|
39
|
+
const from = boundedHour(readSetting("slack.quietFromHour", "SLACK_QUIET_FROM_HOUR"), 20);
|
|
40
|
+
const until = boundedHour(readSetting("slack.quietUntilHour", "SLACK_QUIET_UNTIL_HOUR"), 8);
|
|
41
|
+
if (from === until) return false;
|
|
42
|
+
return from > until ? hour >= from || hour < until : hour >= from && hour < until;
|
|
43
|
+
}
|
|
44
|
+
//#endregion
|
|
45
|
+
export { DEFAULT_QUIET_FROM_HOUR, DEFAULT_QUIET_UNTIL_HOUR, isQuietHours };
|
|
46
|
+
|
|
47
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpZXQtaG91cnMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3F1aWV0LWhvdXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2xhY2sg7JWM66a8IOyhsOyaqSDsi5zqsIQuXG4gKlxuICog7Yag7YGwIOunjOujjOuKlCDsgqzrnozsnbQg7J6s66Gc6re47J247ZW07JW8IO2SgOumrOuKlOuNsCwg6re4IOyCrOuejOydtCDsnpDqsbDrgpgg7Ims64qUIOuPmeyViCDslYzroKTrj4Qg7ZWgIOyImCDsnojripRcbiAqIOydvOydtCDsl4bri6QuIOyXheustCDsi5zqsITsl5Drp4wg7JWM66as6rOgIOuCmOuouOyngOuKlCDri6TsnYwg6re866y0IOyLnOqwhOycvOuhnCDrr7jro6zri6Qg4oCUIOunjOujjCDslYzrprzsnYBcbiAqIOyjvOq4sOyggeycvOuhnCDrsJjrs7XrkJjrr4DroZwg7KGw7JqpIOyLnOqwhOyXkCDrsoTroKTrj4Qg7JWE7LmoIOyyqyDso7zquLDsl5Ag64uk7IucIOyYqOuLpC5cbiAqXG4gKiDri6Trp4wgcHJvdmlkZXIg7J2YIOuniOyngOuniSDthqDtgbDsnbQg7KO964qUIOqyg+ydgCDshJzruYTsiqQg7KCV7KeAIOyLoO2YuOudvCDsnbQg6rec7LmZ7JeQ7IScIOygnOyZuO2VnOuLpFxuICogKO2YuOy2nOu2gOqwgCBgdXJnZW50OiB0cnVlYCDroZwg67O064K066m0IOuQnOuLpCkuXG4gKi9cbmltcG9ydCB7IHR5cGUgZ2V0U2V0dGluZyB9IGZyb20gXCIuLi9hcHBsaWNhdGlvbi9zZXR0aW5nL3NldHRpbmcuc3RvcmVcIjtcblxuLyoqXG4gKiDshKTsoJUg7KGw7ZqMIO2VqOyImOydmCDtmJXtg5zrp4wg67mM66aw64ukIOKAlCBgdHlwZWAgaW1wb3J0IOudvCDrn7Dtg4DsnoQg7J2Y7KG07J20IOyDneq4sOyngCDslYrripTri6QuXG4gKlxuICog6rCSIOyekOyytOuKlCDtla3sg4Eg7Zi47Lac67aAKGBzbGFjay1ub3RpZnlgKeqwgCDrhJjquLTri6QuIOyXrOq4sOyEnCBgZ2V0U2V0dGluZ2Ag7J2EIOyLpOygnOuhnCBpbXBvcnQg7ZWY66m0XG4gKiBgc2V0dGluZy5zdG9yZSDihpIgc2V0dGluZy5tb2RlbCDihpIgdG9rZW4ubW9kZWxgIOydtCDrlLjroKTsmYAsIGB0b2tlbi5tb2RlbGAg7J2EIG1vY2sg7ZWY64qUXG4gKiDthYzsiqTtirjrk6TsnbQg7Iuk7KCcIOuqqOuTiOydhCDrqLzsoIAg66Gc65Oc7ZW0IOuyhOumsOuLpC4g7KGw7JqpIOyLnOqwhCDtjJDsoJXsnYAg7Iuc6rCBIOqzhOyCsOydtOyngCDshKTsoJUg7KGw7ZqM6rCAXG4gKiDslYTri4jrr4DroZwsIOydveuKlCDssYXsnoTsnYAg7J2066+4IOyEpOygleydhCDsnb3qs6Ag7J6I64qUIO2YuOy2nOu2gOyXkCDrkZTri6QuXG4gKi9cbnR5cGUgUmVhZFNldHRpbmcgPSB0eXBlb2YgZ2V0U2V0dGluZztcblxuLyoqIGBzZXR0aW5nLmNvbnN0YW50LnRzYCDsnZgg65GQIGZhbGxiYWNrIOqzvCDqsJnslYTslbwg7ZWc64ukLiDsnbzsuZgg7Jes67aA64qUIO2FjOyKpO2KuOqwgCDsp4Dtgqjri6QuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9RVUlFVF9GUk9NX0hPVVIgPSAyMDtcbmV4cG9ydCBjb25zdCBERUZBVUxUX1FVSUVUX1VOVElMX0hPVVIgPSA4O1xuXG4vKipcbiAqIOyEnOuyhOqwgCBVVEMg66GcIOuPjOyVhOuPhCDtlZzqta0g7Iuc6rCE7Jy866GcIO2MkOygle2VnOuLpC4gZGV2MCDripQgVVRDIOydtOuvgOuhnCBgZ2V0SG91cnMoKWAg66W8IOq3uOuMgOuhnFxuICog7JOw66m0IFwi7KCA64WBIDjsi5xcIuqwgCDtlZzqta0g7Iuc6rCEIOyDiOuyvSA17Iuc6rCAIOuQnOuLpC5cbiAqL1xuY29uc3QgU0VPVUxfRk9STUFUVEVSID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoXCJlbi1VU1wiLCB7XG4gIHRpbWVab25lOiBcIkFzaWEvU2VvdWxcIixcbiAgaG91cjogXCJudW1lcmljXCIsXG4gIGhvdXIxMjogZmFsc2UsXG4gIHdlZWtkYXk6IFwic2hvcnRcIixcbn0pO1xuXG5mdW5jdGlvbiBzZW91bFBhcnRzKGF0OiBEYXRlKTogeyBob3VyOiBudW1iZXI7IHdlZWtkYXk6IHN0cmluZyB9IHtcbiAgY29uc3QgcGFydHMgPSBTRU9VTF9GT1JNQVRURVIuZm9ybWF0VG9QYXJ0cyhhdCk7XG4gIGNvbnN0IGhvdXIgPSBOdW1iZXIocGFydHMuZmluZCgocCkgPT4gcC50eXBlID09PSBcImhvdXJcIik/LnZhbHVlID8/IFwiMFwiKTtcbiAgY29uc3Qgd2Vla2RheSA9IHBhcnRzLmZpbmQoKHApID0+IHAudHlwZSA9PT0gXCJ3ZWVrZGF5XCIpPy52YWx1ZSA/PyBcIlwiO1xuICAvLyBJbnRsIOydgCDsnpDsoJXsnYQgMjQg66GcIOykhCDsiJgg7J6I64ukLiAwLi4yMyDsnLzroZwg66ee7LaY64ukLlxuICByZXR1cm4geyBob3VyOiBob3VyICUgMjQsIHdlZWtkYXkgfTtcbn1cblxuLyoqIDAuLjIzIOuylOychOulvCDrspfslrTrgpjqsbDrgpgg7Iir7J6Q6rCAIOyVhOuLiOuptCDquLDrs7jqsJLsnLzroZwg65ao7Ja07KeE64ukLiAqL1xuZnVuY3Rpb24gYm91bmRlZEhvdXIocmF3OiBzdHJpbmcgfCB1bmRlZmluZWQsIGZhbGxiYWNrOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIocmF3KTtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHBhcnNlZCkgfHwgcGFyc2VkIDwgMCB8fCBwYXJzZWQgPiAyMykgcmV0dXJuIGZhbGxiYWNrO1xuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIOyhsOyaqSDsi5zqsITsnbjsp4Ag7YyQ7KCV7ZWc64ukLlxuICpcbiAqIOyLnOyekSA+IOyiheujjOuptCDsnpDsoJXsnYQg64SY64qUIOq1rOqwhCgyMOyLnH7snbXsnbwgOOyLnCksIOyLnOyekSA8IOyiheujjOuptCDqsJnsnYAg64KgIOq1rOqwhCgw7Iucfjjsi5zsspjrn7wpXG4gKiDsnLzroZwg7J2964qU64ukLiDslbzqsIQg6re866y07LKY65+8IOuCruyXkCDsobDsmqntlZjqs6Ag7Iu27J2AIO2MgOuPhCDsnojslrQg65Kk7KeR7Z6MIOqwkuydhCDrp4nsp4Ag7JWK64qU64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNRdWlldEhvdXJzKGF0OiBEYXRlLCByZWFkU2V0dGluZzogUmVhZFNldHRpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgeyBob3VyLCB3ZWVrZGF5IH0gPSBzZW91bFBhcnRzKGF0KTtcblxuICBjb25zdCBpc1dlZWtlbmQgPSB3ZWVrZGF5ID09PSBcIlNhdFwiIHx8IHdlZWtkYXkgPT09IFwiU3VuXCI7XG4gIGlmIChpc1dlZWtlbmQgJiYgcmVhZFNldHRpbmcoXCJzbGFjay5ub3RpZnlPbldlZWtlbmRzXCIsIFwiU0xBQ0tfTk9USUZZX09OX1dFRUtFTkRTXCIpICE9PSBcInRydWVcIikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgZnJvbSA9IGJvdW5kZWRIb3VyKFxuICAgIHJlYWRTZXR0aW5nKFwic2xhY2sucXVpZXRGcm9tSG91clwiLCBcIlNMQUNLX1FVSUVUX0ZST01fSE9VUlwiKSxcbiAgICBERUZBVUxUX1FVSUVUX0ZST01fSE9VUixcbiAgKTtcbiAgY29uc3QgdW50aWwgPSBib3VuZGVkSG91cihcbiAgICByZWFkU2V0dGluZyhcInNsYWNrLnF1aWV0VW50aWxIb3VyXCIsIFwiU0xBQ0tfUVVJRVRfVU5USUxfSE9VUlwiKSxcbiAgICBERUZBVUxUX1FVSUVUX1VOVElMX0hPVVIsXG4gICk7XG5cbiAgLy8g7Iuc7J6R6rO8IOyiheujjOqwgCDqsJnsnLzrqbQg6rWs6rCE7J20IOu5hOyWtCDsnojri6TripQg65y77Jy866GcIOydveyWtCDsobDsmqkg7Iuc6rCE7J2EIOuRkOyngCDslYrripTri6QuXG4gIGlmIChmcm9tID09PSB1bnRpbCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZnJvbSA+IHVudGlsID8gaG91ciA+PSBmcm9tIHx8IGhvdXIgPCB1bnRpbCA6IGhvdXIgPj0gZnJvbSAmJiBob3VyIDwgdW50aWw7XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBdUJBLE1BQWEsMEJBQTBCO0FBQ3ZDLE1BQWEsMkJBQTJCOzs7OztBQU14QyxNQUFNLGtCQUFrQixJQUFJLEtBQUssZUFBZSxTQUFTO0NBQ3ZELFVBQVU7Q0FDVixNQUFNO0NBQ04sUUFBUTtDQUNSLFNBQVM7QUFDWCxDQUFDO0FBRUQsU0FBUyxXQUFXLElBQTZDO0NBQy9ELE1BQU0sUUFBUSxnQkFBZ0IsY0FBYyxFQUFFO0NBQzlDLE1BQU0sT0FBTyxPQUFPLE1BQU0sTUFBTSxNQUFNLEVBQUUsU0FBUyxNQUFNLENBQUMsRUFBRSxTQUFTLEdBQUc7Q0FDdEUsTUFBTSxVQUFVLE1BQU0sTUFBTSxNQUFNLEVBQUUsU0FBUyxTQUFTLENBQUMsRUFBRSxTQUFTO0NBRWxFLE9BQU87RUFBRSxNQUFNLE9BQU87RUFBSTtDQUFRO0FBQ3BDOztBQUdBLFNBQVMsWUFBWSxLQUF5QixVQUEwQjtDQUN0RSxNQUFNLFNBQVMsT0FBTyxHQUFHO0NBQ3pCLElBQUksQ0FBQyxPQUFPLFVBQVUsTUFBTSxLQUFLLFNBQVMsS0FBSyxTQUFTLElBQUksT0FBTztDQUNuRSxPQUFPO0FBQ1Q7Ozs7Ozs7QUFRQSxTQUFnQixhQUFhLElBQVUsYUFBbUM7Q0FDeEUsTUFBTSxFQUFFLE1BQU0sWUFBWSxXQUFXLEVBQUU7Q0FHdkMsS0FEa0IsWUFBWSxTQUFTLFlBQVksVUFDbEMsWUFBWSwwQkFBMEIsMEJBQTBCLE1BQU0sUUFDckYsT0FBTztDQUdULE1BQU0sT0FBTyxZQUNYLFlBQVksdUJBQXVCLHVCQUF1QixHQUFBLEVBRTVEO0NBQ0EsTUFBTSxRQUFRLFlBQ1osWUFBWSx3QkFBd0Isd0JBQXdCLEdBQUEsQ0FFOUQ7Q0FHQSxJQUFJLFNBQVMsT0FBTyxPQUFPO0NBQzNCLE9BQU8sT0FBTyxRQUFRLFFBQVEsUUFBUSxPQUFPLFFBQVEsUUFBUSxRQUFRLE9BQU87QUFDOUUifQ==
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
import { getSetting } from "../application/setting/setting.store.js";
|
|
2
|
+
import { isQuietHours } from "./quiet-hours.js";
|
|
1
3
|
import { getLogger } from "@logtape/logtape";
|
|
2
4
|
//#region src/utils/slack-notify.ts
|
|
3
5
|
/**
|
|
4
6
|
* Slack 알림 (chat.postMessage).
|
|
5
7
|
*
|
|
6
8
|
* fail-open: env 미설정이면 조용히 no-op 이고, 전송 실패는 warn 로그로만 남긴다.
|
|
9
|
+
* 조용 시간(주말·20~8시)에는 `urgent` 가 아닌 알림을 보내지 않는다.
|
|
7
10
|
* 알림 경로가 토큰 라우팅이나 오류 전파를 지연·차단해서는 안 된다.
|
|
8
11
|
*/
|
|
9
12
|
const logger = getLogger(["qgrid", "slack"]);
|
|
@@ -14,14 +17,22 @@ const SLACK_COLOR = {
|
|
|
14
17
|
good: "#2eb886",
|
|
15
18
|
bad: "#e01e5a"
|
|
16
19
|
};
|
|
17
|
-
async function notifySlack(notification) {
|
|
18
|
-
const botToken =
|
|
19
|
-
const channel =
|
|
20
|
-
const { title, subject, context, color } = notification;
|
|
20
|
+
async function notifySlack(notification, readSetting = getSetting) {
|
|
21
|
+
const botToken = readSetting("slack.botToken", "SLACK_BOT_TOKEN");
|
|
22
|
+
const channel = readSetting("slack.channelId", "SLACK_CHANNEL_ID");
|
|
23
|
+
const { title, subject, context, color, urgent, now } = notification;
|
|
21
24
|
if (!botToken || !channel) {
|
|
22
25
|
logger.debug(`slack not configured, skipping notification: ${title} ${subject ?? ""}`);
|
|
23
26
|
return;
|
|
24
27
|
}
|
|
28
|
+
if (!urgent && readSetting("slack.enabled", "SLACK_ENABLED") === "false") {
|
|
29
|
+
logger.debug(`slack disabled, skipping notification: ${title} ${subject ?? ""}`);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (!urgent && isQuietHours(now ?? /* @__PURE__ */ new Date(), readSetting)) {
|
|
33
|
+
logger.debug(`quiet hours, skipping notification: ${title} ${subject ?? ""}`);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
25
36
|
const blocks = [{
|
|
26
37
|
type: "section",
|
|
27
38
|
text: {
|
|
@@ -62,4 +73,4 @@ async function notifySlack(notification) {
|
|
|
62
73
|
//#endregion
|
|
63
74
|
export { SLACK_COLOR, notifySlack };
|
|
64
75
|
|
|
65
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
76
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhY2stbm90aWZ5LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zbGFjay1ub3RpZnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTbGFjayDslYzrprwgKGNoYXQucG9zdE1lc3NhZ2UpLlxuICpcbiAqIGZhaWwtb3BlbjogZW52IOuvuOyEpOygleydtOuptCDsobDsmqntnoggbm8tb3Ag7J206rOgLCDsoITshqEg7Iuk7Yyo64qUIHdhcm4g66Gc6re466Gc66eMIOuCqOq4tOuLpC5cbiAqIOyhsOyaqSDsi5zqsIQo7KO866eQwrcyMH447IucKeyXkOuKlCBgdXJnZW50YCDqsIAg7JWE64uMIOyVjOumvOydhCDrs7TrgrTsp4Ag7JWK64qU64ukLlxuICog7JWM66a8IOqyveuhnOqwgCDthqDtgbAg65287Jqw7YyF7J2064KYIOyYpOulmCDsoITtjIzrpbwg7KeA7JewwrfssKjri6jtlbTshJzripQg7JWIIOuQnOuLpC5cbiAqL1xuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgZ2V0U2V0dGluZyB9IGZyb20gXCIuLi9hcHBsaWNhdGlvbi9zZXR0aW5nL3NldHRpbmcuc3RvcmVcIjtcbmltcG9ydCB7IGlzUXVpZXRIb3VycyB9IGZyb20gXCIuL3F1aWV0LWhvdXJzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInNsYWNrXCJdKTtcblxuY29uc3QgU0xBQ0tfUE9TVF9NRVNTQUdFX1VSTCA9IFwiaHR0cHM6Ly9zbGFjay5jb20vYXBpL2NoYXQucG9zdE1lc3NhZ2VcIjtcbmNvbnN0IFNMQUNLX1RJTUVPVVRfTVMgPSA1XzAwMDtcblxuLyoqIOyDge2DnOulvCDsg4nsnLzroZwg66i87KCAIOydve2eiOqyjCDtlZjripQgYXR0YWNobWVudCDsg4nsg4Eg67CULiAqL1xuZXhwb3J0IGNvbnN0IFNMQUNLX0NPTE9SID0ge1xuICBnb29kOiBcIiMyZWI4ODZcIixcbiAgYmFkOiBcIiNlMDFlNWFcIixcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNsYWNrTm90aWZpY2F0aW9uID0ge1xuICAvKiog7ZWcIOykhCDsoJzrqqkuIOustOyKqCDsnbzsnbQg7J287Ja064Ks64qU7KeA66eMIOuLtOuKlOuLpC4gKi9cbiAgdGl0bGU6IHN0cmluZztcbiAgLyoqIOygnOuqqSDsmIYg7L2U65OcIOyKpO2DgOydvOuhnCDrtpnripQg64yA7IOBIOyLneuzhOyekC4gKi9cbiAgc3ViamVjdD86IHN0cmluZztcbiAgLyoqIOygnOuqqSDslYTrnpgg7J6R7J2AIOq4gOyUqOuhnCDrgrTroKTqsIDripQg67aA6rCAIOygleuztCDigJQg7J297KeAIOyViuyVhOuPhCDrkJjripQg6rKD65OkLiAqL1xuICBjb250ZXh0Pzogc3RyaW5nO1xuICBjb2xvcj86ICh0eXBlb2YgU0xBQ0tfQ09MT1IpW2tleW9mIHR5cGVvZiBTTEFDS19DT0xPUl07XG4gIC8qKlxuICAgKiDsobDsmqkg7Iuc6rCEKOyjvOunkMK3MjB+OOyLnCnsl5Drj4Qg67O064K464ukLiDshJzruYTsiqTqsIAg66mI7LaYIOyDge2DnOyymOufvCDsp4DquIgg7JWM7KeAIOyViuycvOuptCDshpDtlbTqsIBcbiAgICog7Luk7KeA64qUIOyCrOqxtOyXkOunjCDsk7Tri6Qg4oCUIOuCqOyaqe2VmOuptCDsobDsmqkg7Iuc6rCEIOyekOyytOqwgCDrrLTsnZjrr7jtlbTsp4Tri6QuXG4gICAqL1xuICB1cmdlbnQ/OiBib29sZWFuO1xuICAvKiog7KGw7JqpIOyLnOqwhCDtjJDsoJUg6riw7KSAIOyLnOqwgS4g7YWM7Iqk7Yq47JeQ7IScIOyLnOqzhOulvCDqs6DsoJXtlaAg65WM66eMIOuEmOq4tOuLpC4gKi9cbiAgbm93PzogRGF0ZTtcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBub3RpZnlTbGFjayhcbiAgbm90aWZpY2F0aW9uOiBTbGFja05vdGlmaWNhdGlvbixcbiAgcmVhZFNldHRpbmc6IHR5cGVvZiBnZXRTZXR0aW5nID0gZ2V0U2V0dGluZyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBib3RUb2tlbiA9IHJlYWRTZXR0aW5nKFwic2xhY2suYm90VG9rZW5cIiwgXCJTTEFDS19CT1RfVE9LRU5cIik7XG4gIGNvbnN0IGNoYW5uZWwgPSByZWFkU2V0dGluZyhcInNsYWNrLmNoYW5uZWxJZFwiLCBcIlNMQUNLX0NIQU5ORUxfSURcIik7XG4gIGNvbnN0IHsgdGl0bGUsIHN1YmplY3QsIGNvbnRleHQsIGNvbG9yLCB1cmdlbnQsIG5vdyB9ID0gbm90aWZpY2F0aW9uO1xuICBpZiAoIWJvdFRva2VuIHx8ICFjaGFubmVsKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBzbGFjayBub3QgY29uZmlndXJlZCwgc2tpcHBpbmcgbm90aWZpY2F0aW9uOiAke3RpdGxlfSAke3N1YmplY3QgPz8gXCJcIn1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyDsl7DtnLTsspjrn7wg6rec7LmZ7Jy866GcIOyeoeydhCDsiJgg7JeG64qUIOq4sOqwhOyXkCDqtIDrpqzsnpDqsIAg64K066as64qUIOyKpOychOy5mC4gdXJnZW50IOuKlCDthrXqs7zsi5ztgqjri6Qg4oCUXG4gIC8vIOuBiCDsg4Htg5zroZwgcHJvdmlkZXIg6rCAIOyghOu2gCDso73snLzrqbQg7Jew7Zy0IOuCtOuCtCDshJzruYTsiqTqsIAg66mI7LaYIOykhCDslYTrrLTrj4Qg66qo66W464ukLlxuICBpZiAoIXVyZ2VudCAmJiByZWFkU2V0dGluZyhcInNsYWNrLmVuYWJsZWRcIiwgXCJTTEFDS19FTkFCTEVEXCIpID09PSBcImZhbHNlXCIpIHtcbiAgICBsb2dnZXIuZGVidWcoYHNsYWNrIGRpc2FibGVkLCBza2lwcGluZyBub3RpZmljYXRpb246ICR7dGl0bGV9ICR7c3ViamVjdCA/PyBcIlwifWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIOunjOujjCDslYzrprzsnYAg7KO86riw7KCB7Jy866GcIOuwmOuzteuQmOuvgOuhnCDsl6zquLDshJwg67KE66Ck64+EIOuLpOydjCDqt7zrrLQg7Iuc6rCEIOyyqyDso7zquLDsl5Ag64uk7IucIOyYqOuLpC5cbiAgaWYgKCF1cmdlbnQgJiYgaXNRdWlldEhvdXJzKG5vdyA/PyBuZXcgRGF0ZSgpLCByZWFkU2V0dGluZykpIHtcbiAgICBsb2dnZXIuZGVidWcoYHF1aWV0IGhvdXJzLCBza2lwcGluZyBub3RpZmljYXRpb246ICR7dGl0bGV9ICR7c3ViamVjdCA/PyBcIlwifWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGJsb2NrczogdW5rbm93bltdID0gW1xuICAgIHtcbiAgICAgIHR5cGU6IFwic2VjdGlvblwiLFxuICAgICAgdGV4dDogeyB0eXBlOiBcIm1ya2R3blwiLCB0ZXh0OiBzdWJqZWN0ID8gYCoke3RpdGxlfSogIFxcYCR7c3ViamVjdH1cXGBgIDogYCoke3RpdGxlfSpgIH0sXG4gICAgfSxcbiAgXTtcbiAgaWYgKGNvbnRleHQpIHtcbiAgICBibG9ja3MucHVzaCh7IHR5cGU6IFwiY29udGV4dFwiLCBlbGVtZW50czogW3sgdHlwZTogXCJtcmtkd25cIiwgdGV4dDogY29udGV4dCB9XSB9KTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goU0xBQ0tfUE9TVF9NRVNTQUdFX1VSTCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCIsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtib3RUb2tlbn1gLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgLy8gZmFsbGJhY2sg7J2AIGF0dGFjaG1lbnQg7JWI7JeQIOuRlOuLpC4g7LWc7IOB7JyEIHRleHQg66GcIOuztOuCtOuptCBibG9ja3Mg6rCAIOygleyDgSDroIzrjZTrkJjripRcbiAgICAgICAgLy8g7ZmU66m07JeQ7ISc64+EIO2VqOq7mCDstpzroKXrj7wg7KCc66qp7J20IOuRkCDrsogg67O07J2464ukLiBhdHRhY2htZW50IGZhbGxiYWNrIOydgCBibG9ja3Mg66W8XG4gICAgICAgIC8vIOuquyDqt7jrpqzripQg7YG065287J207Ja47Yq47JmAIO2RuOyLnCDslYzrprzsl5DshJzrp4wg7JOw7J2464ukLlxuICAgICAgICBhdHRhY2htZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZhbGxiYWNrOiBzdWJqZWN0ID8gYCR7dGl0bGV9IOKAlCAke3N1YmplY3R9YCA6IHRpdGxlLFxuICAgICAgICAgICAgLi4uKGNvbG9yID8geyBjb2xvciB9IDoge30pLFxuICAgICAgICAgICAgYmxvY2tzLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dChTTEFDS19USU1FT1VUX01TKSxcbiAgICB9KTtcblxuICAgIC8vIGJvdCDrr7jstIjrjIAobm90X2luX2NoYW5uZWwpwrfsnpjrqrvrkJwg7LGE64SQIOuTsSDqsIDsnqUg7Z2U7ZWcIOyYpOyEpOygleydgCBIVFRQIDIwMCArIG9rOmZhbHNlIOuhnCDsmKjri6QuXG4gICAgLy8gc3RhdHVzIOunjCDrs7TrqbQg7KGw7Jqp7Z6IIOyEseqztSDsspjrpqzrj7wg7JWM66a87J20IO2GteynuOuhnCDsgqzrnbzsp4Tri6QuXG4gICAgY29uc3QgYm9keSA9IChhd2FpdCByZXMuanNvbigpLmNhdGNoKCgpID0+IG51bGwpKSBhcyB7IG9rPzogYm9vbGVhbjsgZXJyb3I/OiBzdHJpbmcgfSB8IG51bGw7XG4gICAgaWYgKCFib2R5Py5vaykge1xuICAgICAgbG9nZ2VyLndhcm4oYHNsYWNrIG5vdGlmaWNhdGlvbiByZWplY3RlZDogJHtib2R5Py5lcnJvciA/PyBgaHR0cCAke3Jlcy5zdGF0dXN9YH1gKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIud2Fybihgc2xhY2sgbm90aWZpY2F0aW9uIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQVlBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyxPQUFPLENBQUM7QUFFM0MsTUFBTSx5QkFBeUI7QUFDL0IsTUFBTSxtQkFBbUI7O0FBR3pCLE1BQWEsY0FBYztDQUN6QixNQUFNO0NBQ04sS0FBSztBQUNQO0FBbUJBLGVBQXNCLFlBQ3BCLGNBQ0EsY0FBaUMsWUFDbEI7Q0FDZixNQUFNLFdBQVcsWUFBWSxrQkFBa0IsaUJBQWlCO0NBQ2hFLE1BQU0sVUFBVSxZQUFZLG1CQUFtQixrQkFBa0I7Q0FDakUsTUFBTSxFQUFFLE9BQU8sU0FBUyxTQUFTLE9BQU8sUUFBUSxRQUFRO0NBQ3hELElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUztFQUN6QixPQUFPLE1BQU0sZ0RBQWdELE1BQU0sR0FBRyxXQUFXLElBQUk7RUFDckY7Q0FDRjtDQUlBLElBQUksQ0FBQyxVQUFVLFlBQVksaUJBQWlCLGVBQWUsTUFBTSxTQUFTO0VBQ3hFLE9BQU8sTUFBTSwwQ0FBMEMsTUFBTSxHQUFHLFdBQVcsSUFBSTtFQUMvRTtDQUNGO0NBR0EsSUFBSSxDQUFDLFVBQVUsYUFBYSx1QkFBTyxJQUFJLEtBQUssR0FBRyxXQUFXLEdBQUc7RUFDM0QsT0FBTyxNQUFNLHVDQUF1QyxNQUFNLEdBQUcsV0FBVyxJQUFJO0VBQzVFO0NBQ0Y7Q0FFQSxNQUFNLFNBQW9CLENBQ3hCO0VBQ0UsTUFBTTtFQUNOLE1BQU07R0FBRSxNQUFNO0dBQVUsTUFBTSxVQUFVLElBQUksTUFBTSxPQUFPLFFBQVEsTUFBTSxJQUFJLE1BQU07RUFBRztDQUN0RixDQUNGO0NBQ0EsSUFBSSxTQUNGLE9BQU8sS0FBSztFQUFFLE1BQU07RUFBVyxVQUFVLENBQUM7R0FBRSxNQUFNO0dBQVUsTUFBTTtFQUFRLENBQUM7Q0FBRSxDQUFDO0NBR2hGLElBQUk7RUFDRixNQUFNLE1BQU0sTUFBTSxNQUFNLHdCQUF3QjtHQUM5QyxRQUFRO0dBQ1IsU0FBUztJQUNQLGdCQUFnQjtJQUNoQixlQUFlLFVBQVU7R0FDM0I7R0FDQSxNQUFNLEtBQUssVUFBVTtJQUNuQjtJQUlBLGFBQWEsQ0FDWDtLQUNFLFVBQVUsVUFBVSxHQUFHLE1BQU0sS0FBSyxZQUFZO0tBQzlDLEdBQUksUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDO0tBQ3pCO0lBQ0YsQ0FDRjtHQUNGLENBQUM7R0FDRCxRQUFRLFlBQVksUUFBUSxnQkFBZ0I7RUFDOUMsQ0FBQztFQUlELE1BQU0sT0FBUSxNQUFNLElBQUksS0FBSyxDQUFDLENBQUMsWUFBWSxJQUFJO0VBQy9DLElBQUksQ0FBQyxNQUFNLElBQ1QsT0FBTyxLQUFLLGdDQUFnQyxNQUFNLFNBQVMsUUFBUSxJQUFJLFVBQVU7Q0FFckYsU0FBUyxHQUFHO0VBQ1YsT0FBTyxLQUFLLDhCQUErQixFQUFZLFNBQVM7Q0FDbEU7QUFDRiJ9
|