@cartanova/qgrid-cli 2.7.6 → 2.7.7
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/qgrid/qgrid.frame.js +5 -3
- package/bundle/dist/application/qgrid/token-trigger-setup.js +3 -2
- package/bundle/dist/application/qgrid/token-window-keepalive.js +10 -4
- package/bundle/dist/application/setting/setting.constant.js +8 -4
- package/bundle/dist/application/setting/setting.model.js +4 -3
- package/bundle/dist/application/setting/setting.store.js +2 -2
- package/bundle/dist/application/setting/setting.types.js +4 -2
- package/bundle/dist/application/sonamu.generated.js +5 -3
- package/bundle/dist/application/sonamu.generated.sso.js +3 -2
- package/bundle/dist/application/token/token.model.js +7 -2
- package/bundle/dist/application/token/token.types.js +3 -2
- package/bundle/dist/i18n/sd.generated.js +2 -1
- package/bundle/dist/migrations/20260820153531_alter_tokens_add1_alter1.js +15 -0
- package/bundle/dist/utils/providers/openai/openai-quota.js +4 -3
- package/bundle/src/application/qgrid/qgrid.frame.test.ts +9 -0
- package/bundle/src/application/qgrid/qgrid.frame.ts +2 -0
- package/bundle/src/application/qgrid/token-trigger-setup.test.ts +6 -0
- package/bundle/src/application/qgrid/token-trigger-setup.ts +2 -1
- package/bundle/src/application/qgrid/token-window-keepalive.test.ts +23 -2
- package/bundle/src/application/qgrid/token-window-keepalive.ts +13 -3
- package/bundle/src/application/setting/setting.constant.test.ts +2 -2
- package/bundle/src/application/setting/setting.constant.ts +8 -3
- package/bundle/src/application/setting/setting.model.ts +13 -2
- package/bundle/src/application/setting/setting.store.ts +2 -2
- package/bundle/src/application/setting/setting.types.ts +2 -0
- package/bundle/src/application/sonamu.generated.http +2 -1
- package/bundle/src/application/sonamu.generated.sso.ts +1 -0
- package/bundle/src/application/sonamu.generated.ts +3 -0
- package/bundle/src/application/token/token.entity.json +8 -1
- package/bundle/src/application/token/token.model.test.ts +29 -0
- package/bundle/src/application/token/token.model.ts +10 -1
- package/bundle/src/application/token/token.types.test.ts +10 -0
- package/bundle/src/application/token/token.types.ts +1 -0
- package/bundle/src/i18n/sd.generated.ts +1 -0
- package/bundle/src/migrations/20260820153531_alter_tokens_add1_alter1.ts +15 -0
- package/bundle/src/utils/providers/openai/openai-quota.test.ts +31 -0
- package/bundle/src/utils/providers/openai/openai-quota.ts +8 -2
- package/bundle/web-dist/client/assets/index-BshX4Gd8.css +1 -0
- package/bundle/web-dist/client/assets/{index-BbOyk01G.js → index-CokxkK2G.js} +4 -4
- package/bundle/web-dist/client/assets/{logs-B7Pc88bf.js → logs-Ckqp98Y3.js} +1 -1
- package/bundle/web-dist/client/assets/{monit-CzMV4lZf.js → monit-u0pMHbyf.js} +1 -1
- package/bundle/web-dist/client/assets/{routes-COWTRxZo.js → routes-DobxbCAV.js} +2 -2
- package/bundle/web-dist/client/assets/{services.generated-CA7oRRYY.js → services.generated-Da1Eq5_R.js} +1 -1
- package/bundle/web-dist/client/assets/settings-C8rfyi9z.js +1 -0
- package/bundle/web-dist/client/assets/{show-YvdybkKd.js → show-FbUQYs4L.js} +1 -1
- package/bundle/web-dist/client/assets/tokens-DFwEavFD.js +1 -0
- package/bundle/web-dist/client/assets/use-oauth-login-flow-D-9h3WUt.js +1 -0
- package/bundle/web-dist/client/assets/use-update-token-mutation-CZ57EKA1.js +1 -0
- package/bundle/web-dist/client/index.html +3 -3
- package/bundle/web-dist/server/assets/{lazyRouteComponent-tS-rTksX.js → lazyRouteComponent-V1S8gqMS.js} +2 -2
- package/bundle/web-dist/server/assets/{logs-ttf79emP.js → logs-2Tkqcncq.js} +2 -2
- package/bundle/web-dist/server/assets/{monit-CJBUH0l6.js → monit-DrJ15xJL.js} +2 -2
- package/bundle/web-dist/server/assets/{plus-BuSuoeon.js → plus-DCai02Na.js} +1 -1
- package/bundle/web-dist/server/assets/{react-dom-7_SqhNWR.js → react-dom-BFiG5Daf.js} +1 -1
- package/bundle/web-dist/server/assets/{routes-z79f1sOM.js → routes-B9X0lvjQ.js} +5 -4
- package/bundle/web-dist/server/assets/{services.generated-B5UkNmgc.js → services.generated-y7xVOTCo.js} +4 -2
- package/bundle/web-dist/server/assets/{settings-CIYR7h3G.js → settings-JznSjwGQ.js} +79 -5
- package/bundle/web-dist/server/assets/{show-CLrA4ZQ-.js → show-D8kuAFbc.js} +2 -2
- package/bundle/web-dist/server/assets/{tokens-BwlkZELV.js → tokens-CyItE-L-.js} +4 -3
- package/bundle/web-dist/server/assets/{use-oauth-login-flow-B2QllVMi.js → use-oauth-login-flow-CItVKngs.js} +2 -7
- package/bundle/web-dist/server/assets/use-update-token-mutation-BNaRPVaX.js +7 -0
- package/bundle/web-dist/server/entry-server.generated.js +10 -10
- package/package.json +1 -1
- package/skills/qgrid/references/cli-env-and-server-boot.md +1 -0
- package/skills/qgrid/references/sonamu-api-web-flow.md +2 -0
- package/skills/qgrid/references/token-auth-quota-lifecycle.md +25 -1
- package/bundle/web-dist/client/assets/index-D9xE_tO7.css +0 -1
- package/bundle/web-dist/client/assets/settings-Dpaosy-o.js +0 -1
- package/bundle/web-dist/client/assets/tokens-DynVDx0c.js +0 -1
- package/bundle/web-dist/client/assets/use-oauth-login-flow-OzmHElsE.js +0 -1
- /package/bundle/web-dist/client/assets/{plus-DqBd6gHk.js → plus-p4vtg6LN.js} +0 -0
|
@@ -330,13 +330,14 @@ var QgridFrameClass = class extends BaseFrameClass {
|
|
|
330
330
|
}]);
|
|
331
331
|
return { added: true };
|
|
332
332
|
}
|
|
333
|
-
async updateToken(id, name, quotaThreshold, weight) {
|
|
333
|
+
async updateToken(id, name, quotaThreshold, weight, keepaliveEnabled) {
|
|
334
334
|
if (quotaThreshold !== void 0 && quotaThreshold !== null && (!Number.isInteger(quotaThreshold) || quotaThreshold < 1 || quotaThreshold > 100)) throw new BadRequestException("quotaThreshold must be an integer between 1 and 100, or null");
|
|
335
335
|
if (weight !== void 0 && (!Number.isInteger(weight) || weight < 1 || weight > 100)) throw new BadRequestException("weight must be an integer between 1 and 100");
|
|
336
336
|
const patch = {};
|
|
337
337
|
if (name !== void 0) patch.name = name;
|
|
338
338
|
if (quotaThreshold !== void 0) patch.quota_threshold = quotaThreshold;
|
|
339
339
|
if (weight !== void 0) patch.weight = weight;
|
|
340
|
+
if (keepaliveEnabled !== void 0) patch.keepalive_enabled = keepaliveEnabled;
|
|
340
341
|
if (Object.keys(patch).length === 0) return { updated: false };
|
|
341
342
|
return { updated: await TokenModel.updateFields(id, patch) > 0 };
|
|
342
343
|
}
|
|
@@ -659,7 +660,8 @@ __decorate([
|
|
|
659
660
|
Number,
|
|
660
661
|
String,
|
|
661
662
|
Object,
|
|
662
|
-
Number
|
|
663
|
+
Number,
|
|
664
|
+
Boolean
|
|
663
665
|
]),
|
|
664
666
|
__decorateMetadata("design:returntype", Promise)
|
|
665
667
|
], QgridFrameClass.prototype, "updateToken", null);
|
|
@@ -743,4 +745,4 @@ function convertAnthropicUsage(raw) {
|
|
|
743
745
|
//#endregion
|
|
744
746
|
export { QgridFrame };
|
|
745
747
|
|
|
746
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZnJhbWUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmZyYW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcnlwdG8gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSwgdHlwZSBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyBhcGksIEJhZFJlcXVlc3RFeGNlcHRpb24sIEJhc2VGcmFtZUNsYXNzLCBTb25hbXUsIHN0cmVhbSB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGdldENhY2hlTWFuYWdlclJlZiB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHsgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7XG4gIGdldEFjY2Vzc1Rva2VuLFxuICBnZXRFeHBpcmVzQXQsXG4gIGdldFJlZnJlc2hUb2tlbixcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vY3JlZGVudGlhbHNcIjtcbmltcG9ydCB7IENhbGxlclNjaGVtYVZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3NjaGVtYS12YWxpZGF0aW9uXCI7XG5pbXBvcnQge1xuICBidWlsZE9wZW5BSUF1dGhVcmwsXG4gIGV4Y2hhbmdlT3BlbkFJQ29kZSxcbiAgZ2VuZXJhdGVPcGVuQUlQS0NFLFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktb2F1dGhcIjtcbmltcG9ydCB7IE1JQ1JPX1VTRCwgUmVxdWVzdExvZ01vZGVsIH0gZnJvbSBcIi4uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIFJlcXVlc3RMb2dMaXN0UGFyYW1zIH0gZnJvbSBcIi4uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLnR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2V0QSB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsLCB0eXBlIFRva2VuVXBkYXRlRmllbGRzIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyBUb2tlbkNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQge1xuICBDT05TT0xFX0NBTExCQUNLX1VSTCxcbiAgdHlwZSBBbnRocm9waWNVc2FnZVJhdyxcbiAgYnVpbGRBdXRoVXJsLFxuICBleGNoYW5nZUNvZGVGb3JUb2tlbnMsXG4gIGZldGNoVXNhZ2UsXG4gIGdlbmVyYXRlUEtDRSxcbiAgcmVmcmVzaEFjY2Vzc1Rva2VuLFxuICBSZWZyZXNoRmFpbGVkRXJyb3IsXG59IGZyb20gXCIuL29hdXRoXCI7XG5pbXBvcnQge1xuICBhc3NlcnROYXRpdmVSdW5BZG1pc3Npb24sXG4gIGFmdGVyUXVlcnksXG4gIGJlZm9yZVF1ZXJ5LFxuICBmaW5pc2hSdW5BYm9ydGVkLFxuICBmaW5pc2hSdW5XaXRoRXJyb3IsXG59IGZyb20gXCIuL3FncmlkLXJ1bi1saWZlY3ljbGVcIjtcbmltcG9ydCB7XG4gIGJ1aWxkQW5kVmFsaWRhdGVTdHJpY3RPdXRwdXRTY2hlbWEsXG4gIHR5cGUgSW50ZXJuYWxRdWVyeUlucHV0LFxuICBRZ3JpZERpc3BhdGNoZXIsXG59IGZyb20gXCIuL3FncmlkLmRpc3BhdGNoZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgUXVlcnlJbnB1dCxcbiAgdHlwZSBBcHBlbmRTdGVwSW5wdXQsXG4gIHR5cGUgQ3JlYXRlUnVuSW5wdXQsXG4gIHR5cGUgRmluaXNoUnVuSW5wdXQsXG4gIHR5cGUgSGVhbHRoUmVzcG9uc2UsXG4gIHR5cGUgT0F1dGhTdGFydFJlc3VsdCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbiAgdHlwZSBRZ3JpZFJ1bkNvbnRleHQsXG4gIFN0cmVhbUV2ZW50cyxcbiAgdHlwZSBUb2tlblN0YXRzLFxuICB0eXBlIFVzYWdlUmVzcG9uc2UsXG59IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyBkZWFjdGl2YXRlQXV0aERlYWRUb2tlbiwgbm90aWZ5VG9rZW5BZGRlZCB9IGZyb20gXCIuL3Rva2VuLWRlYXRoXCI7XG5pbXBvcnQgeyBUb29sU2NoZW1hQ29tcG9zaXRpb25FcnJvciB9IGZyb20gXCIuL3Rvb2wtZW11bGF0aW9uLXNjaGVtYVwiO1xuXG5jb25zdCBwZW5kaW5nU3RyZWFtcyA9IG5ldyBNYXA8c3RyaW5nLCBRdWVyeUlucHV0PigpO1xuXG50eXBlIFBlbmRpbmdPQXV0aCA9IHtcbiAgY29kZVZlcmlmaWVyOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgcmVkaXJlY3RVcmk6IHN0cmluZztcbiAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIgfCBcIm9wZW5haVwiO1xufTtcbmNvbnN0IE9BVVRIX1NUQVRFX1BSRUZJWCA9IFwib2F1dGg6c3RhdGU6XCI7XG5jb25zdCBPQVVUSF9TVEFURV9UVEwgPSBcIjVtXCI7XG5cbmZ1bmN0aW9uIHVuaXhTZWNvbmRzVG9Jc28oc2Vjb25kczogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gdHlwZW9mIHNlY29uZHMgPT09IFwibnVtYmVyXCIgPyBuZXcgRGF0ZShzZWNvbmRzICogMTAwMCkudG9JU09TdHJpbmcoKSA6IG51bGw7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldE9BdXRoU3RhdGUoc3RhdGU6IHN0cmluZywgZGF0YTogUGVuZGluZ09BdXRoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNhY2hlID0gZ2V0Q2FjaGVNYW5hZ2VyUmVmKCk7XG4gIGlmICghY2FjaGUpIHRocm93IG5ldyBFcnJvcihcIkNhY2hlTWFuYWdlciBub3QgaW5pdGlhbGl6ZWRcIik7XG4gIGF3YWl0IGNhY2hlLnNldCh7XG4gICAga2V5OiBgJHtPQVVUSF9TVEFURV9QUkVGSVh9JHtzdGF0ZX1gLFxuICAgIHZhbHVlOiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICB0dGw6IE9BVVRIX1NUQVRFX1RUTCxcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE9BdXRoU3RhdGUoc3RhdGU6IHN0cmluZyk6IFByb21pc2U8UGVuZGluZ09BdXRoIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNhY2hlID0gZ2V0Q2FjaGVNYW5hZ2VyUmVmKCk7XG4gIGlmICghY2FjaGUpIHRocm93IG5ldyBFcnJvcihcIkNhY2hlTWFuYWdlciBub3QgaW5pdGlhbGl6ZWRcIik7XG4gIGNvbnN0IHJhdyA9IGF3YWl0IGNhY2hlLmdldDxzdHJpbmc+KHsga2V5OiBgJHtPQVVUSF9TVEFURV9QUkVGSVh9JHtzdGF0ZX1gIH0pO1xuICBpZiAoIXJhdykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSBhcyBQZW5kaW5nT0F1dGg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU9BdXRoU3RhdGUoc3RhdGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjYWNoZSA9IGdldENhY2hlTWFuYWdlclJlZigpO1xuICBpZiAoIWNhY2hlKSByZXR1cm47XG4gIGF3YWl0IGNhY2hlLmRlbGV0ZSh7IGtleTogYCR7T0FVVEhfU1RBVEVfUFJFRklYfSR7c3RhdGV9YCB9KTtcbn1cblxuY29uc3QgdHJ1c3RlZExvb3BiYWNrQmFzZSA9ICgpID0+IGBodHRwOi8vbG9jYWxob3N0OiR7cHJvY2Vzcy5lbnYuUE9SVCA/PyBcIjQ0OTAwXCJ9YDtcblxuLy8gQW50aHJvcGljJ3MgcmVtb3RlL21hbnVhbCBmbG93IHVzZXMgaXRzIGZpeGVkIGNvbnNvbGUgY2FsbGJhY2suIEhlYWRlcnMgbWF5IHNlbGVjdCBiZXR3ZWVuIHR3b1xuLy8gYWxsb3dsaXN0ZWQgVVJJcywgYnV0IG5ldmVyIGNvbnRyaWJ1dGUgYXV0aG9yaXR5IG9yIHBhdGggYnl0ZXMgdG8gZWl0aGVyIFVSSS5cbmZ1bmN0aW9uIHJlc29sdmVPQXV0aFJlZGlyZWN0KCk6IHsgcmVkaXJlY3RVcmk6IHN0cmluZzsgbW9kZTogXCJyZWRpcmVjdFwiIHwgXCJjb2RlXCIgfSB7XG4gIHRyeSB7XG4gICAgY29uc3QgeyBoZWFkZXJzIH0gPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIGNvbnN0IG9yaWdpbiA9IHR5cGVvZiBoZWFkZXJzLm9yaWdpbiA9PT0gXCJzdHJpbmdcIiA/IGhlYWRlcnMub3JpZ2luIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGZvcndhcmRlZCA9IGhlYWRlcnNbXCJ4LWZvcndhcmRlZC1ob3N0XCJdO1xuICAgIGNvbnN0IHJhd0hvc3QgPSBBcnJheS5pc0FycmF5KGZvcndhcmRlZCkgPyBmb3J3YXJkZWRbMF0gOiAoZm9yd2FyZGVkID8/IGhlYWRlcnMuaG9zdCk7XG4gICAgY29uc3QgaG9zdCA9IG9yaWdpblxuICAgICAgPyBuZXcgVVJMKG9yaWdpbikuaG9zdG5hbWVcbiAgICAgIDogbmV3IFVSTChgaHR0cDovLyR7cmF3SG9zdCA/PyBcImxvY2FsaG9zdFwifWApLmhvc3RuYW1lO1xuICAgIGlmICghbmV3IFNldChbXCJsb2NhbGhvc3RcIiwgXCIxMjcuMC4wLjFcIiwgXCI6OjFcIiwgXCJbOjoxXVwiXSkuaGFzKGhvc3QpKSB7XG4gICAgICByZXR1cm4geyByZWRpcmVjdFVyaTogQ09OU09MRV9DQUxMQkFDS19VUkwsIG1vZGU6IFwiY29kZVwiIH07XG4gICAgfVxuICB9IGNhdGNoIHt9XG4gIHJldHVybiB7IHJlZGlyZWN0VXJpOiBgJHt0cnVzdGVkTG9vcGJhY2tCYXNlKCl9L2NhbGxiYWNrYCwgbW9kZTogXCJyZWRpcmVjdFwiIH07XG59XG5cbmZ1bmN0aW9uIHJlamVjdEltYWdlR2VuZXJhdGlvblN0cmVhbShhcmdzOiBRdWVyeUlucHV0KTogdm9pZCB7XG4gIGlmICghYXJncy5pbWFnZUdlbmVyYXRpb24pIHJldHVybjtcbiAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgXCJxZ3JpZDogaW1hZ2VHZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBzdHJlYW1pbmc7IHVzZSBxdWVyeS9nZW5lcmF0ZVRleHQgaW5zdGVhZC5cIiBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICk7XG59XG5cbi8vIGFudGhyb3BpYyDsnYAgLS1qc29uLXNjaGVtYSDrpbwg7JOw7KeAIOyViuycvOuvgOuhnChTT04tNTMyKSBzdHJpY3Qg67OA7ZmYwrdhcmd2IOygnO2VnCDsl4bsnbQg7JuQ7ZiV7J2YXG4vLyDqtazrrLjCt+uzteyeoeuPhOunjCDqsoDspp3rkJzri6Qg4oCUIHByb3ZpZGVyIOu2hOq4sOuKlCBidWlsZEFuZFZhbGlkYXRlU3RyaWN0T3V0cHV0U2NoZW1hIOqwgCDshozsnKDtlZzri6QuXG5mdW5jdGlvbiByZWplY3RJbnZhbGlkQ2FsbGVyU2NoZW1hcyhhcmdzOiBRdWVyeUlucHV0KTogdm9pZCB7XG4gIGlmIChhcmdzLmpzb25TY2hlbWEgPT09IHVuZGVmaW5lZCAmJiAhYXJncy50b29scz8ubGVuZ3RoKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICBidWlsZEFuZFZhbGlkYXRlU3RyaWN0T3V0cHV0U2NoZW1hKGFyZ3MpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChcbiAgICAgIGVycm9yIGluc3RhbmNlb2YgQ2FsbGVyU2NoZW1hVmFsaWRhdGlvbkVycm9yIHx8XG4gICAgICBlcnJvciBpbnN0YW5jZW9mIFRvb2xTY2hlbWFDb21wb3NpdGlvbkVycm9yXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihlcnJvci5tZXNzYWdlIGFzIExvY2FsaXplZFN0cmluZyk7XG4gICAgfVxuICAgIC8vIOyemOuqu+uQnCBrZXl3b3JkIO2Yle2DnChhbnlPZiDrpbwg6rCd7LK066GcIOuztOuCtOuKlCDrk7Ep64qUIO2MjOydtO2UhOudvOyduOyXkOyEnCB1bnR5cGVkIOyYpOulmOuhnCDrgpjsmKTrr4DroZwsXG4gICAgLy8g7YOA7J6FIOyige2eiOq4sCDrjIDsi6AgRXJyb3Ig7KCE7LK066W8IGNhbGxlci1mYXVsdCA0MDAg7Jy866GcIOunpO2Vke2VnOuLpCjqs4Tslb0g7YWM7Iqk7Yq466GcIOqzoOygleuQqCkuXG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICBgcWdyaWQ6IGNhbGxlciBzY2hlbWEgY2Fubm90IGJlIG5vcm1hbGl6ZWQ6ICR7ZXJyb3IubWVzc2FnZX1gIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVUb2tlbk5hbWUoYXJnczogUXVlcnlJbnB1dCk6IFByb21pc2U8SW50ZXJuYWxRdWVyeUlucHV0PiB7XG4gIGlmICghYXJncy50b2tlbk5hbWUpIHJldHVybiBhcmdzO1xuXG4gIGNvbnN0IHRva2VuUHJvdmlkZXIgPSBhcmdzLnRva2VuTmFtZS5zcGxpdChcIi9cIiwgMSlbMF07XG4gIGNvbnN0IG1vZGVsUHJvdmlkZXIgPSBhcmdzLm1vZGVsPy5zcGxpdChcIi9cIiwgMSlbMF07XG4gIGlmICh0b2tlblByb3ZpZGVyICE9PSBcImFudGhyb3BpY1wiICYmIHRva2VuUHJvdmlkZXIgIT09IFwib3BlbmFpXCIpIHtcbiAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihgSW52YWxpZCB0b2tlbiBuYW1lOiAke2FyZ3MudG9rZW5OYW1lfWAgYXMgTG9jYWxpemVkU3RyaW5nKTtcbiAgfVxuICBpZiAobW9kZWxQcm92aWRlciAhPT0gdG9rZW5Qcm92aWRlcikge1xuICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgXCJUb2tlbiBwcm92aWRlciBkb2VzIG5vdCBtYXRjaCBtb2RlbCBwcm92aWRlclwiIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgdG9rZW4gPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRBY3RpdmVCeVByb3ZpZGVyQW5kTmFtZShcIkFcIiwgdG9rZW5Qcm92aWRlciwgYXJncy50b2tlbk5hbWUpO1xuICBpZiAoIXRva2VuKSB7XG4gICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oYEFjdGl2ZSB0b2tlbiBub3QgZm91bmQ6ICR7YXJncy50b2tlbk5hbWV9YCBhcyBMb2NhbGl6ZWRTdHJpbmcpO1xuICB9XG4gIHJldHVybiB7IC4uLmFyZ3MsIHByZWZlcnJlZFRva2VuSWQ6IHRva2VuLmlkLCByZXF1aXJlUHJlZmVycmVkVG9rZW46IHRydWUgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSHR0cERpc2Nvbm5lY3RIYW5kbGUoKToge1xuICBzaWduYWw6IEFib3J0U2lnbmFsO1xuICBkaXNwb3NlOiAoKSA9PiB2b2lkO1xufSB7XG4gIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgbGV0IHJlcXVlc3RSYXc6IEZhc3RpZnlSZXF1ZXN0W1wicmF3XCJdIHwgdW5kZWZpbmVkO1xuICBsZXQgcmVzcG9uc2VSYXc6IEZhc3RpZnlSZXBseVtcInJhd1wiXSB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGNvbnN0IGN0eCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgcmVxdWVzdFJhdyA9IGN0eC5yZXF1ZXN0Py5yYXc7XG4gICAgaWYgKGN0eC50cmFuc3BvcnQgPT09IFwiaHR0cFwiKSByZXNwb25zZVJhdyA9IGN0eC5yZXBseS5yYXc7XG4gIH0gY2F0Y2gge1xuICAgIC8vIERpcmVjdCBmcmFtZSBjYWxscyAoZm9yIGV4YW1wbGUgdW5pdCB0ZXN0cykgZG8gbm90IGhhdmUgYW4gSFRUUCBjb250ZXh0LlxuICB9XG5cbiAgY29uc3QgYWJvcnQgPSAoKSA9PiBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgY29uc3QgYWJvcnRPbkluY29tcGxldGVSZXNwb25zZUNsb3NlID0gKCkgPT4ge1xuICAgIGlmICghcmVzcG9uc2VSYXc/LndyaXRhYmxlRW5kZWQpIGFib3J0KCk7XG4gIH07XG5cbiAgcmVxdWVzdFJhdz8ub25jZShcImFib3J0ZWRcIiwgYWJvcnQpO1xuICByZXNwb25zZVJhdz8ub25jZShcImNsb3NlXCIsIGFib3J0T25JbmNvbXBsZXRlUmVzcG9uc2VDbG9zZSk7XG5cbiAgaWYgKHJlcXVlc3RSYXc/LmFib3J0ZWQgfHwgKHJlc3BvbnNlUmF3Py5kZXN0cm95ZWQgJiYgIXJlc3BvbnNlUmF3LndyaXRhYmxlRW5kZWQpKSB7XG4gICAgYWJvcnQoKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgIHJlcXVlc3RSYXc/LnJlbW92ZUxpc3RlbmVyKFwiYWJvcnRlZFwiLCBhYm9ydCk7XG4gICAgICByZXNwb25zZVJhdz8ucmVtb3ZlTGlzdGVuZXIoXCJjbG9zZVwiLCBhYm9ydE9uSW5jb21wbGV0ZVJlc3BvbnNlQ2xvc2UpO1xuICAgIH0sXG4gIH07XG59XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiXSk7XG5jb25zdCBvYXV0aExvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcIm9hdXRoXCJdKTtcblxuLy8gcGVyLXRva2VuIHJlZnJlc2ggZGVkdXAg4oCUIO2ajOyghCDqsrnsuajsnLzroZwg7J247ZWcIOyCrOunnSDsmKTtjJDsnYQg66eJ64qU64ukLlxuY29uc3QgaW5mbGlnaHRBbnRocm9waWNSZWZyZXNoID0gbmV3IE1hcDxudW1iZXIsIFByb21pc2U8c3RyaW5nPj4oKTtcblxuY2xhc3MgUWdyaWRGcmFtZUNsYXNzIGV4dGVuZHMgQmFzZUZyYW1lQ2xhc3Mge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlFncmlkXCIpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHF1ZXJ5KGFyZ3M6IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPFF1ZXJ5T3V0cHV0PiB7XG4gICAgYXNzZXJ0TmF0aXZlUnVuQWRtaXNzaW9uKCk7XG4gICAgcmVqZWN0SW52YWxpZENhbGxlclNjaGVtYXMoYXJncyk7XG4gICAgY29uc3QgcmVzb2x2ZWRBcmdzID0gYXdhaXQgcmVzb2x2ZVRva2VuTmFtZShhcmdzKTtcbiAgICBjb25zdCBkaXNjb25uZWN0ID0gY3JlYXRlSHR0cERpc2Nvbm5lY3RIYW5kbGUoKTtcbiAgICB0cnkge1xuICAgICAgaWYgKHJlc29sdmVkQXJncy5sb2dnZXIgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBRZ3JpZERpc3BhdGNoZXIucXVlcnkocmVzb2x2ZWRBcmdzLCBkaXNjb25uZWN0LnNpZ25hbCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgcmVxdWVzdExvZ0lkLCBzdGVwSW5kZXggfSA9IGF3YWl0IGJlZm9yZVF1ZXJ5KHJlc29sdmVkQXJncyk7XG4gICAgICBsZXQgcmVzdWx0OiBRdWVyeU91dHB1dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IFFncmlkRGlzcGF0Y2hlci5xdWVyeShyZXNvbHZlZEFyZ3MsIGRpc2Nvbm5lY3Quc2lnbmFsKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGRpc2Nvbm5lY3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICBhd2FpdCBmaW5pc2hSdW5BYm9ydGVkKHJlcXVlc3RMb2dJZCwgcmVzb2x2ZWRBcmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBmaW5pc2hSdW5XaXRoRXJyb3IocmVxdWVzdExvZ0lkLCAoZSBhcyBFcnJvcikubWVzc2FnZSwgcmVzb2x2ZWRBcmdzKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBsaWZlY3ljbGUgPSBhd2FpdCBhZnRlclF1ZXJ5KHJlcXVlc3RMb2dJZCwgc3RlcEluZGV4LCByZXNvbHZlZEFyZ3MsIHJlc3VsdCk7XG4gICAgICAgIGlmIChkaXNjb25uZWN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChyZXF1ZXN0TG9nSWQsIHJlc29sdmVkQXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdG9vbC1jYWxsIHJlcXVlc3RMb2dJZOyZgCBwcm92aWRlciB0aHJlYWRDb29yZOuKlCDshJzroZwg64+F66a97KCB7Jy866GcIOycoOyngO2VnOuLpC5cbiAgICAgICAgY29uc3QgdGhyZWFkQ29vcmQgPSByZXN1bHQucnVuQ29udGV4dD8udGhyZWFkQ29vcmQ7XG4gICAgICAgIGNvbnN0IHJ1bkNvbnRleHQgPVxuICAgICAgICAgIGxpZmVjeWNsZS5ydW5Db250ZXh0IHx8IHRocmVhZENvb3JkXG4gICAgICAgICAgICA/IHsgLi4ubGlmZWN5Y2xlLnJ1bkNvbnRleHQsIC4uLih0aHJlYWRDb29yZCA/IHsgdGhyZWFkQ29vcmQgfSA6IHt9KSB9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHsgLi4ucmVzdWx0LCBydW5Db250ZXh0IH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgcXVlcnkgYWZ0ZXJRdWVyeSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIGlmIChkaXNjb25uZWN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChyZXF1ZXN0TG9nSWQsIHJlc29sdmVkQXJncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgZmluaXNoUnVuV2l0aEVycm9yKHJlcXVlc3RMb2dJZCwgKGUgYXMgRXJyb3IpLm1lc3NhZ2UsIHJlc29sdmVkQXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcHJvdmlkZXIg7J2R64u17J2AIOyEseqzte2WiOycvOuvgOuhnCDroZzquYUg7J6l7JWg6rCAIOyDneyEsSDqsrDqs7zrpbwg642u7Ja07JOw7KeAIOyViuuKlOuLpC5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgZGlzY29ubmVjdC5kaXNwb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHByZXBhcmVTdHJlYW0oYXJnczogUXVlcnlJbnB1dCk6IFByb21pc2U8eyBzdHJlYW1JZDogc3RyaW5nIH0+IHtcbiAgICBhc3NlcnROYXRpdmVSdW5BZG1pc3Npb24oKTtcbiAgICByZWplY3RJbWFnZUdlbmVyYXRpb25TdHJlYW0oYXJncyk7XG4gICAgcmVqZWN0SW52YWxpZENhbGxlclNjaGVtYXMoYXJncyk7XG4gICAgY29uc3QgcmVzb2x2ZWRBcmdzID0gYXdhaXQgcmVzb2x2ZVRva2VuTmFtZShhcmdzKTtcbiAgICBjb25zdCBzdHJlYW1JZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgcGVuZGluZ1N0cmVhbXMuc2V0KHN0cmVhbUlkLCByZXNvbHZlZEFyZ3MpO1xuICAgIGNvbnN0IGV4cGlyeSA9IHNldFRpbWVvdXQoKCkgPT4gcGVuZGluZ1N0cmVhbXMuZGVsZXRlKHN0cmVhbUlkKSwgMzBfMDAwKTtcbiAgICBleHBpcnkudW5yZWY/LigpO1xuICAgIHJldHVybiB7IHN0cmVhbUlkIH07XG4gIH1cblxuICBAc3RyZWFtKHsgdHlwZTogXCJzc2VcIiwgZXZlbnRzOiBTdHJlYW1FdmVudHMgfSlcbiAgYXN5bmMgcXVlcnlTdHJlYW0oc3RyZWFtSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFyZ3MgPSBwZW5kaW5nU3RyZWFtcy5nZXQoc3RyZWFtSWQpO1xuICAgIHBlbmRpbmdTdHJlYW1zLmRlbGV0ZShzdHJlYW1JZCk7XG4gICAgaWYgKCFhcmdzKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIG9yIGV4cGlyZWQgc3RyZWFtSWRcIik7XG4gICAgYXNzZXJ0TmF0aXZlUnVuQWRtaXNzaW9uKCk7XG4gICAgcmVqZWN0SW1hZ2VHZW5lcmF0aW9uU3RyZWFtKGFyZ3MpO1xuXG4gICAgY29uc3QgY3R4ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICBjb25zdCBzc2UgPSBjdHguY3JlYXRlU1NFKFN0cmVhbUV2ZW50cyk7XG4gICAgbGV0IHN0cmVhbVJlc3VsdDogUXVlcnlPdXRwdXQgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHN0cmVhbUVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgY2xpZW50Q2xvc2VkID0gZmFsc2U7XG4gICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgc3NlLm9uQ2xvc2UoKCkgPT4ge1xuICAgICAgY2xpZW50Q2xvc2VkID0gdHJ1ZTtcbiAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgIH0pO1xuXG4gICAgbGV0IHJ1bkluZm86IHsgcmVxdWVzdExvZ0lkOiBudW1iZXI7IHN0ZXBJbmRleDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGFyZ3MubG9nZ2VyICE9PSBmYWxzZSkge1xuICAgICAgLy8gcHJvdmlkZXIg7Iuk7ZaJIOyghCBydW5uaW5nIHJvdyDsg53shLHsl5Ag7Iuk7Yyo7ZWY66m0IGxvZ2dlZCDsmpTssq3snLzroZwg7KeE7ZaJ7ZWY7KeAIOyViuuKlOuLpC5cbiAgICAgIHJ1bkluZm8gPSBhd2FpdCBiZWZvcmVRdWVyeShhcmdzKTtcbiAgICB9XG5cbiAgICAvLyBiZWZvcmVRdWVyeSBEQiDsnpHsl4Ug7KSRIGNsb3Nl66W8IOuGk+y5mOyngCDslYrqs6AgcHJvdmlkZXIg7Iuk7ZaJIOyghOyXkCDrp4jqsJDtlZzri6QuXG4gICAgaWYgKGNsaWVudENsb3NlZCB8fCBzc2UuY2xvc2VkKSB7XG4gICAgICBpZiAocnVuSW5mbykgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChydW5JbmZvLnJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgICBhd2FpdCBzc2UuZW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5xdWVyeVN0cmVhbShcbiAgICAgICAgYXJncyxcbiAgICAgICAge1xuICAgICAgICAgIG9uRGVsdGE6ICh0ZXh0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNsaWVudENsb3NlZCAmJiAhc3NlLmNsb3NlZCkgc3NlLnB1Ymxpc2goXCJkZWx0YVwiLCB7IHRleHQgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkNvbXBsZXRlOiAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBzdHJlYW1SZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgICBzdHJlYW1FcnJvciA9IGVycjtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzdHJlYW1FcnJvciA9IGUgYXMgRXJyb3I7XG4gICAgfVxuXG4gICAgLy8gcHJvdmlkZXIg6rKw6rO86rCAIOyXhuuKlCBjbG9zZeuKlCDsponsi5wgYWJvcnRlZOuhnCDrp4jqsJDtlZzri6QuXG4gICAgaWYgKGNsaWVudENsb3NlZCAmJiAhc3RyZWFtUmVzdWx0KSB7XG4gICAgICBpZiAocnVuSW5mbykgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChydW5JbmZvLnJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgICBhd2FpdCBzc2UuZW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZGlzcGF0Y2hlciDsmYTro4wg7ZuEIGxpZmVjeWNsZSDsspjrpqwgKGF3YWl0IOyViOyghClcbiAgICBpZiAoc3RyZWFtUmVzdWx0KSB7XG4gICAgICAvLyBkaXNwYXRjaGVyIOqwgCDsi6TsnYAgdGhyZWFkIOyerOyCrOyaqSDsooztkZzripQgbG9nZ2VyIOyEpOygleqzvCDrrLTqtIDtlZjqsowg7ZqM7Iah7ZWc64ukLlxuICAgICAgY29uc3QgdGhyZWFkQ29vcmQgPSBzdHJlYW1SZXN1bHQucnVuQ29udGV4dD8udGhyZWFkQ29vcmQ7XG4gICAgICBsZXQgcnVuQ29udGV4dDogUWdyaWRSdW5Db250ZXh0IHwgdW5kZWZpbmVkID1cbiAgICAgICAgdGhyZWFkQ29vcmQgIT09IHVuZGVmaW5lZCA/IHsgdGhyZWFkQ29vcmQgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChydW5JbmZvKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gY2xvc2Ug7ZuEIOuPhOywqe2VnCDqsrDqs7zrj4Qgc3RlcC91c2FnZeuKlCDrgqjquLDrkJgsIOyVhOuemOyXkOyEnCDstZzsooUgc3RhdHVz66W8IGFib3J0ZWTroZwg642u7Ja07JO064ukLlxuICAgICAgICAgIGNvbnN0IGxpZmVjeWNsZSA9IGF3YWl0IGFmdGVyUXVlcnkoXG4gICAgICAgICAgICBydW5JbmZvLnJlcXVlc3RMb2dJZCxcbiAgICAgICAgICAgIHJ1bkluZm8uc3RlcEluZGV4LFxuICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgIHN0cmVhbVJlc3VsdCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJ1bkNvbnRleHQgPVxuICAgICAgICAgICAgbGlmZWN5Y2xlLnJ1bkNvbnRleHQgfHwgdGhyZWFkQ29vcmRcbiAgICAgICAgICAgICAgPyB7IC4uLmxpZmVjeWNsZS5ydW5Db250ZXh0LCAuLi4odGhyZWFkQ29vcmQgPyB7IHRocmVhZENvb3JkIH0gOiB7fSkgfVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgIC8vIGFmdGVyUXVlcnnqsIAg7KeE7ZaJ65CY64qUIOyCrOydtCBjbGllbnTqsIAg64ur7Z6MIOqyveyasCDsmYTro4wg7IOB7YOc66W8IGFib3J0ZWTroZwg65CY64+M66aw64ukLlxuICAgICAgICAgIGlmIChjbGllbnRDbG9zZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocnVuSW5mby5yZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgICAgICAgICAgYXdhaXQgc3NlLmVuZCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihgc3RyZWFtIGFmdGVyUXVlcnkgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bldpdGhFcnJvcihydW5JbmZvLnJlcXVlc3RMb2dJZCwgKGUgYXMgRXJyb3IpLm1lc3NhZ2UsIGFyZ3MpO1xuXG4gICAgICAgICAgaWYgKGNsaWVudENsb3NlZCkge1xuICAgICAgICAgICAgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChydW5JbmZvLnJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgICAgICAgICBhd2FpdCBzc2UuZW5kKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWNsaWVudENsb3NlZCAmJiAhc3NlLmNsb3NlZCkgc3NlLnB1Ymxpc2goXCJkb25lXCIsIHsgLi4uc3RyZWFtUmVzdWx0LCBydW5Db250ZXh0IH0pO1xuICAgIH0gZWxzZSBpZiAoc3RyZWFtRXJyb3IpIHtcbiAgICAgIGlmIChydW5JbmZvKSBhd2FpdCBmaW5pc2hSdW5XaXRoRXJyb3IocnVuSW5mby5yZXF1ZXN0TG9nSWQsIHN0cmVhbUVycm9yLm1lc3NhZ2UsIGFyZ3MpO1xuICAgICAgaWYgKCFjbGllbnRDbG9zZWQgJiYgIXNzZS5jbG9zZWQpIHNzZS5wdWJsaXNoKFwiZXJyb3JcIiwgeyBtZXNzYWdlOiBzdHJlYW1FcnJvci5tZXNzYWdlIH0pO1xuICAgIH0gZWxzZSBpZiAoKGNsaWVudENsb3NlZCB8fCBzc2UuY2xvc2VkKSAmJiBydW5JbmZvKSB7XG4gICAgICBhd2FpdCBmaW5pc2hSdW5BYm9ydGVkKHJ1bkluZm8ucmVxdWVzdExvZ0lkLCBhcmdzKTtcbiAgICB9XG5cbiAgICBhd2FpdCBzc2UuZW5kKCk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgY3JlYXRlUnVuKGlucHV0OiBDcmVhdGVSdW5JbnB1dCk6IFByb21pc2U8eyByZXF1ZXN0TG9nSWQ6IG51bWJlciB9PiB7XG4gICAgY29uc3QgcmVxdWVzdExvZ0lkID0gYXdhaXQgUmVxdWVzdExvZ01vZGVsLmNyZWF0ZVJ1bih7XG4gICAgICB1c2VyX3Byb21wdDogaW5wdXQudXNlclByb21wdCxcbiAgICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiBpbnB1dC5tb2RlbE5hbWUsXG4gICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgIHByb2plY3RfbmFtZTogaW5wdXQucHJvamVjdE5hbWUsXG4gICAgICBzeXN0ZW1fcHJvbXB0OiBpbnB1dC5zeXN0ZW1Qcm9tcHQsXG4gICAgICBoaXN0b3J5OiBpbnB1dC5oaXN0b3J5ID8gSlNPTi5wYXJzZShpbnB1dC5oaXN0b3J5KSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICByZXR1cm4geyByZXF1ZXN0TG9nSWQgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBhcHBlbmRTdGVwKGlucHV0OiBBcHBlbmRTdGVwSW5wdXQpOiBQcm9taXNlPHsgc3RlcElkOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHN0ZXBJZCA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5hcHBlbmRTdGVwKGlucHV0LnJlcXVlc3RMb2dJZCwge1xuICAgICAgc3RlcF9pbmRleDogaW5wdXQuc3RlcEluZGV4LFxuICAgICAgdHlwZTogaW5wdXQudHlwZSxcbiAgICAgIG1vZGVsX25hbWU6IGlucHV0Lm1vZGVsTmFtZSxcbiAgICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiBpbnB1dC5yZXF1ZXN0ZWRNb2RlbE5hbWUsXG4gICAgICBmYWxsYmFja19jb3VudDogaW5wdXQuZmFsbGJhY2tDb3VudCxcbiAgICAgIGlucHV0X3Rva2VuczogaW5wdXQuaW5wdXRUb2tlbnMsXG4gICAgICBvdXRwdXRfdG9rZW5zOiBpbnB1dC5vdXRwdXRUb2tlbnMsXG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogaW5wdXQuY2FjaGVSZWFkVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBpbnB1dC5jYWNoZUNyZWF0aW9uVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBpbnB1dC5jYWNoZUNyZWF0aW9uNW1Ub2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IGlucHV0LmNhY2hlQ3JlYXRpb24xaFRva2VucyxcbiAgICAgIGNvc3RfdXNkOiBpbnB1dC5jb3N0VXNkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBNYXRoLnJvdW5kKGlucHV0LmNvc3RVc2QgKiBNSUNST19VU0QpLFxuICAgICAgY29zdF9zb3VyY2U6IGlucHV0LmNvc3RTb3VyY2UsXG4gICAgICBkdXJhdGlvbl9tczogaW5wdXQuZHVyYXRpb25NcyxcbiAgICAgIHR0ZnRfbXM6IGlucHV0LnR0ZnRNcyA/PyBudWxsLFxuICAgICAgZmluaXNoX3JlYXNvbjogaW5wdXQuZmluaXNoUmVhc29uLFxuICAgICAgcmVhc29uaW5nX3RleHQ6IGlucHV0LnJlYXNvbmluZ1RleHQsXG4gICAgICByZWFzb25pbmdfdG9rZW5zOiBpbnB1dC5yZWFzb25pbmdUb2tlbnMsXG4gICAgICB0b29sX2NhbGxfaW5kZXg6IGlucHV0LnRvb2xDYWxsSW5kZXgsXG4gICAgICB0b29sX2NhbGxfaWQ6IGlucHV0LnRvb2xDYWxsSWQsXG4gICAgICB0b29sX25hbWU6IGlucHV0LnRvb2xOYW1lLFxuICAgICAgdG9vbF9hcmdzOiBpbnB1dC50b29sQXJncyxcbiAgICAgIHRvb2xfcmVzdWx0OiBpbnB1dC50b29sUmVzdWx0LFxuICAgICAgdG9vbF9kdXJhdGlvbl9tczogaW5wdXQudG9vbER1cmF0aW9uTXMsXG4gICAgICBlcnJvcjogaW5wdXQuZXJyb3IsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgc3RlcElkIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgZmluaXNoUnVuKGlucHV0OiBGaW5pc2hSdW5JbnB1dCk6IFByb21pc2U8eyBvazogYm9vbGVhbiB9PiB7XG4gICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmZpbmlzaFJ1bihpbnB1dC5yZXF1ZXN0TG9nSWQsIHtcbiAgICAgIHN0YXR1czogaW5wdXQuc3RhdHVzLFxuICAgICAgcmVzcG9uc2U6IGlucHV0LnJlc3BvbnNlLFxuICAgICAgdG9rZW5fbmFtZTogaW5wdXQudG9rZW5OYW1lLFxuICAgICAgbW9kZWxfbmFtZTogaW5wdXQubW9kZWxOYW1lLFxuICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IGlucHV0LnJlcXVlc3RlZE1vZGVsTmFtZSxcbiAgICAgIGZhbGxiYWNrX2NvdW50OiBpbnB1dC5mYWxsYmFja0NvdW50LFxuICAgICAgaW5wdXRfdG9rZW5zOiBpbnB1dC50b3RhbElucHV0VG9rZW5zLFxuICAgICAgb3V0cHV0X3Rva2VuczogaW5wdXQudG90YWxPdXRwdXRUb2tlbnMsXG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogaW5wdXQudG90YWxDYWNoZVJlYWRUb2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IGlucHV0LnRvdGFsQ2FjaGVDcmVhdGlvblRva2VucyxcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogaW5wdXQudG90YWxDYWNoZUNyZWF0aW9uNW1Ub2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IGlucHV0LnRvdGFsQ2FjaGVDcmVhdGlvbjFoVG9rZW5zLFxuICAgICAgY29zdF91c2Q6IGlucHV0LmNvc3RVc2QgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IE1hdGgucm91bmQoaW5wdXQuY29zdFVzZCAqIE1JQ1JPX1VTRCksXG4gICAgICBjb3N0X3NvdXJjZTogaW5wdXQuY29zdFNvdXJjZSxcbiAgICAgIGR1cmF0aW9uX21zOiBpbnB1dC50b3RhbER1cmF0aW9uTXMsXG4gICAgICBoaXN0b3J5OiBpbnB1dC5oaXN0b3J5ID8gSlNPTi5wYXJzZShpbnB1dC5oaXN0b3J5KSA6IHVuZGVmaW5lZCxcbiAgICAgIGVycm9yX21lc3NhZ2U6IGlucHV0LmVycm9yTWVzc2FnZSxcbiAgICB9KTtcbiAgICByZXR1cm4geyBvazogdHJ1ZSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgc3RhdHMoKTogUHJvbWlzZTxUb2tlblN0YXRzW10+IHtcbiAgICByZXR1cm4gUWdyaWREaXNwYXRjaGVyLmdldFN0YXRzKCk7XG4gIH1cblxuICAvLyDtmZTrqbTsnZgg66qp66GdIO2VhO2EsOulvCDqt7jrjIDroZwg67Cb7JWEIOqwmeydgCDsobDqsbTsnZgg7ZWp6rOE66W8IOuPjOugpOykgOuLpCDigJQg66qp66Gd6rO8IOu5hOyaqeydtFxuICAvLyDshJzroZwg64uk66W4IOuqqOyImOulvCDrs7TrqbQg7IKs7Jqp7J6Q7JeQ6rKM64qUIOyIq+yekOqwgCDslrTquIvrgpwg6rKD7Jy866GcIOydve2ejOuLpC5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgdG90YWxDb3N0KHBhcmFtcz86IFJlcXVlc3RMb2dMaXN0UGFyYW1zKTogUHJvbWlzZTx7IHVzZDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4geyB1c2Q6IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC50b3RhbENvc3QocGFyYW1zKSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgcHJvamVjdE5hbWVzKCk6IFByb21pc2U8eyBuYW1lczogc3RyaW5nW10gfT4ge1xuICAgIHJldHVybiB7IG5hbWVzOiBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZGlzdGluY3RQcm9qZWN0TmFtZXMoKSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgbW9kZWxOYW1lcygpOiBQcm9taXNlPHsgbmFtZXM6IHN0cmluZ1tdIH0+IHtcbiAgICByZXR1cm4geyBuYW1lczogYXdhaXQgUmVxdWVzdExvZ01vZGVsLmRpc3RpbmN0TW9kZWxOYW1lcygpIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgYWRkVG9rZW4oXG4gICAgcHJvdmlkZXI6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogVG9rZW5DcmVkZW50aWFscyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBhZGRlZDogYm9vbGVhbiB9PiB7XG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5zYXZlKFtcbiAgICAgIHtcbiAgICAgICAgcHJvdmlkZXIsXG4gICAgICAgIGNyZWRlbnRpYWxzLFxuICAgICAgICBuYW1lLFxuICAgICAgfSxcbiAgICBdKTtcbiAgICByZXR1cm4geyBhZGRlZDogdHJ1ZSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiXSB9KVxuICBhc3luYyB1cGRhdGVUb2tlbihcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU/OiBzdHJpbmcsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodD86IG51bWJlcixcbiAgKTogUHJvbWlzZTx7IHVwZGF0ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGlmIChcbiAgICAgIHF1b3RhVGhyZXNob2xkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHF1b3RhVGhyZXNob2xkICE9PSBudWxsICYmXG4gICAgICAoIU51bWJlci5pc0ludGVnZXIocXVvdGFUaHJlc2hvbGQpIHx8IHF1b3RhVGhyZXNob2xkIDwgMSB8fCBxdW90YVRocmVzaG9sZCA+IDEwMClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICBcInF1b3RhVGhyZXNob2xkIG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwMCwgb3IgbnVsbFwiIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh3ZWlnaHQgIT09IHVuZGVmaW5lZCAmJiAoIU51bWJlci5pc0ludGVnZXIod2VpZ2h0KSB8fCB3ZWlnaHQgPCAxIHx8IHdlaWdodCA+IDEwMCkpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICBcIndlaWdodCBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAxMDBcIiBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGNoOiBUb2tlblVwZGF0ZUZpZWxkcyA9IHt9O1xuICAgIGlmIChuYW1lICE9PSB1bmRlZmluZWQpIHBhdGNoLm5hbWUgPSBuYW1lO1xuICAgIGlmIChxdW90YVRocmVzaG9sZCAhPT0gdW5kZWZpbmVkKSBwYXRjaC5xdW90YV90aHJlc2hvbGQgPSBxdW90YVRocmVzaG9sZDtcbiAgICBpZiAod2VpZ2h0ICE9PSB1bmRlZmluZWQpIHBhdGNoLndlaWdodCA9IHdlaWdodDtcbiAgICBpZiAoT2JqZWN0LmtleXMocGF0Y2gpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgdXBkYXRlZDogZmFsc2UgfTtcblxuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCBUb2tlbk1vZGVsLnVwZGF0ZUZpZWxkcyhpZCwgcGF0Y2gpO1xuICAgIHJldHVybiB7IHVwZGF0ZWQ6IHVwZGF0ZWQgPiAwIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgcmVtb3ZlVG9rZW4oaWQ6IG51bWJlcik6IFByb21pc2U8eyByZW1vdmVkOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE9uZShcIkFcIiwgeyBpZCB9KTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm4geyByZW1vdmVkOiBmYWxzZSB9O1xuICAgIGF3YWl0IFRva2VuTW9kZWwuZGVsKFtlbnRyeS5pZF0pO1xuICAgIHJldHVybiB7IHJlbW92ZWQ6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDthqDtgbAg7Zmc7ISx7ZmUL+u5hO2ZnOyEse2ZlCDthqDquIAgRELsnZggYWN0aXZlIO2VhOuTnCDsl4XrjbDsnbTtirhcbiAgICovXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyB0b2dnbGVUb2tlbihpZDogbnVtYmVyKTogUHJvbWlzZTx7IGFjdGl2ZTogYm9vbGVhbiB9PiB7XG4gICAgY29uc3QgZW50cnkgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRPbmUoXCJBXCIsIHsgaWQgfSk7XG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuIHsgYWN0aXZlOiBmYWxzZSB9O1xuXG4gICAgY29uc3QgbmV3QWN0aXZlID0gIWVudHJ5LmFjdGl2ZTtcbiAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAge1xuICAgICAgICBpZCxcbiAgICAgICAgcHJvdmlkZXI6IGVudHJ5LnByb3ZpZGVyLFxuICAgICAgICBjcmVkZW50aWFsczogZW50cnkuY3JlZGVudGlhbHMsXG4gICAgICAgIGFjdGl2ZTogbmV3QWN0aXZlLFxuICAgICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgfSxcbiAgICBdKTtcbiAgICByZXR1cm4geyBhY3RpdmU6IG5ld0FjdGl2ZSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIG9hdXRoU3RhcnQobmFtZTogc3RyaW5nKTogUHJvbWlzZTxPQXV0aFN0YXJ0UmVzdWx0PiB7XG4gICAgY29uc3QgeyBjb2RlVmVyaWZpZXIsIGNvZGVDaGFsbGVuZ2UsIHN0YXRlIH0gPSBnZW5lcmF0ZVBLQ0UoKTtcblxuICAgIGNvbnN0IHsgcmVkaXJlY3RVcmksIG1vZGUgfSA9IHJlc29sdmVPQXV0aFJlZGlyZWN0KCk7XG4gICAgY29uc3QgYXV0aFVybCA9IGJ1aWxkQXV0aFVybChjb2RlQ2hhbGxlbmdlLCBzdGF0ZSwgcmVkaXJlY3RVcmkpO1xuXG4gICAgYXdhaXQgc2V0T0F1dGhTdGF0ZShzdGF0ZSwgeyBjb2RlVmVyaWZpZXIsIG5hbWUsIHJlZGlyZWN0VXJpLCBwcm92aWRlcjogXCJhbnRocm9waWNcIiB9KTtcblxuICAgIHJldHVybiB7IGF1dGhVcmwsIG1vZGUgfTtcbiAgfVxuXG4gIC8vIOy9lOuTnCDrtpnsl6zrhKPquLAg7ZSM66Gc7JqwKOybkOqyqSDsoJHsho0pOiDsvZjshpQg7L2c67Cx7J20IO2RnOyLnO2VnCBgY29kZSNzdGF0ZWAg66W8IOuwm+yVhCDqtZDtmZjtlZzri6QuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBvYXV0aENvbXBsZXRlKHBhc3RlZENvZGU6IHN0cmluZyk6IFByb21pc2U8eyBhZGRlZDogYm9vbGVhbjsgbmFtZTogc3RyaW5nIH0+IHtcbiAgICBjb25zdCB0cmltbWVkID0gcGFzdGVkQ29kZS50cmltKCk7XG4gICAgY29uc3Qgc2VwYXJhdG9yQXQgPSB0cmltbWVkLmluZGV4T2YoXCIjXCIpO1xuICAgIGNvbnN0IGNvZGUgPSBzZXBhcmF0b3JBdCA+IDAgPyB0cmltbWVkLnNsaWNlKDAsIHNlcGFyYXRvckF0KSA6IFwiXCI7XG4gICAgY29uc3Qgc3RhdGUgPSBzZXBhcmF0b3JBdCA+IDAgPyB0cmltbWVkLnNsaWNlKHNlcGFyYXRvckF0ICsgMSkgOiBcIlwiO1xuICAgIGlmICghY29kZSB8fCAhc3RhdGUpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICBcImV4cGVjdGVkIHRoZSBjb2RlIHNob3duIGFmdGVyIGxvZ2luLCBpbiBjb2RlI3N0YXRlIGZvcm1cIiBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBlbmRpbmcgPSBhd2FpdCBnZXRPQXV0aFN0YXRlKHN0YXRlKTtcbiAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICBcImxvZ2luIHNlc3Npb24gbm90IGZvdW5kIG9yIGV4cGlyZWQg4oCUIHN0YXJ0IHRoZSBsb2dpbiBhZ2FpblwiIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICAgICk7XG4gICAgfVxuICAgIGF3YWl0IGRlbGV0ZU9BdXRoU3RhdGUoc3RhdGUpO1xuXG4gICAgaWYgKHBlbmRpbmcucHJvdmlkZXIgIT09IFwiYW50aHJvcGljXCIpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFwibG9naW4gc2Vzc2lvbiBpcyBub3QgZm9yIEFudGhyb3BpY1wiIGFzIExvY2FsaXplZFN0cmluZyk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5jb21wbGV0ZUFudGhyb3BpY0xvZ2luKGNvZGUsIHN0YXRlLCBwZW5kaW5nKTtcbiAgICByZXR1cm4geyBhZGRlZDogdHJ1ZSwgbmFtZTogcGVuZGluZy5uYW1lIH07XG4gIH1cblxuICAvLyDqtZDtmZggKyDqs4TsoJUg7KSR67O1IOygnOqxsCArIOyggOyepSDigJQgcmVkaXJlY3Qg7L2c67Cx6rO8IOy9lOuTnCDrtpnsl6zrhKPquLAg7ZSM66Gc7Jqw6rCAIOqzteycoO2VnOuLpC5cbiAgcHJpdmF0ZSBhc3luYyBjb21wbGV0ZUFudGhyb3BpY0xvZ2luKFxuICAgIGNvZGU6IHN0cmluZyxcbiAgICBzdGF0ZTogc3RyaW5nLFxuICAgIHBlbmRpbmc6IFBlbmRpbmdPQXV0aCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdG9rZW5zID0gYXdhaXQgZXhjaGFuZ2VDb2RlRm9yVG9rZW5zKFxuICAgICAgY29kZSxcbiAgICAgIHBlbmRpbmcuY29kZVZlcmlmaWVyLFxuICAgICAgc3RhdGUsXG4gICAgICBwZW5kaW5nLnJlZGlyZWN0VXJpLFxuICAgICk7XG5cbiAgICBhd2FpdCBUb2tlbk1vZGVsLnJlcGxhY2VCeUFjY291bnQoXCJhbnRocm9waWNcIiwgdG9rZW5zLmFjY291bnRVdWlkLCB7XG4gICAgICBwcm92aWRlcjogXCJhbnRocm9waWNcIixcbiAgICAgIGNyZWRlbnRpYWxzOiB7XG4gICAgICAgIGFjY2Vzc1Rva2VuOiB0b2tlbnMuYWNjZXNzVG9rZW4sXG4gICAgICAgIHJlZnJlc2hUb2tlbjogdG9rZW5zLnJlZnJlc2hUb2tlbixcbiAgICAgICAgZXhwaXJlc0F0OiB0b2tlbnMuZXhwaXJlc0F0ID8/IDAsXG4gICAgICAgIGFjY291bnRVdWlkOiB0b2tlbnMuYWNjb3VudFV1aWQgPz8gXCJcIixcbiAgICAgIH0sXG4gICAgICBuYW1lOiBwZW5kaW5nLm5hbWUsXG4gICAgfSk7XG5cbiAgICBub3RpZnlUb2tlbkFkZGVkKHBlbmRpbmcubmFtZSwgXCJhbnRocm9waWNcIik7XG4gIH1cblxuICBhc3luYyBoYW5kbGVPQXV0aENhbGxiYWNrKGNvZGU6IHN0cmluZywgc3RhdGU6IHN0cmluZywgcmVwbHk6IEZhc3RpZnlSZXBseSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBlbmRpbmcgPSBhd2FpdCBnZXRPQXV0aFN0YXRlKHN0YXRlKTtcbiAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgIGxvZ2dlci53YXJuKFwib2F1dGggY2FsbGJhY2s6IGludmFsaWRfc3RhdGVcIik7XG4gICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoXCIvP29hdXRoPWVycm9yJnJlYXNvbj1pbnZhbGlkX3N0YXRlXCIpO1xuICAgIH1cbiAgICBhd2FpdCBkZWxldGVPQXV0aFN0YXRlKHN0YXRlKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAocGVuZGluZy5wcm92aWRlciA9PT0gXCJvcGVuYWlcIikge1xuICAgICAgICBjb25zdCBjcmVkcyA9IGF3YWl0IGV4Y2hhbmdlT3BlbkFJQ29kZShjb2RlLCBwZW5kaW5nLmNvZGVWZXJpZmllciwgcGVuZGluZy5yZWRpcmVjdFVyaSk7XG4gICAgICAgIGF3YWl0IFRva2VuTW9kZWwucmVwbGFjZUJ5QWNjb3VudChcIm9wZW5haVwiLCBjcmVkcy5hY2NvdW50SWQsIHtcbiAgICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgICBjcmVkZW50aWFsczogY3JlZHMsXG4gICAgICAgICAgbmFtZTogcGVuZGluZy5uYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYE9wZW5BSSB0b2tlbiBzYXZlZCBmb3IgJHtwZW5kaW5nLm5hbWV9YCk7XG4gICAgICAgIG5vdGlmeVRva2VuQWRkZWQocGVuZGluZy5uYW1lLCBcIm9wZW5haVwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29tcGxldGVBbnRocm9waWNMb2dpbihjb2RlLCBzdGF0ZSwgcGVuZGluZyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoYC8/b2F1dGg9c3VjY2VzcyZuYW1lPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBlbmRpbmcubmFtZSl9YCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBsb2dnZXIud2FybihcIm9hdXRoIGNhbGxiYWNrIGZhaWxlZFwiLCB7XG4gICAgICAgIHByb3ZpZGVyOiBwZW5kaW5nLnByb3ZpZGVyLFxuICAgICAgICByZWFzb246IFwiZXhjaGFuZ2VfZmFpbGVkXCIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXBseS5yZWRpcmVjdChcIi8/b2F1dGg9ZXJyb3ImcmVhc29uPWV4Y2hhbmdlX2ZhaWxlZFwiKTtcbiAgICB9XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgb2F1dGhTdGFydE9wZW5BSShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPE9BdXRoU3RhcnRSZXN1bHQ+IHtcbiAgICBjb25zdCB7IGNvZGVWZXJpZmllciwgY29kZUNoYWxsZW5nZSwgc3RhdGUgfSA9IGdlbmVyYXRlT3BlbkFJUEtDRSgpO1xuICAgIGNvbnN0IHJlZGlyZWN0VXJpID0gYCR7dHJ1c3RlZExvb3BiYWNrQmFzZSgpfS9hdXRoL2NhbGxiYWNrYDtcbiAgICBjb25zdCBhdXRoVXJsID0gYnVpbGRPcGVuQUlBdXRoVXJsKGNvZGVDaGFsbGVuZ2UsIHN0YXRlLCByZWRpcmVjdFVyaSk7XG4gICAgYXdhaXQgc2V0T0F1dGhTdGF0ZShzdGF0ZSwgeyBjb2RlVmVyaWZpZXIsIG5hbWUsIHJlZGlyZWN0VXJpLCBwcm92aWRlcjogXCJvcGVuYWlcIiB9KTtcbiAgICByZXR1cm4geyBhdXRoVXJsLCBtb2RlOiBcInJlZGlyZWN0XCIgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIHVzYWdlKHRva2VuSWQ/OiBudW1iZXIpOiBQcm9taXNlPFVzYWdlUmVzcG9uc2U+IHtcbiAgICBjb25zdCB7IHJvd3M6IGFsbFRva2VucyB9ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kTWFueShcIkFcIik7XG4gICAgY29uc3QgZW50cnkgPSB0b2tlbklkXG4gICAgICA/IGFsbFRva2Vucy5maW5kKChlKSA9PiBlLmlkID09PSB0b2tlbklkKVxuICAgICAgOiBhbGxUb2tlbnMuZmluZExhc3QoKGUpID0+IGUuYWN0aXZlICYmIGUucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIpO1xuXG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuIHsgZXJyb3I6IFwiTk9UX0ZPVU5EXCIgfTtcblxuICAgIGlmIChlbnRyeS5wcm92aWRlciA9PT0gXCJvcGVuYWlcIikge1xuICAgICAgaWYgKCFlbnRyeS5hY3RpdmUpIHtcbiAgICAgICAgcmV0dXJuIHsgcHJvdmlkZXI6IFwib3BlbmFpXCIsIGZpdmVIb3VyOiBudWxsLCBzZXZlbkRheTogbnVsbCB9O1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByYXcgPSBhd2FpdCBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcj8uZ2V0UmF0ZUxpbWl0c0J5VG9rZW5JZChlbnRyeS5pZCk7XG4gICAgICAgIGNvbnN0IHJsID0gcmF3Py5kYXRhLnJhdGVMaW1pdHM7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICAgICAgZml2ZUhvdXI6IHJsPy5wcmltYXJ5XG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICB1dGlsaXphdGlvbjogcmwucHJpbWFyeS51c2VkUGVyY2VudCxcbiAgICAgICAgICAgICAgICByZXNldHNBdDogdW5peFNlY29uZHNUb0lzbyhybC5wcmltYXJ5LnJlc2V0c0F0KSxcbiAgICAgICAgICAgICAgICB3aW5kb3dEdXJhdGlvbk1pbnM6IHJsLnByaW1hcnkud2luZG93RHVyYXRpb25NaW5zLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgc2V2ZW5EYXk6IHJsPy5zZWNvbmRhcnlcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIHV0aWxpemF0aW9uOiBybC5zZWNvbmRhcnkudXNlZFBlcmNlbnQsXG4gICAgICAgICAgICAgICAgcmVzZXRzQXQ6IHVuaXhTZWNvbmRzVG9Jc28ocmwuc2Vjb25kYXJ5LnJlc2V0c0F0KSxcbiAgICAgICAgICAgICAgICB3aW5kb3dEdXJhdGlvbk1pbnM6IHJsLnNlY29uZGFyeS53aW5kb3dEdXJhdGlvbk1pbnMsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGBPcGVuQUkgdXNhZ2UgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW50cnkucHJvdmlkZXIgIT09IFwiYW50aHJvcGljXCIpIHtcbiAgICAgIHJldHVybiB7IGVycm9yOiBgdXNhZ2UgQVBJIG5vdCBzdXBwb3J0ZWQgZm9yIHByb3ZpZGVyOiAke2VudHJ5LnByb3ZpZGVyfWAgfTtcbiAgICB9XG5cbiAgICBsZXQgYWNjZXNzVG9rZW4gPSBnZXRBY2Nlc3NUb2tlbihlbnRyeS5jcmVkZW50aWFscyk7XG4gICAgY29uc3QgaXNFeHBpcmVkID0gZ2V0RXhwaXJlc0F0KGVudHJ5LmNyZWRlbnRpYWxzKSA8IERhdGUubm93KCk7XG5cbiAgICBpZiAoaXNFeHBpcmVkICYmIGdldFJlZnJlc2hUb2tlbihlbnRyeS5jcmVkZW50aWFscykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFjY2Vzc1Rva2VuID0gYXdhaXQgdGhpcy5yZWZyZXNoVG9rZW4oZW50cnkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBvYXV0aExvZ2dlci53YXJuKGByZWZyZXNoIGZhaWxlZCBmb3IgJHtlbnRyeS5uYW1lfTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IFwicmUtbG9naW4gcmVxdWlyZWRcIiB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJhdyA9IGF3YWl0IGZldGNoVXNhZ2UoYWNjZXNzVG9rZW4pO1xuICAgIGlmIChyYXcuZXJyb3IgJiYgZ2V0UmVmcmVzaFRva2VuKGVudHJ5LmNyZWRlbnRpYWxzKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYWNjZXNzVG9rZW4gPSBhd2FpdCB0aGlzLnJlZnJlc2hUb2tlbihlbnRyeSk7XG4gICAgICAgIGNvbnN0IHJldHJpZWQgPSBhd2FpdCBmZXRjaFVzYWdlKGFjY2Vzc1Rva2VuKTtcbiAgICAgICAgaWYgKHJldHJpZWQuZXJyb3IpIHJldHVybiB7IGVycm9yOiByZXRyaWVkLmVycm9yIH07XG4gICAgICAgIHJldHVybiBjb252ZXJ0QW50aHJvcGljVXNhZ2UocmV0cmllZCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIG9hdXRoTG9nZ2VyLndhcm4oYHJlZnJlc2ggZmFpbGVkIGZvciAke2VudHJ5Lm5hbWV9OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICByZXR1cm4geyBlcnJvcjogXCJyZS1sb2dpbiByZXF1aXJlZFwiIH07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyYXcuZXJyb3IpIHJldHVybiB7IGVycm9yOiByYXcuZXJyb3IgfTtcbiAgICByZXR1cm4gY29udmVydEFudGhyb3BpY1VzYWdlKHJhdyk7XG4gIH1cblxuICAvLyDrj5nsi5wgcmVmcmVzaCDqsIAg7ZqM7KCE7J2EIOqyuey5mOuptCDrkqTriqbsnYAg7Zi47Lac7J20IOydtOuvuCDtj5DquLDrkJwgcmVmcmVzaCB0b2tlbiDsnYQg7JOw6rKMIOuQmOyWtFxuICAvLyDrqYDsqaHtlZwg7Yag7YGw7J20IOyCrOunneycvOuhnCDsmKTtjJDrkJzri6QuIG9wZW5haS1yZWZyZXNoLnRzIOyZgCDqsJnsnYAgcGVyLXRva2VuIGRlZHVwIOydhCDrkZTri6QuXG4gIGFzeW5jIHJlZnJlc2hUb2tlbih0b2tlbjogVG9rZW5TdWJzZXRBKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBpbmZsaWdodCA9IGluZmxpZ2h0QW50aHJvcGljUmVmcmVzaC5nZXQodG9rZW4uaWQpO1xuICAgIGlmIChpbmZsaWdodCkgcmV0dXJuIGluZmxpZ2h0O1xuXG4gICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuZG9SZWZyZXNoVG9rZW4odG9rZW4pO1xuICAgIGluZmxpZ2h0QW50aHJvcGljUmVmcmVzaC5zZXQodG9rZW4uaWQsIHByb21pc2UpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcHJvbWlzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaW5mbGlnaHRBbnRocm9waWNSZWZyZXNoLmRlbGV0ZSh0b2tlbi5pZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkb1JlZnJlc2hUb2tlbih0b2tlbjogVG9rZW5TdWJzZXRBKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBjcmVkcyA9IHRva2VuLmNyZWRlbnRpYWxzO1xuICAgIGNvbnN0IHJ0ID0gZ2V0UmVmcmVzaFRva2VuKGNyZWRzKTtcbiAgICBpZiAoIXJ0KSB0aHJvdyBuZXcgRXJyb3IoXCJObyByZWZyZXNoIHRva2VuXCIpO1xuXG4gICAgbGV0IHJlZnJlc2hlZDtcbiAgICB0cnkge1xuICAgICAgcmVmcmVzaGVkID0gYXdhaXQgcmVmcmVzaEFjY2Vzc1Rva2VuKHJ0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIFJlZnJlc2hGYWlsZWRFcnJvciAmJiBlLmlzQXV0aERlYWQpIHtcbiAgICAgICAgYXdhaXQgZGVhY3RpdmF0ZUF1dGhEZWFkVG9rZW4odG9rZW4sIHJ0LCBgYW50aHJvcGljOiR7ZS5zdGF0dXN9YCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZWQgPSBUb2tlbkNyZWRlbnRpYWxzLnBhcnNlKHtcbiAgICAgIC4uLmNyZWRzLFxuICAgICAgYWNjZXNzVG9rZW46IHJlZnJlc2hlZC5hY2Nlc3NUb2tlbixcbiAgICAgIHJlZnJlc2hUb2tlbjogcmVmcmVzaGVkLnJlZnJlc2hUb2tlbixcbiAgICAgIGV4cGlyZXNBdDogcmVmcmVzaGVkLmV4cGlyZXNBdCxcbiAgICB9KTtcbiAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAge1xuICAgICAgICBpZDogdG9rZW4uaWQsXG4gICAgICAgIHByb3ZpZGVyOiB0b2tlbi5wcm92aWRlcixcbiAgICAgICAgY3JlZGVudGlhbHM6IHVwZGF0ZWQsXG4gICAgICAgIG5hbWU6IHRva2VuLm5hbWUsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHJldHVybiByZWZyZXNoZWQuYWNjZXNzVG9rZW47XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyBoZWFsdGgoKTogUHJvbWlzZTxIZWFsdGhSZXNwb25zZT4ge1xuICAgIGNvbnN0IHByb3ZpZGVycyA9IHsgLi4uUWdyaWREaXNwYXRjaGVyLnN0YXJ0dXBTdGF0ZSB9O1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IFwib2tcIixcbiAgICAgIGFjdGl2ZVRva2VuczogUWdyaWREaXNwYXRjaGVyLnRva2Vucy5zaXplLFxuICAgICAgc3Vic2NyaWJlcjogUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXI/LnN0YXR1cygpID8/IG51bGwsXG4gICAgICAvLyBwcm92aWRlciDrs4Qg65287Jqw7YyF7J206528IO2VmOuCmOunjCDspIDruYTrj7zrj4Qg6re4IHByb3ZpZGVyIOyalOyyreydgCDsspjrpqzrkJzri6QuXG4gICAgICByZWFkeTogT2JqZWN0LnZhbHVlcyhwcm92aWRlcnMpLmluY2x1ZGVzKFwicmVhZHlcIiksXG4gICAgICBwcm92aWRlcnMsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgUWdyaWRGcmFtZSA9IG5ldyBRZ3JpZEZyYW1lQ2xhc3MoKTtcblxuZnVuY3Rpb24gY29udmVydEFudGhyb3BpY1VzYWdlKHJhdzogQW50aHJvcGljVXNhZ2VSYXcpOiBVc2FnZVJlc3BvbnNlIHtcbiAgcmV0dXJuIHtcbiAgICBwcm92aWRlcjogXCJhbnRocm9waWNcIixcbiAgICBmaXZlSG91cjogcmF3LmZpdmVfaG91clxuICAgICAgPyB7IHV0aWxpemF0aW9uOiByYXcuZml2ZV9ob3VyLnV0aWxpemF0aW9uLCByZXNldHNBdDogcmF3LmZpdmVfaG91ci5yZXNldHNfYXQgfVxuICAgICAgOiBudWxsLFxuICAgIHNldmVuRGF5OiByYXcuc2V2ZW5fZGF5XG4gICAgICA/IHsgdXRpbGl6YXRpb246IHJhdy5zZXZlbl9kYXkudXRpbGl6YXRpb24sIHJlc2V0c0F0OiByYXcuc2V2ZW5fZGF5LnJlc2V0c19hdCB9XG4gICAgICA6IG51bGwsXG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7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
|
|
748
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZnJhbWUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmZyYW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcnlwdG8gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSwgdHlwZSBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyBhcGksIEJhZFJlcXVlc3RFeGNlcHRpb24sIEJhc2VGcmFtZUNsYXNzLCBTb25hbXUsIHN0cmVhbSB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGdldENhY2hlTWFuYWdlclJlZiB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHsgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7XG4gIGdldEFjY2Vzc1Rva2VuLFxuICBnZXRFeHBpcmVzQXQsXG4gIGdldFJlZnJlc2hUb2tlbixcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vY3JlZGVudGlhbHNcIjtcbmltcG9ydCB7IENhbGxlclNjaGVtYVZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3NjaGVtYS12YWxpZGF0aW9uXCI7XG5pbXBvcnQge1xuICBidWlsZE9wZW5BSUF1dGhVcmwsXG4gIGV4Y2hhbmdlT3BlbkFJQ29kZSxcbiAgZ2VuZXJhdGVPcGVuQUlQS0NFLFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktb2F1dGhcIjtcbmltcG9ydCB7IE1JQ1JPX1VTRCwgUmVxdWVzdExvZ01vZGVsIH0gZnJvbSBcIi4uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIFJlcXVlc3RMb2dMaXN0UGFyYW1zIH0gZnJvbSBcIi4uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLnR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2V0QSB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsLCB0eXBlIFRva2VuVXBkYXRlRmllbGRzIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyBUb2tlbkNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQge1xuICBDT05TT0xFX0NBTExCQUNLX1VSTCxcbiAgdHlwZSBBbnRocm9waWNVc2FnZVJhdyxcbiAgYnVpbGRBdXRoVXJsLFxuICBleGNoYW5nZUNvZGVGb3JUb2tlbnMsXG4gIGZldGNoVXNhZ2UsXG4gIGdlbmVyYXRlUEtDRSxcbiAgcmVmcmVzaEFjY2Vzc1Rva2VuLFxuICBSZWZyZXNoRmFpbGVkRXJyb3IsXG59IGZyb20gXCIuL29hdXRoXCI7XG5pbXBvcnQge1xuICBhc3NlcnROYXRpdmVSdW5BZG1pc3Npb24sXG4gIGFmdGVyUXVlcnksXG4gIGJlZm9yZVF1ZXJ5LFxuICBmaW5pc2hSdW5BYm9ydGVkLFxuICBmaW5pc2hSdW5XaXRoRXJyb3IsXG59IGZyb20gXCIuL3FncmlkLXJ1bi1saWZlY3ljbGVcIjtcbmltcG9ydCB7XG4gIGJ1aWxkQW5kVmFsaWRhdGVTdHJpY3RPdXRwdXRTY2hlbWEsXG4gIHR5cGUgSW50ZXJuYWxRdWVyeUlucHV0LFxuICBRZ3JpZERpc3BhdGNoZXIsXG59IGZyb20gXCIuL3FncmlkLmRpc3BhdGNoZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgUXVlcnlJbnB1dCxcbiAgdHlwZSBBcHBlbmRTdGVwSW5wdXQsXG4gIHR5cGUgQ3JlYXRlUnVuSW5wdXQsXG4gIHR5cGUgRmluaXNoUnVuSW5wdXQsXG4gIHR5cGUgSGVhbHRoUmVzcG9uc2UsXG4gIHR5cGUgT0F1dGhTdGFydFJlc3VsdCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbiAgdHlwZSBRZ3JpZFJ1bkNvbnRleHQsXG4gIFN0cmVhbUV2ZW50cyxcbiAgdHlwZSBUb2tlblN0YXRzLFxuICB0eXBlIFVzYWdlUmVzcG9uc2UsXG59IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyBkZWFjdGl2YXRlQXV0aERlYWRUb2tlbiwgbm90aWZ5VG9rZW5BZGRlZCB9IGZyb20gXCIuL3Rva2VuLWRlYXRoXCI7XG5pbXBvcnQgeyBUb29sU2NoZW1hQ29tcG9zaXRpb25FcnJvciB9IGZyb20gXCIuL3Rvb2wtZW11bGF0aW9uLXNjaGVtYVwiO1xuXG5jb25zdCBwZW5kaW5nU3RyZWFtcyA9IG5ldyBNYXA8c3RyaW5nLCBRdWVyeUlucHV0PigpO1xuXG50eXBlIFBlbmRpbmdPQXV0aCA9IHtcbiAgY29kZVZlcmlmaWVyOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgcmVkaXJlY3RVcmk6IHN0cmluZztcbiAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIgfCBcIm9wZW5haVwiO1xufTtcbmNvbnN0IE9BVVRIX1NUQVRFX1BSRUZJWCA9IFwib2F1dGg6c3RhdGU6XCI7XG5jb25zdCBPQVVUSF9TVEFURV9UVEwgPSBcIjVtXCI7XG5cbmZ1bmN0aW9uIHVuaXhTZWNvbmRzVG9Jc28oc2Vjb25kczogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gdHlwZW9mIHNlY29uZHMgPT09IFwibnVtYmVyXCIgPyBuZXcgRGF0ZShzZWNvbmRzICogMTAwMCkudG9JU09TdHJpbmcoKSA6IG51bGw7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldE9BdXRoU3RhdGUoc3RhdGU6IHN0cmluZywgZGF0YTogUGVuZGluZ09BdXRoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNhY2hlID0gZ2V0Q2FjaGVNYW5hZ2VyUmVmKCk7XG4gIGlmICghY2FjaGUpIHRocm93IG5ldyBFcnJvcihcIkNhY2hlTWFuYWdlciBub3QgaW5pdGlhbGl6ZWRcIik7XG4gIGF3YWl0IGNhY2hlLnNldCh7XG4gICAga2V5OiBgJHtPQVVUSF9TVEFURV9QUkVGSVh9JHtzdGF0ZX1gLFxuICAgIHZhbHVlOiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICB0dGw6IE9BVVRIX1NUQVRFX1RUTCxcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE9BdXRoU3RhdGUoc3RhdGU6IHN0cmluZyk6IFByb21pc2U8UGVuZGluZ09BdXRoIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNhY2hlID0gZ2V0Q2FjaGVNYW5hZ2VyUmVmKCk7XG4gIGlmICghY2FjaGUpIHRocm93IG5ldyBFcnJvcihcIkNhY2hlTWFuYWdlciBub3QgaW5pdGlhbGl6ZWRcIik7XG4gIGNvbnN0IHJhdyA9IGF3YWl0IGNhY2hlLmdldDxzdHJpbmc+KHsga2V5OiBgJHtPQVVUSF9TVEFURV9QUkVGSVh9JHtzdGF0ZX1gIH0pO1xuICBpZiAoIXJhdykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSBhcyBQZW5kaW5nT0F1dGg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU9BdXRoU3RhdGUoc3RhdGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjYWNoZSA9IGdldENhY2hlTWFuYWdlclJlZigpO1xuICBpZiAoIWNhY2hlKSByZXR1cm47XG4gIGF3YWl0IGNhY2hlLmRlbGV0ZSh7IGtleTogYCR7T0FVVEhfU1RBVEVfUFJFRklYfSR7c3RhdGV9YCB9KTtcbn1cblxuY29uc3QgdHJ1c3RlZExvb3BiYWNrQmFzZSA9ICgpID0+IGBodHRwOi8vbG9jYWxob3N0OiR7cHJvY2Vzcy5lbnYuUE9SVCA/PyBcIjQ0OTAwXCJ9YDtcblxuLy8gQW50aHJvcGljJ3MgcmVtb3RlL21hbnVhbCBmbG93IHVzZXMgaXRzIGZpeGVkIGNvbnNvbGUgY2FsbGJhY2suIEhlYWRlcnMgbWF5IHNlbGVjdCBiZXR3ZWVuIHR3b1xuLy8gYWxsb3dsaXN0ZWQgVVJJcywgYnV0IG5ldmVyIGNvbnRyaWJ1dGUgYXV0aG9yaXR5IG9yIHBhdGggYnl0ZXMgdG8gZWl0aGVyIFVSSS5cbmZ1bmN0aW9uIHJlc29sdmVPQXV0aFJlZGlyZWN0KCk6IHsgcmVkaXJlY3RVcmk6IHN0cmluZzsgbW9kZTogXCJyZWRpcmVjdFwiIHwgXCJjb2RlXCIgfSB7XG4gIHRyeSB7XG4gICAgY29uc3QgeyBoZWFkZXJzIH0gPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIGNvbnN0IG9yaWdpbiA9IHR5cGVvZiBoZWFkZXJzLm9yaWdpbiA9PT0gXCJzdHJpbmdcIiA/IGhlYWRlcnMub3JpZ2luIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGZvcndhcmRlZCA9IGhlYWRlcnNbXCJ4LWZvcndhcmRlZC1ob3N0XCJdO1xuICAgIGNvbnN0IHJhd0hvc3QgPSBBcnJheS5pc0FycmF5KGZvcndhcmRlZCkgPyBmb3J3YXJkZWRbMF0gOiAoZm9yd2FyZGVkID8/IGhlYWRlcnMuaG9zdCk7XG4gICAgY29uc3QgaG9zdCA9IG9yaWdpblxuICAgICAgPyBuZXcgVVJMKG9yaWdpbikuaG9zdG5hbWVcbiAgICAgIDogbmV3IFVSTChgaHR0cDovLyR7cmF3SG9zdCA/PyBcImxvY2FsaG9zdFwifWApLmhvc3RuYW1lO1xuICAgIGlmICghbmV3IFNldChbXCJsb2NhbGhvc3RcIiwgXCIxMjcuMC4wLjFcIiwgXCI6OjFcIiwgXCJbOjoxXVwiXSkuaGFzKGhvc3QpKSB7XG4gICAgICByZXR1cm4geyByZWRpcmVjdFVyaTogQ09OU09MRV9DQUxMQkFDS19VUkwsIG1vZGU6IFwiY29kZVwiIH07XG4gICAgfVxuICB9IGNhdGNoIHt9XG4gIHJldHVybiB7IHJlZGlyZWN0VXJpOiBgJHt0cnVzdGVkTG9vcGJhY2tCYXNlKCl9L2NhbGxiYWNrYCwgbW9kZTogXCJyZWRpcmVjdFwiIH07XG59XG5cbmZ1bmN0aW9uIHJlamVjdEltYWdlR2VuZXJhdGlvblN0cmVhbShhcmdzOiBRdWVyeUlucHV0KTogdm9pZCB7XG4gIGlmICghYXJncy5pbWFnZUdlbmVyYXRpb24pIHJldHVybjtcbiAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgXCJxZ3JpZDogaW1hZ2VHZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBzdHJlYW1pbmc7IHVzZSBxdWVyeS9nZW5lcmF0ZVRleHQgaW5zdGVhZC5cIiBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICk7XG59XG5cbi8vIGFudGhyb3BpYyDsnYAgLS1qc29uLXNjaGVtYSDrpbwg7JOw7KeAIOyViuycvOuvgOuhnChTT04tNTMyKSBzdHJpY3Qg67OA7ZmYwrdhcmd2IOygnO2VnCDsl4bsnbQg7JuQ7ZiV7J2YXG4vLyDqtazrrLjCt+uzteyeoeuPhOunjCDqsoDspp3rkJzri6Qg4oCUIHByb3ZpZGVyIOu2hOq4sOuKlCBidWlsZEFuZFZhbGlkYXRlU3RyaWN0T3V0cHV0U2NoZW1hIOqwgCDshozsnKDtlZzri6QuXG5mdW5jdGlvbiByZWplY3RJbnZhbGlkQ2FsbGVyU2NoZW1hcyhhcmdzOiBRdWVyeUlucHV0KTogdm9pZCB7XG4gIGlmIChhcmdzLmpzb25TY2hlbWEgPT09IHVuZGVmaW5lZCAmJiAhYXJncy50b29scz8ubGVuZ3RoKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICBidWlsZEFuZFZhbGlkYXRlU3RyaWN0T3V0cHV0U2NoZW1hKGFyZ3MpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChcbiAgICAgIGVycm9yIGluc3RhbmNlb2YgQ2FsbGVyU2NoZW1hVmFsaWRhdGlvbkVycm9yIHx8XG4gICAgICBlcnJvciBpbnN0YW5jZW9mIFRvb2xTY2hlbWFDb21wb3NpdGlvbkVycm9yXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihlcnJvci5tZXNzYWdlIGFzIExvY2FsaXplZFN0cmluZyk7XG4gICAgfVxuICAgIC8vIOyemOuqu+uQnCBrZXl3b3JkIO2Yle2DnChhbnlPZiDrpbwg6rCd7LK066GcIOuztOuCtOuKlCDrk7Ep64qUIO2MjOydtO2UhOudvOyduOyXkOyEnCB1bnR5cGVkIOyYpOulmOuhnCDrgpjsmKTrr4DroZwsXG4gICAgLy8g7YOA7J6FIOyige2eiOq4sCDrjIDsi6AgRXJyb3Ig7KCE7LK066W8IGNhbGxlci1mYXVsdCA0MDAg7Jy866GcIOunpO2Vke2VnOuLpCjqs4Tslb0g7YWM7Iqk7Yq466GcIOqzoOygleuQqCkuXG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICBgcWdyaWQ6IGNhbGxlciBzY2hlbWEgY2Fubm90IGJlIG5vcm1hbGl6ZWQ6ICR7ZXJyb3IubWVzc2FnZX1gIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVUb2tlbk5hbWUoYXJnczogUXVlcnlJbnB1dCk6IFByb21pc2U8SW50ZXJuYWxRdWVyeUlucHV0PiB7XG4gIGlmICghYXJncy50b2tlbk5hbWUpIHJldHVybiBhcmdzO1xuXG4gIGNvbnN0IHRva2VuUHJvdmlkZXIgPSBhcmdzLnRva2VuTmFtZS5zcGxpdChcIi9cIiwgMSlbMF07XG4gIGNvbnN0IG1vZGVsUHJvdmlkZXIgPSBhcmdzLm1vZGVsPy5zcGxpdChcIi9cIiwgMSlbMF07XG4gIGlmICh0b2tlblByb3ZpZGVyICE9PSBcImFudGhyb3BpY1wiICYmIHRva2VuUHJvdmlkZXIgIT09IFwib3BlbmFpXCIpIHtcbiAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihgSW52YWxpZCB0b2tlbiBuYW1lOiAke2FyZ3MudG9rZW5OYW1lfWAgYXMgTG9jYWxpemVkU3RyaW5nKTtcbiAgfVxuICBpZiAobW9kZWxQcm92aWRlciAhPT0gdG9rZW5Qcm92aWRlcikge1xuICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgXCJUb2tlbiBwcm92aWRlciBkb2VzIG5vdCBtYXRjaCBtb2RlbCBwcm92aWRlclwiIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgdG9rZW4gPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRBY3RpdmVCeVByb3ZpZGVyQW5kTmFtZShcIkFcIiwgdG9rZW5Qcm92aWRlciwgYXJncy50b2tlbk5hbWUpO1xuICBpZiAoIXRva2VuKSB7XG4gICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oYEFjdGl2ZSB0b2tlbiBub3QgZm91bmQ6ICR7YXJncy50b2tlbk5hbWV9YCBhcyBMb2NhbGl6ZWRTdHJpbmcpO1xuICB9XG4gIHJldHVybiB7IC4uLmFyZ3MsIHByZWZlcnJlZFRva2VuSWQ6IHRva2VuLmlkLCByZXF1aXJlUHJlZmVycmVkVG9rZW46IHRydWUgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSHR0cERpc2Nvbm5lY3RIYW5kbGUoKToge1xuICBzaWduYWw6IEFib3J0U2lnbmFsO1xuICBkaXNwb3NlOiAoKSA9PiB2b2lkO1xufSB7XG4gIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgbGV0IHJlcXVlc3RSYXc6IEZhc3RpZnlSZXF1ZXN0W1wicmF3XCJdIHwgdW5kZWZpbmVkO1xuICBsZXQgcmVzcG9uc2VSYXc6IEZhc3RpZnlSZXBseVtcInJhd1wiXSB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGNvbnN0IGN0eCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgcmVxdWVzdFJhdyA9IGN0eC5yZXF1ZXN0Py5yYXc7XG4gICAgaWYgKGN0eC50cmFuc3BvcnQgPT09IFwiaHR0cFwiKSByZXNwb25zZVJhdyA9IGN0eC5yZXBseS5yYXc7XG4gIH0gY2F0Y2gge1xuICAgIC8vIERpcmVjdCBmcmFtZSBjYWxscyAoZm9yIGV4YW1wbGUgdW5pdCB0ZXN0cykgZG8gbm90IGhhdmUgYW4gSFRUUCBjb250ZXh0LlxuICB9XG5cbiAgY29uc3QgYWJvcnQgPSAoKSA9PiBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgY29uc3QgYWJvcnRPbkluY29tcGxldGVSZXNwb25zZUNsb3NlID0gKCkgPT4ge1xuICAgIGlmICghcmVzcG9uc2VSYXc/LndyaXRhYmxlRW5kZWQpIGFib3J0KCk7XG4gIH07XG5cbiAgcmVxdWVzdFJhdz8ub25jZShcImFib3J0ZWRcIiwgYWJvcnQpO1xuICByZXNwb25zZVJhdz8ub25jZShcImNsb3NlXCIsIGFib3J0T25JbmNvbXBsZXRlUmVzcG9uc2VDbG9zZSk7XG5cbiAgaWYgKHJlcXVlc3RSYXc/LmFib3J0ZWQgfHwgKHJlc3BvbnNlUmF3Py5kZXN0cm95ZWQgJiYgIXJlc3BvbnNlUmF3LndyaXRhYmxlRW5kZWQpKSB7XG4gICAgYWJvcnQoKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgIHJlcXVlc3RSYXc/LnJlbW92ZUxpc3RlbmVyKFwiYWJvcnRlZFwiLCBhYm9ydCk7XG4gICAgICByZXNwb25zZVJhdz8ucmVtb3ZlTGlzdGVuZXIoXCJjbG9zZVwiLCBhYm9ydE9uSW5jb21wbGV0ZVJlc3BvbnNlQ2xvc2UpO1xuICAgIH0sXG4gIH07XG59XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiXSk7XG5jb25zdCBvYXV0aExvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcIm9hdXRoXCJdKTtcblxuLy8gcGVyLXRva2VuIHJlZnJlc2ggZGVkdXAg4oCUIO2ajOyghCDqsrnsuajsnLzroZwg7J247ZWcIOyCrOunnSDsmKTtjJDsnYQg66eJ64qU64ukLlxuY29uc3QgaW5mbGlnaHRBbnRocm9waWNSZWZyZXNoID0gbmV3IE1hcDxudW1iZXIsIFByb21pc2U8c3RyaW5nPj4oKTtcblxuY2xhc3MgUWdyaWRGcmFtZUNsYXNzIGV4dGVuZHMgQmFzZUZyYW1lQ2xhc3Mge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlFncmlkXCIpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHF1ZXJ5KGFyZ3M6IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPFF1ZXJ5T3V0cHV0PiB7XG4gICAgYXNzZXJ0TmF0aXZlUnVuQWRtaXNzaW9uKCk7XG4gICAgcmVqZWN0SW52YWxpZENhbGxlclNjaGVtYXMoYXJncyk7XG4gICAgY29uc3QgcmVzb2x2ZWRBcmdzID0gYXdhaXQgcmVzb2x2ZVRva2VuTmFtZShhcmdzKTtcbiAgICBjb25zdCBkaXNjb25uZWN0ID0gY3JlYXRlSHR0cERpc2Nvbm5lY3RIYW5kbGUoKTtcbiAgICB0cnkge1xuICAgICAgaWYgKHJlc29sdmVkQXJncy5sb2dnZXIgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBRZ3JpZERpc3BhdGNoZXIucXVlcnkocmVzb2x2ZWRBcmdzLCBkaXNjb25uZWN0LnNpZ25hbCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgcmVxdWVzdExvZ0lkLCBzdGVwSW5kZXggfSA9IGF3YWl0IGJlZm9yZVF1ZXJ5KHJlc29sdmVkQXJncyk7XG4gICAgICBsZXQgcmVzdWx0OiBRdWVyeU91dHB1dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IFFncmlkRGlzcGF0Y2hlci5xdWVyeShyZXNvbHZlZEFyZ3MsIGRpc2Nvbm5lY3Quc2lnbmFsKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGRpc2Nvbm5lY3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICBhd2FpdCBmaW5pc2hSdW5BYm9ydGVkKHJlcXVlc3RMb2dJZCwgcmVzb2x2ZWRBcmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBmaW5pc2hSdW5XaXRoRXJyb3IocmVxdWVzdExvZ0lkLCAoZSBhcyBFcnJvcikubWVzc2FnZSwgcmVzb2x2ZWRBcmdzKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBsaWZlY3ljbGUgPSBhd2FpdCBhZnRlclF1ZXJ5KHJlcXVlc3RMb2dJZCwgc3RlcEluZGV4LCByZXNvbHZlZEFyZ3MsIHJlc3VsdCk7XG4gICAgICAgIGlmIChkaXNjb25uZWN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChyZXF1ZXN0TG9nSWQsIHJlc29sdmVkQXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdG9vbC1jYWxsIHJlcXVlc3RMb2dJZOyZgCBwcm92aWRlciB0aHJlYWRDb29yZOuKlCDshJzroZwg64+F66a97KCB7Jy866GcIOycoOyngO2VnOuLpC5cbiAgICAgICAgY29uc3QgdGhyZWFkQ29vcmQgPSByZXN1bHQucnVuQ29udGV4dD8udGhyZWFkQ29vcmQ7XG4gICAgICAgIGNvbnN0IHJ1bkNvbnRleHQgPVxuICAgICAgICAgIGxpZmVjeWNsZS5ydW5Db250ZXh0IHx8IHRocmVhZENvb3JkXG4gICAgICAgICAgICA/IHsgLi4ubGlmZWN5Y2xlLnJ1bkNvbnRleHQsIC4uLih0aHJlYWRDb29yZCA/IHsgdGhyZWFkQ29vcmQgfSA6IHt9KSB9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHsgLi4ucmVzdWx0LCBydW5Db250ZXh0IH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgcXVlcnkgYWZ0ZXJRdWVyeSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIGlmIChkaXNjb25uZWN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChyZXF1ZXN0TG9nSWQsIHJlc29sdmVkQXJncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgZmluaXNoUnVuV2l0aEVycm9yKHJlcXVlc3RMb2dJZCwgKGUgYXMgRXJyb3IpLm1lc3NhZ2UsIHJlc29sdmVkQXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcHJvdmlkZXIg7J2R64u17J2AIOyEseqzte2WiOycvOuvgOuhnCDroZzquYUg7J6l7JWg6rCAIOyDneyEsSDqsrDqs7zrpbwg642u7Ja07JOw7KeAIOyViuuKlOuLpC5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgZGlzY29ubmVjdC5kaXNwb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHByZXBhcmVTdHJlYW0oYXJnczogUXVlcnlJbnB1dCk6IFByb21pc2U8eyBzdHJlYW1JZDogc3RyaW5nIH0+IHtcbiAgICBhc3NlcnROYXRpdmVSdW5BZG1pc3Npb24oKTtcbiAgICByZWplY3RJbWFnZUdlbmVyYXRpb25TdHJlYW0oYXJncyk7XG4gICAgcmVqZWN0SW52YWxpZENhbGxlclNjaGVtYXMoYXJncyk7XG4gICAgY29uc3QgcmVzb2x2ZWRBcmdzID0gYXdhaXQgcmVzb2x2ZVRva2VuTmFtZShhcmdzKTtcbiAgICBjb25zdCBzdHJlYW1JZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgcGVuZGluZ1N0cmVhbXMuc2V0KHN0cmVhbUlkLCByZXNvbHZlZEFyZ3MpO1xuICAgIGNvbnN0IGV4cGlyeSA9IHNldFRpbWVvdXQoKCkgPT4gcGVuZGluZ1N0cmVhbXMuZGVsZXRlKHN0cmVhbUlkKSwgMzBfMDAwKTtcbiAgICBleHBpcnkudW5yZWY/LigpO1xuICAgIHJldHVybiB7IHN0cmVhbUlkIH07XG4gIH1cblxuICBAc3RyZWFtKHsgdHlwZTogXCJzc2VcIiwgZXZlbnRzOiBTdHJlYW1FdmVudHMgfSlcbiAgYXN5bmMgcXVlcnlTdHJlYW0oc3RyZWFtSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFyZ3MgPSBwZW5kaW5nU3RyZWFtcy5nZXQoc3RyZWFtSWQpO1xuICAgIHBlbmRpbmdTdHJlYW1zLmRlbGV0ZShzdHJlYW1JZCk7XG4gICAgaWYgKCFhcmdzKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIG9yIGV4cGlyZWQgc3RyZWFtSWRcIik7XG4gICAgYXNzZXJ0TmF0aXZlUnVuQWRtaXNzaW9uKCk7XG4gICAgcmVqZWN0SW1hZ2VHZW5lcmF0aW9uU3RyZWFtKGFyZ3MpO1xuXG4gICAgY29uc3QgY3R4ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICBjb25zdCBzc2UgPSBjdHguY3JlYXRlU1NFKFN0cmVhbUV2ZW50cyk7XG4gICAgbGV0IHN0cmVhbVJlc3VsdDogUXVlcnlPdXRwdXQgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHN0cmVhbUVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgY2xpZW50Q2xvc2VkID0gZmFsc2U7XG4gICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgc3NlLm9uQ2xvc2UoKCkgPT4ge1xuICAgICAgY2xpZW50Q2xvc2VkID0gdHJ1ZTtcbiAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgIH0pO1xuXG4gICAgbGV0IHJ1bkluZm86IHsgcmVxdWVzdExvZ0lkOiBudW1iZXI7IHN0ZXBJbmRleDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGFyZ3MubG9nZ2VyICE9PSBmYWxzZSkge1xuICAgICAgLy8gcHJvdmlkZXIg7Iuk7ZaJIOyghCBydW5uaW5nIHJvdyDsg53shLHsl5Ag7Iuk7Yyo7ZWY66m0IGxvZ2dlZCDsmpTssq3snLzroZwg7KeE7ZaJ7ZWY7KeAIOyViuuKlOuLpC5cbiAgICAgIHJ1bkluZm8gPSBhd2FpdCBiZWZvcmVRdWVyeShhcmdzKTtcbiAgICB9XG5cbiAgICAvLyBiZWZvcmVRdWVyeSBEQiDsnpHsl4Ug7KSRIGNsb3Nl66W8IOuGk+y5mOyngCDslYrqs6AgcHJvdmlkZXIg7Iuk7ZaJIOyghOyXkCDrp4jqsJDtlZzri6QuXG4gICAgaWYgKGNsaWVudENsb3NlZCB8fCBzc2UuY2xvc2VkKSB7XG4gICAgICBpZiAocnVuSW5mbykgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChydW5JbmZvLnJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgICBhd2FpdCBzc2UuZW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5xdWVyeVN0cmVhbShcbiAgICAgICAgYXJncyxcbiAgICAgICAge1xuICAgICAgICAgIG9uRGVsdGE6ICh0ZXh0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNsaWVudENsb3NlZCAmJiAhc3NlLmNsb3NlZCkgc3NlLnB1Ymxpc2goXCJkZWx0YVwiLCB7IHRleHQgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkNvbXBsZXRlOiAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBzdHJlYW1SZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgICBzdHJlYW1FcnJvciA9IGVycjtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzdHJlYW1FcnJvciA9IGUgYXMgRXJyb3I7XG4gICAgfVxuXG4gICAgLy8gcHJvdmlkZXIg6rKw6rO86rCAIOyXhuuKlCBjbG9zZeuKlCDsponsi5wgYWJvcnRlZOuhnCDrp4jqsJDtlZzri6QuXG4gICAgaWYgKGNsaWVudENsb3NlZCAmJiAhc3RyZWFtUmVzdWx0KSB7XG4gICAgICBpZiAocnVuSW5mbykgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChydW5JbmZvLnJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgICBhd2FpdCBzc2UuZW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZGlzcGF0Y2hlciDsmYTro4wg7ZuEIGxpZmVjeWNsZSDsspjrpqwgKGF3YWl0IOyViOyghClcbiAgICBpZiAoc3RyZWFtUmVzdWx0KSB7XG4gICAgICAvLyBkaXNwYXRjaGVyIOqwgCDsi6TsnYAgdGhyZWFkIOyerOyCrOyaqSDsooztkZzripQgbG9nZ2VyIOyEpOygleqzvCDrrLTqtIDtlZjqsowg7ZqM7Iah7ZWc64ukLlxuICAgICAgY29uc3QgdGhyZWFkQ29vcmQgPSBzdHJlYW1SZXN1bHQucnVuQ29udGV4dD8udGhyZWFkQ29vcmQ7XG4gICAgICBsZXQgcnVuQ29udGV4dDogUWdyaWRSdW5Db250ZXh0IHwgdW5kZWZpbmVkID1cbiAgICAgICAgdGhyZWFkQ29vcmQgIT09IHVuZGVmaW5lZCA/IHsgdGhyZWFkQ29vcmQgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChydW5JbmZvKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gY2xvc2Ug7ZuEIOuPhOywqe2VnCDqsrDqs7zrj4Qgc3RlcC91c2FnZeuKlCDrgqjquLDrkJgsIOyVhOuemOyXkOyEnCDstZzsooUgc3RhdHVz66W8IGFib3J0ZWTroZwg642u7Ja07JO064ukLlxuICAgICAgICAgIGNvbnN0IGxpZmVjeWNsZSA9IGF3YWl0IGFmdGVyUXVlcnkoXG4gICAgICAgICAgICBydW5JbmZvLnJlcXVlc3RMb2dJZCxcbiAgICAgICAgICAgIHJ1bkluZm8uc3RlcEluZGV4LFxuICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgIHN0cmVhbVJlc3VsdCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJ1bkNvbnRleHQgPVxuICAgICAgICAgICAgbGlmZWN5Y2xlLnJ1bkNvbnRleHQgfHwgdGhyZWFkQ29vcmRcbiAgICAgICAgICAgICAgPyB7IC4uLmxpZmVjeWNsZS5ydW5Db250ZXh0LCAuLi4odGhyZWFkQ29vcmQgPyB7IHRocmVhZENvb3JkIH0gOiB7fSkgfVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgIC8vIGFmdGVyUXVlcnnqsIAg7KeE7ZaJ65CY64qUIOyCrOydtCBjbGllbnTqsIAg64ur7Z6MIOqyveyasCDsmYTro4wg7IOB7YOc66W8IGFib3J0ZWTroZwg65CY64+M66aw64ukLlxuICAgICAgICAgIGlmIChjbGllbnRDbG9zZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocnVuSW5mby5yZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgICAgICAgICAgYXdhaXQgc3NlLmVuZCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihgc3RyZWFtIGFmdGVyUXVlcnkgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bldpdGhFcnJvcihydW5JbmZvLnJlcXVlc3RMb2dJZCwgKGUgYXMgRXJyb3IpLm1lc3NhZ2UsIGFyZ3MpO1xuXG4gICAgICAgICAgaWYgKGNsaWVudENsb3NlZCkge1xuICAgICAgICAgICAgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChydW5JbmZvLnJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgICAgICAgICBhd2FpdCBzc2UuZW5kKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWNsaWVudENsb3NlZCAmJiAhc3NlLmNsb3NlZCkgc3NlLnB1Ymxpc2goXCJkb25lXCIsIHsgLi4uc3RyZWFtUmVzdWx0LCBydW5Db250ZXh0IH0pO1xuICAgIH0gZWxzZSBpZiAoc3RyZWFtRXJyb3IpIHtcbiAgICAgIGlmIChydW5JbmZvKSBhd2FpdCBmaW5pc2hSdW5XaXRoRXJyb3IocnVuSW5mby5yZXF1ZXN0TG9nSWQsIHN0cmVhbUVycm9yLm1lc3NhZ2UsIGFyZ3MpO1xuICAgICAgaWYgKCFjbGllbnRDbG9zZWQgJiYgIXNzZS5jbG9zZWQpIHNzZS5wdWJsaXNoKFwiZXJyb3JcIiwgeyBtZXNzYWdlOiBzdHJlYW1FcnJvci5tZXNzYWdlIH0pO1xuICAgIH0gZWxzZSBpZiAoKGNsaWVudENsb3NlZCB8fCBzc2UuY2xvc2VkKSAmJiBydW5JbmZvKSB7XG4gICAgICBhd2FpdCBmaW5pc2hSdW5BYm9ydGVkKHJ1bkluZm8ucmVxdWVzdExvZ0lkLCBhcmdzKTtcbiAgICB9XG5cbiAgICBhd2FpdCBzc2UuZW5kKCk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgY3JlYXRlUnVuKGlucHV0OiBDcmVhdGVSdW5JbnB1dCk6IFByb21pc2U8eyByZXF1ZXN0TG9nSWQ6IG51bWJlciB9PiB7XG4gICAgY29uc3QgcmVxdWVzdExvZ0lkID0gYXdhaXQgUmVxdWVzdExvZ01vZGVsLmNyZWF0ZVJ1bih7XG4gICAgICB1c2VyX3Byb21wdDogaW5wdXQudXNlclByb21wdCxcbiAgICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiBpbnB1dC5tb2RlbE5hbWUsXG4gICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgIHByb2plY3RfbmFtZTogaW5wdXQucHJvamVjdE5hbWUsXG4gICAgICBzeXN0ZW1fcHJvbXB0OiBpbnB1dC5zeXN0ZW1Qcm9tcHQsXG4gICAgICBoaXN0b3J5OiBpbnB1dC5oaXN0b3J5ID8gSlNPTi5wYXJzZShpbnB1dC5oaXN0b3J5KSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICByZXR1cm4geyByZXF1ZXN0TG9nSWQgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBhcHBlbmRTdGVwKGlucHV0OiBBcHBlbmRTdGVwSW5wdXQpOiBQcm9taXNlPHsgc3RlcElkOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHN0ZXBJZCA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5hcHBlbmRTdGVwKGlucHV0LnJlcXVlc3RMb2dJZCwge1xuICAgICAgc3RlcF9pbmRleDogaW5wdXQuc3RlcEluZGV4LFxuICAgICAgdHlwZTogaW5wdXQudHlwZSxcbiAgICAgIG1vZGVsX25hbWU6IGlucHV0Lm1vZGVsTmFtZSxcbiAgICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiBpbnB1dC5yZXF1ZXN0ZWRNb2RlbE5hbWUsXG4gICAgICBmYWxsYmFja19jb3VudDogaW5wdXQuZmFsbGJhY2tDb3VudCxcbiAgICAgIGlucHV0X3Rva2VuczogaW5wdXQuaW5wdXRUb2tlbnMsXG4gICAgICBvdXRwdXRfdG9rZW5zOiBpbnB1dC5vdXRwdXRUb2tlbnMsXG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogaW5wdXQuY2FjaGVSZWFkVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBpbnB1dC5jYWNoZUNyZWF0aW9uVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBpbnB1dC5jYWNoZUNyZWF0aW9uNW1Ub2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IGlucHV0LmNhY2hlQ3JlYXRpb24xaFRva2VucyxcbiAgICAgIGNvc3RfdXNkOiBpbnB1dC5jb3N0VXNkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBNYXRoLnJvdW5kKGlucHV0LmNvc3RVc2QgKiBNSUNST19VU0QpLFxuICAgICAgY29zdF9zb3VyY2U6IGlucHV0LmNvc3RTb3VyY2UsXG4gICAgICBkdXJhdGlvbl9tczogaW5wdXQuZHVyYXRpb25NcyxcbiAgICAgIHR0ZnRfbXM6IGlucHV0LnR0ZnRNcyA/PyBudWxsLFxuICAgICAgZmluaXNoX3JlYXNvbjogaW5wdXQuZmluaXNoUmVhc29uLFxuICAgICAgcmVhc29uaW5nX3RleHQ6IGlucHV0LnJlYXNvbmluZ1RleHQsXG4gICAgICByZWFzb25pbmdfdG9rZW5zOiBpbnB1dC5yZWFzb25pbmdUb2tlbnMsXG4gICAgICB0b29sX2NhbGxfaW5kZXg6IGlucHV0LnRvb2xDYWxsSW5kZXgsXG4gICAgICB0b29sX2NhbGxfaWQ6IGlucHV0LnRvb2xDYWxsSWQsXG4gICAgICB0b29sX25hbWU6IGlucHV0LnRvb2xOYW1lLFxuICAgICAgdG9vbF9hcmdzOiBpbnB1dC50b29sQXJncyxcbiAgICAgIHRvb2xfcmVzdWx0OiBpbnB1dC50b29sUmVzdWx0LFxuICAgICAgdG9vbF9kdXJhdGlvbl9tczogaW5wdXQudG9vbER1cmF0aW9uTXMsXG4gICAgICBlcnJvcjogaW5wdXQuZXJyb3IsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgc3RlcElkIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgZmluaXNoUnVuKGlucHV0OiBGaW5pc2hSdW5JbnB1dCk6IFByb21pc2U8eyBvazogYm9vbGVhbiB9PiB7XG4gICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmZpbmlzaFJ1bihpbnB1dC5yZXF1ZXN0TG9nSWQsIHtcbiAgICAgIHN0YXR1czogaW5wdXQuc3RhdHVzLFxuICAgICAgcmVzcG9uc2U6IGlucHV0LnJlc3BvbnNlLFxuICAgICAgdG9rZW5fbmFtZTogaW5wdXQudG9rZW5OYW1lLFxuICAgICAgbW9kZWxfbmFtZTogaW5wdXQubW9kZWxOYW1lLFxuICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IGlucHV0LnJlcXVlc3RlZE1vZGVsTmFtZSxcbiAgICAgIGZhbGxiYWNrX2NvdW50OiBpbnB1dC5mYWxsYmFja0NvdW50LFxuICAgICAgaW5wdXRfdG9rZW5zOiBpbnB1dC50b3RhbElucHV0VG9rZW5zLFxuICAgICAgb3V0cHV0X3Rva2VuczogaW5wdXQudG90YWxPdXRwdXRUb2tlbnMsXG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogaW5wdXQudG90YWxDYWNoZVJlYWRUb2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IGlucHV0LnRvdGFsQ2FjaGVDcmVhdGlvblRva2VucyxcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogaW5wdXQudG90YWxDYWNoZUNyZWF0aW9uNW1Ub2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IGlucHV0LnRvdGFsQ2FjaGVDcmVhdGlvbjFoVG9rZW5zLFxuICAgICAgY29zdF91c2Q6IGlucHV0LmNvc3RVc2QgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IE1hdGgucm91bmQoaW5wdXQuY29zdFVzZCAqIE1JQ1JPX1VTRCksXG4gICAgICBjb3N0X3NvdXJjZTogaW5wdXQuY29zdFNvdXJjZSxcbiAgICAgIGR1cmF0aW9uX21zOiBpbnB1dC50b3RhbER1cmF0aW9uTXMsXG4gICAgICBoaXN0b3J5OiBpbnB1dC5oaXN0b3J5ID8gSlNPTi5wYXJzZShpbnB1dC5oaXN0b3J5KSA6IHVuZGVmaW5lZCxcbiAgICAgIGVycm9yX21lc3NhZ2U6IGlucHV0LmVycm9yTWVzc2FnZSxcbiAgICB9KTtcbiAgICByZXR1cm4geyBvazogdHJ1ZSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgc3RhdHMoKTogUHJvbWlzZTxUb2tlblN0YXRzW10+IHtcbiAgICByZXR1cm4gUWdyaWREaXNwYXRjaGVyLmdldFN0YXRzKCk7XG4gIH1cblxuICAvLyDtmZTrqbTsnZgg66qp66GdIO2VhO2EsOulvCDqt7jrjIDroZwg67Cb7JWEIOqwmeydgCDsobDqsbTsnZgg7ZWp6rOE66W8IOuPjOugpOykgOuLpCDigJQg66qp66Gd6rO8IOu5hOyaqeydtFxuICAvLyDshJzroZwg64uk66W4IOuqqOyImOulvCDrs7TrqbQg7IKs7Jqp7J6Q7JeQ6rKM64qUIOyIq+yekOqwgCDslrTquIvrgpwg6rKD7Jy866GcIOydve2ejOuLpC5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgdG90YWxDb3N0KHBhcmFtcz86IFJlcXVlc3RMb2dMaXN0UGFyYW1zKTogUHJvbWlzZTx7IHVzZDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4geyB1c2Q6IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC50b3RhbENvc3QocGFyYW1zKSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgcHJvamVjdE5hbWVzKCk6IFByb21pc2U8eyBuYW1lczogc3RyaW5nW10gfT4ge1xuICAgIHJldHVybiB7IG5hbWVzOiBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZGlzdGluY3RQcm9qZWN0TmFtZXMoKSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgbW9kZWxOYW1lcygpOiBQcm9taXNlPHsgbmFtZXM6IHN0cmluZ1tdIH0+IHtcbiAgICByZXR1cm4geyBuYW1lczogYXdhaXQgUmVxdWVzdExvZ01vZGVsLmRpc3RpbmN0TW9kZWxOYW1lcygpIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgYWRkVG9rZW4oXG4gICAgcHJvdmlkZXI6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogVG9rZW5DcmVkZW50aWFscyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBhZGRlZDogYm9vbGVhbiB9PiB7XG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5zYXZlKFtcbiAgICAgIHtcbiAgICAgICAgcHJvdmlkZXIsXG4gICAgICAgIGNyZWRlbnRpYWxzLFxuICAgICAgICBuYW1lLFxuICAgICAgfSxcbiAgICBdKTtcbiAgICByZXR1cm4geyBhZGRlZDogdHJ1ZSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiXSB9KVxuICBhc3luYyB1cGRhdGVUb2tlbihcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU/OiBzdHJpbmcsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodD86IG51bWJlcixcbiAgICBrZWVwYWxpdmVFbmFibGVkPzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTx7IHVwZGF0ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGlmIChcbiAgICAgIHF1b3RhVGhyZXNob2xkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHF1b3RhVGhyZXNob2xkICE9PSBudWxsICYmXG4gICAgICAoIU51bWJlci5pc0ludGVnZXIocXVvdGFUaHJlc2hvbGQpIHx8IHF1b3RhVGhyZXNob2xkIDwgMSB8fCBxdW90YVRocmVzaG9sZCA+IDEwMClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICBcInF1b3RhVGhyZXNob2xkIG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwMCwgb3IgbnVsbFwiIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh3ZWlnaHQgIT09IHVuZGVmaW5lZCAmJiAoIU51bWJlci5pc0ludGVnZXIod2VpZ2h0KSB8fCB3ZWlnaHQgPCAxIHx8IHdlaWdodCA+IDEwMCkpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICBcIndlaWdodCBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAxMDBcIiBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGNoOiBUb2tlblVwZGF0ZUZpZWxkcyA9IHt9O1xuICAgIGlmIChuYW1lICE9PSB1bmRlZmluZWQpIHBhdGNoLm5hbWUgPSBuYW1lO1xuICAgIGlmIChxdW90YVRocmVzaG9sZCAhPT0gdW5kZWZpbmVkKSBwYXRjaC5xdW90YV90aHJlc2hvbGQgPSBxdW90YVRocmVzaG9sZDtcbiAgICBpZiAod2VpZ2h0ICE9PSB1bmRlZmluZWQpIHBhdGNoLndlaWdodCA9IHdlaWdodDtcbiAgICBpZiAoa2VlcGFsaXZlRW5hYmxlZCAhPT0gdW5kZWZpbmVkKSBwYXRjaC5rZWVwYWxpdmVfZW5hYmxlZCA9IGtlZXBhbGl2ZUVuYWJsZWQ7XG4gICAgaWYgKE9iamVjdC5rZXlzKHBhdGNoKS5sZW5ndGggPT09IDApIHJldHVybiB7IHVwZGF0ZWQ6IGZhbHNlIH07XG5cbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgVG9rZW5Nb2RlbC51cGRhdGVGaWVsZHMoaWQsIHBhdGNoKTtcbiAgICByZXR1cm4geyB1cGRhdGVkOiB1cGRhdGVkID4gMCB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHJlbW92ZVRva2VuKGlkOiBudW1iZXIpOiBQcm9taXNlPHsgcmVtb3ZlZDogYm9vbGVhbiB9PiB7XG4gICAgY29uc3QgZW50cnkgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRPbmUoXCJBXCIsIHsgaWQgfSk7XG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuIHsgcmVtb3ZlZDogZmFsc2UgfTtcbiAgICBhd2FpdCBUb2tlbk1vZGVsLmRlbChbZW50cnkuaWRdKTtcbiAgICByZXR1cm4geyByZW1vdmVkOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICog7Yag7YGwIO2ZnOyEse2ZlC/ruYTtmZzshLHtmZQg7Yag6riAIERC7J2YIGFjdGl2ZSDtlYTrk5wg7JeF642w7J207Yq4XG4gICAqL1xuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgdG9nZ2xlVG9rZW4oaWQ6IG51bWJlcik6IFByb21pc2U8eyBhY3RpdmU6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kT25lKFwiQVwiLCB7IGlkIH0pO1xuICAgIGlmICghZW50cnkpIHJldHVybiB7IGFjdGl2ZTogZmFsc2UgfTtcblxuICAgIGNvbnN0IG5ld0FjdGl2ZSA9ICFlbnRyeS5hY3RpdmU7XG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5zYXZlKFtcbiAgICAgIHtcbiAgICAgICAgaWQsXG4gICAgICAgIHByb3ZpZGVyOiBlbnRyeS5wcm92aWRlcixcbiAgICAgICAgY3JlZGVudGlhbHM6IGVudHJ5LmNyZWRlbnRpYWxzLFxuICAgICAgICBhY3RpdmU6IG5ld0FjdGl2ZSxcbiAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgIH0sXG4gICAgXSk7XG4gICAgcmV0dXJuIHsgYWN0aXZlOiBuZXdBY3RpdmUgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBvYXV0aFN0YXJ0KG5hbWU6IHN0cmluZyk6IFByb21pc2U8T0F1dGhTdGFydFJlc3VsdD4ge1xuICAgIGNvbnN0IHsgY29kZVZlcmlmaWVyLCBjb2RlQ2hhbGxlbmdlLCBzdGF0ZSB9ID0gZ2VuZXJhdGVQS0NFKCk7XG5cbiAgICBjb25zdCB7IHJlZGlyZWN0VXJpLCBtb2RlIH0gPSByZXNvbHZlT0F1dGhSZWRpcmVjdCgpO1xuICAgIGNvbnN0IGF1dGhVcmwgPSBidWlsZEF1dGhVcmwoY29kZUNoYWxsZW5nZSwgc3RhdGUsIHJlZGlyZWN0VXJpKTtcblxuICAgIGF3YWl0IHNldE9BdXRoU3RhdGUoc3RhdGUsIHsgY29kZVZlcmlmaWVyLCBuYW1lLCByZWRpcmVjdFVyaSwgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIgfSk7XG5cbiAgICByZXR1cm4geyBhdXRoVXJsLCBtb2RlIH07XG4gIH1cblxuICAvLyDsvZTrk5wg67aZ7Jes64Sj6riwIO2UjOuhnOyasCjsm5Dqsqkg7KCR7IaNKTog7L2Y7IaUIOy9nOuwseydtCDtkZzsi5ztlZwgYGNvZGUjc3RhdGVgIOulvCDrsJvslYQg6rWQ7ZmY7ZWc64ukLlxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgb2F1dGhDb21wbGV0ZShwYXN0ZWRDb2RlOiBzdHJpbmcpOiBQcm9taXNlPHsgYWRkZWQ6IGJvb2xlYW47IG5hbWU6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgdHJpbW1lZCA9IHBhc3RlZENvZGUudHJpbSgpO1xuICAgIGNvbnN0IHNlcGFyYXRvckF0ID0gdHJpbW1lZC5pbmRleE9mKFwiI1wiKTtcbiAgICBjb25zdCBjb2RlID0gc2VwYXJhdG9yQXQgPiAwID8gdHJpbW1lZC5zbGljZSgwLCBzZXBhcmF0b3JBdCkgOiBcIlwiO1xuICAgIGNvbnN0IHN0YXRlID0gc2VwYXJhdG9yQXQgPiAwID8gdHJpbW1lZC5zbGljZShzZXBhcmF0b3JBdCArIDEpIDogXCJcIjtcbiAgICBpZiAoIWNvZGUgfHwgIXN0YXRlKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgXCJleHBlY3RlZCB0aGUgY29kZSBzaG93biBhZnRlciBsb2dpbiwgaW4gY29kZSNzdGF0ZSBmb3JtXCIgYXMgTG9jYWxpemVkU3RyaW5nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwZW5kaW5nID0gYXdhaXQgZ2V0T0F1dGhTdGF0ZShzdGF0ZSk7XG4gICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgXCJsb2dpbiBzZXNzaW9uIG5vdCBmb3VuZCBvciBleHBpcmVkIOKAlCBzdGFydCB0aGUgbG9naW4gYWdhaW5cIiBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICAgICApO1xuICAgIH1cbiAgICBhd2FpdCBkZWxldGVPQXV0aFN0YXRlKHN0YXRlKTtcblxuICAgIGlmIChwZW5kaW5nLnByb3ZpZGVyICE9PSBcImFudGhyb3BpY1wiKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcImxvZ2luIHNlc3Npb24gaXMgbm90IGZvciBBbnRocm9waWNcIiBhcyBMb2NhbGl6ZWRTdHJpbmcpO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuY29tcGxldGVBbnRocm9waWNMb2dpbihjb2RlLCBzdGF0ZSwgcGVuZGluZyk7XG4gICAgcmV0dXJuIHsgYWRkZWQ6IHRydWUsIG5hbWU6IHBlbmRpbmcubmFtZSB9O1xuICB9XG5cbiAgLy8g6rWQ7ZmYICsg6rOE7KCVIOykkeuztSDsoJzqsbAgKyDsoIDsnqUg4oCUIHJlZGlyZWN0IOy9nOuwseqzvCDsvZTrk5wg67aZ7Jes64Sj6riwIO2UjOuhnOyasOqwgCDqs7XsnKDtlZzri6QuXG4gIHByaXZhdGUgYXN5bmMgY29tcGxldGVBbnRocm9waWNMb2dpbihcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgc3RhdGU6IHN0cmluZyxcbiAgICBwZW5kaW5nOiBQZW5kaW5nT0F1dGgsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IGV4Y2hhbmdlQ29kZUZvclRva2VucyhcbiAgICAgIGNvZGUsXG4gICAgICBwZW5kaW5nLmNvZGVWZXJpZmllcixcbiAgICAgIHN0YXRlLFxuICAgICAgcGVuZGluZy5yZWRpcmVjdFVyaSxcbiAgICApO1xuXG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5yZXBsYWNlQnlBY2NvdW50KFwiYW50aHJvcGljXCIsIHRva2Vucy5hY2NvdW50VXVpZCwge1xuICAgICAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIsXG4gICAgICBjcmVkZW50aWFsczoge1xuICAgICAgICBhY2Nlc3NUb2tlbjogdG9rZW5zLmFjY2Vzc1Rva2VuLFxuICAgICAgICByZWZyZXNoVG9rZW46IHRva2Vucy5yZWZyZXNoVG9rZW4sXG4gICAgICAgIGV4cGlyZXNBdDogdG9rZW5zLmV4cGlyZXNBdCA/PyAwLFxuICAgICAgICBhY2NvdW50VXVpZDogdG9rZW5zLmFjY291bnRVdWlkID8/IFwiXCIsXG4gICAgICB9LFxuICAgICAgbmFtZTogcGVuZGluZy5uYW1lLFxuICAgIH0pO1xuXG4gICAgbm90aWZ5VG9rZW5BZGRlZChwZW5kaW5nLm5hbWUsIFwiYW50aHJvcGljXCIpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlT0F1dGhDYWxsYmFjayhjb2RlOiBzdHJpbmcsIHN0YXRlOiBzdHJpbmcsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwZW5kaW5nID0gYXdhaXQgZ2V0T0F1dGhTdGF0ZShzdGF0ZSk7XG4gICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICBsb2dnZXIud2FybihcIm9hdXRoIGNhbGxiYWNrOiBpbnZhbGlkX3N0YXRlXCIpO1xuICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KFwiLz9vYXV0aD1lcnJvciZyZWFzb249aW52YWxpZF9zdGF0ZVwiKTtcbiAgICB9XG4gICAgYXdhaXQgZGVsZXRlT0F1dGhTdGF0ZShzdGF0ZSk7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHBlbmRpbmcucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpIHtcbiAgICAgICAgY29uc3QgY3JlZHMgPSBhd2FpdCBleGNoYW5nZU9wZW5BSUNvZGUoY29kZSwgcGVuZGluZy5jb2RlVmVyaWZpZXIsIHBlbmRpbmcucmVkaXJlY3RVcmkpO1xuICAgICAgICBhd2FpdCBUb2tlbk1vZGVsLnJlcGxhY2VCeUFjY291bnQoXCJvcGVuYWlcIiwgY3JlZHMuYWNjb3VudElkLCB7XG4gICAgICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICAgICAgY3JlZGVudGlhbHM6IGNyZWRzLFxuICAgICAgICAgIG5hbWU6IHBlbmRpbmcubmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBPcGVuQUkgdG9rZW4gc2F2ZWQgZm9yICR7cGVuZGluZy5uYW1lfWApO1xuICAgICAgICBub3RpZnlUb2tlbkFkZGVkKHBlbmRpbmcubmFtZSwgXCJvcGVuYWlcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLmNvbXBsZXRlQW50aHJvcGljTG9naW4oY29kZSwgc3RhdGUsIHBlbmRpbmcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KGAvP29hdXRoPXN1Y2Nlc3MmbmFtZT0ke2VuY29kZVVSSUNvbXBvbmVudChwZW5kaW5nLm5hbWUpfWApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgbG9nZ2VyLndhcm4oXCJvYXV0aCBjYWxsYmFjayBmYWlsZWRcIiwge1xuICAgICAgICBwcm92aWRlcjogcGVuZGluZy5wcm92aWRlcixcbiAgICAgICAgcmVhc29uOiBcImV4Y2hhbmdlX2ZhaWxlZFwiLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoXCIvP29hdXRoPWVycm9yJnJlYXNvbj1leGNoYW5nZV9mYWlsZWRcIik7XG4gICAgfVxuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIG9hdXRoU3RhcnRPcGVuQUkobmFtZTogc3RyaW5nKTogUHJvbWlzZTxPQXV0aFN0YXJ0UmVzdWx0PiB7XG4gICAgY29uc3QgeyBjb2RlVmVyaWZpZXIsIGNvZGVDaGFsbGVuZ2UsIHN0YXRlIH0gPSBnZW5lcmF0ZU9wZW5BSVBLQ0UoKTtcbiAgICBjb25zdCByZWRpcmVjdFVyaSA9IGAke3RydXN0ZWRMb29wYmFja0Jhc2UoKX0vYXV0aC9jYWxsYmFja2A7XG4gICAgY29uc3QgYXV0aFVybCA9IGJ1aWxkT3BlbkFJQXV0aFVybChjb2RlQ2hhbGxlbmdlLCBzdGF0ZSwgcmVkaXJlY3RVcmkpO1xuICAgIGF3YWl0IHNldE9BdXRoU3RhdGUoc3RhdGUsIHsgY29kZVZlcmlmaWVyLCBuYW1lLCByZWRpcmVjdFVyaSwgcHJvdmlkZXI6IFwib3BlbmFpXCIgfSk7XG4gICAgcmV0dXJuIHsgYXV0aFVybCwgbW9kZTogXCJyZWRpcmVjdFwiIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyB1c2FnZSh0b2tlbklkPzogbnVtYmVyKTogUHJvbWlzZTxVc2FnZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyByb3dzOiBhbGxUb2tlbnMgfSA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE1hbnkoXCJBXCIpO1xuICAgIGNvbnN0IGVudHJ5ID0gdG9rZW5JZFxuICAgICAgPyBhbGxUb2tlbnMuZmluZCgoZSkgPT4gZS5pZCA9PT0gdG9rZW5JZClcbiAgICAgIDogYWxsVG9rZW5zLmZpbmRMYXN0KChlKSA9PiBlLmFjdGl2ZSAmJiBlLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKTtcblxuICAgIGlmICghZW50cnkpIHJldHVybiB7IGVycm9yOiBcIk5PVF9GT1VORFwiIH07XG5cbiAgICBpZiAoZW50cnkucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpIHtcbiAgICAgIGlmICghZW50cnkuYWN0aXZlKSB7XG4gICAgICAgIHJldHVybiB7IHByb3ZpZGVyOiBcIm9wZW5haVwiLCBmaXZlSG91cjogbnVsbCwgc2V2ZW5EYXk6IG51bGwgfTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmF3ID0gYXdhaXQgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXI/LmdldFJhdGVMaW1pdHNCeVRva2VuSWQoZW50cnkuaWQpO1xuICAgICAgICBjb25zdCBybCA9IHJhdz8uZGF0YS5yYXRlTGltaXRzO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHByb3ZpZGVyOiBcIm9wZW5haVwiLFxuICAgICAgICAgIGZpdmVIb3VyOiBybD8ucHJpbWFyeVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgdXRpbGl6YXRpb246IHJsLnByaW1hcnkudXNlZFBlcmNlbnQsXG4gICAgICAgICAgICAgICAgcmVzZXRzQXQ6IHVuaXhTZWNvbmRzVG9Jc28ocmwucHJpbWFyeS5yZXNldHNBdCksXG4gICAgICAgICAgICAgICAgd2luZG93RHVyYXRpb25NaW5zOiBybC5wcmltYXJ5LndpbmRvd0R1cmF0aW9uTWlucyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIHNldmVuRGF5OiBybD8uc2Vjb25kYXJ5XG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICB1dGlsaXphdGlvbjogcmwuc2Vjb25kYXJ5LnVzZWRQZXJjZW50LFxuICAgICAgICAgICAgICAgIHJlc2V0c0F0OiB1bml4U2Vjb25kc1RvSXNvKHJsLnNlY29uZGFyeS5yZXNldHNBdCksXG4gICAgICAgICAgICAgICAgd2luZG93RHVyYXRpb25NaW5zOiBybC5zZWNvbmRhcnkud2luZG93RHVyYXRpb25NaW5zLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBgT3BlbkFJIHVzYWdlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5LnByb3ZpZGVyICE9PSBcImFudGhyb3BpY1wiKSB7XG4gICAgICByZXR1cm4geyBlcnJvcjogYHVzYWdlIEFQSSBub3Qgc3VwcG9ydGVkIGZvciBwcm92aWRlcjogJHtlbnRyeS5wcm92aWRlcn1gIH07XG4gICAgfVxuXG4gICAgbGV0IGFjY2Vzc1Rva2VuID0gZ2V0QWNjZXNzVG9rZW4oZW50cnkuY3JlZGVudGlhbHMpO1xuICAgIGNvbnN0IGlzRXhwaXJlZCA9IGdldEV4cGlyZXNBdChlbnRyeS5jcmVkZW50aWFscykgPCBEYXRlLm5vdygpO1xuXG4gICAgaWYgKGlzRXhwaXJlZCAmJiBnZXRSZWZyZXNoVG9rZW4oZW50cnkuY3JlZGVudGlhbHMpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhY2Nlc3NUb2tlbiA9IGF3YWl0IHRoaXMucmVmcmVzaFRva2VuKGVudHJ5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgb2F1dGhMb2dnZXIud2FybihgcmVmcmVzaCBmYWlsZWQgZm9yICR7ZW50cnkubmFtZX06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBcInJlLWxvZ2luIHJlcXVpcmVkXCIgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByYXcgPSBhd2FpdCBmZXRjaFVzYWdlKGFjY2Vzc1Rva2VuKTtcbiAgICBpZiAocmF3LmVycm9yICYmIGdldFJlZnJlc2hUb2tlbihlbnRyeS5jcmVkZW50aWFscykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFjY2Vzc1Rva2VuID0gYXdhaXQgdGhpcy5yZWZyZXNoVG9rZW4oZW50cnkpO1xuICAgICAgICBjb25zdCByZXRyaWVkID0gYXdhaXQgZmV0Y2hVc2FnZShhY2Nlc3NUb2tlbik7XG4gICAgICAgIGlmIChyZXRyaWVkLmVycm9yKSByZXR1cm4geyBlcnJvcjogcmV0cmllZC5lcnJvciB9O1xuICAgICAgICByZXR1cm4gY29udmVydEFudGhyb3BpY1VzYWdlKHJldHJpZWQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBvYXV0aExvZ2dlci53YXJuKGByZWZyZXNoIGZhaWxlZCBmb3IgJHtlbnRyeS5uYW1lfTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IFwicmUtbG9naW4gcmVxdWlyZWRcIiB9O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmF3LmVycm9yKSByZXR1cm4geyBlcnJvcjogcmF3LmVycm9yIH07XG4gICAgcmV0dXJuIGNvbnZlcnRBbnRocm9waWNVc2FnZShyYXcpO1xuICB9XG5cbiAgLy8g64+Z7IucIHJlZnJlc2gg6rCAIO2ajOyghOydhCDqsrnsuZjrqbQg65Kk64qm7J2AIO2YuOy2nOydtCDsnbTrr7gg7Y+Q6riw65CcIHJlZnJlc2ggdG9rZW4g7J2EIOyTsOqyjCDrkJjslrRcbiAgLy8g66mA7Kmh7ZWcIO2GoO2BsOydtCDsgqzrp53snLzroZwg7Jik7YyQ65Cc64ukLiBvcGVuYWktcmVmcmVzaC50cyDsmYAg6rCZ7J2AIHBlci10b2tlbiBkZWR1cCDsnYQg65GU64ukLlxuICBhc3luYyByZWZyZXNoVG9rZW4odG9rZW46IFRva2VuU3Vic2V0QSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgaW5mbGlnaHQgPSBpbmZsaWdodEFudGhyb3BpY1JlZnJlc2guZ2V0KHRva2VuLmlkKTtcbiAgICBpZiAoaW5mbGlnaHQpIHJldHVybiBpbmZsaWdodDtcblxuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLmRvUmVmcmVzaFRva2VuKHRva2VuKTtcbiAgICBpbmZsaWdodEFudGhyb3BpY1JlZnJlc2guc2V0KHRva2VuLmlkLCBwcm9taXNlKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHByb21pc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGluZmxpZ2h0QW50aHJvcGljUmVmcmVzaC5kZWxldGUodG9rZW4uaWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZG9SZWZyZXNoVG9rZW4odG9rZW46IFRva2VuU3Vic2V0QSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgY3JlZHMgPSB0b2tlbi5jcmVkZW50aWFscztcbiAgICBjb25zdCBydCA9IGdldFJlZnJlc2hUb2tlbihjcmVkcyk7XG4gICAgaWYgKCFydCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVmcmVzaCB0b2tlblwiKTtcblxuICAgIGxldCByZWZyZXNoZWQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlZnJlc2hlZCA9IGF3YWl0IHJlZnJlc2hBY2Nlc3NUb2tlbihydCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSZWZyZXNoRmFpbGVkRXJyb3IgJiYgZS5pc0F1dGhEZWFkKSB7XG4gICAgICAgIGF3YWl0IGRlYWN0aXZhdGVBdXRoRGVhZFRva2VuKHRva2VuLCBydCwgYGFudGhyb3BpYzoke2Uuc3RhdHVzfWApO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICBjb25zdCB1cGRhdGVkID0gVG9rZW5DcmVkZW50aWFscy5wYXJzZSh7XG4gICAgICAuLi5jcmVkcyxcbiAgICAgIGFjY2Vzc1Rva2VuOiByZWZyZXNoZWQuYWNjZXNzVG9rZW4sXG4gICAgICByZWZyZXNoVG9rZW46IHJlZnJlc2hlZC5yZWZyZXNoVG9rZW4sXG4gICAgICBleHBpcmVzQXQ6IHJlZnJlc2hlZC5leHBpcmVzQXQsXG4gICAgfSk7XG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5zYXZlKFtcbiAgICAgIHtcbiAgICAgICAgaWQ6IHRva2VuLmlkLFxuICAgICAgICBwcm92aWRlcjogdG9rZW4ucHJvdmlkZXIsXG4gICAgICAgIGNyZWRlbnRpYWxzOiB1cGRhdGVkLFxuICAgICAgICBuYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgfSxcbiAgICBdKTtcbiAgICByZXR1cm4gcmVmcmVzaGVkLmFjY2Vzc1Rva2VuO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgaGVhbHRoKCk6IFByb21pc2U8SGVhbHRoUmVzcG9uc2U+IHtcbiAgICBjb25zdCBwcm92aWRlcnMgPSB7IC4uLlFncmlkRGlzcGF0Y2hlci5zdGFydHVwU3RhdGUgfTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiBcIm9rXCIsXG4gICAgICBhY3RpdmVUb2tlbnM6IFFncmlkRGlzcGF0Y2hlci50b2tlbnMuc2l6ZSxcbiAgICAgIHN1YnNjcmliZXI6IFFncmlkRGlzcGF0Y2hlci5zdWJzY3JpYmVyPy5zdGF0dXMoKSA/PyBudWxsLFxuICAgICAgLy8gcHJvdmlkZXIg67OEIOudvOyasO2MheydtOudvCDtlZjrgpjrp4wg7KSA67mE64+864+EIOq3uCBwcm92aWRlciDsmpTssq3snYAg7LKY66as65Cc64ukLlxuICAgICAgcmVhZHk6IE9iamVjdC52YWx1ZXMocHJvdmlkZXJzKS5pbmNsdWRlcyhcInJlYWR5XCIpLFxuICAgICAgcHJvdmlkZXJzLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFFncmlkRnJhbWUgPSBuZXcgUWdyaWRGcmFtZUNsYXNzKCk7XG5cbmZ1bmN0aW9uIGNvbnZlcnRBbnRocm9waWNVc2FnZShyYXc6IEFudGhyb3BpY1VzYWdlUmF3KTogVXNhZ2VSZXNwb25zZSB7XG4gIHJldHVybiB7XG4gICAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIsXG4gICAgZml2ZUhvdXI6IHJhdy5maXZlX2hvdXJcbiAgICAgID8geyB1dGlsaXphdGlvbjogcmF3LmZpdmVfaG91ci51dGlsaXphdGlvbiwgcmVzZXRzQXQ6IHJhdy5maXZlX2hvdXIucmVzZXRzX2F0IH1cbiAgICAgIDogbnVsbCxcbiAgICBzZXZlbkRheTogcmF3LnNldmVuX2RheVxuICAgICAgPyB7IHV0aWxpemF0aW9uOiByYXcuc2V2ZW5fZGF5LnV0aWxpemF0aW9uLCByZXNldHNBdDogcmF3LnNldmVuX2RheS5yZXNldHNfYXQgfVxuICAgICAgOiBudWxsLFxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOERBLE1BQU0saUNBQWlCLElBQUksSUFBd0I7QUFRbkQsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxrQkFBa0I7QUFFeEIsU0FBUyxpQkFBaUIsU0FBbUQ7Q0FDM0UsT0FBTyxPQUFPLFlBQVksNEJBQVcsSUFBSSxLQUFLLFVBQVUsR0FBSSxFQUFDLENBQUMsWUFBWSxJQUFJO0FBQ2hGO0FBRUEsZUFBZSxjQUFjLE9BQWUsTUFBbUM7Q0FDN0UsTUFBTSxRQUFRLG1CQUFtQjtDQUNqQyxJQUFJLENBQUMsT0FBTyxNQUFNLElBQUksTUFBTSw4QkFBOEI7Q0FDMUQsTUFBTSxNQUFNLElBQUk7RUFDZCxLQUFLLEdBQUcscUJBQXFCO0VBQzdCLE9BQU8sS0FBSyxVQUFVLElBQUk7RUFDMUIsS0FBSztDQUNQLENBQUM7QUFDSDtBQUVBLGVBQWUsY0FBYyxPQUFrRDtDQUM3RSxNQUFNLFFBQVEsbUJBQW1CO0NBQ2pDLElBQUksQ0FBQyxPQUFPLE1BQU0sSUFBSSxNQUFNLDhCQUE4QjtDQUMxRCxNQUFNLE1BQU0sTUFBTSxNQUFNLElBQVksRUFBRSxLQUFLLEdBQUcscUJBQXFCLFFBQVEsQ0FBQztDQUM1RSxJQUFJLENBQUMsS0FBSyxPQUFPO0NBQ2pCLE9BQU8sS0FBSyxNQUFNLEdBQUc7QUFDdkI7QUFFQSxlQUFlLGlCQUFpQixPQUE4QjtDQUM1RCxNQUFNLFFBQVEsbUJBQW1CO0NBQ2pDLElBQUksQ0FBQyxPQUFPO0NBQ1osTUFBTSxNQUFNLE9BQU8sRUFBRSxLQUFLLEdBQUcscUJBQXFCLFFBQVEsQ0FBQztBQUM3RDtBQUVBLE1BQU0sNEJBQTRCLG9CQUFvQixRQUFRLElBQUksUUFBUTtBQUkxRSxTQUFTLHVCQUEyRTtDQUNsRixJQUFJO0VBQ0YsTUFBTSxFQUFF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
|
|
@@ -37,7 +37,8 @@ const TOKENS_TRIGGER_SETUP_SQL = `
|
|
|
37
37
|
OLD.credentials IS DISTINCT FROM NEW.credentials OR
|
|
38
38
|
OLD.provider IS DISTINCT FROM NEW.provider OR
|
|
39
39
|
OLD.name IS DISTINCT FROM NEW.name OR
|
|
40
|
-
OLD.quota_threshold IS DISTINCT FROM NEW.quota_threshold
|
|
40
|
+
OLD.quota_threshold IS DISTINCT FROM NEW.quota_threshold OR
|
|
41
|
+
OLD.keepalive_enabled IS DISTINCT FROM NEW.keepalive_enabled
|
|
41
42
|
)
|
|
42
43
|
EXECUTE FUNCTION public.tokens_notify();
|
|
43
44
|
`;
|
|
@@ -65,4 +66,4 @@ async function ensureTokensTrigger(connConfig) {
|
|
|
65
66
|
//#endregion
|
|
66
67
|
export { TOKENS_TRIGGER_SETUP_SQL, ensureTokensTrigger };
|
|
67
68
|
|
|
68
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
69
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tdHJpZ2dlci1zZXR1cC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvdG9rZW4tdHJpZ2dlci1zZXR1cC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogT25lLXRpbWUgc2V0dXAgZm9yIHB1YmxpYy50b2tlbnMgLT4gdG9rZW5zX2NoYW5nZWQgTk9USUZZIHRyaWdnZXJzLiAqL1xuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IENsaWVudCwgdHlwZSBDbGllbnRDb25maWcgfSBmcm9tIFwicGdcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwidHJpZ2dlci1zZXR1cFwiXSk7XG5cbmNvbnN0IENPTk5FQ1RJT05fVElNRU9VVF9NUyA9IDVfMDAwO1xuY29uc3QgU0VUVVBfTE9DS19USU1FT1VUX01TID0gM18wMDA7XG5jb25zdCBTRVRVUF9TVEFURU1FTlRfVElNRU9VVF9NUyA9IDEwXzAwMDtcblxuY29uc3QgQURWSVNPUllfTE9DS19DTEFTU19JRCA9IDcxNztcbmNvbnN0IEFEVklTT1JZX0xPQ0tfT0JKRUNUX0lEID0gNDQ5MDA7XG5cbmV4cG9ydCBjb25zdCBUT0tFTlNfVFJJR0dFUl9TRVRVUF9TUUwgPSBgXG4gIENSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OIHB1YmxpYy50b2tlbnNfbm90aWZ5KCkgUkVUVVJOUyB0cmlnZ2VyXG4gIExBTkdVQUdFIHBscGdzcWxcbiAgU0VUIHNlYXJjaF9wYXRoID0gcGdfY2F0YWxvZywgcHVibGljXG4gIEFTICRmdW5jJFxuICBCRUdJTlxuICAgIFBFUkZPUk0gcGdfbm90aWZ5KCd0b2tlbnNfY2hhbmdlZCcsIGpzb25fYnVpbGRfb2JqZWN0KFxuICAgICAgJ29wJywgVEdfT1AsXG4gICAgICAnaWQnLCBDT0FMRVNDRShORVcuaWQsIE9MRC5pZClcbiAgICApOjp0ZXh0KTtcbiAgICBSRVRVUk4gQ09BTEVTQ0UoTkVXLCBPTEQpO1xuICBFTkQ7XG4gICRmdW5jJDtcblxuICBEUk9QIFRSSUdHRVIgSUYgRVhJU1RTIHRva2Vuc19jaGFuZ2VkX3RyaWdnZXIgT04gcHVibGljLnRva2VucztcbiAgRFJPUCBUUklHR0VSIElGIEVYSVNUUyB0b2tlbnNfY2hhbmdlZCBPTiBwdWJsaWMudG9rZW5zO1xuXG4gIENSRUFURSBPUiBSRVBMQUNFIFRSSUdHRVIgdG9rZW5zX2NoYW5nZWRfaW5zX2RlbFxuICBBRlRFUiBJTlNFUlQgT1IgREVMRVRFIE9OIHB1YmxpYy50b2tlbnNcbiAgRk9SIEVBQ0ggUk9XIEVYRUNVVEUgRlVOQ1RJT04gcHVibGljLnRva2Vuc19ub3RpZnkoKTtcblxuICBDUkVBVEUgT1IgUkVQTEFDRSBUUklHR0VSIHRva2Vuc19jaGFuZ2VkX3VwZFxuICBBRlRFUiBVUERBVEUgT04gcHVibGljLnRva2Vuc1xuICBGT1IgRUFDSCBST1dcbiAgV0hFTiAoXG4gICAgT0xELmFjdGl2ZSBJUyBESVNUSU5DVCBGUk9NIE5FVy5hY3RpdmUgT1JcbiAgICBPTEQuY3JlZGVudGlhbHMgSVMgRElTVElOQ1QgRlJPTSBORVcuY3JlZGVudGlhbHMgT1JcbiAgICBPTEQucHJvdmlkZXIgSVMgRElTVElOQ1QgRlJPTSBORVcucHJvdmlkZXIgT1JcbiAgICBPTEQubmFtZSBJUyBESVNUSU5DVCBGUk9NIE5FVy5uYW1lIE9SXG4gICAgT0xELnF1b3RhX3RocmVzaG9sZCBJUyBESVNUSU5DVCBGUk9NIE5FVy5xdW90YV90aHJlc2hvbGQgT1JcbiAgICBPTEQua2VlcGFsaXZlX2VuYWJsZWQgSVMgRElTVElOQ1QgRlJPTSBORVcua2VlcGFsaXZlX2VuYWJsZWRcbiAgKVxuICBFWEVDVVRFIEZVTkNUSU9OIHB1YmxpYy50b2tlbnNfbm90aWZ5KCk7XG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlVG9rZW5zVHJpZ2dlcihjb25uQ29uZmlnOiBDbGllbnRDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2xpZW50ID0gbmV3IENsaWVudCh7XG4gICAgLi4uY29ubkNvbmZpZyxcbiAgICBjb25uZWN0aW9uVGltZW91dE1pbGxpczogQ09OTkVDVElPTl9USU1FT1VUX01TLFxuICAgIGFwcGxpY2F0aW9uX25hbWU6IFwicWdyaWQtdHJpZ2dlci1zZXR1cFwiLFxuICB9KTtcblxuICBsZXQgbG9ja0FjcXVpcmVkID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgYXdhaXQgY2xpZW50LmNvbm5lY3QoKTtcbiAgICBhd2FpdCBjbGllbnQucXVlcnkoXCJTRVQgc2VhcmNoX3BhdGggVE8gcHVibGljXCIpO1xuICAgIGF3YWl0IGNsaWVudC5xdWVyeShgU0VUIGxvY2tfdGltZW91dCA9ICcke1NFVFVQX0xPQ0tfVElNRU9VVF9NU31tcydgKTtcbiAgICBhd2FpdCBjbGllbnQucXVlcnkoYFNFVCBzdGF0ZW1lbnRfdGltZW91dCA9ICcke1NFVFVQX1NUQVRFTUVOVF9USU1FT1VUX01TfW1zJ2ApO1xuICAgIGF3YWl0IGNsaWVudC5xdWVyeShcIlNFTEVDVCBwZ19hZHZpc29yeV9sb2NrKCQxLCAkMilcIiwgW1xuICAgICAgQURWSVNPUllfTE9DS19DTEFTU19JRCxcbiAgICAgIEFEVklTT1JZX0xPQ0tfT0JKRUNUX0lELFxuICAgIF0pO1xuICAgIGxvY2tBY3F1aXJlZCA9IHRydWU7XG5cbiAgICBhd2FpdCBjbGllbnQucXVlcnkoVE9LRU5TX1RSSUdHRVJfU0VUVVBfU1FMKTtcbiAgICBsb2dnZXIuaW5mbyhcInRyaWdnZXIgZW5zdXJlZCAocHVibGljLnRva2Vuc19ub3RpZnkgKyB0b2tlbnNfY2hhbmdlZF8qIHRyaWdnZXJzKVwiKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAobG9ja0FjcXVpcmVkKSB7XG4gICAgICBhd2FpdCBjbGllbnRcbiAgICAgICAgLnF1ZXJ5KFwiU0VMRUNUIHBnX2Fkdmlzb3J5X3VubG9jaygkMSwgJDIpXCIsIFtcbiAgICAgICAgICBBRFZJU09SWV9MT0NLX0NMQVNTX0lELFxuICAgICAgICAgIEFEVklTT1JZX0xPQ0tfT0JKRUNUX0lELFxuICAgICAgICBdKVxuICAgICAgICAuY2F0Y2goKCkgPT4ge30pO1xuICAgIH1cbiAgICBhd2FpdCBjbGllbnQuZW5kKCkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFJQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsZUFBZSxDQUFDO0FBRW5ELE1BQU0sd0JBQXdCO0FBQzlCLE1BQU0sd0JBQXdCO0FBQzlCLE1BQU0sNkJBQTZCO0FBRW5DLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0sMEJBQTBCO0FBRWhDLE1BQWEsMkJBQTJCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUN4QyxlQUFzQixvQkFBb0IsWUFBeUM7Q0FDakYsTUFBTSxTQUFTLElBQUksT0FBTztFQUN4QixHQUFHO0VBQ0gseUJBQXlCO0VBQ3pCLGtCQUFrQjtDQUNwQixDQUFDO0NBRUQsSUFBSSxlQUFlO0NBQ25CLElBQUk7RUFDRixNQUFNLE9BQU8sUUFBUTtFQUNyQixNQUFNLE9BQU8sTUFBTSwyQkFBMkI7RUFDOUMsTUFBTSxPQUFPLE1BQU0sdUJBQXVCLHNCQUFzQixJQUFJO0VBQ3BFLE1BQU0sT0FBTyxNQUFNLDRCQUE0QiwyQkFBMkIsSUFBSTtFQUM5RSxNQUFNLE9BQU8sTUFBTSxtQ0FBbUMsQ0FDcEQsd0JBQ0EsdUJBQ0YsQ0FBQztFQUNELGVBQWU7RUFFZixNQUFNLE9BQU8sTUFBTSx3QkFBd0I7RUFDM0MsT0FBTyxLQUFLLG9FQUFvRTtDQUNsRixVQUFVO0VBQ1IsSUFBSSxjQUNGLE1BQU0sT0FDSCxNQUFNLHFDQUFxQyxDQUMxQyx3QkFDQSx1QkFDRixDQUFDLENBQUMsQ0FDRCxZQUFZLENBQUMsQ0FBQztFQUVuQixNQUFNLE9BQU8sSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7Q0FDbkM7QUFDRiJ9
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { TOKEN_WINDOW_KEEPALIVE_RUNNER_ENV_KEY } from "../setting/setting.constant.js";
|
|
1
2
|
import { getSetting } from "../setting/setting.store.js";
|
|
2
3
|
import { TokenModel } from "../token/token.model.js";
|
|
3
4
|
import { QgridFrame } from "./qgrid.frame.js";
|
|
@@ -10,12 +11,13 @@ const POST_KEEPALIVE_USAGE_DELAY_MS = 61e3;
|
|
|
10
11
|
const KEEPALIVE_MODEL = "anthropic/claude-haiku-4-5";
|
|
11
12
|
const KEEPALIVE_PROJECT_NAME = "qgrid-token-window-keepalive";
|
|
12
13
|
const KEEPALIVE_SETTING_KEY = "qgrid.tokenWindowKeepaliveEnabled";
|
|
13
|
-
const KEEPALIVE_ENV_KEY =
|
|
14
|
+
const KEEPALIVE_ENV_KEY = TOKEN_WINDOW_KEEPALIVE_RUNNER_ENV_KEY;
|
|
14
15
|
const defaultDeps = {
|
|
15
16
|
findTokens: () => TokenModel.findActiveByProvider("A", "anthropic"),
|
|
16
17
|
readUsage: (tokenId) => QgridFrame.usage(tokenId),
|
|
17
18
|
dispatch: (input) => QgridFrame.query(input),
|
|
18
19
|
readSetting: getSetting,
|
|
20
|
+
isRunnerEnabled: () => process.env[KEEPALIVE_ENV_KEY] === "true",
|
|
19
21
|
now: () => Date.now(),
|
|
20
22
|
setTimer: (callback, delayMs) => setTimeout(callback, delayMs),
|
|
21
23
|
clearTimer: (handle) => clearTimeout(handle)
|
|
@@ -121,7 +123,11 @@ function clearScheduledTimers() {
|
|
|
121
123
|
}
|
|
122
124
|
async function startTokenWindowKeepalive(deps = defaultDeps) {
|
|
123
125
|
clearScheduledTimers();
|
|
124
|
-
if (deps.
|
|
126
|
+
if (!deps.isRunnerEnabled()) {
|
|
127
|
+
logger.info("token window keepalive runner disabled for this instance");
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (deps.readSetting("qgrid.tokenWindowKeepaliveEnabled") === "false") {
|
|
125
131
|
logger.info("token window keepalive disabled");
|
|
126
132
|
return;
|
|
127
133
|
}
|
|
@@ -134,7 +140,7 @@ async function startTokenWindowKeepalive(deps = defaultDeps) {
|
|
|
134
140
|
return;
|
|
135
141
|
}
|
|
136
142
|
if (generation !== expectedGeneration) return;
|
|
137
|
-
const targets = tokens.filter((token) => token.active && token.provider === "anthropic");
|
|
143
|
+
const targets = tokens.filter((token) => token.active && token.provider === "anthropic" && token.keepalive_enabled);
|
|
138
144
|
const targetIds = new Set(targets.map((token) => token.id));
|
|
139
145
|
for (const tokenId of fireGuards.keys()) if (!targetIds.has(tokenId)) fireGuards.delete(tokenId);
|
|
140
146
|
logger.info(`token window keepalive scheduling ${targets.length} token(s)`);
|
|
@@ -150,4 +156,4 @@ function stopTokenWindowKeepalive() {
|
|
|
150
156
|
//#endregion
|
|
151
157
|
export { KEEPALIVE_ENV_KEY, KEEPALIVE_MODEL, KEEPALIVE_PROJECT_NAME, KEEPALIVE_SETTING_KEY, POST_KEEPALIVE_USAGE_DELAY_MS, rescheduleTokenWindowKeepalive, startTokenWindowKeepalive, stopTokenWindowKeepalive };
|
|
152
158
|
|
|
153
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4td2luZG93LWtlZXBhbGl2ZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvdG9rZW4td2luZG93LWtlZXBhbGl2ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBnZXRTZXR0aW5nIH0gZnJvbSBcIi4uL3NldHRpbmcvc2V0dGluZy5zdG9yZVwiO1xuaW1wb3J0IHsgVG9rZW5Nb2RlbCB9IGZyb20gXCIuLi90b2tlbi90b2tlbi5tb2RlbFwiO1xuaW1wb3J0IHsgdHlwZSBJbnRlcm5hbFF1ZXJ5SW5wdXQgfSBmcm9tIFwiLi9xZ3JpZC5kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBRZ3JpZEZyYW1lIH0gZnJvbSBcIi4vcWdyaWQuZnJhbWVcIjtcbmltcG9ydCB7IHR5cGUgVXNhZ2VSZXNwb25zZSB9IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInRva2VuLXdpbmRvdy1rZWVwYWxpdmVcIl0pO1xuXG5jb25zdCBGSVZFX0hPVVJTX01TID0gNSAqIDYwICogNjAgKiAxXzAwMDtcbmNvbnN0IFJFU0VUX0dSQUNFX01TID0gMV8wMDA7XG5cbi8vIHVzYWdlIEFQSSDshLHqs7Ug7J2R64u17J2AIDHrtoQg7LqQ7Iuc65Cc64ukLiBrZWVwYWxpdmUg7KeB7ZuEIOymieyLnCDsnqzsobDtmoztlZjrqbQg7J207KCEIOyciOuPhOyasOulvFxuLy8g64uk7IucIOuztOuvgOuhnCDsupDsi5zqsIAg7KeA64KcIOuSpCDtlZwg67KIIO2ZleyduO2VmOqzoCwg6re465WM64+EIOyDiCDsnIjrj4TsmrDqsIAg7JeG7Jy866m0IOuLpOydjCA1aOq5jOyngCDquLDri6TrprDri6QuXG5leHBvcnQgY29uc3QgUE9TVF9LRUVQQUxJVkVfVVNBR0VfREVMQVlfTVMgPSA2MV8wMDA7XG5leHBvcnQgY29uc3QgS0VFUEFMSVZFX01PREVMID0gXCJhbnRocm9waWMvY2xhdWRlLWhhaWt1LTQtNVwiO1xuZXhwb3J0IGNvbnN0IEtFRVBBTElWRV9QUk9KRUNUX05BTUUgPSBcInFncmlkLXRva2VuLXdpbmRvdy1rZWVwYWxpdmVcIjtcbmV4cG9ydCBjb25zdCBLRUVQQUxJVkVfU0VUVElOR19LRVkgPSBcInFncmlkLnRva2VuV2luZG93S2VlcGFsaXZlRW5hYmxlZFwiO1xuZXhwb3J0IGNvbnN0IEtFRVBBTElWRV9FTlZfS0VZID0gXCJRR1JJRF9UT0tFTl9XSU5ET1dfS0VFUEFMSVZFX0VOQUJMRURcIjtcblxudHlwZSBLZWVwYWxpdmVUb2tlbiA9IHtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xuICBwcm92aWRlcjogc3RyaW5nO1xuICBhY3RpdmU6IGJvb2xlYW47XG59O1xuXG50eXBlIFRpbWVySGFuZGxlID0gUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG5cbmV4cG9ydCB0eXBlIFRva2VuV2luZG93S2VlcGFsaXZlRGVwcyA9IHtcbiAgZmluZFRva2VuczogKCkgPT4gUHJvbWlzZTxLZWVwYWxpdmVUb2tlbltdPjtcbiAgcmVhZFVzYWdlOiAodG9rZW5JZDogbnVtYmVyKSA9PiBQcm9taXNlPFVzYWdlUmVzcG9uc2U+O1xuICBkaXNwYXRjaDogKGlucHV0OiBJbnRlcm5hbFF1ZXJ5SW5wdXQpID0+IFByb21pc2U8dW5rbm93bj47XG4gIHJlYWRTZXR0aW5nOiB0eXBlb2YgZ2V0U2V0dGluZztcbiAgbm93OiAoKSA9PiBudW1iZXI7XG4gIHNldFRpbWVyOiAoY2FsbGJhY2s6ICgpID0+IHZvaWQsIGRlbGF5TXM6IG51bWJlcikgPT4gVGltZXJIYW5kbGU7XG4gIGNsZWFyVGltZXI6IChoYW5kbGU6IFRpbWVySGFuZGxlKSA9PiB2b2lkO1xufTtcblxuY29uc3QgZGVmYXVsdERlcHM6IFRva2VuV2luZG93S2VlcGFsaXZlRGVwcyA9IHtcbiAgZmluZFRva2VuczogKCkgPT4gVG9rZW5Nb2RlbC5maW5kQWN0aXZlQnlQcm92aWRlcihcIkFcIiwgXCJhbnRocm9waWNcIiksXG4gIHJlYWRVc2FnZTogKHRva2VuSWQpID0+IFFncmlkRnJhbWUudXNhZ2UodG9rZW5JZCksXG4gIGRpc3BhdGNoOiAoaW5wdXQpID0+IFFncmlkRnJhbWUucXVlcnkoaW5wdXQpLFxuICByZWFkU2V0dGluZzogZ2V0U2V0dGluZyxcbiAgbm93OiAoKSA9PiBEYXRlLm5vdygpLFxuICBzZXRUaW1lcjogKGNhbGxiYWNrLCBkZWxheU1zKSA9PiBzZXRUaW1lb3V0KGNhbGxiYWNrLCBkZWxheU1zKSxcbiAgY2xlYXJUaW1lcjogKGhhbmRsZSkgPT4gY2xlYXJUaW1lb3V0KGhhbmRsZSksXG59O1xuXG5jb25zdCB0aW1lcnMgPSBuZXcgTWFwPG51bWJlciwgeyBoYW5kbGU6IFRpbWVySGFuZGxlOyBjbGVhcjogKGhhbmRsZTogVGltZXJIYW5kbGUpID0+IHZvaWQgfT4oKTtcbmNvbnN0IGZpcmVHdWFyZHMgPSBuZXcgTWFwPG51bWJlciwgeyB1bnRpbE1zOiBudW1iZXI7IGFsbG93RmlyZUF0RXhwaXJ5OiBib29sZWFuIH0+KCk7XG5sZXQgZ2VuZXJhdGlvbiA9IDA7XG5cbmZ1bmN0aW9uIGNsZWFyVG9rZW5UaW1lcih0b2tlbklkOiBudW1iZXIpOiB2b2lkIHtcbiAgY29uc3QgdGltZXIgPSB0aW1lcnMuZ2V0KHRva2VuSWQpO1xuICBpZiAoIXRpbWVyKSByZXR1cm47XG4gIHRpbWVyLmNsZWFyKHRpbWVyLmhhbmRsZSk7XG4gIHRpbWVycy5kZWxldGUodG9rZW5JZCk7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlVG9rZW4oXG4gIHRva2VuOiBLZWVwYWxpdmVUb2tlbixcbiAgZGVwczogVG9rZW5XaW5kb3dLZWVwYWxpdmVEZXBzLFxuICBleHBlY3RlZEdlbmVyYXRpb246IG51bWJlcixcbiAgZGVsYXlNczogbnVtYmVyLFxuICBhbGxvd0ZpcmU6IGJvb2xlYW4sXG4pOiB2b2lkIHtcbiAgaWYgKGdlbmVyYXRpb24gIT09IGV4cGVjdGVkR2VuZXJhdGlvbikgcmV0dXJuO1xuICBjbGVhclRva2VuVGltZXIodG9rZW4uaWQpO1xuICBjb25zdCBoYW5kbGUgPSBkZXBzLnNldFRpbWVyKFxuICAgICgpID0+IHtcbiAgICAgIHRpbWVycy5kZWxldGUodG9rZW4uaWQpO1xuICAgICAgaWYgKGdlbmVyYXRpb24gIT09IGV4cGVjdGVkR2VuZXJhdGlvbikgcmV0dXJuO1xuICAgICAgdm9pZCBpbnNwZWN0VG9rZW4odG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbiwgYWxsb3dGaXJlKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYGtlZXBhbGl2ZSBjeWNsZSBmYWlsZWQgZm9yICR7dG9rZW4ubmFtZX06ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICBzY2hlZHVsZUZhbGxiYWNrKHRva2VuLCBkZXBzLCBleHBlY3RlZEdlbmVyYXRpb24pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBNYXRoLm1heCgwLCBkZWxheU1zKSxcbiAgKTtcbiAgdGltZXJzLnNldCh0b2tlbi5pZCwgeyBoYW5kbGUsIGNsZWFyOiBkZXBzLmNsZWFyVGltZXIgfSk7XG59XG5cbmZ1bmN0aW9uIGRlZmVyVG9rZW4oXG4gIHRva2VuOiBLZWVwYWxpdmVUb2tlbixcbiAgZGVwczogVG9rZW5XaW5kb3dLZWVwYWxpdmVEZXBzLFxuICBleHBlY3RlZEdlbmVyYXRpb246IG51bWJlcixcbiAgZGVsYXlNczogbnVtYmVyLFxuICBhbGxvd0ZpcmVBdEV4cGlyeTogYm9vbGVhbixcbik6IHZvaWQge1xuICBjb25zdCB1bnRpbE1zID0gZGVwcy5ub3coKSArIGRlbGF5TXM7XG4gIGZpcmVHdWFyZHMuc2V0KHRva2VuLmlkLCB7IHVudGlsTXMsIGFsbG93RmlyZUF0RXhwaXJ5IH0pO1xuICBzY2hlZHVsZVRva2VuKHRva2VuLCBkZXBzLCBleHBlY3RlZEdlbmVyYXRpb24sIGRlbGF5TXMsIGFsbG93RmlyZUF0RXhwaXJ5KTtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVGYWxsYmFjayhcbiAgdG9rZW46IEtlZXBhbGl2ZVRva2VuLFxuICBkZXBzOiBUb2tlbldpbmRvd0tlZXBhbGl2ZURlcHMsXG4gIGV4cGVjdGVkR2VuZXJhdGlvbjogbnVtYmVyLFxuKTogdm9pZCB7XG4gIGRlZmVyVG9rZW4odG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbiwgRklWRV9IT1VSU19NUywgdHJ1ZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGluc3BlY3RUb2tlbihcbiAgdG9rZW46IEtlZXBhbGl2ZVRva2VuLFxuICBkZXBzOiBUb2tlbldpbmRvd0tlZXBhbGl2ZURlcHMsXG4gIGV4cGVjdGVkR2VuZXJhdGlvbjogbnVtYmVyLFxuICBhbGxvd0ZpcmU6IGJvb2xlYW4sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgbm93ID0gZGVwcy5ub3coKTtcbiAgY29uc3QgZ3VhcmQgPSBmaXJlR3VhcmRzLmdldCh0b2tlbi5pZCk7XG4gIGlmIChndWFyZCAmJiBndWFyZC51bnRpbE1zID4gbm93KSB7XG4gICAgc2NoZWR1bGVUb2tlbih0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uLCBndWFyZC51bnRpbE1zIC0gbm93LCBndWFyZC5hbGxvd0ZpcmVBdEV4cGlyeSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChndWFyZCkgZmlyZUd1YXJkcy5kZWxldGUodG9rZW4uaWQpO1xuXG4gIGxldCB1c2FnZTogVXNhZ2VSZXNwb25zZTtcbiAgdHJ5IHtcbiAgICB1c2FnZSA9IGF3YWl0IGRlcHMucmVhZFVzYWdlKHRva2VuLmlkKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIud2FybihgdXNhZ2UgbG9va3VwIGZhaWxlZCBmb3IgJHt0b2tlbi5uYW1lfTogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgc2NoZWR1bGVGYWxsYmFjayh0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGdlbmVyYXRpb24gIT09IGV4cGVjdGVkR2VuZXJhdGlvbikgcmV0dXJuO1xuXG4gIGlmICh1c2FnZS5lcnJvcikge1xuICAgIGxvZ2dlci53YXJuKGB1c2FnZSBsb29rdXAgZmFpbGVkIGZvciAke3Rva2VuLm5hbWV9OiAke3VzYWdlLmVycm9yfWApO1xuICAgIHNjaGVkdWxlRmFsbGJhY2sodG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcmVzZXRzQXQgPSB1c2FnZS5maXZlSG91cj8ucmVzZXRzQXQ7XG4gIGlmIChyZXNldHNBdCkge1xuICAgIGNvbnN0IHJlc2V0TXMgPSBEYXRlLnBhcnNlKHJlc2V0c0F0KTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShyZXNldE1zKSkge1xuICAgICAgbG9nZ2VyLndhcm4oYGludmFsaWQgZml2ZS1ob3VyIHJlc2V0IGZvciAke3Rva2VuLm5hbWV9OiAke3Jlc2V0c0F0fWApO1xuICAgICAgc2NoZWR1bGVGYWxsYmFjayh0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5zcGVjdGVkQXQgPSBkZXBzLm5vdygpO1xuICAgIGlmIChyZXNldE1zID4gaW5zcGVjdGVkQXQpIHtcbiAgICAgIGZpcmVHdWFyZHMuZGVsZXRlKHRva2VuLmlkKTtcbiAgICAgIHNjaGVkdWxlVG9rZW4odG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbiwgcmVzZXRNcyAtIGluc3BlY3RlZEF0ICsgUkVTRVRfR1JBQ0VfTVMsIHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8vIOuwnOyCrCDsp4Htm4Qg7ZmV7J247JeQ7ISc64qUIOy6kOyLnOuQnCBudWxsL+qzvOqxsCByZXNldOydhCDrtJDrj4Qg64uk7IucIOuwnOyCrO2VmOyngCDslYrripTri6QuXG4gIGlmICghYWxsb3dGaXJlKSB7XG4gICAgc2NoZWR1bGVGYWxsYmFjayh0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBkZWZlclRva2VuKHRva2VuLCBkZXBzLCBleHBlY3RlZEdlbmVyYXRpb24sIFBPU1RfS0VFUEFMSVZFX1VTQUdFX0RFTEFZX01TLCBmYWxzZSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZGVwcy5kaXNwYXRjaCh7XG4gICAgICBwcm9tcHQ6IFwiUmVwbHkgT0suXCIsXG4gICAgICBtb2RlbDogS0VFUEFMSVZFX01PREVMLFxuICAgICAgZWZmb3J0OiBcImxvd1wiLFxuICAgICAgcHJvamVjdE5hbWU6IEtFRVBBTElWRV9QUk9KRUNUX05BTUUsXG4gICAgICBwcmVmZXJyZWRUb2tlbklkOiB0b2tlbi5pZCxcbiAgICB9KTtcbiAgICBsb2dnZXIuaW5mbyhga2VlcGFsaXZlIHNlbnQgZm9yICR7dG9rZW4ubmFtZX1gKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIud2Fybihga2VlcGFsaXZlIGZhaWxlZCBmb3IgJHt0b2tlbi5uYW1lfTogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgc2NoZWR1bGVGYWxsYmFjayh0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwb3N0RmlyZUd1YXJkID0gZmlyZUd1YXJkcy5nZXQodG9rZW4uaWQpO1xuICBpZiAocG9zdEZpcmVHdWFyZCkge1xuICAgIHNjaGVkdWxlVG9rZW4oXG4gICAgICB0b2tlbixcbiAgICAgIGRlcHMsXG4gICAgICBleHBlY3RlZEdlbmVyYXRpb24sXG4gICAgICBNYXRoLm1heCgwLCBwb3N0RmlyZUd1YXJkLnVudGlsTXMgLSBkZXBzLm5vdygpKSxcbiAgICAgIHBvc3RGaXJlR3VhcmQuYWxsb3dGaXJlQXRFeHBpcnksXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjbGVhclNjaGVkdWxlZFRpbWVycygpOiB2b2lkIHtcbiAgZ2VuZXJhdGlvbisrO1xuICBmb3IgKGNvbnN0IHRva2VuSWQgb2YgdGltZXJzLmtleXMoKSkgY2xlYXJUb2tlblRpbWVyKHRva2VuSWQpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRUb2tlbldpbmRvd0tlZXBhbGl2ZShcbiAgZGVwczogVG9rZW5XaW5kb3dLZWVwYWxpdmVEZXBzID0gZGVmYXVsdERlcHMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY2xlYXJTY2hlZHVsZWRUaW1lcnMoKTtcbiAgaWYgKGRlcHMucmVhZFNldHRpbmcoS0VFUEFMSVZFX1NFVFRJTkdfS0VZLCBLRUVQQUxJVkVfRU5WX0tFWSkgPT09IFwiZmFsc2VcIikge1xuICAgIGxvZ2dlci5pbmZvKFwidG9rZW4gd2luZG93IGtlZXBhbGl2ZSBkaXNhYmxlZFwiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZXhwZWN0ZWRHZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjtcblxuICBsZXQgdG9rZW5zOiBLZWVwYWxpdmVUb2tlbltdO1xuICB0cnkge1xuICAgIHRva2VucyA9IGF3YWl0IGRlcHMuZmluZFRva2VucygpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGxvZ2dlci53YXJuKGB0b2tlbiBkaXNjb3ZlcnkgZmFpbGVkOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGdlbmVyYXRpb24gIT09IGV4cGVjdGVkR2VuZXJhdGlvbikgcmV0dXJuO1xuXG4gIGNvbnN0IHRhcmdldHMgPSB0b2tlbnMuZmlsdGVyKCh0b2tlbikgPT4gdG9rZW4uYWN0aXZlICYmIHRva2VuLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKTtcbiAgY29uc3QgdGFyZ2V0SWRzID0gbmV3IFNldCh0YXJnZXRzLm1hcCgodG9rZW4pID0+IHRva2VuLmlkKSk7XG4gIGZvciAoY29uc3QgdG9rZW5JZCBvZiBmaXJlR3VhcmRzLmtleXMoKSkge1xuICAgIGlmICghdGFyZ2V0SWRzLmhhcyh0b2tlbklkKSkgZmlyZUd1YXJkcy5kZWxldGUodG9rZW5JZCk7XG4gIH1cbiAgbG9nZ2VyLmluZm8oYHRva2VuIHdpbmRvdyBrZWVwYWxpdmUgc2NoZWR1bGluZyAke3RhcmdldHMubGVuZ3RofSB0b2tlbihzKWApO1xuICBhd2FpdCBQcm9taXNlLmFsbCh0YXJnZXRzLm1hcCgodG9rZW4pID0+IGluc3BlY3RUb2tlbih0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uLCB0cnVlKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzY2hlZHVsZVRva2VuV2luZG93S2VlcGFsaXZlKFxuICBkZXBzOiBUb2tlbldpbmRvd0tlZXBhbGl2ZURlcHMgPSBkZWZhdWx0RGVwcyxcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gc3RhcnRUb2tlbldpbmRvd0tlZXBhbGl2ZShkZXBzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0b3BUb2tlbldpbmRvd0tlZXBhbGl2ZSgpOiB2b2lkIHtcbiAgY2xlYXJTY2hlZHVsZWRUaW1lcnMoKTtcbiAgZmlyZUd1YXJkcy5jbGVhcigpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQVFBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyx3QkFBd0IsQ0FBQztBQUU1RCxNQUFNLGdCQUFnQixNQUFTLEtBQUs7QUFDcEMsTUFBTSxpQkFBaUI7QUFJdkIsTUFBYSxnQ0FBZ0M7QUFDN0MsTUFBYSxrQkFBa0I7QUFDL0IsTUFBYSx5QkFBeUI7QUFDdEMsTUFBYSx3QkFBd0I7QUFDckMsTUFBYSxvQkFBb0I7QUFxQmpDLE1BQU0sY0FBd0M7Q0FDNUMsa0JBQWtCLFdBQVcscUJBQXFCLEtBQUssV0FBVztDQUNsRSxZQUFZLFlBQVksV0FBVyxNQUFNLE9BQU87Q0FDaEQsV0FBVyxVQUFVLFdBQVcsTUFBTSxLQUFLO0NBQzNDLGFBQWE7Q0FDYixX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
|
|
159
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4td2luZG93LWtlZXBhbGl2ZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvdG9rZW4td2luZG93LWtlZXBhbGl2ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBUT0tFTl9XSU5ET1dfS0VFUEFMSVZFX1JVTk5FUl9FTlZfS0VZIH0gZnJvbSBcIi4uL3NldHRpbmcvc2V0dGluZy5jb25zdGFudFwiO1xuaW1wb3J0IHsgZ2V0U2V0dGluZyB9IGZyb20gXCIuLi9zZXR0aW5nL3NldHRpbmcuc3RvcmVcIjtcbmltcG9ydCB7IFRva2VuTW9kZWwgfSBmcm9tIFwiLi4vdG9rZW4vdG9rZW4ubW9kZWxcIjtcbmltcG9ydCB7IHR5cGUgSW50ZXJuYWxRdWVyeUlucHV0IH0gZnJvbSBcIi4vcWdyaWQuZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgUWdyaWRGcmFtZSB9IGZyb20gXCIuL3FncmlkLmZyYW1lXCI7XG5pbXBvcnQgeyB0eXBlIFVzYWdlUmVzcG9uc2UgfSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJ0b2tlbi13aW5kb3cta2VlcGFsaXZlXCJdKTtcblxuY29uc3QgRklWRV9IT1VSU19NUyA9IDUgKiA2MCAqIDYwICogMV8wMDA7XG5jb25zdCBSRVNFVF9HUkFDRV9NUyA9IDFfMDAwO1xuXG4vLyB1c2FnZSBBUEkg7ISx6rO1IOydkeuLteydgCAx67aEIOy6kOyLnOuQnOuLpC4ga2VlcGFsaXZlIOynge2bhCDsponsi5wg7J6s7KGw7ZqM7ZWY66m0IOydtOyghCDsnIjrj4TsmrDrpbxcbi8vIOuLpOyLnCDrs7Trr4DroZwg7LqQ7Iuc6rCAIOyngOuCnCDrkqQg7ZWcIOuyiCDtmZXsnbjtlZjqs6AsIOq3uOuVjOuPhCDsg4gg7JyI64+E7Jqw6rCAIOyXhuycvOuptCDri6TsnYwgNWjquYzsp4Ag6riw64uk66aw64ukLlxuZXhwb3J0IGNvbnN0IFBPU1RfS0VFUEFMSVZFX1VTQUdFX0RFTEFZX01TID0gNjFfMDAwO1xuZXhwb3J0IGNvbnN0IEtFRVBBTElWRV9NT0RFTCA9IFwiYW50aHJvcGljL2NsYXVkZS1oYWlrdS00LTVcIjtcbmV4cG9ydCBjb25zdCBLRUVQQUxJVkVfUFJPSkVDVF9OQU1FID0gXCJxZ3JpZC10b2tlbi13aW5kb3cta2VlcGFsaXZlXCI7XG5leHBvcnQgY29uc3QgS0VFUEFMSVZFX1NFVFRJTkdfS0VZID0gXCJxZ3JpZC50b2tlbldpbmRvd0tlZXBhbGl2ZUVuYWJsZWRcIjtcbmV4cG9ydCBjb25zdCBLRUVQQUxJVkVfRU5WX0tFWSA9IFRPS0VOX1dJTkRPV19LRUVQQUxJVkVfUlVOTkVSX0VOVl9LRVk7XG5cbnR5cGUgS2VlcGFsaXZlVG9rZW4gPSB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgcHJvdmlkZXI6IHN0cmluZztcbiAgYWN0aXZlOiBib29sZWFuO1xuICBrZWVwYWxpdmVfZW5hYmxlZDogYm9vbGVhbjtcbn07XG5cbnR5cGUgVGltZXJIYW5kbGUgPSBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcblxuZXhwb3J0IHR5cGUgVG9rZW5XaW5kb3dLZWVwYWxpdmVEZXBzID0ge1xuICBmaW5kVG9rZW5zOiAoKSA9PiBQcm9taXNlPEtlZXBhbGl2ZVRva2VuW10+O1xuICByZWFkVXNhZ2U6ICh0b2tlbklkOiBudW1iZXIpID0+IFByb21pc2U8VXNhZ2VSZXNwb25zZT47XG4gIGRpc3BhdGNoOiAoaW5wdXQ6IEludGVybmFsUXVlcnlJbnB1dCkgPT4gUHJvbWlzZTx1bmtub3duPjtcbiAgcmVhZFNldHRpbmc6IHR5cGVvZiBnZXRTZXR0aW5nO1xuICBpc1J1bm5lckVuYWJsZWQ6ICgpID0+IGJvb2xlYW47XG4gIG5vdzogKCkgPT4gbnVtYmVyO1xuICBzZXRUaW1lcjogKGNhbGxiYWNrOiAoKSA9PiB2b2lkLCBkZWxheU1zOiBudW1iZXIpID0+IFRpbWVySGFuZGxlO1xuICBjbGVhclRpbWVyOiAoaGFuZGxlOiBUaW1lckhhbmRsZSkgPT4gdm9pZDtcbn07XG5cbmNvbnN0IGRlZmF1bHREZXBzOiBUb2tlbldpbmRvd0tlZXBhbGl2ZURlcHMgPSB7XG4gIGZpbmRUb2tlbnM6ICgpID0+IFRva2VuTW9kZWwuZmluZEFjdGl2ZUJ5UHJvdmlkZXIoXCJBXCIsIFwiYW50aHJvcGljXCIpLFxuICByZWFkVXNhZ2U6ICh0b2tlbklkKSA9PiBRZ3JpZEZyYW1lLnVzYWdlKHRva2VuSWQpLFxuICBkaXNwYXRjaDogKGlucHV0KSA9PiBRZ3JpZEZyYW1lLnF1ZXJ5KGlucHV0KSxcbiAgcmVhZFNldHRpbmc6IGdldFNldHRpbmcsXG4gIGlzUnVubmVyRW5hYmxlZDogKCkgPT4gcHJvY2Vzcy5lbnZbS0VFUEFMSVZFX0VOVl9LRVldID09PSBcInRydWVcIixcbiAgbm93OiAoKSA9PiBEYXRlLm5vdygpLFxuICBzZXRUaW1lcjogKGNhbGxiYWNrLCBkZWxheU1zKSA9PiBzZXRUaW1lb3V0KGNhbGxiYWNrLCBkZWxheU1zKSxcbiAgY2xlYXJUaW1lcjogKGhhbmRsZSkgPT4gY2xlYXJUaW1lb3V0KGhhbmRsZSksXG59O1xuXG5jb25zdCB0aW1lcnMgPSBuZXcgTWFwPG51bWJlciwgeyBoYW5kbGU6IFRpbWVySGFuZGxlOyBjbGVhcjogKGhhbmRsZTogVGltZXJIYW5kbGUpID0+IHZvaWQgfT4oKTtcbmNvbnN0IGZpcmVHdWFyZHMgPSBuZXcgTWFwPG51bWJlciwgeyB1bnRpbE1zOiBudW1iZXI7IGFsbG93RmlyZUF0RXhwaXJ5OiBib29sZWFuIH0+KCk7XG5sZXQgZ2VuZXJhdGlvbiA9IDA7XG5cbmZ1bmN0aW9uIGNsZWFyVG9rZW5UaW1lcih0b2tlbklkOiBudW1iZXIpOiB2b2lkIHtcbiAgY29uc3QgdGltZXIgPSB0aW1lcnMuZ2V0KHRva2VuSWQpO1xuICBpZiAoIXRpbWVyKSByZXR1cm47XG4gIHRpbWVyLmNsZWFyKHRpbWVyLmhhbmRsZSk7XG4gIHRpbWVycy5kZWxldGUodG9rZW5JZCk7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlVG9rZW4oXG4gIHRva2VuOiBLZWVwYWxpdmVUb2tlbixcbiAgZGVwczogVG9rZW5XaW5kb3dLZWVwYWxpdmVEZXBzLFxuICBleHBlY3RlZEdlbmVyYXRpb246IG51bWJlcixcbiAgZGVsYXlNczogbnVtYmVyLFxuICBhbGxvd0ZpcmU6IGJvb2xlYW4sXG4pOiB2b2lkIHtcbiAgaWYgKGdlbmVyYXRpb24gIT09IGV4cGVjdGVkR2VuZXJhdGlvbikgcmV0dXJuO1xuICBjbGVhclRva2VuVGltZXIodG9rZW4uaWQpO1xuICBjb25zdCBoYW5kbGUgPSBkZXBzLnNldFRpbWVyKFxuICAgICgpID0+IHtcbiAgICAgIHRpbWVycy5kZWxldGUodG9rZW4uaWQpO1xuICAgICAgaWYgKGdlbmVyYXRpb24gIT09IGV4cGVjdGVkR2VuZXJhdGlvbikgcmV0dXJuO1xuICAgICAgdm9pZCBpbnNwZWN0VG9rZW4odG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbiwgYWxsb3dGaXJlKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYGtlZXBhbGl2ZSBjeWNsZSBmYWlsZWQgZm9yICR7dG9rZW4ubmFtZX06ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICBzY2hlZHVsZUZhbGxiYWNrKHRva2VuLCBkZXBzLCBleHBlY3RlZEdlbmVyYXRpb24pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBNYXRoLm1heCgwLCBkZWxheU1zKSxcbiAgKTtcbiAgdGltZXJzLnNldCh0b2tlbi5pZCwgeyBoYW5kbGUsIGNsZWFyOiBkZXBzLmNsZWFyVGltZXIgfSk7XG59XG5cbmZ1bmN0aW9uIGRlZmVyVG9rZW4oXG4gIHRva2VuOiBLZWVwYWxpdmVUb2tlbixcbiAgZGVwczogVG9rZW5XaW5kb3dLZWVwYWxpdmVEZXBzLFxuICBleHBlY3RlZEdlbmVyYXRpb246IG51bWJlcixcbiAgZGVsYXlNczogbnVtYmVyLFxuICBhbGxvd0ZpcmVBdEV4cGlyeTogYm9vbGVhbixcbik6IHZvaWQge1xuICBjb25zdCB1bnRpbE1zID0gZGVwcy5ub3coKSArIGRlbGF5TXM7XG4gIGZpcmVHdWFyZHMuc2V0KHRva2VuLmlkLCB7IHVudGlsTXMsIGFsbG93RmlyZUF0RXhwaXJ5IH0pO1xuICBzY2hlZHVsZVRva2VuKHRva2VuLCBkZXBzLCBleHBlY3RlZEdlbmVyYXRpb24sIGRlbGF5TXMsIGFsbG93RmlyZUF0RXhwaXJ5KTtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVGYWxsYmFjayhcbiAgdG9rZW46IEtlZXBhbGl2ZVRva2VuLFxuICBkZXBzOiBUb2tlbldpbmRvd0tlZXBhbGl2ZURlcHMsXG4gIGV4cGVjdGVkR2VuZXJhdGlvbjogbnVtYmVyLFxuKTogdm9pZCB7XG4gIGRlZmVyVG9rZW4odG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbiwgRklWRV9IT1VSU19NUywgdHJ1ZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGluc3BlY3RUb2tlbihcbiAgdG9rZW46IEtlZXBhbGl2ZVRva2VuLFxuICBkZXBzOiBUb2tlbldpbmRvd0tlZXBhbGl2ZURlcHMsXG4gIGV4cGVjdGVkR2VuZXJhdGlvbjogbnVtYmVyLFxuICBhbGxvd0ZpcmU6IGJvb2xlYW4sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgbm93ID0gZGVwcy5ub3coKTtcbiAgY29uc3QgZ3VhcmQgPSBmaXJlR3VhcmRzLmdldCh0b2tlbi5pZCk7XG4gIGlmIChndWFyZCAmJiBndWFyZC51bnRpbE1zID4gbm93KSB7XG4gICAgc2NoZWR1bGVUb2tlbih0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uLCBndWFyZC51bnRpbE1zIC0gbm93LCBndWFyZC5hbGxvd0ZpcmVBdEV4cGlyeSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChndWFyZCkgZmlyZUd1YXJkcy5kZWxldGUodG9rZW4uaWQpO1xuXG4gIGxldCB1c2FnZTogVXNhZ2VSZXNwb25zZTtcbiAgdHJ5IHtcbiAgICB1c2FnZSA9IGF3YWl0IGRlcHMucmVhZFVzYWdlKHRva2VuLmlkKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIud2FybihgdXNhZ2UgbG9va3VwIGZhaWxlZCBmb3IgJHt0b2tlbi5uYW1lfTogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgc2NoZWR1bGVGYWxsYmFjayh0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGdlbmVyYXRpb24gIT09IGV4cGVjdGVkR2VuZXJhdGlvbikgcmV0dXJuO1xuXG4gIGlmICh1c2FnZS5lcnJvcikge1xuICAgIGxvZ2dlci53YXJuKGB1c2FnZSBsb29rdXAgZmFpbGVkIGZvciAke3Rva2VuLm5hbWV9OiAke3VzYWdlLmVycm9yfWApO1xuICAgIHNjaGVkdWxlRmFsbGJhY2sodG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcmVzZXRzQXQgPSB1c2FnZS5maXZlSG91cj8ucmVzZXRzQXQ7XG4gIGlmIChyZXNldHNBdCkge1xuICAgIGNvbnN0IHJlc2V0TXMgPSBEYXRlLnBhcnNlKHJlc2V0c0F0KTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShyZXNldE1zKSkge1xuICAgICAgbG9nZ2VyLndhcm4oYGludmFsaWQgZml2ZS1ob3VyIHJlc2V0IGZvciAke3Rva2VuLm5hbWV9OiAke3Jlc2V0c0F0fWApO1xuICAgICAgc2NoZWR1bGVGYWxsYmFjayh0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5zcGVjdGVkQXQgPSBkZXBzLm5vdygpO1xuICAgIGlmIChyZXNldE1zID4gaW5zcGVjdGVkQXQpIHtcbiAgICAgIGZpcmVHdWFyZHMuZGVsZXRlKHRva2VuLmlkKTtcbiAgICAgIHNjaGVkdWxlVG9rZW4odG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbiwgcmVzZXRNcyAtIGluc3BlY3RlZEF0ICsgUkVTRVRfR1JBQ0VfTVMsIHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8vIOuwnOyCrCDsp4Htm4Qg7ZmV7J247JeQ7ISc64qUIOy6kOyLnOuQnCBudWxsL+qzvOqxsCByZXNldOydhCDrtJDrj4Qg64uk7IucIOuwnOyCrO2VmOyngCDslYrripTri6QuXG4gIGlmICghYWxsb3dGaXJlKSB7XG4gICAgc2NoZWR1bGVGYWxsYmFjayh0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBkZWZlclRva2VuKHRva2VuLCBkZXBzLCBleHBlY3RlZEdlbmVyYXRpb24sIFBPU1RfS0VFUEFMSVZFX1VTQUdFX0RFTEFZX01TLCBmYWxzZSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZGVwcy5kaXNwYXRjaCh7XG4gICAgICBwcm9tcHQ6IFwiUmVwbHkgT0suXCIsXG4gICAgICBtb2RlbDogS0VFUEFMSVZFX01PREVMLFxuICAgICAgZWZmb3J0OiBcImxvd1wiLFxuICAgICAgcHJvamVjdE5hbWU6IEtFRVBBTElWRV9QUk9KRUNUX05BTUUsXG4gICAgICBwcmVmZXJyZWRUb2tlbklkOiB0b2tlbi5pZCxcbiAgICB9KTtcbiAgICBsb2dnZXIuaW5mbyhga2VlcGFsaXZlIHNlbnQgZm9yICR7dG9rZW4ubmFtZX1gKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dnZXIud2Fybihga2VlcGFsaXZlIGZhaWxlZCBmb3IgJHt0b2tlbi5uYW1lfTogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgc2NoZWR1bGVGYWxsYmFjayh0b2tlbiwgZGVwcywgZXhwZWN0ZWRHZW5lcmF0aW9uKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwb3N0RmlyZUd1YXJkID0gZmlyZUd1YXJkcy5nZXQodG9rZW4uaWQpO1xuICBpZiAocG9zdEZpcmVHdWFyZCkge1xuICAgIHNjaGVkdWxlVG9rZW4oXG4gICAgICB0b2tlbixcbiAgICAgIGRlcHMsXG4gICAgICBleHBlY3RlZEdlbmVyYXRpb24sXG4gICAgICBNYXRoLm1heCgwLCBwb3N0RmlyZUd1YXJkLnVudGlsTXMgLSBkZXBzLm5vdygpKSxcbiAgICAgIHBvc3RGaXJlR3VhcmQuYWxsb3dGaXJlQXRFeHBpcnksXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjbGVhclNjaGVkdWxlZFRpbWVycygpOiB2b2lkIHtcbiAgZ2VuZXJhdGlvbisrO1xuICBmb3IgKGNvbnN0IHRva2VuSWQgb2YgdGltZXJzLmtleXMoKSkgY2xlYXJUb2tlblRpbWVyKHRva2VuSWQpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRUb2tlbldpbmRvd0tlZXBhbGl2ZShcbiAgZGVwczogVG9rZW5XaW5kb3dLZWVwYWxpdmVEZXBzID0gZGVmYXVsdERlcHMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY2xlYXJTY2hlZHVsZWRUaW1lcnMoKTtcbiAgaWYgKCFkZXBzLmlzUnVubmVyRW5hYmxlZCgpKSB7XG4gICAgbG9nZ2VyLmluZm8oXCJ0b2tlbiB3aW5kb3cga2VlcGFsaXZlIHJ1bm5lciBkaXNhYmxlZCBmb3IgdGhpcyBpbnN0YW5jZVwiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGRlcHMucmVhZFNldHRpbmcoS0VFUEFMSVZFX1NFVFRJTkdfS0VZKSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgbG9nZ2VyLmluZm8oXCJ0b2tlbiB3aW5kb3cga2VlcGFsaXZlIGRpc2FibGVkXCIpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBleHBlY3RlZEdlbmVyYXRpb24gPSBnZW5lcmF0aW9uO1xuXG4gIGxldCB0b2tlbnM6IEtlZXBhbGl2ZVRva2VuW107XG4gIHRyeSB7XG4gICAgdG9rZW5zID0gYXdhaXQgZGVwcy5maW5kVG9rZW5zKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nZ2VyLndhcm4oYHRva2VuIGRpc2NvdmVyeSBmYWlsZWQ6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZ2VuZXJhdGlvbiAhPT0gZXhwZWN0ZWRHZW5lcmF0aW9uKSByZXR1cm47XG5cbiAgY29uc3QgdGFyZ2V0cyA9IHRva2Vucy5maWx0ZXIoXG4gICAgKHRva2VuKSA9PiB0b2tlbi5hY3RpdmUgJiYgdG9rZW4ucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIgJiYgdG9rZW4ua2VlcGFsaXZlX2VuYWJsZWQsXG4gICk7XG4gIGNvbnN0IHRhcmdldElkcyA9IG5ldyBTZXQodGFyZ2V0cy5tYXAoKHRva2VuKSA9PiB0b2tlbi5pZCkpO1xuICBmb3IgKGNvbnN0IHRva2VuSWQgb2YgZmlyZUd1YXJkcy5rZXlzKCkpIHtcbiAgICBpZiAoIXRhcmdldElkcy5oYXModG9rZW5JZCkpIGZpcmVHdWFyZHMuZGVsZXRlKHRva2VuSWQpO1xuICB9XG4gIGxvZ2dlci5pbmZvKGB0b2tlbiB3aW5kb3cga2VlcGFsaXZlIHNjaGVkdWxpbmcgJHt0YXJnZXRzLmxlbmd0aH0gdG9rZW4ocylgKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwodGFyZ2V0cy5tYXAoKHRva2VuKSA9PiBpbnNwZWN0VG9rZW4odG9rZW4sIGRlcHMsIGV4cGVjdGVkR2VuZXJhdGlvbiwgdHJ1ZSkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2NoZWR1bGVUb2tlbldpbmRvd0tlZXBhbGl2ZShcbiAgZGVwczogVG9rZW5XaW5kb3dLZWVwYWxpdmVEZXBzID0gZGVmYXVsdERlcHMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIHN0YXJ0VG9rZW5XaW5kb3dLZWVwYWxpdmUoZGVwcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdG9wVG9rZW5XaW5kb3dLZWVwYWxpdmUoKTogdm9pZCB7XG4gIGNsZWFyU2No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
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
//#region src/application/setting/setting.constant.ts
|
|
2
|
+
/**
|
|
3
|
+
* keepalive 스케줄러를 실제로 소유할 인스턴스만 켠다. Settings DB 값과 일부러 분리한다 —
|
|
4
|
+
* 같은 DB를 보는 개발자 로컬 인스턴스가 전역 설정을 읽고 함께 발사하면 중복 요청이 된다.
|
|
5
|
+
*/
|
|
6
|
+
const TOKEN_WINDOW_KEEPALIVE_RUNNER_ENV_KEY = "QGRID_TOKEN_WINDOW_KEEPALIVE_ENABLED";
|
|
2
7
|
const SETTING_DEFS = [
|
|
3
8
|
{
|
|
4
9
|
key: "qgrid.tokenWindowKeepaliveEnabled",
|
|
5
10
|
fallback: "true",
|
|
6
11
|
group: "qgrid",
|
|
7
|
-
envKey: "QGRID_TOKEN_WINDOW_KEEPALIVE_ENABLED",
|
|
8
12
|
label: "토큰 윈도우 keepalive",
|
|
9
13
|
kind: "boolean",
|
|
10
14
|
applies: "immediate",
|
|
11
|
-
help: "끄면
|
|
15
|
+
help: "끄면 이 서버에서 선택한 Anthropic 토큰의 5시간 윈도우 자동 유지 요청을 중단합니다"
|
|
12
16
|
},
|
|
13
17
|
{
|
|
14
18
|
key: "slack.enabled",
|
|
@@ -171,6 +175,6 @@ function maskSecret(value) {
|
|
|
171
175
|
return `${value.slice(0, 8)}...${value.slice(-4)}`;
|
|
172
176
|
}
|
|
173
177
|
//#endregion
|
|
174
|
-
export { SETTING_DEFS, findSettingDef, maskSecret, validateSettingValue };
|
|
178
|
+
export { SETTING_DEFS, TOKEN_WINDOW_KEEPALIVE_RUNNER_ENV_KEY, findSettingDef, maskSecret, validateSettingValue };
|
|
175
179
|
|
|
176
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZy5jb25zdGFudC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vc2V0dGluZy9zZXR0aW5nLmNvbnN0YW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog6rSA66asIOqwgOuKpe2VnCDrn7Dtg4DsnoQg7ISk7KCVIOuqqeuhnS5cbiAqXG4gKiDtgqTCt2VudiDsnbTrpoTCt+2DgOyehcK36rKA7Kad7J2EIO2VnCDqs7Psl5Ag66qo7JWEIEFQSSDsmYAgVUkg6rCAIOqwmeydgCDsoJXsnZjrpbwg67O464ukLiDsl6zquLAg7JeG64qUIGVudiDripRcbiAqIO2ZlOuptOyXkOyEnCDrsJTqv4Ag7IiYIOyXhuuLpCDigJQgREIg7KCR7IaNIOygleuztOuCmCDtj6ztirjsspjrn7wg7ISc67KE6rCAIOucqOq4sCDsoITsl5Ag7ZWE7JqU7ZWcIOqwkuuTpOydtOuLpC5cbiAqXG4gKiBgc2V0dGluZ3NgIO2FjOydtOu4lOydgCBgKGtleSwgdmFsdWUpYCDrrLjsnpDsl7Qg7IyN66eMIOuLtOuKlCDqt7jrpofsnbTrnbwoYHNldHRpbmcuZW50aXR5Lmpzb25gKSxcbiAqIFwi7J20IO2CpOqwgCDsoJXsiJjsnbjsp4DCt+uylOychOqwgCDslrzrp4jsnbjsp4DCt+2ZlOuptOyXkCDrrZDrnbzqs6Ag7JO47KeAXCLrpbwg64u07J2EIOqzs+ydtCDrlLDroZwg7ZWE7JqU7ZWY64ukLlxuICog6re4IOuplO2DgOuNsOydtO2EsOqwgCDsl6zquLAg7J6I64ukIOKAlCBEQiDsiqTtgqTrp4jqsIAg7JWE64uI6528IOyVseydtCDslYTripQg7IOB7IiYIOuqqeuhneydtOuLpC5cbiAqL1xuXG5leHBvcnQgdHlwZSBTZXR0aW5nS2luZCA9IFwiYm9vbGVhblwiIHwgXCJpbnRlZ2VyXCIgfCBcIm51bWJlclwiIHwgXCJzdHJpbmdcIiB8IFwic2VjcmV0XCIgfCBcInByZXNldFwiO1xuXG4vKipcbiAqIO2ZlOuptOyXkOyEnCDrrLbslrQg67O07Jes7KSEIOuLqOychC4g7Y+J7Y+J7ZWY6rKMIOuCmOyXtO2VmOuptCDslrTrlJTrpbwg67SQ7JW8IO2VoOyngCDslYwg7IiYIOyXhuuLpC5cbiAqXG4gKiBTbGFjayDsnYAgXCLslrjsoJwg67O064K86rmMXCIoc2xhY2sp7JmAIFwi7Ja065SU66GcIOuztOuCvOq5jFwiKHNsYWNrQ29ubmVjdGlvbinrpbwg64KY64iI64ukIOKAlCDslZ7snYAg7Jq07JiBXG4gKiDspJEg7J6Q7KO8IOunjOyngOqzoCDrkqTripQg7ZWcIOuyiCDrp57stpTrqbQg64Gd7J206528IOyImOuqheydtCDri6TrpbTri6QuXG4gKi9cbmV4cG9ydCB0eXBlIFNldHRpbmdHcm91cCA9IFwicWdyaWRcIiB8IFwic2xhY2tcIiB8IFwic2xhY2tDb25uZWN0aW9uXCI7XG5cbmV4cG9ydCB0eXBlIFNldHRpbmdEZWYgPSB7XG4gIGtleTogc3RyaW5nO1xuICBncm91cDogU2V0dGluZ0dyb3VwO1xuICBlbnZLZXk6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAga2luZDogU2V0dGluZ0tpbmQ7XG4gIC8qKiDsoIHsmqkg7Iuc7KCQLiDrtoDtjIUg7IucIO2VnCDrsojrp4wg7J297Z6I64qUIOqwkuydgCDsnqzsi5zsnpHsnbQg7ZWE7JqU7ZWY64ukLiAqL1xuICBhcHBsaWVzOiBcImltbWVkaWF0ZVwiIHwgXCJyZXN0YXJ0XCI7XG4gIG1pbj86IG51bWJlcjtcbiAgbWF4PzogbnVtYmVyO1xuICAvKiogYHByZXNldGAg7KKF66WY7JeQ7IScIOqzoOulvCDsiJgg7J6I64qUIOqwki4g7J20IOuqqeuhnSDrsJbsnZgg6rCS7J2AIOyggOyepeuQmOyngCDslYrripTri6QuICovXG4gIHByZXNldHM/OiBudW1iZXJbXTtcbiAgLyoqXG4gICAqIOyggOyepeqwkuuPhCBlbnYg64+EIOyXhuydhCDrlYwg7Iuk7KCc66GcIOyggeyaqeuQmOuKlCDqsJIuIO2ZlOuptOydhCDruYTsm4zrkZDrqbQgXCLshKTsoJUg7JWIIOuQqFwi7Jy866GcIOydve2eiOyngOunjFxuICAgKiDsi6TsoJzroZzripQg7J20IOqwkuydtCDrj4zqs6Ag7J6I64ukIOKAlCDshozruYTsspjsnZgg6riw67O46rCS6rO8IOuwmOuTnOyLnCDqsJnslYTslbwg7ZWc64ukLlxuICAgKi9cbiAgZmFsbGJhY2s6IHN0cmluZztcbiAgaGVscD86IHN0cmluZztcbn07XG5cbmV4cG9ydCBjb25zdCBTRVRUSU5HX0RFRlM6IFNldHRpbmdEZWZbXSA9IFtcbiAge1xuICAgIGtleTogXCJxZ3JpZC50b2tlbldpbmRvd0tlZXBhbGl2ZUVuYWJsZWRcIixcbiAgICBmYWxsYmFjazogXCJ0cnVlXCIsXG4gICAgZ3JvdXA6IFwicWdyaWRcIixcbiAgICBlbnZLZXk6IFwiUUdSSURfVE9LRU5fV0lORE9XX0tFRVBBTElWRV9FTkFCTEVEXCIsXG4gICAgbGFiZWw6IFwi7Yag7YGwIOyciOuPhOyasCBrZWVwYWxpdmVcIixcbiAgICBraW5kOiBcImJvb2xlYW5cIixcbiAgICBhcHBsaWVzOiBcImltbWVkaWF0ZVwiLFxuICAgIGhlbHA6IFwi64GE66m0IO2ZnOyEsSBBbnRocm9waWMg7Yag7YGw7J2YIDXsi5zqsIQg7JyI64+E7JqwIOyekOuPmSDsnKDsp4Ag7JqU7LKt7J2EIOykkeuLqO2VqeuLiOuLpFwiLFxuICB9LFxuICB7XG4gICAga2V5OiBcInNsYWNrLmVuYWJsZWRcIixcbiAgICBmYWxsYmFjazogXCJ0cnVlXCIsXG4gICAgZ3JvdXA6IFwic2xhY2tcIixcbiAgICBlbnZLZXk6IFwiU0xBQ0tfRU5BQkxFRFwiLFxuICAgIGxhYmVsOiBcIlNsYWNrIOyVjOumvFwiLFxuICAgIGtpbmQ6IFwiYm9vbGVhblwiLFxuICAgIGFwcGxpZXM6IFwiaW1tZWRpYXRlXCIsXG4gICAgaGVscDogXCLsl7DtnLTsspjrn7wg6rec7LmZ7Jy866GcIOyeoeydhCDsiJgg7JeG64qUIOq4sOqwhOyXkCDrgZXri4jri6QuIOyEnOu5hOyKpCDsoJXsp4DquIkg7J6l7JWgIOyVjOumvOydgCDqurzrj4Qg7KCE64us65Cp64uI64ukXCIsXG4gIH0sXG4gIHtcbiAgICBrZXk6IFwic2xhY2sucmVtaW5kZXJzRW5hYmxlZFwiLFxuICAgIGZhbGxiYWNrOiBcInRydWVcIixcbiAgICBncm91cDogXCJzbGFja1wiLFxuICAgIGVudktleTogXCJTTEFDS19SRU1JTkRFUlNfRU5BQkxFRFwiLFxuICAgIGxhYmVsOiBcIuunjOujjCDslYzrprwg67CY67O1XCIsXG4gICAga2luZDogXCJib29sZWFuXCIsXG4gICAgYXBwbGllczogXCJpbW1lZGlhdGVcIixcbiAgICBoZWxwOiBcIuuBhOuptCDrsJjrs7Xrp4wg66mI7LaU6rOgIOunjOujjCDsiJzqsITsnZgg7JWM66a87J2AIOq3uOuMgOuhnCDqsJHri4jri6RcIixcbiAgfSxcbiAge1xuICAgIGtleTogXCJzbGFjay5leHBpcnlSZW1pbmRlck1pbnV0ZXNcIixcbiAgICBmYWxsYmFjazogXCI2MFwiLFxuICAgIGdyb3VwOiBcInNsYWNrXCIsXG4gICAgZW52S2V5OiBcIlNMQUNLX0VYUElSWV9SRU1JTkRFUl9JTlRFUlZBTF9NSU5VVEVTXCIsXG4gICAgbGFiZWw6IFwi67CY67O1IOyjvOq4sFwiLFxuICAgIGtpbmQ6IFwicHJlc2V0XCIsXG4gICAgYXBwbGllczogXCJpbW1lZGlhdGVcIixcbiAgICAvLyDsnpDsnKAg7J6F66ClIOuMgOyLoCDqs6DsoJUg7ISg7YOd7KeA66W8IOyTtOuLpCDigJQgXCLslrzrp4jrgpgg7J6Q7KO8IOyerOy0ie2VoOq5jFwi65287IScIDHrtoQg64uo7JyEIOygleuwgOuPhOqwgFxuICAgIC8vIOydmOuvuCDsl4bqs6AsIOyemOuquyDrhKPsnLzrqbQg7LGE64SQ7J20IOyLnOuBhOufrOybjOynhOuLpC4g64GE64qUIOqyg+ydgCByZW1pbmRlcnNFbmFibGVkIOqwgCDrp6HripTri6QuXG4gICAgcHJlc2V0czogWzEwLCAzMCwgNjAsIDE4MF0sXG4gICAgaGVscDogXCLsnqzroZzqt7jsnbjsnbQg7ZWE7JqU7ZWcIO2GoO2BsOydtCDrgqjslYQg7J6I64qUIOuPmeyViCDsnbQg7KO86riw66GcIOuLpOyLnCDslYzrpr3ri4jri6RcIixcbiAgfSxcbiAge1xuICAgIGtleTogXCJzbGFjay5xdWlldEZyb21Ib3VyXCIsXG4gICAgZmFsbGJhY2s6IFwiMjBcIixcbiAgICBncm91cDogXCJzbGFja1wiLFxuICAgIGVudktleTogXCJTTEFDS19RVUlFVF9GUk9NX0hPVVJcIixcbiAgICBsYWJlbDogXCLsobDsmqkg7Iuc6rCEIOyLnOyekVwiLFxuICAgIGtpbmQ6IFwiaW50ZWdlclwiLFxuICAgIGFwcGxpZXM6IFwiaW1tZWRpYXRlXCIsXG4gICAgbWluOiAwLFxuICAgIG1heDogMjMsXG4gICAgaGVscDogXCLsnbQg7Iuc6rCB67aA7YSwIOyVjOumrOyngCDslYrsirXri4jri6QgKO2VnOq1rSDsi5zqsIQpXCIsXG4gIH0sXG4gIHtcbiAgICBrZXk6IFwic2xhY2sucXVpZXRVbnRpbEhvdXJcIixcbiAgICBmYWxsYmFjazogXCI4XCIsXG4gICAgZ3JvdXA6IFwic2xhY2tcIixcbiAgICBlbnZLZXk6IFwiU0xBQ0tfUVVJRVRfVU5USUxfSE9VUlwiLFxuICAgIGxhYmVsOiBcIuyhsOyaqSDsi5zqsIQg7KKF66OMXCIsXG4gICAga2luZDogXCJpbnRlZ2VyXCIsXG4gICAgYXBwbGllczogXCJpbW1lZGlhdGVcIixcbiAgICBtaW46IDAsXG4gICAgbWF4OiAyMyxcbiAgICBoZWxwOiBcIuydtCDsi5zqsIHrtoDthLAg64uk7IucIOyVjOumveuLiOuLpC4g7Iuc7J6R67O064ukIOu5oOultOuptCDsnpDsoJXsnYQg64SY64qUIOq1rOqwhOydtCDrkKnri4jri6RcIixcbiAgfSxcbiAge1xuICAgIGtleTogXCJzbGFjay5ub3RpZnlPbldlZWtlbmRzXCIsXG4gICAgZmFsbGJhY2s6IFwiZmFsc2VcIixcbiAgICBncm91cDogXCJzbGFja1wiLFxuICAgIGVudktleTogXCJTTEFDS19OT1RJRllfT05fV0VFS0VORFNcIixcbiAgICBsYWJlbDogXCLso7zrp5Dsl5Drj4Qg7JWM66a8XCIsXG4gICAga2luZDogXCJib29sZWFuXCIsXG4gICAgYXBwbGllczogXCJpbW1lZGlhdGVcIixcbiAgICBoZWxwOiBcIuy8nOuptCDso7zrp5Dsl5Drj4Qg7JyE7J2YIOyhsOyaqSDsi5zqsIQg6rec7LmZ66eMIOyggeyaqeuQqeuLiOuLpFwiLFxuICB9LFxuICB7XG4gICAga2V5OiBcInNsYWNrLmNoYW5uZWxJZFwiLFxuICAgIGZhbGxiYWNrOiBcIlwiLFxuICAgIGdyb3VwOiBcInNsYWNrQ29ubmVjdGlvblwiLFxuICAgIGVudktleTogXCJTTEFDS19DSEFOTkVMX0lEXCIsXG4gICAgbGFiZWw6IFwiU2xhY2sg7LGE64SQIElEXCIsXG4gICAga2luZDogXCJzdHJpbmdcIixcbiAgICBhcHBsaWVzOiBcImltbWVkaWF0ZVwiLFxuICAgIGhlbHA6IFwi7IKs7Jqp7J6QIElEKFUuLi4p66W8IOuEo+ycvOuptCDqt7gg7IKs656MIERNIOycvOuhnCDqsJHri4jri6RcIixcbiAgfSxcbiAge1xuICAgIGtleTogXCJzbGFjay51c2VyTWFwXCIsXG4gICAgZmFsbGJhY2s6IFwiXCIsXG4gICAgZ3JvdXA6IFwic2xhY2tDb25uZWN0aW9uXCIsXG4gICAgZW52S2V5OiBcIlNMQUNLX1VTRVJfTUFQXCIsXG4gICAgbGFiZWw6IFwiU2xhY2sg7IKs7Jqp7J6QIOunpO2VkVwiLFxuICAgIGtpbmQ6IFwic3RyaW5nXCIsXG4gICAgYXBwbGllczogXCJpbW1lZGlhdGVcIixcbiAgICBoZWxwOiBcIu2GoO2BsOuqhTpTbGFja1VzZXJJZCDrpbwg7Im87ZGc66GcLiDqs7Xsmqkg6rOE7KCV7J2AIOuEo+yngCDslYrsirXri4jri6RcIixcbiAgfSxcbiAge1xuICAgIGtleTogXCJzbGFjay5ib3RUb2tlblwiLFxuICAgIGZhbGxiYWNrOiBcIlwiLFxuICAgIGdyb3VwOiBcInNsYWNrQ29ubmVjdGlvblwiLFxuICAgIGVudktleTogXCJTTEFDS19CT1RfVE9LRU5cIixcbiAgICBsYWJlbDogXCJTbGFjayDrtIcg7Yag7YGwXCIsXG4gICAga2luZDogXCJzZWNyZXRcIixcbiAgICBhcHBsaWVzOiBcImltbWVkaWF0ZVwiLFxuICB9LFxuXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTZXR0aW5nRGVmKGtleTogc3RyaW5nKTogU2V0dGluZ0RlZiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBTRVRUSU5HX0RFRlMuZmluZCgoZCkgPT4gZC5rZXkgPT09IGtleSk7XG59XG5cbi8qKiDsoIDsnqUg7KCEIOqygOymnS4g7J6Y66q765CcIOqwkuydtCDrk6TslrTqsIDrqbQg65+w7YOA7J6E7JeQ7IScIOyhsOyaqe2eiCDquLDrs7jqsJLsnLzroZwg65ao7Ja07KC4IOybkOyduOydhCDssL7quLAg7Ja066C164ukLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2V0dGluZ1ZhbHVlKFxuICBkZWY6IFNldHRpbmdEZWYsXG4gIHJhdzogc3RyaW5nLFxuKTogeyBvazogdHJ1ZTsgdmFsdWU6IHN0cmluZyB9IHwgeyBvazogZmFsc2U7IGVycm9yOiBzdHJpbmcgfSB7XG4gIGNvbnN0IHRyaW1tZWQgPSByYXcudHJpbSgpO1xuXG4gIGlmIChkZWYua2luZCA9PT0gXCJib29sZWFuXCIpIHtcbiAgICBpZiAoIVtcInRydWVcIiwgXCJmYWxzZVwiXS5pbmNsdWRlcyh0cmltbWVkKSkgcmV0dXJuIHsgb2s6IGZhbHNlLCBlcnJvcjogXCJ0cnVlIOuYkOuKlCBmYWxzZVwiIH07XG4gICAgcmV0dXJuIHsgb2s6IHRydWUsIHZhbHVlOiB0cmltbWVkIH07XG4gIH1cblxuICBpZiAoZGVmLmtpbmQgPT09IFwicHJlc2V0XCIpIHtcbiAgICAvLyDtmZTrqbTsnYAg67KE7Yq866eMIOyjvOyngOunjCBBUEkg64qUIOyVhOustCDqsJLsnbTrgpgg67Cb7J2EIOyImCDsnojri6QuIOuqqeuhnSDrsJbsnZgg6rCS7J20IOuTpOyWtOyYpOuptFxuICAgIC8vIO2ZlOuptOyXkOyEnCDslYTrrLQg67KE7Yq864+EIOyEoO2DneuPvCDrs7TsnbTsp4Ag7JWK7JWEIFwi7JmcIOyViCDrsJTrgIzsp4BcIuqwgCDrkJzri6QuXG4gICAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHRyaW1tZWQpO1xuICAgIGlmICghZGVmLnByZXNldHM/LmluY2x1ZGVzKHBhcnNlZCkpIHtcbiAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgZXJyb3I6IGAke2RlZi5wcmVzZXRzPy5qb2luKFwiLCBcIikgPz8gXCJcIn0g7KSRIO2VmOuCmOyXrOyVvCDtlanri4jri6RgIH07XG4gICAgfVxuICAgIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZTogU3RyaW5nKHBhcnNlZCkgfTtcbiAgfVxuXG4gIGlmIChkZWYua2luZCA9PT0gXCJpbnRlZ2VyXCIgfHwgZGVmLmtpbmQgPT09IFwibnVtYmVyXCIpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodHJpbW1lZCk7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSkgcmV0dXJuIHsgb2s6IGZhbHNlLCBlcnJvcjogXCLsiKvsnpDrpbwg7J6F66Cl7ZWY7IS47JqUXCIgfTtcbiAgICBpZiAoZGVmLmtpbmQgPT09IFwiaW50ZWdlclwiICYmICFOdW1iZXIuaXNJbnRlZ2VyKHBhcnNlZCkpIHtcbiAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgZXJyb3I6IFwi7KCV7IiY66W8IOyeheugpe2VmOyEuOyalFwiIH07XG4gICAgfVxuICAgIGlmIChkZWYubWluICE9PSB1bmRlZmluZWQgJiYgcGFyc2VkIDwgZGVmLm1pbikge1xuICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBlcnJvcjogYCR7ZGVmLm1pbn0g7J207IOB7J207Ja07JW8IO2VqeuLiOuLpGAgfTtcbiAgICB9XG4gICAgaWYgKGRlZi5tYXggIT09IHVuZGVmaW5lZCAmJiBwYXJzZWQgPiBkZWYubWF4KSB7XG4gICAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiBgJHtkZWYubWF4fSDsnbTtlZjsl6zslbwg7ZWp64uI64ukYCB9O1xuICAgIH1cbiAgICByZXR1cm4geyBvazogdHJ1ZSwgdmFsdWU6IFN0cmluZyhwYXJzZWQpIH07XG4gIH1cblxuICByZXR1cm4geyBvazogdHJ1ZSwgdmFsdWU6IHRyaW1tZWQgfTtcbn1cblxuLyoqIO2ZlOuptOyXkCDqt7jrjIDroZwg64K066Ck67O064K066m0IOyViCDrkJjripQg6rCSLiDslZ7rkqTrp4wg64Ko6ri064ukLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hc2tTZWNyZXQodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICh2YWx1ZS5sZW5ndGggPD0gMTIpIHJldHVybiBcIioqKlwiO1xuICByZXR1cm4gYCR7dmFsdWUuc2xpY2UoMCwgOCl9Li4uJHt2YWx1ZS5zbGljZSgtNCl9YDtcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQXlDQSxNQUFhLGVBQTZCO0NBQ3hDO0VBQ0UsS0FBSztFQUNMLFVBQVU7RUFDVixPQUFPO0VBQ1AsUUFBUTtFQUNSLE9BQU87RUFDUCxNQUFNO0VBQ04sU0FBUztFQUNULE1BQU07Q0FDUjtDQUNBO0VBQ0UsS0FBSztFQUNMLFVBQVU7RUFDVixPQUFPO0VBQ1AsUUFBUTtFQUNSLE9BQU87RUFDUCxNQUFNO0VBQ04sU0FBUztFQUNULE1BQU07Q0FDUjtDQUNBO0VBQ0UsS0FBSztFQUNMLFVBQVU7RUFDVixPQUFPO0VBQ1AsUUFBUTtFQUNSLE9BQU87RUFDUCxNQUFNO0VBQ04sU0FBUztFQUNULE1BQU07Q0FDUjtDQUNBO0VBQ0UsS0FBSztFQUNMLFVBQVU7RUFDVixPQUFPO0VBQ1AsUUFBUTtFQUNSLE9BQU87RUFDUCxNQUFNO0VBQ04sU0FBUztFQUdULFNBQVM7R0FBQztHQUFJO0dBQUk7R0FBSTtFQUFHO0VBQ3pCLE1BQU07Q0FDUjtDQUNBO0VBQ0UsS0FBSztFQUNMLFVBQVU7RUFDVixPQUFPO0VBQ1AsUUFBUTtFQUNSLE9BQU87RUFDUCxNQUFNO0VBQ04sU0FBUztFQUNULEtBQUs7RUFDTCxLQUFLO0VBQ0ws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
|
|
180
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZy5jb25zdGFudC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vc2V0dGluZy9zZXR0aW5nLmNvbnN0YW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog6rSA66asIOqwgOuKpe2VnCDrn7Dtg4DsnoQg7ISk7KCVIOuqqeuhnS5cbiAqXG4gKiDtgqTCt2VudiDsnbTrpoTCt+2DgOyehcK36rKA7Kad7J2EIO2VnCDqs7Psl5Ag66qo7JWEIEFQSSDsmYAgVUkg6rCAIOqwmeydgCDsoJXsnZjrpbwg67O464ukLiDsl6zquLAg7JeG64qUIGVudiDripRcbiAqIO2ZlOuptOyXkOyEnCDrsJTqv4Ag7IiYIOyXhuuLpCDigJQgREIg7KCR7IaNIOygleuztOuCmCDtj6ztirjsspjrn7wg7ISc67KE6rCAIOucqOq4sCDsoITsl5Ag7ZWE7JqU7ZWcIOqwkuuTpOydtOuLpC5cbiAqXG4gKiBgc2V0dGluZ3NgIO2FjOydtOu4lOydgCBgKGtleSwgdmFsdWUpYCDrrLjsnpDsl7Qg7IyN66eMIOuLtOuKlCDqt7jrpofsnbTrnbwoYHNldHRpbmcuZW50aXR5Lmpzb25gKSxcbiAqIFwi7J20IO2CpOqwgCDsoJXsiJjsnbjsp4DCt+uylOychOqwgCDslrzrp4jsnbjsp4DCt+2ZlOuptOyXkCDrrZDrnbzqs6Ag7JO47KeAXCLrpbwg64u07J2EIOqzs+ydtCDrlLDroZwg7ZWE7JqU7ZWY64ukLlxuICog6re4IOuplO2DgOuNsOydtO2EsOqwgCDsl6zquLAg7J6I64ukIOKAlCBEQiDsiqTtgqTrp4jqsIAg7JWE64uI6528IOyVseydtCDslYTripQg7IOB7IiYIOuqqeuhneydtOuLpC5cbiAqL1xuXG5leHBvcnQgdHlwZSBTZXR0aW5nS2luZCA9IFwiYm9vbGVhblwiIHwgXCJpbnRlZ2VyXCIgfCBcIm51bWJlclwiIHwgXCJzdHJpbmdcIiB8IFwic2VjcmV0XCIgfCBcInByZXNldFwiO1xuXG4vKipcbiAqIO2ZlOuptOyXkOyEnCDrrLbslrQg67O07Jes7KSEIOuLqOychC4g7Y+J7Y+J7ZWY6rKMIOuCmOyXtO2VmOuptCDslrTrlJTrpbwg67SQ7JW8IO2VoOyngCDslYwg7IiYIOyXhuuLpC5cbiAqXG4gKiBTbGFjayDsnYAgXCLslrjsoJwg67O064K86rmMXCIoc2xhY2sp7JmAIFwi7Ja065SU66GcIOuztOuCvOq5jFwiKHNsYWNrQ29ubmVjdGlvbinrpbwg64KY64iI64ukIOKAlCDslZ7snYAg7Jq07JiBXG4gKiDspJEg7J6Q7KO8IOunjOyngOqzoCDrkqTripQg7ZWcIOuyiCDrp57stpTrqbQg64Gd7J206528IOyImOuqheydtCDri6TrpbTri6QuXG4gKi9cbmV4cG9ydCB0eXBlIFNldHRpbmdHcm91cCA9IFwicWdyaWRcIiB8IFwic2xhY2tcIiB8IFwic2xhY2tDb25uZWN0aW9uXCI7XG5cbmV4cG9ydCB0eXBlIFNldHRpbmdEZWYgPSB7XG4gIGtleTogc3RyaW5nO1xuICBncm91cDogU2V0dGluZ0dyb3VwO1xuICBlbnZLZXk/OiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGtpbmQ6IFNldHRpbmdLaW5kO1xuICAvKiog7KCB7JqpIOyLnOygkC4g67aA7YyFIOyLnCDtlZwg67KI66eMIOydve2eiOuKlCDqsJLsnYAg7J6s7Iuc7J6R7J20IO2VhOyalO2VmOuLpC4gKi9cbiAgYXBwbGllczogXCJpbW1lZGlhdGVcIiB8IFwicmVzdGFydFwiO1xuICBtaW4/OiBudW1iZXI7XG4gIG1heD86IG51bWJlcjtcbiAgLyoqIGBwcmVzZXRgIOyiheulmOyXkOyEnCDqs6Drpbwg7IiYIOyeiOuKlCDqsJIuIOydtCDrqqnroZ0g67CW7J2YIOqwkuydgCDsoIDsnqXrkJjsp4Ag7JWK64qU64ukLiAqL1xuICBwcmVzZXRzPzogbnVtYmVyW107XG4gIC8qKlxuICAgKiDsoIDsnqXqsJLrj4QgZW52IOuPhCDsl4bsnYQg65WMIOyLpOygnOuhnCDsoIHsmqnrkJjripQg6rCSLiDtmZTrqbTsnYQg67mE7JuM65GQ66m0IFwi7ISk7KCVIOyViCDrkKhcIuycvOuhnCDsnb3tnojsp4Drp4xcbiAgICog7Iuk7KCc66Gc64qUIOydtCDqsJLsnbQg64+M6rOgIOyeiOuLpCDigJQg7IaM67mE7LKY7J2YIOq4sOuzuOqwkuqzvCDrsJjrk5zsi5wg6rCZ7JWE7JW8IO2VnOuLpC5cbiAgICovXG4gIGZhbGxiYWNrOiBzdHJpbmc7XG4gIGhlbHA/OiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIGtlZXBhbGl2ZSDsiqTsvIDspITrn6zrpbwg7Iuk7KCc66GcIOyGjOycoO2VoCDsnbjsiqTthLTsiqTrp4wg7Lyg64ukLiBTZXR0aW5ncyBEQiDqsJLqs7wg7J2867aA65+sIOu2hOumrO2VnOuLpCDigJRcbiAqIOqwmeydgCBEQuulvCDrs7TripQg6rCc67Cc7J6QIOuhnOy7rCDsnbjsiqTthLTsiqTqsIAg7KCE7JetIOyEpOygleydhCDsnb3qs6Ag7ZWo6ruYIOuwnOyCrO2VmOuptCDspJHrs7Ug7JqU7LKt7J20IOuQnOuLpC5cbiAqL1xuZXhwb3J0IGNvbnN0IFRPS0VOX1dJTkRPV19LRUVQQUxJVkVfUlVOTkVSX0VOVl9LRVkgPSBcIlFHUklEX1RPS0VOX1dJTkRPV19LRUVQQUxJVkVfRU5BQkxFRFwiO1xuXG5leHBvcnQgY29uc3QgU0VUVElOR19ERUZTOiBTZXR0aW5nRGVmW10gPSBbXG4gIHtcbiAgICBrZXk6IFwicWdyaWQudG9rZW5XaW5kb3dLZWVwYWxpdmVFbmFibGVkXCIsXG4gICAgZmFsbGJhY2s6IFwidHJ1ZVwiLFxuICAgIGdyb3VwOiBcInFncmlkXCIsXG4gICAgbGFiZWw6IFwi7Yag7YGwIOyciOuPhOyasCBrZWVwYWxpdmVcIixcbiAgICBraW5kOiBcImJvb2xlYW5cIixcbiAgICBhcHBsaWVzOiBcImltbWVkaWF0ZVwiLFxuICAgIGhlbHA6IFwi64GE66m0IOydtCDshJzrsoTsl5DshJwg7ISg7YOd7ZWcIEFudGhyb3BpYyDthqDtgbDsnZggNeyLnOqwhCDsnIjrj4TsmrAg7J6Q64+ZIOycoOyngCDsmpTssq3snYQg7KSR64uo7ZWp64uI64ukXCIsXG4gIH0sXG4gIHtcbiAgICBrZXk6IFwic2xhY2suZW5hYmxlZFwiLFxuICAgIGZhbGxiYWNrOiBcInRydWVcIixcbiAgICBncm91cDogXCJzbGFja1wiLFxuICAgIGVudktleTogXCJTTEFDS19FTkFCTEVEXCIsXG4gICAgbGFiZWw6IFwiU2xhY2sg7JWM66a8XCIsXG4gICAga2luZDogXCJib29sZWFuXCIsXG4gICAgYXBwbGllczogXCJpbW1lZGlhdGVcIixcbiAgICBoZWxwOiBcIuyXsO2ctOyymOufvCDqt5zsuZnsnLzroZwg7J6h7J2EIOyImCDsl4bripQg6riw6rCE7JeQIOuBleuLiOuLpC4g7ISc67mE7IqkIOygleyngOq4iSDsnqXslaAg7JWM66a87J2AIOq6vOuPhCDsoITri6zrkKnri4jri6RcIixcbiAgfSxcbiAge1xuICAgIGtleTogXCJzbGFjay5yZW1pbmRlcnNFbmFibGVkXCIsXG4gICAgZmFsbGJhY2s6IFwidHJ1ZVwiLFxuICAgIGdyb3VwOiBcInNsYWNrXCIsXG4gICAgZW52S2V5OiBcIlNMQUNLX1JFTUlOREVSU19FTkFCTEVEXCIsXG4gICAgbGFiZWw6IFwi66eM66OMIOyVjOumvCDrsJjrs7VcIixcbiAgICBraW5kOiBcImJvb2xlYW5cIixcbiAgICBhcHBsaWVzOiBcImltbWVkaWF0ZVwiLFxuICAgIGhlbHA6IFwi64GE66m0IOuwmOuzteunjCDrqYjstpTqs6Ag66eM66OMIOyInOqwhOydmCDslYzrprzsnYAg6re464yA66GcIOqwkeuLiOuLpFwiLFxuICB9LFxuICB7XG4gICAga2V5OiBcInNsYWNrLmV4cGlyeVJlbWluZGVyTWludXRlc1wiLFxuICAgIGZhbGxiYWNrOiBcIjYwXCIsXG4gICAgZ3JvdXA6IFwic2xhY2tcIixcbiAgICBlbnZLZXk6IFwiU0xBQ0tfRVhQSVJZX1JFTUlOREVSX0lOVEVSVkFMX01JTlVURVNcIixcbiAgICBsYWJlbDogXCLrsJjrs7Ug7KO86riwXCIsXG4gICAga2luZDogXCJwcmVzZXRcIixcbiAgICBhcHBsaWVzOiBcImltbWVkaWF0ZVwiLFxuICAgIC8vIOyekOycoCDsnoXroKUg64yA7IugIOqzoOyglSDshKDtg53sp4Drpbwg7JO064ukIOKAlCBcIuyWvOuniOuCmCDsnpDso7wg7J6s7LSJ7ZWg6rmMXCLrnbzshJwgMeu2hCDri6jsnIQg7KCV67CA64+E6rCAXG4gICAgLy8g7J2Y66+4IOyXhuqzoCwg7J6Y66q7IOuEo+ycvOuptCDssYTrhJDsnbQg7Iuc64GE65+s7JuM7KeE64ukLiDrgYTripQg6rKD7J2AIHJlbWluZGVyc0VuYWJsZWQg6rCAIOunoeuKlOuLpC5cbiAgICBwcmVzZXRzOiBbMTAsIDMwLCA2MCwgMTgwXSxcbiAgICBoZWxwOiBcIuyerOuhnOq3uOyduOydtCDtlYTsmpTtlZwg7Yag7YGw7J20IOuCqOyVhCDsnojripQg64+Z7JWIIOydtCDso7zquLDroZwg64uk7IucIOyVjOumveuLiOuLpFwiLFxuICB9LFxuICB7XG4gICAga2V5OiBcInNsYWNrLnF1aWV0RnJvbUhvdXJcIixcbiAgICBmYWxsYmFjazogXCIyMFwiLFxuICAgIGdyb3VwOiBcInNsYWNrXCIsXG4gICAgZW52S2V5OiBcIlNMQUNLX1FVSUVUX0ZST01fSE9VUlwiLFxuICAgIGxhYmVsOiBcIuyhsOyaqSDsi5zqsIQg7Iuc7J6RXCIsXG4gICAga2luZDogXCJpbnRlZ2VyXCIsXG4gICAgYXBwbGllczogXCJpbW1lZGlhdGVcIixcbiAgICBtaW46IDAsXG4gICAgbWF4OiAyMyxcbiAgICBoZWxwOiBcIuydtCDsi5zqsIHrtoDthLAg7JWM66as7KeAIOyViuyKteuLiOuLpCAo7ZWc6rWtIOyLnOqwhClcIixcbiAgfSxcbiAge1xuICAgIGtleTogXCJzbGFjay5xdWlldFVudGlsSG91clwiLFxuICAgIGZhbGxiYWNrOiBcIjhcIixcbiAgICBncm91cDogXCJzbGFja1wiLFxuICAgIGVudktleTogXCJTTEFDS19RVUlFVF9VTlRJTF9IT1VSXCIsXG4gICAgbGFiZWw6IFwi7KGw7JqpIOyLnOqwhCDsooXro4xcIixcbiAgICBraW5kOiBcImludGVnZXJcIixcbiAgICBhcHBsaWVzOiBcImltbWVkaWF0ZVwiLFxuICAgIG1pbjogMCxcbiAgICBtYXg6IDIzLFxuICAgIGhlbHA6IFwi7J20IOyLnOqwgeu2gO2EsCDri6Tsi5wg7JWM66a964uI64ukLiDsi5zsnpHrs7Tri6Qg67mg66W066m0IOyekOygleydhCDrhJjripQg6rWs6rCE7J20IOuQqeuLiOuLpFwiLFxuICB9LFxuICB7XG4gICAga2V5OiBcInNsYWNrLm5vdGlmeU9uV2Vla2VuZHNcIixcbiAgICBmYWxsYmFjazogXCJmYWxzZVwiLFxuICAgIGdyb3VwOiBcInNsYWNrXCIsXG4gICAgZW52S2V5OiBcIlNMQUNLX05PVElGWV9PTl9XRUVLRU5EU1wiLFxuICAgIGxhYmVsOiBcIuyjvOunkOyXkOuPhCDslYzrprxcIixcbiAgICBraW5kOiBcImJvb2xlYW5cIixcbiAgICBhcHBsaWVzOiBcImltbWVkaWF0ZVwiLFxuICAgIGhlbHA6IFwi7Lyc66m0IOyjvOunkOyXkOuPhCDsnITsnZgg7KGw7JqpIOyLnOqwhCDqt5zsuZnrp4wg7KCB7Jqp65Cp64uI64ukXCIsXG4gIH0sXG4gIHtcbiAgICBrZXk6IFwic2xhY2suY2hhbm5lbElkXCIsXG4gICAgZmFsbGJhY2s6IFwiXCIsXG4gICAgZ3JvdXA6IFwic2xhY2tDb25uZWN0aW9uXCIsXG4gICAgZW52S2V5OiBcIlNMQUNLX0NIQU5ORUxfSURcIixcbiAgICBsYWJlbDogXCJTbGFjayDssYTrhJAgSURcIixcbiAgICBraW5kOiBcInN0cmluZ1wiLFxuICAgIGFwcGxpZXM6IFwiaW1tZWRpYXRlXCIsXG4gICAgaGVscDogXCLsgqzsmqnsnpAgSUQoVS4uLinrpbwg64Sj7Jy866m0IOq3uCDsgqzrnowgRE0g7Jy866GcIOqwkeuLiOuLpFwiLFxuICB9LFxuICB7XG4gICAga2V5OiBcInNsYWNrLnVzZXJNYXBcIixcbiAgICBmYWxsYmFjazogXCJcIixcbiAgICBncm91cDogXCJzbGFja0Nvbm5lY3Rpb25cIixcbiAgICBlbnZLZXk6IFwiU0xBQ0tfVVNFUl9NQVBcIixcbiAgICBsYWJlbDogXCJTbGFjayDsgqzsmqnsnpAg66ek7ZWRXCIsXG4gICAga2luZDogXCJzdHJpbmdcIixcbiAgICBhcHBsaWVzOiBcImltbWVkaWF0ZVwiLFxuICAgIGhlbHA6IFwi7Yag7YGw66qFOlNsYWNrVXNlcklkIOulvCDsibztkZzroZwuIOqzteyaqSDqs4TsoJXsnYAg64Sj7KeAIOyViuyKteuLiOuLpFwiLFxuICB9LFxuICB7XG4gICAga2V5OiBcInNsYWNrLmJvdFRva2VuXCIsXG4gICAgZmFsbGJhY2s6IFwiXCIsXG4gICAgZ3JvdXA6IFwic2xhY2tDb25uZWN0aW9uXCIsXG4gICAgZW52S2V5OiBcIlNMQUNLX0JPVF9UT0tFTlwiLFxuICAgIGxhYmVsOiBcIlNsYWNrIOu0hyDthqDtgbBcIixcbiAgICBraW5kOiBcInNlY3JldFwiLFxuICAgIGFwcGxpZXM6IFwiaW1tZWRpYXRlXCIsXG4gIH0sXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gZmluZFNldHRpbmdEZWYoa2V5OiBzdHJpbmcpOiBTZXR0aW5nRGVmIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIFNFVFRJTkdfREVGUy5maW5kKChkKSA9PiBkLmtleSA9PT0ga2V5KTtcbn1cblxuLyoqIOyggOyepSDsoIQg6rKA7KadLiDsnpjrqrvrkJwg6rCS7J20IOuTpOyWtOqwgOuptCDrn7Dtg4DsnoTsl5DshJwg7KGw7Jqp7Z6IIOq4sOuzuOqwkuycvOuhnCDrlqjslrTsoLgg7JuQ7J247J2EIOywvuq4sCDslrTroLXri6QuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTZXR0aW5nVmFsdWUoXG4gIGRlZjogU2V0dGluZ0RlZixcbiAgcmF3OiBzdHJpbmcsXG4pOiB7IG9rOiB0cnVlOyB2YWx1ZTogc3RyaW5nIH0gfCB7IG9rOiBmYWxzZTsgZXJyb3I6IHN0cmluZyB9IHtcbiAgY29uc3QgdHJpbW1lZCA9IHJhdy50cmltKCk7XG5cbiAgaWYgKGRlZi5raW5kID09PSBcImJvb2xlYW5cIikge1xuICAgIGlmICghW1widHJ1ZVwiLCBcImZhbHNlXCJdLmluY2x1ZGVzKHRyaW1tZWQpKSByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiBcInRydWUg65iQ64qUIGZhbHNlXCIgfTtcbiAgICByZXR1cm4geyBvazogdHJ1ZSwgdmFsdWU6IHRyaW1tZWQgfTtcbiAgfVxuXG4gIGlmIChkZWYua2luZCA9PT0gXCJwcmVzZXRcIikge1xuICAgIC8vIO2ZlOuptOydgCDrsoTtirzrp4wg7KO87KeA66eMIEFQSSDripQg7JWE66y0IOqwkuydtOuCmCDrsJvsnYQg7IiYIOyeiOuLpC4g66qp66GdIOuwluydmCDqsJLsnbQg65Ok7Ja07Jik66m0XG4gICAgLy8g7ZmU66m07JeQ7IScIOyVhOustCDrsoTtirzrj4Qg7ISg7YOd64+8IOuztOydtOyngCDslYrslYQgXCLsmZwg7JWIIOuwlOuAjOyngFwi6rCAIOuQnOuLpC5cbiAgICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodHJpbW1lZCk7XG4gICAgaWYgKCFkZWYucHJlc2V0cz8uaW5jbHVkZXMocGFyc2VkKSkge1xuICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBlcnJvcjogYCR7ZGVmLnByZXNldHM/LmpvaW4oXCIsIFwiKSA/PyBcIlwifSDspJEg7ZWY64KY7Jes7JW8IO2VqeuLiOuLpGAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgb2s6IHRydWUsIHZhbHVlOiBTdHJpbmcocGFyc2VkKSB9O1xuICB9XG5cbiAgaWYgKGRlZi5raW5kID09PSBcImludGVnZXJcIiB8fCBkZWYua2luZCA9PT0gXCJudW1iZXJcIikge1xuICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcih0cmltbWVkKTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShwYXJzZWQpKSByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiBcIuyIq+yekOulvCDsnoXroKXtlZjshLjsmpRcIiB9O1xuICAgIGlmIChkZWYua2luZCA9PT0gXCJpbnRlZ2VyXCIgJiYgIU51bWJlci5pc0ludGVnZXIocGFyc2VkKSkge1xuICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBlcnJvcjogXCLsoJXsiJjrpbwg7J6F66Cl7ZWY7IS47JqUXCIgfTtcbiAgICB9XG4gICAgaWYgKGRlZi5taW4gIT09IHVuZGVmaW5lZCAmJiBwYXJzZWQgPCBkZWYubWluKSB7XG4gICAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiBgJHtkZWYubWlufSDsnbTsg4HsnbTslrTslbwg7ZWp64uI64ukYCB9O1xuICAgIH1cbiAgICBpZiAoZGVmLm1heCAhPT0gdW5kZWZpbmVkICYmIHBhcnNlZCA+IGRlZi5tYXgpIHtcbiAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgZXJyb3I6IGAke2RlZi5tYXh9IOydtO2VmOyXrOyVvCDtlanri4jri6RgIH07XG4gICAgfVxuICAgIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZTogU3RyaW5nKHBhcnNlZCkgfTtcbiAgfVxuXG4gIHJldHVybiB7IG9rOiB0cnVlLCB2YWx1ZTogdHJpbW1lZCB9O1xufVxuXG4vKiog7ZmU66m07JeQIOq3uOuMgOuhnCDrgrTroKTrs7TrgrTrqbQg7JWIIOuQmOuKlCDqsJIuIOyVnuuSpOunjCDrgqjquLTri6QuICovXG5leHBvcnQgZnVuY3Rpb24gbWFza1NlY3JldCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlLmxlbmd0aCA8PSAxMikgcmV0dXJuIFwiKioqXCI7XG4gIHJldHVybiBgJHt2YWx1ZS5zbGljZSgwLCA4KX0uLi4ke3ZhbHVlLnNsaWNlKC00KX1gO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQTZDQSxNQUFhLHdDQUF3QztBQUVyRCxNQUFhLGVBQTZCO0NBQ3hDO0VBQ0UsS0FBSztFQUNMLFVBQVU7RUFDVixPQUFPO0VBQ1AsT0FBTztFQUNQLE1BQU07RUFDTixTQUFTO0VBQ1QsTUFBTTtDQUNSO0NBQ0E7RUFDRSxLQUFLO0VBQ0wsVUFBVTtFQUNWLE9BQU87RUFDUCxRQUFRO0VBQ1IsT0FBTztFQUNQLE1BQU07RUFDTixTQUFTO0VBQ1QsTUFBTTtDQUNSO0NBQ0E7RUFDRSxLQUFLO0VBQ0wsVUFBVTtFQUNWLE9BQU87RUFDUCxRQUFRO0VBQ1IsT0FBTztFQUNQLE1BQU07RUFDTixTQUFTO0VBQ1QsTUFBTTtDQUNSO0NBQ0E7RUFDRSxLQUFLO0VBQ0wsVUFBVTtFQUNWLE9BQU87RUFDUCxRQUFRO0VBQ1IsT0FBTztFQUNQLE1BQU07RUFDTixTQUFTO0VBR1QsU0FBUztHQUFDO0dBQUk7R0FBSTtHQUFJO0VBQUc7RUFDekIsTUFBTTtDQUNSO0NBQ0E7RUFDRSxLQUFLO0VBQ0wsVUFBVTtFQUNWLE9BQU87RUFDUCxRQUFRO0VBQ1IsT0FBTztFQUNQLE1BQU07RUFDTixTQUFTO0VBQ1QsS0FBSztFQUNMLEtBQUs7RUFDTCxNQUFNO0NBQ1I7Q0FDQTtFQUNFLEtBQUs7RUFDTCxVQUFVO0VBQ1YsT0FBTztFQUNQLFFBQVE7RUFDUixPQUFPO0VBQ1AsTUFBTTtFQUNOLFNBQVM7RUFDVCxLQUFLO0VBQ0wsS0FBSztFQUNMLE1BQU07Q0FDUjtDQUNBO0VBQ0UsS0FBSztFQUNMLFVBQVU7RUFDVixPQUFPO0VBQ1AsUUFBUTtFQUNSLE9BQU87RUFDUCxNQUFNO0VBQ04sU0FBUztFQUNULE1BQU07Q0FDUjtDQUNBO0VBQ0UsS0FBSztFQUNMLFVBQVU7RUFDVixPQUFPO0VBQ1AsUUFBUTtFQUNSLE9BQU87RUFDUCxNQUFNO0VBQ04sU0FBUztFQUNULE1BQU07Q0FDUjtDQUNBO0VBQ0UsS0FBSztFQUNMLFVBQVU7RUFDVixPQUFPO0VBQ1AsUUFBUTtFQUNSLE9BQU87RUFDUCxNQUFNO0VBQ04sU0FBUztFQUNULE1BQU07Q0FDUjtDQUNBO0VBQ0UsS0FBSztFQUNMLFVBQVU7RUFDVixPQUFPO0VBQ1AsUUFBUTtFQUNSLE9BQU87RUFDUCxNQUFNO0VBQ04sU0FBUztDQUNYO0FBQ0Y7QUFFQSxTQUFnQixlQUFlLEtBQXFDO0NBQ2xFLE9BQU8sYUFBYSxNQUFNLE1BQU0sRUFBRSxRQUFRLEdBQUc7QUFDL0M7O0FBR0EsU0FBZ0IscUJBQ2QsS0FDQSxLQUM0RDtDQUM1RCxNQUFNLFVBQVUsSUFBSSxLQUFLO0NBRXpCLElBQUksSUFBSSxTQUFTLFdBQVc7RUFDMUIsSUFBSSxDQUFDLENBQUMsUUFBUSxPQUFPLENBQUMsQ0FBQyxTQUFTLE9BQU8sR0FBRyxPQUFPO0dBQUUsSUFBSTtHQUFPLE9BQU87RUFBZ0I7RUFDckYsT0FBTztHQUFFLElBQUk7R0FBTSxPQUFPO0VBQVE7Q0FDcEM7Q0FFQSxJQUFJLElBQUksU0FBUyxVQUFVO0VBR3pCLE1BQU0sU0FBUyxPQUFPLE9BQU87RUFDN0IsSUFBSSxDQUFDLElBQUksU0FBUyxTQUFTLE1BQU0sR0FDL0IsT0FBTztHQUFFLElBQUk7R0FBTyxPQUFPLEdBQUcsSUFBSSxTQUFTLEtBQUssSUFBSSxLQUFLLEdBQUc7RUFBYTtFQUUzRSxPQUFPO0dBQUUsSUFBSTtHQUFNLE9BQU8sT0FBTyxNQUFNO0VBQUU7Q0FDM0M7Q0FFQSxJQUFJLElBQUksU0FBUyxhQUFhLElBQUksU0FBUyxVQUFVO0VBQ25ELE1BQU0sU0FBUyxPQUFPLE9BQU87RUFDN0IsSUFBSSxDQUFDLE9BQU8sU0FBUyxNQUFNLEdBQUcsT0FBTztHQUFFLElBQUk7R0FBTyxPQUFPO0VBQVk7RUFDckUsSUFBSSxJQUFJLFNBQVMsYUFBYSxDQUFDLE9BQU8sVUFBVSxNQUFNLEdBQ3BELE9BQU87R0FBRSxJQUFJO0dBQU8sT0FBTztFQUFZO0VBRXpDLElBQUksSUFBSSxRQUFRLFVBQWEsU0FBUyxJQUFJLEtBQ3hDLE9BQU87R0FBRSxJQUFJO0dBQU8sT0FBTyxHQUFHLElBQUksSUFBSTtFQUFZO0VBRXBELElBQUksSUFBSSxRQUFRLFVBQWEsU0FBUyxJQUFJLEtBQ3hDLE9BQU87R0FBRSxJQUFJO0dBQU8sT0FBTyxHQUFHLElBQUksSUFBSTtFQUFXO0VBRW5ELE9BQU87R0FBRSxJQUFJO0dBQU0sT0FBTyxPQUFPLE1BQU07RUFBRTtDQUMzQztDQUVBLE9BQU87RUFBRSxJQUFJO0VBQU0sT0FBTztDQUFRO0FBQ3BDOztBQUdBLFNBQWdCLFdBQVcsT0FBdUI7Q0FDaEQsSUFBSSxNQUFNLFVBQVUsSUFBSSxPQUFPO0NBQy9CLE9BQU8sR0FBRyxNQUFNLE1BQU0sR0FBRyxDQUFDLEVBQUUsS0FBSyxNQUFNLE1BQU0sRUFBRTtBQUNqRCJ9
|