@cartanova/qgrid-cli 2.10.2 → 2.10.4

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 (118) hide show
  1. package/bundle/dist/application/monit/log-buffer.js +7 -11
  2. package/bundle/dist/application/monit/monit.frame.js +6 -11
  3. package/bundle/dist/application/qgrid/oauth.js +2 -2
  4. package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +64 -141
  5. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +12 -36
  6. package/bundle/dist/application/qgrid/qgrid.frame.js +3 -6
  7. package/bundle/dist/application/qgrid/qgrid.types.js +2 -1
  8. package/bundle/dist/application/qgrid/token-subscriber.js +4 -7
  9. package/bundle/dist/application/qgrid/token-window-keepalive.js +3 -2
  10. package/bundle/dist/application/qgrid/tool-emulation-schema.js +4 -4
  11. package/bundle/dist/application/qgrid/tool-emulation.js +14 -2
  12. package/bundle/dist/application/request-log/request-log.model.js +7 -5
  13. package/bundle/dist/application/setting/setting.model.js +2 -64
  14. package/bundle/dist/application/setting/setting.store.js +3 -4
  15. package/bundle/dist/application/setting/setting.types.js +2 -12
  16. package/bundle/dist/i18n/en.js +1 -3
  17. package/bundle/dist/i18n/ko.js +1 -3
  18. package/bundle/dist/sonamu.config.js +6 -6
  19. package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +1 -1
  20. package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +53 -84
  21. package/bundle/dist/utils/providers/anthropic/anthropic-thinking.js +55 -0
  22. package/bundle/dist/utils/providers/anthropic/claude-session.js +11 -13
  23. package/bundle/dist/utils/providers/common/effort.js +1 -1
  24. package/bundle/dist/utils/providers/common/smooth-weighted-round-robin.js +3 -3
  25. package/bundle/dist/utils/providers/common/thinking.js +12 -0
  26. package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +3 -2
  27. package/bundle/dist/utils/providers/openai/openai-direct-client.js +6 -16
  28. package/bundle/dist/utils/providers/openai/openai-dispatcher.js +89 -78
  29. package/bundle/src/application/monit/log-buffer.test.ts +3 -4
  30. package/bundle/src/application/monit/log-buffer.ts +13 -27
  31. package/bundle/src/application/monit/monit.frame.test.ts +7 -8
  32. package/bundle/src/application/monit/monit.frame.ts +9 -14
  33. package/bundle/src/application/qgrid/oauth.ts +1 -1
  34. package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +7 -111
  35. package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +83 -179
  36. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +62 -1
  37. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +25 -71
  38. package/bundle/src/application/qgrid/qgrid.frame.test.ts +0 -38
  39. package/bundle/src/application/qgrid/qgrid.frame.ts +4 -12
  40. package/bundle/src/application/qgrid/qgrid.types.ts +2 -0
  41. package/bundle/src/application/qgrid/token-subscriber.test.ts +8 -18
  42. package/bundle/src/application/qgrid/token-subscriber.ts +10 -20
  43. package/bundle/src/application/qgrid/token-window-keepalive.test.ts +2 -2
  44. package/bundle/src/application/qgrid/token-window-keepalive.ts +2 -1
  45. package/bundle/src/application/qgrid/tool-emulation-schema.test.ts +6 -3
  46. package/bundle/src/application/qgrid/tool-emulation-schema.ts +3 -3
  47. package/bundle/src/application/qgrid/tool-emulation.test.ts +8 -1
  48. package/bundle/src/application/qgrid/tool-emulation.ts +29 -0
  49. package/bundle/src/application/request-log/request-log.model.ts +5 -5
  50. package/bundle/src/application/setting/setting.model.test.ts +1 -101
  51. package/bundle/src/application/setting/setting.model.ts +1 -74
  52. package/bundle/src/application/setting/setting.store.ts +2 -3
  53. package/bundle/src/application/setting/setting.types.ts +0 -12
  54. package/bundle/src/application/sonamu.generated.http +2 -7
  55. package/bundle/src/i18n/en.ts +0 -3
  56. package/bundle/src/i18n/ko.ts +0 -3
  57. package/bundle/src/sonamu.config.ts +5 -5
  58. package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +3 -6
  59. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.test.ts +26 -0
  60. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +70 -148
  61. package/bundle/src/utils/providers/anthropic/anthropic-thinking.test.ts +36 -0
  62. package/bundle/src/utils/providers/anthropic/anthropic-thinking.ts +84 -0
  63. package/bundle/src/utils/providers/anthropic/claude-session.test.ts +74 -13
  64. package/bundle/src/utils/providers/anthropic/claude-session.ts +11 -20
  65. package/bundle/src/utils/providers/common/effort.ts +1 -1
  66. package/bundle/src/utils/providers/common/provider-dispatcher.ts +4 -0
  67. package/bundle/src/utils/providers/common/smooth-weighted-round-robin.ts +4 -4
  68. package/bundle/src/utils/providers/common/thinking.ts +10 -0
  69. package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +7 -3
  70. package/bundle/src/utils/providers/openai/openai-direct-client.test.ts +3 -3
  71. package/bundle/src/utils/providers/openai/openai-direct-client.ts +20 -33
  72. package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +97 -6
  73. package/bundle/src/utils/providers/openai/openai-dispatcher.ts +113 -77
  74. package/bundle/web-dist/client/assets/index-CvG4UB9v.css +1 -0
  75. package/bundle/web-dist/client/assets/{index-DtRTSTes.js → index-reW8VvJF.js} +4 -4
  76. package/bundle/web-dist/client/assets/{logs-BhVYDEzC.js → logs-DDIt97D1.js} +1 -1
  77. package/bundle/web-dist/client/assets/{monit-BxN4JWqK.js → monit-DkABv7PG.js} +1 -1
  78. package/bundle/web-dist/client/assets/{routes-CBCqRp2o.js → routes-BRmQ4M3-.js} +1 -1
  79. package/bundle/web-dist/client/assets/services.generated-jnPHYMER.js +51 -0
  80. package/bundle/web-dist/client/assets/settings-BHvtycEZ.js +1 -0
  81. package/bundle/web-dist/client/assets/{show-BzYft5N4.js → show-qeTIzgDZ.js} +1 -1
  82. package/bundle/web-dist/client/assets/{tokens-PMybtI8X.js → tokens-5Bep_G-w.js} +1 -1
  83. package/bundle/web-dist/client/assets/{use-oauth-login-flow-C51_d6-6.js → use-oauth-login-flow-Cx-QO25M.js} +1 -1
  84. package/bundle/web-dist/client/assets/{use-update-token-mutation-D-Y8OySK.js → use-update-token-mutation-DQCwCYfR.js} +1 -1
  85. package/bundle/web-dist/client/index.html +3 -3
  86. package/bundle/web-dist/server/assets/{lazyRouteComponent-Bj1cPq6x.js → lazyRouteComponent-CUR-kWzI.js} +2 -2
  87. package/bundle/web-dist/server/assets/{logs-BSk9lOHe.js → logs-CagNGTBj.js} +3 -3
  88. package/bundle/web-dist/server/assets/{monit-D9W4ioUi.js → monit-DSxs4Jnl.js} +3 -3
  89. package/bundle/web-dist/server/assets/{plus-CmvbWuDf.js → plus-Bvdj8Pwx.js} +1 -1
  90. package/bundle/web-dist/server/assets/{react-dom-BjR1Iaz8.js → react-dom-CyuShs9K.js} +1 -1
  91. package/bundle/web-dist/server/assets/{refresh-cw-B8U9BL9-.js → refresh-cw-3QAiSWBd.js} +1 -1
  92. package/bundle/web-dist/server/assets/{routes-C7lB2Q85.js → routes-i-sTqXMX.js} +4 -4
  93. package/bundle/web-dist/server/assets/{services.generated-BM4X3Ecj.js → services.generated-FPwsG9p3.js} +116 -131
  94. package/bundle/web-dist/server/assets/{settings-BFVuldch.js → settings-DeHNwoMv.js} +40 -251
  95. package/bundle/web-dist/server/assets/{show-Cswh_tqs.js → show-C4jk1Hrp.js} +2 -2
  96. package/bundle/web-dist/server/assets/{tokens-DiTUwUwr.js → tokens-odgS2-9q.js} +4 -4
  97. package/bundle/web-dist/server/assets/{use-oauth-login-flow-DYKnG4A2.js → use-oauth-login-flow-DTQKdYBO.js} +1 -1
  98. package/bundle/web-dist/server/assets/{use-update-token-mutation-DqGMopII.js → use-update-token-mutation-xvXbPrCI.js} +1 -1
  99. package/bundle/web-dist/server/entry-server.generated.js +10 -10
  100. package/package.json +1 -1
  101. package/skills/qgrid/SKILL.md +1 -0
  102. package/skills/qgrid/references/ai-sdk-provider-contract.md +2 -1
  103. package/skills/qgrid/references/anthropic-claude-code-runtime.md +7 -4
  104. package/skills/qgrid/references/cli-env-and-server-boot.md +12 -9
  105. package/skills/qgrid/references/decision-rationale.md +9 -0
  106. package/skills/qgrid/references/openai-codex-runtime.md +6 -0
  107. package/skills/qgrid/references/token-auth-quota-lifecycle.md +2 -0
  108. package/skills/qgrid/references/tool-calling-and-multiturn.md +18 -1
  109. package/skills/qgrid/references/verification-and-debugging.md +1 -1
  110. package/bundle/dist/utils/process-supervisor.js +0 -22
  111. package/bundle/dist/utils/server-restart.js +0 -61
  112. package/bundle/src/utils/process-supervisor.test.ts +0 -24
  113. package/bundle/src/utils/process-supervisor.ts +0 -17
  114. package/bundle/src/utils/server-restart.test.ts +0 -76
  115. package/bundle/src/utils/server-restart.ts +0 -68
  116. package/bundle/web-dist/client/assets/index-D_sagzsR.css +0 -1
  117. package/bundle/web-dist/client/assets/services.generated-Cbvg2sGQ.js +0 -51
  118. package/bundle/web-dist/client/assets/settings-hBTEC7Ki.js +0 -1
@@ -200,7 +200,7 @@ var RequestLogModelClass = class extends BaseModelClass {
200
200
  cache_read_tokens: "request_logs.cache_read_tokens"
201
201
  }).where("request_logs.created_at", ">=", since);
202
202
  const byProvider = /* @__PURE__ */ new Map();
203
- for (const row of rows) {
203
+ rows.forEach((row) => {
204
204
  const model = row.requested_model_name ?? "";
205
205
  const provider = model.startsWith("openai/") ? "openai" : model.startsWith("anthropic/") ? "anthropic" : "unknown";
206
206
  const agg = byProvider.get(provider) ?? {
@@ -214,7 +214,7 @@ var RequestLogModelClass = class extends BaseModelClass {
214
214
  agg.inputTokens += row.input_tokens;
215
215
  agg.cacheReadTokens += row.cache_read_tokens;
216
216
  byProvider.set(provider, agg);
217
- }
217
+ });
218
218
  return [...byProvider.entries()].map(([provider, agg]) => ({
219
219
  provider,
220
220
  ...agg
@@ -320,7 +320,7 @@ var RequestLogModelClass = class extends BaseModelClass {
320
320
  id: requestLogId,
321
321
  status: params.status
322
322
  };
323
- for (const key of [
323
+ [
324
324
  "response",
325
325
  "token_name",
326
326
  "input_tokens",
@@ -341,7 +341,9 @@ var RequestLogModelClass = class extends BaseModelClass {
341
341
  "image_cost_method",
342
342
  "is_image_generation",
343
343
  "response_json_ok"
344
- ]) if (params[key] !== void 0) update[key] = params[key];
344
+ ].forEach((key) => {
345
+ if (params[key] !== void 0) update[key] = params[key];
346
+ });
345
347
  if (params.history !== void 0) update.history = params.history;
346
348
  update.ttft_ms = await this.firstGenerateStepTtft(requestLogId) ?? 0;
347
349
  if (params.cost_usd === void 0 && params.input_tokens !== void 0 && params.output_tokens !== void 0) {
@@ -580,4 +582,4 @@ const RequestLogModel = new RequestLogModelClass();
580
582
  //#endregion
581
583
  export { MICRO_USD, RequestLogModel };
582
584
 
583
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1sb2cubW9kZWwuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpzb25TY2hlbWFUb1pvZCB9IGZyb20gXCJqc29uLXNjaGVtYS10by16b2RcIjtcbmltcG9ydCB7XG4gIGFwaSxcbiAgYXNBcnJheSxcbiAgQmFkUmVxdWVzdEV4Y2VwdGlvbixcbiAgQmFzZU1vZGVsQ2xhc3MsXG4gIHR5cGUgTGlzdFJlc3VsdCxcbiAgbm9ybWFsaXplRmlsdGVyUXVlcnksXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxuICBQdXJpLFxuICB0cmFuc2FjdGlvbmFsLFxufSBmcm9tIFwic29uYW11XCI7XG5cbmltcG9ydCB7IFNEIH0gZnJvbSBcIi4uLy4uL2kxOG4vc2QuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVDb3N0VXNkIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vbW9kZWwtY29zdFwiO1xuaW1wb3J0IHsgdHlwZSBSZXF1ZXN0TG9nU3Vic2V0S2V5LCB0eXBlIFJlcXVlc3RMb2dTdWJzZXRNYXBwaW5nIH0gZnJvbSBcIi4uL3NvbmFtdS5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IHJlcXVlc3RMb2dMb2FkZXJRdWVyaWVzLCByZXF1ZXN0TG9nU3Vic2V0UXVlcmllcyB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkLnNzb1wiO1xuaW1wb3J0IHtcbiAgcmVuZGVySnNvblNjaGVtYVpvZFNoYXBlVGV4dCxcbiAgcmVuZGVyUGFyc2VkSnNvblNjaGVtYVR5cGVUZXh0LFxufSBmcm9tIFwiLi9qc29uLXNjaGVtYS10eXBlLXRleHRcIjtcbmltcG9ydCB7XG4gIHR5cGUgUmVxdWVzdExvZ0xpc3RQYXJhbXMsXG4gIHR5cGUgUmVxdWVzdExvZ1NhdmVQYXJhbXMsXG4gIHR5cGUgVG9vbERlZmluaXRpb25zLFxuICB0eXBlIFRvb2xWaWV3LFxufSBmcm9tIFwiLi9yZXF1ZXN0LWxvZy50eXBlc1wiO1xuaW1wb3J0IHsgZm9ybWF0Wm9kQ29kZSB9IGZyb20gXCIuL3pvZC1jb2RlLWZvcm1hdFwiO1xuXG4vLyBjb3N0X3VzZOuKlCDsoJXsiJggbWljcm8tVVNE66GcIOyggOyepS4g7Iuk7KCcIFVTRCA9IGNvc3RfdXNkIC8gTUlDUk9fVVNELlxuZXhwb3J0IGNvbnN0IE1JQ1JPX1VTRCA9IDFfMDAwXzAwMDtcbmNvbnN0IFJFUVVFU1RfTE9HX1JVTl9MT0NLX0NMQVNTX0lEID0gNzE4O1xuY29uc3QgVE9PTF9FTlVNX1ZBTFVFX0xJTUlUID0gNjtcblxuZnVuY3Rpb24gZGVjb2RlU3RvcmVkVG9vbHModmFsdWU6IHVua25vd24pOiBUb29sRGVmaW5pdGlvbnMgfCBudWxsIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB2YWx1ZSBhcyBUb29sRGVmaW5pdGlvbnM7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpIGFzIFRvb2xEZWZpbml0aW9ucztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxudHlwZSBUb29sUmVzdWx0Q29udGludWF0aW9uID0ge1xuICB0b29sQ2FsbElkOiBzdHJpbmc7XG4gIG91dHB1dDogc3RyaW5nO1xuICBpc0Vycm9yPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgUmVxdWVzdExvZ1N0ZXBBZ2dyZWdhdGUgPSB7XG4gIGlucHV0X3Rva2VuczogbnVtYmVyO1xuICBvdXRwdXRfdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX3JlYWRfdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogbnVtYmVyO1xuICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM/OiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vucz86IG51bWJlcjtcbiAgZHVyYXRpb25fbXM6IG51bWJlcjtcbiAgZmFsbGJhY2tfY291bnQ6IG51bWJlcjtcbiAgY29zdF91c2Q6IG51bWJlcjtcbiAgY29zdF9zb3VyY2U/OiBzdHJpbmc7XG59O1xuXG5jb25zdCBTVEVQX0FHR1JFR0FURV9TRUxFQ1QgPSB7XG4gIGlucHV0X3Rva2VuczogXCJpbnB1dF90b2tlbnNcIixcbiAgb3V0cHV0X3Rva2VuczogXCJvdXRwdXRfdG9rZW5zXCIsXG4gIGNhY2hlX3JlYWRfdG9rZW5zOiBcImNhY2hlX3JlYWRfdG9rZW5zXCIsXG4gIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogXCJjYWNoZV9jcmVhdGlvbl90b2tlbnNcIixcbiAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBcImNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiLFxuICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IFwiY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zXCIsXG4gIGR1cmF0aW9uX21zOiBcImR1cmF0aW9uX21zXCIsXG4gIGZhbGxiYWNrX2NvdW50OiBcImZhbGxiYWNrX2NvdW50XCIsXG4gIGNvc3RfdXNkOiBcImNvc3RfdXNkXCIsXG4gIGNvc3Rfc291cmNlOiBcImNvc3Rfc291cmNlXCIsXG59IGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBhZ2dyZWdhdGVHZW5lcmF0ZVN0ZXBSb3dzKHJvd3M6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pik6IFJlcXVlc3RMb2dTdGVwQWdncmVnYXRlIHtcbiAgY29uc3Qgc3VtID0gKGZpZWxkOiBzdHJpbmcpOiBudW1iZXIgPT5cbiAgICByb3dzLnJlZHVjZSgodG90YWwsIHJvdykgPT4gdG90YWwgKyBOdW1iZXIocm93W2ZpZWxkXSA/PyAwKSwgMCk7XG4gIGNvbnN0IG9wdGlvbmFsU3VtID0gKGZpZWxkOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQgPT5cbiAgICByb3dzLnNvbWUoKHJvdykgPT4gcm93W2ZpZWxkXSAhPT0gbnVsbCAmJiByb3dbZmllbGRdICE9PSB1bmRlZmluZWQpID8gc3VtKGZpZWxkKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgY29sbGFwc2UgPSAoZmllbGQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3QgdmFsdWVzID0gW1xuICAgICAgLi4ubmV3IFNldChcbiAgICAgICAgcm93c1xuICAgICAgICAgIC5tYXAoKHJvdykgPT4gcm93W2ZpZWxkXSlcbiAgICAgICAgICAuZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIHN0cmluZyA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUubGVuZ3RoID4gMCksXG4gICAgICApLFxuICAgIF07XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPT09IDEgPyB2YWx1ZXNbMF0gOiBcIm1peGVkXCI7XG4gIH07XG4gIHJldHVybiB7XG4gICAgaW5wdXRfdG9rZW5zOiBzdW0oXCJpbnB1dF90b2tlbnNcIiksXG4gICAgb3V0cHV0X3Rva2Vuczogc3VtKFwib3V0cHV0X3Rva2Vuc1wiKSxcbiAgICBjYWNoZV9yZWFkX3Rva2Vuczogc3VtKFwiY2FjaGVfcmVhZF90b2tlbnNcIiksXG4gICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBzdW0oXCJjYWNoZV9jcmVhdGlvbl90b2tlbnNcIiksXG4gICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBvcHRpb25hbFN1bShcImNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiKSxcbiAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IG9wdGlvbmFsU3VtKFwiY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zXCIpLFxuICAgIGR1cmF0aW9uX21zOiBzdW0oXCJkdXJhdGlvbl9tc1wiKSxcbiAgICBmYWxsYmFja19jb3VudDogc3VtKFwiZmFsbGJhY2tfY291bnRcIiksXG4gICAgY29zdF91c2Q6IHN1bShcImNvc3RfdXNkXCIpLFxuICAgIGNvc3Rfc291cmNlOiBjb2xsYXBzZShcImNvc3Rfc291cmNlXCIpLFxuICB9O1xufVxuXG50eXBlIFJlcXVlc3RMb2dVc2FnZVJvdyA9IHtcbiAgdG9rZW5fbmFtZT86IHN0cmluZyB8IG51bGw7XG4gIG1vZGVsX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICBpbnB1dF90b2tlbnM6IG51bWJlcjtcbiAgb3V0cHV0X3Rva2VuczogbnVtYmVyO1xuICBjYWNoZV9yZWFkX3Rva2VuczogbnVtYmVyO1xuICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IG51bWJlcjtcbiAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcbiAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcbiAgY29zdF91c2Q/OiBudW1iZXIgfCBudWxsO1xuICBjb3N0X3NvdXJjZT86IHN0cmluZyB8IG51bGw7XG59O1xuXG5mdW5jdGlvbiBpc0FudGhyb3BpY1VzYWdlUm93KHJvdzogUGljazxSZXF1ZXN0TG9nVXNhZ2VSb3csIFwidG9rZW5fbmFtZVwiIHwgXCJtb2RlbF9uYW1lXCI+KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgcm93LnRva2VuX25hbWU/LnN0YXJ0c1dpdGgoXCJhbnRocm9waWMvXCIpID09PSB0cnVlIHx8XG4gICAgcm93Lm1vZGVsX25hbWU/LnN0YXJ0c1dpdGgoXCJjbGF1ZGUtXCIpID09PSB0cnVlIHx8XG4gICAgcm93Lm1vZGVsX25hbWU/LnN0YXJ0c1dpdGgoXCJhbnRocm9waWMvY2xhdWRlLVwiKSA9PT0gdHJ1ZVxuICApO1xufVxuXG5mdW5jdGlvbiBjYW5vbmljYWxNb2RlbE5hbWUobW9kZWxOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbW9kZWxOYW1lLmluY2x1ZGVzKFwiL1wiKSA/IG1vZGVsTmFtZS5zcGxpdChcIi9cIikucG9wKCkhIDogbW9kZWxOYW1lO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVkVXNhZ2VGb3JDb3N0KHJvdzogUmVxdWVzdExvZ1VzYWdlUm93KToge1xuICBtb2RlbDogc3RyaW5nIHwgbnVsbDtcbiAgaW5wdXRUb2tlbnM6IG51bWJlcjtcbiAgb3V0cHV0VG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlZElucHV0VG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogbnVtYmVyO1xuICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bT86IG51bWJlcjtcbiAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWg/OiBudW1iZXI7XG59IHtcbiAgY29uc3QgY2FjaGVSZWFkID0gcm93LmNhY2hlX3JlYWRfdG9rZW5zO1xuICBjb25zdCBjYWNoZUNyZWF0aW9uID0gcm93LmNhY2hlX2NyZWF0aW9uX3Rva2VucztcbiAgY29uc3Qgc3RvcmVkSW5wdXQgPSByb3cuaW5wdXRfdG9rZW5zO1xuICBjb25zdCBsZWdhY3lBbnRocm9waWNTcGxpdElucHV0ID1cbiAgICBpc0FudGhyb3BpY1VzYWdlUm93KHJvdykgJiYgc3RvcmVkSW5wdXQgPCBjYWNoZVJlYWQgKyBjYWNoZUNyZWF0aW9uO1xuICByZXR1cm4ge1xuICAgIG1vZGVsOiByb3cubW9kZWxfbmFtZSA/IGNhbm9uaWNhbE1vZGVsTmFtZShyb3cubW9kZWxfbmFtZSkgOiBudWxsLFxuICAgIGlucHV0VG9rZW5zOiBsZWdhY3lBbnRocm9waWNTcGxpdElucHV0ID8gc3RvcmVkSW5wdXQgKyBjYWNoZVJlYWQgKyBjYWNoZUNyZWF0aW9uIDogc3RvcmVkSW5wdXQsXG4gICAgb3V0cHV0VG9rZW5zOiByb3cub3V0cHV0X3Rva2VucyxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogY2FjaGVSZWFkLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogY2FjaGVDcmVhdGlvbixcbiAgICAuLi4ocm93LmNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucyAhPT0gbnVsbCAmJiByb3cuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zICE9PSB1bmRlZmluZWRcbiAgICAgID8geyBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bTogcm93LmNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucyB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4ocm93LmNhY2hlX2NyZWF0aW9uXzFoX3Rva2VucyAhPT0gbnVsbCAmJiByb3cuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zICE9PSB1bmRlZmluZWRcbiAgICAgID8geyBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaDogcm93LmNhY2hlX2NyZWF0aW9uXzFoX3Rva2VucyB9XG4gICAgICA6IHt9KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTGVnYWN5QW50aHJvcGljUm93PFQgZXh0ZW5kcyBSZXF1ZXN0TG9nVXNhZ2VSb3c+KHJvdzogVCk6IFQge1xuICAvLyDsg4ggcm93IOuKlCDri7nsi5zsnZggcHJvdmlkZXIv6rCA6rKp7ZGcIOu5hOyaqeydhCDtmZXsoJUg7KCA7J6l7ZWc64ukLiDtmITsnqwg6rCA6rKp7ZGc66GcIOuNruyWtOyTsOyngCDslYrripTri6QuXG4gIGlmIChyb3cuY29zdF9zb3VyY2UpIHJldHVybiByb3c7XG4gIGNvbnN0IHVzYWdlID0gbm9ybWFsaXplZFVzYWdlRm9yQ29zdChyb3cpO1xuICBpZiAodXNhZ2UuaW5wdXRUb2tlbnMgPT09IHJvdy5pbnB1dF90b2tlbnMpIHJldHVybiByb3c7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB7IC4uLnJvdywgaW5wdXRfdG9rZW5zOiB1c2FnZS5pbnB1dFRva2VucyB9O1xuICBpZiAodXNhZ2UubW9kZWwpIHtcbiAgICBub3JtYWxpemVkLmNvc3RfdXNkID0gTWF0aC5yb3VuZChjYWxjdWxhdGVDb3N0VXNkKHVzYWdlLm1vZGVsLCB1c2FnZSkgKiBNSUNST19VU0QpO1xuICB9XG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuXG4vKipcbiAqIGBvcmRlckJ5YCBlbnVtIOqwkihg7Lus65+8Leuwqe2WpWAp7J2EIOygleugrCDsoIjroZwg7Jiu6ri064ukLlxuICpcbiAqIGVudW0g7J20IDE4IOyiheydtOudvCDsvIDsnbTsiqTrpbwg7J287J287J20IOyggeuKlCDrjIDsi6Ag7YyM7Iux7ZWY65CYLCDsu6zrn7zsnYAg7JWE656YIOuqqeuhneycvOuhnCDtlZzsoJXtlZzri6Qg4oCUXG4gKiDrrLjsnpDsl7TsnYQg6re464yA66GcIOy7rOufvOuqheyXkCDrhJjquLDrqbQgZW51bSDsnbQg67CU64CUIOuVjCDqsoDspp0g7JeG64qUIOyLneuzhOyekOqwgCBTUUwg66GcIO2dmOufrOuToOuLpC5cbiAqIOuqqeuhneyXkCDsl4bripQg6rCS7J2AIOq4sOuzuCDsoJXroKwoaWQgZGVzYynroZwg65ao7Ja07KeE64ukLlxuICovXG5jb25zdCBPUkRFUkFCTEVfQ09MVU1OUyA9IHtcbiAgaWQ6IFwicmVxdWVzdF9sb2dzLmlkXCIsXG4gIGNyZWF0ZWRfYXQ6IFwicmVxdWVzdF9sb2dzLmNyZWF0ZWRfYXRcIixcbiAgdHRmdF9tczogXCJyZXF1ZXN0X2xvZ3MudHRmdF9tc1wiLFxuICBkdXJhdGlvbl9tczogXCJyZXF1ZXN0X2xvZ3MuZHVyYXRpb25fbXNcIixcbiAgaW5wdXRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5pbnB1dF90b2tlbnNcIixcbiAgb3V0cHV0X3Rva2VuczogXCJyZXF1ZXN0X2xvZ3Mub3V0cHV0X3Rva2Vuc1wiLFxuICBjYWNoZV9yZWFkX3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuY2FjaGVfcmVhZF90b2tlbnNcIixcbiAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9jcmVhdGlvbl90b2tlbnNcIixcbiAgY29zdF91c2Q6IFwicmVxdWVzdF9sb2dzLmNvc3RfdXNkXCIsXG59IGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBhcHBseU9yZGVyQnkoXG4gIHFiOiBSZXR1cm5UeXBlPFJlcXVlc3RMb2dNb2RlbENsYXNzW1wiZ2V0U3Vic2V0UXVlcmllc1wiXT5bXCJxYlwiXSxcbiAgb3JkZXJCeTogc3RyaW5nLFxuKTogdm9pZCB7XG4gIGNvbnN0IHNlcGFyYXRvciA9IG9yZGVyQnkubGFzdEluZGV4T2YoXCItXCIpO1xuICBjb25zdCBrZXkgPSBvcmRlckJ5LnNsaWNlKDAsIHNlcGFyYXRvcikgYXMga2V5b2YgdHlwZW9mIE9SREVSQUJMRV9DT0xVTU5TO1xuICBjb25zdCBkaXJlY3Rpb24gPSBvcmRlckJ5LnNsaWNlKHNlcGFyYXRvciArIDEpID09PSBcImFzY1wiID8gXCJhc2NcIiA6IFwiZGVzY1wiO1xuICBjb25zdCBjb2x1bW4gPSBPUkRFUkFCTEVfQ09MVU1OU1trZXldO1xuXG4gIGlmICghY29sdW1uKSB7XG4gICAgcWIub3JkZXJCeShcInJlcXVlc3RfbG9ncy5pZFwiLCBcImRlc2NcIik7XG4gICAgcmV0dXJuO1xuICB9XG4gIHFiLm9yZGVyQnkoY29sdW1uLCBkaXJlY3Rpb24pO1xuICAvLyDrj5nsoJAg7ZaJ7J2YIOyInOyEnOqwgCDtjpjsnbTsp4Drp4jri6Qg7Z2U65Ok66as7KeAIOyViuqyjCDqs6DsnKAg7Lus65+87Jy866GcIHRpZS1icmVhayDtlZzri6QuXG4gIGlmIChrZXkgIT09IFwiaWRcIikgcWIub3JkZXJCeShcInJlcXVlc3RfbG9ncy5pZFwiLCBcImRlc2NcIik7XG59XG5cbi8qXG4gIFJlcXVlc3RMb2cgTW9kZWxcbiovXG5jbGFzcyBSZXF1ZXN0TG9nTW9kZWxDbGFzcyBleHRlbmRzIEJhc2VNb2RlbENsYXNzPFxuICBSZXF1ZXN0TG9nU3Vic2V0S2V5LFxuICBSZXF1ZXN0TG9nU3Vic2V0TWFwcGluZyxcbiAgdHlwZW9mIHJlcXVlc3RMb2dTdWJzZXRRdWVyaWVzLFxuICB0eXBlb2YgcmVxdWVzdExvZ0xvYWRlclF1ZXJpZXNcbj4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlJlcXVlc3RMb2dcIiwgcmVxdWVzdExvZ1N1YnNldFF1ZXJpZXMsIHJlcXVlc3RMb2dMb2FkZXJRdWVyaWVzKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdLCByZXNvdXJjZU5hbWU6IFwiUmVxdWVzdExvZ1wiIH0pXG4gIGFzeW5jIGZpbmRCeUlkPFQgZXh0ZW5kcyBSZXF1ZXN0TG9nU3Vic2V0S2V5PihcbiAgICBzdWJzZXQ6IFQsXG4gICAgaWQ6IG51bWJlcixcbiAgKTogUHJvbWlzZTxSZXF1ZXN0TG9nU3Vic2V0TWFwcGluZ1tUXT4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgdGhpcy5maW5kTWFueShzdWJzZXQsIHtcbiAgICAgIGlkLFxuICAgICAgbnVtOiAxLFxuICAgICAgcGFnZTogMSxcbiAgICAgIHF1ZXJ5TW9kZTogXCJsaXN0XCIsXG4gICAgfSk7XG4gICAgaWYgKCFyb3dzWzBdKSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5lbnRpdHlOb3RGb3VuZFwiKShcIlJlcXVlc3RMb2dcIiwgaWQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm93c1swXTtcbiAgfVxuXG4gIGFzeW5jIGZpbmRPbmU8VCBleHRlbmRzIFJlcXVlc3RMb2dTdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBsaXN0UGFyYW1zOiBSZXF1ZXN0TG9nTGlzdFBhcmFtcyxcbiAgKTogUHJvbWlzZTxSZXF1ZXN0TG9nU3Vic2V0TWFwcGluZ1tUXSB8IG51bGw+IHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHRoaXMuZmluZE1hbnkoc3Vic2V0LCB7XG4gICAgICAuLi5saXN0UGFyYW1zLFxuICAgICAgbnVtOiAxLFxuICAgICAgcGFnZTogMSxcbiAgICAgIHF1ZXJ5TW9kZTogXCJsaXN0XCIsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcm93c1swXSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIOuqqeuhnSDtlYTthLDsnZgg64uo7J28IOygleydmC4gZmluZE1hbnkg7JmAIHRvdGFsQ29zdCDqsIAg6rCZ7J2AIOyhsOqxtOydhCDrs7Trj4TroZ0g6rO17Jyg7ZWc64ukIOKAlFxuICAgKiDtmZTrqbTsl5DshJwg7ZWE7YSw66W8IOqxuOuptCDtlokg7IiY7JmAIOu5hOyaqeydtCDtlajqu5gg7KKB7ZiA7KC47JW8IO2VmOuKlOuNsCwg65GQIOy/vOumrOqwgCDqsIHsnpAg7ZWE7YSw66W8XG4gICAqIOq1rO2YhO2VmOuptCDtlZzsqr3sl5Ag7LaV7J2EIOy2lOqwgO2VoCDrlYwg7KGw7Jqp7Z6IIOyWtOq4i+uCnOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlMaXN0RmlsdGVycyhcbiAgICBxYjogUmV0dXJuVHlwZTxSZXF1ZXN0TG9nTW9kZWxDbGFzc1tcImdldFN1YnNldFF1ZXJpZXNcIl0+W1wicWJcIl0sXG4gICAgcGFyYW1zOiBSZXF1ZXN0TG9nTGlzdFBhcmFtcyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKHBhcmFtcy5pZCkge1xuICAgICAgcWIud2hlcmVJbihcInJlcXVlc3RfbG9ncy5pZFwiLCBhc0FycmF5KHBhcmFtcy5pZCkpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMudG9rZW5fbmFtZSkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MudG9rZW5fbmFtZVwiLCBwYXJhbXMudG9rZW5fbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5wcm9qZWN0X25hbWVfaXNfbnVsbCkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MucHJvamVjdF9uYW1lXCIsIG51bGwpO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLnByb2plY3RfbmFtZV9pc19ub3RfbnVsbCkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MucHJvamVjdF9uYW1lXCIsIFwiIT1cIiwgbnVsbCk7XG4gICAgfSBlbHNlIGlmIChwYXJhbXMucHJvamVjdF9uYW1lKSB7XG4gICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy5wcm9qZWN0X25hbWVcIiwgcGFyYW1zLnByb2plY3RfbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5tb2RlbF9uYW1lKSB7XG4gICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy5tb2RlbF9uYW1lXCIsIHBhcmFtcy5tb2RlbF9uYW1lKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnNlYXJjaCAmJiBwYXJhbXMua2V5d29yZCAmJiBwYXJhbXMua2V5d29yZC5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJpZFwiKSB7XG4gICAgICAgIHFiLndoZXJlKFwicmVxdWVzdF9sb2dzLmlkXCIsIE51bWJlcihwYXJhbXMua2V5d29yZCkpO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMuc2VhcmNoID09PSBcInRva2VuX25hbWVcIikge1xuICAgICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy50b2tlbl9uYW1lXCIsIFwibGlrZVwiLCBgJSR7cGFyYW1zLmtleXdvcmR9JWApO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMuc2VhcmNoID09PSBcInVzZXJfcHJvbXB0XCIpIHtcbiAgICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MudXNlcl9wcm9tcHRcIiwgXCJsaWtlXCIsIGAlJHtwYXJhbXMua2V5d29yZH0lYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcImVycm9yLnVua25vd25TZWFyY2hGaWVsZFwiKShwYXJhbXMuc2VhcmNoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJSZXF1ZXN0TG9nc1wiIH0pXG4gIGFzeW5jIGZpbmRNYW55PFQgZXh0ZW5kcyBSZXF1ZXN0TG9nU3Vic2V0S2V5LCBMUCBleHRlbmRzIFJlcXVlc3RMb2dMaXN0UGFyYW1zPihcbiAgICBzdWJzZXQ6IFQsXG4gICAgcmF3UGFyYW1zPzogTFAsXG4gICk6IFByb21pc2U8TGlzdFJlc3VsdDxMUCwgUmVxdWVzdExvZ1N1YnNldE1hcHBpbmdbVF0+PiB7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgbnVtOiAyNCxcbiAgICAgIHBhZ2U6IDEsXG4gICAgICBzZWFyY2g6IFwiaWRcIiBhcyBjb25zdCxcbiAgICAgIG9yZGVyQnk6IFwiaWQtZGVzY1wiIGFzIGNvbnN0LFxuICAgICAgLi4ucmF3UGFyYW1zLFxuICAgIH0gc2F0aXNmaWVzIFJlcXVlc3RMb2dMaXN0UGFyYW1zO1xuXG4gICAgY29uc3QgeyBxYiB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG5cbiAgICB0aGlzLmFwcGx5TGlzdEZpbHRlcnMocWIsIHBhcmFtcyk7XG5cbiAgICBpZiAocGFyYW1zLm9yZGVyQnkpIGFwcGx5T3JkZXJCeShxYiwgcGFyYW1zLm9yZGVyQnkpO1xuXG4gICAgY29uc3QgZW5oYW5jZXJzID0gdGhpcy5jcmVhdGVFbmhhbmNlcnMoe1xuICAgICAgQTogKHJvdykgPT4gbm9ybWFsaXplTGVnYWN5QW50aHJvcGljUm93KHJvdyksXG4gICAgICBDOiAocm93KSA9PiBub3JtYWxpemVMZWdhY3lBbnRocm9waWNSb3cocm93KSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtcyxcbiAgICAgIGVuaGFuY2VycyxcbiAgICB9KTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBzYXZlKHNwYTogUmVxdWVzdExvZ1NhdmVQYXJhbXNbXSk6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuXG4gICAgLy8gcmVnaXN0ZXJcbiAgICBzcGEuZm9yRWFjaCgoc3ApID0+IHtcbiAgICAgIHdkYi51YlJlZ2lzdGVyKFwicmVxdWVzdF9sb2dzXCIsIHNwKTtcbiAgICB9KTtcblxuICAgIC8vIHRyYW5zYWN0aW9uXG4gICAgcmV0dXJuIHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBjb25zdCBpZHMgPSBhd2FpdCB0cngudWJVcHNlcnQoXCJyZXF1ZXN0X2xvZ3NcIik7XG5cbiAgICAgIHJldHVybiBpZHM7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog7LWc6re8IOq1rOqwhOydmCBwcm92aWRlciDrs4Qg6rK965+JIO2GteqzhCjrqqjri4jthLDrp4HsmqkpLiBwcm92aWRlciDripQgcmVxdWVzdGVkX21vZGVsX25hbWUg7J2YXG4gICAqIFwib3BlbmFpLy4uLlwiIHwgXCJhbnRocm9waWMvLi4uXCIgcHJlZml4IOuhnCDtjJDsoJXtlZzri6Qg4oCUIHNlcnZpbmcgbW9kZWxfbmFtZSDsnYAgcHJlZml4IOqwgFxuICAgKiDsl4bqs6AsIHJ1bm5pbmcg7LSI6riw7JeUIOyVhOyngSDruYTslrQg7J6I64ukLiDsp5Hqs4TripQgSlMg7JeQ7IScIO2VnOuLpDog7Y+066eBIOyjvOq4sOqwgCDripDsiqjtlZjqs6BcbiAgICog6rWs6rCE7J20IOynp+yVhCByb3cg7IiY6rCAIOyekeycvOupsCwgcHJlZml4IENBU0Ug7Iud7J2EIOy/vOumrCDruYzrjZTsl5Ag67CV7KeAIOyViuyVhOuPhCDrkJzri6QuXG4gICAqL1xuICBhc3luYyBwcm92aWRlclN0YXRzU2luY2Uoc2luY2U6IERhdGUpOiBQcm9taXNlPFxuICAgIEFycmF5PHtcbiAgICAgIHByb3ZpZGVyOiBzdHJpbmc7XG4gICAgICByZXF1ZXN0czogbnVtYmVyO1xuICAgICAgZXJyb3JzOiBudW1iZXI7XG4gICAgICBpbnB1dFRva2VuczogbnVtYmVyO1xuICAgICAgY2FjaGVSZWFkVG9rZW5zOiBudW1iZXI7XG4gICAgfT5cbiAgPiB7XG4gICAgY29uc3QgcmRiID0gdGhpcy5nZXRQdXJpKFwiclwiKTtcbiAgICBjb25zdCByb3dzID0gKGF3YWl0IHJkYlxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ3NcIilcbiAgICAgIC5zZWxlY3Qoe1xuICAgICAgICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogXCJyZXF1ZXN0X2xvZ3MucmVxdWVzdGVkX21vZGVsX25hbWVcIixcbiAgICAgICAgc3RhdHVzOiBcInJlcXVlc3RfbG9ncy5zdGF0dXNcIixcbiAgICAgICAgaW5wdXRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5pbnB1dF90b2tlbnNcIixcbiAgICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmNhY2hlX3JlYWRfdG9rZW5zXCIsXG4gICAgICB9KVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dzLmNyZWF0ZWRfYXRcIiwgXCI+PVwiLCBzaW5jZSkpIGFzIHVua25vd24gYXMgQXJyYXk8e1xuICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgICBzdGF0dXM6IHN0cmluZztcbiAgICAgIGlucHV0X3Rva2VuczogbnVtYmVyO1xuICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IG51bWJlcjtcbiAgICB9PjtcblxuICAgIGNvbnN0IGJ5UHJvdmlkZXIgPSBuZXcgTWFwPFxuICAgICAgc3RyaW5nLFxuICAgICAgeyByZXF1ZXN0czogbnVtYmVyOyBlcnJvcnM6IG51bWJlcjsgaW5wdXRUb2tlbnM6IG51bWJlcjsgY2FjaGVSZWFkVG9rZW5zOiBudW1iZXIgfVxuICAgID4oKTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHJvdy5yZXF1ZXN0ZWRfbW9kZWxfbmFtZSA/PyBcIlwiO1xuICAgICAgY29uc3QgcHJvdmlkZXIgPSBtb2RlbC5zdGFydHNXaXRoKFwib3BlbmFpL1wiKVxuICAgICAgICA/IFwib3BlbmFpXCJcbiAgICAgICAgOiBtb2RlbC5zdGFydHNXaXRoKFwiYW50aHJvcGljL1wiKVxuICAgICAgICAgID8gXCJhbnRocm9waWNcIlxuICAgICAgICAgIDogXCJ1bmtub3duXCI7XG4gICAgICBjb25zdCBhZ2cgPSBieVByb3ZpZGVyLmdldChwcm92aWRlcikgPz8ge1xuICAgICAgICByZXF1ZXN0czogMCxcbiAgICAgICAgZXJyb3JzOiAwLFxuICAgICAgICBpbnB1dFRva2VuczogMCxcbiAgICAgICAgY2FjaGVSZWFkVG9rZW5zOiAwLFxuICAgICAgfTtcbiAgICAgIGFnZy5yZXF1ZXN0cyArPSAxO1xuICAgICAgaWYgKHJvdy5zdGF0dXMgPT09IFwiZXJyb3JcIikgYWdnLmVycm9ycyArPSAxO1xuICAgICAgYWdnLmlucHV0VG9rZW5zICs9IHJvdy5pbnB1dF90b2tlbnM7XG4gICAgICBhZ2cuY2FjaGVSZWFkVG9rZW5zICs9IHJvdy5jYWNoZV9yZWFkX3Rva2VucztcbiAgICAgIGJ5UHJvdmlkZXIuc2V0KHByb3ZpZGVyLCBhZ2cpO1xuICAgIH1cbiAgICByZXR1cm4gWy4uLmJ5UHJvdmlkZXIuZW50cmllcygpXVxuICAgICAgLm1hcCgoW3Byb3ZpZGVyLCBhZ2ddKSA9PiAoeyBwcm92aWRlciwgLi4uYWdnIH0pKVxuICAgICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLnByb3ZpZGVyLmxvY2FsZUNvbXBhcmUoYi5wcm92aWRlcikpO1xuICB9XG5cbiAgLyoqXG4gICAqIHN0cnVjdHVyZWQgb3V0cHV0IOyalOyyreydmCBKU09OIFNjaGVtYSDrpbwg7ZGc7Iuc7JqpIO2DgOyehSDthY3siqTtirjroZwg67OA7ZmY7ZWc64ukLlxuICAgKiB0eXBlc2NyaXB0IOuKlCDqsITqsrDtlZwgYHR5cGVgIOyEoOyWuCwgem9kIOuKlCDsnqzqtazshLHrkJwgem9kIO2RnO2YhOyLneydtOuLpCDigJQg7JuQ67O4IHpvZFxuICAgKiDshozsiqTripQgd2lyZSDrpbwg6rG064SI7Jik66mwIOyGjOyLpOuQmOuvgOuhnCByZWZpbmUvdHJhbnNmb3JtIOulmOuKlCDrs7Xsm5DrkJjsp4Ag7JWK64qU64ukLlxuICAgKiDsiqTtgqTrp4jqsIAg7JeG6rGw64KYIOuzgO2ZmCDsi6TtjKjrqbQgbnVsbCDigJQg7ZmU66m07J2AIO2VtOuLuSDruJTroZ0g7ZGc7Iuc66W8IOyDneuete2VnOuLpC5cbiAgICovXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIHJlc3BvbnNlVHlwZVRzKGlkOiBudW1iZXIpOiBQcm9taXNlPHtcbiAgICB0eXBlc2NyaXB0OiBzdHJpbmcgfCBudWxsO1xuICAgIHpvZDogc3RyaW5nIHwgbnVsbDtcbiAgfT4ge1xuICAgIGNvbnN0IHJkYiA9IHRoaXMuZ2V0UHVyaShcInJcIik7XG4gICAgY29uc3Qgcm93cyA9IChhd2FpdCByZGJcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpXG4gICAgICAuc2VsZWN0KHsganNvbl9zY2hlbWE6IFwicmVxdWVzdF9sb2dzLmpzb25fc2NoZW1hXCIgfSlcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9ncy5pZFwiLCBpZCkpIGFzIHVua25vd24gYXMgQXJyYXk8eyBqc29uX3NjaGVtYTogc3RyaW5nIHwgbnVsbCB9PjtcbiAgICBjb25zdCBzY2hlbWEgPSByb3dzWzBdPy5qc29uX3NjaGVtYTtcbiAgICBpZiAoIXNjaGVtYSkgcmV0dXJuIHsgdHlwZXNjcmlwdDogbnVsbCwgem9kOiBudWxsIH07XG5cbiAgICBsZXQgcGFyc2VkOiB1bmtub3duO1xuICAgIHRyeSB7XG4gICAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHNjaGVtYSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4geyB0eXBlc2NyaXB0OiBudWxsLCB6b2Q6IG51bGwgfTtcbiAgICB9XG4gICAgbGV0IHpvZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIHpvZCA9IGZvcm1hdFpvZENvZGUoXG4gICAgICAgIGpzb25TY2hlbWFUb1pvZChwYXJzZWQgYXMgUGFyYW1ldGVyczx0eXBlb2YganNvblNjaGVtYVRvWm9kPlswXSwgeyBtb2R1bGU6IFwibm9uZVwiIH0pLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHpvZCA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiB7IHR5cGVzY3JpcHQ6IHJlbmRlclBhcnNlZEpzb25TY2hlbWFUeXBlVGV4dChwYXJzZWQpLCB6b2QgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUb29sIENvbnRyYWN0IFZpZXdcblxuICAvKipcbiAgICog7JqU7LKt7JeQIOyepeywqeuQnCB0b29sIOqzhOyVveydhCBkZXRhaWwg7ZmU66m07Jqp7Jy866GcIOy2leyVve2VnOuLpC4gSlNPTkIg64qUIOydtOuvuCBkZWNvZGUg65CcXG4gICAqIOuwsOyXtOuhnCDsmKTrqbAg66y47J6Q7Je07J24IOqyveyasOunjCDrsKnslrTsoIHsnLzroZwgcGFyc2Ug7ZWc64ukLiDsoIDsnqXrkJwgUWdyaWRUb29sIOqzhOyVveydgFxuICAgKiDsoITsiJgg6rKA7IKs66GcIO2ZleyduOuQkOycvOuvgOuhnCDtla3rqqnrs4Qg67O07KCV7J2064KYIHVucmVhZGFibGUgc2VudGluZWwg7J2AIOunjOuTpOyngCDslYrripTri6QuXG4gICAqIOuLpOunjCBgUWdyaWRUb29sLmlucHV0U2NoZW1hYCDripQgYHoudW5rbm93bigpYCDsnbTrnbwg7YKk6rCAIOyXhuqxsOuCmCBudWxsIOyduCDqsJLrj4RcbiAgICogd2lyZSDqsoDspp3snYQg7Ya16rO87ZWY66+A66GcIOu5iCDsiqTtgqTrp4jroZwg7KCV6rec7ZmU7ZWc64ukIOKAlCBTREsg64qUIGB7fWAg66GcIOyxhOybjCDrs7Trgrjri6QuXG4gICAqL1xuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyB0b29sc1ZpZXcoaWQ6IG51bWJlcik6IFByb21pc2U8VG9vbFZpZXdbXT4ge1xuICAgIGNvbnN0IHJvdyA9IChhd2FpdCB0aGlzLmdldFB1cmkoXCJyXCIpXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nc1wiKVxuICAgICAgLnNlbGVjdCh7IHRvb2xzOiBcInJlcXVlc3RfbG9ncy50b29sc1wiIH0pXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ3MuaWRcIiwgaWQpXG4gICAgICAuZmlyc3QoKSkgYXMgeyB0b29sczogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRvb2xzID0gZGVjb2RlU3RvcmVkVG9vbHMocm93Py50b29scyk7XG4gICAgaWYgKCF0b29scykgcmV0dXJuIFtdO1xuXG4gICAgcmV0dXJuIHRvb2xzLm1hcCgodG9vbCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXRTY2hlbWEgPSAodG9vbC5pbnB1dFNjaGVtYSA/PyB7fSkgYXMge1xuICAgICAgICBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICB9O1xuICAgICAgY29uc3QgaW5wdXRab2QgPSByZW5kZXJKc29uU2NoZW1hWm9kU2hhcGVUZXh0KGlucHV0U2NoZW1hLCBUT09MX0VOVU1fVkFMVUVfTElNSVQpO1xuICAgICAgY29uc3QgZnVsbElucHV0Wm9kID0gcmVuZGVySnNvblNjaGVtYVpvZFNoYXBlVGV4dChpbnB1dFNjaGVtYSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IHRvb2wubmFtZSxcbiAgICAgICAgLi4uKHRvb2wuZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCA/IHsgZGVzY3JpcHRpb246IHRvb2wuZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgICAgcGFyYW1ldGVyQ291bnQ6IE9iamVjdC5rZXlzKGlucHV0U2NoZW1hLnByb3BlcnRpZXMgPz8ge30pLmxlbmd0aCxcbiAgICAgICAgaW5wdXRab2QsXG4gICAgICAgIC4uLihpbnB1dFpvZCAhPT0gZnVsbElucHV0Wm9kID8geyBmdWxsSW5wdXRab2QgfSA6IHt9KSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvLyDilIDilIAgUnVuIExpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBjcmVhdGVSdW4ocGFyYW1zOiB7XG4gICAgdXNlcl9wcm9tcHQ6IHN0cmluZztcbiAgICBzeXN0ZW1fcHJvbXB0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICByZXF1ZXN0ZWRfbW9kZWxfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgZWZmb3J0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICBwcm9qZWN0X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIGhpc3Rvcnk/OiB1bmtub3duO1xuICAgIHRvb2xzPzogVG9vbERlZmluaXRpb25zO1xuICAgIGlzX2ltYWdlX2dlbmVyYXRpb24/OiBib29sZWFuO1xuICAgIGlzX3N0cnVjdHVyZWQ/OiBib29sZWFuO1xuICAgIGpzb25fc2NoZW1hPzogc3RyaW5nIHwgbnVsbDtcbiAgfSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICB3ZGIudWJSZWdpc3RlcihcInJlcXVlc3RfbG9nc1wiLCB7XG4gICAgICB1c2VyX3Byb21wdDogcGFyYW1zLnVzZXJfcHJvbXB0LFxuICAgICAgc3lzdGVtX3Byb21wdDogcGFyYW1zLnN5c3RlbV9wcm9tcHQgPz8gbnVsbCxcbiAgICAgIC8vIHByb3ZpZGVyIOyLpO2WiSDsoITsnbTrr4DroZwgc2VydmluZyBtb2RlbOydgCDslYTsp4Eg7JWMIOyImCDsl4bri6QuXG4gICAgICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogcGFyYW1zLnJlcXVlc3RlZF9tb2RlbF9uYW1lID8/IG51bGwsXG4gICAgICBtb2RlbF9uYW1lOiBudWxsLFxuICAgICAgZWZmb3J0OiBwYXJhbXMuZWZmb3J0ID8/IG51bGwsXG4gICAgICBwcm9qZWN0X25hbWU6IHBhcmFtcy5wcm9qZWN0X25hbWUgPz8gbnVsbCxcbiAgICAgIHN0YXR1czogXCJydW5uaW5nXCIsXG4gICAgICByZXNwb25zZTogXCJcIixcbiAgICAgIGlucHV0X3Rva2VuczogMCxcbiAgICAgIG91dHB1dF90b2tlbnM6IDAsXG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogMCxcbiAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogMCxcbiAgICAgIGR1cmF0aW9uX21zOiAwLFxuICAgICAgdG9vbF9jYWxsX2NvdW50OiAwLFxuICAgICAgLy8g7J2066+47KeAIHR1cm4g7Iud67OEKFIxMykuIHJ1biDqsr3roZwodG9vbHMraW1hZ2Ug7KGw7ZWpKeuPhCBhdXRvIOqyveuhnOyZgCDrj5nsnbztlZjqsowg66eI7YK5LlxuICAgICAgaXNfaW1hZ2VfZ2VuZXJhdGlvbjogcGFyYW1zLmlzX2ltYWdlX2dlbmVyYXRpb24gPz8gZmFsc2UsXG4gICAgICBqc29uX3NjaGVtYTogcGFyYW1zLmpzb25fc2NoZW1hID8/IG51bGwsXG4gICAgICBpc19zdHJ1Y3R1cmVkOlxuICAgICAgICBwYXJhbXMuaXNfc3RydWN0dXJlZCA/PyAocGFyYW1zLmpzb25fc2NoZW1hICE9PSBudWxsICYmIHBhcmFtcy5qc29uX3NjaGVtYSAhPT0gdW5kZWZpbmVkKSxcbiAgICAgIC4uLihwYXJhbXMuaGlzdG9yeSAhPT0gdW5kZWZpbmVkID8geyBoaXN0b3J5OiBwYXJhbXMuaGlzdG9yeSBhcyB7IHR5cGU6IHN0cmluZyB9W10gfSA6IHt9KSxcbiAgICAgIC4uLihwYXJhbXMudG9vbHMgIT09IHVuZGVmaW5lZCA/IHsgdG9vbHM6IHBhcmFtcy50b29scyB9IDoge30pLFxuICAgIH0pO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgY29uc3QgaWRzID0gYXdhaXQgdHJ4LnViVXBzZXJ0KFwicmVxdWVzdF9sb2dzXCIpO1xuICAgICAgcmV0dXJuIGlkc1swXSE7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBhcHBlbmRTdGVwKHJlcXVlc3RMb2dJZDogbnVtYmVyLCBzdGVwOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICB3ZGIudWJSZWdpc3RlcihcInJlcXVlc3RfbG9nX3N0ZXBzXCIsIHsgcmVxdWVzdF9sb2dfaWQ6IHJlcXVlc3RMb2dJZCwgLi4uc3RlcCB9KTtcbiAgICByZXR1cm4gd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIGNvbnN0IGlkcyA9IGF3YWl0IHRyeC51YlVwc2VydChcInJlcXVlc3RfbG9nX3N0ZXBzXCIpO1xuICAgICAgaWYgKHN0ZXAudHlwZSA9PT0gXCJ0b29sX2NhbGxcIikge1xuICAgICAgICBhd2FpdCB0cnguZnJvbShcInJlcXVlc3RfbG9nc1wiKS53aGVyZShcImlkXCIsIHJlcXVlc3RMb2dJZCkuaW5jcmVtZW50KFwidG9vbF9jYWxsX2NvdW50XCIsIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlkc1swXSE7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmaW5pc2hSdW4oXG4gICAgcmVxdWVzdExvZ0lkOiBudW1iZXIsXG4gICAgcGFyYW1zOiB7XG4gICAgICBzdGF0dXM6IHN0cmluZztcbiAgICAgIHJlc3BvbnNlPzogc3RyaW5nO1xuICAgICAgdG9rZW5fbmFtZT86IHN0cmluZztcbiAgICAgIGlucHV0X3Rva2Vucz86IG51bWJlcjtcbiAgICAgIG91dHB1dF90b2tlbnM/OiBudW1iZXI7XG4gICAgICBjYWNoZV9yZWFkX3Rva2Vucz86IG51bWJlcjtcbiAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2Vucz86IG51bWJlcjtcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vucz86IG51bWJlciB8IG51bGw7XG4gICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuICAgICAgZHVyYXRpb25fbXM/OiBudW1iZXI7XG4gICAgICByZXF1ZXN0ZWRfbW9kZWxfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgICBtb2RlbF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAgIGZhbGxiYWNrX2NvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAgIGNvc3RfdXNkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAgIGNvc3Rfc291cmNlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAgIGhpc3Rvcnk/OiB1bmtub3duO1xuICAgICAgZXJyb3JfbWVzc2FnZT86IHN0cmluZztcbiAgICAgIHRvb2xfY2FsbF9jb3VudD86IG51bWJlcjtcbiAgICAgIGltYWdlX2Nvc3RfdXNkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAgIGltYWdlX2Nvc3RfbWV0aG9kPzogc3RyaW5nIHwgbnVsbDtcbiAgICAgIGlzX2ltYWdlX2dlbmVyYXRpb24/OiBib29sZWFuO1xuICAgICAgcmVzcG9uc2VfanNvbl9vaz86IGJvb2xlYW4gfCBudWxsO1xuICAgIH0sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChwYXJhbXMuc3RhdHVzID09PSBcInN1Y2NlZWRlZFwiICYmICFwYXJhbXMudG9rZW5fbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidG9rZW5OYW1lIGlzIHJlcXVpcmVkIGZvciBzdWNjZWVkZWQgcnVuc1wiKTtcbiAgICB9XG4gICAgY29uc3QgdXBkYXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgaWQ6IHJlcXVlc3RMb2dJZCwgc3RhdHVzOiBwYXJhbXMuc3RhdHVzIH07XG4gICAgY29uc3QgZmllbGRzID0gW1xuICAgICAgXCJyZXNwb25zZVwiLFxuICAgICAgXCJ0b2tlbl9uYW1lXCIsXG4gICAgICBcImlucHV0X3Rva2Vuc1wiLFxuICAgICAgXCJvdXRwdXRfdG9rZW5zXCIsXG4gICAgICBcImNhY2hlX3JlYWRfdG9rZW5zXCIsXG4gICAgICBcImNhY2hlX2NyZWF0aW9uX3Rva2Vuc1wiLFxuICAgICAgXCJjYWNoZV9jcmVhdGlvbl81bV90b2tlbnNcIixcbiAgICAgIFwiY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zXCIsXG4gICAgICBcImR1cmF0aW9uX21zXCIsXG4gICAgICBcInJlcXVlc3RlZF9tb2RlbF9uYW1lXCIsXG4gICAgICBcIm1vZGVsX25hbWVcIixcbiAgICAgIFwiZmFsbGJhY2tfY291bnRcIixcbiAgICAgIFwiY29zdF91c2RcIixcbiAgICAgIFwiY29zdF9zb3VyY2VcIixcbiAgICAgIFwiZXJyb3JfbWVzc2FnZVwiLFxuICAgICAgXCJ0b29sX2NhbGxfY291bnRcIixcbiAgICAgIFwiaW1hZ2VfY29zdF91c2RcIixcbiAgICAgIFwiaW1hZ2VfY29zdF9tZXRob2RcIixcbiAgICAgIFwiaXNfaW1hZ2VfZ2VuZXJhdGlvblwiLFxuICAgICAgXCJyZXNwb25zZV9qc29uX29rXCIsXG4gICAgXSBhcyBjb25zdDtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBmaWVsZHMpIHtcbiAgICAgIGlmIChwYXJhbXNba2V5XSAhPT0gdW5kZWZpbmVkKSB1cGRhdGVba2V5XSA9IHBhcmFtc1trZXldO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmhpc3RvcnkgIT09IHVuZGVmaW5lZCkgdXBkYXRlLmhpc3RvcnkgPSBwYXJhbXMuaGlzdG9yeTtcbiAgICB1cGRhdGUudHRmdF9tcyA9IChhd2FpdCB0aGlzLmZpcnN0R2VuZXJhdGVTdGVwVHRmdChyZXF1ZXN0TG9nSWQpKSA/PyAwO1xuXG4gICAgLy8g7ISc67KEIHJ1biDqsr3roZzripQgc3RlcCDsl5DshJwg7ZmV7KCV7ZWcIGV4YWN0IGNvc3Qg66W8IOuEmOq4tOuLpC4g7Jm467aAL2xlZ2FjeSBjYWxsZXIg6rCAIOu5hOyaqeydhFxuICAgIC8vIOyDneuete2VnCDqsr3smrDsl5Drp4wg7KCA7J6l65CcIOuqqOuNuCt1c2FnZSDroZwg6rOE7IKw7ZWc64ukLlxuICAgIGlmIChcbiAgICAgIHBhcmFtcy5jb3N0X3VzZCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICBwYXJhbXMuaW5wdXRfdG9rZW5zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHBhcmFtcy5vdXRwdXRfdG9rZW5zICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIGNvbnN0IHJvdyA9IGF3YWl0IHRoaXMuZ2V0UHVyaShcInJcIilcbiAgICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ3NcIilcbiAgICAgICAgLnNlbGVjdCh7IG1vZGVsX25hbWU6IFwibW9kZWxfbmFtZVwiIH0pXG4gICAgICAgIC53aGVyZShcImlkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgICAgLmZpcnN0KCk7XG4gICAgICBjb25zdCBlZmZlY3RpdmVNb2RlbE5hbWUgPSBwYXJhbXMubW9kZWxfbmFtZSA/PyByb3c/Lm1vZGVsX25hbWU7XG4gICAgICBpZiAoZWZmZWN0aXZlTW9kZWxOYW1lKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gY2Fub25pY2FsTW9kZWxOYW1lKGVmZmVjdGl2ZU1vZGVsTmFtZSk7XG4gICAgICAgIGNvbnN0IHVzYWdlID0gbm9ybWFsaXplZFVzYWdlRm9yQ29zdCh7XG4gICAgICAgICAgdG9rZW5fbmFtZTogcGFyYW1zLnRva2VuX25hbWUsXG4gICAgICAgICAgbW9kZWxfbmFtZTogZWZmZWN0aXZlTW9kZWxOYW1lLFxuICAgICAgICAgIGlucHV0X3Rva2VuczogcGFyYW1zLmlucHV0X3Rva2VucyxcbiAgICAgICAgICBvdXRwdXRfdG9rZW5zOiBwYXJhbXMub3V0cHV0X3Rva2VucyxcbiAgICAgICAgICBjYWNoZV9yZWFkX3Rva2VuczogcGFyYW1zLmNhY2hlX3JlYWRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBwYXJhbXMuY2FjaGVfY3JlYXRpb25fdG9rZW5zID8/IDAsXG4gICAgICAgICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBwYXJhbXMuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zLFxuICAgICAgICAgIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2VuczogcGFyYW1zLmNhY2hlX2NyZWF0aW9uXzFoX3Rva2VucyxcbiAgICAgICAgfSk7XG4gICAgICAgIHVwZGF0ZS5jb3N0X3VzZCA9IE1hdGgucm91bmQoXG4gICAgICAgICAgY2FsY3VsYXRlQ29zdFVzZChtb2RlbCwge1xuICAgICAgICAgICAgaW5wdXRUb2tlbnM6IHVzYWdlLmlucHV0VG9rZW5zLFxuICAgICAgICAgICAgb3V0cHV0VG9rZW5zOiB1c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogdXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IHVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VucyxcbiAgICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtOiB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSxcbiAgICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoOiB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaCxcbiAgICAgICAgICB9KSAqIDFfMDAwXzAwMCxcbiAgICAgICAgKTtcbiAgICAgICAgdXBkYXRlLmNvc3Rfc291cmNlID0gXCJwcmljaW5nX3RhYmxlXCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICB3ZGIudWJSZWdpc3RlcihcInJlcXVlc3RfbG9nc1wiLCB1cGRhdGUpO1xuICAgIGF3YWl0IHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBhd2FpdCB0cngudWJVcHNlcnQoXCJyZXF1ZXN0X2xvZ3NcIik7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmaXJzdEdlbmVyYXRlU3RlcFR0ZnQocmVxdWVzdExvZ0lkOiBudW1iZXIpOiBQcm9taXNlPG51bWJlciB8IG51bGw+IHtcbiAgICBjb25zdCByb3cgPSBhd2FpdCB0aGlzLmdldFB1cmkoXCJyXCIpXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nX3N0ZXBzXCIpXG4gICAgICAuc2VsZWN0KHsgdHRmdF9tczogXCJ0dGZ0X21zXCIgfSlcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX2lkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgIC53aGVyZShcInR5cGVcIiwgXCJnZW5lcmF0ZVwiKVxuICAgICAgLndoZXJlKFwidHRmdF9tc1wiLCBcIiE9XCIsIG51bGwpXG4gICAgICAub3JkZXJCeShcInN0ZXBfaW5kZXhcIiwgXCJhc2NcIilcbiAgICAgIC5vcmRlckJ5KFwiaWRcIiwgXCJhc2NcIilcbiAgICAgIC5maXJzdCgpO1xuICAgIHJldHVybiByb3c/LnR0ZnRfbXMgPT09IG51bGwgfHwgcm93Py50dGZ0X21zID09PSB1bmRlZmluZWQgPyBudWxsIDogTnVtYmVyKHJvdy50dGZ0X21zKTtcbiAgfVxuXG4gIGFzeW5jIGFnZ3JlZ2F0ZVN0ZXBVc2FnZShyZXF1ZXN0TG9nSWQ6IG51bWJlcik6IFByb21pc2U8UmVxdWVzdExvZ1N0ZXBBZ2dyZWdhdGU+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5nZXRQdXJpKFwiclwiKVxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgLnNlbGVjdChTVEVQX0FHR1JFR0FURV9TRUxFQ1QpXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19pZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAud2hlcmUoXCJ0eXBlXCIsIFwiZ2VuZXJhdGVcIik7XG4gICAgcmV0dXJuIGFnZ3JlZ2F0ZUdlbmVyYXRlU3RlcFJvd3Mocm93cyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHN0YWxlIGNhbmRpZGF0ZXMsIHRoZW4gZXhwaXJlcyBlYWNoIHJ1biBpbiBpdHMgb3duIHNob3J0IHRyYW5zYWN0aW9uLlxuICAgKiBUaGUgY2FuZGlkYXRlIHF1ZXJ5IGlzIG9ubHkgYSBoaW50OyB0aGUgdHJhbnNhY3Rpb25hbCBvcGVyYXRpb24gcmVjaGVja3MgaXRcbiAgICogYWZ0ZXIgYWNxdWlyaW5nIHRoZSBhZHZpc29yeSBsb2NrIHNoYXJlZCB3aXRoIHRvb2wgZm9sbG93LXVwcy5cbiAgICovXG4gIGFzeW5jIGV4cGlyZVN0YWxlVG9vbFdhaXRpbmdSdW5zKFxuICAgIHRocmVzaG9sZE1zOiBudW1iZXIsXG4gICAgZXJyb3JNZXNzYWdlOiBzdHJpbmcsXG4gICAgbGltaXQ6IG51bWJlciA9IDEwLFxuICApOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgY29uc3QgdGhyZXNob2xkID0gbmV3IERhdGUoRGF0ZS5ub3coKSAtIHRocmVzaG9sZE1zKTtcbiAgICBjb25zdCBjYW5kaWRhdGVJZHMgPSBhd2FpdCB0aGlzLmZpbmRTdGFsZVRvb2xXYWl0aW5nUnVuQ2FuZGlkYXRlcyh0aHJlc2hvbGQsIGxpbWl0KTtcbiAgICBjb25zdCBleHBpcmVkSWRzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcmVxdWVzdExvZ0lkIG9mIGNhbmRpZGF0ZUlkcykge1xuICAgICAgaWYgKGF3YWl0IHRoaXMudHJ5RXhwaXJlU3RhbGVUb29sV2FpdGluZ1J1bihyZXF1ZXN0TG9nSWQsIHRocmVzaG9sZCwgZXJyb3JNZXNzYWdlKSkge1xuICAgICAgICBleHBpcmVkSWRzLnB1c2gocmVxdWVzdExvZ0lkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGV4cGlyZWRJZHM7XG4gIH1cblxuICBhc3luYyBmaW5kU3RhbGVUb29sV2FpdGluZ1J1bkNhbmRpZGF0ZXModGhyZXNob2xkOiBEYXRlLCBsaW1pdDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLmdldFB1cmkoXCJ3XCIpXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nc1wiKVxuICAgICAgLmpvaW4oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiLCBcInJlcXVlc3RfbG9ncy5pZFwiLCBcInJlcXVlc3RfbG9nX3N0ZXBzLnJlcXVlc3RfbG9nX2lkXCIpXG4gICAgICAuZGlzdGluY3QoXCJyZXF1ZXN0X2xvZ3MuaWRcIilcbiAgICAgIC5zZWxlY3QoeyBpZDogXCJyZXF1ZXN0X2xvZ3MuaWRcIiB9KVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dzLnN0YXR1c1wiLCBcInJ1bm5pbmdcIilcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX3N0ZXBzLnR5cGVcIiwgXCJ0b29sX2NhbGxcIilcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX3N0ZXBzLmNyZWF0ZWRfYXRcIiwgXCI8XCIsIHRocmVzaG9sZClcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX3N0ZXBzLnRvb2xfcmVzdWx0XCIsIG51bGwpXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19zdGVwcy5lcnJvclwiLCBudWxsKVxuICAgICAgLmxpbWl0KGxpbWl0KTtcbiAgICByZXR1cm4gcm93cy5tYXAoKHsgaWQgfSkgPT4gaWQpO1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoeyBkYlByZXNldDogXCJ3XCIgfSlcbiAgYXN5bmMgdHJ5RXhwaXJlU3RhbGVUb29sV2FpdGluZ1J1bihcbiAgICByZXF1ZXN0TG9nSWQ6IG51bWJlcixcbiAgICB0aHJlc2hvbGQ6IERhdGUsXG4gICAgZXJyb3JNZXNzYWdlOiBzdHJpbmcsXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG4gICAgY29uc3QgbG9ja1Jlc3VsdCA9IChhd2FpdCB3ZGIua25leC5yYXcoXCJTRUxFQ1QgcGdfdHJ5X2Fkdmlzb3J5X3hhY3RfbG9jayg/LCA/KSBBUyBhY3F1aXJlZFwiLCBbXG4gICAgICBSRVFVRVNUX0xPR19SVU5fTE9DS19DTEFTU19JRCxcbiAgICAgIHJlcXVlc3RMb2dJZCxcbiAgICBdKSkgYXMgeyByb3dzPzogQXJyYXk8eyBhY3F1aXJlZD86IGJvb2xlYW4gfT4gfTtcbiAgICBpZiAobG9ja1Jlc3VsdC5yb3dzPy5bMF0/LmFjcXVpcmVkICE9PSB0cnVlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBUaGUgZm9sbG93LXVwIHBhdGggdXNlcyB0aGUgc2FtZSB3cml0ZXIgdHJhbnNhY3Rpb24gbG9jay4gUmVjaGVjayBhZnRlclxuICAgIC8vIGxvY2tpbmcgc28gYSByZXN1bHQgY29tbWl0dGVkIGR1cmluZyBjYW5kaWRhdGUgZGlzY292ZXJ5IG1ha2VzIHRoaXMgYSBuby1vcC5cbiAgICBjb25zdCB1bnJlc29sdmVkID0gYXdhaXQgd2RiXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nX3N0ZXBzXCIpXG4gICAgICAuc2VsZWN0KHsgaWQ6IFwiaWRcIiB9KVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgLndoZXJlKFwidHlwZVwiLCBcInRvb2xfY2FsbFwiKVxuICAgICAgLndoZXJlKFwiY3JlYXRlZF9hdFwiLCBcIjxcIiwgdGhyZXNob2xkKVxuICAgICAgLndoZXJlKFwidG9vbF9yZXN1bHRcIiwgbnVsbClcbiAgICAgIC53aGVyZShcImVycm9yXCIsIG51bGwpXG4gICAgICAuZmlyc3QoKTtcbiAgICBpZiAoIXVucmVzb2x2ZWQpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IHN0ZXBSb3dzID0gYXdhaXQgd2RiXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nX3N0ZXBzXCIpXG4gICAgICAuc2VsZWN0KFNURVBfQUdHUkVHQVRFX1NFTEVDVClcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX2lkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgIC53aGVyZShcInR5cGVcIiwgXCJnZW5lcmF0ZVwiKTtcbiAgICBjb25zdCBhZ2dyZWdhdGUgPSBhZ2dyZWdhdGVHZW5lcmF0ZVN0ZXBSb3dzKHN0ZXBSb3dzIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pik7XG4gICAgY29uc3QgZmlyc3RUdGZ0ID0gYXdhaXQgd2RiXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nX3N0ZXBzXCIpXG4gICAgICAuc2VsZWN0KHsgdHRmdF9tczogXCJ0dGZ0X21zXCIgfSlcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX2lkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgIC53aGVyZShcInR5cGVcIiwgXCJnZW5lcmF0ZVwiKVxuICAgICAgLndoZXJlKFwidHRmdF9tc1wiLCBcIiE9XCIsIG51bGwpXG4gICAgICAub3JkZXJCeShcInN0ZXBfaW5kZXhcIiwgXCJhc2NcIilcbiAgICAgIC5vcmRlckJ5KFwiaWRcIiwgXCJhc2NcIilcbiAgICAgIC5maXJzdCgpO1xuXG4gICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IHdkYlxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ3NcIilcbiAgICAgIC53aGVyZShcImlkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgIC53aGVyZShcInN0YXR1c1wiLCBcInJ1bm5pbmdcIilcbiAgICAgIC51cGRhdGUoe1xuICAgICAgICBzdGF0dXM6IFwiZXJyb3JcIixcbiAgICAgICAgZXJyb3JfbWVzc2FnZTogZXJyb3JNZXNzYWdlLFxuICAgICAgICBpbnB1dF90b2tlbnM6IGFnZ3JlZ2F0ZS5pbnB1dF90b2tlbnMsXG4gICAgICAgIG91dHB1dF90b2tlbnM6IGFnZ3JlZ2F0ZS5vdXRwdXRfdG9rZW5zLFxuICAgICAgICBjYWNoZV9yZWFkX3Rva2VuczogYWdncmVnYXRlLmNhY2hlX3JlYWRfdG9rZW5zLFxuICAgICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IGFnZ3JlZ2F0ZS5jYWNoZV9jcmVhdGlvbl90b2tlbnMsXG4gICAgICAgIC4uLihhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHsgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgLi4uKGFnZ3JlZ2F0ZS5jYWNoZV9jcmVhdGlvbl8xaF90b2tlbnMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8geyBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IGFnZ3JlZ2F0ZS5jYWNoZV9jcmVhdGlvbl8xaF90b2tlbnMgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICBkdXJhdGlvbl9tczogYWdncmVnYXRlLmR1cmF0aW9uX21zLFxuICAgICAgICBmYWxsYmFja19jb3VudDogYWdncmVnYXRlLmZhbGxiYWNrX2NvdW50LFxuICAgICAgICBjb3N0X3VzZDogYWdncmVnYXRlLmNvc3RfdXNkLFxuICAgICAgICAuLi4oYWdncmVnYXRlLmNvc3Rfc291cmNlICE9PSB1bmRlZmluZWQgPyB7IGNvc3Rfc291cmNlOiBhZ2dyZWdhdGUuY29zdF9zb3VyY2UgfSA6IHt9KSxcbiAgICAgICAgdHRmdF9tczpcbiAgICAgICAgICBmaXJzdFR0ZnQ/LnR0ZnRfbXMgPT09IG51bGwgfHwgZmlyc3RUdGZ0Py50dGZ0X21zID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgOiBOdW1iZXIoZmlyc3RUdGZ0LnR0ZnRfbXMpLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHVwZGF0ZWQgPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYSBuYXRpdmUgcWdyaWQgdG9vbCBmb2xsb3ctdXAgYW5kIGNvbXB1dGVzIGl0cyBuZXh0IHN0ZXAgaW5kZXggd2hpbGVcbiAgICogaG9sZGluZyB0aGUgcGVyLXJ1biBhZHZpc29yeSBsb2NrIHNoYXJlZCB3aXRoIHN0YWxlIGNsZWFudXAuXG4gICAqL1xuICBAdHJhbnNhY3Rpb25hbCh7IGRiUHJlc2V0OiBcIndcIiB9KVxuICBhc3luYyBjb250aW51ZVRvb2xSdW4oXG4gICAgcmVxdWVzdExvZ0lkOiBudW1iZXIsXG4gICAgdG9vbFJlc3VsdHM6IFRvb2xSZXN1bHRDb250aW51YXRpb25bXSxcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIGF3YWl0IHdkYi5rbmV4LnJhdyhcIlNFTEVDVCBwZ19hZHZpc29yeV94YWN0X2xvY2soPywgPylcIiwgW1xuICAgICAgUkVRVUVTVF9MT0dfUlVOX0xPQ0tfQ0xBU1NfSUQsXG4gICAgICByZXF1ZXN0TG9nSWQsXG4gICAgXSk7XG5cbiAgICBjb25zdCBydW4gPSBhd2FpdCB3ZGJcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpXG4gICAgICAuc2VsZWN0KHsgc3RhdHVzOiBcInN0YXR1c1wiIH0pXG4gICAgICAud2hlcmUoXCJpZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAuZmlyc3QoKTtcbiAgICBpZiAoIXJ1bikgdGhyb3cgbmV3IEVycm9yKGByZXF1ZXN0IGxvZyBydW4gJHtyZXF1ZXN0TG9nSWR9IG5vdCBmb3VuZGApO1xuICAgIGlmIChydW4uc3RhdHVzICE9PSBcInJ1bm5pbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGByZXF1ZXN0IGxvZyBydW4gJHtyZXF1ZXN0TG9nSWR9IGlzIGFscmVhZHkgJHtydW4uc3RhdHVzfWApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHRvb2xSZXN1bHRzKSB7XG4gICAgICBhd2FpdCB3ZGJcbiAgICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19pZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAgIC53aGVyZShcInRvb2xfY2FsbF9pZFwiLCByZXN1bHQudG9vbENhbGxJZClcbiAgICAgICAgLndoZXJlKFwidHlwZVwiLCBcInRvb2xfY2FsbFwiKVxuICAgICAgICAudXBkYXRlKHJlc3VsdC5pc0Vycm9yID8geyBlcnJvcjogcmVzdWx0Lm91dHB1dCB9IDogeyB0b29sX3Jlc3VsdDogcmVzdWx0Lm91dHB1dCB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByb3cgPSBhd2FpdCB3ZGJcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dfc3RlcHNcIilcbiAgICAgIC5zZWxlY3QoeyBtYXhfc3RlcDogUHVyaS5tYXgoXCJzdGVwX2luZGV4XCIpIH0pXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19pZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAuZmlyc3QoKTtcbiAgICByZXR1cm4gKHJvdz8ubWF4X3N0ZXAgPz8gLTEpICsgMTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtmZTrqbQg7ZGc7Iuc7JqpIOy0nSDruYTsmqkuIOuqqeuhneqzvCDqsJnsnYAg7ZWE7YSw66W8IOyggeyaqe2VnOuLpC5cbiAgICpcbiAgICogZHJpdmVy7JmAIGltYWdlIOu5hOyaqeydhCDtlajqu5ggU1VN7ZWcIOuSpCwgbGVnYWN5IGRyaXZlciDruYTsmqnsnZgg7LCo7JWh66eMIOuztOygle2VnOuLpC5cbiAgICog7J2066+47KeAIOu5hOyaqeydgCDsoIDsnqXqsJLsnYQg7ZWcIOuyiOunjCDtj6ztlajtlZjqs6Ag6rCA6rKp7ZGcIOyerOqzhOyCsCDrjIDsg4Hsl5DshJwg7KCc7Jm47ZWc64ukLlxuICAgKlxuICAgKiBsZWdhY3kg67O07KCV7J2EIOuCqOqyqOuRlCDsnbTsnKA6IOuwse2VhOuhnCDquLDsobQgbGVnYWN5IOuKlCAwIOydtCDrkJjsl4jsp4Drp4wsIOyZuOu2gCDroZzqsbDqsIBcbiAgICogYEFwcGVuZFN0ZXBJbnB1dGAvYEZpbmlzaFJ1bklucHV0YCDsnLzroZwgY29zdFNvdXJjZSDsl4bsnbQg64Sj7Jy866m0IOuLpOyLnCDsg53quLgg7IiYIOyeiOuLpC5cbiAgICog6re465+wIHJvdyDripQg7KCA7J6l6rCSIOuMgOyLoCDtmITsnqwg6rCA6rKp7ZGcIOyerOqzhOyCsOqwkuydtCDrp57snLzrr4DroZwg7LCo7JWh7J2EIOuNlO2VnOuLpC5cbiAgICpcbiAgICog7ZWE7YSwIOyhsOqxtOydhCDsl6zquLDshJwg64uk7IucIOq1rO2YhO2VmOyngCDslYrqs6AgYGFwcGx5TGlzdEZpbHRlcnNgIOulvCDqs7XsnKDtlZjripQg6rKD7J20IO2VteyLrOydtOuLpCDigJRcbiAgICog65GQIOy/vOumrOqwgCDqsIHsnpAg7ZWE7YSw66W8IOqwgOyngOuptCDtmZTrqbTsl5DshJwg7ZWE7YSw66W8IOqxuOyXiOydhCDrlYwg7ZaJIOyImOyZgCDruYTsmqnsnbQg7KGw7Jqp7Z6IIOyWtOq4i+uCnOuLpC5cbiAgICovXG4gIGFzeW5jIHRvdGFsQ29zdChyYXdQYXJhbXM6IFJlcXVlc3RMb2dMaXN0UGFyYW1zID0geyBudW06IDAsIHBhZ2U6IDEgfSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgbnVtOiAwLFxuICAgICAgcGFnZTogMSxcbiAgICAgIHNlYXJjaDogXCJpZFwiIGFzIGNvbnN0LFxuICAgICAgLi4ucmF3UGFyYW1zLFxuICAgIH0gc2F0aXNmaWVzIFJlcXVlc3RMb2dMaXN0UGFyYW1zO1xuXG4gICAgY29uc3QgeyBxYjogdG90YWxRYiB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKFwiQ1wiKTtcbiAgICB0aGlzLmFwcGx5TGlzdEZpbHRlcnModG90YWxRYiwgcGFyYW1zKTtcbiAgICBjb25zdCBzb25hbXVGaWx0ZXIgPSBwYXJhbXMuc29uYW11RmlsdGVyXG4gICAgICA/IG5vcm1hbGl6ZUZpbHRlclF1ZXJ5KHBhcmFtcy5zb25hbXVGaWx0ZXIpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmFwcGx5U29uYW11RmlsdGVycyh0b3RhbFFiLCBzb25hbXVGaWx0ZXIpO1xuICAgIC8vIHN1YnNldCBxYiDripQg7Lus65+8IOuqqeuhneydtCDsnbTrr7ggU0VMRUNUIOyXkCDrsJXtmIAg7J6I7Ja0IOynkeqzhOulvCDslrnsnLzrqbQgR1JPVVAgQlkg7JeQ65+s6rCAIOuCnOuLpC5cbiAgICAvLyBleGVjdXRlQ291bnRRdWVyeSDsmYAg6rCZ7J2AIOuwqeyLneycvOuhnCBzZWxlY3Qg66W8IOu5hOyasOqzoCDsp5Hqs4Trp4wg64Ko6ri064ukLlxuICAgIGNvbnN0IHN0b3JlZCA9IGF3YWl0IHRvdGFsUWJcbiAgICAgIC5jbGVhcihcInNlbGVjdFwiKVxuICAgICAgLy8g7J2M7IiYIOyggOyepeqwkijqs7zqsbAg67KE6re4KeydgCAwIOycvOuhnCDriIzrn6zshJwg642U7ZWc64ukIOKAlCBKUyDsqr0gTWF0aC5tYXgg7JmAIOqwmeydgCDqt5zsuZkuXG4gICAgICAuc2VsZWN0KHtcbiAgICAgICAgdG90YWw6IFB1cmkucmF3TnVtYmVyKFxuICAgICAgICAgIFwiQ09BTEVTQ0UoU1VNKEdSRUFURVNUKHJlcXVlc3RfbG9ncy5jb3N0X3VzZCwgMCkgKyBDT0FMRVNDRShyZXF1ZXN0X2xvZ3MuaW1hZ2VfY29zdF91c2QsIDApKSwgMClcIixcbiAgICAgICAgKSxcbiAgICAgIH0pXG4gICAgICAuZmlyc3QoKTtcblxuICAgIGNvbnN0IHsgcWI6IGxlZ2FjeVFiIH0gPSB0aGlzLmdldFN1YnNldFF1ZXJpZXMoXCJDXCIpO1xuICAgIHRoaXMuYXBwbHlMaXN0RmlsdGVycyhsZWdhY3lRYiwgcGFyYW1zKTtcbiAgICB0aGlzLmFwcGx5U29uYW11RmlsdGVycyhsZWdhY3lRYiwgc29uYW11RmlsdGVyKTtcbiAgICBjb25zdCBsZWdhY3lSb3dzID0gYXdhaXQgbGVnYWN5UWJcbiAgICAgIC53aGVyZVJhdyhcInJlcXVlc3RfbG9ncy5jb3N0X3NvdXJjZSBJUyBOVUxMIE9SIHJlcXVlc3RfbG9ncy5jb3N0X3VzZCBJUyBOVUxMXCIpXG4gICAgICAuY2xlYXIoXCJzZWxlY3RcIilcbiAgICAgIC5zZWxlY3Qoe1xuICAgICAgICB0b2tlbl9uYW1lOiBcInJlcXVlc3RfbG9ncy50b2tlbl9uYW1lXCIsXG4gICAgICAgIG1vZGVsX25hbWU6IFwicmVxdWVzdF9sb2dzLm1vZGVsX25hbWVcIixcbiAgICAgICAgaW5wdXRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5pbnB1dF90b2tlbnNcIixcbiAgICAgICAgb3V0cHV0X3Rva2VuczogXCJyZXF1ZXN0X2xvZ3Mub3V0cHV0X3Rva2Vuc1wiLFxuICAgICAgICBjYWNoZV9yZWFkX3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuY2FjaGVfcmVhZF90b2tlbnNcIixcbiAgICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9jcmVhdGlvbl90b2tlbnNcIixcbiAgICAgICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9jcmVhdGlvbl81bV90b2tlbnNcIixcbiAgICAgICAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9jcmVhdGlvbl8xaF90b2tlbnNcIixcbiAgICAgICAgY29zdF91c2Q6IFwicmVxdWVzdF9sb2dzLmNvc3RfdXNkXCIsXG4gICAgICB9KTtcblxuICAgIGNvbnN0IHN0b3JlZFRvdGFsID0gTnVtYmVyKHN0b3JlZD8udG90YWwgPz8gMCkgLyBNSUNST19VU0Q7XG5cbiAgICAvLyBsZWdhY3kgcm93IOuKlCDsnIQgU1VNIOyXkCDsoIDsnqXqsJLsnLzroZwg7J2066+4IO2PrO2VqOuQmOyWtCDsnojri6QuIOyerOqzhOyCsOqwkuqzvOydmCDssKjslaHrp4wg642U7ZWc64ukLlxuICAgIHJldHVybiBsZWdhY3lSb3dzLnJlZHVjZSgoc3VtLCByb3cpID0+IHtcbiAgICAgIGNvbnN0IGFscmVhZHlTdW1tZWQgPSBNYXRoLm1heChyb3cuY29zdF91c2QgPz8gMCwgMCkgLyBNSUNST19VU0Q7XG4gICAgICBjb25zdCB1c2FnZSA9IG5vcm1hbGl6ZWRVc2FnZUZvckNvc3Qocm93KTtcbiAgICAgIGlmICghdXNhZ2UubW9kZWwpIHJldHVybiBzdW07XG4gICAgICByZXR1cm4gKFxuICAgICAgICBzdW0gK1xuICAgICAgICBjYWxjdWxhdGVDb3N0VXNkKHVzYWdlLm1vZGVsLCB7XG4gICAgICAgICAgaW5wdXRUb2tlbnM6IHVzYWdlLmlucHV0VG9rZW5zLFxuICAgICAgICAgIG91dHB1dFRva2VuczogdXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgICAgIGNhY2hlZElucHV0VG9rZW5zOiB1c2FnZS5jYWNoZWRJbnB1dFRva2VucyxcbiAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IHVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VucyxcbiAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bTogdXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW0sXG4gICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWg6IHVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoLFxuICAgICAgICB9KSAtXG4gICAgICAgIGFscmVhZHlTdW1tZWRcbiAgICAgICk7XG4gICAgfSwgc3RvcmVkVG90YWwpO1xuICB9XG5cbiAgYXN5bmMgZGlzdGluY3RQcm9qZWN0TmFtZXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLmdldFB1cmkoXCJyXCIpXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nc1wiKVxuICAgICAgLmRpc3RpbmN0KFwicHJvamVjdF9uYW1lXCIpXG4gICAgICAud2hlcmUoXCJwcm9qZWN0X25hbWVcIiwgXCIhPVwiLCBudWxsKVxuICAgICAgLm9yZGVyQnkoXCJwcm9qZWN0X25hbWVcIiwgXCJhc2NcIilcbiAgICAgIC5zZWxlY3Qoe1xuICAgICAgICBwcm9qZWN0X25hbWU6IFwicHJvamVjdF9uYW1lXCIsXG4gICAgICB9KTtcbiAgICByZXR1cm4gcm93cy5tYXAoKHIpID0+IHIucHJvamVjdF9uYW1lISk7XG4gIH1cblxuICBhc3luYyBkaXN0aW5jdE1vZGVsTmFtZXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLmdldFB1cmkoXCJyXCIpXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nc1wiKVxuICAgICAgLmRpc3RpbmN0KFwibW9kZWxfbmFtZVwiKVxuICAgICAgLndoZXJlKFwibW9kZWxfbmFtZVwiLCBcIiE9XCIsIG51bGwpXG4gICAgICAub3JkZXJCeShcIm1vZGVsX25hbWVcIiwgXCJhc2NcIilcbiAgICAgIC5zZWxlY3Qoe1xuICAgICAgICBtb2RlbF9uYW1lOiBcIm1vZGVsX25hbWVcIixcbiAgICAgIH0pO1xuICAgIHJldHVybiByb3dzLm1hcCgocikgPT4gci5tb2RlbF9uYW1lISk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgZGVsKGlkczogbnVtYmVyW10pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG5cbiAgICAvLyB0cmFuc2FjdGlvblxuICAgIGF3YWl0IHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBhd2FpdCB0cnhcbiAgICAgICAgLnRhYmxlKFwicmVxdWVzdF9sb2dfc3RlcHNcIilcbiAgICAgICAgLndoZXJlSW4oXCJyZXF1ZXN0X2xvZ19zdGVwcy5yZXF1ZXN0X2xvZ19pZFwiLCBpZHMpXG4gICAgICAgIC5kZWxldGUoKTtcbiAgICAgIHJldHVybiB0cngudGFibGUoXCJyZXF1ZXN0X2xvZ3NcIikud2hlcmVJbihcInJlcXVlc3RfbG9ncy5pZFwiLCBpZHMpLmRlbGV0ZSgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGlkcy5sZW5ndGg7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFJlcXVlc3RMb2dNb2RlbCA9IG5ldyBSZXF1ZXN0TG9nTW9kZWxDbGFz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
585
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1sb2cubW9kZWwuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpzb25TY2hlbWFUb1pvZCB9IGZyb20gXCJqc29uLXNjaGVtYS10by16b2RcIjtcbmltcG9ydCB7XG4gIGFwaSxcbiAgYXNBcnJheSxcbiAgQmFkUmVxdWVzdEV4Y2VwdGlvbixcbiAgQmFzZU1vZGVsQ2xhc3MsXG4gIHR5cGUgTGlzdFJlc3VsdCxcbiAgbm9ybWFsaXplRmlsdGVyUXVlcnksXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxuICBQdXJpLFxuICB0cmFuc2FjdGlvbmFsLFxufSBmcm9tIFwic29uYW11XCI7XG5cbmltcG9ydCB7IFNEIH0gZnJvbSBcIi4uLy4uL2kxOG4vc2QuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVDb3N0VXNkIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vbW9kZWwtY29zdFwiO1xuaW1wb3J0IHsgdHlwZSBSZXF1ZXN0TG9nU3Vic2V0S2V5LCB0eXBlIFJlcXVlc3RMb2dTdWJzZXRNYXBwaW5nIH0gZnJvbSBcIi4uL3NvbmFtdS5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IHJlcXVlc3RMb2dMb2FkZXJRdWVyaWVzLCByZXF1ZXN0TG9nU3Vic2V0UXVlcmllcyB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkLnNzb1wiO1xuaW1wb3J0IHtcbiAgcmVuZGVySnNvblNjaGVtYVpvZFNoYXBlVGV4dCxcbiAgcmVuZGVyUGFyc2VkSnNvblNjaGVtYVR5cGVUZXh0LFxufSBmcm9tIFwiLi9qc29uLXNjaGVtYS10eXBlLXRleHRcIjtcbmltcG9ydCB7XG4gIHR5cGUgUmVxdWVzdExvZ0xpc3RQYXJhbXMsXG4gIHR5cGUgUmVxdWVzdExvZ1NhdmVQYXJhbXMsXG4gIHR5cGUgVG9vbERlZmluaXRpb25zLFxuICB0eXBlIFRvb2xWaWV3LFxufSBmcm9tIFwiLi9yZXF1ZXN0LWxvZy50eXBlc1wiO1xuaW1wb3J0IHsgZm9ybWF0Wm9kQ29kZSB9IGZyb20gXCIuL3pvZC1jb2RlLWZvcm1hdFwiO1xuXG4vLyBjb3N0X3VzZOuKlCDsoJXsiJggbWljcm8tVVNE66GcIOyggOyepS4g7Iuk7KCcIFVTRCA9IGNvc3RfdXNkIC8gTUlDUk9fVVNELlxuZXhwb3J0IGNvbnN0IE1JQ1JPX1VTRCA9IDFfMDAwXzAwMDtcbmNvbnN0IFJFUVVFU1RfTE9HX1JVTl9MT0NLX0NMQVNTX0lEID0gNzE4O1xuY29uc3QgVE9PTF9FTlVNX1ZBTFVFX0xJTUlUID0gNjtcblxuZnVuY3Rpb24gZGVjb2RlU3RvcmVkVG9vbHModmFsdWU6IHVua25vd24pOiBUb29sRGVmaW5pdGlvbnMgfCBudWxsIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB2YWx1ZSBhcyBUb29sRGVmaW5pdGlvbnM7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpIGFzIFRvb2xEZWZpbml0aW9ucztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxudHlwZSBUb29sUmVzdWx0Q29udGludWF0aW9uID0ge1xuICB0b29sQ2FsbElkOiBzdHJpbmc7XG4gIG91dHB1dDogc3RyaW5nO1xuICBpc0Vycm9yPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgUmVxdWVzdExvZ1N0ZXBBZ2dyZWdhdGUgPSB7XG4gIGlucHV0X3Rva2VuczogbnVtYmVyO1xuICBvdXRwdXRfdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX3JlYWRfdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogbnVtYmVyO1xuICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM/OiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vucz86IG51bWJlcjtcbiAgZHVyYXRpb25fbXM6IG51bWJlcjtcbiAgZmFsbGJhY2tfY291bnQ6IG51bWJlcjtcbiAgY29zdF91c2Q6IG51bWJlcjtcbiAgY29zdF9zb3VyY2U/OiBzdHJpbmc7XG59O1xuXG5jb25zdCBTVEVQX0FHR1JFR0FURV9TRUxFQ1QgPSB7XG4gIGlucHV0X3Rva2VuczogXCJpbnB1dF90b2tlbnNcIixcbiAgb3V0cHV0X3Rva2VuczogXCJvdXRwdXRfdG9rZW5zXCIsXG4gIGNhY2hlX3JlYWRfdG9rZW5zOiBcImNhY2hlX3JlYWRfdG9rZW5zXCIsXG4gIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogXCJjYWNoZV9jcmVhdGlvbl90b2tlbnNcIixcbiAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBcImNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiLFxuICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IFwiY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zXCIsXG4gIGR1cmF0aW9uX21zOiBcImR1cmF0aW9uX21zXCIsXG4gIGZhbGxiYWNrX2NvdW50OiBcImZhbGxiYWNrX2NvdW50XCIsXG4gIGNvc3RfdXNkOiBcImNvc3RfdXNkXCIsXG4gIGNvc3Rfc291cmNlOiBcImNvc3Rfc291cmNlXCIsXG59IGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBhZ2dyZWdhdGVHZW5lcmF0ZVN0ZXBSb3dzKHJvd3M6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pik6IFJlcXVlc3RMb2dTdGVwQWdncmVnYXRlIHtcbiAgY29uc3Qgc3VtID0gKGZpZWxkOiBzdHJpbmcpOiBudW1iZXIgPT5cbiAgICByb3dzLnJlZHVjZSgodG90YWwsIHJvdykgPT4gdG90YWwgKyBOdW1iZXIocm93W2ZpZWxkXSA/PyAwKSwgMCk7XG4gIGNvbnN0IG9wdGlvbmFsU3VtID0gKGZpZWxkOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQgPT5cbiAgICByb3dzLnNvbWUoKHJvdykgPT4gcm93W2ZpZWxkXSAhPT0gbnVsbCAmJiByb3dbZmllbGRdICE9PSB1bmRlZmluZWQpID8gc3VtKGZpZWxkKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgY29sbGFwc2UgPSAoZmllbGQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3QgdmFsdWVzID0gW1xuICAgICAgLi4ubmV3IFNldChcbiAgICAgICAgcm93c1xuICAgICAgICAgIC5tYXAoKHJvdykgPT4gcm93W2ZpZWxkXSlcbiAgICAgICAgICAuZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIHN0cmluZyA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUubGVuZ3RoID4gMCksXG4gICAgICApLFxuICAgIF07XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPT09IDEgPyB2YWx1ZXNbMF0gOiBcIm1peGVkXCI7XG4gIH07XG4gIHJldHVybiB7XG4gICAgaW5wdXRfdG9rZW5zOiBzdW0oXCJpbnB1dF90b2tlbnNcIiksXG4gICAgb3V0cHV0X3Rva2Vuczogc3VtKFwib3V0cHV0X3Rva2Vuc1wiKSxcbiAgICBjYWNoZV9yZWFkX3Rva2Vuczogc3VtKFwiY2FjaGVfcmVhZF90b2tlbnNcIiksXG4gICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBzdW0oXCJjYWNoZV9jcmVhdGlvbl90b2tlbnNcIiksXG4gICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBvcHRpb25hbFN1bShcImNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiKSxcbiAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IG9wdGlvbmFsU3VtKFwiY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zXCIpLFxuICAgIGR1cmF0aW9uX21zOiBzdW0oXCJkdXJhdGlvbl9tc1wiKSxcbiAgICBmYWxsYmFja19jb3VudDogc3VtKFwiZmFsbGJhY2tfY291bnRcIiksXG4gICAgY29zdF91c2Q6IHN1bShcImNvc3RfdXNkXCIpLFxuICAgIGNvc3Rfc291cmNlOiBjb2xsYXBzZShcImNvc3Rfc291cmNlXCIpLFxuICB9O1xufVxuXG50eXBlIFJlcXVlc3RMb2dVc2FnZVJvdyA9IHtcbiAgdG9rZW5fbmFtZT86IHN0cmluZyB8IG51bGw7XG4gIG1vZGVsX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICBpbnB1dF90b2tlbnM6IG51bWJlcjtcbiAgb3V0cHV0X3Rva2VuczogbnVtYmVyO1xuICBjYWNoZV9yZWFkX3Rva2VuczogbnVtYmVyO1xuICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IG51bWJlcjtcbiAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcbiAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcbiAgY29zdF91c2Q/OiBudW1iZXIgfCBudWxsO1xuICBjb3N0X3NvdXJjZT86IHN0cmluZyB8IG51bGw7XG59O1xuXG5mdW5jdGlvbiBpc0FudGhyb3BpY1VzYWdlUm93KHJvdzogUGljazxSZXF1ZXN0TG9nVXNhZ2VSb3csIFwidG9rZW5fbmFtZVwiIHwgXCJtb2RlbF9uYW1lXCI+KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgcm93LnRva2VuX25hbWU/LnN0YXJ0c1dpdGgoXCJhbnRocm9waWMvXCIpID09PSB0cnVlIHx8XG4gICAgcm93Lm1vZGVsX25hbWU/LnN0YXJ0c1dpdGgoXCJjbGF1ZGUtXCIpID09PSB0cnVlIHx8XG4gICAgcm93Lm1vZGVsX25hbWU/LnN0YXJ0c1dpdGgoXCJhbnRocm9waWMvY2xhdWRlLVwiKSA9PT0gdHJ1ZVxuICApO1xufVxuXG5mdW5jdGlvbiBjYW5vbmljYWxNb2RlbE5hbWUobW9kZWxOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbW9kZWxOYW1lLmluY2x1ZGVzKFwiL1wiKSA/IG1vZGVsTmFtZS5zcGxpdChcIi9cIikucG9wKCkhIDogbW9kZWxOYW1lO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVkVXNhZ2VGb3JDb3N0KHJvdzogUmVxdWVzdExvZ1VzYWdlUm93KToge1xuICBtb2RlbDogc3RyaW5nIHwgbnVsbDtcbiAgaW5wdXRUb2tlbnM6IG51bWJlcjtcbiAgb3V0cHV0VG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlZElucHV0VG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogbnVtYmVyO1xuICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bT86IG51bWJlcjtcbiAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWg/OiBudW1iZXI7XG59IHtcbiAgY29uc3QgY2FjaGVSZWFkID0gcm93LmNhY2hlX3JlYWRfdG9rZW5zO1xuICBjb25zdCBjYWNoZUNyZWF0aW9uID0gcm93LmNhY2hlX2NyZWF0aW9uX3Rva2VucztcbiAgY29uc3Qgc3RvcmVkSW5wdXQgPSByb3cuaW5wdXRfdG9rZW5zO1xuICBjb25zdCBsZWdhY3lBbnRocm9waWNTcGxpdElucHV0ID1cbiAgICBpc0FudGhyb3BpY1VzYWdlUm93KHJvdykgJiYgc3RvcmVkSW5wdXQgPCBjYWNoZVJlYWQgKyBjYWNoZUNyZWF0aW9uO1xuICByZXR1cm4ge1xuICAgIG1vZGVsOiByb3cubW9kZWxfbmFtZSA/IGNhbm9uaWNhbE1vZGVsTmFtZShyb3cubW9kZWxfbmFtZSkgOiBudWxsLFxuICAgIGlucHV0VG9rZW5zOiBsZWdhY3lBbnRocm9waWNTcGxpdElucHV0ID8gc3RvcmVkSW5wdXQgKyBjYWNoZVJlYWQgKyBjYWNoZUNyZWF0aW9uIDogc3RvcmVkSW5wdXQsXG4gICAgb3V0cHV0VG9rZW5zOiByb3cub3V0cHV0X3Rva2VucyxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogY2FjaGVSZWFkLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogY2FjaGVDcmVhdGlvbixcbiAgICAuLi4ocm93LmNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucyAhPT0gbnVsbCAmJiByb3cuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zICE9PSB1bmRlZmluZWRcbiAgICAgID8geyBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bTogcm93LmNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucyB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4ocm93LmNhY2hlX2NyZWF0aW9uXzFoX3Rva2VucyAhPT0gbnVsbCAmJiByb3cuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zICE9PSB1bmRlZmluZWRcbiAgICAgID8geyBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaDogcm93LmNhY2hlX2NyZWF0aW9uXzFoX3Rva2VucyB9XG4gICAgICA6IHt9KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTGVnYWN5QW50aHJvcGljUm93PFQgZXh0ZW5kcyBSZXF1ZXN0TG9nVXNhZ2VSb3c+KHJvdzogVCk6IFQge1xuICAvLyDsg4ggcm93IOuKlCDri7nsi5zsnZggcHJvdmlkZXIv6rCA6rKp7ZGcIOu5hOyaqeydhCDtmZXsoJUg7KCA7J6l7ZWc64ukLiDtmITsnqwg6rCA6rKp7ZGc66GcIOuNruyWtOyTsOyngCDslYrripTri6QuXG4gIGlmIChyb3cuY29zdF9zb3VyY2UpIHJldHVybiByb3c7XG4gIGNvbnN0IHVzYWdlID0gbm9ybWFsaXplZFVzYWdlRm9yQ29zdChyb3cpO1xuICBpZiAodXNhZ2UuaW5wdXRUb2tlbnMgPT09IHJvdy5pbnB1dF90b2tlbnMpIHJldHVybiByb3c7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB7IC4uLnJvdywgaW5wdXRfdG9rZW5zOiB1c2FnZS5pbnB1dFRva2VucyB9O1xuICBpZiAodXNhZ2UubW9kZWwpIHtcbiAgICBub3JtYWxpemVkLmNvc3RfdXNkID0gTWF0aC5yb3VuZChjYWxjdWxhdGVDb3N0VXNkKHVzYWdlLm1vZGVsLCB1c2FnZSkgKiBNSUNST19VU0QpO1xuICB9XG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuXG4vKipcbiAqIGBvcmRlckJ5YCBlbnVtIOqwkihg7Lus65+8Leuwqe2WpWAp7J2EIOygleugrCDsoIjroZwg7Jiu6ri064ukLlxuICpcbiAqIGVudW0g7J20IDE4IOyiheydtOudvCDsvIDsnbTsiqTrpbwg7J287J287J20IOyggeuKlCDrjIDsi6Ag7YyM7Iux7ZWY65CYLCDsu6zrn7zsnYAg7JWE656YIOuqqeuhneycvOuhnCDtlZzsoJXtlZzri6Qg4oCUXG4gKiDrrLjsnpDsl7TsnYQg6re464yA66GcIOy7rOufvOuqheyXkCDrhJjquLDrqbQgZW51bSDsnbQg67CU64CUIOuVjCDqsoDspp0g7JeG64qUIOyLneuzhOyekOqwgCBTUUwg66GcIO2dmOufrOuToOuLpC5cbiAqIOuqqeuhneyXkCDsl4bripQg6rCS7J2AIOq4sOuzuCDsoJXroKwoaWQgZGVzYynroZwg65ao7Ja07KeE64ukLlxuICovXG5jb25zdCBPUkRFUkFCTEVfQ09MVU1OUyA9IHtcbiAgaWQ6IFwicmVxdWVzdF9sb2dzLmlkXCIsXG4gIGNyZWF0ZWRfYXQ6IFwicmVxdWVzdF9sb2dzLmNyZWF0ZWRfYXRcIixcbiAgdHRmdF9tczogXCJyZXF1ZXN0X2xvZ3MudHRmdF9tc1wiLFxuICBkdXJhdGlvbl9tczogXCJyZXF1ZXN0X2xvZ3MuZHVyYXRpb25fbXNcIixcbiAgaW5wdXRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5pbnB1dF90b2tlbnNcIixcbiAgb3V0cHV0X3Rva2VuczogXCJyZXF1ZXN0X2xvZ3Mub3V0cHV0X3Rva2Vuc1wiLFxuICBjYWNoZV9yZWFkX3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuY2FjaGVfcmVhZF90b2tlbnNcIixcbiAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9jcmVhdGlvbl90b2tlbnNcIixcbiAgY29zdF91c2Q6IFwicmVxdWVzdF9sb2dzLmNvc3RfdXNkXCIsXG59IGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBhcHBseU9yZGVyQnkoXG4gIHFiOiBSZXR1cm5UeXBlPFJlcXVlc3RMb2dNb2RlbENsYXNzW1wiZ2V0U3Vic2V0UXVlcmllc1wiXT5bXCJxYlwiXSxcbiAgb3JkZXJCeTogc3RyaW5nLFxuKTogdm9pZCB7XG4gIGNvbnN0IHNlcGFyYXRvciA9IG9yZGVyQnkubGFzdEluZGV4T2YoXCItXCIpO1xuICBjb25zdCBrZXkgPSBvcmRlckJ5LnNsaWNlKDAsIHNlcGFyYXRvcikgYXMga2V5b2YgdHlwZW9mIE9SREVSQUJMRV9DT0xVTU5TO1xuICBjb25zdCBkaXJlY3Rpb24gPSBvcmRlckJ5LnNsaWNlKHNlcGFyYXRvciArIDEpID09PSBcImFzY1wiID8gXCJhc2NcIiA6IFwiZGVzY1wiO1xuICBjb25zdCBjb2x1bW4gPSBPUkRFUkFCTEVfQ09MVU1OU1trZXldO1xuXG4gIGlmICghY29sdW1uKSB7XG4gICAgcWIub3JkZXJCeShcInJlcXVlc3RfbG9ncy5pZFwiLCBcImRlc2NcIik7XG4gICAgcmV0dXJuO1xuICB9XG4gIHFiLm9yZGVyQnkoY29sdW1uLCBkaXJlY3Rpb24pO1xuICAvLyDrj5nsoJAg7ZaJ7J2YIOyInOyEnOqwgCDtjpjsnbTsp4Drp4jri6Qg7Z2U65Ok66as7KeAIOyViuqyjCDqs6DsnKAg7Lus65+87Jy866GcIHRpZS1icmVhayDtlZzri6QuXG4gIGlmIChrZXkgIT09IFwiaWRcIikgcWIub3JkZXJCeShcInJlcXVlc3RfbG9ncy5pZFwiLCBcImRlc2NcIik7XG59XG5cbi8qXG4gIFJlcXVlc3RMb2cgTW9kZWxcbiovXG5jbGFzcyBSZXF1ZXN0TG9nTW9kZWxDbGFzcyBleHRlbmRzIEJhc2VNb2RlbENsYXNzPFxuICBSZXF1ZXN0TG9nU3Vic2V0S2V5LFxuICBSZXF1ZXN0TG9nU3Vic2V0TWFwcGluZyxcbiAgdHlwZW9mIHJlcXVlc3RMb2dTdWJzZXRRdWVyaWVzLFxuICB0eXBlb2YgcmVxdWVzdExvZ0xvYWRlclF1ZXJpZXNcbj4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlJlcXVlc3RMb2dcIiwgcmVxdWVzdExvZ1N1YnNldFF1ZXJpZXMsIHJlcXVlc3RMb2dMb2FkZXJRdWVyaWVzKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdLCByZXNvdXJjZU5hbWU6IFwiUmVxdWVzdExvZ1wiIH0pXG4gIGFzeW5jIGZpbmRCeUlkPFQgZXh0ZW5kcyBSZXF1ZXN0TG9nU3Vic2V0S2V5PihcbiAgICBzdWJzZXQ6IFQsXG4gICAgaWQ6IG51bWJlcixcbiAgKTogUHJvbWlzZTxSZXF1ZXN0TG9nU3Vic2V0TWFwcGluZ1tUXT4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgdGhpcy5maW5kTWFueShzdWJzZXQsIHtcbiAgICAgIGlkLFxuICAgICAgbnVtOiAxLFxuICAgICAgcGFnZTogMSxcbiAgICAgIHF1ZXJ5TW9kZTogXCJsaXN0XCIsXG4gICAgfSk7XG4gICAgaWYgKCFyb3dzWzBdKSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5lbnRpdHlOb3RGb3VuZFwiKShcIlJlcXVlc3RMb2dcIiwgaWQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm93c1swXTtcbiAgfVxuXG4gIGFzeW5jIGZpbmRPbmU8VCBleHRlbmRzIFJlcXVlc3RMb2dTdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBsaXN0UGFyYW1zOiBSZXF1ZXN0TG9nTGlzdFBhcmFtcyxcbiAgKTogUHJvbWlzZTxSZXF1ZXN0TG9nU3Vic2V0TWFwcGluZ1tUXSB8IG51bGw+IHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHRoaXMuZmluZE1hbnkoc3Vic2V0LCB7XG4gICAgICAuLi5saXN0UGFyYW1zLFxuICAgICAgbnVtOiAxLFxuICAgICAgcGFnZTogMSxcbiAgICAgIHF1ZXJ5TW9kZTogXCJsaXN0XCIsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcm93c1swXSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIOuqqeuhnSDtlYTthLDsnZgg64uo7J28IOygleydmC4gZmluZE1hbnkg7JmAIHRvdGFsQ29zdCDqsIAg6rCZ7J2AIOyhsOqxtOydhCDrs7Trj4TroZ0g6rO17Jyg7ZWc64ukIOKAlFxuICAgKiDtmZTrqbTsl5DshJwg7ZWE7YSw66W8IOqxuOuptCDtlokg7IiY7JmAIOu5hOyaqeydtCDtlajqu5gg7KKB7ZiA7KC47JW8IO2VmOuKlOuNsCwg65GQIOy/vOumrOqwgCDqsIHsnpAg7ZWE7YSw66W8XG4gICAqIOq1rO2YhO2VmOuptCDtlZzsqr3sl5Ag7LaV7J2EIOy2lOqwgO2VoCDrlYwg7KGw7Jqp7Z6IIOyWtOq4i+uCnOuLpC5cbiAgICovXG4gIGFwcGx5TGlzdEZpbHRlcnMoXG4gICAgcWI6IFJldHVyblR5cGU8UmVxdWVzdExvZ01vZGVsQ2xhc3NbXCJnZXRTdWJzZXRRdWVyaWVzXCJdPltcInFiXCJdLFxuICAgIHBhcmFtczogUmVxdWVzdExvZ0xpc3RQYXJhbXMsXG4gICk6IHZvaWQge1xuICAgIGlmIChwYXJhbXMuaWQpIHtcbiAgICAgIHFiLndoZXJlSW4oXCJyZXF1ZXN0X2xvZ3MuaWRcIiwgYXNBcnJheShwYXJhbXMuaWQpKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnRva2VuX25hbWUpIHtcbiAgICAgIHFiLndoZXJlKFwicmVxdWVzdF9sb2dzLnRva2VuX25hbWVcIiwgcGFyYW1zLnRva2VuX25hbWUpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucHJvamVjdF9uYW1lX2lzX251bGwpIHtcbiAgICAgIHFiLndoZXJlKFwicmVxdWVzdF9sb2dzLnByb2plY3RfbmFtZVwiLCBudWxsKTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy5wcm9qZWN0X25hbWVfaXNfbm90X251bGwpIHtcbiAgICAgIHFiLndoZXJlKFwicmVxdWVzdF9sb2dzLnByb2plY3RfbmFtZVwiLCBcIiE9XCIsIG51bGwpO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLnByb2plY3RfbmFtZSkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MucHJvamVjdF9uYW1lXCIsIHBhcmFtcy5wcm9qZWN0X25hbWUpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubW9kZWxfbmFtZSkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MubW9kZWxfbmFtZVwiLCBwYXJhbXMubW9kZWxfbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5zZWFyY2ggJiYgcGFyYW1zLmtleXdvcmQgJiYgcGFyYW1zLmtleXdvcmQubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHBhcmFtcy5zZWFyY2ggPT09IFwiaWRcIikge1xuICAgICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy5pZFwiLCBOdW1iZXIocGFyYW1zLmtleXdvcmQpKTtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJ0b2tlbl9uYW1lXCIpIHtcbiAgICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MudG9rZW5fbmFtZVwiLCBcImxpa2VcIiwgYCUke3BhcmFtcy5rZXl3b3JkfSVgKTtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJ1c2VyX3Byb21wdFwiKSB7XG4gICAgICAgIHFiLndoZXJlKFwicmVxdWVzdF9sb2dzLnVzZXJfcHJvbXB0XCIsIFwibGlrZVwiLCBgJSR7cGFyYW1zLmtleXdvcmR9JWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJlcnJvci51bmtub3duU2VhcmNoRmllbGRcIikocGFyYW1zLnNlYXJjaCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdLCByZXNvdXJjZU5hbWU6IFwiUmVxdWVzdExvZ3NcIiB9KVxuICBhc3luYyBmaW5kTWFueTxUIGV4dGVuZHMgUmVxdWVzdExvZ1N1YnNldEtleSwgTFAgZXh0ZW5kcyBSZXF1ZXN0TG9nTGlzdFBhcmFtcz4oXG4gICAgc3Vic2V0OiBULFxuICAgIHJhd1BhcmFtcz86IExQLFxuICApOiBQcm9taXNlPExpc3RSZXN1bHQ8TFAsIFJlcXVlc3RMb2dTdWJzZXRNYXBwaW5nW1RdPj4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG51bTogMjQsXG4gICAgICBwYWdlOiAxLFxuICAgICAgc2VhcmNoOiBcImlkXCIgYXMgY29uc3QsXG4gICAgICBvcmRlckJ5OiBcImlkLWRlc2NcIiBhcyBjb25zdCxcbiAgICAgIC4uLnJhd1BhcmFtcyxcbiAgICB9IHNhdGlzZmllcyBSZXF1ZXN0TG9nTGlzdFBhcmFtcztcblxuICAgIGNvbnN0IHsgcWIgfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhzdWJzZXQpO1xuXG4gICAgdGhpcy5hcHBseUxpc3RGaWx0ZXJzKHFiLCBwYXJhbXMpO1xuXG4gICAgaWYgKHBhcmFtcy5vcmRlckJ5KSBhcHBseU9yZGVyQnkocWIsIHBhcmFtcy5vcmRlckJ5KTtcblxuICAgIGNvbnN0IGVuaGFuY2VycyA9IHRoaXMuY3JlYXRlRW5oYW5jZXJzKHtcbiAgICAgIEE6IChyb3cpID0+IG5vcm1hbGl6ZUxlZ2FjeUFudGhyb3BpY1Jvdyhyb3cpLFxuICAgICAgQzogKHJvdykgPT4gbm9ybWFsaXplTGVnYWN5QW50aHJvcGljUm93KHJvdyksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlU3Vic2V0UXVlcnkoe1xuICAgICAgc3Vic2V0LFxuICAgICAgcWIsXG4gICAgICBwYXJhbXMsXG4gICAgICBlbmhhbmNlcnMsXG4gICAgfSk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgc2F2ZShzcGE6IFJlcXVlc3RMb2dTYXZlUGFyYW1zW10pOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcblxuICAgIC8vIHJlZ2lzdGVyXG4gICAgc3BhLmZvckVhY2goKHNwKSA9PiB7XG4gICAgICB3ZGIudWJSZWdpc3RlcihcInJlcXVlc3RfbG9nc1wiLCBzcCk7XG4gICAgfSk7XG5cbiAgICAvLyB0cmFuc2FjdGlvblxuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgY29uc3QgaWRzID0gYXdhaXQgdHJ4LnViVXBzZXJ0KFwicmVxdWVzdF9sb2dzXCIpO1xuXG4gICAgICByZXR1cm4gaWRzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOy1nOq3vCDqtazqsITsnZggcHJvdmlkZXIg67OEIOqyveufiSDthrXqs4Qo66qo64uI7YSw66eB7JqpKS4gcHJvdmlkZXIg64qUIHJlcXVlc3RlZF9tb2RlbF9uYW1lIOydmFxuICAgKiBcIm9wZW5haS8uLi5cIiB8IFwiYW50aHJvcGljLy4uLlwiIHByZWZpeCDroZwg7YyQ7KCV7ZWc64ukIOKAlCBzZXJ2aW5nIG1vZGVsX25hbWUg7J2AIHByZWZpeCDqsIBcbiAgICog7JeG6rOgLCBydW5uaW5nIOy0iOq4sOyXlCDslYTsp4Eg67mE7Ja0IOyeiOuLpC4g7KeR6rOE64qUIEpTIOyXkOyEnCDtlZzri6Q6IO2PtOungSDso7zquLDqsIAg64qQ7Iqo7ZWY6rOgXG4gICAqIOq1rOqwhOydtCDsp6fslYQgcm93IOyImOqwgCDsnpHsnLzrqbAsIHByZWZpeCBDQVNFIOyLneydhCDsv7zrpqwg67mM642U7JeQIOuwleyngCDslYrslYTrj4Qg65Cc64ukLlxuICAgKi9cbiAgYXN5bmMgcHJvdmlkZXJTdGF0c1NpbmNlKHNpbmNlOiBEYXRlKTogUHJvbWlzZTxcbiAgICBBcnJheTx7XG4gICAgICBwcm92aWRlcjogc3RyaW5nO1xuICAgICAgcmVxdWVzdHM6IG51bWJlcjtcbiAgICAgIGVycm9yczogbnVtYmVyO1xuICAgICAgaW5wdXRUb2tlbnM6IG51bWJlcjtcbiAgICAgIGNhY2hlUmVhZFRva2VuczogbnVtYmVyO1xuICAgIH0+XG4gID4ge1xuICAgIGNvbnN0IHJkYiA9IHRoaXMuZ2V0UHVyaShcInJcIik7XG4gICAgY29uc3Qgcm93cyA9IChhd2FpdCByZGJcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpXG4gICAgICAuc2VsZWN0KHtcbiAgICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IFwicmVxdWVzdF9sb2dzLnJlcXVlc3RlZF9tb2RlbF9uYW1lXCIsXG4gICAgICAgIHN0YXR1czogXCJyZXF1ZXN0X2xvZ3Muc3RhdHVzXCIsXG4gICAgICAgIGlucHV0X3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuaW5wdXRfdG9rZW5zXCIsXG4gICAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9yZWFkX3Rva2Vuc1wiLFxuICAgICAgfSlcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9ncy5jcmVhdGVkX2F0XCIsIFwiPj1cIiwgc2luY2UpKSBhcyB1bmtub3duIGFzIEFycmF5PHtcbiAgICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgICBpbnB1dF90b2tlbnM6IG51bWJlcjtcbiAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBudW1iZXI7XG4gICAgfT47XG5cbiAgICBjb25zdCBieVByb3ZpZGVyID0gbmV3IE1hcDxcbiAgICAgIHN0cmluZyxcbiAgICAgIHsgcmVxdWVzdHM6IG51bWJlcjsgZXJyb3JzOiBudW1iZXI7IGlucHV0VG9rZW5zOiBudW1iZXI7IGNhY2hlUmVhZFRva2VuczogbnVtYmVyIH1cbiAgICA+KCk7XG4gICAgcm93cy5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcm93LnJlcXVlc3RlZF9tb2RlbF9uYW1lID8/IFwiXCI7XG4gICAgICBjb25zdCBwcm92aWRlciA9IG1vZGVsLnN0YXJ0c1dpdGgoXCJvcGVuYWkvXCIpXG4gICAgICAgID8gXCJvcGVuYWlcIlxuICAgICAgICA6IG1vZGVsLnN0YXJ0c1dpdGgoXCJhbnRocm9waWMvXCIpXG4gICAgICAgICAgPyBcImFudGhyb3BpY1wiXG4gICAgICAgICAgOiBcInVua25vd25cIjtcbiAgICAgIGNvbnN0IGFnZyA9IGJ5UHJvdmlkZXIuZ2V0KHByb3ZpZGVyKSA/PyB7XG4gICAgICAgIHJlcXVlc3RzOiAwLFxuICAgICAgICBlcnJvcnM6IDAsXG4gICAgICAgIGlucHV0VG9rZW5zOiAwLFxuICAgICAgICBjYWNoZVJlYWRUb2tlbnM6IDAsXG4gICAgICB9O1xuICAgICAgYWdnLnJlcXVlc3RzICs9IDE7XG4gICAgICBpZiAocm93LnN0YXR1cyA9PT0gXCJlcnJvclwiKSBhZ2cuZXJyb3JzICs9IDE7XG4gICAgICBhZ2cuaW5wdXRUb2tlbnMgKz0gcm93LmlucHV0X3Rva2VucztcbiAgICAgIGFnZy5jYWNoZVJlYWRUb2tlbnMgKz0gcm93LmNhY2hlX3JlYWRfdG9rZW5zO1xuICAgICAgYnlQcm92aWRlci5zZXQocHJvdmlkZXIsIGFnZyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIFsuLi5ieVByb3ZpZGVyLmVudHJpZXMoKV1cbiAgICAgIC5tYXAoKFtwcm92aWRlciwgYWdnXSkgPT4gKHsgcHJvdmlkZXIsIC4uLmFnZyB9KSlcbiAgICAgIC50b1NvcnRlZCgoYSwgYikgPT4gYS5wcm92aWRlci5sb2NhbGVDb21wYXJlKGIucHJvdmlkZXIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzdHJ1Y3R1cmVkIG91dHB1dCDsmpTssq3snZggSlNPTiBTY2hlbWEg66W8IO2RnOyLnOyaqSDtg4DsnoUg7YWN7Iqk7Yq466GcIOuzgO2ZmO2VnOuLpC5cbiAgICogdHlwZXNjcmlwdCDripQg6rCE6rKw7ZWcIGB0eXBlYCDshKDslrgsIHpvZCDripQg7J6s6rWs7ISx65CcIHpvZCDtkZztmITsi53snbTri6Qg4oCUIOybkOuzuCB6b2RcbiAgICog7IaM7Iqk64qUIHdpcmUg66W8IOqxtOuEiOyYpOupsCDshozsi6TrkJjrr4DroZwgcmVmaW5lL3RyYW5zZm9ybSDrpZjripQg67O17JuQ65CY7KeAIOyViuuKlOuLpC5cbiAgICog7Iqk7YKk66eI6rCAIOyXhuqxsOuCmCDrs4DtmZgg7Iuk7Yyo66m0IG51bGwg4oCUIO2ZlOuptOydgCDtlbTri7kg67iU66GdIO2RnOyLnOulvCDsg53rnrXtlZzri6QuXG4gICAqL1xuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyByZXNwb25zZVR5cGVUcyhpZDogbnVtYmVyKTogUHJvbWlzZTx7XG4gICAgdHlwZXNjcmlwdDogc3RyaW5nIHwgbnVsbDtcbiAgICB6b2Q6IHN0cmluZyB8IG51bGw7XG4gIH0+IHtcbiAgICBjb25zdCByZGIgPSB0aGlzLmdldFB1cmkoXCJyXCIpO1xuICAgIGNvbnN0IHJvd3MgPSAoYXdhaXQgcmRiXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nc1wiKVxuICAgICAgLnNlbGVjdCh7IGpzb25fc2NoZW1hOiBcInJlcXVlc3RfbG9ncy5qc29uX3NjaGVtYVwiIH0pXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ3MuaWRcIiwgaWQpKSBhcyB1bmtub3duIGFzIEFycmF5PHsganNvbl9zY2hlbWE6IHN0cmluZyB8IG51bGwgfT47XG4gICAgY29uc3Qgc2NoZW1hID0gcm93c1swXT8uanNvbl9zY2hlbWE7XG4gICAgaWYgKCFzY2hlbWEpIHJldHVybiB7IHR5cGVzY3JpcHQ6IG51bGwsIHpvZDogbnVsbCB9O1xuXG4gICAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgICB0cnkge1xuICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZShzY2hlbWEpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHsgdHlwZXNjcmlwdDogbnVsbCwgem9kOiBudWxsIH07XG4gICAgfVxuICAgIGxldCB6b2Q6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICB6b2QgPSBmb3JtYXRab2RDb2RlKFxuICAgICAgICBqc29uU2NoZW1hVG9ab2QocGFyc2VkIGFzIFBhcmFtZXRlcnM8dHlwZW9mIGpzb25TY2hlbWFUb1pvZD5bMF0sIHsgbW9kdWxlOiBcIm5vbmVcIiB9KSxcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB6b2QgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4geyB0eXBlc2NyaXB0OiByZW5kZXJQYXJzZWRKc29uU2NoZW1hVHlwZVRleHQocGFyc2VkKSwgem9kIH07XG4gIH1cblxuICAvLyDilIDilIAgVG9vbCBDb250cmFjdCBWaWV3XG5cbiAgLyoqXG4gICAqIOyalOyyreyXkCDsnqXssKnrkJwgdG9vbCDqs4Tslb3snYQgZGV0YWlsIO2ZlOuptOyaqeycvOuhnCDstpXslb3tlZzri6QuIEpTT05CIOuKlCDsnbTrr7ggZGVjb2RlIOuQnFxuICAgKiDrsLDsl7TroZwg7Jik66mwIOusuOyekOyXtOyduCDqsr3smrDrp4wg67Cp7Ja07KCB7Jy866GcIHBhcnNlIO2VnOuLpC4g7KCA7J6l65CcIFFncmlkVG9vbCDqs4Tslb3snYBcbiAgICog7KCE7IiYIOqygOyCrOuhnCDtmZXsnbjrkJDsnLzrr4DroZwg7ZWt66qp67OEIOuztOygleydtOuCmCB1bnJlYWRhYmxlIHNlbnRpbmVsIOydgCDrp4zrk6Tsp4Ag7JWK64qU64ukLlxuICAgKiDri6Trp4wgYFFncmlkVG9vbC5pbnB1dFNjaGVtYWAg64qUIGB6LnVua25vd24oKWAg7J206528IO2CpOqwgCDsl4bqsbDrgpggbnVsbCDsnbgg6rCS64+EXG4gICAqIHdpcmUg6rKA7Kad7J2EIO2GteqzvO2VmOuvgOuhnCDruYgg7Iqk7YKk66eI66GcIOygleq3nO2ZlO2VnOuLpCDigJQgU0RLIOuKlCBge31gIOuhnCDssYTsm4wg67O064K464ukLlxuICAgKi9cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgdG9vbHNWaWV3KGlkOiBudW1iZXIpOiBQcm9taXNlPFRvb2xWaWV3W10+IHtcbiAgICBjb25zdCByb3cgPSAoYXdhaXQgdGhpcy5nZXRQdXJpKFwiclwiKVxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ3NcIilcbiAgICAgIC5zZWxlY3QoeyB0b29sczogXCJyZXF1ZXN0X2xvZ3MudG9vbHNcIiB9KVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dzLmlkXCIsIGlkKVxuICAgICAgLmZpcnN0KCkpIGFzIHsgdG9vbHM6IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCB0b29scyA9IGRlY29kZVN0b3JlZFRvb2xzKHJvdz8udG9vbHMpO1xuICAgIGlmICghdG9vbHMpIHJldHVybiBbXTtcblxuICAgIHJldHVybiB0b29scy5tYXAoKHRvb2wpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0U2NoZW1hID0gKHRvb2wuaW5wdXRTY2hlbWEgPz8ge30pIGFzIHtcbiAgICAgICAgcHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGlucHV0Wm9kID0gcmVuZGVySnNvblNjaGVtYVpvZFNoYXBlVGV4dChpbnB1dFNjaGVtYSwgVE9PTF9FTlVNX1ZBTFVFX0xJTUlUKTtcbiAgICAgIGNvbnN0IGZ1bGxJbnB1dFpvZCA9IHJlbmRlckpzb25TY2hlbWFab2RTaGFwZVRleHQoaW5wdXRTY2hlbWEpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiB0b29sLm5hbWUsXG4gICAgICAgIC4uLih0b29sLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQgPyB7IGRlc2NyaXB0aW9uOiB0b29sLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAgIHBhcmFtZXRlckNvdW50OiBPYmplY3Qua2V5cyhpbnB1dFNjaGVtYS5wcm9wZXJ0aWVzID8/IHt9KS5sZW5ndGgsXG4gICAgICAgIGlucHV0Wm9kLFxuICAgICAgICAuLi4oaW5wdXRab2QgIT09IGZ1bGxJbnB1dFpvZCA/IHsgZnVsbElucHV0Wm9kIH0gOiB7fSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJ1biBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXN5bmMgY3JlYXRlUnVuKHBhcmFtczoge1xuICAgIHVzZXJfcHJvbXB0OiBzdHJpbmc7XG4gICAgc3lzdGVtX3Byb21wdD86IHN0cmluZyB8IG51bGw7XG4gICAgcmVxdWVzdGVkX21vZGVsX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIGVmZm9ydD86IHN0cmluZyB8IG51bGw7XG4gICAgcHJvamVjdF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICBoaXN0b3J5PzogdW5rbm93bjtcbiAgICB0b29scz86IFRvb2xEZWZpbml0aW9ucztcbiAgICBpc19pbWFnZV9nZW5lcmF0aW9uPzogYm9vbGVhbjtcbiAgICBpc19zdHJ1Y3R1cmVkPzogYm9vbGVhbjtcbiAgICBqc29uX3NjaGVtYT86IHN0cmluZyB8IG51bGw7XG4gIH0pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG4gICAgd2RiLnViUmVnaXN0ZXIoXCJyZXF1ZXN0X2xvZ3NcIiwge1xuICAgICAgdXNlcl9wcm9tcHQ6IHBhcmFtcy51c2VyX3Byb21wdCxcbiAgICAgIHN5c3RlbV9wcm9tcHQ6IHBhcmFtcy5zeXN0ZW1fcHJvbXB0ID8/IG51bGwsXG4gICAgICAvLyBwcm92aWRlciDsi6Ttlokg7KCE7J2066+A66GcIHNlcnZpbmcgbW9kZWzsnYAg7JWE7KeBIOyVjCDsiJgg7JeG64ukLlxuICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IHBhcmFtcy5yZXF1ZXN0ZWRfbW9kZWxfbmFtZSA/PyBudWxsLFxuICAgICAgbW9kZWxfbmFtZTogbnVsbCxcbiAgICAgIGVmZm9ydDogcGFyYW1zLmVmZm9ydCA/PyBudWxsLFxuICAgICAgcHJvamVjdF9uYW1lOiBwYXJhbXMucHJvamVjdF9uYW1lID8/IG51bGwsXG4gICAgICBzdGF0dXM6IFwicnVubmluZ1wiLFxuICAgICAgcmVzcG9uc2U6IFwiXCIsXG4gICAgICBpbnB1dF90b2tlbnM6IDAsXG4gICAgICBvdXRwdXRfdG9rZW5zOiAwLFxuICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IDAsXG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IDAsXG4gICAgICBkdXJhdGlvbl9tczogMCxcbiAgICAgIHRvb2xfY2FsbF9jb3VudDogMCxcbiAgICAgIC8vIOydtOuvuOyngCB0dXJuIOyLneuzhChSMTMpLiBydW4g6rK966GcKHRvb2xzK2ltYWdlIOyhsO2VqSnrj4QgYXV0byDqsr3roZzsmYAg64+Z7J287ZWY6rKMIOuniO2CuS5cbiAgICAgIGlzX2ltYWdlX2dlbmVyYXRpb246IHBhcmFtcy5pc19pbWFnZV9nZW5lcmF0aW9uID8/IGZhbHNlLFxuICAgICAganNvbl9zY2hlbWE6IHBhcmFtcy5qc29uX3NjaGVtYSA/PyBudWxsLFxuICAgICAgaXNfc3RydWN0dXJlZDpcbiAgICAgICAgcGFyYW1zLmlzX3N0cnVjdHVyZWQgPz8gKHBhcmFtcy5qc29uX3NjaGVtYSAhPT0gbnVsbCAmJiBwYXJhbXMuanNvbl9zY2hlbWEgIT09IHVuZGVmaW5lZCksXG4gICAgICAuLi4ocGFyYW1zLmhpc3RvcnkgIT09IHVuZGVmaW5lZCA/IHsgaGlzdG9yeTogcGFyYW1zLmhpc3RvcnkgYXMgeyB0eXBlOiBzdHJpbmcgfVtdIH0gOiB7fSksXG4gICAgICAuLi4ocGFyYW1zLnRvb2xzICE9PSB1bmRlZmluZWQgPyB7IHRvb2xzOiBwYXJhbXMudG9vbHMgfSA6IHt9KSxcbiAgICB9KTtcbiAgICByZXR1cm4gd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIGNvbnN0IGlkcyA9IGF3YWl0IHRyeC51YlVwc2VydChcInJlcXVlc3RfbG9nc1wiKTtcbiAgICAgIHJldHVybiBpZHNbMF0hO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgYXBwZW5kU3RlcChyZXF1ZXN0TG9nSWQ6IG51bWJlciwgc3RlcDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG4gICAgd2RiLnViUmVnaXN0ZXIoXCJyZXF1ZXN0X2xvZ19zdGVwc1wiLCB7IHJlcXVlc3RfbG9nX2lkOiByZXF1ZXN0TG9nSWQsIC4uLnN0ZXAgfSk7XG4gICAgcmV0dXJuIHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBjb25zdCBpZHMgPSBhd2FpdCB0cngudWJVcHNlcnQoXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKTtcbiAgICAgIGlmIChzdGVwLnR5cGUgPT09IFwidG9vbF9jYWxsXCIpIHtcbiAgICAgICAgYXdhaXQgdHJ4LmZyb20oXCJyZXF1ZXN0X2xvZ3NcIikud2hlcmUoXCJpZFwiLCByZXF1ZXN0TG9nSWQpLmluY3JlbWVudChcInRvb2xfY2FsbF9jb3VudFwiLCAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpZHNbMF0hO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZmluaXNoUnVuKFxuICAgIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICAgIHBhcmFtczoge1xuICAgICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgICByZXNwb25zZT86IHN0cmluZztcbiAgICAgIHRva2VuX25hbWU/OiBzdHJpbmc7XG4gICAgICBpbnB1dF90b2tlbnM/OiBudW1iZXI7XG4gICAgICBvdXRwdXRfdG9rZW5zPzogbnVtYmVyO1xuICAgICAgY2FjaGVfcmVhZF90b2tlbnM/OiBudW1iZXI7XG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM/OiBudW1iZXI7XG4gICAgICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuICAgICAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcbiAgICAgIGR1cmF0aW9uX21zPzogbnVtYmVyO1xuICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgICAgbW9kZWxfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgICBmYWxsYmFja19jb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgICBjb3N0X3VzZD86IG51bWJlciB8IG51bGw7XG4gICAgICBjb3N0X3NvdXJjZT86IHN0cmluZyB8IG51bGw7XG4gICAgICBoaXN0b3J5PzogdW5rbm93bjtcbiAgICAgIGVycm9yX21lc3NhZ2U/OiBzdHJpbmc7XG4gICAgICB0b29sX2NhbGxfY291bnQ/OiBudW1iZXI7XG4gICAgICBpbWFnZV9jb3N0X3VzZD86IG51bWJlciB8IG51bGw7XG4gICAgICBpbWFnZV9jb3N0X21ldGhvZD86IHN0cmluZyB8IG51bGw7XG4gICAgICBpc19pbWFnZV9nZW5lcmF0aW9uPzogYm9vbGVhbjtcbiAgICAgIHJlc3BvbnNlX2pzb25fb2s/OiBib29sZWFuIHwgbnVsbDtcbiAgICB9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocGFyYW1zLnN0YXR1cyA9PT0gXCJzdWNjZWVkZWRcIiAmJiAhcGFyYW1zLnRva2VuX25hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInRva2VuTmFtZSBpcyByZXF1aXJlZCBmb3Igc3VjY2VlZGVkIHJ1bnNcIik7XG4gICAgfVxuICAgIGNvbnN0IHVwZGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IGlkOiByZXF1ZXN0TG9nSWQsIHN0YXR1czogcGFyYW1zLnN0YXR1cyB9O1xuICAgIGNvbnN0IGZpZWxkcyA9IFtcbiAgICAgIFwicmVzcG9uc2VcIixcbiAgICAgIFwidG9rZW5fbmFtZVwiLFxuICAgICAgXCJpbnB1dF90b2tlbnNcIixcbiAgICAgIFwib3V0cHV0X3Rva2Vuc1wiLFxuICAgICAgXCJjYWNoZV9yZWFkX3Rva2Vuc1wiLFxuICAgICAgXCJjYWNoZV9jcmVhdGlvbl90b2tlbnNcIixcbiAgICAgIFwiY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zXCIsXG4gICAgICBcImNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vuc1wiLFxuICAgICAgXCJkdXJhdGlvbl9tc1wiLFxuICAgICAgXCJyZXF1ZXN0ZWRfbW9kZWxfbmFtZVwiLFxuICAgICAgXCJtb2RlbF9uYW1lXCIsXG4gICAgICBcImZhbGxiYWNrX2NvdW50XCIsXG4gICAgICBcImNvc3RfdXNkXCIsXG4gICAgICBcImNvc3Rfc291cmNlXCIsXG4gICAgICBcImVycm9yX21lc3NhZ2VcIixcbiAgICAgIFwidG9vbF9jYWxsX2NvdW50XCIsXG4gICAgICBcImltYWdlX2Nvc3RfdXNkXCIsXG4gICAgICBcImltYWdlX2Nvc3RfbWV0aG9kXCIsXG4gICAgICBcImlzX2ltYWdlX2dlbmVyYXRpb25cIixcbiAgICAgIFwicmVzcG9uc2VfanNvbl9va1wiLFxuICAgIF0gYXMgY29uc3Q7XG4gICAgZmllbGRzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKHBhcmFtc1trZXldICE9PSB1bmRlZmluZWQpIHVwZGF0ZVtrZXldID0gcGFyYW1zW2tleV07XG4gICAgfSk7XG4gICAgaWYgKHBhcmFtcy5oaXN0b3J5ICE9PSB1bmRlZmluZWQpIHVwZGF0ZS5oaXN0b3J5ID0gcGFyYW1zLmhpc3Rvcnk7XG4gICAgdXBkYXRlLnR0ZnRfbXMgPSAoYXdhaXQgdGhpcy5maXJzdEdlbmVyYXRlU3RlcFR0ZnQocmVxdWVzdExvZ0lkKSkgPz8gMDtcblxuICAgIC8vIOyEnOuyhCBydW4g6rK966Gc64qUIHN0ZXAg7JeQ7IScIO2Zleygle2VnCBleGFjdCBjb3N0IOulvCDrhJjquLTri6QuIOyZuOu2gC9sZWdhY3kgY2FsbGVyIOqwgCDruYTsmqnsnYRcbiAgICAvLyDsg53rnrXtlZwg6rK97Jqw7JeQ66eMIOyggOyepeuQnCDrqqjrjbgrdXNhZ2Ug66GcIOqzhOyCsO2VnOuLpC5cbiAgICBpZiAoXG4gICAgICBwYXJhbXMuY29zdF91c2QgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgcGFyYW1zLmlucHV0X3Rva2VucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBwYXJhbXMub3V0cHV0X3Rva2VucyAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBjb25zdCByb3cgPSBhd2FpdCB0aGlzLmdldFB1cmkoXCJyXCIpXG4gICAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpXG4gICAgICAgIC5zZWxlY3QoeyBtb2RlbF9uYW1lOiBcIm1vZGVsX25hbWVcIiB9KVxuICAgICAgICAud2hlcmUoXCJpZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAgIC5maXJzdCgpO1xuICAgICAgY29uc3QgZWZmZWN0aXZlTW9kZWxOYW1lID0gcGFyYW1zLm1vZGVsX25hbWUgPz8gcm93Py5tb2RlbF9uYW1lO1xuICAgICAgaWYgKGVmZmVjdGl2ZU1vZGVsTmFtZSkge1xuICAgICAgICBjb25zdCBtb2RlbCA9IGNhbm9uaWNhbE1vZGVsTmFtZShlZmZlY3RpdmVNb2RlbE5hbWUpO1xuICAgICAgICBjb25zdCB1c2FnZSA9IG5vcm1hbGl6ZWRVc2FnZUZvckNvc3Qoe1xuICAgICAgICAgIHRva2VuX25hbWU6IHBhcmFtcy50b2tlbl9uYW1lLFxuICAgICAgICAgIG1vZGVsX25hbWU6IGVmZmVjdGl2ZU1vZGVsTmFtZSxcbiAgICAgICAgICBpbnB1dF90b2tlbnM6IHBhcmFtcy5pbnB1dF90b2tlbnMsXG4gICAgICAgICAgb3V0cHV0X3Rva2VuczogcGFyYW1zLm91dHB1dF90b2tlbnMsXG4gICAgICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IHBhcmFtcy5jYWNoZV9yZWFkX3Rva2VucyA/PyAwLFxuICAgICAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogcGFyYW1zLmNhY2hlX2NyZWF0aW9uX3Rva2VucyA/PyAwLFxuICAgICAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogcGFyYW1zLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucyxcbiAgICAgICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IHBhcmFtcy5jYWNoZV9jcmVhdGlvbl8xaF90b2tlbnMsXG4gICAgICAgIH0pO1xuICAgICAgICB1cGRhdGUuY29zdF91c2QgPSBNYXRoLnJvdW5kKFxuICAgICAgICAgIGNhbGN1bGF0ZUNvc3RVc2QobW9kZWwsIHtcbiAgICAgICAgICAgIGlucHV0VG9rZW5zOiB1c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICAgIG91dHB1dFRva2VuczogdXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IHVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMsXG4gICAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bTogdXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW0sXG4gICAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaDogdXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWgsXG4gICAgICAgICAgfSkgKiAxXzAwMF8wMDAsXG4gICAgICAgICk7XG4gICAgICAgIHVwZGF0ZS5jb3N0X3NvdXJjZSA9IFwicHJpY2luZ190YWJsZVwiO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG4gICAgd2RiLnViUmVnaXN0ZXIoXCJyZXF1ZXN0X2xvZ3NcIiwgdXBkYXRlKTtcbiAgICBhd2FpdCB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgYXdhaXQgdHJ4LnViVXBzZXJ0KFwicmVxdWVzdF9sb2dzXCIpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZmlyc3RHZW5lcmF0ZVN0ZXBUdGZ0KHJlcXVlc3RMb2dJZDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiB7XG4gICAgY29uc3Qgcm93ID0gYXdhaXQgdGhpcy5nZXRQdXJpKFwiclwiKVxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgLnNlbGVjdCh7IHR0ZnRfbXM6IFwidHRmdF9tc1wiIH0pXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19pZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAud2hlcmUoXCJ0eXBlXCIsIFwiZ2VuZXJhdGVcIilcbiAgICAgIC53aGVyZShcInR0ZnRfbXNcIiwgXCIhPVwiLCBudWxsKVxuICAgICAgLm9yZGVyQnkoXCJzdGVwX2luZGV4XCIsIFwiYXNjXCIpXG4gICAgICAub3JkZXJCeShcImlkXCIsIFwiYXNjXCIpXG4gICAgICAuZmlyc3QoKTtcbiAgICByZXR1cm4gcm93Py50dGZ0X21zID09PSBudWxsIHx8IHJvdz8udHRmdF9tcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IE51bWJlcihyb3cudHRmdF9tcyk7XG4gIH1cblxuICBhc3luYyBhZ2dyZWdhdGVTdGVwVXNhZ2UocmVxdWVzdExvZ0lkOiBudW1iZXIpOiBQcm9taXNlPFJlcXVlc3RMb2dTdGVwQWdncmVnYXRlPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMuZ2V0UHVyaShcInJcIilcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dfc3RlcHNcIilcbiAgICAgIC5zZWxlY3QoU1RFUF9BR0dSRUdBVEVfU0VMRUNUKVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgLndoZXJlKFwidHlwZVwiLCBcImdlbmVyYXRlXCIpO1xuICAgIHJldHVybiBhZ2dyZWdhdGVHZW5lcmF0ZVN0ZXBSb3dzKHJvd3MgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBzdGFsZSBjYW5kaWRhdGVzLCB0aGVuIGV4cGlyZXMgZWFjaCBydW4gaW4gaXRzIG93biBzaG9ydCB0cmFuc2FjdGlvbi5cbiAgICogVGhlIGNhbmRpZGF0ZSBxdWVyeSBpcyBvbmx5IGEgaGludDsgdGhlIHRyYW5zYWN0aW9uYWwgb3BlcmF0aW9uIHJlY2hlY2tzIGl0XG4gICAqIGFmdGVyIGFjcXVpcmluZyB0aGUgYWR2aXNvcnkgbG9jayBzaGFyZWQgd2l0aCB0b29sIGZvbGxvdy11cHMuXG4gICAqL1xuICBhc3luYyBleHBpcmVTdGFsZVRvb2xXYWl0aW5nUnVucyhcbiAgICB0aHJlc2hvbGRNczogbnVtYmVyLFxuICAgIGVycm9yTWVzc2FnZTogc3RyaW5nLFxuICAgIGxpbWl0OiBudW1iZXIgPSAxMCxcbiAgKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IG5ldyBEYXRlKERhdGUubm93KCkgLSB0aHJlc2hvbGRNcyk7XG4gICAgY29uc3QgY2FuZGlkYXRlSWRzID0gYXdhaXQgdGhpcy5maW5kU3RhbGVUb29sV2FpdGluZ1J1bkNhbmRpZGF0ZXModGhyZXNob2xkLCBsaW1pdCk7XG4gICAgY29uc3QgZXhwaXJlZElkczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJlcXVlc3RMb2dJZCBvZiBjYW5kaWRhdGVJZHMpIHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLnRyeUV4cGlyZVN0YWxlVG9vbFdhaXRpbmdSdW4ocmVxdWVzdExvZ0lkLCB0aHJlc2hvbGQsIGVycm9yTWVzc2FnZSkpIHtcbiAgICAgICAgZXhwaXJlZElkcy5wdXNoKHJlcXVlc3RMb2dJZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBleHBpcmVkSWRzO1xuICB9XG5cbiAgYXN5bmMgZmluZFN0YWxlVG9vbFdhaXRpbmdSdW5DYW5kaWRhdGVzKHRocmVzaG9sZDogRGF0ZSwgbGltaXQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5nZXRQdXJpKFwid1wiKVxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ3NcIilcbiAgICAgIC5qb2luKFwicmVxdWVzdF9sb2dfc3RlcHNcIiwgXCJyZXF1ZXN0X2xvZ3MuaWRcIiwgXCJyZXF1ZXN0X2xvZ19zdGVwcy5yZXF1ZXN0X2xvZ19pZFwiKVxuICAgICAgLmRpc3RpbmN0KFwicmVxdWVzdF9sb2dzLmlkXCIpXG4gICAgICAuc2VsZWN0KHsgaWQ6IFwicmVxdWVzdF9sb2dzLmlkXCIgfSlcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9ncy5zdGF0dXNcIiwgXCJydW5uaW5nXCIpXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19zdGVwcy50eXBlXCIsIFwidG9vbF9jYWxsXCIpXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19zdGVwcy5jcmVhdGVkX2F0XCIsIFwiPFwiLCB0aHJlc2hvbGQpXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19zdGVwcy50b29sX3Jlc3VsdFwiLCBudWxsKVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfc3RlcHMuZXJyb3JcIiwgbnVsbClcbiAgICAgIC5saW1pdChsaW1pdCk7XG4gICAgcmV0dXJuIHJvd3MubWFwKCh7IGlkIH0pID0+IGlkKTtcbiAgfVxuXG4gIEB0cmFuc2FjdGlvbmFsKHsgZGJQcmVzZXQ6IFwid1wiIH0pXG4gIGFzeW5jIHRyeUV4cGlyZVN0YWxlVG9vbFdhaXRpbmdSdW4oXG4gICAgcmVxdWVzdExvZ0lkOiBudW1iZXIsXG4gICAgdGhyZXNob2xkOiBEYXRlLFxuICAgIGVycm9yTWVzc2FnZTogc3RyaW5nLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIGNvbnN0IGxvY2tSZXN1bHQgPSAoYXdhaXQgd2RiLmtuZXgucmF3KFwiU0VMRUNUIHBnX3RyeV9hZHZpc29yeV94YWN0X2xvY2soPywgPykgQVMgYWNxdWlyZWRcIiwgW1xuICAgICAgUkVRVUVTVF9MT0dfUlVOX0xPQ0tfQ0xBU1NfSUQsXG4gICAgICByZXF1ZXN0TG9nSWQsXG4gICAgXSkpIGFzIHsgcm93cz86IEFycmF5PHsgYWNxdWlyZWQ/OiBib29sZWFuIH0+IH07XG4gICAgaWYgKGxvY2tSZXN1bHQucm93cz8uWzBdPy5hY3F1aXJlZCAhPT0gdHJ1ZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gVGhlIGZvbGxvdy11cCBwYXRoIHVzZXMgdGhlIHNhbWUgd3JpdGVyIHRyYW5zYWN0aW9uIGxvY2suIFJlY2hlY2sgYWZ0ZXJcbiAgICAvLyBsb2NraW5nIHNvIGEgcmVzdWx0IGNvbW1pdHRlZCBkdXJpbmcgY2FuZGlkYXRlIGRpc2NvdmVyeSBtYWtlcyB0aGlzIGEgbm8tb3AuXG4gICAgY29uc3QgdW5yZXNvbHZlZCA9IGF3YWl0IHdkYlxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgLnNlbGVjdCh7IGlkOiBcImlkXCIgfSlcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX2lkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgIC53aGVyZShcInR5cGVcIiwgXCJ0b29sX2NhbGxcIilcbiAgICAgIC53aGVyZShcImNyZWF0ZWRfYXRcIiwgXCI8XCIsIHRocmVzaG9sZClcbiAgICAgIC53aGVyZShcInRvb2xfcmVzdWx0XCIsIG51bGwpXG4gICAgICAud2hlcmUoXCJlcnJvclwiLCBudWxsKVxuICAgICAgLmZpcnN0KCk7XG4gICAgaWYgKCF1bnJlc29sdmVkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBzdGVwUm93cyA9IGF3YWl0IHdkYlxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgLnNlbGVjdChTVEVQX0FHR1JFR0FURV9TRUxFQ1QpXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19pZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAud2hlcmUoXCJ0eXBlXCIsIFwiZ2VuZXJhdGVcIik7XG4gICAgY29uc3QgYWdncmVnYXRlID0gYWdncmVnYXRlR2VuZXJhdGVTdGVwUm93cyhzdGVwUm93cyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pO1xuICAgIGNvbnN0IGZpcnN0VHRmdCA9IGF3YWl0IHdkYlxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgLnNlbGVjdCh7IHR0ZnRfbXM6IFwidHRmdF9tc1wiIH0pXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19pZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAud2hlcmUoXCJ0eXBlXCIsIFwiZ2VuZXJhdGVcIilcbiAgICAgIC53aGVyZShcInR0ZnRfbXNcIiwgXCIhPVwiLCBudWxsKVxuICAgICAgLm9yZGVyQnkoXCJzdGVwX2luZGV4XCIsIFwiYXNjXCIpXG4gICAgICAub3JkZXJCeShcImlkXCIsIFwiYXNjXCIpXG4gICAgICAuZmlyc3QoKTtcblxuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB3ZGJcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpXG4gICAgICAud2hlcmUoXCJpZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAud2hlcmUoXCJzdGF0dXNcIiwgXCJydW5uaW5nXCIpXG4gICAgICAudXBkYXRlKHtcbiAgICAgICAgc3RhdHVzOiBcImVycm9yXCIsXG4gICAgICAgIGVycm9yX21lc3NhZ2U6IGVycm9yTWVzc2FnZSxcbiAgICAgICAgaW5wdXRfdG9rZW5zOiBhZ2dyZWdhdGUuaW5wdXRfdG9rZW5zLFxuICAgICAgICBvdXRwdXRfdG9rZW5zOiBhZ2dyZWdhdGUub3V0cHV0X3Rva2VucyxcbiAgICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IGFnZ3JlZ2F0ZS5jYWNoZV9yZWFkX3Rva2VucyxcbiAgICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fdG9rZW5zLFxuICAgICAgICAuLi4oYWdncmVnYXRlLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB7IGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogYWdncmVnYXRlLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucyB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC4uLihhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHsgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zOiBhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgZHVyYXRpb25fbXM6IGFnZ3JlZ2F0ZS5kdXJhdGlvbl9tcyxcbiAgICAgICAgZmFsbGJhY2tfY291bnQ6IGFnZ3JlZ2F0ZS5mYWxsYmFja19jb3VudCxcbiAgICAgICAgY29zdF91c2Q6IGFnZ3JlZ2F0ZS5jb3N0X3VzZCxcbiAgICAgICAgLi4uKGFnZ3JlZ2F0ZS5jb3N0X3NvdXJjZSAhPT0gdW5kZWZpbmVkID8geyBjb3N0X3NvdXJjZTogYWdncmVnYXRlLmNvc3Rfc291cmNlIH0gOiB7fSksXG4gICAgICAgIHR0ZnRfbXM6XG4gICAgICAgICAgZmlyc3RUdGZ0Py50dGZ0X21zID09PSBudWxsIHx8IGZpcnN0VHRmdD8udHRmdF9tcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IDBcbiAgICAgICAgICAgIDogTnVtYmVyKGZpcnN0VHRmdC50dGZ0X21zKSxcbiAgICAgIH0pO1xuICAgIHJldHVybiB1cGRhdGVkID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGEgbmF0aXZlIHFncmlkIHRvb2wgZm9sbG93LXVwIGFuZCBjb21wdXRlcyBpdHMgbmV4dCBzdGVwIGluZGV4IHdoaWxlXG4gICAqIGhvbGRpbmcgdGhlIHBlci1ydW4gYWR2aXNvcnkgbG9jayBzaGFyZWQgd2l0aCBzdGFsZSBjbGVhbnVwLlxuICAgKi9cbiAgQHRyYW5zYWN0aW9uYWwoeyBkYlByZXNldDogXCJ3XCIgfSlcbiAgYXN5bmMgY29udGludWVUb29sUnVuKFxuICAgIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICAgIHRvb2xSZXN1bHRzOiBUb29sUmVzdWx0Q29udGludWF0aW9uW10sXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICBhd2FpdCB3ZGIua25leC5yYXcoXCJTRUxFQ1QgcGdfYWR2aXNvcnlfeGFjdF9sb2NrKD8sID8pXCIsIFtcbiAgICAgIFJFUVVFU1RfTE9HX1JVTl9MT0NLX0NMQVNTX0lELFxuICAgICAgcmVxdWVzdExvZ0lkLFxuICAgIF0pO1xuXG4gICAgY29uc3QgcnVuID0gYXdhaXQgd2RiXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nc1wiKVxuICAgICAgLnNlbGVjdCh7IHN0YXR1czogXCJzdGF0dXNcIiB9KVxuICAgICAgLndoZXJlKFwiaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgLmZpcnN0KCk7XG4gICAgaWYgKCFydW4pIHRocm93IG5ldyBFcnJvcihgcmVxdWVzdCBsb2cgcnVuICR7cmVxdWVzdExvZ0lkfSBub3QgZm91bmRgKTtcbiAgICBpZiAocnVuLnN0YXR1cyAhPT0gXCJydW5uaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcmVxdWVzdCBsb2cgcnVuICR7cmVxdWVzdExvZ0lkfSBpcyBhbHJlYWR5ICR7cnVuLnN0YXR1c31gKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiB0b29sUmVzdWx0cykge1xuICAgICAgYXdhaXQgd2RiXG4gICAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dfc3RlcHNcIilcbiAgICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgICAud2hlcmUoXCJ0b29sX2NhbGxfaWRcIiwgcmVzdWx0LnRvb2xDYWxsSWQpXG4gICAgICAgIC53aGVyZShcInR5cGVcIiwgXCJ0b29sX2NhbGxcIilcbiAgICAgICAgLnVwZGF0ZShyZXN1bHQuaXNFcnJvciA/IHsgZXJyb3I6IHJlc3VsdC5vdXRwdXQgfSA6IHsgdG9vbF9yZXN1bHQ6IHJlc3VsdC5vdXRwdXQgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgcm93ID0gYXdhaXQgd2RiXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nX3N0ZXBzXCIpXG4gICAgICAuc2VsZWN0KHsgbWF4X3N0ZXA6IFB1cmkubWF4KFwic3RlcF9pbmRleFwiKSB9KVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgLmZpcnN0KCk7XG4gICAgcmV0dXJuIChyb3c/Lm1heF9zdGVwID8/IC0xKSArIDE7XG4gIH1cblxuICAvKipcbiAgICog7ZmU66m0IO2RnOyLnOyaqSDstJ0g67mE7JqpLiDrqqnroZ3qs7wg6rCZ7J2AIO2VhO2EsOulvCDsoIHsmqntlZzri6QuXG4gICAqXG4gICAqIGRyaXZlcuyZgCBpbWFnZSDruYTsmqnsnYQg7ZWo6ruYIFNVTe2VnCDrkqQsIGxlZ2FjeSBkcml2ZXIg67mE7Jqp7J2YIOywqOyVoeunjCDrs7TsoJXtlZzri6QuXG4gICAqIOydtOuvuOyngCDruYTsmqnsnYAg7KCA7J6l6rCS7J2EIO2VnCDrsojrp4wg7Y+s7ZWo7ZWY6rOgIOqwgOqyqe2RnCDsnqzqs4TsgrAg64yA7IOB7JeQ7IScIOygnOyZuO2VnOuLpC5cbiAgICpcbiAgICogbGVnYWN5IOuztOygleydhCDrgqjqsqjrkZQg7J207JygOiDrsLHtlYTroZwg6riw7KG0IGxlZ2FjeSDripQgMCDsnbQg65CY7JeI7KeA66eMLCDsmbjrtoAg66Gc6rGw6rCAXG4gICAqIGBBcHBlbmRTdGVwSW5wdXRgL2BGaW5pc2hSdW5JbnB1dGAg7Jy866GcIGNvc3RTb3VyY2Ug7JeG7J20IOuEo+ycvOuptCDri6Tsi5wg7IOd6ri4IOyImCDsnojri6QuXG4gICAqIOq3uOufsCByb3cg64qUIOyggOyepeqwkiDrjIDsi6Ag7ZiE7J6sIOqwgOqyqe2RnCDsnqzqs4TsgrDqsJLsnbQg66ee7Jy866+A66GcIOywqOyVoeydhCDrjZTtlZzri6QuXG4gICAqXG4gICAqIO2VhO2EsCDsobDqsbTsnYQg7Jes6riw7IScIOuLpOyLnCDqtaztmITtlZjsp4Ag7JWK6rOgIGBhcHBseUxpc3RGaWx0ZXJzYCDrpbwg6rO17Jyg7ZWY64qUIOqyg+ydtCDtlbXsi6zsnbTri6Qg4oCUXG4gICAqIOuRkCDsv7zrpqzqsIAg6rCB7J6QIO2VhO2EsOulvCDqsIDsp4DrqbQg7ZmU66m07JeQ7IScIO2VhO2EsOulvCDqsbjsl4jsnYQg65WMIO2WiSDsiJjsmYAg67mE7Jqp7J20IOyhsOyaqe2eiCDslrTquIvrgpzri6QuXG4gICAqL1xuICBhc3luYyB0b3RhbENvc3QocmF3UGFyYW1zOiBSZXF1ZXN0TG9nTGlzdFBhcmFtcyA9IHsgbnVtOiAwLCBwYWdlOiAxIH0pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG51bTogMCxcbiAgICAgIHBhZ2U6IDEsXG4gICAgICBzZWFyY2g6IFwiaWRcIiBhcyBjb25zdCxcbiAgICAgIC4uLnJhd1BhcmFtcyxcbiAgICB9IHNhdGlzZmllcyBSZXF1ZXN0TG9nTGlzdFBhcmFtcztcblxuICAgIGNvbnN0IHsgcWI6IHRvdGFsUWIgfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhcIkNcIik7XG4gICAgdGhpcy5hcHBseUxpc3RGaWx0ZXJzKHRvdGFsUWIsIHBhcmFtcyk7XG4gICAgY29uc3Qgc29uYW11RmlsdGVyID0gcGFyYW1zLnNvbmFtdUZpbHRlclxuICAgICAgPyBub3JtYWxpemVGaWx0ZXJRdWVyeShwYXJhbXMuc29uYW11RmlsdGVyKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5hcHBseVNvbmFtdUZpbHRlcnModG90YWxRYiwgc29uYW11RmlsdGVyKTtcbiAgICAvLyBzdWJzZXQgcWIg64qUIOy7rOufvCDrqqnroZ3snbQg7J2066+4IFNFTEVDVCDsl5Ag67CV7ZiAIOyeiOyWtCDsp5Hqs4Trpbwg7Ja57Jy866m0IEdST1VQIEJZIOyXkOufrOqwgCDrgpzri6QuXG4gICAgLy8gZXhlY3V0ZUNvdW50UXVlcnkg7JmAIOqwmeydgCDrsKnsi53snLzroZwgc2VsZWN0IOulvCDruYTsmrDqs6Ag7KeR6rOE66eMIOuCqOq4tOuLpC5cbiAgICBjb25zdCBzdG9yZWQgPSBhd2FpdCB0b3RhbFFiXG4gICAgICAuY2xlYXIoXCJzZWxlY3RcIilcbiAgICAgIC8vIOydjOyImCDsoIDsnqXqsJIo6rO86rGwIOuyhOq3uCnsnYAgMCDsnLzroZwg64iM65+s7IScIOuNlO2VnOuLpCDigJQgSlMg7Kq9IE1hdGgubWF4IOyZgCDqsJnsnYAg6rec7LmZLlxuICAgICAgLnNlbGVjdCh7XG4gICAgICAgIHRvdGFsOiBQdXJpLnJhd051bWJlcihcbiAgICAgICAgICBcIkNPQUxFU0NFKFNVTShHUkVBVEVTVChyZXF1ZXN0X2xvZ3MuY29zdF91c2QsIDApICsgQ09BTEVTQ0UocmVxdWVzdF9sb2dzLmltYWdlX2Nvc3RfdXNkLCAwKSksIDApXCIsXG4gICAgICAgICksXG4gICAgICB9KVxuICAgICAgLmZpcnN0KCk7XG5cbiAgICBjb25zdCB7IHFiOiBsZWdhY3lRYiB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKFwiQ1wiKTtcbiAgICB0aGlzLmFwcGx5TGlzdEZpbHRlcnMobGVnYWN5UWIsIHBhcmFtcyk7XG4gICAgdGhpcy5hcHBseVNvbmFtdUZpbHRlcnMobGVnYWN5UWIsIHNvbmFtdUZpbHRlcik7XG4gICAgY29uc3QgbGVnYWN5Um93cyA9IGF3YWl0IGxlZ2FjeVFiXG4gICAgICAud2hlcmVSYXcoXCJyZXF1ZXN0X2xvZ3MuY29zdF9zb3VyY2UgSVMgTlVMTCBPUiByZXF1ZXN0X2xvZ3MuY29zdF91c2QgSVMgTlVMTFwiKVxuICAgICAgLmNsZWFyKFwic2VsZWN0XCIpXG4gICAgICAuc2VsZWN0KHtcbiAgICAgICAgdG9rZW5fbmFtZTogXCJyZXF1ZXN0X2xvZ3MudG9rZW5fbmFtZVwiLFxuICAgICAgICBtb2RlbF9uYW1lOiBcInJlcXVlc3RfbG9ncy5tb2RlbF9uYW1lXCIsXG4gICAgICAgIGlucHV0X3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuaW5wdXRfdG9rZW5zXCIsXG4gICAgICAgIG91dHB1dF90b2tlbnM6IFwicmVxdWVzdF9sb2dzLm91dHB1dF90b2tlbnNcIixcbiAgICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmNhY2hlX3JlYWRfdG9rZW5zXCIsXG4gICAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuY2FjaGVfY3JlYXRpb25fdG9rZW5zXCIsXG4gICAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zXCIsXG4gICAgICAgIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zXCIsXG4gICAgICAgIGNvc3RfdXNkOiBcInJlcXVlc3RfbG9ncy5jb3N0X3VzZFwiLFxuICAgICAgfSk7XG5cbiAgICBjb25zdCBzdG9yZWRUb3RhbCA9IE51bWJlcihzdG9yZWQ/LnRvdGFsID8/IDApIC8gTUlDUk9fVVNEO1xuXG4gICAgLy8gbGVnYWN5IHJvdyDripQg7JyEIFNVTSDsl5Ag7KCA7J6l6rCS7Jy866GcIOydtOuvuCDtj6ztlajrkJjslrQg7J6I64ukLiDsnqzqs4TsgrDqsJLqs7zsnZgg7LCo7JWh66eMIOuNlO2VnOuLpC5cbiAgICByZXR1cm4gbGVnYWN5Um93cy5yZWR1Y2UoKHN1bSwgcm93KSA9PiB7XG4gICAgICBjb25zdCBhbHJlYWR5U3VtbWVkID0gTWF0aC5tYXgocm93LmNvc3RfdXNkID8/IDAsIDApIC8gTUlDUk9fVVNEO1xuICAgICAgY29uc3QgdXNhZ2UgPSBub3JtYWxpemVkVXNhZ2VGb3JDb3N0KHJvdyk7XG4gICAgICBpZiAoIXVzYWdlLm1vZGVsKSByZXR1cm4gc3VtO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgc3VtICtcbiAgICAgICAgY2FsY3VsYXRlQ29zdFVzZCh1c2FnZS5tb2RlbCwge1xuICAgICAgICAgIGlucHV0VG9rZW5zOiB1c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICBvdXRwdXRUb2tlbnM6IHVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogdXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMsXG4gICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW06IHVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtLFxuICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoOiB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaCxcbiAgICAgICAgfSkgLVxuICAgICAgICBhbHJlYWR5U3VtbWVkXG4gICAgICApO1xuICAgIH0sIHN0b3JlZFRvdGFsKTtcbiAgfVxuXG4gIGFzeW5jIGRpc3RpbmN0UHJvamVjdE5hbWVzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5nZXRQdXJpKFwiclwiKVxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ3NcIilcbiAgICAgIC5kaXN0aW5jdChcInByb2plY3RfbmFtZVwiKVxuICAgICAgLndoZXJlKFwicHJvamVjdF9uYW1lXCIsIFwiIT1cIiwgbnVsbClcbiAgICAgIC5vcmRlckJ5KFwicHJvamVjdF9uYW1lXCIsIFwiYXNjXCIpXG4gICAgICAuc2VsZWN0KHtcbiAgICAgICAgcHJvamVjdF9uYW1lOiBcInByb2plY3RfbmFtZVwiLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHJvd3MubWFwKChyKSA9PiByLnByb2plY3RfbmFtZSEpO1xuICB9XG5cbiAgYXN5bmMgZGlzdGluY3RNb2RlbE5hbWVzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5nZXRQdXJpKFwiclwiKVxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ3NcIilcbiAgICAgIC5kaXN0aW5jdChcIm1vZGVsX25hbWVcIilcbiAgICAgIC53aGVyZShcIm1vZGVsX25hbWVcIiwgXCIhPVwiLCBudWxsKVxuICAgICAgLm9yZGVyQnkoXCJtb2RlbF9uYW1lXCIsIFwiYXNjXCIpXG4gICAgICAuc2VsZWN0KHtcbiAgICAgICAgbW9kZWxfbmFtZTogXCJtb2RlbF9uYW1lXCIsXG4gICAgICB9KTtcbiAgICByZXR1cm4gcm93cy5tYXAoKHIpID0+IHIubW9kZWxfbmFtZSEpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIGRlbChpZHM6IG51bWJlcltdKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuXG4gICAgLy8gdHJhbnNhY3Rpb25cbiAgICBhd2FpdCB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgYXdhaXQgdHJ4XG4gICAgICAgIC50YWJsZShcInJlcXVlc3RfbG9nX3N0ZXBzXCIpXG4gICAgICAgIC53aGVyZUluKFwicmVxdWVzdF9sb2dfc3RlcHMucmVxdWVzdF9sb2dfaWRcIiwgaWRzKVxuICAgICAgICAuZGVsZXRlKCk7XG4gICAgICByZXR1cm4gdHJ4LnRhYmxlKFwicmVxdWVzdF9sb2dzXCIpLndoZXJlSW4oXCJyZXF1ZXN0X2xvZ3MuaWRcIiwgaWRzKS5kZWxldGUoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBpZHMubGVuZ3RoO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBSZXF1ZXN0TG9nTW9kZWwgPSBuZXcgUmVxdWVzdExvZ01vZGVsQ2xhc3MoKTtcbiJd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
@@ -2,37 +2,11 @@ import { SD } from "../../i18n/sd.generated.js";
2
2
  import { settingLoaderQueries, settingSubsetQueries } from "../sonamu.generated.sso.js";
3
3
  import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorateMetadata.js";
4
4
  import __decorate from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorate.js";
5
- import { detectSupervisor } from "../../utils/process-supervisor.js";
6
- import { armServerRestartExit, beginServerRestart } from "../../utils/server-restart.js";
7
5
  import { SETTING_DEFS, TOKEN_WINDOW_KEEPALIVE_RUNNER_ENV_KEY, findSettingDef, maskSecret, validateSettingValue } from "./setting.constant.js";
8
6
  import { getSetting, isStored, resetSetting, saveSetting } from "./setting.store.js";
9
7
  import { SlackNotificationError } from "../../utils/slack-notify.js";
10
- import { BadRequestException, BaseModelClass, NotFoundException, SoException, Sonamu, api, asArray, exhaustive } from "sonamu";
11
- import { getLogger } from "@logtape/logtape";
8
+ import { BadRequestException, BaseModelClass, NotFoundException, api, asArray, exhaustive } from "sonamu";
12
9
  //#region src/application/setting/setting.model.ts
13
- const logger = getLogger(["qgrid", "setting"]);
14
- var ForbiddenException = class extends SoException {
15
- constructor() {
16
- super(403, SD("error.forbidden"));
17
- }
18
- };
19
- function firstHeaderValue(value) {
20
- return (Array.isArray(value) ? value[0] : value)?.split(",")[0]?.trim();
21
- }
22
- /** Origin 없는 운영 CLI 요청은 통과시키되, 브라우저 교차 출처 POST 는 막는다. */
23
- function assertRestartOrigin() {
24
- const { headers } = Sonamu.getContext();
25
- const origin = firstHeaderValue(headers.origin);
26
- if (headers.origin === void 0) return;
27
- if (!origin) throw new ForbiddenException();
28
- const host = firstHeaderValue(headers["x-forwarded-host"]) ?? firstHeaderValue(headers.host);
29
- try {
30
- if (!host || new URL(origin).host !== host) throw new ForbiddenException();
31
- } catch (error) {
32
- if (error instanceof ForbiddenException) throw error;
33
- throw new ForbiddenException();
34
- }
35
- }
36
10
  var SettingModelClass = class extends BaseModelClass {
37
11
  constructor() {
38
12
  super("Setting", settingSubsetQueries, settingLoaderQueries);
@@ -139,7 +113,6 @@ var SettingModelClass = class extends BaseModelClass {
139
113
  };
140
114
  }),
141
115
  runtime: this.runtimeInfo(),
142
- supervisor: detectSupervisor(),
143
116
  keepaliveRunnerEnabled: process.env[TOKEN_WINDOW_KEEPALIVE_RUNNER_ENV_KEY] === "true"
144
117
  };
145
118
  }
@@ -209,32 +182,6 @@ var SettingModelClass = class extends BaseModelClass {
209
182
  throw error;
210
183
  }
211
184
  }
212
- /**
213
- * 서버를 재시작한다 — 정확히는 스스로 종료하고, pm2 가 다시 띄우는 것에 맡긴다.
214
- *
215
- * `restart` 로 표시된 워커 설정은 dispatcher 생성자에서 한 번만 읽히므로 이 경로 말고는
216
- * 반영할 방법이 없었다. 지금까지는 SSH 로 `pm2 restart` 를 쳐야 했다.
217
- *
218
- * 부수 효과가 하나 더 있다: pm2 는 `ecosystem.config.cjs` 의 원래 명령으로 다시 띄우고,
219
- * 그 명령에 `--skip-update` 가 없으면 CLI 가 npm 최신 버전을 받아 올린다. 즉 재시작은
220
- * 배포이기도 하다 — 화면 문구가 이 사실을 함께 알린다.
221
- */
222
- async restartServer() {
223
- assertRestartOrigin();
224
- const supervisor = detectSupervisor();
225
- if (!supervisor) throw new BadRequestException(SD("setting.noSupervisor")());
226
- const { reply } = Sonamu.getContext();
227
- if (beginServerRestart()) {
228
- logger.warn(`restart requested via dashboard, exiting for ${supervisor} to respawn`);
229
- try {
230
- const { finishActiveNativeRunsForRestart } = await import("../qgrid/qgrid-run-lifecycle.js");
231
- await finishActiveNativeRunsForRestart();
232
- } finally {
233
- armServerRestartExit(reply.raw);
234
- }
235
- }
236
- return { supervisor };
237
- }
238
185
  };
239
186
  __decorate([
240
187
  api({
@@ -293,17 +240,8 @@ __decorate([
293
240
  __decorateMetadata("design:paramtypes", []),
294
241
  __decorateMetadata("design:returntype", Promise)
295
242
  ], SettingModelClass.prototype, "triggerExpiryReminder", null);
296
- __decorate([
297
- api({
298
- httpMethod: "POST",
299
- clients: ["axios", "tanstack-mutation"]
300
- }),
301
- __decorateMetadata("design:type", Function),
302
- __decorateMetadata("design:paramtypes", []),
303
- __decorateMetadata("design:returntype", Promise)
304
- ], SettingModelClass.prototype, "restartServer", null);
305
243
  const SettingModel = new SettingModelClass();
306
244
  //#endregion
307
245
  export { SettingModel };
308
246
 
309
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZy5tb2RlbC5qcyIsIm5hbWVzIjpbInNhdmVTdG9yZWRTZXR0aW5nIiwicmVzZXRTdG9yZWRTZXR0aW5nIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3NldHRpbmcvc2V0dGluZy5tb2RlbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHtcbiAgQmFzZU1vZGVsQ2xhc3MsXG4gIHR5cGUgTGlzdFJlc3VsdCxcbiAgYXNBcnJheSxcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIEJhZFJlcXVlc3RFeGNlcHRpb24sXG4gIFNvRXhjZXB0aW9uLFxuICBTb25hbXUsXG4gIGFwaSxcbiAgZXhoYXVzdGl2ZSxcbn0gZnJvbSBcInNvbmFtdVwiO1xuXG5pbXBvcnQgeyBTRCwgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IGRldGVjdFN1cGVydmlzb3IgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvY2Vzcy1zdXBlcnZpc29yXCI7XG5pbXBvcnQgeyBhcm1TZXJ2ZXJSZXN0YXJ0RXhpdCwgYmVnaW5TZXJ2ZXJSZXN0YXJ0IH0gZnJvbSBcIi4uLy4uL3V0aWxzL3NlcnZlci1yZXN0YXJ0XCI7XG5pbXBvcnQgeyBTbGFja05vdGlmaWNhdGlvbkVycm9yIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3NsYWNrLW5vdGlmeVwiO1xuaW1wb3J0IHsgdHlwZSBTZXR0aW5nU3Vic2V0S2V5LCB0eXBlIFNldHRpbmdTdWJzZXRNYXBwaW5nIH0gZnJvbSBcIi4uL3NvbmFtdS5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IHNldHRpbmdTdWJzZXRRdWVyaWVzLCBzZXR0aW5nTG9hZGVyUXVlcmllcyB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkLnNzb1wiO1xuaW1wb3J0IHtcbiAgZmluZFNldHRpbmdEZWYsXG4gIG1hc2tTZWNyZXQsXG4gIFNFVFRJTkdfREVGUyxcbiAgVE9LRU5fV0lORE9XX0tFRVBBTElWRV9SVU5ORVJfRU5WX0tFWSxcbiAgdmFsaWRhdGVTZXR0aW5nVmFsdWUsXG59IGZyb20gXCIuL3NldHRpbmcuY29uc3RhbnRcIjtcbmltcG9ydCB7XG4gIGdldFNldHRpbmcsXG4gIGlzU3RvcmVkLFxuICByZXNldFNldHRpbmcgYXMgcmVzZXRTdG9yZWRTZXR0aW5nLFxuICBzYXZlU2V0dGluZyBhcyBzYXZlU3RvcmVkU2V0dGluZyxcbn0gZnJvbSBcIi4vc2V0dGluZy5zdG9yZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBSdW50aW1lSW5mb0l0ZW0sXG4gIHR5cGUgU2V0dGluZ0FwcGxpZXMsXG4gIHR5cGUgU2V0dGluZ0l0ZW0sXG4gIHR5cGUgU2V0dGluZ0xpc3RQYXJhbXMsXG4gIHR5cGUgU2V0dGluZ1NhdmVQYXJhbXMsXG4gIHR5cGUgU2V0dGluZ3NSZXNwb25zZSxcbiAgdHlwZSBTdXBlcnZpc29yS2luZCxcbn0gZnJvbSBcIi4vc2V0dGluZy50eXBlc1wiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJzZXR0aW5nXCJdKTtcblxuY2xhc3MgRm9yYmlkZGVuRXhjZXB0aW9uIGV4dGVuZHMgU29FeGNlcHRpb24ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcig0MDMsIFNEKFwiZXJyb3IuZm9yYmlkZGVuXCIpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaXJzdEhlYWRlclZhbHVlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZVswXSA6IHZhbHVlKT8uc3BsaXQoXCIsXCIpWzBdPy50cmltKCk7XG59XG5cbi8qKiBPcmlnaW4g7JeG64qUIOyatOyYgSBDTEkg7JqU7LKt7J2AIO2GteqzvOyLnO2CpOuQmCwg67iM65287Jqw7KCAIOq1kOywqCDstpzsspggUE9TVCDripQg66eJ64qU64ukLiAqL1xuZnVuY3Rpb24gYXNzZXJ0UmVzdGFydE9yaWdpbigpOiB2b2lkIHtcbiAgY29uc3QgeyBoZWFkZXJzIH0gPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICBjb25zdCBvcmlnaW4gPSBmaXJzdEhlYWRlclZhbHVlKGhlYWRlcnMub3JpZ2luKTtcbiAgaWYgKGhlYWRlcnMub3JpZ2luID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgaWYgKCFvcmlnaW4pIHRocm93IG5ldyBGb3JiaWRkZW5FeGNlcHRpb24oKTtcblxuICBjb25zdCBob3N0ID0gZmlyc3RIZWFkZXJWYWx1ZShoZWFkZXJzW1wieC1mb3J3YXJkZWQtaG9zdFwiXSkgPz8gZmlyc3RIZWFkZXJWYWx1ZShoZWFkZXJzLmhvc3QpO1xuICB0cnkge1xuICAgIGlmICghaG9zdCB8fCBuZXcgVVJMKG9yaWdpbikuaG9zdCAhPT0gaG9zdCkgdGhyb3cgbmV3IEZvcmJpZGRlbkV4Y2VwdGlvbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkV4Y2VwdGlvbikgdGhyb3cgZXJyb3I7XG4gICAgdGhyb3cgbmV3IEZvcmJpZGRlbkV4Y2VwdGlvbigpO1xuICB9XG59XG5cbi8qXG4gIFNldHRpbmcgTW9kZWxcbiovXG5jbGFzcyBTZXR0aW5nTW9kZWxDbGFzcyBleHRlbmRzIEJhc2VNb2RlbENsYXNzPFxuICBTZXR0aW5nU3Vic2V0S2V5LFxuICBTZXR0aW5nU3Vic2V0TWFwcGluZyxcbiAgdHlwZW9mIHNldHRpbmdTdWJzZXRRdWVyaWVzLFxuICB0eXBlb2Ygc2V0dGluZ0xvYWRlclF1ZXJpZXNcbj4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlNldHRpbmdcIiwgc2V0dGluZ1N1YnNldFF1ZXJpZXMsIHNldHRpbmdMb2FkZXJRdWVyaWVzKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdLCByZXNvdXJjZU5hbWU6IFwiU2V0dGluZ1wiIH0pXG4gIGFzeW5jIGZpbmRCeUlkPFQgZXh0ZW5kcyBTZXR0aW5nU3Vic2V0S2V5PihcbiAgICBzdWJzZXQ6IFQsXG4gICAgaWQ6IG51bWJlcixcbiAgKTogUHJvbWlzZTxTZXR0aW5nU3Vic2V0TWFwcGluZ1tUXT4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgdGhpcy5maW5kTWFueShzdWJzZXQsIHtcbiAgICAgIGlkLFxuICAgICAgbnVtOiAxLFxuICAgICAgcGFnZTogMSxcbiAgICAgIHF1ZXJ5TW9kZTogXCJsaXN0XCIsXG4gICAgfSk7XG4gICAgaWYgKCFyb3dzWzBdKSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5lbnRpdHlOb3RGb3VuZFwiKShcIlNldHRpbmdcIiwgaWQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm93c1swXTtcbiAgfVxuXG4gIGFzeW5jIGZpbmRPbmU8VCBleHRlbmRzIFNldHRpbmdTdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBsaXN0UGFyYW1zOiBTZXR0aW5nTGlzdFBhcmFtcyxcbiAgKTogUHJvbWlzZTxTZXR0aW5nU3Vic2V0TWFwcGluZ1tUXSB8IG51bGw+IHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHRoaXMuZmluZE1hbnkoc3Vic2V0LCB7XG4gICAgICAuLi5saXN0UGFyYW1zLFxuICAgICAgbnVtOiAxLFxuICAgICAgcGFnZTogMSxcbiAgICAgIHF1ZXJ5TW9kZTogXCJsaXN0XCIsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcm93c1swXSA/PyBudWxsO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJTZXR0aW5nc1wiIH0pXG4gIGFzeW5jIGZpbmRNYW55PFQgZXh0ZW5kcyBTZXR0aW5nU3Vic2V0S2V5LCBMUCBleHRlbmRzIFNldHRpbmdMaXN0UGFyYW1zPihcbiAgICBzdWJzZXQ6IFQsXG4gICAgcmF3UGFyYW1zPzogTFAsXG4gICk6IFByb21pc2U8TGlzdFJlc3VsdDxMUCwgU2V0dGluZ1N1YnNldE1hcHBpbmdbVF0+PiB7XG4gICAgLy8gcGFyYW1zIHdpdGggZGVmYXVsdHNcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBudW06IDI0LFxuICAgICAgcGFnZTogMSxcbiAgICAgIHNlYXJjaDogXCJrZXlcIiBhcyBjb25zdCxcbiAgICAgIG9yZGVyQnk6IFwia2V5LWFzY1wiIGFzIGNvbnN0LFxuICAgICAgLi4ucmF3UGFyYW1zLFxuICAgIH0gc2F0aXNmaWVzIFNldHRpbmdMaXN0UGFyYW1zO1xuXG4gICAgLy8gYnVpbGQgcXVlcmllc1xuICAgIGNvbnN0IHsgcWIgfSA9IHRoaXMuZ2V0U3Vic2V0UXVlcmllcyhzdWJzZXQpO1xuXG4gICAgLy8gaWRcbiAgICBpZiAocGFyYW1zLmlkKSB7XG4gICAgICBxYi53aGVyZUluKFwic2V0dGluZ3MuaWRcIiwgYXNBcnJheShwYXJhbXMuaWQpKTtcbiAgICB9XG5cbiAgICAvLyBrZXkg4oCUIHRvRmlsdGVyIHByb3Ag7J207KeA66eMIOyKpOy6kO2PtOuUqeydtCDrp4zrk6TslrTso7zsp4Ag7JWK7JWEIOyngeygkSDqsbTri6QuXG4gICAgaWYgKHBhcmFtcy5rZXkpIHtcbiAgICAgIHFiLndoZXJlKFwic2V0dGluZ3Mua2V5XCIsIHBhcmFtcy5rZXkpO1xuICAgIH1cblxuICAgIC8vIHNlYXJjaC1rZXl3b3JkXG4gICAgaWYgKHBhcmFtcy5zZWFyY2ggJiYgcGFyYW1zLmtleXdvcmQgJiYgcGFyYW1zLmtleXdvcmQubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHBhcmFtcy5zZWFyY2ggPT09IFwia2V5XCIpIHtcbiAgICAgICAgcWIud2hlcmUoXCJzZXR0aW5ncy5rZXlcIiwgXCJsaWtlXCIsIGAlJHtwYXJhbXMua2V5d29yZH0lYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcImVycm9yLnVua25vd25TZWFyY2hGaWVsZFwiKShwYXJhbXMuc2VhcmNoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gb3JkZXJCeVxuICAgIGlmIChwYXJhbXMub3JkZXJCeSkge1xuICAgICAgLy8gZGVmYXVsdCBvcmRlckJ5XG4gICAgICBpZiAocGFyYW1zLm9yZGVyQnkgPT09IFwia2V5LWFzY1wiKSB7XG4gICAgICAgIHFiLm9yZGVyQnkoXCJzZXR0aW5ncy5rZXlcIiwgXCJhc2NcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGhhdXN0aXZlKHBhcmFtcy5vcmRlckJ5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlU3Vic2V0UXVlcnkoe1xuICAgICAgc3Vic2V0LFxuICAgICAgcWIsXG4gICAgICBwYXJhbXMsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzYXZlKHNwYTogU2V0dGluZ1NhdmVQYXJhbXNbXSk6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuXG4gICAgLy8gcmVnaXN0ZXJcbiAgICBzcGEuZm9yRWFjaCgoc3ApID0+IHtcbiAgICAgIHdkYi51YlJlZ2lzdGVyKFwic2V0dGluZ3NcIiwgc3ApO1xuICAgIH0pO1xuXG4gICAgLy8gdHJhbnNhY3Rpb25cbiAgICByZXR1cm4gd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIGNvbnN0IGlkcyA9IGF3YWl0IHRyeC51YlVwc2VydChcInNldHRpbmdzXCIpO1xuXG4gICAgICByZXR1cm4gaWRzO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZGVsKGlkczogbnVtYmVyW10pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG5cbiAgICAvLyB0cmFuc2FjdGlvblxuICAgIGF3YWl0IHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICByZXR1cm4gdHJ4LnRhYmxlKFwic2V0dGluZ3NcIikud2hlcmVJbihcInNldHRpbmdzLmlkXCIsIGlkcykuZGVsZXRlKCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaWRzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKiDsoIDsnqXrkJwg7ISk7KCVIOyghOyytOulvCBrZXnihpJ2YWx1ZSDroZwuIOu2gO2MhSDsi5wg7ZWcIOuyiCDsnb3slrQg66mU66qo66as7JeQIOyYrOumsOuLpC4gKi9cbiAgYXN5bmMgZmluZEFsbEFzTWFwKCk6IFByb21pc2U8TWFwPHN0cmluZywgc3RyaW5nPj4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgdGhpcy5maW5kTWFueShcIkFcIiwgeyBudW06IDAsIHBhZ2U6IDEsIHF1ZXJ5TW9kZTogXCJsaXN0XCIgfSk7XG4gICAgcmV0dXJuIG5ldyBNYXAocm93cy5tYXAoKHIpID0+IFtyLmtleSwgci52YWx1ZV0pKTtcbiAgfVxuXG4gIC8qKiDstZzstIgg64+Z7IucIOyggOyepeuPhCBrZXkgdW5pcXVlIGNvbnN0cmFpbnTroZwg7JuQ7J6Q7KCB7Jy866GcIOyymOumrO2VnOuLpC4gKi9cbiAgYXN5bmMgc2V0QnlLZXkoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmdldFB1cmkoXCJ3XCIpXG4gICAgICAudGFibGUoXCJzZXR0aW5nc1wiKVxuICAgICAgLmluc2VydCh7IGtleSwgdmFsdWUsIHVwZGF0ZWRfYXQ6IG5ldyBEYXRlKCkgfSlcbiAgICAgIC5vbkNvbmZsaWN0KFwia2V5XCIsIHsgdXBkYXRlOiBbXCJ2YWx1ZVwiLCBcInVwZGF0ZWRfYXRcIl0gfSk7XG4gIH1cblxuICAvKiog7KCA7J6l6rCS7J2EIOyngOybjCBlbnYg6riw67O46rCS7Jy866GcIOuQmOuPjOumsOuLpC4gKi9cbiAgYXN5bmMgY2xlYXJCeUtleShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZ2V0UHVyaShcIndcIikudGFibGUoXCJzZXR0aW5nc1wiKS53aGVyZShcImtleVwiLCBrZXkpLmRlbGV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2OuOynkSDqsIDriqXtlZwg7ISk7KCV6rO8IOydveq4sCDsoITsmqkg65+w7YOA7J6EIOygleuztC4g7Y647KeRIOuMgOyDgeydgCBgU0VUVElOR19ERUZTYCDsl5Ag7KCV7J2Y65CcIOqyg+u/kOydtOuLpCDigJRcbiAgICogREIg7KCR7IaNIOygleuztOuCmCDtj6ztirjripQg7ISc67KE6rCAIOucqOq4sCDsoITsl5Ag7ZWE7JqU7ZW0IO2ZlOuptOyXkOyEnCDrsJTqv4Ag7IiYIOyXhuuLpC5cbiAgICovXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdLCByZXNvdXJjZU5hbWU6IFwiU2V0dGluZ0xpc3RcIiB9KVxuICBhc3luYyBsaXN0U2V0dGluZ3MoKTogUHJvbWlzZTxTZXR0aW5nc1Jlc3BvbnNlPiB7XG4gICAgY29uc3Qgc2V0dGluZ3M6IFNldHRpbmdJdGVtW10gPSBTRVRUSU5HX0RFRlMubWFwKChkZWYpID0+IHtcbiAgICAgIC8vIOyggOyepeqwkuuPhCBlbnYg64+EIOyXhuycvOuptCDsvZTrk5wg6riw67O46rCS7J20IOyLpOygnOuhnCDsoIHsmqkg7KSR7J2064ukLiDruYjsubjsnLzroZwg65GQ66m0IO2ZlOuptOqzvFxuICAgICAgLy8g65+w7YOA7J6E7J20IOyWtOq4i+uCmCDrs7Tsnbjri6QuXG4gICAgICBjb25zdCBzdG9yZWQgPSBpc1N0b3JlZChkZWYua2V5KTtcbiAgICAgIGNvbnN0IHJhdyA9IGdldFNldHRpbmcoZGVmLmtleSwgZGVmLmVudktleSk7XG4gICAgICBjb25zdCBlZmZlY3RpdmUgPSByYXcgPz8gZGVmLmZhbGxiYWNrO1xuICAgICAgY29uc3Qgc291cmNlID0gc3RvcmVkID8gXCJkYlwiIDogcmF3ICE9PSB1bmRlZmluZWQgPyBcImVudlwiIDogXCJkZWZhdWx0XCI7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogZGVmLmtleSxcbiAgICAgICAgZ3JvdXA6IGRlZi5ncm91cCxcbiAgICAgICAgbGFiZWw6IGRlZi5sYWJlbCxcbiAgICAgICAga2luZDogZGVmLmtpbmQsXG4gICAgICAgIGFwcGxpZXM6IGRlZi5hcHBsaWVzLFxuICAgICAgICAvLyDriIgg7Yag6riA7J2EIOychO2VtCBzZWNyZXQg64+EIOybkOuzuOydhCDrgrTroKTrs7Trgrjri6QuIOydtCDsl5Trk5ztj6zsnbjtirjripQg67Cw7Y+sIOqyveqzhOyXkOyEnFxuICAgICAgICAvLyDrsJjrk5zsi5wg7J247Kad7ZW07JW8IO2VnOuLpC5cbiAgICAgICAgdmFsdWU6IGVmZmVjdGl2ZSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICBtaW46IGRlZi5taW4gPz8gbnVsbCxcbiAgICAgICAgbWF4OiBkZWYubWF4ID8/IG51bGwsXG4gICAgICAgIHByZXNldHM6IGRlZi5wcmVzZXRzID8/IFtdLFxuICAgICAgICBoZWxwOiBkZWYuaGVscCA/PyBudWxsLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBzZXR0aW5ncyxcbiAgICAgIHJ1bnRpbWU6IHRoaXMucnVudGltZUluZm8oKSxcbiAgICAgIHN1cGVydmlzb3I6IGRldGVjdFN1cGVydmlzb3IoKSxcbiAgICAgIGtlZXBhbGl2ZVJ1bm5lckVuYWJsZWQ6IHByb2Nlc3MuZW52W1RPS0VOX1dJTkRPV19LRUVQQUxJVkVfUlVOTkVSX0VOVl9LRVldID09PSBcInRydWVcIixcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBydW50aW1lSW5mbygpOiBSdW50aW1lSW5mb0l0ZW1bXSB7XG4gICAgY29uc3QgZW52ID0gcHJvY2Vzcy5lbnY7XG4gICAgY29uc3QgcGFzc3dvcmQgPSBlbnYuUUdSSURfREJfUEFTU1dPUkQgPz8gZW52LlNPTkFNVV9EQl9QQVNTV09SRCA/PyBcIlwiO1xuICAgIHJldHVybiBbXG4gICAgICB7IGxhYmVsOiBcIk5PREVfRU5WXCIsIHZhbHVlOiBlbnYuTk9ERV9FTlYgPz8gXCItXCIgfSxcbiAgICAgIHsgbGFiZWw6IFwiSE9TVFwiLCB2YWx1ZTogZW52LkhPU1QgPz8gXCJsb2NhbGhvc3RcIiB9LFxuICAgICAgeyBsYWJlbDogXCJQT1JUXCIsIHZhbHVlOiBlbnYuUE9SVCA/PyBcIjQ0OTAwXCIgfSxcbiAgICAgIHsgbGFiZWw6IFwiREIgSG9zdFwiLCB2YWx1ZTogZW52LlFHUklEX0RCX0hPU1QgPz8gZW52LlNPTkFNVV9EQl9IT1NUID8/IFwiLVwiIH0sXG4gICAgICB7IGxhYmVsOiBcIkRCIFBvcnRcIiwgdmFsdWU6IGVudi5RR1JJRF9EQl9QT1JUID8/IGVudi5TT05BTVVfREJfUE9SVCA/PyBcIi1cIiB9LFxuICAgICAgeyBsYWJlbDogXCJEQiBOYW1lXCIsIHZhbHVlOiBlbnYuUUdSSURfREJfTkFNRSA/PyBlbnYuU09OQU1VX0RCX05BTUUgPz8gXCItXCIgfSxcbiAgICAgIHsgbGFiZWw6IFwiREIgVXNlclwiLCB2YWx1ZTogZW52LlFHUklEX0RCX1VTRVIgPz8gZW52LlNPTkFNVV9EQl9VU0VSID8/IFwiLVwiIH0sXG4gICAgICB7IGxhYmVsOiBcIkRCIFBhc3N3b3JkXCIsIHZhbHVlOiBwYXNzd29yZCA/IG1hc2tTZWNyZXQocGFzc3dvcmQpIDogXCItXCIgfSxcbiAgICBdO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHVwZGF0ZVNldHRpbmcoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPHsgYXBwbGllczogU2V0dGluZ0FwcGxpZXMgfT4ge1xuICAgIGNvbnN0IGRlZiA9IGZpbmRTZXR0aW5nRGVmKGtleSk7XG4gICAgaWYgKCFkZWYpIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic2V0dGluZy51bmtub3duS2V5XCIpKGtleSkpO1xuXG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IHZhbGlkYXRlU2V0dGluZ1ZhbHVlKGRlZiwgdmFsdWUpO1xuICAgIGlmICghdmFsaWRhdGlvbi5vaykge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzZXR0aW5nLmludmFsaWRWYWx1ZVwiKSh2YWxpZGF0aW9uLmVycm9yKSk7XG4gICAgfVxuXG4gICAgYXdhaXQgc2F2ZVN0b3JlZFNldHRpbmcoa2V5LCB2YWxpZGF0aW9uLnZhbHVlKTtcbiAgICByZXR1cm4geyBhcHBsaWVzOiBkZWYuYXBwbGllcyB9O1xuICB9XG5cbiAgLyoqIOyggOyepeqwkuydhCDsp4Dsm4wgZW52IOq4sOuzuOqwkuycvOuhnCDrkJjrj4zrprDri6QuICovXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyByZXNldFNldHRpbmcoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHsgYXBwbGllczogU2V0dGluZ0FwcGxpZXMgfT4ge1xuICAgIGNvbnN0IGRlZiA9IGZpbmRTZXR0aW5nRGVmKGtleSk7XG4gICAgaWYgKCFkZWYpIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic2V0dGluZy51bmtub3duS2V5XCIpKGtleSkpO1xuXG4gICAgYXdhaXQgcmVzZXRTdG9yZWRTZXR0aW5nKGtleSk7XG4gICAgcmV0dXJuIHsgYXBwbGllczogZGVmLmFwcGxpZXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrp4zro4wg7JWM66a87J2EIOyngOq4iCDtlZwg67KIIOuztOuCuOuLpC4g7KO86riw66W8IOq4sOuLpOumrOyngCDslYrqs6Ag7ISk7KCV7J20IOygnOuMgOuhnCDrtpnsl4jripTsp4Ag7ZmV7J247ZWY6rGw64KYLFxuICAgKiDsnqzroZzqt7jsnbjsnYQg7J6s7LSJ7ZWgIOuVjCDsk7Tri6QuIOuztOuCuCDqsbTsiJjrpbwg64+M66Ck7KSYIFwi67O064K8IOuMgOyDgSDsl4bsnYxcIuqzvCDqtazrtoTtlZzri6QuXG4gICAqL1xuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgdHJpZ2dlckV4cGlyeVJlbWluZGVyKCk6IFByb21pc2U8eyBzZW50OiBudW1iZXIgfT4ge1xuICAgIC8vIOuPmeyggSBpbXBvcnQg66GcIOyVjOumvCDrqqjrk4jsnYQg7Zi47LacIOyLnOygkOyXkOunjCDrgYzslrTsmKjri6QuIOygleyggeycvOuhnCDqsbjrqbRcbiAgICAvLyBzZXR0aW5nLm1vZGVsIOKGkiBleHBpcmVkLXRva2VuLXJlbWluZGVyIOKGkiB0b2tlbi5tb2RlbCDqsr3roZzqsIAg7IOd6rKoLFxuICAgIC8vIHRva2VuLm1vZGVsIOydhCBtb2NrIO2VmOuKlCDthYzsiqTtirjqsIAg7Iuk7KCcIOuqqOuTiOydhCDrqLzsoIAg66Gc65Oc7ZWY6rKMIOuQnOuLpC5cbiAgICBjb25zdCB7IHNlbmRFeHBpcmVkVG9rZW5SZW1pbmRlck5vdyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vcWdyaWQvZXhwaXJlZC10b2tlbi1yZW1pbmRlclwiKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgc2VudDogYXdhaXQgc2VuZEV4cGlyZWRUb2tlblJlbWluZGVyTm93KCkgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU2xhY2tOb3RpZmljYXRpb25FcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihlcnJvci5tZXNzYWdlIGFzIExvY2FsaXplZFN0cmluZyk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7ISc67KE66W8IOyerOyLnOyeke2VnOuLpCDigJQg7KCV7ZmV7Z6I64qUIOyKpOyKpOuhnCDsooXro4ztlZjqs6AsIHBtMiDqsIAg64uk7IucIOudhOyasOuKlCDqsoPsl5Ag66eh6ri064ukLlxuICAgKlxuICAgKiBgcmVzdGFydGAg66GcIO2RnOyLnOuQnCDsm4zsu6Qg7ISk7KCV7J2AIGRpc3BhdGNoZXIg7IOd7ISx7J6Q7JeQ7IScIO2VnCDrsojrp4wg7J297Z6I66+A66GcIOydtCDqsr3roZwg66eQ6rOg64qUXG4gICAqIOuwmOyYge2VoCDrsKnrspXsnbQg7JeG7JeI64ukLiDsp4DquIjquYzsp4DripQgU1NIIOuhnCBgcG0yIHJlc3RhcnRgIOulvCDss5Dslbwg7ZaI64ukLlxuICAgKlxuICAgKiDrtoDsiJgg7Zqo6rO86rCAIO2VmOuCmCDrjZQg7J6I64ukOiBwbTIg64qUIGBlY29zeXN0ZW0uY29uZmlnLmNqc2Ag7J2YIOybkOuemCDrqoXroLnsnLzroZwg64uk7IucIOudhOyasOqzoCxcbiAgICog6re4IOuqheugueyXkCBgLS1za2lwLXVwZGF0ZWAg6rCAIOyXhuycvOuptCBDTEkg6rCAIG5wbSDstZzsi6Ag67KE7KCE7J2EIOuwm+yVhCDsmKzrprDri6QuIOymiSDsnqzsi5zsnpHsnYBcbiAgICog67Cw7Y+s7J206riw64+EIO2VmOuLpCDigJQg7ZmU66m0IOusuOq1rOqwgCDsnbQg7IKs7Iuk7J2EIO2VqOq7mCDslYzrprDri6QuXG4gICAqL1xuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgcmVzdGFydFNlcnZlcigpOiBQcm9taXNlPHsgc3VwZXJ2aXNvcjogU3VwZXJ2aXNvcktpbmQgfT4ge1xuICAgIGFzc2VydFJlc3RhcnRPcmlnaW4oKTtcbiAgICBjb25zdCBzdXBlcnZpc29yID0gZGV0ZWN0U3VwZXJ2aXNvcigpO1xuICAgIGlmICghc3VwZXJ2aXNvcikge1xuICAgICAgLy8g64uk7IucIOudhOybjOykhCDso7zssrTqsIAg7JeG7Jy866m0IOyiheujjOqwgCDqs6cg7KCV7KeA64ukLiDsgrTrprQg7IiYIOyXhuuKlOuNsCDso73snbTsp4Ag7JWK64qU64ukLlxuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzZXR0aW5nLm5vU3VwZXJ2aXNvclwiKSgpKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHJlcGx5IH0gPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIGNvbnN0IHN0YXJ0ZWQgPSBiZWdpblNlcnZlclJlc3RhcnQoKTtcbiAgICBpZiAoc3RhcnRlZCkge1xuICAgICAgbG9nZ2VyLndhcm4oYHJlc3RhcnQgcmVxdWVzdGVkIHZpYSBkYXNoYm9hcmQsIGV4aXRpbmcgZm9yICR7c3VwZXJ2aXNvcn0gdG8gcmVzcGF3bmApO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyDsoJXsoIEgaW1wb3J066GcIHFncmlkLmZyYW1lL3Rva2VuIOq3uOuemO2UhOulvCDri7nqsqjsmKTrqbQg66qo65OIIOuqqSDthYzsiqTtirjqsIAg7Jik7Je865Cc64ukLlxuICAgICAgICAvLyDsnqzsi5zsnpHsnbQg7Iuk7KCc66GcIO2ZleygleuQnCDsi5zsoJDsl5AgYWN0aXZlIG5hdGl2ZSBydW4g7KCV7ZWp7ISxIOyymOumrOunjCDroZzrk5ztlZzri6QuXG4gICAgICAgIGNvbnN0IHsgZmluaXNoQWN0aXZlTmF0aXZlUnVuc0ZvclJlc3RhcnQgfSA9IGF3YWl0IGltcG9ydChcIi4uL3FncmlkL3FncmlkLXJ1bi1saWZlY3ljbGVcIik7XG4gICAgICAgIGF3YWl0IGZpbmlzaEFjdGl2ZU5hdGl2ZVJ1bnNGb3JSZXN0YXJ0KCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyDsoJXtlanshLEg7LKY66as6rCAIOyLpO2MqO2VtOuPhCDsnZHri7XsnbQgZmx1c2gg65CcIOuSpOyXkOuKlCDsnqzsi5zsnpHsnYQg64Gd6rmM7KeAIOynhO2Wie2VnOuLpC5cbiAgICAgICAgYXJtU2VydmVyUmVzdGFydEV4aXQocmVwbHkucmF3KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBzdXBlcnZpc29yIH07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFNldHRpbmdNb2RlbCA9IG5ldyBTZXR0aW5nTW9kZWxDbGFzcygpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUEwQ0EsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLFNBQVMsQ0FBQztBQUU3QyxJQUFNLHFCQUFOLGNBQWlDLFlBQVk7Q0FDM0MsY0FBYztFQUNaLE1BQU0sS0FBSyxHQUFHLGlCQUFpQixDQUFDO0NBQ2xDO0FBQ0Y7QUFFQSxTQUFTLGlCQUFpQixPQUEwRDtDQUNsRixRQUFRLE1BQU0sUUFBUSxLQUFLLElBQUksTUFBTSxLQUFLLE1BQUEsRUFBUSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLO0FBQ3hFOztBQUdBLFNBQVMsc0JBQTRCO0NBQ25DLE1BQU0sRUFBRSxZQUFZLE9BQU8sV0FBVztDQUN0QyxNQUFNLFNBQVMsaUJBQWlCLFFBQVEsTUFBTTtDQUM5QyxJQUFJLFFBQVEsV0FBVyxRQUFXO0NBQ2xDLElBQUksQ0FBQyxRQUFRLE1BQU0sSUFBSSxtQkFBbUI7Q0FFMUMsTUFBTSxPQUFPLGlCQUFpQixRQUFRLG1CQUFtQixLQUFLLGlCQUFpQixRQUFRLElBQUk7Q0FDM0YsSUFBSTtFQUNGLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxNQUFNLENBQUMsQ0FBQyxTQUFTLE1BQU0sTUFBTSxJQUFJLG1CQUFtQjtDQUMzRSxTQUFTLE9BQU87RUFDZCxJQUFJLGlCQUFpQixvQkFBb0IsTUFBTTtFQUMvQyxNQUFNLElBQUksbUJBQW1CO0NBQy9CO0FBQ0Y7QUFLQSxJQUFNLG9CQUFOLGNBQWdDLGVBSzlCO0NB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
247
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZy5tb2RlbC5qcyIsIm5hbWVzIjpbInNhdmVTdG9yZWRTZXR0aW5nIiwicmVzZXRTdG9yZWRTZXR0aW5nIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3NldHRpbmcvc2V0dGluZy5tb2RlbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCYXNlTW9kZWxDbGFzcyxcbiAgdHlwZSBMaXN0UmVzdWx0LFxuICBhc0FycmF5LFxuICBOb3RGb3VuZEV4Y2VwdGlvbixcbiAgQmFkUmVxdWVzdEV4Y2VwdGlvbixcbiAgYXBpLFxuICBleGhhdXN0aXZlLFxufSBmcm9tIFwic29uYW11XCI7XG5cbmltcG9ydCB7IFNELCB0eXBlIExvY2FsaXplZFN0cmluZyB9IGZyb20gXCIuLi8uLi9pMThuL3NkLmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgU2xhY2tOb3RpZmljYXRpb25FcnJvciB9IGZyb20gXCIuLi8uLi91dGlscy9zbGFjay1ub3RpZnlcIjtcbmltcG9ydCB7IHR5cGUgU2V0dGluZ1N1YnNldEtleSwgdHlwZSBTZXR0aW5nU3Vic2V0TWFwcGluZyB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBzZXR0aW5nU3Vic2V0UXVlcmllcywgc2V0dGluZ0xvYWRlclF1ZXJpZXMgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZC5zc29cIjtcbmltcG9ydCB7XG4gIGZpbmRTZXR0aW5nRGVmLFxuICBtYXNrU2VjcmV0LFxuICBTRVRUSU5HX0RFRlMsXG4gIFRPS0VOX1dJTkRPV19LRUVQQUxJVkVfUlVOTkVSX0VOVl9LRVksXG4gIHZhbGlkYXRlU2V0dGluZ1ZhbHVlLFxufSBmcm9tIFwiLi9zZXR0aW5nLmNvbnN0YW50XCI7XG5pbXBvcnQge1xuICBnZXRTZXR0aW5nLFxuICBpc1N0b3JlZCxcbiAgcmVzZXRTZXR0aW5nIGFzIHJlc2V0U3RvcmVkU2V0dGluZyxcbiAgc2F2ZVNldHRpbmcgYXMgc2F2ZVN0b3JlZFNldHRpbmcsXG59IGZyb20gXCIuL3NldHRpbmcuc3RvcmVcIjtcbmltcG9ydCB7XG4gIHR5cGUgUnVudGltZUluZm9JdGVtLFxuICB0eXBlIFNldHRpbmdBcHBsaWVzLFxuICB0eXBlIFNldHRpbmdJdGVtLFxuICB0eXBlIFNldHRpbmdMaXN0UGFyYW1zLFxuICB0eXBlIFNldHRpbmdTYXZlUGFyYW1zLFxuICB0eXBlIFNldHRpbmdzUmVzcG9uc2UsXG59IGZyb20gXCIuL3NldHRpbmcudHlwZXNcIjtcblxuLypcbiAgU2V0dGluZyBNb2RlbFxuKi9cbmNsYXNzIFNldHRpbmdNb2RlbENsYXNzIGV4dGVuZHMgQmFzZU1vZGVsQ2xhc3M8XG4gIFNldHRpbmdTdWJzZXRLZXksXG4gIFNldHRpbmdTdWJzZXRNYXBwaW5nLFxuICB0eXBlb2Ygc2V0dGluZ1N1YnNldFF1ZXJpZXMsXG4gIHR5cGVvZiBzZXR0aW5nTG9hZGVyUXVlcmllc1xuPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiU2V0dGluZ1wiLCBzZXR0aW5nU3Vic2V0UXVlcmllcywgc2V0dGluZ0xvYWRlclF1ZXJpZXMpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJTZXR0aW5nXCIgfSlcbiAgYXN5bmMgZmluZEJ5SWQ8VCBleHRlbmRzIFNldHRpbmdTdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBpZDogbnVtYmVyLFxuICApOiBQcm9taXNlPFNldHRpbmdTdWJzZXRNYXBwaW5nW1RdPiB7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLmZpbmRNYW55KHN1YnNldCwge1xuICAgICAgaWQsXG4gICAgICBudW06IDEsXG4gICAgICBwYWdlOiAxLFxuICAgICAgcXVlcnlNb2RlOiBcImxpc3RcIixcbiAgICB9KTtcbiAgICBpZiAoIXJvd3NbMF0pIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmVudGl0eU5vdEZvdW5kXCIpKFwiU2V0dGluZ1wiLCBpZCkpO1xuICAgIH1cblxuICAgIHJldHVybiByb3dzWzBdO1xuICB9XG5cbiAgYXN5bmMgZmluZE9uZTxUIGV4dGVuZHMgU2V0dGluZ1N1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIGxpc3RQYXJhbXM6IFNldHRpbmdMaXN0UGFyYW1zLFxuICApOiBQcm9taXNlPFNldHRpbmdTdWJzZXRNYXBwaW5nW1RdIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgdGhpcy5maW5kTWFueShzdWJzZXQsIHtcbiAgICAgIC4uLmxpc3RQYXJhbXMsXG4gICAgICBudW06IDEsXG4gICAgICBwYWdlOiAxLFxuICAgICAgcXVlcnlNb2RlOiBcImxpc3RcIixcbiAgICB9KTtcblxuICAgIHJldHVybiByb3dzWzBdID8/IG51bGw7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSwgcmVzb3VyY2VOYW1lOiBcIlNldHRpbmdzXCIgfSlcbiAgYXN5bmMgZmluZE1hbnk8VCBleHRlbmRzIFNldHRpbmdTdWJzZXRLZXksIExQIGV4dGVuZHMgU2V0dGluZ0xpc3RQYXJhbXM+KFxuICAgIHN1YnNldDogVCxcbiAgICByYXdQYXJhbXM/OiBMUCxcbiAgKTogUHJvbWlzZTxMaXN0UmVzdWx0PExQLCBTZXR0aW5nU3Vic2V0TWFwcGluZ1tUXT4+IHtcbiAgICAvLyBwYXJhbXMgd2l0aCBkZWZhdWx0c1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG51bTogMjQsXG4gICAgICBwYWdlOiAxLFxuICAgICAgc2VhcmNoOiBcImtleVwiIGFzIGNvbnN0LFxuICAgICAgb3JkZXJCeTogXCJrZXktYXNjXCIgYXMgY29uc3QsXG4gICAgICAuLi5yYXdQYXJhbXMsXG4gICAgfSBzYXRpc2ZpZXMgU2V0dGluZ0xpc3RQYXJhbXM7XG5cbiAgICAvLyBidWlsZCBxdWVyaWVzXG4gICAgY29uc3QgeyBxYiB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG5cbiAgICAvLyBpZFxuICAgIGlmIChwYXJhbXMuaWQpIHtcbiAgICAgIHFiLndoZXJlSW4oXCJzZXR0aW5ncy5pZFwiLCBhc0FycmF5KHBhcmFtcy5pZCkpO1xuICAgIH1cblxuICAgIC8vIGtleSDigJQgdG9GaWx0ZXIgcHJvcCDsnbTsp4Drp4wg7Iqk7LqQ7Y+065Sp7J20IOunjOuTpOyWtOyjvOyngCDslYrslYQg7KeB7KCRIOqxtOuLpC5cbiAgICBpZiAocGFyYW1zLmtleSkge1xuICAgICAgcWIud2hlcmUoXCJzZXR0aW5ncy5rZXlcIiwgcGFyYW1zLmtleSk7XG4gICAgfVxuXG4gICAgLy8gc2VhcmNoLWtleXdvcmRcbiAgICBpZiAocGFyYW1zLnNlYXJjaCAmJiBwYXJhbXMua2V5d29yZCAmJiBwYXJhbXMua2V5d29yZC5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJrZXlcIikge1xuICAgICAgICBxYi53aGVyZShcInNldHRpbmdzLmtleVwiLCBcImxpa2VcIiwgYCUke3BhcmFtcy5rZXl3b3JkfSVgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwiZXJyb3IudW5rbm93blNlYXJjaEZpZWxkXCIpKHBhcmFtcy5zZWFyY2gpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBvcmRlckJ5XG4gICAgaWYgKHBhcmFtcy5vcmRlckJ5KSB7XG4gICAgICAvLyBkZWZhdWx0IG9yZGVyQnlcbiAgICAgIGlmIChwYXJhbXMub3JkZXJCeSA9PT0gXCJrZXktYXNjXCIpIHtcbiAgICAgICAgcWIub3JkZXJCeShcInNldHRpbmdzLmtleVwiLCBcImFzY1wiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4aGF1c3RpdmUocGFyYW1zLm9yZGVyQnkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtcyxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoc3BhOiBTZXR0aW5nU2F2ZVBhcmFtc1tdKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG5cbiAgICAvLyByZWdpc3RlclxuICAgIHNwYS5mb3JFYWNoKChzcCkgPT4ge1xuICAgICAgd2RiLnViUmVnaXN0ZXIoXCJzZXR0aW5nc1wiLCBzcCk7XG4gICAgfSk7XG5cbiAgICAvLyB0cmFuc2FjdGlvblxuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgY29uc3QgaWRzID0gYXdhaXQgdHJ4LnViVXBzZXJ0KFwic2V0dGluZ3NcIik7XG5cbiAgICAgIHJldHVybiBpZHM7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBkZWwoaWRzOiBudW1iZXJbXSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcblxuICAgIC8vIHRyYW5zYWN0aW9uXG4gICAgYXdhaXQgd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIHJldHVybiB0cngudGFibGUoXCJzZXR0aW5nc1wiKS53aGVyZUluKFwic2V0dGluZ3MuaWRcIiwgaWRzKS5kZWxldGUoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBpZHMubGVuZ3RoO1xuICB9XG5cbiAgLyoqIOyggOyepeuQnCDshKTsoJUg7KCE7LK066W8IGtleeKGknZhbHVlIOuhnC4g67aA7YyFIOyLnCDtlZwg67KIIOydveyWtCDrqZTrqqjrpqzsl5Ag7Jis66aw64ukLiAqL1xuICBhc3luYyBmaW5kQWxsQXNNYXAoKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBzdHJpbmc+PiB7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLmZpbmRNYW55KFwiQVwiLCB7IG51bTogMCwgcGFnZTogMSwgcXVlcnlNb2RlOiBcImxpc3RcIiB9KTtcbiAgICByZXR1cm4gbmV3IE1hcChyb3dzLm1hcCgocikgPT4gW3Iua2V5LCByLnZhbHVlXSkpO1xuICB9XG5cbiAgLyoqIOy1nOy0iCDrj5nsi5wg7KCA7J6l64+EIGtleSB1bmlxdWUgY29uc3RyYWludOuhnCDsm5DsnpDsoIHsnLzroZwg7LKY66as7ZWc64ukLiAqL1xuICBhc3luYyBzZXRCeUtleShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZ2V0UHVyaShcIndcIilcbiAgICAgIC50YWJsZShcInNldHRpbmdzXCIpXG4gICAgICAuaW5zZXJ0KHsga2V5LCB2YWx1ZSwgdXBkYXRlZF9hdDogbmV3IERhdGUoKSB9KVxuICAgICAgLm9uQ29uZmxpY3QoXCJrZXlcIiwgeyB1cGRhdGU6IFtcInZhbHVlXCIsIFwidXBkYXRlZF9hdFwiXSB9KTtcbiAgfVxuXG4gIC8qKiDsoIDsnqXqsJLsnYQg7KeA7JuMIGVudiDquLDrs7jqsJLsnLzroZwg65CY64+M66aw64ukLiAqL1xuICBhc3luYyBjbGVhckJ5S2V5KGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5nZXRQdXJpKFwid1wiKS50YWJsZShcInNldHRpbmdzXCIpLndoZXJlKFwia2V5XCIsIGtleSkuZGVsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICog7Y647KeRIOqwgOuKpe2VnCDshKTsoJXqs7wg7J296riwIOyghOyaqSDrn7Dtg4DsnoQg7KCV67O0LiDtjrjsp5Eg64yA7IOB7J2AIGBTRVRUSU5HX0RFRlNgIOyXkCDsoJXsnZjrkJwg6rKD67+Q7J2064ukIOKAlFxuICAgKiBEQiDsoJHsho0g7KCV67O064KYIO2PrO2KuOuKlCDshJzrsoTqsIAg65yo6riwIOyghOyXkCDtlYTsmpTtlbQg7ZmU66m07JeQ7IScIOuwlOq/gCDsiJgg7JeG64ukLlxuICAgKi9cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJTZXR0aW5nTGlzdFwiIH0pXG4gIGFzeW5jIGxpc3RTZXR0aW5ncygpOiBQcm9taXNlPFNldHRpbmdzUmVzcG9uc2U+IHtcbiAgICBjb25zdCBzZXR0aW5nczogU2V0dGluZ0l0ZW1bXSA9IFNFVFRJTkdfREVGUy5tYXAoKGRlZikgPT4ge1xuICAgICAgLy8g7KCA7J6l6rCS64+EIGVudiDrj4Qg7JeG7Jy866m0IOy9lOuTnCDquLDrs7jqsJLsnbQg7Iuk7KCc66GcIOyggeyaqSDspJHsnbTri6QuIOu5iOy5uOycvOuhnCDrkZDrqbQg7ZmU66m06rO8XG4gICAgICAvLyDrn7Dtg4DsnoTsnbQg7Ja06riL64KYIOuztOyduOuLpC5cbiAgICAgIGNvbnN0IHN0b3JlZCA9IGlzU3RvcmVkKGRlZi5rZXkpO1xuICAgICAgY29uc3QgcmF3ID0gZ2V0U2V0dGluZyhkZWYua2V5LCBkZWYuZW52S2V5KTtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZSA9IHJhdyA/PyBkZWYuZmFsbGJhY2s7XG4gICAgICBjb25zdCBzb3VyY2UgPSBzdG9yZWQgPyBcImRiXCIgOiByYXcgIT09IHVuZGVmaW5lZCA/IFwiZW52XCIgOiBcImRlZmF1bHRcIjtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiBkZWYua2V5LFxuICAgICAgICBncm91cDogZGVmLmdyb3VwLFxuICAgICAgICBsYWJlbDogZGVmLmxhYmVsLFxuICAgICAgICBraW5kOiBkZWYua2luZCxcbiAgICAgICAgYXBwbGllczogZGVmLmFwcGxpZXMsXG4gICAgICAgIC8vIOuIiCDthqDquIDsnYQg7JyE7ZW0IHNlY3JldCDrj4Qg7JuQ67O47J2EIOuCtOugpOuztOuCuOuLpC4g7J20IOyXlOuTnO2PrOyduO2KuOuKlCDrsLDtj6wg6rK96rOE7JeQ7IScXG4gICAgICAgIC8vIOuwmOuTnOyLnCDsnbjspp3tlbTslbwg7ZWc64ukLlxuICAgICAgICB2YWx1ZTogZWZmZWN0aXZlLFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIG1pbjogZGVmLm1pbiA/PyBudWxsLFxuICAgICAgICBtYXg6IGRlZi5tYXggPz8gbnVsbCxcbiAgICAgICAgcHJlc2V0czogZGVmLnByZXNldHMgPz8gW10sXG4gICAgICAgIGhlbHA6IGRlZi5oZWxwID8/IG51bGwsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNldHRpbmdzLFxuICAgICAgcnVudGltZTogdGhpcy5ydW50aW1lSW5mbygpLFxuICAgICAga2VlcGFsaXZlUnVubmVyRW5hYmxlZDogcHJvY2Vzcy5lbnZbVE9LRU5fV0lORE9XX0tFRVBBTElWRV9SVU5ORVJfRU5WX0tFWV0gPT09IFwidHJ1ZVwiLFxuICAgIH07XG4gIH1cblxuICBydW50aW1lSW5mbygpOiBSdW50aW1lSW5mb0l0ZW1bXSB7XG4gICAgY29uc3QgZW52ID0gcHJvY2Vzcy5lbnY7XG4gICAgY29uc3QgcGFzc3dvcmQgPSBlbnYuUUdSSURfREJfUEFTU1dPUkQgPz8gZW52LlNPTkFNVV9EQl9QQVNTV09SRCA/PyBcIlwiO1xuICAgIHJldHVybiBbXG4gICAgICB7IGxhYmVsOiBcIk5PREVfRU5WXCIsIHZhbHVlOiBlbnYuTk9ERV9FTlYgPz8gXCItXCIgfSxcbiAgICAgIHsgbGFiZWw6IFwiSE9TVFwiLCB2YWx1ZTogZW52LkhPU1QgPz8gXCJsb2NhbGhvc3RcIiB9LFxuICAgICAgeyBsYWJlbDogXCJQT1JUXCIsIHZhbHVlOiBlbnYuUE9SVCA/PyBcIjQ0OTAwXCIgfSxcbiAgICAgIHsgbGFiZWw6IFwiREIgSG9zdFwiLCB2YWx1ZTogZW52LlFHUklEX0RCX0hPU1QgPz8gZW52LlNPTkFNVV9EQl9IT1NUID8/IFwiLVwiIH0sXG4gICAgICB7IGxhYmVsOiBcIkRCIFBvcnRcIiwgdmFsdWU6IGVudi5RR1JJRF9EQl9QT1JUID8/IGVudi5TT05BTVVfREJfUE9SVCA/PyBcIi1cIiB9LFxuICAgICAgeyBsYWJlbDogXCJEQiBOYW1lXCIsIHZhbHVlOiBlbnYuUUdSSURfREJfTkFNRSA/PyBlbnYuU09OQU1VX0RCX05BTUUgPz8gXCItXCIgfSxcbiAgICAgIHsgbGFiZWw6IFwiREIgVXNlclwiLCB2YWx1ZTogZW52LlFHUklEX0RCX1VTRVIgPz8gZW52LlNPTkFNVV9EQl9VU0VSID8/IFwiLVwiIH0sXG4gICAgICB7IGxhYmVsOiBcIkRCIFBhc3N3b3JkXCIsIHZhbHVlOiBwYXNzd29yZCA/IG1hc2tTZWNyZXQocGFzc3dvcmQpIDogXCItXCIgfSxcbiAgICBdO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHVwZGF0ZVNldHRpbmcoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPHsgYXBwbGllczogU2V0dGluZ0FwcGxpZXMgfT4ge1xuICAgIGNvbnN0IGRlZiA9IGZpbmRTZXR0aW5nRGVmKGtleSk7XG4gICAgaWYgKCFkZWYpIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic2V0dGluZy51bmtub3duS2V5XCIpKGtleSkpO1xuXG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IHZhbGlkYXRlU2V0dGluZ1ZhbHVlKGRlZiwgdmFsdWUpO1xuICAgIGlmICghdmFsaWRhdGlvbi5vaykge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzZXR0aW5nLmludmFsaWRWYWx1ZVwiKSh2YWxpZGF0aW9uLmVycm9yKSk7XG4gICAgfVxuXG4gICAgYXdhaXQgc2F2ZVN0b3JlZFNldHRpbmcoa2V5LCB2YWxpZGF0aW9uLnZhbHVlKTtcbiAgICByZXR1cm4geyBhcHBsaWVzOiBkZWYuYXBwbGllcyB9O1xuICB9XG5cbiAgLyoqIOyggOyepeqwkuydhCDsp4Dsm4wgZW52IOq4sOuzuOqwkuycvOuhnCDrkJjrj4zrprDri6QuICovXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyByZXNldFNldHRpbmcoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHsgYXBwbGllczogU2V0dGluZ0FwcGxpZXMgfT4ge1xuICAgIGNvbnN0IGRlZiA9IGZpbmRTZXR0aW5nRGVmKGtleSk7XG4gICAgaWYgKCFkZWYpIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwic2V0dGluZy51bmtub3duS2V5XCIpKGtleSkpO1xuXG4gICAgYXdhaXQgcmVzZXRTdG9yZWRTZXR0aW5nKGtleSk7XG4gICAgcmV0dXJuIHsgYXBwbGllczogZGVmLmFwcGxpZXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrp4zro4wg7JWM66a87J2EIOyngOq4iCDtlZwg67KIIOuztOuCuOuLpC4g7KO86riw66W8IOq4sOuLpOumrOyngCDslYrqs6Ag7ISk7KCV7J20IOygnOuMgOuhnCDrtpnsl4jripTsp4Ag7ZmV7J247ZWY6rGw64KYLFxuICAgKiDsnqzroZzqt7jsnbjsnYQg7J6s7LSJ7ZWgIOuVjCDsk7Tri6QuIOuztOuCuCDqsbTsiJjrpbwg64+M66Ck7KSYIFwi67O064K8IOuMgOyDgSDsl4bsnYxcIuqzvCDqtazrtoTtlZzri6QuXG4gICAqL1xuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgdHJpZ2dlckV4cGlyeVJlbWluZGVyKCk6IFByb21pc2U8eyBzZW50OiBudW1iZXIgfT4ge1xuICAgIC8vIOuPmeyggSBpbXBvcnQg66GcIOyVjOumvCDrqqjrk4jsnYQg7Zi47LacIOyLnOygkOyXkOunjCDrgYzslrTsmKjri6QuIOygleyggeycvOuhnCDqsbjrqbRcbiAgICAvLyBzZXR0aW5nLm1vZGVsIOKGkiBleHBpcmVkLXRva2VuLXJlbWluZGVyIOKGkiB0b2tlbi5tb2RlbCDqsr3roZzqsIAg7IOd6rKoLFxuICAgIC8vIHRva2VuLm1vZGVsIOydhCBtb2NrIO2VmOuKlCDthYzsiqTtirjqsIAg7Iuk7KCcIOuqqOuTiOydhCDrqLzsoIAg66Gc65Oc7ZWY6rKMIOuQnOuLpC5cbiAgICBjb25zdCB7IHNlbmRFeHBpcmVkVG9rZW5SZW1pbmRlck5vdyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vcWdyaWQvZXhwaXJlZC10b2tlbi1yZW1pbmRlclwiKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgc2VudDogYXdhaXQgc2VuZEV4cGlyZWRUb2tlblJlbWluZGVyTm93KCkgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU2xhY2tOb3RpZmljYXRpb25FcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihlcnJvci5tZXNzYWdlIGFzIExvY2FsaXplZFN0cmluZyk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFNldHRpbmdNb2RlbCA9IG5ldyBTZXR0aW5nTW9kZWxDbGFzcygpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUF1Q0EsSUFBTSxvQkFBTixjQUFnQyxlQUs5QjtDQUNBLGNBQWM7RUFDWixNQUFNLFdBQVcsc0JBQXNCLG9CQUFvQjtDQUM3RDtDQUVBLE1BQ00sU0FDSixRQUNBLElBQ2tDO0VBQ2xDLE1BQU0sRUFBRSxTQUFTLE1BQU0sS0FBSyxTQUFTLFFBQVE7R0FDM0M7R0FDQSxLQUFLO0dBQ0wsTUFBTTtHQUNOLFdBQVc7RUFDYixDQUFDO0VBQ0QsSUFBSSxDQUFDLEtBQUssSUFDUixNQUFNLElBQUksa0JBQWtCLEdBQUcsc0JBQXNCLENBQUMsQ0FBQyxXQUFX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
@@ -4,9 +4,8 @@ import { getLogger } from "@logtape/logtape";
4
4
  /**
5
5
  * 런타임 설정 조회 캐시.
6
6
  *
7
- * 값의 출처는 DB(`settings`) → env 순이다. env 를 남겨두는 이유는 전환 때문이다 — dev0 는
8
- * `ecosystem.config.json` 으로 값을 주입하는데, DB 만 보게 만들면 배포 직후 설정이 전부
9
- * 기본값으로 떨어진다.
7
+ * 값의 출처는 DB(`settings`) → env 순이다. 저장된 설정이 없으면 기동 시 전달된
8
+ * 환경변수를 사용하므로, 설정을 DB에 저장하기 전에도 기존 값이 유지된다.
10
9
  *
11
10
  * 설정은 요청 경로(permit 해석, 알림 전송)에서 읽히므로 매번 DB 를 때리지 않고 메모리에
12
11
  * 둔다. `immediate` 변경도 현재 API 프로세스에만 즉시 반영된다. 인스턴스가 여러 개면 다른
@@ -63,4 +62,4 @@ async function resetSetting(key, persistence = SettingModel) {
63
62
  //#endregion
64
63
  export { getSetting, isStored, loadSettings, resetSetting, saveSetting, setSettingChangeHandler };
65
64
 
66
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZy5zdG9yZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vc2V0dGluZy9zZXR0aW5nLnN0b3JlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog65+w7YOA7J6EIOyEpOyglSDsobDtmowg7LqQ7IucLlxuICpcbiAqIOqwkuydmCDstpzsspjripQgREIoYHNldHRpbmdzYCkg4oaSIGVudiDsiJzsnbTri6QuIGVudiDrpbwg64Ko6rKo65GQ64qUIOydtOycoOuKlCDsoITtmZgg65WM66y47J2064ukIOKAlCBkZXYwIOuKlFxuICogYGVjb3N5c3RlbS5jb25maWcuanNvbmAg7Jy866GcIOqwkuydhCDso7zsnoXtlZjripTrjbAsIERCIOunjCDrs7Tqsowg66eM65Ok66m0IOuwsO2PrCDsp4Htm4Qg7ISk7KCV7J20IOyghOu2gFxuICog6riw67O46rCS7Jy866GcIOuWqOyWtOynhOuLpC5cbiAqXG4gKiDshKTsoJXsnYAg7JqU7LKtIOqyveuhnChwZXJtaXQg7ZW07ISdLCDslYzrprwg7KCE7IahKeyXkOyEnCDsnb3tnojrr4DroZwg66ek67KIIERCIOulvCDrlYzrpqzsp4Ag7JWK6rOgIOuplOuqqOumrOyXkFxuICog65GU64ukLiBgaW1tZWRpYXRlYCDrs4Dqsr3rj4Qg7ZiE7J6sIEFQSSDtlITroZzshLjsiqTsl5Drp4wg7KaJ7IucIOuwmOyYgeuQnOuLpC4g7J247Iqk7YS07Iqk6rCAIOyXrOufrCDqsJzrqbQg64uk66W4XG4gKiDsnbjsiqTthLTsiqTsnZgg7LqQ7Iuc64qUIOqwseyLoOuQmOyngCDslYrsnLzrqbAsIOydtCDrspTsnITsl5DshJzripQg7ZSE66Gc7IS47IqkIOqwhCDsoITtjIzrpbwg65GQ7KeAIOyViuuKlOuLpC5cbiAqL1xuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgU2V0dGluZ01vZGVsIH0gZnJvbSBcIi4vc2V0dGluZy5tb2RlbFwiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJzZXR0aW5nXCJdKTtcblxuLyoqIOuhnOuTnCDsoITsl5DripQgbnVsbCDsnbTrnbwg7KCE67aAIGVudiDroZwg65ao7Ja07KeE64ukLiAqL1xubGV0IGNhY2hlOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHwgbnVsbCA9IG51bGw7XG5cbnR5cGUgU2V0dGluZ0NoYW5nZUhhbmRsZXIgPSAoa2V5OiBzdHJpbmcpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBTZXR0aW5nUGVyc2lzdGVuY2UgPSBQaWNrPFxuICB0eXBlb2YgU2V0dGluZ01vZGVsLFxuICBcImNsZWFyQnlLZXlcIiB8IFwiZmluZEFsbEFzTWFwXCIgfCBcInNldEJ5S2V5XCJcbj47XG5sZXQgc2V0dGluZ0NoYW5nZUhhbmRsZXI6IFNldHRpbmdDaGFuZ2VIYW5kbGVyIHwgbnVsbCA9IG51bGw7XG5cbi8qKlxuICog65+w7YOA7J6EIOyGjOu5hOyekOuKlCDsg4HsnIQg7KGw66a9IOqzhOy4teyXkOyEnCDtlZjrgpjrp4wg65Ox66Gd7ZWc64ukLiBoYW5kbGVyIOuKlCDrj5nquLAg7J6R7JeF66eMIO2VtOyVvCDtlZjrqbAsXG4gKiDsi6TtjKjtlbTrj4Qg7J2066+4IOyEseqzte2VnCBEQiDsoIDsnqXsnYQg7Iuk7Yyo66GcIOuwlOq+uOyngCDslYrripTri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRTZXR0aW5nQ2hhbmdlSGFuZGxlcihoYW5kbGVyOiBTZXR0aW5nQ2hhbmdlSGFuZGxlciB8IG51bGwpOiB2b2lkIHtcbiAgc2V0dGluZ0NoYW5nZUhhbmRsZXIgPSBoYW5kbGVyO1xufVxuXG5mdW5jdGlvbiBub3RpZnlTZXR0aW5nQ2hhbmdlZChrZXk6IHN0cmluZyk6IHZvaWQge1xuICB0cnkge1xuICAgIHNldHRpbmdDaGFuZ2VIYW5kbGVyPy4oa2V5KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSk7XG4gICAgbG9nZ2VyLndhcm4oYHNldHRpbmcgY2hhbmdlIGhhbmRsZXIgZmFpbGVkIGZvciAke2tleX06ICR7bWVzc2FnZX1gKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFNldHRpbmdzKHBlcnNpc3RlbmNlOiBTZXR0aW5nUGVyc2lzdGVuY2UgPSBTZXR0aW5nTW9kZWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjYWNoZSA9IGF3YWl0IHBlcnNpc3RlbmNlLmZpbmRBbGxBc01hcCgpO1xuICAgIGxvZ2dlci5pbmZvKGBzZXR0aW5ncyBsb2FkZWQ6ICR7Y2FjaGUuc2l6ZX0gc3RvcmVkYCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyDthYzsnbTruJTsnbQg7JWE7KeBIOyXhuuKlCDrsLDtj6wo66eI7J206re466CI7J207IWYIOyghCnsl5DshJzrj4Qg7ISc67KE64qUIOuWoOyVvCDtlZzri6QuXG4gICAgY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgbG9nZ2VyLndhcm4oYHNldHRpbmdzIGxvYWQgZmFpbGVkLCB1c2luZyBlbnYgb25seTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgfVxufVxuXG4vKiogREIg4oaSIGVudiDsiJwuIOuRmCDri6Qg7JeG7Jy866m0IHVuZGVmaW5lZCDrnbwg7Zi47Lac67aA7J2YIOq4sOuzuOqwkuycvOuhnCDrlqjslrTsp4Tri6QuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2V0dGluZyhrZXk6IHN0cmluZywgZW52S2V5Pzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNhY2hlPy5nZXQoa2V5KSA/PyAoZW52S2V5ID8gcHJvY2Vzcy5lbnZbZW52S2V5XSA6IHVuZGVmaW5lZCk7XG59XG5cbi8qKiDsoIDsnqXrkJwg6rCS7J247KeAIOKAlCDtmZTrqbTsl5DshJwg7Lac7LKY66W8IOq1rOu2hO2VtCDrs7Tsl6zspIDri6QuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdG9yZWQoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNhY2hlPy5oYXMoa2V5KSA/PyBmYWxzZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVTZXR0aW5nKFxuICBrZXk6IHN0cmluZyxcbiAgdmFsdWU6IHN0cmluZyxcbiAgcGVyc2lzdGVuY2U6IFNldHRpbmdQZXJzaXN0ZW5jZSA9IFNldHRpbmdNb2RlbCxcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBwZXJzaXN0ZW5jZS5zZXRCeUtleShrZXksIHZhbHVlKTtcbiAgY2FjaGUgPz89IG5ldyBNYXAoKTtcbiAgY2FjaGUuc2V0KGtleSwgdmFsdWUpO1xuICBub3RpZnlTZXR0aW5nQ2hhbmdlZChrZXkpO1xufVxuXG4vKiog7KCA7J6l6rCS7J2EIOyngOybjCBlbnYg6riw67O46rCS7Jy866GcIOuQmOuPjOumsOuLpC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNldFNldHRpbmcoXG4gIGtleTogc3RyaW5nLFxuICBwZXJzaXN0ZW5jZTogU2V0dGluZ1BlcnNpc3RlbmNlID0gU2V0dGluZ01vZGVsLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHBlcnNpc3RlbmNlLmNsZWFyQnlLZXkoa2V5KTtcbiAgY2FjaGU/LmRlbGV0ZShrZXkpO1xuICBub3RpZnlTZXR0aW5nQ2hhbmdlZChrZXkpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQWVBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyxTQUFTLENBQUM7O0FBRzdDLElBQUksUUFBb0M7QUFPeEMsSUFBSSx1QkFBb0Q7Ozs7O0FBTXhELFNBQWdCLHdCQUF3QixTQUE0QztDQUNsRix1QkFBdUI7QUFDekI7QUFFQSxTQUFTLHFCQUFxQixLQUFtQjtDQUMvQyxJQUFJO0VBQ0YsdUJBQXVCLEdBQUc7Q0FDNUIsU0FBUyxHQUFHO0VBQ1YsTUFBTSxVQUFVLGFBQWEsUUFBUSxFQUFFLFVBQVUsT0FBTyxDQUFDO0VBQ3pELE9BQU8sS0FBSyxxQ0FBcUMsSUFBSSxJQUFJLFNBQVM7Q0FDcEU7QUFDRjtBQUVBLGVBQXNCLGFBQWEsY0FBa0MsY0FBNkI7Q0FDaEcsSUFBSTtFQUNGLFFBQVEsTUFBTSxZQUFZLGFBQWE7RUFDdkMsT0FBTyxLQUFLLG9CQUFvQixNQUFNLEtBQUssUUFBUTtDQUNyRCxTQUFTLEdBQUc7RUFFVix3QkFBUSxJQUFJLElBQUk7RUFDaEIsT0FBTyxLQUFLLHlDQUEwQyxFQUFZLFNBQVM7Q0FDN0U7QUFDRjs7QUFHQSxTQUFnQixXQUFXLEtBQWEsUUFBcUM7Q0FDM0UsT0FBTyxPQUFPLElBQUksR0FBRyxNQUFNLFNBQVMsUUFBUSxJQUFJLFVBQVU7QUFDNUQ7O0FBR0EsU0FBZ0IsU0FBUyxLQUFzQjtDQUM3QyxPQUFPLE9BQU8sSUFBSSxHQUFHLEtBQUs7QUFDNUI7QUFFQSxlQUFzQixZQUNwQixLQUNBLE9BQ0EsY0FBa0MsY0FDbkI7Q0FDZixNQUFNLFlBQVksU0FBUyxLQUFLLEtBQUs7Q0FDckMsMEJBQVUsSUFBSSxJQUFJO0NBQ2xCLE1BQU0sSUFBSSxLQUFLLEtBQUs7Q0FDcEIscUJBQXFCLEdBQUc7QUFDMUI7O0FBR0EsZUFBc0IsYUFDcEIsS0FDQSxjQUFrQyxjQUNuQjtDQUNmLE1BQU0sWUFBWSxXQUFXLEdBQUc7Q0FDaEMsT0FBTyxPQUFPLEdBQUc7Q0FDakIscUJBQXFCLEdBQUc7QUFDMUIifQ==
65
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZy5zdG9yZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vc2V0dGluZy9zZXR0aW5nLnN0b3JlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog65+w7YOA7J6EIOyEpOyglSDsobDtmowg7LqQ7IucLlxuICpcbiAqIOqwkuydmCDstpzsspjripQgREIoYHNldHRpbmdzYCkg4oaSIGVudiDsiJzsnbTri6QuIOyggOyepeuQnCDshKTsoJXsnbQg7JeG7Jy866m0IOq4sOuPmSDsi5wg7KCE64us65CcXG4gKiDtmZjqsr3rs4DsiJjrpbwg7IKs7Jqp7ZWY66+A66GcLCDshKTsoJXsnYQgRELsl5Ag7KCA7J6l7ZWY6riwIOyghOyXkOuPhCDquLDsobQg6rCS7J20IOycoOyngOuQnOuLpC5cbiAqXG4gKiDshKTsoJXsnYAg7JqU7LKtIOqyveuhnChwZXJtaXQg7ZW07ISdLCDslYzrprwg7KCE7IahKeyXkOyEnCDsnb3tnojrr4DroZwg66ek67KIIERCIOulvCDrlYzrpqzsp4Ag7JWK6rOgIOuplOuqqOumrOyXkFxuICog65GU64ukLiBgaW1tZWRpYXRlYCDrs4Dqsr3rj4Qg7ZiE7J6sIEFQSSDtlITroZzshLjsiqTsl5Drp4wg7KaJ7IucIOuwmOyYgeuQnOuLpC4g7J247Iqk7YS07Iqk6rCAIOyXrOufrCDqsJzrqbQg64uk66W4XG4gKiDsnbjsiqTthLTsiqTsnZgg7LqQ7Iuc64qUIOqwseyLoOuQmOyngCDslYrsnLzrqbAsIOydtCDrspTsnITsl5DshJzripQg7ZSE66Gc7IS47IqkIOqwhCDsoITtjIzrpbwg65GQ7KeAIOyViuuKlOuLpC5cbiAqL1xuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgU2V0dGluZ01vZGVsIH0gZnJvbSBcIi4vc2V0dGluZy5tb2RlbFwiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJzZXR0aW5nXCJdKTtcblxuLyoqIOuhnOuTnCDsoITsl5DripQgbnVsbCDsnbTrnbwg7KCE67aAIGVudiDroZwg65ao7Ja07KeE64ukLiAqL1xubGV0IGNhY2hlOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHwgbnVsbCA9IG51bGw7XG5cbnR5cGUgU2V0dGluZ0NoYW5nZUhhbmRsZXIgPSAoa2V5OiBzdHJpbmcpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBTZXR0aW5nUGVyc2lzdGVuY2UgPSBQaWNrPFxuICB0eXBlb2YgU2V0dGluZ01vZGVsLFxuICBcImNsZWFyQnlLZXlcIiB8IFwiZmluZEFsbEFzTWFwXCIgfCBcInNldEJ5S2V5XCJcbj47XG5sZXQgc2V0dGluZ0NoYW5nZUhhbmRsZXI6IFNldHRpbmdDaGFuZ2VIYW5kbGVyIHwgbnVsbCA9IG51bGw7XG5cbi8qKlxuICog65+w7YOA7J6EIOyGjOu5hOyekOuKlCDsg4HsnIQg7KGw66a9IOqzhOy4teyXkOyEnCDtlZjrgpjrp4wg65Ox66Gd7ZWc64ukLiBoYW5kbGVyIOuKlCDrj5nquLAg7J6R7JeF66eMIO2VtOyVvCDtlZjrqbAsXG4gKiDsi6TtjKjtlbTrj4Qg7J2066+4IOyEseqzte2VnCBEQiDsoIDsnqXsnYQg7Iuk7Yyo66GcIOuwlOq+uOyngCDslYrripTri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRTZXR0aW5nQ2hhbmdlSGFuZGxlcihoYW5kbGVyOiBTZXR0aW5nQ2hhbmdlSGFuZGxlciB8IG51bGwpOiB2b2lkIHtcbiAgc2V0dGluZ0NoYW5nZUhhbmRsZXIgPSBoYW5kbGVyO1xufVxuXG5mdW5jdGlvbiBub3RpZnlTZXR0aW5nQ2hhbmdlZChrZXk6IHN0cmluZyk6IHZvaWQge1xuICB0cnkge1xuICAgIHNldHRpbmdDaGFuZ2VIYW5kbGVyPy4oa2V5KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSk7XG4gICAgbG9nZ2VyLndhcm4oYHNldHRpbmcgY2hhbmdlIGhhbmRsZXIgZmFpbGVkIGZvciAke2tleX06ICR7bWVzc2FnZX1gKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFNldHRpbmdzKHBlcnNpc3RlbmNlOiBTZXR0aW5nUGVyc2lzdGVuY2UgPSBTZXR0aW5nTW9kZWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjYWNoZSA9IGF3YWl0IHBlcnNpc3RlbmNlLmZpbmRBbGxBc01hcCgpO1xuICAgIGxvZ2dlci5pbmZvKGBzZXR0aW5ncyBsb2FkZWQ6ICR7Y2FjaGUuc2l6ZX0gc3RvcmVkYCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyDthYzsnbTruJTsnbQg7JWE7KeBIOyXhuuKlCDrsLDtj6wo66eI7J206re466CI7J207IWYIOyghCnsl5DshJzrj4Qg7ISc67KE64qUIOuWoOyVvCDtlZzri6QuXG4gICAgY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgbG9nZ2VyLndhcm4oYHNldHRpbmdzIGxvYWQgZmFpbGVkLCB1c2luZyBlbnYgb25seTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgfVxufVxuXG4vKiogREIg4oaSIGVudiDsiJwuIOuRmCDri6Qg7JeG7Jy866m0IHVuZGVmaW5lZCDrnbwg7Zi47Lac67aA7J2YIOq4sOuzuOqwkuycvOuhnCDrlqjslrTsp4Tri6QuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2V0dGluZyhrZXk6IHN0cmluZywgZW52S2V5Pzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNhY2hlPy5nZXQoa2V5KSA/PyAoZW52S2V5ID8gcHJvY2Vzcy5lbnZbZW52S2V5XSA6IHVuZGVmaW5lZCk7XG59XG5cbi8qKiDsoIDsnqXrkJwg6rCS7J247KeAIOKAlCDtmZTrqbTsl5DshJwg7Lac7LKY66W8IOq1rOu2hO2VtCDrs7Tsl6zspIDri6QuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdG9yZWQoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNhY2hlPy5oYXMoa2V5KSA/PyBmYWxzZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVTZXR0aW5nKFxuICBrZXk6IHN0cmluZyxcbiAgdmFsdWU6IHN0cmluZyxcbiAgcGVyc2lzdGVuY2U6IFNldHRpbmdQZXJzaXN0ZW5jZSA9IFNldHRpbmdNb2RlbCxcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBwZXJzaXN0ZW5jZS5zZXRCeUtleShrZXksIHZhbHVlKTtcbiAgY2FjaGUgPz89IG5ldyBNYXAoKTtcbiAgY2FjaGUuc2V0KGtleSwgdmFsdWUpO1xuICBub3RpZnlTZXR0aW5nQ2hhbmdlZChrZXkpO1xufVxuXG4vKiog7KCA7J6l6rCS7J2EIOyngOybjCBlbnYg6riw67O46rCS7Jy866GcIOuQmOuPjOumsOuLpC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNldFNldHRpbmcoXG4gIGtleTogc3RyaW5nLFxuICBwZXJzaXN0ZW5jZTogU2V0dGluZ1BlcnNpc3RlbmNlID0gU2V0dGluZ01vZGVsLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHBlcnNpc3RlbmNlLmNsZWFyQnlLZXkoa2V5KTtcbiAgY2FjaGU/LmRlbGV0ZShrZXkpO1xuICBub3RpZnlTZXR0aW5nQ2hhbmdlZChrZXkpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBY0EsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLFNBQVMsQ0FBQzs7QUFHN0MsSUFBSSxRQUFvQztBQU94QyxJQUFJLHVCQUFvRDs7Ozs7QUFNeEQsU0FBZ0Isd0JBQXdCLFNBQTRDO0NBQ2xGLHVCQUF1QjtBQUN6QjtBQUVBLFNBQVMscUJBQXFCLEtBQW1CO0NBQy9DLElBQUk7RUFDRix1QkFBdUIsR0FBRztDQUM1QixTQUFTLEdBQUc7RUFDVixNQUFNLFVBQVUsYUFBYSxRQUFRLEVBQUUsVUFBVSxPQUFPLENBQUM7RUFDekQsT0FBTyxLQUFLLHFDQUFxQyxJQUFJLElBQUksU0FBUztDQUNwRTtBQUNGO0FBRUEsZUFBc0IsYUFBYSxjQUFrQyxjQUE2QjtDQUNoRyxJQUFJO0VBQ0YsUUFBUSxNQUFNLFlBQVksYUFBYTtFQUN2QyxPQUFPLEtBQUssb0JBQW9CLE1BQU0sS0FBSyxRQUFRO0NBQ3JELFNBQVMsR0FBRztFQUVWLHdCQUFRLElBQUksSUFBSTtFQUNoQixPQUFPLEtBQUsseUNBQTBDLEVBQVksU0FBUztDQUM3RTtBQUNGOztBQUdBLFNBQWdCLFdBQVcsS0FBYSxRQUFxQztDQUMzRSxPQUFPLE9BQU8sSUFBSSxHQUFHLE1BQU0sU0FBUyxRQUFRLElBQUksVUFBVTtBQUM1RDs7QUFHQSxTQUFnQixTQUFTLEtBQXNCO0NBQzdDLE9BQU8sT0FBTyxJQUFJLEdBQUcsS0FBSztBQUM1QjtBQUVBLGVBQXNCLFlBQ3BCLEtBQ0EsT0FDQSxjQUFrQyxjQUNuQjtDQUNmLE1BQU0sWUFBWSxTQUFTLEtBQUssS0FBSztDQUNyQywwQkFBVSxJQUFJLElBQUk7Q0FDbEIsTUFBTSxJQUFJLEtBQUssS0FBSztDQUNwQixxQkFBcUIsR0FBRztBQUMxQjs7QUFHQSxlQUFzQixhQUNwQixLQUNBLGNBQWtDLGNBQ25CO0NBQ2YsTUFBTSxZQUFZLFdBQVcsR0FBRztDQUNoQyxPQUFPLE9BQU8sR0FBRztDQUNqQixxQkFBcUIsR0FBRztBQUMxQiJ9