@cartanova/qgrid-cli 2.4.0 → 2.4.2

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 (40) hide show
  1. package/bundle/dist/application/qgrid/conv-routing.js +21 -1
  2. package/bundle/dist/application/qgrid/qgrid-response-format.js +50 -3
  3. package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +3 -14
  4. package/bundle/dist/application/qgrid/qgrid.frame.js +3 -14
  5. package/bundle/dist/application/qgrid/qgrid.types.js +11 -2
  6. package/bundle/dist/application/sonamu.generated.js +11 -3
  7. package/bundle/dist/application/sonamu.generated.sso.js +9 -2
  8. package/bundle/src/application/qgrid/conv-routing.test.ts +31 -0
  9. package/bundle/src/application/qgrid/conv-routing.ts +13 -0
  10. package/bundle/src/application/qgrid/qgrid-response-format.test.ts +77 -0
  11. package/bundle/src/application/qgrid/qgrid-response-format.ts +79 -6
  12. package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +11 -21
  13. package/bundle/src/application/qgrid/qgrid.frame.test.ts +36 -0
  14. package/bundle/src/application/qgrid/qgrid.frame.ts +14 -22
  15. package/bundle/src/application/qgrid/qgrid.types.ts +14 -0
  16. package/bundle/src/application/request-log-step/request-log-step.entity.json +2 -1
  17. package/bundle/src/application/sonamu.generated.http +18 -0
  18. package/bundle/src/application/sonamu.generated.sso.ts +7 -0
  19. package/bundle/src/application/sonamu.generated.ts +7 -1
  20. package/bundle/web-dist/client/assets/{index-DVdnvcvo.js → index-CN7eSKO4.js} +3 -3
  21. package/bundle/web-dist/client/assets/index-Dc-qeEPm.css +1 -0
  22. package/bundle/web-dist/client/assets/logs-NubdF_C_.js +1 -0
  23. package/bundle/web-dist/client/assets/{routes-CvCEcpZ7.js → routes-NKxXqHvs.js} +1 -1
  24. package/bundle/web-dist/client/assets/{show-DWRh--ML.js → show-BvDjIZCX.js} +3 -3
  25. package/bundle/web-dist/client/assets/{tokens-DOu_ZFUL.js → tokens-XAhJyLqj.js} +1 -1
  26. package/bundle/web-dist/client/index.html +2 -2
  27. package/bundle/web-dist/server/assets/{logs-B_ZLzpwY.js → logs-Bk9C0ELo.js} +1 -0
  28. package/bundle/web-dist/server/assets/{show-CGlX9OYt.js → show-3GokIDEJ.js} +94 -12
  29. package/bundle/web-dist/server/entry-server.generated.js +3 -3
  30. package/package.json +1 -1
  31. package/postinstall.mjs +14 -2
  32. package/skills/qgrid/references/ai-sdk-provider-contract.md +4 -0
  33. package/skills/qgrid/references/decision-rationale.md +2 -2
  34. package/skills/qgrid/references/openai-codex-runtime.md +2 -0
  35. package/skills/qgrid/references/request-log-run-lifecycle.md +2 -0
  36. package/skills/qgrid/references/sonamu-api-web-flow.md +2 -0
  37. package/skills/qgrid/references/tool-calling-and-multiturn.md +7 -5
  38. package/skills/qgrid/references/verification-and-debugging.md +4 -0
  39. package/bundle/web-dist/client/assets/index-VE_24EJf.css +0 -1
  40. package/bundle/web-dist/client/assets/logs-B82PGnxD.js +0 -1
@@ -44,6 +44,26 @@ function buildDeltaInput(input) {
44
44
  text: toolResultsToText(input.toolResults),
45
45
  text_elements: []
46
46
  }];
47
+ if (input.input && input.input.length > 0) {
48
+ const hasText = input.input.some((part) => part.type === "text");
49
+ const parts = input.input.map((part) => {
50
+ if (part.type === "text") return {
51
+ type: "text",
52
+ text: part.text,
53
+ text_elements: part.text_elements
54
+ };
55
+ return {
56
+ type: "image",
57
+ url: part.url
58
+ };
59
+ });
60
+ if (!hasText && input.prompt.length > 0) return [{
61
+ type: "text",
62
+ text: input.prompt,
63
+ text_elements: []
64
+ }, ...parts];
65
+ return parts;
66
+ }
47
67
  return [{
48
68
  type: "text",
49
69
  text: input.prompt,
@@ -61,4 +81,4 @@ function issueConvContext(threadCoord, decision) {
61
81
  //#endregion
62
82
  export { decideConvRouting, issueConvContext, systemHash };
63
83
 
64
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udi1yb3V0aW5nLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHBsaWNhdGlvbi9xZ3JpZC9jb252LXJvdXRpbmcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBjb252LXJvdXRpbmcg4oCUIGNvbnZlcnNhdGlvbig9Y29kZXggdGhyZWFkKSDsnqzsgqzsmqnsnYQg7JyE7ZWcIHRocmVhZCDsooztkZwg6rKA7KadL+q1rOyEsS5cbiAqXG4gKiDrqqntkZw6IHRocmVhZCg9Y29udmVyc2F0aW9uX2lkPXByb21wdF9jYWNoZV9rZXkp66W8IOyerOyCrOyaqe2VtCBPcGVuQUkgcHJvbXB0IGNhY2hpbmcg7KCB7KSRLlxuICogLSDtm4Tsho0gdHVybjog6riw7KG0IHRocmVhZCDsl5AgZGVsdGEo66eI7KeA66eJIHVzZXIgLyB0b29sIOqysOqzvCnrp4wg67O064OEIChoaXN0b3J5IGluamVjdCDsl4bsnYwpLlxuICogLSDssqsgdHVybiAvIOqygOymnSDsi6TtjKg6IOyDiCB0aHJlYWQgKyBoaXN0b3J5IGluamVjdCAo7Y+067CxLCDsoJXtmZXshLEg67O07KG0KS5cbiAqXG4gKiDsi53rs4Q6IOyEnOuyhCDrsJzquIkg67aI7Yis66qFIHRocmVhZCDsooztkZwoUWdyaWRUaHJlYWRDb29yZCnrpbwg7YG065286rCAIOq3uOuMgOuhnCDtmozshqEuXG4gKiDqsoDspp06IHN5c3RlbUhhc2go64uk66W4IOuMgO2ZlCDsmKTsoJHsho0g7LCo64uoKSArIChkaXNwYXRjaGVy7J2YKSBlcG9jaC93b3JrZXIg7IOd7KG0LlxuICovXG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmltcG9ydCB7IHR5cGUgSnNvblZhbHVlIH0gZnJvbSBcIi4uLy4uL2NvZGV4LXByb3RvY29sL3NlcmRlX2pzb24vSnNvblZhbHVlXCI7XG5pbXBvcnQgeyB0eXBlIFVzZXJJbnB1dCB9IGZyb20gXCIuLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Vc2VySW5wdXRcIjtcbmltcG9ydCB7IHR5cGUgUmV1c2VUaHJlYWRDb29yZCB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IHR5cGUgUWdyaWRUaHJlYWRDb29yZCwgdHlwZSBRdWVyeUlucHV0LCB0eXBlIFFncmlkVG9vbFJlc3VsdElucHV0IH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHN5c3RlbUhhc2goc3lzdGVtPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyZWF0ZUhhc2goXCJzaGEyNTZcIilcbiAgICAudXBkYXRlKHN5c3RlbSA/PyBcIlwiKVxuICAgIC5kaWdlc3QoXCJoZXhcIilcbiAgICAuc2xpY2UoMCwgMTYpO1xufVxuXG4vLyB0b29sIOqysOqzvOulvCDri6TsnYwgdHVybiDsnZggaW5wdXQgdGV4dCDroZwg67OA7ZmYIChjb2RleCB0dXJuL3N0YXJ0LmlucHV0IOydgCBVc2VySW5wdXQg66eMIOuwm+ydjCkuXG5mdW5jdGlvbiB0b29sUmVzdWx0c1RvVGV4dCh0b29sUmVzdWx0czogUWdyaWRUb29sUmVzdWx0SW5wdXRbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzID0gdG9vbFJlc3VsdHMubWFwKCh0cikgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSB0ci50b29sTmFtZSA/IGAgKCR7dHIudG9vbE5hbWV9KWAgOiBcIlwiO1xuICAgIGNvbnN0IGVyck1hcmsgPSB0ci5pc0Vycm9yID8gXCIgW2Vycm9yXVwiIDogXCJcIjtcbiAgICByZXR1cm4gYFRvb2wgcmVzdWx0IGZvciBjYWxsICR7dHIudG9vbENhbGxJZH0ke25hbWV9JHtlcnJNYXJrfTogJHt0ci5vdXRwdXR9YDtcbiAgfSk7XG4gIHJldHVybiBgJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcblxcbk5vdyBjb250aW51ZSBhbnN3ZXJpbmcgdGhlIHVzZXIncyByZXF1ZXN0IHVzaW5nIHRoZXNlIHJlc3VsdHMuYDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb252RGVjaXNpb24ge1xuICAvLyBkaXNwYXRjaGVyIOuhnCDrhJjquLggcmV1c2Ug7KKM7ZGcICjqsoDspp0g7Ya16rO8IOyLnOyXkOunjCkuIGRpc3BhdGNoZXIg6rCAIGVwb2NoL3dvcmtlciDsg53sobQg7J6s6rKA7KadIO2bhCDtj7TrsLEg6rCA64qlLlxuICByZXVzZT86IFJldXNlVGhyZWFkQ29vcmQ7XG4gIC8vIOyerOyCrOyaqSDshLHqs7Ug7IucIHR1cm4vc3RhcnQg7JeQIOuztOuCvCBpbnB1dCDigJQgZGVsdGEo66eI7KeA66eJIHVzZXIvdG9vbCDqsrDqs7wp66eMLiByZXVzZSDqsIAg7J6I7J2EIOuVjOunjCDshKTsoJUuXG4gIHJldXNlSW5wdXQ/OiBBcnJheTxVc2VySW5wdXQ+O1xuICAvLyDssqsgdHVybiAvIOyerOyCrOyaqSDtj7TrsLEg7IucIOuztOuCvCBpbnB1dCDigJQg7KCE7LK0IHByb21wdC4g7ZWt7IOBIOyEpOyglSjtj7TrsLEg7JWI7KCE66edKS5cbiAgY29sZElucHV0OiBBcnJheTxVc2VySW5wdXQ+O1xuICAvLyDsg4ggdGhyZWFkIOydvCDrlYwgaW5qZWN0IO2VoCDsoITssrQgaGlzdG9yeS4g7J6s7IKs7JqpIOyEseqztSDsi5zsl5QgZGlzcGF0Y2hlciDqsIAg7JWIIOyTtOuLpCh0aHJlYWQg6rCAIOydtOuvuCDriITsoIEpLlxuICBjb2xkSGlzdG9yeT86IEFycmF5PEpzb25WYWx1ZT47XG4gIC8vIOydtCDsmpTssq0g7Iuc7KCQ7J2YIHN5c3RlbSDtlbTsi5wgKOydkeuLteyXkOyEnCB0aHJlYWQg7KKM7ZGcIOuwnOq4iSDsi5wg7IKs7JqpKS5cbiAgc3lzdGVtSGFzaDogc3RyaW5nO1xufVxuXG4vLyB0aHJlYWQg7KKM7ZGcICsg65Ok7Ja07JioIOyalOyyreycvOuhnCBcIuyerOyCrOyaqSDqsIDriqXtlZzqsIBcIuulvCDtjJDsoJXtlZjqs6AsIHJldXNlL2NvbGQg7JaR7Kq9IHBheWxvYWQg66W8IOq1rOyEse2VnOuLpC5cbi8vIGRpc3BhdGNoZXIg64uo7J2YIGVwb2NoL3dvcmtlciDsg53sobQg6rKA7Kad7J2AIOyXrOq4sOyEnCDrqrsg7ZWY66+A66GcKOyDge2DnCDsl4bsnYwpIHJldXNlIOyijO2RnCArIOuRkCBwYXlsb2FkIOulvFxuLy8g66qo65GQIOuEmOq4sOqzoCwgZGlzcGF0Y2hlciDsnZggYWNxdWlyZVJldXNlV29ya2VyIOqysOqzvOyXkCDrlLDrnbwgcmV1c2UoZGVsdGEpIOuYkOuKlCBjb2xkKOyghOyytCkg66W8IOqzoOuluOuLpC5cbi8vIOyWkeyqveydhCDri6Qg65Ok6rOgIOqwgOyVvCByZXVzZSDqsIAg7Iuk7Yyo66GcIO2PtOuwseuPvOuPhCDsoITssrQgaGlzdG9yeSDroZwg66y466el7J2EIOuzteq1rO2VoCDsiJgg7J6I64ukLlxuZXhwb3J0IGZ1bmN0aW9uIGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0OiBRdWVyeUlucHV0KTogQ29udkRlY2lzaW9uIHtcbiAgY29uc3Qgc3lzSGFzaCA9IHN5c3RlbUhhc2goaW5wdXQuc3lzdGVtKTtcbiAgY29uc3QgaGlzdG9yeTogQXJyYXk8SnNvblZhbHVlPiB8IHVuZGVmaW5lZCA9IGlucHV0Lmhpc3RvcnlcbiAgICA/IChKU09OLnBhcnNlKGlucHV0Lmhpc3RvcnkpIGFzIEFycmF5PEpzb25WYWx1ZT4pXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgY29vcmQgPSBpbnB1dC5ydW5Db250ZXh0Py50aHJlYWRDb29yZDtcblxuICAvLyDsnqzsgqzsmqkg7J6Q6rKpOiDsooztkZwg7KG07J6sICsgc3lzdGVtIOuPmeydvC4gc2Vzc2lvbktleSDqsqnrpqwgKyBzeXN0ZW1IYXNoIOuhnCDrjIDtmZQg64+Z7J287ISx7J20XG4gIC8vIOuztOyepeuQmOqzoCwg6rO17Ya1IHByZWZpeCDripQgY29kZXgg6rCAIHByb21wdF9jYWNoZV9rZXkg6rOg7KCV7Jy866GcIOyVjOyVhOyEnCDsupDsi5ztlZzri6QuXG4gIGNvbnN0IGVsaWdpYmxlID0gY29vcmQgIT09IHVuZGVmaW5lZCAmJiBjb29yZC5zeXN0ZW1IYXNoID09PSBzeXNIYXNoO1xuXG4gIHJldHVybiB7XG4gICAgcmV1c2U6XG4gICAgICBlbGlnaWJsZSAmJiBjb29yZFxuICAgICAgICA/IHsgd29ya2VySWQ6IGNvb3JkLndvcmtlcklkLCB0aHJlYWRJZDogY29vcmQudGhyZWFkSWQsIGVwb2NoOiBjb29yZC5lcG9jaCB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIC8vIOyerOyCrOyaqSB0dXJuIOydgCBkZWx0YSjrp4jsp4Drp4kgdXNlci90b29sIOqysOqzvCnrp4wg4oCUIHRocmVhZCDqsIAg7J2066+4IOydtOyghCB0dXJuIOuTpOydhCDriITsoIEuXG4gICAgcmV1c2VJbnB1dDogZWxpZ2libGUgPyBidWlsZERlbHRhSW5wdXQoaW5wdXQpIDogdW5kZWZpbmVkLFxuICAgIC8vIOyyqyB0dXJuIC8g7Y+067CxOiDsoITssrQgcHJvbXB0ICsgaGlzdG9yeSBpbmplY3QuIHRvb2wg6rKw6rO8IGZvbGxvdy11cCDsnbQgY29sZCDroZwg65ao7Ja07KC464+EXG4gICAgLy8g7Iuk7ZaJIHVzZXIg7KSE7JeQ64qUIFwi7J20IOqysOqzvOuhnCDqs4Tsho0g64u17ZWY6528XCLripQgY29udGludWF0aW9uIOydtCDrk6TslrTqsIDslbwg7ZWc64ukLlxuICAgIGNvbGRJbnB1dDogYnVpbGREZWx0YUlucHV0KGlucHV0KSxcbiAgICBjb2xkSGlzdG9yeTogaGlzdG9yeSxcbiAgICBzeXN0ZW1IYXNoOiBzeXNIYXNoLFxuICB9O1xufVxuXG4vLyDtm4Tsho0gdHVybiDsnZggaW5wdXQ6IHRvb2wg6rKw6rO86rCAIOyeiOycvOuptCDqt7jqsbggdGV4dCDroZwsIOyXhuycvOuptCDrp4jsp4Drp4kgdXNlcihwcm9tcHQpLlxuZnVuY3Rpb24gYnVpbGREZWx0YUlucHV0KGlucHV0OiBRdWVyeUlucHV0KTogQXJyYXk8VXNlcklucHV0PiB7XG4gIGlmIChpbnB1dC50b29sUmVzdWx0cyAmJiBpbnB1dC50b29sUmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiB0b29sUmVzdWx0c1RvVGV4dChpbnB1dC50b29sUmVzdWx0cyksIHRleHRfZWxlbWVudHM6IFtdIH1dO1xuICB9XG4gIHJldHVybiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogaW5wdXQucHJvbXB0LCB0ZXh0X2VsZW1lbnRzOiBbXSB9XTtcbn1cblxuLy8g7J2R64u1IHRocmVhZENvb3JkICsg7JqU7LKtIOyLnOygkCDsoJXrs7TroZwg64uk7J2MIHRocmVhZCDsooztkZzrpbwg67Cc6riJ7ZWc64ukLlxuZXhwb3J0IGZ1bmN0aW9uIGlzc3VlQ29udkNvbnRleHQoXG4gIHRocmVhZENvb3JkOiBSZXVzZVRocmVhZENvb3JkLFxuICBkZWNpc2lvbjogQ29udkRlY2lzaW9uLFxuKTogUWdyaWRUaHJlYWRDb29yZCB7XG4gIHJldHVybiB7XG4gICAgd29ya2VySWQ6IHRocmVhZENvb3JkLndvcmtlcklkLFxuICAgIHRocmVhZElkOiB0aHJlYWRDb29yZC50aHJlYWRJZCxcbiAgICBlcG9jaDogdGhyZWFkQ29vcmQuZXBvY2gsXG4gICAgc3lzdGVtSGFzaDogZGVjaXNpb24uc3lzdGVtSGFzaCxcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQWlCQSxTQUFnQixXQUFXLFFBQXlCO0FBQ2xELFFBQU8sV0FBVyxTQUFTLENBQ3hCLE9BQU8sVUFBVSxHQUFHLENBQ3BCLE9BQU8sTUFBTSxDQUNiLE1BQU0sR0FBRyxHQUFHOztBQUlqQixTQUFTLGtCQUFrQixhQUE2QztBQU10RSxRQUFPLEdBTE8sWUFBWSxLQUFLLE9BQU87RUFDcEMsTUFBTSxPQUFPLEdBQUcsV0FBVyxLQUFLLEdBQUcsU0FBUyxLQUFLO0VBQ2pELE1BQU0sVUFBVSxHQUFHLFVBQVUsYUFBYTtBQUMxQyxTQUFPLHdCQUF3QixHQUFHLGFBQWEsT0FBTyxRQUFRLElBQUksR0FBRztHQUNyRSxDQUNjLEtBQUssS0FBSyxDQUFDOztBQW9CN0IsU0FBZ0Isa0JBQWtCLE9BQWlDO0NBQ2pFLE1BQU0sVUFBVSxXQUFXLE1BQU0sT0FBTztDQUN4QyxNQUFNLFVBQXdDLE1BQU0sVUFDL0MsS0FBSyxNQUFNLE1BQU0sUUFBUSxHQUMxQjtDQUVKLE1BQU0sUUFBUSxNQUFNLFlBQVk7Q0FJaEMsTUFBTSxXQUFXLFVBQVUsVUFBYSxNQUFNLGVBQWU7QUFFN0QsUUFBTztFQUNMLE9BQ0UsWUFBWSxRQUNSO0dBQUUsVUFBVSxNQUFNO0dBQVUsVUFBVSxNQUFNO0dBQVUsT0FBTyxNQUFNO0dBQU8sR0FDMUU7RUFFTixZQUFZLFdBQVcsZ0JBQWdCLE1BQU0sR0FBRztFQUdoRCxXQUFXLGdCQUFnQixNQUFNO0VBQ2pDLGFBQWE7RUFDYixZQUFZO0VBQ2I7O0FBSUgsU0FBUyxnQkFBZ0IsT0FBcUM7QUFDNUQsS0FBSSxNQUFNLGVBQWUsTUFBTSxZQUFZLFNBQVMsRUFDbEQsUUFBTyxDQUFDO0VBQUUsTUFBTTtFQUFRLE1BQU0sa0JBQWtCLE1BQU0sWUFBWTtFQUFFLGVBQWUsRUFBRTtFQUFFLENBQUM7QUFFMUYsUUFBTyxDQUFDO0VBQUUsTUFBTTtFQUFRLE1BQU0sTUFBTTtFQUFRLGVBQWUsRUFBRTtFQUFFLENBQUM7O0FBSWxFLFNBQWdCLGlCQUNkLGFBQ0EsVUFDa0I7QUFDbEIsUUFBTztFQUNMLFVBQVUsWUFBWTtFQUN0QixVQUFVLFlBQVk7RUFDdEIsT0FBTyxZQUFZO0VBQ25CLFlBQVksU0FBUztFQUN0QiJ9
84
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udi1yb3V0aW5nLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHBsaWNhdGlvbi9xZ3JpZC9jb252LXJvdXRpbmcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBjb252LXJvdXRpbmcg4oCUIGNvbnZlcnNhdGlvbig9Y29kZXggdGhyZWFkKSDsnqzsgqzsmqnsnYQg7JyE7ZWcIHRocmVhZCDsooztkZwg6rKA7KadL+q1rOyEsS5cbiAqXG4gKiDrqqntkZw6IHRocmVhZCg9Y29udmVyc2F0aW9uX2lkPXByb21wdF9jYWNoZV9rZXkp66W8IOyerOyCrOyaqe2VtCBPcGVuQUkgcHJvbXB0IGNhY2hpbmcg7KCB7KSRLlxuICogLSDtm4Tsho0gdHVybjog6riw7KG0IHRocmVhZCDsl5AgZGVsdGEo66eI7KeA66eJIHVzZXIgLyB0b29sIOqysOqzvCnrp4wg67O064OEIChoaXN0b3J5IGluamVjdCDsl4bsnYwpLlxuICogLSDssqsgdHVybiAvIOqygOymnSDsi6TtjKg6IOyDiCB0aHJlYWQgKyBoaXN0b3J5IGluamVjdCAo7Y+067CxLCDsoJXtmZXshLEg67O07KG0KS5cbiAqXG4gKiDsi53rs4Q6IOyEnOuyhCDrsJzquIkg67aI7Yis66qFIHRocmVhZCDsooztkZwoUWdyaWRUaHJlYWRDb29yZCnrpbwg7YG065286rCAIOq3uOuMgOuhnCDtmozshqEuXG4gKiDqsoDspp06IHN5c3RlbUhhc2go64uk66W4IOuMgO2ZlCDsmKTsoJHsho0g7LCo64uoKSArIChkaXNwYXRjaGVy7J2YKSBlcG9jaC93b3JrZXIg7IOd7KG0LlxuICovXG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmltcG9ydCB7IHR5cGUgSnNvblZhbHVlIH0gZnJvbSBcIi4uLy4uL2NvZGV4LXByb3RvY29sL3NlcmRlX2pzb24vSnNvblZhbHVlXCI7XG5pbXBvcnQgeyB0eXBlIFVzZXJJbnB1dCB9IGZyb20gXCIuLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Vc2VySW5wdXRcIjtcbmltcG9ydCB7IHR5cGUgUmV1c2VUaHJlYWRDb29yZCB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IHR5cGUgUWdyaWRUaHJlYWRDb29yZCwgdHlwZSBRdWVyeUlucHV0LCB0eXBlIFFncmlkVG9vbFJlc3VsdElucHV0IH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHN5c3RlbUhhc2goc3lzdGVtPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyZWF0ZUhhc2goXCJzaGEyNTZcIilcbiAgICAudXBkYXRlKHN5c3RlbSA/PyBcIlwiKVxuICAgIC5kaWdlc3QoXCJoZXhcIilcbiAgICAuc2xpY2UoMCwgMTYpO1xufVxuXG4vLyB0b29sIOqysOqzvOulvCDri6TsnYwgdHVybiDsnZggaW5wdXQgdGV4dCDroZwg67OA7ZmYIChjb2RleCB0dXJuL3N0YXJ0LmlucHV0IOydgCBVc2VySW5wdXQg66eMIOuwm+ydjCkuXG5mdW5jdGlvbiB0b29sUmVzdWx0c1RvVGV4dCh0b29sUmVzdWx0czogUWdyaWRUb29sUmVzdWx0SW5wdXRbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzID0gdG9vbFJlc3VsdHMubWFwKCh0cikgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSB0ci50b29sTmFtZSA/IGAgKCR7dHIudG9vbE5hbWV9KWAgOiBcIlwiO1xuICAgIGNvbnN0IGVyck1hcmsgPSB0ci5pc0Vycm9yID8gXCIgW2Vycm9yXVwiIDogXCJcIjtcbiAgICByZXR1cm4gYFRvb2wgcmVzdWx0IGZvciBjYWxsICR7dHIudG9vbENhbGxJZH0ke25hbWV9JHtlcnJNYXJrfTogJHt0ci5vdXRwdXR9YDtcbiAgfSk7XG4gIHJldHVybiBgJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcblxcbk5vdyBjb250aW51ZSBhbnN3ZXJpbmcgdGhlIHVzZXIncyByZXF1ZXN0IHVzaW5nIHRoZXNlIHJlc3VsdHMuYDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb252RGVjaXNpb24ge1xuICAvLyBkaXNwYXRjaGVyIOuhnCDrhJjquLggcmV1c2Ug7KKM7ZGcICjqsoDspp0g7Ya16rO8IOyLnOyXkOunjCkuIGRpc3BhdGNoZXIg6rCAIGVwb2NoL3dvcmtlciDsg53sobQg7J6s6rKA7KadIO2bhCDtj7TrsLEg6rCA64qlLlxuICByZXVzZT86IFJldXNlVGhyZWFkQ29vcmQ7XG4gIC8vIOyerOyCrOyaqSDshLHqs7Ug7IucIHR1cm4vc3RhcnQg7JeQIOuztOuCvCBpbnB1dCDigJQgZGVsdGEo66eI7KeA66eJIHVzZXIvdG9vbCDqsrDqs7wp66eMLiByZXVzZSDqsIAg7J6I7J2EIOuVjOunjCDshKTsoJUuXG4gIHJldXNlSW5wdXQ/OiBBcnJheTxVc2VySW5wdXQ+O1xuICAvLyDssqsgdHVybiAvIOyerOyCrOyaqSDtj7TrsLEg7IucIOuztOuCvCBpbnB1dCDigJQg7KCE7LK0IHByb21wdC4g7ZWt7IOBIOyEpOyglSjtj7TrsLEg7JWI7KCE66edKS5cbiAgY29sZElucHV0OiBBcnJheTxVc2VySW5wdXQ+O1xuICAvLyDsg4ggdGhyZWFkIOydvCDrlYwgaW5qZWN0IO2VoCDsoITssrQgaGlzdG9yeS4g7J6s7IKs7JqpIOyEseqztSDsi5zsl5QgZGlzcGF0Y2hlciDqsIAg7JWIIOyTtOuLpCh0aHJlYWQg6rCAIOydtOuvuCDriITsoIEpLlxuICBjb2xkSGlzdG9yeT86IEFycmF5PEpzb25WYWx1ZT47XG4gIC8vIOydtCDsmpTssq0g7Iuc7KCQ7J2YIHN5c3RlbSDtlbTsi5wgKOydkeuLteyXkOyEnCB0aHJlYWQg7KKM7ZGcIOuwnOq4iSDsi5wg7IKs7JqpKS5cbiAgc3lzdGVtSGFzaDogc3RyaW5nO1xufVxuXG4vLyB0aHJlYWQg7KKM7ZGcICsg65Ok7Ja07JioIOyalOyyreycvOuhnCBcIuyerOyCrOyaqSDqsIDriqXtlZzqsIBcIuulvCDtjJDsoJXtlZjqs6AsIHJldXNlL2NvbGQg7JaR7Kq9IHBheWxvYWQg66W8IOq1rOyEse2VnOuLpC5cbi8vIGRpc3BhdGNoZXIg64uo7J2YIGVwb2NoL3dvcmtlciDsg53sobQg6rKA7Kad7J2AIOyXrOq4sOyEnCDrqrsg7ZWY66+A66GcKOyDge2DnCDsl4bsnYwpIHJldXNlIOyijO2RnCArIOuRkCBwYXlsb2FkIOulvFxuLy8g66qo65GQIOuEmOq4sOqzoCwgZGlzcGF0Y2hlciDsnZggYWNxdWlyZVJldXNlV29ya2VyIOqysOqzvOyXkCDrlLDrnbwgcmV1c2UoZGVsdGEpIOuYkOuKlCBjb2xkKOyghOyytCkg66W8IOqzoOuluOuLpC5cbi8vIOyWkeyqveydhCDri6Qg65Ok6rOgIOqwgOyVvCByZXVzZSDqsIAg7Iuk7Yyo66GcIO2PtOuwseuPvOuPhCDsoITssrQgaGlzdG9yeSDroZwg66y466el7J2EIOuzteq1rO2VoCDsiJgg7J6I64ukLlxuZXhwb3J0IGZ1bmN0aW9uIGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0OiBRdWVyeUlucHV0KTogQ29udkRlY2lzaW9uIHtcbiAgY29uc3Qgc3lzSGFzaCA9IHN5c3RlbUhhc2goaW5wdXQuc3lzdGVtKTtcbiAgY29uc3QgaGlzdG9yeTogQXJyYXk8SnNvblZhbHVlPiB8IHVuZGVmaW5lZCA9IGlucHV0Lmhpc3RvcnlcbiAgICA/IChKU09OLnBhcnNlKGlucHV0Lmhpc3RvcnkpIGFzIEFycmF5PEpzb25WYWx1ZT4pXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgY29vcmQgPSBpbnB1dC5ydW5Db250ZXh0Py50aHJlYWRDb29yZDtcblxuICAvLyDsnqzsgqzsmqkg7J6Q6rKpOiDsooztkZwg7KG07J6sICsgc3lzdGVtIOuPmeydvC4gc2Vzc2lvbktleSDqsqnrpqwgKyBzeXN0ZW1IYXNoIOuhnCDrjIDtmZQg64+Z7J287ISx7J20XG4gIC8vIOuztOyepeuQmOqzoCwg6rO17Ya1IHByZWZpeCDripQgY29kZXgg6rCAIHByb21wdF9jYWNoZV9rZXkg6rOg7KCV7Jy866GcIOyVjOyVhOyEnCDsupDsi5ztlZzri6QuXG4gIGNvbnN0IGVsaWdpYmxlID0gY29vcmQgIT09IHVuZGVmaW5lZCAmJiBjb29yZC5zeXN0ZW1IYXNoID09PSBzeXNIYXNoO1xuXG4gIHJldHVybiB7XG4gICAgcmV1c2U6XG4gICAgICBlbGlnaWJsZSAmJiBjb29yZFxuICAgICAgICA/IHsgd29ya2VySWQ6IGNvb3JkLndvcmtlcklkLCB0aHJlYWRJZDogY29vcmQudGhyZWFkSWQsIGVwb2NoOiBjb29yZC5lcG9jaCB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIC8vIOyerOyCrOyaqSB0dXJuIOydgCBkZWx0YSjrp4jsp4Drp4kgdXNlci90b29sIOqysOqzvCnrp4wg4oCUIHRocmVhZCDqsIAg7J2066+4IOydtOyghCB0dXJuIOuTpOydhCDriITsoIEuXG4gICAgcmV1c2VJbnB1dDogZWxpZ2libGUgPyBidWlsZERlbHRhSW5wdXQoaW5wdXQpIDogdW5kZWZpbmVkLFxuICAgIC8vIOyyqyB0dXJuIC8g7Y+067CxOiDsoITssrQgcHJvbXB0ICsgaGlzdG9yeSBpbmplY3QuIHRvb2wg6rKw6rO8IGZvbGxvdy11cCDsnbQgY29sZCDroZwg65ao7Ja07KC464+EXG4gICAgLy8g7Iuk7ZaJIHVzZXIg7KSE7JeQ64qUIFwi7J20IOqysOqzvOuhnCDqs4Tsho0g64u17ZWY6528XCLripQgY29udGludWF0aW9uIOydtCDrk6TslrTqsIDslbwg7ZWc64ukLlxuICAgIGNvbGRJbnB1dDogYnVpbGREZWx0YUlucHV0KGlucHV0KSxcbiAgICBjb2xkSGlzdG9yeTogaGlzdG9yeSxcbiAgICBzeXN0ZW1IYXNoOiBzeXNIYXNoLFxuICB9O1xufVxuXG4vLyDtm4Tsho0gdHVybiDsnZggaW5wdXQ6IHRvb2wg6rKw6rO86rCAIOyeiOycvOuptCDqt7jqsbggdGV4dCDroZwsIOyXhuycvOuptCDrp4jsp4Drp4kgdXNlcihwcm9tcHQpLlxuZnVuY3Rpb24gYnVpbGREZWx0YUlucHV0KGlucHV0OiBRdWVyeUlucHV0KTogQXJyYXk8VXNlcklucHV0PiB7XG4gIGlmIChpbnB1dC50b29sUmVzdWx0cyAmJiBpbnB1dC50b29sUmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiB0b29sUmVzdWx0c1RvVGV4dChpbnB1dC50b29sUmVzdWx0cyksIHRleHRfZWxlbWVudHM6IFtdIH1dO1xuICB9XG4gIGlmIChpbnB1dC5pbnB1dCAmJiBpbnB1dC5pbnB1dC5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgaGFzVGV4dCA9IGlucHV0LmlucHV0LnNvbWUoKHBhcnQpID0+IHBhcnQudHlwZSA9PT0gXCJ0ZXh0XCIpO1xuICAgIGNvbnN0IHBhcnRzOiBBcnJheTxVc2VySW5wdXQ+ID0gaW5wdXQuaW5wdXQubWFwKChwYXJ0KSA9PiB7XG4gICAgICBpZiAocGFydC50eXBlID09PSBcInRleHRcIikge1xuICAgICAgICByZXR1cm4geyB0eXBlOiBcInRleHRcIiwgdGV4dDogcGFydC50ZXh0LCB0ZXh0X2VsZW1lbnRzOiBwYXJ0LnRleHRfZWxlbWVudHMgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHR5cGU6IFwiaW1hZ2VcIiwgdXJsOiBwYXJ0LnVybCB9O1xuICAgIH0pO1xuICAgIGlmICghaGFzVGV4dCAmJiBpbnB1dC5wcm9tcHQubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiBpbnB1dC5wcm9tcHQsIHRleHRfZWxlbWVudHM6IFtdIH0sIC4uLnBhcnRzXTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzO1xuICB9XG4gIHJldHVybiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogaW5wdXQucHJvbXB0LCB0ZXh0X2VsZW1lbnRzOiBbXSB9XTtcbn1cblxuLy8g7J2R64u1IHRocmVhZENvb3JkICsg7JqU7LKtIOyLnOygkCDsoJXrs7TroZwg64uk7J2MIHRocmVhZCDsooztkZzrpbwg67Cc6riJ7ZWc64ukLlxuZXhwb3J0IGZ1bmN0aW9uIGlzc3VlQ29udkNvbnRleHQoXG4gIHRocmVhZENvb3JkOiBSZXVzZVRocmVhZENvb3JkLFxuICBkZWNpc2lvbjogQ29udkRlY2lzaW9uLFxuKTogUWdyaWRUaHJlYWRDb29yZCB7XG4gIHJldHVybiB7XG4gICAgd29ya2VySWQ6IHRocmVhZENvb3JkLndvcmtlcklkLFxuICAgIHRocmVhZElkOiB0aHJlYWRDb29yZC50aHJlYWRJZCxcbiAgICBlcG9jaDogdGhyZWFkQ29vcmQuZXBvY2gsXG4gICAgc3lzdGVtSGFzaDogZGVjaXNpb24uc3lzdGVtSGFzaCxcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQWlCQSxTQUFnQixXQUFXLFFBQXlCO0FBQ2xELFFBQU8sV0FBVyxTQUFTLENBQ3hCLE9BQU8sVUFBVSxHQUFHLENBQ3BCLE9BQU8sTUFBTSxDQUNiLE1BQU0sR0FBRyxHQUFHOztBQUlqQixTQUFTLGtCQUFrQixhQUE2QztBQU10RSxRQUFPLEdBTE8sWUFBWSxLQUFLLE9BQU87RUFDcEMsTUFBTSxPQUFPLEdBQUcsV0FBVyxLQUFLLEdBQUcsU0FBUyxLQUFLO0VBQ2pELE1BQU0sVUFBVSxHQUFHLFVBQVUsYUFBYTtBQUMxQyxTQUFPLHdCQUF3QixHQUFHLGFBQWEsT0FBTyxRQUFRLElBQUksR0FBRztHQUNyRSxDQUNjLEtBQUssS0FBSyxDQUFDOztBQW9CN0IsU0FBZ0Isa0JBQWtCLE9BQWlDO0NBQ2pFLE1BQU0sVUFBVSxXQUFXLE1BQU0sT0FBTztDQUN4QyxNQUFNLFVBQXdDLE1BQU0sVUFDL0MsS0FBSyxNQUFNLE1BQU0sUUFBUSxHQUMxQjtDQUVKLE1BQU0sUUFBUSxNQUFNLFlBQVk7Q0FJaEMsTUFBTSxXQUFXLFVBQVUsVUFBYSxNQUFNLGVBQWU7QUFFN0QsUUFBTztFQUNMLE9BQ0UsWUFBWSxRQUNSO0dBQUUsVUFBVSxNQUFNO0dBQVUsVUFBVSxNQUFNO0dBQVUsT0FBTyxNQUFNO0dBQU8sR0FDMUU7RUFFTixZQUFZLFdBQVcsZ0JBQWdCLE1BQU0sR0FBRztFQUdoRCxXQUFXLGdCQUFnQixNQUFNO0VBQ2pDLGFBQWE7RUFDYixZQUFZO0VBQ2I7O0FBSUgsU0FBUyxnQkFBZ0IsT0FBcUM7QUFDNUQsS0FBSSxNQUFNLGVBQWUsTUFBTSxZQUFZLFNBQVMsRUFDbEQsUUFBTyxDQUFDO0VBQUUsTUFBTTtFQUFRLE1BQU0sa0JBQWtCLE1BQU0sWUFBWTtFQUFFLGVBQWUsRUFBRTtFQUFFLENBQUM7QUFFMUYsS0FBSSxNQUFNLFNBQVMsTUFBTSxNQUFNLFNBQVMsR0FBRztFQUN6QyxNQUFNLFVBQVUsTUFBTSxNQUFNLE1BQU0sU0FBUyxLQUFLLFNBQVMsT0FBTztFQUNoRSxNQUFNLFFBQTBCLE1BQU0sTUFBTSxLQUFLLFNBQVM7QUFDeEQsT0FBSSxLQUFLLFNBQVMsT0FDaEIsUUFBTztJQUFFLE1BQU07SUFBUSxNQUFNLEtBQUs7SUFBTSxlQUFlLEtBQUs7SUFBZTtBQUU3RSxVQUFPO0lBQUUsTUFBTTtJQUFTLEtBQUssS0FBSztJQUFLO0lBQ3ZDO0FBQ0YsTUFBSSxDQUFDLFdBQVcsTUFBTSxPQUFPLFNBQVMsRUFDcEMsUUFBTyxDQUFDO0dBQUUsTUFBTTtHQUFRLE1BQU0sTUFBTTtHQUFRLGVBQWUsRUFBRTtHQUFFLEVBQUUsR0FBRyxNQUFNO0FBRTVFLFNBQU87O0FBRVQsUUFBTyxDQUFDO0VBQUUsTUFBTTtFQUFRLE1BQU0sTUFBTTtFQUFRLGVBQWUsRUFBRTtFQUFFLENBQUM7O0FBSWxFLFNBQWdCLGlCQUNkLGFBQ0EsVUFDa0I7QUFDbEIsUUFBTztFQUNMLFVBQVUsWUFBWTtFQUN0QixVQUFVLFlBQVk7RUFDdEIsT0FBTyxZQUFZO0VBQ25CLFlBQVksU0FBUztFQUN0QiJ9
@@ -25,10 +25,12 @@ function formatImagePartForLog(image) {
25
25
  const alt = escapeHtmlAttribute(image.revisedPrompt ?? "generated image");
26
26
  return `<img src="data:image/png;base64,${image.data}" alt="${alt}" />`;
27
27
  }
28
- function imageGenerationToolArgs(args) {
28
+ function imageGenerationToolArgs(args, options = {}) {
29
29
  const resolved = resolveImageGenerationOptions(args.imageGenerationOptions);
30
+ const inputImages = options.includeInputImages === false ? [] : extractInputImagesForToolArgs(args);
30
31
  return JSON.stringify({
31
32
  prompt: args.prompt,
33
+ ...inputImages.length > 0 ? { inputImages } : {},
32
34
  driverModel: args.model ?? null,
33
35
  tool: CODEX_IMAGE_GENERATION_TOOL_CONFIG,
34
36
  pricingAssumption: {
@@ -38,7 +40,52 @@ function imageGenerationToolArgs(args) {
38
40
  }
39
41
  });
40
42
  }
43
+ function buildImageGenerationToolSteps(args, images, stepIndex) {
44
+ if (images.length === 0) return [];
45
+ const firstToolArgs = imageGenerationToolArgs(args, { includeInputImages: true });
46
+ const laterToolArgs = images.length > 1 ? imageGenerationToolArgs(args, { includeInputImages: false }) : firstToolArgs;
47
+ return images.map((image, index) => ({
48
+ step_index: stepIndex,
49
+ type: "tool_call",
50
+ tool_call_index: index,
51
+ tool_call_id: `image_generation:${stepIndex}:${index}`,
52
+ tool_name: "image_generation",
53
+ tool_args: index === 0 ? firstToolArgs : laterToolArgs,
54
+ tool_result: formatImagePartForLog(image)
55
+ }));
56
+ }
57
+ function extractInputImagesForToolArgs(args) {
58
+ return (args.input?.filter((item) => item.type === "image") ?? []).map((image) => {
59
+ const dataUrl = parseDataUrl(image.url);
60
+ if (!dataUrl) return { url: image.url };
61
+ if (dataUrl.isBase64 && dataUrl.mediaType.toLowerCase().startsWith("image/")) return {
62
+ mediaType: dataUrl.mediaType,
63
+ data: dataUrl.data,
64
+ byteSize: base64ByteSize(dataUrl.data)
65
+ };
66
+ return {
67
+ mediaType: dataUrl.mediaType,
68
+ url: `[data-url ${image.url.length} chars]`,
69
+ ...dataUrl.isBase64 ? { byteSize: base64ByteSize(dataUrl.data) } : {}
70
+ };
71
+ });
72
+ }
73
+ function parseDataUrl(value) {
74
+ const match = /^data:([^;,]+)((?:;[^,]*)*),(.*)$/is.exec(value);
75
+ if (!match) return null;
76
+ const params = match[2].toLowerCase().split(";").filter(Boolean);
77
+ return {
78
+ mediaType: match[1],
79
+ data: match[3],
80
+ isBase64: params.includes("base64")
81
+ };
82
+ }
83
+ function base64ByteSize(value) {
84
+ const normalized = /\s/.test(value) ? value.replace(/\s/g, "") : value;
85
+ const padding = normalized.endsWith("==") ? 2 : normalized.endsWith("=") ? 1 : 0;
86
+ return Math.max(Math.floor(normalized.length * 3 / 4) - padding, 0);
87
+ }
41
88
  //#endregion
42
- export { CODEX_IMAGE_GENERATION_TOOL_CONFIG, formatImagePartForLog, formatResponseForLog, getImageParts, imageGenerationToolArgs };
89
+ export { CODEX_IMAGE_GENERATION_TOOL_CONFIG, buildImageGenerationToolSteps, formatImagePartForLog, formatResponseForLog, getImageParts, imageGenerationToolArgs };
43
90
 
44
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQtcmVzcG9uc2UtZm9ybWF0LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC1yZXNwb25zZS1mb3JtYXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBRZ3JpZENvbnRlbnQsXG4gIHR5cGUgUXVlcnlJbnB1dCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbn0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7XG4gIENPREVYX0lNQUdFX0dFTkVSQVRJT05fTU9ERUwsXG4gIHJlc29sdmVJbWFnZUdlbmVyYXRpb25PcHRpb25zLFxufSBmcm9tIFwiLi9xZ3JpZC1pbWFnZS1nZW5lcmF0aW9uXCI7XG5cbmV4cG9ydCBjb25zdCBDT0RFWF9JTUFHRV9HRU5FUkFUSU9OX1RPT0xfQ09ORklHID0ge1xuICB0eXBlOiBcImltYWdlX2dlbmVyYXRpb25cIixcbiAgb3V0cHV0Rm9ybWF0OiBcInBuZ1wiLFxufSBhcyBjb25zdDtcblxuZnVuY3Rpb24gZXNjYXBlSHRtbEF0dHJpYnV0ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlXG4gICAgLnJlcGxhY2UoLyYvZywgXCImYW1wO1wiKVxuICAgIC5yZXBsYWNlKC9cIi9nLCBcIiZxdW90O1wiKVxuICAgIC5yZXBsYWNlKC88L2csIFwiJmx0O1wiKVxuICAgIC5yZXBsYWNlKC8+L2csIFwiJmd0O1wiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFJlc3BvbnNlRm9yTG9nKHJlc3VsdDogUXVlcnlPdXRwdXQpOiBzdHJpbmcge1xuICByZXR1cm4gcmVzdWx0LmNvbnRlbnRcbiAgICAuZmxhdE1hcCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gXCJ0ZXh0XCIpIHJldHVybiBbaXRlbS50ZXh0XTtcbiAgICAgIGlmIChpdGVtLnR5cGUgPT09IFwiaW1hZ2VcIikge1xuICAgICAgICBjb25zdCBhbHQgPSBlc2NhcGVIdG1sQXR0cmlidXRlKGl0ZW0ucmV2aXNlZFByb21wdCA/PyBcImdlbmVyYXRlZCBpbWFnZVwiKTtcbiAgICAgICAgcmV0dXJuIFtgPGltZyBzcmM9XCJkYXRhOmltYWdlL3BuZztiYXNlNjQsJHtpdGVtLmRhdGF9XCIgYWx0PVwiJHthbHR9XCIgLz5gXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKHBhcnQpID0+IHBhcnQubGVuZ3RoID4gMClcbiAgICAuam9pbihcIlxcblwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEltYWdlUGFydHMocmVzdWx0OiBRdWVyeU91dHB1dCk6IEV4dHJhY3Q8UWdyaWRDb250ZW50LCB7IHR5cGU6IFwiaW1hZ2VcIiB9PltdIHtcbiAgcmV0dXJuIHJlc3VsdC5jb250ZW50LmZpbHRlcigoaXRlbSkgPT4gaXRlbS50eXBlID09PSBcImltYWdlXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0SW1hZ2VQYXJ0Rm9yTG9nKGltYWdlOiBFeHRyYWN0PFFncmlkQ29udGVudCwgeyB0eXBlOiBcImltYWdlXCIgfT4pOiBzdHJpbmcge1xuICBjb25zdCBhbHQgPSBlc2NhcGVIdG1sQXR0cmlidXRlKGltYWdlLnJldmlzZWRQcm9tcHQgPz8gXCJnZW5lcmF0ZWQgaW1hZ2VcIik7XG4gIHJldHVybiBgPGltZyBzcmM9XCJkYXRhOmltYWdlL3BuZztiYXNlNjQsJHtpbWFnZS5kYXRhfVwiIGFsdD1cIiR7YWx0fVwiIC8+YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGltYWdlR2VuZXJhdGlvblRvb2xBcmdzKGFyZ3M6IFF1ZXJ5SW5wdXQpOiBzdHJpbmcge1xuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVJbWFnZUdlbmVyYXRpb25PcHRpb25zKGFyZ3MuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyk7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgcHJvbXB0OiBhcmdzLnByb21wdCxcbiAgICBkcml2ZXJNb2RlbDogYXJncy5tb2RlbCA/PyBudWxsLFxuICAgIHRvb2w6IENPREVYX0lNQUdFX0dFTkVSQVRJT05fVE9PTF9DT05GSUcsXG4gICAgcHJpY2luZ0Fzc3VtcHRpb246IHtcbiAgICAgIG1vZGVsOiBDT0RFWF9JTUFHRV9HRU5FUkFUSU9OX01PREVMLFxuICAgICAgcXVhbGl0eTogcmVzb2x2ZWQucXVhbGl0eSxcbiAgICAgIHNpemU6IHJlc29sdmVkLnNpemUsXG4gICAgfSxcbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7OztBQVVBLE1BQWEscUNBQXFDO0NBQ2hELE1BQU07Q0FDTixjQUFjO0NBQ2Y7QUFFRCxTQUFTLG9CQUFvQixPQUF1QjtBQUNsRCxRQUFPLE1BQ0osUUFBUSxNQUFNLFFBQVEsQ0FDdEIsUUFBUSxNQUFNLFNBQVMsQ0FDdkIsUUFBUSxNQUFNLE9BQU8sQ0FDckIsUUFBUSxNQUFNLE9BQU87O0FBRzFCLFNBQWdCLHFCQUFxQixRQUE2QjtBQUNoRSxRQUFPLE9BQU8sUUFDWCxTQUFTLFNBQVM7QUFDakIsTUFBSSxLQUFLLFNBQVMsT0FBUSxRQUFPLENBQUMsS0FBSyxLQUFLO0FBQzVDLE1BQUksS0FBSyxTQUFTLFNBQVM7R0FDekIsTUFBTSxNQUFNLG9CQUFvQixLQUFLLGlCQUFpQixrQkFBa0I7QUFDeEUsVUFBTyxDQUFDLG1DQUFtQyxLQUFLLEtBQUssU0FBUyxJQUFJLE1BQU07O0FBRTFFLFNBQU8sRUFBRTtHQUNULENBQ0QsUUFBUSxTQUFTLEtBQUssU0FBUyxFQUFFLENBQ2pDLEtBQUssS0FBSzs7QUFHZixTQUFnQixjQUFjLFFBQWlFO0FBQzdGLFFBQU8sT0FBTyxRQUFRLFFBQVEsU0FBUyxLQUFLLFNBQVMsUUFBUTs7QUFHL0QsU0FBZ0Isc0JBQXNCLE9BQXlEO0NBQzdGLE1BQU0sTUFBTSxvQkFBb0IsTUFBTSxpQkFBaUIsa0JBQWtCO0FBQ3pFLFFBQU8sbUNBQW1DLE1BQU0sS0FBSyxTQUFTLElBQUk7O0FBR3BFLFNBQWdCLHdCQUF3QixNQUEwQjtDQUNoRSxNQUFNLFdBQVcsOEJBQThCLEtBQUssdUJBQXVCO0FBQzNFLFFBQU8sS0FBSyxVQUFVO0VBQ3BCLFFBQVEsS0FBSztFQUNiLGFBQWEsS0FBSyxTQUFTO0VBQzNCLE1BQU07RUFDTixtQkFBbUI7R0FDakIsT0FBTztHQUNQLFNBQVMsU0FBUztHQUNsQixNQUFNLFNBQVM7R0FDaEI7RUFDRixDQUFDIn0=
91
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQtcmVzcG9uc2UtZm9ybWF0LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC1yZXNwb25zZS1mb3JtYXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ09ERVhfSU1BR0VfR0VORVJBVElPTl9NT0RFTCxcbiAgcmVzb2x2ZUltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG59IGZyb20gXCIuL3FncmlkLWltYWdlLWdlbmVyYXRpb25cIjtcbmltcG9ydCB7IHR5cGUgUWdyaWRDb250ZW50LCB0eXBlIFF1ZXJ5SW5wdXQsIHR5cGUgUXVlcnlPdXRwdXQgfSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgQ09ERVhfSU1BR0VfR0VORVJBVElPTl9UT09MX0NPTkZJRyA9IHtcbiAgdHlwZTogXCJpbWFnZV9nZW5lcmF0aW9uXCIsXG4gIG91dHB1dEZvcm1hdDogXCJwbmdcIixcbn0gYXMgY29uc3Q7XG5cbmZ1bmN0aW9uIGVzY2FwZUh0bWxBdHRyaWJ1dGUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZVxuICAgIC5yZXBsYWNlKC8mL2csIFwiJmFtcDtcIilcbiAgICAucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIilcbiAgICAucmVwbGFjZSgvPC9nLCBcIiZsdDtcIilcbiAgICAucmVwbGFjZSgvPi9nLCBcIiZndDtcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRSZXNwb25zZUZvckxvZyhyZXN1bHQ6IFF1ZXJ5T3V0cHV0KTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlc3VsdC5jb250ZW50XG4gICAgLmZsYXRNYXAoKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpdGVtLnR5cGUgPT09IFwidGV4dFwiKSByZXR1cm4gW2l0ZW0udGV4dF07XG4gICAgICBpZiAoaXRlbS50eXBlID09PSBcImltYWdlXCIpIHtcbiAgICAgICAgY29uc3QgYWx0ID0gZXNjYXBlSHRtbEF0dHJpYnV0ZShpdGVtLnJldmlzZWRQcm9tcHQgPz8gXCJnZW5lcmF0ZWQgaW1hZ2VcIik7XG4gICAgICAgIHJldHVybiBbYDxpbWcgc3JjPVwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LCR7aXRlbS5kYXRhfVwiIGFsdD1cIiR7YWx0fVwiIC8+YF07XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSlcbiAgICAuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0Lmxlbmd0aCA+IDApXG4gICAgLmpvaW4oXCJcXG5cIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbWFnZVBhcnRzKHJlc3VsdDogUXVlcnlPdXRwdXQpOiBFeHRyYWN0PFFncmlkQ29udGVudCwgeyB0eXBlOiBcImltYWdlXCIgfT5bXSB7XG4gIHJldHVybiByZXN1bHQuY29udGVudC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gXCJpbWFnZVwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEltYWdlUGFydEZvckxvZyhpbWFnZTogRXh0cmFjdDxRZ3JpZENvbnRlbnQsIHsgdHlwZTogXCJpbWFnZVwiIH0+KTogc3RyaW5nIHtcbiAgY29uc3QgYWx0ID0gZXNjYXBlSHRtbEF0dHJpYnV0ZShpbWFnZS5yZXZpc2VkUHJvbXB0ID8/IFwiZ2VuZXJhdGVkIGltYWdlXCIpO1xuICByZXR1cm4gYDxpbWcgc3JjPVwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LCR7aW1hZ2UuZGF0YX1cIiBhbHQ9XCIke2FsdH1cIiAvPmA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbWFnZUdlbmVyYXRpb25Ub29sQXJncyhcbiAgYXJnczogUXVlcnlJbnB1dCxcbiAgb3B0aW9uczogeyBpbmNsdWRlSW5wdXRJbWFnZXM/OiBib29sZWFuIH0gPSB7fSxcbik6IHN0cmluZyB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUltYWdlR2VuZXJhdGlvbk9wdGlvbnMoYXJncy5pbWFnZUdlbmVyYXRpb25PcHRpb25zKTtcbiAgY29uc3QgaW5wdXRJbWFnZXMgPVxuICAgIG9wdGlvbnMuaW5jbHVkZUlucHV0SW1hZ2VzID09PSBmYWxzZSA/IFtdIDogZXh0cmFjdElucHV0SW1hZ2VzRm9yVG9vbEFyZ3MoYXJncyk7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgcHJvbXB0OiBhcmdzLnByb21wdCxcbiAgICAuLi4oaW5wdXRJbWFnZXMubGVuZ3RoID4gMCA/IHsgaW5wdXRJbWFnZXMgfSA6IHt9KSxcbiAgICBkcml2ZXJNb2RlbDogYXJncy5tb2RlbCA/PyBudWxsLFxuICAgIHRvb2w6IENPREVYX0lNQUdFX0dFTkVSQVRJT05fVE9PTF9DT05GSUcsXG4gICAgcHJpY2luZ0Fzc3VtcHRpb246IHtcbiAgICAgIG1vZGVsOiBDT0RFWF9JTUFHRV9HRU5FUkFUSU9OX01PREVMLFxuICAgICAgcXVhbGl0eTogcmVzb2x2ZWQucXVhbGl0eSxcbiAgICAgIHNpemU6IHJlc29sdmVkLnNpemUsXG4gICAgfSxcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEltYWdlR2VuZXJhdGlvblRvb2xTdGVwcyhcbiAgYXJnczogUXVlcnlJbnB1dCxcbiAgaW1hZ2VzOiBFeHRyYWN0PFFncmlkQ29udGVudCwgeyB0eXBlOiBcImltYWdlXCIgfT5bXSxcbiAgc3RlcEluZGV4OiBudW1iZXIsXG4pOiBBcnJheTx7XG4gIHN0ZXBfaW5kZXg6IG51bWJlcjtcbiAgdHlwZTogXCJ0b29sX2NhbGxcIjtcbiAgdG9vbF9jYWxsX2luZGV4OiBudW1iZXI7XG4gIHRvb2xfY2FsbF9pZDogc3RyaW5nO1xuICB0b29sX25hbWU6IFwiaW1hZ2VfZ2VuZXJhdGlvblwiO1xuICB0b29sX2FyZ3M6IHN0cmluZztcbiAgdG9vbF9yZXN1bHQ6IHN0cmluZztcbn0+IHtcbiAgaWYgKGltYWdlcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICBjb25zdCBmaXJzdFRvb2xBcmdzID0gaW1hZ2VHZW5lcmF0aW9uVG9vbEFyZ3MoYXJncywgeyBpbmNsdWRlSW5wdXRJbWFnZXM6IHRydWUgfSk7XG4gIGNvbnN0IGxhdGVyVG9vbEFyZ3MgPVxuICAgIGltYWdlcy5sZW5ndGggPiAxXG4gICAgICA/IGltYWdlR2VuZXJhdGlvblRvb2xBcmdzKGFyZ3MsIHsgaW5jbHVkZUlucHV0SW1hZ2VzOiBmYWxzZSB9KVxuICAgICAgOiBmaXJzdFRvb2xBcmdzO1xuICByZXR1cm4gaW1hZ2VzLm1hcCgoaW1hZ2UsIGluZGV4KSA9PiAoe1xuICAgIHN0ZXBfaW5kZXg6IHN0ZXBJbmRleCxcbiAgICB0eXBlOiBcInRvb2xfY2FsbFwiLFxuICAgIHRvb2xfY2FsbF9pbmRleDogaW5kZXgsXG4gICAgdG9vbF9jYWxsX2lkOiBgaW1hZ2VfZ2VuZXJhdGlvbjoke3N0ZXBJbmRleH06JHtpbmRleH1gLFxuICAgIHRvb2xfbmFtZTogXCJpbWFnZV9nZW5lcmF0aW9uXCIsXG4gICAgdG9vbF9hcmdzOiBpbmRleCA9PT0gMCA/IGZpcnN0VG9vbEFyZ3MgOiBsYXRlclRvb2xBcmdzLFxuICAgIHRvb2xfcmVzdWx0OiBmb3JtYXRJbWFnZVBhcnRGb3JMb2coaW1hZ2UpLFxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RJbnB1dEltYWdlc0ZvclRvb2xBcmdzKGFyZ3M6IFF1ZXJ5SW5wdXQpOiBBcnJheTx7XG4gIG1lZGlhVHlwZT86IHN0cmluZztcbiAgZGF0YT86IHN0cmluZztcbiAgdXJsPzogc3RyaW5nO1xuICBieXRlU2l6ZT86IG51bWJlcjtcbn0+IHtcbiAgY29uc3QgaW1hZ2VzID0gYXJncy5pbnB1dD8uZmlsdGVyKChpdGVtKSA9PiBpdGVtLnR5cGUgPT09IFwiaW1hZ2VcIikgPz8gW107XG4gIHJldHVybiBpbWFnZXMubWFwKChpbWFnZSkgPT4ge1xuICAgIGNvbnN0IGRhdGFVcmwgPSBwYXJzZURhdGFVcmwoaW1hZ2UudXJsKTtcbiAgICBpZiAoIWRhdGFVcmwpIHJldHVybiB7IHVybDogaW1hZ2UudXJsIH07XG4gICAgaWYgKGRhdGFVcmwuaXNCYXNlNjQgJiYgZGF0YVVybC5tZWRpYVR5cGUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFwiaW1hZ2UvXCIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtZWRpYVR5cGU6IGRhdGFVcmwubWVkaWFUeXBlLFxuICAgICAgICBkYXRhOiBkYXRhVXJsLmRhdGEsXG4gICAgICAgIGJ5dGVTaXplOiBiYXNlNjRCeXRlU2l6ZShkYXRhVXJsLmRhdGEpLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lZGlhVHlwZTogZGF0YVVybC5tZWRpYVR5cGUsXG4gICAgICB1cmw6IGBbZGF0YS11cmwgJHtpbWFnZS51cmwubGVuZ3RofSBjaGFyc11gLFxuICAgICAgLi4uKGRhdGFVcmwuaXNCYXNlNjQgPyB7IGJ5dGVTaXplOiBiYXNlNjRCeXRlU2l6ZShkYXRhVXJsLmRhdGEpIH0gOiB7fSksXG4gICAgfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRGF0YVVybChcbiAgdmFsdWU6IHN0cmluZyxcbik6IHsgbWVkaWFUeXBlOiBzdHJpbmc7IGRhdGE6IHN0cmluZzsgaXNCYXNlNjQ6IGJvb2xlYW4gfSB8IG51bGwge1xuICBjb25zdCBtYXRjaCA9IC9eZGF0YTooW147LF0rKSgoPzo7W14sXSopKiksKC4qKSQvaXMuZXhlYyh2YWx1ZSk7XG4gIGlmICghbWF0Y2gpIHJldHVybiBudWxsO1xuICBjb25zdCBwYXJhbXMgPSBtYXRjaFsyXSEudG9Mb3dlckNhc2UoKS5zcGxpdChcIjtcIikuZmlsdGVyKEJvb2xlYW4pO1xuICByZXR1cm4geyBtZWRpYVR5cGU6IG1hdGNoWzFdISwgZGF0YTogbWF0Y2hbM10hLCBpc0Jhc2U2NDogcGFyYW1zLmluY2x1ZGVzKFwiYmFzZTY0XCIpIH07XG59XG5cbmZ1bmN0aW9uIGJhc2U2NEJ5dGVTaXplKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBub3JtYWxpemVkID0gL1xccy8udGVzdCh2YWx1ZSkgPyB2YWx1ZS5yZXBsYWNlKC9cXHMvZywgXCJcIikgOiB2YWx1ZTtcbiAgY29uc3QgcGFkZGluZyA9IG5vcm1hbGl6ZWQuZW5kc1dpdGgoXCI9PVwiKSA/IDIgOiBub3JtYWxpemVkLmVuZHNXaXRoKFwiPVwiKSA/IDEgOiAwO1xuICByZXR1cm4gTWF0aC5tYXgoTWF0aC5mbG9vcigobm9ybWFsaXplZC5sZW5ndGggKiAzKSAvIDQpIC0gcGFkZGluZywgMCk7XG59XG4iXSwibWFwcGluZ3MiOiI7OztBQU1BLE1BQWEscUNBQXFDO0NBQ2hELE1BQU07Q0FDTixjQUFjO0NBQ2Y7QUFFRCxTQUFTLG9CQUFvQixPQUF1QjtBQUNsRCxRQUFPLE1BQ0osUUFBUSxNQUFNLFFBQVEsQ0FDdEIsUUFBUSxNQUFNLFNBQVMsQ0FDdkIsUUFBUSxNQUFNLE9BQU8sQ0FDckIsUUFBUSxNQUFNLE9BQU87O0FBRzFCLFNBQWdCLHFCQUFxQixRQUE2QjtBQUNoRSxRQUFPLE9BQU8sUUFDWCxTQUFTLFNBQVM7QUFDakIsTUFBSSxLQUFLLFNBQVMsT0FBUSxRQUFPLENBQUMsS0FBSyxLQUFLO0FBQzVDLE1BQUksS0FBSyxTQUFTLFNBQVM7R0FDekIsTUFBTSxNQUFNLG9CQUFvQixLQUFLLGlCQUFpQixrQkFBa0I7QUFDeEUsVUFBTyxDQUFDLG1DQUFtQyxLQUFLLEtBQUssU0FBUyxJQUFJLE1BQU07O0FBRTFFLFNBQU8sRUFBRTtHQUNULENBQ0QsUUFBUSxTQUFTLEtBQUssU0FBUyxFQUFFLENBQ2pDLEtBQUssS0FBSzs7QUFHZixTQUFnQixjQUFjLFFBQWlFO0FBQzdGLFFBQU8sT0FBTyxRQUFRLFFBQVEsU0FBUyxLQUFLLFNBQVMsUUFBUTs7QUFHL0QsU0FBZ0Isc0JBQXNCLE9BQXlEO0NBQzdGLE1BQU0sTUFBTSxvQkFBb0IsTUFBTSxpQkFBaUIsa0JBQWtCO0FBQ3pFLFFBQU8sbUNBQW1DLE1BQU0sS0FBSyxTQUFTLElBQUk7O0FBR3BFLFNBQWdCLHdCQUNkLE1BQ0EsVUFBNEMsRUFBRSxFQUN0QztDQUNSLE1BQU0sV0FBVyw4QkFBOEIsS0FBSyx1QkFBdUI7Q0FDM0UsTUFBTSxjQUNKLFFBQVEsdUJBQXVCLFFBQVEsRUFBRSxHQUFHLDhCQUE4QixLQUFLO0FBQ2pGLFFBQU8sS0FBSyxVQUFVO0VBQ3BCLFFBQVEsS0FBSztFQUNiLEdBQUksWUFBWSxTQUFTLElBQUksRUFBRSxhQUFhLEdBQUcsRUFBRTtFQUNqRCxhQUFhLEtBQUssU0FBUztFQUMzQixNQUFNO0VBQ04sbUJBQW1CO0dBQ2pCLE9BQU87R0FDUCxTQUFTLFNBQVM7R0FDbEIsTUFBTSxTQUFTO0dBQ2hCO0VBQ0YsQ0FBQzs7QUFHSixTQUFnQiw4QkFDZCxNQUNBLFFBQ0EsV0FTQztBQUNELEtBQUksT0FBTyxXQUFXLEVBQUcsUUFBTyxFQUFFO0NBRWxDLE1BQU0sZ0JBQWdCLHdCQUF3QixNQUFNLEVBQUUsb0JBQW9CLE1BQU0sQ0FBQztDQUNqRixNQUFNLGdCQUNKLE9BQU8sU0FBUyxJQUNaLHdCQUF3QixNQUFNLEVBQUUsb0JBQW9CLE9BQU8sQ0FBQyxHQUM1RDtBQUNOLFFBQU8sT0FBTyxLQUFLLE9BQU8sV0FBVztFQUNuQyxZQUFZO0VBQ1osTUFBTTtFQUNOLGlCQUFpQjtFQUNqQixjQUFjLG9CQUFvQixVQUFVLEdBQUc7RUFDL0MsV0FBVztFQUNYLFdBQVcsVUFBVSxJQUFJLGdCQUFnQjtFQUN6QyxhQUFhLHNCQUFzQixNQUFNO0VBQzFDLEVBQUU7O0FBR0wsU0FBUyw4QkFBOEIsTUFLcEM7QUFFRCxTQURlLEtBQUssT0FBTyxRQUFRLFNBQVMsS0FBSyxTQUFTLFFBQVEsSUFBSSxFQUFFLEVBQzFELEtBQUssVUFBVTtFQUMzQixNQUFNLFVBQVUsYUFBYSxNQUFNLElBQUk7QUFDdkMsTUFBSSxDQUFDLFFBQVMsUUFBTyxFQUFFLEtBQUssTUFBTSxLQUFLO0FBQ3ZDLE1BQUksUUFBUSxZQUFZLFFBQVEsVUFBVSxhQUFhLENBQUMsV0FBVyxTQUFTLENBQzFFLFFBQU87R0FDTCxXQUFXLFFBQVE7R0FDbkIsTUFBTSxRQUFRO0dBQ2QsVUFBVSxlQUFlLFFBQVEsS0FBSztHQUN2QztBQUVILFNBQU87R0FDTCxXQUFXLFFBQVE7R0FDbkIsS0FBSyxhQUFhLE1BQU0sSUFBSSxPQUFPO0dBQ25DLEdBQUksUUFBUSxXQUFXLEVBQUUsVUFBVSxlQUFlLFFBQVEsS0FBSyxFQUFFLEdBQUcsRUFBRTtHQUN2RTtHQUNEOztBQUdKLFNBQVMsYUFDUCxPQUMrRDtDQUMvRCxNQUFNLFFBQVEsc0NBQXNDLEtBQUssTUFBTTtBQUMvRCxLQUFJLENBQUMsTUFBTyxRQUFPO0NBQ25CLE1BQU0sU0FBUyxNQUFNLEdBQUksYUFBYSxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sUUFBUTtBQUNqRSxRQUFPO0VBQUUsV0FBVyxNQUFNO0VBQUssTUFBTSxNQUFNO0VBQUssVUFBVSxPQUFPLFNBQVMsU0FBUztFQUFFOztBQUd2RixTQUFTLGVBQWUsT0FBdUI7Q0FDN0MsTUFBTSxhQUFhLEtBQUssS0FBSyxNQUFNLEdBQUcsTUFBTSxRQUFRLE9BQU8sR0FBRyxHQUFHO0NBQ2pFLE1BQU0sVUFBVSxXQUFXLFNBQVMsS0FBSyxHQUFHLElBQUksV0FBVyxTQUFTLElBQUksR0FBRyxJQUFJO0FBQy9FLFFBQU8sS0FBSyxJQUFJLEtBQUssTUFBTyxXQUFXLFNBQVMsSUFBSyxFQUFFLEdBQUcsU0FBUyxFQUFFIn0=
@@ -1,6 +1,6 @@
1
1
  import "../../_virtual/_rolldown/runtime.js";
2
2
  import { estimateImageGenerationCostMicroUsd, imageGenerationCostMethod } from "./qgrid-image-generation.js";
3
- import { formatImagePartForLog, formatResponseForLog, getImageParts, imageGenerationToolArgs } from "./qgrid-response-format.js";
3
+ import { buildImageGenerationToolSteps, formatResponseForLog, getImageParts } from "./qgrid-response-format.js";
4
4
  import { RequestLogModel } from "../request-log/request-log.model.js";
5
5
  import { getLogger } from "@logtape/logtape";
6
6
  //#region src/application/qgrid/qgrid-run-lifecycle.ts
@@ -63,18 +63,7 @@ async function afterQuery(requestLogId, stepIndex, args, result) {
63
63
  });
64
64
  const imageParts = getImageParts(result);
65
65
  const imageCostMicroUsd = estimateImageGenerationCostMicroUsd(result, args.imageGenerationOptions);
66
- for (let i = 0; i < imageParts.length; i++) {
67
- const image = imageParts[i];
68
- await RequestLogModel.appendStep(requestLogId, {
69
- step_index: stepIndex,
70
- type: "tool_call",
71
- tool_call_index: i,
72
- tool_call_id: `image_generation:${stepIndex}:${i}`,
73
- tool_name: "image_generation",
74
- tool_args: imageGenerationToolArgs(args),
75
- tool_result: formatImagePartForLog(image)
76
- });
77
- }
66
+ for (const step of buildImageGenerationToolSteps(args, imageParts, stepIndex)) await RequestLogModel.appendStep(requestLogId, step);
78
67
  if (result.finishReason === "tool-calls") {
79
68
  const toolCalls = result.content.filter((c) => c.type === "tool-call");
80
69
  for (let i = 0; i < toolCalls.length; i++) {
@@ -154,4 +143,4 @@ async function cleanupStaleRuns() {
154
143
  //#endregion
155
144
  export { afterQuery, beforeQuery, finishRunAborted, finishRunWithError };
156
145
 
157
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQtcnVuLWxpZmVjeWNsZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQtcnVuLWxpZmVjeWNsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBSZXF1ZXN0TG9nTW9kZWwgfSBmcm9tIFwiLi4vcmVxdWVzdC1sb2cvcmVxdWVzdC1sb2cubW9kZWxcIjtcbmltcG9ydCB7XG4gIHR5cGUgUWdyaWRSdW5Db250ZXh0LFxuICB0eXBlIFFncmlkVG9vbFJlc3VsdElucHV0LFxuICB0eXBlIFF1ZXJ5SW5wdXQsXG4gIHR5cGUgUXVlcnlPdXRwdXQsXG59IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQge1xuICBmb3JtYXRJbWFnZVBhcnRGb3JMb2csXG4gIGZvcm1hdFJlc3BvbnNlRm9yTG9nLFxuICBnZXRJbWFnZVBhcnRzLFxuICBpbWFnZUdlbmVyYXRpb25Ub29sQXJncyxcbn0gZnJvbSBcIi4vcWdyaWQtcmVzcG9uc2UtZm9ybWF0XCI7XG5pbXBvcnQge1xuICBlc3RpbWF0ZUltYWdlR2VuZXJhdGlvbkNvc3RNaWNyb1VzZCxcbiAgaW1hZ2VHZW5lcmF0aW9uQ29zdE1ldGhvZCxcbn0gZnJvbSBcIi4vcWdyaWQtaW1hZ2UtZ2VuZXJhdGlvblwiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJydW4tbGlmZWN5Y2xlXCJdKTtcbmNvbnN0IFNUQUxFX1JVTl9USFJFU0hPTERfTVMgPSAzMCAqIDYwICogMTAwMDtcblxuLyoqXG4gKiBoaXN0b3J564qUIOybkOuzuCDqt7jrjIDroZwg7KCA7J6l7ZWY6riw67O064uk64qULCBydW4g67aE7ISd7JeQIO2VhOyalO2VnCB1c2VyL2Fzc2lzdGFudCDsoJXrs7Trp4wg7ZWE7YSw66eB7ZW07IScIOyggOyepVxuICovXG5mdW5jdGlvbiBmaWx0ZXJIaXN0b3J5Rm9yU3RvcmFnZShyYXdIaXN0b3J5OiBzdHJpbmcgfCB1bmRlZmluZWQpOiB1bmtub3duIHtcbiAgaWYgKCFyYXdIaXN0b3J5KSByZXR1cm4gdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIGNvbnN0IGl0ZW1zID0gSlNPTi5wYXJzZShyYXdIaXN0b3J5KSBhcyB1bmtub3duW107XG4gICAgY29uc3QgZmlsdGVyZWQgPSBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgIGlmICghaXRlbSB8fCB0eXBlb2YgaXRlbSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgcmVjb3JkID0gaXRlbSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIHJldHVybiByZWNvcmQudHlwZSA9PT0gXCJtZXNzYWdlXCIgJiYgKHJlY29yZC5yb2xlID09PSBcInVzZXJcIiB8fCByZWNvcmQucm9sZSA9PT0gXCJhc3Npc3RhbnRcIik7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZpbHRlcmVkLmxlbmd0aCA+IDAgPyBmaWx0ZXJlZCA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBSdW5MaWZlY3ljbGVSZXN1bHQgPSB7XG4gIHJ1bkNvbnRleHQ/OiBRZ3JpZFJ1bkNvbnRleHQ7XG59O1xuXG4vKipcbiAqIGxvZ01vZGU6XCJydW5cIiDsi5wgcXVlcnkvc3RyZWFtIOydkeuLtSDsoITtm4Tsl5Ag7Zi47LacLlxuICpcbiAqIDEpIGJlZm9yZVF1ZXJ5OiBydW4g7IOd7ISxL+qzhOyGjSArIHRvb2wgcmVzdWx0IOyZhOujjCArIHN0YWxlIGNsZWFudXBcbiAqIDIpIGFmdGVyUXVlcnk6IGdlbmVyYXRlIHN0ZXAgKyB0b29sLWNhbGwgc3RlcCArIGZpbmlzaC9rZWVwLW9wZW5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJlZm9yZVF1ZXJ5KGFyZ3M6IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPHtcbiAgcmVxdWVzdExvZ0lkOiBudW1iZXI7XG4gIHN0ZXBJbmRleDogbnVtYmVyO1xufT4ge1xuICBhd2FpdCBjbGVhbnVwU3RhbGVSdW5zKCk7XG5cbiAgbGV0IHJlcXVlc3RMb2dJZDogbnVtYmVyO1xuICBsZXQgc3RlcEluZGV4ID0gMDtcblxuICAvLyByZXF1ZXN0TG9nSWQg6rCAIOyeiOydhCDrlYzrp4wg6riw7KG0IHJ1biDsl7DsnqUuIHRocmVhZENvb3JkIOunjCDsnojripQgY29udiDripQg7IOIIHJ1biDsnLzroZwg7Iuc7J6RLlxuICBpZiAoYXJncy5ydW5Db250ZXh0Py5yZXF1ZXN0TG9nSWQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJlcXVlc3RMb2dJZCA9IGFyZ3MucnVuQ29udGV4dC5yZXF1ZXN0TG9nSWQ7XG5cbiAgICBpZiAoYXJncy50b29sUmVzdWx0cyAmJiBhcmdzLnRvb2xSZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IGNvbXBsZXRlVG9vbFJlc3VsdHMocmVxdWVzdExvZ0lkLCBhcmdzLnRvb2xSZXN1bHRzKTtcbiAgICB9XG5cbiAgICBzdGVwSW5kZXggPSBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZ2V0TmV4dFN0ZXBJbmRleChyZXF1ZXN0TG9nSWQpO1xuICB9IGVsc2Uge1xuICAgIHJlcXVlc3RMb2dJZCA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5jcmVhdGVSdW4oe1xuICAgICAgdXNlcl9wcm9tcHQ6IGFyZ3MucHJvbXB0LFxuICAgICAgc3lzdGVtX3Byb21wdDogYXJncy5zeXN0ZW0sXG4gICAgICBtb2RlbF9uYW1lOiBhcmdzLm1vZGVsLFxuICAgICAgZWZmb3J0OiBhcmdzLmVmZm9ydCxcbiAgICAgIHByb2plY3RfbmFtZTogYXJncy5wcm9qZWN0TmFtZSxcbiAgICAgIGlzX2ltYWdlX2dlbmVyYXRpb246IGFyZ3MuaW1hZ2VHZW5lcmF0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHsgcmVxdWVzdExvZ0lkLCBzdGVwSW5kZXggfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFmdGVyUXVlcnkoXG4gIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICBzdGVwSW5kZXg6IG51bWJlcixcbiAgYXJnczogUXVlcnlJbnB1dCxcbiAgcmVzdWx0OiBRdWVyeU91dHB1dCxcbik6IFByb21pc2U8UnVuTGlmZWN5Y2xlUmVzdWx0PiB7XG4gIC8vIGdlbmVyYXRlIHN0ZXAg6riw66GdXG4gIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5hcHBlbmRTdGVwKHJlcXVlc3RMb2dJZCwge1xuICAgIHN0ZXBfaW5kZXg6IHN0ZXBJbmRleCxcbiAgICB0eXBlOiBcImdlbmVyYXRlXCIsXG4gICAgaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRfdG9rZW5zLFxuICAgIG91dHB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5vdXRwdXRfdG9rZW5zLFxuICAgIGNhY2hlX3JlYWRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVfcmVhZF9pbnB1dF90b2tlbnMsXG4gICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zLFxuICAgIGR1cmF0aW9uX21zOiByZXN1bHQuZHVyYXRpb25NcyxcbiAgICB0dGZ0X21zOiByZXN1bHQudHRmdE1zLFxuICAgIGZpbmlzaF9yZWFzb246IHJlc3VsdC5maW5pc2hSZWFzb24sXG4gIH0pO1xuXG4gIGNvbnN0IGltYWdlUGFydHMgPSBnZXRJbWFnZVBhcnRzKHJlc3VsdCk7XG4gIGNvbnN0IGltYWdlQ29zdE1pY3JvVXNkID0gZXN0aW1hdGVJbWFnZUdlbmVyYXRpb25Db3N0TWljcm9Vc2QoXG4gICAgcmVzdWx0LFxuICAgIGFyZ3MuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbWFnZVBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaW1hZ2UgPSBpbWFnZVBhcnRzW2ldITtcbiAgICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuYXBwZW5kU3RlcChyZXF1ZXN0TG9nSWQsIHtcbiAgICAgIHN0ZXBfaW5kZXg6IHN0ZXBJbmRleCxcbiAgICAgIHR5cGU6IFwidG9vbF9jYWxsXCIsXG4gICAgICB0b29sX2NhbGxfaW5kZXg6IGksXG4gICAgICB0b29sX2NhbGxfaWQ6IGBpbWFnZV9nZW5lcmF0aW9uOiR7c3RlcEluZGV4fToke2l9YCxcbiAgICAgIHRvb2xfbmFtZTogXCJpbWFnZV9nZW5lcmF0aW9uXCIsXG4gICAgICB0b29sX2FyZ3M6IGltYWdlR2VuZXJhdGlvblRvb2xBcmdzKGFyZ3MpLFxuICAgICAgdG9vbF9yZXN1bHQ6IGZvcm1hdEltYWdlUGFydEZvckxvZyhpbWFnZSksXG4gICAgfSk7XG4gIH1cblxuICBpZiAocmVzdWx0LmZpbmlzaFJlYXNvbiA9PT0gXCJ0b29sLWNhbGxzXCIpIHtcbiAgICAvLyB0b29sLWNhbGwgc3RlcCDsponsi5wg6riw66GdIChyZXN1bHTripQg64KY7KSR7JeQIGNvbXBsZXRlVG9vbENhbGzroZwg7LGE7JuAKVxuICAgIGNvbnN0IHRvb2xDYWxscyA9IHJlc3VsdC5jb250ZW50LmZpbHRlcigoYykgPT4gYy50eXBlID09PSBcInRvb2wtY2FsbFwiKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvb2xDYWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdGMgPSB0b29sQ2FsbHNbaV0hO1xuICAgICAgaWYgKHRjLnR5cGUgIT09IFwidG9vbC1jYWxsXCIpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFwcGVuZFN0ZXAocmVxdWVzdExvZ0lkLCB7XG4gICAgICAgIHN0ZXBfaW5kZXg6IHN0ZXBJbmRleCxcbiAgICAgICAgdHlwZTogXCJ0b29sX2NhbGxcIixcbiAgICAgICAgdG9vbF9jYWxsX2luZGV4OiBpbWFnZVBhcnRzLmxlbmd0aCArIGksXG4gICAgICAgIHRvb2xfY2FsbF9pZDogdGMudG9vbENhbGxJZCxcbiAgICAgICAgdG9vbF9uYW1lOiB0Yy50b29sTmFtZSxcbiAgICAgICAgdG9vbF9hcmdzOiB0Yy5pbnB1dCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7IHJ1bkNvbnRleHQ6IHsgcmVxdWVzdExvZ0lkIH0gfTtcbiAgfVxuXG4gIC8vIGZpbmlzaFJlYXNvbiA9PT0gXCJzdG9wXCIg4oaSIHJ1biDsooXro4wgKOyghOyytCBzdGVwIHVzYWdlIO2VqeyCsClcbiAgY29uc3QgYWdnID0gYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFnZ3JlZ2F0ZVN0ZXBVc2FnZShyZXF1ZXN0TG9nSWQpO1xuICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZmluaXNoUnVuKHJlcXVlc3RMb2dJZCwge1xuICAgIHN0YXR1czogXCJzdWNjZWVkZWRcIixcbiAgICByZXNwb25zZTogZm9ybWF0UmVzcG9uc2VGb3JMb2cocmVzdWx0KSxcbiAgICB0b2tlbl9uYW1lOiByZXN1bHQudG9rZW5OYW1lLFxuICAgIGlucHV0X3Rva2VuczogYWdnLmlucHV0X3Rva2VucyxcbiAgICBvdXRwdXRfdG9rZW5zOiBhZ2cub3V0cHV0X3Rva2VucyxcbiAgICBjYWNoZV9yZWFkX3Rva2VuczogYWdnLmNhY2hlX3JlYWRfdG9rZW5zLFxuICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogYWdnLmNhY2hlX2NyZWF0aW9uX3Rva2VucyxcbiAgICBkdXJhdGlvbl9tczogYWdnLmR1cmF0aW9uX21zLFxuICAgIGltYWdlX2Nvc3RfdXNkOiBpbWFnZUNvc3RNaWNyb1VzZCxcbiAgICBpbWFnZV9jb3N0X21ldGhvZDpcbiAgICAgIGltYWdlQ29zdE1pY3JvVXNkICE9PSBudWxsID8gaW1hZ2VHZW5lcmF0aW9uQ29zdE1ldGhvZChhcmdzLmltYWdlR2VuZXJhdGlvbk9wdGlvbnMpIDogbnVsbCxcbiAgICBoaXN0b3J5OiBmaWx0ZXJIaXN0b3J5Rm9yU3RvcmFnZShhcmdzLmhpc3RvcnkpLFxuICB9KTtcblxuICByZXR1cm4ge307XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5pc2hSdW5XaXRoRXJyb3IoXG4gIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICBlcnJvck1lc3NhZ2U6IHN0cmluZyxcbiAgYXJncz86IFF1ZXJ5SW5wdXQsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZmluaXNoUnVuKHJlcXVlc3RMb2dJZCwge1xuICAgICAgc3RhdHVzOiBcImVycm9yXCIsXG4gICAgICBlcnJvcl9tZXNzYWdlOiBlcnJvck1lc3NhZ2UsXG4gICAgICBoaXN0b3J5OiBhcmdzID8gZmlsdGVySGlzdG9yeUZvclN0b3JhZ2UoYXJncy5oaXN0b3J5KSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci5lcnJvcihgZmluaXNoUnVuV2l0aEVycm9yIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluaXNoUnVuQWJvcnRlZChyZXF1ZXN0TG9nSWQ6IG51bWJlciwgYXJncz86IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZmluaXNoUnVuKHJlcXVlc3RMb2dJZCwge1xuICAgICAgc3RhdHVzOiBcImFib3J0ZWRcIixcbiAgICAgIGVycm9yX21lc3NhZ2U6IFwiY2xpZW50IGRpc2Nvbm5lY3RlZFwiLFxuICAgICAgaGlzdG9yeTogYXJncyA/IGZpbHRlckhpc3RvcnlGb3JTdG9yYWdlKGFyZ3MuaGlzdG9yeSkgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIuZXJyb3IoYGZpbmlzaFJ1bkFib3J0ZWQgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbXBsZXRlVG9vbFJlc3VsdHMoXG4gIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICB0b29sUmVzdWx0czogUWdyaWRUb29sUmVzdWx0SW5wdXRbXSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHRyIG9mIHRvb2xSZXN1bHRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5jb21wbGV0ZVRvb2xDYWxsKHJlcXVlc3RMb2dJZCwgdHIudG9vbENhbGxJZCwge1xuICAgICAgICB0b29sX3Jlc3VsdDogdHIuaXNFcnJvciA/IHVuZGVmaW5lZCA6IHRyLm91dHB1dCxcbiAgICAgICAgZXJyb3I6IHRyLmlzRXJyb3IgPyB0ci5vdXRwdXQgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYGNvbXBsZXRlVG9vbENhbGwgZmFpbGVkIGZvciAke3RyLnRvb2xDYWxsSWR9OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjbGVhbnVwU3RhbGVSdW5zKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YWxlSWRzID0gYXdhaXQgUmVxdWVzdExvZ01vZGVsLmZpbmRTdGFsZVJ1bm5pbmdJZHMoU1RBTEVfUlVOX1RIUkVTSE9MRF9NUyk7XG4gICAgZm9yIChjb25zdCBpZCBvZiBzdGFsZUlkcykge1xuICAgICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmZpbmlzaFJ1bihpZCwge1xuICAgICAgICBzdGF0dXM6IFwiZXJyb3JcIixcbiAgICAgICAgZXJyb3JfbWVzc2FnZTogXCJ0b29sLWNhbGwgcnVuOiBubyBmb2xsb3ctdXAgd2l0aGluIDMwIG1pbnV0ZXNcIixcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc3RhbGVJZHMubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLmluZm8oYGNsZWFuZWQgdXAgJHtzdGFsZUlkcy5sZW5ndGh9IHN0YWxlIHJ1bm5pbmcgcmVxdWVzdCBsb2dzYCk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nZ2VyLmVycm9yKGBzdGFsZSBjbGVhbnVwIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFvQkEsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLGdCQUFnQixDQUFDO0FBQ3BELE1BQU0seUJBQXlCLE9BQVU7Ozs7QUFLekMsU0FBUyx3QkFBd0IsWUFBeUM7QUFDeEUsS0FBSSxDQUFDLFdBQVksUUFBTztBQUN4QixLQUFJO0VBRUYsTUFBTSxXQURRLEtBQUssTUFBTSxXQUFXLENBQ2IsUUFBUSxTQUFTO0FBQ3RDLE9BQUksQ0FBQyxRQUFRLE9BQU8sU0FBUyxTQUFVLFFBQU87R0FDOUMsTUFBTSxTQUFTO0FBQ2YsVUFBTyxPQUFPLFNBQVMsY0FBYyxPQUFPLFNBQVMsVUFBVSxPQUFPLFNBQVM7SUFDL0U7QUFDRixTQUFPLFNBQVMsU0FBUyxJQUFJLFdBQVc7U0FDbEM7QUFDTjs7Ozs7Ozs7O0FBY0osZUFBc0IsWUFBWSxNQUcvQjtBQUNELE9BQU0sa0JBQWtCO0NBRXhCLElBQUk7Q0FDSixJQUFJLFlBQVk7QUFHaEIsS0FBSSxLQUFLLFlBQVksaUJBQWlCLFFBQVc7QUFDL0MsaUJBQWUsS0FBSyxXQUFXO0FBRS9CLE1BQUksS0FBSyxlQUFlLEtBQUssWUFBWSxTQUFTLEVBQ2hELE9BQU0sb0JBQW9CLGNBQWMsS0FBSyxZQUFZO0FBRzNELGNBQVksTUFBTSxnQkFBZ0IsaUJBQWlCLGFBQWE7T0FFaEUsZ0JBQWUsTUFBTSxnQkFBZ0IsVUFBVTtFQUM3QyxhQUFhLEtBQUs7RUFDbEIsZUFBZSxLQUFLO0VBQ3BCLFlBQVksS0FBSztFQUNqQixRQUFRLEtBQUs7RUFDYixjQUFjLEtBQUs7RUFDbkIscUJBQXFCLEtBQUs7RUFDM0IsQ0FBQztBQUdKLFFBQU87RUFBRTtFQUFjO0VBQVc7O0FBR3BDLGVBQXNCLFdBQ3BCLGNBQ0EsV0FD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
146
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQtcnVuLWxpZmVjeWNsZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQtcnVuLWxpZmVjeWNsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBSZXF1ZXN0TG9nTW9kZWwgfSBmcm9tIFwiLi4vcmVxdWVzdC1sb2cvcmVxdWVzdC1sb2cubW9kZWxcIjtcbmltcG9ydCB7XG4gIGVzdGltYXRlSW1hZ2VHZW5lcmF0aW9uQ29zdE1pY3JvVXNkLFxuICBpbWFnZUdlbmVyYXRpb25Db3N0TWV0aG9kLFxufSBmcm9tIFwiLi9xZ3JpZC1pbWFnZS1nZW5lcmF0aW9uXCI7XG5pbXBvcnQge1xuICBidWlsZEltYWdlR2VuZXJhdGlvblRvb2xTdGVwcyxcbiAgZm9ybWF0UmVzcG9uc2VGb3JMb2csXG4gIGdldEltYWdlUGFydHMsXG59IGZyb20gXCIuL3FncmlkLXJlc3BvbnNlLWZvcm1hdFwiO1xuaW1wb3J0IHtcbiAgdHlwZSBRZ3JpZFJ1bkNvbnRleHQsXG4gIHR5cGUgUWdyaWRUb29sUmVzdWx0SW5wdXQsXG4gIHR5cGUgUXVlcnlJbnB1dCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbn0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwicnVuLWxpZmVjeWNsZVwiXSk7XG5jb25zdCBTVEFMRV9SVU5fVEhSRVNIT0xEX01TID0gMzAgKiA2MCAqIDEwMDA7XG5cbi8qKlxuICogaGlzdG9yeeuKlCDsm5Drs7gg6re464yA66GcIOyggOyepe2VmOq4sOuztOuLpOuKlCwgcnVuIOu2hOyEneyXkCDtlYTsmpTtlZwgdXNlci9hc3Npc3RhbnQg7KCV67O066eMIO2VhO2EsOunge2VtOyEnCDsoIDsnqVcbiAqL1xuZnVuY3Rpb24gZmlsdGVySGlzdG9yeUZvclN0b3JhZ2UocmF3SGlzdG9yeTogc3RyaW5nIHwgdW5kZWZpbmVkKTogdW5rbm93biB7XG4gIGlmICghcmF3SGlzdG9yeSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjb25zdCBpdGVtcyA9IEpTT04ucGFyc2UocmF3SGlzdG9yeSkgYXMgdW5rbm93bltdO1xuICAgIGNvbnN0IGZpbHRlcmVkID0gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICBpZiAoIWl0ZW0gfHwgdHlwZW9mIGl0ZW0gIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHJlY29yZCA9IGl0ZW0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICByZXR1cm4gcmVjb3JkLnR5cGUgPT09IFwibWVzc2FnZVwiICYmIChyZWNvcmQucm9sZSA9PT0gXCJ1c2VyXCIgfHwgcmVjb3JkLnJvbGUgPT09IFwiYXNzaXN0YW50XCIpO1xuICAgIH0pO1xuICAgIHJldHVybiBmaWx0ZXJlZC5sZW5ndGggPiAwID8gZmlsdGVyZWQgOiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgUnVuTGlmZWN5Y2xlUmVzdWx0ID0ge1xuICBydW5Db250ZXh0PzogUWdyaWRSdW5Db250ZXh0O1xufTtcblxuLyoqXG4gKiBsb2dNb2RlOlwicnVuXCIg7IucIHF1ZXJ5L3N0cmVhbSDsnZHri7Ug7KCE7ZuE7JeQIO2YuOy2nC5cbiAqXG4gKiAxKSBiZWZvcmVRdWVyeTogcnVuIOyDneyEsS/qs4Tsho0gKyB0b29sIHJlc3VsdCDsmYTro4wgKyBzdGFsZSBjbGVhbnVwXG4gKiAyKSBhZnRlclF1ZXJ5OiBnZW5lcmF0ZSBzdGVwICsgdG9vbC1jYWxsIHN0ZXAgKyBmaW5pc2gva2VlcC1vcGVuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBiZWZvcmVRdWVyeShhcmdzOiBRdWVyeUlucHV0KTogUHJvbWlzZTx7XG4gIHJlcXVlc3RMb2dJZDogbnVtYmVyO1xuICBzdGVwSW5kZXg6IG51bWJlcjtcbn0+IHtcbiAgYXdhaXQgY2xlYW51cFN0YWxlUnVucygpO1xuXG4gIGxldCByZXF1ZXN0TG9nSWQ6IG51bWJlcjtcbiAgbGV0IHN0ZXBJbmRleCA9IDA7XG5cbiAgLy8gcmVxdWVzdExvZ0lkIOqwgCDsnojsnYQg65WM66eMIOq4sOyhtCBydW4g7Jew7J6lLiB0aHJlYWRDb29yZCDrp4wg7J6I64qUIGNvbnYg64qUIOyDiCBydW4g7Jy866GcIOyLnOyekS5cbiAgaWYgKGFyZ3MucnVuQ29udGV4dD8ucmVxdWVzdExvZ0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXF1ZXN0TG9nSWQgPSBhcmdzLnJ1bkNvbnRleHQucmVxdWVzdExvZ0lkO1xuXG4gICAgaWYgKGFyZ3MudG9vbFJlc3VsdHMgJiYgYXJncy50b29sUmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCBjb21wbGV0ZVRvb2xSZXN1bHRzKHJlcXVlc3RMb2dJZCwgYXJncy50b29sUmVzdWx0cyk7XG4gICAgfVxuXG4gICAgc3RlcEluZGV4ID0gYXdhaXQgUmVxdWVzdExvZ01vZGVsLmdldE5leHRTdGVwSW5kZXgocmVxdWVzdExvZ0lkKTtcbiAgfSBlbHNlIHtcbiAgICByZXF1ZXN0TG9nSWQgPSBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuY3JlYXRlUnVuKHtcbiAgICAgIHVzZXJfcHJvbXB0OiBhcmdzLnByb21wdCxcbiAgICAgIHN5c3RlbV9wcm9tcHQ6IGFyZ3Muc3lzdGVtLFxuICAgICAgbW9kZWxfbmFtZTogYXJncy5tb2RlbCxcbiAgICAgIGVmZm9ydDogYXJncy5lZmZvcnQsXG4gICAgICBwcm9qZWN0X25hbWU6IGFyZ3MucHJvamVjdE5hbWUsXG4gICAgICBpc19pbWFnZV9nZW5lcmF0aW9uOiBhcmdzLmltYWdlR2VuZXJhdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB7IHJlcXVlc3RMb2dJZCwgc3RlcEluZGV4IH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZnRlclF1ZXJ5KFxuICByZXF1ZXN0TG9nSWQ6IG51bWJlcixcbiAgc3RlcEluZGV4OiBudW1iZXIsXG4gIGFyZ3M6IFF1ZXJ5SW5wdXQsXG4gIHJlc3VsdDogUXVlcnlPdXRwdXQsXG4pOiBQcm9taXNlPFJ1bkxpZmVjeWNsZVJlc3VsdD4ge1xuICAvLyBnZW5lcmF0ZSBzdGVwIOq4sOuhnVxuICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuYXBwZW5kU3RlcChyZXF1ZXN0TG9nSWQsIHtcbiAgICBzdGVwX2luZGV4OiBzdGVwSW5kZXgsXG4gICAgdHlwZTogXCJnZW5lcmF0ZVwiLFxuICAgIGlucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmlucHV0X3Rva2VucyxcbiAgICBvdXRwdXRfdG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0X3Rva2VucyxcbiAgICBjYWNoZV9yZWFkX3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zLFxuICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VucyxcbiAgICBkdXJhdGlvbl9tczogcmVzdWx0LmR1cmF0aW9uTXMsXG4gICAgdHRmdF9tczogcmVzdWx0LnR0ZnRNcyxcbiAgICBmaW5pc2hfcmVhc29uOiByZXN1bHQuZmluaXNoUmVhc29uLFxuICB9KTtcblxuICBjb25zdCBpbWFnZVBhcnRzID0gZ2V0SW1hZ2VQYXJ0cyhyZXN1bHQpO1xuICBjb25zdCBpbWFnZUNvc3RNaWNyb1VzZCA9IGVzdGltYXRlSW1hZ2VHZW5lcmF0aW9uQ29zdE1pY3JvVXNkKFxuICAgIHJlc3VsdCxcbiAgICBhcmdzLmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICk7XG4gIGZvciAoY29uc3Qgc3RlcCBvZiBidWlsZEltYWdlR2VuZXJhdGlvblRvb2xTdGVwcyhhcmdzLCBpbWFnZVBhcnRzLCBzdGVwSW5kZXgpKSB7XG4gICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFwcGVuZFN0ZXAocmVxdWVzdExvZ0lkLCBzdGVwKTtcbiAgfVxuXG4gIGlmIChyZXN1bHQuZmluaXNoUmVhc29uID09PSBcInRvb2wtY2FsbHNcIikge1xuICAgIC8vIHRvb2wtY2FsbCBzdGVwIOymieyLnCDquLDroZ0gKHJlc3VsdOuKlCDrgpjspJHsl5AgY29tcGxldGVUb29sQ2FsbOuhnCDssYTsm4ApXG4gICAgY29uc3QgdG9vbENhbGxzID0gcmVzdWx0LmNvbnRlbnQuZmlsdGVyKChjKSA9PiBjLnR5cGUgPT09IFwidG9vbC1jYWxsXCIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9vbENhbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB0YyA9IHRvb2xDYWxsc1tpXSE7XG4gICAgICBpZiAodGMudHlwZSAhPT0gXCJ0b29sLWNhbGxcIikgY29udGludWU7XG4gICAgICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuYXBwZW5kU3RlcChyZXF1ZXN0TG9nSWQsIHtcbiAgICAgICAgc3RlcF9pbmRleDogc3RlcEluZGV4LFxuICAgICAgICB0eXBlOiBcInRvb2xfY2FsbFwiLFxuICAgICAgICB0b29sX2NhbGxfaW5kZXg6IGltYWdlUGFydHMubGVuZ3RoICsgaSxcbiAgICAgICAgdG9vbF9jYWxsX2lkOiB0Yy50b29sQ2FsbElkLFxuICAgICAgICB0b29sX25hbWU6IHRjLnRvb2xOYW1lLFxuICAgICAgICB0b29sX2FyZ3M6IHRjLmlucHV0LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcnVuQ29udGV4dDogeyByZXF1ZXN0TG9nSWQgfSB9O1xuICB9XG5cbiAgLy8gZmluaXNoUmVhc29uID09PSBcInN0b3BcIiDihpIgcnVuIOyiheujjCAo7KCE7LK0IHN0ZXAgdXNhZ2Ug7ZWp7IKwKVxuICBjb25zdCBhZ2cgPSBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuYWdncmVnYXRlU3RlcFVzYWdlKHJlcXVlc3RMb2dJZCk7XG4gIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5maW5pc2hSdW4ocmVxdWVzdExvZ0lkLCB7XG4gICAgc3RhdHVzOiBcInN1Y2NlZWRlZFwiLFxuICAgIHJlc3BvbnNlOiBmb3JtYXRSZXNwb25zZUZvckxvZyhyZXN1bHQpLFxuICAgIHRva2VuX25hbWU6IHJlc3VsdC50b2tlbk5hbWUsXG4gICAgaW5wdXRfdG9rZW5zOiBhZ2cuaW5wdXRfdG9rZW5zLFxuICAgIG91dHB1dF90b2tlbnM6IGFnZy5vdXRwdXRfdG9rZW5zLFxuICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBhZ2cuY2FjaGVfcmVhZF90b2tlbnMsXG4gICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBhZ2cuY2FjaGVfY3JlYXRpb25fdG9rZW5zLFxuICAgIGR1cmF0aW9uX21zOiBhZ2cuZHVyYXRpb25fbXMsXG4gICAgaW1hZ2VfY29zdF91c2Q6IGltYWdlQ29zdE1pY3JvVXNkLFxuICAgIGltYWdlX2Nvc3RfbWV0aG9kOlxuICAgICAgaW1hZ2VDb3N0TWljcm9Vc2QgIT09IG51bGwgPyBpbWFnZUdlbmVyYXRpb25Db3N0TWV0aG9kKGFyZ3MuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucykgOiBudWxsLFxuICAgIGhpc3Rvcnk6IGZpbHRlckhpc3RvcnlGb3JTdG9yYWdlKGFyZ3MuaGlzdG9yeSksXG4gIH0pO1xuXG4gIHJldHVybiB7fTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmlzaFJ1bldpdGhFcnJvcihcbiAgcmVxdWVzdExvZ0lkOiBudW1iZXIsXG4gIGVycm9yTWVzc2FnZTogc3RyaW5nLFxuICBhcmdzPzogUXVlcnlJbnB1dCxcbik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5maW5pc2hSdW4ocmVxdWVzdExvZ0lkLCB7XG4gICAgICBzdGF0dXM6IFwiZXJyb3JcIixcbiAgICAgIGVycm9yX21lc3NhZ2U6IGVycm9yTWVzc2FnZSxcbiAgICAgIGhpc3Rvcnk6IGFyZ3MgPyBmaWx0ZXJIaXN0b3J5Rm9yU3RvcmFnZShhcmdzLmhpc3RvcnkpIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nZ2VyLmVycm9yKGBmaW5pc2hSdW5XaXRoRXJyb3IgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5pc2hSdW5BYm9ydGVkKHJlcXVlc3RMb2dJZDogbnVtYmVyLCBhcmdzPzogUXVlcnlJbnB1dCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5maW5pc2hSdW4ocmVxdWVzdExvZ0lkLCB7XG4gICAgICBzdGF0dXM6IFwiYWJvcnRlZFwiLFxuICAgICAgZXJyb3JfbWVzc2FnZTogXCJjbGllbnQgZGlzY29ubmVjdGVkXCIsXG4gICAgICBoaXN0b3J5OiBhcmdzID8gZmlsdGVySGlzdG9yeUZvclN0b3JhZ2UoYXJncy5oaXN0b3J5KSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci5lcnJvcihgZmluaXNoUnVuQWJvcnRlZCBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY29tcGxldGVUb29sUmVzdWx0cyhcbiAgcmVxdWVzdExvZ0lkOiBudW1iZXIsXG4gIHRvb2xSZXN1bHRzOiBRZ3JpZFRvb2xSZXN1bHRJbnB1dFtdLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGZvciAoY29uc3QgdHIgb2YgdG9vbFJlc3VsdHMpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmNvbXBsZXRlVG9vbENhbGwocmVxdWVzdExvZ0lkLCB0ci50b29sQ2FsbElkLCB7XG4gICAgICAgIHRvb2xfcmVzdWx0OiB0ci5pc0Vycm9yID8gdW5kZWZpbmVkIDogdHIub3V0cHV0LFxuICAgICAgICBlcnJvcjogdHIuaXNFcnJvciA/IHRyLm91dHB1dCA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgY29tcGxldGVUb29sQ2FsbCBmYWlsZWQgZm9yICR7dHIudG9vbENhbGxJZH06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNsZWFudXBTdGFsZVJ1bnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhbGVJZHMgPSBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZmluZFN0YWxlUnVubmluZ0lkcyhTVEFMRV9SVU5fVEhSRVNIT0xEX01TKTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIHN0YWxlSWRzKSB7XG4gICAgICBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuZmluaXNoUnVuKGlkLCB7XG4gICAgICAgIHN0YXR1czogXCJlcnJvclwiLFxuICAgICAgICBlcnJvcl9tZXNzYWdlOiBcInRvb2wtY2FsbCBydW46IG5vIGZvbGxvdy11cCB3aXRoaW4gMzAgbWludXRlc1wiLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChzdGFsZUlkcy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgY2xlYW5lZCB1cCAke3N0YWxlSWRzLmxlbmd0aH0gc3RhbGUgcnVubmluZyByZXF1ZXN0IGxvZ3NgKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIuZXJyb3IoYHN0YWxlIGNsZWFudXAgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQW1CQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsZ0JBQWdCLENBQUM7QUFDcEQsTUFBTSx5QkFBeUIsT0FBVTs7OztBQUt6QyxTQUFTLHdCQUF3QixZQUF5QztBQUN4RSxLQUFJLENBQUMsV0FBWSxRQUFPO0FBQ3hCLEtBQUk7RUFFRixNQUFNLFdBRFEsS0FBSyxNQUFNLFdB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
@@ -1,7 +1,7 @@
1
1
  import "../../_virtual/_rolldown/runtime.js";
2
2
  import { buildAuthUrl, exchangeCodeForTokens, fetchUsage, generatePKCE, refreshAccessToken } from "./oauth.js";
3
3
  import { estimateImageGenerationCostMicroUsd, imageGenerationCostMethod } from "./qgrid-image-generation.js";
4
- import { formatImagePartForLog, formatResponseForLog, getImageParts, imageGenerationToolArgs } from "./qgrid-response-format.js";
4
+ import { buildImageGenerationToolSteps, formatResponseForLog, getImageParts } from "./qgrid-response-format.js";
5
5
  import { __decorateMetadata } from "../../_virtual/_@oxc-project_runtime@0.122.0/helpers/decorateMetadata.js";
6
6
  import { __decorate } from "../../_virtual/_@oxc-project_runtime@0.122.0/helpers/decorate.js";
7
7
  import { MICRO_USD, RequestLogModel } from "../request-log/request-log.model.js";
@@ -117,18 +117,7 @@ var QgridFrameClass = class extends BaseFrameClass {
117
117
  }]).then(async (ids) => {
118
118
  const requestLogId = ids[0];
119
119
  if (!requestLogId || imageParts.length === 0) return;
120
- for (let i = 0; i < imageParts.length; i++) {
121
- const image = imageParts[i];
122
- await RequestLogModel.appendStep(requestLogId, {
123
- step_index: 0,
124
- type: "tool_call",
125
- tool_call_index: i,
126
- tool_call_id: `image_generation:0:${i}`,
127
- tool_name: "image_generation",
128
- tool_args: imageGenerationToolArgs(args),
129
- tool_result: formatImagePartForLog(image)
130
- });
131
- }
120
+ for (const step of buildImageGenerationToolSteps(args, imageParts, 0)) await RequestLogModel.appendStep(requestLogId, step);
132
121
  }).catch((e) => logger.error(`requestLog save failed: ${e.message}`));
133
122
  }
134
123
  async prepareStream(args) {
@@ -632,4 +621,4 @@ function convertAnthropicUsage(raw) {
632
621
  //#endregion
633
622
  export { QgridFrame };
634
623
 
635
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZnJhbWUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmZyYW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcnlwdG8gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyBhcGksIEJhZFJlcXVlc3RFeGNlcHRpb24sIEJhc2VGcmFtZUNsYXNzLCBTb25hbXUsIHN0cmVhbSB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGdldENhY2hlTWFuYWdlclJlZiB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHsgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7XG4gIGdldEFjY2Vzc1Rva2VuLFxuICBnZXRFeHBpcmVzQXQsXG4gIGdldFJlZnJlc2hUb2tlbixcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vY3JlZGVudGlhbHNcIjtcbmltcG9ydCB7IE1JQ1JPX1VTRCwgUmVxdWVzdExvZ01vZGVsIH0gZnJvbSBcIi4uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2V0QSB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQge1xuICBUb2tlbkNyZWRlbnRpYWxzLFxuICBUb2tlblNhdmVQYXJhbXMsXG4gIHR5cGUgVG9rZW5TYXZlUGFyYW1zIGFzIFRva2VuU2F2ZVBhcmFtc1R5cGUsXG59IGZyb20gXCIuLi90b2tlbi90b2tlbi50eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBBbnRocm9waWNVc2FnZVJhdyxcbiAgYnVpbGRBdXRoVXJsLFxuICBleGNoYW5nZUNvZGVGb3JUb2tlbnMsXG4gIGZldGNoVXNhZ2UsXG4gIGdlbmVyYXRlUEtDRSxcbiAgcmVmcmVzaEFjY2Vzc1Rva2VuLFxufSBmcm9tIFwiLi9vYXV0aFwiO1xuaW1wb3J0IHtcbiAgYWZ0ZXJRdWVyeSxcbiAgYmVmb3JlUXVlcnksXG4gIGZpbmlzaFJ1bkFib3J0ZWQsXG4gIGZpbmlzaFJ1bldpdGhFcnJvcixcbn0gZnJvbSBcIi4vcWdyaWQtcnVuLWxpZmVjeWNsZVwiO1xuaW1wb3J0IHtcbiAgZm9ybWF0SW1hZ2VQYXJ0Rm9yTG9nLFxuICBmb3JtYXRSZXNwb25zZUZvckxvZyxcbiAgZ2V0SW1hZ2VQYXJ0cyxcbiAgaW1hZ2VHZW5lcmF0aW9uVG9vbEFyZ3MsXG59IGZyb20gXCIuL3FncmlkLXJlc3BvbnNlLWZvcm1hdFwiO1xuaW1wb3J0IHtcbiAgZXN0aW1hdGVJbWFnZUdlbmVyYXRpb25Db3N0TWljcm9Vc2QsXG4gIGltYWdlR2VuZXJhdGlvbkNvc3RNZXRob2QsXG59IGZyb20gXCIuL3FncmlkLWltYWdlLWdlbmVyYXRpb25cIjtcbmltcG9ydCB7IFFncmlkRGlzcGF0Y2hlciB9IGZyb20gXCIuL3FncmlkLmRpc3BhdGNoZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgUXVlcnlJbnB1dCxcbiAgdHlwZSBBcHBlbmRTdGVwSW5wdXQsXG4gIHR5cGUgQ3JlYXRlUnVuSW5wdXQsXG4gIHR5cGUgRmluaXNoUnVuSW5wdXQsXG4gIHR5cGUgSGVhbHRoUmVzcG9uc2UsXG4gIHR5cGUgT0F1dGhTdGFydFJlc3VsdCxcbiAgdHlwZSBRdWVyeU91dHB1dCxcbiAgdHlwZSBRZ3JpZFJ1bkNvbnRleHQsXG4gIFN0cmVhbUV2ZW50cyxcbiAgdHlwZSBUb2tlblN0YXRzLFxuICB0eXBlIFVzYWdlUmVzcG9uc2UsXG59IGZyb20gXCIuL3FncmlkLnR5cGVzXCI7XG5cbmNvbnN0IHBlbmRpbmdTdHJlYW1zID0gbmV3IE1hcDxzdHJpbmcsIFF1ZXJ5SW5wdXQ+KCk7XG5cbnR5cGUgUGVuZGluZ09BdXRoID0geyBjb2RlVmVyaWZpZXI6IHN0cmluZzsgbmFtZTogc3RyaW5nOyByZWRpcmVjdFVyaTogc3RyaW5nIH07XG5jb25zdCBPQVVUSF9TVEFURV9QUkVGSVggPSBcIm9hdXRoOnN0YXRlOlwiO1xuY29uc3QgT0FVVEhfU1RBVEVfVFRMID0gXCI1bVwiO1xuXG5mdW5jdGlvbiB1bml4U2Vjb25kc1RvSXNvKHNlY29uZHM6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuIHR5cGVvZiBzZWNvbmRzID09PSBcIm51bWJlclwiID8gbmV3IERhdGUoc2Vjb25kcyAqIDEwMDApLnRvSVNPU3RyaW5nKCkgOiBudWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXRPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcsIGRhdGE6IFBlbmRpbmdPQXV0aCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjYWNoZSA9IGdldENhY2hlTWFuYWdlclJlZigpO1xuICBpZiAoIWNhY2hlKSB0aHJvdyBuZXcgRXJyb3IoXCJDYWNoZU1hbmFnZXIgbm90IGluaXRpYWxpemVkXCIpO1xuICBhd2FpdCBjYWNoZS5zZXQoe1xuICAgIGtleTogYCR7T0FVVEhfU1RBVEVfUFJFRklYfSR7c3RhdGV9YCxcbiAgICB2YWx1ZTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgdHRsOiBPQVVUSF9TVEFURV9UVEwsXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcpOiBQcm9taXNlPFBlbmRpbmdPQXV0aCB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBjYWNoZSA9IGdldENhY2hlTWFuYWdlclJlZigpO1xuICBpZiAoIWNhY2hlKSB0aHJvdyBuZXcgRXJyb3IoXCJDYWNoZU1hbmFnZXIgbm90IGluaXRpYWxpemVkXCIpO1xuICBjb25zdCByYXcgPSBhd2FpdCBjYWNoZS5nZXQ8c3RyaW5nPih7IGtleTogYCR7T0FVVEhfU1RBVEVfUFJFRklYfSR7c3RhdGV9YCB9KTtcbiAgaWYgKCFyYXcpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgUGVuZGluZ09BdXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2FjaGUgPSBnZXRDYWNoZU1hbmFnZXJSZWYoKTtcbiAgaWYgKCFjYWNoZSkgcmV0dXJuO1xuICBhd2FpdCBjYWNoZS5kZWxldGUoeyBrZXk6IGAke09BVVRIX1NUQVRFX1BSRUZJWH0ke3N0YXRlfWAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE9BdXRoUmVkaXJlY3RVcmkoKTogc3RyaW5nIHtcbiAgY29uc3QgcHVibGljQmFzZVVybCA9IHByb2Nlc3MuZW52LlFHUklEX1BVQkxJQ19CQVNFX1VSTD8ucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcbiAgaWYgKHB1YmxpY0Jhc2VVcmwpIHJldHVybiBgJHtwdWJsaWNCYXNlVXJsfS9jYWxsYmFja2A7XG5cbiAgY29uc3Qgc2VydmVyUG9ydCA9IHByb2Nlc3MuZW52LlBPUlQgPz8gXCI0NDkwMFwiO1xuICByZXR1cm4gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtzZXJ2ZXJQb3J0fS9jYWxsYmFja2A7XG59XG5cbmZ1bmN0aW9uIHJlamVjdEltYWdlR2VuZXJhdGlvblN0cmVhbShhcmdzOiBRdWVyeUlucHV0KTogdm9pZCB7XG4gIGlmICghYXJncy5pbWFnZUdlbmVyYXRpb24pIHJldHVybjtcbiAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgXCJxZ3JpZDogaW1hZ2VHZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBzdHJlYW1pbmc7IHVzZSBxdWVyeS9nZW5lcmF0ZVRleHQgaW5zdGVhZC5cIiBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICk7XG59XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiXSk7XG5jb25zdCBvYXV0aExvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcIm9hdXRoXCJdKTtcblxuY2xhc3MgUWdyaWRGcmFtZUNsYXNzIGV4dGVuZHMgQmFzZUZyYW1lQ2xhc3Mge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlFncmlkXCIpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHF1ZXJ5KGFyZ3M6IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPFF1ZXJ5T3V0cHV0PiB7XG4gICAgY29uc3QgZWZmZWN0aXZlTG9nTW9kZSA9IGFyZ3MubG9nTW9kZSA/PyAoYXJncy5pc1N0ZXAgPyBcInJ1blwiIDogXCJhdXRvXCIpO1xuXG4gICAgLy8gbG9nTW9kZTogXCJydW5cIiDihpIg7ISc67KE6rCAIGxpZmVjeWNsZSDqtIDrpqxcbiAgICBpZiAoZWZmZWN0aXZlTG9nTW9kZSA9PT0gXCJydW5cIikge1xuICAgICAgY29uc3QgeyByZXF1ZXN0TG9nSWQsIHN0ZXBJbmRleCB9ID0gYXdhaXQgYmVmb3JlUXVlcnkoYXJncyk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBRZ3JpZERpc3BhdGNoZXIucXVlcnkoYXJncywgYXJncy50aW1lb3V0KTtcbiAgICAgICAgY29uc3QgbGlmZWN5Y2xlID0gYXdhaXQgYWZ0ZXJRdWVyeShyZXF1ZXN0TG9nSWQsIHN0ZXBJbmRleCwgYXJncywgcmVzdWx0KTtcbiAgICAgICAgLy8gbGlmZWN5Y2xlLnJ1bkNvbnRleHQocmVxdWVzdExvZ0lkKSDsmYAgZGlzcGF0Y2hlciDqsIAg7Iuk7J2AIHRocmVhZENvb3JkIOulvCDrs5HtlakuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgIHJ1bkNvbnRleHQ6IHsgLi4ubGlmZWN5Y2xlLnJ1bkNvbnRleHQsIHRocmVhZENvb3JkOiByZXN1bHQucnVuQ29udGV4dD8udGhyZWFkQ29vcmQgfSxcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgYXdhaXQgZmluaXNoUnVuV2l0aEVycm9yKHJlcXVlc3RMb2dJZCwgKGUgYXMgRXJyb3IpLm1lc3NhZ2UsIGFyZ3MpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGxvZ01vZGU6IFwiYXV0b1wiICjquLDsobQgbm9uLXN0ZXAg6rK966GcKSDrmJDripQgXCJub25lXCJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBRZ3JpZERpc3BhdGNoZXIucXVlcnkoYXJncywgYXJncy50aW1lb3V0KTtcblxuICAgIGlmIChlZmZlY3RpdmVMb2dNb2RlID09PSBcImF1dG9cIikge1xuICAgICAgdGhpcy5zYXZlQXV0b1JlcXVlc3RMb2coYXJncywgcmVzdWx0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gbG9nTW9kZSBcImF1dG9cIiDri6jsnbwg7JqU7LKtIOuhnOq5hTogcnVuIGxpZmVjeWNsZShzdGVwIOu2hO2VtCkg7JeG7J20IHJlcXVlc3RfbG9nIDHqsbTrp4wg64Ko6ri064ukLlxuICAvLyBxdWVyeeyZgCBxdWVyeVN0cmVhbSDslpHsqr3sl5DshJwg7IKs7JqpLlxuICBwcml2YXRlIHNhdmVBdXRvUmVxdWVzdExvZyhhcmdzOiBRdWVyeUlucHV0LCByZXN1bHQ6IFF1ZXJ5T3V0cHV0KTogdm9pZCB7XG4gICAgY29uc3QgaW1hZ2VQYXJ0cyA9IGdldEltYWdlUGFydHMocmVzdWx0KTtcbiAgICBjb25zdCBpbWFnZUNvc3RNaWNyb1VzZCA9IGVzdGltYXRlSW1hZ2VHZW5lcmF0aW9uQ29zdE1pY3JvVXNkKFxuICAgICAgcmVzdWx0LFxuICAgICAgYXJncy5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgICk7XG4gICAgY29uc3QgdG9vbENhbGxDb3VudCA9IHJlc3VsdC5jb250ZW50LmZpbHRlcigoaXRlbSkgPT4gaXRlbS50eXBlID09PSBcInRvb2wtY2FsbFwiKS5sZW5ndGg7XG4gICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gZm9ybWF0UmVzcG9uc2VGb3JMb2cocmVzdWx0KTtcblxuICAgIFJlcXVlc3RMb2dNb2RlbC5zYXZlKFtcbiAgICAgIHtcbiAgICAgICAgdG9rZW5fbmFtZTogcmVzdWx0LnRva2VuTmFtZSxcbiAgICAgICAgcHJvamVjdF9uYW1lOiBhcmdzLnByb2plY3ROYW1lPy5sZW5ndGggPyBhcmdzLnByb2plY3ROYW1lIDogbnVsbCxcbiAgICAgICAgbW9kZWxfbmFtZTogcmVzdWx0Lm1vZGVsID8/IG51bGwsXG4gICAgICAgIHVzZXJfcHJvbXB0OiBhcmdzLnByb21wdCxcbiAgICAgICAgc3lzdGVtX3Byb21wdDogYXJncy5zeXN0ZW0gPz8gbnVsbCxcbiAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlVGV4dCxcbiAgICAgICAgaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRfdG9rZW5zLFxuICAgICAgICBvdXRwdXRfdG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0X3Rva2VucyxcbiAgICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZV9yZWFkX2lucHV0X3Rva2VucyxcbiAgICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zLFxuICAgICAgICBkdXJhdGlvbl9tczogcmVzdWx0LmR1cmF0aW9uTXMsXG4gICAgICAgIHR0ZnRfbXM6IHJlc3VsdC50dGZ0TXMsXG4gICAgICAgIGNvc3RfdXNkOiByZXN1bHQuY29zdFVzZCAhPT0gbnVsbCA/IE1hdGgucm91bmQocmVzdWx0LmNvc3RVc2QgKiBNSUNST19VU0QpIDogbnVsbCxcbiAgICAgICAgaW1hZ2VfY29zdF91c2Q6IGltYWdlQ29zdE1pY3JvVXNkLFxuICAgICAgICBpbWFnZV9jb3N0X21ldGhvZDpcbiAgICAgICAgICBpbWFnZUNvc3RNaWNyb1VzZCAhPT0gbnVsbCA/IGltYWdlR2VuZXJhdGlvbkNvc3RNZXRob2QoYXJncy5pbWFnZUdlbmVyYXRpb25PcHRpb25zKSA6IG51bGwsXG4gICAgICAgIGVmZm9ydDogYXJncy5lZmZvcnQgPz8gbnVsbCxcbiAgICAgICAgLy8gbWFsZm9ybWVkIGhpc3RvcnnqsIAg7JmA64+EIOyEseqzte2VnCDthLQo7Yq57Z6IIHN0cmVhbSBzc2UuZW5kKCkp7J2EIOq5qOyngCDslYrrj4TroZ0g67Cp7Ja0LlxuICAgICAgICBoaXN0b3J5OiAoKCk6IHsgdHlwZTogc3RyaW5nIH1bXSB8IG51bGwgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXJncy5oaXN0b3J5ID8gSlNPTi5wYXJzZShhcmdzLmhpc3RvcnkpIDogbnVsbDtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKSxcbiAgICAgICAgc3RhdHVzOiBcInN1Y2NlZWRlZFwiLFxuICAgICAgICB0b29sX2NhbGxfY291bnQ6IHRvb2xDYWxsQ291bnQsXG4gICAgICAgIC8vIOydtOuvuOyngCB0dXJuIOyLneuzhChSMTMpOiBxdW90YSDshozrqqjrpbwg7J2066+47KeAIOybjO2BrOuhnOuTnOyXkCDqt4Dsho0uXG4gICAgICAgIGlzX2ltYWdlX2dlbmVyYXRpb246IGFyZ3MuaW1hZ2VHZW5lcmF0aW9uID8/IGZhbHNlLFxuICAgICAgfSxcbiAgICBdKVxuICAgICAgLnRoZW4oYXN5bmMgKGlkcykgPT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0TG9nSWQgPSBpZHNbMF07XG4gICAgICAgIGlmICghcmVxdWVzdExvZ0lkIHx8IGltYWdlUGFydHMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW1hZ2VQYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGltYWdlID0gaW1hZ2VQYXJ0c1tpXSE7XG4gICAgICAgICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmFwcGVuZFN0ZXAocmVxdWVzdExvZ0lkLCB7XG4gICAgICAgICAgICBzdGVwX2luZGV4OiAwLFxuICAgICAgICAgICAgdHlwZTogXCJ0b29sX2NhbGxcIixcbiAgICAgICAgICAgIHRvb2xfY2FsbF9pbmRleDogaSxcbiAgICAgICAgICAgIHRvb2xfY2FsbF9pZDogYGltYWdlX2dlbmVyYXRpb246MDoke2l9YCxcbiAgICAgICAgICAgIHRvb2xfbmFtZTogXCJpbWFnZV9nZW5lcmF0aW9uXCIsXG4gICAgICAgICAgICB0b29sX2FyZ3M6IGltYWdlR2VuZXJhdGlvblRvb2xBcmdzKGFyZ3MpLFxuICAgICAgICAgICAgdG9vbF9yZXN1bHQ6IGZvcm1hdEltYWdlUGFydEZvckxvZyhpbWFnZSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGUpID0+IGxvZ2dlci5lcnJvcihgcmVxdWVzdExvZyBzYXZlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgcHJlcGFyZVN0cmVhbShhcmdzOiBRdWVyeUlucHV0KTogUHJvbWlzZTx7IHN0cmVhbUlkOiBzdHJpbmcgfT4ge1xuICAgIHJlamVjdEltYWdlR2VuZXJhdGlvblN0cmVhbShhcmdzKTtcbiAgICBjb25zdCBzdHJlYW1JZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgcGVuZGluZ1N0cmVhbXMuc2V0KHN0cmVhbUlkLCBhcmdzKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHBlbmRpbmdTdHJlYW1zLmRlbGV0ZShzdHJlYW1JZCksIDMwXzAwMCk7XG4gICAgcmV0dXJuIHsgc3RyZWFtSWQgfTtcbiAgfVxuXG4gIEBzdHJlYW0oeyB0eXBlOiBcInNzZVwiLCBldmVudHM6IFN0cmVhbUV2ZW50cyB9KVxuICBhc3luYyBxdWVyeVN0cmVhbShzdHJlYW1JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYXJncyA9IHBlbmRpbmdTdHJlYW1zLmdldChzdHJlYW1JZCk7XG4gICAgcGVuZGluZ1N0cmVhbXMuZGVsZXRlKHN0cmVhbUlkKTtcbiAgICBpZiAoIWFyZ3MpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgb3IgZXhwaXJlZCBzdHJlYW1JZFwiKTtcbiAgICByZWplY3RJbWFnZUdlbmVyYXRpb25TdHJlYW0oYXJncyk7XG5cbiAgICBjb25zdCBlZmZlY3RpdmVMb2dNb2RlID0gYXJncy5sb2dNb2RlID8/IChhcmdzLmlzU3RlcCA/IFwicnVuXCIgOiBcImF1dG9cIik7XG4gICAgY29uc3Qgc2hvdWxkTG9nID0gZWZmZWN0aXZlTG9nTW9kZSA9PT0gXCJydW5cIjtcblxuICAgIGxldCBydW5JbmZvOiB7IHJlcXVlc3RMb2dJZDogbnVtYmVyOyBzdGVwSW5kZXg6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgIGlmIChzaG91bGRMb2cpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJ1bkluZm8gPSBhd2FpdCBiZWZvcmVRdWVyeShhcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBzdHJlYW0gYmVmb3JlUXVlcnkgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGN0eCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgY29uc3Qgc3NlID0gY3R4LmNyZWF0ZVNTRShTdHJlYW1FdmVudHMpO1xuICAgIGxldCB0aHJlYWRJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCB0dXJuSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc3RyZWFtUmVzdWx0OiBRdWVyeU91dHB1dCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc3RyZWFtRXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIGNvbnN0IGludGVycnVwdE9wZW5BSSA9ICgpID0+IHtcbiAgICAgIGlmICh0aHJlYWRJZCAmJiB0dXJuSWQpIHtcbiAgICAgICAgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXI/LmludGVycnVwdFdvcmtlclR1cm4odGhyZWFkSWQsIHR1cm5JZCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBzc2Uub25DbG9zZSgoKSA9PiB7XG4gICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIGludGVycnVwdE9wZW5BSSgpO1xuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5xdWVyeVN0cmVhbShcbiAgICAgICAgYXJncyxcbiAgICAgICAge1xuICAgICAgICAgIG9uRGVsdGE6ICh0ZXh0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXNzZS5jbG9zZWQpIHNzZS5wdWJsaXNoKFwiZGVsdGFcIiwgeyB0ZXh0IH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25UaHJlYWRJZDogKGlkKSA9PiB7XG4gICAgICAgICAgICB0aHJlYWRJZCA9IGlkO1xuICAgICAgICAgICAgaWYgKHNzZS5jbG9zZWQgJiYgdHVybklkKSB7XG4gICAgICAgICAgICAgIGludGVycnVwdE9wZW5BSSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25UdXJuSWQ6IChpZCkgPT4ge1xuICAgICAgICAgICAgdHVybklkID0gaWQ7XG4gICAgICAgICAgICBpZiAoc3NlLmNsb3NlZCAmJiB0aHJlYWRJZCkge1xuICAgICAgICAgICAgICBpbnRlcnJ1cHRPcGVuQUkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uQ29tcGxldGU6IChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHN0cmVhbVJlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uRXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICAgIHN0cmVhbUVycm9yID0gZXJyO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHN0cmVhbUVycm9yID0gZSBhcyBFcnJvcjtcbiAgICB9XG5cbiAgICAvLyBkaXNwYXRjaGVyIOyZhOujjCDtm4QgbGlmZWN5Y2xlIOyymOumrCAoYXdhaXQg7JWI7KCEKVxuICAgIGlmIChzdHJlYW1SZXN1bHQpIHtcbiAgICAgIC8vIGRpc3BhdGNoZXIg6rCAIOyLpOydgCB0aHJlYWQg7J6s7IKs7JqpIOyijO2RnCAoYXV0by9ydW4g6rO17Ya17Jy866GcIO2BtOudvOyXkCDtmozshqHtlbTslbwg7ZWoKS5cbiAgICAgIGNvbnN0IHRocmVhZENvb3JkID0gc3RyZWFtUmVzdWx0LnJ1bkNvbnRleHQ/LnRocmVhZENvb3JkO1xuICAgICAgbGV0IHJ1bkNvbnRleHQ6IFFncmlkUnVuQ29udGV4dCB8IHVuZGVmaW5lZCA9XG4gICAgICAgIHRocmVhZENvb3JkICE9PSB1bmRlZmluZWQgPyB7IHRocmVhZENvb3JkIH0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAocnVuSW5mbykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGxpZmVjeWNsZSA9IGF3YWl0IGFmdGVyUXVlcnkoXG4gICAgICAgICAgICBydW5JbmZvLnJlcXVlc3RMb2dJZCxcbiAgICAgICAgICAgIHJ1bkluZm8uc3RlcEluZGV4LFxuICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgIHN0cmVhbVJlc3VsdCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJ1bkNvbnRleHQgPSB7IC4uLmxpZmVjeWNsZS5ydW5Db250ZXh0LCB0aHJlYWRDb29yZCB9O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGBzdHJlYW0gYWZ0ZXJRdWVyeSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZWZmZWN0aXZlTG9nTW9kZSA9PT0gXCJhdXRvXCIpIHtcbiAgICAgICAgLy8gcnVuIGxpZmVjeWNsZeydhCDslYgg7YOA64qUIOuLqOydvCBzdHJlYW0g7JqU7LKt64+EIHJlcXVlc3RfbG9nIDHqsbTsnYAg64Ko6ri064ukIChxdWVyeeyZgCDrjIDsua0pLlxuICAgICAgICB0aGlzLnNhdmVBdXRvUmVxdWVzdExvZyhhcmdzLCBzdHJlYW1SZXN1bHQpO1xuICAgICAgfVxuICAgICAgaWYgKCFzc2UuY2xvc2VkKSBzc2UucHVibGlzaChcImRvbmVcIiwgeyAuLi5zdHJlYW1SZXN1bHQsIHJ1bkNvbnRleHQgfSk7XG4gICAgfSBlbHNlIGlmIChzdHJlYW1FcnJvcikge1xuICAgICAgaWYgKHNzZS5jbG9zZWQgJiYgc3RyZWFtRXJyb3IubWVzc2FnZSA9PT0gXCJhYm9ydGVkXCIpIHtcbiAgICAgICAgaWYgKHJ1bkluZm8pIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocnVuSW5mby5yZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgICAgICBhd2FpdCBzc2UuZW5kKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChydW5JbmZvKSBhd2FpdCBmaW5pc2hSdW5XaXRoRXJyb3IocnVuSW5mby5yZXF1ZXN0TG9nSWQsIHN0cmVhbUVycm9yLm1lc3NhZ2UsIGFyZ3MpO1xuICAgICAgaWYgKCFzc2UuY2xvc2VkKSBzc2UucHVibGlzaChcImVycm9yXCIsIHsgbWVzc2FnZTogc3RyZWFtRXJyb3IubWVzc2FnZSB9KTtcbiAgICB9IGVsc2UgaWYgKHNzZS5jbG9zZWQgJiYgcnVuSW5mbykge1xuICAgICAgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChydW5JbmZvLnJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgfVxuXG4gICAgYXdhaXQgc3NlLmVuZCgpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIGNyZWF0ZVJ1bihpbnB1dDogQ3JlYXRlUnVuSW5wdXQpOiBQcm9taXNlPHsgcmVxdWVzdExvZ0lkOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHJlcXVlc3RMb2dJZCA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5jcmVhdGVSdW4oe1xuICAgICAgdXNlcl9wcm9tcHQ6IGlucHV0LnVzZXJQcm9tcHQsXG4gICAgICBtb2RlbF9uYW1lOiBpbnB1dC5tb2RlbE5hbWUsXG4gICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgIHByb2plY3RfbmFtZTogaW5wdXQucHJvamVjdE5hbWUsXG4gICAgICBzeXN0ZW1fcHJvbXB0OiBpbnB1dC5zeXN0ZW1Qcm9tcHQsXG4gICAgICBoaXN0b3J5OiBpbnB1dC5oaXN0b3J5ID8gSlNPTi5wYXJzZShpbnB1dC5oaXN0b3J5KSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICByZXR1cm4geyByZXF1ZXN0TG9nSWQgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBhcHBlbmRTdGVwKGlucHV0OiBBcHBlbmRTdGVwSW5wdXQpOiBQcm9taXNlPHsgc3RlcElkOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHN0ZXBJZCA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5hcHBlbmRTdGVwKGlucHV0LnJlcXVlc3RMb2dJZCwge1xuICAgICAgc3RlcF9pbmRleDogaW5wdXQuc3RlcEluZGV4LFxuICAgICAgdHlwZTogaW5wdXQudHlwZSxcbiAgICAgIGlucHV0X3Rva2VuczogaW5wdXQuaW5wdXRUb2tlbnMsXG4gICAgICBvdXRwdXRfdG9rZW5zOiBpbnB1dC5vdXRwdXRUb2tlbnMsXG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogaW5wdXQuY2FjaGVSZWFkVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBpbnB1dC5jYWNoZUNyZWF0aW9uVG9rZW5zLFxuICAgICAgZHVyYXRpb25fbXM6IGlucHV0LmR1cmF0aW9uTXMsXG4gICAgICB0dGZ0X21zOiBpbnB1dC50dGZ0TXMgPz8gbnVsbCxcbiAgICAgIGZpbmlzaF9yZWFzb246IGlucHV0LmZpbmlzaFJlYXNvbixcbiAgICAgIHJlYXNvbmluZ190ZXh0OiBpbnB1dC5yZWFzb25pbmdUZXh0LFxuICAgICAgcmVhc29uaW5nX3Rva2VuczogaW5wdXQucmVhc29uaW5nVG9rZW5zLFxuICAgICAgdG9vbF9jYWxsX2luZGV4OiBpbnB1dC50b29sQ2FsbEluZGV4LFxuICAgICAgdG9vbF9jYWxsX2lkOiBpbnB1dC50b29sQ2FsbElkLFxuICAgICAgdG9vbF9uYW1lOiBpbnB1dC50b29sTmFtZSxcbiAgICAgIHRvb2xfYXJnczogaW5wdXQudG9vbEFyZ3MsXG4gICAgICB0b29sX3Jlc3VsdDogaW5wdXQudG9vbFJlc3VsdCxcbiAgICAgIHRvb2xfZHVyYXRpb25fbXM6IGlucHV0LnRvb2xEdXJhdGlvbk1zLFxuICAgICAgZXJyb3I6IGlucHV0LmVycm9yLFxuICAgIH0pO1xuICAgIHJldHVybiB7IHN0ZXBJZCB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIGZpbmlzaFJ1bihpbnB1dDogRmluaXNoUnVuSW5wdXQpOiBQcm9taXNlPHsgb2s6IGJvb2xlYW4gfT4ge1xuICAgIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5maW5pc2hSdW4oaW5wdXQucmVxdWVzdExvZ0lkLCB7XG4gICAgICBzdGF0dXM6IGlucHV0LnN0YXR1cyxcbiAgICAgIHJlc3BvbnNlOiBpbnB1dC5yZXNwb25zZSxcbiAgICAgIHRva2VuX25hbWU6IGlucHV0LnRva2VuTmFtZSxcbiAgICAgIGlucHV0X3Rva2VuczogaW5wdXQudG90YWxJbnB1dFRva2VucyxcbiAgICAgIG91dHB1dF90b2tlbnM6IGlucHV0LnRvdGFsT3V0cHV0VG9rZW5zLFxuICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IGlucHV0LnRvdGFsQ2FjaGVSZWFkVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBpbnB1dC50b3RhbENhY2hlQ3JlYXRpb25Ub2tlbnMsXG4gICAgICBkdXJhdGlvbl9tczogaW5wdXQudG90YWxEdXJhdGlvbk1zLFxuICAgICAgaGlzdG9yeTogaW5wdXQuaGlzdG9yeSA/IEpTT04ucGFyc2UoaW5wdXQuaGlzdG9yeSkgOiB1bmRlZmluZWQsXG4gICAgICBlcnJvcl9tZXNzYWdlOiBpbnB1dC5lcnJvck1lc3NhZ2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgb2s6IHRydWUgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIHN0YXRzKCk6IFByb21pc2U8VG9rZW5TdGF0c1tdPiB7XG4gICAgcmV0dXJuIFFncmlkRGlzcGF0Y2hlci5nZXRTdGF0cygpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgdG90YWxDb3N0KHRva2VuTmFtZT86IHN0cmluZyk6IFByb21pc2U8eyB1c2Q6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIHsgdXNkOiBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwudG90YWxDb3N0KHsgdG9rZW5fbmFtZTogdG9rZW5OYW1lIH0pIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyBwcm9qZWN0TmFtZXMoKTogUHJvbWlzZTx7IG5hbWVzOiBzdHJpbmdbXSB9PiB7XG4gICAgcmV0dXJuIHsgbmFtZXM6IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5kaXN0aW5jdFByb2plY3ROYW1lcygpIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgYWRkVG9rZW4oXG4gICAgcHJvdmlkZXI6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogVG9rZW5DcmVkZW50aWFscyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBhZGRlZDogYm9vbGVhbiB9PiB7XG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5zYXZlKFtcbiAgICAgIHtcbiAgICAgICAgcHJvdmlkZXIsXG4gICAgICAgIGNyZWRlbnRpYWxzLFxuICAgICAgICBuYW1lLFxuICAgICAgfSxcbiAgICBdKTtcbiAgICByZXR1cm4geyBhZGRlZDogdHJ1ZSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHVwZGF0ZVRva2VuKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZT86IHN0cmluZyxcbiAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGwsXG4gICk6IFByb21pc2U8eyB1cGRhdGVkOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE9uZShcIkFcIiwgeyBpZCB9KTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm4geyB1cGRhdGVkOiBmYWxzZSB9O1xuXG4gICAgY29uc3QgcGF0Y2g6IFRva2VuU2F2ZVBhcmFtc1R5cGUgPSB7XG4gICAgICBpZDogZW50cnkuaWQsXG4gICAgICBwcm92aWRlcjogZW50cnkucHJvdmlkZXIsXG4gICAgICBjcmVkZW50aWFsczogZW50cnkuY3JlZGVudGlhbHMsXG4gICAgICBuYW1lOiBuYW1lICE9PSB1bmRlZmluZWQgPyBuYW1lIDogZW50cnkubmFtZSxcbiAgICB9O1xuICAgIGlmIChxdW90YVRocmVzaG9sZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXRjaC5xdW90YV90aHJlc2hvbGQgPSBxdW90YVRocmVzaG9sZDtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWQgPSBUb2tlblNhdmVQYXJhbXMuc2FmZVBhcnNlKHBhdGNoKTtcbiAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgXCJxdW90YVRocmVzaG9sZCBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAxMDAsIG9yIG51bGxcIiBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICAgICAgIHsgem9kRXJyb3I6IHBhcnNlZC5lcnJvciB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW3BhcnNlZC5kYXRhXSk7XG4gICAgcmV0dXJuIHsgdXBkYXRlZDogdHJ1ZSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHJlbW92ZVRva2VuKGlkOiBudW1iZXIpOiBQcm9taXNlPHsgcmVtb3ZlZDogYm9vbGVhbiB9PiB7XG4gICAgY29uc3QgZW50cnkgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRPbmUoXCJBXCIsIHsgaWQgfSk7XG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuIHsgcmVtb3ZlZDogZmFsc2UgfTtcbiAgICBhd2FpdCBUb2tlbk1vZGVsLmRlbChbZW50cnkuaWRdKTtcbiAgICByZXR1cm4geyByZW1vdmVkOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICog7Yag7YGwIO2ZnOyEse2ZlC/ruYTtmZzshLHtmZQg7Yag6riAIERC7J2YIGFjdGl2ZSDtlYTrk5wg7JeF642w7J207Yq4XG4gICAqL1xuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgdG9nZ2xlVG9rZW4oaWQ6IG51bWJlcik6IFByb21pc2U8eyBhY3RpdmU6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kT25lKFwiQVwiLCB7IGlkIH0pO1xuICAgIGlmICghZW50cnkpIHJldHVybiB7IGFjdGl2ZTogZmFsc2UgfTtcblxuICAgIGNvbnN0IG5ld0FjdGl2ZSA9ICFlbnRyeS5hY3RpdmU7XG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5zYXZlKFtcbiAgICAgIHtcbiAgICAgICAgaWQsXG4gICAgICAgIHByb3ZpZGVyOiBlbnRyeS5wcm92aWRlcixcbiAgICAgICAgY3JlZGVudGlhbHM6IGVudHJ5LmNyZWRlbnRpYWxzLFxuICAgICAgICBhY3RpdmU6IG5ld0FjdGl2ZSxcbiAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgIH0sXG4gICAgXSk7XG4gICAgcmV0dXJuIHsgYWN0aXZlOiBuZXdBY3RpdmUgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBvYXV0aFN0YXJ0KG5hbWU6IHN0cmluZyk6IFByb21pc2U8T0F1dGhTdGFydFJlc3VsdD4ge1xuICAgIGNvbnN0IHsgY29kZVZlcmlmaWVyLCBjb2RlQ2hhbGxlbmdlLCBzdGF0ZSB9ID0gZ2VuZXJhdGVQS0NFKCk7XG5cbiAgICBjb25zdCByZWRpcmVjdFVyaSA9IGdldE9BdXRoUmVkaXJlY3RVcmkoKTtcbiAgICBjb25zdCBhdXRoVXJsID0gYnVpbGRBdXRoVXJsKGNvZGVDaGFsbGVuZ2UsIHN0YXRlLCByZWRpcmVjdFVyaSk7XG5cbiAgICBhd2FpdCBzZXRPQXV0aFN0YXRlKHN0YXRlLCB7IGNvZGVWZXJpZmllciwgbmFtZSwgcmVkaXJlY3RVcmkgfSk7XG5cbiAgICByZXR1cm4geyBhdXRoVXJsIH07XG4gIH1cblxuICBhc3luYyBoYW5kbGVPQXV0aENhbGxiYWNrKGNvZGU6IHN0cmluZywgc3RhdGU6IHN0cmluZywgcmVwbHk6IEZhc3RpZnlSZXBseSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBlbmRpbmcgPSBhd2FpdCBnZXRPQXV0aFN0YXRlKHN0YXRlKTtcbiAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgIGxvZ2dlci53YXJuKFwib2F1dGggY2FsbGJhY2s6IGludmFsaWRfc3RhdGVcIik7XG4gICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoXCIvP29hdXRoPWVycm9yJnJlYXNvbj1pbnZhbGlkX3N0YXRlXCIpO1xuICAgIH1cbiAgICBhd2FpdCBkZWxldGVPQXV0aFN0YXRlKHN0YXRlKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b2tlbnMgPSBhd2FpdCBleGNoYW5nZUNvZGVGb3JUb2tlbnMoXG4gICAgICAgIGNvZGUsXG4gICAgICAgIHBlbmRpbmcuY29kZVZlcmlmaWVyLFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgcGVuZGluZy5yZWRpcmVjdFVyaSxcbiAgICAgICk7XG5cbiAgICAgIGlmICh0b2tlbnMuYWNjb3VudFV1aWQpIHtcbiAgICAgICAgY29uc3Qgb2xkRW50cmllcyA9IGF3YWl0IFRva2VuTW9kZWwuZmluZEJ5QWNjb3VudElkZW50aWZpZXIoXG4gICAgICAgICAgXCJBXCIsXG4gICAgICAgICAgXCJhbnRocm9waWNcIixcbiAgICAgICAgICB0b2tlbnMuYWNjb3VudFV1aWQsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvbGRFbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBhd2FpdCBUb2tlbk1vZGVsLmRlbChvbGRFbnRyaWVzLm1hcCgobykgPT4gby5pZCkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlcjogXCJhbnRocm9waWNcIixcbiAgICAgICAgICBjcmVkZW50aWFsczoge1xuICAgICAgICAgICAgYWNjZXNzVG9rZW46IHRva2Vucy5hY2Nlc3NUb2tlbixcbiAgICAgICAgICAgIHJlZnJlc2hUb2tlbjogdG9rZW5zLnJlZnJlc2hUb2tlbixcbiAgICAgICAgICAgIGV4cGlyZXNBdDogdG9rZW5zLmV4cGlyZXNBdCA/PyAwLFxuICAgICAgICAgICAgYWNjb3VudFV1aWQ6IHRva2Vucy5hY2NvdW50VXVpZCA/PyBcIlwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbmFtZTogcGVuZGluZy5uYW1lLFxuICAgICAgICB9LFxuICAgICAgXSk7XG5cbiAgICAgIHJldHVybiByZXBseS5yZWRpcmVjdChgLz9vYXV0aD1zdWNjZXNzJm5hbWU9JHtlbmNvZGVVUklDb21wb25lbnQocGVuZGluZy5uYW1lKX1gKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoYC8/b2F1dGg9ZXJyb3ImcmVhc29uPSR7ZW5jb2RlVVJJQ29tcG9uZW50KChlIGFzIEVycm9yKS5tZXNzYWdlKX1gKTtcbiAgICB9XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgb2F1dGhTdGFydE9wZW5BSShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPE9BdXRoU3RhcnRSZXN1bHQ+IHtcbiAgICBpZiAoIVFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyKSB0aHJvdyBuZXcgRXJyb3IoXCJPcGVuQUkgZGlzcGF0Y2hlciBub3QgaW5pdGlhbGl6ZWRcIik7XG4gICAgY29uc3QgeyBhdXRoVXJsIH0gPSBhd2FpdCBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlci5zdGFydEJyb3dzZXJMb2dpbihuYW1lKTtcblxuICAgIC8vIGZpcmUtYW5kLWZvcmdldDogY29kZXggbG9naW4g7JmE66OMIOuMgOq4sCDihpIg7Yag7YGwIOyggOyepVxuICAgIFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyXG4gICAgICAuY29tcGxldGVCcm93c2VyTG9naW4oKVxuICAgICAgLnRoZW4oYXN5bmMgKGNyZWRzKSA9PiB7XG4gICAgICAgIGlmIChjcmVkcy5hY2NvdW50SWQpIHtcbiAgICAgICAgICBjb25zdCBvbGRFbnRyaWVzID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kQnlBY2NvdW50SWRlbnRpZmllcihcbiAgICAgICAgICAgIFwiQVwiLFxuICAgICAgICAgICAgXCJvcGVuYWlcIixcbiAgICAgICAgICAgIGNyZWRzLmFjY291bnRJZCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChvbGRFbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGF3YWl0IFRva2VuTW9kZWwuZGVsKG9sZEVudHJpZXMubWFwKChvKSA9PiBvLmlkKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICAgICAgICBjcmVkZW50aWFsczoge1xuICAgICAgICAgICAgICBhY2Nlc3NUb2tlbjogY3JlZHMuYWNjZXNzVG9rZW4sXG4gICAgICAgICAgICAgIHJlZnJlc2hUb2tlbjogY3JlZHMucmVmcmVzaFRva2VuLFxuICAgICAgICAgICAgICBpZFRva2VuOiBjcmVkcy5pZFRva2VuLFxuICAgICAgICAgICAgICBhY2Nlc3NUb2tlbkV4cGlyZXNBdDogRGF0ZS5ub3coKSArIDEwICogMjQgKiAzNjAwICogMTAwMCxcbiAgICAgICAgICAgICAgYWNjb3VudElkOiBjcmVkcy5hY2NvdW50SWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYE9wZW5BSSB0b2tlbiBzYXZlZCBmb3IgJHtuYW1lfWApO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICBsb2dnZXIud2FybihgT3BlbkFJIGJyb3dzZXIgbG9naW4gZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4geyBhdXRoVXJsIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyB1c2FnZSh0b2tlbklkPzogbnVtYmVyKTogUHJvbWlzZTxVc2FnZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyByb3dzOiBhbGxUb2tlbnMgfSA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE1hbnkoXCJBXCIpO1xuICAgIGNvbnN0IGVudHJ5ID0gdG9rZW5JZFxuICAgICAgPyBhbGxUb2tlbnMuZmluZCgoZSkgPT4gZS5pZCA9PT0gdG9rZW5JZClcbiAgICAgIDogYWxsVG9rZW5zLmZpbmRMYXN0KChlKSA9PiBlLmFjdGl2ZSAmJiBlLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKTtcblxuICAgIGlmICghZW50cnkpIHJldHVybiB7IGVycm9yOiBcIk5PVF9GT1VORFwiIH07XG5cbiAgICBpZiAoZW50cnkucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpIHtcbiAgICAgIGlmICghZW50cnkuYWN0aXZlKSB7XG4gICAgICAgIHJldHVybiB7IHByb3ZpZGVyOiBcIm9wZW5haVwiLCBmaXZlSG91cjogbnVsbCwgc2V2ZW5EYXk6IG51bGwgfTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmF3ID0gYXdhaXQgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXI/LmdldFJhdGVMaW1pdHNCeVRva2VuSWQoZW50cnkuaWQpO1xuICAgICAgICBjb25zdCBybCA9IHJhdz8uZGF0YS5yYXRlTGltaXRzO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHByb3ZpZGVyOiBcIm9wZW5haVwiLFxuICAgICAgICAgIGZpdmVIb3VyOiBybD8ucHJpbWFyeVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgdXRpbGl6YXRpb246IHJsLnByaW1hcnkudXNlZFBlcmNlbnQsXG4gICAgICAgICAgICAgICAgcmVzZXRzQXQ6IHVuaXhTZWNvbmRzVG9Jc28ocmwucHJpbWFyeS5yZXNldHNBdCksXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBzZXZlbkRheTogcmw/LnNlY29uZGFyeVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgdXRpbGl6YXRpb246IHJsLnNlY29uZGFyeS51c2VkUGVyY2VudCxcbiAgICAgICAgICAgICAgICByZXNldHNBdDogdW5peFNlY29uZHNUb0lzbyhybC5zZWNvbmRhcnkucmVzZXRzQXQpLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBgT3BlbkFJIHVzYWdlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5LnByb3ZpZGVyICE9PSBcImFudGhyb3BpY1wiKSB7XG4gICAgICByZXR1cm4geyBlcnJvcjogYHVzYWdlIEFQSSBub3Qgc3VwcG9ydGVkIGZvciBwcm92aWRlcjogJHtlbnRyeS5wcm92aWRlcn1gIH07XG4gICAgfVxuXG4gICAgbGV0IGFjY2Vzc1Rva2VuID0gZ2V0QWNjZXNzVG9rZW4oZW50cnkuY3JlZGVudGlhbHMpO1xuICAgIGNvbnN0IGlzRXhwaXJlZCA9IGdldEV4cGlyZXNBdChlbnRyeS5jcmVkZW50aWFscykgPCBEYXRlLm5vdygpO1xuXG4gICAgaWYgKGlzRXhwaXJlZCAmJiBnZXRSZWZyZXNoVG9rZW4oZW50cnkuY3JlZGVudGlhbHMpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhY2Nlc3NUb2tlbiA9IGF3YWl0IHRoaXMucmVmcmVzaFRva2VuKGVudHJ5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgb2F1dGhMb2dnZXIud2FybihgcmVmcmVzaCBmYWlsZWQgZm9yICR7ZW50cnkubmFtZX06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBcInJlLWxvZ2luIHJlcXVpcmVkXCIgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByYXcgPSBhd2FpdCBmZXRjaFVzYWdlKGFjY2Vzc1Rva2VuKTtcbiAgICBpZiAocmF3LmVycm9yICYmIGdldFJlZnJlc2hUb2tlbihlbnRyeS5jcmVkZW50aWFscykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFjY2Vzc1Rva2VuID0gYXdhaXQgdGhpcy5yZWZyZXNoVG9rZW4oZW50cnkpO1xuICAgICAgICBjb25zdCByZXRyaWVkID0gYXdhaXQgZmV0Y2hVc2FnZShhY2Nlc3NUb2tlbik7XG4gICAgICAgIGlmIChyZXRyaWVkLmVycm9yKSByZXR1cm4geyBlcnJvcjogcmV0cmllZC5lcnJvciB9O1xuICAgICAgICByZXR1cm4gY29udmVydEFudGhyb3BpY1VzYWdlKHJldHJpZWQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBvYXV0aExvZ2dlci53YXJuKGByZWZyZXNoIGZhaWxlZCBmb3IgJHtlbnRyeS5uYW1lfTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IFwicmUtbG9naW4gcmVxdWlyZWRcIiB9O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmF3LmVycm9yKSByZXR1cm4geyBlcnJvcjogcmF3LmVycm9yIH07XG4gICAgcmV0dXJuIGNvbnZlcnRBbnRocm9waWNVc2FnZShyYXcpO1xuICB9XG5cbiAgYXN5bmMgcmVmcmVzaFRva2VuKHRva2VuOiBUb2tlblN1YnNldEEpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGNyZWRzID0gdG9rZW4uY3JlZGVudGlhbHM7XG4gICAgY29uc3QgcnQgPSBnZXRSZWZyZXNoVG9rZW4oY3JlZHMpO1xuICAgIGlmICghcnQpIHRocm93IG5ldyBFcnJvcihcIk5vIHJlZnJlc2ggdG9rZW5cIik7XG4gICAgY29uc3QgcmVmcmVzaGVkID0gYXdhaXQgcmVmcmVzaEFjY2Vzc1Rva2VuKHJ0KTtcbiAgICBjb25zdCB1cGRhdGVkID0gVG9rZW5DcmVkZW50aWFscy5wYXJzZSh7XG4gICAgICAuLi5jcmVkcyxcbiAgICAgIGFjY2Vzc1Rva2VuOiByZWZyZXNoZWQuYWNjZXNzVG9rZW4sXG4gICAgICByZWZyZXNoVG9rZW46IHJlZnJlc2hlZC5yZWZyZXNoVG9rZW4sXG4gICAgICBleHBpcmVzQXQ6IHJlZnJlc2hlZC5leHBpcmVzQXQsXG4gICAgfSk7XG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5zYXZlKFtcbiAgICAgIHtcbiAgICAgICAgaWQ6IHRva2VuLmlkLFxuICAgICAgICBwcm92aWRlcjogdG9rZW4ucHJvdmlkZXIsXG4gICAgICAgIGNyZWRlbnRpYWxzOiB1cGRhdGVkLFxuICAgICAgICBuYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgfSxcbiAgICBdKTtcbiAgICByZXR1cm4gcmVmcmVzaGVkLmFjY2Vzc1Rva2VuO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgaGVhbHRoKCk6IFByb21pc2U8SGVhbHRoUmVzcG9uc2U+IHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiBcIm9rXCIsXG4gICAgICBhY3RpdmVUb2tlbnM6IFFncmlkRGlzcGF0Y2hlci50b2tlbnMuc2l6ZSxcbiAgICAgIHN1YnNjcmliZXI6IFFncmlkRGlzcGF0Y2hlci5zdWJzY3JpYmVyPy5zdGF0dXMoKSA/PyBudWxsLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFFncmlkRnJhbWUgPSBuZXcgUWdyaWRGcmFtZUNsYXNzKCk7XG5cbmZ1bmN0aW9uIGNvbnZlcnRBbnRocm9waWNVc2FnZShyYXc6IEFudGhyb3BpY1VzYWdlUmF3KTogVXNhZ2VSZXNwb25zZSB7XG4gIHJldHVybiB7XG4gICAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIsXG4gICAgZml2ZUhvdXI6IHJhdy5maXZlX2hvdXJcbiAgICAgID8geyB1dGlsaXphdGlvbjogcmF3LmZpdmVfaG91ci51dGlsaXphdGlvbiwgcmVzZXRzQXQ6IHJhdy5maXZlX2hvdXIucmVzZXRzX2F0IH1cbiAgICAgIDogbnVsbCxcbiAgICBzZXZlbkRheTogcmF3LnNldmVuX2RheVxuICAgICAgPyB7IHV0aWxpemF0aW9uOiByYXcuc2V2ZW5fZGF5LnV0aWxpemF0aW9uLCByZXNldHNBdDogcmF3LnNldmVuX2RheS5yZXNldHNfYXQgfVxuICAgICAgOiBudWxsLFxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNERBLE1BQU0saUNBQWlCLElBQUksS0FBeUI7QUFHcEQsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxrQkFBa0I7QUFFeEIsU0FBUyxpQkFBaUIsU0FBbUQ7QUFDM0UsUUFBTyxPQUFPLFlBQVks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
624
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZnJhbWUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmZyYW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcnlwdG8gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyBhcGksIEJhZFJlcXVlc3RFeGNlcHRpb24sIEJhc2VGcmFtZUNsYXNzLCBTb25hbXUsIHN0cmVhbSB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGdldENhY2hlTWFuYWdlclJlZiB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHsgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7XG4gIGdldEFjY2Vzc1Rva2VuLFxuICBnZXRFeHBpcmVzQXQsXG4gIGdldFJlZnJlc2hUb2tlbixcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vY3JlZGVudGlhbHNcIjtcbmltcG9ydCB7IE1JQ1JPX1VTRCwgUmVxdWVzdExvZ01vZGVsIH0gZnJvbSBcIi4uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2V0QSB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQge1xuICBUb2tlbkNyZWRlbnRpYWxzLFxuICBUb2tlblNhdmVQYXJhbXMsXG4gIHR5cGUgVG9rZW5TYXZlUGFyYW1zIGFzIFRva2VuU2F2ZVBhcmFtc1R5cGUsXG59IGZyb20gXCIuLi90b2tlbi90b2tlbi50eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBBbnRocm9waWNVc2FnZVJhdyxcbiAgYnVpbGRBdXRoVXJsLFxuICBleGNoYW5nZUNvZGVGb3JUb2tlbnMsXG4gIGZldGNoVXNhZ2UsXG4gIGdlbmVyYXRlUEtDRSxcbiAgcmVmcmVzaEFjY2Vzc1Rva2VuLFxufSBmcm9tIFwiLi9vYXV0aFwiO1xuaW1wb3J0IHtcbiAgZXN0aW1hdGVJbWFnZUdlbmVyYXRpb25Db3N0TWljcm9Vc2QsXG4gIGltYWdlR2VuZXJhdGlvbkNvc3RNZXRob2QsXG59IGZyb20gXCIuL3FncmlkLWltYWdlLWdlbmVyYXRpb25cIjtcbmltcG9ydCB7XG4gIGJ1aWxkSW1hZ2VHZW5lcmF0aW9uVG9vbFN0ZXBzLFxuICBmb3JtYXRSZXNwb25zZUZvckxvZyxcbiAgZ2V0SW1hZ2VQYXJ0cyxcbn0gZnJvbSBcIi4vcWdyaWQtcmVzcG9uc2UtZm9ybWF0XCI7XG5pbXBvcnQge1xuICBhZnRlclF1ZXJ5LFxuICBiZWZvcmVRdWVyeSxcbiAgZmluaXNoUnVuQWJvcnRlZCxcbiAgZmluaXNoUnVuV2l0aEVycm9yLFxufSBmcm9tIFwiLi9xZ3JpZC1ydW4tbGlmZWN5Y2xlXCI7XG5pbXBvcnQgeyBRZ3JpZERpc3BhdGNoZXIgfSBmcm9tIFwiLi9xZ3JpZC5kaXNwYXRjaGVyXCI7XG5pbXBvcnQge1xuICB0eXBlIFF1ZXJ5SW5wdXQsXG4gIHR5cGUgQXBwZW5kU3RlcElucHV0LFxuICB0eXBlIENyZWF0ZVJ1bklucHV0LFxuICB0eXBlIEZpbmlzaFJ1bklucHV0LFxuICB0eXBlIEhlYWx0aFJlc3BvbnNlLFxuICB0eXBlIE9BdXRoU3RhcnRSZXN1bHQsXG4gIHR5cGUgUXVlcnlPdXRwdXQsXG4gIHR5cGUgUWdyaWRSdW5Db250ZXh0LFxuICBTdHJlYW1FdmVudHMsXG4gIHR5cGUgVG9rZW5TdGF0cyxcbiAgdHlwZSBVc2FnZVJlc3BvbnNlLFxufSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuXG5jb25zdCBwZW5kaW5nU3RyZWFtcyA9IG5ldyBNYXA8c3RyaW5nLCBRdWVyeUlucHV0PigpO1xuXG50eXBlIFBlbmRpbmdPQXV0aCA9IHsgY29kZVZlcmlmaWVyOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgcmVkaXJlY3RVcmk6IHN0cmluZyB9O1xuY29uc3QgT0FVVEhfU1RBVEVfUFJFRklYID0gXCJvYXV0aDpzdGF0ZTpcIjtcbmNvbnN0IE9BVVRIX1NUQVRFX1RUTCA9IFwiNW1cIjtcblxuZnVuY3Rpb24gdW5peFNlY29uZHNUb0lzbyhzZWNvbmRzOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVsbCB7XG4gIHJldHVybiB0eXBlb2Ygc2Vjb25kcyA9PT0gXCJudW1iZXJcIiA/IG5ldyBEYXRlKHNlY29uZHMgKiAxMDAwKS50b0lTT1N0cmluZygpIDogbnVsbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0T0F1dGhTdGF0ZShzdGF0ZTogc3RyaW5nLCBkYXRhOiBQZW5kaW5nT0F1dGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2FjaGUgPSBnZXRDYWNoZU1hbmFnZXJSZWYoKTtcbiAgaWYgKCFjYWNoZSkgdGhyb3cgbmV3IEVycm9yKFwiQ2FjaGVNYW5hZ2VyIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgYXdhaXQgY2FjaGUuc2V0KHtcbiAgICBrZXk6IGAke09BVVRIX1NUQVRFX1BSRUZJWH0ke3N0YXRlfWAsXG4gICAgdmFsdWU6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgIHR0bDogT0FVVEhfU1RBVEVfVFRMLFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0T0F1dGhTdGF0ZShzdGF0ZTogc3RyaW5nKTogUHJvbWlzZTxQZW5kaW5nT0F1dGggfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgY2FjaGUgPSBnZXRDYWNoZU1hbmFnZXJSZWYoKTtcbiAgaWYgKCFjYWNoZSkgdGhyb3cgbmV3IEVycm9yKFwiQ2FjaGVNYW5hZ2VyIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgY29uc3QgcmF3ID0gYXdhaXQgY2FjaGUuZ2V0PHN0cmluZz4oeyBrZXk6IGAke09BVVRIX1NUQVRFX1BSRUZJWH0ke3N0YXRlfWAgfSk7XG4gIGlmICghcmF3KSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gSlNPTi5wYXJzZShyYXcpIGFzIFBlbmRpbmdPQXV0aDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlT0F1dGhTdGF0ZShzdGF0ZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNhY2hlID0gZ2V0Q2FjaGVNYW5hZ2VyUmVmKCk7XG4gIGlmICghY2FjaGUpIHJldHVybjtcbiAgYXdhaXQgY2FjaGUuZGVsZXRlKHsga2V5OiBgJHtPQVVUSF9TVEFURV9QUkVGSVh9JHtzdGF0ZX1gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRPQXV0aFJlZGlyZWN0VXJpKCk6IHN0cmluZyB7XG4gIGNvbnN0IHB1YmxpY0Jhc2VVcmwgPSBwcm9jZXNzLmVudi5RR1JJRF9QVUJMSUNfQkFTRV9VUkw/LnJlcGxhY2UoL1xcLyskLywgXCJcIik7XG4gIGlmIChwdWJsaWNCYXNlVXJsKSByZXR1cm4gYCR7cHVibGljQmFzZVVybH0vY2FsbGJhY2tgO1xuXG4gIGNvbnN0IHNlcnZlclBvcnQgPSBwcm9jZXNzLmVudi5QT1JUID8/IFwiNDQ5MDBcIjtcbiAgcmV0dXJuIGBodHRwOi8vbG9jYWxob3N0OiR7c2VydmVyUG9ydH0vY2FsbGJhY2tgO1xufVxuXG5mdW5jdGlvbiByZWplY3RJbWFnZUdlbmVyYXRpb25TdHJlYW0oYXJnczogUXVlcnlJbnB1dCk6IHZvaWQge1xuICBpZiAoIWFyZ3MuaW1hZ2VHZW5lcmF0aW9uKSByZXR1cm47XG4gIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgIFwicWdyaWQ6IGltYWdlR2VuZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHdpdGggc3RyZWFtaW5nOyB1c2UgcXVlcnkvZ2VuZXJhdGVUZXh0IGluc3RlYWQuXCIgYXMgTG9jYWxpemVkU3RyaW5nLFxuICApO1xufVxuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIl0pO1xuY29uc3Qgb2F1dGhMb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJvYXV0aFwiXSk7XG5cbmNsYXNzIFFncmlkRnJhbWVDbGFzcyBleHRlbmRzIEJhc2VGcmFtZUNsYXNzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJRZ3JpZFwiKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBxdWVyeShhcmdzOiBRdWVyeUlucHV0KTogUHJvbWlzZTxRdWVyeU91dHB1dD4ge1xuICAgIGNvbnN0IGVmZmVjdGl2ZUxvZ01vZGUgPSBhcmdzLmxvZ01vZGUgPz8gKGFyZ3MuaXNTdGVwID8gXCJydW5cIiA6IFwiYXV0b1wiKTtcblxuICAgIC8vIGxvZ01vZGU6IFwicnVuXCIg4oaSIOyEnOuyhOqwgCBsaWZlY3ljbGUg6rSA66asXG4gICAgaWYgKGVmZmVjdGl2ZUxvZ01vZGUgPT09IFwicnVuXCIpIHtcbiAgICAgIGNvbnN0IHsgcmVxdWVzdExvZ0lkLCBzdGVwSW5kZXggfSA9IGF3YWl0IGJlZm9yZVF1ZXJ5KGFyZ3MpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUWdyaWREaXNwYXRjaGVyLnF1ZXJ5KGFyZ3MsIGFyZ3MudGltZW91dCk7XG4gICAgICAgIGNvbnN0IGxpZmVjeWNsZSA9IGF3YWl0IGFmdGVyUXVlcnkocmVxdWVzdExvZ0lkLCBzdGVwSW5kZXgsIGFyZ3MsIHJlc3VsdCk7XG4gICAgICAgIC8vIGxpZmVjeWNsZS5ydW5Db250ZXh0KHJlcXVlc3RMb2dJZCkg7JmAIGRpc3BhdGNoZXIg6rCAIOyLpOydgCB0aHJlYWRDb29yZCDrpbwg67OR7ZWpLlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICBydW5Db250ZXh0OiB7IC4uLmxpZmVjeWNsZS5ydW5Db250ZXh0LCB0aHJlYWRDb29yZDogcmVzdWx0LnJ1bkNvbnRleHQ/LnRocmVhZENvb3JkIH0sXG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGF3YWl0IGZpbmlzaFJ1bldpdGhFcnJvcihyZXF1ZXN0TG9nSWQsIChlIGFzIEVycm9yKS5tZXNzYWdlLCBhcmdzKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBsb2dNb2RlOiBcImF1dG9cIiAo6riw7KG0IG5vbi1zdGVwIOqyveuhnCkg65iQ64qUIFwibm9uZVwiXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUWdyaWREaXNwYXRjaGVyLnF1ZXJ5KGFyZ3MsIGFyZ3MudGltZW91dCk7XG5cbiAgICBpZiAoZWZmZWN0aXZlTG9nTW9kZSA9PT0gXCJhdXRvXCIpIHtcbiAgICAgIHRoaXMuc2F2ZUF1dG9SZXF1ZXN0TG9nKGFyZ3MsIHJlc3VsdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIGxvZ01vZGUgXCJhdXRvXCIg64uo7J28IOyalOyyrSDroZzquYU6IHJ1biBsaWZlY3ljbGUoc3RlcCDrtoTtlbQpIOyXhuydtCByZXF1ZXN0X2xvZyAx6rG066eMIOuCqOq4tOuLpC5cbiAgLy8gcXVlcnnsmYAgcXVlcnlTdHJlYW0g7JaR7Kq97JeQ7IScIOyCrOyaqS5cbiAgcHJpdmF0ZSBzYXZlQXV0b1JlcXVlc3RMb2coYXJnczogUXVlcnlJbnB1dCwgcmVzdWx0OiBRdWVyeU91dHB1dCk6IHZvaWQge1xuICAgIGNvbnN0IGltYWdlUGFydHMgPSBnZXRJbWFnZVBhcnRzKHJlc3VsdCk7XG4gICAgY29uc3QgaW1hZ2VDb3N0TWljcm9Vc2QgPSBlc3RpbWF0ZUltYWdlR2VuZXJhdGlvbkNvc3RNaWNyb1VzZChcbiAgICAgIHJlc3VsdCxcbiAgICAgIGFyZ3MuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgICApO1xuICAgIGNvbnN0IHRvb2xDYWxsQ291bnQgPSByZXN1bHQuY29udGVudC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udHlwZSA9PT0gXCJ0b29sLWNhbGxcIikubGVuZ3RoO1xuICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGZvcm1hdFJlc3BvbnNlRm9yTG9nKHJlc3VsdCk7XG5cbiAgICBSZXF1ZXN0TG9nTW9kZWwuc2F2ZShbXG4gICAgICB7XG4gICAgICAgIHRva2VuX25hbWU6IHJlc3VsdC50b2tlbk5hbWUsXG4gICAgICAgIHByb2plY3RfbmFtZTogYXJncy5wcm9qZWN0TmFtZT8ubGVuZ3RoID8gYXJncy5wcm9qZWN0TmFtZSA6IG51bGwsXG4gICAgICAgIG1vZGVsX25hbWU6IHJlc3VsdC5tb2RlbCA/PyBudWxsLFxuICAgICAgICB1c2VyX3Byb21wdDogYXJncy5wcm9tcHQsXG4gICAgICAgIHN5c3RlbV9wcm9tcHQ6IGFyZ3Muc3lzdGVtID8/IG51bGwsXG4gICAgICAgIHJlc3BvbnNlOiByZXNwb25zZVRleHQsXG4gICAgICAgIGlucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmlucHV0X3Rva2VucyxcbiAgICAgICAgb3V0cHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLm91dHB1dF90b2tlbnMsXG4gICAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVfcmVhZF9pbnB1dF90b2tlbnMsXG4gICAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VucyxcbiAgICAgICAgZHVyYXRpb25fbXM6IHJlc3VsdC5kdXJhdGlvbk1zLFxuICAgICAgICB0dGZ0X21zOiByZXN1bHQudHRmdE1zLFxuICAgICAgICBjb3N0X3VzZDogcmVzdWx0LmNvc3RVc2QgIT09IG51bGwgPyBNYXRoLnJvdW5kKHJlc3VsdC5jb3N0VXNkICogTUlDUk9fVVNEKSA6IG51bGwsXG4gICAgICAgIGltYWdlX2Nvc3RfdXNkOiBpbWFnZUNvc3RNaWNyb1VzZCxcbiAgICAgICAgaW1hZ2VfY29zdF9tZXRob2Q6XG4gICAgICAgICAgaW1hZ2VDb3N0TWljcm9Vc2QgIT09IG51bGxcbiAgICAgICAgICAgID8gaW1hZ2VHZW5lcmF0aW9uQ29zdE1ldGhvZChhcmdzLmltYWdlR2VuZXJhdGlvbk9wdGlvbnMpXG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgIGVmZm9ydDogYXJncy5lZmZvcnQgPz8gbnVsbCxcbiAgICAgICAgLy8gbWFsZm9ybWVkIGhpc3RvcnnqsIAg7JmA64+EIOyEseqzte2VnCDthLQo7Yq57Z6IIHN0cmVhbSBzc2UuZW5kKCkp7J2EIOq5qOyngCDslYrrj4TroZ0g67Cp7Ja0LlxuICAgICAgICBoaXN0b3J5OiAoKCk6IHsgdHlwZTogc3RyaW5nIH1bXSB8IG51bGwgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXJncy5oaXN0b3J5ID8gSlNPTi5wYXJzZShhcmdzLmhpc3RvcnkpIDogbnVsbDtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKSxcbiAgICAgICAgc3RhdHVzOiBcInN1Y2NlZWRlZFwiLFxuICAgICAgICB0b29sX2NhbGxfY291bnQ6IHRvb2xDYWxsQ291bnQsXG4gICAgICAgIC8vIOydtOuvuOyngCB0dXJuIOyLneuzhChSMTMpOiBxdW90YSDshozrqqjrpbwg7J2066+47KeAIOybjO2BrOuhnOuTnOyXkCDqt4Dsho0uXG4gICAgICAgIGlzX2ltYWdlX2dlbmVyYXRpb246IGFyZ3MuaW1hZ2VHZW5lcmF0aW9uID8/IGZhbHNlLFxuICAgICAgfSxcbiAgICBdKVxuICAgICAgLnRoZW4oYXN5bmMgKGlkcykgPT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0TG9nSWQgPSBpZHNbMF07XG4gICAgICAgIGlmICghcmVxdWVzdExvZ0lkIHx8IGltYWdlUGFydHMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgIGZvciAoY29uc3Qgc3RlcCBvZiBidWlsZEltYWdlR2VuZXJhdGlvblRvb2xTdGVwcyhhcmdzLCBpbWFnZVBhcnRzLCAwKSkge1xuICAgICAgICAgIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5hcHBlbmRTdGVwKHJlcXVlc3RMb2dJZCwgc3RlcCk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGUpID0+IGxvZ2dlci5lcnJvcihgcmVxdWVzdExvZyBzYXZlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgcHJlcGFyZVN0cmVhbShhcmdzOiBRdWVyeUlucHV0KTogUHJvbWlzZTx7IHN0cmVhbUlkOiBzdHJpbmcgfT4ge1xuICAgIHJlamVjdEltYWdlR2VuZXJhdGlvblN0cmVhbShhcmdzKTtcbiAgICBjb25zdCBzdHJlYW1JZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgcGVuZGluZ1N0cmVhbXMuc2V0KHN0cmVhbUlkLCBhcmdzKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHBlbmRpbmdTdHJlYW1zLmRlbGV0ZShzdHJlYW1JZCksIDMwXzAwMCk7XG4gICAgcmV0dXJuIHsgc3RyZWFtSWQgfTtcbiAgfVxuXG4gIEBzdHJlYW0oeyB0eXBlOiBcInNzZVwiLCBldmVudHM6IFN0cmVhbUV2ZW50cyB9KVxuICBhc3luYyBxdWVyeVN0cmVhbShzdHJlYW1JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYXJncyA9IHBlbmRpbmdTdHJlYW1zLmdldChzdHJlYW1JZCk7XG4gICAgcGVuZGluZ1N0cmVhbXMuZGVsZXRlKHN0cmVhbUlkKTtcbiAgICBpZiAoIWFyZ3MpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgb3IgZXhwaXJlZCBzdHJlYW1JZFwiKTtcbiAgICByZWplY3RJbWFnZUdlbmVyYXRpb25TdHJlYW0oYXJncyk7XG5cbiAgICBjb25zdCBlZmZlY3RpdmVMb2dNb2RlID0gYXJncy5sb2dNb2RlID8/IChhcmdzLmlzU3RlcCA/IFwicnVuXCIgOiBcImF1dG9cIik7XG4gICAgY29uc3Qgc2hvdWxkTG9nID0gZWZmZWN0aXZlTG9nTW9kZSA9PT0gXCJydW5cIjtcblxuICAgIGxldCBydW5JbmZvOiB7IHJlcXVlc3RMb2dJZDogbnVtYmVyOyBzdGVwSW5kZXg6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgIGlmIChzaG91bGRMb2cpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJ1bkluZm8gPSBhd2FpdCBiZWZvcmVRdWVyeShhcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBzdHJlYW0gYmVmb3JlUXVlcnkgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGN0eCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgY29uc3Qgc3NlID0gY3R4LmNyZWF0ZVNTRShTdHJlYW1FdmVudHMpO1xuICAgIGxldCB0aHJlYWRJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCB0dXJuSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc3RyZWFtUmVzdWx0OiBRdWVyeU91dHB1dCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc3RyZWFtRXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIGNvbnN0IGludGVycnVwdE9wZW5BSSA9ICgpID0+IHtcbiAgICAgIGlmICh0aHJlYWRJZCAmJiB0dXJuSWQpIHtcbiAgICAgICAgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXI/LmludGVycnVwdFdvcmtlclR1cm4odGhyZWFkSWQsIHR1cm5JZCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBzc2Uub25DbG9zZSgoKSA9PiB7XG4gICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIGludGVycnVwdE9wZW5BSSgpO1xuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5xdWVyeVN0cmVhbShcbiAgICAgICAgYXJncyxcbiAgICAgICAge1xuICAgICAgICAgIG9uRGVsdGE6ICh0ZXh0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXNzZS5jbG9zZWQpIHNzZS5wdWJsaXNoKFwiZGVsdGFcIiwgeyB0ZXh0IH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25UaHJlYWRJZDogKGlkKSA9PiB7XG4gICAgICAgICAgICB0aHJlYWRJZCA9IGlkO1xuICAgICAgICAgICAgaWYgKHNzZS5jbG9zZWQgJiYgdHVybklkKSB7XG4gICAgICAgICAgICAgIGludGVycnVwdE9wZW5BSSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25UdXJuSWQ6IChpZCkgPT4ge1xuICAgICAgICAgICAgdHVybklkID0gaWQ7XG4gICAgICAgICAgICBpZiAoc3NlLmNsb3NlZCAmJiB0aHJlYWRJZCkge1xuICAgICAgICAgICAgICBpbnRlcnJ1cHRPcGVuQUkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uQ29tcGxldGU6IChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHN0cmVhbVJlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uRXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICAgIHN0cmVhbUVycm9yID0gZXJyO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHN0cmVhbUVycm9yID0gZSBhcyBFcnJvcjtcbiAgICB9XG5cbiAgICAvLyBkaXNwYXRjaGVyIOyZhOujjCDtm4QgbGlmZWN5Y2xlIOyymOumrCAoYXdhaXQg7JWI7KCEKVxuICAgIGlmIChzdHJlYW1SZXN1bHQpIHtcbiAgICAgIC8vIGRpc3BhdGNoZXIg6rCAIOyLpOydgCB0aHJlYWQg7J6s7IKs7JqpIOyijO2RnCAoYXV0by9ydW4g6rO17Ya17Jy866GcIO2BtOudvOyXkCDtmozshqHtlbTslbwg7ZWoKS5cbiAgICAgIGNvbnN0IHRocmVhZENvb3JkID0gc3RyZWFtUmVzdWx0LnJ1bkNvbnRleHQ/LnRocmVhZENvb3JkO1xuICAgICAgbGV0IHJ1bkNvbnRleHQ6IFFncmlkUnVuQ29udGV4dCB8IHVuZGVmaW5lZCA9XG4gICAgICAgIHRocmVhZENvb3JkICE9PSB1bmRlZmluZWQgPyB7IHRocmVhZENvb3JkIH0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAocnVuSW5mbykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGxpZmVjeWNsZSA9IGF3YWl0IGFmdGVyUXVlcnkoXG4gICAgICAgICAgICBydW5JbmZvLnJlcXVlc3RMb2dJZCxcbiAgICAgICAgICAgIHJ1bkluZm8uc3RlcEluZGV4LFxuICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgIHN0cmVhbVJlc3VsdCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJ1bkNvbnRleHQgPSB7IC4uLmxpZmVjeWNsZS5ydW5Db250ZXh0LCB0aHJlYWRDb29yZCB9O1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGBzdHJlYW0gYWZ0ZXJRdWVyeSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZWZmZWN0aXZlTG9nTW9kZSA9PT0gXCJhdXRvXCIpIHtcbiAgICAgICAgLy8gcnVuIGxpZmVjeWNsZeydhCDslYgg7YOA64qUIOuLqOydvCBzdHJlYW0g7JqU7LKt64+EIHJlcXVlc3RfbG9nIDHqsbTsnYAg64Ko6ri064ukIChxdWVyeeyZgCDrjIDsua0pLlxuICAgICAgICB0aGlzLnNhdmVBdXRvUmVxdWVzdExvZyhhcmdzLCBzdHJlYW1SZXN1bHQpO1xuICAgICAgfVxuICAgICAgaWYgKCFzc2UuY2xvc2VkKSBzc2UucHVibGlzaChcImRvbmVcIiwgeyAuLi5zdHJlYW1SZXN1bHQsIHJ1bkNvbnRleHQgfSk7XG4gICAgfSBlbHNlIGlmIChzdHJlYW1FcnJvcikge1xuICAgICAgaWYgKHNzZS5jbG9zZWQgJiYgc3RyZWFtRXJyb3IubWVzc2FnZSA9PT0gXCJhYm9ydGVkXCIpIHtcbiAgICAgICAgaWYgKHJ1bkluZm8pIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocnVuSW5mby5yZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgICAgICBhd2FpdCBzc2UuZW5kKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChydW5JbmZvKSBhd2FpdCBmaW5pc2hSdW5XaXRoRXJyb3IocnVuSW5mby5yZXF1ZXN0TG9nSWQsIHN0cmVhbUVycm9yLm1lc3NhZ2UsIGFyZ3MpO1xuICAgICAgaWYgKCFzc2UuY2xvc2VkKSBzc2UucHVibGlzaChcImVycm9yXCIsIHsgbWVzc2FnZTogc3RyZWFtRXJyb3IubWVzc2FnZSB9KTtcbiAgICB9IGVsc2UgaWYgKHNzZS5jbG9zZWQgJiYgcnVuSW5mbykge1xuICAgICAgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChydW5JbmZvLnJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgfVxuXG4gICAgYXdhaXQgc3NlLmVuZCgpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIGNyZWF0ZVJ1bihpbnB1dDogQ3JlYXRlUnVuSW5wdXQpOiBQcm9taXNlPHsgcmVxdWVzdExvZ0lkOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHJlcXVlc3RMb2dJZCA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5jcmVhdGVSdW4oe1xuICAgICAgdXNlcl9wcm9tcHQ6IGlucHV0LnVzZXJQcm9tcHQsXG4gICAgICBtb2RlbF9uYW1lOiBpbnB1dC5tb2RlbE5hbWUsXG4gICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgIHByb2plY3RfbmFtZTogaW5wdXQucHJvamVjdE5hbWUsXG4gICAgICBzeXN0ZW1fcHJvbXB0OiBpbnB1dC5zeXN0ZW1Qcm9tcHQsXG4gICAgICBoaXN0b3J5OiBpbnB1dC5oaXN0b3J5ID8gSlNPTi5wYXJzZShpbnB1dC5oaXN0b3J5KSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICByZXR1cm4geyByZXF1ZXN0TG9nSWQgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBhcHBlbmRTdGVwKGlucHV0OiBBcHBlbmRTdGVwSW5wdXQpOiBQcm9taXNlPHsgc3RlcElkOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHN0ZXBJZCA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5hcHBlbmRTdGVwKGlucHV0LnJlcXVlc3RMb2dJZCwge1xuICAgICAgc3RlcF9pbmRleDogaW5wdXQuc3RlcEluZGV4LFxuICAgICAgdHlwZTogaW5wdXQudHlwZSxcbiAgICAgIGlucHV0X3Rva2VuczogaW5wdXQuaW5wdXRUb2tlbnMsXG4gICAgICBvdXRwdXRfdG9rZW5zOiBpbnB1dC5vdXRwdXRUb2tlbnMsXG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogaW5wdXQuY2FjaGVSZWFkVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBpbnB1dC5jYWNoZUNyZWF0aW9uVG9rZW5zLFxuICAgICAgZHVyYXRpb25fbXM6IGlucHV0LmR1cmF0aW9uTXMsXG4gICAgICB0dGZ0X21zOiBpbnB1dC50dGZ0TXMgPz8gbnVsbCxcbiAgICAgIGZpbmlzaF9yZWFzb246IGlucHV0LmZpbmlzaFJlYXNvbixcbiAgICAgIHJlYXNvbmluZ190ZXh0OiBpbnB1dC5yZWFzb25pbmdUZXh0LFxuICAgICAgcmVhc29uaW5nX3Rva2VuczogaW5wdXQucmVhc29uaW5nVG9rZW5zLFxuICAgICAgdG9vbF9jYWxsX2luZGV4OiBpbnB1dC50b29sQ2FsbEluZGV4LFxuICAgICAgdG9vbF9jYWxsX2lkOiBpbnB1dC50b29sQ2FsbElkLFxuICAgICAgdG9vbF9uYW1lOiBpbnB1dC50b29sTmFtZSxcbiAgICAgIHRvb2xfYXJnczogaW5wdXQudG9vbEFyZ3MsXG4gICAgICB0b29sX3Jlc3VsdDogaW5wdXQudG9vbFJlc3VsdCxcbiAgICAgIHRvb2xfZHVyYXRpb25fbXM6IGlucHV0LnRvb2xEdXJhdGlvbk1zLFxuICAgICAgZXJyb3I6IGlucHV0LmVycm9yLFxuICAgIH0pO1xuICAgIHJldHVybiB7IHN0ZXBJZCB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIGZpbmlzaFJ1bihpbnB1dDogRmluaXNoUnVuSW5wdXQpOiBQcm9taXNlPHsgb2s6IGJvb2xlYW4gfT4ge1xuICAgIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5maW5pc2hSdW4oaW5wdXQucmVxdWVzdExvZ0lkLCB7XG4gICAgICBzdGF0dXM6IGlucHV0LnN0YXR1cyxcbiAgICAgIHJlc3BvbnNlOiBpbnB1dC5yZXNwb25zZSxcbiAgICAgIHRva2VuX25hbWU6IGlucHV0LnRva2VuTmFtZSxcbiAgICAgIGlucHV0X3Rva2VuczogaW5wdXQudG90YWxJbnB1dFRva2VucyxcbiAgICAgIG91dHB1dF90b2tlbnM6IGlucHV0LnRvdGFsT3V0cHV0VG9rZW5zLFxuICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IGlucHV0LnRvdGFsQ2FjaGVSZWFkVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBpbnB1dC50b3RhbENhY2hlQ3JlYXRpb25Ub2tlbnMsXG4gICAgICBkdXJhdGlvbl9tczogaW5wdXQudG90YWxEdXJhdGlvbk1zLFxuICAgICAgaGlzdG9yeTogaW5wdXQuaGlzdG9yeSA/IEpTT04ucGFyc2UoaW5wdXQuaGlzdG9yeSkgOiB1bmRlZmluZWQsXG4gICAgICBlcnJvcl9tZXNzYWdlOiBpbnB1dC5lcnJvck1lc3NhZ2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgb2s6IHRydWUgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIHN0YXRzKCk6IFByb21pc2U8VG9rZW5TdGF0c1tdPiB7XG4gICAgcmV0dXJuIFFncmlkRGlzcGF0Y2hlci5nZXRTdGF0cygpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgdG90YWxDb3N0KHRva2VuTmFtZT86IHN0cmluZyk6IFByb21pc2U8eyB1c2Q6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIHsgdXNkOiBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwudG90YWxDb3N0KHsgdG9rZW5fbmFtZTogdG9rZW5OYW1lIH0pIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyBwcm9qZWN0TmFtZXMoKTogUHJvbWlzZTx7IG5hbWVzOiBzdHJpbmdbXSB9PiB7XG4gICAgcmV0dXJuIHsgbmFtZXM6IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5kaXN0aW5jdFByb2plY3ROYW1lcygpIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgYWRkVG9rZW4oXG4gICAgcHJvdmlkZXI6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogVG9rZW5DcmVkZW50aWFscyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBhZGRlZDogYm9vbGVhbiB9PiB7XG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5zYXZlKFtcbiAgICAgIHtcbiAgICAgICAgcHJvdmlkZXIsXG4gICAgICAgIGNyZWRlbnRpYWxzLFxuICAgICAgICBuYW1lLFxuICAgICAgfSxcbiAgICBdKTtcbiAgICByZXR1cm4geyBhZGRlZDogdHJ1ZSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHVwZGF0ZVRva2VuKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZT86IHN0cmluZyxcbiAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGwsXG4gICk6IFByb21pc2U8eyB1cGRhdGVkOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE9uZShcIkFcIiwgeyBpZCB9KTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm4geyB1cGRhdGVkOiBmYWxzZSB9O1xuXG4gICAgY29uc3QgcGF0Y2g6IFRva2VuU2F2ZVBhcmFtc1R5cGUgPSB7XG4gICAgICBpZDogZW50cnkuaWQsXG4gICAgICBwcm92aWRlcjogZW50cnkucHJvdmlkZXIsXG4gICAgICBjcmVkZW50aWFsczogZW50cnkuY3JlZGVudGlhbHMsXG4gICAgICBuYW1lOiBuYW1lICE9PSB1bmRlZmluZWQgPyBuYW1lIDogZW50cnkubmFtZSxcbiAgICB9O1xuICAgIGlmIChxdW90YVRocmVzaG9sZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXRjaC5xdW90YV90aHJlc2hvbGQgPSBxdW90YVRocmVzaG9sZDtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWQgPSBUb2tlblNhdmVQYXJhbXMuc2FmZVBhcnNlKHBhdGNoKTtcbiAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgXCJxdW90YVRocmVzaG9sZCBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAxMDAsIG9yIG51bGxcIiBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICAgICAgIHsgem9kRXJyb3I6IHBhcnNlZC5lcnJvciB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW3BhcnNlZC5kYXRhXSk7XG4gICAgcmV0dXJuIHsgdXBkYXRlZDogdHJ1ZSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHJlbW92ZVRva2VuKGlkOiBudW1iZXIpOiBQcm9taXNlPHsgcmVtb3ZlZDogYm9vbGVhbiB9PiB7XG4gICAgY29uc3QgZW50cnkgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRPbmUoXCJBXCIsIHsgaWQgfSk7XG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuIHsgcmVtb3ZlZDogZmFsc2UgfTtcbiAgICBhd2FpdCBUb2tlbk1vZGVsLmRlbChbZW50cnkuaWRdKTtcbiAgICByZXR1cm4geyByZW1vdmVkOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICog7Yag7YGwIO2ZnOyEse2ZlC/ruYTtmZzshLHtmZQg7Yag6riAIERC7J2YIGFjdGl2ZSDtlYTrk5wg7JeF642w7J207Yq4XG4gICAqL1xuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgdG9nZ2xlVG9rZW4oaWQ6IG51bWJlcik6IFByb21pc2U8eyBhY3RpdmU6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kT25lKFwiQVwiLCB7IGlkIH0pO1xuICAgIGlmICghZW50cnkpIHJldHVybiB7IGFjdGl2ZTogZmFsc2UgfTtcblxuICAgIGNvbnN0IG5ld0FjdGl2ZSA9ICFlbnRyeS5hY3RpdmU7XG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5zYXZlKFtcbiAgICAgIHtcbiAgICAgICAgaWQsXG4gICAgICAgIHByb3ZpZGVyOiBlbnRyeS5wcm92aWRlcixcbiAgICAgICAgY3JlZGVudGlhbHM6IGVudHJ5LmNyZWRlbnRpYWxzLFxuICAgICAgICBhY3RpdmU6IG5ld0FjdGl2ZSxcbiAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgIH0sXG4gICAgXSk7XG4gICAgcmV0dXJuIHsgYWN0aXZlOiBuZXdBY3RpdmUgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBvYXV0aFN0YXJ0KG5hbWU6IHN0cmluZyk6IFByb21pc2U8T0F1dGhTdGFydFJlc3VsdD4ge1xuICAgIGNvbnN0IHsgY29kZVZlcmlmaWVyLCBjb2RlQ2hhbGxlbmdlLCBzdGF0ZSB9ID0gZ2VuZXJhdGVQS0NFKCk7XG5cbiAgICBjb25zdCByZWRpcmVjdFVyaSA9IGdldE9BdXRoUmVkaXJlY3RVcmkoKTtcbiAgICBjb25zdCBhdXRoVXJsID0gYnVpbGRBdXRoVXJsKGNvZGVDaGFsbGVuZ2UsIHN0YXRlLCByZWRpcmVjdFVyaSk7XG5cbiAgICBhd2FpdCBzZXRPQXV0aFN0YXRlKHN0YXRlLCB7IGNvZGVWZXJpZmllciwgbmFtZSwgcmVkaXJlY3RVcmkgfSk7XG5cbiAgICByZXR1cm4geyBhdXRoVXJsIH07XG4gIH1cblxuICBhc3luYyBoYW5kbGVPQXV0aENhbGxiYWNrKGNvZGU6IHN0cmluZywgc3RhdGU6IHN0cmluZywgcmVwbHk6IEZhc3RpZnlSZXBseSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBlbmRpbmcgPSBhd2FpdCBnZXRPQXV0aFN0YXRlKHN0YXRlKTtcbiAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgIGxvZ2dlci53YXJuKFwib2F1dGggY2FsbGJhY2s6IGludmFsaWRfc3RhdGVcIik7XG4gICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoXCIvP29hdXRoPWVycm9yJnJlYXNvbj1pbnZhbGlkX3N0YXRlXCIpO1xuICAgIH1cbiAgICBhd2FpdCBkZWxldGVPQXV0aFN0YXRlKHN0YXRlKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b2tlbnMgPSBhd2FpdCBleGNoYW5nZUNvZGVGb3JUb2tlbnMoXG4gICAgICAgIGNvZGUsXG4gICAgICAgIHBlbmRpbmcuY29kZVZlcmlmaWVyLFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgcGVuZGluZy5yZWRpcmVjdFVyaSxcbiAgICAgICk7XG5cbiAgICAgIGlmICh0b2tlbnMuYWNjb3VudFV1aWQpIHtcbiAgICAgICAgY29uc3Qgb2xkRW50cmllcyA9IGF3YWl0IFRva2VuTW9kZWwuZmluZEJ5QWNjb3VudElkZW50aWZpZXIoXG4gICAgICAgICAgXCJBXCIsXG4gICAgICAgICAgXCJhbnRocm9waWNcIixcbiAgICAgICAgICB0b2tlbnMuYWNjb3VudFV1aWQsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvbGRFbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBhd2FpdCBUb2tlbk1vZGVsLmRlbChvbGRFbnRyaWVzLm1hcCgobykgPT4gby5pZCkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlcjogXCJhbnRocm9waWNcIixcbiAgICAgICAgICBjcmVkZW50aWFsczoge1xuICAgICAgICAgICAgYWNjZXNzVG9rZW46IHRva2Vucy5hY2Nlc3NUb2tlbixcbiAgICAgICAgICAgIHJlZnJlc2hUb2tlbjogdG9rZW5zLnJlZnJlc2hUb2tlbixcbiAgICAgICAgICAgIGV4cGlyZXNBdDogdG9rZW5zLmV4cGlyZXNBdCA/PyAwLFxuICAgICAgICAgICAgYWNjb3VudFV1aWQ6IHRva2Vucy5hY2NvdW50VXVpZCA/PyBcIlwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbmFtZTogcGVuZGluZy5uYW1lLFxuICAgICAgICB9LFxuICAgICAgXSk7XG5cbiAgICAgIHJldHVybiByZXBseS5yZWRpcmVjdChgLz9vYXV0aD1zdWNjZXNzJm5hbWU9JHtlbmNvZGVVUklDb21wb25lbnQocGVuZGluZy5uYW1lKX1gKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoYC8/b2F1dGg9ZXJyb3ImcmVhc29uPSR7ZW5jb2RlVVJJQ29tcG9uZW50KChlIGFzIEVycm9yKS5tZXNzYWdlKX1gKTtcbiAgICB9XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgb2F1dGhTdGFydE9wZW5BSShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPE9BdXRoU3RhcnRSZXN1bHQ+IHtcbiAgICBpZiAoIVFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyKSB0aHJvdyBuZXcgRXJyb3IoXCJPcGVuQUkgZGlzcGF0Y2hlciBub3QgaW5pdGlhbGl6ZWRcIik7XG4gICAgY29uc3QgeyBhdXRoVXJsIH0gPSBhd2FpdCBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlci5zdGFydEJyb3dzZXJMb2dpbihuYW1lKTtcblxuICAgIC8vIGZpcmUtYW5kLWZvcmdldDogY29kZXggbG9naW4g7JmE66OMIOuMgOq4sCDihpIg7Yag7YGwIOyggOyepVxuICAgIFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyXG4gICAgICAuY29tcGxldGVCcm93c2VyTG9naW4oKVxuICAgICAgLnRoZW4oYXN5bmMgKGNyZWRzKSA9PiB7XG4gICAgICAgIGlmIChjcmVkcy5hY2NvdW50SWQpIHtcbiAgICAgICAgICBjb25zdCBvbGRFbnRyaWVzID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kQnlBY2NvdW50SWRlbnRpZmllcihcbiAgICAgICAgICAgIFwiQVwiLFxuICAgICAgICAgICAgXCJvcGVuYWlcIixcbiAgICAgICAgICAgIGNyZWRzLmFjY291bnRJZCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChvbGRFbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGF3YWl0IFRva2VuTW9kZWwuZGVsKG9sZEVudHJpZXMubWFwKChvKSA9PiBvLmlkKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICAgICAgICBjcmVkZW50aWFsczoge1xuICAgICAgICAgICAgICBhY2Nlc3NUb2tlbjogY3JlZHMuYWNjZXNzVG9rZW4sXG4gICAgICAgICAgICAgIHJlZnJlc2hUb2tlbjogY3JlZHMucmVmcmVzaFRva2VuLFxuICAgICAgICAgICAgICBpZFRva2VuOiBjcmVkcy5pZFRva2VuLFxuICAgICAgICAgICAgICBhY2Nlc3NUb2tlbkV4cGlyZXNBdDogRGF0ZS5ub3coKSArIDEwICogMjQgKiAzNjAwICogMTAwMCxcbiAgICAgICAgICAgICAgYWNjb3VudElkOiBjcmVkcy5hY2NvdW50SWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYE9wZW5BSSB0b2tlbiBzYXZlZCBmb3IgJHtuYW1lfWApO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICBsb2dnZXIud2FybihgT3BlbkFJIGJyb3dzZXIgbG9naW4gZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4geyBhdXRoVXJsIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyB1c2FnZSh0b2tlbklkPzogbnVtYmVyKTogUHJvbWlzZTxVc2FnZVJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyByb3dzOiBhbGxUb2tlbnMgfSA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE1hbnkoXCJBXCIpO1xuICAgIGNvbnN0IGVudHJ5ID0gdG9rZW5JZFxuICAgICAgPyBhbGxUb2tlbnMuZmluZCgoZSkgPT4gZS5pZCA9PT0gdG9rZW5JZClcbiAgICAgIDogYWxsVG9rZW5zLmZpbmRMYXN0KChlKSA9PiBlLmFjdGl2ZSAmJiBlLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKTtcblxuICAgIGlmICghZW50cnkpIHJldHVybiB7IGVycm9yOiBcIk5PVF9GT1VORFwiIH07XG5cbiAgICBpZiAoZW50cnkucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpIHtcbiAgICAgIGlmICghZW50cnkuYWN0aXZlKSB7XG4gICAgICAgIHJldHVybiB7IHByb3ZpZGVyOiBcIm9wZW5haVwiLCBmaXZlSG91cjogbnVsbCwgc2V2ZW5EYXk6IG51bGwgfTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmF3ID0gYXdhaXQgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXI/LmdldFJhdGVMaW1pdHNCeVRva2VuSWQoZW50cnkuaWQpO1xuICAgICAgICBjb25zdCBybCA9IHJhdz8uZGF0YS5yYXRlTGltaXRzO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHByb3ZpZGVyOiBcIm9wZW5haVwiLFxuICAgICAgICAgIGZpdmVIb3VyOiBybD8ucHJpbWFyeVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgdXRpbGl6YXRpb246IHJsLnByaW1hcnkudXNlZFBlcmNlbnQsXG4gICAgICAgICAgICAgICAgcmVzZXRzQXQ6IHVuaXhTZWNvbmRzVG9Jc28ocmwucHJpbWFyeS5yZXNldHNBdCksXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBzZXZlbkRheTogcmw/LnNlY29uZGFyeVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgdXRpbGl6YXRpb246IHJsLnNlY29uZGFyeS51c2VkUGVyY2VudCxcbiAgICAgICAgICAgICAgICByZXNldHNBdDogdW5peFNlY29uZHNUb0lzbyhybC5zZWNvbmRhcnkucmVzZXRzQXQpLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBgT3BlbkFJIHVzYWdlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5LnByb3ZpZGVyICE9PSBcImFudGhyb3BpY1wiKSB7XG4gICAgICByZXR1cm4geyBlcnJvcjogYHVzYWdlIEFQSSBub3Qgc3VwcG9ydGVkIGZvciBwcm92aWRlcjogJHtlbnRyeS5wcm92aWRlcn1gIH07XG4gICAgfVxuXG4gICAgbGV0IGFjY2Vzc1Rva2VuID0gZ2V0QWNjZXNzVG9rZW4oZW50cnkuY3JlZGVudGlhbHMpO1xuICAgIGNvbnN0IGlzRXhwaXJlZCA9IGdldEV4cGlyZXNBdChlbnRyeS5jcmVkZW50aWFscykgPCBEYXRlLm5vdygpO1xuXG4gICAgaWYgKGlzRXhwaXJlZCAmJiBnZXRSZWZyZXNoVG9rZW4oZW50cnkuY3JlZGVudGlhbHMpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhY2Nlc3NUb2tlbiA9IGF3YWl0IHRoaXMucmVmcmVzaFRva2VuKGVudHJ5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgb2F1dGhMb2dnZXIud2FybihgcmVmcmVzaCBmYWlsZWQgZm9yICR7ZW50cnkubmFtZX06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBcInJlLWxvZ2luIHJlcXVpcmVkXCIgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByYXcgPSBhd2FpdCBmZXRjaFVzYWdlKGFjY2Vzc1Rva2VuKTtcbiAgICBpZiAocmF3LmVycm9yICYmIGdldFJlZnJlc2hUb2tlbihlbnRyeS5jcmVkZW50aWFscykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFjY2Vzc1Rva2VuID0gYXdhaXQgdGhpcy5yZWZyZXNoVG9rZW4oZW50cnkpO1xuICAgICAgICBjb25zdCByZXRyaWVkID0gYXdhaXQgZmV0Y2hVc2FnZShhY2Nlc3NUb2tlbik7XG4gICAgICAgIGlmIChyZXRyaWVkLmVycm9yKSByZXR1cm4geyBlcnJvcjogcmV0cmllZC5lcnJvciB9O1xuICAgICAgICByZXR1cm4gY29udmVydEFudGhyb3BpY1VzYWdlKHJldHJpZWQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBvYXV0aExvZ2dlci53YXJuKGByZWZyZXNoIGZhaWxlZCBmb3IgJHtlbnRyeS5uYW1lfTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IFwicmUtbG9naW4gcmVxdWlyZWRcIiB9O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmF3LmVycm9yKSByZXR1cm4geyBlcnJvcjogcmF3LmVycm9yIH07XG4gICAgcmV0dXJuIGNvbnZlcnRBbnRocm9waWNVc2FnZShyYXcpO1xuICB9XG5cbiAgYXN5bmMgcmVmcmVzaFRva2VuKHRva2VuOiBUb2tlblN1YnNldEEpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGNyZWRzID0gdG9rZW4uY3JlZGVudGlhbHM7XG4gICAgY29uc3QgcnQgPSBnZXRSZWZyZXNoVG9rZW4oY3JlZHMpO1xuICAgIGlmICghcnQpIHRocm93IG5ldyBFcnJvcihcIk5vIHJlZnJlc2ggdG9rZW5cIik7XG4gICAgY29uc3QgcmVmcmVzaGVkID0gYXdhaXQgcmVmcmVzaEFjY2Vzc1Rva2VuKHJ0KTtcbiAgICBjb25zdCB1cGRhdGVkID0gVG9rZW5DcmVkZW50aWFscy5wYXJzZSh7XG4gICAgICAuLi5jcmVkcyxcbiAgICAgIGFjY2Vzc1Rva2VuOiByZWZyZXNoZWQuYWNjZXNzVG9rZW4sXG4gICAgICByZWZyZXNoVG9rZW46IHJlZnJlc2hlZC5yZWZyZXNoVG9rZW4sXG4gICAgICBleHBpcmVzQXQ6IHJlZnJlc2hlZC5leHBpcmVzQXQsXG4gICAgfSk7XG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5zYXZlKFtcbiAgICAgIHtcbiAgICAgICAgaWQ6IHRva2VuLmlkLFxuICAgICAgICBwcm92aWRlcjogdG9rZW4ucHJvdmlkZXIsXG4gICAgICAgIGNyZWRlbnRpYWxzOiB1cGRhdGVkLFxuICAgICAgICBuYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgfSxcbiAgICBdKTtcbiAgICByZXR1cm4gcmVmcmVzaGVkLmFjY2Vzc1Rva2VuO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgaGVhbHRoKCk6IFByb21pc2U8SGVhbHRoUmVzcG9uc2U+IHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiBcIm9rXCIsXG4gICAgICBhY3RpdmVUb2tlbnM6IFFncmlkRGlzcGF0Y2hlci50b2tlbnMuc2l6ZSxcbiAgICAgIHN1YnNjcmliZXI6IFFncmlkRGlzcGF0Y2hlci5zdWJzY3JpYmVyPy5zdGF0dXMoKSA/PyBudWxsLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFFncmlkRnJhbWUgPSBuZXcgUWdyaWRGcmFtZUNsYXNzKCk7XG5cbmZ1bmN0aW9uIGNvbnZlcnRBbnRocm9waWNVc2FnZShyYXc6IEFudGhyb3BpY1VzYWdlUmF3KTogVXNhZ2VSZXNwb25zZSB7XG4gIHJldHVybiB7XG4gICAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIsXG4gICAgZml2ZUhvdXI6IHJhdy5maXZlX2hvdXJcbiAgICAgID8geyB1dGlsaXphdGlvbjogcmF3LmZpdmVfaG91ci51dGlsaXphdGlvbiwgcmVzZXRzQXQ6IHJhdy5maXZlX2hvdXIucmVzZXRzX2F0IH1cbiAgICAgIDogbnVsbCxcbiAgICBzZXZlbkRheTogcmF3LnNldmVuX2RheVxuICAgICAgPyB7IHV0aWxpemF0aW9uOiByYXcuc2V2ZW5fZGF5LnV0aWxpemF0aW9uLCByZXNldHNBdDogcmF3LnNldmVuX2RheS5yZXNldHNfYXQgfVxuICAgICAgOiBudWxsLFxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMkRBLE1BQU0saUNBQWlCLElBQUksS0FBeUI7QUFHcEQsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxrQkFBa0I7QUFFeEIsU0FBUyxpQkFBaUIsU0FBbUQ7QUFDM0UsUUFBTyxPQUFPLFlBQVksNEJBQVcsSUFBSSxLQUFLLFVBQVUsSUFBSyxFQUFDLGFBQWEsR0FBRzs7QUFHaEYsZUFBZSxjQUFjLE9BQWUsTUFBbUM7Q0FDN0UsTUFBTSxRQUFRLG9CQUFvQjtBQUNsQyxLQUFJLENBQUMsTUFBTyxPQUFNLElBQUksTUFBTSwrQkFBK0I7QUFDM0QsT0FBTSxNQUFNLElBQUk7RUFDZCxLQUFLLEdBQUcscUJBQXFCO0VBQzdCLE9BQU8sS0FBSyxVQUFVLEtBQUs7RUFDM0IsS0FBSztFQUNOLENBQUM7O0FBR0osZUFBZSxjQUFjLE9BQWtEO0NBQzdFLE1BQU0sUUFBUSxvQkFBb0I7QUFDbEMsS0FBSSxDQUFDLE1BQU8sT0FBTSxJQUFJLE1BQU0sK0JBQStCO0NBQzNELE1BQU0s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