@cartanova/qgrid-cli 2.1.1 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/bundle/dist/application/qgrid/conv-routing.js +68 -0
  2. package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +2 -2
  3. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +16 -15
  4. package/bundle/dist/application/qgrid/qgrid.frame.js +11 -4
  5. package/bundle/dist/application/qgrid/qgrid.types.js +12 -3
  6. package/bundle/dist/application/qgrid/tool-emulation.js +11 -6
  7. package/bundle/dist/utils/providers/common/model-cost.js +32 -17
  8. package/bundle/dist/utils/providers/openai/codex-worker.js +65 -21
  9. package/bundle/dist/utils/providers/openai/openai-dispatcher.js +65 -21
  10. package/bundle/src/application/qgrid/conv-routing.ts +97 -0
  11. package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +2 -1
  12. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +16 -5
  13. package/bundle/src/application/qgrid/qgrid.frame.ts +11 -3
  14. package/bundle/src/application/qgrid/qgrid.types.ts +14 -1
  15. package/bundle/src/application/qgrid/tool-emulation.ts +20 -5
  16. package/bundle/src/application/sonamu.generated.http +14 -2
  17. package/bundle/src/utils/providers/common/model-cost.ts +55 -9
  18. package/bundle/src/utils/providers/common/provider-dispatcher.ts +29 -2
  19. package/bundle/src/utils/providers/openai/codex-worker.test.ts +91 -0
  20. package/bundle/src/utils/providers/openai/codex-worker.ts +105 -19
  21. package/bundle/src/utils/providers/openai/openai-dispatcher.ts +104 -27
  22. package/bundle/web-dist/client/assets/cost-CpjVoAqp.js +1 -0
  23. package/bundle/web-dist/client/assets/{index-ZV-tHpAg.js → index-DeThumA3.js} +2 -2
  24. package/bundle/web-dist/client/assets/logs-CtmOVH58.js +1 -0
  25. package/bundle/web-dist/client/assets/{routes-BMRwPj6F.js → routes-Cfoe9J0I.js} +1 -1
  26. package/bundle/web-dist/client/assets/show-C6OofoAL.js +30 -0
  27. package/bundle/web-dist/client/assets/{tokens-Cg1f0Ga2.js → tokens-BAZq8sTo.js} +1 -1
  28. package/bundle/web-dist/client/index.html +1 -1
  29. package/bundle/web-dist/server/assets/cost-DzjfVtUr.js +24 -0
  30. package/bundle/web-dist/server/assets/{logs-Xt934T5f.js → logs-CHM0fhfO.js} +2 -7
  31. package/bundle/web-dist/server/assets/{routes-B7QYbNIv.js → routes-C9xFMJ_r.js} +1 -1
  32. package/bundle/web-dist/server/assets/{show-Dxz6UJnD.js → show-BZWqH09U.js} +2 -4
  33. package/bundle/web-dist/server/entry-server.generated.js +3 -3
  34. package/package.json +1 -1
  35. package/bundle/web-dist/client/assets/cost-DE_8cLD-.js +0 -1
  36. package/bundle/web-dist/client/assets/logs-HJYkbqom.js +0 -1
  37. package/bundle/web-dist/client/assets/show-DI6iWDzV.js +0 -30
  38. package/bundle/web-dist/server/assets/cost-DdHTzQDR.js +0 -14
@@ -0,0 +1,68 @@
1
+ import "../../_virtual/_rolldown/runtime.js";
2
+ import { createHash } from "node:crypto";
3
+ //#region src/application/qgrid/conv-routing.ts
4
+ /**
5
+ * conv-routing — conversation(=codex thread) 재사용을 위한 thread 좌표 검증/구성.
6
+ *
7
+ * 목표: thread(=conversation_id=prompt_cache_key)를 재사용해 OpenAI prompt caching 적중.
8
+ * - 후속 turn: 기존 thread 에 delta(마지막 user / tool 결과)만 보냄 (history inject 없음).
9
+ * - 첫 turn / 검증 실패: 새 thread + history inject (폴백, 정확성 보존).
10
+ *
11
+ * 식별: 서버 발급 불투명 thread 좌표(QgridThreadCoord)를 클라가 그대로 회송.
12
+ * 검증: systemHash(다른 대화 오접속 차단) + (dispatcher의) epoch/worker 생존.
13
+ */
14
+ function systemHash(system) {
15
+ return createHash("sha256").update(system ?? "").digest("hex").slice(0, 16);
16
+ }
17
+ function toolResultsToText(toolResults) {
18
+ return `${toolResults.map((tr) => {
19
+ const name = tr.toolName ? ` (${tr.toolName})` : "";
20
+ const errMark = tr.isError ? " [error]" : "";
21
+ return `Tool result for call ${tr.toolCallId}${name}${errMark}: ${tr.output}`;
22
+ }).join("\n")}\n\nNow continue answering the user's request using these results.`;
23
+ }
24
+ function decideConvRouting(input) {
25
+ const sysHash = systemHash(input.system);
26
+ const history = input.history ? JSON.parse(input.history) : void 0;
27
+ const coord = input.runContext?.threadCoord;
28
+ const eligible = coord !== void 0 && coord.systemHash === sysHash;
29
+ return {
30
+ reuse: eligible && coord ? {
31
+ workerId: coord.workerId,
32
+ threadId: coord.threadId,
33
+ epoch: coord.epoch
34
+ } : void 0,
35
+ reuseInput: eligible ? buildDeltaInput(input) : void 0,
36
+ coldInput: [{
37
+ type: "text",
38
+ text: input.prompt,
39
+ text_elements: []
40
+ }],
41
+ coldHistory: history,
42
+ systemHash: sysHash
43
+ };
44
+ }
45
+ function buildDeltaInput(input) {
46
+ if (input.toolResults && input.toolResults.length > 0) return [{
47
+ type: "text",
48
+ text: toolResultsToText(input.toolResults),
49
+ text_elements: []
50
+ }];
51
+ return [{
52
+ type: "text",
53
+ text: input.prompt,
54
+ text_elements: []
55
+ }];
56
+ }
57
+ function issueConvContext(threadCoord, decision) {
58
+ return {
59
+ workerId: threadCoord.workerId,
60
+ threadId: threadCoord.threadId,
61
+ epoch: threadCoord.epoch,
62
+ systemHash: decision.systemHash
63
+ };
64
+ }
65
+ //#endregion
66
+ export { decideConvRouting, issueConvContext, systemHash };
67
+
68
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udi1yb3V0aW5nLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHBsaWNhdGlvbi9xZ3JpZC9jb252LXJvdXRpbmcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBjb252LXJvdXRpbmcg4oCUIGNvbnZlcnNhdGlvbig9Y29kZXggdGhyZWFkKSDsnqzsgqzsmqnsnYQg7JyE7ZWcIHRocmVhZCDsooztkZwg6rKA7KadL+q1rOyEsS5cbiAqXG4gKiDrqqntkZw6IHRocmVhZCg9Y29udmVyc2F0aW9uX2lkPXByb21wdF9jYWNoZV9rZXkp66W8IOyerOyCrOyaqe2VtCBPcGVuQUkgcHJvbXB0IGNhY2hpbmcg7KCB7KSRLlxuICogLSDtm4Tsho0gdHVybjog6riw7KG0IHRocmVhZCDsl5AgZGVsdGEo66eI7KeA66eJIHVzZXIgLyB0b29sIOqysOqzvCnrp4wg67O064OEIChoaXN0b3J5IGluamVjdCDsl4bsnYwpLlxuICogLSDssqsgdHVybiAvIOqygOymnSDsi6TtjKg6IOyDiCB0aHJlYWQgKyBoaXN0b3J5IGluamVjdCAo7Y+067CxLCDsoJXtmZXshLEg67O07KG0KS5cbiAqXG4gKiDsi53rs4Q6IOyEnOuyhCDrsJzquIkg67aI7Yis66qFIHRocmVhZCDsooztkZwoUWdyaWRUaHJlYWRDb29yZCnrpbwg7YG065286rCAIOq3uOuMgOuhnCDtmozshqEuXG4gKiDqsoDspp06IHN5c3RlbUhhc2go64uk66W4IOuMgO2ZlCDsmKTsoJHsho0g7LCo64uoKSArIChkaXNwYXRjaGVy7J2YKSBlcG9jaC93b3JrZXIg7IOd7KG0LlxuICovXG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmltcG9ydCB7IHR5cGUgSnNvblZhbHVlIH0gZnJvbSBcIi4uLy4uL2NvZGV4LXByb3RvY29sL3NlcmRlX2pzb24vSnNvblZhbHVlXCI7XG5pbXBvcnQgeyB0eXBlIFVzZXJJbnB1dCB9IGZyb20gXCIuLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Vc2VySW5wdXRcIjtcbmltcG9ydCB7IHR5cGUgUmV1c2VUaHJlYWRDb29yZCB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IHR5cGUgUWdyaWRUaHJlYWRDb29yZCwgdHlwZSBRdWVyeUlucHV0LCB0eXBlIFFncmlkVG9vbFJlc3VsdElucHV0IH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHN5c3RlbUhhc2goc3lzdGVtPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyZWF0ZUhhc2goXCJzaGEyNTZcIilcbiAgICAudXBkYXRlKHN5c3RlbSA/PyBcIlwiKVxuICAgIC5kaWdlc3QoXCJoZXhcIilcbiAgICAuc2xpY2UoMCwgMTYpO1xufVxuXG4vLyB0b29sIOqysOqzvOulvCDri6TsnYwgdHVybiDsnZggaW5wdXQgdGV4dCDroZwg67OA7ZmYIChjb2RleCB0dXJuL3N0YXJ0LmlucHV0IOydgCBVc2VySW5wdXQg66eMIOuwm+ydjCkuXG5mdW5jdGlvbiB0b29sUmVzdWx0c1RvVGV4dCh0b29sUmVzdWx0czogUWdyaWRUb29sUmVzdWx0SW5wdXRbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzID0gdG9vbFJlc3VsdHMubWFwKCh0cikgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSB0ci50b29sTmFtZSA/IGAgKCR7dHIudG9vbE5hbWV9KWAgOiBcIlwiO1xuICAgIGNvbnN0IGVyck1hcmsgPSB0ci5pc0Vycm9yID8gXCIgW2Vycm9yXVwiIDogXCJcIjtcbiAgICByZXR1cm4gYFRvb2wgcmVzdWx0IGZvciBjYWxsICR7dHIudG9vbENhbGxJZH0ke25hbWV9JHtlcnJNYXJrfTogJHt0ci5vdXRwdXR9YDtcbiAgfSk7XG4gIHJldHVybiBgJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcblxcbk5vdyBjb250aW51ZSBhbnN3ZXJpbmcgdGhlIHVzZXIncyByZXF1ZXN0IHVzaW5nIHRoZXNlIHJlc3VsdHMuYDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb252RGVjaXNpb24ge1xuICAvLyBkaXNwYXRjaGVyIOuhnCDrhJjquLggcmV1c2Ug7KKM7ZGcICjqsoDspp0g7Ya16rO8IOyLnOyXkOunjCkuIGRpc3BhdGNoZXIg6rCAIGVwb2NoL3dvcmtlciDsg53sobQg7J6s6rKA7KadIO2bhCDtj7TrsLEg6rCA64qlLlxuICByZXVzZT86IFJldXNlVGhyZWFkQ29vcmQ7XG4gIC8vIOyerOyCrOyaqSDshLHqs7Ug7IucIHR1cm4vc3RhcnQg7JeQIOuztOuCvCBpbnB1dCDigJQgZGVsdGEo66eI7KeA66eJIHVzZXIvdG9vbCDqsrDqs7wp66eMLiByZXVzZSDqsIAg7J6I7J2EIOuVjOunjCDshKTsoJUuXG4gIHJldXNlSW5wdXQ/OiBBcnJheTxVc2VySW5wdXQ+O1xuICAvLyDssqsgdHVybiAvIOyerOyCrOyaqSDtj7TrsLEg7IucIOuztOuCvCBpbnB1dCDigJQg7KCE7LK0IHByb21wdC4g7ZWt7IOBIOyEpOyglSjtj7TrsLEg7JWI7KCE66edKS5cbiAgY29sZElucHV0OiBBcnJheTxVc2VySW5wdXQ+O1xuICAvLyDsg4ggdGhyZWFkIOydvCDrlYwgaW5qZWN0IO2VoCDsoITssrQgaGlzdG9yeS4g7J6s7IKs7JqpIOyEseqztSDsi5zsl5QgZGlzcGF0Y2hlciDqsIAg7JWIIOyTtOuLpCh0aHJlYWQg6rCAIOydtOuvuCDriITsoIEpLlxuICBjb2xkSGlzdG9yeT86IEFycmF5PEpzb25WYWx1ZT47XG4gIC8vIOydtCDsmpTssq0g7Iuc7KCQ7J2YIHN5c3RlbSDtlbTsi5wgKOydkeuLteyXkOyEnCB0aHJlYWQg7KKM7ZGcIOuwnOq4iSDsi5wg7IKs7JqpKS5cbiAgc3lzdGVtSGFzaDogc3RyaW5nO1xufVxuXG4vLyB0aHJlYWQg7KKM7ZGcICsg65Ok7Ja07JioIOyalOyyreycvOuhnCBcIuyerOyCrOyaqSDqsIDriqXtlZzqsIBcIuulvCDtjJDsoJXtlZjqs6AsIHJldXNlL2NvbGQg7JaR7Kq9IHBheWxvYWQg66W8IOq1rOyEse2VnOuLpC5cbi8vIGRpc3BhdGNoZXIg64uo7J2YIGVwb2NoL3dvcmtlciDsg53sobQg6rKA7Kad7J2AIOyXrOq4sOyEnCDrqrsg7ZWY66+A66GcKOyDge2DnCDsl4bsnYwpIHJldXNlIOyijO2RnCArIOuRkCBwYXlsb2FkIOulvFxuLy8g66qo65GQIOuEmOq4sOqzoCwgZGlzcGF0Y2hlciDsnZggYWNxdWlyZVJldXNlV29ya2VyIOqysOqzvOyXkCDrlLDrnbwgcmV1c2UoZGVsdGEpIOuYkOuKlCBjb2xkKOyghOyytCkg66W8IOqzoOuluOuLpC5cbi8vIOyWkeyqveydhCDri6Qg65Ok6rOgIOqwgOyVvCByZXVzZSDqsIAg7Iuk7Yyo66GcIO2PtOuwseuPvOuPhCDsoITssrQgaGlzdG9yeSDroZwg66y466el7J2EIOuzteq1rO2VoCDsiJgg7J6I64ukLlxuZXhwb3J0IGZ1bmN0aW9uIGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0OiBRdWVyeUlucHV0KTogQ29udkRlY2lzaW9uIHtcbiAgY29uc3Qgc3lzSGFzaCA9IHN5c3RlbUhhc2goaW5wdXQuc3lzdGVtKTtcbiAgY29uc3QgaGlzdG9yeTogQXJyYXk8SnNvblZhbHVlPiB8IHVuZGVmaW5lZCA9IGlucHV0Lmhpc3RvcnlcbiAgICA/IChKU09OLnBhcnNlKGlucHV0Lmhpc3RvcnkpIGFzIEFycmF5PEpzb25WYWx1ZT4pXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgY29vcmQgPSBpbnB1dC5ydW5Db250ZXh0Py50aHJlYWRDb29yZDtcblxuICAvLyDsnqzsgqzsmqkg7J6Q6rKpOiDsooztkZwg7KG07J6sICsgc3lzdGVtIOuPmeydvC4gc2Vzc2lvbktleSDqsqnrpqwgKyBzeXN0ZW1IYXNoIOuhnCDrjIDtmZQg64+Z7J287ISx7J20XG4gIC8vIOuztOyepeuQmOqzoCwg6rO17Ya1IHByZWZpeCDripQgY29kZXgg6rCAIHByb21wdF9jYWNoZV9rZXkg6rOg7KCV7Jy866GcIOyVjOyVhOyEnCDsupDsi5ztlZzri6QuXG4gIGNvbnN0IGVsaWdpYmxlID0gY29vcmQgIT09IHVuZGVmaW5lZCAmJiBjb29yZC5zeXN0ZW1IYXNoID09PSBzeXNIYXNoO1xuXG4gIHJldHVybiB7XG4gICAgcmV1c2U6XG4gICAgICBlbGlnaWJsZSAmJiBjb29yZFxuICAgICAgICA/IHsgd29ya2VySWQ6IGNvb3JkLndvcmtlcklkLCB0aHJlYWRJZDogY29vcmQudGhyZWFkSWQsIGVwb2NoOiBjb29yZC5lcG9jaCB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIC8vIOyerOyCrOyaqSB0dXJuIOydgCBkZWx0YSjrp4jsp4Drp4kgdXNlci90b29sIOqysOqzvCnrp4wg4oCUIHRocmVhZCDqsIAg7J2066+4IOydtOyghCB0dXJuIOuTpOydhCDriITsoIEuXG4gICAgcmV1c2VJbnB1dDogZWxpZ2libGUgPyBidWlsZERlbHRhSW5wdXQoaW5wdXQpIDogdW5kZWZpbmVkLFxuICAgIC8vIOyyqyB0dXJuIC8g7Y+067CxOiDsoITssrQgcHJvbXB0ICsgaGlzdG9yeSBpbmplY3QuXG4gICAgY29sZElucHV0OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogaW5wdXQucHJvbXB0LCB0ZXh0X2VsZW1lbnRzOiBbXSB9XSxcbiAgICBjb2xkSGlzdG9yeTogaGlzdG9yeSxcbiAgICBzeXN0ZW1IYXNoOiBzeXNIYXNoLFxuICB9O1xufVxuXG4vLyDtm4Tsho0gdHVybiDsnZggaW5wdXQ6IHRvb2wg6rKw6rO86rCAIOyeiOycvOuptCDqt7jqsbggdGV4dCDroZwsIOyXhuycvOuptCDrp4jsp4Drp4kgdXNlcihwcm9tcHQpLlxuZnVuY3Rpb24gYnVpbGREZWx0YUlucHV0KGlucHV0OiBRdWVyeUlucHV0KTogQXJyYXk8VXNlcklucHV0PiB7XG4gIGlmIChpbnB1dC50b29sUmVzdWx0cyAmJiBpbnB1dC50b29sUmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiB0b29sUmVzdWx0c1RvVGV4dChpbnB1dC50b29sUmVzdWx0cyksIHRleHRfZWxlbWVudHM6IFtdIH1dO1xuICB9XG4gIHJldHVybiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogaW5wdXQucHJvbXB0LCB0ZXh0X2VsZW1lbnRzOiBbXSB9XTtcbn1cblxuLy8g7J2R64u1IHRocmVhZENvb3JkICsg7JqU7LKtIOyLnOygkCDsoJXrs7TroZwg64uk7J2MIHRocmVhZCDsooztkZzrpbwg67Cc6riJ7ZWc64ukLlxuZXhwb3J0IGZ1bmN0aW9uIGlzc3VlQ29udkNvbnRleHQoXG4gIHRocmVhZENvb3JkOiBSZXVzZVRocmVhZENvb3JkLFxuICBkZWNpc2lvbjogQ29udkRlY2lzaW9uLFxuKTogUWdyaWRUaHJlYWRDb29yZCB7XG4gIHJldHVybiB7XG4gICAgd29ya2VySWQ6IHRocmVhZENvb3JkLndvcmtlcklkLFxuICAgIHRocmVhZElkOiB0aHJlYWRDb29yZC50aHJlYWRJZCxcbiAgICBlcG9jaDogdGhyZWFkQ29vcmQuZXBvY2gsXG4gICAgc3lzdGVtSGFzaDogZGVjaXNpb24uc3lzdGVtSGFzaCxcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQWlCQSxTQUFnQixXQUFXLFFBQXlCO0FBQ2xELFFBQU8sV0FBVyxTQUFTLENBQ3hCLE9BQU8sVUFBVSxHQUFHLENBQ3BCLE9BQU8sTUFBTSxDQUNiLE1BQU0sR0FBRyxHQUFHOztBQUlqQixTQUFTLGtCQUFrQixhQUE2QztBQU10RSxRQUFPLEdBTE8sWUFBWSxLQUFLLE9BQU87RUFDcEMsTUFBTSxPQUFPLEdBQUcsV0FBVyxLQUFLLEdBQUcsU0FBUyxLQUFLO0VBQ2pELE1BQU0sVUFBVSxHQUFHLFVBQVUsYUFBYTtBQUMxQyxTQUFPLHdCQUF3QixHQUFHLGFBQWEsT0FBTyxRQUFRLElBQUksR0FBRztHQUNyRSxDQUNjLEtBQUssS0FBSyxDQUFDOztBQW9CN0IsU0FBZ0Isa0JBQWtCLE9BQWlDO0NBQ2pFLE1BQU0sVUFBVSxXQUFXLE1BQU0sT0FBTztDQUN4QyxNQUFNLFVBQXdDLE1BQU0sVUFDL0MsS0FBSyxNQUFNLE1BQU0sUUFBUSxHQUMxQjtDQUVKLE1BQU0sUUFBUSxNQUFNLFlBQVk7Q0FJaEMsTUFBTSxXQUFXLFVBQVUsVUFBYSxNQUFNLGVBQWU7QUFFN0QsUUFBTztFQUNMLE9BQ0UsWUFBWSxRQUNSO0dBQUUsVUFBVSxNQUFNO0dBQVUsVUFBVSxNQUFNO0dBQVUsT0FBTyxNQUFNO0dBQU8sR0FDMUU7RUFFTixZQUFZLFdBQVcsZ0JBQWdCLE1BQU0sR0FBRztFQUVoRCxXQUFXLENBQUM7R0FBRSxNQUFNO0dBQVEsTUFBTSxNQUFNO0dBQVEsZUFBZSxFQUFFO0dBQUUsQ0FBQztFQUNwRSxhQUFhO0VBQ2IsWUFBWTtFQUNiOztBQUlILFNBQVMsZ0JBQWdCLE9BQXFDO0FBQzVELEtBQUksTUFBTSxlQUFlLE1BQU0sWUFBWSxTQUFTLEVBQ2xELFFBQU8sQ0FBQztFQUFFLE1BQU07RUFBUSxNQUFNLGtCQUFrQixNQUFNLFlBQVk7RUFBRSxlQUFlLEVBQUU7RUFBRSxDQUFDO0FBRTFGLFFBQU8sQ0FBQztFQUFFLE1BQU07RUFBUSxNQUFNLE1BQU07RUFBUSxlQUFlLEVBQUU7RUFBRSxDQUFDOztBQUlsRSxTQUFnQixpQkFDZCxhQUNBLFVBQ2tCO0FBQ2xCLFFBQU87RUFDTCxVQUFVLFlBQVk7RUFDdEIsVUFBVSxZQUFZO0VBQ3RCLE9BQU8sWUFBWTtFQUNuQixZQUFZLFNBQVM7RUFDdEIifQ==
@@ -30,7 +30,7 @@ async function beforeQuery(args) {
30
30
  await cleanupStaleRuns();
31
31
  let requestLogId;
32
32
  let stepIndex = 0;
33
- if (args.runContext) {
33
+ if (args.runContext?.requestLogId !== void 0) {
34
34
  requestLogId = args.runContext.requestLogId;
35
35
  if (args.toolResults && args.toolResults.length > 0) await completeToolResults(requestLogId, args.toolResults);
36
36
  stepIndex = await RequestLogModel.getNextStepIndex(requestLogId);
@@ -134,4 +134,4 @@ async function cleanupStaleRuns() {
134
134
  //#endregion
135
135
  export { afterQuery, beforeQuery, finishRunAborted, finishRunWithError };
136
136
 
137
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQtcnVuLWxpZmVjeWNsZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQtcnVuLWxpZmVjeWNsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBSZXF1ZXN0TG9nTW9kZWwgfSBmcm9tIFwiLi4vcmVxdWVzdC1sb2cvcmVxdWVzdC1sb2cubW9kZWxcIjtcbmltcG9ydCB7XG4gIHR5cGUgUWdyaWRSdW5Db250ZXh0LFxuICB0eXBlIFFncmlkVG9vbFJlc3VsdElucHV0LFxuICB0eXBlIFF1ZXJ5SW5wdXQsXG4gIHR5cGUgUXVlcnlPdXRwdXQsXG59IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInJ1bi1saWZlY3ljbGVcIl0pO1xuY29uc3QgU1RBTEVfUlVOX1RIUkVTSE9MRF9NUyA9IDMwICogNjAgKiAxMDAwO1xuXG4vKipcbiAqIGhpc3RvcnnripQg7JuQ67O4IOq3uOuMgOuhnCDsoIDsnqXtlZjquLDrs7Tri6TripQsIHJ1biDrtoTshJ3sl5Ag7ZWE7JqU7ZWcIHVzZXIvYXNzaXN0YW50IOygleuztOunjCDtlYTthLDrp4HtlbTshJwg7KCA7J6lXG4gKi9cbmZ1bmN0aW9uIGZpbHRlckhpc3RvcnlGb3JTdG9yYWdlKHJhd0hpc3Rvcnk6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHVua25vd24ge1xuICBpZiAoIXJhd0hpc3RvcnkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgaXRlbXMgPSBKU09OLnBhcnNlKHJhd0hpc3RvcnkpIGFzIHVua25vd25bXTtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgaWYgKCFpdGVtIHx8IHR5cGVvZiBpdGVtICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZWNvcmQgPSBpdGVtIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgcmV0dXJuIHJlY29yZC50eXBlID09PSBcIm1lc3NhZ2VcIiAmJiAocmVjb3JkLnJvbGUgPT09IFwidXNlclwiIHx8IHJlY29yZC5yb2xlID09PSBcImFzc2lzdGFudFwiKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZmlsdGVyZWQubGVuZ3RoID4gMCA/IGZpbHRlcmVkIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFJ1bkxpZmVjeWNsZVJlc3VsdCA9IHtcbiAgcnVuQ29udGV4dD86IFFncmlkUnVuQ29udGV4dDtcbn07XG5cbi8qKlxuICogbG9nTW9kZTpcInJ1blwiIOyLnCBxdWVyeS9zdHJlYW0g7J2R64u1IOyghO2bhOyXkCDtmLjstpwuXG4gKlxuICogMSkgYmVmb3JlUXVlcnk6IHJ1biDsg53shLEv6rOE7IaNICsgdG9vbCByZXN1bHQg7JmE66OMICsgc3RhbGUgY2xlYW51cFxuICogMikgYWZ0ZXJRdWVyeTogZ2VuZXJhdGUgc3RlcCArIHRvb2wtY2FsbCBzdGVwICsgZmluaXNoL2tlZXAtb3BlblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYmVmb3JlUXVlcnkoYXJnczogUXVlcnlJbnB1dCk6IFByb21pc2U8e1xuICByZXF1ZXN0TG9nSWQ6IG51bWJlcjtcbiAgc3RlcEluZGV4OiBudW1iZXI7XG59PiB7XG4gIGF3YWl0IGNsZWFudXBTdGFsZVJ1bnMoKTtcblxuICBsZXQgcmVxdWVzdExvZ0lkOiBudW1iZXI7XG4gIGxldCBzdGVwSW5kZXggPSAwO1xuXG4gIGlmIChhcmdzLnJ1bkNvbnRleHQpIHtcbiAgICByZXF1ZXN0TG9nSWQgPSBhcmdzLnJ1bkNvbnRleHQucmVxdWVzdExvZ0lkO1xuXG4gICAgaWYgKGFyZ3MudG9vbFJlc3VsdHMgJiYgYXJncy50b29sUmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCBjb21wbGV0ZVRvb2xSZXN1bHRzKHJlcXVlc3RMb2dJZCwgYXJncy50b29sUmVzdWx0cyk7XG4gICAgfVxuXG4gICAgc3RlcEluZGV4ID0gYXdhaXQgUmVxdWVzdExvZ01vZGVsLmdldE5leHRTdGVwSW5kZXgocmVxdWVzdExvZ0lkKTtcbiAgfSBlbHNlIHtcbiAgICByZXF1ZXN0TG9nSWQgPSBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuY3JlYXRlUnVuKHtcbiAgICAgIHVzZXJfcHJvbXB0OiBhcmdzLnByb21wdCxcbiAgICAgIHN5c3RlbV9wcm9tcHQ6IGFyZ3Muc3lzdGVtLFxuICAgICAgbW9kZWxfbmFtZTogYXJncy5tb2RlbCxcbiAgICAgIGVmZm9ydDogYXJncy5lZmZvcnQsXG4gICAgICBwcm9qZWN0X25hbWU6IGFyZ3MucHJvamVjdE5hbWUsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4geyByZXF1ZXN0TG9nSWQsIHN0ZXBJbmRleCB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWZ0ZXJRdWVyeShcbiAgcmVxdWVzdExvZ0lkOiBudW1iZXIsXG4gIHN0ZXBJbmRleDogbnVtYmVyLFxuICBhcmdzOiBRdWVyeUlucHV0LFxuICByZXN1bHQ6IFF1ZXJ5T3V0cHV0LFxuKTogUHJvbWlzZTxSdW5MaWZlY3ljbGVSZXN1bHQ+IHtcbiAgLy8gZ2VuZXJhdGUgc3RlcCDquLDroZ1cbiAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFwcGVuZFN0ZXAocmVxdWVzdExvZ0lkLCB7XG4gICAgc3RlcF9pbmRleDogc3RlcEluZGV4LFxuICAgIHR5cGU6IFwiZ2VuZXJhdGVcIixcbiAgICBpbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5pbnB1dF90b2tlbnMsXG4gICAgb3V0cHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLm91dHB1dF90b2tlbnMsXG4gICAgY2FjaGVfcmVhZF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZV9yZWFkX2lucHV0X3Rva2VucyxcbiAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnMsXG4gICAgZHVyYXRpb25fbXM6IHJlc3VsdC5kdXJhdGlvbk1zLFxuICAgIGZpbmlzaF9yZWFzb246IHJlc3VsdC5maW5pc2hSZWFzb24sXG4gIH0pO1xuXG4gIGlmIChyZXN1bHQuZmluaXNoUmVhc29uID09PSBcInRvb2wtY2FsbHNcIikge1xuICAgIC8vIHRvb2wtY2FsbCBzdGVwIOymieyLnCDquLDroZ0gKHJlc3VsdOuKlCDrgpjspJHsl5AgY29tcGxldGVUb29sQ2FsbOuhnCDssYTsm4ApXG4gICAgY29uc3QgdG9vbENhbGxzID0gcmVzdWx0LmNvbnRlbnQuZmlsdGVyKChjKSA9PiBjLnR5cGUgPT09IFwidG9vbC1jYWxsXCIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9vbENhbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB0YyA9IHRvb2xDYWxsc1tpXSE7XG4gICAgICBpZiAodGMudHlwZSAhPT0gXCJ0b29sLWNhbGxcIikgY29udGludWU7XG4gICAgICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuYXBwZW5kU3RlcChyZXF1ZXN0TG9nSWQsIHtcbiAgICAgICAgc3RlcF9pbmRleDogc3RlcEluZGV4LFxuICAgICAgICB0eXBlOiBcInRvb2xfY2FsbFwiLFxuICAgICAgICB0b29sX2NhbGxfaW5kZXg6IGksXG4gICAgICAgIHRvb2xfY2FsbF9pZDogdGMudG9vbENhbGxJZCxcbiAgICAgICAgdG9vbF9uYW1lOiB0Yy50b29sTmFtZSxcbiAgICAgICAgdG9vbF9hcmdzOiB0Yy5pbnB1dCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7IHJ1bkNvbnRleHQ6IHsgcmVxdWVzdExvZ0lkIH0gfTtcbiAgfVxuXG4gIC8vIGZpbmlzaFJlYXNvbiA9PT0gXCJzdG9wXCIg4oaSIHJ1biDsooXro4wgKOyghOyytCBzdGVwIHVzYWdlIO2VqeyCsClcbiAgY29uc3QgYWdnID0gYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFnZ3JlZ2F0ZVN0ZXBVc2FnZShyZXF1ZXN0TG9nSWQpO1xuICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZmluaXNoUnVuKHJlcXVlc3RMb2dJZCwge1xuICAgIHN0YXR1czogXCJzdWNjZWVkZWRcIixcbiAgICByZXNwb25zZTogcmVzdWx0LnRleHQsXG4gICAgdG9rZW5fbmFtZTogcmVzdWx0LnRva2VuTmFtZSxcbiAgICBpbnB1dF90b2tlbnM6IGFnZy5pbnB1dF90b2tlbnMsXG4gICAgb3V0cHV0X3Rva2VuczogYWdnLm91dHB1dF90b2tlbnMsXG4gICAgY2FjaGVfcmVhZF90b2tlbnM6IGFnZy5jYWNoZV9yZWFkX3Rva2VucyxcbiAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IGFnZy5jYWNoZV9jcmVhdGlvbl90b2tlbnMsXG4gICAgZHVyYXRpb25fbXM6IGFnZy5kdXJhdGlvbl9tcyxcbiAgICBoaXN0b3J5OiBmaWx0ZXJIaXN0b3J5Rm9yU3RvcmFnZShhcmdzLmhpc3RvcnkpLFxuICB9KTtcblxuICByZXR1cm4ge307XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5pc2hSdW5XaXRoRXJyb3IoXG4gIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICBlcnJvck1lc3NhZ2U6IHN0cmluZyxcbiAgYXJncz86IFF1ZXJ5SW5wdXQsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZmluaXNoUnVuKHJlcXVlc3RMb2dJZCwge1xuICAgICAgc3RhdHVzOiBcImVycm9yXCIsXG4gICAgICBlcnJvcl9tZXNzYWdlOiBlcnJvck1lc3NhZ2UsXG4gICAgICBoaXN0b3J5OiBhcmdzID8gZmlsdGVySGlzdG9yeUZvclN0b3JhZ2UoYXJncy5oaXN0b3J5KSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci5lcnJvcihgZmluaXNoUnVuV2l0aEVycm9yIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluaXNoUnVuQWJvcnRlZChyZXF1ZXN0TG9nSWQ6IG51bWJlciwgYXJncz86IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZmluaXNoUnVuKHJlcXVlc3RMb2dJZCwge1xuICAgICAgc3RhdHVzOiBcImFib3J0ZWRcIixcbiAgICAgIGVycm9yX21lc3NhZ2U6IFwiY2xpZW50IGRpc2Nvbm5lY3RlZFwiLFxuICAgICAgaGlzdG9yeTogYXJncyA/IGZpbHRlckhpc3RvcnlGb3JTdG9yYWdlKGFyZ3MuaGlzdG9yeSkgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIuZXJyb3IoYGZpbmlzaFJ1bkFib3J0ZWQgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbXBsZXRlVG9vbFJlc3VsdHMoXG4gIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICB0b29sUmVzdWx0czogUWdyaWRUb29sUmVzdWx0SW5wdXRbXSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHRyIG9mIHRvb2xSZXN1bHRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5jb21wbGV0ZVRvb2xDYWxsKHJlcXVlc3RMb2dJZCwgdHIudG9vbENhbGxJZCwge1xuICAgICAgICB0b29sX3Jlc3VsdDogdHIuaXNFcnJvciA/IHVuZGVmaW5lZCA6IHRyLm91dHB1dCxcbiAgICAgICAgZXJyb3I6IHRyLmlzRXJyb3IgPyB0ci5vdXRwdXQgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYGNvbXBsZXRlVG9vbENhbGwgZmFpbGVkIGZvciAke3RyLnRvb2xDYWxsSWR9OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjbGVhbnVwU3RhbGVSdW5zKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YWxlSWRzID0gYXdhaXQgUmVxdWVzdExvZ01vZGVsLmZpbmRTdGFsZVJ1bm5pbmdJZHMoU1RBTEVfUlVOX1RIUkVTSE9MRF9NUyk7XG4gICAgZm9yIChjb25zdCBpZCBvZiBzdGFsZUlkcykge1xuICAgICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmZpbmlzaFJ1bihpZCwge1xuICAgICAgICBzdGF0dXM6IFwiZXJyb3JcIixcbiAgICAgICAgZXJyb3JfbWVzc2FnZTogXCJ0b29sLWNhbGwgcnVuOiBubyBmb2xsb3ctdXAgd2l0aGluIDMwIG1pbnV0ZXNcIixcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc3RhbGVJZHMubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLmluZm8oYGNsZWFuZWQgdXAgJHtzdGFsZUlkcy5sZW5ndGh9IHN0YWxlIHJ1bm5pbmcgcmVxdWVzdCBsb2dzYCk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nZ2VyLmVycm9yKGBzdGFsZSBjbGVhbnVwIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBVUEsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLGdCQUFnQixDQUFDO0FBQ3BELE1BQU0seUJBQXlCLE9BQVU7Ozs7QUFLekMsU0FBUyx3QkFBd0IsWUFBeUM7QUFDeEUsS0FBSSxDQUFDLFdBQVksUUFBTztBQUN4QixLQUFJO0VBRUYsTUFBTSxXQURRLEtBQUssTUFBTSxXQUFXLENBQ2IsUUFBUSxTQUFTO0FBQ3RDLE9BQUksQ0FBQyxRQUFRLE9BQU8sU0FBUyxTQUFVLFFBQU87R0FDOUMsTUFBTSxTQUFTO0FB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
137
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQtcnVuLWxpZmVjeWNsZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQtcnVuLWxpZmVjeWNsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBSZXF1ZXN0TG9nTW9kZWwgfSBmcm9tIFwiLi4vcmVxdWVzdC1sb2cvcmVxdWVzdC1sb2cubW9kZWxcIjtcbmltcG9ydCB7XG4gIHR5cGUgUWdyaWRSdW5Db250ZXh0LFxuICB0eXBlIFFncmlkVG9vbFJlc3VsdElucHV0LFxuICB0eXBlIFF1ZXJ5SW5wdXQsXG4gIHR5cGUgUXVlcnlPdXRwdXQsXG59IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInJ1bi1saWZlY3ljbGVcIl0pO1xuY29uc3QgU1RBTEVfUlVOX1RIUkVTSE9MRF9NUyA9IDMwICogNjAgKiAxMDAwO1xuXG4vKipcbiAqIGhpc3RvcnnripQg7JuQ67O4IOq3uOuMgOuhnCDsoIDsnqXtlZjquLDrs7Tri6TripQsIHJ1biDrtoTshJ3sl5Ag7ZWE7JqU7ZWcIHVzZXIvYXNzaXN0YW50IOygleuztOunjCDtlYTthLDrp4HtlbTshJwg7KCA7J6lXG4gKi9cbmZ1bmN0aW9uIGZpbHRlckhpc3RvcnlGb3JTdG9yYWdlKHJhd0hpc3Rvcnk6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHVua25vd24ge1xuICBpZiAoIXJhd0hpc3RvcnkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgaXRlbXMgPSBKU09OLnBhcnNlKHJhd0hpc3RvcnkpIGFzIHVua25vd25bXTtcbiAgICBjb25zdCBmaWx0ZXJlZCA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgaWYgKCFpdGVtIHx8IHR5cGVvZiBpdGVtICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZWNvcmQgPSBpdGVtIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgcmV0dXJuIHJlY29yZC50eXBlID09PSBcIm1lc3NhZ2VcIiAmJiAocmVjb3JkLnJvbGUgPT09IFwidXNlclwiIHx8IHJlY29yZC5yb2xlID09PSBcImFzc2lzdGFudFwiKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZmlsdGVyZWQubGVuZ3RoID4gMCA/IGZpbHRlcmVkIDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIFJ1bkxpZmVjeWNsZVJlc3VsdCA9IHtcbiAgcnVuQ29udGV4dD86IFFncmlkUnVuQ29udGV4dDtcbn07XG5cbi8qKlxuICogbG9nTW9kZTpcInJ1blwiIOyLnCBxdWVyeS9zdHJlYW0g7J2R64u1IOyghO2bhOyXkCDtmLjstpwuXG4gKlxuICogMSkgYmVmb3JlUXVlcnk6IHJ1biDsg53shLEv6rOE7IaNICsgdG9vbCByZXN1bHQg7JmE66OMICsgc3RhbGUgY2xlYW51cFxuICogMikgYWZ0ZXJRdWVyeTogZ2VuZXJhdGUgc3RlcCArIHRvb2wtY2FsbCBzdGVwICsgZmluaXNoL2tlZXAtb3BlblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYmVmb3JlUXVlcnkoYXJnczogUXVlcnlJbnB1dCk6IFByb21pc2U8e1xuICByZXF1ZXN0TG9nSWQ6IG51bWJlcjtcbiAgc3RlcEluZGV4OiBudW1iZXI7XG59PiB7XG4gIGF3YWl0IGNsZWFudXBTdGFsZVJ1bnMoKTtcblxuICBsZXQgcmVxdWVzdExvZ0lkOiBudW1iZXI7XG4gIGxldCBzdGVwSW5kZXggPSAwO1xuXG4gIC8vIHJlcXVlc3RMb2dJZCDqsIAg7J6I7J2EIOuVjOunjCDquLDsobQgcnVuIOyXsOyepS4gdGhyZWFkQ29vcmQg66eMIOyeiOuKlCBjb252IOuKlCDsg4ggcnVuIOycvOuhnCDsi5zsnpEuXG4gIGlmIChhcmdzLnJ1bkNvbnRleHQ/LnJlcXVlc3RMb2dJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmVxdWVzdExvZ0lkID0gYXJncy5ydW5Db250ZXh0LnJlcXVlc3RMb2dJZDtcblxuICAgIGlmIChhcmdzLnRvb2xSZXN1bHRzICYmIGFyZ3MudG9vbFJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgY29tcGxldGVUb29sUmVzdWx0cyhyZXF1ZXN0TG9nSWQsIGFyZ3MudG9vbFJlc3VsdHMpO1xuICAgIH1cblxuICAgIHN0ZXBJbmRleCA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5nZXROZXh0U3RlcEluZGV4KHJlcXVlc3RMb2dJZCk7XG4gIH0gZWxzZSB7XG4gICAgcmVxdWVzdExvZ0lkID0gYXdhaXQgUmVxdWVzdExvZ01vZGVsLmNyZWF0ZVJ1bih7XG4gICAgICB1c2VyX3Byb21wdDogYXJncy5wcm9tcHQsXG4gICAgICBzeXN0ZW1fcHJvbXB0OiBhcmdzLnN5c3RlbSxcbiAgICAgIG1vZGVsX25hbWU6IGFyZ3MubW9kZWwsXG4gICAgICBlZmZvcnQ6IGFyZ3MuZWZmb3J0LFxuICAgICAgcHJvamVjdF9uYW1lOiBhcmdzLnByb2plY3ROYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHsgcmVxdWVzdExvZ0lkLCBzdGVwSW5kZXggfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFmdGVyUXVlcnkoXG4gIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICBzdGVwSW5kZXg6IG51bWJlcixcbiAgYXJnczogUXVlcnlJbnB1dCxcbiAgcmVzdWx0OiBRdWVyeU91dHB1dCxcbik6IFByb21pc2U8UnVuTGlmZWN5Y2xlUmVzdWx0PiB7XG4gIC8vIGdlbmVyYXRlIHN0ZXAg6riw66GdXG4gIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5hcHBlbmRTdGVwKHJlcXVlc3RMb2dJZCwge1xuICAgIHN0ZXBfaW5kZXg6IHN0ZXBJbmRleCxcbiAgICB0eXBlOiBcImdlbmVyYXRlXCIsXG4gICAgaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRfdG9rZW5zLFxuICAgIG91dHB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5vdXRwdXRfdG9rZW5zLFxuICAgIGNhY2hlX3JlYWRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVfcmVhZF9pbnB1dF90b2tlbnMsXG4gICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zLFxuICAgIGR1cmF0aW9uX21zOiByZXN1bHQuZHVyYXRpb25NcyxcbiAgICBmaW5pc2hfcmVhc29uOiByZXN1bHQuZmluaXNoUmVhc29uLFxuICB9KTtcblxuICBpZiAocmVzdWx0LmZpbmlzaFJlYXNvbiA9PT0gXCJ0b29sLWNhbGxzXCIpIHtcbiAgICAvLyB0b29sLWNhbGwgc3RlcCDsponsi5wg6riw66GdIChyZXN1bHTripQg64KY7KSR7JeQIGNvbXBsZXRlVG9vbENhbGzroZwg7LGE7JuAKVxuICAgIGNvbnN0IHRvb2xDYWxscyA9IHJlc3VsdC5jb250ZW50LmZpbHRlcigoYykgPT4gYy50eXBlID09PSBcInRvb2wtY2FsbFwiKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvb2xDYWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdGMgPSB0b29sQ2FsbHNbaV0hO1xuICAgICAgaWYgKHRjLnR5cGUgIT09IFwidG9vbC1jYWxsXCIpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFwcGVuZFN0ZXAocmVxdWVzdExvZ0lkLCB7XG4gICAgICAgIHN0ZXBfaW5kZXg6IHN0ZXBJbmRleCxcbiAgICAgICAgdHlwZTogXCJ0b29sX2NhbGxcIixcbiAgICAgICAgdG9vbF9jYWxsX2luZGV4OiBpLFxuICAgICAgICB0b29sX2NhbGxfaWQ6IHRjLnRvb2xDYWxsSWQsXG4gICAgICAgIHRvb2xfbmFtZTogdGMudG9vbE5hbWUsXG4gICAgICAgIHRvb2xfYXJnczogdGMuaW5wdXQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBydW5Db250ZXh0OiB7IHJlcXVlc3RMb2dJZCB9IH07XG4gIH1cblxuICAvLyBmaW5pc2hSZWFzb24gPT09IFwic3RvcFwiIOKGkiBydW4g7KKF66OMICjsoITssrQgc3RlcCB1c2FnZSDtlansgrApXG4gIGNvbnN0IGFnZyA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5hZ2dyZWdhdGVTdGVwVXNhZ2UocmVxdWVzdExvZ0lkKTtcbiAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmZpbmlzaFJ1bihyZXF1ZXN0TG9nSWQsIHtcbiAgICBzdGF0dXM6IFwic3VjY2VlZGVkXCIsXG4gICAgcmVzcG9uc2U6IHJlc3VsdC50ZXh0LFxuICAgIHRva2VuX25hbWU6IHJlc3VsdC50b2tlbk5hbWUsXG4gICAgaW5wdXRfdG9rZW5zOiBhZ2cuaW5wdXRfdG9rZW5zLFxuICAgIG91dHB1dF90b2tlbnM6IGFnZy5vdXRwdXRfdG9rZW5zLFxuICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBhZ2cuY2FjaGVfcmVhZF90b2tlbnMsXG4gICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBhZ2cuY2FjaGVfY3JlYXRpb25fdG9rZW5zLFxuICAgIGR1cmF0aW9uX21zOiBhZ2cuZHVyYXRpb25fbXMsXG4gICAgaGlzdG9yeTogZmlsdGVySGlzdG9yeUZvclN0b3JhZ2UoYXJncy5oaXN0b3J5KSxcbiAgfSk7XG5cbiAgcmV0dXJuIHt9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluaXNoUnVuV2l0aEVycm9yKFxuICByZXF1ZXN0TG9nSWQ6IG51bWJlcixcbiAgZXJyb3JNZXNzYWdlOiBzdHJpbmcsXG4gIGFyZ3M/OiBRdWVyeUlucHV0LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmZpbmlzaFJ1bihyZXF1ZXN0TG9nSWQsIHtcbiAgICAgIHN0YXR1czogXCJlcnJvclwiLFxuICAgICAgZXJyb3JfbWVzc2FnZTogZXJyb3JNZXNzYWdlLFxuICAgICAgaGlzdG9yeTogYXJncyA/IGZpbHRlckhpc3RvcnlGb3JTdG9yYWdlKGFyZ3MuaGlzdG9yeSkgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIuZXJyb3IoYGZpbmlzaFJ1bldpdGhFcnJvciBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmlzaFJ1bkFib3J0ZWQocmVxdWVzdExvZ0lkOiBudW1iZXIsIGFyZ3M/OiBRdWVyeUlucHV0KTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmZpbmlzaFJ1bihyZXF1ZXN0TG9nSWQsIHtcbiAgICAgIHN0YXR1czogXCJhYm9ydGVkXCIsXG4gICAgICBlcnJvcl9tZXNzYWdlOiBcImNsaWVudCBkaXNjb25uZWN0ZWRcIixcbiAgICAgIGhpc3Rvcnk6IGFyZ3MgPyBmaWx0ZXJIaXN0b3J5Rm9yU3RvcmFnZShhcmdzLmhpc3RvcnkpIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nZ2VyLmVycm9yKGBmaW5pc2hSdW5BYm9ydGVkIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjb21wbGV0ZVRvb2xSZXN1bHRzKFxuICByZXF1ZXN0TG9nSWQ6IG51bWJlcixcbiAgdG9vbFJlc3VsdHM6IFFncmlkVG9vbFJlc3VsdElucHV0W10sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCB0ciBvZiB0b29sUmVzdWx0cykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuY29tcGxldGVUb29sQ2FsbChyZXF1ZXN0TG9nSWQsIHRyLnRvb2xDYWxsSWQsIHtcbiAgICAgICAgdG9vbF9yZXN1bHQ6IHRyLmlzRXJyb3IgPyB1bmRlZmluZWQgOiB0ci5vdXRwdXQsXG4gICAgICAgIGVycm9yOiB0ci5pc0Vycm9yID8gdHIub3V0cHV0IDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLmVycm9yKGBjb21wbGV0ZVRvb2xDYWxsIGZhaWxlZCBmb3IgJHt0ci50b29sQ2FsbElkfTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xlYW51cFN0YWxlUnVucygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGFsZUlkcyA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5maW5kU3RhbGVSdW5uaW5nSWRzKFNUQUxFX1JVTl9USFJFU0hPTERfTVMpO1xuICAgIGZvciAoY29uc3QgaWQgb2Ygc3RhbGVJZHMpIHtcbiAgICAgIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5maW5pc2hSdW4oaWQsIHtcbiAgICAgICAgc3RhdHVzOiBcImVycm9yXCIsXG4gICAgICAgIGVycm9yX21lc3NhZ2U6IFwidG9vbC1jYWxsIHJ1bjogbm8gZm9sbG93LXVwIHdpdGhpbiAzMCBtaW51dGVzXCIsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHN0YWxlSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBjbGVhbmVkIHVwICR7c3RhbGVJZHMubGVuZ3RofSBzdGFsZSBydW5uaW5nIHJlcXVlc3QgbG9nc2ApO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci5lcnJvcihgc3RhbGUgY2xlYW51cCBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQVVBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyxnQkFBZ0IsQ0FBQztBQUNwRCxNQUFNLHlCQUF5QixPQUFVOzs7O0FBS3pDLFNBQVMsd0JBQXdCLFlBQXlDO0FB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
@@ -1,4 +1,5 @@
1
1
  import "../../_virtual/_rolldown/runtime.js";
2
+ import { decideConvRouting, issueConvContext } from "./conv-routing.js";
2
3
  import { calculateCostUsd } from "../../utils/providers/common/model-cost.js";
3
4
  import { getAccessToken, getExpiresAt, getRefreshToken } from "../../utils/providers/common/credentials.js";
4
5
  import { strictify } from "../../utils/providers/common/strictifier.js";
@@ -84,21 +85,21 @@ var QgridDispatcherClass = class {
84
85
  assert(model, "unknown model");
85
86
  if (provider === "openai") {
86
87
  if (!this.openaiDispatcher) throw new QuotaError("OpenAI dispatcher not initialized");
88
+ const decision = decideConvRouting(input);
87
89
  const result = await this.openaiDispatcher.generate({
88
90
  model,
89
- input: [{
90
- type: "text",
91
- text: input.prompt,
92
- text_elements: []
93
- }],
94
91
  systemPrompt: input.system,
95
92
  outputSchema: outputSchema ? strictify(outputSchema) : void 0,
96
93
  effort: input.effort,
97
94
  verbosity: input.verbosity,
98
95
  reasoningSummary: input.reasoningSummary,
99
96
  serviceTier: input.serviceTier,
100
- history: input.history ? JSON.parse(input.history) : void 0
97
+ coldInput: decision.coldInput,
98
+ coldHistory: decision.coldHistory,
99
+ reuse: decision.reuse,
100
+ reuseInput: decision.reuseInput
101
101
  });
102
+ const issuedCoord = issueConvContext(result.threadCoord, decision);
102
103
  return applyToolCallEmulation({
103
104
  text: result.text,
104
105
  tokenName: result.tokenName,
@@ -115,7 +116,7 @@ var QgridDispatcherClass = class {
115
116
  outputTokens: result.usage.outputTokens,
116
117
  cachedInputTokens: result.usage.cachedInputTokens
117
118
  })
118
- }, input.tools);
119
+ }, input.tools, issuedCoord);
119
120
  }
120
121
  }
121
122
  const executionInput = outputSchema && input.tools?.length ? {
@@ -150,25 +151,25 @@ var QgridDispatcherClass = class {
150
151
  if (!model) throw new ProcessError("unknown model");
151
152
  if (!this.openaiDispatcher) throw new QuotaError("OpenAI dispatcher not initialized");
152
153
  const outputSchema = input.tools?.length ? buildToolCallSchema(input.tools) : input.jsonSchema ? JSON.parse(input.jsonSchema) : void 0;
154
+ const decision = decideConvRouting(input);
153
155
  await this.openaiDispatcher.generateStream({
154
156
  model,
155
- input: [{
156
- type: "text",
157
- text: input.prompt,
158
- text_elements: []
159
- }],
160
157
  systemPrompt: input.system,
161
158
  outputSchema: outputSchema ? strictify(outputSchema) : void 0,
162
159
  effort: input.effort,
163
160
  verbosity: input.verbosity,
164
161
  reasoningSummary: input.reasoningSummary,
165
162
  serviceTier: input.serviceTier,
166
- history: input.history ? JSON.parse(input.history) : void 0
163
+ coldInput: decision.coldInput,
164
+ coldHistory: decision.coldHistory,
165
+ reuse: decision.reuse,
166
+ reuseInput: decision.reuseInput
167
167
  }, {
168
168
  onDelta: cb.onDelta,
169
169
  onThreadId: cb.onThreadId,
170
170
  onTurnId: cb.onTurnId,
171
171
  onComplete: (turnResult) => {
172
+ const issuedCoord = issueConvContext(turnResult.threadCoord, decision);
172
173
  const applied = applyToolCallEmulation({
173
174
  text: turnResult.text,
174
175
  tokenName: turnResult.tokenName,
@@ -185,7 +186,7 @@ var QgridDispatcherClass = class {
185
186
  outputTokens: turnResult.usage.outputTokens,
186
187
  cachedInputTokens: turnResult.usage.cachedInputTokens
187
188
  })
188
- }, input.tools);
189
+ }, input.tools, issuedCoord);
189
190
  cb.onComplete(applied);
190
191
  },
191
192
  onError: cb.onError
@@ -317,4 +318,4 @@ const QgridDispatcher = new QgridDispatcherClass();
317
318
  //#endregion
318
319
  export { QgridDispatcher, QgridDispatcherClass };
319
320
 
320
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJub2RlOmFzc2VydFwiO1xuLyoqXG4gKiBRZ3JpZERpc3BhdGNoZXIg4oCUIE9BdXRoIO2GoO2BsCDshKDtg50gKyBjbGF1ZGUgQ0xJIGZyZXNoIHNwYXduIOuUlOyKpO2MqOyymCDsi7HquIDthLQuXG4gKlxuICogLSDrp6Qg7JqU7LKt66eI64ukIOyDiCBjbGF1ZGUgQ0xJIO2UhOuhnOyEuOyKpCBzcGF3biDihpIg7J2R64u1IO2bhCDsooXro4xcbiAqIC0gbGVhc3QtdXNlZCByb3VuZC1yb2JpbiDsnLzroZwg7Yag7YGwIOyEoO2DnVxuICogLSDrqZTrqqjrpqwg7LqQ7IucIChNYXA8aWQsIFRva2VuU3Vic2V0QT4pIOuKlCBUb2tlblN1YnNjcmliZXIg6rCAIHBnIExJU1RFTi9OT1RJRlkg66GcIOqwseyLoFxuICogLSBxdWVyeSDsi5wgZXhwaXJlc19hdCDruYTqtZAg4oaSIOyehOuwlSDsi5wgcHJlZW1wdGl2ZSByZWZyZXNoXG4gKiAtIFF1b3RhRXJyb3Ig64qUIOq3uOuMgOuhnCDsg4HsnIQg7KCE7YyMICjsnpDrj5kgZmFpbG92ZXIg7JeG7J2MLCBVSSDsl5DshJwg7IiY64+ZIO2GoOq4gClcbiAqXG4gKiBlbnYgYWxsb3dsaXN0OiBQQVRILCBUTVBESVIsIENMQVVERV9DT0RFX09BVVRIX1RPS0VOLCBDTEFVREVfQ09ORklHX0RJUlxuICogICArIENMQVVERV9DT0RFX0RJU0FCTEVfKiArIENMQVVERV9DT0RFX0FUVFJJQlVUSU9OX0hFQURFUlxuICovXG5pbXBvcnQgeyBzcGF3biB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IG1rZGlyU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmltcG9ydCB7IHR5cGUgSnNvblZhbHVlIH0gZnJvbSBcIi4uLy4uL2NvZGV4LXByb3RvY29sL3NlcmRlX2pzb24vSnNvblZhbHVlXCI7XG5pbXBvcnQge1xuICBnZXRBY2Nlc3NUb2tlbixcbiAgZ2V0RXhwaXJlc0F0LFxuICBnZXRSZWZyZXNoVG9rZW4sXG59IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL2NyZWRlbnRpYWxzXCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVDb3N0VXNkIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vbW9kZWwtY29zdFwiO1xuaW1wb3J0IHsgc3RyaWN0aWZ5IH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vc3RyaWN0aWZpZXJcIjtcbmltcG9ydCB7IHR5cGUgT3BlbkFJRGlzcGF0Y2hlciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvb3BlbmFpL29wZW5haS1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2V0QSB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyB0eXBlIFF1ZXJ5SW5wdXQsIHR5cGUgUXVlcnlPdXRwdXQsIHR5cGUgVG9rZW5TdGF0cyB9IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyBtYXNrVG9rZW4sIFByb2Nlc3NFcnJvciwgUXVvdGFFcnJvciwgVGltZW91dEVycm9yIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5TdWJzY3JpYmVyIH0gZnJvbSBcIi4vdG9rZW4tc3Vic2NyaWJlclwiO1xuaW1wb3J0IHsgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbiwgYnVpbGRUb29sQ2FsbFNjaGVtYSB9IGZyb20gXCIuL3Rvb2wtZW11bGF0aW9uXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiXSk7XG5cbmNvbnN0IERFRkFVTFRfTU9ERUwgPSBcInNvbm5ldFwiO1xuY29uc3QgREVGQVVMVF9USU1FT1VUX01TID0gNjAwXzAwMDtcbmNvbnN0IERFRkFVTFRfRUZGT1JUID0gXCJoaWdoXCI7XG5cbi8vIGNsYXVkZSBDTEkg7J2YIGN3ZC4g7J20IOqyveuhnOydmCAuY2xhdWRlL3NldHRpbmdzLmpzb24g7J20IHByb2plY3Qgc2NvcGUg66GcIOuhnOuTnOuQmOyWtFxuLy8g7Zi57Iuc652864+EIOyeiOydhCB1c2VyIHNjb3BlICh+Ly5jbGF1ZGUvc2V0dGluZ3MuanNvbinrpbwg642u7Ja07JSAICgtLXNldHRpbmctc291cmNlcyBwcm9qZWN0IOyZgCDtlajqu5gpLlxuY29uc3QgQ0xBVURFX0NXRCA9IFwiL3RtcC9xZ3JpZFwiO1xuXG4vLyDquIDroZzrsowgdXNlciBjb25maWcg6rKp66asIOqyveuhnC4gKEND7JeQ7IScIO2ZmOqyveuzgOyImOuhnCDsnb3ripTrs4DsiJgpXG5jb25zdCBDTEFVREVfQ09ORklHX0RJUiA9IFwiL3RtcC9xZ3JpZC1jb25maWdcIjtcblxuLy8gcWdyaWQg7KCE7JqpIHByb2plY3QvZ2xvYmFsIHNldHRpbmdzIOKAlCB1c2VyIHNjb3BlIOqyqeumrOyaqVxuY29uc3QgUUdSSURfQ0xBVURFX1NFVFRJTkdTID0ge1xuICBhbHdheXNUaGlua2luZ0VuYWJsZWQ6IGZhbHNlLCAvLyB0aGlua2luZyBibG9jayDssKjri6hcbiAgaW5jbHVkZUdpdEluc3RydWN0aW9uczogZmFsc2UsIC8vIHN5c3RlbSBwcm9tcHQg7J2YIGdpdCDqsIDsnbTrk5wg7KCc6rGwXG4gIGNsZWFudXBQZXJpb2REYXlzOiAxLFxufTtcblxuLy8g7Yag7YGwIOunjOujjCDsnoTrsJUg7J6E6rOE6rCSIOKAlCB0b2tlbi5leHBpcmVkQXTsnbQgMeu2hCDslYjsl5Ag66eM66OM65Cc64uk66m0IHF1ZXJ5IOyLnCDssrTtgaztlZjqs6AgcmVmcmVzaC5cbmNvbnN0IFJFRlJFU0hfU0FGRVRZX01TID0gNjBfMDAwO1xuXG5leHBvcnQgY2xhc3MgUWdyaWREaXNwYXRjaGVyQ2xhc3Mge1xuICB0b2tlbnMgPSBuZXcgTWFwPG51bWJlciwgVG9rZW5TdWJzZXRBPigpO1xuXG4gIC8vIGtleeq4sOuwmCh0b2tlbk5hbWUpIOuIhOyggSDsubTsmrTthLAuIHRva2VuIOydtCBPQXV0aCByZWZyZXNoIOuhnCDroZzthYzsnbTtirjrkJjrj4QgdG9rZW5OYW1lIOydgCDrtojrs4DsnbTrnbwg7Lm07Jq07YSwIOycoOyngOuQqFxuICByZXF1ZXN0Q291bnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgcnJJbmRleCA9IDA7XG5cbiAgLy8gc29uYW11LmNvbmZpZyBvblN0YXJ0IOyXkOyEnCDsspjrpqztlZjripQg67OA7IiYXG4gIHN1YnNjcmliZXI6IFRva2VuU3Vic2NyaWJlciB8IG51bGwgPSBudWxsO1xuICBvcGVuYWlEaXNwYXRjaGVyOiBPcGVuQUlEaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3Qgc2V0dGluZ3NKc29uID0gSlNPTi5zdHJpbmdpZnkoUUdSSURfQ0xBVURFX1NFVFRJTkdTLCBudWxsLCAyKTtcblxuICAgIG1rZGlyU3luYyhgJHtDTEFVREVfQ1dEfS8uY2xhdWRlYCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgd3JpdGVGaWxlU3luYyhgJHtDTEFVREVfQ1dEfS8uY2xhdWRlL3NldHRpbmdzLmpzb25gLCBzZXR0aW5nc0pzb24pO1xuXG4gICAgbWtkaXJTeW5jKENMQVVERV9DT05GSUdfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB3cml0ZUZpbGVTeW5jKGAke0NMQVVERV9DT05GSUdfRElSfS8uY2xhdWRlLmpzb25gLCBcInt9XCIpO1xuICAgIHdyaXRlRmlsZVN5bmMoYCR7Q0xBVURFX0NPTkZJR19ESVJ9L3NldHRpbmdzLmpzb25gLCBzZXR0aW5nc0pzb24pO1xuICB9XG5cbiAgY291bnRPZihuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RDb3VudHMuZ2V0KG5hbWUpID8/IDA7XG4gIH1cblxuICAvLyBUb2tlblN1YnNjcmliZXIg7L2c67CxIOKAlCDsupDsi5wgbXV0YXRpb25cbiAgdXBzZXJ0Q2FjaGUoaWQ6IG51bWJlciwgcm93OiBUb2tlblN1YnNldEEpOiB2b2lkIHtcbiAgICB0aGlzLnRva2Vucy5zZXQoaWQsIHJvdyk7XG4gIH1cblxuICByZW1vdmVDYWNoZShpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbnMuZGVsZXRlKGlkKTtcbiAgfVxuXG4gIHJlcGxhY2VDYWNoZShyb3dzOiBUb2tlblN1YnNldEFbXSk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5zID0gbmV3IE1hcChyb3dzLm1hcCgocikgPT4gW3IuaWQsIHJdKSk7XG4gIH1cblxuICBnZXRTdGF0cygpOiBUb2tlblN0YXRzW10ge1xuICAgIHJldHVybiBbLi4udGhpcy50b2tlbnMudmFsdWVzKCldLm1hcCgocikgPT4gKHtcbiAgICAgIHRva2VuOiBtYXNrVG9rZW4oZ2V0QWNjZXNzVG9rZW4oci5jcmVkZW50aWFscykpLFxuICAgICAgbmFtZTogci5uYW1lLFxuICAgICAgcHJvdmlkZXI6IHIucHJvdmlkZXIsXG4gICAgICByZXF1ZXN0czogdGhpcy5jb3VudE9mKHIubmFtZSksXG4gICAgfSkpO1xuICB9XG5cbiAgc2VsZWN0VG9rZW4ocHJvdmlkZXIgPSBcImFudGhyb3BpY1wiKTogVG9rZW5TdWJzZXRBIHwgbnVsbCB7XG4gICAgY29uc3Qgcm93cyA9IFsuLi50aGlzLnRva2Vucy52YWx1ZXMoKV0uZmlsdGVyKChyKSA9PiByLnByb3ZpZGVyID09PSBwcm92aWRlcik7XG4gICAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IG1pbkNvdW50ID0gTWF0aC5taW4oLi4ucm93cy5tYXAoKHIpID0+IHRoaXMuY291bnRPZihyLm5hbWUpKSk7XG4gICAgY29uc3QgaWRsZSA9IHJvd3MuZmlsdGVyKChyKSA9PiB0aGlzLmNvdW50T2Yoci5uYW1lKSA9PT0gbWluQ291bnQpO1xuICAgIGNvbnN0IHBpY2tlZCA9IGlkbGVbdGhpcy5yckluZGV4ICUgaWRsZS5sZW5ndGhdITtcbiAgICB0aGlzLnJySW5kZXgrKztcbiAgICByZXR1cm4gcGlja2VkO1xuICB9XG5cbiAgYXN5bmMgcXVlcnkoaW5wdXQ6IFF1ZXJ5SW5wdXQsIHRpbWVvdXRNcz86IG51bWJlcik6IFByb21pc2U8UXVlcnlPdXRwdXQ+IHtcbiAgICBpZiAoaW5wdXQudG9vbHM/Lmxlbmd0aCAmJiBpbnB1dC5qc29uU2NoZW1hKSB7XG4gICAgICB0aHJvdyBuZXcgUHJvY2Vzc0Vycm9yKFwidG9vbHMgYW5kIGpzb25TY2hlbWEgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXJcIik7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0U2NoZW1hID0gaW5wdXQudG9vbHM/Lmxlbmd0aFxuICAgICAgPyBidWlsZFRvb2xDYWxsU2NoZW1hKGlucHV0LnRvb2xzKVxuICAgICAgOiBpbnB1dC5qc29uU2NoZW1hXG4gICAgICAgID8gKEpTT04ucGFyc2UoaW5wdXQuanNvblNjaGVtYSkgYXMgSnNvblZhbHVlKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgIC8vIHByb3ZpZGVyIHByZWZpeCByb3V0aW5nOiAnb3BlbmFpL2dwdC01LjQnIOKGkiBPcGVuQUlEaXNwYXRjaGVyXG4gICAgaWYgKGlucHV0Lm1vZGVsPy5pbmNsdWRlcyhcIi9cIikpIHtcbiAgICAgIGNvbnN0IFtwcm92aWRlciwgbW9kZWxdID0gaW5wdXQubW9kZWwuc3BsaXQoXCIvXCIsIDIpO1xuICAgICAgYXNzZXJ0KG1vZGVsLCBcInVua25vd24gbW9kZWxcIik7XG4gICAgICBpZiAocHJvdmlkZXIgPT09IFwib3BlbmFpXCIpIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wZW5haURpc3BhdGNoZXIpIHRocm93IG5ldyBRdW90YUVycm9yKFwiT3BlbkFJIGRpc3BhdGNoZXIgbm90IGluaXRpYWxpemVkXCIpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm9wZW5haURpc3BhdGNoZXIuZ2VuZXJhdGUoe1xuICAgICAgICAgIG1vZGVsOiBtb2RlbCxcbiAgICAgICAgICBpbnB1dDogW3sgdHlwZTogXCJ0ZXh0XCIgYXMgY29uc3QsIHRleHQ6IGlucHV0LnByb21wdCwgdGV4dF9lbGVtZW50czogW10gfV0sXG4gICAgICAgICAgc3lzdGVtUHJvbXB0OiBpbnB1dC5zeXN0ZW0sXG4gICAgICAgICAgb3V0cHV0U2NoZW1hOiBvdXRwdXRTY2hlbWFcbiAgICAgICAgICAgID8gKHN0cmljdGlmeShvdXRwdXRTY2hlbWEgYXMgUGFyYW1ldGVyczx0eXBlb2Ygc3RyaWN0aWZ5PlswXSkgYXMgSnNvblZhbHVlKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICAgICAgdmVyYm9zaXR5OiBpbnB1dC52ZXJib3NpdHksXG4gICAgICAgICAgcmVhc29uaW5nU3VtbWFyeTogaW5wdXQucmVhc29uaW5nU3VtbWFyeSxcbiAgICAgICAgICBzZXJ2aWNlVGllcjogaW5wdXQuc2VydmljZVRpZXIsXG4gICAgICAgICAgaGlzdG9yeTogaW5wdXQuaGlzdG9yeSA/IEpTT04ucGFyc2UoaW5wdXQuaGlzdG9yeSkgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBhcHBseVRvb2xDYWxsRW11bGF0aW9uKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRleHQ6IHJlc3VsdC50ZXh0LFxuICAgICAgICAgICAgdG9rZW5OYW1lOiByZXN1bHQudG9rZW5OYW1lLFxuICAgICAgICAgICAgbW9kZWw6IHJlc3VsdC5tb2RlbCxcbiAgICAgICAgICAgIHVzYWdlOiB7XG4gICAgICAgICAgICAgIGlucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmlucHV0VG9rZW5zLFxuICAgICAgICAgICAgICBvdXRwdXRfdG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgICAgICAgICBjYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnM6IDAsXG4gICAgICAgICAgICAgIGNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHVyYXRpb25NczogcmVzdWx0LmR1cmF0aW9uTXMsXG4gICAgICAgICAgICBjb3N0VXNkOiBjYWxjdWxhdGVDb3N0VXNkKHJlc3VsdC5tb2RlbCwge1xuICAgICAgICAgICAgICBpbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmlucHV0VG9rZW5zLFxuICAgICAgICAgICAgICBvdXRwdXRUb2tlbnM6IHJlc3VsdC51c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICAgICAgICAgIGNhY2hlZElucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGlucHV0LnRvb2xzLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGV4ZWN1dGlvbklucHV0ID1cbiAgICAgIG91dHB1dFNjaGVtYSAmJiBpbnB1dC50b29scz8ubGVuZ3RoXG4gICAgICAgID8geyAuLi5pbnB1dCwganNvblNjaGVtYTogSlNPTi5zdHJpbmdpZnkob3V0cHV0U2NoZW1hKSB9XG4gICAgICAgIDogaW5wdXQ7XG5cbiAgICAvLyBBbnRocm9waWMgKOq4sOyhtCBjbGF1ZGUgLXAg6rK966GcKVxuICAgIGNvbnN0IGVsZWN0ZWRUb2tlbiA9IHRoaXMuc2VsZWN0VG9rZW4oKTtcbiAgICBpZiAoIWVsZWN0ZWRUb2tlbikgdGhyb3cgbmV3IFF1b3RhRXJyb3IoXCJObyB0b2tlbnMgYXZhaWxhYmxlXCIpO1xuXG4gICAgLy8gYXdhaXQg7KCE7JeQIGNvdW50IOyEoOuwmOyYgS4g67OR66CsIOyalOyyreydtCDrj5nsi5zsl5Ag64+E7LCp7ZW064+EIOqwgeyekCDri6Trpbgg7Yag7YGw7J2EIOqzoOultOuPhOuhnS5cbiAgICB0aGlzLnJlcXVlc3RDb3VudHMuc2V0KGVsZWN0ZWRUb2tlbi5uYW1lLCB0aGlzLmNvdW50T2YoZWxlY3RlZFRva2VuLm5hbWUpICsgMSk7XG5cbiAgICBsZXQgdG9rZW4gPSBnZXRBY2Nlc3NUb2tlbihlbGVjdGVkVG9rZW4uY3JlZGVudGlhbHMpO1xuICAgIC8vIGV4cGlyZXNfYXQg7J6E67CV7J2066m0IHByZWVtcHRpdmUgcmVmcmVzaFxuICAgIGNvbnN0IGV4cGlyZXNBdCA9IGdldEV4cGlyZXNBdChlbGVjdGVkVG9rZW4uY3JlZGVudGlhbHMpO1xuICAgIGlmIChcbiAgICAgIGV4cGlyZXNBdCAmJlxuICAgICAgZXhwaXJlc0F0IC0gRGF0ZS5ub3coKSA8IFJFRlJFU0hfU0FGRVRZX01TICYmXG4gICAgICBnZXRSZWZyZXNoVG9rZW4oZWxlY3RlZFRva2VuLmNyZWRlbnRpYWxzKVxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBRZ3JpZEZyYW1lIH0gPSBhd2FpdCBpbXBvcnQoXCIuL3FncmlkLmZyYW1lXCIpO1xuICAgICAgICB0b2tlbiA9IGF3YWl0IFFncmlkRnJhbWUucmVmcmVzaFRva2VuKGVsZWN0ZWRUb2tlbik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGByZWZyZXNoIGZhaWxlZCBmb3IgJHtlbGVjdGVkVG9rZW4ubmFtZX06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9nZ2VyLmluZm8oYOKGkiAke2VsZWN0ZWRUb2tlbi5uYW1lfSAobW9kZWw6ICR7aW5wdXQubW9kZWwgPz8gREVGQVVMVF9NT0RFTH0pYCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRlQ2xhdWRlKGV4ZWN1dGlvbklucHV0LCB0b2tlbiwgdGltZW91dE1zID8/IERFRkFVTFRfVElNRU9VVF9NUyk7XG4gICAgcmV0dXJuIGFwcGx5VG9vbENhbGxFbXVsYXRpb24oXG4gICAgICB7IC4uLnJlc3VsdCwgdG9rZW5OYW1lOiBlbGVjdGVkVG9rZW4ubmFtZSwgbW9kZWw6IGlucHV0Lm1vZGVsID8/IERFRkFVTFRfTU9ERUwgfSxcbiAgICAgIGlucHV0LnRvb2xzLFxuICAgICk7XG4gIH1cblxuICBhc3luYyBxdWVyeVN0cmVhbShcbiAgICBpbnB1dDogUXVlcnlJbnB1dCxcbiAgICBjYjoge1xuICAgICAgb25EZWx0YTogKHRleHQ6IHN0cmluZykgPT4gdm9pZDtcbiAgICAgIG9uQ29tcGxldGU6IChyZXN1bHQ6IFF1ZXJ5T3V0cHV0KSA9PiB2b2lkO1xuICAgICAgb25FcnJvcjogKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcbiAgICAgIG9uVGhyZWFkSWQ/OiAodGhyZWFkSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgICAgIG9uVHVybklkPzogKHR1cm5JZDogc3RyaW5nKSA9PiB2b2lkO1xuICAgIH0sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghaW5wdXQubW9kZWw/LnN0YXJ0c1dpdGgoXCJvcGVuYWkvXCIpKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnF1ZXJ5KGlucHV0KTtcbiAgICAgIGNiLm9uQ29tcGxldGUocmVzdWx0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBbLCBtb2RlbF0gPSBpbnB1dC5tb2RlbC5zcGxpdChcIi9cIiwgMik7XG4gICAgaWYgKCFtb2RlbCkgdGhyb3cgbmV3IFByb2Nlc3NFcnJvcihcInVua25vd24gbW9kZWxcIik7XG4gICAgaWYgKCF0aGlzLm9wZW5haURpc3BhdGNoZXIpIHRocm93IG5ldyBRdW90YUVycm9yKFwiT3BlbkFJIGRpc3BhdGNoZXIgbm90IGluaXRpYWxpemVkXCIpO1xuXG4gICAgY29uc3Qgb3V0cHV0U2NoZW1hID0gaW5wdXQudG9vbHM/Lmxlbmd0aFxuICAgICAgPyBidWlsZFRvb2xDYWxsU2NoZW1hKGlucHV0LnRvb2xzKVxuICAgICAgOiBpbnB1dC5qc29uU2NoZW1hXG4gICAgICAgID8gKEpTT04ucGFyc2UoaW5wdXQuanNvblNjaGVtYSkgYXMgSnNvblZhbHVlKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGF3YWl0IHRoaXMub3BlbmFpRGlzcGF0Y2hlci5nZW5lcmF0ZVN0cmVhbShcbiAgICAgIHtcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIGlucHV0OiBbeyB0eXBlOiBcInRleHRcIiBhcyBjb25zdCwgdGV4dDogaW5wdXQucHJvbXB0LCB0ZXh0X2VsZW1lbnRzOiBbXSB9XSxcbiAgICAgICAgc3lzdGVtUHJvbXB0OiBpbnB1dC5zeXN0ZW0sXG4gICAgICAgIG91dHB1dFNjaGVtYTogb3V0cHV0U2NoZW1hXG4gICAgICAgICAgPyAoc3RyaWN0aWZ5KG91dHB1dFNjaGVtYSBhcyBQYXJhbWV0ZXJzPHR5cGVvZiBzdHJpY3RpZnk+WzBdKSBhcyBKc29uVmFsdWUpXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgICB2ZXJib3NpdHk6IGlucHV0LnZlcmJvc2l0eSxcbiAgICAgICAgcmVhc29uaW5nU3VtbWFyeTogaW5wdXQucmVhc29uaW5nU3VtbWFyeSxcbiAgICAgICAgc2VydmljZVRpZXI6IGlucHV0LnNlcnZpY2VUaWVyLFxuICAgICAgICBoaXN0b3J5OiBpbnB1dC5oaXN0b3J5ID8gSlNPTi5wYXJzZShpbnB1dC5oaXN0b3J5KSA6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG9uRGVsdGE6IGNiLm9uRGVsdGEsXG4gICAgICAgIG9uVGhyZWFkSWQ6IGNiLm9uVGhyZWFkSWQsXG4gICAgICAgIG9uVHVybklkOiBjYi5vblR1cm5JZCxcbiAgICAgICAgb25Db21wbGV0ZTogKHR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgICBjb25zdCBhcHBsaWVkID0gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGV4dDogdHVyblJlc3VsdC50ZXh0LFxuICAgICAgICAgICAgICB0b2tlbk5hbWU6ICh0dXJuUmVzdWx0IGFzIHVua25vd24gYXMgeyB0b2tlbk5hbWU/OiBzdHJpbmcgfSkudG9rZW5OYW1lLFxuICAgICAgICAgICAgICBtb2RlbDogdHVyblJlc3VsdC5tb2RlbCxcbiAgICAgICAgICAgICAgdXNhZ2U6IHtcbiAgICAgICAgICAgICAgICBpbnB1dF90b2tlbnM6IHR1cm5SZXN1bHQudXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICAgICAgICAgICAgb3V0cHV0X3Rva2VuczogdHVyblJlc3VsdC51c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICAgICAgICAgICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zOiAwLFxuICAgICAgICAgICAgICAgIGNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zOiB0dXJuUmVzdWx0LnVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkdXJhdGlvbk1zOiB0dXJuUmVzdWx0LmR1cmF0aW9uTXMsXG4gICAgICAgICAgICAgIGNvc3RVc2Q6IGNhbGN1bGF0ZUNvc3RVc2QodHVyblJlc3VsdC5tb2RlbCwge1xuICAgICAgICAgICAgICAgIGlucHV0VG9rZW5zOiB0dXJuUmVzdWx0LnVzYWdlLmlucHV0VG9rZW5zLFxuICAgICAgICAgICAgICAgIG91dHB1dFRva2VuczogdHVyblJlc3VsdC51c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICAgICAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IHR1cm5SZXN1bHQudXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlucHV0LnRvb2xzLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY2Iub25Db21wbGV0ZShhcHBsaWVkKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcjogY2Iub25FcnJvcixcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlQ2xhdWRlKFxuICBpbnB1dDogUXVlcnlJbnB1dCxcbiAgdG9rZW46IHN0cmluZyxcbiAgdGltZW91dE1zOiBudW1iZXIsXG4pOiBQcm9taXNlPE9taXQ8UXVlcnlPdXRwdXQsIFwiY29udGVudFwiIHwgXCJmaW5pc2hSZWFzb25cIj4+IHtcbiAgY29uc3QgcmF3TW9kZWwgPSBpbnB1dC5tb2RlbCA/PyBERUZBVUxUX01PREVMO1xuICBjb25zdCBtb2RlbCA9IHJhd01vZGVsLmluY2x1ZGVzKFwiL1wiKSA/IHJhd01vZGVsLnNwbGl0KFwiL1wiKS5wb3AoKSEgOiByYXdNb2RlbDtcbiAgY29uc3QgdGltZW91dCA9IGlucHV0LnRpbWVvdXQgPz8gdGltZW91dE1zO1xuICBjb25zdCB1c2VTdHJ1Y3R1cmVkT3V0cHV0ID0gaW5wdXQuanNvblNjaGVtYSAmJiBpbnB1dC5qc29uU2NoZW1hLmxlbmd0aCA+IDA7XG5cbiAgLy8gLS10b29scyBcIlwiIOuhnCDrqqjrk6AgdG9vbCDsnYQg6riw67O4IOywqOuLqC4gc3RydWN0dXJlZCBvdXRwdXQg7JOw66m0IFN0cnVjdHVyZWRPdXRwdXQg66eMIO2ZlOydtO2KuOumrOyKpO2KuC5cbiAgLy8gLS10b29scyBcIlwiIOuKlCDrsJjrk5zsi5wg65Kk7JeQIOuLpOuluCDtlIzrnpjqt7jqsIAg7JmA7JW8IENMSSDtjIzsi7HsnbQg67mIIOusuOyekOyXtOuhnCDsnbjsi51cbiAgY29uc3QgdG9vbEFyZ3MgPSB1c2VTdHJ1Y3R1cmVkT3V0cHV0XG4gICAgPyBbXCItLXRvb2xzXCIsIFwiXCIsIFwiLS1hbGxvd2VkLXRvb2xzXCIsIFwiU3RydWN0dXJlZE91dHB1dFwiXVxuICAgIDogW1wiLS10b29sc1wiLCBcIlwiXTtcblxuICBjb25zdCBhcmdzOiBzdHJpbmdbXSA9IFtcbiAgICBcIi1wXCIsXG4gICAgLi4udG9vbEFyZ3MsXG4gICAgXCItLWRpc2FsbG93ZWRUb29sc1wiLFxuICAgIC8vIEND7JeQ7IScIOyekOuPmSDtmZzshLHtmZTrkJjripQgZGVmZXJyZWQg64+E6rWsLiDthqDtgbAg7LWc7KCB7ZmU66W87JyE7ZW0IOywqOuLqFxuICAgIC4uLihbXCJNb25pdG9yXCIsIFwiUHVzaE5vdGlmaWNhdGlvblwiLCBcIlJlbW90ZVRyaWdnZXJcIl0gYXMgY29uc3QpLFxuICAgIFwiLS1vdXRwdXQtZm9ybWF0XCIsXG4gICAgXCJzdHJlYW0tanNvblwiLFxuICAgIFwiLS12ZXJib3NlXCIsXG4gICAgLy8gLS1tYXgtdHVybnM6IHN0cnVjdHVyZWQgb3V0cHV0IOydgCB0b29sX3VzZSArIHRvb2xfcmVzdWx0IOuhnCAy7YS0IOyGjOu5hFxuICAgIFwiLS1tYXgtdHVybnNcIixcbiAgICB1c2VTdHJ1Y3R1cmVkT3V0cHV0ID8gXCIyXCIgOiBcIjFcIixcbiAgICBcIi0tcGVybWlzc2lvbi1tb2RlXCIsXG4gICAgXCJieXBhc3NQZXJtaXNzaW9uc1wiLFxuICAgIFwiLS1zZXR0aW5nLXNvdXJjZXNcIixcbiAgICBcInByb2plY3RcIixcbiAgICBcIi0tbW9kZWxcIixcbiAgICBtb2RlbCxcbiAgICAvLyAtLXN5c3RlbS1wcm9tcHTripQg67CY65Oc7IucIOuqheyLnO2VtOyVvO2VqC4g7Ji17IWYIOyDneuetSDsi5wgQ0PqsIAgZGVmYXVsdCBzeXN0ZW0gcHJvbXB066W8IOyekOuPmeycvOuhnCDso7zsnoXtlagoMjNrKVxuICAgIFwiLS1zeXN0ZW0tcHJvbXB0XCIsXG4gICAgaW5wdXQuc3lzdGVtID8/IFwiXCIsXG4gICAgXCItLXRoaW5raW5nXCIsXG4gICAgXCJkaXNhYmxlZFwiLFxuICAgIFwiLS1lZmZvcnRcIixcbiAgICBpbnB1dC5lZmZvcnQgPz8gREVGQVVMVF9FRkZPUlQsXG4gICAgXCItLW5vLXNlc3Npb24tcGVyc2lzdGVuY2VcIixcbiAgICAvLyDrqqjrk6Agc2tpbGxzIOu5hO2ZnOyEse2ZlFxuICAgIFwiLS1kaXNhYmxlLXNsYXNoLWNvbW1hbmRzXCIsXG4gIF07XG4gIGlmICh1c2VTdHJ1Y3R1cmVkT3V0cHV0KSB7XG4gICAgYXJncy5wdXNoKFwiLS1qc29uLXNjaGVtYVwiLCBpbnB1dC5qc29uU2NoZW1hISk7XG4gIH1cbiAgYXJncy5wdXNoKGlucHV0LnByb21wdCk7XG5cbiAgY29uc3QgZW52OiBOb2RlSlMuUHJvY2Vzc0VudiA9IHtcbiAgICBQQVRIOiBwcm9jZXNzLmVudi5QQVRILFxuICAgIFRNUERJUjogcHJvY2Vzcy5lbnYuVE1QRElSLFxuICAgIENMQVVERV9DT0RFX09BVVRIX1RPS0VOOiB0b2tlbixcbiAgICAvLyBDTEFVREVfQ09ORklHX0RJUiDtmZjqsr3rs4DsiJjroZwg7KO87J6FXG4gICAgQ0xBVURFX0NPTkZJR19ESVIsXG4gICAgQ0xBVURFX0NPREVfRElTQUJMRV9BVVRPX01FTU9SWTogXCIxXCIsXG4gICAgQ0xBVURFX0NPREVfRElTQUJMRV9BREFQVElWRV9USElOS0lORzogXCIxXCIsXG4gICAgQ0xBVURFX0NPREVfRElTQUJMRV8xTV9DT05URVhUOiBcIjFcIixcbiAgICBDTEFVREVfQ09ERV9ESVNBQkxFX0NMQVVERV9NRFM6IFwiMVwiLFxuICAgIENMQVVERV9DT0RFX0FUVFJJQlVUSU9OX0hFQURFUjogXCIwXCIsXG4gIH07XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlPE9taXQ8UXVlcnlPdXRwdXQsIFwiY29udGVudFwiIHwgXCJmaW5pc2hSZWFzb25cIj4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKFwiY2xhdWRlXCIsIGFyZ3MsIHtcbiAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJwaXBlXCIsIFwiaWdub3JlXCJdLFxuICAgICAgZW52LFxuICAgICAgLy8g6rKp66asICjrkZAg64uo6rOEKTpcbiAgICAgIC8vIDEuIENMQVVERV9DV0Qg4oCUIHByb2plY3Qgc2NvcGUg6rKp66asIChjd2Qg7J2YIC5jbGF1ZGUvc2V0dGluZ3MuanNvbilcbiAgICAgIC8vIDIuIENMQVVERV9DT05GSUdfRElSIOKAlCB1c2VyIHNjb3BlIOqyqeumrCBjd2Qg6rKp66as66eM7Jy866GgIOu2gOyhsS5cbiAgICAgIGN3ZDogQ0xBVURFX0NXRCxcbiAgICB9KTtcblxuICAgIGxldCBidWZmZXIgPSBcIlwiO1xuICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgIGNoaWxkLmtpbGwoKTtcbiAgICAgIHJlamVjdChuZXcgVGltZW91dEVycm9yKGBUaW1lb3V0IGFmdGVyICR7dGltZW91dCAvIDEwMDB9cyAodG9rZW46ICR7bWFza1Rva2VuKHRva2VuKX0pYCkpO1xuICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgY2hpbGQuc3Rkb3V0Py5vbihcImRhdGFcIiwgKGQ6IEJ1ZmZlcikgPT4ge1xuICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgIGJ1ZmZlciArPSBkLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBsaW5lcyA9IGJ1ZmZlci5zcGxpdChcIlxcblwiKTtcbiAgICAgIGJ1ZmZlciA9IGxpbmVzLnBvcCgpID8/IFwiXCI7XG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgaWYgKCFsaW5lLnRyaW0oKSkgY29udGludWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaiA9IEpTT04ucGFyc2UobGluZSk7XG4gICAgICAgICAgaWYgKGoudHlwZSA9PT0gXCJyZXN1bHRcIiAmJiAhc2V0dGxlZCkge1xuICAgICAgICAgICAgLy8gLS1qc29uLXNjaGVtYSDsgqzsmqkg7IucIHN0cnVjdHVyZWRfb3V0cHV0IOyXkCDtjIzsi7HrkJwg6rCd7LK06rCAIOyYqOuLpCDihpIg7Jqw7ISgIOyCrOyaqVxuICAgICAgICAgICAgbGV0IHRleHQ6IHN0cmluZztcbiAgICAgICAgICAgIGlmIChqLnN0cnVjdHVyZWRfb3V0cHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgdGV4dCA9IEpTT04uc3RyaW5naWZ5KGouc3RydWN0dXJlZF9vdXRwdXQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGV4dCA9IChqLnJlc3VsdCA/PyBcIlwiKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9eYGBgKD86anNvbik/XFxzKlxcbj8vaSwgXCJcIilcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxuP2BgYFxccyokL2ksIFwiXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGV4dC5zdGFydHNXaXRoKFwiWW91J3ZlIGhpdFwiKSkge1xuICAgICAgICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgICAgcmVqZWN0KG5ldyBRdW90YUVycm9yKGBRdW90YSBleGhhdXN0ZWQgKHRva2VuOiAke21hc2tUb2tlbih0b2tlbil9KWApKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB1ID0gai51c2FnZSA/PyB7fTtcbiAgICAgICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgICB1c2FnZToge1xuICAgICAgICAgICAgICAgIGlucHV0X3Rva2VuczogdS5pbnB1dF90b2tlbnMgPz8gMCxcbiAgICAgICAgICAgICAgICBvdXRwdXRfdG9rZW5zOiB1Lm91dHB1dF90b2tlbnMgPz8gMCxcbiAgICAgICAgICAgICAgICBjYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnM6IHUuY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgICAgICAgY2FjaGVfcmVhZF9pbnB1dF90b2tlbnM6IHUuY2FjaGVfcmVhZF9pbnB1dF90b2tlbnMgPz8gMCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZHVyYXRpb25Nczogai5kdXJhdGlvbl9tcyA/PyAwLFxuICAgICAgICAgICAgICBjb3N0VXNkOiBqLnRvdGFsX2Nvc3RfdXNkID8/IDAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge31cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHJlamVjdChuZXcgUHJvY2Vzc0Vycm9yKGBDTEkgcHJvY2VzcyBjbG9zZWQgd2l0aG91dCByZXN1bHQgKHRva2VuOiAke21hc2tUb2tlbih0b2tlbil9KWApKTtcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHJlamVjdChuZXcgUHJvY2Vzc0Vycm9yKGBDTEkgcHJvY2VzcyBlcnJvcjogJHtlcnIubWVzc2FnZX0gKHRva2VuOiAke21hc2tUb2tlbih0b2tlbil9KWApKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBRZ3JpZERpc3BhdGNoZXIgPSBuZXcgUWdyaWREaXNwYXRjaGVyQ2xhc3MoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQ0EsTUFBTSxTQUFTLFVBQVUsQ0FBQyxRQUFRLENBQUM7QUFFbkMsTUFBTSxnQkFBZ0I7QUFDdEIsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxpQkFBaUI7QUFJdkIsTUFBTSxhQUFhO0FBR25CLE1BQU0sb0JBQW9CO0FBRzFCLE1BQU0sd0JBQXdCO0NBQzVCLHVCQUF1QjtDQUN2Qix3QkFBd0I7Q0FDeEIsbUJBQW1CO0NBQ3BCO0FBR0QsTUFBTSxvQkFBb0I7QUFFMUIsSUFBYSx1QkFBYixNQUFrQztDQUNoQyx5QkFBUyxJQUFJLEtBQTJCO0NBR3hDLGdDQUFnQixJQUFJLEtBQXFCO0NBQ3pDLFVBQVU7Q0FHVixhQUFxQztDQUNyQyxtQkFBNEM7Q0FFNUMsY0FBYztFQUNaLE1BQU0sZUFBZSxLQUFLLFVBQVUsdUJBQXVCLE1BQU0sRUFBRTtBQUVuRSxZQUFVLEdBQUcsV0FBVyxXQUFXLEVBQUUsV0FBVyxNQUFNLENBQUM7QUFDdkQsZ0JBQWMsR0FBRyxXQUFXLHlCQUF5QixhQUFhO0FBRWxFLFlBQVUsbUJBQW1CLEVBQUUsV0FBVyxNQUFNLENBQUM7QUFDakQsZ0JBQWMsR0FBRyxrQkFBa0IsZ0JBQWdCLEtBQUs7QUFDeEQsZ0JBQWMsR0FBRyxrQkFBa0IsaUJBQWlCLGFBQWE7O0NBR25FLFFBQVEsTUFBc0I7QUFDNUIsU0FBTyxLQUFLLGNBQWMsSUFBSSxLQUFLLElBQUk7O0NBSXpDLFlBQVksSUFBWSxLQUF5QjtBQUMvQyxPQUFLLE9BQU8sSUFBSSxJQUFJLElBQUk7O0NBRzFCLFlBQVksSUFBa0I7QUFDNUIsT0FBSyxPQUFPLE9BQU8sR0FBRzs7Q0FHeEIsYUFBYSxNQUE0QjtBQUN2QyxPQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssS0FBSyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDOztDQUduRCxXQUF5QjtBQUN2QixTQUFPLENBQUMsR0FBRyxLQUFLLE9BQU8sUUFBUSxDQUFDLENBQUMsS0FBSyxPQUFPO0dBQzNDLE9BQU8sVUFBVSxlQUFlLEVBQUUsWUFBWSxDQUFDO0dBQy9DLE1BQU0sRUFBRTtHQUNSLFVBQVUsRUFBRTtHQUNaLFVBQVUsS0FBSyxRQUFRLEVBQUUsS0FBSztHQUMvQixFQUFFOztDQUdMLFlBQVksV0FBVyxhQUFrQztFQUN2RCxNQUFNLE9BQU8sQ0FBQyxHQUFHLEtBQUssT0FBTyxRQUFRLENBQUMsQ0FBQyxRQUFRLE1BQU0sRUFBRSxhQUFhLFNBQVM7QUFDN0UsTUFBSSxLQUFLLFdBQVcsRUFBRyxRQUFPO0VBRTlCLE1BQU0sV0FBVyxLQUFLLElBQUksR0FBRyxLQUFLLEtBQUssTUFBTSxLQUFLLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztFQUNuRSxNQUFNLE9BQU8sS0FBSyxRQUFRLE1BQU0sS0FBSyxRQUFRLEVBQUUsS0FBSyxLQUFLLFNBQVM7RUFDbEUsTUFBTSxTQUFTLEtBQUssS0FBSyxVQUFVLEtBQUs7QUFDeEMsT0FBSztBQUNMLFNBQU87O0NBR1QsTUFBTSxNQUFNLE9BQW1CLFdBQTBDO0FBQ3ZFLE1BQUksTUFBTSxPQUFPLFVBQVUsTUFBTSxXQUMvQixPQUFNLElBQUksYUFBYSwrQ0FBK0M7RUFHeEUsTUFBTSxlQUFlLE1BQU0sT0FBTyxTQUM5QixvQkFBb0IsTUFBTSxNQUFNLEdBQ2hDLE1BQU0sYUFDSCxLQUFLLE1BQU0sTUFBTSxXQUFXLEdBQzdCO0FBR04sTUFBSSxNQUFNLE9BQU8sU0FBUyxJQUFJLEVBQUU7R0FDOUIsTUFBTSxDQUFDLFVBQVUsU0FBUyxNQUFNLE1BQU0sTUFBTSxLQUFLLEVBQUU7QUFDbkQsVUFBTyxPQUFPLGdCQUFnQjtBQUM5QixPQUFJLGFBQWEsVUFBVTtBQUN6QixRQUFJLENBQUMsS0FBSyxpQkFBa0IsT0FBTSxJQUFJLFdBQVcsb0NBQW9DO0lBQ3JGLE1BQU0sU0FBUyxNQUFNLEtBQUssaUJBQWlCLFNBQVM7S0FDM0M7S0FDUCxPQUFPLENBQUM7TUFBRSxNQUFNO01BQWlCLE1BQU0sTUFBTTtNQUFRLGVBQWUsRUFBRTtNQUFFLENBQUM7S0FDekUsY0FBYyxNQUFNO0tBQ3BCLGNBQWMsZUFDVCxVQUFVLGFBQWdELEdBQzNEO0tBQ0osUUFBUSxNQUFNO0tBQ2QsV0FBVyxNQUFNO0tBQ2pCLGtCQUFrQixNQUFNO0tBQ3hCLGFBQWEsTUFBTTtLQUNuQixTQUFTLE1BQU0sVUFBVSxLQUFLLE1BQU0sTUFBTSxRQUFRLEdBQUc7S0FDdEQsQ0FBQztBQUVGLFdBQU8sdUJBQ0w7S0FDRSxNQUFNLE9BQU87S0FDYixXQUFXLE9BQU87S0FDbEIsT0FBTyxPQUFPO0tBQ2QsT0FBTztNQUNMLGNBQWMsT0FBTyxNQUFNO01BQzNCLGVBQWUsT0FBTyxNQUFNO01BQzVCLDZCQUE2QjtNQUM3Qix5QkFBeUIsT0FBTyxNQUFNO01BQ3ZDO0tBQ0QsWUFBWSxPQUFPO0tBQ25CLFNBQVMsaUJBQWlCLE9BQU8sT0FBTztNQUN0QyxhQUFhLE9BQU8sTUFBTTtNQUMxQixjQUFjLE9BQU8sTUFBTTtNQUMzQixtQkFBbUIsT0FBTyxNQUFNO01BQ2pDLENBQUM7S0FDSCxFQUNELE1BQU0sTUFDUDs7O0VBSUwsTUFBTSxpQkFDSixnQkFBZ0IsTUFBTSxPQUFPLFNBQ3pCO0dBQUUsR0FBRztHQUFPLFlBQVksS0FBSyxVQUFVLGFBQWE7R0FBRSxHQUN0RDtFQUdOLE1BQU0sZUFBZSxLQUFLLGFBQWE7QUFDdkMsTUFBSSxDQUFDLGFBQWMsT0FBTSxJQUFJLFdBQVcsc0JBQXNCO0FBRzlELE9BQUssY0FBYyxJQUFJLGFBQWEsTUFBTSxLQUFLLFFBQVEsYUFBYSxLQUFLLEdBQUcsRUFBRTtFQUU5RSxJQUFJLFFBQVEsZUFBZSxhQUFhLFlBQVk7RUFFcEQsTUFBTSxZQUFZLGFBQWEsYUFBYSxZQUFZO0FBQ3hELE1BQ0UsYUFDQSxZQUFZLEtBQUssS0FBSyxHQUFHLHFCQUN6QixnQkFBZ0IsYUFBYSxZQUFZLENBRXpDLEtBQUk7R0FDRixNQUFNLEVBQUUsZUFBZSxNQUFNLE9BQU87QUFDcEMsV0FBUSxNQUFNLFdBQVcsYUFBYSxhQUFhO1dBQzVDLEdBQUc7QUFDVixVQUFPLEtBQUssc0JBQXNCLGFBQWEsS0FBSyxJQUFLLEVBQVksVUFBVTs7QUFJbkYsU0FBTyxLQUFLLEtBQUssYUFBYSxLQUFLLFdBQVcsTUFBTSxTQUFTLGNBQWMsR0FBRztBQUc5RSxTQUFPLHVCQUNMO0dBQUUsR0FGVyxNQUFNLGNBQWMsZ0JBQWdCLE9BQU8sYUFBYSxtQkFBbUI7R0FFM0UsV0FBVyxhQUFhO0dBQU0sT0FBTyxNQUFNLFNBQVM7R0FBZSxFQUNoRixNQUFNLE1BQ1A7O0NBR0gsTUFBTSxZQUNKLE9BQ0EsSUFPZTtBQUNmLE1BQUksQ0FBQyxNQUFNLE9BQU8sV0FBVyxVQUFVLEVBQUU7R0FDdkMsTUFBTSxTQUFTLE1BQU0sS0FBSyxNQUFNLE1BQU07QUFDdEMsTUFBRyxXQUFXLE9BQU87QUFDckI7O0VBR0YsTUFBTSxHQUFHLFNBQVMsTUFBTSxNQUFNLE1BQU0sS0FBSyxFQUFFO0FBQzNDLE1BQUksQ0FBQyxNQUFPLE9BQU0sSUFBSSxhQUFhLGdCQUFnQjtBQUNuRCxNQUFJLENBQUMsS0FBSyxpQkFBa0IsT0FBTSxJQUFJLFdBQVcsb0NBQW9DO0VBRXJGLE1BQU0sZUFBZSxNQUFNLE9BQU8sU0FDOUIsb0JBQW9CLE1BQU0sTUFBTSxHQUNoQyxNQUFNLGFBQ0gsS0FBSyxNQUFNLE1BQU0sV0FBVyxHQUM3QjtBQUVOLFFBQU0sS0FBSyxpQkFBaUIsZUFDMUI7R0FDRTtHQUNBLE9BQU8sQ0FBQztJQUFFLE1BQU07SUFBaUIsTUFBTSxNQUFNO0lBQVEsZUFBZSxFQUFFO0lBQUUsQ0FBQztHQUN6RSxjQUFjLE1BQU07R0FDcEIsY0FBYyxlQUNULFVBQVUsYUFBZ0QsR0FDM0Q7R0FDSixRQUFRLE1BQU07R0FDZCxXQUFXLE1BQU07R0FDakIsa0JBQWtCLE1BQU07R0FDeEIsYUFBYSxNQUFNO0dBQ25CLFNBQVMsTUFBTSxVQUFVLEtBQUssTUFBTSxNQUFNLFFBQVEsR0FBRztHQUN0RCxFQUNEO0dBQ0UsU0FBUyxHQUFHO0dBQ1osWUFBWSxHQUFHO0dBQ2YsVUFBVSxHQUFHO0dBQ2IsYUFBYSxlQUFlO0lBQzFCLE1BQU0sVUFBVSx1QkFDZDtLQUNFLE1BQU0sV0FBVztLQUNqQixXQUFZLFdBQWlEO0tBQzdELE9BQU8sV0FBVztLQUNsQixPQUFPO01BQ0wsY0FBYyxXQUFXLE1BQU07TUFDL0IsZUFBZSxXQUFXLE1BQU07TUFDaEMsNkJBQTZCO01BQzdCLHlCQUF5QixXQUFXLE1BQU07TUFDM0M7S0FDRCxZQUFZLFdBQVc7S0FDdkIsU0FBUyxpQkFBaUIsV0FBVyxPQUFPO01BQzFDLGFBQWEsV0FBVyxNQUFNO01BQzlCLGNBQWMsV0FBVyxNQUFNO01BQy9CLG1CQUFtQixXQUFXLE1BQU07TUFDckMsQ0FBQztLQUNILEVBQ0QsTUFBTSxNQUNQO0FBQ0QsT0FBRyxXQUFXLFFBQVE7O0dBRXhCLFNBQVMsR0FBRztHQUNiLENBQ0Y7OztBQUlMLGVBQWUsY0FDYixPQUNBLE9BQ0EsV0FDd0Q7Q0FDeEQsTUFBTSxXQUFXLE1BQU0sU0FBUztDQUNoQyxNQUFNLFFBQVEsU0FBUyxTQUFTLElBQUksR0FBRyxTQUFTLE1BQU0sSUFBSSxDQUFDLEtBQUssR0FBSTtDQUNwRSxNQUFNLFVBQVUsTUFBTSxXQUFXO0NBQ2pDLE1BQU0sc0JBQXNCLE1BQU0sY0FBYyxNQUFNLFdBQVcsU0FBUztDQVExRSxNQUFNLE9BQWlCO0VBQ3JCO0VBQ0EsR0FOZSxzQkFDYjtHQUFDO0dBQVc7R0FBSTtHQUFtQjtHQUFtQixHQUN0RCxDQUFDLFdBQVcsR0FBRztFQUtqQjtFQUVBLEdBQUk7R0FBQztHQUFXO0dBQW9CO0dBQWdCO0VBQ3BEO0VBQ0E7RUFDQTtFQUVBO0VBQ0Esc0JBQXNCLE1BQU07RUFDNUI7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBRUE7RUFDQSxNQUFNLFVBQVU7RUFDaEI7RUFDQTtFQUNBO0VBQ0EsTUFBTSxVQUFVO0VBQ2hCO0VBRUE7RUFDRDtBQUNELEtBQUksb0JBQ0YsTUFBSyxLQUFLLGlCQUFpQixNQUFNLFdBQVk7QUFFL0MsTUFBSyxLQUFLLE1BQU0sT0FBTztDQUV2QixNQUFNLE1BQXlCO0VBQzdCLE1BQU0sUUFBUSxJQUFJO0VBQ2xCLFFBQVEsUUFBUSxJQUFJO0VBQ3BCLHlCQUF5QjtFQUV6QjtFQUNBLGlDQUFpQztFQUNqQyx1Q0FBdUM7RUFDdkMsZ0NBQWdDO0VBQ2hDLGdDQUFnQztFQUNoQyxnQ0FBZ0M7RUFDakM7QUFFRCxRQUFPLElBQUksU0FBd0QsU0FBUyxXQUFXO0VBQ3JGLE1BQU0sUUFBUSxNQUFNLFVBQVUsTUFBTTtHQUNsQyxPQUFPO0lBQUM7SUFBVTtJQUFRO0lBQVM7R0FDbkM7R0FJQSxLQUFLO0dBQ04sQ0FBQztFQUVGLElBQUksU0FBUztFQUNiLElBQUksVUFBVTtFQUNkLE1BQU0sUUFBUSxpQkFBaUI7QUFDN0IsT0FBSSxRQUFTO0FBQ2IsYUFBVTtBQUNWLFNBQU0sTUFBTTtBQUNaLFVBQU8sSUFBSSxhQUFhLGlCQUFpQixVQUFVLElBQUssWUFBWSxVQUFVLE1BQU0sQ0FBQyxHQUFHLENBQUM7S0FDeEYsUUFBUTtBQUVYLFFBQU0sUUFBUSxHQUFHLFNBQVMsTUFBYztBQUN0QyxPQUFJLFFBQVM7QUFDYixhQUFVLEVBQUUsVUFBVTtHQUN0QixNQUFNLFFBQVEsT0FBTyxNQUFNLEtBQUs7QUFDaEMsWUFBUyxNQUFNLEtBQUssSUFBSTtBQUN4QixRQUFLLE1BQU0sUUFBUSxPQUFPO0FBQ3hCLFFBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBRTtBQUNsQixRQUFJO0tBQ0YsTUFBTSxJQUFJLEtBQUssTUFBTSxLQUFLO0FBQzFCLFNBQUksRUFBRSxTQUFTLFlBQVksQ0FBQyxTQUFTO01BRW5DLElBQUk7QUFDSixVQUFJLEVBQUUsc0JBQXNCLE9BQzFCLFFBQU8sS0FBSyxVQUFVLEVBQUUsa0JBQWtCO1VBRTFDLFNBQVEsRUFBRSxVQUFVLElBQ2pCLFFBQVEsd0JBQXdCLEdBQUcsQ0FDbkMsUUFBUSxlQUFlLEdBQUc7QUFHL0IsVUFBSSxLQUFLLFdBQVcsYUFBYSxFQUFFO0FBQ2pDLGlCQUFVO0FBQ1Ysb0JBQWEsTUFBTTtBQUNuQixjQUFPLElBQUksV0FBVywyQkFBMkIsVUFBVSxNQUFNLENBQUMsR0FBRyxDQUFDO0FBQ3RFOztNQUdGLE1BQU0sSUFBSSxFQUFFLFNBQVMsRUFBRTtBQUN2QixnQkFBVTtBQUNWLG1CQUFhLE1BQU07QUFDbkIsY0FBUTtPQUNOO09BQ0EsT0FBTztRQUNMLGNBQWMsRUFBRSxnQkFBZ0I7UUFDaEMsZUFBZSxFQUFFLGlCQUFpQjtRQUNsQyw2QkFBNkIsRUFBRSwrQkFBK0I7UUFDOUQseUJBQXlCLEVBQUUsMkJBQTJCO1FBQ3ZEO09BQ0QsWUFBWSxFQUFFLGVBQWU7T0FDN0IsU0FBUyxFQUFFLGtCQUFrQjtPQUM5QixDQUFDOztZQUVFOztJQUVWO0FBRUYsUUFBTSxHQUFHLGVBQWU7QUFDdEIsT0FBSSxRQUFTO0FBQ2IsYUFBVTtBQUNWLGdCQUFhLE1BQU07QUFDbkIsVUFBTyxJQUFJLGFBQWEsNkNBQTZDLFVBQVUsTUFBTSxDQUFDLEdBQUcsQ0FBQztJQUMxRjtBQUVGLFFBQU0sR0FBRyxVQUFVLFFBQVE7QUFDekIsT0FBSSxRQUFTO0FBQ2IsYUFBVTtBQUNWLGdCQUFhLE1BQU07QUFDbkIsVUFBTyxJQUFJLGFBQWEsc0JBQXNCLElBQUksUUFBUSxXQUFXLFVBQVUsTUFBTSxDQUFDLEdBQUcsQ0FBQztJQUMxRjtHQUNGOztBQUdKLE1BQWEsa0JBQWtCLElBQUksc0JBQXNCIn0=
321
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJub2RlOmFzc2VydFwiO1xuLyoqXG4gKiBRZ3JpZERpc3BhdGNoZXIg4oCUIE9BdXRoIO2GoO2BsCDshKDtg50gKyBjbGF1ZGUgQ0xJIGZyZXNoIHNwYXduIOuUlOyKpO2MqOyymCDsi7HquIDthLQuXG4gKlxuICogLSDrp6Qg7JqU7LKt66eI64ukIOyDiCBjbGF1ZGUgQ0xJIO2UhOuhnOyEuOyKpCBzcGF3biDihpIg7J2R64u1IO2bhCDsooXro4xcbiAqIC0gbGVhc3QtdXNlZCByb3VuZC1yb2JpbiDsnLzroZwg7Yag7YGwIOyEoO2DnVxuICogLSDrqZTrqqjrpqwg7LqQ7IucIChNYXA8aWQsIFRva2VuU3Vic2V0QT4pIOuKlCBUb2tlblN1YnNjcmliZXIg6rCAIHBnIExJU1RFTi9OT1RJRlkg66GcIOqwseyLoFxuICogLSBxdWVyeSDsi5wgZXhwaXJlc19hdCDruYTqtZAg4oaSIOyehOuwlSDsi5wgcHJlZW1wdGl2ZSByZWZyZXNoXG4gKiAtIFF1b3RhRXJyb3Ig64qUIOq3uOuMgOuhnCDsg4HsnIQg7KCE7YyMICjsnpDrj5kgZmFpbG92ZXIg7JeG7J2MLCBVSSDsl5DshJwg7IiY64+ZIO2GoOq4gClcbiAqXG4gKiBlbnYgYWxsb3dsaXN0OiBQQVRILCBUTVBESVIsIENMQVVERV9DT0RFX09BVVRIX1RPS0VOLCBDTEFVREVfQ09ORklHX0RJUlxuICogICArIENMQVVERV9DT0RFX0RJU0FCTEVfKiArIENMQVVERV9DT0RFX0FUVFJJQlVUSU9OX0hFQURFUlxuICovXG5pbXBvcnQgeyBzcGF3biB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IG1rZGlyU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmltcG9ydCB7IHR5cGUgSnNvblZhbHVlIH0gZnJvbSBcIi4uLy4uL2NvZGV4LXByb3RvY29sL3NlcmRlX2pzb24vSnNvblZhbHVlXCI7XG5pbXBvcnQge1xuICBnZXRBY2Nlc3NUb2tlbixcbiAgZ2V0RXhwaXJlc0F0LFxuICBnZXRSZWZyZXNoVG9rZW4sXG59IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL2NyZWRlbnRpYWxzXCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVDb3N0VXNkIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vbW9kZWwtY29zdFwiO1xuaW1wb3J0IHsgc3RyaWN0aWZ5IH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vc3RyaWN0aWZpZXJcIjtcbmltcG9ydCB7IHR5cGUgT3BlbkFJRGlzcGF0Y2hlciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvb3BlbmFpL29wZW5haS1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2V0QSB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBkZWNpZGVDb252Um91dGluZywgaXNzdWVDb252Q29udGV4dCB9IGZyb20gXCIuL2NvbnYtcm91dGluZ1wiO1xuaW1wb3J0IHsgdHlwZSBRdWVyeUlucHV0LCB0eXBlIFF1ZXJ5T3V0cHV0LCB0eXBlIFRva2VuU3RhdHMgfSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgbWFza1Rva2VuLCBQcm9jZXNzRXJyb3IsIFF1b3RhRXJyb3IsIFRpbWVvdXRFcnJvciB9IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2NyaWJlciB9IGZyb20gXCIuL3Rva2VuLXN1YnNjcmliZXJcIjtcbmltcG9ydCB7IGFwcGx5VG9vbENhbGxFbXVsYXRpb24sIGJ1aWxkVG9vbENhbGxTY2hlbWEgfSBmcm9tIFwiLi90b29sLWVtdWxhdGlvblwiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIl0pO1xuXG5jb25zdCBERUZBVUxUX01PREVMID0gXCJzb25uZXRcIjtcbmNvbnN0IERFRkFVTFRfVElNRU9VVF9NUyA9IDYwMF8wMDA7XG5jb25zdCBERUZBVUxUX0VGRk9SVCA9IFwiaGlnaFwiO1xuXG4vLyBjbGF1ZGUgQ0xJIOydmCBjd2QuIOydtCDqsr3roZzsnZggLmNsYXVkZS9zZXR0aW5ncy5qc29uIOydtCBwcm9qZWN0IHNjb3BlIOuhnCDroZzrk5zrkJjslrRcbi8vIO2YueyLnOudvOuPhCDsnojsnYQgdXNlciBzY29wZSAofi8uY2xhdWRlL3NldHRpbmdzLmpzb24p66W8IOuNruyWtOyUgCAoLS1zZXR0aW5nLXNvdXJjZXMgcHJvamVjdCDsmYAg7ZWo6ruYKS5cbmNvbnN0IENMQVVERV9DV0QgPSBcIi90bXAvcWdyaWRcIjtcblxuLy8g6riA66Gc67KMIHVzZXIgY29uZmlnIOqyqeumrCDqsr3roZwuIChDQ+yXkOyEnCDtmZjqsr3rs4DsiJjroZwg7J2964qU67OA7IiYKVxuY29uc3QgQ0xBVURFX0NPTkZJR19ESVIgPSBcIi90bXAvcWdyaWQtY29uZmlnXCI7XG5cbi8vIHFncmlkIOyghOyaqSBwcm9qZWN0L2dsb2JhbCBzZXR0aW5ncyDigJQgdXNlciBzY29wZSDqsqnrpqzsmqlcbmNvbnN0IFFHUklEX0NMQVVERV9TRVRUSU5HUyA9IHtcbiAgYWx3YXlzVGhpbmtpbmdFbmFibGVkOiBmYWxzZSwgLy8gdGhpbmtpbmcgYmxvY2sg7LCo64uoXG4gIGluY2x1ZGVHaXRJbnN0cnVjdGlvbnM6IGZhbHNlLCAvLyBzeXN0ZW0gcHJvbXB0IOydmCBnaXQg6rCA7J2065OcIOygnOqxsFxuICBjbGVhbnVwUGVyaW9kRGF5czogMSxcbn07XG5cbi8vIO2GoO2BsCDrp4zro4wg7J6E67CVIOyehOqzhOqwkiDigJQgdG9rZW4uZXhwaXJlZEF07J20IDHrtoQg7JWI7JeQIOunjOujjOuQnOuLpOuptCBxdWVyeSDsi5wg7LK07YGs7ZWY6rOgIHJlZnJlc2guXG5jb25zdCBSRUZSRVNIX1NBRkVUWV9NUyA9IDYwXzAwMDtcblxuZXhwb3J0IGNsYXNzIFFncmlkRGlzcGF0Y2hlckNsYXNzIHtcbiAgdG9rZW5zID0gbmV3IE1hcDxudW1iZXIsIFRva2VuU3Vic2V0QT4oKTtcblxuICAvLyBrZXnquLDrsJgodG9rZW5OYW1lKSDriITsoIEg7Lm07Jq07YSwLiB0b2tlbiDsnbQgT0F1dGggcmVmcmVzaCDroZwg66Gc7YWM7J207Yq465CY64+EIHRva2VuTmFtZSDsnYAg67aI67OA7J206528IOy5tOyatO2EsCDsnKDsp4DrkKhcbiAgcmVxdWVzdENvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIHJySW5kZXggPSAwO1xuXG4gIC8vIHNvbmFtdS5jb25maWcgb25TdGFydCDsl5DshJwg7LKY66as7ZWY64qUIOuzgOyImFxuICBzdWJzY3JpYmVyOiBUb2tlblN1YnNjcmliZXIgfCBudWxsID0gbnVsbDtcbiAgb3BlbmFpRGlzcGF0Y2hlcjogT3BlbkFJRGlzcGF0Y2hlciB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGNvbnN0IHNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KFFHUklEX0NMQVVERV9TRVRUSU5HUywgbnVsbCwgMik7XG5cbiAgICBta2RpclN5bmMoYCR7Q0xBVURFX0NXRH0vLmNsYXVkZWAsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHdyaXRlRmlsZVN5bmMoYCR7Q0xBVURFX0NXRH0vLmNsYXVkZS9zZXR0aW5ncy5qc29uYCwgc2V0dGluZ3NKc29uKTtcblxuICAgIG1rZGlyU3luYyhDTEFVREVfQ09ORklHX0RJUiwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgd3JpdGVGaWxlU3luYyhgJHtDTEFVREVfQ09ORklHX0RJUn0vLmNsYXVkZS5qc29uYCwgXCJ7fVwiKTtcbiAgICB3cml0ZUZpbGVTeW5jKGAke0NMQVVERV9DT05GSUdfRElSfS9zZXR0aW5ncy5qc29uYCwgc2V0dGluZ3NKc29uKTtcbiAgfVxuXG4gIGNvdW50T2YobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0Q291bnRzLmdldChuYW1lKSA/PyAwO1xuICB9XG5cbiAgLy8gVG9rZW5TdWJzY3JpYmVyIOy9nOuwsSDigJQg7LqQ7IucIG11dGF0aW9uXG4gIHVwc2VydENhY2hlKGlkOiBudW1iZXIsIHJvdzogVG9rZW5TdWJzZXRBKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbnMuc2V0KGlkLCByb3cpO1xuICB9XG5cbiAgcmVtb3ZlQ2FjaGUoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudG9rZW5zLmRlbGV0ZShpZCk7XG4gIH1cblxuICByZXBsYWNlQ2FjaGUocm93czogVG9rZW5TdWJzZXRBW10pOiB2b2lkIHtcbiAgICB0aGlzLnRva2VucyA9IG5ldyBNYXAocm93cy5tYXAoKHIpID0+IFtyLmlkLCByXSkpO1xuICB9XG5cbiAgZ2V0U3RhdHMoKTogVG9rZW5TdGF0c1tdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMudG9rZW5zLnZhbHVlcygpXS5tYXAoKHIpID0+ICh7XG4gICAgICB0b2tlbjogbWFza1Rva2VuKGdldEFjY2Vzc1Rva2VuKHIuY3JlZGVudGlhbHMpKSxcbiAgICAgIG5hbWU6IHIubmFtZSxcbiAgICAgIHByb3ZpZGVyOiByLnByb3ZpZGVyLFxuICAgICAgcmVxdWVzdHM6IHRoaXMuY291bnRPZihyLm5hbWUpLFxuICAgIH0pKTtcbiAgfVxuXG4gIHNlbGVjdFRva2VuKHByb3ZpZGVyID0gXCJhbnRocm9waWNcIik6IFRva2VuU3Vic2V0QSB8IG51bGwge1xuICAgIGNvbnN0IHJvd3MgPSBbLi4udGhpcy50b2tlbnMudmFsdWVzKCldLmZpbHRlcigocikgPT4gci5wcm92aWRlciA9PT0gcHJvdmlkZXIpO1xuICAgIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBtaW5Db3VudCA9IE1hdGgubWluKC4uLnJvd3MubWFwKChyKSA9PiB0aGlzLmNvdW50T2Yoci5uYW1lKSkpO1xuICAgIGNvbnN0IGlkbGUgPSByb3dzLmZpbHRlcigocikgPT4gdGhpcy5jb3VudE9mKHIubmFtZSkgPT09IG1pbkNvdW50KTtcbiAgICBjb25zdCBwaWNrZWQgPSBpZGxlW3RoaXMucnJJbmRleCAlIGlkbGUubGVuZ3RoXSE7XG4gICAgdGhpcy5yckluZGV4Kys7XG4gICAgcmV0dXJuIHBpY2tlZDtcbiAgfVxuXG4gIGFzeW5jIHF1ZXJ5KGlucHV0OiBRdWVyeUlucHV0LCB0aW1lb3V0TXM/OiBudW1iZXIpOiBQcm9taXNlPFF1ZXJ5T3V0cHV0PiB7XG4gICAgaWYgKGlucHV0LnRvb2xzPy5sZW5ndGggJiYgaW5wdXQuanNvblNjaGVtYSkge1xuICAgICAgdGhyb3cgbmV3IFByb2Nlc3NFcnJvcihcInRvb2xzIGFuZCBqc29uU2NoZW1hIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGlucHV0LnRvb2xzPy5sZW5ndGhcbiAgICAgID8gYnVpbGRUb29sQ2FsbFNjaGVtYShpbnB1dC50b29scylcbiAgICAgIDogaW5wdXQuanNvblNjaGVtYVxuICAgICAgICA/IChKU09OLnBhcnNlKGlucHV0Lmpzb25TY2hlbWEpIGFzIEpzb25WYWx1ZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBwcm92aWRlciBwcmVmaXggcm91dGluZzogJ29wZW5haS9ncHQtNS40JyDihpIgT3BlbkFJRGlzcGF0Y2hlclxuICAgIGlmIChpbnB1dC5tb2RlbD8uaW5jbHVkZXMoXCIvXCIpKSB7XG4gICAgICBjb25zdCBbcHJvdmlkZXIsIG1vZGVsXSA9IGlucHV0Lm1vZGVsLnNwbGl0KFwiL1wiLCAyKTtcbiAgICAgIGFzc2VydChtb2RlbCwgXCJ1bmtub3duIG1vZGVsXCIpO1xuICAgICAgaWYgKHByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICAgIGlmICghdGhpcy5vcGVuYWlEaXNwYXRjaGVyKSB0aHJvdyBuZXcgUXVvdGFFcnJvcihcIk9wZW5BSSBkaXNwYXRjaGVyIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMub3BlbmFpRGlzcGF0Y2hlci5nZW5lcmF0ZSh7XG4gICAgICAgICAgbW9kZWw6IG1vZGVsLFxuICAgICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICAgIG91dHB1dFNjaGVtYTogb3V0cHV0U2NoZW1hXG4gICAgICAgICAgICA/IChzdHJpY3RpZnkob3V0cHV0U2NoZW1hIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHN0cmljdGlmeT5bMF0pIGFzIEpzb25WYWx1ZSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgICAgIHZlcmJvc2l0eTogaW5wdXQudmVyYm9zaXR5LFxuICAgICAgICAgIHJlYXNvbmluZ1N1bW1hcnk6IGlucHV0LnJlYXNvbmluZ1N1bW1hcnksXG4gICAgICAgICAgc2VydmljZVRpZXI6IGlucHV0LnNlcnZpY2VUaWVyLFxuICAgICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICAgIGNvbGRIaXN0b3J5OiBkZWNpc2lvbi5jb2xkSGlzdG9yeSxcbiAgICAgICAgICByZXVzZTogZGVjaXNpb24ucmV1c2UsXG4gICAgICAgICAgcmV1c2VJbnB1dDogZGVjaXNpb24ucmV1c2VJbnB1dCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaXNzdWVkQ29vcmQgPSBpc3N1ZUNvbnZDb250ZXh0KHJlc3VsdC50aHJlYWRDb29yZCwgZGVjaXNpb24pO1xuICAgICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbihcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0ZXh0OiByZXN1bHQudGV4dCxcbiAgICAgICAgICAgIHRva2VuTmFtZTogcmVzdWx0LnRva2VuTmFtZSxcbiAgICAgICAgICAgIG1vZGVsOiByZXN1bHQubW9kZWwsXG4gICAgICAgICAgICB1c2FnZToge1xuICAgICAgICAgICAgICBpbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICAgICAgb3V0cHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgICAgICAgICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zOiAwLFxuICAgICAgICAgICAgICBjYWNoZV9yZWFkX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGR1cmF0aW9uTXM6IHJlc3VsdC5kdXJhdGlvbk1zLFxuICAgICAgICAgICAgY29zdFVzZDogY2FsY3VsYXRlQ29zdFVzZChyZXN1bHQubW9kZWwsIHtcbiAgICAgICAgICAgICAgaW5wdXRUb2tlbnM6IHJlc3VsdC51c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICAgICAgb3V0cHV0VG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBpbnB1dC50b29scyxcbiAgICAgICAgICBpc3N1ZWRDb29yZCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBleGVjdXRpb25JbnB1dCA9XG4gICAgICBvdXRwdXRTY2hlbWEgJiYgaW5wdXQudG9vbHM/Lmxlbmd0aFxuICAgICAgICA/IHsgLi4uaW5wdXQsIGpzb25TY2hlbWE6IEpTT04uc3RyaW5naWZ5KG91dHB1dFNjaGVtYSkgfVxuICAgICAgICA6IGlucHV0O1xuXG4gICAgLy8gQW50aHJvcGljICjquLDsobQgY2xhdWRlIC1wIOqyveuhnClcbiAgICBjb25zdCBlbGVjdGVkVG9rZW4gPSB0aGlzLnNlbGVjdFRva2VuKCk7XG4gICAgaWYgKCFlbGVjdGVkVG9rZW4pIHRocm93IG5ldyBRdW90YUVycm9yKFwiTm8gdG9rZW5zIGF2YWlsYWJsZVwiKTtcblxuICAgIC8vIGF3YWl0IOyghOyXkCBjb3VudCDshKDrsJjsmIEuIOuzkeugrCDsmpTssq3snbQg64+Z7Iuc7JeQIOuPhOywqe2VtOuPhCDqsIHsnpAg64uk66W4IO2GoO2BsOydhCDqs6DrpbTrj4TroZ0uXG4gICAgdGhpcy5yZXF1ZXN0Q291bnRzLnNldChlbGVjdGVkVG9rZW4ubmFtZSwgdGhpcy5jb3VudE9mKGVsZWN0ZWRUb2tlbi5uYW1lKSArIDEpO1xuXG4gICAgbGV0IHRva2VuID0gZ2V0QWNjZXNzVG9rZW4oZWxlY3RlZFRva2VuLmNyZWRlbnRpYWxzKTtcbiAgICAvLyBleHBpcmVzX2F0IOyehOuwleydtOuptCBwcmVlbXB0aXZlIHJlZnJlc2hcbiAgICBjb25zdCBleHBpcmVzQXQgPSBnZXRFeHBpcmVzQXQoZWxlY3RlZFRva2VuLmNyZWRlbnRpYWxzKTtcbiAgICBpZiAoXG4gICAgICBleHBpcmVzQXQgJiZcbiAgICAgIGV4cGlyZXNBdCAtIERhdGUubm93KCkgPCBSRUZSRVNIX1NBRkVUWV9NUyAmJlxuICAgICAgZ2V0UmVmcmVzaFRva2VuKGVsZWN0ZWRUb2tlbi5jcmVkZW50aWFscylcbiAgICApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgUWdyaWRGcmFtZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi9xZ3JpZC5mcmFtZVwiKTtcbiAgICAgICAgdG9rZW4gPSBhd2FpdCBRZ3JpZEZyYW1lLnJlZnJlc2hUb2tlbihlbGVjdGVkVG9rZW4pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIud2FybihgcmVmcmVzaCBmYWlsZWQgZm9yICR7ZWxlY3RlZFRva2VuLm5hbWV9OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxvZ2dlci5pbmZvKGDihpIgJHtlbGVjdGVkVG9rZW4ubmFtZX0gKG1vZGVsOiAke2lucHV0Lm1vZGVsID8/IERFRkFVTFRfTU9ERUx9KWApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0ZUNsYXVkZShleGVjdXRpb25JbnB1dCwgdG9rZW4sIHRpbWVvdXRNcyA/PyBERUZBVUxUX1RJTUVPVVRfTVMpO1xuICAgIHJldHVybiBhcHBseVRvb2xDYWxsRW11bGF0aW9uKFxuICAgICAgeyAuLi5yZXN1bHQsIHRva2VuTmFtZTogZWxlY3RlZFRva2VuLm5hbWUsIG1vZGVsOiBpbnB1dC5tb2RlbCA/PyBERUZBVUxUX01PREVMIH0sXG4gICAgICBpbnB1dC50b29scyxcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgcXVlcnlTdHJlYW0oXG4gICAgaW5wdXQ6IFF1ZXJ5SW5wdXQsXG4gICAgY2I6IHtcbiAgICAgIG9uRGVsdGE6ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgICBvbkNvbXBsZXRlOiAocmVzdWx0OiBRdWVyeU91dHB1dCkgPT4gdm9pZDtcbiAgICAgIG9uRXJyb3I6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gICAgICBvblRocmVhZElkPzogKHRocmVhZElkOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgICBvblR1cm5JZD86ICh0dXJuSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgICB9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWlucHV0Lm1vZGVsPy5zdGFydHNXaXRoKFwib3BlbmFpL1wiKSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5xdWVyeShpbnB1dCk7XG4gICAgICBjYi5vbkNvbXBsZXRlKHJlc3VsdCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgWywgbW9kZWxdID0gaW5wdXQubW9kZWwuc3BsaXQoXCIvXCIsIDIpO1xuICAgIGlmICghbW9kZWwpIHRocm93IG5ldyBQcm9jZXNzRXJyb3IoXCJ1bmtub3duIG1vZGVsXCIpO1xuICAgIGlmICghdGhpcy5vcGVuYWlEaXNwYXRjaGVyKSB0aHJvdyBuZXcgUXVvdGFFcnJvcihcIk9wZW5BSSBkaXNwYXRjaGVyIG5vdCBpbml0aWFsaXplZFwiKTtcblxuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGlucHV0LnRvb2xzPy5sZW5ndGhcbiAgICAgID8gYnVpbGRUb29sQ2FsbFNjaGVtYShpbnB1dC50b29scylcbiAgICAgIDogaW5wdXQuanNvblNjaGVtYVxuICAgICAgICA/IChKU09OLnBhcnNlKGlucHV0Lmpzb25TY2hlbWEpIGFzIEpzb25WYWx1ZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBkZWNpc2lvbiA9IGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0KTtcbiAgICBhd2FpdCB0aGlzLm9wZW5haURpc3BhdGNoZXIuZ2VuZXJhdGVTdHJlYW0oXG4gICAgICB7XG4gICAgICAgIG1vZGVsLFxuICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGlucHV0LnN5c3RlbSxcbiAgICAgICAgb3V0cHV0U2NoZW1hOiBvdXRwdXRTY2hlbWFcbiAgICAgICAgICA/IChzdHJpY3RpZnkob3V0cHV0U2NoZW1hIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHN0cmljdGlmeT5bMF0pIGFzIEpzb25WYWx1ZSlcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICAgIHZlcmJvc2l0eTogaW5wdXQudmVyYm9zaXR5LFxuICAgICAgICByZWFzb25pbmdTdW1tYXJ5OiBpbnB1dC5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgICBzZXJ2aWNlVGllcjogaW5wdXQuc2VydmljZVRpZXIsXG4gICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgIHJldXNlOiBkZWNpc2lvbi5yZXVzZSxcbiAgICAgICAgcmV1c2VJbnB1dDogZGVjaXNpb24ucmV1c2VJbnB1dCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG9uRGVsdGE6IGNiLm9uRGVsdGEsXG4gICAgICAgIG9uVGhyZWFkSWQ6IGNiLm9uVGhyZWFkSWQsXG4gICAgICAgIG9uVHVybklkOiBjYi5vblR1cm5JZCxcbiAgICAgICAgb25Db21wbGV0ZTogKHR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgICBjb25zdCBpc3N1ZWRDb29yZCA9IGlzc3VlQ29udkNvbnRleHQodHVyblJlc3VsdC50aHJlYWRDb29yZCwgZGVjaXNpb24pO1xuICAgICAgICAgIGNvbnN0IGFwcGxpZWQgPSBhcHBseVRvb2xDYWxsRW11bGF0aW9uKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0ZXh0OiB0dXJuUmVzdWx0LnRleHQsXG4gICAgICAgICAgICAgIHRva2VuTmFtZTogdHVyblJlc3VsdC50b2tlbk5hbWUsXG4gICAgICAgICAgICAgIG1vZGVsOiB0dXJuUmVzdWx0Lm1vZGVsLFxuICAgICAgICAgICAgICB1c2FnZToge1xuICAgICAgICAgICAgICAgIGlucHV0X3Rva2VuczogdHVyblJlc3VsdC51c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICAgICAgICBvdXRwdXRfdG9rZW5zOiB0dXJuUmVzdWx0LnVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgICAgICAgICAgICBjYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnM6IDAsXG4gICAgICAgICAgICAgICAgY2FjaGVfcmVhZF9pbnB1dF90b2tlbnM6IHR1cm5SZXN1bHQudXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uTXM6IHR1cm5SZXN1bHQuZHVyYXRpb25NcyxcbiAgICAgICAgICAgICAgY29zdFVzZDogY2FsY3VsYXRlQ29zdFVzZCh0dXJuUmVzdWx0Lm1vZGVsLCB7XG4gICAgICAgICAgICAgICAgaW5wdXRUb2tlbnM6IHR1cm5SZXN1bHQudXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICAgICAgICAgICAgb3V0cHV0VG9rZW5zOiB0dXJuUmVzdWx0LnVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgICAgICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogdHVyblJlc3VsdC51c2FnZS5jYWNoZWRJbnB1dFRva2VucyxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5wdXQudG9vbHMsXG4gICAgICAgICAgICBpc3N1ZWRDb29yZCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNiLm9uQ29tcGxldGUoYXBwbGllZCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRXJyb3I6IGNiLm9uRXJyb3IsXG4gICAgICB9LFxuICAgICk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUNsYXVkZShcbiAgaW5wdXQ6IFF1ZXJ5SW5wdXQsXG4gIHRva2VuOiBzdHJpbmcsXG4gIHRpbWVvdXRNczogbnVtYmVyLFxuKTogUHJvbWlzZTxPbWl0PFF1ZXJ5T3V0cHV0LCBcImNvbnRlbnRcIiB8IFwiZmluaXNoUmVhc29uXCI+PiB7XG4gIGNvbnN0IHJhd01vZGVsID0gaW5wdXQubW9kZWwgPz8gREVGQVVMVF9NT0RFTDtcbiAgY29uc3QgbW9kZWwgPSByYXdNb2RlbC5pbmNsdWRlcyhcIi9cIikgPyByYXdNb2RlbC5zcGxpdChcIi9cIikucG9wKCkhIDogcmF3TW9kZWw7XG4gIGNvbnN0IHRpbWVvdXQgPSBpbnB1dC50aW1lb3V0ID8/IHRpbWVvdXRNcztcbiAgY29uc3QgdXNlU3RydWN0dXJlZE91dHB1dCA9IGlucHV0Lmpzb25TY2hlbWEgJiYgaW5wdXQuanNvblNjaGVtYS5sZW5ndGggPiAwO1xuXG4gIC8vIC0tdG9vbHMgXCJcIiDroZwg66qo65OgIHRvb2wg7J2EIOq4sOuzuCDssKjri6guIHN0cnVjdHVyZWQgb3V0cHV0IOyTsOuptCBTdHJ1Y3R1cmVkT3V0cHV0IOunjCDtmZTsnbTtirjrpqzsiqTtirguXG4gIC8vIC0tdG9vbHMgXCJcIiDripQg67CY65Oc7IucIOuSpOyXkCDri6Trpbgg7ZSM656Y6re46rCAIOyZgOyVvCBDTEkg7YyM7Iux7J20IOu5iCDrrLjsnpDsl7TroZwg7J247IudXG4gIGNvbnN0IHRvb2xBcmdzID0gdXNlU3RydWN0dXJlZE91dHB1dFxuICAgID8gW1wiLS10b29sc1wiLCBcIlwiLCBcIi0tYWxsb3dlZC10b29sc1wiLCBcIlN0cnVjdHVyZWRPdXRwdXRcIl1cbiAgICA6IFtcIi0tdG9vbHNcIiwgXCJcIl07XG5cbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXG4gICAgXCItcFwiLFxuICAgIC4uLnRvb2xBcmdzLFxuICAgIFwiLS1kaXNhbGxvd2VkVG9vbHNcIixcbiAgICAvLyBDQ+yXkOyEnCDsnpDrj5kg7Zmc7ISx7ZmU65CY64qUIGRlZmVycmVkIOuPhOq1rC4g7Yag7YGwIOy1nOygge2ZlOulvOychO2VtCDssKjri6hcbiAgICAuLi4oW1wiTW9uaXRvclwiLCBcIlB1c2hOb3RpZmljYXRpb25cIiwgXCJSZW1vdGVUcmlnZ2VyXCJdIGFzIGNvbnN0KSxcbiAgICBcIi0tb3V0cHV0LWZvcm1hdFwiLFxuICAgIFwic3RyZWFtLWpzb25cIixcbiAgICBcIi0tdmVyYm9zZVwiLFxuICAgIC8vIC0tbWF4LXR1cm5zOiBzdHJ1Y3R1cmVkIG91dHB1dCDsnYAgdG9vbF91c2UgKyB0b29sX3Jlc3VsdCDroZwgMu2EtCDshozruYRcbiAgICBcIi0tbWF4LXR1cm5zXCIsXG4gICAgdXNlU3RydWN0dXJlZE91dHB1dCA/IFwiMlwiIDogXCIxXCIsXG4gICAgXCItLXBlcm1pc3Npb24tbW9kZVwiLFxuICAgIFwiYnlwYXNzUGVybWlzc2lvbnNcIixcbiAgICBcIi0tc2V0dGluZy1zb3VyY2VzXCIsXG4gICAgXCJwcm9qZWN0XCIsXG4gICAgXCItLW1vZGVsXCIsXG4gICAgbW9kZWwsXG4gICAgLy8gLS1zeXN0ZW0tcHJvbXB064qUIOuwmOuTnOyLnCDrqoXsi5ztlbTslbztlaguIOyYteyFmCDsg53rnrUg7IucIEND6rCAIGRlZmF1bHQgc3lzdGVtIHByb21wdOulvCDsnpDrj5nsnLzroZwg7KO87J6F7ZWoKDIzaylcbiAgICBcIi0tc3lzdGVtLXByb21wdFwiLFxuICAgIGlucHV0LnN5c3RlbSA/PyBcIlwiLFxuICAgIFwiLS10aGlua2luZ1wiLFxuICAgIFwiZGlzYWJsZWRcIixcbiAgICBcIi0tZWZmb3J0XCIsXG4gICAgaW5wdXQuZWZmb3J0ID8/IERFRkFVTFRfRUZGT1JULFxuICAgIFwiLS1uby1zZXNzaW9uLXBlcnNpc3RlbmNlXCIsXG4gICAgLy8g66qo65OgIHNraWxscyDruYTtmZzshLHtmZRcbiAgICBcIi0tZGlzYWJsZS1zbGFzaC1jb21tYW5kc1wiLFxuICBdO1xuICBpZiAodXNlU3RydWN0dXJlZE91dHB1dCkge1xuICAgIGFyZ3MucHVzaChcIi0tanNvbi1zY2hlbWFcIiwgaW5wdXQuanNvblNjaGVtYSEpO1xuICB9XG4gIGFyZ3MucHVzaChpbnB1dC5wcm9tcHQpO1xuXG4gIGNvbnN0IGVudjogTm9kZUpTLlByb2Nlc3NFbnYgPSB7XG4gICAgUEFUSDogcHJvY2Vzcy5lbnYuUEFUSCxcbiAgICBUTVBESVI6IHByb2Nlc3MuZW52LlRNUERJUixcbiAgICBDTEFVREVfQ09ERV9PQVVUSF9UT0tFTjogdG9rZW4sXG4gICAgLy8gQ0xBVURFX0NPTkZJR19ESVIg7ZmY6rK967OA7IiY66GcIOyjvOyehVxuICAgIENMQVVERV9DT05GSUdfRElSLFxuICAgIENMQVVERV9DT0RFX0RJU0FCTEVfQVVUT19NRU1PUlk6IFwiMVwiLFxuICAgIENMQVVERV9DT0RFX0RJU0FCTEVfQURBUFRJVkVfVEhJTktJTkc6IFwiMVwiLFxuICAgIENMQVVERV9DT0RFX0RJU0FCTEVfMU1fQ09OVEVYVDogXCIxXCIsXG4gICAgQ0xBVURFX0NPREVfRElTQUJMRV9DTEFVREVfTURTOiBcIjFcIixcbiAgICBDTEFVREVfQ09ERV9BVFRSSUJVVElPTl9IRUFERVI6IFwiMFwiLFxuICB9O1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZTxPbWl0PFF1ZXJ5T3V0cHV0LCBcImNvbnRlbnRcIiB8IFwiZmluaXNoUmVhc29uXCI+PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihcImNsYXVkZVwiLCBhcmdzLCB7XG4gICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwicGlwZVwiLCBcImlnbm9yZVwiXSxcbiAgICAgIGVudixcbiAgICAgIC8vIOqyqeumrCAo65GQIOuLqOqzhCk6XG4gICAgICAvLyAxLiBDTEFVREVfQ1dEIOKAlCBwcm9qZWN0IHNjb3BlIOqyqeumrCAoY3dkIOydmCAuY2xhdWRlL3NldHRpbmdzLmpzb24pXG4gICAgICAvLyAyLiBDTEFVREVfQ09ORklHX0RJUiDigJQgdXNlciBzY29wZSDqsqnrpqwgY3dkIOqyqeumrOunjOycvOuhoCDrtoDsobEuXG4gICAgICBjd2Q6IENMQVVERV9DV0QsXG4gICAgfSk7XG5cbiAgICBsZXQgYnVmZmVyID0gXCJcIjtcbiAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICBjaGlsZC5raWxsKCk7XG4gICAgICByZWplY3QobmV3IFRpbWVvdXRFcnJvcihgVGltZW91dCBhZnRlciAke3RpbWVvdXQgLyAxMDAwfXMgKHRva2VuOiAke21hc2tUb2tlbih0b2tlbil9KWApKTtcbiAgICB9LCB0aW1lb3V0KTtcblxuICAgIGNoaWxkLnN0ZG91dD8ub24oXCJkYXRhXCIsIChkOiBCdWZmZXIpID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBidWZmZXIgKz0gZC50b1N0cmluZygpO1xuICAgICAgY29uc3QgbGluZXMgPSBidWZmZXIuc3BsaXQoXCJcXG5cIik7XG4gICAgICBidWZmZXIgPSBsaW5lcy5wb3AoKSA/PyBcIlwiO1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGlmICghbGluZS50cmltKCkpIGNvbnRpbnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGogPSBKU09OLnBhcnNlKGxpbmUpO1xuICAgICAgICAgIGlmIChqLnR5cGUgPT09IFwicmVzdWx0XCIgJiYgIXNldHRsZWQpIHtcbiAgICAgICAgICAgIC8vIC0tanNvbi1zY2hlbWEg7IKs7JqpIOyLnCBzdHJ1Y3R1cmVkX291dHB1dCDsl5Ag7YyM7Iux65CcIOqwneyytOqwgCDsmKjri6Qg4oaSIOyasOyEoCDsgqzsmqlcbiAgICAgICAgICAgIGxldCB0ZXh0OiBzdHJpbmc7XG4gICAgICAgICAgICBpZiAoai5zdHJ1Y3R1cmVkX291dHB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHRleHQgPSBKU09OLnN0cmluZ2lmeShqLnN0cnVjdHVyZWRfb3V0cHV0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRleHQgPSAoai5yZXN1bHQgPz8gXCJcIilcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXmBgYCg/Ompzb24pP1xccypcXG4/L2ksIFwiXCIpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcbj9gYGBcXHMqJC9pLCBcIlwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRleHQuc3RhcnRzV2l0aChcIllvdSd2ZSBoaXRcIikpIHtcbiAgICAgICAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgUXVvdGFFcnJvcihgUXVvdGEgZXhoYXVzdGVkICh0b2tlbjogJHttYXNrVG9rZW4odG9rZW4pfSlgKSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdSA9IGoudXNhZ2UgPz8ge307XG4gICAgICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgICAgdXNhZ2U6IHtcbiAgICAgICAgICAgICAgICBpbnB1dF90b2tlbnM6IHUuaW5wdXRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgICAgICAgb3V0cHV0X3Rva2VuczogdS5vdXRwdXRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgICAgICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zOiB1LmNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VucyA/PyAwLFxuICAgICAgICAgICAgICAgIGNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zOiB1LmNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uTXM6IGouZHVyYXRpb25fbXMgPz8gMCxcbiAgICAgICAgICAgICAgY29zdFVzZDogai50b3RhbF9jb3N0X3VzZCA/PyAwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHt9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjaGlsZC5vbihcImNsb3NlXCIsICgpID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICByZWplY3QobmV3IFByb2Nlc3NFcnJvcihgQ0xJIHByb2Nlc3MgY2xvc2VkIHdpdGhvdXQgcmVzdWx0ICh0b2tlbjogJHttYXNrVG9rZW4odG9rZW4pfSlgKSk7XG4gICAgfSk7XG5cbiAgICBjaGlsZC5vbihcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICByZWplY3QobmV3IFByb2Nlc3NFcnJvcihgQ0xJIHByb2Nlc3MgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9ICh0b2tlbjogJHttYXNrVG9rZW4odG9rZW4pfSlgKSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3QgUWdyaWREaXNwYXRjaGVyID0gbmV3IFFncmlkRGlzcGF0Y2hlckNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtDQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFFBQVEsQ0FBQztBQUVuQyxNQUFNLGdCQUFnQjtBQUN0QixNQUFNLHFCQUFxQjtBQUMzQixNQUFNLGlCQUFpQjtBQUl2QixNQUFNLGFBQWE7QUFHbkIsTUFBTSxvQkFBb0I7QUFHMUIsTUFBTSx3QkFBd0I7Q0FDNUIsdUJBQXVCO0NBQ3ZCLHdCQUF3QjtDQUN4QixtQkFBbUI7Q0FDcEI7QUFHRCxNQUFNLG9CQUFvQjtBQUUxQixJQUFhLHVCQUFiLE1BQWtDO0NBQ2hDLHlCQUFTLElBQUksS0FBMkI7Q0FHeEMsZ0NBQWdCLElBQUksS0FBcUI7Q0FDekMsVUFBVTtDQUdWLGFBQXFDO0NBQ3JDLG1CQUE0QztDQUU1QyxjQUFjO0VBQ1osTUFBTSxlQUFlLEtBQUssVUFBVSx1QkFBdUIsTUFBTSxFQUFFO0FBRW5FLFlBQVUsR0FBRyxXQUFXLFdBQVcsRUFBRSxXQUFXLE1BQU0sQ0FBQztBQUN2RCxnQkFBYyxHQUFHLFdBQVcseUJBQXlCLGFBQWE7QUFFbEUsWUFBVSxtQkFBbUIsRUFBRSxXQUFXLE1BQU0sQ0FBQztBQUNqRCxnQkFBYyxHQUFHLGtCQUFrQixnQkFBZ0IsS0FBSztBQUN4RCxnQkFBYyxHQUFHLGtCQUFrQixpQkFBaUIsYUFBYTs7Q0FHbkUsUUFBUSxNQUFzQjtBQUM1QixTQUFPLEtBQUssY0FBYyxJQUFJLEtBQUssSUFBSTs7Q0FJekMsWUFBWSxJQUFZLEtBQXlCO0FBQy9DLE9BQUssT0FBTyxJQUFJLElBQUksSUFBSTs7Q0FHMUIsWUFBWSxJQUFrQjtBQUM1QixPQUFLLE9BQU8sT0FBTyxHQUFHOztDQUd4QixhQUFhLE1BQTRCO0FBQ3ZDLE9BQUssU0FBUyxJQUFJLElBQUksS0FBSyxLQUFLLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7O0NBR25ELFdBQXlCO0FBQ3ZCLFNBQU8sQ0FBQyxHQUFHLEtBQUssT0FBTyxRQUFRLENBQUMsQ0FBQyxLQUFLLE9BQU87R0FDM0MsT0FBTyxVQUFVLGVBQWUsRUFBRSxZQUFZLENBQUM7R0FDL0MsTUFBTSxFQUFFO0dBQ1IsVUFBVSxFQUFFO0dBQ1osVUFBVSxLQUFLLFFBQVEsRUFBRSxLQUFLO0dBQy9CLEVBQUU7O0NBR0wsWUFBWSxXQUFXLGFBQWtDO0VBQ3ZELE1BQU0sT0FBTyxDQUFDLEdBQUcsS0FBSyxPQUFPLFFBQVEsQ0FBQyxDQUFDLFFBQVEsTUFBTSxFQUFFLGFBQWEsU0FBUztBQUM3RSxNQUFJLEtBQUssV0FBVyxFQUFHLFFBQU87RUFFOUIsTUFBTSxXQUFXLEtBQUssSUFBSSxHQUFHLEtBQUssS0FBSyxNQUFNLEtBQUssUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0VBQ25FLE1BQU0sT0FBTyxLQUFLLFFBQVEsTUFBTSxLQUFLLFFBQVEsRUFBRSxLQUFLLEtBQUssU0FBUztFQUNsRSxNQUFNLFNBQVMsS0FBSyxLQUFLLFVBQVUsS0FBSztBQUN4QyxPQUFLO0FBQ0wsU0FBTzs7Q0FHVCxNQUFNLE1BQU0sT0FBbUIsV0FBMEM7QUFDdkUsTUFBSSxNQUFNLE9BQU8sVUFBVSxNQUFNLFdBQy9CLE9BQU0sSUFBSSxhQUFhLCtDQUErQztFQUd4RSxNQUFNLGVBQWUsTUFBTSxPQUFPLFNBQzlCLG9CQUFvQixNQUFNLE1BQU0sR0FDaEMsTUFBTSxhQUNILEtBQUssTUFBTSxNQUFNLFdBQVcsR0FDN0I7QUFHTixNQUFJLE1BQU0sT0FBTyxTQUFTLElBQUksRUFBRTtHQUM5QixNQUFNLENBQUMsVUFBVSxTQUFTLE1BQU0sTUFBTSxNQUFNLEtBQUssRUFBRTtBQUNuRCxVQUFPLE9BQU8sZ0JBQWdCO0FBQzlCLE9BQUksYUFBYSxVQUFVO0FBQ3pCLFFBQUksQ0FBQyxLQUFLLGlCQUFrQixPQUFNLElBQUksV0FBVyxvQ0FBb0M7SUFDckYsTUFBTSxXQUFXLGtCQUFrQixNQUFNO0lBQ3pDLE1BQU0sU0FBUyxNQUFNLEtBQUssaUJBQWlCLFNBQVM7S0FDM0M7S0FDUCxjQUFjLE1BQU07S0FDcEIsY0FBYyxlQUNULFVBQVUsYUFBZ0QsR0FDM0Q7S0FDSixRQUFRLE1BQU07S0FDZCxXQUFXLE1BQU07S0FDakIsa0JBQWtCLE1BQU07S0FDeEIsYUFBYSxNQUFNO0tBQ25CLFdBQVcsU0FBUztLQUNwQixhQUFhLFNBQVM7S0FDdEIsT0FBTyxTQUFTO0tBQ2hCLFlBQVksU0FBUztLQUN0QixDQUFDO0lBRUYsTUFBTSxjQUFjLGlCQUFpQixPQUFPLGFBQWEsU0FBUztBQUNsRSxXQUFPLHVCQUNMO0tBQ0UsTUFBTSxPQUFPO0tBQ2IsV0FBVyxPQUFPO0tBQ2xCLE9BQU8sT0FBTztLQUNkLE9BQU87TUFDTCxjQUFjLE9BQU8sTUFBTTtNQUMzQixlQUFlLE9BQU8sTUFBTTtNQUM1Qiw2QkFBNkI7TUFDN0IseUJBQXlCLE9BQU8sTUFBTTtNQUN2QztLQUNELFlBQVksT0FBTztLQUNuQixTQUFTLGlCQUFpQixPQUFPLE9BQU87TUFDdEMsYUFBYSxPQUFPLE1BQU07TUFDMUIsY0FBYyxPQUFPLE1BQU07TUFDM0IsbUJBQW1CLE9BQU8sTUFBTTtNQUNqQyxDQUFDO0tBQ0gsRUFDRCxNQUFNLE9BQ04sWUFDRDs7O0VBSUwsTUFBTSxpQkFDSixnQkFBZ0IsTUFBTSxPQUFPLFNBQ3pCO0dBQUUsR0FBRztHQUFPLFlBQVksS0FBSyxVQUFVLGFBQWE7R0FBRSxHQUN0RDtFQUdOLE1BQU0sZUFBZSxLQUFLLGFBQWE7QUFDdkMsTUFBSSxDQUFDLGFBQWMsT0FBTSxJQUFJLFdBQVcsc0JBQXNCO0FBRzlELE9BQUssY0FBYyxJQUFJLGFBQWEsTUFBTSxLQUFLLFFBQVEsYUFBYSxLQUFLLEdBQUcsRUFBRTtFQUU5RSxJQUFJLFFBQVEsZUFBZSxhQUFhLFlBQVk7RUFFcEQsTUFBTSxZQUFZLGFBQWEsYUFBYSxZQUFZO0FBQ3hELE1BQ0UsYUFDQSxZQUFZLEtBQUssS0FBSyxHQUFHLHFCQUN6QixnQkFBZ0IsYUFBYSxZQUFZLENBRXpDLEtBQUk7R0FDRixNQUFNLEVBQUUsZUFBZSxNQUFNLE9BQU87QUFDcEMsV0FBUSxNQUFNLFdBQVcsYUFBYSxhQUFhO1dBQzVDLEdBQUc7QUFDVixVQUFPLEtBQUssc0JBQXNCLGFBQWEsS0FBSyxJQUFLLEVBQVksVUFBVTs7QUFJbkYsU0FBTyxLQUFLLEtBQUssYUFBYSxLQUFLLFdBQVcsTUFBTSxTQUFTLGNBQWMsR0FBRztBQUc5RSxTQUFPLHVCQUNMO0dBQUUsR0FGVyxNQUFNLGNBQWMsZ0JBQWdCLE9BQU8sYUFBYSxtQkFBbUI7R0FFM0UsV0FBVyxhQUFhO0dBQU0sT0FBTyxNQUFNLFNBQVM7R0FBZSxFQUNoRixNQUFNLE1BQ1A7O0NBR0gsTUFBTSxZQUNKLE9BQ0EsSUFPZTtBQUNmLE1BQUksQ0FBQyxNQUFNLE9BQU8sV0FBVyxVQUFVLEVBQUU7R0FDdkMsTUFBTSxTQUFTLE1BQU0sS0FBSyxNQUFNLE1BQU07QUFDdEMsTUFBRyxXQUFXLE9BQU87QUFDckI7O0VBR0YsTUFBTSxHQUFHLFNBQVMsTUFBTSxNQUFNLE1BQU0sS0FBSyxFQUFFO0FBQzNDLE1BQUksQ0FBQyxNQUFPLE9BQU0sSUFBSSxhQUFhLGdCQUFnQjtBQUNuRCxNQUFJLENBQUMsS0FBSyxpQkFBa0IsT0FBTSxJQUFJLFdBQVcsb0NBQW9DO0VBRXJGLE1BQU0sZUFBZSxNQUFNLE9BQU8sU0FDOUIsb0JBQW9CLE1BQU0sTUFBTSxHQUNoQyxNQUFNLGFBQ0gsS0FBSyxNQUFNLE1BQU0sV0FBVyxHQUM3QjtFQUVOLE1BQU0sV0FBVyxrQkFBa0IsTUFBTTtBQUN6QyxRQUFNLEtBQUssaUJBQWlCLGVBQzFCO0dBQ0U7R0FDQSxjQUFjLE1BQU07R0FDcEIsY0FBYyxlQUNULFVBQVUsYUFBZ0QsR0FDM0Q7R0FDSixRQUFRLE1BQU07R0FDZCxXQUFXLE1BQU07R0FDakIsa0JBQWtCLE1BQU07R0FDeEIsYUFBYSxNQUFNO0dBQ25CLFdBQVcsU0FBUztHQUNwQixhQUFhLFNBQVM7R0FDdEIsT0FBTyxTQUFTO0dBQ2hCLFlBQVksU0FBUztHQUN0QixFQUNEO0dBQ0UsU0FBUyxHQUFHO0dBQ1osWUFBWSxHQUFHO0dBQ2YsVUFBVSxHQUFHO0dBQ2IsYUFBYSxlQUFlO0lBQzFCLE1BQU0sY0FBYyxpQkFBaUIsV0FBVyxhQUFhLFNBQVM7SUFDdEUsTUFBTSxVQUFVLHVCQUNkO0tBQ0UsTUFBTSxXQUFXO0tBQ2pCLFdBQVcsV0FBVztLQUN0QixPQUFPLFdBQVc7S0FDbEIsT0FBTztNQUNMLGNBQWMsV0FBVyxNQUFNO01BQy9CLGVBQWUsV0FBVyxNQUFNO01BQ2hDLDZCQUE2QjtNQUM3Qix5QkFBeUIsV0FBVyxNQUFNO01BQzNDO0tBQ0QsWUFBWSxXQUFXO0tBQ3ZCLFNBQVMsaUJBQWlCLFdBQVcsT0FBTztNQUMxQyxhQUFhLFdBQVcsTUFBTTtNQUM5QixjQUFjLFdBQVcsTUFBTTtNQUMvQixtQkFBbUIsV0FBVyxNQUFNO01BQ3JDLENBQUM7S0FDSCxFQUNELE1BQU0sT0FDTixZQUNEO0FBQ0QsT0FBRyxXQUFXLFFBQVE7O0dBRXhCLFNBQVMsR0FBRztHQUNiLENBQ0Y7OztBQUlMLGVBQWUsY0FDYixPQUNBLE9BQ0EsV0FDd0Q7Q0FDeEQsTUFBTSxXQUFXLE1BQU0sU0FBUztDQUNoQyxNQUFNLFFBQVEsU0FBUyxTQUFTLElBQUksR0FBRyxTQUFTLE1BQU0sSUFBSSxDQUFDLEtBQUssR0FBSTtDQUNwRSxNQUFNLFVBQVUsTUFBTSxXQUFXO0NBQ2pDLE1BQU0sc0JBQXNCLE1BQU0sY0FBYyxNQUFNLFdBQVcsU0FBUztDQVExRSxNQUFNLE9BQWlCO0VBQ3JCO0VBQ0EsR0FOZSxzQkFDYjtHQUFDO0dBQVc7R0FBSTtHQUFtQjtHQUFtQixHQUN0RCxDQUFDLFdBQVcsR0FBRztFQUtqQjtFQUVBLEdBQUk7R0FBQztHQUFXO0dBQW9CO0dBQWdCO0VBQ3BEO0VBQ0E7RUFDQTtFQUVBO0VBQ0Esc0JBQXNCLE1BQU07RUFDNUI7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBRUE7RUFDQSxNQUFNLFVBQVU7RUFDaEI7RUFDQTtFQUNBO0VBQ0EsTUFBTSxVQUFVO0VBQ2hCO0VBRUE7RUFDRDtBQUNELEtBQUksb0JBQ0YsTUFBSyxLQUFLLGlCQUFpQixNQUFNLFdBQVk7QUFFL0MsTUFBSyxLQUFLLE1BQU0sT0FBTztDQUV2QixNQUFNLE1BQXlCO0VBQzdCLE1BQU0sUUFBUSxJQUFJO0VBQ2xCLFFBQVEsUUFBUSxJQUFJO0VBQ3BCLHlCQUF5QjtFQUV6QjtFQUNBLGlDQUFpQztFQUNqQyx1Q0FBdUM7RUFDdkMsZ0NBQWdDO0VBQ2hDLGdDQUFnQztFQUNoQyxnQ0FBZ0M7RUFDakM7QUFFRCxRQUFPLElBQUksU0FBd0QsU0FBUyxXQUFXO0VBQ3JGLE1BQU0sUUFBUSxNQUFNLFVBQVUsTUFBTTtHQUNsQyxPQUFPO0lBQUM7SUFBVTtJQUFRO0lBQVM7R0FDbkM7R0FJQSxLQUFLO0dBQ04sQ0FBQztFQUVGLElBQUksU0FBUztFQUNiLElBQUksVUFBVTtFQUNkLE1BQU0sUUFBUSxpQkFBaUI7QUFDN0IsT0FBSSxRQUFTO0FBQ2IsYUFBVTtBQUNWLFNBQU0sTUFBTTtBQUNaLFVBQU8sSUFBSSxhQUFhLGlCQUFpQixVQUFVLElBQUssWUFBWSxVQUFVLE1BQU0sQ0FBQyxHQUFHLENBQUM7S0FDeEYsUUFBUTtBQUVYLFFBQU0sUUFBUSxHQUFHLFNBQVMsTUFBYztBQUN0QyxPQUFJLFFBQVM7QUFDYixhQUFVLEVBQUUsVUFBVTtHQUN0QixNQUFNLFFBQVEsT0FBTyxNQUFNLEtBQUs7QUFDaEMsWUFBUyxNQUFNLEtBQUssSUFBSTtBQUN4QixRQUFLLE1BQU0sUUFBUSxPQUFPO0FBQ3hCLFFBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBRTtBQUNsQixRQUFJO0tBQ0YsTUFBTSxJQUFJLEtBQUssTUFBTSxLQUFLO0FBQzFCLFNBQUksRUFBRSxTQUFTLFlBQVksQ0FBQyxTQUFTO01BRW5DLElBQUk7QUFDSixVQUFJLEVBQUUsc0JBQXNCLE9BQzFCLFFBQU8sS0FBSyxVQUFVLEVBQUUsa0JBQWtCO1VBRTFDLFNBQVEsRUFBRSxVQUFVLElBQ2pCLFFBQVEsd0JBQXdCLEdBQUcsQ0FDbkMsUUFBUSxlQUFlLEdBQUc7QUFHL0IsVUFBSSxLQUFLLFdBQVcsYUFBYSxFQUFFO0FBQ2pDLGlCQUFVO0FBQ1Ysb0JBQWEsTUFBTTtBQUNuQixjQUFPLElBQUksV0FBVywyQkFBMkIsVUFBVSxNQUFNLENBQUMsR0FBRyxDQUFDO0FBQ3RFOztNQUdGLE1BQU0sSUFBSSxFQUFFLFNBQVMsRUFBRTtBQUN2QixnQkFBVTtBQUNWLG1CQUFhLE1BQU07QUFDbkIsY0FBUTtPQUNOO09BQ0EsT0FBTztRQUNMLGNBQWMsRUFBRSxnQkFBZ0I7UUFDaEMsZUFBZSxFQUFFLGlCQUFpQjtRQUNsQyw2QkFBNkIsRUFBRSwrQkFBK0I7UUFDOUQseUJBQXlCLEVBQUUsMkJBQTJCO1FBQ3ZEO09BQ0QsWUFBWSxFQUFFLGVBQWU7T0FDN0IsU0FBUyxFQUFFLGtCQUFrQjtPQUM5QixDQUFDOztZQUVFOztJQUVWO0FBRUYsUUFBTSxHQUFHLGVBQWU7QUFDdEIsT0FBSSxRQUFTO0FBQ2IsYUFBVTtBQUNWLGdCQUFhLE1BQU07QUFDbkIsVUFBTyxJQUFJLGFBQWEsNkNBQTZDLFVBQVUsTUFBTSxDQUFDLEdBQUcsQ0FBQztJQUMxRjtBQUVGLFFBQU0sR0FBRyxVQUFVLFFBQVE7QUFDekIsT0FBSSxRQUFTO0FBQ2IsYUFBVTtBQUNWLGdCQUFhLE1BQU07QUFDbkIsVUFBTyxJQUFJLGFBQWEsc0JBQXNCLElBQUksUUFBUSxXQUFXLFVBQVUsTUFBTSxDQUFDLEdBQUcsQ0FBQztJQUMxRjtHQUNGOztBQUdKLE1BQWEsa0JBQWtCLElBQUksc0JBQXNCIn0=
@@ -59,7 +59,10 @@ var QgridFrameClass = class extends BaseFrameClass {
59
59
  const lifecycle = await afterQuery(requestLogId, stepIndex, args, result);
60
60
  return {
61
61
  ...result,
62
- runContext: lifecycle.runContext
62
+ runContext: {
63
+ ...lifecycle.runContext,
64
+ threadCoord: result.runContext?.threadCoord
65
+ }
63
66
  };
64
67
  } catch (e) {
65
68
  await finishRunWithError(requestLogId, e.message, args);
@@ -148,9 +151,13 @@ var QgridFrameClass = class extends BaseFrameClass {
148
151
  streamError = e;
149
152
  }
150
153
  if (streamResult) {
151
- let runContext;
154
+ const threadCoord = streamResult.runContext?.threadCoord;
155
+ let runContext = threadCoord !== void 0 ? { threadCoord } : void 0;
152
156
  if (runInfo) try {
153
- runContext = (await afterQuery(runInfo.requestLogId, runInfo.stepIndex, args, streamResult)).runContext;
157
+ runContext = {
158
+ ...(await afterQuery(runInfo.requestLogId, runInfo.stepIndex, args, streamResult)).runContext,
159
+ threadCoord
160
+ };
154
161
  } catch (e) {
155
162
  logger.error(`stream afterQuery failed: ${e.message}`);
156
163
  }
@@ -567,4 +574,4 @@ function convertAnthropicUsage(raw) {
567
574
  //#endregion
568
575
  export { QgridFrame };
569
576
 
570
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZnJhbWUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmZyYW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcnlwdG8gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyBhcGksIEJhc2VGcmFtZUNsYXNzLCBTb25hbXUsIHN0cmVhbSB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGdldENhY2hlTWFuYWdlclJlZiB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHtcbiAgZ2V0QWNjZXNzVG9rZW4sXG4gIGdldEV4cGlyZXNBdCxcbiAgZ2V0UmVmcmVzaFRva2VuLFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9jcmVkZW50aWFsc1wiO1xuaW1wb3J0IHsgTUlDUk9fVVNELCBSZXF1ZXN0TG9nTW9kZWwgfSBmcm9tIFwiLi4vcmVxdWVzdC1sb2cvcmVxdWVzdC1sb2cubW9kZWxcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5TdWJzZXRBIH0gZnJvbSBcIi4uL3NvbmFtdS5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IFRva2VuTW9kZWwgfSBmcm9tIFwiLi4vdG9rZW4vdG9rZW4ubW9kZWxcIjtcbmltcG9ydCB7IFRva2VuQ3JlZGVudGlhbHMgfSBmcm9tIFwiLi4vdG9rZW4vdG9rZW4udHlwZXNcIjtcbmltcG9ydCB7XG4gIHR5cGUgQW50aHJvcGljVXNhZ2VSYXcsXG4gIGJ1aWxkQXV0aFVybCxcbiAgZXhjaGFuZ2VDb2RlRm9yVG9rZW5zLFxuICBmZXRjaFVzYWdlLFxuICBnZW5lcmF0ZVBLQ0UsXG4gIHJlZnJlc2hBY2Nlc3NUb2tlbixcbn0gZnJvbSBcIi4vb2F1dGhcIjtcbmltcG9ydCB7XG4gIGFmdGVyUXVlcnksXG4gIGJlZm9yZVF1ZXJ5LFxuICBmaW5pc2hSdW5BYm9ydGVkLFxuICBmaW5pc2hSdW5XaXRoRXJyb3IsXG59IGZyb20gXCIuL3FncmlkLXJ1bi1saWZlY3ljbGVcIjtcbmltcG9ydCB7IFFncmlkRGlzcGF0Y2hlciB9IGZyb20gXCIuL3FncmlkLmRpc3BhdGNoZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgUXVlcnlJbnB1dCxcbiAgdHlwZSBBcHBlbmRTdGVwSW5wdXQsXG4gIHR5cGUgQ3JlYXRlUnVuSW5wdXQsXG4gIHR5cGUgRmluaXNoUnVuSW5wdXQsXG4gIHR5cGUgSGVhbHRoUmVzcG9uc2UsXG4gIHR5cGUgT0F1dGhTdGFydFJlc3VsdCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbiAgU3RyZWFtRXZlbnRzLFxuICB0eXBlIFRva2VuU3RhdHMsXG4gIHR5cGUgVXNhZ2VSZXNwb25zZSxcbn0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgcGVuZGluZ1N0cmVhbXMgPSBuZXcgTWFwPHN0cmluZywgUXVlcnlJbnB1dD4oKTtcblxudHlwZSBQZW5kaW5nT0F1dGggPSB7IGNvZGVWZXJpZmllcjogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHJlZGlyZWN0VXJpOiBzdHJpbmcgfTtcbmNvbnN0IE9BVVRIX1NUQVRFX1BSRUZJWCA9IFwib2F1dGg6c3RhdGU6XCI7XG5jb25zdCBPQVVUSF9TVEFURV9UVEwgPSBcIjVtXCI7XG5cbmFzeW5jIGZ1bmN0aW9uIHNldE9BdXRoU3RhdGUoc3RhdGU6IHN0cmluZywgZGF0YTogUGVuZGluZ09BdXRoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNhY2hlID0gZ2V0Q2FjaGVNYW5hZ2VyUmVmKCk7XG4gIGlmICghY2FjaGUpIHRocm93IG5ldyBFcnJvcihcIkNhY2hlTWFuYWdlciBub3QgaW5pdGlhbGl6ZWRcIik7XG4gIGF3YWl0IGNhY2hlLnNldCh7XG4gICAga2V5OiBgJHtPQVVUSF9TVEFURV9QUkVGSVh9JHtzdGF0ZX1gLFxuICAgIHZhbHVlOiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICB0dGw6IE9BVVRIX1NUQVRFX1RUTCxcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE9BdXRoU3RhdGUoc3RhdGU6IHN0cmluZyk6IFByb21pc2U8UGVuZGluZ09BdXRoIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNhY2hlID0gZ2V0Q2FjaGVNYW5hZ2VyUmVmKCk7XG4gIGlmICghY2FjaGUpIHRocm93IG5ldyBFcnJvcihcIkNhY2hlTWFuYWdlciBub3QgaW5pdGlhbGl6ZWRcIik7XG4gIGNvbnN0IHJhdyA9IGF3YWl0IGNhY2hlLmdldDxzdHJpbmc+KHsga2V5OiBgJHtPQVVUSF9TVEFURV9QUkVGSVh9JHtzdGF0ZX1gIH0pO1xuICBpZiAoIXJhdykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSBhcyBQZW5kaW5nT0F1dGg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU9BdXRoU3RhdGUoc3RhdGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjYWNoZSA9IGdldENhY2hlTWFuYWdlclJlZigpO1xuICBpZiAoIWNhY2hlKSByZXR1cm47XG4gIGF3YWl0IGNhY2hlLmRlbGV0ZSh7IGtleTogYCR7T0FVVEhfU1RBVEVfUFJFRklYfSR7c3RhdGV9YCB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0T0F1dGhSZWRpcmVjdFVyaSgpOiBzdHJpbmcge1xuICBjb25zdCBwdWJsaWNCYXNlVXJsID0gcHJvY2Vzcy5lbnYuUUdSSURfUFVCTElDX0JBU0VfVVJMPy5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpO1xuICBpZiAocHVibGljQmFzZVVybCkgcmV0dXJuIGAke3B1YmxpY0Jhc2VVcmx9L2NhbGxiYWNrYDtcblxuICBjb25zdCBzZXJ2ZXJQb3J0ID0gcHJvY2Vzcy5lbnYuUE9SVCA/PyBcIjQ0OTAwXCI7XG4gIHJldHVybiBgaHR0cDovL2xvY2FsaG9zdDoke3NlcnZlclBvcnR9L2NhbGxiYWNrYDtcbn1cblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCJdKTtcbmNvbnN0IG9hdXRoTG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwib2F1dGhcIl0pO1xuXG5jbGFzcyBRZ3JpZEZyYW1lQ2xhc3MgZXh0ZW5kcyBCYXNlRnJhbWVDbGFzcyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiUWdyaWRcIik7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgcXVlcnkoYXJnczogUXVlcnlJbnB1dCk6IFByb21pc2U8UXVlcnlPdXRwdXQ+IHtcbiAgICBjb25zdCBlZmZlY3RpdmVMb2dNb2RlID0gYXJncy5sb2dNb2RlID8/IChhcmdzLmlzU3RlcCA/IFwicnVuXCIgOiBcImF1dG9cIik7XG5cbiAgICAvLyBsb2dNb2RlOiBcInJ1blwiIOKGkiDshJzrsoTqsIAgbGlmZWN5Y2xlIOq0gOumrFxuICAgIGlmIChlZmZlY3RpdmVMb2dNb2RlID09PSBcInJ1blwiKSB7XG4gICAgICBjb25zdCB7IHJlcXVlc3RMb2dJZCwgc3RlcEluZGV4IH0gPSBhd2FpdCBiZWZvcmVRdWVyeShhcmdzKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFFncmlkRGlzcGF0Y2hlci5xdWVyeShhcmdzLCBhcmdzLnRpbWVvdXQpO1xuICAgICAgICBjb25zdCBsaWZlY3ljbGUgPSBhd2FpdCBhZnRlclF1ZXJ5KHJlcXVlc3RMb2dJZCwgc3RlcEluZGV4LCBhcmdzLCByZXN1bHQpO1xuICAgICAgICByZXR1cm4geyAuLi5yZXN1bHQsIHJ1bkNvbnRleHQ6IGxpZmVjeWNsZS5ydW5Db250ZXh0IH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGF3YWl0IGZpbmlzaFJ1bldpdGhFcnJvcihyZXF1ZXN0TG9nSWQsIChlIGFzIEVycm9yKS5tZXNzYWdlLCBhcmdzKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBsb2dNb2RlOiBcImF1dG9cIiAo6riw7KG0IG5vbi1zdGVwIOqyveuhnCkg65iQ64qUIFwibm9uZVwiXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUWdyaWREaXNwYXRjaGVyLnF1ZXJ5KGFyZ3MsIGFyZ3MudGltZW91dCk7XG5cbiAgICBpZiAoZWZmZWN0aXZlTG9nTW9kZSA9PT0gXCJhdXRvXCIpIHtcbiAgICAgIHRoaXMuc2F2ZUF1dG9SZXF1ZXN0TG9nKGFyZ3MsIHJlc3VsdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIGxvZ01vZGUgXCJhdXRvXCIg64uo7J28IOyalOyyrSDroZzquYU6IHJ1biBsaWZlY3ljbGUoc3RlcCDrtoTtlbQpIOyXhuydtCByZXF1ZXN0X2xvZyAx6rG066eMIOuCqOq4tOuLpC5cbiAgLy8gcXVlcnnsmYAgcXVlcnlTdHJlYW0g7JaR7Kq97JeQ7IScIOyCrOyaqS5cbiAgcHJpdmF0ZSBzYXZlQXV0b1JlcXVlc3RMb2coYXJnczogUXVlcnlJbnB1dCwgcmVzdWx0OiBRdWVyeU91dHB1dCk6IHZvaWQge1xuICAgIGNvbnN0IHRvb2xDYWxsQ291bnQgPSByZXN1bHQuY29udGVudC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gXCJ0b29sLWNhbGxcIikubGVuZ3RoO1xuICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IHJlc3VsdC5jb250ZW50XG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnR5cGUgPT09IFwidGV4dFwiKVxuICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS50ZXh0KVxuICAgICAgLmpvaW4oXCJcXG5cIik7XG5cbiAgICBSZXF1ZXN0TG9nTW9kZWwuc2F2ZShbXG4gICAgICB7XG4gICAgICAgIHRva2VuX25hbWU6IHJlc3VsdC50b2tlbk5hbWUsXG4gICAgICAgIHByb2plY3RfbmFtZTogYXJncy5wcm9qZWN0TmFtZT8ubGVuZ3RoID8gYXJncy5wcm9qZWN0TmFtZSA6IG51bGwsXG4gICAgICAgIG1vZGVsX25hbWU6IHJlc3VsdC5tb2RlbCA/PyBudWxsLFxuICAgICAgICB1c2VyX3Byb21wdDogYXJncy5wcm9tcHQsXG4gICAgICAgIHN5c3RlbV9wcm9tcHQ6IGFyZ3Muc3lzdGVtID8/IG51bGwsXG4gICAgICAgIHJlc3BvbnNlOiByZXNwb25zZVRleHQsXG4gICAgICAgIGlucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmlucHV0X3Rva2VucyxcbiAgICAgICAgb3V0cHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLm91dHB1dF90b2tlbnMsXG4gICAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVfcmVhZF9pbnB1dF90b2tlbnMsXG4gICAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VucyxcbiAgICAgICAgZHVyYXRpb25fbXM6IHJlc3VsdC5kdXJhdGlvbk1zLFxuICAgICAgICBjb3N0X3VzZDogcmVzdWx0LmNvc3RVc2QgIT09IG51bGwgPyBNYXRoLnJvdW5kKHJlc3VsdC5jb3N0VXNkICogTUlDUk9fVVNEKSA6IG51bGwsXG4gICAgICAgIGVmZm9ydDogYXJncy5lZmZvcnQgPz8gbnVsbCxcbiAgICAgICAgLy8gbWFsZm9ybWVkIGhpc3RvcnnqsIAg7JmA64+EIOyEseqzte2VnCDthLQo7Yq57Z6IIHN0cmVhbSBzc2UuZW5kKCkp7J2EIOq5qOyngCDslYrrj4TroZ0g67Cp7Ja0LlxuICAgICAgICBoaXN0b3J5OiAoKCk6IHsgdHlwZTogc3RyaW5nIH1bXSB8IG51bGwgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXJncy5oaXN0b3J5ID8gSlNPTi5wYXJzZShhcmdzLmhpc3RvcnkpIDogbnVsbDtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKSxcbiAgICAgICAgc3RhdHVzOiBcInN1Y2NlZWRlZFwiLFxuICAgICAgICB0b29sX2NhbGxfY291bnQ6IHRvb2xDYWxsQ291bnQsXG4gICAgICB9LFxuICAgIF0pLmNhdGNoKChlKSA9PiBsb2dnZXIuZXJyb3IoYHJlcXVlc3RMb2cgc2F2ZSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCkpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHByZXBhcmVTdHJlYW0oYXJnczogUXVlcnlJbnB1dCk6IFByb21pc2U8eyBzdHJlYW1JZDogc3RyaW5nIH0+IHtcbiAgICBjb25zdCBzdHJlYW1JZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgcGVuZGluZ1N0cmVhbXMuc2V0KHN0cmVhbUlkLCBhcmdzKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHBlbmRpbmdTdHJlYW1zLmRlbGV0ZShzdHJlYW1JZCksIDMwXzAwMCk7XG4gICAgcmV0dXJuIHsgc3RyZWFtSWQgfTtcbiAgfVxuXG4gIEBzdHJlYW0oeyB0eXBlOiBcInNzZVwiLCBldmVudHM6IFN0cmVhbUV2ZW50cyB9KVxuICBhc3luYyBxdWVyeVN0cmVhbShzdHJlYW1JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYXJncyA9IHBlbmRpbmdTdHJlYW1zLmdldChzdHJlYW1JZCk7XG4gICAgcGVuZGluZ1N0cmVhbXMuZGVsZXRlKHN0cmVhbUlkKTtcbiAgICBpZiAoIWFyZ3MpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgb3IgZXhwaXJlZCBzdHJlYW1JZFwiKTtcblxuICAgIGNvbnN0IGVmZmVjdGl2ZUxvZ01vZGUgPSBhcmdzLmxvZ01vZGUgPz8gKGFyZ3MuaXNTdGVwID8gXCJydW5cIiA6IFwiYXV0b1wiKTtcbiAgICBjb25zdCBzaG91bGRMb2cgPSBlZmZlY3RpdmVMb2dNb2RlID09PSBcInJ1blwiO1xuXG4gICAgbGV0IHJ1bkluZm86IHsgcmVxdWVzdExvZ0lkOiBudW1iZXI7IHN0ZXBJbmRleDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgaWYgKHNob3VsZExvZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcnVuSW5mbyA9IGF3YWl0IGJlZm9yZVF1ZXJ5KGFyZ3MpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYHN0cmVhbSBiZWZvcmVRdWVyeSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY3R4ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICBjb25zdCBzc2UgPSBjdHguY3JlYXRlU1NFKFN0cmVhbUV2ZW50cyk7XG4gICAgbGV0IHRocmVhZElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHR1cm5JZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzdHJlYW1SZXN1bHQ6IFF1ZXJ5T3V0cHV0IHwgdW5kZWZpbmVkO1xuICAgIGxldCBzdHJlYW1FcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG5cbiAgICBzc2Uub25DbG9zZSgoKSA9PiB7XG4gICAgICBpZiAodGhyZWFkSWQgJiYgdHVybklkKSB7XG4gICAgICAgIFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy5pbnRlcnJ1cHRXb3JrZXJUdXJuKHRocmVhZElkLCB0dXJuSWQpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBRZ3JpZERpc3BhdGNoZXIucXVlcnlTdHJlYW0oYXJncywge1xuICAgICAgICBvbkRlbHRhOiAodGV4dCkgPT4ge1xuICAgICAgICAgIGlmICghc3NlLmNsb3NlZCkgc3NlLnB1Ymxpc2goXCJkZWx0YVwiLCB7IHRleHQgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVGhyZWFkSWQ6IChpZCkgPT4ge1xuICAgICAgICAgIHRocmVhZElkID0gaWQ7XG4gICAgICAgICAgaWYgKHNzZS5jbG9zZWQgJiYgdHVybklkKSB7XG4gICAgICAgICAgICBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcj8uaW50ZXJydXB0V29ya2VyVHVybih0aHJlYWRJZCwgdHVybklkKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvblR1cm5JZDogKGlkKSA9PiB7XG4gICAgICAgICAgdHVybklkID0gaWQ7XG4gICAgICAgICAgaWYgKHNzZS5jbG9zZWQgJiYgdGhyZWFkSWQpIHtcbiAgICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy5pbnRlcnJ1cHRXb3JrZXJUdXJuKHRocmVhZElkLCB0dXJuSWQpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ29tcGxldGU6IChyZXN1bHQpID0+IHtcbiAgICAgICAgICBzdHJlYW1SZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICBzdHJlYW1FcnJvciA9IGVycjtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHN0cmVhbUVycm9yID0gZSBhcyBFcnJvcjtcbiAgICB9XG5cbiAgICAvLyBkaXNwYXRjaGVyIOyZhOujjCDtm4QgbGlmZWN5Y2xlIOyymOumrCAoYXdhaXQg7JWI7KCEKVxuICAgIGlmIChzdHJlYW1SZXN1bHQpIHtcbiAgICAgIGxldCBydW5Db250ZXh0OiB7IHJlcXVlc3RMb2dJZDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAocnVuSW5mbykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGxpZmVjeWNsZSA9IGF3YWl0IGFmdGVyUXVlcnkoXG4gICAgICAgICAgICBydW5JbmZvLnJlcXVlc3RMb2dJZCxcbiAgICAgICAgICAgIHJ1bkluZm8uc3RlcEluZGV4LFxuICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgIHN0cmVhbVJlc3VsdCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJ1bkNvbnRleHQgPSBsaWZlY3ljbGUucnVuQ29udGV4dDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihgc3RyZWFtIGFmdGVyUXVlcnkgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGVmZmVjdGl2ZUxvZ01vZGUgPT09IFwiYXV0b1wiKSB7XG4gICAgICAgIC8vIHJ1biBsaWZlY3ljbGXsnYQg7JWIIO2DgOuKlCDri6jsnbwgc3RyZWFtIOyalOyyreuPhCByZXF1ZXN0X2xvZyAx6rG07J2AIOuCqOq4tOuLpCAocXVlcnnsmYAg64yA7LmtKS5cbiAgICAgICAgdGhpcy5zYXZlQXV0b1JlcXVlc3RMb2coYXJncywgc3RyZWFtUmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIGlmICghc3NlLmNsb3NlZCkgc3NlLnB1Ymxpc2goXCJkb25lXCIsIHsgLi4uc3RyZWFtUmVzdWx0LCBydW5Db250ZXh0IH0pO1xuICAgIH0gZWxzZSBpZiAoc3RyZWFtRXJyb3IpIHtcbiAgICAgIGlmIChydW5JbmZvKSBhd2FpdCBmaW5pc2hSdW5XaXRoRXJyb3IocnVuSW5mby5yZXF1ZXN0TG9nSWQsIHN0cmVhbUVycm9yLm1lc3NhZ2UsIGFyZ3MpO1xuICAgICAgaWYgKCFzc2UuY2xvc2VkKSBzc2UucHVibGlzaChcImVycm9yXCIsIHsgbWVzc2FnZTogc3RyZWFtRXJyb3IubWVzc2FnZSB9KTtcbiAgICB9IGVsc2UgaWYgKHNzZS5jbG9zZWQgJiYgcnVuSW5mbykge1xuICAgICAgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChydW5JbmZvLnJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgfVxuXG4gICAgYXdhaXQgc3NlLmVuZCgpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIGNyZWF0ZVJ1bihpbnB1dDogQ3JlYXRlUnVuSW5wdXQpOiBQcm9taXNlPHsgcmVxdWVzdExvZ0lkOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHJlcXVlc3RMb2dJZCA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5jcmVhdGVSdW4oe1xuICAgICAgdXNlcl9wcm9tcHQ6IGlucHV0LnVzZXJQcm9tcHQsXG4gICAgICBtb2RlbF9uYW1lOiBpbnB1dC5tb2RlbE5hbWUsXG4gICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgIHByb2plY3RfbmFtZTogaW5wdXQucHJvamVjdE5hbWUsXG4gICAgICBzeXN0ZW1fcHJvbXB0OiBpbnB1dC5zeXN0ZW1Qcm9tcHQsXG4gICAgICBoaXN0b3J5OiBpbnB1dC5oaXN0b3J5ID8gSlNPTi5wYXJzZShpbnB1dC5oaXN0b3J5KSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICByZXR1cm4geyByZXF1ZXN0TG9nSWQgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBhcHBlbmRTdGVwKGlucHV0OiBBcHBlbmRTdGVwSW5wdXQpOiBQcm9taXNlPHsgc3RlcElkOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHN0ZXBJZCA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5hcHBlbmRTdGVwKGlucHV0LnJlcXVlc3RMb2dJZCwge1xuICAgICAgc3RlcF9pbmRleDogaW5wdXQuc3RlcEluZGV4LFxuICAgICAgdHlwZTogaW5wdXQudHlwZSxcbiAgICAgIGlucHV0X3Rva2VuczogaW5wdXQuaW5wdXRUb2tlbnMsXG4gICAgICBvdXRwdXRfdG9rZW5zOiBpbnB1dC5vdXRwdXRUb2tlbnMsXG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogaW5wdXQuY2FjaGVSZWFkVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBpbnB1dC5jYWNoZUNyZWF0aW9uVG9rZW5zLFxuICAgICAgZHVyYXRpb25fbXM6IGlucHV0LmR1cmF0aW9uTXMsXG4gICAgICBmaW5pc2hfcmVhc29uOiBpbnB1dC5maW5pc2hSZWFzb24sXG4gICAgICByZWFzb25pbmdfdGV4dDogaW5wdXQucmVhc29uaW5nVGV4dCxcbiAgICAgIHJlYXNvbmluZ190b2tlbnM6IGlucHV0LnJlYXNvbmluZ1Rva2VucyxcbiAgICAgIHRvb2xfY2FsbF9pbmRleDogaW5wdXQudG9vbENhbGxJbmRleCxcbiAgICAgIHRvb2xfY2FsbF9pZDogaW5wdXQudG9vbENhbGxJZCxcbiAgICAgIHRvb2xfbmFtZTogaW5wdXQudG9vbE5hbWUsXG4gICAgICB0b29sX2FyZ3M6IGlucHV0LnRvb2xBcmdzLFxuICAgICAgdG9vbF9yZXN1bHQ6IGlucHV0LnRvb2xSZXN1bHQsXG4gICAgICB0b29sX2R1cmF0aW9uX21zOiBpbnB1dC50b29sRHVyYXRpb25NcyxcbiAgICAgIGVycm9yOiBpbnB1dC5lcnJvcixcbiAgICB9KTtcbiAgICByZXR1cm4geyBzdGVwSWQgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBmaW5pc2hSdW4oaW5wdXQ6IEZpbmlzaFJ1bklucHV0KTogUHJvbWlzZTx7IG9rOiBib29sZWFuIH0+IHtcbiAgICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZmluaXNoUnVuKGlucHV0LnJlcXVlc3RMb2dJZCwge1xuICAgICAgc3RhdHVzOiBpbnB1dC5zdGF0dXMsXG4gICAgICByZXNwb25zZTogaW5wdXQucmVzcG9uc2UsXG4gICAgICB0b2tlbl9uYW1lOiBpbnB1dC50b2tlbk5hbWUsXG4gICAgICBpbnB1dF90b2tlbnM6IGlucHV0LnRvdGFsSW5wdXRUb2tlbnMsXG4gICAgICBvdXRwdXRfdG9rZW5zOiBpbnB1dC50b3RhbE91dHB1dFRva2VucyxcbiAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBpbnB1dC50b3RhbENhY2hlUmVhZFRva2VucyxcbiAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogaW5wdXQudG90YWxDYWNoZUNyZWF0aW9uVG9rZW5zLFxuICAgICAgZHVyYXRpb25fbXM6IGlucHV0LnRvdGFsRHVyYXRpb25NcyxcbiAgICAgIGhpc3Rvcnk6IGlucHV0Lmhpc3RvcnkgPyBKU09OLnBhcnNlKGlucHV0Lmhpc3RvcnkpIDogdW5kZWZpbmVkLFxuICAgICAgZXJyb3JfbWVzc2FnZTogaW5wdXQuZXJyb3JNZXNzYWdlLFxuICAgIH0pO1xuICAgIHJldHVybiB7IG9rOiB0cnVlIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyBzdGF0cygpOiBQcm9taXNlPFRva2VuU3RhdHNbXT4ge1xuICAgIHJldHVybiBRZ3JpZERpc3BhdGNoZXIuZ2V0U3RhdHMoKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIHRvdGFsQ29zdCh0b2tlbk5hbWU/OiBzdHJpbmcpOiBQcm9taXNlPHsgdXNkOiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB7IHVzZDogYXdhaXQgUmVxdWVzdExvZ01vZGVsLnRvdGFsQ29zdCh7IHRva2VuX25hbWU6IHRva2VuTmFtZSB9KSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgcHJvamVjdE5hbWVzKCk6IFByb21pc2U8eyBuYW1lczogc3RyaW5nW10gfT4ge1xuICAgIHJldHVybiB7IG5hbWVzOiBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZGlzdGluY3RQcm9qZWN0TmFtZXMoKSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIGFkZFRva2VuKFxuICAgIHByb3ZpZGVyOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHM6IFRva2VuQ3JlZGVudGlhbHMsXG4gICAgbmFtZTogc3RyaW5nLFxuICApOiBQcm9taXNlPHsgYWRkZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICB7XG4gICAgICAgIHByb3ZpZGVyLFxuICAgICAgICBjcmVkZW50aWFscyxcbiAgICAgICAgbmFtZSxcbiAgICAgIH0sXG4gICAgXSk7XG4gICAgcmV0dXJuIHsgYWRkZWQ6IHRydWUgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyB1cGRhdGVUb2tlbihpZDogbnVtYmVyLCBuYW1lPzogc3RyaW5nKTogUHJvbWlzZTx7IHVwZGF0ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kT25lKFwiQVwiLCB7IGlkIH0pO1xuICAgIGlmICghZW50cnkpIHJldHVybiB7IHVwZGF0ZWQ6IGZhbHNlIH07XG5cbiAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAge1xuICAgICAgICBpZDogZW50cnkuaWQsXG4gICAgICAgIHByb3ZpZGVyOiBlbnRyeS5wcm92aWRlcixcbiAgICAgICAgY3JlZGVudGlhbHM6IGVudHJ5LmNyZWRlbnRpYWxzLFxuICAgICAgICBuYW1lOiBuYW1lICE9PSB1bmRlZmluZWQgPyBuYW1lIDogZW50cnkubmFtZSxcbiAgICAgIH0sXG4gICAgXSk7XG4gICAgcmV0dXJuIHsgdXBkYXRlZDogdHJ1ZSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHJlbW92ZVRva2VuKGlkOiBudW1iZXIpOiBQcm9taXNlPHsgcmVtb3ZlZDogYm9vbGVhbiB9PiB7XG4gICAgY29uc3QgZW50cnkgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRPbmUoXCJBXCIsIHsgaWQgfSk7XG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuIHsgcmVtb3ZlZDogZmFsc2UgfTtcbiAgICBhd2FpdCBUb2tlbk1vZGVsLmRlbChbZW50cnkuaWRdKTtcbiAgICByZXR1cm4geyByZW1vdmVkOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICog7Yag7YGwIO2ZnOyEse2ZlC/ruYTtmZzshLHtmZQg7Yag6riAIERC7J2YIGFjdGl2ZSDtlYTrk5wg7JeF642w7J207Yq4XG4gICAqL1xuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgdG9nZ2xlVG9rZW4oaWQ6IG51bWJlcik6IFByb21pc2U8eyBhY3RpdmU6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kT25lKFwiQVwiLCB7IGlkIH0pO1xuICAgIGlmICghZW50cnkpIHJldHVybiB7IGFjdGl2ZTogZmFsc2UgfTtcblxuICAgIGNvbnN0IG5ld0FjdGl2ZSA9ICFlbnRyeS5hY3RpdmU7XG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5zYXZlKFtcbiAgICAgIHtcbiAgICAgICAgaWQsXG4gICAgICAgIHByb3ZpZGVyOiBlbnRyeS5wcm92aWRlcixcbiAgICAgICAgY3JlZGVudGlhbHM6IGVudHJ5LmNyZWRlbnRpYWxzLFxuICAgICAgICBhY3RpdmU6IG5ld0FjdGl2ZSxcbiAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgIH0sXG4gICAgXSk7XG4gICAgcmV0dXJuIHsgYWN0aXZlOiBuZXdBY3RpdmUgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBvYXV0aFN0YXJ0KG5hbWU6IHN0cmluZyk6IFByb21pc2U8T0F1dGhTdGFydFJlc3VsdD4ge1xuICAgIGNvbnN0IHsgY29kZVZlcmlmaWVyLCBjb2RlQ2hhbGxlbmdlLCBzdGF0ZSB9ID0gZ2VuZXJhdGVQS0NFKCk7XG5cbiAgICBjb25zdCByZWRpcmVjdFVyaSA9IGdldE9BdXRoUmVkaXJlY3RVcmkoKTtcbiAgICBjb25zdCBhdXRoVXJsID0gYnVpbGRBdXRoVXJsKGNvZGVDaGFsbGVuZ2UsIHN0YXRlLCByZWRpcmVjdFVyaSk7XG5cbiAgICBhd2FpdCBzZXRPQXV0aFN0YXRlKHN0YXRlLCB7IGNvZGVWZXJpZmllciwgbmFtZSwgcmVkaXJlY3RVcmkgfSk7XG5cbiAgICByZXR1cm4geyBhdXRoVXJsIH07XG4gIH1cblxuICBhc3luYyBoYW5kbGVPQXV0aENhbGxiYWNrKGNvZGU6IHN0cmluZywgc3RhdGU6IHN0cmluZywgcmVwbHk6IEZhc3RpZnlSZXBseSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBlbmRpbmcgPSBhd2FpdCBnZXRPQXV0aFN0YXRlKHN0YXRlKTtcbiAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgIGxvZ2dlci53YXJuKFwib2F1dGggY2FsbGJhY2s6IGludmFsaWRfc3RhdGVcIik7XG4gICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoXCIvP29hdXRoPWVycm9yJnJlYXNvbj1pbnZhbGlkX3N0YXRlXCIpO1xuICAgIH1cbiAgICBhd2FpdCBkZWxldGVPQXV0aFN0YXRlKHN0YXRlKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b2tlbnMgPSBhd2FpdCBleGNoYW5nZUNvZGVGb3JUb2tlbnMoXG4gICAgICAgIGNvZGUsXG4gICAgICAgIHBlbmRpbmcuY29kZVZlcmlmaWVyLFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgcGVuZGluZy5yZWRpcmVjdFVyaSxcbiAgICAgICk7XG5cbiAgICAgIGlmICh0b2tlbnMuYWNjb3VudFV1aWQpIHtcbiAgICAgICAgY29uc3Qgb2xkRW50cmllcyA9IGF3YWl0IFRva2VuTW9kZWwuZmluZEJ5QWNjb3VudElkZW50aWZpZXIoXG4gICAgICAgICAgXCJBXCIsXG4gICAgICAgICAgXCJhbnRocm9waWNcIixcbiAgICAgICAgICB0b2tlbnMuYWNjb3VudFV1aWQsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvbGRFbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBhd2FpdCBUb2tlbk1vZGVsLmRlbChvbGRFbnRyaWVzLm1hcCgobykgPT4gby5pZCkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlcjogXCJhbnRocm9waWNcIixcbiAgICAgICAgICBjcmVkZW50aWFsczoge1xuICAgICAgICAgICAgYWNjZXNzVG9rZW46IHRva2Vucy5hY2Nlc3NUb2tlbixcbiAgICAgICAgICAgIHJlZnJlc2hUb2tlbjogdG9rZW5zLnJlZnJlc2hUb2tlbixcbiAgICAgICAgICAgIGV4cGlyZXNBdDogdG9rZW5zLmV4cGlyZXNBdCA/PyAwLFxuICAgICAgICAgICAgYWNjb3VudFV1aWQ6IHRva2Vucy5hY2NvdW50VXVpZCA/PyBcIlwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbmFtZTogcGVuZGluZy5uYW1lLFxuICAgICAgICB9LFxuICAgICAgXSk7XG5cbiAgICAgIHJldHVybiByZXBseS5yZWRpcmVjdChgLz9vYXV0aD1zdWNjZXNzJm5hbWU9JHtlbmNvZGVVUklDb21wb25lbnQocGVuZGluZy5uYW1lKX1gKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoYC8/b2F1dGg9ZXJyb3ImcmVhc29uPSR7ZW5jb2RlVVJJQ29tcG9uZW50KChlIGFzIEVycm9yKS5tZXNzYWdlKX1gKTtcbiAgICB9XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgb2F1dGhTdGFydE9wZW5BSShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPE9BdXRoU3RhcnRSZXN1bHQ+IHtcbiAgICBpZiAoIVFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyKSB0aHJvdyBuZXcgRXJyb3IoXCJPcGVuQUkgZGlzcGF0Y2hlciBub3QgaW5pdGlhbGl6ZWRcIik7XG4gICAgY29uc3QgeyBhdXRoVXJsIH0gPSBhd2FpdCBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlci5zdGFydEJyb3dzZXJMb2dpbihuYW1lKTtcblxuICAgIC8vIGZpcmUtYW5kLWZvcmdldDogY29kZXggbG9naW4g7JmE66OMIOuMgOq4sCDihpIg7Yag7YGwIOyggOyepVxuICAgIFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyXG4gICAgICAuY29tcGxldGVCcm93c2VyTG9naW4oKVxuICAgICAgLnRoZW4oYXN5bmMgKGNyZWRzKSA9PiB7XG4gICAgICAgIGlmIChjcmVkcy5hY2NvdW50SWQpIHtcbiAgICAgICAgICBjb25zdCBvbGRFbnRyaWVzID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kQnlBY2NvdW50SWRlbnRpZmllcihcbiAgICAgICAgICAgIFwiQVwiLFxuICAgICAgICAgICAgXCJvcGVuYWlcIixcbiAgICAgICAgICAgIGNyZWRzLmFjY291bnRJZCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChvbGRFbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGF3YWl0IFRva2VuTW9kZWwuZGVsKG9sZEVudHJpZXMubWFwKChvKSA9PiBvLmlkKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICAgICAgICBjcmVkZW50aWFsczoge1xuICAgICAgICAgICAgICBhY2Nlc3NUb2tlbjogY3JlZHMuYWNjZXNzVG9rZW4sXG4gICAgICAgICAgICAgIHJlZnJlc2hUb2tlbjogY3JlZHMucmVmcmVzaFRva2VuLFxuICAgICAgICAgICAgICBpZFRva2VuOiBjcmVkcy5pZFRva2VuLFxuICAgICAgICAgICAgICBhY2Nlc3NUb2tlbkV4cGlyZXNBdDogRGF0ZS5ub3coKSArIDEwICogMjQgKiAzNjAwICogMTAwMCxcbiAgICAgICAgICAgICAgYWNjb3VudElkOiBjcmVkcy5hY2NvdW50SWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYE9wZW5BSSB0b2tlbiBzYXZlZCBmb3IgJHtuYW1lfWApO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICBsb2dnZXIud2FybihgT3BlbkFJIGJyb3dzZXIgbG9naW4gZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4geyBhdXRoVXJsIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyB1c2FnZSh0b2tlbklkPzogbnVtYmVyKTogUHJvbWlzZTxVc2FnZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyByb3dzOiBhbGxUb2tlbnMgfSA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE1hbnkoXCJBXCIpO1xuICAgIGNvbnN0IGVudHJ5ID0gdG9rZW5JZFxuICAgICAgPyBhbGxUb2tlbnMuZmluZCgoZSkgPT4gZS5pZCA9PT0gdG9rZW5JZClcbiAgICAgIDogYWxsVG9rZW5zLmZpbmRMYXN0KChlKSA9PiBlLmFjdGl2ZSAmJiBlLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKTtcblxuICAgIGlmICghZW50cnkpIHJldHVybiB7IGVycm9yOiBcIk5PVF9GT1VORFwiIH07XG5cbiAgICBpZiAoZW50cnkucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJhdyA9IChhd2FpdCBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcj8uZ2V0UmF0ZUxpbWl0cyhlbnRyeS5uYW1lKSkgYXMge1xuICAgICAgICAgIHJhdGVMaW1pdHM/OiB7XG4gICAgICAgICAgICBwcmltYXJ5PzogeyB1c2VkUGVyY2VudDogbnVtYmVyOyB3aW5kb3dEdXJhdGlvbk1pbnM6IG51bWJlcjsgcmVzZXRzQXQ6IG51bWJlciB9O1xuICAgICAgICAgICAgc2Vjb25kYXJ5PzogeyB1c2VkUGVyY2VudDogbnVtYmVyOyB3aW5kb3dEdXJhdGlvbk1pbnM6IG51bWJlcjsgcmVzZXRzQXQ6IG51bWJlciB9O1xuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJsID0gcmF3Py5yYXRlTGltaXRzO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHByb3ZpZGVyOiBcIm9wZW5haVwiLFxuICAgICAgICAgIGZpdmVIb3VyOiBybD8ucHJpbWFyeVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgdXRpbGl6YXRpb246IHJsLnByaW1hcnkudXNlZFBlcmNlbnQsXG4gICAgICAgICAgICAgICAgcmVzZXRzQXQ6IG5ldyBEYXRlKHJsLnByaW1hcnkucmVzZXRzQXQgKiAxMDAwKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgc2V2ZW5EYXk6IHJsPy5zZWNvbmRhcnlcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIHV0aWxpemF0aW9uOiBybC5zZWNvbmRhcnkudXNlZFBlcmNlbnQsXG4gICAgICAgICAgICAgICAgcmVzZXRzQXQ6IG5ldyBEYXRlKHJsLnNlY29uZGFyeS5yZXNldHNBdCAqIDEwMDApLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGBPcGVuQUkgdXNhZ2UgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW50cnkucHJvdmlkZXIgIT09IFwiYW50aHJvcGljXCIpIHtcbiAgICAgIHJldHVybiB7IGVycm9yOiBgdXNhZ2UgQVBJIG5vdCBzdXBwb3J0ZWQgZm9yIHByb3ZpZGVyOiAke2VudHJ5LnByb3ZpZGVyfWAgfTtcbiAgICB9XG5cbiAgICBsZXQgYWNjZXNzVG9rZW4gPSBnZXRBY2Nlc3NUb2tlbihlbnRyeS5jcmVkZW50aWFscyk7XG4gICAgY29uc3QgaXNFeHBpcmVkID0gZ2V0RXhwaXJlc0F0KGVudHJ5LmNyZWRlbnRpYWxzKSA8IERhdGUubm93KCk7XG5cbiAgICBpZiAoaXNFeHBpcmVkICYmIGdldFJlZnJlc2hUb2tlbihlbnRyeS5jcmVkZW50aWFscykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFjY2Vzc1Rva2VuID0gYXdhaXQgdGhpcy5yZWZyZXNoVG9rZW4oZW50cnkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBvYXV0aExvZ2dlci53YXJuKGByZWZyZXNoIGZhaWxlZCBmb3IgJHtlbnRyeS5uYW1lfTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IFwicmUtbG9naW4gcmVxdWlyZWRcIiB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJhdyA9IGF3YWl0IGZldGNoVXNhZ2UoYWNjZXNzVG9rZW4pO1xuICAgIGlmIChyYXcuZXJyb3IgJiYgZ2V0UmVmcmVzaFRva2VuKGVudHJ5LmNyZWRlbnRpYWxzKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYWNjZXNzVG9rZW4gPSBhd2FpdCB0aGlzLnJlZnJlc2hUb2tlbihlbnRyeSk7XG4gICAgICAgIGNvbnN0IHJldHJpZWQgPSBhd2FpdCBmZXRjaFVzYWdlKGFjY2Vzc1Rva2VuKTtcbiAgICAgICAgaWYgKHJldHJpZWQuZXJyb3IpIHJldHVybiB7IGVycm9yOiByZXRyaWVkLmVycm9yIH07XG4gICAgICAgIHJldHVybiBjb252ZXJ0QW50aHJvcGljVXNhZ2UocmV0cmllZCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIG9hdXRoTG9nZ2VyLndhcm4oYHJlZnJlc2ggZmFpbGVkIGZvciAke2VudHJ5Lm5hbWV9OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICByZXR1cm4geyBlcnJvcjogXCJyZS1sb2dpbiByZXF1aXJlZFwiIH07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyYXcuZXJyb3IpIHJldHVybiB7IGVycm9yOiByYXcuZXJyb3IgfTtcbiAgICByZXR1cm4gY29udmVydEFudGhyb3BpY1VzYWdlKHJhdyk7XG4gIH1cblxuICBhc3luYyByZWZyZXNoVG9rZW4odG9rZW46IFRva2VuU3Vic2V0QSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgY3JlZHMgPSB0b2tlbi5jcmVkZW50aWFscztcbiAgICBjb25zdCBydCA9IGdldFJlZnJlc2hUb2tlbihjcmVkcyk7XG4gICAgaWYgKCFydCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVmcmVzaCB0b2tlblwiKTtcbiAgICBjb25zdCByZWZyZXNoZWQgPSBhd2FpdCByZWZyZXNoQWNjZXNzVG9rZW4ocnQpO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSBUb2tlbkNyZWRlbnRpYWxzLnBhcnNlKHtcbiAgICAgIC4uLmNyZWRzLFxuICAgICAgYWNjZXNzVG9rZW46IHJlZnJlc2hlZC5hY2Nlc3NUb2tlbixcbiAgICAgIHJlZnJlc2hUb2tlbjogcmVmcmVzaGVkLnJlZnJlc2hUb2tlbixcbiAgICAgIGV4cGlyZXNBdDogcmVmcmVzaGVkLmV4cGlyZXNBdCxcbiAgICB9KTtcbiAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAge1xuICAgICAgICBpZDogdG9rZW4uaWQsXG4gICAgICAgIHByb3ZpZGVyOiB0b2tlbi5wcm92aWRlcixcbiAgICAgICAgY3JlZGVudGlhbHM6IHVwZGF0ZWQsXG4gICAgICAgIG5hbWU6IHRva2VuLm5hbWUsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHJldHVybiByZWZyZXNoZWQuYWNjZXNzVG9rZW47XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyBoZWFsdGgoKTogUHJvbWlzZTxIZWFsdGhSZXNwb25zZT4ge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IFwib2tcIixcbiAgICAgIGFjdGl2ZVRva2VuczogUWdyaWREaXNwYXRjaGVyLnRva2Vucy5zaXplLFxuICAgICAgc3Vic2NyaWJlcjogUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXI/LnN0YXR1cygpID8/IG51bGwsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgUWdyaWRGcmFtZSA9IG5ldyBRZ3JpZEZyYW1lQ2xhc3MoKTtcblxuZnVuY3Rpb24gY29udmVydEFudGhyb3BpY1VzYWdlKHJhdzogQW50aHJvcGljVXNhZ2VSYXcpOiBVc2FnZVJlc3BvbnNlIHtcbiAgcmV0dXJuIHtcbiAgICBwcm92aWRlcjogXCJhbnRocm9waWNcIixcbiAgICBmaXZlSG91cjogcmF3LmZpdmVfaG91clxuICAgICAgPyB7IHV0aWxpemF0aW9uOiByYXcuZml2ZV9ob3VyLnV0aWxpemF0aW9uLCByZXNldHNBdDogcmF3LmZpdmVfaG91ci5yZXNldHNfYXQgfVxuICAgICAgOiBudWxsLFxuICAgIHNldmVuRGF5OiByYXcuc2V2ZW5fZGF5XG4gICAgICA/IHsgdXRpbGl6YXRpb246IHJhdy5zZXZlbl9kYXkudXRpbGl6YXRpb24sIHJlc2V0c0F0OiByYXcuc2V2ZW5fZGF5LnJlc2V0c19hdCB9XG4gICAgICA6IG51bGwsXG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNENBLE1BQU0saUNBQWlCLElBQUksS0FBeUI7QUFHcEQsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxrQkFBa0I7QUFFeEIsZUFBZSxjQUFjLE9BQWUsTUFBbUM7Q0FDN0UsTUFBTSxRQUFRLG9CQUFvQjtBQUNsQyxLQUFJLENBQUMsTUFBTyxPQUFNLElBQUksTUFBTSwrQkFBK0I7QUFDM0QsT0FBTSxNQUFNLElBQUk7RUFDZCxLQUFLLEdBQUcscUJBQXFCO0VBQzdCLE9BQU8sS0FBSyxVQUFVLEtBQUs7RUFDM0IsS0FBSztFQUNOLENBQUM7O0FBR0osZUFBZSxjQUFjLE9BQWtEO0NBQzdFLE1BQU0sUUFBUSxvQkFBb0I7QUFDbEMsS0FBSSxDQUFDLE1BQU8sT0FBTSxJQUFJLE1BQU0sK0JBQStCO0NBQzNELE1BQU0sTUFBTSxNQUFNLE1BQU0sSUFBWSxFQUFFLEtBQUssR0FBRyxxQkFBcUIsU0FBUyxDQUFDO0FBQzdFLEtBQUksQ0FBQyxJQUFLLFFBQU87QUFDakIsUUFBTyxLQUFLLE1BQU0sSUFBSTs7QUFHeEIsZUFBZSxpQkFBaUIsT0FBOEI7Q0FDNUQsTUFBTSxRQUFRLG9CQUFvQjtBQUNsQyxLQUFJLENBQUMsTUFBTztBQUNaLE9BQU0sTUFBTSxPQUFP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
577
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZnJhbWUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmZyYW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcnlwdG8gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyBhcGksIEJhc2VGcmFtZUNsYXNzLCBTb25hbXUsIHN0cmVhbSB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGdldENhY2hlTWFuYWdlclJlZiB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHtcbiAgZ2V0QWNjZXNzVG9rZW4sXG4gIGdldEV4cGlyZXNBdCxcbiAgZ2V0UmVmcmVzaFRva2VuLFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9jcmVkZW50aWFsc1wiO1xuaW1wb3J0IHsgTUlDUk9fVVNELCBSZXF1ZXN0TG9nTW9kZWwgfSBmcm9tIFwiLi4vcmVxdWVzdC1sb2cvcmVxdWVzdC1sb2cubW9kZWxcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5TdWJzZXRBIH0gZnJvbSBcIi4uL3NvbmFtdS5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IFRva2VuTW9kZWwgfSBmcm9tIFwiLi4vdG9rZW4vdG9rZW4ubW9kZWxcIjtcbmltcG9ydCB7IFRva2VuQ3JlZGVudGlhbHMgfSBmcm9tIFwiLi4vdG9rZW4vdG9rZW4udHlwZXNcIjtcbmltcG9ydCB7XG4gIHR5cGUgQW50aHJvcGljVXNhZ2VSYXcsXG4gIGJ1aWxkQXV0aFVybCxcbiAgZXhjaGFuZ2VDb2RlRm9yVG9rZW5zLFxuICBmZXRjaFVzYWdlLFxuICBnZW5lcmF0ZVBLQ0UsXG4gIHJlZnJlc2hBY2Nlc3NUb2tlbixcbn0gZnJvbSBcIi4vb2F1dGhcIjtcbmltcG9ydCB7XG4gIGFmdGVyUXVlcnksXG4gIGJlZm9yZVF1ZXJ5LFxuICBmaW5pc2hSdW5BYm9ydGVkLFxuICBmaW5pc2hSdW5XaXRoRXJyb3IsXG59IGZyb20gXCIuL3FncmlkLXJ1bi1saWZlY3ljbGVcIjtcbmltcG9ydCB7IFFncmlkRGlzcGF0Y2hlciB9IGZyb20gXCIuL3FncmlkLmRpc3BhdGNoZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgUXVlcnlJbnB1dCxcbiAgdHlwZSBBcHBlbmRTdGVwSW5wdXQsXG4gIHR5cGUgQ3JlYXRlUnVuSW5wdXQsXG4gIHR5cGUgRmluaXNoUnVuSW5wdXQsXG4gIHR5cGUgSGVhbHRoUmVzcG9uc2UsXG4gIHR5cGUgT0F1dGhTdGFydFJlc3VsdCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbiAgdHlwZSBRZ3JpZFJ1bkNvbnRleHQsXG4gIFN0cmVhbUV2ZW50cyxcbiAgdHlwZSBUb2tlblN0YXRzLFxuICB0eXBlIFVzYWdlUmVzcG9uc2UsXG59IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5cbmNvbnN0IHBlbmRpbmdTdHJlYW1zID0gbmV3IE1hcDxzdHJpbmcsIFF1ZXJ5SW5wdXQ+KCk7XG5cbnR5cGUgUGVuZGluZ09BdXRoID0geyBjb2RlVmVyaWZpZXI6IHN0cmluZzsgbmFtZTogc3RyaW5nOyByZWRpcmVjdFVyaTogc3RyaW5nIH07XG5jb25zdCBPQVVUSF9TVEFURV9QUkVGSVggPSBcIm9hdXRoOnN0YXRlOlwiO1xuY29uc3QgT0FVVEhfU1RBVEVfVFRMID0gXCI1bVwiO1xuXG5hc3luYyBmdW5jdGlvbiBzZXRPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcsIGRhdGE6IFBlbmRpbmdPQXV0aCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjYWNoZSA9IGdldENhY2hlTWFuYWdlclJlZigpO1xuICBpZiAoIWNhY2hlKSB0aHJvdyBuZXcgRXJyb3IoXCJDYWNoZU1hbmFnZXIgbm90IGluaXRpYWxpemVkXCIpO1xuICBhd2FpdCBjYWNoZS5zZXQoe1xuICAgIGtleTogYCR7T0FVVEhfU1RBVEVfUFJFRklYfSR7c3RhdGV9YCxcbiAgICB2YWx1ZTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgdHRsOiBPQVVUSF9TVEFURV9UVEwsXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcpOiBQcm9taXNlPFBlbmRpbmdPQXV0aCB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBjYWNoZSA9IGdldENhY2hlTWFuYWdlclJlZigpO1xuICBpZiAoIWNhY2hlKSB0aHJvdyBuZXcgRXJyb3IoXCJDYWNoZU1hbmFnZXIgbm90IGluaXRpYWxpemVkXCIpO1xuICBjb25zdCByYXcgPSBhd2FpdCBjYWNoZS5nZXQ8c3RyaW5nPih7IGtleTogYCR7T0FVVEhfU1RBVEVfUFJFRklYfSR7c3RhdGV9YCB9KTtcbiAgaWYgKCFyYXcpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgUGVuZGluZ09BdXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2FjaGUgPSBnZXRDYWNoZU1hbmFnZXJSZWYoKTtcbiAgaWYgKCFjYWNoZSkgcmV0dXJuO1xuICBhd2FpdCBjYWNoZS5kZWxldGUoeyBrZXk6IGAke09BVVRIX1NUQVRFX1BSRUZJWH0ke3N0YXRlfWAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE9BdXRoUmVkaXJlY3RVcmkoKTogc3RyaW5nIHtcbiAgY29uc3QgcHVibGljQmFzZVVybCA9IHByb2Nlc3MuZW52LlFHUklEX1BVQkxJQ19CQVNFX1VSTD8ucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcbiAgaWYgKHB1YmxpY0Jhc2VVcmwpIHJldHVybiBgJHtwdWJsaWNCYXNlVXJsfS9jYWxsYmFja2A7XG5cbiAgY29uc3Qgc2VydmVyUG9ydCA9IHByb2Nlc3MuZW52LlBPUlQgPz8gXCI0NDkwMFwiO1xuICByZXR1cm4gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtzZXJ2ZXJQb3J0fS9jYWxsYmFja2A7XG59XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiXSk7XG5jb25zdCBvYXV0aExvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcIm9hdXRoXCJdKTtcblxuY2xhc3MgUWdyaWRGcmFtZUNsYXNzIGV4dGVuZHMgQmFzZUZyYW1lQ2xhc3Mge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlFncmlkXCIpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHF1ZXJ5KGFyZ3M6IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPFF1ZXJ5T3V0cHV0PiB7XG4gICAgY29uc3QgZWZmZWN0aXZlTG9nTW9kZSA9IGFyZ3MubG9nTW9kZSA/PyAoYXJncy5pc1N0ZXAgPyBcInJ1blwiIDogXCJhdXRvXCIpO1xuXG4gICAgLy8gbG9nTW9kZTogXCJydW5cIiDihpIg7ISc67KE6rCAIGxpZmVjeWNsZSDqtIDrpqxcbiAgICBpZiAoZWZmZWN0aXZlTG9nTW9kZSA9PT0gXCJydW5cIikge1xuICAgICAgY29uc3QgeyByZXF1ZXN0TG9nSWQsIHN0ZXBJbmRleCB9ID0gYXdhaXQgYmVmb3JlUXVlcnkoYXJncyk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBRZ3JpZERpc3BhdGNoZXIucXVlcnkoYXJncywgYXJncy50aW1lb3V0KTtcbiAgICAgICAgY29uc3QgbGlmZWN5Y2xlID0gYXdhaXQgYWZ0ZXJRdWVyeShyZXF1ZXN0TG9nSWQsIHN0ZXBJbmRleCwgYXJncywgcmVzdWx0KTtcbiAgICAgICAgLy8gbGlmZWN5Y2xlLnJ1bkNvbnRleHQocmVxdWVzdExvZ0lkKSDsmYAgZGlzcGF0Y2hlciDqsIAg7Iuk7J2AIHRocmVhZENvb3JkIOulvCDrs5HtlakuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgIHJ1bkNvbnRleHQ6IHsgLi4ubGlmZWN5Y2xlLnJ1bkNvbnRleHQsIHRocmVhZENvb3JkOiByZXN1bHQucnVuQ29udGV4dD8udGhyZWFkQ29vcmQgfSxcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgYXdhaXQgZmluaXNoUnVuV2l0aEVycm9yKHJlcXVlc3RMb2dJZCwgKGUgYXMgRXJyb3IpLm1lc3NhZ2UsIGFyZ3MpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGxvZ01vZGU6IFwiYXV0b1wiICjquLDsobQgbm9uLXN0ZXAg6rK966GcKSDrmJDripQgXCJub25lXCJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBRZ3JpZERpc3BhdGNoZXIucXVlcnkoYXJncywgYXJncy50aW1lb3V0KTtcblxuICAgIGlmIChlZmZlY3RpdmVMb2dNb2RlID09PSBcImF1dG9cIikge1xuICAgICAgdGhpcy5zYXZlQXV0b1JlcXVlc3RMb2coYXJncywgcmVzdWx0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gbG9nTW9kZSBcImF1dG9cIiDri6jsnbwg7JqU7LKtIOuhnOq5hTogcnVuIGxpZmVjeWNsZShzdGVwIOu2hO2VtCkg7JeG7J20IHJlcXVlc3RfbG9nIDHqsbTrp4wg64Ko6ri064ukLlxuICAvLyBxdWVyeeyZgCBxdWVyeVN0cmVhbSDslpHsqr3sl5DshJwg7IKs7JqpLlxuICBwcml2YXRlIHNhdmVBdXRvUmVxdWVzdExvZyhhcmdzOiBRdWVyeUlucHV0LCByZXN1bHQ6IFF1ZXJ5T3V0cHV0KTogdm9pZCB7XG4gICAgY29uc3QgdG9vbENhbGxDb3VudCA9IHJlc3VsdC5jb250ZW50LmZpbHRlcigoaXRlbSkgPT4gaXRlbS50eXBlID09PSBcInRvb2wtY2FsbFwiKS5sZW5ndGg7XG4gICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gcmVzdWx0LmNvbnRlbnRcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gXCJ0ZXh0XCIpXG4gICAgICAubWFwKChpdGVtKSA9PiBpdGVtLnRleHQpXG4gICAgICAuam9pbihcIlxcblwiKTtcblxuICAgIFJlcXVlc3RMb2dNb2RlbC5zYXZlKFtcbiAgICAgIHtcbiAgICAgICAgdG9rZW5fbmFtZTogcmVzdWx0LnRva2VuTmFtZSxcbiAgICAgICAgcHJvamVjdF9uYW1lOiBhcmdzLnByb2plY3ROYW1lPy5sZW5ndGggPyBhcmdzLnByb2plY3ROYW1lIDogbnVsbCxcbiAgICAgICAgbW9kZWxfbmFtZTogcmVzdWx0Lm1vZGVsID8/IG51bGwsXG4gICAgICAgIHVzZXJfcHJvbXB0OiBhcmdzLnByb21wdCxcbiAgICAgICAgc3lzdGVtX3Byb21wdDogYXJncy5zeXN0ZW0gPz8gbnVsbCxcbiAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlVGV4dCxcbiAgICAgICAgaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRfdG9rZW5zLFxuICAgICAgICBvdXRwdXRfdG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0X3Rva2VucyxcbiAgICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZV9yZWFkX2lucHV0X3Rva2VucyxcbiAgICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zLFxuICAgICAgICBkdXJhdGlvbl9tczogcmVzdWx0LmR1cmF0aW9uTXMsXG4gICAgICAgIGNvc3RfdXNkOiByZXN1bHQuY29zdFVzZCAhPT0gbnVsbCA/IE1hdGgucm91bmQocmVzdWx0LmNvc3RVc2QgKiBNSUNST19VU0QpIDogbnVsbCxcbiAgICAgICAgZWZmb3J0OiBhcmdzLmVmZm9ydCA/PyBudWxsLFxuICAgICAgICAvLyBtYWxmb3JtZWQgaGlzdG9yeeqwgCDsmYDrj4Qg7ISx6rO17ZWcIO2EtCjtirntnoggc3RyZWFtIHNzZS5lbmQoKSnsnYQg6rmo7KeAIOyViuuPhOuhnSDrsKnslrQuXG4gICAgICAgIGhpc3Rvcnk6ICgoKTogeyB0eXBlOiBzdHJpbmcgfVtdIHwgbnVsbCA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhcmdzLmhpc3RvcnkgPyBKU09OLnBhcnNlKGFyZ3MuaGlzdG9yeSkgOiBudWxsO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpLFxuICAgICAgICBzdGF0dXM6IFwic3VjY2VlZGVkXCIsXG4gICAgICAgIHRvb2xfY2FsbF9jb3VudDogdG9vbENhbGxDb3VudCxcbiAgICAgIH0sXG4gICAgXSkuY2F0Y2goKGUpID0+IGxvZ2dlci5lcnJvcihgcmVxdWVzdExvZyBzYXZlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgcHJlcGFyZVN0cmVhbShhcmdzOiBRdWVyeUlucHV0KTogUHJvbWlzZTx7IHN0cmVhbUlkOiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IHN0cmVhbUlkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICBwZW5kaW5nU3RyZWFtcy5zZXQoc3RyZWFtSWQsIGFyZ3MpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gcGVuZGluZ1N0cmVhbXMuZGVsZXRlKHN0cmVhbUlkKSwgMzBfMDAwKTtcbiAgICByZXR1cm4geyBzdHJlYW1JZCB9O1xuICB9XG5cbiAgQHN0cmVhbSh7IHR5cGU6IFwic3NlXCIsIGV2ZW50czogU3RyZWFtRXZlbnRzIH0pXG4gIGFzeW5jIHF1ZXJ5U3RyZWFtKHN0cmVhbUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhcmdzID0gcGVuZGluZ1N0cmVhbXMuZ2V0KHN0cmVhbUlkKTtcbiAgICBwZW5kaW5nU3RyZWFtcy5kZWxldGUoc3RyZWFtSWQpO1xuICAgIGlmICghYXJncykgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBvciBleHBpcmVkIHN0cmVhbUlkXCIpO1xuXG4gICAgY29uc3QgZWZmZWN0aXZlTG9nTW9kZSA9IGFyZ3MubG9nTW9kZSA/PyAoYXJncy5pc1N0ZXAgPyBcInJ1blwiIDogXCJhdXRvXCIpO1xuICAgIGNvbnN0IHNob3VsZExvZyA9IGVmZmVjdGl2ZUxvZ01vZGUgPT09IFwicnVuXCI7XG5cbiAgICBsZXQgcnVuSW5mbzogeyByZXF1ZXN0TG9nSWQ6IG51bWJlcjsgc3RlcEluZGV4OiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoc2hvdWxkTG9nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBydW5JbmZvID0gYXdhaXQgYmVmb3JlUXVlcnkoYXJncyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgc3RyZWFtIGJlZm9yZVF1ZXJ5IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjdHggPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIGNvbnN0IHNzZSA9IGN0eC5jcmVhdGVTU0UoU3RyZWFtRXZlbnRzKTtcbiAgICBsZXQgdGhyZWFkSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgdHVybklkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHN0cmVhbVJlc3VsdDogUXVlcnlPdXRwdXQgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHN0cmVhbUVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcblxuICAgIHNzZS5vbkNsb3NlKCgpID0+IHtcbiAgICAgIGlmICh0aHJlYWRJZCAmJiB0dXJuSWQpIHtcbiAgICAgICAgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXI/LmludGVycnVwdFdvcmtlclR1cm4odGhyZWFkSWQsIHR1cm5JZCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5xdWVyeVN0cmVhbShhcmdzLCB7XG4gICAgICAgIG9uRGVsdGE6ICh0ZXh0KSA9PiB7XG4gICAgICAgICAgaWYgKCFzc2UuY2xvc2VkKSBzc2UucHVibGlzaChcImRlbHRhXCIsIHsgdGV4dCB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25UaHJlYWRJZDogKGlkKSA9PiB7XG4gICAgICAgICAgdGhyZWFkSWQgPSBpZDtcbiAgICAgICAgICBpZiAoc3NlLmNsb3NlZCAmJiB0dXJuSWQpIHtcbiAgICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy5pbnRlcnJ1cHRXb3JrZXJUdXJuKHRocmVhZElkLCB0dXJuSWQpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uVHVybklkOiAoaWQpID0+IHtcbiAgICAgICAgICB0dXJuSWQgPSBpZDtcbiAgICAgICAgICBpZiAoc3NlLmNsb3NlZCAmJiB0aHJlYWRJZCkge1xuICAgICAgICAgICAgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXI/LmludGVycnVwdFdvcmtlclR1cm4odGhyZWFkSWQsIHR1cm5JZCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25Db21wbGV0ZTogKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIHN0cmVhbVJlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgIHN0cmVhbUVycm9yID0gZXJyO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc3RyZWFtRXJyb3IgPSBlIGFzIEVycm9yO1xuICAgIH1cblxuICAgIC8vIGRpc3BhdGNoZXIg7JmE66OMIO2bhCBsaWZlY3ljbGUg7LKY66asIChhd2FpdCDslYjsoIQpXG4gICAgaWYgKHN0cmVhbVJlc3VsdCkge1xuICAgICAgLy8gZGlzcGF0Y2hlciDqsIAg7Iuk7J2AIHRocmVhZCDsnqzsgqzsmqkg7KKM7ZGcIChhdXRvL3J1biDqs7XthrXsnLzroZwg7YG065287JeQIO2ajOyGoe2VtOyVvCDtlagpLlxuICAgICAgY29uc3QgdGhyZWFkQ29vcmQgPSBzdHJlYW1SZXN1bHQucnVuQ29udGV4dD8udGhyZWFkQ29vcmQ7XG4gICAgICBsZXQgcnVuQ29udGV4dDogUWdyaWRSdW5Db250ZXh0IHwgdW5kZWZpbmVkID1cbiAgICAgICAgdGhyZWFkQ29vcmQgIT09IHVuZGVmaW5lZCA/IHsgdGhyZWFkQ29vcmQgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChydW5JbmZvKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbGlmZWN5Y2xlID0gYXdhaXQgYWZ0ZXJRdWVyeShcbiAgICAgICAgICAgIHJ1bkluZm8ucmVxdWVzdExvZ0lkLFxuICAgICAgICAgICAgcnVuSW5mby5zdGVwSW5kZXgsXG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgc3RyZWFtUmVzdWx0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgcnVuQ29udGV4dCA9IHsgLi4ubGlmZWN5Y2xlLnJ1bkNvbnRleHQsIHRocmVhZENvb3JkIH07XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYHN0cmVhbSBhZnRlclF1ZXJ5IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChlZmZlY3RpdmVMb2dNb2RlID09PSBcImF1dG9cIikge1xuICAgICAgICAvLyBydW4gbGlmZWN5Y2xl7J2EIOyViCDtg4DripQg64uo7J28IHN0cmVhbSDsmpTssq3rj4QgcmVxdWVzdF9sb2cgMeqxtOydgCDrgqjquLTri6QgKHF1ZXJ57JmAIOuMgOy5rSkuXG4gICAgICAgIHRoaXMuc2F2ZUF1dG9SZXF1ZXN0TG9nKGFyZ3MsIHN0cmVhbVJlc3VsdCk7XG4gICAgICB9XG4gICAgICBpZiAoIXNzZS5jbG9zZWQpIHNzZS5wdWJsaXNoKFwiZG9uZVwiLCB7IC4uLnN0cmVhbVJlc3VsdCwgcnVuQ29udGV4dCB9KTtcbiAgICB9IGVsc2UgaWYgKHN0cmVhbUVycm9yKSB7XG4gICAgICBpZiAocnVuSW5mbykgYXdhaXQgZmluaXNoUnVuV2l0aEVycm9yKHJ1bkluZm8ucmVxdWVzdExvZ0lkLCBzdHJlYW1FcnJvci5tZXNzYWdlLCBhcmdzKTtcbiAgICAgIGlmICghc3NlLmNsb3NlZCkgc3NlLnB1Ymxpc2goXCJlcnJvclwiLCB7IG1lc3NhZ2U6IHN0cmVhbUVycm9yLm1lc3NhZ2UgfSk7XG4gICAgfSBlbHNlIGlmIChzc2UuY2xvc2VkICYmIHJ1bkluZm8pIHtcbiAgICAgIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocnVuSW5mby5yZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgIH1cblxuICAgIGF3YWl0IHNzZS5lbmQoKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBjcmVhdGVSdW4oaW5wdXQ6IENyZWF0ZVJ1bklucHV0KTogUHJvbWlzZTx7IHJlcXVlc3RMb2dJZDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCByZXF1ZXN0TG9nSWQgPSBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuY3JlYXRlUnVuKHtcbiAgICAgIHVzZXJfcHJvbXB0OiBpbnB1dC51c2VyUHJvbXB0LFxuICAgICAgbW9kZWxfbmFtZTogaW5wdXQubW9kZWxOYW1lLFxuICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICBwcm9qZWN0X25hbWU6IGlucHV0LnByb2plY3ROYW1lLFxuICAgICAgc3lzdGVtX3Byb21wdDogaW5wdXQuc3lzdGVtUHJvbXB0LFxuICAgICAgaGlzdG9yeTogaW5wdXQuaGlzdG9yeSA/IEpTT04ucGFyc2UoaW5wdXQuaGlzdG9yeSkgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgcmVxdWVzdExvZ0lkIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgYXBwZW5kU3RlcChpbnB1dDogQXBwZW5kU3RlcElucHV0KTogUHJvbWlzZTx7IHN0ZXBJZDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzdGVwSWQgPSBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuYXBwZW5kU3RlcChpbnB1dC5yZXF1ZXN0TG9nSWQsIHtcbiAgICAgIHN0ZXBfaW5kZXg6IGlucHV0LnN0ZXBJbmRleCxcbiAgICAgIHR5cGU6IGlucHV0LnR5cGUsXG4gICAgICBpbnB1dF90b2tlbnM6IGlucHV0LmlucHV0VG9rZW5zLFxuICAgICAgb3V0cHV0X3Rva2VuczogaW5wdXQub3V0cHV0VG9rZW5zLFxuICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IGlucHV0LmNhY2hlUmVhZFRva2VucyxcbiAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogaW5wdXQuY2FjaGVDcmVhdGlvblRva2VucyxcbiAgICAgIGR1cmF0aW9uX21zOiBpbnB1dC5kdXJhdGlvbk1zLFxuICAgICAgZmluaXNoX3JlYXNvbjogaW5wdXQuZmluaXNoUmVhc29uLFxuICAgICAgcmVhc29uaW5nX3RleHQ6IGlucHV0LnJlYXNvbmluZ1RleHQsXG4gICAgICByZWFzb25pbmdfdG9rZW5zOiBpbnB1dC5yZWFzb25pbmdUb2tlbnMsXG4gICAgICB0b29sX2NhbGxfaW5kZXg6IGlucHV0LnRvb2xDYWxsSW5kZXgsXG4gICAgICB0b29sX2NhbGxfaWQ6IGlucHV0LnRvb2xDYWxsSWQsXG4gICAgICB0b29sX25hbWU6IGlucHV0LnRvb2xOYW1lLFxuICAgICAgdG9vbF9hcmdzOiBpbnB1dC50b29sQXJncyxcbiAgICAgIHRvb2xfcmVzdWx0OiBpbnB1dC50b29sUmVzdWx0LFxuICAgICAgdG9vbF9kdXJhdGlvbl9tczogaW5wdXQudG9vbER1cmF0aW9uTXMsXG4gICAgICBlcnJvcjogaW5wdXQuZXJyb3IsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgc3RlcElkIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgZmluaXNoUnVuKGlucHV0OiBGaW5pc2hSdW5JbnB1dCk6IFByb21pc2U8eyBvazogYm9vbGVhbiB9PiB7XG4gICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmZpbmlzaFJ1bihpbnB1dC5yZXF1ZXN0TG9nSWQsIHtcbiAgICAgIHN0YXR1czogaW5wdXQuc3RhdHVzLFxuICAgICAgcmVzcG9uc2U6IGlucHV0LnJlc3BvbnNlLFxuICAgICAgdG9rZW5fbmFtZTogaW5wdXQudG9rZW5OYW1lLFxuICAgICAgaW5wdXRfdG9rZW5zOiBpbnB1dC50b3RhbElucHV0VG9rZW5zLFxuICAgICAgb3V0cHV0X3Rva2VuczogaW5wdXQudG90YWxPdXRwdXRUb2tlbnMsXG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogaW5wdXQudG90YWxDYWNoZVJlYWRUb2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IGlucHV0LnRvdGFsQ2FjaGVDcmVhdGlvblRva2VucyxcbiAgICAgIGR1cmF0aW9uX21zOiBpbnB1dC50b3RhbER1cmF0aW9uTXMsXG4gICAgICBoaXN0b3J5OiBpbnB1dC5oaXN0b3J5ID8gSlNPTi5wYXJzZShpbnB1dC5oaXN0b3J5KSA6IHVuZGVmaW5lZCxcbiAgICAgIGVycm9yX21lc3NhZ2U6IGlucHV0LmVycm9yTWVzc2FnZSxcbiAgICB9KTtcbiAgICByZXR1cm4geyBvazogdHJ1ZSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgc3RhdHMoKTogUHJvbWlzZTxUb2tlblN0YXRzW10+IHtcbiAgICByZXR1cm4gUWdyaWREaXNwYXRjaGVyLmdldFN0YXRzKCk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyB0b3RhbENvc3QodG9rZW5OYW1lPzogc3RyaW5nKTogUHJvbWlzZTx7IHVzZDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4geyB1c2Q6IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC50b3RhbENvc3QoeyB0b2tlbl9uYW1lOiB0b2tlbk5hbWUgfSkgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIHByb2plY3ROYW1lcygpOiBQcm9taXNlPHsgbmFtZXM6IHN0cmluZ1tdIH0+IHtcbiAgICByZXR1cm4geyBuYW1lczogYXdhaXQgUmVxdWVzdExvZ01vZGVsLmRpc3RpbmN0UHJvamVjdE5hbWVzKCkgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBhZGRUb2tlbihcbiAgICBwcm92aWRlcjogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBUb2tlbkNyZWRlbnRpYWxzLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IGFkZGVkOiBib29sZWFuIH0+IHtcbiAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAge1xuICAgICAgICBwcm92aWRlcixcbiAgICAgICAgY3JlZGVudGlhbHMsXG4gICAgICAgIG5hbWUsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHJldHVybiB7IGFkZGVkOiB0cnVlIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgdXBkYXRlVG9rZW4oaWQ6IG51bWJlciwgbmFtZT86IHN0cmluZyk6IFByb21pc2U8eyB1cGRhdGVkOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE9uZShcIkFcIiwgeyBpZCB9KTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm4geyB1cGRhdGVkOiBmYWxzZSB9O1xuXG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5zYXZlKFtcbiAgICAgIHtcbiAgICAgICAgaWQ6IGVudHJ5LmlkLFxuICAgICAgICBwcm92aWRlcjogZW50cnkucHJvdmlkZXIsXG4gICAgICAgIGNyZWRlbnRpYWxzOiBlbnRyeS5jcmVkZW50aWFscyxcbiAgICAgICAgbmFtZTogbmFtZSAhPT0gdW5kZWZpbmVkID8gbmFtZSA6IGVudHJ5Lm5hbWUsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHJldHVybiB7IHVwZGF0ZWQ6IHRydWUgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyByZW1vdmVUb2tlbihpZDogbnVtYmVyKTogUHJvbWlzZTx7IHJlbW92ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kT25lKFwiQVwiLCB7IGlkIH0pO1xuICAgIGlmICghZW50cnkpIHJldHVybiB7IHJlbW92ZWQ6IGZhbHNlIH07XG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5kZWwoW2VudHJ5LmlkXSk7XG4gICAgcmV0dXJuIHsgcmVtb3ZlZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIO2GoO2BsCDtmZzshLHtmZQv67mE7Zmc7ISx7ZmUIO2GoOq4gCBEQuydmCBhY3RpdmUg7ZWE65OcIOyXheuNsOydtO2KuFxuICAgKi9cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHRvZ2dsZVRva2VuKGlkOiBudW1iZXIpOiBQcm9taXNlPHsgYWN0aXZlOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE9uZShcIkFcIiwgeyBpZCB9KTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm4geyBhY3RpdmU6IGZhbHNlIH07XG5cbiAgICBjb25zdCBuZXdBY3RpdmUgPSAhZW50cnkuYWN0aXZlO1xuICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICB7XG4gICAgICAgIGlkLFxuICAgICAgICBwcm92aWRlcjogZW50cnkucHJvdmlkZXIsXG4gICAgICAgIGNyZWRlbnRpYWxzOiBlbnRyeS5jcmVkZW50aWFscyxcbiAgICAgICAgYWN0aXZlOiBuZXdBY3RpdmUsXG4gICAgICAgIG5hbWU6IGVudHJ5Lm5hbWUsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHJldHVybiB7IGFjdGl2ZTogbmV3QWN0aXZlIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgb2F1dGhTdGFydChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPE9BdXRoU3RhcnRSZXN1bHQ+IHtcbiAgICBjb25zdCB7IGNvZGVWZXJpZmllciwgY29kZUNoYWxsZW5nZSwgc3RhdGUgfSA9IGdlbmVyYXRlUEtDRSgpO1xuXG4gICAgY29uc3QgcmVkaXJlY3RVcmkgPSBnZXRPQXV0aFJlZGlyZWN0VXJpKCk7XG4gICAgY29uc3QgYXV0aFVybCA9IGJ1aWxkQXV0aFVybChjb2RlQ2hhbGxlbmdlLCBzdGF0ZSwgcmVkaXJlY3RVcmkpO1xuXG4gICAgYXdhaXQgc2V0T0F1dGhTdGF0ZShzdGF0ZSwgeyBjb2RlVmVyaWZpZXIsIG5hbWUsIHJlZGlyZWN0VXJpIH0pO1xuXG4gICAgcmV0dXJuIHsgYXV0aFVybCB9O1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlT0F1dGhDYWxsYmFjayhjb2RlOiBzdHJpbmcsIHN0YXRlOiBzdHJpbmcsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwZW5kaW5nID0gYXdhaXQgZ2V0T0F1dGhTdGF0ZShzdGF0ZSk7XG4gICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICBsb2dnZXIud2FybihcIm9hdXRoIGNhbGxiYWNrOiBpbnZhbGlkX3N0YXRlXCIpO1xuICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KFwiLz9vYXV0aD1lcnJvciZyZWFzb249aW52YWxpZF9zdGF0ZVwiKTtcbiAgICB9XG4gICAgYXdhaXQgZGVsZXRlT0F1dGhTdGF0ZShzdGF0ZSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdG9rZW5zID0gYXdhaXQgZXhjaGFuZ2VDb2RlRm9yVG9rZW5zKFxuICAgICAgICBjb2RlLFxuICAgICAgICBwZW5kaW5nLmNvZGVWZXJpZmllcixcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHBlbmRpbmcucmVkaXJlY3RVcmksXG4gICAgICApO1xuXG4gICAgICBpZiAodG9rZW5zLmFjY291bnRVdWlkKSB7XG4gICAgICAgIGNvbnN0IG9sZEVudHJpZXMgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRCeUFjY291bnRJZGVudGlmaWVyKFxuICAgICAgICAgIFwiQVwiLFxuICAgICAgICAgIFwiYW50aHJvcGljXCIsXG4gICAgICAgICAgdG9rZW5zLmFjY291bnRVdWlkLFxuICAgICAgICApO1xuICAgICAgICBpZiAob2xkRW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgVG9rZW5Nb2RlbC5kZWwob2xkRW50cmllcy5tYXAoKG8pID0+IG8uaWQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIsXG4gICAgICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiB0b2tlbnMuYWNjZXNzVG9rZW4sXG4gICAgICAgICAgICByZWZyZXNoVG9rZW46IHRva2Vucy5yZWZyZXNoVG9rZW4sXG4gICAgICAgICAgICBleHBpcmVzQXQ6IHRva2Vucy5leHBpcmVzQXQgPz8gMCxcbiAgICAgICAgICAgIGFjY291bnRVdWlkOiB0b2tlbnMuYWNjb3VudFV1aWQgPz8gXCJcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5hbWU6IHBlbmRpbmcubmFtZSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuXG4gICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoYC8/b2F1dGg9c3VjY2VzcyZuYW1lPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBlbmRpbmcubmFtZSl9YCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KGAvP29hdXRoPWVycm9yJnJlYXNvbj0ke2VuY29kZVVSSUNvbXBvbmVudCgoZSBhcyBFcnJvcikubWVzc2FnZSl9YCk7XG4gICAgfVxuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIG9hdXRoU3RhcnRPcGVuQUkobmFtZTogc3RyaW5nKTogUHJvbWlzZTxPQXV0aFN0YXJ0UmVzdWx0PiB7XG4gICAgaWYgKCFRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcikgdGhyb3cgbmV3IEVycm9yKFwiT3BlbkFJIGRpc3BhdGNoZXIgbm90IGluaXRpYWxpemVkXCIpO1xuICAgIGNvbnN0IHsgYXV0aFVybCB9ID0gYXdhaXQgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIuc3RhcnRCcm93c2VyTG9naW4obmFtZSk7XG5cbiAgICAvLyBmaXJlLWFuZC1mb3JnZXQ6IGNvZGV4IGxvZ2luIOyZhOujjCDrjIDquLAg4oaSIO2GoO2BsCDsoIDsnqVcbiAgICBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlclxuICAgICAgLmNvbXBsZXRlQnJvd3NlckxvZ2luKClcbiAgICAgIC50aGVuKGFzeW5jIChjcmVkcykgPT4ge1xuICAgICAgICBpZiAoY3JlZHMuYWNjb3VudElkKSB7XG4gICAgICAgICAgY29uc3Qgb2xkRW50cmllcyA9IGF3YWl0IFRva2VuTW9kZWwuZmluZEJ5QWNjb3VudElkZW50aWZpZXIoXG4gICAgICAgICAgICBcIkFcIixcbiAgICAgICAgICAgIFwib3BlbmFpXCIsXG4gICAgICAgICAgICBjcmVkcy5hY2NvdW50SWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAob2xkRW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhd2FpdCBUb2tlbk1vZGVsLmRlbChvbGRFbnRyaWVzLm1hcCgobykgPT4gby5pZCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGVyOiBcIm9wZW5haVwiLFxuICAgICAgICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgICAgICAgYWNjZXNzVG9rZW46IGNyZWRzLmFjY2Vzc1Rva2VuLFxuICAgICAgICAgICAgICByZWZyZXNoVG9rZW46IGNyZWRzLnJlZnJlc2hUb2tlbixcbiAgICAgICAgICAgICAgaWRUb2tlbjogY3JlZHMuaWRUb2tlbixcbiAgICAgICAgICAgICAgYWNjZXNzVG9rZW5FeHBpcmVzQXQ6IERhdGUubm93KCkgKyAxMCAqIDI0ICogMzYwMCAqIDEwMDAsXG4gICAgICAgICAgICAgIGFjY291bnRJZDogY3JlZHMuYWNjb3VudElkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBPcGVuQUkgdG9rZW4gc2F2ZWQgZm9yICR7bmFtZX1gKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYE9wZW5BSSBicm93c2VyIGxvZ2luIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgYXV0aFVybCB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgdXNhZ2UodG9rZW5JZD86IG51bWJlcik6IFByb21pc2U8VXNhZ2VSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgcm93czogYWxsVG9rZW5zIH0gPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRNYW55KFwiQVwiKTtcbiAgICBjb25zdCBlbnRyeSA9IHRva2VuSWRcbiAgICAgID8gYWxsVG9rZW5zLmZpbmQoKGUpID0+IGUuaWQgPT09IHRva2VuSWQpXG4gICAgICA6IGFsbFRva2Vucy5maW5kTGFzdCgoZSkgPT4gZS5hY3RpdmUgJiYgZS5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIik7XG5cbiAgICBpZiAoIWVudHJ5KSByZXR1cm4geyBlcnJvcjogXCJOT1RfRk9VTkRcIiB9O1xuXG4gICAgaWYgKGVudHJ5LnByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByYXcgPSAoYXdhaXQgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXI/LmdldFJhdGVMaW1pdHMoZW50cnkubmFtZSkpIGFzIHtcbiAgICAgICAgICByYXRlTGltaXRzPzoge1xuICAgICAgICAgICAgcHJpbWFyeT86IHsgdXNlZFBlcmNlbnQ6IG51bWJlcjsgd2luZG93RHVyYXRpb25NaW5zOiBudW1iZXI7IHJlc2V0c0F0OiBudW1iZXIgfTtcbiAgICAgICAgICAgIHNlY29uZGFyeT86IHsgdXNlZFBlcmNlbnQ6IG51bWJlcjsgd2luZG93RHVyYXRpb25NaW5zOiBudW1iZXI7IHJlc2V0c0F0OiBudW1iZXIgfTtcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBybCA9IHJhdz8ucmF0ZUxpbWl0cztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgICBmaXZlSG91cjogcmw/LnByaW1hcnlcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIHV0aWxpemF0aW9uOiBybC5wcmltYXJ5LnVzZWRQZXJjZW50LFxuICAgICAgICAgICAgICAgIHJlc2V0c0F0OiBuZXcgRGF0ZShybC5wcmltYXJ5LnJlc2V0c0F0ICogMTAwMCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgIHNldmVuRGF5OiBybD8uc2Vjb25kYXJ5XG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICB1dGlsaXphdGlvbjogcmwuc2Vjb25kYXJ5LnVzZWRQZXJjZW50LFxuICAgICAgICAgICAgICAgIHJlc2V0c0F0OiBuZXcgRGF0ZShybC5zZWNvbmRhcnkucmVzZXRzQXQgKiAxMDAwKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBgT3BlbkFJIHVzYWdlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5LnByb3ZpZGVyICE9PSBcImFudGhyb3BpY1wiKSB7XG4gICAgICByZXR1cm4geyBlcnJvcjogYHVzYWdlIEFQSSBub3Qgc3VwcG9ydGVkIGZvciBwcm92aWRlcjogJHtlbnRyeS5wcm92aWRlcn1gIH07XG4gICAgfVxuXG4gICAgbGV0IGFjY2Vzc1Rva2VuID0gZ2V0QWNjZXNzVG9rZW4oZW50cnkuY3JlZGVudGlhbHMpO1xuICAgIGNvbnN0IGlzRXhwaXJlZCA9IGdldEV4cGlyZXNBdChlbnRyeS5jcmVkZW50aWFscykgPCBEYXRlLm5vdygpO1xuXG4gICAgaWYgKGlzRXhwaXJlZCAmJiBnZXRSZWZyZXNoVG9rZW4oZW50cnkuY3JlZGVudGlhbHMpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhY2Nlc3NUb2tlbiA9IGF3YWl0IHRoaXMucmVmcmVzaFRva2VuKGVudHJ5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgb2F1dGhMb2dnZXIud2FybihgcmVmcmVzaCBmYWlsZWQgZm9yICR7ZW50cnkubmFtZX06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBcInJlLWxvZ2luIHJlcXVpcmVkXCIgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByYXcgPSBhd2FpdCBmZXRjaFVzYWdlKGFjY2Vzc1Rva2VuKTtcbiAgICBpZiAocmF3LmVycm9yICYmIGdldFJlZnJlc2hUb2tlbihlbnRyeS5jcmVkZW50aWFscykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFjY2Vzc1Rva2VuID0gYXdhaXQgdGhpcy5yZWZyZXNoVG9rZW4oZW50cnkpO1xuICAgICAgICBjb25zdCByZXRyaWVkID0gYXdhaXQgZmV0Y2hVc2FnZShhY2Nlc3NUb2tlbik7XG4gICAgICAgIGlmIChyZXRyaWVkLmVycm9yKSByZXR1cm4geyBlcnJvcjogcmV0cmllZC5lcnJvciB9O1xuICAgICAgICByZXR1cm4gY29udmVydEFudGhyb3BpY1VzYWdlKHJldHJpZWQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBvYXV0aExvZ2dlci53YXJuKGByZWZyZXNoIGZhaWxlZCBmb3IgJHtlbnRyeS5uYW1lfTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IFwicmUtbG9naW4gcmVxdWlyZWRcIiB9O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmF3LmVycm9yKSByZXR1cm4geyBlcnJvcjogcmF3LmVycm9yIH07XG4gICAgcmV0dXJuIGNvbnZlcnRBbnRocm9waWNVc2FnZShyYXcpO1xuICB9XG5cbiAgYXN5bmMgcmVmcmVzaFRva2VuKHRva2VuOiBUb2tlblN1YnNldEEpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGNyZWRzID0gdG9rZW4uY3JlZGVudGlhbHM7XG4gICAgY29uc3QgcnQgPSBnZXRSZWZyZXNoVG9rZW4oY3JlZHMpO1xuICAgIGlmICghcnQpIHRocm93IG5ldyBFcnJvcihcIk5vIHJlZnJlc2ggdG9rZW5cIik7XG4gICAgY29uc3QgcmVmcmVzaGVkID0gYXdhaXQgcmVmcmVzaEFjY2Vzc1Rva2VuKHJ0KTtcbiAgICBjb25zdCB1cGRhdGVkID0gVG9rZW5DcmVkZW50aWFscy5wYXJzZSh7XG4gICAgICAuLi5jcmVkcyxcbiAgICAgIGFjY2Vzc1Rva2VuOiByZWZyZXNoZWQuYWNjZXNzVG9rZW4sXG4gICAgICByZWZyZXNoVG9rZW46IHJlZnJlc2hlZC5yZWZyZXNoVG9rZW4sXG4gICAgICBleHBpcmVzQXQ6IHJlZnJlc2hlZC5leHBpcmVzQXQsXG4gICAgfSk7XG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5zYXZlKFtcbiAgICAgIHtcbiAgICAgICAgaWQ6IHRva2VuLmlkLFxuICAgICAgICBwcm92aWRlcjogdG9rZW4ucHJvdmlkZXIsXG4gICAgICAgIGNyZWRlbnRpYWxzOiB1cGRhdGVkLFxuICAgICAgICBuYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgfSxcbiAgICBdKTtcbiAgICByZXR1cm4gcmVmcmVzaGVkLmFjY2Vzc1Rva2VuO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgaGVhbHRoKCk6IFByb21pc2U8SGVhbHRoUmVzcG9uc2U+IHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiBcIm9rXCIsXG4gICAgICBhY3RpdmVUb2tlbnM6IFFncmlkRGlzcGF0Y2hlci50b2tlbnMuc2l6ZSxcbiAgICAgIHN1YnNjcmliZXI6IFFncmlkRGlzcGF0Y2hlci5zdWJzY3JpYmVyPy5zdGF0dXMoKSA/PyBudWxsLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFFncmlkRnJhbWUgPSBuZXcgUWdyaWRGcmFtZUNsYXNzKCk7XG5cbmZ1bmN0aW9uIGNvbnZlcnRBbnRocm9waWNVc2FnZShyYXc6IEFudGhyb3BpY1VzYWdlUmF3KTogVXNhZ2VSZXNwb25zZSB7XG4gIHJldHVybiB7XG4gICAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIsXG4gICAgZml2ZUhvdXI6IHJhdy5maXZlX2hvdXJcbiAgICAgID8geyB1dGlsaXphdGlvbjogcmF3LmZpdmVfaG91ci51dGlsaXphdGlvbiwgcmVzZXRzQXQ6IHJhdy5maXZlX2hvdXIucmVzZXRzX2F0IH1cbiAgICAgIDogbnVsbCxcbiAgICBzZXZlbkRheTogcmF3LnNldmVuX2RheVxuICAgICAgPyB7IHV0aWxpemF0aW9uOiByYXcuc2V2ZW5fZGF5LnV0aWxpemF0aW9uLCByZXNldHNBdDogcmF3LnNldmVuX2RheS5yZXNldHNfYXQgfVxuICAgICAgOiBudWxsLFxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQTZDQSxNQUFNLGlDQUFpQixJQUFJLEtBQXlCO0FBR3BELE1BQU0scUJBQXFCO0FBQzNCLE1BQU0sa0JBQWtCO0FBRXhCLGVBQWUsY0FBYyxP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