@cartanova/qgrid-cli 2.9.2 → 2.9.5

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.
Files changed (77) hide show
  1. package/bundle/dist/application/qgrid/expired-token-reminder.js +6 -5
  2. package/bundle/dist/application/qgrid/qgrid-image-generation.js +12 -3
  3. package/bundle/dist/application/qgrid/qgrid-response-format.js +8 -6
  4. package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +2 -2
  5. package/bundle/dist/application/qgrid/qgrid.frame.js +4 -3
  6. package/bundle/dist/application/qgrid/qgrid.types.js +31 -4
  7. package/bundle/dist/application/qgrid/token-death.js +6 -22
  8. package/bundle/dist/application/qgrid/token-subscriber.js +2 -1
  9. package/bundle/dist/application/qgrid/tool-emulation.js +3 -2
  10. package/bundle/dist/application/setting/setting.model.js +8 -2
  11. package/bundle/dist/application/token/token.model.js +22 -17
  12. package/bundle/dist/utils/providers/common/model-cost.js +21 -13
  13. package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +1 -1
  14. package/bundle/dist/utils/providers/openai/openai-direct-client.js +39 -1
  15. package/bundle/dist/utils/providers/openai/openai-dispatcher.js +41 -20
  16. package/bundle/dist/utils/providers/openai/openai-image-generation.js +145 -0
  17. package/bundle/dist/utils/providers/openai/openai-quota.js +11 -3
  18. package/bundle/dist/utils/providers/openai/openai-refresh.js +7 -5
  19. package/bundle/dist/utils/slack-notify.js +8 -4
  20. package/bundle/src/application/qgrid/expired-token-reminder.test.ts +6 -1
  21. package/bundle/src/application/qgrid/expired-token-reminder.ts +10 -4
  22. package/bundle/src/application/qgrid/qgrid-image-generation.test.ts +53 -0
  23. package/bundle/src/application/qgrid/qgrid-image-generation.ts +32 -2
  24. package/bundle/src/application/qgrid/qgrid-response-format.test.ts +26 -0
  25. package/bundle/src/application/qgrid/qgrid-response-format.ts +21 -13
  26. package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +32 -0
  27. package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +1 -1
  28. package/bundle/src/application/qgrid/qgrid.frame.test.ts +20 -0
  29. package/bundle/src/application/qgrid/qgrid.frame.ts +3 -2
  30. package/bundle/src/application/qgrid/qgrid.types.ts +32 -0
  31. package/bundle/src/application/qgrid/token-death.test.ts +11 -10
  32. package/bundle/src/application/qgrid/token-death.ts +9 -21
  33. package/bundle/src/application/qgrid/token-subscriber.test.ts +5 -1
  34. package/bundle/src/application/qgrid/token-subscriber.ts +1 -0
  35. package/bundle/src/application/qgrid/tool-emulation.test.ts +18 -0
  36. package/bundle/src/application/qgrid/tool-emulation.ts +3 -0
  37. package/bundle/src/application/setting/setting.model.test.ts +20 -0
  38. package/bundle/src/application/setting/setting.model.ts +10 -2
  39. package/bundle/src/application/sonamu.generated.http +4 -2
  40. package/bundle/src/application/token/token.model.test.ts +24 -5
  41. package/bundle/src/application/token/token.model.ts +30 -23
  42. package/bundle/src/utils/providers/common/effort.test.ts +8 -0
  43. package/bundle/src/utils/providers/common/model-cost.test.ts +25 -12
  44. package/bundle/src/utils/providers/common/model-cost.ts +28 -14
  45. package/bundle/src/utils/providers/common/provider-dispatcher.ts +5 -1
  46. package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +9 -1
  47. package/bundle/src/utils/providers/openai/openai-direct-client.ts +48 -1
  48. package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +137 -2
  49. package/bundle/src/utils/providers/openai/openai-dispatcher.ts +44 -18
  50. package/bundle/src/utils/providers/openai/openai-image-generation.test.ts +135 -0
  51. package/bundle/src/utils/providers/openai/openai-image-generation.ts +177 -0
  52. package/bundle/src/utils/providers/openai/openai-quota.test.ts +32 -0
  53. package/bundle/src/utils/providers/openai/openai-quota.ts +15 -8
  54. package/bundle/src/utils/providers/openai/openai-refresh.test.ts +18 -0
  55. package/bundle/src/utils/providers/openai/openai-refresh.ts +11 -4
  56. package/bundle/src/utils/slack-notify.test.ts +14 -0
  57. package/bundle/src/utils/slack-notify.ts +19 -3
  58. package/bundle/web-dist/client/assets/{index-DH1n8kgG.js → index-BcCytvFf.js} +3 -3
  59. package/bundle/web-dist/client/assets/{logs-D36O-NET.js → logs-BkOilk5x.js} +1 -1
  60. package/bundle/web-dist/client/assets/{monit-DhZAaz9K.js → monit-8oCSLCdL.js} +1 -1
  61. package/bundle/web-dist/client/assets/{routes-C7q1CsSv.js → routes-DFIF4IoW.js} +2 -2
  62. package/bundle/web-dist/client/assets/{settings-M_jfoIAe.js → settings-nUI-DR3U.js} +1 -1
  63. package/bundle/web-dist/client/assets/{show-CORjMGQs.js → show-Bzx6Xkoc.js} +1 -1
  64. package/bundle/web-dist/client/assets/{tokens-C7-j4VXD.js → tokens-DFWCL7Ts.js} +1 -1
  65. package/bundle/web-dist/client/assets/{use-oauth-login-flow-Fi62xbBc.js → use-oauth-login-flow-B5MAjpVc.js} +1 -1
  66. package/bundle/web-dist/client/index.html +1 -1
  67. package/bundle/web-dist/server/assets/{routes-CxMHXfdH.js → routes-B408iqh1.js} +29 -14
  68. package/bundle/web-dist/server/entry-server.generated.js +3 -2
  69. package/package.json +2 -1
  70. package/skills/qgrid/SKILL.md +2 -1
  71. package/skills/qgrid/references/ai-sdk-provider-contract.md +2 -2
  72. package/skills/qgrid/references/decision-rationale.md +2 -2
  73. package/skills/qgrid/references/openai-codex-runtime.md +79 -0
  74. package/skills/qgrid/references/provider-runtime-differences.md +1 -1
  75. package/skills/qgrid/references/request-log-run-lifecycle.md +1 -1
  76. package/skills/qgrid/references/sonamu-api-web-flow.md +1 -1
  77. package/skills/qgrid/references/token-auth-quota-lifecycle.md +4 -3
@@ -180,6 +180,7 @@ var TokenSubscriber = class {
180
180
  }
181
181
  async reconcileNow() {
182
182
  const previousAnthropicIds = this.tokenChangeHandler ? new Set([...this.dispatcher.tokens.values()].filter((row) => row.active && row.provider === "anthropic").map((row) => row.id)) : null;
183
+ await TokenModel.deactivateExpiredTokens();
183
184
  const rows = await TokenModel.findActive("A");
184
185
  this.dispatcher.replaceCache(rows);
185
186
  const anthropicRows = rows.filter((r) => r.provider === "anthropic").map((r) => ({
@@ -210,4 +211,4 @@ var TokenSubscriber = class {
210
211
  //#endregion
211
212
  export { TokenSubscriber };
212
213
 
213
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tc3Vic2NyaWJlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvdG9rZW4tc3Vic2NyaWJlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogdG9rZW5zX2NoYW5nZWQgTElTVEVOIHN1YnNjcmliZXIuICovXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgQ2xpZW50LCB0eXBlIENsaWVudENvbmZpZyB9IGZyb20gXCJwZ1wiO1xuXG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIEFudGhyb3BpY0NyZWRlbnRpYWxzLCB0eXBlIE9wZW5BSUNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFFncmlkRGlzcGF0Y2hlckNsYXNzIH0gZnJvbSBcIi4vcWdyaWQuZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBTdWJzY3JpYmVyU3RhdHVzIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwic3Vic2NyaWJlclwiXSk7XG5cbmNvbnN0IFRPS0VOU19DSEFOR0VEID0gXCJ0b2tlbnNfY2hhbmdlZFwiO1xuY29uc3QgUkVDT05DSUxFX0lOVEVSVkFMX01TID0gMTAgKiA2MCAqIDEwMDA7XG5jb25zdCBDT05ORUNUSU9OX1RJTUVPVVRfTVMgPSA1XzAwMDtcbmNvbnN0IEJBQ0tPRkZfQkFTRV9NUyA9IDUwMDtcbmNvbnN0IEJBQ0tPRkZfQ0FQX01TID0gMzBfMDAwO1xuXG50eXBlIFBheWxvYWQgPSB7IG9wOiBcIklOU0VSVFwiIHwgXCJVUERBVEVcIiB8IFwiREVMRVRFXCI7IGlkOiBudW1iZXIgfTtcblxuZXhwb3J0IGNsYXNzIFRva2VuU3Vic2NyaWJlciB7XG4gIGNsaWVudDogQ2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIHJlY29uY2lsZVRpbWVyOiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuICByZWNvbm5lY3RUaW1lcjogTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gbnVsbDtcbiAgc2h1dGRvd25SZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgYXR0ZW1wdCA9IDA7XG4gIGNvbm5lY3RlZEF0OiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gIGxhc3RSZWNvbmNpbGVBdDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG9wZXJhdGlvbkNoYWluOiBQcm9taXNlPHZvaWQ+ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHByaXZhdGUgdG9rZW5DaGFuZ2VIYW5kbGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY29ubkNvbmZpZzogQ2xpZW50Q29uZmlnLFxuICAgIHB1YmxpYyBkaXNwYXRjaGVyOiBRZ3JpZERpc3BhdGNoZXJDbGFzcyxcbiAgKSB7fVxuXG4gIHNldFRva2VuQ2hhbmdlSGFuZGxlcihoYW5kbGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbkNoYW5nZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlUb2tlbnNDaGFuZ2VkKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnRva2VuQ2hhbmdlSGFuZGxlcj8uKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKGB0b2tlbiBjaGFuZ2UgaGFuZGxlciBmYWlsZWQ6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRoaXMuc2h1dGRvd25SZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmVuc3VyZVJlY29uY2lsZVRpbWVyKCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jb25uZWN0QW5kUmVjb25jaWxlKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIud2Fybihgc3Vic2NyaWJlciBzdGFydCBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9LCBzY2hlZHVsaW5nIHJldHJ5YCk7XG4gICAgICB0aGlzLnJldHJ5TGF0ZXIoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc2h1dGRvd25SZXF1ZXN0ZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLnJlY29uY2lsZVRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMucmVjb25jaWxlVGltZXIpO1xuICAgICAgdGhpcy5yZWNvbmNpbGVUaW1lciA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlY29ubmVjdFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWNvbm5lY3RUaW1lcik7XG4gICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jbG9zZUNsaWVudCgpO1xuICB9XG5cbiAgc3RhdHVzKCk6IFN1YnNjcmliZXJTdGF0dXMge1xuICAgIHJldHVybiB7XG4gICAgICBjb25uZWN0ZWQ6IHRoaXMuY2xpZW50ICE9PSBudWxsICYmIHRoaXMucmVjb25uZWN0VGltZXIgPT09IG51bGwsXG4gICAgICBjb25uZWN0ZWRBdDogdGhpcy5jb25uZWN0ZWRBdCxcbiAgICAgIGxhc3RSZWNvbmNpbGVBdDogdGhpcy5sYXN0UmVjb25jaWxlQXQsXG4gICAgICBhdHRlbXB0OiB0aGlzLmF0dGVtcHQsXG4gICAgfTtcbiAgfVxuXG4gIGVuc3VyZVJlY29uY2lsZVRpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlY29uY2lsZVRpbWVyKSByZXR1cm47XG5cbiAgICAvLyBMSVNURU4vTk9USUZZIOuKlCDrgYrquLQg64+Z7JWIIOycoOyLpOuQoCDsiJgg7J6I7Ja0IOyjvOq4sOyggeycvOuhnCBEQiDquLDspIDsnLzroZwg66ee7LaY64ukLlxuICAgIHRoaXMucmVjb25jaWxlVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLnJlY29uY2lsZSgpLmNhdGNoKChlKSA9PlxuICAgICAgICBsb2dnZXIud2FybihgcGVyaW9kaWMgcmVjb25jaWxlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSxcbiAgICAgICk7XG4gICAgfSwgUkVDT05DSUxFX0lOVEVSVkFMX01TKTtcbiAgfVxuXG4gIGFzeW5jIGNvbm5lY3RBbmRSZWNvbmNpbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jb25uZWN0QW5kTGlzdGVuKCk7XG4gICAgYXdhaXQgdGhpcy5yZWNvbmNpbGUoKTtcbiAgICB0aGlzLmF0dGVtcHQgPSAwO1xuICB9XG5cbiAgYXN5bmMgY29ubmVjdEFuZExpc3RlbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgQ2xpZW50KHtcbiAgICAgIC4uLnRoaXMuY29ubkNvbmZpZyxcbiAgICAgIGNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzOiBDT05ORUNUSU9OX1RJTUVPVVRfTVMsXG4gICAgICBrZWVwQWxpdmU6IHRydWUsXG4gICAgICBrZWVwQWxpdmVJbml0aWFsRGVsYXlNaWxsaXM6IDEwXzAwMCxcbiAgICAgIGFwcGxpY2F0aW9uX25hbWU6IFwicWdyaWQtbGlzdGVuZXJcIixcbiAgICB9KTtcblxuICAgIGNsaWVudC5vbihcImVycm9yXCIsIChlKSA9PiB7XG4gICAgICBsb2dnZXIud2Fybihgc3Vic2NyaWJlciBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB0aGlzLnJldHJ5TGF0ZXIoKTtcbiAgICB9KTtcbiAgICBjbGllbnQub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnNodXRkb3duUmVxdWVzdGVkKSB0aGlzLnJldHJ5TGF0ZXIoKTtcbiAgICB9KTtcbiAgICBjbGllbnQub24oXCJub3RpZmljYXRpb25cIiwgKG1zZykgPT4ge1xuICAgICAgaWYgKG1zZy5jaGFubmVsICE9PSBUT0tFTlNfQ0hBTkdFRCB8fCAhbXNnLnBheWxvYWQpIHJldHVybjtcbiAgICAgIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKG1zZy5wYXlsb2FkKS5jYXRjaCgoZSkgPT5cbiAgICAgICAgbG9nZ2VyLndhcm4oYGhhbmRsZSBOT1RJRlkgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjbGllbnQuY29ubmVjdCgpO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFwiU0VUIHN0YXRlbWVudF90aW1lb3V0ID0gMFwiKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcIlNFVCBpZGxlX2luX3RyYW5zYWN0aW9uX3Nlc3Npb25fdGltZW91dCA9IDBcIik7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoYExJU1RFTiAke2NsaWVudC5lc2NhcGVJZGVudGlmaWVyKFRPS0VOU19DSEFOR0VEKX1gKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjbGllbnQucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICBhd2FpdCBjbGllbnQuZW5kKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLmNvbm5lY3RlZEF0ID0gbmV3IERhdGUoKTtcbiAgICBsb2dnZXIuaW5mbyhgc3Vic2NyaWJlZCB0byAke1RPS0VOU19DSEFOR0VEfWApO1xuICB9XG5cbiAgcmV0cnlMYXRlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaHV0ZG93blJlcXVlc3RlZCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnJlY29ubmVjdFRpbWVyKSByZXR1cm47XG5cbiAgICB2b2lkIHRoaXMuY2xvc2VDbGllbnQoKTtcbiAgICB0aGlzLmF0dGVtcHQgKz0gMTtcbiAgICBjb25zdCBjYXAgPSBNYXRoLm1pbihCQUNLT0ZGX0JBU0VfTVMgKiAyICoqIHRoaXMuYXR0ZW1wdCwgQkFDS09GRl9DQVBfTVMpO1xuICAgIGNvbnN0IGRlbGF5ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2FwKTtcbiAgICBsb2dnZXIuaW5mbyhgcmVjb25uZWN0aW5nIGluICR7ZGVsYXl9bXMgKGF0dGVtcHQgJHt0aGlzLmF0dGVtcHR9KWApO1xuICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBudWxsO1xuICAgICAgdGhpcy5jb25uZWN0QW5kUmVjb25jaWxlKCkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYHN1YnNjcmliZXIgcmVjb25uZWN0IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgdGhpcy5yZXRyeUxhdGVyKCk7XG4gICAgICB9KTtcbiAgICB9LCBkZWxheSk7XG4gIH1cblxuICBhc3luYyBjbG9zZUNsaWVudCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjbGllbnQgPSB0aGlzLmNsaWVudDtcbiAgICBpZiAoIWNsaWVudCkgcmV0dXJuO1xuXG4gICAgdGhpcy5jbGllbnQgPSBudWxsO1xuICAgIGNsaWVudC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBhd2FpdCBjbGllbnQuZW5kKCkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlTm90aWZpY2F0aW9uKHBheWxvYWRKc29uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uTm93KHBheWxvYWRKc29uKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZU5vdGlmaWNhdGlvbk5vdyhwYXlsb2FkSnNvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGF5bG9hZCA9IEpTT04ucGFyc2UocGF5bG9hZEpzb24pIGFzIFBheWxvYWQ7XG4gICAgY29uc3QgcHJldmlvdXNSb3cgPSB0aGlzLnRva2VuQ2hhbmdlSGFuZGxlclxuICAgICAgPyB0aGlzLmRpc3BhdGNoZXIudG9rZW5zLmdldChwYXlsb2FkLmlkKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgd2FzS2VlcGFsaXZlVGFyZ2V0ID0gcHJldmlvdXNSb3c/LmFjdGl2ZSA9PT0gdHJ1ZSAmJiBwcmV2aW91c1Jvdy5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIjtcbiAgICBpZiAocGF5bG9hZC5vcCA9PT0gXCJERUxFVEVcIikge1xuICAgICAgdGhpcy5kaXNwYXRjaGVyLnJlbW92ZUNhY2hlKHBheWxvYWQuaWQpO1xuICAgICAgYXdhaXQgdGhpcy5kaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXJcbiAgICAgICAgPy5vblRva2VuUmVtb3ZlZChwYXlsb2FkLmlkKVxuICAgICAgICAuY2F0Y2goKGUpID0+IGxvZ2dlci53YXJuKGBvcGVuYWkgdG9rZW4gcmVtb3ZlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSk7XG4gICAgICAvLyBhbnRocm9waWMg7Yag7YGwIOydtOuypO2KuOuKlCDrj5nquLAodm9pZCkg4oCUIHByb3ZpZGVyIOulvCDrqqjrpbTrr4DroZwg66y07ZW07ZWY6rKMIO2VreyDgSDsoJzqsbAg7Iuc64+ELlxuICAgICAgdGhpcy5kaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXI/Lm9uVG9rZW5SZW1vdmVkKHBheWxvYWQuaWQpO1xuICAgICAgbG9nZ2VyLmluZm8oYE5PVElGWSAke3BheWxvYWQub3B9IGlkPSR7cGF5bG9hZC5pZH0g4oaSIHJlbW92ZWQgZnJvbSBjYWNoZWApO1xuICAgICAgaWYgKHByZXZpb3VzUm93ID09PSB1bmRlZmluZWQgfHwgd2FzS2VlcGFsaXZlVGFyZ2V0KSB0aGlzLm5vdGlmeVRva2Vuc0NoYW5nZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgcm93ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kT25lKFwiQVwiLCB7IGlkOiBwYXlsb2FkLmlkIH0pO1xuICAgIGlmICghcm93KSB7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIucmVtb3ZlQ2FjaGUocGF5bG9hZC5pZCk7XG4gICAgICBhd2FpdCB0aGlzLmRpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlclxuICAgICAgICA/Lm9uVG9rZW5SZW1vdmVkKHBheWxvYWQuaWQpXG4gICAgICAgIC5jYXRjaCgoZSkgPT4gbG9nZ2VyLndhcm4oYG9wZW5haSB0b2tlbiByZW1vdmUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy5vblRva2VuUmVtb3ZlZChwYXlsb2FkLmlkKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBOT1RJRlkgJHtwYXlsb2FkLm9wfSBpZD0ke3BheWxvYWQuaWR9IOKGkiBtaXNzaW5nLCByZW1vdmVkIGZyb20gY2FjaGVgKTtcbiAgICAgIGlmIChwcmV2aW91c1JvdyA9PT0gdW5kZWZpbmVkIHx8IHdhc0tlZXBhbGl2ZVRhcmdldCkgdGhpcy5ub3RpZnlUb2tlbnNDaGFuZ2VkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kaXNwYXRjaGVyLnVwc2VydENhY2hlKHBheWxvYWQuaWQsIHJvdyk7XG5cbiAgICBpZiAocm93LnByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICBjb25zdCBjcmVkcyA9IHJvdy5jcmVkZW50aWFscyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIGNvbnN0IG9wZW5haURpc3BhdGNoZXIgPSB0aGlzLmRpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcjtcbiAgICAgIGlmIChwYXlsb2FkLm9wID09PSBcIklOU0VSVFwiICYmIHJvdy5hY3RpdmUpIHtcbiAgICAgICAgYXdhaXQgb3BlbmFpRGlzcGF0Y2hlclxuICAgICAgICAgID8ub25Ub2tlbkFkZGVkKFxuICAgICAgICAgICAgcGF5bG9hZC5pZCxcbiAgICAgICAgICAgIHJvdy5uYW1lLFxuICAgICAgICAgICAgY3JlZHMgYXMgT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICByb3cucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICAgICAgcm93LndlaWdodCxcbiAgICAgICAgICApXG4gICAgICAgICAgLmNhdGNoKChlKSA9PiBsb2dnZXIud2Fybihgb3BlbmFpIHRva2VuIGFkZCBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCkpO1xuICAgICAgfSBlbHNlIGlmIChyb3cuYWN0aXZlKSB7XG4gICAgICAgIGlmIChvcGVuYWlEaXNwYXRjaGVyKSB7XG4gICAgICAgICAgYXdhaXQgb3BlbmFpRGlzcGF0Y2hlclxuICAgICAgICAgICAgLm9uVG9rZW5VcGRhdGVkKFxuICAgICAgICAgICAgICBwYXlsb2FkLmlkLFxuICAgICAgICAgICAgICByb3cubmFtZSxcbiAgICAgICAgICAgICAgY3JlZHMgYXMgT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgIHJvdy5xdW90YV90aHJlc2hvbGQsXG4gICAgICAgICAgICAgIHJvdy53ZWlnaHQsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAudGhlbigoKSA9PiBvcGVuYWlEaXNwYXRjaGVyLm9uVG9rZW5BY3RpdmF0ZWQocGF5bG9hZC5pZCkpXG4gICAgICAgICAgICAuY2F0Y2goKGUpID0+IGxvZ2dlci53YXJuKGBvcGVuYWkgdG9rZW4gdXBkYXRlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wZW5haURpc3BhdGNoZXI/Lm9uVG9rZW5EZWFjdGl2YXRlZChwYXlsb2FkLmlkKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJvdy5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIikge1xuICAgICAgLy8gYW50aHJvcGljIO2GoO2BsCDsnbTrsqTtirjripQg64+Z6riwKHZvaWQpLiB3b3JrZXIg6rCAIOyXhuqzoCDtkoAoTWFwKeunjCDqtIDrpqztlZjrr4DroZwg64uo7IicOlxuICAgICAgLy8gIElOU0VSVCDihpIg7LaU6rCALCBhY3RpdmUg66m0IOqwseyLoChvblRva2VuVXBkYXRlZCDqsIAgaWRlbnRpdHkg67OA6rK964+EIOyymOumrCksIGluYWN0aXZlIOuptCDtkoDsl5DshJwg7KCc6rGwLlxuICAgICAgLy8gICjrs4Trj4QgYWN0aXZhdGUvZGVhY3RpdmF0ZSDsvZzrsLHsnbQg7JeG7Ja0IGFjdGl2ZSDthqDquIDsnYQgYWRkL3JlbW92ZSDroZwg66ek7ZWRLilcbiAgICAgIGNvbnN0IGNyZWRzID0gcm93LmNyZWRlbnRpYWxzIGFzIEFudGhyb3BpY0NyZWRlbnRpYWxzO1xuICAgICAgaWYgKHBheWxvYWQub3AgPT09IFwiSU5TRVJUXCIgJiYgcm93LmFjdGl2ZSkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcj8ub25Ub2tlbkFkZGVkKFxuICAgICAgICAgIHBheWxvYWQuaWQsXG4gICAgICAgICAgcm93Lm5hbWUsXG4gICAgICAgICAgY3JlZHMsXG4gICAgICAgICAgcm93LnF1b3RhX3RocmVzaG9sZCxcbiAgICAgICAgICByb3cud2VpZ2h0LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChyb3cuYWN0aXZlKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy5vblRva2VuVXBkYXRlZChcbiAgICAgICAgICBwYXlsb2FkLmlkLFxuICAgICAgICAgIHJvdy5uYW1lLFxuICAgICAgICAgIGNyZWRzLFxuICAgICAgICAgIHJvdy5xdW90YV90aHJlc2hvbGQsXG4gICAgICAgICAgcm93LndlaWdodCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGluYWN0aXZlIOuptCBJTlNFUlQg65OgIFVQREFURSDrk6Ag7ZKA7JeQIOuEo+yngCDslYrripTri6QuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy5vblRva2VuUmVtb3ZlZChwYXlsb2FkLmlkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbG9nZ2VyLmluZm8oYE5PVElGWSAke3BheWxvYWQub3B9IGlkPSR7cGF5bG9hZC5pZH0gKCR7cm93Lm5hbWV9KSBhY3RpdmU9JHtyb3cuYWN0aXZlfWApO1xuICAgIGNvbnN0IGlzS2VlcGFsaXZlVGFyZ2V0ID0gcm93LmFjdGl2ZSAmJiByb3cucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCI7XG4gICAgaWYgKHdhc0tlZXBhbGl2ZVRhcmdldCAhPT0gaXNLZWVwYWxpdmVUYXJnZXQpIHRoaXMubm90aWZ5VG9rZW5zQ2hhbmdlZCgpO1xuICB9XG5cbiAgYXN5bmMgcmVjb25jaWxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5yZWNvbmNpbGVOb3coKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlY29uY2lsZU5vdygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwcmV2aW91c0FudGhyb3BpY0lkcyA9IHRoaXMudG9rZW5DaGFuZ2VIYW5kbGVyXG4gICAgICA/IG5ldyBTZXQoXG4gICAgICAgICAgWy4uLnRoaXMuZGlzcGF0Y2hlci50b2tlbnMudmFsdWVzKCldXG4gICAgICAgICAgICAuZmlsdGVyKChyb3cpID0+IHJvdy5hY3RpdmUgJiYgcm93LnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKVxuICAgICAgICAgICAgLm1hcCgocm93KSA9PiByb3cuaWQpLFxuICAgICAgICApXG4gICAgICA6IG51bGw7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IFRva2VuTW9kZWwuZmluZEFjdGl2ZShcIkFcIik7XG4gICAgdGhpcy5kaXNwYXRjaGVyLnJlcGxhY2VDYWNoZShyb3dzKTtcbiAgICAvLyBOT1RJRlkg7Jyg7IukIOuMgOu5hDogQW50aHJvcGljRGlzcGF0Y2hlciDtkoDrj4QgREIgYWN0aXZlIGFudGhyb3BpYyDthqDtgbAg6riw7KSA7Jy866GcIOyerOuPmeq4sO2ZlC5cbiAgICAvLyAocm93cyDripQgYWN0aXZlIOunjCDigJQgaW5hY3RpdmUv7IKt7KCc65CcIO2GoO2BsOydgCDsl6zquLAg7JeG7Jy866+A66GcIHJlcGxhY2VUb2tlbnMg6rCAIO2SgOyXkOyEnCDsoJzqsbDtlZzri6QuKVxuICAgIGNvbnN0IGFudGhyb3BpY1Jvd3MgPSByb3dzXG4gICAgICAuZmlsdGVyKChyKSA9PiByLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKVxuICAgICAgLm1hcCgocikgPT4gKHtcbiAgICAgICAgaWQ6IHIuaWQsXG4gICAgICAgIG5hbWU6IHIubmFtZSxcbiAgICAgICAgY3JlZGVudGlhbHM6IHIuY3JlZGVudGlhbHMgYXMgQW50aHJvcGljQ3JlZGVudGlhbHMsXG4gICAgICAgIHF1b3RhVGhyZXNob2xkOiByLnF1b3RhX3RocmVzaG9sZCxcbiAgICAgICAgd2VpZ2h0OiByLndlaWdodCxcbiAgICAgIH0pKTtcbiAgICB0aGlzLmRpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcj8ucmVwbGFjZVRva2VucyhhbnRocm9waWNSb3dzKTtcbiAgICBjb25zdCBvcGVuYWlSb3dzID0gcm93c1xuICAgICAgLmZpbHRlcigocikgPT4gci5wcm92aWRlciA9PT0gXCJvcGVuYWlcIilcbiAgICAgIC5tYXAoKHIpID0+ICh7XG4gICAgICAgIGlkOiByLmlkLFxuICAgICAgICBuYW1lOiByLm5hbWUsXG4gICAgICAgIGNyZWRlbnRpYWxzOiByLmNyZWRlbnRpYWxzIGFzIE9wZW5BSUNyZWRlbnRpYWxzLFxuICAgICAgICBxdW90YVRocmVzaG9sZDogci5xdW90YV90aHJlc2hvbGQsXG4gICAgICAgIHdlaWdodDogci53ZWlnaHQsXG4gICAgICB9KSk7XG4gICAgYXdhaXQgdGhpcy5kaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXJcbiAgICAgID8ucmVwbGFjZVRva2VucyhvcGVuYWlSb3dzKVxuICAgICAgLmNhdGNoKChlKSA9PiBsb2dnZXIud2Fybihgb3BlbmFpIHJlY29uY2lsZSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCkpO1xuICAgIHRoaXMubGFzdFJlY29uY2lsZUF0ID0gbmV3IERhdGUoKTtcbiAgICBpZiAoXG4gICAgICBwcmV2aW91c0FudGhyb3BpY0lkcyAmJlxuICAgICAgKHByZXZpb3VzQW50aHJvcGljSWRzLnNpemUgIT09IGFudGhyb3BpY1Jvd3MubGVuZ3RoIHx8XG4gICAgICAgIGFudGhyb3BpY1Jvd3Muc29tZSgocm93KSA9PiAhcHJldmlvdXNBbnRocm9waWNJZHMuaGFzKHJvdy5pZCkpKVxuICAgICkge1xuICAgICAgdGhpcy5ub3RpZnlUb2tlbnNDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbnF1ZXVlT3BlcmF0aW9uKG9wZXJhdGlvbjogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLm9wZXJhdGlvbkNoYWluLnRoZW4ob3BlcmF0aW9uLCBvcGVyYXRpb24pO1xuICAgIHRoaXMub3BlcmF0aW9uQ2hhaW4gPSBuZXh0LmNhdGNoKCgpID0+IHt9KTtcbiAgICByZXR1cm4gbmV4dDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQVNBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyxZQUFZLENBQUM7QUFFaEQsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSx3QkFBd0IsTUFBVTtBQUN4QyxNQUFN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
214
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tc3Vic2NyaWJlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvdG9rZW4tc3Vic2NyaWJlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogdG9rZW5zX2NoYW5nZWQgTElTVEVOIHN1YnNjcmliZXIuICovXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgQ2xpZW50LCB0eXBlIENsaWVudENvbmZpZyB9IGZyb20gXCJwZ1wiO1xuXG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIEFudGhyb3BpY0NyZWRlbnRpYWxzLCB0eXBlIE9wZW5BSUNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFFncmlkRGlzcGF0Y2hlckNsYXNzIH0gZnJvbSBcIi4vcWdyaWQuZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBTdWJzY3JpYmVyU3RhdHVzIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwic3Vic2NyaWJlclwiXSk7XG5cbmNvbnN0IFRPS0VOU19DSEFOR0VEID0gXCJ0b2tlbnNfY2hhbmdlZFwiO1xuY29uc3QgUkVDT05DSUxFX0lOVEVSVkFMX01TID0gMTAgKiA2MCAqIDEwMDA7XG5jb25zdCBDT05ORUNUSU9OX1RJTUVPVVRfTVMgPSA1XzAwMDtcbmNvbnN0IEJBQ0tPRkZfQkFTRV9NUyA9IDUwMDtcbmNvbnN0IEJBQ0tPRkZfQ0FQX01TID0gMzBfMDAwO1xuXG50eXBlIFBheWxvYWQgPSB7IG9wOiBcIklOU0VSVFwiIHwgXCJVUERBVEVcIiB8IFwiREVMRVRFXCI7IGlkOiBudW1iZXIgfTtcblxuZXhwb3J0IGNsYXNzIFRva2VuU3Vic2NyaWJlciB7XG4gIGNsaWVudDogQ2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIHJlY29uY2lsZVRpbWVyOiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuICByZWNvbm5lY3RUaW1lcjogTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gbnVsbDtcbiAgc2h1dGRvd25SZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgYXR0ZW1wdCA9IDA7XG4gIGNvbm5lY3RlZEF0OiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gIGxhc3RSZWNvbmNpbGVBdDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG9wZXJhdGlvbkNoYWluOiBQcm9taXNlPHZvaWQ+ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHByaXZhdGUgdG9rZW5DaGFuZ2VIYW5kbGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY29ubkNvbmZpZzogQ2xpZW50Q29uZmlnLFxuICAgIHB1YmxpYyBkaXNwYXRjaGVyOiBRZ3JpZERpc3BhdGNoZXJDbGFzcyxcbiAgKSB7fVxuXG4gIHNldFRva2VuQ2hhbmdlSGFuZGxlcihoYW5kbGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbkNoYW5nZUhhbmRsZXIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlUb2tlbnNDaGFuZ2VkKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnRva2VuQ2hhbmdlSGFuZGxlcj8uKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKGB0b2tlbiBjaGFuZ2UgaGFuZGxlciBmYWlsZWQ6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRoaXMuc2h1dGRvd25SZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmVuc3VyZVJlY29uY2lsZVRpbWVyKCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jb25uZWN0QW5kUmVjb25jaWxlKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIud2Fybihgc3Vic2NyaWJlciBzdGFydCBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9LCBzY2hlZHVsaW5nIHJldHJ5YCk7XG4gICAgICB0aGlzLnJldHJ5TGF0ZXIoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc2h1dGRvd25SZXF1ZXN0ZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLnJlY29uY2lsZVRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMucmVjb25jaWxlVGltZXIpO1xuICAgICAgdGhpcy5yZWNvbmNpbGVUaW1lciA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlY29ubmVjdFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWNvbm5lY3RUaW1lcik7XG4gICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jbG9zZUNsaWVudCgpO1xuICB9XG5cbiAgc3RhdHVzKCk6IFN1YnNjcmliZXJTdGF0dXMge1xuICAgIHJldHVybiB7XG4gICAgICBjb25uZWN0ZWQ6IHRoaXMuY2xpZW50ICE9PSBudWxsICYmIHRoaXMucmVjb25uZWN0VGltZXIgPT09IG51bGwsXG4gICAgICBjb25uZWN0ZWRBdDogdGhpcy5jb25uZWN0ZWRBdCxcbiAgICAgIGxhc3RSZWNvbmNpbGVBdDogdGhpcy5sYXN0UmVjb25jaWxlQXQsXG4gICAgICBhdHRlbXB0OiB0aGlzLmF0dGVtcHQsXG4gICAgfTtcbiAgfVxuXG4gIGVuc3VyZVJlY29uY2lsZVRpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlY29uY2lsZVRpbWVyKSByZXR1cm47XG5cbiAgICAvLyBMSVNURU4vTk9USUZZIOuKlCDrgYrquLQg64+Z7JWIIOycoOyLpOuQoCDsiJgg7J6I7Ja0IOyjvOq4sOyggeycvOuhnCBEQiDquLDspIDsnLzroZwg66ee7LaY64ukLlxuICAgIHRoaXMucmVjb25jaWxlVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLnJlY29uY2lsZSgpLmNhdGNoKChlKSA9PlxuICAgICAgICBsb2dnZXIud2FybihgcGVyaW9kaWMgcmVjb25jaWxlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSxcbiAgICAgICk7XG4gICAgfSwgUkVDT05DSUxFX0lOVEVSVkFMX01TKTtcbiAgfVxuXG4gIGFzeW5jIGNvbm5lY3RBbmRSZWNvbmNpbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jb25uZWN0QW5kTGlzdGVuKCk7XG4gICAgYXdhaXQgdGhpcy5yZWNvbmNpbGUoKTtcbiAgICB0aGlzLmF0dGVtcHQgPSAwO1xuICB9XG5cbiAgYXN5bmMgY29ubmVjdEFuZExpc3RlbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgQ2xpZW50KHtcbiAgICAgIC4uLnRoaXMuY29ubkNvbmZpZyxcbiAgICAgIGNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzOiBDT05ORUNUSU9OX1RJTUVPVVRfTVMsXG4gICAgICBrZWVwQWxpdmU6IHRydWUsXG4gICAgICBrZWVwQWxpdmVJbml0aWFsRGVsYXlNaWxsaXM6IDEwXzAwMCxcbiAgICAgIGFwcGxpY2F0aW9uX25hbWU6IFwicWdyaWQtbGlzdGVuZXJcIixcbiAgICB9KTtcblxuICAgIGNsaWVudC5vbihcImVycm9yXCIsIChlKSA9PiB7XG4gICAgICBsb2dnZXIud2Fybihgc3Vic2NyaWJlciBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB0aGlzLnJldHJ5TGF0ZXIoKTtcbiAgICB9KTtcbiAgICBjbGllbnQub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnNodXRkb3duUmVxdWVzdGVkKSB0aGlzLnJldHJ5TGF0ZXIoKTtcbiAgICB9KTtcbiAgICBjbGllbnQub24oXCJub3RpZmljYXRpb25cIiwgKG1zZykgPT4ge1xuICAgICAgaWYgKG1zZy5jaGFubmVsICE9PSBUT0tFTlNfQ0hBTkdFRCB8fCAhbXNnLnBheWxvYWQpIHJldHVybjtcbiAgICAgIHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uKG1zZy5wYXlsb2FkKS5jYXRjaCgoZSkgPT5cbiAgICAgICAgbG9nZ2VyLndhcm4oYGhhbmRsZSBOT1RJRlkgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjbGllbnQuY29ubmVjdCgpO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFwiU0VUIHN0YXRlbWVudF90aW1lb3V0ID0gMFwiKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcIlNFVCBpZGxlX2luX3RyYW5zYWN0aW9uX3Nlc3Npb25fdGltZW91dCA9IDBcIik7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoYExJU1RFTiAke2NsaWVudC5lc2NhcGVJZGVudGlmaWVyKFRPS0VOU19DSEFOR0VEKX1gKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjbGllbnQucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICBhd2FpdCBjbGllbnQuZW5kKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLmNvbm5lY3RlZEF0ID0gbmV3IERhdGUoKTtcbiAgICBsb2dnZXIuaW5mbyhgc3Vic2NyaWJlZCB0byAke1RPS0VOU19DSEFOR0VEfWApO1xuICB9XG5cbiAgcmV0cnlMYXRlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaHV0ZG93blJlcXVlc3RlZCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnJlY29ubmVjdFRpbWVyKSByZXR1cm47XG5cbiAgICB2b2lkIHRoaXMuY2xvc2VDbGllbnQoKTtcbiAgICB0aGlzLmF0dGVtcHQgKz0gMTtcbiAgICBjb25zdCBjYXAgPSBNYXRoLm1pbihCQUNLT0ZGX0JBU0VfTVMgKiAyICoqIHRoaXMuYXR0ZW1wdCwgQkFDS09GRl9DQVBfTVMpO1xuICAgIGNvbnN0IGRlbGF5ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2FwKTtcbiAgICBsb2dnZXIuaW5mbyhgcmVjb25uZWN0aW5nIGluICR7ZGVsYXl9bXMgKGF0dGVtcHQgJHt0aGlzLmF0dGVtcHR9KWApO1xuICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucmVjb25uZWN0VGltZXIgPSBudWxsO1xuICAgICAgdGhpcy5jb25uZWN0QW5kUmVjb25jaWxlKCkuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYHN1YnNjcmliZXIgcmVjb25uZWN0IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgdGhpcy5yZXRyeUxhdGVyKCk7XG4gICAgICB9KTtcbiAgICB9LCBkZWxheSk7XG4gIH1cblxuICBhc3luYyBjbG9zZUNsaWVudCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjbGllbnQgPSB0aGlzLmNsaWVudDtcbiAgICBpZiAoIWNsaWVudCkgcmV0dXJuO1xuXG4gICAgdGhpcy5jbGllbnQgPSBudWxsO1xuICAgIGNsaWVudC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBhd2FpdCBjbGllbnQuZW5kKCkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlTm90aWZpY2F0aW9uKHBheWxvYWRKc29uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMuaGFuZGxlTm90aWZpY2F0aW9uTm93KHBheWxvYWRKc29uKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZU5vdGlmaWNhdGlvbk5vdyhwYXlsb2FkSnNvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGF5bG9hZCA9IEpTT04ucGFyc2UocGF5bG9hZEpzb24pIGFzIFBheWxvYWQ7XG4gICAgY29uc3QgcHJldmlvdXNSb3cgPSB0aGlzLnRva2VuQ2hhbmdlSGFuZGxlclxuICAgICAgPyB0aGlzLmRpc3BhdGNoZXIudG9rZW5zLmdldChwYXlsb2FkLmlkKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgd2FzS2VlcGFsaXZlVGFyZ2V0ID0gcHJldmlvdXNSb3c/LmFjdGl2ZSA9PT0gdHJ1ZSAmJiBwcmV2aW91c1Jvdy5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIjtcbiAgICBpZiAocGF5bG9hZC5vcCA9PT0gXCJERUxFVEVcIikge1xuICAgICAgdGhpcy5kaXNwYXRjaGVyLnJlbW92ZUNhY2hlKHBheWxvYWQuaWQpO1xuICAgICAgYXdhaXQgdGhpcy5kaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXJcbiAgICAgICAgPy5vblRva2VuUmVtb3ZlZChwYXlsb2FkLmlkKVxuICAgICAgICAuY2F0Y2goKGUpID0+IGxvZ2dlci53YXJuKGBvcGVuYWkgdG9rZW4gcmVtb3ZlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSk7XG4gICAgICAvLyBhbnRocm9waWMg7Yag7YGwIOydtOuypO2KuOuKlCDrj5nquLAodm9pZCkg4oCUIHByb3ZpZGVyIOulvCDrqqjrpbTrr4DroZwg66y07ZW07ZWY6rKMIO2VreyDgSDsoJzqsbAg7Iuc64+ELlxuICAgICAgdGhpcy5kaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXI/Lm9uVG9rZW5SZW1vdmVkKHBheWxvYWQuaWQpO1xuICAgICAgbG9nZ2VyLmluZm8oYE5PVElGWSAke3BheWxvYWQub3B9IGlkPSR7cGF5bG9hZC5pZH0g4oaSIHJlbW92ZWQgZnJvbSBjYWNoZWApO1xuICAgICAgaWYgKHByZXZpb3VzUm93ID09PSB1bmRlZmluZWQgfHwgd2FzS2VlcGFsaXZlVGFyZ2V0KSB0aGlzLm5vdGlmeVRva2Vuc0NoYW5nZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgcm93ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kT25lKFwiQVwiLCB7IGlkOiBwYXlsb2FkLmlkIH0pO1xuICAgIGlmICghcm93KSB7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIucmVtb3ZlQ2FjaGUocGF5bG9hZC5pZCk7XG4gICAgICBhd2FpdCB0aGlzLmRpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlclxuICAgICAgICA/Lm9uVG9rZW5SZW1vdmVkKHBheWxvYWQuaWQpXG4gICAgICAgIC5jYXRjaCgoZSkgPT4gbG9nZ2VyLndhcm4oYG9wZW5haSB0b2tlbiByZW1vdmUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy5vblRva2VuUmVtb3ZlZChwYXlsb2FkLmlkKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBOT1RJRlkgJHtwYXlsb2FkLm9wfSBpZD0ke3BheWxvYWQuaWR9IOKGkiBtaXNzaW5nLCByZW1vdmVkIGZyb20gY2FjaGVgKTtcbiAgICAgIGlmIChwcmV2aW91c1JvdyA9PT0gdW5kZWZpbmVkIHx8IHdhc0tlZXBhbGl2ZVRhcmdldCkgdGhpcy5ub3RpZnlUb2tlbnNDaGFuZ2VkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kaXNwYXRjaGVyLnVwc2VydENhY2hlKHBheWxvYWQuaWQsIHJvdyk7XG5cbiAgICBpZiAocm93LnByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICBjb25zdCBjcmVkcyA9IHJvdy5jcmVkZW50aWFscyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIGNvbnN0IG9wZW5haURpc3BhdGNoZXIgPSB0aGlzLmRpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcjtcbiAgICAgIGlmIChwYXlsb2FkLm9wID09PSBcIklOU0VSVFwiICYmIHJvdy5hY3RpdmUpIHtcbiAgICAgICAgYXdhaXQgb3BlbmFpRGlzcGF0Y2hlclxuICAgICAgICAgID8ub25Ub2tlbkFkZGVkKFxuICAgICAgICAgICAgcGF5bG9hZC5pZCxcbiAgICAgICAgICAgIHJvdy5uYW1lLFxuICAgICAgICAgICAgY3JlZHMgYXMgT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICByb3cucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICAgICAgcm93LndlaWdodCxcbiAgICAgICAgICApXG4gICAgICAgICAgLmNhdGNoKChlKSA9PiBsb2dnZXIud2Fybihgb3BlbmFpIHRva2VuIGFkZCBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCkpO1xuICAgICAgfSBlbHNlIGlmIChyb3cuYWN0aXZlKSB7XG4gICAgICAgIGlmIChvcGVuYWlEaXNwYXRjaGVyKSB7XG4gICAgICAgICAgYXdhaXQgb3BlbmFpRGlzcGF0Y2hlclxuICAgICAgICAgICAgLm9uVG9rZW5VcGRhdGVkKFxuICAgICAgICAgICAgICBwYXlsb2FkLmlkLFxuICAgICAgICAgICAgICByb3cubmFtZSxcbiAgICAgICAgICAgICAgY3JlZHMgYXMgT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgIHJvdy5xdW90YV90aHJlc2hvbGQsXG4gICAgICAgICAgICAgIHJvdy53ZWlnaHQsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAudGhlbigoKSA9PiBvcGVuYWlEaXNwYXRjaGVyLm9uVG9rZW5BY3RpdmF0ZWQocGF5bG9hZC5pZCkpXG4gICAgICAgICAgICAuY2F0Y2goKGUpID0+IGxvZ2dlci53YXJuKGBvcGVuYWkgdG9rZW4gdXBkYXRlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wZW5haURpc3BhdGNoZXI/Lm9uVG9rZW5EZWFjdGl2YXRlZChwYXlsb2FkLmlkKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJvdy5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIikge1xuICAgICAgLy8gYW50aHJvcGljIO2GoO2BsCDsnbTrsqTtirjripQg64+Z6riwKHZvaWQpLiB3b3JrZXIg6rCAIOyXhuqzoCDtkoAoTWFwKeunjCDqtIDrpqztlZjrr4DroZwg64uo7IicOlxuICAgICAgLy8gIElOU0VSVCDihpIg7LaU6rCALCBhY3RpdmUg66m0IOqwseyLoChvblRva2VuVXBkYXRlZCDqsIAgaWRlbnRpdHkg67OA6rK964+EIOyymOumrCksIGluYWN0aXZlIOuptCDtkoDsl5DshJwg7KCc6rGwLlxuICAgICAgLy8gICjrs4Trj4QgYWN0aXZhdGUvZGVhY3RpdmF0ZSDsvZzrsLHsnbQg7JeG7Ja0IGFjdGl2ZSDthqDquIDsnYQgYWRkL3JlbW92ZSDroZwg66ek7ZWRLilcbiAgICAgIGNvbnN0IGNyZWRzID0gcm93LmNyZWRlbnRpYWxzIGFzIEFudGhyb3BpY0NyZWRlbnRpYWxzO1xuICAgICAgaWYgKHBheWxvYWQub3AgPT09IFwiSU5TRVJUXCIgJiYgcm93LmFjdGl2ZSkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcj8ub25Ub2tlbkFkZGVkKFxuICAgICAgICAgIHBheWxvYWQuaWQsXG4gICAgICAgICAgcm93Lm5hbWUsXG4gICAgICAgICAgY3JlZHMsXG4gICAgICAgICAgcm93LnF1b3RhX3RocmVzaG9sZCxcbiAgICAgICAgICByb3cud2VpZ2h0LFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChyb3cuYWN0aXZlKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy5vblRva2VuVXBkYXRlZChcbiAgICAgICAgICBwYXlsb2FkLmlkLFxuICAgICAgICAgIHJvdy5uYW1lLFxuICAgICAgICAgIGNyZWRzLFxuICAgICAgICAgIHJvdy5xdW90YV90aHJlc2hvbGQsXG4gICAgICAgICAgcm93LndlaWdodCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGluYWN0aXZlIOuptCBJTlNFUlQg65OgIFVQREFURSDrk6Ag7ZKA7JeQIOuEo+yngCDslYrripTri6QuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy5vblRva2VuUmVtb3ZlZChwYXlsb2FkLmlkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbG9nZ2VyLmluZm8oYE5PVElGWSAke3BheWxvYWQub3B9IGlkPSR7cGF5bG9hZC5pZH0gKCR7cm93Lm5hbWV9KSBhY3RpdmU9JHtyb3cuYWN0aXZlfWApO1xuICAgIGNvbnN0IGlzS2VlcGFsaXZlVGFyZ2V0ID0gcm93LmFjdGl2ZSAmJiByb3cucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCI7XG4gICAgaWYgKHdhc0tlZXBhbGl2ZVRhcmdldCAhPT0gaXNLZWVwYWxpdmVUYXJnZXQpIHRoaXMubm90aWZ5VG9rZW5zQ2hhbmdlZCgpO1xuICB9XG5cbiAgYXN5bmMgcmVjb25jaWxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5yZWNvbmNpbGVOb3coKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlY29uY2lsZU5vdygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwcmV2aW91c0FudGhyb3BpY0lkcyA9IHRoaXMudG9rZW5DaGFuZ2VIYW5kbGVyXG4gICAgICA/IG5ldyBTZXQoXG4gICAgICAgICAgWy4uLnRoaXMuZGlzcGF0Y2hlci50b2tlbnMudmFsdWVzKCldXG4gICAgICAgICAgICAuZmlsdGVyKChyb3cpID0+IHJvdy5hY3RpdmUgJiYgcm93LnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKVxuICAgICAgICAgICAgLm1hcCgocm93KSA9PiByb3cuaWQpLFxuICAgICAgICApXG4gICAgICA6IG51bGw7XG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5kZWFjdGl2YXRlRXhwaXJlZFRva2VucygpO1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRBY3RpdmUoXCJBXCIpO1xuICAgIHRoaXMuZGlzcGF0Y2hlci5yZXBsYWNlQ2FjaGUocm93cyk7XG4gICAgLy8gTk9USUZZIOycoOyLpCDrjIDruYQ6IEFudGhyb3BpY0Rpc3BhdGNoZXIg7ZKA64+EIERCIGFjdGl2ZSBhbnRocm9waWMg7Yag7YGwIOq4sOykgOycvOuhnCDsnqzrj5nquLDtmZQuXG4gICAgLy8gKHJvd3Mg64qUIGFjdGl2ZSDrp4wg4oCUIGluYWN0aXZlL+yCreygnOuQnCDthqDtgbDsnYAg7Jes6riwIOyXhuycvOuvgOuhnCByZXBsYWNlVG9rZW5zIOqwgCDtkoDsl5DshJwg7KCc6rGw7ZWc64ukLilcbiAgICBjb25zdCBhbnRocm9waWNSb3dzID0gcm93c1xuICAgICAgLmZpbHRlcigocikgPT4gci5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIilcbiAgICAgIC5tYXAoKHIpID0+ICh7XG4gICAgICAgIGlkOiByLmlkLFxuICAgICAgICBuYW1lOiByLm5hbWUsXG4gICAgICAgIGNyZWRlbnRpYWxzOiByLmNyZWRlbnRpYWxzIGFzIEFudGhyb3BpY0NyZWRlbnRpYWxzLFxuICAgICAgICBxdW90YVRocmVzaG9sZDogci5xdW90YV90aHJlc2hvbGQsXG4gICAgICAgIHdlaWdodDogci53ZWlnaHQsXG4gICAgICB9KSk7XG4gICAgdGhpcy5kaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXI/LnJlcGxhY2VUb2tlbnMoYW50aHJvcGljUm93cyk7XG4gICAgY29uc3Qgb3BlbmFpUm93cyA9IHJvd3NcbiAgICAgIC5maWx0ZXIoKHIpID0+IHIucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpXG4gICAgICAubWFwKChyKSA9PiAoe1xuICAgICAgICBpZDogci5pZCxcbiAgICAgICAgbmFtZTogci5uYW1lLFxuICAgICAgICBjcmVkZW50aWFsczogci5jcmVkZW50aWFscyBhcyBPcGVuQUlDcmVkZW50aWFscyxcbiAgICAgICAgcXVvdGFUaHJlc2hvbGQ6IHIucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICB3ZWlnaHQ6IHIud2VpZ2h0LFxuICAgICAgfSkpO1xuICAgIGF3YWl0IHRoaXMuZGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyXG4gICAgICA/LnJlcGxhY2VUb2tlbnMob3BlbmFpUm93cylcbiAgICAgIC5jYXRjaCgoZSkgPT4gbG9nZ2VyLndhcm4oYG9wZW5haSByZWNvbmNpbGUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApKTtcbiAgICB0aGlzLmxhc3RSZWNvbmNpbGVBdCA9IG5ldyBEYXRlKCk7XG4gICAgaWYgKFxuICAgICAgcHJldmlvdXNBbnRocm9waWNJZHMgJiZcbiAgICAgIChwcmV2aW91c0FudGhyb3BpY0lkcy5zaXplICE9PSBhbnRocm9waWNSb3dzLmxlbmd0aCB8fFxuICAgICAgICBhbnRocm9waWNSb3dzLnNvbWUoKHJvdykgPT4gIXByZXZpb3VzQW50aHJvcGljSWRzLmhhcyhyb3cuaWQpKSlcbiAgICApIHtcbiAgICAgIHRoaXMubm90aWZ5VG9rZW5zQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW5xdWV1ZU9wZXJhdGlvbihvcGVyYXRpb246ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5vcGVyYXRpb25DaGFpbi50aGVuKG9wZXJhdGlvbiwgb3BlcmF0aW9uKTtcbiAgICB0aGlzLm9wZXJhdGlvbkNoYWluID0gbmV4dC5jYXRjaCgoKSA9PiB7fSk7XG4gICAgcmV0dXJuIG5leHQ7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFTQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsWUFBWSxDQUFDO0FB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
@@ -99,7 +99,8 @@ function appendImages(content, images) {
99
99
  return [...content, ...images.map((image) => ({
100
100
  type: "image",
101
101
  data: image.data,
102
- revisedPrompt: image.revisedPrompt ?? null
102
+ revisedPrompt: image.revisedPrompt ?? null,
103
+ ...image.generation ? { generation: image.generation } : {}
103
104
  }))];
104
105
  }
105
106
  function assertStructuredEnvelopeComplexity(root) {
@@ -125,4 +126,4 @@ function assertStructuredEnvelopeComplexity(root) {
125
126
  //#endregion
126
127
  export { ToolCallEmulationError, applyToolCallEmulation };
127
128
 
128
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1lbXVsYXRpb24uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3Rvb2wtZW11bGF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gXCJub2RlOmJ1ZmZlclwiO1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuLy8g7J2R64u1KOuqqOuNuCDstpzroKUpIGVudmVsb3BlIOydmCDsnpDsm5Ag7ZWc64+ELiBjYWxsZXIg7Iqk7YKk66eIIOyghOyymOumrCDtlZzrj4QoQ0FMTEVSX1NDSEVNQV9MSU1JVFMp7JmAIOqwkuydtFxuLy8g6rCZ7JWEIOuztOyXrOuPhCDshJzroZwg64uk66W4IOyekOybkOydhCDsp4DtgqTripQg64+F66a9IOyDgeyImOuLpCDigJQg7Iqk7YKk66eIIOq5iuydtOuKlCDsnbjsiqTthLTsiqQg6rmK7J2066W8IGJvdW5kIO2VmOyngFxuLy8g7JWK7Jy866+A66GcKOyerOq3gCAkcmVmIO2XiOyaqSkg7LqY65+sIO2VnOuPhOulvCDsobDsoJXtlbTrj4Qg7J2R64u1IOyImOyaqSDquLDspIDsnbQg65Sw6528IOybgOyngeyXrOyEoCDslYgg65Cc64ukLlxuY29uc3QgU1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMgPSB7XG4gIG1heFV0ZjhCeXRlczogNTEyICogMTAyNCxcbiAgbWF4Tm9kZXM6IDIwXzAwMCxcbiAgbWF4RGVwdGg6IDEzMixcbn0gYXMgY29uc3Q7XG5pbXBvcnQge1xuICB0eXBlIFFncmlkQ29udGVudCxcbiAgdHlwZSBRZ3JpZFRocmVhZENvb3JkLFxuICB0eXBlIFFncmlkVG9vbCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbn0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwidG9vbC1lbXVsYXRpb25cIl0pO1xuXG50eXBlIEVtdWxhdGlvblJlc3VsdCA9IE9taXQ8UXVlcnlPdXRwdXQsIFwiY29udGVudFwiIHwgXCJmaW5pc2hSZWFzb25cIiB8IFwicnVuQ29udGV4dFwiPjtcbnR5cGUgVG9vbENhbGwgPSB7IHRvb2xOYW1lOiBzdHJpbmc7IGFyZ3M6IHN0cmluZyB9O1xuXG4vLyBlbnZlbG9wZSDripQge3Jlc3VsdDogPHVuaW9uPn0g7ZWcIOqyuSDqtazsobAg4oCUIOyKpO2CpOuniCDqt7zqsbDripQgdG9vbC1lbXVsYXRpb24tc2NoZW1hLnRzIOywuOyhsC5cbi8vIGFuc3dlciDtg4DsnoXrp4wg7JqU7LKtIO2Yle2DnOyXkCDrlLDrnbwg64uk66W064ukOiB0b29scy1vbmx5IOuKlCBzdHJpbmco6re464yA66GcIOuwmO2ZmCksXG4vLyB0b29scytqc29uU2NoZW1hIOuKlCDsgqzsmqnsnpAg7Iqk7YKk66eI7J2YIEpTT04g6rCSKEpTT04uc3RyaW5naWZ5IOuhnCDrsJjtmZgpLlxuZnVuY3Rpb24gYnVpbGRFbnZlbG9wZVNjaGVtYShhbnN3ZXJLaW5kOiBBbnN3ZXJLaW5kKSB7XG4gIHJldHVybiB6LnN0cmljdE9iamVjdCh7XG4gICAgcmVzdWx0OiB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcImFjdGlvblwiLCBbXG4gICAgICB6LnN0cmljdE9iamVjdCh7XG4gICAgICAgIGFjdGlvbjogei5saXRlcmFsKFwiYW5zd2VyXCIpLFxuICAgICAgICBhbnN3ZXI6XG4gICAgICAgICAgYW5zd2VyS2luZCA9PT0gXCJ0ZXh0XCJcbiAgICAgICAgICAgID8gei5zdHJpbmcoKVxuICAgICAgICAgICAgOiB6Lmpzb24oKS5yZWZpbmUoKGFuc3dlcikgPT4gYW5zd2VyICE9PSBudWxsLCB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogXCJhbnN3ZXIgbXVzdCBiZSBub24tbnVsbFwiLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgdG9vbENhbGxzOiB6Lm51bGwoKSxcbiAgICAgIH0pLFxuICAgICAgei5zdHJpY3RPYmplY3Qoe1xuICAgICAgICBhY3Rpb246IHoubGl0ZXJhbChcInRvb2xfY2FsbFwiKSxcbiAgICAgICAgYW5zd2VyOiB6Lm51bGwoKSxcbiAgICAgICAgdG9vbENhbGxzOiB6XG4gICAgICAgICAgLmFycmF5KFxuICAgICAgICAgICAgei5zdHJpY3RPYmplY3Qoe1xuICAgICAgICAgICAgICB0b29sTmFtZTogei5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgYXJnczogei5zdHJpbmcoKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIClcbiAgICAgICAgICAubWluKDEpLFxuICAgICAgfSksXG4gICAgXSksXG4gIH0pO1xufVxuXG5jb25zdCBURVhUX0VOVkVMT1BFID0gYnVpbGRFbnZlbG9wZVNjaGVtYShcInRleHRcIik7XG5jb25zdCBKU09OX0VOVkVMT1BFID0gYnVpbGRFbnZlbG9wZVNjaGVtYShcImpzb25cIik7XG50eXBlIEVudmVsb3BlUmVzcG9uc2UgPSB6LmluZmVyPHR5cGVvZiBKU09OX0VOVkVMT1BFPltcInJlc3VsdFwiXTtcblxuZXhwb3J0IGNsYXNzIFRvb2xDYWxsRW11bGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKGB0b29sLWNhbGwgZW11bGF0aW9uOiAke21lc3NhZ2V9YCk7XG4gICAgdGhpcy5uYW1lID0gXCJUb29sQ2FsbEVtdWxhdGlvbkVycm9yXCI7XG4gIH1cbn1cblxuLy8gZGlzcGF0Y2hlciDqsIAg64SY6riw64qUIOydtOuvuOyngCDqsrDqs7wuIHFncmlkIOuKlCBiYXNlNjQgcGF5bG9hZCDrp4wg7KCE64us7ZWY6rOgIO2PrOunt+ydgCDrs7TsnqXtlZjsp4Ag7JWK64qU64ukLlxuaW50ZXJmYWNlIEVtdWxhdGlvbkltYWdlIHtcbiAgZGF0YTogc3RyaW5nO1xuICByZXZpc2VkUHJvbXB0Pzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLy8gYW5zd2VyIOyduOy9lOuUqSDsooXrpZguIGVudmVsb3BlIOuUlOy9lOuNlOuKlCDtlZwg67KM7J206rOgIOydtCDqsJLsnYAgYW5zd2VyIOu4jOuenOy5mOydmCDtg4DsnoXqs7xcbi8vIOy1nOyihSDsp4HroKztmZQodGV4dDog6re464yA66GcIC8ganNvbjogSlNPTi5zdHJpbmdpZnkp66eMIOqwgOuluOuLpC5cbmV4cG9ydCB0eXBlIEFuc3dlcktpbmQgPSBcInRleHRcIiB8IFwianNvblwiO1xuXG5pbnRlcmZhY2UgVG9vbENhbGxFbXVsYXRpb25PcHRpb25zIHtcbiAgdGhyZWFkQ29vcmQ/OiBRZ3JpZFRocmVhZENvb3JkO1xuICBpbWFnZXM/OiBFbXVsYXRpb25JbWFnZVtdO1xuICAvLyDtlYTsiJg6IO2YuOy2nOu2gOqwgCBhbnN3ZXIg7J247L2U65Sp7J2EIO2VreyDgSDrqoXsi5ztlbTslbwg7ZWc64ukIChpbnB1dC5qc29uU2NoZW1hIOycoOustOuhnCDtjJDsoJUpLlxuICBhbnN3ZXJLaW5kOiBBbnN3ZXJLaW5kO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbihcbiAgcmVzdWx0OiBFbXVsYXRpb25SZXN1bHQsXG4gIHRvb2xzOiBRZ3JpZFRvb2xbXSB8IHVuZGVmaW5lZCxcbiAgb3B0aW9uczogVG9vbENhbGxFbXVsYXRpb25PcHRpb25zLFxuKTogUXVlcnlPdXRwdXQge1xuICBjb25zdCB7IHRocmVhZENvb3JkLCBpbWFnZXMsIGFuc3dlcktpbmQgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHJ1bkNvbnRleHQgPSB0aHJlYWRDb29yZCA/IHsgdGhyZWFkQ29vcmQgfSA6IHVuZGVmaW5lZDtcblxuICBpZiAoIXRvb2xzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gYW5zd2VyT3V0cHV0KHJlc3VsdCwgcmVzdWx0LnRleHQsIGltYWdlcywgcnVuQ29udGV4dCk7XG4gIH1cblxuICBjb25zdCBwYXJzZWQgPSBwYXJzZUVudmVsb3BlKHJlc3VsdC50ZXh0LCB0b29scywgYW5zd2VyS2luZCk7XG4gIGlmIChwYXJzZWQuYWN0aW9uID09PSBcInRvb2xfY2FsbFwiKSB7XG4gICAgcmV0dXJuIHRvb2xDYWxsT3V0cHV0KHJlc3VsdCwgcGFyc2VkLnRvb2xDYWxscywgaW1hZ2VzLCBydW5Db250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiBhbnN3ZXJPdXRwdXQoXG4gICAgcmVzdWx0LFxuICAgIGFuc3dlcktpbmQgPT09IFwidGV4dFwiID8gKHBhcnNlZC5hbnN3ZXIgYXMgc3RyaW5nKSA6IEpTT04uc3RyaW5naWZ5KHBhcnNlZC5hbnN3ZXIpLFxuICAgIGltYWdlcyxcbiAgICBydW5Db250ZXh0LFxuICApO1xufVxuXG5mdW5jdGlvbiBwYXJzZUVudmVsb3BlKHRleHQ6IHN0cmluZywgdG9vbHM6IFFncmlkVG9vbFtdLCBhbnN3ZXJLaW5kOiBBbnN3ZXJLaW5kKSB7XG4gIGlmIChCdWZmZXIuYnl0ZUxlbmd0aCh0ZXh0LCBcInV0ZjhcIikgPiBTVFJVQ1RVUkVEX0VOVkVMT1BFX0xJTUlUUy5tYXhVdGY4Qnl0ZXMpIHtcbiAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgIGB0b29sIGVudmVsb3BlIGV4Y2VlZHMgVVRGLTggYnl0ZSBsaW1pdCBvZiAke1NUUlVDVFVSRURfRU5WRUxPUEVfTElNSVRTLm1heFV0ZjhCeXRlc31gLFxuICAgICk7XG4gIH1cblxuICBsZXQgdmFsdWU6IHVua25vd247XG4gIHRyeSB7XG4gICAgdmFsdWUgPSBKU09OLnBhcnNlKHRleHQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIOq0gOyaqSDtj7TrsLEg7JeG7J2MLiBvcGVuYWkg64qUIGVudmVsb3BlIOydtCBzdHJ1Y3R1cmVkIG91dHB1dCDsnLzroZwg6rCV7KCc65CY66+A66GcIOyXrOq4sCDrj4Tri6ztlZxcbiAgICAvLyDruYQgSlNPTiDsnYAg67KE6re464ukLiBhbnRocm9waWMg7J2AIOqzhOyVveydhCDtlITroaztlITtirjroZzrp4wg7JWI64K07ZWY66+A66GcKFNPTi01MzIpIOu5hCBKU09OIOydtFxuICAgIC8vIFwi7JiI7IOBIOqwgOuKpe2VnCDrqqjrjbgg7Iuk7YyoXCLsp4Drp4wsIOq3uOuemOuPhCDqtazsoJztlZjsp4Ag7JWK64qU64ukIOKAlCDqs7zqsbDsnZgg7YWN7Iqk7Yq4IOq1rOygnOuKlCDth7TtmZRcbiAgICAvLyDrtIntiKzrpbwg64u167OA7Jy866GcIO2dmOugpOuztOuCtCDsobDsmqntlZwg7Jik7Je87J2EIOunjOuTpOyXiOuLpCgyMDI2LTA3IG1lZHBhdGgsIDEzLjVrIOqxtCkuXG4gICAgLy8g7KCV7KeB7ZWcIOyLpO2MqOqwgCDrs7Tsl6zslbwg7IaM67mE7J6Q6rCAIOyerOyLnOuPhO2VmOqxsOuCmCDqt7zrs7gg7JuQ7J247J2EIOqzoOy5nOuLpC5cbiAgICAvLyDsp4Tri6jsl5DripQg7JyE67CYIOybkOusuOydmCDrqLjrpqzqsIAg7ZWE7JqU7ZWY64ukKFNPTi00OTUg7KCE66GAKSDigJQgcGFyc2Ug7JeQ65+sIOychOy5mOunjOycvOuhnOuKlFxuICAgIC8vIFwi7ZSE66Gc7KaI66GcIOuLte2WiOuKlOyngCAvIO2OnOyKpOqwgCDrgqjslZjripTsp4AgLyBKU09OIOydtCDsnpjroLjripTsp4BcIuulvCDqtazrtoTtlaAg7IiYIOyXhuuLpC5cbiAgICBjb25zdCBoZWFkID0gSlNPTi5zdHJpbmdpZnkodGV4dC5zbGljZSgwLCAyMDApKTtcbiAgICBsb2dnZXIud2FybihgdG9vbCBlbnZlbG9wZSBwYXJzZSBmYWlsZWQ6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfTsgaGVhZD0ke2hlYWR9YCk7XG4gICAgdGhyb3cgbmV3IFRvb2xDYWxsRW11bGF0aW9uRXJyb3IoXG4gICAgICBgaW52YWxpZCB0b29sIGVudmVsb3BlIChyZXNwb25zZSBpcyBub3QgSlNPTiDigJQgdGhlIG1vZGVsIGlnbm9yZWQgdGhlIGVudmVsb3BlIGNvbnRyYWN0OyByZXRyeSBpcyB0aGUgY2FsbGVyJ3MgZGVjaXNpb24pOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX07IHJlc3BvbnNlIGhlYWQ6ICR7aGVhZH1gLFxuICAgICk7XG4gIH1cblxuICBhc3NlcnRTdHJ1Y3R1cmVkRW52ZWxvcGVDb21wbGV4aXR5KHZhbHVlKTtcbiAgY29uc3Qgc2NoZW1hID0gYW5zd2VyS2luZCA9PT0gXCJ0ZXh0XCIgPyBURVhUX0VOVkVMT1BFIDogSlNPTl9FTlZFTE9QRTtcbiAgY29uc3QgdmFsaWRhdGlvbiA9IHNjaGVtYS5zYWZlUGFyc2UodmFsdWUpO1xuICBpZiAoIXZhbGlkYXRpb24uc3VjY2Vzcykge1xuICAgIGNvbnN0IGlzc3VlID0gdmFsaWRhdGlvbi5lcnJvci5pc3N1ZXNbMF07XG4gICAgY29uc3QgcGF0aCA9IGlzc3VlICYmIGlzc3VlLnBhdGgubGVuZ3RoID4gMCA/IGAgYXQgJHtpc3N1ZS5wYXRoLmpvaW4oXCIuXCIpfWAgOiBcIlwiO1xuICAgIGNvbnN0IGRldGFpbCA9IGlzc3VlPy5tZXNzYWdlID8/IFwidW5rbm93biB2YWxpZGF0aW9uIGlzc3VlXCI7XG4gICAgLy8gdmFsaWQgSlNPTiDsnbTsp4Drp4wg6rOE7JW9IOychOuwmOyduCDqsr3smrDsl5Drj4Qg7JuQ66y4IOuouOumrOulvCDrgqjquLTri6Qg4oCUIHpvZCDqsr3roZzrp4zsnLzroZzripRcbiAgICAvLyBcIu2CpCDsg53rnrXsnbjsp4AgLyDrnpjtjbzroZwg6rCQ7IyM64qU7KeAIC8g7YOA7J6F7J20IO2LgOuguOuKlOyngFwi7J2YIOyLpOusvOydhCDrs7wg7IiYIOyXhuuLpC5cbiAgICBjb25zdCBoZWFkID0gSlNPTi5zdHJpbmdpZnkodGV4dC5zbGljZSgwLCAyMDApKTtcbiAgICBsb2dnZXIud2FybihgdG9vbCBlbnZlbG9wZSB2YWxpZGF0aW9uIGZhaWxlZCR7cGF0aH06ICR7ZGV0YWlsfTsgaGVhZD0ke2hlYWR9YCk7XG4gICAgdGhyb3cgbmV3IFRvb2xDYWxsRW11bGF0aW9uRXJyb3IoXG4gICAgICBgaW52YWxpZCB0b29sIGVudmVsb3BlJHtwYXRofTogJHtkZXRhaWx9OyByZXNwb25zZSBoZWFkOiAke2hlYWR9YCxcbiAgICApO1xuICB9XG5cbiAgLy8gWm9kIGNsb25lcyBKU09OIG9iamVjdHMgYW5kIGRyb3BzIG93biBcIl9fcHJvdG9fX1wiIGtleXMuIFRoZSBwYXJzZWQgSlNPTiBpcyBzYWZlIHRvIHJldHVyblxuICAvLyBhZnRlciB2YWxpZGF0aW9uIGFuZCBwcmVzZXJ2ZXMgdGhlIGNhbGxlcidzIGV4YWN0IHN0cnVjdHVyZWQgdmFsdWUuXG4gIGNvbnN0IHJlc3BvbnNlID0gKHZhbHVlIGFzIHsgcmVzdWx0OiBFbnZlbG9wZVJlc3BvbnNlIH0pLnJlc3VsdDtcbiAgaWYgKHJlc3BvbnNlLmFjdGlvbiA9PT0gXCJ0b29sX2NhbGxcIikge1xuICAgIGNvbnN0IHVua25vd25Ub29sID0gZmluZFVua25vd25Ub29sKHJlc3BvbnNlLnRvb2xDYWxscywgdG9vbHMpO1xuICAgIGlmICh1bmtub3duVG9vbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihgdW5rbm93biBlbXVsYXRlZCB0b29sOiAke3Vua25vd25Ub29sfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbmZ1bmN0aW9uIHRvb2xDYWxsT3V0cHV0KFxuICByZXN1bHQ6IEVtdWxhdGlvblJlc3VsdCxcbiAgdG9vbENhbGxzOiBUb29sQ2FsbFtdLFxuICBpbWFnZXM6IEVtdWxhdGlvbkltYWdlW10gfCB1bmRlZmluZWQsXG4gIHJ1bkNvbnRleHQ6IFF1ZXJ5T3V0cHV0W1wicnVuQ29udGV4dFwiXSxcbik6IFF1ZXJ5T3V0cHV0IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5yZXN1bHQsXG4gICAgY29udGVudDogYXBwZW5kSW1hZ2VzKFxuICAgICAgdG9vbENhbGxzLm1hcCgodG9vbENhbGwpID0+ICh7XG4gICAgICAgIHR5cGU6IFwidG9vbC1jYWxsXCIsXG4gICAgICAgIHRvb2xDYWxsSWQ6IGBjYWxsXyR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTApfWAsXG4gICAgICAgIHRvb2xOYW1lOiB0b29sQ2FsbC50b29sTmFtZSxcbiAgICAgICAgaW5wdXQ6IHRvb2xDYWxsLmFyZ3MsXG4gICAgICB9KSksXG4gICAgICBpbWFnZXMsXG4gICAgKSxcbiAgICBmaW5pc2hSZWFzb246IFwidG9vbC1jYWxsc1wiLFxuICAgIHJ1bkNvbnRleHQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFuc3dlck91dHB1dChcbiAgcmVzdWx0OiBFbXVsYXRpb25SZXN1bHQsXG4gIHRleHQ6IHN0cmluZyxcbiAgaW1hZ2VzOiBFbXVsYXRpb25JbWFnZVtdIHwgdW5kZWZpbmVkLFxuICBydW5Db250ZXh0OiBRdWVyeU91dHB1dFtcInJ1bkNvbnRleHRcIl0sXG4pOiBRdWVyeU91dHB1dCB7XG4gIHJldHVybiB7XG4gICAgLi4ucmVzdWx0LFxuICAgIHRleHQsXG4gICAgY29udGVudDogYXBwZW5kSW1hZ2VzKFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0IH1dLCBpbWFnZXMpLFxuICAgIGZpbmlzaFJlYXNvbjogXCJzdG9wXCIsXG4gICAgcnVuQ29udGV4dCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmluZFVua25vd25Ub29sKHRvb2xDYWxsczogVG9vbENhbGxbXSwgdG9vbHM6IFFncmlkVG9vbFtdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qga25vd25Ub29sTmFtZXMgPSBuZXcgU2V0KHRvb2xzLm1hcCgodG9vbCkgPT4gdG9vbC5uYW1lKSk7XG4gIHJldHVybiB0b29sQ2FsbHMuZmluZCgodG9vbENhbGwpID0+ICFrbm93blRvb2xOYW1lcy5oYXModG9vbENhbGwudG9vbE5hbWUpKT8udG9vbE5hbWU7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZEltYWdlcyhjb250ZW50OiBRZ3JpZENvbnRlbnRbXSwgaW1hZ2VzPzogRW11bGF0aW9uSW1hZ2VbXSk6IFFncmlkQ29udGVudFtdIHtcbiAgaWYgKCFpbWFnZXM/Lmxlbmd0aCkgcmV0dXJuIGNvbnRlbnQ7XG4gIHJldHVybiBbXG4gICAgLi4uY29udGVudCxcbiAgICAuLi5pbWFnZXMubWFwKFxuICAgICAgKGltYWdlKTogUWdyaWRDb250ZW50ID0+ICh7XG4gICAgICAgIHR5cGU6IFwiaW1hZ2VcIixcbiAgICAgICAgZGF0YTogaW1hZ2UuZGF0YSxcbiAgICAgICAgcmV2aXNlZFByb21wdDogaW1hZ2UucmV2aXNlZFByb21wdCA/PyBudWxsLFxuICAgICAgfSksXG4gICAgKSxcbiAgXTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0U3RydWN0dXJlZEVudmVsb3BlQ29tcGxleGl0eShyb290OiB1bmtub3duKTogdm9pZCB7XG4gIGNvbnN0IG1heERlcHRoID0gU1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMubWF4RGVwdGg7XG4gIGNvbnN0IHN0YWNrID0gW3sgdmFsdWU6IHJvb3QsIGRlcHRoOiAwIH1dO1xuICBsZXQgbm9kZXMgPSAwO1xuXG4gIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgY3VycmVudCA9IHN0YWNrLnBvcCgpITtcbiAgICBub2RlcyArPSAxO1xuICAgIGlmIChub2RlcyA+IFNUUlVDVFVSRURfRU5WRUxPUEVfTElNSVRTLm1heE5vZGVzKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgICAgYHN0cnVjdHVyZWQtb3V0cHV0IGVudmVsb3BlIGV4Y2VlZHMgbm9kZSBsaW1pdCBvZiAke1NUUlVDVFVSRURfRU5WRUxPUEVfTElNSVRTLm1heE5vZGVzfWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoY3VycmVudC5kZXB0aCA+IG1heERlcHRoKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgICAgYHN0cnVjdHVyZWQtb3V0cHV0IGVudmVsb3BlIGV4Y2VlZHMgZGVwdGggbGltaXQgb2YgJHttYXhEZXB0aH1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjdXJyZW50LnZhbHVlID09PSBcIm51bWJlclwiICYmICFOdW1iZXIuaXNGaW5pdGUoY3VycmVudC52YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKFwiYW5zd2VyIG11c3QgYmUgdmFsaWQgSlNPTlwiKTtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnQudmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIGN1cnJlbnQudmFsdWUgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBPYmplY3QudmFsdWVzKGN1cnJlbnQudmFsdWUpKSB7XG4gICAgICBzdGFjay5wdXNoKHsgdmFsdWUsIGRlcHRoOiBjdXJyZW50LmRlcHRoICsgMSB9KTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQVFBLE1BQU0sNkJBQTZCO0NBQ2pDLGNBQWMsTUFBTTtDQUNwQixVQUFVO0NBQ1YsVUFBVTtBQUNaO0FBUUEsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLGdCQUFnQixDQUFDO0FBUXBELFNBQVMsb0JBQW9CLFlBQXdCO0NBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQ3BCLFFBQVEsRUFBRSxtQkFBbUIsVUFBVSxDQUNyQyxFQUFFLGFBQWE7RUFDYixRQUFRLEVBQUUsUUFBUSxRQUFRO0VBQzFCLFFBQ0UsZUFBZSxTQUNYLEVBQUUsT0FBTyxJQUNULEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxXQUFXLFdBQVcsTUFBTSxFQUMzQyxTQUFTLDBCQUNYLENBQUM7RUFDUCxXQUFXLEVBQUUsS0FBSztDQUNwQixDQUFDLEdBQ0QsRUFBRSxhQUFhO0VBQ2IsUUFBUSxFQUFFLFFBQVEsV0FBVztFQUM3QixRQUFRLEVBQUUsS0FBSztFQUNmLFdBQVcsRUFDUixNQUNDLEVBQUUsYUFBYTtHQUNiLFVBQVUsRUFBRSxPQUFPO0dBQ25CLE1BQU0sRUFBRSxP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
129
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1lbXVsYXRpb24uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3Rvb2wtZW11bGF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1ZmZlciB9IGZyb20gXCJub2RlOmJ1ZmZlclwiO1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuLy8g7J2R64u1KOuqqOuNuCDstpzroKUpIGVudmVsb3BlIOydmCDsnpDsm5Ag7ZWc64+ELiBjYWxsZXIg7Iqk7YKk66eIIOyghOyymOumrCDtlZzrj4QoQ0FMTEVSX1NDSEVNQV9MSU1JVFMp7JmAIOqwkuydtFxuLy8g6rCZ7JWEIOuztOyXrOuPhCDshJzroZwg64uk66W4IOyekOybkOydhCDsp4DtgqTripQg64+F66a9IOyDgeyImOuLpCDigJQg7Iqk7YKk66eIIOq5iuydtOuKlCDsnbjsiqTthLTsiqQg6rmK7J2066W8IGJvdW5kIO2VmOyngFxuLy8g7JWK7Jy866+A66GcKOyerOq3gCAkcmVmIO2XiOyaqSkg7LqY65+sIO2VnOuPhOulvCDsobDsoJXtlbTrj4Qg7J2R64u1IOyImOyaqSDquLDspIDsnbQg65Sw6528IOybgOyngeyXrOyEoCDslYgg65Cc64ukLlxuY29uc3QgU1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMgPSB7XG4gIG1heFV0ZjhCeXRlczogNTEyICogMTAyNCxcbiAgbWF4Tm9kZXM6IDIwXzAwMCxcbiAgbWF4RGVwdGg6IDEzMixcbn0gYXMgY29uc3Q7XG5pbXBvcnQge1xuICB0eXBlIEltYWdlR2VuZXJhdGlvbk1ldGFkYXRhLFxuICB0eXBlIFFncmlkQ29udGVudCxcbiAgdHlwZSBRZ3JpZFRocmVhZENvb3JkLFxuICB0eXBlIFFncmlkVG9vbCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbn0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwidG9vbC1lbXVsYXRpb25cIl0pO1xuXG50eXBlIEVtdWxhdGlvblJlc3VsdCA9IE9taXQ8UXVlcnlPdXRwdXQsIFwiY29udGVudFwiIHwgXCJmaW5pc2hSZWFzb25cIiB8IFwicnVuQ29udGV4dFwiPjtcbnR5cGUgVG9vbENhbGwgPSB7IHRvb2xOYW1lOiBzdHJpbmc7IGFyZ3M6IHN0cmluZyB9O1xuXG4vLyBlbnZlbG9wZSDripQge3Jlc3VsdDogPHVuaW9uPn0g7ZWcIOqyuSDqtazsobAg4oCUIOyKpO2CpOuniCDqt7zqsbDripQgdG9vbC1lbXVsYXRpb24tc2NoZW1hLnRzIOywuOyhsC5cbi8vIGFuc3dlciDtg4DsnoXrp4wg7JqU7LKtIO2Yle2DnOyXkCDrlLDrnbwg64uk66W064ukOiB0b29scy1vbmx5IOuKlCBzdHJpbmco6re464yA66GcIOuwmO2ZmCksXG4vLyB0b29scytqc29uU2NoZW1hIOuKlCDsgqzsmqnsnpAg7Iqk7YKk66eI7J2YIEpTT04g6rCSKEpTT04uc3RyaW5naWZ5IOuhnCDrsJjtmZgpLlxuZnVuY3Rpb24gYnVpbGRFbnZlbG9wZVNjaGVtYShhbnN3ZXJLaW5kOiBBbnN3ZXJLaW5kKSB7XG4gIHJldHVybiB6LnN0cmljdE9iamVjdCh7XG4gICAgcmVzdWx0OiB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcImFjdGlvblwiLCBbXG4gICAgICB6LnN0cmljdE9iamVjdCh7XG4gICAgICAgIGFjdGlvbjogei5saXRlcmFsKFwiYW5zd2VyXCIpLFxuICAgICAgICBhbnN3ZXI6XG4gICAgICAgICAgYW5zd2VyS2luZCA9PT0gXCJ0ZXh0XCJcbiAgICAgICAgICAgID8gei5zdHJpbmcoKVxuICAgICAgICAgICAgOiB6Lmpzb24oKS5yZWZpbmUoKGFuc3dlcikgPT4gYW5zd2VyICE9PSBudWxsLCB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogXCJhbnN3ZXIgbXVzdCBiZSBub24tbnVsbFwiLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgdG9vbENhbGxzOiB6Lm51bGwoKSxcbiAgICAgIH0pLFxuICAgICAgei5zdHJpY3RPYmplY3Qoe1xuICAgICAgICBhY3Rpb246IHoubGl0ZXJhbChcInRvb2xfY2FsbFwiKSxcbiAgICAgICAgYW5zd2VyOiB6Lm51bGwoKSxcbiAgICAgICAgdG9vbENhbGxzOiB6XG4gICAgICAgICAgLmFycmF5KFxuICAgICAgICAgICAgei5zdHJpY3RPYmplY3Qoe1xuICAgICAgICAgICAgICB0b29sTmFtZTogei5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgYXJnczogei5zdHJpbmcoKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIClcbiAgICAgICAgICAubWluKDEpLFxuICAgICAgfSksXG4gICAgXSksXG4gIH0pO1xufVxuXG5jb25zdCBURVhUX0VOVkVMT1BFID0gYnVpbGRFbnZlbG9wZVNjaGVtYShcInRleHRcIik7XG5jb25zdCBKU09OX0VOVkVMT1BFID0gYnVpbGRFbnZlbG9wZVNjaGVtYShcImpzb25cIik7XG50eXBlIEVudmVsb3BlUmVzcG9uc2UgPSB6LmluZmVyPHR5cGVvZiBKU09OX0VOVkVMT1BFPltcInJlc3VsdFwiXTtcblxuZXhwb3J0IGNsYXNzIFRvb2xDYWxsRW11bGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKGB0b29sLWNhbGwgZW11bGF0aW9uOiAke21lc3NhZ2V9YCk7XG4gICAgdGhpcy5uYW1lID0gXCJUb29sQ2FsbEVtdWxhdGlvbkVycm9yXCI7XG4gIH1cbn1cblxuLy8gZGlzcGF0Y2hlciDqsIAg64SY6riw64qUIOydtOuvuOyngCDqsrDqs7wuIHFncmlkIOuKlCBiYXNlNjQgcGF5bG9hZCDrp4wg7KCE64us7ZWY6rOgIO2PrOunt+ydgCDrs7TsnqXtlZjsp4Ag7JWK64qU64ukLlxuaW50ZXJmYWNlIEVtdWxhdGlvbkltYWdlIHtcbiAgZGF0YTogc3RyaW5nO1xuICByZXZpc2VkUHJvbXB0Pzogc3RyaW5nIHwgbnVsbDtcbiAgZ2VuZXJhdGlvbj86IEltYWdlR2VuZXJhdGlvbk1ldGFkYXRhO1xufVxuXG4vLyBhbnN3ZXIg7J247L2U65SpIOyiheulmC4gZW52ZWxvcGUg65SU7L2U642U64qUIO2VnCDrsozsnbTqs6Ag7J20IOqwkuydgCBhbnN3ZXIg67iM656c7LmY7J2YIO2DgOyeheqzvFxuLy8g7LWc7KKFIOyngeugrO2ZlCh0ZXh0OiDqt7jrjIDroZwgLyBqc29uOiBKU09OLnN0cmluZ2lmeSnrp4wg6rCA66W464ukLlxuZXhwb3J0IHR5cGUgQW5zd2VyS2luZCA9IFwidGV4dFwiIHwgXCJqc29uXCI7XG5cbmludGVyZmFjZSBUb29sQ2FsbEVtdWxhdGlvbk9wdGlvbnMge1xuICB0aHJlYWRDb29yZD86IFFncmlkVGhyZWFkQ29vcmQ7XG4gIGltYWdlcz86IEVtdWxhdGlvbkltYWdlW107XG4gIC8vIO2VhOyImDog7Zi47Lac67aA6rCAIGFuc3dlciDsnbjsvZTrlKnsnYQg7ZWt7IOBIOuqheyLnO2VtOyVvCDtlZzri6QgKGlucHV0Lmpzb25TY2hlbWEg7Jyg66y066GcIO2MkOyglSkuXG4gIGFuc3dlcktpbmQ6IEFuc3dlcktpbmQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVRvb2xDYWxsRW11bGF0aW9uKFxuICByZXN1bHQ6IEVtdWxhdGlvblJlc3VsdCxcbiAgdG9vbHM6IFFncmlkVG9vbFtdIHwgdW5kZWZpbmVkLFxuICBvcHRpb25zOiBUb29sQ2FsbEVtdWxhdGlvbk9wdGlvbnMsXG4pOiBRdWVyeU91dHB1dCB7XG4gIGNvbnN0IHsgdGhyZWFkQ29vcmQsIGltYWdlcywgYW5zd2VyS2luZCB9ID0gb3B0aW9ucztcbiAgY29uc3QgcnVuQ29udGV4dCA9IHRocmVhZENvb3JkID8geyB0aHJlYWRDb29yZCB9IDogdW5kZWZpbmVkO1xuXG4gIGlmICghdG9vbHM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBhbnN3ZXJPdXRwdXQocmVzdWx0LCByZXN1bHQudGV4dCwgaW1hZ2VzLCBydW5Db250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlRW52ZWxvcGUocmVzdWx0LnRleHQsIHRvb2xzLCBhbnN3ZXJLaW5kKTtcbiAgaWYgKHBhcnNlZC5hY3Rpb24gPT09IFwidG9vbF9jYWxsXCIpIHtcbiAgICByZXR1cm4gdG9vbENhbGxPdXRwdXQocmVzdWx0LCBwYXJzZWQudG9vbENhbGxzLCBpbWFnZXMsIHJ1bkNvbnRleHQpO1xuICB9XG5cbiAgcmV0dXJuIGFuc3dlck91dHB1dChcbiAgICByZXN1bHQsXG4gICAgYW5zd2VyS2luZCA9PT0gXCJ0ZXh0XCIgPyAocGFyc2VkLmFuc3dlciBhcyBzdHJpbmcpIDogSlNPTi5zdHJpbmdpZnkocGFyc2VkLmFuc3dlciksXG4gICAgaW1hZ2VzLFxuICAgIHJ1bkNvbnRleHQsXG4gICk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRW52ZWxvcGUodGV4dDogc3RyaW5nLCB0b29sczogUWdyaWRUb29sW10sIGFuc3dlcktpbmQ6IEFuc3dlcktpbmQpIHtcbiAgaWYgKEJ1ZmZlci5ieXRlTGVuZ3RoKHRleHQsIFwidXRmOFwiKSA+IFNUUlVDVFVSRURfRU5WRUxPUEVfTElNSVRTLm1heFV0ZjhCeXRlcykge1xuICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKFxuICAgICAgYHRvb2wgZW52ZWxvcGUgZXhjZWVkcyBVVEYtOCBieXRlIGxpbWl0IG9mICR7U1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMubWF4VXRmOEJ5dGVzfWAsXG4gICAgKTtcbiAgfVxuXG4gIGxldCB2YWx1ZTogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICB2YWx1ZSA9IEpTT04ucGFyc2UodGV4dCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8g6rSA7JqpIO2PtOuwsSDsl4bsnYwuIG9wZW5haSDripQgZW52ZWxvcGUg7J20IHN0cnVjdHVyZWQgb3V0cHV0IOycvOuhnCDqsJXsoJzrkJjrr4DroZwg7Jes6riwIOuPhOuLrO2VnFxuICAgIC8vIOu5hCBKU09OIOydgCDrsoTqt7jri6QuIGFudGhyb3BpYyDsnYAg6rOE7JW97J2EIO2UhOuhrO2UhO2KuOuhnOunjCDslYjrgrTtlZjrr4DroZwoU09OLTUzMikg67mEIEpTT04g7J20XG4gICAgLy8gXCLsmIjsg4Eg6rCA64ql7ZWcIOuqqOuNuCDsi6TtjKhcIuyngOunjCwg6re4656Y64+EIOq1rOygnO2VmOyngCDslYrripTri6Qg4oCUIOqzvOqxsOydmCDthY3siqTtirgg6rWs7KCc64qUIO2HtO2ZlFxuICAgIC8vIOu0ie2IrOulvCDri7Xrs4DsnLzroZwg7Z2Y66Ck67O064K0IOyhsOyaqe2VnCDsmKTsl7zsnYQg66eM65Ok7JeI64ukKDIwMjYtMDcgbWVkcGF0aCwgMTMuNWsg6rG0KS5cbiAgICAvLyDsoJXsp4HtlZwg7Iuk7Yyo6rCAIOuztOyXrOyVvCDshozruYTsnpDqsIAg7J6s7Iuc64+E7ZWY6rGw64KYIOq3vOuzuCDsm5DsnbjsnYQg6rOg7Lmc64ukLlxuICAgIC8vIOynhOuLqOyXkOuKlCDsnITrsJgg7JuQ66y47J2YIOuouOumrOqwgCDtlYTsmpTtlZjri6QoU09OLTQ5NSDsoITroYApIOKAlCBwYXJzZSDsl5Drn6wg7JyE7LmY66eM7Jy866Gc64qUXG4gICAgLy8gXCLtlITroZzspojroZwg64u17ZaI64qU7KeAIC8g7Y6c7Iqk6rCAIOuCqOyVmOuKlOyngCAvIEpTT04g7J20IOyemOuguOuKlOyngFwi66W8IOq1rOu2hO2VoCDsiJgg7JeG64ukLlxuICAgIGNvbnN0IGhlYWQgPSBKU09OLnN0cmluZ2lmeSh0ZXh0LnNsaWNlKDAsIDIwMCkpO1xuICAgIGxvZ2dlci53YXJuKGB0b29sIGVudmVsb3BlIHBhcnNlIGZhaWxlZDogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9OyBoZWFkPSR7aGVhZH1gKTtcbiAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgIGBpbnZhbGlkIHRvb2wgZW52ZWxvcGUgKHJlc3BvbnNlIGlzIG5vdCBKU09OIOKAlCB0aGUgbW9kZWwgaWdub3JlZCB0aGUgZW52ZWxvcGUgY29udHJhY3Q7IHJldHJ5IGlzIHRoZSBjYWxsZXIncyBkZWNpc2lvbik6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfTsgcmVzcG9uc2UgaGVhZDogJHtoZWFkfWAsXG4gICAgKTtcbiAgfVxuXG4gIGFzc2VydFN0cnVjdHVyZWRFbnZlbG9wZUNvbXBsZXhpdHkodmFsdWUpO1xuICBjb25zdCBzY2hlbWEgPSBhbnN3ZXJLaW5kID09PSBcInRleHRcIiA/IFRFWFRfRU5WRUxPUEUgOiBKU09OX0VOVkVMT1BFO1xuICBjb25zdCB2YWxpZGF0aW9uID0gc2NoZW1hLnNhZmVQYXJzZSh2YWx1ZSk7XG4gIGlmICghdmFsaWRhdGlvbi5zdWNjZXNzKSB7XG4gICAgY29uc3QgaXNzdWUgPSB2YWxpZGF0aW9uLmVycm9yLmlzc3Vlc1swXTtcbiAgICBjb25zdCBwYXRoID0gaXNzdWUgJiYgaXNzdWUucGF0aC5sZW5ndGggPiAwID8gYCBhdCAke2lzc3VlLnBhdGguam9pbihcIi5cIil9YCA6IFwiXCI7XG4gICAgY29uc3QgZGV0YWlsID0gaXNzdWU/Lm1lc3NhZ2UgPz8gXCJ1bmtub3duIHZhbGlkYXRpb24gaXNzdWVcIjtcbiAgICAvLyB2YWxpZCBKU09OIOydtOyngOunjCDqs4Tslb0g7JyE67CY7J24IOqyveyasOyXkOuPhCDsm5DrrLgg66i466as66W8IOuCqOq4tOuLpCDigJQgem9kIOqyveuhnOunjOycvOuhnOuKlFxuICAgIC8vIFwi7YKkIOyDneueteyduOyngCAvIOuemO2NvOuhnCDqsJDsjIzripTsp4AgLyDtg4DsnoXsnbQg7YuA66C464qU7KeAXCLsnZgg7Iuk66y87J2EIOuzvCDsiJgg7JeG64ukLlxuICAgIGNvbnN0IGhlYWQgPSBKU09OLnN0cmluZ2lmeSh0ZXh0LnNsaWNlKDAsIDIwMCkpO1xuICAgIGxvZ2dlci53YXJuKGB0b29sIGVudmVsb3BlIHZhbGlkYXRpb24gZmFpbGVkJHtwYXRofTogJHtkZXRhaWx9OyBoZWFkPSR7aGVhZH1gKTtcbiAgICB0aHJvdyBuZXcgVG9vbENhbGxFbXVsYXRpb25FcnJvcihcbiAgICAgIGBpbnZhbGlkIHRvb2wgZW52ZWxvcGUke3BhdGh9OiAke2RldGFpbH07IHJlc3BvbnNlIGhlYWQ6ICR7aGVhZH1gLFxuICAgICk7XG4gIH1cblxuICAvLyBab2QgY2xvbmVzIEpTT04gb2JqZWN0cyBhbmQgZHJvcHMgb3duIFwiX19wcm90b19fXCIga2V5cy4gVGhlIHBhcnNlZCBKU09OIGlzIHNhZmUgdG8gcmV0dXJuXG4gIC8vIGFmdGVyIHZhbGlkYXRpb24gYW5kIHByZXNlcnZlcyB0aGUgY2FsbGVyJ3MgZXhhY3Qgc3RydWN0dXJlZCB2YWx1ZS5cbiAgY29uc3QgcmVzcG9uc2UgPSAodmFsdWUgYXMgeyByZXN1bHQ6IEVudmVsb3BlUmVzcG9uc2UgfSkucmVzdWx0O1xuICBpZiAocmVzcG9uc2UuYWN0aW9uID09PSBcInRvb2xfY2FsbFwiKSB7XG4gICAgY29uc3QgdW5rbm93blRvb2wgPSBmaW5kVW5rbm93blRvb2wocmVzcG9uc2UudG9vbENhbGxzLCB0b29scyk7XG4gICAgaWYgKHVua25vd25Ub29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKGB1bmtub3duIGVtdWxhdGVkIHRvb2w6ICR7dW5rbm93blRvb2x9YCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuZnVuY3Rpb24gdG9vbENhbGxPdXRwdXQoXG4gIHJlc3VsdDogRW11bGF0aW9uUmVzdWx0LFxuICB0b29sQ2FsbHM6IFRvb2xDYWxsW10sXG4gIGltYWdlczogRW11bGF0aW9uSW1hZ2VbXSB8IHVuZGVmaW5lZCxcbiAgcnVuQ29udGV4dDogUXVlcnlPdXRwdXRbXCJydW5Db250ZXh0XCJdLFxuKTogUXVlcnlPdXRwdXQge1xuICByZXR1cm4ge1xuICAgIC4uLnJlc3VsdCxcbiAgICBjb250ZW50OiBhcHBlbmRJbWFnZXMoXG4gICAgICB0b29sQ2FsbHMubWFwKCh0b29sQ2FsbCkgPT4gKHtcbiAgICAgICAgdHlwZTogXCJ0b29sLWNhbGxcIixcbiAgICAgICAgdG9vbENhbGxJZDogYGNhbGxfJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMCl9YCxcbiAgICAgICAgdG9vbE5hbWU6IHRvb2xDYWxsLnRvb2xOYW1lLFxuICAgICAgICBpbnB1dDogdG9vbENhbGwuYXJncyxcbiAgICAgIH0pKSxcbiAgICAgIGltYWdlcyxcbiAgICApLFxuICAgIGZpbmlzaFJlYXNvbjogXCJ0b29sLWNhbGxzXCIsXG4gICAgcnVuQ29udGV4dCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYW5zd2VyT3V0cHV0KFxuICByZXN1bHQ6IEVtdWxhdGlvblJlc3VsdCxcbiAgdGV4dDogc3RyaW5nLFxuICBpbWFnZXM6IEVtdWxhdGlvbkltYWdlW10gfCB1bmRlZmluZWQsXG4gIHJ1bkNvbnRleHQ6IFF1ZXJ5T3V0cHV0W1wicnVuQ29udGV4dFwiXSxcbik6IFF1ZXJ5T3V0cHV0IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5yZXN1bHQsXG4gICAgdGV4dCxcbiAgICBjb250ZW50OiBhcHBlbmRJbWFnZXMoW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQgfV0sIGltYWdlcyksXG4gICAgZmluaXNoUmVhc29uOiBcInN0b3BcIixcbiAgICBydW5Db250ZXh0LFxuICB9O1xufVxuXG5mdW5jdGlvbiBmaW5kVW5rbm93blRvb2wodG9vbENhbGxzOiBUb29sQ2FsbFtdLCB0b29sczogUWdyaWRUb29sW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBrbm93blRvb2xOYW1lcyA9IG5ldyBTZXQodG9vbHMubWFwKCh0b29sKSA9PiB0b29sLm5hbWUpKTtcbiAgcmV0dXJuIHRvb2xDYWxscy5maW5kKCh0b29sQ2FsbCkgPT4gIWtub3duVG9vbE5hbWVzLmhhcyh0b29sQ2FsbC50b29sTmFtZSkpPy50b29sTmFtZTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kSW1hZ2VzKGNvbnRlbnQ6IFFncmlkQ29udGVudFtdLCBpbWFnZXM/OiBFbXVsYXRpb25JbWFnZVtdKTogUWdyaWRDb250ZW50W10ge1xuICBpZiAoIWltYWdlcz8ubGVuZ3RoKSByZXR1cm4gY29udGVudDtcbiAgcmV0dXJuIFtcbiAgICAuLi5jb250ZW50LFxuICAgIC4uLmltYWdlcy5tYXAoXG4gICAgICAoaW1hZ2UpOiBRZ3JpZENvbnRlbnQgPT4gKHtcbiAgICAgICAgdHlwZTogXCJpbWFnZVwiLFxuICAgICAgICBkYXRhOiBpbWFnZS5kYXRhLFxuICAgICAgICByZXZpc2VkUHJvbXB0OiBpbWFnZS5yZXZpc2VkUHJvbXB0ID8/IG51bGwsXG4gICAgICAgIC4uLihpbWFnZS5nZW5lcmF0aW9uID8geyBnZW5lcmF0aW9uOiBpbWFnZS5nZW5lcmF0aW9uIH0gOiB7fSksXG4gICAgICB9KSxcbiAgICApLFxuICBdO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRTdHJ1Y3R1cmVkRW52ZWxvcGVDb21wbGV4aXR5KHJvb3Q6IHVua25vd24pOiB2b2lkIHtcbiAgY29uc3QgbWF4RGVwdGggPSBTVFJVQ1RVUkVEX0VOVkVMT1BFX0xJTUlUUy5tYXhEZXB0aDtcbiAgY29uc3Qgc3RhY2sgPSBbeyB2YWx1ZTogcm9vdCwgZGVwdGg6IDAgfV07XG4gIGxldCBub2RlcyA9IDA7XG5cbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBjdXJyZW50ID0gc3RhY2sucG9wKCkhO1xuICAgIG5vZGVzICs9IDE7XG4gICAgaWYgKG5vZGVzID4gU1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMubWF4Tm9kZXMpIHtcbiAgICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKFxuICAgICAgICBgc3RydWN0dXJlZC1vdXRwdXQgZW52ZWxvcGUgZXhjZWVkcyBub2RlIGxpbWl0IG9mICR7U1RSVUNUVVJFRF9FTlZFTE9QRV9MSU1JVFMubWF4Tm9kZXN9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChjdXJyZW50LmRlcHRoID4gbWF4RGVwdGgpIHtcbiAgICAgIHRocm93IG5ldyBUb29sQ2FsbEVtdWxhdGlvbkVycm9yKFxuICAgICAgICBgc3RydWN0dXJlZC1vdXRwdXQgZW52ZWxvcGUgZXhjZWVkcyBkZXB0aCBsaW1pdCBvZiAke21heERlcHRofWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGN1cnJlbnQudmFsdWUgPT09IFwibnVtYmVyXCIgJiYgIU51bWJlci5pc0Zpbml0ZShjdXJyZW50LnZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xDYWxsRW11bGF0aW9uRXJyb3IoXCJhbnN3ZXIgbXVzdCBiZSB2YWxpZCBKU09OXCIpO1xuICAgIH1cbiAgICBpZiAoY3VycmVudC52YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgY3VycmVudC52YWx1ZSAhPT0gXCJvYmplY3RcIikgY29udGludWU7XG5cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIE9iamVjdC52YWx1ZXMoY3VycmVudC52YWx1ZSkpIHtcbiAgICAgIHN0YWNrLnB1c2goeyB2YWx1ZSwgZGVwdGg6IGN1cnJlbnQuZGVwdGggKyAxIH0pO1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBUUEsTUFBTSw2QkFBNkI7Q0FDakMsY0FBYyxNQUFNO0NBQ3BCLFVBQVU7Q0FDVixVQUFVO0FBQ1o7QUFTQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsZ0JBQWdCLENBQUM7QUFRcEQsU0FBUyxvQkFBb0IsWUFBd0I7Q0FDbkQsT0FBTyxFQUFFLGFBQWEsRUFDcEIsUUFBUSxFQUFFLG1CQUFtQixVQUFVLENBQ3JDLEVBQUUsYUFBYTtFQUNiLFFBQVEsRUFBRSxRQUFRLFFBQVE7RUFDMUIsUUFDRSxlQUFlLFNBQ1gsRUFBRSxPQUFPLElBQ1QsRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLFdBQVcsV0FBVyxNQUFNLEVBQzNDLFNBQVMsMEJBQ1gsQ0FBQztFQUNQLFdBQVcsRUFB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
@@ -6,6 +6,7 @@ import { detectSupervisor } from "../../utils/process-supervisor.js";
6
6
  import { armServerRestartExit, beginServerRestart } from "../../utils/server-restart.js";
7
7
  import { SETTING_DEFS, TOKEN_WINDOW_KEEPALIVE_RUNNER_ENV_KEY, findSettingDef, maskSecret, validateSettingValue } from "./setting.constant.js";
8
8
  import { getSetting, isStored, resetSetting, saveSetting } from "./setting.store.js";
9
+ import { SlackNotificationError } from "../../utils/slack-notify.js";
9
10
  import { BadRequestException, BaseModelClass, NotFoundException, SoException, Sonamu, api, asArray, exhaustive } from "sonamu";
10
11
  import { getLogger } from "@logtape/logtape";
11
12
  //#region src/application/setting/setting.model.ts
@@ -215,7 +216,12 @@ var SettingModelClass = class extends BaseModelClass {
215
216
  */
216
217
  async triggerExpiryReminder() {
217
218
  const { sendExpiredTokenReminderNow } = await import("../qgrid/expired-token-reminder.js");
218
- return { sent: await sendExpiredTokenReminderNow() };
219
+ try {
220
+ return { sent: await sendExpiredTokenReminderNow() };
221
+ } catch (error) {
222
+ if (error instanceof SlackNotificationError) throw new BadRequestException(error.message);
223
+ throw error;
224
+ }
219
225
  }
220
226
  /**
221
227
  * 서버를 재시작한다 — 정확히는 스스로 종료하고, pm2 가 다시 띄우는 것에 맡긴다.
@@ -314,4 +320,4 @@ const SettingModel = new SettingModelClass();
314
320
  //#endregion
315
321
  export { SettingModel };
316
322
 
317
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZy5tb2RlbC5qcyIsIm5hbWVzIjpbInNhdmVTdG9yZWRTZXR0aW5nIiwicmVzZXRTdG9yZWRTZXR0aW5nIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3NldHRpbmcvc2V0dGluZy5tb2RlbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHtcbiAgQmFzZU1vZGVsQ2xhc3MsXG4gIHR5cGUgTGlzdFJlc3VsdCxcbiAgYXNBcnJheSxcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIEJhZFJlcXVlc3RFeGNlcHRpb24sXG4gIFNvRXhjZXB0aW9uLFxuICBTb25hbXUsXG4gIGFwaSxcbiAgZXhoYXVzdGl2ZSxcbn0gZnJvbSBcInNvbmFtdVwiO1xuXG5pbXBvcnQgeyBTRCB9IGZyb20gXCIuLi8uLi9pMThuL3NkLmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgZGV0ZWN0U3VwZXJ2aXNvciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm9jZXNzLXN1cGVydmlzb3JcIjtcbmltcG9ydCB7IGFybVNlcnZlclJlc3RhcnRFeGl0LCBiZWdpblNlcnZlclJlc3RhcnQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvc2VydmVyLXJlc3RhcnRcIjtcbmltcG9ydCB7IHR5cGUgU2V0dGluZ1N1YnNldEtleSwgdHlwZSBTZXR0aW5nU3Vic2V0TWFwcGluZyB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBzZXR0aW5nU3Vic2V0UXVlcmllcywgc2V0dGluZ0xvYWRlclF1ZXJpZXMgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZC5zc29cIjtcbmltcG9ydCB7XG4gIGZpbmRTZXR0aW5nRGVmLFxuICBtYXNrU2VjcmV0LFxuICBTRVRUSU5HX0RFRlMsXG4gIFRPS0VOX1dJTkRPV19LRUVQQUxJVkVfUlVOTkVSX0VOVl9LRVksXG4gIHZhbGlkYXRlU2V0dGluZ1ZhbHVlLFxufSBmcm9tIFwiLi9zZXR0aW5nLmNvbnN0YW50XCI7XG5pbXBvcnQge1xuICBnZXRTZXR0aW5nLFxuICBpc1N0b3JlZCxcbiAgcmVzZXRTZXR0aW5nIGFzIHJlc2V0U3RvcmVkU2V0dGluZyxcbiAgc2F2ZVNldHRpbmcgYXMgc2F2ZVN0b3JlZFNldHRpbmcsXG59IGZyb20gXCIuL3NldHRpbmcuc3RvcmVcIjtcbmltcG9ydCB7XG4gIHR5cGUgUnVudGltZUluZm9JdGVtLFxuICB0eXBlIFNldHRpbmdBcHBsaWVzLFxuICB0eXBlIFNldHRpbmdJdGVtLFxuICB0eXBlIFNldHRpbmdMaXN0UGFyYW1zLFxuICB0eXBlIFNldHRpbmdTYXZlUGFyYW1zLFxuICB0eXBlIFNldHRpbmdzUmVzcG9uc2UsXG4gIHR5cGUgU3VwZXJ2aXNvcktpbmQsXG59IGZyb20gXCIuL3NldHRpbmcudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwic2V0dGluZ1wiXSk7XG5cbmNsYXNzIEZvcmJpZGRlbkV4Y2VwdGlvbiBleHRlbmRzIFNvRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoNDAzLCBTRChcImVycm9yLmZvcmJpZGRlblwiKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmlyc3RIZWFkZXJWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gKEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWVbMF0gOiB2YWx1ZSk/LnNwbGl0KFwiLFwiKVswXT8udHJpbSgpO1xufVxuXG4vKiogT3JpZ2luIOyXhuuKlCDsmrTsmIEgQ0xJIOyalOyyreydgCDthrXqs7zsi5ztgqTrkJgsIOu4jOudvOyasOyggCDqtZDssKgg7Lac7LKYIFBPU1Qg64qUIOunieuKlOuLpC4gKi9cbmZ1bmN0aW9uIGFzc2VydFJlc3RhcnRPcmlnaW4oKTogdm9pZCB7XG4gIGNvbnN0IHsgaGVhZGVycyB9ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgY29uc3Qgb3JpZ2luID0gZmlyc3RIZWFkZXJWYWx1ZShoZWFkZXJzLm9yaWdpbik7XG4gIGlmIChoZWFkZXJzLm9yaWdpbiA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIGlmICghb3JpZ2luKSB0aHJvdyBuZXcgRm9yYmlkZGVuRXhjZXB0aW9uKCk7XG5cbiAgY29uc3QgaG9zdCA9IGZpcnN0SGVhZGVyVmFsdWUoaGVhZGVyc1tcIngtZm9yd2FyZGVkLWhvc3RcIl0pID8/IGZpcnN0SGVhZGVyVmFsdWUoaGVhZGVycy5ob3N0KTtcbiAgdHJ5IHtcbiAgICBpZiAoIWhvc3QgfHwgbmV3IFVSTChvcmlnaW4pLmhvc3QgIT09IGhvc3QpIHRocm93IG5ldyBGb3JiaWRkZW5FeGNlcHRpb24oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBGb3JiaWRkZW5FeGNlcHRpb24pIHRocm93IGVycm9yO1xuICAgIHRocm93IG5ldyBGb3JiaWRkZW5FeGNlcHRpb24oKTtcbiAgfVxufVxuXG4vKlxuICBTZXR0aW5nIE1vZGVsXG4qL1xuY2xhc3MgU2V0dGluZ01vZGVsQ2xhc3MgZXh0ZW5kcyBCYXNlTW9kZWxDbGFzczxcbiAgU2V0dGluZ1N1YnNldEtleSxcbiAgU2V0dGluZ1N1YnNldE1hcHBpbmcsXG4gIHR5cGVvZiBzZXR0aW5nU3Vic2V0UXVlcmllcyxcbiAgdHlwZW9mIHNldHRpbmdMb2FkZXJRdWVyaWVzXG4+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJTZXR0aW5nXCIsIHNldHRpbmdTdWJzZXRRdWVyaWVzLCBzZXR0aW5nTG9hZGVyUXVlcmllcyk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSwgcmVzb3VyY2VOYW1lOiBcIlNldHRpbmdcIiB9KVxuICBhc3luYyBmaW5kQnlJZDxUIGV4dGVuZHMgU2V0dGluZ1N1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIGlkOiBudW1iZXIsXG4gICk6IFByb21pc2U8U2V0dGluZ1N1YnNldE1hcHBpbmdbVF0+IHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHRoaXMuZmluZE1hbnkoc3Vic2V0LCB7XG4gICAgICBpZCxcbiAgICAgIG51bTogMSxcbiAgICAgIHBhZ2U6IDEsXG4gICAgfSk7XG4gICAgaWYgKCFyb3dzWzBdKSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5lbnRpdHlOb3RGb3VuZFwiKShcIlNldHRpbmdcIiwgaWQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm93c1swXTtcbiAgfVxuXG4gIGFzeW5jIGZpbmRPbmU8VCBleHRlbmRzIFNldHRpbmdTdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBsaXN0UGFyYW1zOiBTZXR0aW5nTGlzdFBhcmFtcyxcbiAgKTogUHJvbWlzZTxTZXR0aW5nU3Vic2V0TWFwcGluZ1tUXSB8IG51bGw+IHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHRoaXMuZmluZE1hbnkoc3Vic2V0LCB7XG4gICAgICAuLi5saXN0UGFyYW1zLFxuICAgICAgbnVtOiAxLFxuICAgICAgcGFnZTogMSxcbiAgICB9KTtcblxuICAgIHJldHVybiByb3dzWzBdID8/IG51bGw7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSwgcmVzb3VyY2VOYW1lOiBcIlNldHRpbmdzXCIgfSlcbiAgYXN5bmMgZmluZE1hbnk8VCBleHRlbmRzIFNldHRpbmdTdWJzZXRLZXksIExQIGV4dGVuZHMgU2V0dGluZ0xpc3RQYXJhbXM+KFxuICAgIHN1YnNldDogVCxcbiAgICByYXdQYXJhbXM/OiBMUCxcbiAgKTogUHJvbWlzZTxMaXN0UmVzdWx0PExQLCBTZXR0aW5nU3Vic2V0TWFwcGluZ1tUXT4+IHtcbiAgICAvLyBwYXJhbXMgd2l0aCBkZWZhdWx0c1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG51bTogMjQsXG4gICAgICBwYWdlOiAxLFxuICAgICAgc2VhcmNoOiBcImtleVwiIGFzIGNvbnN0LFxuICAgICAgb3JkZXJCeTogXCJrZXktYXNjXCIgYXMgY29uc3QsXG4gICAgICAuLi5yYXdQYXJhbXMsXG4gICAgfSBzYXRpc2ZpZXMgU2V0dGluZ0xpc3RQYXJhbXM7XG5cbiAgICAvLyBidWlsZCBxdWVyaWVzXG4gICAgY29uc3QgeyBxYiwgb25TdWJzZXQ6IF8gfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhzdWJzZXQpO1xuXG4gICAgLy8gaWRcbiAgICBpZiAocGFyYW1zLmlkKSB7XG4gICAgICBxYi53aGVyZUluKFwic2V0dGluZ3MuaWRcIiwgYXNBcnJheShwYXJhbXMuaWQpKTtcbiAgICB9XG5cbiAgICAvLyBrZXkg4oCUIHRvRmlsdGVyIHByb3Ag7J207KeA66eMIOyKpOy6kO2PtOuUqeydtCDrp4zrk6TslrTso7zsp4Ag7JWK7JWEIOyngeygkSDqsbTri6QuXG4gICAgaWYgKHBhcmFtcy5rZXkpIHtcbiAgICAgIHFiLndoZXJlKFwic2V0dGluZ3Mua2V5XCIsIHBhcmFtcy5rZXkpO1xuICAgIH1cblxuICAgIC8vIHNlYXJjaC1rZXl3b3JkXG4gICAgaWYgKHBhcmFtcy5zZWFyY2ggJiYgcGFyYW1zLmtleXdvcmQgJiYgcGFyYW1zLmtleXdvcmQubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHBhcmFtcy5zZWFyY2ggPT09IFwia2V5XCIpIHtcbiAgICAgICAgcWIud2hlcmUoXCJzZXR0aW5ncy5rZXlcIiwgXCJsaWtlXCIsIGAlJHtwYXJhbXMua2V5d29yZH0lYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcImVycm9yLnVua25vd25TZWFyY2hGaWVsZFwiKShwYXJhbXMuc2VhcmNoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gb3JkZXJCeVxuICAgIGlmIChwYXJhbXMub3JkZXJCeSkge1xuICAgICAgLy8gZGVmYXVsdCBvcmRlckJ5XG4gICAgICBpZiAocGFyYW1zLm9yZGVyQnkgPT09IFwia2V5LWFzY1wiKSB7XG4gICAgICAgIHFiLm9yZGVyQnkoXCJzZXR0aW5ncy5rZXlcIiwgXCJhc2NcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGhhdXN0aXZlKHBhcmFtcy5vcmRlckJ5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7XG4gICAgICBBOiAocm93KSA9PiAoe1xuICAgICAgICAuLi5yb3csXG4gICAgICAgIC8vIOyEnOu4jOyFi+uzhOuhnCB2aXJ0dWFsIO2VhOuTnCDqs4TsgrDroZzsp4Eg7LaU6rCAXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtcyxcbiAgICAgIGVuaGFuY2VycyxcbiAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoc3BhOiBTZXR0aW5nU2F2ZVBhcmFtc1tdKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG5cbiAgICAvLyByZWdpc3RlclxuICAgIHNwYS5mb3JFYWNoKChzcCkgPT4ge1xuICAgICAgd2RiLnViUmVnaXN0ZXIoXCJzZXR0aW5nc1wiLCBzcCk7XG4gICAgfSk7XG5cbiAgICAvLyB0cmFuc2FjdGlvblxuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgY29uc3QgaWRzID0gYXdhaXQgdHJ4LnViVXBzZXJ0KFwic2V0dGluZ3NcIik7XG5cbiAgICAgIHJldHVybiBpZHM7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBkZWwoaWRzOiBudW1iZXJbXSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcblxuICAgIC8vIHRyYW5zYWN0aW9uXG4gICAgYXdhaXQgd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIHJldHVybiB0cngudGFibGUoXCJzZXR0aW5nc1wiKS53aGVyZUluKFwic2V0dGluZ3MuaWRcIiwgaWRzKS5kZWxldGUoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBpZHMubGVuZ3RoO1xuICB9XG5cbiAgLyoqIOyggOyepeuQnCDshKTsoJUg7KCE7LK066W8IGtleeKGknZhbHVlIOuhnC4g67aA7YyFIOyLnCDtlZwg67KIIOydveyWtCDrqZTrqqjrpqzsl5Ag7Jis66aw64ukLiAqL1xuICBhc3luYyBmaW5kQWxsQXNNYXAoKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBzdHJpbmc+PiB7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLmZpbmRNYW55KFwiQVwiLCB7IG51bTogMCwgcGFnZTogMSB9KTtcbiAgICByZXR1cm4gbmV3IE1hcChyb3dzLm1hcCgocikgPT4gW3Iua2V5LCByLnZhbHVlXSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIGtleSDroZwgdXBzZXJ0IO2VnOuLpC4gYHNhdmVgIOuKlCBpZCDquLDspIDsnbTrnbwga2V5IOykkeuzteydhCDqsbjrn6zrgrTsp4Ag66q77ZW0LCDquLDsobQg7ZaJ7J2EIOuovOyggCDssL7slYRcbiAgICogaWQg66W8IOyLpOyWtCDrs7Trgrjri6QuXG4gICAqL1xuICBhc3luYyBzZXRCeUtleShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5maW5kT25lKFwiQVwiLCB7IGtleSwgbnVtOiAxLCBwYWdlOiAxIH0pO1xuICAgIGF3YWl0IHRoaXMuc2F2ZShbXG4gICAgICB7XG4gICAgICAgIC4uLihleGlzdGluZyA/IHsgaWQ6IGV4aXN0aW5nLmlkIH0gOiB7fSksXG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHVwZGF0ZWRfYXQ6IG5ldyBEYXRlKCksXG4gICAgICB9LFxuICAgIF0pO1xuICB9XG5cbiAgLyoqIOyggOyepeqwkuydhCDsp4Dsm4wgZW52IOq4sOuzuOqwkuycvOuhnCDrkJjrj4zrprDri6QuICovXG4gIGFzeW5jIGNsZWFyQnlLZXkoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMuZmluZE9uZShcIkFcIiwgeyBrZXksIG51bTogMSwgcGFnZTogMSB9KTtcbiAgICBpZiAoZXhpc3RpbmcpIGF3YWl0IHRoaXMuZGVsKFtleGlzdGluZy5pZF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIO2OuOynkSDqsIDriqXtlZwg7ISk7KCV6rO8IOydveq4sCDsoITsmqkg65+w7YOA7J6EIOygleuztC4g7Y647KeRIOuMgOyDgeydgCBgU0VUVElOR19ERUZTYCDsl5Ag7KCV7J2Y65CcIOqyg+u/kOydtOuLpCDigJRcbiAgICogREIg7KCR7IaNIOygleuztOuCmCDtj6ztirjripQg7ISc67KE6rCAIOucqOq4sCDsoITsl5Ag7ZWE7JqU7ZW0IO2ZlOuptOyXkOyEnCDrsJTqv4Ag7IiYIOyXhuuLpC5cbiAgICovXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdLCByZXNvdXJjZU5hbWU6IFwiU2V0dGluZ0xpc3RcIiB9KVxuICBhc3luYyBsaXN0U2V0dGluZ3MoKTogUHJvbWlzZTxTZXR0aW5nc1Jlc3BvbnNlPiB7XG4gICAgY29uc3Qgc2V0dGluZ3M6IFNldHRpbmdJdGVtW10gPSBTRVRUSU5HX0RFRlMubWFwKChkZWYpID0+IHtcbiAgICAgIC8vIOyggOyepeqwkuuPhCBlbnYg64+EIOyXhuycvOuptCDsvZTrk5wg6riw67O46rCS7J20IOyLpOygnOuhnCDsoIHsmqkg7KSR7J2064ukLiDruYjsubjsnLzroZwg65GQ66m0IO2ZlOuptOqzvFxuICAgICAgLy8g65+w7YOA7J6E7J20IOyWtOq4i+uCmCDrs7Tsnbjri6QuXG4gICAgICBjb25zdCBzdG9yZWQgPSBpc1N0b3JlZChkZWYua2V5KTtcbiAgICAgIGNvbnN0IHJhdyA9IGdldFNldHRpbmcoZGVmLmtleSwgZGVmLmVudktleSk7XG4gICAgICBjb25zdCBlZmZlY3RpdmUgPSByYXcgPz8gZGVmLmZhbGxiYWNrO1xuICAgICAgY29uc3Qgc291cmNlID0gc3RvcmVkID8gXCJkYlwiIDogcmF3ICE9PSB1bmRlZmluZWQgPyBcImVudlwiIDogXCJkZWZhdWx0XCI7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogZGVmLmtleSxcbiAgICAgICAgZ3JvdXA6IGRlZi5ncm91cCxcbiAgICAgICAgbGFiZWw6IGRlZi5sYWJlbCxcbiAgICAgICAga2luZDogZGVmLmtpbmQsXG4gICAgICAgIGFwcGxpZXM6IGRlZi5hcHBsaWVzLFxuICAgICAgICAvLyDriIgg7Yag6riA7J2EIOychO2VtCBzZWNyZXQg64+EIOybkOuzuOydhCDrgrTroKTrs7Trgrjri6QuIOydtCDsl5Trk5ztj6zsnbjtirjripQg67Cw7Y+sIOqyveqzhOyXkOyEnFxuICAgICAgICAvLyDrsJjrk5zsi5wg7J247Kad7ZW07JW8IO2VnOuLpC5cbiAgICAgICAgdmFsdWU6IGVmZmVjdGl2ZSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICBtaW46IGRlZi5taW4gPz8gbnVsbCxcbiAgICAgICAgbWF4OiBkZWYubWF4ID8/IG51bGwsXG4gICAgICAgIHByZXNldHM6IGRlZi5wcmVzZXRzID8/IFtdLFxuICAgICAgICBoZWxwOiBkZWYuaGVscCA/PyBudWxsLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBzZXR0aW5ncyxcbiAgICAgIHJ1bnRpbWU6IHRoaXMucnVudGltZUluZm8oKSxcbiAgICAgIHN1cGVydmlzb3I6IGRldGVjdFN1cGVydmlzb3IoKSxcbiAgICAgIGtlZXBhbGl2ZVJ1bm5lckVuYWJsZWQ6IHByb2Nlc3MuZW52W1RPS0VOX1dJTkRPV19LRUVQQUxJVkVfUlVOTkVSX0VOVl9LRVldID09PSBcInRydWVcIixcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBydW50aW1lSW5mbygpOiBSdW50aW1lSW5mb0l0ZW1bXSB7XG4gICAgY29uc3QgZW52ID0gcHJvY2Vzcy5lbnY7XG4gICAgY29uc3QgcGFzc3dvcmQgPSBlbnYuUUdSSURfREJfUEFTU1dPUkQgPz8gZW52LlNPTkFNVV9EQl9QQVNTV09SRCA/PyBcIlwiO1xuICAgIHJldHVybiBbXG4gICAgICB7IGxhYmVsOiBcIk5PREVfRU5WXCIsIHZhbHVlOiBlbnYuTk9ERV9FTlYgPz8gXCItXCIgfSxcbiAgICAgIHsgbGFiZWw6IFwiSE9TVFwiLCB2YWx1ZTogZW52LkhPU1QgPz8gXCJsb2NhbGhvc3RcIiB9LFxuICAgICAgeyBsYWJlbDogXCJQT1JUXCIsIHZhbHVlOiBlbnYuUE9SVCA/PyBcIjQ0OTAwXCIgfSxcbiAgICAgIHsgbGFiZWw6IFwiREIgSG9zdFwiLCB2YWx1ZTogZW52LlFHUklEX0RCX0hPU1QgPz8gZW52LlNPTkFNVV9EQl9IT1NUID8/IFwiLVwiIH0sXG4gICAgICB7IGxhYmVsOiBcIkRCIFBvcnRcIiwgdmFsdWU6IGVudi5RR1JJRF9EQl9QT1JUID8/IGVudi5TT05BTVVfREJfUE9SVCA/PyBcIi1cIiB9LFxuICAgICAgeyBsYWJlbDogXCJEQiBOYW1lXCIsIHZhbHVlOiBlbnYuUUdSSURfREJfTkFNRSA/PyBlbnYuU09OQU1VX0RCX05BTUUgPz8gXCItXCIgfSxcbiAgICAgIHsgbGFiZWw6IFwiREIgVXNlclwiLCB2YWx1ZTogZW52LlFHUklEX0RCX1VTRVIgPz8gZW52LlNPTkFNVV9EQl9VU0VSID8/IFwiLVwiIH0sXG4gICAgICB7IGxhYmVsOiBcIkRCIFBhc3N3b3JkXCIsIHZhbHVlOiBwYXNzd29yZCA/IG1hc2tTZWNyZXQocGFzc3dvcmQpIDogXCItXCIgfSxcbiAgICBdO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHVwZGF0ZVNldHRpbmcoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPHsgYXBwbGllczogU2V0dGluZ0FwcGxpZXMgfT4ge1xuICAgIGNvbnN0IGRlZiA9IGZpbmRTZXR0aW5nRGVmKGtleSk7XG4gICAgaWYgKCFkZWYpIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic2V0dGluZy51bmtub3duS2V5XCIpKGtleSkpO1xuXG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IHZhbGlkYXRlU2V0dGluZ1ZhbHVlKGRlZiwgdmFsdWUpO1xuICAgIGlmICghdmFsaWRhdGlvbi5vaykge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzZXR0aW5nLmludmFsaWRWYWx1ZVwiKSh2YWxpZGF0aW9uLmVycm9yKSk7XG4gICAgfVxuXG4gICAgYXdhaXQgc2F2ZVN0b3JlZFNldHRpbmcoa2V5LCB2YWxpZGF0aW9uLnZhbHVlKTtcbiAgICByZXR1cm4geyBhcHBsaWVzOiBkZWYuYXBwbGllcyB9O1xuICB9XG5cbiAgLyoqIOyggOyepeqwkuydhCDsp4Dsm4wgZW52IOq4sOuzuOqwkuycvOuhnCDrkJjrj4zrprDri6QuICovXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyByZXNldFNldHRpbmcoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHsgYXBwbGllczogU2V0dGluZ0FwcGxpZXMgfT4ge1xuICAgIGNvbnN0IGRlZiA9IGZpbmRTZXR0aW5nRGVmKGtleSk7XG4gICAgaWYgKCFkZWYpIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic2V0dGluZy51bmtub3duS2V5XCIpKGtleSkpO1xuXG4gICAgYXdhaXQgcmVzZXRTdG9yZWRTZXR0aW5nKGtleSk7XG4gICAgcmV0dXJuIHsgYXBwbGllczogZGVmLmFwcGxpZXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrp4zro4wg7JWM66a87J2EIOyngOq4iCDtlZwg67KIIOuztOuCuOuLpC4g7KO86riw66W8IOq4sOuLpOumrOyngCDslYrqs6Ag7ISk7KCV7J20IOygnOuMgOuhnCDrtpnsl4jripTsp4Ag7ZmV7J247ZWY6rGw64KYLFxuICAgKiDsnqzroZzqt7jsnbjsnYQg7J6s7LSJ7ZWgIOuVjCDsk7Tri6QuIOuztOuCuCDqsbTsiJjrpbwg64+M66Ck7KSYIFwi67O064K8IOuMgOyDgSDsl4bsnYxcIuqzvCDqtazrtoTtlZzri6QuXG4gICAqL1xuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgdHJpZ2dlckV4cGlyeVJlbWluZGVyKCk6IFByb21pc2U8eyBzZW50OiBudW1iZXIgfT4ge1xuICAgIC8vIOuPmeyggSBpbXBvcnQg66GcIOyVjOumvCDrqqjrk4jsnYQg7Zi47LacIOyLnOygkOyXkOunjCDrgYzslrTsmKjri6QuIOygleyggeycvOuhnCDqsbjrqbRcbiAgICAvLyBzZXR0aW5nLm1vZGVsIOKGkiBleHBpcmVkLXRva2VuLXJlbWluZGVyIOKGkiB0b2tlbi5tb2RlbCDqsr3roZzqsIAg7IOd6rKoLFxuICAgIC8vIHRva2VuLm1vZGVsIOydhCBtb2NrIO2VmOuKlCDthYzsiqTtirjqsIAg7Iuk7KCcIOuqqOuTiOydhCDrqLzsoIAg66Gc65Oc7ZWY6rKMIOuQnOuLpC5cbiAgICBjb25zdCB7IHNlbmRFeHBpcmVkVG9rZW5SZW1pbmRlck5vdyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vcWdyaWQvZXhwaXJlZC10b2tlbi1yZW1pbmRlclwiKTtcbiAgICByZXR1cm4geyBzZW50OiBhd2FpdCBzZW5kRXhwaXJlZFRva2VuUmVtaW5kZXJOb3coKSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOyEnOuyhOulvCDsnqzsi5zsnpHtlZzri6Qg4oCUIOygle2Zle2eiOuKlCDsiqTsiqTroZwg7KKF66OM7ZWY6rOgLCBwbTIg6rCAIOuLpOyLnCDrnYTsmrDripQg6rKD7JeQIOunoeq4tOuLpC5cbiAgICpcbiAgICogYHJlc3RhcnRgIOuhnCDtkZzsi5zrkJwg7JuM7LukIOyEpOygleydgCBkaXNwYXRjaGVyIOyDneyEseyekOyXkOyEnCDtlZwg67KI66eMIOydve2eiOuvgOuhnCDsnbQg6rK966GcIOunkOqzoOuKlFxuICAgKiDrsJjsmIHtlaAg67Cp67KV7J20IOyXhuyXiOuLpC4g7KeA6riI6rmM7KeA64qUIFNTSCDroZwgYHBtMiByZXN0YXJ0YCDrpbwg7LOQ7JW8IO2WiOuLpC5cbiAgICpcbiAgICog67aA7IiYIO2aqOqzvOqwgCDtlZjrgpgg642UIOyeiOuLpDogcG0yIOuKlCBgZWNvc3lzdGVtLmNvbmZpZy5janNgIOydmCDsm5Drnpgg66qF66C57Jy866GcIOuLpOyLnCDrnYTsmrDqs6AsXG4gICAqIOq3uCDrqoXroLnsl5AgYC0tc2tpcC11cGRhdGVgIOqwgCDsl4bsnLzrqbQgQ0xJIOqwgCBucG0g7LWc7IugIOuyhOyghOydhCDrsJvslYQg7Jis66aw64ukLiDspokg7J6s7Iuc7J6R7J2AXG4gICAqIOuwsO2PrOydtOq4sOuPhCDtlZjri6Qg4oCUIO2ZlOuptCDrrLjqtazqsIAg7J20IOyCrOyLpOydhCDtlajqu5gg7JWM66aw64ukLlxuICAgKi9cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHJlc3RhcnRTZXJ2ZXIoKTogUHJvbWlzZTx7IHN1cGVydmlzb3I6IFN1cGVydmlzb3JLaW5kIH0+IHtcbiAgICBhc3NlcnRSZXN0YXJ0T3JpZ2luKCk7XG4gICAgY29uc3Qgc3VwZXJ2aXNvciA9IGRldGVjdFN1cGVydmlzb3IoKTtcbiAgICBpZiAoIXN1cGVydmlzb3IpIHtcbiAgICAgIC8vIOuLpOyLnCDrnYTsm4zspIQg7KO87LK06rCAIOyXhuycvOuptCDsooXro4zqsIAg6rOnIOygleyngOuLpC4g7IK066a0IOyImCDsl4bripTrjbAg7KO97J207KeAIOyViuuKlOuLpC5cbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic2V0dGluZy5ub1N1cGVydmlzb3JcIikoKSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyByZXBseSB9ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICBjb25zdCBzdGFydGVkID0gYmVnaW5TZXJ2ZXJSZXN0YXJ0KCk7XG4gICAgaWYgKHN0YXJ0ZWQpIHtcbiAgICAgIGxvZ2dlci53YXJuKGByZXN0YXJ0IHJlcXVlc3RlZCB2aWEgZGFzaGJvYXJkLCBleGl0aW5nIGZvciAke3N1cGVydmlzb3J9IHRvIHJlc3Bhd25gKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8g7KCV7KCBIGltcG9ydOuhnCBxZ3JpZC5mcmFtZS90b2tlbiDqt7jrnpjtlITrpbwg64u56rKo7Jik66m0IOuqqOuTiCDrqqkg7YWM7Iqk7Yq46rCAIOyYpOyXvOuQnOuLpC5cbiAgICAgICAgLy8g7J6s7Iuc7J6R7J20IOyLpOygnOuhnCDtmZXsoJXrkJwg7Iuc7KCQ7JeQIGFjdGl2ZSBuYXRpdmUgcnVuIOygle2VqeyEsSDsspjrpqzrp4wg66Gc65Oc7ZWc64ukLlxuICAgICAgICBjb25zdCB7IGZpbmlzaEFjdGl2ZU5hdGl2ZVJ1bnNGb3JSZXN0YXJ0IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9xZ3JpZC9xZ3JpZC1ydW4tbGlmZWN5Y2xlXCIpO1xuICAgICAgICBhd2FpdCBmaW5pc2hBY3RpdmVOYXRpdmVSdW5zRm9yUmVzdGFydCgpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgLy8g7KCV7ZWp7ISxIOyymOumrOqwgCDsi6TtjKjtlbTrj4Qg7J2R64u17J20IGZsdXNoIOuQnCDrkqTsl5DripQg7J6s7Iuc7J6R7J2EIOuBneq5jOyngCDsp4TtlontlZzri6QuXG4gICAgICAgIGFybVNlcnZlclJlc3RhcnRFeGl0KHJlcGx5LnJhdyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc3VwZXJ2aXNvciB9O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBTZXR0aW5nTW9kZWwgPSBuZXcgU2V0dGluZ01vZGVsQ2xhc3MoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUF5Q0EsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLFNBQVMsQ0FBQztBQUU3QyxJQUFNLHFCQUFOLGNBQWlDLFlBQVk7Q0FDM0MsY0FBYztFQUNaLE1BQU0sS0FBSyxHQUFHLGlCQUFpQixDQUFDO0NBQ2xDO0FBQ0Y7QUFFQSxTQUFTLGlCQUFpQixPQUEwRDtDQUNsRixRQUFRLE1BQU0sUUFBUSxLQUFLLElBQUksTUFBTSxLQUFLLE1BQUEsRUFBUSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLO0FBQ3hFOztBQUdBLFNBQVMsc0JBQTRCO0NBQ25DLE1BQU0sRUFBRSxZQUFZLE9BQU8sV0FBVztDQUN0QyxNQUFNLFNBQVMsaUJBQWlCLFFBQVEsTUFBTTtDQUM5QyxJQUFJLFFBQVEsV0FBVyxRQUFXO0NBQ2xDLElBQUksQ0FBQyxRQUFRLE1BQU0sSUFBSSxtQkFBbUI7Q0FFMUMsTUFBTSxPQUFPLGlCQUFpQixRQUFRLG1CQUFtQixLQUFLLGlCQUFpQixRQUFRLElBQUk7Q0FDM0YsSUFBSTtFQUNGLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxNQUFNLENBQUMsQ0FBQyxTQUFTLE1BQU0sTUFBTSxJQUFJLG1CQUFtQjtDQUMzRSxTQUFTLE9BQU87RUFDZCxJQUFJLGlCQUFpQixvQkFBb0IsTUFBTTtFQUMvQyxNQUFNLElBQUksbUJBQW1CO0NBQy9CO0FBQ0Y7QUFLQSxJQUFNLG9CQUFOLGNBQWdDLGVBSzlCO0NBQ0EsY0FBYztFQUNaLE1BQU0sV0FBVyxzQkFBc0Isb0JBQW9CO0NBQzdEO0NBRUEsTUFDTSxTQUNKLFFBQ0EsSUFDa0M7RUFDbEMsTUFBTSxFQUFFLFNBQVMsTUFBTSxLQUFLLFNBQVMsUUFBUTtHQUMzQztHQUNBLEtBQUs7R0FDTCxNQUFNO0VBQ1IsQ0FBQztFQUNELElBQUksQ0FBQyxLQUFLLElBQ1IsTUFBTSxJQUFJLGtCQUFrQixHQUFHLHNCQUFzQixDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7RUFHdkUsT0FBTyxLQUFLO0NBQ2Q7Q0FFQSxNQUFNLFFBQ0osUUFDQSxZQUN5QztFQUN6QyxNQUFNLEVBQUUsU0FBUyxNQUFNLEtBQUssU0FBUyxRQUFRO0dBQzNDLEdBQUc7R0FDSCxLQUFLO0dBQ0wsTUFBTTtFQUNSLENBQUM7RUFFRCxPQUFPLEtBQUssTUFBTTtDQUNwQjtDQUVBLE1BQ00sU0FDSixRQUNBLFdBQ2tEO0VBRWxELE1BQU0sU0FBUztHQUNiLEtBQUs7R0FDTCxNQUFNO0dBQ04sUUFBUTtHQUNSLFNBQVM7R0FDVCxHQUFHO0VBQ0w7RUFHQSxNQUFNLEVBQUUsSUFBSSxVQUFVLE1BQU0sS0FBSyxpQkFBaUIsTUFBTTtFQUd4RCxJQUFJLE9BQU8sSUFDVCxHQUFHLFFBQVEsZUFBZSxRQUFRLE9BQU8sRUFBRSxDQUFDO0VBSTlDLElBQUksT0FBTyxLQUNULEdBQUcsTUFBTSxnQkFBZ0IsT0FBTyxHQUFHO0VBSXJDLElBQUksT0FBTyxVQUFVLE9BQU8sV0FBVyxPQUFPLFFBQVEsU0FBUyxHQUM3RCxJQUFJLE9BQU8sV0FBVyxPQUNwQixHQUFHLE1BQU0sZ0JBQWdCLFFBQVEsSUFBSSxPQUFPLFFBQVEsRUFBRTtPQUV0RCxNQUFNLElBQUksb0JBQW9CLEdBQUcsMEJBQTBCLENBQUMsQ0FBQyxPQUFPLE1BQU0sQ0FBQztFQUsvRSxJQUFJLE9BQU8sU0FFVCxJQUFJLE9BQU8sWUFBWSxXQUNyQixHQUFHLFFBQVEsZ0JBQWdCLEtBQUs7T0FFaEMsV0FBVyxPQUFPLE9BQU87RUFJN0IsTUFBTSxZQUFZLEtBQUssZ0JBQWdCLEVBQ3JDLElBQUksU0FBUyxFQUNYLEdBQUcsSUFFTCxHQUNGLENBQUM7RUFFRCxPQUFPLEtBQUssbUJBQW1CO0dBQzdCO0dBQ0E7R0FDQTtHQUNBO0dBQ0EsT0FBTztFQUNULENBQUM7Q0FDSDtDQUVBLE1BQU0sS0FBSyxLQUE2QztFQUN0RCxNQUFNLE1BQU0sS0FBSyxRQUFRLEdBQUc7RUFHNUIsSUFBSSxTQUFTLE9BQU87R0FDbEIsSUFBSSxXQUFXLFlBQVksRUFBRTtFQUMvQixDQUFDO0VBR0QsT0FBTyxJQUFJLFlBQVksT0FBTyxRQUFRO0dBR3BDLE9BQU8sTUFGVyxJQUFJLFNBQVMsVUFBVTtFQUczQyxDQUFDO0NBQ0g7Q0FFQSxNQUFNLElBQUksS0FBZ0M7RUFJeEMsTUFIWSxLQUFLLFFBQVEsR0FHbkIsQ0FBQSxDQUFJLFlBQVksT0FBTyxRQUFRO0dBQ25DLE9BQU8sSUFBSSxNQUFNLFVBQVUsQ0FBQyxDQUFDLFFBQVEsZUFBZSxHQUFHLENBQUMsQ0FBQyxPQUFPO0VBQ2xFLENBQUM7RUFFRCxPQUFPLElBQUk7Q0FDYjs7Q0FHQSxNQUFNLGVBQTZDO0VBQ2pELE1BQU0sRUFBRSxTQUFTLE1BQU0sS0FBSyxTQUFTLEtBQUs7R0FBRSxLQUFLO0dBQUcsTUFBTTtFQUFFLENBQUM7RUFDN0QsT0FBTyxJQUFJLElBQUksS0FBSyxLQUFLLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztDQUNsRDs7Ozs7Q0FNQSxNQUFNLFNBQVMsS0FBYSxPQUE4QjtFQUN4RCxNQUFNLFdBQVcsTUFBTSxLQUFLLFFBQVEsS0FBSztHQUFFO0dBQUssS0FBSztHQUFHLE1BQU07RUFBRSxDQUFDO0VBQ2pFLE1BQU0sS0FBSyxLQUFLLENBQ2Q7R0FDRSxHQUFJLFdBQVcsRUFBRSxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUM7R0FDdEM7R0FDQTtHQUNBLDRCQUFZLElBQUksS0FBSztFQUN2QixDQUNGLENBQUM7Q0FDSDs7Q0FHQSxNQUFNLFdBQVcsS0FBNEI7RUFDM0MsTUFBTSxXQUFXLE1BQU0sS0FBSyxRQUFRLEtBQUs7R0FBRTtHQUFLLEtBQUs7R0FBRyxNQUFNO0VBQUUsQ0FBQztFQUNqRSxJQUFJLFVBQVUsTUFBTSxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztDQUM1Qzs7Ozs7Q0FNQSxNQUNNLGVBQTBDO0VBMEI5QyxPQUFPO0dBQ0wsVUExQjhCLGFBQWEsS0FBSyxRQUFRO0lBR3hELE1BQU0sU0FBUyxTQUFTLElBQUksR0FBRztJQUMvQixNQUFNLE1BQU0sV0FBVyxJQUFJLEtBQUssSUFBSSxNQUFNO0lBQzFDLE1BQU0sWUFBWSxPQUFPLElBQUk7SUFDN0IsTUFBTSxTQUFTLFNBQVMsT0FBTyxRQUFRLFNBQVksUUFBUTtJQUUzRCxPQUFPO0tBQ0wsS0FBSyxJQUFJO0tBQ1QsT0FBTyxJQUFJO0tBQ1gsT0FBTyxJQUFJO0tBQ1gsTUFBTSxJQUFJO0tBQ1YsU0FBUyxJQUFJO0tBR2IsT0FBTztLQUNQO0tBQ0EsS0FBSyxJQUFJLE9BQU87S0FDaEIsS0FBSyxJQUFJLE9BQU87S0FDaEIsU0FBUyxJQUFJLFdBQVcsQ0FBQztLQUN6QixNQUFNLElBQUksUUFBUTtJQUNwQjtHQUNGLENBR0U7R0FDQSxTQUFTLEtBQUssWUFBWTtHQUMxQixZQUFZLGlCQUFpQjtHQUM3Qix3QkFBd0IsUUFBUSxJQUFJLDJDQUEyQztFQUNqRjtDQUNGO0NBRUEsY0FBeUM7RUFDdkMsTUFBTSxNQUFNLFFBQVE7RUFDcEIsTUFBTSxXQUFXLElBQUkscUJBQXFCLElBQUksc0JBQXNCO0VBQ3BFLE9BQU87R0FDTDtJQUFFLE9BQU87SUFBWSxPQUFPLElBQUksWUFBWTtHQUFJO0dBQ2hEO0lBQUUsT0FBTztJQUFRLE9BQU8sSUFBSSxRQUFRO0dBQVk7R0FDaEQ7SUFBRSxPQUFPO0lBQVEsT0FBTyxJQUFJLFFBQVE7R0FBUTtHQUM1QztJQUFFLE9BQU87SUFBVyxPQUFPLElBQUksaUJBQWlCLElBQUksa0JBQWtCO0dBQUk7R0FDMUU7SUFBRSxPQUFPO0lBQVcsT0FBTyxJQUFJLGlCQUFpQixJQUFJLGtCQUFrQjtHQUFJO0dBQzFFO0lBQUUsT0FBTztJQUFXLE9BQU8sSUFBSSxpQkFBaUIsSUFBSSxrQkFBa0I7R0FBSTtHQUMxRTtJQUFFLE9BQU87SUFBVyxPQUFPLElBQUksaUJBQWlCLElBQUksa0JBQWtCO0dBQUk7R0FDMUU7SUFBRSxPQUFPO0lBQWUsT0FBTyxXQUFXLFdBQVcsUUFBUSxJQUFJO0dBQUk7RUFDdkU7Q0FDRjtDQUVBLE1BQ00sY0FBYyxLQUFhLE9BQXFEO0VBQ3BGLE1BQU0sTUFBTSxlQUFlLEdBQUc7RUFDOUIsSUFBSSxDQUFDLEtBQUssTUFBTSxJQUFJLG9CQUFvQixHQUFHLG9CQUFvQixDQUFDLENBQUMsR0FBRyxDQUFDO0VBRXJFLE1BQU0sYUFBYSxxQkFBcUIsS0FBSyxLQUFLO0VBQ2xELElBQUksQ0FBQyxXQUFXLElBQ2QsTUFBTSxJQUFJLG9CQUFvQixHQUFHLHNCQUFzQixDQUFDLENBQUMsV0FBVyxLQUFLLENBQUM7RUFHNUUsTUFBTUEsWUFBa0IsS0FBSyxXQUFXLEtBQUs7RUFDN0MsT0FBTyxFQUFFLFNBQVMsSUFBSSxRQUFRO0NBQ2hDOztDQUdBLE1BQ00sYUFBYSxLQUFtRDtFQUNwRSxNQUFNLE1BQU0sZUFBZSxHQUFHO0VBQzlCLElBQUksQ0FBQyxLQUFLLE1BQU0sSUFBSSxvQkFBb0IsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQztFQUVyRSxNQUFNQyxhQUFtQixHQUFHO0VBQzVCLE9BQU8sRUFBRSxTQUFTLElBQUksUUFBUTtDQUNoQzs7Ozs7Q0FNQSxNQUNNLHdCQUFtRDtFQUl2RCxNQUFNLEVBQUUsZ0NBQWdDLE1BQU0sT0FBTztFQUNyRCxPQUFPLEVBQUUsTUFBTSxNQUFNLDRCQUE0QixFQUFFO0NBQ3JEOzs7Ozs7Ozs7OztDQVlBLE1BQ00sZ0JBQXlEO0VBQzdELG9CQUFvQjtFQUNwQixNQUFNLGFBQWEsaUJBQWlCO0VBQ3BDLElBQUksQ0FBQyxZQUVILE1BQU0sSUFBSSxvQkFBb0IsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7RUFHNUQsTUFBTSxFQUFFLFVBQVUsT0FBTyxXQUFXO0VBRXBDLElBRGdCLG1CQUNaLEdBQVM7R0FDWCxPQUFPLEtBQUssZ0RBQWdELFdBQVcsWUFBWTtHQUVuRixJQUFJO0lBR0YsTUFBTSxFQUFFLHFDQUFxQyxNQUFNLE9BQU87SUFDMUQsTUFBTSxpQ0FBaUM7R0FDekMsVUFBVTtJQUVSLHFCQUFxQixNQUFNLEdBQUc7R0FDaEM7RUFDRjtFQUVBLE9BQU8sRUFBRSxXQUFXO0NBQ3RCO0FBQ0Y7O0NBblJHLElBQUk7RUFBRSxZQUFZO0VBQU8sU0FBUyxDQUFDLFNBQVMsZ0JBQWdCO0VBQUcsY0FBYztDQUFVLENBQUM7Ozs7OztDQThCeEYsSUFBSTtFQUFFLFlBQVk7RUFBTyxTQUFTLENBQUMsU0FBUyxnQkFBZ0I7RUFBRyxjQUFjO0NBQVcsQ0FBQzs7Ozs7O0NBeUh6RixJQUFJO0VBQUUsWUFBWTtFQUFPLFNBQVMsQ0FBQyxTQUFTLGdCQUFnQjtFQUFHLGNBQWM7Q0FBYyxDQUFDOzs7Ozs7Q0FrRDVGLElBQUk7RUFBRSxZQUFZO0VBQVEsU0FBUyxDQUFDLFNBQVMsbUJBQW1CO0NBQUUsQ0FBQzs7Ozs7O0NBZW5FLElBQUk7RUFBRSxZQUFZO0VBQVEsU0FBUyxDQUFDLFNBQVMsbUJBQW1CO0NBQUUsQ0FBQzs7Ozs7O0NBYW5FLElBQUk7RUFBRSxZQUFZO0VBQVEsU0FBUyxDQUFDLFNBQVMsbUJBQW1CO0NBQUUsQ0FBQzs7Ozs7O0NBbUJuRSxJQUFJO0VBQUUsWUFBWTtFQUFRLFNBQVMsQ0FBQyxTQUFTLG1CQUFtQjtDQUFFLENBQUM7Ozs7O0FBNkJ0RSxNQUFhLGVBQWUsSUFBSSxrQkFBa0IifQ==
323
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZy5tb2RlbC5qcyIsIm5hbWVzIjpbInNhdmVTdG9yZWRTZXR0aW5nIiwicmVzZXRTdG9yZWRTZXR0aW5nIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3NldHRpbmcvc2V0dGluZy5tb2RlbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHtcbiAgQmFzZU1vZGVsQ2xhc3MsXG4gIHR5cGUgTGlzdFJlc3VsdCxcbiAgYXNBcnJheSxcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIEJhZFJlcXVlc3RFeGNlcHRpb24sXG4gIFNvRXhjZXB0aW9uLFxuICBTb25hbXUsXG4gIGFwaSxcbiAgZXhoYXVzdGl2ZSxcbn0gZnJvbSBcInNvbmFtdVwiO1xuXG5pbXBvcnQgeyBTRCwgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IGRldGVjdFN1cGVydmlzb3IgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvY2Vzcy1zdXBlcnZpc29yXCI7XG5pbXBvcnQgeyBhcm1TZXJ2ZXJSZXN0YXJ0RXhpdCwgYmVnaW5TZXJ2ZXJSZXN0YXJ0IH0gZnJvbSBcIi4uLy4uL3V0aWxzL3NlcnZlci1yZXN0YXJ0XCI7XG5pbXBvcnQgeyBTbGFja05vdGlmaWNhdGlvbkVycm9yIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3NsYWNrLW5vdGlmeVwiO1xuaW1wb3J0IHsgdHlwZSBTZXR0aW5nU3Vic2V0S2V5LCB0eXBlIFNldHRpbmdTdWJzZXRNYXBwaW5nIH0gZnJvbSBcIi4uL3NvbmFtdS5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IHNldHRpbmdTdWJzZXRRdWVyaWVzLCBzZXR0aW5nTG9hZGVyUXVlcmllcyB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkLnNzb1wiO1xuaW1wb3J0IHtcbiAgZmluZFNldHRpbmdEZWYsXG4gIG1hc2tTZWNyZXQsXG4gIFNFVFRJTkdfREVGUyxcbiAgVE9LRU5fV0lORE9XX0tFRVBBTElWRV9SVU5ORVJfRU5WX0tFWSxcbiAgdmFsaWRhdGVTZXR0aW5nVmFsdWUsXG59IGZyb20gXCIuL3NldHRpbmcuY29uc3RhbnRcIjtcbmltcG9ydCB7XG4gIGdldFNldHRpbmcsXG4gIGlzU3RvcmVkLFxuICByZXNldFNldHRpbmcgYXMgcmVzZXRTdG9yZWRTZXR0aW5nLFxuICBzYXZlU2V0dGluZyBhcyBzYXZlU3RvcmVkU2V0dGluZyxcbn0gZnJvbSBcIi4vc2V0dGluZy5zdG9yZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBSdW50aW1lSW5mb0l0ZW0sXG4gIHR5cGUgU2V0dGluZ0FwcGxpZXMsXG4gIHR5cGUgU2V0dGluZ0l0ZW0sXG4gIHR5cGUgU2V0dGluZ0xpc3RQYXJhbXMsXG4gIHR5cGUgU2V0dGluZ1NhdmVQYXJhbXMsXG4gIHR5cGUgU2V0dGluZ3NSZXNwb25zZSxcbiAgdHlwZSBTdXBlcnZpc29yS2luZCxcbn0gZnJvbSBcIi4vc2V0dGluZy50eXBlc1wiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJzZXR0aW5nXCJdKTtcblxuY2xhc3MgRm9yYmlkZGVuRXhjZXB0aW9uIGV4dGVuZHMgU29FeGNlcHRpb24ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcig0MDMsIFNEKFwiZXJyb3IuZm9yYmlkZGVuXCIpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaXJzdEhlYWRlclZhbHVlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZVswXSA6IHZhbHVlKT8uc3BsaXQoXCIsXCIpWzBdPy50cmltKCk7XG59XG5cbi8qKiBPcmlnaW4g7JeG64qUIOyatOyYgSBDTEkg7JqU7LKt7J2AIO2GteqzvOyLnO2CpOuQmCwg67iM65287Jqw7KCAIOq1kOywqCDstpzsspggUE9TVCDripQg66eJ64qU64ukLiAqL1xuZnVuY3Rpb24gYXNzZXJ0UmVzdGFydE9yaWdpbigpOiB2b2lkIHtcbiAgY29uc3QgeyBoZWFkZXJzIH0gPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICBjb25zdCBvcmlnaW4gPSBmaXJzdEhlYWRlclZhbHVlKGhlYWRlcnMub3JpZ2luKTtcbiAgaWYgKGhlYWRlcnMub3JpZ2luID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgaWYgKCFvcmlnaW4pIHRocm93IG5ldyBGb3JiaWRkZW5FeGNlcHRpb24oKTtcblxuICBjb25zdCBob3N0ID0gZmlyc3RIZWFkZXJWYWx1ZShoZWFkZXJzW1wieC1mb3J3YXJkZWQtaG9zdFwiXSkgPz8gZmlyc3RIZWFkZXJWYWx1ZShoZWFkZXJzLmhvc3QpO1xuICB0cnkge1xuICAgIGlmICghaG9zdCB8fCBuZXcgVVJMKG9yaWdpbikuaG9zdCAhPT0gaG9zdCkgdGhyb3cgbmV3IEZvcmJpZGRlbkV4Y2VwdGlvbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkV4Y2VwdGlvbikgdGhyb3cgZXJyb3I7XG4gICAgdGhyb3cgbmV3IEZvcmJpZGRlbkV4Y2VwdGlvbigpO1xuICB9XG59XG5cbi8qXG4gIFNldHRpbmcgTW9kZWxcbiovXG5jbGFzcyBTZXR0aW5nTW9kZWxDbGFzcyBleHRlbmRzIEJhc2VNb2RlbENsYXNzPFxuICBTZXR0aW5nU3Vic2V0S2V5LFxuICBTZXR0aW5nU3Vic2V0TWFwcGluZyxcbiAgdHlwZW9mIHNldHRpbmdTdWJzZXRRdWVyaWVzLFxuICB0eXBlb2Ygc2V0dGluZ0xvYWRlclF1ZXJpZXNcbj4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlNldHRpbmdcIiwgc2V0dGluZ1N1YnNldFF1ZXJpZXMsIHNldHRpbmdMb2FkZXJRdWVyaWVzKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdLCByZXNvdXJjZU5hbWU6IFwiU2V0dGluZ1wiIH0pXG4gIGFzeW5jIGZpbmRCeUlkPFQgZXh0ZW5kcyBTZXR0aW5nU3Vic2V0S2V5PihcbiAgICBzdWJzZXQ6IFQsXG4gICAgaWQ6IG51bWJlcixcbiAgKTogUHJvbWlzZTxTZXR0aW5nU3Vic2V0TWFwcGluZ1tUXT4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgdGhpcy5maW5kTWFueShzdWJzZXQsIHtcbiAgICAgIGlkLFxuICAgICAgbnVtOiAxLFxuICAgICAgcGFnZTogMSxcbiAgICB9KTtcbiAgICBpZiAoIXJvd3NbMF0pIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmVudGl0eU5vdEZvdW5kXCIpKFwiU2V0dGluZ1wiLCBpZCkpO1xuICAgIH1cblxuICAgIHJldHVybiByb3dzWzBdO1xuICB9XG5cbiAgYXN5bmMgZmluZE9uZTxUIGV4dGVuZHMgU2V0dGluZ1N1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIGxpc3RQYXJhbXM6IFNldHRpbmdMaXN0UGFyYW1zLFxuICApOiBQcm9taXNlPFNldHRpbmdTdWJzZXRNYXBwaW5nW1RdIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgdGhpcy5maW5kTWFueShzdWJzZXQsIHtcbiAgICAgIC4uLmxpc3RQYXJhbXMsXG4gICAgICBudW06IDEsXG4gICAgICBwYWdlOiAxLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJvd3NbMF0gPz8gbnVsbDtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdLCByZXNvdXJjZU5hbWU6IFwiU2V0dGluZ3NcIiB9KVxuICBhc3luYyBmaW5kTWFueTxUIGV4dGVuZHMgU2V0dGluZ1N1YnNldEtleSwgTFAgZXh0ZW5kcyBTZXR0aW5nTGlzdFBhcmFtcz4oXG4gICAgc3Vic2V0OiBULFxuICAgIHJhd1BhcmFtcz86IExQLFxuICApOiBQcm9taXNlPExpc3RSZXN1bHQ8TFAsIFNldHRpbmdTdWJzZXRNYXBwaW5nW1RdPj4ge1xuICAgIC8vIHBhcmFtcyB3aXRoIGRlZmF1bHRzXG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgbnVtOiAyNCxcbiAgICAgIHBhZ2U6IDEsXG4gICAgICBzZWFyY2g6IFwia2V5XCIgYXMgY29uc3QsXG4gICAgICBvcmRlckJ5OiBcImtleS1hc2NcIiBhcyBjb25zdCxcbiAgICAgIC4uLnJhd1BhcmFtcyxcbiAgICB9IHNhdGlzZmllcyBTZXR0aW5nTGlzdFBhcmFtcztcblxuICAgIC8vIGJ1aWxkIHF1ZXJpZXNcbiAgICBjb25zdCB7IHFiLCBvblN1YnNldDogXyB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG5cbiAgICAvLyBpZFxuICAgIGlmIChwYXJhbXMuaWQpIHtcbiAgICAgIHFiLndoZXJlSW4oXCJzZXR0aW5ncy5pZFwiLCBhc0FycmF5KHBhcmFtcy5pZCkpO1xuICAgIH1cblxuICAgIC8vIGtleSDigJQgdG9GaWx0ZXIgcHJvcCDsnbTsp4Drp4wg7Iqk7LqQ7Y+065Sp7J20IOunjOuTpOyWtOyjvOyngCDslYrslYQg7KeB7KCRIOqxtOuLpC5cbiAgICBpZiAocGFyYW1zLmtleSkge1xuICAgICAgcWIud2hlcmUoXCJzZXR0aW5ncy5rZXlcIiwgcGFyYW1zLmtleSk7XG4gICAgfVxuXG4gICAgLy8gc2VhcmNoLWtleXdvcmRcbiAgICBpZiAocGFyYW1zLnNlYXJjaCAmJiBwYXJhbXMua2V5d29yZCAmJiBwYXJhbXMua2V5d29yZC5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJrZXlcIikge1xuICAgICAgICBxYi53aGVyZShcInNldHRpbmdzLmtleVwiLCBcImxpa2VcIiwgYCUke3BhcmFtcy5rZXl3b3JkfSVgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwiZXJyb3IudW5rbm93blNlYXJjaEZpZWxkXCIpKHBhcmFtcy5zZWFyY2gpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBvcmRlckJ5XG4gICAgaWYgKHBhcmFtcy5vcmRlckJ5KSB7XG4gICAgICAvLyBkZWZhdWx0IG9yZGVyQnlcbiAgICAgIGlmIChwYXJhbXMub3JkZXJCeSA9PT0gXCJrZXktYXNjXCIpIHtcbiAgICAgICAgcWIub3JkZXJCeShcInNldHRpbmdzLmtleVwiLCBcImFzY1wiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4aGF1c3RpdmUocGFyYW1zLm9yZGVyQnkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVuaGFuY2VycyA9IHRoaXMuY3JlYXRlRW5oYW5jZXJzKHtcbiAgICAgIEE6IChyb3cpID0+ICh7XG4gICAgICAgIC4uLnJvdyxcbiAgICAgICAgLy8g7ISc67iM7IWL67OE66GcIHZpcnR1YWwg7ZWE65OcIOqzhOyCsOuhnOyngSDstpTqsIBcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN1YnNldFF1ZXJ5KHtcbiAgICAgIHN1YnNldCxcbiAgICAgIHFiLFxuICAgICAgcGFyYW1zLFxuICAgICAgZW5oYW5jZXJzLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgc2F2ZShzcGE6IFNldHRpbmdTYXZlUGFyYW1zW10pOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcblxuICAgIC8vIHJlZ2lzdGVyXG4gICAgc3BhLmZvckVhY2goKHNwKSA9PiB7XG4gICAgICB3ZGIudWJSZWdpc3RlcihcInNldHRpbmdzXCIsIHNwKTtcbiAgICB9KTtcblxuICAgIC8vIHRyYW5zYWN0aW9uXG4gICAgcmV0dXJuIHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBjb25zdCBpZHMgPSBhd2FpdCB0cngudWJVcHNlcnQoXCJzZXR0aW5nc1wiKTtcblxuICAgICAgcmV0dXJuIGlkcztcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlbChpZHM6IG51bWJlcltdKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuXG4gICAgLy8gdHJhbnNhY3Rpb25cbiAgICBhd2FpdCB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgcmV0dXJuIHRyeC50YWJsZShcInNldHRpbmdzXCIpLndoZXJlSW4oXCJzZXR0aW5ncy5pZFwiLCBpZHMpLmRlbGV0ZSgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGlkcy5sZW5ndGg7XG4gIH1cblxuICAvKiog7KCA7J6l65CcIOyEpOyglSDsoITssrTrpbwga2V54oaSdmFsdWUg66GcLiDrtoDtjIUg7IucIO2VnCDrsogg7J297Ja0IOuplOuqqOumrOyXkCDsmKzrprDri6QuICovXG4gIGFzeW5jIGZpbmRBbGxBc01hcCgpOiBQcm9taXNlPE1hcDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHRoaXMuZmluZE1hbnkoXCJBXCIsIHsgbnVtOiAwLCBwYWdlOiAxIH0pO1xuICAgIHJldHVybiBuZXcgTWFwKHJvd3MubWFwKChyKSA9PiBbci5rZXksIHIudmFsdWVdKSk7XG4gIH1cblxuICAvKipcbiAgICoga2V5IOuhnCB1cHNlcnQg7ZWc64ukLiBgc2F2ZWAg64qUIGlkIOq4sOykgOydtOudvCBrZXkg7KSR67O17J2EIOqxuOufrOuCtOyngCDrqrvtlbQsIOq4sOyhtCDtlonsnYQg66i87KCAIOywvuyVhFxuICAgKiBpZCDrpbwg7Iuk7Ja0IOuztOuCuOuLpC5cbiAgICovXG4gIGFzeW5jIHNldEJ5S2V5KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLmZpbmRPbmUoXCJBXCIsIHsga2V5LCBudW06IDEsIHBhZ2U6IDEgfSk7XG4gICAgYXdhaXQgdGhpcy5zYXZlKFtcbiAgICAgIHtcbiAgICAgICAgLi4uKGV4aXN0aW5nID8geyBpZDogZXhpc3RpbmcuaWQgfSA6IHt9KSxcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgdXBkYXRlZF9hdDogbmV3IERhdGUoKSxcbiAgICAgIH0sXG4gICAgXSk7XG4gIH1cblxuICAvKiog7KCA7J6l6rCS7J2EIOyngOybjCBlbnYg6riw67O46rCS7Jy866GcIOuQmOuPjOumsOuLpC4gKi9cbiAgYXN5bmMgY2xlYXJCeUtleShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5maW5kT25lKFwiQVwiLCB7IGtleSwgbnVtOiAxLCBwYWdlOiAxIH0pO1xuICAgIGlmIChleGlzdGluZykgYXdhaXQgdGhpcy5kZWwoW2V4aXN0aW5nLmlkXSk7XG4gIH1cblxuICAvKipcbiAgICog7Y647KeRIOqwgOuKpe2VnCDshKTsoJXqs7wg7J296riwIOyghOyaqSDrn7Dtg4DsnoQg7KCV67O0LiDtjrjsp5Eg64yA7IOB7J2AIGBTRVRUSU5HX0RFRlNgIOyXkCDsoJXsnZjrkJwg6rKD67+Q7J2064ukIOKAlFxuICAgKiBEQiDsoJHsho0g7KCV67O064KYIO2PrO2KuOuKlCDshJzrsoTqsIAg65yo6riwIOyghOyXkCDtlYTsmpTtlbQg7ZmU66m07JeQ7IScIOuwlOq/gCDsiJgg7JeG64ukLlxuICAgKi9cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJTZXR0aW5nTGlzdFwiIH0pXG4gIGFzeW5jIGxpc3RTZXR0aW5ncygpOiBQcm9taXNlPFNldHRpbmdzUmVzcG9uc2U+IHtcbiAgICBjb25zdCBzZXR0aW5nczogU2V0dGluZ0l0ZW1bXSA9IFNFVFRJTkdfREVGUy5tYXAoKGRlZikgPT4ge1xuICAgICAgLy8g7KCA7J6l6rCS64+EIGVudiDrj4Qg7JeG7Jy866m0IOy9lOuTnCDquLDrs7jqsJLsnbQg7Iuk7KCc66GcIOyggeyaqSDspJHsnbTri6QuIOu5iOy5uOycvOuhnCDrkZDrqbQg7ZmU66m06rO8XG4gICAgICAvLyDrn7Dtg4DsnoTsnbQg7Ja06riL64KYIOuztOyduOuLpC5cbiAgICAgIGNvbnN0IHN0b3JlZCA9IGlzU3RvcmVkKGRlZi5rZXkpO1xuICAgICAgY29uc3QgcmF3ID0gZ2V0U2V0dGluZyhkZWYua2V5LCBkZWYuZW52S2V5KTtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZSA9IHJhdyA/PyBkZWYuZmFsbGJhY2s7XG4gICAgICBjb25zdCBzb3VyY2UgPSBzdG9yZWQgPyBcImRiXCIgOiByYXcgIT09IHVuZGVmaW5lZCA/IFwiZW52XCIgOiBcImRlZmF1bHRcIjtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiBkZWYua2V5LFxuICAgICAgICBncm91cDogZGVmLmdyb3VwLFxuICAgICAgICBsYWJlbDogZGVmLmxhYmVsLFxuICAgICAgICBraW5kOiBkZWYua2luZCxcbiAgICAgICAgYXBwbGllczogZGVmLmFwcGxpZXMsXG4gICAgICAgIC8vIOuIiCDthqDquIDsnYQg7JyE7ZW0IHNlY3JldCDrj4Qg7JuQ67O47J2EIOuCtOugpOuztOuCuOuLpC4g7J20IOyXlOuTnO2PrOyduO2KuOuKlCDrsLDtj6wg6rK96rOE7JeQ7IScXG4gICAgICAgIC8vIOuwmOuTnOyLnCDsnbjspp3tlbTslbwg7ZWc64ukLlxuICAgICAgICB2YWx1ZTogZWZmZWN0aXZlLFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIG1pbjogZGVmLm1pbiA/PyBudWxsLFxuICAgICAgICBtYXg6IGRlZi5tYXggPz8gbnVsbCxcbiAgICAgICAgcHJlc2V0czogZGVmLnByZXNldHMgPz8gW10sXG4gICAgICAgIGhlbHA6IGRlZi5oZWxwID8/IG51bGwsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNldHRpbmdzLFxuICAgICAgcnVudGltZTogdGhpcy5ydW50aW1lSW5mbygpLFxuICAgICAgc3VwZXJ2aXNvcjogZGV0ZWN0U3VwZXJ2aXNvcigpLFxuICAgICAga2VlcGFsaXZlUnVubmVyRW5hYmxlZDogcHJvY2Vzcy5lbnZbVE9LRU5fV0lORE9XX0tFRVBBTElWRV9SVU5ORVJfRU5WX0tFWV0gPT09IFwidHJ1ZVwiLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJ1bnRpbWVJbmZvKCk6IFJ1bnRpbWVJbmZvSXRlbVtdIHtcbiAgICBjb25zdCBlbnYgPSBwcm9jZXNzLmVudjtcbiAgICBjb25zdCBwYXNzd29yZCA9IGVudi5RR1JJRF9EQl9QQVNTV09SRCA/PyBlbnYuU09OQU1VX0RCX1BBU1NXT1JEID8/IFwiXCI7XG4gICAgcmV0dXJuIFtcbiAgICAgIHsgbGFiZWw6IFwiTk9ERV9FTlZcIiwgdmFsdWU6IGVudi5OT0RFX0VOViA/PyBcIi1cIiB9LFxuICAgICAgeyBsYWJlbDogXCJIT1NUXCIsIHZhbHVlOiBlbnYuSE9TVCA/PyBcImxvY2FsaG9zdFwiIH0sXG4gICAgICB7IGxhYmVsOiBcIlBPUlRcIiwgdmFsdWU6IGVudi5QT1JUID8/IFwiNDQ5MDBcIiB9LFxuICAgICAgeyBsYWJlbDogXCJEQiBIb3N0XCIsIHZhbHVlOiBlbnYuUUdSSURfREJfSE9TVCA/PyBlbnYuU09OQU1VX0RCX0hPU1QgPz8gXCItXCIgfSxcbiAgICAgIHsgbGFiZWw6IFwiREIgUG9ydFwiLCB2YWx1ZTogZW52LlFHUklEX0RCX1BPUlQgPz8gZW52LlNPTkFNVV9EQl9QT1JUID8/IFwiLVwiIH0sXG4gICAgICB7IGxhYmVsOiBcIkRCIE5hbWVcIiwgdmFsdWU6IGVudi5RR1JJRF9EQl9OQU1FID8/IGVudi5TT05BTVVfREJfTkFNRSA/PyBcIi1cIiB9LFxuICAgICAgeyBsYWJlbDogXCJEQiBVc2VyXCIsIHZhbHVlOiBlbnYuUUdSSURfREJfVVNFUiA/PyBlbnYuU09OQU1VX0RCX1VTRVIgPz8gXCItXCIgfSxcbiAgICAgIHsgbGFiZWw6IFwiREIgUGFzc3dvcmRcIiwgdmFsdWU6IHBhc3N3b3JkID8gbWFza1NlY3JldChwYXNzd29yZCkgOiBcIi1cIiB9LFxuICAgIF07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgdXBkYXRlU2V0dGluZyhrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFByb21pc2U8eyBhcHBsaWVzOiBTZXR0aW5nQXBwbGllcyB9PiB7XG4gICAgY29uc3QgZGVmID0gZmluZFNldHRpbmdEZWYoa2V5KTtcbiAgICBpZiAoIWRlZikgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzZXR0aW5nLnVua25vd25LZXlcIikoa2V5KSk7XG5cbiAgICBjb25zdCB2YWxpZGF0aW9uID0gdmFsaWRhdGVTZXR0aW5nVmFsdWUoZGVmLCB2YWx1ZSk7XG4gICAgaWYgKCF2YWxpZGF0aW9uLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNldHRpbmcuaW52YWxpZFZhbHVlXCIpKHZhbGlkYXRpb24uZXJyb3IpKTtcbiAgICB9XG5cbiAgICBhd2FpdCBzYXZlU3RvcmVkU2V0dGluZyhrZXksIHZhbGlkYXRpb24udmFsdWUpO1xuICAgIHJldHVybiB7IGFwcGxpZXM6IGRlZi5hcHBsaWVzIH07XG4gIH1cblxuICAvKiog7KCA7J6l6rCS7J2EIOyngOybjCBlbnYg6riw67O46rCS7Jy866GcIOuQmOuPjOumsOuLpC4gKi9cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHJlc2V0U2V0dGluZyhrZXk6IHN0cmluZyk6IFByb21pc2U8eyBhcHBsaWVzOiBTZXR0aW5nQXBwbGllcyB9PiB7XG4gICAgY29uc3QgZGVmID0gZmluZFNldHRpbmdEZWYoa2V5KTtcbiAgICBpZiAoIWRlZikgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzZXR0aW5nLnVua25vd25LZXlcIikoa2V5KSk7XG5cbiAgICBhd2FpdCByZXNldFN0b3JlZFNldHRpbmcoa2V5KTtcbiAgICByZXR1cm4geyBhcHBsaWVzOiBkZWYuYXBwbGllcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOunjOujjCDslYzrprzsnYQg7KeA6riIIO2VnCDrsogg67O064K464ukLiDso7zquLDrpbwg6riw64uk66as7KeAIOyViuqzoCDshKTsoJXsnbQg7KCc64yA66GcIOu2meyXiOuKlOyngCDtmZXsnbjtlZjqsbDrgpgsXG4gICAqIOyerOuhnOq3uOyduOydhCDsnqzstIntlaAg65WMIOyTtOuLpC4g67O064K4IOqxtOyImOulvCDrj4zroKTspJggXCLrs7Trgrwg64yA7IOBIOyXhuydjFwi6rO8IOq1rOu2hO2VnOuLpC5cbiAgICovXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyB0cmlnZ2VyRXhwaXJ5UmVtaW5kZXIoKTogUHJvbWlzZTx7IHNlbnQ6IG51bWJlciB9PiB7XG4gICAgLy8g64+Z7KCBIGltcG9ydCDroZwg7JWM66a8IOuqqOuTiOydhCDtmLjstpwg7Iuc7KCQ7JeQ66eMIOuBjOyWtOyYqOuLpC4g7KCV7KCB7Jy866GcIOqxuOuptFxuICAgIC8vIHNldHRpbmcubW9kZWwg4oaSIGV4cGlyZWQtdG9rZW4tcmVtaW5kZXIg4oaSIHRva2VuLm1vZGVsIOqyveuhnOqwgCDsg53qsqgsXG4gICAgLy8gdG9rZW4ubW9kZWwg7J2EIG1vY2sg7ZWY64qUIO2FjOyKpO2KuOqwgCDsi6TsoJwg66qo65OI7J2EIOuovOyggCDroZzrk5ztlZjqsowg65Cc64ukLlxuICAgIGNvbnN0IHsgc2VuZEV4cGlyZWRUb2tlblJlbWluZGVyTm93IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9xZ3JpZC9leHBpcmVkLXRva2VuLXJlbWluZGVyXCIpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyBzZW50OiBhd2FpdCBzZW5kRXhwaXJlZFRva2VuUmVtaW5kZXJOb3coKSB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTbGFja05vdGlmaWNhdGlvbkVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKGVycm9yLm1lc3NhZ2UgYXMgTG9jYWxpemVkU3RyaW5nKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDshJzrsoTrpbwg7J6s7Iuc7J6R7ZWc64ukIOKAlCDsoJXtmZXtnojripQg7Iqk7Iqk66GcIOyiheujjO2VmOqzoCwgcG0yIOqwgCDri6Tsi5wg652E7Jqw64qUIOqyg+yXkCDrp6HquLTri6QuXG4gICAqXG4gICAqIGByZXN0YXJ0YCDroZwg7ZGc7Iuc65CcIOybjOy7pCDshKTsoJXsnYAgZGlzcGF0Y2hlciDsg53shLHsnpDsl5DshJwg7ZWcIOuyiOunjCDsnb3tnojrr4DroZwg7J20IOqyveuhnCDrp5Dqs6DripRcbiAgICog67CY7JiB7ZWgIOuwqeuyleydtCDsl4bsl4jri6QuIOyngOq4iOq5jOyngOuKlCBTU0gg66GcIGBwbTIgcmVzdGFydGAg66W8IOyzkOyVvCDtlojri6QuXG4gICAqXG4gICAqIOu2gOyImCDtmqjqs7zqsIAg7ZWY64KYIOuNlCDsnojri6Q6IHBtMiDripQgYGVjb3N5c3RlbS5jb25maWcuY2pzYCDsnZgg7JuQ656YIOuqheugueycvOuhnCDri6Tsi5wg652E7Jqw6rOgLFxuICAgKiDqt7gg66qF66C57JeQIGAtLXNraXAtdXBkYXRlYCDqsIAg7JeG7Jy866m0IENMSSDqsIAgbnBtIOy1nOyLoCDrsoTsoITsnYQg67Cb7JWEIOyYrOumsOuLpC4g7KaJIOyerOyLnOyekeydgFxuICAgKiDrsLDtj6zsnbTquLDrj4Qg7ZWY64ukIOKAlCDtmZTrqbQg66y46rWs6rCAIOydtCDsgqzsi6TsnYQg7ZWo6ruYIOyVjOumsOuLpC5cbiAgICovXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyByZXN0YXJ0U2VydmVyKCk6IFByb21pc2U8eyBzdXBlcnZpc29yOiBTdXBlcnZpc29yS2luZCB9PiB7XG4gICAgYXNzZXJ0UmVzdGFydE9yaWdpbigpO1xuICAgIGNvbnN0IHN1cGVydmlzb3IgPSBkZXRlY3RTdXBlcnZpc29yKCk7XG4gICAgaWYgKCFzdXBlcnZpc29yKSB7XG4gICAgICAvLyDri6Tsi5wg652E7JuM7KSEIOyjvOyytOqwgCDsl4bsnLzrqbQg7KKF66OM6rCAIOqzpyDsoJXsp4Dri6QuIOyCtOumtCDsiJgg7JeG64qU642wIOyjveydtOyngCDslYrripTri6QuXG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNldHRpbmcubm9TdXBlcnZpc29yXCIpKCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgcmVwbHkgfSA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgY29uc3Qgc3RhcnRlZCA9IGJlZ2luU2VydmVyUmVzdGFydCgpO1xuICAgIGlmIChzdGFydGVkKSB7XG4gICAgICBsb2dnZXIud2FybihgcmVzdGFydCByZXF1ZXN0ZWQgdmlhIGRhc2hib2FyZCwgZXhpdGluZyBmb3IgJHtzdXBlcnZpc29yfSB0byByZXNwYXduYCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIOygleyggSBpbXBvcnTroZwgcWdyaWQuZnJhbWUvdG9rZW4g6re4656Y7ZSE66W8IOuLueqyqOyYpOuptCDrqqjrk4gg66qpIO2FjOyKpO2KuOqwgCDsmKTsl7zrkJzri6QuXG4gICAgICAgIC8vIOyerOyLnOyekeydtCDsi6TsoJzroZwg7ZmV7KCV65CcIOyLnOygkOyXkCBhY3RpdmUgbmF0aXZlIHJ1biDsoJXtlanshLEg7LKY66as66eMIOuhnOuTnO2VnOuLpC5cbiAgICAgICAgY29uc3QgeyBmaW5pc2hBY3RpdmVOYXRpdmVSdW5zRm9yUmVzdGFydCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vcWdyaWQvcWdyaWQtcnVuLWxpZmVjeWNsZVwiKTtcbiAgICAgICAgYXdhaXQgZmluaXNoQWN0aXZlTmF0aXZlUnVuc0ZvclJlc3RhcnQoKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIC8vIOygle2VqeyEsSDsspjrpqzqsIAg7Iuk7Yyo7ZW064+EIOydkeuLteydtCBmbHVzaCDrkJwg65Kk7JeQ64qUIOyerOyLnOyekeydhCDrgZ3quYzsp4Ag7KeE7ZaJ7ZWc64ukLlxuICAgICAgICBhcm1TZXJ2ZXJSZXN0YXJ0RXhpdChyZXBseS5yYXcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IHN1cGVydmlzb3IgfTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgU2V0dGluZ01vZGVsID0gbmV3IFNldHRpbmdNb2RlbENsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQTBDQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsU0FBUyxDQUFDO0FBRTdDLElBQU0scUJBQU4sY0FBaUMsWUFBWTtDQUMzQyxjQUFjO0VBQ1osTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUM7Q0FDbEM7QUFDRjtBQUVBLFNBQVMsaUJBQWlCLE9BQTBEO0NBQ2xGLFFBQVEsTUFBTSxRQUFRLEtBQUssSUFBSSxNQUFNLEtBQUssTUFBQSxFQUFRLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUs7QUFDeEU7O0FBR0EsU0FBUyxzQkFBNEI7Q0FDbkMsTUFBTSxFQUFFLFlBQVksT0FBTyxXQUFXO0NBQ3RDLE1BQU0sU0FBUyxpQkFBaUIsUUFB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
@@ -198,9 +198,8 @@ var TokenModelClass = class extends BaseModelClass {
198
198
  }]);
199
199
  }
200
200
  /**
201
- * 인증 사망을 한 번만 기록하고, 다른 활성 토큰이 있으면 라우팅에서도 제외한다.
202
- * 마지막 활성 토큰은 systemic 장애 안전판 때문에 active 상태를 유지하되 재로그인
203
- * 필요 상태는 기록한다. `marked`가 공유 DB 인스턴스들의 알림 발송 게이트다.
201
+ * Record confirmed expiry and remove the token from routing atomically.
202
+ * The last active token is also deactivated; its notification is urgent.
204
203
  */
205
204
  async markReauthRequired(id, expectedCredentials) {
206
205
  return this.getPuri("w").transaction(async (trx) => {
@@ -211,38 +210,44 @@ var TokenModelClass = class extends BaseModelClass {
211
210
  }).where("id", id).forUpdate().first();
212
211
  if (!token || token.reauth_required) return {
213
212
  marked: false,
214
- keptAsLastActive: false,
213
+ wasLastActive: false,
215
214
  staleCredentials: false
216
215
  };
217
216
  if (!isDeepStrictEqual(token.credentials, expectedCredentials)) return {
218
217
  marked: false,
219
- keptAsLastActive: false,
218
+ wasLastActive: false,
220
219
  staleCredentials: true
221
220
  };
222
221
  await trx.knex.raw("SELECT pg_advisory_xact_lock(?, hashtext(?))", [TOKEN_AUTH_DEATH_LOCK_CLASS_ID, token.provider]);
223
- const marked = (await trx.knex.raw(`UPDATE tokens
222
+ const marked = (await trx.knex.raw(`WITH previous AS (
223
+ SELECT active AND NOT EXISTS (
224
+ SELECT 1 FROM tokens peer
225
+ WHERE peer.provider = tokens.provider AND peer.active
226
+ AND NOT peer.reauth_required AND peer.id <> tokens.id
227
+ ) AS was_last_active FROM tokens WHERE id = ?
228
+ )
229
+ UPDATE tokens
224
230
  SET reauth_required = true,
225
- active = CASE
226
- WHEN active AND (SELECT count(*) FROM tokens peer
227
- WHERE peer.provider = tokens.provider AND peer.active) > 1
228
- THEN false
229
- ELSE active
230
- END
231
+ active = false
231
232
  WHERE id = ? AND reauth_required = false
232
- RETURNING active`, [id])).rows[0];
233
+ RETURNING (SELECT was_last_active FROM previous) AS was_last_active`, [id, id])).rows[0];
233
234
  if (!marked) return {
234
235
  marked: false,
235
- keptAsLastActive: false,
236
+ wasLastActive: false,
236
237
  staleCredentials: false
237
238
  };
238
- if (marked.active) logger.error(`refusing to auto-deactivate token ${id}: last active provider token — systemic refresh failure suspected, keeping the pool non-empty`);
239
+ if (marked.was_last_active) logger.error(`deactivated expired token ${id}: no usable provider tokens remain`);
239
240
  return {
240
241
  marked: true,
241
- keptAsLastActive: marked.active,
242
+ wasLastActive: marked.was_last_active,
242
243
  staleCredentials: false
243
244
  };
244
245
  });
245
246
  }
247
+ /** Repair rows retained by the former last-active exception before pool reconciliation. */
248
+ async deactivateExpiredTokens() {
249
+ await this.getPuri("w").table("tokens").where("reauth_required", true).where("active", true).update({ active: false });
250
+ }
246
251
  async reorder(ids) {
247
252
  await this.getPuri("w").transaction(async (trx) => {
248
253
  for (let i = 0; i < ids.length; i++) await trx.table("tokens").where("id", ids[i]).update({ ord: i });
@@ -298,4 +303,4 @@ const TokenModel = new TokenModelClass();
298
303
  //#endregion
299
304
  export { TokenModel };
300
305
 
301
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4ubW9kZWwuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzRGVlcFN0cmljdEVxdWFsIH0gZnJvbSBcIm5vZGU6dXRpbFwiO1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHtcbiAgYXBpLFxuICBhc0FycmF5LFxuICBCYWRSZXF1ZXN0RXhjZXB0aW9uLFxuICBCYXNlTW9kZWxDbGFzcyxcbiAgZXhoYXVzdGl2ZSxcbiAgdHlwZSBMaXN0UmVzdWx0LFxuICBOb3RGb3VuZEV4Y2VwdGlvbixcbn0gZnJvbSBcInNvbmFtdVwiO1xuXG5pbXBvcnQgeyBTRCB9IGZyb20gXCIuLi8uLi9pMThuL3NkLmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNldEtleSwgdHlwZSBUb2tlblN1YnNldE1hcHBpbmcgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgdG9rZW5Mb2FkZXJRdWVyaWVzLCB0b2tlblN1YnNldFF1ZXJpZXMgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZC5zc29cIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5DcmVkZW50aWFscywgdHlwZSBUb2tlbkxpc3RQYXJhbXMsIHR5cGUgVG9rZW5TYXZlUGFyYW1zIH0gZnJvbSBcIi4vdG9rZW4udHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwidG9rZW5cIl0pO1xuXG5jb25zdCBERUZBVUxUX1FVT1RBX1RIUkVTSE9MRCA9IDgwO1xuY29uc3QgREVGQVVMVF9XRUlHSFQgPSAxO1xuY29uc3QgVE9LRU5fQVVUSF9ERUFUSF9MT0NLX0NMQVNTX0lEID0gNzE5O1xuXG5leHBvcnQgdHlwZSBUb2tlblVwZGF0ZUZpZWxkcyA9IHtcbiAgbmFtZT86IHN0cmluZztcbiAgcXVvdGFfdGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbDtcbiAgd2VpZ2h0PzogbnVtYmVyO1xuICBrZWVwYWxpdmVfZW5hYmxlZD86IGJvb2xlYW47XG59O1xuXG5mdW5jdGlvbiBhcHBseUNyZWF0ZURlZmF1bHRzKHNwOiBUb2tlblNhdmVQYXJhbXMpOiBUb2tlblNhdmVQYXJhbXMge1xuICBpZiAoc3AuaWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHNwO1xuICByZXR1cm4ge1xuICAgIC4uLnNwLFxuICAgIC4uLihzcC5xdW90YV90aHJlc2hvbGQgPT09IHVuZGVmaW5lZCA/IHsgcXVvdGFfdGhyZXNob2xkOiBERUZBVUxUX1FVT1RBX1RIUkVTSE9MRCB9IDoge30pLFxuICAgIC4uLihzcC53ZWlnaHQgPT09IHVuZGVmaW5lZCA/IHsgd2VpZ2h0OiBERUZBVUxUX1dFSUdIVCB9IDoge30pLFxuICB9O1xufVxuXG5jbGFzcyBUb2tlbk1vZGVsQ2xhc3MgZXh0ZW5kcyBCYXNlTW9kZWxDbGFzczxcbiAgVG9rZW5TdWJzZXRLZXksXG4gIFRva2VuU3Vic2V0TWFwcGluZyxcbiAgdHlwZW9mIHRva2VuU3Vic2V0UXVlcmllcyxcbiAgdHlwZW9mIHRva2VuTG9hZGVyUXVlcmllc1xuPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiVG9rZW5cIiwgdG9rZW5TdWJzZXRRdWVyaWVzLCB0b2tlbkxvYWRlclF1ZXJpZXMpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJUb2tlblwiIH0pXG4gIGFzeW5jIGZpbmRCeUlkPFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleT4oc3Vic2V0OiBULCBpZDogbnVtYmVyKTogUHJvbWlzZTxUb2tlblN1YnNldE1hcHBpbmdbVF0+IHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHRoaXMuZmluZE1hbnkoc3Vic2V0LCB7IGlkLCBudW06IDEsIHBhZ2U6IDEgfSk7XG4gICAgaWYgKCFyb3dzWzBdKSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5lbnRpdHlOb3RGb3VuZFwiKShcIlRva2VuXCIsIGlkKSk7XG4gICAgfVxuICAgIHJldHVybiByb3dzWzBdO1xuICB9XG5cbiAgYXN5bmMgZmluZE9uZTxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBsaXN0UGFyYW1zOiBUb2tlbkxpc3RQYXJhbXMsXG4gICk6IFByb21pc2U8VG9rZW5TdWJzZXRNYXBwaW5nW1RdIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgdGhpcy5maW5kTWFueShzdWJzZXQsIHsgLi4ubGlzdFBhcmFtcywgbnVtOiAxLCBwYWdlOiAxIH0pO1xuICAgIHJldHVybiByb3dzWzBdID8/IG51bGw7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSwgcmVzb3VyY2VOYW1lOiBcIlRva2Vuc1wiIH0pXG4gIGFzeW5jIGZpbmRNYW55PFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleSwgTFAgZXh0ZW5kcyBUb2tlbkxpc3RQYXJhbXM+KFxuICAgIHN1YnNldDogVCxcbiAgICByYXdQYXJhbXM/OiBMUCxcbiAgKTogUHJvbWlzZTxMaXN0UmVzdWx0PExQLCBUb2tlblN1YnNldE1hcHBpbmdbVF0+PiB7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgbnVtOiAyNCxcbiAgICAgIHBhZ2U6IDEsXG4gICAgICBzZWFyY2g6IFwiaWRcIiBhcyBjb25zdCxcbiAgICAgIG9yZGVyQnk6IFwib3JkLWFzY1wiIGFzIGNvbnN0LFxuICAgICAgLi4ucmF3UGFyYW1zLFxuICAgIH0gc2F0aXNmaWVzIFRva2VuTGlzdFBhcmFtcztcblxuICAgIGNvbnN0IHsgcWIsIG9uU3Vic2V0OiBfIH0gPSB0aGlzLmdldFN1YnNldFF1ZXJpZXMoc3Vic2V0KTtcblxuICAgIGlmIChwYXJhbXMuaWQpIHtcbiAgICAgIHFiLndoZXJlSW4oXCJ0b2tlbnMuaWRcIiwgYXNBcnJheShwYXJhbXMuaWQpKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnNlYXJjaCAmJiBwYXJhbXMua2V5d29yZCAmJiBwYXJhbXMua2V5d29yZC5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJpZFwiKSB7XG4gICAgICAgIHFiLndoZXJlKFwidG9rZW5zLmlkXCIsIE51bWJlcihwYXJhbXMua2V5d29yZCkpO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMuc2VhcmNoID09PSBcIm5hbWVcIikge1xuICAgICAgICBxYi53aGVyZShcInRva2Vucy5uYW1lXCIsIFwibGlrZVwiLCBgJSR7cGFyYW1zLmtleXdvcmR9JWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJlcnJvci51bmtub3duU2VhcmNoRmllbGRcIikocGFyYW1zLnNlYXJjaCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbXMub3JkZXJCeSkge1xuICAgICAgaWYgKHBhcmFtcy5vcmRlckJ5ID09PSBcImlkLWRlc2NcIikge1xuICAgICAgICBxYi5vcmRlckJ5KFwidG9rZW5zLmlkXCIsIFwiZGVzY1wiKTtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLm9yZGVyQnkgPT09IFwib3JkLWFzY1wiKSB7XG4gICAgICAgIHFiLm9yZGVyQnkoXCJ0b2tlbnMub3JkXCIsIFwiYXNjXCIpO1xuICAgICAgICBxYi5vcmRlckJ5KFwidG9rZW5zLmlkXCIsIFwiYXNjXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhoYXVzdGl2ZShwYXJhbXMub3JkZXJCeSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZW5oYW5jZXJzID0gdGhpcy5jcmVhdGVFbmhhbmNlcnMoe1xuICAgICAgQTogKHJvdykgPT4gKHsgLi4ucm93IH0pLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN1YnNldFF1ZXJ5KHsgc3Vic2V0LCBxYiwgcGFyYW1zLCBlbmhhbmNlcnMsIGRlYnVnOiBmYWxzZSB9KTtcbiAgfVxuXG4gIGFzeW5jIGZpbmRCeUFjY291bnRJZGVudGlmaWVyPFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIHByb3ZpZGVyOiBzdHJpbmcsXG4gICAgYWNjb3VudElkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8VG9rZW5TdWJzZXRNYXBwaW5nW1RdW10+IHtcbiAgICBjb25zdCB7IHFiIH0gPSB0aGlzLmdldFN1YnNldFF1ZXJpZXMoc3Vic2V0KTtcbiAgICBxYi53aGVyZShcInRva2Vucy5wcm92aWRlclwiLCBwcm92aWRlcik7XG4gICAgY29uc3QganNvbktleSA9IHByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiID8gXCJhY2NvdW50VXVpZFwiIDogXCJhY2NvdW50SWRcIjtcbiAgICBxYi53aGVyZVJhdyhgdG9rZW5zLmNyZWRlbnRpYWxzLT4+JyR7anNvbktleX0nID0gP2AsIFthY2NvdW50SWRdKTtcbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7IEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtczogeyBudW06IDEwMCwgcGFnZTogMSB9LFxuICAgICAgZW5oYW5jZXJzLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQucm93cztcbiAgfVxuXG4gIGFzeW5jIGZpbmRBY3RpdmVCeVByb3ZpZGVyPFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIHByb3ZpZGVyOiBzdHJpbmcsXG4gICk6IFByb21pc2U8VG9rZW5TdWJzZXRNYXBwaW5nW1RdW10+IHtcbiAgICBjb25zdCB7IHFiIH0gPSB0aGlzLmdldFN1YnNldFF1ZXJpZXMoc3Vic2V0KTtcbiAgICBxYi53aGVyZShcInRva2Vucy5hY3RpdmVcIiwgdHJ1ZSk7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMucHJvdmlkZXJcIiwgcHJvdmlkZXIpO1xuICAgIGNvbnN0IGVuaGFuY2VycyA9IHRoaXMuY3JlYXRlRW5oYW5jZXJzKHsgQTogKHJvdykgPT4gKHsgLi4ucm93IH0pIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVN1YnNldFF1ZXJ5KHtcbiAgICAgIHN1YnNldCxcbiAgICAgIHFiLFxuICAgICAgcGFyYW1zOiB7IG51bTogMTAwLCBwYWdlOiAxIH0sXG4gICAgICBlbmhhbmNlcnMsXG4gICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdC5yb3dzO1xuICB9XG5cbiAgYXN5bmMgZmluZEFjdGl2ZUJ5UHJvdmlkZXJBbmROYW1lPFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIHByb3ZpZGVyOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICApOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHsgcWIgfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhzdWJzZXQpO1xuICAgIHFiLndoZXJlKFwidG9rZW5zLmFjdGl2ZVwiLCB0cnVlKTtcbiAgICBxYi53aGVyZShcInRva2Vucy5wcm92aWRlclwiLCBwcm92aWRlcik7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMubmFtZVwiLCBuYW1lKTtcbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7IEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtczogeyBudW06IDEsIHBhZ2U6IDEgfSxcbiAgICAgIGVuaGFuY2VycyxcbiAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0LnJvd3NbMF07XG4gIH1cblxuICAvKiog7Iuk7KCcIOyduOymnSDrp4zro4zqsIAg7ZmV7J2464+8IOyerOuhnOq3uOyduOydtCDtlYTsmpTtlZwg7Yag7YGw65OkLiDsiJjrj5kg67mE7Zmc7ISx7ZmU64qUIOygnOyZuO2VnOuLpC4gKi9cbiAgYXN5bmMgZmluZFJlYXV0aFJlcXVpcmVkPFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleT4oc3Vic2V0OiBUKTogUHJvbWlzZTxUb2tlblN1YnNldE1hcHBpbmdbVF1bXT4ge1xuICAgIGNvbnN0IHsgcWIgfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhzdWJzZXQpO1xuICAgIHFiLndoZXJlKFwidG9rZW5zLnJlYXV0aF9yZXF1aXJlZFwiLCB0cnVlKTtcbiAgICBxYi5vcmRlckJ5KFwidG9rZW5zLm5hbWVcIiwgXCJhc2NcIik7XG4gICAgY29uc3QgZW5oYW5jZXJzID0gdGhpcy5jcmVhdGVFbmhhbmNlcnMoeyBBOiAocm93KSA9PiAoeyAuLi5yb3cgfSkgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlU3Vic2V0UXVlcnkoe1xuICAgICAgc3Vic2V0LFxuICAgICAgcWIsXG4gICAgICBwYXJhbXM6IHsgbnVtOiAxMDAsIHBhZ2U6IDEgfSxcbiAgICAgIGVuaGFuY2VycyxcbiAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG4gIH1cblxuICBhc3luYyBmaW5kQWN0aXZlPFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleT4oc3Vic2V0OiBUKTogUHJvbWlzZTxUb2tlblN1YnNldE1hcHBpbmdbVF1bXT4ge1xuICAgIGNvbnN0IHsgcWIgfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhzdWJzZXQpO1xuICAgIHFiLndoZXJlKFwidG9rZW5zLmFjdGl2ZVwiLCB0cnVlKTtcbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7IEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtczogeyBudW06IDEwMCwgcGFnZTogMSB9LFxuICAgICAgZW5oYW5jZXJzLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQucm93cztcbiAgfVxuXG4gIGFzeW5jIHNhdmUoc3BhOiBUb2tlblNhdmVQYXJhbXNbXSk6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHNwYS5mb3JFYWNoKChzcCkgPT4ge1xuICAgICAgd2RiLnViUmVnaXN0ZXIoXCJ0b2tlbnNcIiwgYXBwbHlDcmVhdGVEZWZhdWx0cyhzcCkpO1xuICAgIH0pO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgcmV0dXJuIHRyeC51YlVwc2VydChcInRva2Vuc1wiKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUZpZWxkcyhpZDogbnVtYmVyLCBmaWVsZHM6IFRva2VuVXBkYXRlRmllbGRzKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oKHRyeCkgPT4gdHJ4LnRhYmxlKFwidG9rZW5zXCIpLndoZXJlKFwiaWRcIiwgaWQpLnVwZGF0ZShmaWVsZHMpKTtcbiAgfVxuXG4gIGFzeW5jIHRvZ2dsZUFjdGl2ZShpZDogbnVtYmVyKTogUHJvbWlzZTx7IGFjdGl2ZTogYm9vbGVhbjsgcmVhdXRoUmVxdWlyZWQ6IGJvb2xlYW4gfSB8IG51bGw+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0cnhcbiAgICAgICAgLmZyb20oXCJ0b2tlbnNcIilcbiAgICAgICAgLnNlbGVjdCh7IGFjdGl2ZTogXCJhY3RpdmVcIiwgcmVhdXRoX3JlcXVpcmVkOiBcInJlYXV0aF9yZXF1aXJlZFwiIH0pXG4gICAgICAgIC53aGVyZShcImlkXCIsIGlkKVxuICAgICAgICAuZm9yVXBkYXRlKClcbiAgICAgICAgLmZpcnN0KCk7XG4gICAgICBpZiAoIXRva2VuKSByZXR1cm4gbnVsbDtcbiAgICAgIGlmICghdG9rZW4uYWN0aXZlICYmIHRva2VuLnJlYXV0aF9yZXF1aXJlZCkge1xuICAgICAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCByZWF1dGhSZXF1aXJlZDogdHJ1ZSB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhY3RpdmUgPSAhdG9rZW4uYWN0aXZlO1xuICAgICAgYXdhaXQgdHJ4LmZyb20oXCJ0b2tlbnNcIikud2hlcmUoXCJpZFwiLCBpZCkudXBkYXRlKHsgYWN0aXZlIH0pO1xuICAgICAgcmV0dXJuIHsgYWN0aXZlLCByZWF1dGhSZXF1aXJlZDogZmFsc2UgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDqsJnsnYAg6rOE7KCV7J2YIOq4sOyhtCDthqDtgbDsnYQg7KeA7Jqw6rOgIOyDiOuhnCDsoIDsnqXtlZzri6Qo66Gc6re47J24wrfsnqzroZzqt7jsnbgg6rO17Ya1IOqyveuhnCkuXG4gICAqXG4gICAqIHByb3ZpZGVyIOydkeuLteyXkCDqs4TsoJUg7Iud67OE7J6Q6rCAIOyXhuycvOuptCBkZWR1cCDsnpDssrTqsIAg67aI6rCA64ql7ZWY66+A66GcIOqyveqzoOunjCDrgqjquLDqs6BcbiAgICog7KSR67O1IOygnOqxsCDsl4bsnbQg7KCA7J6l7ZWc64ukKOyjveydgCByb3cg6rCAIOuCqOuKlOuLpCkuXG4gICAqL1xuICBhc3luYyByZXBsYWNlQnlBY2NvdW50KFxuICAgIHByb3ZpZGVyOiBzdHJpbmcsXG4gICAgYWNjb3VudElkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc2F2ZVBhcmFtczogVG9rZW5TYXZlUGFyYW1zLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQga2VlcGFsaXZlRW5hYmxlZCA9IHNhdmVQYXJhbXMua2VlcGFsaXZlX2VuYWJsZWQ7XG4gICAgaWYgKGFjY291bnRJZCkge1xuICAgICAgY29uc3Qgb2xkRW50cmllcyA9IGF3YWl0IHRoaXMuZmluZEJ5QWNjb3VudElkZW50aWZpZXIoXCJBXCIsIHByb3ZpZGVyLCBhY2NvdW50SWQpO1xuICAgICAgaWYgKGtlZXBhbGl2ZUVuYWJsZWQgPT09IHVuZGVmaW5lZCAmJiBvbGRFbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAga2VlcGFsaXZlRW5hYmxlZCA9IG9sZEVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5LmtlZXBhbGl2ZV9lbmFibGVkKTtcbiAgICAgIH1cbiAgICAgIGlmIChvbGRFbnRyaWVzLmxlbmd0aCA+IDApIGF3YWl0IHRoaXMuZGVsKG9sZEVudHJpZXMubWFwKChvKSA9PiBvLmlkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgJHtwcm92aWRlcn0gbG9naW4gd2l0aG91dCBhY2NvdW50IGlkZW50aWZpZXI6IGRlZHVwIHNraXBwZWQgZm9yICR7c2F2ZVBhcmFtcy5uYW1lID8/IFwidW5uYW1lZFwifWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2F2ZShbXG4gICAgICBrZWVwYWxpdmVFbmFibGVkID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBzYXZlUGFyYW1zXG4gICAgICAgIDogeyAuLi5zYXZlUGFyYW1zLCBrZWVwYWxpdmVfZW5hYmxlZDoga2VlcGFsaXZlRW5hYmxlZCB9LFxuICAgIF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOyduOymnSDsgqzrp53snYQg7ZWcIOuyiOunjCDquLDroZ3tlZjqs6AsIOuLpOuluCDtmZzshLEg7Yag7YGw7J20IOyeiOycvOuptCDrnbzsmrDtjIXsl5DshJzrj4Qg7KCc7Jm47ZWc64ukLlxuICAgKiDrp4jsp4Drp4kg7Zmc7ISxIO2GoO2BsOydgCBzeXN0ZW1pYyDsnqXslaAg7JWI7KCE7YyQIOuVjOusuOyXkCBhY3RpdmUg7IOB7YOc66W8IOycoOyngO2VmOuQmCDsnqzroZzqt7jsnbhcbiAgICog7ZWE7JqUIOyDge2DnOuKlCDquLDroZ3tlZzri6QuIGBtYXJrZWRg6rCAIOqzteycoCBEQiDsnbjsiqTthLTsiqTrk6TsnZgg7JWM66a8IOuwnOyGoSDqsozsnbTtirjri6QuXG4gICAqL1xuICBhc3luYyBtYXJrUmVhdXRoUmVxdWlyZWQoXG4gICAgaWQ6IG51bWJlcixcbiAgICBleHBlY3RlZENyZWRlbnRpYWxzOiBUb2tlbkNyZWRlbnRpYWxzLFxuICApOiBQcm9taXNlPHsgbWFya2VkOiBib29sZWFuOyBrZXB0QXNMYXN0QWN0aXZlOiBib29sZWFuOyBzdGFsZUNyZWRlbnRpYWxzOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0cnhcbiAgICAgICAgLmZyb20oXCJ0b2tlbnNcIilcbiAgICAgICAgLnNlbGVjdCh7XG4gICAgICAgICAgcHJvdmlkZXI6IFwicHJvdmlkZXJcIixcbiAgICAgICAgICBjcmVkZW50aWFsczogXCJjcmVkZW50aWFsc1wiLFxuICAgICAgICAgIHJlYXV0aF9yZXF1aXJlZDogXCJyZWF1dGhfcmVxdWlyZWRcIixcbiAgICAgICAgfSlcbiAgICAgICAgLndoZXJlKFwiaWRcIiwgaWQpXG4gICAgICAgIC5mb3JVcGRhdGUoKVxuICAgICAgICAuZmlyc3QoKTtcbiAgICAgIGlmICghdG9rZW4gfHwgdG9rZW4ucmVhdXRoX3JlcXVpcmVkKSB7XG4gICAgICAgIHJldHVybiB7IG1hcmtlZDogZmFsc2UsIGtlcHRBc0xhc3RBY3RpdmU6IGZhbHNlLCBzdGFsZUNyZWRlbnRpYWxzOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgaWYgKCFpc0RlZXBTdHJpY3RFcXVhbCh0b2tlbi5jcmVkZW50aWFscywgZXhwZWN0ZWRDcmVkZW50aWFscykpIHtcbiAgICAgICAgcmV0dXJuIHsgbWFya2VkOiBmYWxzZSwga2VwdEFzTGFzdEFjdGl2ZTogZmFsc2UsIHN0YWxlQ3JlZGVudGlhbHM6IHRydWUgfTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdHJ4LmtuZXgucmF3KFwiU0VMRUNUIHBnX2Fkdmlzb3J5X3hhY3RfbG9jayg/LCBoYXNodGV4dCg/KSlcIiwgW1xuICAgICAgICBUT0tFTl9BVVRIX0RFQVRIX0xPQ0tfQ0xBU1NfSUQsXG4gICAgICAgIHRva2VuLnByb3ZpZGVyLFxuICAgICAgXSk7XG4gICAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdHJ4LmtuZXgucmF3PHsgcm93czogeyBhY3RpdmU6IGJvb2xlYW4gfVtdIH0+KFxuICAgICAgICBgVVBEQVRFIHRva2Vuc1xuICAgICAgICAgU0VUIHJlYXV0aF9yZXF1aXJlZCA9IHRydWUsXG4gICAgICAgICAgICAgYWN0aXZlID0gQ0FTRVxuICAgICAgICAgICAgICAgV0hFTiBhY3RpdmUgQU5EIChTRUxFQ1QgY291bnQoKikgRlJPTSB0b2tlbnMgcGVlclxuICAgICAgICAgICAgICAgICBXSEVSRSBwZWVyLnByb3ZpZGVyID0gdG9rZW5zLnByb3ZpZGVyIEFORCBwZWVyLmFjdGl2ZSkgPiAxXG4gICAgICAgICAgICAgICBUSEVOIGZhbHNlXG4gICAgICAgICAgICAgICBFTFNFIGFjdGl2ZVxuICAgICAgICAgICAgIEVORFxuICAgICAgICAgV0hFUkUgaWQgPSA/IEFORCByZWF1dGhfcmVxdWlyZWQgPSBmYWxzZVxuICAgICAgICAgUkVUVVJOSU5HIGFjdGl2ZWAsXG4gICAgICAgIFtpZF0sXG4gICAgICApO1xuICAgICAgY29uc3QgbWFya2VkID0gdXBkYXRlZC5yb3dzWzBdO1xuICAgICAgaWYgKCFtYXJrZWQpIHJldHVybiB7IG1hcmtlZDogZmFsc2UsIGtlcHRBc0xhc3RBY3RpdmU6IGZhbHNlLCBzdGFsZUNyZWRlbnRpYWxzOiBmYWxzZSB9O1xuXG4gICAgICBpZiAobWFya2VkLmFjdGl2ZSkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYHJlZnVzaW5nIHRvIGF1dG8tZGVhY3RpdmF0ZSB0b2tlbiAke2lkfTogbGFzdCBhY3RpdmUgcHJvdmlkZXIgdG9rZW4g4oCUIGAgK1xuICAgICAgICAgICAgYHN5c3RlbWljIHJlZnJlc2ggZmFpbHVyZSBzdXNwZWN0ZWQsIGtlZXBpbmcgdGhlIHBvb2wgbm9uLWVtcHR5YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG1hcmtlZDogdHJ1ZSwga2VwdEFzTGFzdEFjdGl2ZTogbWFya2VkLmFjdGl2ZSwgc3RhbGVDcmVkZW50aWFsczogZmFsc2UgfTtcbiAgICB9KTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyByZW9yZGVyKGlkczogbnVtYmVyW10pOiBQcm9taXNlPHsgZG9uZTogYm9vbGVhbiB9PiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICBhd2FpdCB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXdhaXQgdHJ4LnRhYmxlKFwidG9rZW5zXCIpLndoZXJlKFwiaWRcIiwgaWRzW2ldISkudXBkYXRlKHsgb3JkOiBpIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7IGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBkZWwoaWRzOiBudW1iZXJbXSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICBhd2FpdCB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgcmV0dXJuIHRyeC50YWJsZShcInRva2Vuc1wiKS53aGVyZUluKFwidG9rZW5zLmlkXCIsIGlkcykuZGVsZXRlKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGlkcy5sZW5ndGg7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFRva2VuTW9kZWwgPSBuZXcgVG9rZW5Nb2RlbENsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBa0JBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyxPQUFPLENBQUM7QUFFM0MsTUFBTSwwQkFBMEI7QUFDaEMsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxpQ0FBaUM7QUFTdkMsU0FBUyxvQkFBb0IsSUFBc0M7Q0FDakUsSUFBSSxHQUFHLE9BQU8sUUFBVyxPQUFPO0NBQ2hDLE9BQU87RUFDTCxHQUFHO0VBQ0gsR0FBSSxHQUFHLG9CQUFvQixTQUFZLEVBQUUsaUJBQWlCLHdCQUF3QixJQUFJLENBQUM7RUFDdkYsR0FBSSxHQUFHLFdBQVcsU0FBWSxFQUFFLFFBQVEsZUFBZSxJQUFJLENBQUM7Q0FDOUQ7QUFDRjtBQUVBLElBQU0sa0JBQU4sY0FBOEIsZUFLNUI7Q0FDQSxjQUFjO0VBQ1osTUFBTSxTQUFTLG9CQUFvQixrQkFB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
306
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4ubW9kZWwuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzRGVlcFN0cmljdEVxdWFsIH0gZnJvbSBcIm5vZGU6dXRpbFwiO1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHtcbiAgYXBpLFxuICBhc0FycmF5LFxuICBCYWRSZXF1ZXN0RXhjZXB0aW9uLFxuICBCYXNlTW9kZWxDbGFzcyxcbiAgZXhoYXVzdGl2ZSxcbiAgdHlwZSBMaXN0UmVzdWx0LFxuICBOb3RGb3VuZEV4Y2VwdGlvbixcbn0gZnJvbSBcInNvbmFtdVwiO1xuXG5pbXBvcnQgeyBTRCB9IGZyb20gXCIuLi8uLi9pMThuL3NkLmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNldEtleSwgdHlwZSBUb2tlblN1YnNldE1hcHBpbmcgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgdG9rZW5Mb2FkZXJRdWVyaWVzLCB0b2tlblN1YnNldFF1ZXJpZXMgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZC5zc29cIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5DcmVkZW50aWFscywgdHlwZSBUb2tlbkxpc3RQYXJhbXMsIHR5cGUgVG9rZW5TYXZlUGFyYW1zIH0gZnJvbSBcIi4vdG9rZW4udHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwidG9rZW5cIl0pO1xuXG5jb25zdCBERUZBVUxUX1FVT1RBX1RIUkVTSE9MRCA9IDgwO1xuY29uc3QgREVGQVVMVF9XRUlHSFQgPSAxO1xuY29uc3QgVE9LRU5fQVVUSF9ERUFUSF9MT0NLX0NMQVNTX0lEID0gNzE5O1xuXG5leHBvcnQgdHlwZSBUb2tlblVwZGF0ZUZpZWxkcyA9IHtcbiAgbmFtZT86IHN0cmluZztcbiAgcXVvdGFfdGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbDtcbiAgd2VpZ2h0PzogbnVtYmVyO1xuICBrZWVwYWxpdmVfZW5hYmxlZD86IGJvb2xlYW47XG59O1xuXG5mdW5jdGlvbiBhcHBseUNyZWF0ZURlZmF1bHRzKHNwOiBUb2tlblNhdmVQYXJhbXMpOiBUb2tlblNhdmVQYXJhbXMge1xuICBpZiAoc3AuaWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHNwO1xuICByZXR1cm4ge1xuICAgIC4uLnNwLFxuICAgIC4uLihzcC5xdW90YV90aHJlc2hvbGQgPT09IHVuZGVmaW5lZCA/IHsgcXVvdGFfdGhyZXNob2xkOiBERUZBVUxUX1FVT1RBX1RIUkVTSE9MRCB9IDoge30pLFxuICAgIC4uLihzcC53ZWlnaHQgPT09IHVuZGVmaW5lZCA/IHsgd2VpZ2h0OiBERUZBVUxUX1dFSUdIVCB9IDoge30pLFxuICB9O1xufVxuXG5jbGFzcyBUb2tlbk1vZGVsQ2xhc3MgZXh0ZW5kcyBCYXNlTW9kZWxDbGFzczxcbiAgVG9rZW5TdWJzZXRLZXksXG4gIFRva2VuU3Vic2V0TWFwcGluZyxcbiAgdHlwZW9mIHRva2VuU3Vic2V0UXVlcmllcyxcbiAgdHlwZW9mIHRva2VuTG9hZGVyUXVlcmllc1xuPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiVG9rZW5cIiwgdG9rZW5TdWJzZXRRdWVyaWVzLCB0b2tlbkxvYWRlclF1ZXJpZXMpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJUb2tlblwiIH0pXG4gIGFzeW5jIGZpbmRCeUlkPFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleT4oc3Vic2V0OiBULCBpZDogbnVtYmVyKTogUHJvbWlzZTxUb2tlblN1YnNldE1hcHBpbmdbVF0+IHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHRoaXMuZmluZE1hbnkoc3Vic2V0LCB7IGlkLCBudW06IDEsIHBhZ2U6IDEgfSk7XG4gICAgaWYgKCFyb3dzWzBdKSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5lbnRpdHlOb3RGb3VuZFwiKShcIlRva2VuXCIsIGlkKSk7XG4gICAgfVxuICAgIHJldHVybiByb3dzWzBdO1xuICB9XG5cbiAgYXN5bmMgZmluZE9uZTxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBsaXN0UGFyYW1zOiBUb2tlbkxpc3RQYXJhbXMsXG4gICk6IFByb21pc2U8VG9rZW5TdWJzZXRNYXBwaW5nW1RdIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgdGhpcy5maW5kTWFueShzdWJzZXQsIHsgLi4ubGlzdFBhcmFtcywgbnVtOiAxLCBwYWdlOiAxIH0pO1xuICAgIHJldHVybiByb3dzWzBdID8/IG51bGw7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSwgcmVzb3VyY2VOYW1lOiBcIlRva2Vuc1wiIH0pXG4gIGFzeW5jIGZpbmRNYW55PFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleSwgTFAgZXh0ZW5kcyBUb2tlbkxpc3RQYXJhbXM+KFxuICAgIHN1YnNldDogVCxcbiAgICByYXdQYXJhbXM/OiBMUCxcbiAgKTogUHJvbWlzZTxMaXN0UmVzdWx0PExQLCBUb2tlblN1YnNldE1hcHBpbmdbVF0+PiB7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgbnVtOiAyNCxcbiAgICAgIHBhZ2U6IDEsXG4gICAgICBzZWFyY2g6IFwiaWRcIiBhcyBjb25zdCxcbiAgICAgIG9yZGVyQnk6IFwib3JkLWFzY1wiIGFzIGNvbnN0LFxuICAgICAgLi4ucmF3UGFyYW1zLFxuICAgIH0gc2F0aXNmaWVzIFRva2VuTGlzdFBhcmFtcztcblxuICAgIGNvbnN0IHsgcWIsIG9uU3Vic2V0OiBfIH0gPSB0aGlzLmdldFN1YnNldFF1ZXJpZXMoc3Vic2V0KTtcblxuICAgIGlmIChwYXJhbXMuaWQpIHtcbiAgICAgIHFiLndoZXJlSW4oXCJ0b2tlbnMuaWRcIiwgYXNBcnJheShwYXJhbXMuaWQpKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnNlYXJjaCAmJiBwYXJhbXMua2V5d29yZCAmJiBwYXJhbXMua2V5d29yZC5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJpZFwiKSB7XG4gICAgICAgIHFiLndoZXJlKFwidG9rZW5zLmlkXCIsIE51bWJlcihwYXJhbXMua2V5d29yZCkpO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMuc2VhcmNoID09PSBcIm5hbWVcIikge1xuICAgICAgICBxYi53aGVyZShcInRva2Vucy5uYW1lXCIsIFwibGlrZVwiLCBgJSR7cGFyYW1zLmtleXdvcmR9JWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJlcnJvci51bmtub3duU2VhcmNoRmllbGRcIikocGFyYW1zLnNlYXJjaCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbXMub3JkZXJCeSkge1xuICAgICAgaWYgKHBhcmFtcy5vcmRlckJ5ID09PSBcImlkLWRlc2NcIikge1xuICAgICAgICBxYi5vcmRlckJ5KFwidG9rZW5zLmlkXCIsIFwiZGVzY1wiKTtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLm9yZGVyQnkgPT09IFwib3JkLWFzY1wiKSB7XG4gICAgICAgIHFiLm9yZGVyQnkoXCJ0b2tlbnMub3JkXCIsIFwiYXNjXCIpO1xuICAgICAgICBxYi5vcmRlckJ5KFwidG9rZW5zLmlkXCIsIFwiYXNjXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhoYXVzdGl2ZShwYXJhbXMub3JkZXJCeSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZW5oYW5jZXJzID0gdGhpcy5jcmVhdGVFbmhhbmNlcnMoe1xuICAgICAgQTogKHJvdykgPT4gKHsgLi4ucm93IH0pLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN1YnNldFF1ZXJ5KHsgc3Vic2V0LCBxYiwgcGFyYW1zLCBlbmhhbmNlcnMsIGRlYnVnOiBmYWxzZSB9KTtcbiAgfVxuXG4gIGFzeW5jIGZpbmRCeUFjY291bnRJZGVudGlmaWVyPFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIHByb3ZpZGVyOiBzdHJpbmcsXG4gICAgYWNjb3VudElkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8VG9rZW5TdWJzZXRNYXBwaW5nW1RdW10+IHtcbiAgICBjb25zdCB7IHFiIH0gPSB0aGlzLmdldFN1YnNldFF1ZXJpZXMoc3Vic2V0KTtcbiAgICBxYi53aGVyZShcInRva2Vucy5wcm92aWRlclwiLCBwcm92aWRlcik7XG4gICAgY29uc3QganNvbktleSA9IHByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiID8gXCJhY2NvdW50VXVpZFwiIDogXCJhY2NvdW50SWRcIjtcbiAgICBxYi53aGVyZVJhdyhgdG9rZW5zLmNyZWRlbnRpYWxzLT4+JyR7anNvbktleX0nID0gP2AsIFthY2NvdW50SWRdKTtcbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7IEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtczogeyBudW06IDEwMCwgcGFnZTogMSB9LFxuICAgICAgZW5oYW5jZXJzLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQucm93cztcbiAgfVxuXG4gIGFzeW5jIGZpbmRBY3RpdmVCeVByb3ZpZGVyPFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIHByb3ZpZGVyOiBzdHJpbmcsXG4gICk6IFByb21pc2U8VG9rZW5TdWJzZXRNYXBwaW5nW1RdW10+IHtcbiAgICBjb25zdCB7IHFiIH0gPSB0aGlzLmdldFN1YnNldFF1ZXJpZXMoc3Vic2V0KTtcbiAgICBxYi53aGVyZShcInRva2Vucy5hY3RpdmVcIiwgdHJ1ZSk7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMucHJvdmlkZXJcIiwgcHJvdmlkZXIpO1xuICAgIGNvbnN0IGVuaGFuY2VycyA9IHRoaXMuY3JlYXRlRW5oYW5jZXJzKHsgQTogKHJvdykgPT4gKHsgLi4ucm93IH0pIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVN1YnNldFF1ZXJ5KHtcbiAgICAgIHN1YnNldCxcbiAgICAgIHFiLFxuICAgICAgcGFyYW1zOiB7IG51bTogMTAwLCBwYWdlOiAxIH0sXG4gICAgICBlbmhhbmNlcnMsXG4gICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdC5yb3dzO1xuICB9XG5cbiAgYXN5bmMgZmluZEFjdGl2ZUJ5UHJvdmlkZXJBbmROYW1lPFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIHByb3ZpZGVyOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICApOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHsgcWIgfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhzdWJzZXQpO1xuICAgIHFiLndoZXJlKFwidG9rZW5zLmFjdGl2ZVwiLCB0cnVlKTtcbiAgICBxYi53aGVyZShcInRva2Vucy5wcm92aWRlclwiLCBwcm92aWRlcik7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMubmFtZVwiLCBuYW1lKTtcbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7IEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtczogeyBudW06IDEsIHBhZ2U6IDEgfSxcbiAgICAgIGVuaGFuY2VycyxcbiAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0LnJvd3NbMF07XG4gIH1cblxuICAvKiog7Iuk7KCcIOyduOymnSDrp4zro4zqsIAg7ZmV7J2464+8IOyerOuhnOq3uOyduOydtCDtlYTsmpTtlZwg7Yag7YGw65OkLiDsiJjrj5kg67mE7Zmc7ISx7ZmU64qUIOygnOyZuO2VnOuLpC4gKi9cbiAgYXN5bmMgZmluZFJlYXV0aFJlcXVpcmVkPFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleT4oc3Vic2V0OiBUKTogUHJvbWlzZTxUb2tlblN1YnNldE1hcHBpbmdbVF1bXT4ge1xuICAgIGNvbnN0IHsgcWIgfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhzdWJzZXQpO1xuICAgIHFiLndoZXJlKFwidG9rZW5zLnJlYXV0aF9yZXF1aXJlZFwiLCB0cnVlKTtcbiAgICBxYi5vcmRlckJ5KFwidG9rZW5zLm5hbWVcIiwgXCJhc2NcIik7XG4gICAgY29uc3QgZW5oYW5jZXJzID0gdGhpcy5jcmVhdGVFbmhhbmNlcnMoeyBBOiAocm93KSA9PiAoeyAuLi5yb3cgfSkgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlU3Vic2V0UXVlcnkoe1xuICAgICAgc3Vic2V0LFxuICAgICAgcWIsXG4gICAgICBwYXJhbXM6IHsgbnVtOiAxMDAsIHBhZ2U6IDEgfSxcbiAgICAgIGVuaGFuY2VycyxcbiAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG4gIH1cblxuICBhc3luYyBmaW5kQWN0aXZlPFQgZXh0ZW5kcyBUb2tlblN1YnNldEtleT4oc3Vic2V0OiBUKTogUHJvbWlzZTxUb2tlblN1YnNldE1hcHBpbmdbVF1bXT4ge1xuICAgIGNvbnN0IHsgcWIgfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhzdWJzZXQpO1xuICAgIHFiLndoZXJlKFwidG9rZW5zLmFjdGl2ZVwiLCB0cnVlKTtcbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7IEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtczogeyBudW06IDEwMCwgcGFnZTogMSB9LFxuICAgICAgZW5oYW5jZXJzLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQucm93cztcbiAgfVxuXG4gIGFzeW5jIHNhdmUoc3BhOiBUb2tlblNhdmVQYXJhbXNbXSk6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHNwYS5mb3JFYWNoKChzcCkgPT4ge1xuICAgICAgd2RiLnViUmVnaXN0ZXIoXCJ0b2tlbnNcIiwgYXBwbHlDcmVhdGVEZWZhdWx0cyhzcCkpO1xuICAgIH0pO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgcmV0dXJuIHRyeC51YlVwc2VydChcInRva2Vuc1wiKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUZpZWxkcyhpZDogbnVtYmVyLCBmaWVsZHM6IFRva2VuVXBkYXRlRmllbGRzKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oKHRyeCkgPT4gdHJ4LnRhYmxlKFwidG9rZW5zXCIpLndoZXJlKFwiaWRcIiwgaWQpLnVwZGF0ZShmaWVsZHMpKTtcbiAgfVxuXG4gIGFzeW5jIHRvZ2dsZUFjdGl2ZShpZDogbnVtYmVyKTogUHJvbWlzZTx7IGFjdGl2ZTogYm9vbGVhbjsgcmVhdXRoUmVxdWlyZWQ6IGJvb2xlYW4gfSB8IG51bGw+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0cnhcbiAgICAgICAgLmZyb20oXCJ0b2tlbnNcIilcbiAgICAgICAgLnNlbGVjdCh7IGFjdGl2ZTogXCJhY3RpdmVcIiwgcmVhdXRoX3JlcXVpcmVkOiBcInJlYXV0aF9yZXF1aXJlZFwiIH0pXG4gICAgICAgIC53aGVyZShcImlkXCIsIGlkKVxuICAgICAgICAuZm9yVXBkYXRlKClcbiAgICAgICAgLmZpcnN0KCk7XG4gICAgICBpZiAoIXRva2VuKSByZXR1cm4gbnVsbDtcbiAgICAgIGlmICghdG9rZW4uYWN0aXZlICYmIHRva2VuLnJlYXV0aF9yZXF1aXJlZCkge1xuICAgICAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlLCByZWF1dGhSZXF1aXJlZDogdHJ1ZSB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhY3RpdmUgPSAhdG9rZW4uYWN0aXZlO1xuICAgICAgYXdhaXQgdHJ4LmZyb20oXCJ0b2tlbnNcIikud2hlcmUoXCJpZFwiLCBpZCkudXBkYXRlKHsgYWN0aXZlIH0pO1xuICAgICAgcmV0dXJuIHsgYWN0aXZlLCByZWF1dGhSZXF1aXJlZDogZmFsc2UgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDqsJnsnYAg6rOE7KCV7J2YIOq4sOyhtCDthqDtgbDsnYQg7KeA7Jqw6rOgIOyDiOuhnCDsoIDsnqXtlZzri6Qo66Gc6re47J24wrfsnqzroZzqt7jsnbgg6rO17Ya1IOqyveuhnCkuXG4gICAqXG4gICAqIHByb3ZpZGVyIOydkeuLteyXkCDqs4TsoJUg7Iud67OE7J6Q6rCAIOyXhuycvOuptCBkZWR1cCDsnpDssrTqsIAg67aI6rCA64ql7ZWY66+A66GcIOqyveqzoOunjCDrgqjquLDqs6BcbiAgICog7KSR67O1IOygnOqxsCDsl4bsnbQg7KCA7J6l7ZWc64ukKOyjveydgCByb3cg6rCAIOuCqOuKlOuLpCkuXG4gICAqL1xuICBhc3luYyByZXBsYWNlQnlBY2NvdW50KFxuICAgIHByb3ZpZGVyOiBzdHJpbmcsXG4gICAgYWNjb3VudElkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc2F2ZVBhcmFtczogVG9rZW5TYXZlUGFyYW1zLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQga2VlcGFsaXZlRW5hYmxlZCA9IHNhdmVQYXJhbXMua2VlcGFsaXZlX2VuYWJsZWQ7XG4gICAgaWYgKGFjY291bnRJZCkge1xuICAgICAgY29uc3Qgb2xkRW50cmllcyA9IGF3YWl0IHRoaXMuZmluZEJ5QWNjb3VudElkZW50aWZpZXIoXCJBXCIsIHByb3ZpZGVyLCBhY2NvdW50SWQpO1xuICAgICAgaWYgKGtlZXBhbGl2ZUVuYWJsZWQgPT09IHVuZGVmaW5lZCAmJiBvbGRFbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAga2VlcGFsaXZlRW5hYmxlZCA9IG9sZEVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5LmtlZXBhbGl2ZV9lbmFibGVkKTtcbiAgICAgIH1cbiAgICAgIGlmIChvbGRFbnRyaWVzLmxlbmd0aCA+IDApIGF3YWl0IHRoaXMuZGVsKG9sZEVudHJpZXMubWFwKChvKSA9PiBvLmlkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgJHtwcm92aWRlcn0gbG9naW4gd2l0aG91dCBhY2NvdW50IGlkZW50aWZpZXI6IGRlZHVwIHNraXBwZWQgZm9yICR7c2F2ZVBhcmFtcy5uYW1lID8/IFwidW5uYW1lZFwifWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2F2ZShbXG4gICAgICBrZWVwYWxpdmVFbmFibGVkID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBzYXZlUGFyYW1zXG4gICAgICAgIDogeyAuLi5zYXZlUGFyYW1zLCBrZWVwYWxpdmVfZW5hYmxlZDoga2VlcGFsaXZlRW5hYmxlZCB9LFxuICAgIF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCBjb25maXJtZWQgZXhwaXJ5IGFuZCByZW1vdmUgdGhlIHRva2VuIGZyb20gcm91dGluZyBhdG9taWNhbGx5LlxuICAgKiBUaGUgbGFzdCBhY3RpdmUgdG9rZW4gaXMgYWxzbyBkZWFjdGl2YXRlZDsgaXRzIG5vdGlmaWNhdGlvbiBpcyB1cmdlbnQuXG4gICAqL1xuICBhc3luYyBtYXJrUmVhdXRoUmVxdWlyZWQoXG4gICAgaWQ6IG51bWJlcixcbiAgICBleHBlY3RlZENyZWRlbnRpYWxzOiBUb2tlbkNyZWRlbnRpYWxzLFxuICApOiBQcm9taXNlPHsgbWFya2VkOiBib29sZWFuOyB3YXNMYXN0QWN0aXZlOiBib29sZWFuOyBzdGFsZUNyZWRlbnRpYWxzOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0cnhcbiAgICAgICAgLmZyb20oXCJ0b2tlbnNcIilcbiAgICAgICAgLnNlbGVjdCh7XG4gICAgICAgICAgcHJvdmlkZXI6IFwicHJvdmlkZXJcIixcbiAgICAgICAgICBjcmVkZW50aWFsczogXCJjcmVkZW50aWFsc1wiLFxuICAgICAgICAgIHJlYXV0aF9yZXF1aXJlZDogXCJyZWF1dGhfcmVxdWlyZWRcIixcbiAgICAgICAgfSlcbiAgICAgICAgLndoZXJlKFwiaWRcIiwgaWQpXG4gICAgICAgIC5mb3JVcGRhdGUoKVxuICAgICAgICAuZmlyc3QoKTtcbiAgICAgIGlmICghdG9rZW4gfHwgdG9rZW4ucmVhdXRoX3JlcXVpcmVkKSB7XG4gICAgICAgIHJldHVybiB7IG1hcmtlZDogZmFsc2UsIHdhc0xhc3RBY3RpdmU6IGZhbHNlLCBzdGFsZUNyZWRlbnRpYWxzOiBmYWxzZSB9O1xuICAgICAgfVxuICAgICAgaWYgKCFpc0RlZXBTdHJpY3RFcXVhbCh0b2tlbi5jcmVkZW50aWFscywgZXhwZWN0ZWRDcmVkZW50aWFscykpIHtcbiAgICAgICAgcmV0dXJuIHsgbWFya2VkOiBmYWxzZSwgd2FzTGFzdEFjdGl2ZTogZmFsc2UsIHN0YWxlQ3JlZGVudGlhbHM6IHRydWUgfTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdHJ4LmtuZXgucmF3KFwiU0VMRUNUIHBnX2Fkdmlzb3J5X3hhY3RfbG9jayg/LCBoYXNodGV4dCg/KSlcIiwgW1xuICAgICAgICBUT0tFTl9BVVRIX0RFQVRIX0xPQ0tfQ0xBU1NfSUQsXG4gICAgICAgIHRva2VuLnByb3ZpZGVyLFxuICAgICAgXSk7XG4gICAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdHJ4LmtuZXgucmF3PHsgcm93czogeyB3YXNfbGFzdF9hY3RpdmU6IGJvb2xlYW4gfVtdIH0+KFxuICAgICAgICBgV0lUSCBwcmV2aW91cyBBUyAoXG4gICAgICAgICAgIFNFTEVDVCBhY3RpdmUgQU5EIE5PVCBFWElTVFMgKFxuICAgICAgICAgICAgIFNFTEVDVCAxIEZST00gdG9rZW5zIHBlZXJcbiAgICAgICAgICAgICBXSEVSRSBwZWVyLnByb3ZpZGVyID0gdG9rZW5zLnByb3ZpZGVyIEFORCBwZWVyLmFjdGl2ZVxuICAgICAgICAgICAgICAgQU5EIE5PVCBwZWVyLnJlYXV0aF9yZXF1aXJlZCBBTkQgcGVlci5pZCA8PiB0b2tlbnMuaWRcbiAgICAgICAgICAgKSBBUyB3YXNfbGFzdF9hY3RpdmUgRlJPTSB0b2tlbnMgV0hFUkUgaWQgPSA/XG4gICAgICAgICApXG4gICAgICAgICBVUERBVEUgdG9rZW5zXG4gICAgICAgICBTRVQgcmVhdXRoX3JlcXVpcmVkID0gdHJ1ZSxcbiAgICAgICAgICAgICBhY3RpdmUgPSBmYWxzZVxuICAgICAgICAgV0hFUkUgaWQgPSA/IEFORCByZWF1dGhfcmVxdWlyZWQgPSBmYWxzZVxuICAgICAgICAgUkVUVVJOSU5HIChTRUxFQ1Qgd2FzX2xhc3RfYWN0aXZlIEZST00gcHJldmlvdXMpIEFTIHdhc19sYXN0X2FjdGl2ZWAsXG4gICAgICAgIFtpZCwgaWRdLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG1hcmtlZCA9IHVwZGF0ZWQucm93c1swXTtcbiAgICAgIGlmICghbWFya2VkKSByZXR1cm4geyBtYXJrZWQ6IGZhbHNlLCB3YXNMYXN0QWN0aXZlOiBmYWxzZSwgc3RhbGVDcmVkZW50aWFsczogZmFsc2UgfTtcblxuICAgICAgaWYgKG1hcmtlZC53YXNfbGFzdF9hY3RpdmUpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBkZWFjdGl2YXRlZCBleHBpcmVkIHRva2VuICR7aWR9OiBubyB1c2FibGUgcHJvdmlkZXIgdG9rZW5zIHJlbWFpbmApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgbWFya2VkOiB0cnVlLCB3YXNMYXN0QWN0aXZlOiBtYXJrZWQud2FzX2xhc3RfYWN0aXZlLCBzdGFsZUNyZWRlbnRpYWxzOiBmYWxzZSB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlcGFpciByb3dzIHJldGFpbmVkIGJ5IHRoZSBmb3JtZXIgbGFzdC1hY3RpdmUgZXhjZXB0aW9uIGJlZm9yZSBwb29sIHJlY29uY2lsaWF0aW9uLiAqL1xuICBhc3luYyBkZWFjdGl2YXRlRXhwaXJlZFRva2VucygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmdldFB1cmkoXCJ3XCIpXG4gICAgICAudGFibGUoXCJ0b2tlbnNcIilcbiAgICAgIC53aGVyZShcInJlYXV0aF9yZXF1aXJlZFwiLCB0cnVlKVxuICAgICAgLndoZXJlKFwiYWN0aXZlXCIsIHRydWUpXG4gICAgICAudXBkYXRlKHsgYWN0aXZlOiBmYWxzZSB9KTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyByZW9yZGVyKGlkczogbnVtYmVyW10pOiBQcm9taXNlPHsgZG9uZTogYm9vbGVhbiB9PiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICBhd2FpdCB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXdhaXQgdHJ4LnRhYmxlKFwidG9rZW5zXCIpLndoZXJlKFwiaWRcIiwgaWRzW2ldISkudXBkYXRlKHsgb3JkOiBpIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7IGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBkZWwoaWRzOiBudW1iZXJbXSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICBhd2FpdCB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgcmV0dXJuIHRyeC50YWJsZShcInRva2Vuc1wiKS53aGVyZUluKFwidG9rZW5zLmlkXCIsIGlkcykuZGVsZXRlKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGlkcy5sZW5ndGg7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFRva2VuTW9kZWwgPSBuZXcgVG9rZW5Nb2RlbENsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBa0JBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyxPQUFPLENBQUM7QUFFM0MsTUFBTSwwQkFBMEI7QUFDaEMsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxpQ0FBaUM7QUFTdkMsU0FBUyxvQkFBb0IsSUFBc0M7Q0FDakUsSUFBSSxHQUFHLE9BQU8sUUFBVyxPQUFPO0NB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