every-plugin 0.4.10 → 0.4.11

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 (56) hide show
  1. package/dist/build/rspack/index.cjs +5 -5
  2. package/dist/build/rspack/index.mjs +4 -4
  3. package/dist/{errors-CVnoPl9v.cjs → errors-BEsEPXKG.cjs} +2 -2
  4. package/dist/errors-CpYzD_-M.d.cts +38 -0
  5. package/dist/errors-D2-thHKG.d.mts +38 -0
  6. package/dist/{errors-D7keKf7a.mjs → errors-DnigICIv.mjs} +2 -2
  7. package/dist/errors.cjs +2 -2
  8. package/dist/errors.d.cts +1 -2
  9. package/dist/errors.d.mts +1 -2
  10. package/dist/errors.mjs +2 -2
  11. package/dist/{fetch-Cc95-7kM.cjs → fetch-CGzn1Uf7.cjs} +2 -2
  12. package/dist/{fetch-KLktuWuM.mjs → fetch-ycs0raYN.mjs} +2 -2
  13. package/dist/{index-matrPV4m.d.cts → index-BXfi8DqC.d.cts} +1 -1
  14. package/dist/{index-bwAhA9ca.d.mts → index-DvIxKA8K.d.mts} +2 -2
  15. package/dist/index.cjs +4 -4
  16. package/dist/index.d.cts +3 -4
  17. package/dist/index.d.mts +3 -4
  18. package/dist/index.mjs +4 -4
  19. package/dist/{normalize-BLTyqFww.d.mts → normalize-BCE_FLe8.d.mts} +1 -1
  20. package/dist/{normalize-BW7kk8Lk.d.cts → normalize-Tt7I_RdD.d.cts} +1 -1
  21. package/dist/{package-J60H0cK8.cjs → package-C2Mp8qeD.cjs} +4 -3
  22. package/dist/{package-DVINhZcr.mjs → package-uEsV9Z-2.mjs} +4 -3
  23. package/dist/plugins-Cmsm3gW1.cjs +791 -0
  24. package/dist/plugins-hpi2GlaX.mjs +790 -0
  25. package/dist/runtime/index.cjs +2 -2
  26. package/dist/runtime/index.d.cts +3 -4
  27. package/dist/runtime/index.d.mts +3 -4
  28. package/dist/runtime/index.mjs +2 -2
  29. package/dist/runtime/services/normalize.d.cts +1 -1
  30. package/dist/runtime/services/normalize.d.mts +1 -1
  31. package/dist/{runtime-BShulKmh.mjs → runtime-BUQ0hy1J.mjs} +3 -3
  32. package/dist/{runtime-Yfumucan.cjs → runtime-LlP2xpdB.cjs} +3 -3
  33. package/dist/{standard-eUgUkWaf.cjs → standard-0wBehDUp.cjs} +1 -18
  34. package/dist/{standard-DaxKTFui.mjs → standard-CYaRay89.mjs} +2 -13
  35. package/dist/testing/index.cjs +2 -2
  36. package/dist/testing/index.d.cts +4 -5
  37. package/dist/testing/index.d.mts +4 -5
  38. package/dist/testing/index.mjs +2 -2
  39. package/dist/zod-BDDjyyHQ.mjs +10 -0
  40. package/dist/{zod-DYghWCz1.cjs → zod-CJY4vNLR.cjs} +2 -2
  41. package/dist/zod.cjs +4 -4
  42. package/dist/zod.d.cts +1 -2
  43. package/dist/zod.d.mts +1 -2
  44. package/dist/zod.mjs +2 -2
  45. package/package.json +3 -2
  46. package/dist/errors-Car4tFVP.d.mts +0 -75
  47. package/dist/errors-DKPPPYYT.d.cts +0 -75
  48. package/dist/openapi.DrTcell5-C6kyDyUK.mjs +0 -669
  49. package/dist/openapi.DrTcell5-DDf4D5V3.cjs +0 -687
  50. package/dist/plugins-C-7lh5gK.cjs +0 -128
  51. package/dist/plugins-Ps5Xxpk2.mjs +0 -128
  52. package/dist/zod-A7Pti5IV.d.cts +0 -4
  53. package/dist/zod-BVo51kgJ.mjs +0 -10
  54. package/dist/zod-D4CFw8d9.d.mts +0 -4
  55. package/dist/zod4-BXTBR1od.cjs +0 -318
  56. package/dist/zod4-VpXuwRO7.mjs +0 -317
@@ -96,17 +96,6 @@ var AsyncIteratorClass = class {
96
96
  return this;
97
97
  }
98
98
  };
99
- function intercept(interceptors, options, main) {
100
- const next = (options2, index) => {
101
- const interceptor = interceptors[index];
102
- if (!interceptor) return main(options2);
103
- return interceptor({
104
- ...options2,
105
- next: (newOptions = options2) => next(newOptions, index + 1)
106
- });
107
- };
108
- return next(options, 0);
109
- }
110
99
  function stringifyJSON(value$1) {
111
100
  return JSON.stringify(value$1);
112
101
  }
@@ -591,5 +580,5 @@ var StandardOpenAPISerializer = class {
591
580
  };
592
581
 
593
582
  //#endregion
594
- export { tryDecodeURIComponent as _, toHttpPath as a, fallbackORPCErrorStatus as c, findDeepMatches as d, intercept as f, toArray as g, stringifyJSON as h, standardizeHTTPPath as i, isORPCErrorStatus as l, once as m, StandardOpenAPISerializer as n, StandardBracketNotationSerializer as o, isObject as p, getDynamicParams as r, fallbackORPCErrorMessage as s, StandardOpenAPIJsonSerializer as t, clone as u, value as v };
595
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbmRhcmQtRGF4S1RGdWkubWpzIiwibmFtZXMiOlsidmFsdWUiLCIjY2xlYW51cCIsIiNuZXh0IiwiI2lzRG9uZSIsIiNpc0V4ZWN1dGVDb21wbGV0ZSIsIk9SUENFcnJvciIsInZhbHVlIiwidmFsdWUiLCIjc2VyaWFsaXplIiwidmFsdWUiXSwic291cmNlcyI6WyIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmJ1bi9Ab3JwYytzaGFyZWRAMS4xMC40L25vZGVfbW9kdWxlcy9Ab3JwYy9zaGFyZWQvZGlzdC9pbmRleC5tanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmJ1bi9Ab3JwYytzdGFuZGFyZC1zZXJ2ZXJAMS4xMC40L25vZGVfbW9kdWxlcy9Ab3JwYy9zdGFuZGFyZC1zZXJ2ZXIvZGlzdC9pbmRleC5tanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmJ1bi9Ab3JwYytjbGllbnRAMS4xMC40L25vZGVfbW9kdWxlcy9Ab3JwYy9jbGllbnQvZGlzdC9zaGFyZWQvY2xpZW50LkRta01kX0dCLm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYnVuL0BvcnBjK29wZW5hcGktY2xpZW50QDEuMTAuNC9ub2RlX21vZHVsZXMvQG9ycGMvb3BlbmFwaS1jbGllbnQvZGlzdC9zaGFyZWQvb3BlbmFwaS1jbGllbnQudDlmQ0FlM3gubWpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5idW4vQG9ycGMrY2xpZW50QDEuMTAuNC9ub2RlX21vZHVsZXMvQG9ycGMvY2xpZW50L2Rpc3Qvc2hhcmVkL2NsaWVudC5EaTY1TVd4di5tanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmJ1bi9Ab3JwYytvcGVuYXBpLWNsaWVudEAxLjEwLjQvbm9kZV9tb2R1bGVzL0BvcnBjL29wZW5hcGktY2xpZW50L2Rpc3Qvc2hhcmVkL29wZW5hcGktY2xpZW50LkIyUTlxVTVtLm1qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBncm91cCwgZ3VhcmQsIG1hcEVudHJpZXMsIG1hcFZhbHVlcywgb21pdCwgcmV0cnksIHNsZWVwIH0gZnJvbSAncmFkYXNoJztcblxuZnVuY3Rpb24gcmVzb2x2ZU1heWJlT3B0aW9uYWxPcHRpb25zKHJlc3QpIHtcbiAgcmV0dXJuIHJlc3RbMF0gPz8ge307XG59XG5cbmZ1bmN0aW9uIHRvQXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiB2YWx1ZSA9PT0gdm9pZCAwIHx8IHZhbHVlID09PSBudWxsID8gW10gOiBbdmFsdWVdO1xufVxuZnVuY3Rpb24gc3BsaXRJbkhhbGYoYXJyKSB7XG4gIGNvbnN0IGhhbGYgPSBNYXRoLmNlaWwoYXJyLmxlbmd0aCAvIDIpO1xuICByZXR1cm4gW2Fyci5zbGljZSgwLCBoYWxmKSwgYXJyLnNsaWNlKGhhbGYpXTtcbn1cblxuZnVuY3Rpb24gcmVhZEFzQnVmZmVyKHNvdXJjZSkge1xuICBpZiAodHlwZW9mIHNvdXJjZS5ieXRlcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIHNvdXJjZS5ieXRlcygpO1xuICB9XG4gIHJldHVybiBzb3VyY2UuYXJyYXlCdWZmZXIoKTtcbn1cblxuY29uc3QgT1JQQ19OQU1FID0gXCJvcnBjXCI7XG5jb25zdCBPUlBDX1NIQVJFRF9QQUNLQUdFX05BTUUgPSBcIkBvcnBjL3NoYXJlZFwiO1xuY29uc3QgT1JQQ19TSEFSRURfUEFDS0FHRV9WRVJTSU9OID0gXCIxLjEwLjRcIjtcblxuY2xhc3MgQWJvcnRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoLi4ucmVzdCkge1xuICAgIHN1cGVyKC4uLnJlc3QpO1xuICAgIHRoaXMubmFtZSA9IFwiQWJvcnRFcnJvclwiO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9uY2UoZm4pIHtcbiAgbGV0IGNhY2hlZDtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gZm4oKTtcbiAgICBjYWNoZWQgPSB7IHJlc3VsdCB9O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5mdW5jdGlvbiBzZXF1ZW50aWFsKGZuKSB7XG4gIGxldCBsYXN0T3BlcmF0aW9uUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICByZXR1cm4gKC4uLmFyZ3MpID0+IHtcbiAgICByZXR1cm4gbGFzdE9wZXJhdGlvblByb21pc2UgPSBsYXN0T3BlcmF0aW9uUHJvbWlzZS5jYXRjaCgoKSA9PiB7XG4gICAgfSkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gZm4oLi4uYXJncyk7XG4gICAgfSk7XG4gIH07XG59XG5mdW5jdGlvbiBkZWZlcihjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHNldFRpbWVvdXQoY2FsbGJhY2ssIDApO1xuICB9IGVsc2Uge1xuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGNhbGxiYWNrKSkpO1xuICB9XG59XG5cbmNvbnN0IFNQQU5fRVJST1JfU1RBVFVTID0gMjtcbmNvbnN0IEdMT0JBTF9PVEVMX0NPTkZJR19LRVkgPSBgX18ke09SUENfU0hBUkVEX1BBQ0tBR0VfTkFNRX1AJHtPUlBDX1NIQVJFRF9QQUNLQUdFX1ZFUlNJT059L290ZWwvY29uZmlnX19gO1xuZnVuY3Rpb24gc2V0R2xvYmFsT3RlbENvbmZpZyhjb25maWcpIHtcbiAgZ2xvYmFsVGhpc1tHTE9CQUxfT1RFTF9DT05GSUdfS0VZXSA9IGNvbmZpZztcbn1cbmZ1bmN0aW9uIGdldEdsb2JhbE90ZWxDb25maWcoKSB7XG4gIHJldHVybiBnbG9iYWxUaGlzW0dMT0JBTF9PVEVMX0NPTkZJR19LRVldO1xufVxuZnVuY3Rpb24gc3RhcnRTcGFuKG5hbWUsIG9wdGlvbnMgPSB7fSwgY29udGV4dCkge1xuICBjb25zdCB0cmFjZXIgPSBnZXRHbG9iYWxPdGVsQ29uZmlnKCk/LnRyYWNlcjtcbiAgcmV0dXJuIHRyYWNlcj8uc3RhcnRTcGFuKG5hbWUsIG9wdGlvbnMsIGNvbnRleHQpO1xufVxuZnVuY3Rpb24gc2V0U3BhbkVycm9yKHNwYW4sIGVycm9yLCBvcHRpb25zID0ge30pIHtcbiAgaWYgKCFzcGFuKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGV4Y2VwdGlvbiA9IHRvT3RlbEV4Y2VwdGlvbihlcnJvcik7XG4gIHNwYW4ucmVjb3JkRXhjZXB0aW9uKGV4Y2VwdGlvbik7XG4gIGlmICghb3B0aW9ucy5zaWduYWw/LmFib3J0ZWQgfHwgb3B0aW9ucy5zaWduYWwucmVhc29uICE9PSBlcnJvcikge1xuICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgIGNvZGU6IFNQQU5fRVJST1JfU1RBVFVTLFxuICAgICAgbWVzc2FnZTogZXhjZXB0aW9uLm1lc3NhZ2VcbiAgICB9KTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0U3BhbkF0dHJpYnV0ZShzcGFuLCBrZXksIHZhbHVlKSB7XG4gIGlmICghc3BhbiB8fCB2YWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNwYW4uc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpO1xufVxuZnVuY3Rpb24gdG9PdGVsRXhjZXB0aW9uKGVycm9yKSB7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgY29uc3QgZXhjZXB0aW9uID0ge1xuICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICAgIG5hbWU6IGVycm9yLm5hbWUsXG4gICAgICBzdGFjazogZXJyb3Iuc3RhY2tcbiAgICB9O1xuICAgIGlmIChcImNvZGVcIiBpbiBlcnJvciAmJiAodHlwZW9mIGVycm9yLmNvZGUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGVycm9yLmNvZGUgPT09IFwibnVtYmVyXCIpKSB7XG4gICAgICBleGNlcHRpb24uY29kZSA9IGVycm9yLmNvZGU7XG4gICAgfVxuICAgIHJldHVybiBleGNlcHRpb247XG4gIH1cbiAgcmV0dXJuIHsgbWVzc2FnZTogU3RyaW5nKGVycm9yKSB9O1xufVxuZnVuY3Rpb24gdG9TcGFuQXR0cmlidXRlVmFsdWUoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuIFwidW5kZWZpbmVkXCI7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSwgKF8sIHZhbHVlKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImJpZ2ludFwiKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwIHx8IHZhbHVlIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFN0cmluZyhkYXRhKTtcbiAgfVxufVxuYXN5bmMgZnVuY3Rpb24gcnVuV2l0aFNwYW4oeyBuYW1lLCBjb250ZXh0LCAuLi5vcHRpb25zIH0sIGZuKSB7XG4gIGNvbnN0IHRyYWNlciA9IGdldEdsb2JhbE90ZWxDb25maWcoKT8udHJhY2VyO1xuICBpZiAoIXRyYWNlcikge1xuICAgIHJldHVybiBmbigpO1xuICB9XG4gIGNvbnN0IGNhbGxiYWNrID0gYXN5bmMgKHNwYW4pID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZuKHNwYW4pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNldFNwYW5FcnJvcihzcGFuLCBlLCBvcHRpb25zKTtcbiAgICAgIHRocm93IGU7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNwYW4uZW5kKCk7XG4gICAgfVxuICB9O1xuICBpZiAoY29udGV4dCkge1xuICAgIHJldHVybiB0cmFjZXIuc3RhcnRBY3RpdmVTcGFuKG5hbWUsIG9wdGlvbnMsIGNvbnRleHQsIGNhbGxiYWNrKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdHJhY2VyLnN0YXJ0QWN0aXZlU3BhbihuYW1lLCBvcHRpb25zLCBjYWxsYmFjayk7XG4gIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIHJ1bkluU3BhbkNvbnRleHQoc3BhbiwgZm4pIHtcbiAgY29uc3Qgb3RlbENvbmZpZyA9IGdldEdsb2JhbE90ZWxDb25maWcoKTtcbiAgaWYgKCFzcGFuIHx8ICFvdGVsQ29uZmlnKSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH1cbiAgY29uc3QgY3R4ID0gb3RlbENvbmZpZy50cmFjZS5zZXRTcGFuKG90ZWxDb25maWcuY29udGV4dC5hY3RpdmUoKSwgc3Bhbik7XG4gIHJldHVybiBvdGVsQ29uZmlnLmNvbnRleHQud2l0aChjdHgsIGZuKTtcbn1cblxuY2xhc3MgQXN5bmNJZFF1ZXVlIHtcbiAgb3BlbklkcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIHF1ZXVlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIHdhaXRlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLm9wZW5JZHMuc2l6ZTtcbiAgfVxuICBnZXQgd2FpdGVySWRzKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMud2FpdGVycy5rZXlzKCkpO1xuICB9XG4gIGhhc0J1ZmZlcmVkSXRlbXMoaWQpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLnF1ZXVlcy5nZXQoaWQpPy5sZW5ndGgpO1xuICB9XG4gIG9wZW4oaWQpIHtcbiAgICB0aGlzLm9wZW5JZHMuYWRkKGlkKTtcbiAgfVxuICBpc09wZW4oaWQpIHtcbiAgICByZXR1cm4gdGhpcy5vcGVuSWRzLmhhcyhpZCk7XG4gIH1cbiAgcHVzaChpZCwgaXRlbSkge1xuICAgIHRoaXMuYXNzZXJ0T3BlbihpZCk7XG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMud2FpdGVycy5nZXQoaWQpO1xuICAgIGlmIChwZW5kaW5nPy5sZW5ndGgpIHtcbiAgICAgIHBlbmRpbmcuc2hpZnQoKVswXShpdGVtKTtcbiAgICAgIGlmIChwZW5kaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLndhaXRlcnMuZGVsZXRlKGlkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLnF1ZXVlcy5nZXQoaWQpO1xuICAgICAgaWYgKGl0ZW1zKSB7XG4gICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnF1ZXVlcy5zZXQoaWQsIFtpdGVtXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGFzeW5jIHB1bGwoaWQpIHtcbiAgICB0aGlzLmFzc2VydE9wZW4oaWQpO1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5xdWV1ZXMuZ2V0KGlkKTtcbiAgICBpZiAoaXRlbXM/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zLnNoaWZ0KCk7XG4gICAgICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMucXVldWVzLmRlbGV0ZShpZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHdhaXRpbmdQdWxscyA9IHRoaXMud2FpdGVycy5nZXQoaWQpO1xuICAgICAgY29uc3QgcGVuZGluZyA9IFtyZXNvbHZlLCByZWplY3RdO1xuICAgICAgaWYgKHdhaXRpbmdQdWxscykge1xuICAgICAgICB3YWl0aW5nUHVsbHMucHVzaChwZW5kaW5nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMud2FpdGVycy5zZXQoaWQsIFtwZW5kaW5nXSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgY2xvc2UoeyBpZCwgcmVhc29uIH0gPSB7fSkge1xuICAgIGlmIChpZCA9PT0gdm9pZCAwKSB7XG4gICAgICB0aGlzLndhaXRlcnMuZm9yRWFjaCgocGVuZGluZ1B1bGxzLCBpZDIpID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3IyID0gcmVhc29uID8/IG5ldyBBYm9ydEVycm9yKGBbQXN5bmNJZFF1ZXVlXSBRdWV1ZVske2lkMn1dIHdhcyBjbG9zZWQgb3IgYWJvcnRlZCB3aGlsZSB3YWl0aW5nIGZvciBwdWxsaW5nLmApO1xuICAgICAgICBwZW5kaW5nUHVsbHMuZm9yRWFjaCgoWywgcmVqZWN0XSkgPT4gcmVqZWN0KGVycm9yMikpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLndhaXRlcnMuY2xlYXIoKTtcbiAgICAgIHRoaXMub3Blbklkcy5jbGVhcigpO1xuICAgICAgdGhpcy5xdWV1ZXMuY2xlYXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXJyb3IgPSByZWFzb24gPz8gbmV3IEFib3J0RXJyb3IoYFtBc3luY0lkUXVldWVdIFF1ZXVlWyR7aWR9XSB3YXMgY2xvc2VkIG9yIGFib3J0ZWQgd2hpbGUgd2FpdGluZyBmb3IgcHVsbGluZy5gKTtcbiAgICB0aGlzLndhaXRlcnMuZ2V0KGlkKT8uZm9yRWFjaCgoWywgcmVqZWN0XSkgPT4gcmVqZWN0KGVycm9yKSk7XG4gICAgdGhpcy53YWl0ZXJzLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5vcGVuSWRzLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5xdWV1ZXMuZGVsZXRlKGlkKTtcbiAgfVxuICBhc3NlcnRPcGVuKGlkKSB7XG4gICAgaWYgKCF0aGlzLmlzT3BlbihpZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW0FzeW5jSWRRdWV1ZV0gQ2Fubm90IGFjY2VzcyBxdWV1ZVske2lkfV0gYmVjYXVzZSBpdCBpcyBub3Qgb3BlbiBvciBhYm9ydGVkLmApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc0FzeW5jSXRlcmF0b3JPYmplY3QobWF5YmUpIHtcbiAgaWYgKCFtYXliZSB8fCB0eXBlb2YgbWF5YmUgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIFwibmV4dFwiIGluIG1heWJlICYmIHR5cGVvZiBtYXliZS5uZXh0ID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLmFzeW5jSXRlcmF0b3IgaW4gbWF5YmUgJiYgdHlwZW9mIG1heWJlW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9PT0gXCJmdW5jdGlvblwiO1xufVxuY29uc3QgZmFsbGJhY2tBc3luY0Rpc3Bvc2VTeW1ib2wgPSBTeW1ib2wuZm9yKFwiYXN5bmNEaXNwb3NlXCIpO1xuY29uc3QgYXN5bmNEaXNwb3NlU3ltYm9sID0gU3ltYm9sLmFzeW5jRGlzcG9zZSA/PyBmYWxsYmFja0FzeW5jRGlzcG9zZVN5bWJvbDtcbmNsYXNzIEFzeW5jSXRlcmF0b3JDbGFzcyB7XG4gICNpc0RvbmUgPSBmYWxzZTtcbiAgI2lzRXhlY3V0ZUNvbXBsZXRlID0gZmFsc2U7XG4gICNjbGVhbnVwO1xuICAjbmV4dDtcbiAgY29uc3RydWN0b3IobmV4dCwgY2xlYW51cCkge1xuICAgIHRoaXMuI2NsZWFudXAgPSBjbGVhbnVwO1xuICAgIHRoaXMuI25leHQgPSBzZXF1ZW50aWFsKGFzeW5jICgpID0+IHtcbiAgICAgIGlmICh0aGlzLiNpc0RvbmUpIHtcbiAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHZvaWQgMCB9O1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbmV4dCgpO1xuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICB0aGlzLiNpc0RvbmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy4jaXNEb25lID0gdHJ1ZTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHRoaXMuI2lzRG9uZSAmJiAhdGhpcy4jaXNFeGVjdXRlQ29tcGxldGUpIHtcbiAgICAgICAgICB0aGlzLiNpc0V4ZWN1dGVDb21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgYXdhaXQgdGhpcy4jY2xlYW51cChcIm5leHRcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBuZXh0KCkge1xuICAgIHJldHVybiB0aGlzLiNuZXh0KCk7XG4gIH1cbiAgYXN5bmMgcmV0dXJuKHZhbHVlKSB7XG4gICAgdGhpcy4jaXNEb25lID0gdHJ1ZTtcbiAgICBpZiAoIXRoaXMuI2lzRXhlY3V0ZUNvbXBsZXRlKSB7XG4gICAgICB0aGlzLiNpc0V4ZWN1dGVDb21wbGV0ZSA9IHRydWU7XG4gICAgICBhd2FpdCB0aGlzLiNjbGVhbnVwKFwicmV0dXJuXCIpO1xuICAgIH1cbiAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZSB9O1xuICB9XG4gIGFzeW5jIHRocm93KGVycikge1xuICAgIHRoaXMuI2lzRG9uZSA9IHRydWU7XG4gICAgaWYgKCF0aGlzLiNpc0V4ZWN1dGVDb21wbGV0ZSkge1xuICAgICAgdGhpcy4jaXNFeGVjdXRlQ29tcGxldGUgPSB0cnVlO1xuICAgICAgYXdhaXQgdGhpcy4jY2xlYW51cChcInRocm93XCIpO1xuICAgIH1cbiAgICB0aHJvdyBlcnI7XG4gIH1cbiAgLyoqXG4gICAqIGFzeW5jRGlzcG9zZSBzeW1ib2wgb25seSBhdmFpbGFibGUgaW4gZXNuZXh0LCB3ZSBzaG91bGQgZmFsbGJhY2sgdG8gU3ltYm9sLmZvcignYXN5bmNEaXNwb3NlJylcbiAgICovXG4gIGFzeW5jIFthc3luY0Rpc3Bvc2VTeW1ib2xdKCkge1xuICAgIHRoaXMuI2lzRG9uZSA9IHRydWU7XG4gICAgaWYgKCF0aGlzLiNpc0V4ZWN1dGVDb21wbGV0ZSkge1xuICAgICAgdGhpcy4jaXNFeGVjdXRlQ29tcGxldGUgPSB0cnVlO1xuICAgICAgYXdhaXQgdGhpcy4jY2xlYW51cChcImRpc3Bvc2VcIik7XG4gICAgfVxuICB9XG4gIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlcGxpY2F0ZUFzeW5jSXRlcmF0b3Ioc291cmNlLCBjb3VudCkge1xuICBjb25zdCBxdWV1ZSA9IG5ldyBBc3luY0lkUXVldWUoKTtcbiAgY29uc3QgaWRzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogY291bnQgfSwgKF8sIGkpID0+IGkudG9TdHJpbmcoKSk7XG4gIGxldCBpc1NvdXJjZUZpbmlzaGVkID0gZmFsc2U7XG4gIGNvbnN0IHN0YXJ0ID0gb25jZShhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBhd2FpdCBzb3VyY2UubmV4dCgpO1xuICAgICAgICBpZHMuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgICBpZiAocXVldWUuaXNPcGVuKGlkKSkge1xuICAgICAgICAgICAgcXVldWUucHVzaChpZCwgeyBuZXh0OiBpdGVtIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpdGVtLmRvbmUpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZHMuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgaWYgKHF1ZXVlLmlzT3BlbihpZCkpIHtcbiAgICAgICAgICBxdWV1ZS5wdXNoKGlkLCB7IGVycm9yIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaXNTb3VyY2VGaW5pc2hlZCA9IHRydWU7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgcmVwbGljYXRlZCA9IGlkcy5tYXAoKGlkKSA9PiB7XG4gICAgcXVldWUub3BlbihpZCk7XG4gICAgcmV0dXJuIG5ldyBBc3luY0l0ZXJhdG9yQ2xhc3MoXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIHN0YXJ0KCk7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBhd2FpdCBxdWV1ZS5wdWxsKGlkKTtcbiAgICAgICAgaWYgKGl0ZW0ubmV4dCkge1xuICAgICAgICAgIHJldHVybiBpdGVtLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgaXRlbS5lcnJvcjtcbiAgICAgIH0sXG4gICAgICBhc3luYyAocmVhc29uKSA9PiB7XG4gICAgICAgIHF1ZXVlLmNsb3NlKHsgaWQgfSk7XG4gICAgICAgIGlmIChyZWFzb24gIT09IFwibmV4dFwiICYmICFxdWV1ZS5sZW5ndGggJiYgIWlzU291cmNlRmluaXNoZWQpIHtcbiAgICAgICAgICBpc1NvdXJjZUZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICBhd2FpdCBzb3VyY2U/LnJldHVybj8uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9KTtcbiAgcmV0dXJuIHJlcGxpY2F0ZWQ7XG59XG5mdW5jdGlvbiBhc3luY0l0ZXJhdG9yV2l0aFNwYW4oeyBuYW1lLCAuLi5vcHRpb25zIH0sIGl0ZXJhdG9yKSB7XG4gIGxldCBzcGFuO1xuICByZXR1cm4gbmV3IEFzeW5jSXRlcmF0b3JDbGFzcyhcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICBzcGFuID8/PSBzdGFydFNwYW4obmFtZSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW5JblNwYW5Db250ZXh0KHNwYW4sICgpID0+IGl0ZXJhdG9yLm5leHQoKSk7XG4gICAgICAgIHNwYW4/LmFkZEV2ZW50KHJlc3VsdC5kb25lID8gXCJjb21wbGV0ZWRcIiA6IFwieWllbGRlZFwiKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzZXRTcGFuRXJyb3Ioc3BhbiwgZXJyLCBvcHRpb25zKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgKHJlYXNvbikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHJlYXNvbiAhPT0gXCJuZXh0XCIpIHtcbiAgICAgICAgICBhd2FpdCBydW5JblNwYW5Db250ZXh0KHNwYW4sICgpID0+IGl0ZXJhdG9yLnJldHVybj8uKCkpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgc2V0U3BhbkVycm9yKHNwYW4sIGVyciwgb3B0aW9ucyk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNwYW4/LmVuZCgpO1xuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cblxuY2xhc3MgRXZlbnRQdWJsaXNoZXIge1xuICAjbGlzdGVuZXJzTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgI21heEJ1ZmZlcmVkRXZlbnRzO1xuICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcbiAgICB0aGlzLiNtYXhCdWZmZXJlZEV2ZW50cyA9IG9wdGlvbnMubWF4QnVmZmVyZWRFdmVudHMgPz8gMTAwO1xuICB9XG4gIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLiNsaXN0ZW5lcnNNYXAuc2l6ZTtcbiAgfVxuICAvKipcbiAgICogRW1pdHMgYW4gZXZlbnQgYW5kIGRlbGl2ZXJzIHRoZSBwYXlsb2FkIHRvIGFsbCBzdWJzY3JpYmVkIGxpc3RlbmVycy5cbiAgICovXG4gIHB1Ymxpc2goZXZlbnQsIHBheWxvYWQpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLiNsaXN0ZW5lcnNNYXAuZ2V0KGV2ZW50KTtcbiAgICBpZiAoIWxpc3RlbmVycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVycykge1xuICAgICAgbGlzdGVuZXIocGF5bG9hZCk7XG4gICAgfVxuICB9XG4gIHN1YnNjcmliZShldmVudCwgbGlzdGVuZXJPck9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIGxpc3RlbmVyT3JPcHRpb25zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGxldCBsaXN0ZW5lcnMgPSB0aGlzLiNsaXN0ZW5lcnNNYXAuZ2V0KGV2ZW50KTtcbiAgICAgIGlmICghbGlzdGVuZXJzKSB7XG4gICAgICAgIHRoaXMuI2xpc3RlbmVyc01hcC5zZXQoZXZlbnQsIGxpc3RlbmVycyA9IFtdKTtcbiAgICAgIH1cbiAgICAgIGxpc3RlbmVycy5wdXNoKGxpc3RlbmVyT3JPcHRpb25zKTtcbiAgICAgIHJldHVybiBvbmNlKCgpID0+IHtcbiAgICAgICAgbGlzdGVuZXJzLnNwbGljZShsaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lck9yT3B0aW9ucyksIDEpO1xuICAgICAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuI2xpc3RlbmVyc01hcC5kZWxldGUoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3Qgc2lnbmFsID0gbGlzdGVuZXJPck9wdGlvbnM/LnNpZ25hbDtcbiAgICBjb25zdCBtYXhCdWZmZXJlZEV2ZW50cyA9IGxpc3RlbmVyT3JPcHRpb25zPy5tYXhCdWZmZXJlZEV2ZW50cyA/PyB0aGlzLiNtYXhCdWZmZXJlZEV2ZW50cztcbiAgICBzaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgY29uc3QgYnVmZmVyZWRFdmVudHMgPSBbXTtcbiAgICBjb25zdCBwdWxsUmVzb2x2ZXJzID0gW107XG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSB0aGlzLnN1YnNjcmliZShldmVudCwgKHBheWxvYWQpID0+IHtcbiAgICAgIGNvbnN0IHJlc29sdmVyID0gcHVsbFJlc29sdmVycy5zaGlmdCgpO1xuICAgICAgaWYgKHJlc29sdmVyKSB7XG4gICAgICAgIHJlc29sdmVyWzBdKHsgZG9uZTogZmFsc2UsIHZhbHVlOiBwYXlsb2FkIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnVmZmVyZWRFdmVudHMucHVzaChwYXlsb2FkKTtcbiAgICAgICAgaWYgKGJ1ZmZlcmVkRXZlbnRzLmxlbmd0aCA+IG1heEJ1ZmZlcmVkRXZlbnRzKSB7XG4gICAgICAgICAgYnVmZmVyZWRFdmVudHMuc2hpZnQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGFib3J0TGlzdGVuZXIgPSAoZXZlbnQyKSA9PiB7XG4gICAgICB1bnN1YnNjcmliZSgpO1xuICAgICAgcHVsbFJlc29sdmVycy5mb3JFYWNoKChyZXNvbHZlcikgPT4gcmVzb2x2ZXJbMV0oZXZlbnQyLnRhcmdldC5yZWFzb24pKTtcbiAgICAgIHB1bGxSZXNvbHZlcnMubGVuZ3RoID0gMDtcbiAgICAgIGJ1ZmZlcmVkRXZlbnRzLmxlbmd0aCA9IDA7XG4gICAgfTtcbiAgICBzaWduYWw/LmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydExpc3RlbmVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgcmV0dXJuIG5ldyBBc3luY0l0ZXJhdG9yQ2xhc3MoYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKHNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgICB0aHJvdyBzaWduYWwucmVhc29uO1xuICAgICAgfVxuICAgICAgaWYgKGJ1ZmZlcmVkRXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBidWZmZXJlZEV2ZW50cy5zaGlmdCgpIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBwdWxsUmVzb2x2ZXJzLnB1c2goW3Jlc29sdmUsIHJlamVjdF0pO1xuICAgICAgfSk7XG4gICAgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgIHNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGFib3J0TGlzdGVuZXIpO1xuICAgICAgcHVsbFJlc29sdmVycy5mb3JFYWNoKChyZXNvbHZlcikgPT4gcmVzb2x2ZXJbMF0oeyBkb25lOiB0cnVlLCB2YWx1ZTogdm9pZCAwIH0pKTtcbiAgICAgIHB1bGxSZXNvbHZlcnMubGVuZ3RoID0gMDtcbiAgICAgIGJ1ZmZlcmVkRXZlbnRzLmxlbmd0aCA9IDA7XG4gICAgfSk7XG4gIH1cbn1cblxuY2xhc3MgU2VxdWVudGlhbElkR2VuZXJhdG9yIHtcbiAgaW5kZXggPSBCaWdJbnQoMSk7XG4gIGdlbmVyYXRlKCkge1xuICAgIGNvbnN0IGlkID0gdGhpcy5pbmRleC50b1N0cmluZygzNik7XG4gICAgdGhpcy5pbmRleCsrO1xuICAgIHJldHVybiBpZDtcbiAgfVxufVxuZnVuY3Rpb24gY29tcGFyZVNlcXVlbnRpYWxJZHMoYSwgYikge1xuICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGEubGVuZ3RoIC0gYi5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwO1xufVxuXG5mdW5jdGlvbiBvblN0YXJ0KGNhbGxiYWNrKSB7XG4gIHJldHVybiBhc3luYyAob3B0aW9ucywgLi4ucmVzdCkgPT4ge1xuICAgIGF3YWl0IGNhbGxiYWNrKG9wdGlvbnMsIC4uLnJlc3QpO1xuICAgIHJldHVybiBhd2FpdCBvcHRpb25zLm5leHQoKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIG9uU3VjY2VzcyhjYWxsYmFjaykge1xuICByZXR1cm4gYXN5bmMgKG9wdGlvbnMsIC4uLnJlc3QpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvcHRpb25zLm5leHQoKTtcbiAgICBhd2FpdCBjYWxsYmFjayhyZXN1bHQsIG9wdGlvbnMsIC4uLnJlc3QpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5mdW5jdGlvbiBvbkVycm9yKGNhbGxiYWNrKSB7XG4gIHJldHVybiBhc3luYyAob3B0aW9ucywgLi4ucmVzdCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgb3B0aW9ucy5uZXh0KCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGNhbGxiYWNrKGVycm9yLCBvcHRpb25zLCAuLi5yZXN0KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIG9uRmluaXNoKGNhbGxiYWNrKSB7XG4gIGxldCBzdGF0ZTtcbiAgcmV0dXJuIGFzeW5jIChvcHRpb25zLCAuLi5yZXN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9wdGlvbnMubmV4dCgpO1xuICAgICAgc3RhdGUgPSBbbnVsbCwgcmVzdWx0LCB0cnVlXTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHN0YXRlID0gW2Vycm9yLCB2b2lkIDAsIGZhbHNlXTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjYWxsYmFjayhzdGF0ZSwgb3B0aW9ucywgLi4ucmVzdCk7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gaW50ZXJjZXB0KGludGVyY2VwdG9ycywgb3B0aW9ucywgbWFpbikge1xuICBjb25zdCBuZXh0ID0gKG9wdGlvbnMyLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGludGVyY2VwdG9yID0gaW50ZXJjZXB0b3JzW2luZGV4XTtcbiAgICBpZiAoIWludGVyY2VwdG9yKSB7XG4gICAgICByZXR1cm4gbWFpbihvcHRpb25zMik7XG4gICAgfVxuICAgIHJldHVybiBpbnRlcmNlcHRvcih7XG4gICAgICAuLi5vcHRpb25zMixcbiAgICAgIG5leHQ6IChuZXdPcHRpb25zID0gb3B0aW9uczIpID0+IG5leHQobmV3T3B0aW9ucywgaW5kZXggKyAxKVxuICAgIH0pO1xuICB9O1xuICByZXR1cm4gbmV4dChvcHRpb25zLCAwKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VFbXB0eWFibGVKU09OKHRleHQpIHtcbiAgaWYgKCF0ZXh0KSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KTtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeUpTT04odmFsdWUpIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gZmluZERlZXBNYXRjaGVzKGNoZWNrLCBwYXlsb2FkLCBzZWdtZW50cyA9IFtdLCBtYXBzID0gW10sIHZhbHVlcyA9IFtdKSB7XG4gIGlmIChjaGVjayhwYXlsb2FkKSkge1xuICAgIG1hcHMucHVzaChzZWdtZW50cyk7XG4gICAgdmFsdWVzLnB1c2gocGF5bG9hZCk7XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShwYXlsb2FkKSkge1xuICAgIHBheWxvYWQuZm9yRWFjaCgodiwgaSkgPT4ge1xuICAgICAgZmluZERlZXBNYXRjaGVzKGNoZWNrLCB2LCBbLi4uc2VnbWVudHMsIGldLCBtYXBzLCB2YWx1ZXMpO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHBheWxvYWQpKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gcGF5bG9hZCkge1xuICAgICAgZmluZERlZXBNYXRjaGVzKGNoZWNrLCBwYXlsb2FkW2tleV0sIFsuLi5zZWdtZW50cywga2V5XSwgbWFwcywgdmFsdWVzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgbWFwcywgdmFsdWVzIH07XG59XG5mdW5jdGlvbiBnZXRDb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICBpZiAoIWlzVHlwZXNjcmlwdE9iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKT8uY29uc3RydWN0b3I7XG59XG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIHJldHVybiBwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCAhcHJvdG8gfHwgIXByb3RvLmNvbnN0cnVjdG9yO1xufVxuZnVuY3Rpb24gaXNUeXBlc2NyaXB0T2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpO1xufVxuZnVuY3Rpb24gY2xvbmUodmFsdWUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLm1hcChjbG9uZSk7XG4gIH1cbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlKSB7XG4gICAgICByZXN1bHRba2V5XSA9IGNsb25lKHZhbHVlW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGdldChvYmplY3QsIHBhdGgpIHtcbiAgbGV0IGN1cnJlbnQgPSBvYmplY3Q7XG4gIGZvciAoY29uc3Qga2V5IG9mIHBhdGgpIHtcbiAgICBpZiAoIWlzVHlwZXNjcmlwdE9iamVjdChjdXJyZW50KSkge1xuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgfVxuICByZXR1cm4gY3VycmVudDtcbn1cbmZ1bmN0aW9uIGlzUHJvcGVydHlLZXkodmFsdWUpIHtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuIHR5cGUgPT09IFwic3RyaW5nXCIgfHwgdHlwZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlID09PSBcInN5bWJvbFwiO1xufVxuY29uc3QgTnVsbFByb3RvT2JqID0gLyogQF9fUFVSRV9fICovICgoKSA9PiB7XG4gIGNvbnN0IGUgPSBmdW5jdGlvbigpIHtcbiAgfTtcbiAgZS5wcm90b3R5cGUgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgT2JqZWN0LmZyZWV6ZShlLnByb3RvdHlwZSk7XG4gIHJldHVybiBlO1xufSkoKTtcblxuZnVuY3Rpb24gdmFsdWUodmFsdWUyLCAuLi5hcmdzKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdmFsdWUyKC4uLmFyZ3MpO1xuICB9XG4gIHJldHVybiB2YWx1ZTI7XG59XG5mdW5jdGlvbiBmYWxsYmFjayh2YWx1ZTIsIGZhbGxiYWNrMikge1xuICByZXR1cm4gdmFsdWUyID09PSB2b2lkIDAgPyBmYWxsYmFjazIgOiB2YWx1ZTI7XG59XG5cbmZ1bmN0aW9uIHByZXZlbnROYXRpdmVBd2FpdCh0YXJnZXQpIHtcbiAgcmV0dXJuIG5ldyBQcm94eSh0YXJnZXQsIHtcbiAgICBnZXQodGFyZ2V0MiwgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IFJlZmxlY3QuZ2V0KHRhcmdldDIsIHByb3AsIHJlY2VpdmVyKTtcbiAgICAgIGlmIChwcm9wICE9PSBcInRoZW5cIiB8fCB0eXBlb2YgdmFsdWUyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlMjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUHJveHkodmFsdWUyLCB7XG4gICAgICAgIGFwcGx5KHRhcmdldEZuLCB0aGlzQXJnLCBhcmdzKSB7XG4gICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAyIHx8IGFyZ3Muc29tZSgoYXJnKSA9PiAhaXNOYXRpdmVGdW5jdGlvbihhcmcpKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkodGFyZ2V0Rm4sIHRoaXNBcmcsIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgc2hvdWxkT21pdCA9IHRydWU7XG4gICAgICAgICAgYXJnc1swXS5jYWxsKHRoaXNBcmcsIHByZXZlbnROYXRpdmVBd2FpdChuZXcgUHJveHkodGFyZ2V0Miwge1xuICAgICAgICAgICAgZ2V0OiAodGFyZ2V0MywgcHJvcDIsIHJlY2VpdmVyMikgPT4ge1xuICAgICAgICAgICAgICBpZiAoc2hvdWxkT21pdCAmJiBwcm9wMiA9PT0gXCJ0aGVuXCIpIHtcbiAgICAgICAgICAgICAgICBzaG91bGRPbWl0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0MywgcHJvcDIsIHJlY2VpdmVyMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cbmNvbnN0IE5BVElWRV9GVU5DVElPTl9SRUdFWCA9IC9eXFxzKmZ1bmN0aW9uXFxzKlxcKFxcKVxccypcXHtcXHMqXFxbbmF0aXZlIGNvZGVcXF1cXHMqXFx9XFxzKiQvO1xuZnVuY3Rpb24gaXNOYXRpdmVGdW5jdGlvbihmbikge1xuICByZXR1cm4gdHlwZW9mIGZuID09PSBcImZ1bmN0aW9uXCIgJiYgTkFUSVZFX0ZVTkNUSU9OX1JFR0VYLnRlc3QoZm4udG9TdHJpbmcoKSk7XG59XG5mdW5jdGlvbiBvdmVybGF5UHJveHkodGFyZ2V0LCBwYXJ0aWFsKSB7XG4gIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHR5cGVvZiB0YXJnZXQgPT09IFwiZnVuY3Rpb25cIiA/IHBhcnRpYWwgOiB0YXJnZXQsIHtcbiAgICBnZXQoXywgcHJvcCkge1xuICAgICAgY29uc3QgdGFyZ2V0VmFsdWUgPSBwcm9wIGluIHBhcnRpYWwgPyBwYXJ0aWFsIDogdmFsdWUodGFyZ2V0KTtcbiAgICAgIGNvbnN0IHYgPSBSZWZsZWN0LmdldCh0YXJnZXRWYWx1ZSwgcHJvcCk7XG4gICAgICByZXR1cm4gdHlwZW9mIHYgPT09IFwiZnVuY3Rpb25cIiA/IHYuYmluZCh0YXJnZXRWYWx1ZSkgOiB2O1xuICAgIH0sXG4gICAgaGFzKF8sIHByb3ApIHtcbiAgICAgIHJldHVybiBSZWZsZWN0LmhhcyhwYXJ0aWFsLCBwcm9wKSB8fCBSZWZsZWN0Lmhhcyh2YWx1ZSh0YXJnZXQpLCBwcm9wKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcHJveHk7XG59XG5cbmZ1bmN0aW9uIHN0cmVhbVRvQXN5bmNJdGVyYXRvckNsYXNzKHN0cmVhbSkge1xuICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XG4gIHJldHVybiBuZXcgQXN5bmNJdGVyYXRvckNsYXNzKFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIHJldHVybiByZWFkZXIucmVhZCgpO1xuICAgIH0sXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgcmVhZGVyLmNhbmNlbCgpO1xuICAgIH1cbiAgKTtcbn1cbmZ1bmN0aW9uIGFzeW5jSXRlcmF0b3JUb1N0cmVhbShpdGVyYXRvcikge1xuICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKHtcbiAgICBhc3luYyBwdWxsKGNvbnRyb2xsZXIpIHtcbiAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgIGlmIChkb25lKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBjYW5jZWwoKSB7XG4gICAgICBhd2FpdCBpdGVyYXRvci5yZXR1cm4/LigpO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBhc3luY0l0ZXJhdG9yVG9VbnByb3hpZWREYXRhU3RyZWFtKGl0ZXJhdG9yKSB7XG4gIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcikge1xuICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgaXRlcmF0b3IubmV4dCgpO1xuICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdW5wcm94aWVkID0gaXNPYmplY3QodmFsdWUpID8geyAuLi52YWx1ZSB9IDogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5tYXAoKGkpID0+IGkpIDogdmFsdWU7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh1bnByb3hpZWQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgY2FuY2VsKCkge1xuICAgICAgYXdhaXQgaXRlcmF0b3IucmV0dXJuPy4oKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0cnlEZWNvZGVVUklDb21wb25lbnQodmFsdWUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCB7IEFib3J0RXJyb3IsIEFzeW5jSWRRdWV1ZSwgQXN5bmNJdGVyYXRvckNsYXNzLCBFdmVudFB1Ymxpc2hlciwgTnVsbFByb3RvT2JqLCBPUlBDX05BTUUsIE9SUENfU0hBUkVEX1BBQ0tBR0VfTkFNRSwgT1JQQ19TSEFSRURfUEFDS0FHRV9WRVJTSU9OLCBTZXF1ZW50aWFsSWRHZW5lcmF0b3IsIGFzeW5jSXRlcmF0b3JUb1N0cmVhbSwgYXN5bmNJdGVyYXRvclRvVW5wcm94aWVkRGF0YVN0cmVhbSwgYXN5bmNJdGVyYXRvcldpdGhTcGFuLCBjbG9uZSwgY29tcGFyZVNlcXVlbnRpYWxJZHMsIGRlZmVyLCBmYWxsYmFjaywgZmluZERlZXBNYXRjaGVzLCBnZXQsIGdldENvbnN0cnVjdG9yLCBnZXRHbG9iYWxPdGVsQ29uZmlnLCBpbnRlcmNlcHQsIGlzQXN5bmNJdGVyYXRvck9iamVjdCwgaXNPYmplY3QsIGlzUHJvcGVydHlLZXksIGlzVHlwZXNjcmlwdE9iamVjdCwgb25FcnJvciwgb25GaW5pc2gsIG9uU3RhcnQsIG9uU3VjY2Vzcywgb25jZSwgb3ZlcmxheVByb3h5LCBwYXJzZUVtcHR5YWJsZUpTT04sIHByZXZlbnROYXRpdmVBd2FpdCwgcmVhZEFzQnVmZmVyLCByZXBsaWNhdGVBc3luY0l0ZXJhdG9yLCByZXNvbHZlTWF5YmVPcHRpb25hbE9wdGlvbnMsIHJ1bkluU3BhbkNvbnRleHQsIHJ1bldpdGhTcGFuLCBzZXF1ZW50aWFsLCBzZXRHbG9iYWxPdGVsQ29uZmlnLCBzZXRTcGFuQXR0cmlidXRlLCBzZXRTcGFuRXJyb3IsIHNwbGl0SW5IYWxmLCBzdGFydFNwYW4sIHN0cmVhbVRvQXN5bmNJdGVyYXRvckNsYXNzLCBzdHJpbmdpZnlKU09OLCB0b0FycmF5LCB0b090ZWxFeGNlcHRpb24sIHRvU3BhbkF0dHJpYnV0ZVZhbHVlLCB0cnlEZWNvZGVVUklDb21wb25lbnQsIHZhbHVlIH07XG4iLCJpbXBvcnQgeyBpc1R5cGVzY3JpcHRPYmplY3QsIEFzeW5jSXRlcmF0b3JDbGFzcywgdHJ5RGVjb2RlVVJJQ29tcG9uZW50LCB0b0FycmF5LCBvbmNlLCBpc0FzeW5jSXRlcmF0b3JPYmplY3QsIHJlcGxpY2F0ZUFzeW5jSXRlcmF0b3IgfSBmcm9tICdAb3JwYy9zaGFyZWQnO1xuXG5jbGFzcyBFdmVudEVuY29kZXJFcnJvciBleHRlbmRzIFR5cGVFcnJvciB7XG59XG5jbGFzcyBFdmVudERlY29kZXJFcnJvciBleHRlbmRzIFR5cGVFcnJvciB7XG59XG5jbGFzcyBFcnJvckV2ZW50IGV4dGVuZHMgRXJyb3Ige1xuICBkYXRhO1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucz8ubWVzc2FnZSA/PyBcIkFuIGVycm9yIGV2ZW50IHdhcyByZWNlaXZlZFwiLCBvcHRpb25zKTtcbiAgICB0aGlzLmRhdGEgPSBvcHRpb25zPy5kYXRhO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlY29kZUV2ZW50TWVzc2FnZShlbmNvZGVkKSB7XG4gIGNvbnN0IGxpbmVzID0gZW5jb2RlZC5yZXBsYWNlKC9cXG4rJC8sIFwiXCIpLnNwbGl0KC9cXG4vKTtcbiAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICBkYXRhOiB2b2lkIDAsXG4gICAgZXZlbnQ6IHZvaWQgMCxcbiAgICBpZDogdm9pZCAwLFxuICAgIHJldHJ5OiB2b2lkIDAsXG4gICAgY29tbWVudHM6IFtdXG4gIH07XG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGNvbnN0IGluZGV4ID0gbGluZS5pbmRleE9mKFwiOlwiKTtcbiAgICBjb25zdCBrZXkgPSBpbmRleCA9PT0gLTEgPyBsaW5lIDogbGluZS5zbGljZSgwLCBpbmRleCk7XG4gICAgY29uc3QgdmFsdWUgPSBpbmRleCA9PT0gLTEgPyBcIlwiIDogbGluZS5zbGljZShpbmRleCArIDEpLnJlcGxhY2UoL15cXHMvLCBcIlwiKTtcbiAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgIG1lc3NhZ2UuY29tbWVudHMucHVzaCh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwiZGF0YVwiKSB7XG4gICAgICBtZXNzYWdlLmRhdGEgPz89IFwiXCI7XG4gICAgICBtZXNzYWdlLmRhdGEgKz0gYCR7dmFsdWV9XG5gO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcImV2ZW50XCIpIHtcbiAgICAgIG1lc3NhZ2UuZXZlbnQgPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJpZFwiKSB7XG4gICAgICBtZXNzYWdlLmlkID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwicmV0cnlcIikge1xuICAgICAgY29uc3QgbWF5YmVJbnRlZ2VyID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlKTtcbiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG1heWJlSW50ZWdlcikgJiYgbWF5YmVJbnRlZ2VyID49IDAgJiYgbWF5YmVJbnRlZ2VyLnRvU3RyaW5nKCkgPT09IHZhbHVlKSB7XG4gICAgICAgIG1lc3NhZ2UucmV0cnkgPSBtYXliZUludGVnZXI7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIG1lc3NhZ2UuZGF0YSA9IG1lc3NhZ2UuZGF0YT8ucmVwbGFjZSgvXFxuJC8sIFwiXCIpO1xuICByZXR1cm4gbWVzc2FnZTtcbn1cbmNsYXNzIEV2ZW50RGVjb2RlciB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cbiAgaW5jb21wbGV0ZSA9IFwiXCI7XG4gIGZlZWQoY2h1bmspIHtcbiAgICB0aGlzLmluY29tcGxldGUgKz0gY2h1bms7XG4gICAgY29uc3QgbGFzdENvbXBsZXRlSW5kZXggPSB0aGlzLmluY29tcGxldGUubGFzdEluZGV4T2YoXCJcXG5cXG5cIik7XG4gICAgaWYgKGxhc3RDb21wbGV0ZUluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb21wbGV0ZXMgPSB0aGlzLmluY29tcGxldGUuc2xpY2UoMCwgbGFzdENvbXBsZXRlSW5kZXgpLnNwbGl0KC9cXG5cXG4vKTtcbiAgICB0aGlzLmluY29tcGxldGUgPSB0aGlzLmluY29tcGxldGUuc2xpY2UobGFzdENvbXBsZXRlSW5kZXggKyAyKTtcbiAgICBmb3IgKGNvbnN0IGVuY29kZWQgb2YgY29tcGxldGVzKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZGVjb2RlRXZlbnRNZXNzYWdlKGAke2VuY29kZWR9XG5cbmApO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkV2ZW50KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5vbkV2ZW50KG1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmluY29tcGxldGUgPSBcIlwiO1xuICB9XG4gIGVuZCgpIHtcbiAgICBpZiAodGhpcy5pbmNvbXBsZXRlKSB7XG4gICAgICB0aHJvdyBuZXcgRXZlbnREZWNvZGVyRXJyb3IoXCJFdmVudCBJdGVyYXRvciBlbmRlZCBiZWZvcmUgY29tcGxldGVcIik7XG4gICAgfVxuICB9XG59XG5jbGFzcyBFdmVudERlY29kZXJTdHJlYW0gZXh0ZW5kcyBUcmFuc2Zvcm1TdHJlYW0ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBsZXQgZGVjb2RlcjtcbiAgICBzdXBlcih7XG4gICAgICBzdGFydChjb250cm9sbGVyKSB7XG4gICAgICAgIGRlY29kZXIgPSBuZXcgRXZlbnREZWNvZGVyKHtcbiAgICAgICAgICBvbkV2ZW50OiAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICB0cmFuc2Zvcm0oY2h1bmspIHtcbiAgICAgICAgZGVjb2Rlci5mZWVkKGNodW5rKTtcbiAgICAgIH0sXG4gICAgICBmbHVzaCgpIHtcbiAgICAgICAgZGVjb2Rlci5lbmQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRFdmVudElkKGlkKSB7XG4gIGlmIChpZC5pbmNsdWRlcyhcIlxcblwiKSkge1xuICAgIHRocm93IG5ldyBFdmVudEVuY29kZXJFcnJvcihcIkV2ZW50J3MgaWQgbXVzdCBub3QgY29udGFpbiBhIG5ld2xpbmUgY2hhcmFjdGVyXCIpO1xuICB9XG59XG5mdW5jdGlvbiBhc3NlcnRFdmVudE5hbWUoZXZlbnQpIHtcbiAgaWYgKGV2ZW50LmluY2x1ZGVzKFwiXFxuXCIpKSB7XG4gICAgdGhyb3cgbmV3IEV2ZW50RW5jb2RlckVycm9yKFwiRXZlbnQncyBldmVudCBtdXN0IG5vdCBjb250YWluIGEgbmV3bGluZSBjaGFyYWN0ZXJcIik7XG4gIH1cbn1cbmZ1bmN0aW9uIGFzc2VydEV2ZW50UmV0cnkocmV0cnkpIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHJldHJ5KSB8fCByZXRyeSA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXZlbnRFbmNvZGVyRXJyb3IoXCJFdmVudCdzIHJldHJ5IG11c3QgYmUgYSBpbnRlZ2VyIGFuZCA+PSAwXCIpO1xuICB9XG59XG5mdW5jdGlvbiBhc3NlcnRFdmVudENvbW1lbnQoY29tbWVudCkge1xuICBpZiAoY29tbWVudC5pbmNsdWRlcyhcIlxcblwiKSkge1xuICAgIHRocm93IG5ldyBFdmVudEVuY29kZXJFcnJvcihcIkV2ZW50J3MgY29tbWVudCBtdXN0IG5vdCBjb250YWluIGEgbmV3bGluZSBjaGFyYWN0ZXJcIik7XG4gIH1cbn1cbmZ1bmN0aW9uIGVuY29kZUV2ZW50RGF0YShkYXRhKSB7XG4gIGNvbnN0IGxpbmVzID0gZGF0YT8uc3BsaXQoL1xcbi8pID8/IFtdO1xuICBsZXQgb3V0cHV0ID0gXCJcIjtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgb3V0cHV0ICs9IGBkYXRhOiAke2xpbmV9XG5gO1xuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59XG5mdW5jdGlvbiBlbmNvZGVFdmVudENvbW1lbnRzKGNvbW1lbnRzKSB7XG4gIGxldCBvdXRwdXQgPSBcIlwiO1xuICBmb3IgKGNvbnN0IGNvbW1lbnQgb2YgY29tbWVudHMgPz8gW10pIHtcbiAgICBhc3NlcnRFdmVudENvbW1lbnQoY29tbWVudCk7XG4gICAgb3V0cHV0ICs9IGA6ICR7Y29tbWVudH1cbmA7XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn1cbmZ1bmN0aW9uIGVuY29kZUV2ZW50TWVzc2FnZShtZXNzYWdlKSB7XG4gIGxldCBvdXRwdXQgPSBcIlwiO1xuICBvdXRwdXQgKz0gZW5jb2RlRXZlbnRDb21tZW50cyhtZXNzYWdlLmNvbW1lbnRzKTtcbiAgaWYgKG1lc3NhZ2UuZXZlbnQgIT09IHZvaWQgMCkge1xuICAgIGFzc2VydEV2ZW50TmFtZShtZXNzYWdlLmV2ZW50KTtcbiAgICBvdXRwdXQgKz0gYGV2ZW50OiAke21lc3NhZ2UuZXZlbnR9XG5gO1xuICB9XG4gIGlmIChtZXNzYWdlLnJldHJ5ICE9PSB2b2lkIDApIHtcbiAgICBhc3NlcnRFdmVudFJldHJ5KG1lc3NhZ2UucmV0cnkpO1xuICAgIG91dHB1dCArPSBgcmV0cnk6ICR7bWVzc2FnZS5yZXRyeX1cbmA7XG4gIH1cbiAgaWYgKG1lc3NhZ2UuaWQgIT09IHZvaWQgMCkge1xuICAgIGFzc2VydEV2ZW50SWQobWVzc2FnZS5pZCk7XG4gICAgb3V0cHV0ICs9IGBpZDogJHttZXNzYWdlLmlkfVxuYDtcbiAgfVxuICBvdXRwdXQgKz0gZW5jb2RlRXZlbnREYXRhKG1lc3NhZ2UuZGF0YSk7XG4gIG91dHB1dCArPSBcIlxcblwiO1xuICByZXR1cm4gb3V0cHV0O1xufVxuXG5jb25zdCBFVkVOVF9TT1VSQ0VfTUVUQV9TWU1CT0wgPSBTeW1ib2woXCJPUlBDX0VWRU5UX1NPVVJDRV9NRVRBXCIpO1xuZnVuY3Rpb24gd2l0aEV2ZW50TWV0YShjb250YWluZXIsIG1ldGEpIHtcbiAgaWYgKG1ldGEuaWQgPT09IHZvaWQgMCAmJiBtZXRhLnJldHJ5ID09PSB2b2lkIDAgJiYgIW1ldGEuY29tbWVudHM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBjb250YWluZXI7XG4gIH1cbiAgaWYgKG1ldGEuaWQgIT09IHZvaWQgMCkge1xuICAgIGFzc2VydEV2ZW50SWQobWV0YS5pZCk7XG4gIH1cbiAgaWYgKG1ldGEucmV0cnkgIT09IHZvaWQgMCkge1xuICAgIGFzc2VydEV2ZW50UmV0cnkobWV0YS5yZXRyeSk7XG4gIH1cbiAgaWYgKG1ldGEuY29tbWVudHMgIT09IHZvaWQgMCkge1xuICAgIGZvciAoY29uc3QgY29tbWVudCBvZiBtZXRhLmNvbW1lbnRzKSB7XG4gICAgICBhc3NlcnRFdmVudENvbW1lbnQoY29tbWVudCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXcgUHJveHkoY29udGFpbmVyLCB7XG4gICAgZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgICAgIGlmIChwcm9wID09PSBFVkVOVF9TT1VSQ0VfTUVUQV9TWU1CT0wpIHtcbiAgICAgICAgcmV0dXJuIG1ldGE7XG4gICAgICB9XG4gICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIGdldEV2ZW50TWV0YShjb250YWluZXIpIHtcbiAgcmV0dXJuIGlzVHlwZXNjcmlwdE9iamVjdChjb250YWluZXIpID8gUmVmbGVjdC5nZXQoY29udGFpbmVyLCBFVkVOVF9TT1VSQ0VfTUVUQV9TWU1CT0wpIDogdm9pZCAwO1xufVxuXG5jbGFzcyBIaWJlcm5hdGlvbkV2ZW50SXRlcmF0b3IgZXh0ZW5kcyBBc3luY0l0ZXJhdG9yQ2xhc3Mge1xuICAvKipcbiAgICogdGhpcyBwcm9wZXJ0eSBpcyBub3QgdHJhbnNmZXJyZWQgdG8gdGhlIGNsaWVudCwgc28gaXQgc2hvdWxkIGJlIG9wdGlvbmFsIGZvciB0eXBlIHNhZmV0eVxuICAgKi9cbiAgaGliZXJuYXRpb25DYWxsYmFjaztcbiAgY29uc3RydWN0b3IoaGliZXJuYXRpb25DYWxsYmFjaykge1xuICAgIHN1cGVyKGFzeW5jICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBpdGVyYXRlIG92ZXIgaGliZXJuYXRpbmcgaXRlcmF0b3IgZGlyZWN0bHlcIik7XG4gICAgfSwgYXN5bmMgKHJlYXNvbikgPT4ge1xuICAgICAgaWYgKHJlYXNvbiAhPT0gXCJuZXh0XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNsZWFudXAgaGliZXJuYXRpbmcgaXRlcmF0b3IgZGlyZWN0bHlcIik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5oaWJlcm5hdGlvbkNhbGxiYWNrID0gaGliZXJuYXRpb25DYWxsYmFjaztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUNvbnRlbnREaXNwb3NpdGlvbihmaWxlbmFtZSkge1xuICBjb25zdCBlc2NhcGVkRmlsZU5hbWUgPSBmaWxlbmFtZS5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJyk7XG4gIGNvbnN0IGVuY29kZWRGaWxlbmFtZVN0YXIgPSBlbmNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpLnJlcGxhY2UoL1snKCkqXS9nLCAoYykgPT4gYCUke2MuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX1gKS5yZXBsYWNlKC8lKDdDfDYwfDVFKS9nLCAoc3RyLCBoZXgpID0+IFN0cmluZy5mcm9tQ2hhckNvZGUoTnVtYmVyLnBhcnNlSW50KGhleCwgMTYpKSk7XG4gIHJldHVybiBgaW5saW5lOyBmaWxlbmFtZT1cIiR7ZXNjYXBlZEZpbGVOYW1lfVwiOyBmaWxlbmFtZSo9dXRmLTgnJyR7ZW5jb2RlZEZpbGVuYW1lU3Rhcn1gO1xufVxuZnVuY3Rpb24gZ2V0RmlsZW5hbWVGcm9tQ29udGVudERpc3Bvc2l0aW9uKGNvbnRlbnREaXNwb3NpdGlvbikge1xuICBjb25zdCBlbmNvZGVkRmlsZW5hbWVTdGFyTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24ubWF0Y2goL2ZpbGVuYW1lXFwqPShVVEYtOCcnKT8oW147XSopL2kpO1xuICBpZiAoZW5jb2RlZEZpbGVuYW1lU3Rhck1hdGNoICYmIHR5cGVvZiBlbmNvZGVkRmlsZW5hbWVTdGFyTWF0Y2hbMl0gPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gdHJ5RGVjb2RlVVJJQ29tcG9uZW50KGVuY29kZWRGaWxlbmFtZVN0YXJNYXRjaFsyXSk7XG4gIH1cbiAgY29uc3QgZW5jb2RlZEZpbGVuYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24ubWF0Y2goL2ZpbGVuYW1lPVwiKCg/OlxcXFxcInxbXlwiXSkqKVwiL2kpO1xuICBpZiAoZW5jb2RlZEZpbGVuYW1lTWF0Y2ggJiYgdHlwZW9mIGVuY29kZWRGaWxlbmFtZU1hdGNoWzFdID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGVuY29kZWRGaWxlbmFtZU1hdGNoWzFdLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKTtcbiAgfVxufVxuZnVuY3Rpb24gbWVyZ2VTdGFuZGFyZEhlYWRlcnMoYSwgYikge1xuICBjb25zdCBtZXJnZWQgPSB7IC4uLmEgfTtcbiAgZm9yIChjb25zdCBrZXkgaW4gYikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGJba2V5XSkpIHtcbiAgICAgIG1lcmdlZFtrZXldID0gWy4uLnRvQXJyYXkobWVyZ2VkW2tleV0pLCAuLi5iW2tleV1dO1xuICAgIH0gZWxzZSBpZiAoYltrZXldICE9PSB2b2lkIDApIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG1lcmdlZFtrZXldKSkge1xuICAgICAgICBtZXJnZWRba2V5XSA9IFsuLi5tZXJnZWRba2V5XSwgYltrZXldXTtcbiAgICAgIH0gZWxzZSBpZiAobWVyZ2VkW2tleV0gIT09IHZvaWQgMCkge1xuICAgICAgICBtZXJnZWRba2V5XSA9IFttZXJnZWRba2V5XSwgYltrZXldXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lcmdlZFtrZXldID0gYltrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbWVyZ2VkO1xufVxuZnVuY3Rpb24gZmxhdHRlbkhlYWRlcihoZWFkZXIpIHtcbiAgaWYgKHR5cGVvZiBoZWFkZXIgPT09IFwic3RyaW5nXCIgfHwgaGVhZGVyID09PSB2b2lkIDApIHtcbiAgICByZXR1cm4gaGVhZGVyO1xuICB9XG4gIGlmIChoZWFkZXIubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICByZXR1cm4gaGVhZGVyLmpvaW4oXCIsIFwiKTtcbn1cbmZ1bmN0aW9uIHJlcGxpY2F0ZVN0YW5kYXJkTGF6eVJlc3BvbnNlKHJlc3BvbnNlLCBjb3VudCkge1xuICBjb25zdCByZXBsaWNhdGVkID0gW107XG4gIGxldCBib2R5UHJvbWlzZTtcbiAgbGV0IHJlcGxpY2F0ZWRBc3luY0l0ZXJhdG9yT2JqZWN0cztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgcmVwbGljYXRlZC5wdXNoKHtcbiAgICAgIC4uLnJlc3BvbnNlLFxuICAgICAgYm9keTogb25jZShhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCAoYm9keVByb21pc2UgPz89IHJlc3BvbnNlLmJvZHkoKSk7XG4gICAgICAgIGlmICghaXNBc3luY0l0ZXJhdG9yT2JqZWN0KGJvZHkpKSB7XG4gICAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgICAgIH1cbiAgICAgICAgcmVwbGljYXRlZEFzeW5jSXRlcmF0b3JPYmplY3RzID8/PSByZXBsaWNhdGVBc3luY0l0ZXJhdG9yKGJvZHksIGNvdW50KTtcbiAgICAgICAgcmV0dXJuIHJlcGxpY2F0ZWRBc3luY0l0ZXJhdG9yT2JqZWN0cy5zaGlmdCgpO1xuICAgICAgfSlcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVwbGljYXRlZDtcbn1cbmZ1bmN0aW9uIGlzRXZlbnRJdGVyYXRvckhlYWRlcnMoaGVhZGVycykge1xuICByZXR1cm4gQm9vbGVhbihmbGF0dGVuSGVhZGVyKGhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0pPy5zdGFydHNXaXRoKFwidGV4dC9ldmVudC1zdHJlYW1cIikgJiYgZmxhdHRlbkhlYWRlcihoZWFkZXJzW1wiY29udGVudC1kaXNwb3NpdGlvblwiXSkgPT09IHZvaWQgMCk7XG59XG5cbmV4cG9ydCB7IEVycm9yRXZlbnQsIEV2ZW50RGVjb2RlciwgRXZlbnREZWNvZGVyRXJyb3IsIEV2ZW50RGVjb2RlclN0cmVhbSwgRXZlbnRFbmNvZGVyRXJyb3IsIEhpYmVybmF0aW9uRXZlbnRJdGVyYXRvciwgYXNzZXJ0RXZlbnRDb21tZW50LCBhc3NlcnRFdmVudElkLCBhc3NlcnRFdmVudE5hbWUsIGFzc2VydEV2ZW50UmV0cnksIGRlY29kZUV2ZW50TWVzc2FnZSwgZW5jb2RlRXZlbnRDb21tZW50cywgZW5jb2RlRXZlbnREYXRhLCBlbmNvZGVFdmVudE1lc3NhZ2UsIGZsYXR0ZW5IZWFkZXIsIGdlbmVyYXRlQ29udGVudERpc3Bvc2l0aW9uLCBnZXRFdmVudE1ldGEsIGdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbiwgaXNFdmVudEl0ZXJhdG9ySGVhZGVycywgbWVyZ2VTdGFuZGFyZEhlYWRlcnMsIHJlcGxpY2F0ZVN0YW5kYXJkTGF6eVJlc3BvbnNlLCB3aXRoRXZlbnRNZXRhIH07XG4iLCJpbXBvcnQgeyByZXNvbHZlTWF5YmVPcHRpb25hbE9wdGlvbnMsIGdldENvbnN0cnVjdG9yLCBpc09iamVjdCwgQXN5bmNJdGVyYXRvckNsYXNzLCBpc1R5cGVzY3JpcHRPYmplY3QgfSBmcm9tICdAb3JwYy9zaGFyZWQnO1xuaW1wb3J0IHsgZ2V0RXZlbnRNZXRhLCB3aXRoRXZlbnRNZXRhIH0gZnJvbSAnQG9ycGMvc3RhbmRhcmQtc2VydmVyJztcblxuY29uc3QgT1JQQ19DTElFTlRfUEFDS0FHRV9OQU1FID0gXCJAb3JwYy9jbGllbnRcIjtcbmNvbnN0IE9SUENfQ0xJRU5UX1BBQ0tBR0VfVkVSU0lPTiA9IFwiMS4xMC40XCI7XG5cbmNvbnN0IENPTU1PTl9PUlBDX0VSUk9SX0RFRlMgPSB7XG4gIEJBRF9SRVFVRVNUOiB7XG4gICAgc3RhdHVzOiA0MDAsXG4gICAgbWVzc2FnZTogXCJCYWQgUmVxdWVzdFwiXG4gIH0sXG4gIFVOQVVUSE9SSVpFRDoge1xuICAgIHN0YXR1czogNDAxLFxuICAgIG1lc3NhZ2U6IFwiVW5hdXRob3JpemVkXCJcbiAgfSxcbiAgRk9SQklEREVOOiB7XG4gICAgc3RhdHVzOiA0MDMsXG4gICAgbWVzc2FnZTogXCJGb3JiaWRkZW5cIlxuICB9LFxuICBOT1RfRk9VTkQ6IHtcbiAgICBzdGF0dXM6IDQwNCxcbiAgICBtZXNzYWdlOiBcIk5vdCBGb3VuZFwiXG4gIH0sXG4gIE1FVEhPRF9OT1RfU1VQUE9SVEVEOiB7XG4gICAgc3RhdHVzOiA0MDUsXG4gICAgbWVzc2FnZTogXCJNZXRob2QgTm90IFN1cHBvcnRlZFwiXG4gIH0sXG4gIE5PVF9BQ0NFUFRBQkxFOiB7XG4gICAgc3RhdHVzOiA0MDYsXG4gICAgbWVzc2FnZTogXCJOb3QgQWNjZXB0YWJsZVwiXG4gIH0sXG4gIFRJTUVPVVQ6IHtcbiAgICBzdGF0dXM6IDQwOCxcbiAgICBtZXNzYWdlOiBcIlJlcXVlc3QgVGltZW91dFwiXG4gIH0sXG4gIENPTkZMSUNUOiB7XG4gICAgc3RhdHVzOiA0MDksXG4gICAgbWVzc2FnZTogXCJDb25mbGljdFwiXG4gIH0sXG4gIFBSRUNPTkRJVElPTl9GQUlMRUQ6IHtcbiAgICBzdGF0dXM6IDQxMixcbiAgICBtZXNzYWdlOiBcIlByZWNvbmRpdGlvbiBGYWlsZWRcIlxuICB9LFxuICBQQVlMT0FEX1RPT19MQVJHRToge1xuICAgIHN0YXR1czogNDEzLFxuICAgIG1lc3NhZ2U6IFwiUGF5bG9hZCBUb28gTGFyZ2VcIlxuICB9LFxuICBVTlNVUFBPUlRFRF9NRURJQV9UWVBFOiB7XG4gICAgc3RhdHVzOiA0MTUsXG4gICAgbWVzc2FnZTogXCJVbnN1cHBvcnRlZCBNZWRpYSBUeXBlXCJcbiAgfSxcbiAgVU5QUk9DRVNTQUJMRV9DT05URU5UOiB7XG4gICAgc3RhdHVzOiA0MjIsXG4gICAgbWVzc2FnZTogXCJVbnByb2Nlc3NhYmxlIENvbnRlbnRcIlxuICB9LFxuICBUT09fTUFOWV9SRVFVRVNUUzoge1xuICAgIHN0YXR1czogNDI5LFxuICAgIG1lc3NhZ2U6IFwiVG9vIE1hbnkgUmVxdWVzdHNcIlxuICB9LFxuICBDTElFTlRfQ0xPU0VEX1JFUVVFU1Q6IHtcbiAgICBzdGF0dXM6IDQ5OSxcbiAgICBtZXNzYWdlOiBcIkNsaWVudCBDbG9zZWQgUmVxdWVzdFwiXG4gIH0sXG4gIElOVEVSTkFMX1NFUlZFUl9FUlJPUjoge1xuICAgIHN0YXR1czogNTAwLFxuICAgIG1lc3NhZ2U6IFwiSW50ZXJuYWwgU2VydmVyIEVycm9yXCJcbiAgfSxcbiAgTk9UX0lNUExFTUVOVEVEOiB7XG4gICAgc3RhdHVzOiA1MDEsXG4gICAgbWVzc2FnZTogXCJOb3QgSW1wbGVtZW50ZWRcIlxuICB9LFxuICBCQURfR0FURVdBWToge1xuICAgIHN0YXR1czogNTAyLFxuICAgIG1lc3NhZ2U6IFwiQmFkIEdhdGV3YXlcIlxuICB9LFxuICBTRVJWSUNFX1VOQVZBSUxBQkxFOiB7XG4gICAgc3RhdHVzOiA1MDMsXG4gICAgbWVzc2FnZTogXCJTZXJ2aWNlIFVuYXZhaWxhYmxlXCJcbiAgfSxcbiAgR0FURVdBWV9USU1FT1VUOiB7XG4gICAgc3RhdHVzOiA1MDQsXG4gICAgbWVzc2FnZTogXCJHYXRld2F5IFRpbWVvdXRcIlxuICB9XG59O1xuZnVuY3Rpb24gZmFsbGJhY2tPUlBDRXJyb3JTdGF0dXMoY29kZSwgc3RhdHVzKSB7XG4gIHJldHVybiBzdGF0dXMgPz8gQ09NTU9OX09SUENfRVJST1JfREVGU1tjb2RlXT8uc3RhdHVzID8/IDUwMDtcbn1cbmZ1bmN0aW9uIGZhbGxiYWNrT1JQQ0Vycm9yTWVzc2FnZShjb2RlLCBtZXNzYWdlKSB7XG4gIHJldHVybiBtZXNzYWdlIHx8IENPTU1PTl9PUlBDX0VSUk9SX0RFRlNbY29kZV0/Lm1lc3NhZ2UgfHwgY29kZTtcbn1cbmNvbnN0IEdMT0JBTF9PUlBDX0VSUk9SX0NPTlNUUlVDVE9SU19TWU1CT0wgPSBTeW1ib2wuZm9yKGBfXyR7T1JQQ19DTElFTlRfUEFDS0FHRV9OQU1FfUAke09SUENfQ0xJRU5UX1BBQ0tBR0VfVkVSU0lPTn0vZXJyb3IvT1JQQ19FUlJPUl9DT05TVFJVQ1RPUlNfX2ApO1xudm9pZCAoZ2xvYmFsVGhpc1tHTE9CQUxfT1JQQ19FUlJPUl9DT05TVFJVQ1RPUlNfU1lNQk9MXSA/Pz0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrU2V0KCkpO1xuY29uc3QgZ2xvYmFsT1JQQ0Vycm9yQ29uc3RydWN0b3JzID0gZ2xvYmFsVGhpc1tHTE9CQUxfT1JQQ19FUlJPUl9DT05TVFJVQ1RPUlNfU1lNQk9MXTtcbmNsYXNzIE9SUENFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgZGVmaW5lZDtcbiAgY29kZTtcbiAgc3RhdHVzO1xuICBkYXRhO1xuICBjb25zdHJ1Y3Rvcihjb2RlLCAuLi5yZXN0KSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHJlc29sdmVNYXliZU9wdGlvbmFsT3B0aW9ucyhyZXN0KTtcbiAgICBpZiAob3B0aW9ucy5zdGF0dXMgIT09IHZvaWQgMCAmJiAhaXNPUlBDRXJyb3JTdGF0dXMob3B0aW9ucy5zdGF0dXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbT1JQQ0Vycm9yXSBJbnZhbGlkIGVycm9yIHN0YXR1cyBjb2RlLlwiKTtcbiAgICB9XG4gICAgY29uc3QgbWVzc2FnZSA9IGZhbGxiYWNrT1JQQ0Vycm9yTWVzc2FnZShjb2RlLCBvcHRpb25zLm1lc3NhZ2UpO1xuICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgdGhpcy5zdGF0dXMgPSBmYWxsYmFja09SUENFcnJvclN0YXR1cyhjb2RlLCBvcHRpb25zLnN0YXR1cyk7XG4gICAgdGhpcy5kZWZpbmVkID0gb3B0aW9ucy5kZWZpbmVkID8/IGZhbHNlO1xuICAgIHRoaXMuZGF0YSA9IG9wdGlvbnMuZGF0YTtcbiAgfVxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlZmluZWQ6IHRoaXMuZGVmaW5lZCxcbiAgICAgIGNvZGU6IHRoaXMuY29kZSxcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBkYXRhOiB0aGlzLmRhdGFcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBXb3JrYXJvdW5kIGZvciBOZXh0LmpzIHdoZXJlIGRpZmZlcmVudCBjb250ZXh0cyB1c2Ugc2VwYXJhdGVcbiAgICogZGVwZW5kZW5jeSBncmFwaHMsIGNhdXNpbmcgbXVsdGlwbGUgT1JQQ0Vycm9yIGNvbnN0cnVjdG9ycyBleGlzdGluZyBhbmQgYnJlYWtpbmdcbiAgICogYGluc3RhbmNlb2ZgIGNoZWNrcyBhY3Jvc3MgY29udGV4dHMuXG4gICAqXG4gICAqIFRoaXMgaXMgcGFydGljdWxhcmx5IHByb2JsZW1hdGljIHdpdGggXCJPcHRpbWl6ZWQgU1NSXCIsIHdoZXJlIG9ycGMtY2xpZW50XG4gICAqIGV4ZWN1dGVzIGluIG9uZSBjb250ZXh0IGJ1dCBpcyBpbnZva2VkIGZyb20gYW5vdGhlci4gV2hlbiBhbiBlcnJvciBpcyB0aHJvd25cbiAgICogaW4gdGhlIGV4ZWN1dGlvbiBjb250ZXh0LCBgaW5zdGFuY2VvZiBPUlBDRXJyb3JgIGNoZWNrcyBmYWlsIGluIHRoZVxuICAgKiBpbnZvY2F0aW9uIGNvbnRleHQgZHVlIHRvIHNlcGFyYXRlIGNsYXNzIGNvbnN0cnVjdG9ycy5cbiAgICpcbiAgICogQHRvZG8gUmVtb3ZlIHRoaXMgYW5kIHJlbGF0ZWQgY29kZSBpZiBOZXh0LmpzIHJlc29sdmVzIHRoZSBtdWx0aXBsZSBkZXBlbmRlbmN5IGdyYXBoIGlzc3VlLlxuICAgKi9cbiAgc3RhdGljIFtTeW1ib2wuaGFzSW5zdGFuY2VdKGluc3RhbmNlKSB7XG4gICAgaWYgKGdsb2JhbE9SUENFcnJvckNvbnN0cnVjdG9ycy5oYXModGhpcykpIHtcbiAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gZ2V0Q29uc3RydWN0b3IoaW5zdGFuY2UpO1xuICAgICAgaWYgKGNvbnN0cnVjdG9yICYmIGdsb2JhbE9SUENFcnJvckNvbnN0cnVjdG9ycy5oYXMoY29uc3RydWN0b3IpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3VwZXJbU3ltYm9sLmhhc0luc3RhbmNlXShpbnN0YW5jZSk7XG4gIH1cbn1cbmdsb2JhbE9SUENFcnJvckNvbnN0cnVjdG9ycy5hZGQoT1JQQ0Vycm9yKTtcbmZ1bmN0aW9uIGlzRGVmaW5lZEVycm9yKGVycm9yKSB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIE9SUENFcnJvciAmJiBlcnJvci5kZWZpbmVkO1xufVxuZnVuY3Rpb24gdG9PUlBDRXJyb3IoZXJyb3IpIHtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgT1JQQ0Vycm9yID8gZXJyb3IgOiBuZXcgT1JQQ0Vycm9yKFwiSU5URVJOQUxfU0VSVkVSX0VSUk9SXCIsIHtcbiAgICBtZXNzYWdlOiBcIkludGVybmFsIHNlcnZlciBlcnJvclwiLFxuICAgIGNhdXNlOiBlcnJvclxuICB9KTtcbn1cbmZ1bmN0aW9uIGlzT1JQQ0Vycm9yU3RhdHVzKHN0YXR1cykge1xuICByZXR1cm4gc3RhdHVzIDwgMjAwIHx8IHN0YXR1cyA+PSA0MDA7XG59XG5mdW5jdGlvbiBpc09SUENFcnJvckpzb24oanNvbikge1xuICBpZiAoIWlzT2JqZWN0KGpzb24pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHZhbGlkS2V5cyA9IFtcImRlZmluZWRcIiwgXCJjb2RlXCIsIFwic3RhdHVzXCIsIFwibWVzc2FnZVwiLCBcImRhdGFcIl07XG4gIGlmIChPYmplY3Qua2V5cyhqc29uKS5zb21lKChrKSA9PiAhdmFsaWRLZXlzLmluY2x1ZGVzKGspKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gXCJkZWZpbmVkXCIgaW4ganNvbiAmJiB0eXBlb2YganNvbi5kZWZpbmVkID09PSBcImJvb2xlYW5cIiAmJiBcImNvZGVcIiBpbiBqc29uICYmIHR5cGVvZiBqc29uLmNvZGUgPT09IFwic3RyaW5nXCIgJiYgXCJzdGF0dXNcIiBpbiBqc29uICYmIHR5cGVvZiBqc29uLnN0YXR1cyA9PT0gXCJudW1iZXJcIiAmJiBpc09SUENFcnJvclN0YXR1cyhqc29uLnN0YXR1cykgJiYgXCJtZXNzYWdlXCIgaW4ganNvbiAmJiB0eXBlb2YganNvbi5tZXNzYWdlID09PSBcInN0cmluZ1wiO1xufVxuZnVuY3Rpb24gY3JlYXRlT1JQQ0Vycm9yRnJvbUpzb24oanNvbiwgb3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBuZXcgT1JQQ0Vycm9yKGpzb24uY29kZSwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgLi4uanNvblxuICB9KTtcbn1cblxuZnVuY3Rpb24gbWFwRXZlbnRJdGVyYXRvcihpdGVyYXRvciwgbWFwcykge1xuICBjb25zdCBtYXBFcnJvciA9IGFzeW5jIChlcnJvcikgPT4ge1xuICAgIGxldCBtYXBwZWRFcnJvciA9IGF3YWl0IG1hcHMuZXJyb3IoZXJyb3IpO1xuICAgIGlmIChtYXBwZWRFcnJvciAhPT0gZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1ldGEgPSBnZXRFdmVudE1ldGEoZXJyb3IpO1xuICAgICAgaWYgKG1ldGEgJiYgaXNUeXBlc2NyaXB0T2JqZWN0KG1hcHBlZEVycm9yKSkge1xuICAgICAgICBtYXBwZWRFcnJvciA9IHdpdGhFdmVudE1ldGEobWFwcGVkRXJyb3IsIG1ldGEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFwcGVkRXJyb3I7XG4gIH07XG4gIHJldHVybiBuZXcgQXN5bmNJdGVyYXRvckNsYXNzKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IGF3YWl0IG1hcEVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIGxldCBtYXBwZWRWYWx1ZSA9IGF3YWl0IG1hcHMudmFsdWUodmFsdWUsIGRvbmUpO1xuICAgIGlmIChtYXBwZWRWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgIGNvbnN0IG1ldGEgPSBnZXRFdmVudE1ldGEodmFsdWUpO1xuICAgICAgaWYgKG1ldGEgJiYgaXNUeXBlc2NyaXB0T2JqZWN0KG1hcHBlZFZhbHVlKSkge1xuICAgICAgICBtYXBwZWRWYWx1ZSA9IHdpdGhFdmVudE1ldGEobWFwcGVkVmFsdWUsIG1ldGEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBkb25lLCB2YWx1ZTogbWFwcGVkVmFsdWUgfTtcbiAgfSwgYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBpdGVyYXRvci5yZXR1cm4/LigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBhd2FpdCBtYXBFcnJvcihlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IHsgQ09NTU9OX09SUENfRVJST1JfREVGUyBhcyBDLCBPUlBDX0NMSUVOVF9QQUNLQUdFX05BTUUgYXMgTywgT1JQQ19DTElFTlRfUEFDS0FHRV9WRVJTSU9OIGFzIGEsIGZhbGxiYWNrT1JQQ0Vycm9yTWVzc2FnZSBhcyBiLCBPUlBDRXJyb3IgYXMgYywgaXNPUlBDRXJyb3JTdGF0dXMgYXMgZCwgaXNPUlBDRXJyb3JKc29uIGFzIGUsIGZhbGxiYWNrT1JQQ0Vycm9yU3RhdHVzIGFzIGYsIGNyZWF0ZU9SUENFcnJvckZyb21Kc29uIGFzIGcsIGlzRGVmaW5lZEVycm9yIGFzIGksIG1hcEV2ZW50SXRlcmF0b3IgYXMgbSwgdG9PUlBDRXJyb3IgYXMgdCB9O1xuIiwiaW1wb3J0IHsgaXNPYmplY3QsIE51bGxQcm90b09iaiB9IGZyb20gJ0BvcnBjL3NoYXJlZCc7XG5cbmNsYXNzIFN0YW5kYXJkQnJhY2tldE5vdGF0aW9uU2VyaWFsaXplciB7XG4gIG1heEFycmF5SW5kZXg7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMubWF4QXJyYXlJbmRleCA9IG9wdGlvbnMubWF4QnJhY2tldE5vdGF0aW9uQXJyYXlJbmRleCA/PyA5OTk5O1xuICB9XG4gIHNlcmlhbGl6ZShkYXRhLCBzZWdtZW50cyA9IFtdLCByZXN1bHQgPSBbXSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICBkYXRhLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgdGhpcy5zZXJpYWxpemUoaXRlbSwgWy4uLnNlZ21lbnRzLCBpXSwgcmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICAgICAgdGhpcy5zZXJpYWxpemUoZGF0YVtrZXldLCBbLi4uc2VnbWVudHMsIGtleV0sIHJlc3VsdCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wdXNoKFt0aGlzLnN0cmluZ2lmeVBhdGgoc2VnbWVudHMpLCBkYXRhXSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZGVzZXJpYWxpemUoc2VyaWFsaXplZCkge1xuICAgIGlmIChzZXJpYWxpemVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjb25zdCBhcnJheVB1c2hTdHlsZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtTZXQoKTtcbiAgICBjb25zdCByZWYgPSB7IHZhbHVlOiBbXSB9O1xuICAgIGZvciAoY29uc3QgW3BhdGgsIHZhbHVlXSBvZiBzZXJpYWxpemVkKSB7XG4gICAgICBjb25zdCBzZWdtZW50cyA9IHRoaXMucGFyc2VQYXRoKHBhdGgpO1xuICAgICAgbGV0IGN1cnJlbnRSZWYgPSByZWY7XG4gICAgICBsZXQgbmV4dFNlZ21lbnQgPSBcInZhbHVlXCI7XG4gICAgICBzZWdtZW50cy5mb3JFYWNoKChzZWdtZW50LCBpKSA9PiB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjdXJyZW50UmVmW25leHRTZWdtZW50XSkgJiYgIWlzT2JqZWN0KGN1cnJlbnRSZWZbbmV4dFNlZ21lbnRdKSkge1xuICAgICAgICAgIGN1cnJlbnRSZWZbbmV4dFNlZ21lbnRdID0gW107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgIT09IHNlZ21lbnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50UmVmW25leHRTZWdtZW50XSkgJiYgIWlzVmFsaWRBcnJheUluZGV4KHNlZ21lbnQsIHRoaXMubWF4QXJyYXlJbmRleCkpIHtcbiAgICAgICAgICAgIGlmIChhcnJheVB1c2hTdHlsZXMuaGFzKGN1cnJlbnRSZWZbbmV4dFNlZ21lbnRdKSkge1xuICAgICAgICAgICAgICBhcnJheVB1c2hTdHlsZXMuZGVsZXRlKGN1cnJlbnRSZWZbbmV4dFNlZ21lbnRdKTtcbiAgICAgICAgICAgICAgY3VycmVudFJlZltuZXh0U2VnbWVudF0gPSBwdXNoU3R5bGVBcnJheVRvT2JqZWN0KGN1cnJlbnRSZWZbbmV4dFNlZ21lbnRdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRSZWZbbmV4dFNlZ21lbnRdID0gYXJyYXlUb09iamVjdChjdXJyZW50UmVmW25leHRTZWdtZW50XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnRSZWZbbmV4dFNlZ21lbnRdKSkge1xuICAgICAgICAgICAgaWYgKHNlZ21lbnQgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRSZWZbbmV4dFNlZ21lbnRdLmxlbmd0aCAmJiAhYXJyYXlQdXNoU3R5bGVzLmhhcyhjdXJyZW50UmVmW25leHRTZWdtZW50XSkpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UmVmW25leHRTZWdtZW50XSA9IGFycmF5VG9PYmplY3QoY3VycmVudFJlZltuZXh0U2VnbWVudF0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoYXJyYXlQdXNoU3R5bGVzLmhhcyhjdXJyZW50UmVmW25leHRTZWdtZW50XSkpIHtcbiAgICAgICAgICAgICAgICBhcnJheVB1c2hTdHlsZXMuZGVsZXRlKGN1cnJlbnRSZWZbbmV4dFNlZ21lbnRdKTtcbiAgICAgICAgICAgICAgICBjdXJyZW50UmVmW25leHRTZWdtZW50XSA9IHB1c2hTdHlsZUFycmF5VG9PYmplY3QoY3VycmVudFJlZltuZXh0U2VnbWVudF0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1ZhbGlkQXJyYXlJbmRleChzZWdtZW50LCB0aGlzLm1heEFycmF5SW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFJlZltuZXh0U2VnbWVudF0gPSBhcnJheVRvT2JqZWN0KGN1cnJlbnRSZWZbbmV4dFNlZ21lbnRdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50UmVmID0gY3VycmVudFJlZltuZXh0U2VnbWVudF07XG4gICAgICAgIG5leHRTZWdtZW50ID0gc2VnbWVudDtcbiAgICAgIH0pO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudFJlZikgJiYgbmV4dFNlZ21lbnQgPT09IFwiXCIpIHtcbiAgICAgICAgYXJyYXlQdXNoU3R5bGVzLmFkZChjdXJyZW50UmVmKTtcbiAgICAgICAgY3VycmVudFJlZi5wdXNoKHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAobmV4dFNlZ21lbnQgaW4gY3VycmVudFJlZikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50UmVmW25leHRTZWdtZW50XSkpIHtcbiAgICAgICAgICBjdXJyZW50UmVmW25leHRTZWdtZW50XS5wdXNoKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdXJyZW50UmVmW25leHRTZWdtZW50XSA9IFtjdXJyZW50UmVmW25leHRTZWdtZW50XSwgdmFsdWVdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50UmVmW25leHRTZWdtZW50XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVmLnZhbHVlO1xuICB9XG4gIHN0cmluZ2lmeVBhdGgoc2VnbWVudHMpIHtcbiAgICByZXR1cm4gc2VnbWVudHMubWFwKChzZWdtZW50KSA9PiB7XG4gICAgICByZXR1cm4gc2VnbWVudC50b1N0cmluZygpLnJlcGxhY2UoL1tcXFxcW1xcXV0vZywgKG1hdGNoKSA9PiB7XG4gICAgICAgIHN3aXRjaCAobWF0Y2gpIHtcbiAgICAgICAgICBjYXNlIFwiXFxcXFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiXFxcXFxcXFxcIjtcbiAgICAgICAgICBjYXNlIFwiW1wiOlxuICAgICAgICAgICAgcmV0dXJuIFwiXFxcXFtcIjtcbiAgICAgICAgICBjYXNlIFwiXVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiXFxcXF1cIjtcbiAgICAgICAgICAvKiB2OCBpZ25vcmUgbmV4dCAyICovXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSkucmVkdWNlKChyZXN1bHQsIHNlZ21lbnQsIGkpID0+IHtcbiAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgIHJldHVybiBzZWdtZW50O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAke3Jlc3VsdH1bJHtzZWdtZW50fV1gO1xuICAgIH0sIFwiXCIpO1xuICB9XG4gIHBhcnNlUGF0aChwYXRoKSB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBbXTtcbiAgICBsZXQgaW5CcmFja2V0cyA9IGZhbHNlO1xuICAgIGxldCBjdXJyZW50U2VnbWVudCA9IFwiXCI7XG4gICAgbGV0IGJhY2tzbGFzaENvdW50ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoYXIgPSBwYXRoW2ldO1xuICAgICAgY29uc3QgbmV4dENoYXIgPSBwYXRoW2kgKyAxXTtcbiAgICAgIGlmIChpbkJyYWNrZXRzICYmIGNoYXIgPT09IFwiXVwiICYmIChuZXh0Q2hhciA9PT0gdm9pZCAwIHx8IG5leHRDaGFyID09PSBcIltcIikgJiYgYmFja3NsYXNoQ291bnQgJSAyID09PSAwKSB7XG4gICAgICAgIGlmIChuZXh0Q2hhciA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgaW5CcmFja2V0cyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHNlZ21lbnRzLnB1c2goY3VycmVudFNlZ21lbnQpO1xuICAgICAgICBjdXJyZW50U2VnbWVudCA9IFwiXCI7XG4gICAgICAgIGkrKztcbiAgICAgIH0gZWxzZSBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAwICYmIGNoYXIgPT09IFwiW1wiICYmIGJhY2tzbGFzaENvdW50ICUgMiA9PT0gMCkge1xuICAgICAgICBpbkJyYWNrZXRzID0gdHJ1ZTtcbiAgICAgICAgc2VnbWVudHMucHVzaChjdXJyZW50U2VnbWVudCk7XG4gICAgICAgIGN1cnJlbnRTZWdtZW50ID0gXCJcIjtcbiAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gXCJcXFxcXCIpIHtcbiAgICAgICAgYmFja3NsYXNoQ291bnQrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnRTZWdtZW50ICs9IFwiXFxcXFwiLnJlcGVhdChiYWNrc2xhc2hDb3VudCAvIDIpICsgY2hhcjtcbiAgICAgICAgYmFja3NsYXNoQ291bnQgPSAwO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5CcmFja2V0cyB8fCBzZWdtZW50cy5sZW5ndGggPT09IDAgPyBbcGF0aF0gOiBzZWdtZW50cztcbiAgfVxufVxuZnVuY3Rpb24gaXNWYWxpZEFycmF5SW5kZXgodmFsdWUsIG1heEluZGV4KSB7XG4gIHJldHVybiAvXjAkfF5bMS05XVxcZCokLy50ZXN0KHZhbHVlKSAmJiBOdW1iZXIodmFsdWUpIDw9IG1heEluZGV4O1xufVxuZnVuY3Rpb24gYXJyYXlUb09iamVjdChhcnJheSkge1xuICBjb25zdCBvYmogPSBuZXcgTnVsbFByb3RvT2JqKCk7XG4gIGFycmF5LmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICBvYmpbaV0gPSBpdGVtO1xuICB9KTtcbiAgcmV0dXJuIG9iajtcbn1cbmZ1bmN0aW9uIHB1c2hTdHlsZUFycmF5VG9PYmplY3QoYXJyYXkpIHtcbiAgY29uc3Qgb2JqID0gbmV3IE51bGxQcm90b09iaigpO1xuICBvYmpbXCJcIl0gPSBhcnJheS5sZW5ndGggPT09IDEgPyBhcnJheVswXSA6IGFycmF5O1xuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgeyBTdGFuZGFyZEJyYWNrZXROb3RhdGlvblNlcmlhbGl6ZXIgYXMgUyB9O1xuIiwiaW1wb3J0IHsgdG9BcnJheSwgcnVuV2l0aFNwYW4sIE9SUENfTkFNRSwgaXNBc3luY0l0ZXJhdG9yT2JqZWN0LCBhc3luY0l0ZXJhdG9yV2l0aFNwYW4sIGludGVyY2VwdCwgZ2V0R2xvYmFsT3RlbENvbmZpZywgaXNPYmplY3QsIHZhbHVlLCBzdHJpbmdpZnlKU09OIH0gZnJvbSAnQG9ycGMvc2hhcmVkJztcbmltcG9ydCB7IG1lcmdlU3RhbmRhcmRIZWFkZXJzLCBFcnJvckV2ZW50IH0gZnJvbSAnQG9ycGMvc3RhbmRhcmQtc2VydmVyJztcbmltcG9ydCB7IEMgYXMgQ09NTU9OX09SUENfRVJST1JfREVGUywgZCBhcyBpc09SUENFcnJvclN0YXR1cywgZSBhcyBpc09SUENFcnJvckpzb24sIGcgYXMgY3JlYXRlT1JQQ0Vycm9yRnJvbUpzb24sIGMgYXMgT1JQQ0Vycm9yLCBtIGFzIG1hcEV2ZW50SXRlcmF0b3IsIHQgYXMgdG9PUlBDRXJyb3IgfSBmcm9tICcuL2NsaWVudC5EbWtNZF9HQi5tanMnO1xuaW1wb3J0IHsgdG9TdGFuZGFyZEhlYWRlcnMgYXMgdG9TdGFuZGFyZEhlYWRlcnMkMSB9IGZyb20gJ0BvcnBjL3N0YW5kYXJkLXNlcnZlci1mZXRjaCc7XG5cbmNsYXNzIENvbXBvc2l0ZVN0YW5kYXJkTGlua1BsdWdpbiB7XG4gIHBsdWdpbnM7XG4gIGNvbnN0cnVjdG9yKHBsdWdpbnMgPSBbXSkge1xuICAgIHRoaXMucGx1Z2lucyA9IFsuLi5wbHVnaW5zXS5zb3J0KChhLCBiKSA9PiAoYS5vcmRlciA/PyAwKSAtIChiLm9yZGVyID8/IDApKTtcbiAgfVxuICBpbml0KG9wdGlvbnMpIHtcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMpIHtcbiAgICAgIHBsdWdpbi5pbml0Py4ob3B0aW9ucyk7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIFN0YW5kYXJkTGluayB7XG4gIGNvbnN0cnVjdG9yKGNvZGVjLCBzZW5kZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuY29kZWMgPSBjb2RlYztcbiAgICB0aGlzLnNlbmRlciA9IHNlbmRlcjtcbiAgICBjb25zdCBwbHVnaW4gPSBuZXcgQ29tcG9zaXRlU3RhbmRhcmRMaW5rUGx1Z2luKG9wdGlvbnMucGx1Z2lucyk7XG4gICAgcGx1Z2luLmluaXQob3B0aW9ucyk7XG4gICAgdGhpcy5pbnRlcmNlcHRvcnMgPSB0b0FycmF5KG9wdGlvbnMuaW50ZXJjZXB0b3JzKTtcbiAgICB0aGlzLmNsaWVudEludGVyY2VwdG9ycyA9IHRvQXJyYXkob3B0aW9ucy5jbGllbnRJbnRlcmNlcHRvcnMpO1xuICB9XG4gIGludGVyY2VwdG9ycztcbiAgY2xpZW50SW50ZXJjZXB0b3JzO1xuICBjYWxsKHBhdGgsIGlucHV0LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHJ1bldpdGhTcGFuKFxuICAgICAgeyBuYW1lOiBgJHtPUlBDX05BTUV9LiR7cGF0aC5qb2luKFwiL1wiKX1gLCBzaWduYWw6IG9wdGlvbnMuc2lnbmFsIH0sXG4gICAgICAoc3BhbikgPT4ge1xuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGUoXCJycGMuc3lzdGVtXCIsIE9SUENfTkFNRSk7XG4gICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZShcInJwYy5tZXRob2RcIiwgcGF0aC5qb2luKFwiLlwiKSk7XG4gICAgICAgIGlmIChpc0FzeW5jSXRlcmF0b3JPYmplY3QoaW5wdXQpKSB7XG4gICAgICAgICAgaW5wdXQgPSBhc3luY0l0ZXJhdG9yV2l0aFNwYW4oXG4gICAgICAgICAgICB7IG5hbWU6IFwiY29uc3VtZV9ldmVudF9pdGVyYXRvcl9pbnB1dFwiLCBzaWduYWw6IG9wdGlvbnMuc2lnbmFsIH0sXG4gICAgICAgICAgICBpbnB1dFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGludGVyY2VwdCh0aGlzLmludGVyY2VwdG9ycywgeyAuLi5vcHRpb25zLCBwYXRoLCBpbnB1dCB9LCBhc3luYyAoeyBwYXRoOiBwYXRoMiwgaW5wdXQ6IGlucHV0MiwgLi4ub3B0aW9uczIgfSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG90ZWxDb25maWcgPSBnZXRHbG9iYWxPdGVsQ29uZmlnKCk7XG4gICAgICAgICAgbGV0IG90ZWxDb250ZXh0O1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRTcGFuID0gb3RlbENvbmZpZz8udHJhY2UuZ2V0QWN0aXZlU3BhbigpID8/IHNwYW47XG4gICAgICAgICAgaWYgKGN1cnJlbnRTcGFuICYmIG90ZWxDb25maWcpIHtcbiAgICAgICAgICAgIG90ZWxDb250ZXh0ID0gb3RlbENvbmZpZz8udHJhY2Uuc2V0U3BhbihvdGVsQ29uZmlnLmNvbnRleHQuYWN0aXZlKCksIGN1cnJlbnRTcGFuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVxdWVzdCA9IGF3YWl0IHJ1bldpdGhTcGFuKFxuICAgICAgICAgICAgeyBuYW1lOiBcImVuY29kZV9yZXF1ZXN0XCIsIGNvbnRleHQ6IG90ZWxDb250ZXh0IH0sXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmNvZGVjLmVuY29kZShwYXRoMiwgaW5wdXQyLCBvcHRpb25zMilcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgaW50ZXJjZXB0KFxuICAgICAgICAgICAgdGhpcy5jbGllbnRJbnRlcmNlcHRvcnMsXG4gICAgICAgICAgICB7IC4uLm9wdGlvbnMyLCBpbnB1dDogaW5wdXQyLCBwYXRoOiBwYXRoMiwgcmVxdWVzdCB9LFxuICAgICAgICAgICAgKHsgaW5wdXQ6IGlucHV0MywgcGF0aDogcGF0aDMsIHJlcXVlc3Q6IHJlcXVlc3QyLCAuLi5vcHRpb25zMyB9KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBydW5XaXRoU3BhbihcbiAgICAgICAgICAgICAgICB7IG5hbWU6IFwic2VuZF9yZXF1ZXN0XCIsIHNpZ25hbDogb3B0aW9uczMuc2lnbmFsLCBjb250ZXh0OiBvdGVsQ29udGV4dCB9LFxuICAgICAgICAgICAgICAgICgpID0+IHRoaXMuc2VuZGVyLmNhbGwocmVxdWVzdDIsIG9wdGlvbnMzLCBwYXRoMywgaW5wdXQzKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgcnVuV2l0aFNwYW4oXG4gICAgICAgICAgICB7IG5hbWU6IFwiZGVjb2RlX3Jlc3BvbnNlXCIsIGNvbnRleHQ6IG90ZWxDb250ZXh0IH0sXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmNvZGVjLmRlY29kZShyZXNwb25zZSwgb3B0aW9uczIsIHBhdGgyLCBpbnB1dDIpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoaXNBc3luY0l0ZXJhdG9yT2JqZWN0KG91dHB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBhc3luY0l0ZXJhdG9yV2l0aFNwYW4oXG4gICAgICAgICAgICAgIHsgbmFtZTogXCJjb25zdW1lX2V2ZW50X2l0ZXJhdG9yX291dHB1dFwiLCBzaWduYWw6IG9wdGlvbnMyLnNpZ25hbCB9LFxuICAgICAgICAgICAgICBvdXRwdXRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuY29uc3QgU1RBTkRBUkRfUlBDX0pTT05fU0VSSUFMSVpFUl9CVUlMVF9JTl9UWVBFUyA9IHtcbiAgQklHSU5UOiAwLFxuICBEQVRFOiAxLFxuICBOQU46IDIsXG4gIFVOREVGSU5FRDogMyxcbiAgVVJMOiA0LFxuICBSRUdFWFA6IDUsXG4gIFNFVDogNixcbiAgTUFQOiA3XG59O1xuY2xhc3MgU3RhbmRhcmRSUENKc29uU2VyaWFsaXplciB7XG4gIGN1c3RvbVNlcmlhbGl6ZXJzO1xuICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmN1c3RvbVNlcmlhbGl6ZXJzID0gb3B0aW9ucy5jdXN0b21Kc29uU2VyaWFsaXplcnMgPz8gW107XG4gICAgaWYgKHRoaXMuY3VzdG9tU2VyaWFsaXplcnMubGVuZ3RoICE9PSBuZXcgU2V0KHRoaXMuY3VzdG9tU2VyaWFsaXplcnMubWFwKChjdXN0b20pID0+IGN1c3RvbS50eXBlKSkuc2l6ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ3VzdG9tIHNlcmlhbGl6ZXIgdHlwZSBtdXN0IGJlIHVuaXF1ZS5cIik7XG4gICAgfVxuICB9XG4gIHNlcmlhbGl6ZShkYXRhLCBzZWdtZW50cyA9IFtdLCBtZXRhID0gW10sIG1hcHMgPSBbXSwgYmxvYnMgPSBbXSkge1xuICAgIGZvciAoY29uc3QgY3VzdG9tIG9mIHRoaXMuY3VzdG9tU2VyaWFsaXplcnMpIHtcbiAgICAgIGlmIChjdXN0b20uY29uZGl0aW9uKGRhdGEpKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VyaWFsaXplKGN1c3RvbS5zZXJpYWxpemUoZGF0YSksIHNlZ21lbnRzLCBtZXRhLCBtYXBzLCBibG9icyk7XG4gICAgICAgIG1ldGEucHVzaChbY3VzdG9tLnR5cGUsIC4uLnNlZ21lbnRzXSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgQmxvYikge1xuICAgICAgbWFwcy5wdXNoKHNlZ21lbnRzKTtcbiAgICAgIGJsb2JzLnB1c2goZGF0YSk7XG4gICAgICByZXR1cm4gW2RhdGEsIG1ldGEsIG1hcHMsIGJsb2JzXTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSBcImJpZ2ludFwiKSB7XG4gICAgICBtZXRhLnB1c2goW1NUQU5EQVJEX1JQQ19KU09OX1NFUklBTElaRVJfQlVJTFRfSU5fVFlQRVMuQklHSU5ULCAuLi5zZWdtZW50c10pO1xuICAgICAgcmV0dXJuIFtkYXRhLnRvU3RyaW5nKCksIG1ldGEsIG1hcHMsIGJsb2JzXTtcbiAgICB9XG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICBtZXRhLnB1c2goW1NUQU5EQVJEX1JQQ19KU09OX1NFUklBTElaRVJfQlVJTFRfSU5fVFlQRVMuREFURSwgLi4uc2VnbWVudHNdKTtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4oZGF0YS5nZXRUaW1lKCkpKSB7XG4gICAgICAgIHJldHVybiBbbnVsbCwgbWV0YSwgbWFwcywgYmxvYnNdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtkYXRhLnRvSVNPU3RyaW5nKCksIG1ldGEsIG1hcHMsIGJsb2JzXTtcbiAgICB9XG4gICAgaWYgKE51bWJlci5pc05hTihkYXRhKSkge1xuICAgICAgbWV0YS5wdXNoKFtTVEFOREFSRF9SUENfSlNPTl9TRVJJQUxJWkVSX0JVSUxUX0lOX1RZUEVTLk5BTiwgLi4uc2VnbWVudHNdKTtcbiAgICAgIHJldHVybiBbbnVsbCwgbWV0YSwgbWFwcywgYmxvYnNdO1xuICAgIH1cbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFVSTCkge1xuICAgICAgbWV0YS5wdXNoKFtTVEFOREFSRF9SUENfSlNPTl9TRVJJQUxJWkVSX0JVSUxUX0lOX1RZUEVTLlVSTCwgLi4uc2VnbWVudHNdKTtcbiAgICAgIHJldHVybiBbZGF0YS50b1N0cmluZygpLCBtZXRhLCBtYXBzLCBibG9ic107XG4gICAgfVxuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICBtZXRhLnB1c2goW1NUQU5EQVJEX1JQQ19KU09OX1NFUklBTElaRVJfQlVJTFRfSU5fVFlQRVMuUkVHRVhQLCAuLi5zZWdtZW50c10pO1xuICAgICAgcmV0dXJuIFtkYXRhLnRvU3RyaW5nKCksIG1ldGEsIG1hcHMsIGJsb2JzXTtcbiAgICB9XG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VyaWFsaXplKEFycmF5LmZyb20oZGF0YSksIHNlZ21lbnRzLCBtZXRhLCBtYXBzLCBibG9icyk7XG4gICAgICBtZXRhLnB1c2goW1NUQU5EQVJEX1JQQ19KU09OX1NFUklBTElaRVJfQlVJTFRfSU5fVFlQRVMuU0VULCAuLi5zZWdtZW50c10pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VyaWFsaXplKEFycmF5LmZyb20oZGF0YS5lbnRyaWVzKCkpLCBzZWdtZW50cywgbWV0YSwgbWFwcywgYmxvYnMpO1xuICAgICAgbWV0YS5wdXNoKFtTVEFOREFSRF9SUENfSlNPTl9TRVJJQUxJWkVSX0JVSUxUX0lOX1RZUEVTLk1BUCwgLi4uc2VnbWVudHNdKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICBjb25zdCBqc29uID0gZGF0YS5tYXAoKHYsIGkpID0+IHtcbiAgICAgICAgaWYgKHYgPT09IHZvaWQgMCkge1xuICAgICAgICAgIG1ldGEucHVzaChbU1RBTkRBUkRfUlBDX0pTT05fU0VSSUFMSVpFUl9CVUlMVF9JTl9UWVBFUy5VTkRFRklORUQsIC4uLnNlZ21lbnRzLCBpXSk7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplKHYsIFsuLi5zZWdtZW50cywgaV0sIG1ldGEsIG1hcHMsIGJsb2JzKVswXTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFtqc29uLCBtZXRhLCBtYXBzLCBibG9ic107XG4gICAgfVxuICAgIGlmIChpc09iamVjdChkYXRhKSkge1xuICAgICAgY29uc3QganNvbiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBrIGluIGRhdGEpIHtcbiAgICAgICAgaWYgKGsgPT09IFwidG9KU09OXCIgJiYgdHlwZW9mIGRhdGFba10gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGpzb25ba10gPSB0aGlzLnNlcmlhbGl6ZShkYXRhW2tdLCBbLi4uc2VnbWVudHMsIGtdLCBtZXRhLCBtYXBzLCBibG9icylbMF07XG4gICAgICB9XG4gICAgICByZXR1cm4gW2pzb24sIG1ldGEsIG1hcHMsIGJsb2JzXTtcbiAgICB9XG4gICAgcmV0dXJuIFtkYXRhLCBtZXRhLCBtYXBzLCBibG9ic107XG4gIH1cbiAgZGVzZXJpYWxpemUoanNvbiwgbWV0YSwgbWFwcywgZ2V0QmxvYikge1xuICAgIGNvbnN0IHJlZiA9IHsgZGF0YToganNvbiB9O1xuICAgIGlmIChtYXBzICYmIGdldEJsb2IpIHtcbiAgICAgIG1hcHMuZm9yRWFjaCgoc2VnbWVudHMsIGkpID0+IHtcbiAgICAgICAgbGV0IGN1cnJlbnRSZWYgPSByZWY7XG4gICAgICAgIGxldCBwcmVTZWdtZW50ID0gXCJkYXRhXCI7XG4gICAgICAgIHNlZ21lbnRzLmZvckVhY2goKHNlZ21lbnQpID0+IHtcbiAgICAgICAgICBjdXJyZW50UmVmID0gY3VycmVudFJlZltwcmVTZWdtZW50XTtcbiAgICAgICAgICBwcmVTZWdtZW50ID0gc2VnbWVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIGN1cnJlbnRSZWZbcHJlU2VnbWVudF0gPSBnZXRCbG9iKGkpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBtZXRhKSB7XG4gICAgICBjb25zdCB0eXBlID0gaXRlbVswXTtcbiAgICAgIGxldCBjdXJyZW50UmVmID0gcmVmO1xuICAgICAgbGV0IHByZVNlZ21lbnQgPSBcImRhdGFcIjtcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgaXRlbS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjdXJyZW50UmVmID0gY3VycmVudFJlZltwcmVTZWdtZW50XTtcbiAgICAgICAgcHJlU2VnbWVudCA9IGl0ZW1baV07XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGN1c3RvbSBvZiB0aGlzLmN1c3RvbVNlcmlhbGl6ZXJzKSB7XG4gICAgICAgIGlmIChjdXN0b20udHlwZSA9PT0gdHlwZSkge1xuICAgICAgICAgIGN1cnJlbnRSZWZbcHJlU2VnbWVudF0gPSBjdXN0b20uZGVzZXJpYWxpemUoY3VycmVudFJlZltwcmVTZWdtZW50XSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFNUQU5EQVJEX1JQQ19KU09OX1NFUklBTElaRVJfQlVJTFRfSU5fVFlQRVMuQklHSU5UOlxuICAgICAgICAgIGN1cnJlbnRSZWZbcHJlU2VnbWVudF0gPSBCaWdJbnQoY3VycmVudFJlZltwcmVTZWdtZW50XSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU1RBTkRBUkRfUlBDX0pTT05fU0VSSUFMSVpFUl9CVUlMVF9JTl9UWVBFUy5EQVRFOlxuICAgICAgICAgIGN1cnJlbnRSZWZbcHJlU2VnbWVudF0gPSBuZXcgRGF0ZShjdXJyZW50UmVmW3ByZVNlZ21lbnRdID8/IFwiSW52YWxpZCBEYXRlXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFNUQU5EQVJEX1JQQ19KU09OX1NFUklBTElaRVJfQlVJTFRfSU5fVFlQRVMuTkFOOlxuICAgICAgICAgIGN1cnJlbnRSZWZbcHJlU2VnbWVudF0gPSBOdW1iZXIuTmFOO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFNUQU5EQVJEX1JQQ19KU09OX1NFUklBTElaRVJfQlVJTFRfSU5fVFlQRVMuVU5ERUZJTkVEOlxuICAgICAgICAgIGN1cnJlbnRSZWZbcHJlU2VnbWVudF0gPSB2b2lkIDA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU1RBTkRBUkRfUlBDX0pTT05fU0VSSUFMSVpFUl9CVUlMVF9JTl9UWVBFUy5VUkw6XG4gICAgICAgICAgY3VycmVudFJlZltwcmVTZWdtZW50XSA9IG5ldyBVUkwoY3VycmVudFJlZltwcmVTZWdtZW50XSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU1RBTkRBUkRfUlBDX0pTT05fU0VSSUFMSVpFUl9CVUlMVF9JTl9UWVBFUy5SRUdFWFA6IHtcbiAgICAgICAgICBjb25zdCBbLCBwYXR0ZXJuLCBmbGFnc10gPSBjdXJyZW50UmVmW3ByZVNlZ21lbnRdLm1hdGNoKC9eXFwvKC4qKVxcLyhbYS16XSopJC8pO1xuICAgICAgICAgIGN1cnJlbnRSZWZbcHJlU2VnbWVudF0gPSBuZXcgUmVnRXhwKHBhdHRlcm4sIGZsYWdzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFNUQU5EQVJEX1JQQ19KU09OX1NFUklBTElaRVJfQlVJTFRfSU5fVFlQRVMuU0VUOlxuICAgICAgICAgIGN1cnJlbnRSZWZbcHJlU2VnbWVudF0gPSBuZXcgU2V0KGN1cnJlbnRSZWZbcHJlU2VnbWVudF0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFNUQU5EQVJEX1JQQ19KU09OX1NFUklBTElaRVJfQlVJTFRfSU5fVFlQRVMuTUFQOlxuICAgICAgICAgIGN1cnJlbnRSZWZbcHJlU2VnbWVudF0gPSBuZXcgTWFwKGN1cnJlbnRSZWZbcHJlU2VnbWVudF0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVmLmRhdGE7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9IdHRwUGF0aChwYXRoKSB7XG4gIHJldHVybiBgLyR7cGF0aC5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKFwiL1wiKX1gO1xufVxuZnVuY3Rpb24gdG9TdGFuZGFyZEhlYWRlcnMoaGVhZGVycykge1xuICBpZiAodHlwZW9mIGhlYWRlcnMuZm9yRWFjaCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIHRvU3RhbmRhcmRIZWFkZXJzJDEoaGVhZGVycyk7XG4gIH1cbiAgcmV0dXJuIGhlYWRlcnM7XG59XG5mdW5jdGlvbiBnZXRNYWxmb3JtZWRSZXNwb25zZUVycm9yQ29kZShzdGF0dXMpIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKENPTU1PTl9PUlBDX0VSUk9SX0RFRlMpLmZpbmQoKFssIGRlZl0pID0+IGRlZi5zdGF0dXMgPT09IHN0YXR1cyk/LlswXSA/PyBcIk1BTEZPUk1FRF9PUlBDX0VSUk9SX1JFU1BPTlNFXCI7XG59XG5cbmNsYXNzIFN0YW5kYXJkUlBDTGlua0NvZGVjIHtcbiAgY29uc3RydWN0b3Ioc2VyaWFsaXplciwgb3B0aW9ucykge1xuICAgIHRoaXMuc2VyaWFsaXplciA9IHNlcmlhbGl6ZXI7XG4gICAgdGhpcy5iYXNlVXJsID0gb3B0aW9ucy51cmw7XG4gICAgdGhpcy5tYXhVcmxMZW5ndGggPSBvcHRpb25zLm1heFVybExlbmd0aCA/PyAyMDgzO1xuICAgIHRoaXMuZmFsbGJhY2tNZXRob2QgPSBvcHRpb25zLmZhbGxiYWNrTWV0aG9kID8/IFwiUE9TVFwiO1xuICAgIHRoaXMuZXhwZWN0ZWRNZXRob2QgPSBvcHRpb25zLm1ldGhvZCA/PyB0aGlzLmZhbGxiYWNrTWV0aG9kO1xuICAgIHRoaXMuaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycyA/PyB7fTtcbiAgfVxuICBiYXNlVXJsO1xuICBtYXhVcmxMZW5ndGg7XG4gIGZhbGxiYWNrTWV0aG9kO1xuICBleHBlY3RlZE1ldGhvZDtcbiAgaGVhZGVycztcbiAgYXN5bmMgZW5jb2RlKHBhdGgsIGlucHV0LCBvcHRpb25zKSB7XG4gICAgbGV0IGhlYWRlcnMgPSB0b1N0YW5kYXJkSGVhZGVycyhhd2FpdCB2YWx1ZSh0aGlzLmhlYWRlcnMsIG9wdGlvbnMsIHBhdGgsIGlucHV0KSk7XG4gICAgaWYgKG9wdGlvbnMubGFzdEV2ZW50SWQgIT09IHZvaWQgMCkge1xuICAgICAgaGVhZGVycyA9IG1lcmdlU3RhbmRhcmRIZWFkZXJzKGhlYWRlcnMsIHsgXCJsYXN0LWV2ZW50LWlkXCI6IG9wdGlvbnMubGFzdEV2ZW50SWQgfSk7XG4gICAgfVxuICAgIGNvbnN0IGV4cGVjdGVkTWV0aG9kID0gYXdhaXQgdmFsdWUodGhpcy5leHBlY3RlZE1ldGhvZCwgb3B0aW9ucywgcGF0aCwgaW5wdXQpO1xuICAgIGNvbnN0IGJhc2VVcmwgPSBhd2FpdCB2YWx1ZSh0aGlzLmJhc2VVcmwsIG9wdGlvbnMsIHBhdGgsIGlucHV0KTtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGJhc2VVcmwpO1xuICAgIHVybC5wYXRobmFtZSA9IGAke3VybC5wYXRobmFtZS5yZXBsYWNlKC9cXC8kLywgXCJcIil9JHt0b0h0dHBQYXRoKHBhdGgpfWA7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUoaW5wdXQpO1xuICAgIGlmIChleHBlY3RlZE1ldGhvZCA9PT0gXCJHRVRcIiAmJiAhKHNlcmlhbGl6ZWQgaW5zdGFuY2VvZiBGb3JtRGF0YSkgJiYgIWlzQXN5bmNJdGVyYXRvck9iamVjdChzZXJpYWxpemVkKSkge1xuICAgICAgY29uc3QgbWF4VXJsTGVuZ3RoID0gYXdhaXQgdmFsdWUodGhpcy5tYXhVcmxMZW5ndGgsIG9wdGlvbnMsIHBhdGgsIGlucHV0KTtcbiAgICAgIGNvbnN0IGdldFVybCA9IG5ldyBVUkwodXJsKTtcbiAgICAgIGdldFVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwiZGF0YVwiLCBzdHJpbmdpZnlKU09OKHNlcmlhbGl6ZWQpKTtcbiAgICAgIGlmIChnZXRVcmwudG9TdHJpbmcoKS5sZW5ndGggPD0gbWF4VXJsTGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYm9keTogdm9pZCAwLFxuICAgICAgICAgIG1ldGhvZDogZXhwZWN0ZWRNZXRob2QsXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICB1cmw6IGdldFVybCxcbiAgICAgICAgICBzaWduYWw6IG9wdGlvbnMuc2lnbmFsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB1cmwsXG4gICAgICBtZXRob2Q6IGV4cGVjdGVkTWV0aG9kID09PSBcIkdFVFwiID8gdGhpcy5mYWxsYmFja01ldGhvZCA6IGV4cGVjdGVkTWV0aG9kLFxuICAgICAgaGVhZGVycyxcbiAgICAgIGJvZHk6IHNlcmlhbGl6ZWQsXG4gICAgICBzaWduYWw6IG9wdGlvbnMuc2lnbmFsXG4gICAgfTtcbiAgfVxuICBhc3luYyBkZWNvZGUocmVzcG9uc2UpIHtcbiAgICBjb25zdCBpc09rID0gIWlzT1JQQ0Vycm9yU3RhdHVzKHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgY29uc3QgZGVzZXJpYWxpemVkID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBpc0JvZHlPayA9IGZhbHNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3BvbnNlLmJvZHkoKTtcbiAgICAgICAgaXNCb2R5T2sgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGJvZHkpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFpc0JvZHlPaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBwYXJzZSByZXNwb25zZSBib2R5LCBwbGVhc2UgY2hlY2sgdGhlIHJlc3BvbnNlIGJvZHkgYW5kIGNvbnRlbnQtdHlwZS5cIiwge1xuICAgICAgICAgICAgY2F1c2U6IGVycm9yXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBSUEMgcmVzcG9uc2UgZm9ybWF0LlwiLCB7XG4gICAgICAgICAgY2F1c2U6IGVycm9yXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pKCk7XG4gICAgaWYgKCFpc09rKSB7XG4gICAgICBpZiAoaXNPUlBDRXJyb3JKc29uKGRlc2VyaWFsaXplZCkpIHtcbiAgICAgICAgdGhyb3cgY3JlYXRlT1JQQ0Vycm9yRnJvbUpzb24oZGVzZXJpYWxpemVkKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBPUlBDRXJyb3IoZ2V0TWFsZm9ybWVkUmVzcG9uc2VFcnJvckNvZGUocmVzcG9uc2Uuc3RhdHVzKSwge1xuICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgZGF0YTogeyAuLi5yZXNwb25zZSwgYm9keTogZGVzZXJpYWxpemVkIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZGVzZXJpYWxpemVkO1xuICB9XG59XG5cbmNsYXNzIFN0YW5kYXJkUlBDU2VyaWFsaXplciB7XG4gIGNvbnN0cnVjdG9yKGpzb25TZXJpYWxpemVyKSB7XG4gICAgdGhpcy5qc29uU2VyaWFsaXplciA9IGpzb25TZXJpYWxpemVyO1xuICB9XG4gIHNlcmlhbGl6ZShkYXRhKSB7XG4gICAgaWYgKGlzQXN5bmNJdGVyYXRvck9iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuIG1hcEV2ZW50SXRlcmF0b3IoZGF0YSwge1xuICAgICAgICB2YWx1ZTogYXN5bmMgKHZhbHVlKSA9PiB0aGlzLiNzZXJpYWxpemUodmFsdWUsIGZhbHNlKSxcbiAgICAgICAgZXJyb3I6IGFzeW5jIChlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBFcnJvckV2ZW50KHtcbiAgICAgICAgICAgIGRhdGE6IHRoaXMuI3NlcmlhbGl6ZSh0b09SUENFcnJvcihlKS50b0pTT04oKSwgZmFsc2UpLFxuICAgICAgICAgICAgY2F1c2U6IGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLiNzZXJpYWxpemUoZGF0YSwgdHJ1ZSk7XG4gIH1cbiAgI3NlcmlhbGl6ZShkYXRhLCBlbmFibGVGb3JtRGF0YSkge1xuICAgIGNvbnN0IFtqc29uLCBtZXRhXywgbWFwcywgYmxvYnNdID0gdGhpcy5qc29uU2VyaWFsaXplci5zZXJpYWxpemUoZGF0YSk7XG4gICAgY29uc3QgbWV0YSA9IG1ldGFfLmxlbmd0aCA9PT0gMCA/IHZvaWQgMCA6IG1ldGFfO1xuICAgIGlmICghZW5hYmxlRm9ybURhdGEgfHwgYmxvYnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBqc29uLFxuICAgICAgICBtZXRhXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgZm9ybS5zZXQoXCJkYXRhXCIsIHN0cmluZ2lmeUpTT04oeyBqc29uLCBtZXRhLCBtYXBzIH0pKTtcbiAgICBibG9icy5mb3JFYWNoKChibG9iLCBpKSA9PiB7XG4gICAgICBmb3JtLnNldChpLnRvU3RyaW5nKCksIGJsb2IpO1xuICAgIH0pO1xuICAgIHJldHVybiBmb3JtO1xuICB9XG4gIGRlc2VyaWFsaXplKGRhdGEpIHtcbiAgICBpZiAoaXNBc3luY0l0ZXJhdG9yT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm4gbWFwRXZlbnRJdGVyYXRvcihkYXRhLCB7XG4gICAgICAgIHZhbHVlOiBhc3luYyAodmFsdWUpID0+IHRoaXMuI2Rlc2VyaWFsaXplKHZhbHVlKSxcbiAgICAgICAgZXJyb3I6IGFzeW5jIChlKSA9PiB7XG4gICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIEVycm9yRXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZGVzZXJpYWxpemVkID0gdGhpcy4jZGVzZXJpYWxpemUoZS5kYXRhKTtcbiAgICAgICAgICBpZiAoaXNPUlBDRXJyb3JKc29uKGRlc2VyaWFsaXplZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVPUlBDRXJyb3JGcm9tSnNvbihkZXNlcmlhbGl6ZWQsIHsgY2F1c2U6IGUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgRXJyb3JFdmVudCh7XG4gICAgICAgICAgICBkYXRhOiBkZXNlcmlhbGl6ZWQsXG4gICAgICAgICAgICBjYXVzZTogZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuI2Rlc2VyaWFsaXplKGRhdGEpO1xuICB9XG4gICNkZXNlcmlhbGl6ZShkYXRhKSB7XG4gICAgaWYgKGRhdGEgPT09IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9XG4gICAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIEZvcm1EYXRhKSkge1xuICAgICAgcmV0dXJuIHRoaXMuanNvblNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGF0YS5qc29uLCBkYXRhLm1ldGEgPz8gW10pO1xuICAgIH1cbiAgICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5wYXJzZShkYXRhLmdldChcImRhdGFcIikpO1xuICAgIHJldHVybiB0aGlzLmpzb25TZXJpYWxpemVyLmRlc2VyaWFsaXplKFxuICAgICAgc2VyaWFsaXplZC5qc29uLFxuICAgICAgc2VyaWFsaXplZC5tZXRhID8/IFtdLFxuICAgICAgc2VyaWFsaXplZC5tYXBzLFxuICAgICAgKGkpID0+IGRhdGEuZ2V0KGkudG9TdHJpbmcoKSlcbiAgICApO1xuICB9XG59XG5cbmNsYXNzIFN0YW5kYXJkUlBDTGluayBleHRlbmRzIFN0YW5kYXJkTGluayB7XG4gIGNvbnN0cnVjdG9yKGxpbmtDbGllbnQsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBqc29uU2VyaWFsaXplciA9IG5ldyBTdGFuZGFyZFJQQ0pzb25TZXJpYWxpemVyKG9wdGlvbnMpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgU3RhbmRhcmRSUENTZXJpYWxpemVyKGpzb25TZXJpYWxpemVyKTtcbiAgICBjb25zdCBsaW5rQ29kZWMgPSBuZXcgU3RhbmRhcmRSUENMaW5rQ29kZWMoc2VyaWFsaXplciwgb3B0aW9ucyk7XG4gICAgc3VwZXIobGlua0NvZGVjLCBsaW5rQ2xpZW50LCBvcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgeyBDb21wb3NpdGVTdGFuZGFyZExpbmtQbHVnaW4gYXMgQywgU3RhbmRhcmRMaW5rIGFzIFMsIFNUQU5EQVJEX1JQQ19KU09OX1NFUklBTElaRVJfQlVJTFRfSU5fVFlQRVMgYXMgYSwgU3RhbmRhcmRSUENKc29uU2VyaWFsaXplciBhcyBiLCBTdGFuZGFyZFJQQ0xpbmsgYXMgYywgU3RhbmRhcmRSUENMaW5rQ29kZWMgYXMgZCwgU3RhbmRhcmRSUENTZXJpYWxpemVyIGFzIGUsIHRvU3RhbmRhcmRIZWFkZXJzIGFzIGYsIGdldE1hbGZvcm1lZFJlc3BvbnNlRXJyb3JDb2RlIGFzIGcsIHRvSHR0cFBhdGggYXMgdCB9O1xuIiwiaW1wb3J0IHsgdG9TdGFuZGFyZEhlYWRlcnMsIHRvSHR0cFBhdGgsIGdldE1hbGZvcm1lZFJlc3BvbnNlRXJyb3JDb2RlLCBTdGFuZGFyZExpbmsgfSBmcm9tICdAb3JwYy9jbGllbnQvc3RhbmRhcmQnO1xuaW1wb3J0IHsgUyBhcyBTdGFuZGFyZEJyYWNrZXROb3RhdGlvblNlcmlhbGl6ZXIgfSBmcm9tICcuL29wZW5hcGktY2xpZW50LnQ5ZkNBZTN4Lm1qcyc7XG5pbXBvcnQgeyBpc09iamVjdCwgdmFsdWUsIGdldCwgaXNBc3luY0l0ZXJhdG9yT2JqZWN0IH0gZnJvbSAnQG9ycGMvc2hhcmVkJztcbmltcG9ydCB7IGlzT1JQQ0Vycm9yU3RhdHVzLCBpc09SUENFcnJvckpzb24sIGNyZWF0ZU9SUENFcnJvckZyb21Kc29uLCBtYXBFdmVudEl0ZXJhdG9yLCB0b09SUENFcnJvciB9IGZyb20gJ0BvcnBjL2NsaWVudCc7XG5pbXBvcnQgeyBpc0NvbnRyYWN0UHJvY2VkdXJlLCBmYWxsYmFja0NvbnRyYWN0Q29uZmlnLCBPUlBDRXJyb3IgfSBmcm9tICdAb3JwYy9jb250cmFjdCc7XG5pbXBvcnQgeyBtZXJnZVN0YW5kYXJkSGVhZGVycywgRXJyb3JFdmVudCB9IGZyb20gJ0BvcnBjL3N0YW5kYXJkLXNlcnZlcic7XG5cbmNsYXNzIFN0YW5kYXJkT3BlbkFQSUpzb25TZXJpYWxpemVyIHtcbiAgY3VzdG9tU2VyaWFsaXplcnM7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuY3VzdG9tU2VyaWFsaXplcnMgPSBvcHRpb25zLmN1c3RvbUpzb25TZXJpYWxpemVycyA/PyBbXTtcbiAgfVxuICBzZXJpYWxpemUoZGF0YSwgaGFzQmxvYlJlZiA9IHsgdmFsdWU6IGZhbHNlIH0pIHtcbiAgICBmb3IgKGNvbnN0IGN1c3RvbSBvZiB0aGlzLmN1c3RvbVNlcmlhbGl6ZXJzKSB7XG4gICAgICBpZiAoY3VzdG9tLmNvbmRpdGlvbihkYXRhKSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlcmlhbGl6ZShjdXN0b20uc2VyaWFsaXplKGRhdGEpLCBoYXNCbG9iUmVmKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgICBoYXNCbG9iUmVmLnZhbHVlID0gdHJ1ZTtcbiAgICAgIHJldHVybiBbZGF0YSwgaGFzQmxvYlJlZi52YWx1ZV07XG4gICAgfVxuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemUoQXJyYXkuZnJvbShkYXRhKSwgaGFzQmxvYlJlZik7XG4gICAgfVxuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemUoQXJyYXkuZnJvbShkYXRhLmVudHJpZXMoKSksIGhhc0Jsb2JSZWYpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgY29uc3QganNvbiA9IGRhdGEubWFwKCh2KSA9PiB2ID09PSB2b2lkIDAgPyBudWxsIDogdGhpcy5zZXJpYWxpemUodiwgaGFzQmxvYlJlZilbMF0pO1xuICAgICAgcmV0dXJuIFtqc29uLCBoYXNCbG9iUmVmLnZhbHVlXTtcbiAgICB9XG4gICAgaWYgKGlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICBjb25zdCBqc29uID0ge307XG4gICAgICBmb3IgKGNvbnN0IGsgaW4gZGF0YSkge1xuICAgICAgICBpZiAoayA9PT0gXCJ0b0pTT05cIiAmJiB0eXBlb2YgZGF0YVtrXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAganNvbltrXSA9IHRoaXMuc2VyaWFsaXplKGRhdGFba10sIGhhc0Jsb2JSZWYpWzBdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtqc29uLCBoYXNCbG9iUmVmLnZhbHVlXTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSBcImJpZ2ludFwiIHx8IGRhdGEgaW5zdGFuY2VvZiBSZWdFeHAgfHwgZGF0YSBpbnN0YW5jZW9mIFVSTCkge1xuICAgICAgcmV0dXJuIFtkYXRhLnRvU3RyaW5nKCksIGhhc0Jsb2JSZWYudmFsdWVdO1xuICAgIH1cbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIHJldHVybiBbTnVtYmVyLmlzTmFOKGRhdGEuZ2V0VGltZSgpKSA/IG51bGwgOiBkYXRhLnRvSVNPU3RyaW5nKCksIGhhc0Jsb2JSZWYudmFsdWVdO1xuICAgIH1cbiAgICBpZiAoTnVtYmVyLmlzTmFOKGRhdGEpKSB7XG4gICAgICByZXR1cm4gW251bGwsIGhhc0Jsb2JSZWYudmFsdWVdO1xuICAgIH1cbiAgICByZXR1cm4gW2RhdGEsIGhhc0Jsb2JSZWYudmFsdWVdO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0YW5kYXJkaXplSFRUUFBhdGgocGF0aCkge1xuICByZXR1cm4gYC8ke3BhdGgucmVwbGFjZSgvXFwvezIsfS9nLCBcIi9cIikucmVwbGFjZSgvXlxcL3xcXC8kL2csIFwiXCIpfWA7XG59XG5mdW5jdGlvbiBnZXREeW5hbWljUGFyYW1zKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGggPyBzdGFuZGFyZGl6ZUhUVFBQYXRoKHBhdGgpLm1hdGNoKC9cXC9cXHtbXn1dK1xcfS9nKT8ubWFwKCh2KSA9PiAoe1xuICAgIHJhdzogdixcbiAgICBuYW1lOiB2Lm1hdGNoKC9cXHtcXCs/KFtefV0rKVxcfS8pWzFdXG4gIH0pKSA6IHZvaWQgMDtcbn1cblxuY2xhc3MgU3RhbmRhcmRPcGVuYXBpTGlua0NvZGVjIHtcbiAgY29uc3RydWN0b3IoY29udHJhY3QsIHNlcmlhbGl6ZXIsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmNvbnRyYWN0ID0gY29udHJhY3Q7XG4gICAgdGhpcy5zZXJpYWxpemVyID0gc2VyaWFsaXplcjtcbiAgICB0aGlzLmJhc2VVcmwgPSBvcHRpb25zLnVybDtcbiAgICB0aGlzLmhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgPz8ge307XG4gICAgdGhpcy5jdXN0b21FcnJvclJlc3BvbnNlQm9keURlY29kZXIgPSBvcHRpb25zLmN1c3RvbUVycm9yUmVzcG9uc2VCb2R5RGVjb2RlcjtcbiAgfVxuICBiYXNlVXJsO1xuICBoZWFkZXJzO1xuICBjdXN0b21FcnJvclJlc3BvbnNlQm9keURlY29kZXI7XG4gIGFzeW5jIGVuY29kZShwYXRoLCBpbnB1dCwgb3B0aW9ucykge1xuICAgIGxldCBoZWFkZXJzID0gdG9TdGFuZGFyZEhlYWRlcnMoYXdhaXQgdmFsdWUodGhpcy5oZWFkZXJzLCBvcHRpb25zLCBwYXRoLCBpbnB1dCkpO1xuICAgIGlmIChvcHRpb25zLmxhc3RFdmVudElkICE9PSB2b2lkIDApIHtcbiAgICAgIGhlYWRlcnMgPSBtZXJnZVN0YW5kYXJkSGVhZGVycyhoZWFkZXJzLCB7IFwibGFzdC1ldmVudC1pZFwiOiBvcHRpb25zLmxhc3RFdmVudElkIH0pO1xuICAgIH1cbiAgICBjb25zdCBiYXNlVXJsID0gYXdhaXQgdmFsdWUodGhpcy5iYXNlVXJsLCBvcHRpb25zLCBwYXRoLCBpbnB1dCk7XG4gICAgY29uc3QgcHJvY2VkdXJlID0gZ2V0KHRoaXMuY29udHJhY3QsIHBhdGgpO1xuICAgIGlmICghaXNDb250cmFjdFByb2NlZHVyZShwcm9jZWR1cmUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtTdGFuZGFyZE9wZW5hcGlMaW5rQ29kZWNdIGV4cGVjdCBhIGNvbnRyYWN0IHByb2NlZHVyZSBhdCAke3BhdGguam9pbihcIi5cIil9YCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0U3RydWN0dXJlID0gZmFsbGJhY2tDb250cmFjdENvbmZpZyhcImRlZmF1bHRJbnB1dFN0cnVjdHVyZVwiLCBwcm9jZWR1cmVbXCJ+b3JwY1wiXS5yb3V0ZS5pbnB1dFN0cnVjdHVyZSk7XG4gICAgcmV0dXJuIGlucHV0U3RydWN0dXJlID09PSBcImNvbXBhY3RcIiA/IHRoaXMuI2VuY29kZUNvbXBhY3QocHJvY2VkdXJlLCBwYXRoLCBpbnB1dCwgb3B0aW9ucywgYmFzZVVybCwgaGVhZGVycykgOiB0aGlzLiNlbmNvZGVEZXRhaWxlZChwcm9jZWR1cmUsIHBhdGgsIGlucHV0LCBvcHRpb25zLCBiYXNlVXJsLCBoZWFkZXJzKTtcbiAgfVxuICAjZW5jb2RlQ29tcGFjdChwcm9jZWR1cmUsIHBhdGgsIGlucHV0LCBvcHRpb25zLCBiYXNlVXJsLCBoZWFkZXJzKSB7XG4gICAgbGV0IGh0dHBQYXRoID0gc3RhbmRhcmRpemVIVFRQUGF0aChwcm9jZWR1cmVbXCJ+b3JwY1wiXS5yb3V0ZS5wYXRoID8/IHRvSHR0cFBhdGgocGF0aCkpO1xuICAgIGxldCBodHRwQm9keSA9IGlucHV0O1xuICAgIGNvbnN0IGR5bmFtaWNQYXJhbXMgPSBnZXREeW5hbWljUGFyYW1zKGh0dHBQYXRoKTtcbiAgICBpZiAoZHluYW1pY1BhcmFtcz8ubGVuZ3RoKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KGlucHV0KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBbU3RhbmRhcmRPcGVuYXBpTGlua0NvZGVjXSBJbnZhbGlkIGlucHV0IHNoYXBlIGZvciBcImNvbXBhY3RcIiBzdHJ1Y3R1cmUgd2hlbiBoYXMgZHluYW1pYyBwYXJhbXMgYXQgJHtwYXRoLmpvaW4oXCIuXCIpfS5gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJvZHkgPSB7IC4uLmlucHV0IH07XG4gICAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIGR5bmFtaWNQYXJhbXMpIHtcbiAgICAgICAgY29uc3QgdmFsdWUyID0gaW5wdXRbcGFyYW0ubmFtZV07XG4gICAgICAgIGh0dHBQYXRoID0gaHR0cFBhdGgucmVwbGFjZShwYXJhbS5yYXcsIGAvJHtlbmNvZGVVUklDb21wb25lbnQoYCR7dGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZSh2YWx1ZTIpfWApfWApO1xuICAgICAgICBkZWxldGUgYm9keVtwYXJhbS5uYW1lXTtcbiAgICAgIH1cbiAgICAgIGh0dHBCb2R5ID0gT2JqZWN0LmtleXMoYm9keSkubGVuZ3RoID8gYm9keSA6IHZvaWQgMDtcbiAgICB9XG4gICAgY29uc3QgbWV0aG9kID0gZmFsbGJhY2tDb250cmFjdENvbmZpZyhcImRlZmF1bHRNZXRob2RcIiwgcHJvY2VkdXJlW1wifm9ycGNcIl0ucm91dGUubWV0aG9kKTtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGJhc2VVcmwpO1xuICAgIHVybC5wYXRobmFtZSA9IGAke3VybC5wYXRobmFtZS5yZXBsYWNlKC9cXC8kLywgXCJcIil9JHtodHRwUGF0aH1gO1xuICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGh0dHBCb2R5LCB7IG91dHB1dEZvcm1hdDogXCJVUkxTZWFyY2hQYXJhbXNcIiB9KTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWUyXSBvZiBzZXJpYWxpemVkKSB7XG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgdmFsdWUyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVybCxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBib2R5OiB2b2lkIDAsXG4gICAgICAgIHNpZ25hbDogb3B0aW9ucy5zaWduYWxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB1cmwsXG4gICAgICBtZXRob2QsXG4gICAgICBoZWFkZXJzLFxuICAgICAgYm9keTogdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZShodHRwQm9keSksXG4gICAgICBzaWduYWw6IG9wdGlvbnMuc2lnbmFsXG4gICAgfTtcbiAgfVxuICAjZW5jb2RlRGV0YWlsZWQocHJvY2VkdXJlLCBwYXRoLCBpbnB1dCwgb3B0aW9ucywgYmFzZVVybCwgaGVhZGVycykge1xuICAgIGxldCBodHRwUGF0aCA9IHN0YW5kYXJkaXplSFRUUFBhdGgocHJvY2VkdXJlW1wifm9ycGNcIl0ucm91dGUucGF0aCA/PyB0b0h0dHBQYXRoKHBhdGgpKTtcbiAgICBjb25zdCBkeW5hbWljUGFyYW1zID0gZ2V0RHluYW1pY1BhcmFtcyhodHRwUGF0aCk7XG4gICAgaWYgKCFpc09iamVjdChpbnB1dCkgJiYgaW5wdXQgIT09IHZvaWQgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgW1N0YW5kYXJkT3BlbmFwaUxpbmtDb2RlY10gSW52YWxpZCBpbnB1dCBzaGFwZSBmb3IgXCJkZXRhaWxlZFwiIHN0cnVjdHVyZSBhdCAke3BhdGguam9pbihcIi5cIil9LmApO1xuICAgIH1cbiAgICBpZiAoZHluYW1pY1BhcmFtcz8ubGVuZ3RoKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KGlucHV0Py5wYXJhbXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFtTdGFuZGFyZE9wZW5hcGlMaW5rQ29kZWNdIEludmFsaWQgaW5wdXQucGFyYW1zIHNoYXBlIGZvciBcImRldGFpbGVkXCIgc3RydWN0dXJlIHdoZW4gaGFzIGR5bmFtaWMgcGFyYW1zIGF0ICR7cGF0aC5qb2luKFwiLlwiKX0uYCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIGR5bmFtaWNQYXJhbXMpIHtcbiAgICAgICAgY29uc3QgdmFsdWUyID0gaW5wdXQucGFyYW1zW3BhcmFtLm5hbWVdO1xuICAgICAgICBodHRwUGF0aCA9IGh0dHBQYXRoLnJlcGxhY2UocGFyYW0ucmF3LCBgLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGAke3RoaXMuc2VyaWFsaXplci5zZXJpYWxpemUodmFsdWUyKX1gKX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IG1lcmdlZEhlYWRlcnMgPSBoZWFkZXJzO1xuICAgIGlmIChpbnB1dD8uaGVhZGVycyAhPT0gdm9pZCAwKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KGlucHV0LmhlYWRlcnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFtTdGFuZGFyZE9wZW5hcGlMaW5rQ29kZWNdIEludmFsaWQgaW5wdXQuaGVhZGVycyBzaGFwZSBmb3IgXCJkZXRhaWxlZFwiIHN0cnVjdHVyZSBhdCAke3BhdGguam9pbihcIi5cIil9LmApO1xuICAgICAgfVxuICAgICAgbWVyZ2VkSGVhZGVycyA9IG1lcmdlU3RhbmRhcmRIZWFkZXJzKGlucHV0LmhlYWRlcnMsIGhlYWRlcnMpO1xuICAgIH1cbiAgICBjb25zdCBtZXRob2QgPSBmYWxsYmFja0NvbnRyYWN0Q29uZmlnKFwiZGVmYXVsdE1ldGhvZFwiLCBwcm9jZWR1cmVbXCJ+b3JwY1wiXS5yb3V0ZS5tZXRob2QpO1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoYmFzZVVybCk7XG4gICAgdXJsLnBhdGhuYW1lID0gYCR7dXJsLnBhdGhuYW1lLnJlcGxhY2UoL1xcLyQvLCBcIlwiKX0ke2h0dHBQYXRofWA7XG4gICAgaWYgKGlucHV0Py5xdWVyeSAhPT0gdm9pZCAwKSB7XG4gICAgICBjb25zdCBxdWVyeSA9IHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUoaW5wdXQucXVlcnksIHsgb3V0cHV0Rm9ybWF0OiBcIlVSTFNlYXJjaFBhcmFtc1wiIH0pO1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZTJdIG9mIHF1ZXJ5KSB7XG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgdmFsdWUyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXJsLFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIGhlYWRlcnM6IG1lcmdlZEhlYWRlcnMsXG4gICAgICAgIGJvZHk6IHZvaWQgMCxcbiAgICAgICAgc2lnbmFsOiBvcHRpb25zLnNpZ25hbFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHVybCxcbiAgICAgIG1ldGhvZCxcbiAgICAgIGhlYWRlcnM6IG1lcmdlZEhlYWRlcnMsXG4gICAgICBib2R5OiB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGlucHV0Py5ib2R5KSxcbiAgICAgIHNpZ25hbDogb3B0aW9ucy5zaWduYWxcbiAgICB9O1xuICB9XG4gIGFzeW5jIGRlY29kZShyZXNwb25zZSwgX29wdGlvbnMsIHBhdGgpIHtcbiAgICBjb25zdCBpc09rID0gIWlzT1JQQ0Vycm9yU3RhdHVzKHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgY29uc3QgZGVzZXJpYWxpemVkID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBpc0JvZHlPayA9IGZhbHNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3BvbnNlLmJvZHkoKTtcbiAgICAgICAgaXNCb2R5T2sgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGJvZHkpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFpc0JvZHlPaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBwYXJzZSByZXNwb25zZSBib2R5LCBwbGVhc2UgY2hlY2sgdGhlIHJlc3BvbnNlIGJvZHkgYW5kIGNvbnRlbnQtdHlwZS5cIiwge1xuICAgICAgICAgICAgY2F1c2U6IGVycm9yXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBPcGVuQVBJIHJlc3BvbnNlIGZvcm1hdC5cIiwge1xuICAgICAgICAgIGNhdXNlOiBlcnJvclxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIGlmICghaXNPaykge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmN1c3RvbUVycm9yUmVzcG9uc2VCb2R5RGVjb2Rlcj8uKGRlc2VyaWFsaXplZCwgcmVzcG9uc2UpO1xuICAgICAgaWYgKGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDApIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoaXNPUlBDRXJyb3JKc29uKGRlc2VyaWFsaXplZCkpIHtcbiAgICAgICAgdGhyb3cgY3JlYXRlT1JQQ0Vycm9yRnJvbUpzb24oZGVzZXJpYWxpemVkKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBPUlBDRXJyb3IoZ2V0TWFsZm9ybWVkUmVzcG9uc2VFcnJvckNvZGUocmVzcG9uc2Uuc3RhdHVzKSwge1xuICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgZGF0YTogeyAuLi5yZXNwb25zZSwgYm9keTogZGVzZXJpYWxpemVkIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBwcm9jZWR1cmUgPSBnZXQodGhpcy5jb250cmFjdCwgcGF0aCk7XG4gICAgaWYgKCFpc0NvbnRyYWN0UHJvY2VkdXJlKHByb2NlZHVyZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1N0YW5kYXJkT3BlbmFwaUxpbmtDb2RlY10gZXhwZWN0IGEgY29udHJhY3QgcHJvY2VkdXJlIGF0ICR7cGF0aC5qb2luKFwiLlwiKX1gKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0U3RydWN0dXJlID0gZmFsbGJhY2tDb250cmFjdENvbmZpZyhcImRlZmF1bHRPdXRwdXRTdHJ1Y3R1cmVcIiwgcHJvY2VkdXJlW1wifm9ycGNcIl0ucm91dGUub3V0cHV0U3RydWN0dXJlKTtcbiAgICBpZiAob3V0cHV0U3RydWN0dXJlID09PSBcImNvbXBhY3RcIikge1xuICAgICAgcmV0dXJuIGRlc2VyaWFsaXplZDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgaGVhZGVyczogcmVzcG9uc2UuaGVhZGVycyxcbiAgICAgIGJvZHk6IGRlc2VyaWFsaXplZFxuICAgIH07XG4gIH1cbn1cblxuY2xhc3MgU3RhbmRhcmRPcGVuQVBJU2VyaWFsaXplciB7XG4gIGNvbnN0cnVjdG9yKGpzb25TZXJpYWxpemVyLCBicmFja2V0Tm90YXRpb24pIHtcbiAgICB0aGlzLmpzb25TZXJpYWxpemVyID0ganNvblNlcmlhbGl6ZXI7XG4gICAgdGhpcy5icmFja2V0Tm90YXRpb24gPSBicmFja2V0Tm90YXRpb247XG4gIH1cbiAgc2VyaWFsaXplKGRhdGEsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmIChpc0FzeW5jSXRlcmF0b3JPYmplY3QoZGF0YSkgJiYgIW9wdGlvbnMub3V0cHV0Rm9ybWF0KSB7XG4gICAgICByZXR1cm4gbWFwRXZlbnRJdGVyYXRvcihkYXRhLCB7XG4gICAgICAgIHZhbHVlOiBhc3luYyAodmFsdWUpID0+IHRoaXMuI3NlcmlhbGl6ZSh2YWx1ZSwgeyBvdXRwdXRGb3JtYXQ6IFwicGxhaW5cIiB9KSxcbiAgICAgICAgZXJyb3I6IGFzeW5jIChlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBFcnJvckV2ZW50KHtcbiAgICAgICAgICAgIGRhdGE6IHRoaXMuI3NlcmlhbGl6ZSh0b09SUENFcnJvcihlKS50b0pTT04oKSwgeyBvdXRwdXRGb3JtYXQ6IFwicGxhaW5cIiB9KSxcbiAgICAgICAgICAgIGNhdXNlOiBlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy4jc2VyaWFsaXplKGRhdGEsIG9wdGlvbnMpO1xuICB9XG4gICNzZXJpYWxpemUoZGF0YSwgb3B0aW9ucykge1xuICAgIGNvbnN0IFtqc29uLCBoYXNCbG9iXSA9IHRoaXMuanNvblNlcmlhbGl6ZXIuc2VyaWFsaXplKGRhdGEpO1xuICAgIGlmIChvcHRpb25zLm91dHB1dEZvcm1hdCA9PT0gXCJwbGFpblwiKSB7XG4gICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMub3V0cHV0Rm9ybWF0ID09PSBcIlVSTFNlYXJjaFBhcmFtc1wiKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgICBmb3IgKGNvbnN0IFtwYXRoLCB2YWx1ZV0gb2YgdGhpcy5icmFja2V0Tm90YXRpb24uc2VyaWFsaXplKGpzb24pKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICBwYXJhbXMuYXBwZW5kKHBhdGgsIHZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cbiAgICBpZiAoanNvbiBpbnN0YW5jZW9mIEJsb2IgfHwganNvbiA9PT0gdm9pZCAwIHx8ICFoYXNCbG9iKSB7XG4gICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gICAgY29uc3QgZm9ybSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIGZvciAoY29uc3QgW3BhdGgsIHZhbHVlXSBvZiB0aGlzLmJyYWNrZXROb3RhdGlvbi5zZXJpYWxpemUoanNvbikpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgZm9ybS5hcHBlbmQocGF0aCwgdmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQmxvYikge1xuICAgICAgICBmb3JtLmFwcGVuZChwYXRoLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3JtO1xuICB9XG4gIGRlc2VyaWFsaXplKGRhdGEpIHtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcyB8fCBkYXRhIGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICAgIHJldHVybiB0aGlzLmJyYWNrZXROb3RhdGlvbi5kZXNlcmlhbGl6ZShBcnJheS5mcm9tKGRhdGEuZW50cmllcygpKSk7XG4gICAgfVxuICAgIGlmIChpc0FzeW5jSXRlcmF0b3JPYmplY3QoZGF0YSkpIHtcbiAgICAgIHJldHVybiBtYXBFdmVudEl0ZXJhdG9yKGRhdGEsIHtcbiAgICAgICAgdmFsdWU6IGFzeW5jICh2YWx1ZSkgPT4gdmFsdWUsXG4gICAgICAgIGVycm9yOiBhc3luYyAoZSkgPT4ge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3JFdmVudCAmJiBpc09SUENFcnJvckpzb24oZS5kYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZU9SUENFcnJvckZyb21Kc29uKGUuZGF0YSwgeyBjYXVzZTogZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxufVxuXG5jbGFzcyBTdGFuZGFyZE9wZW5BUElMaW5rIGV4dGVuZHMgU3RhbmRhcmRMaW5rIHtcbiAgY29uc3RydWN0b3IoY29udHJhY3QsIGxpbmtDbGllbnQsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBqc29uU2VyaWFsaXplciA9IG5ldyBTdGFuZGFyZE9wZW5BUElKc29uU2VyaWFsaXplcihvcHRpb25zKTtcbiAgICBjb25zdCBicmFja2V0Tm90YXRpb25TZXJpYWxpemVyID0gbmV3IFN0YW5kYXJkQnJhY2tldE5vdGF0aW9uU2VyaWFsaXplcih7IG1heEJyYWNrZXROb3RhdGlvbkFycmF5SW5kZXg6IDQyOTQ5NjcyOTQgfSk7XG4gICAgY29uc3Qgc2VyaWFsaXplciA9IG5ldyBTdGFuZGFyZE9wZW5BUElTZXJpYWxpemVyKGpzb25TZXJpYWxpemVyLCBicmFja2V0Tm90YXRpb25TZXJpYWxpemVyKTtcbiAgICBjb25zdCBsaW5rQ29kZWMgPSBuZXcgU3RhbmRhcmRPcGVuYXBpTGlua0NvZGVjKGNvbnRyYWN0LCBzZXJpYWxpemVyLCBvcHRpb25zKTtcbiAgICBzdXBlcihsaW5rQ29kZWMsIGxpbmtDbGllbnQsIG9wdGlvbnMpO1xuICB9XG59XG5cbmV4cG9ydCB7IFN0YW5kYXJkT3BlbkFQSUpzb25TZXJpYWxpemVyIGFzIFMsIFN0YW5kYXJkT3BlbkFQSUxpbmsgYXMgYSwgU3RhbmRhcmRPcGVuYXBpTGlua0NvZGVjIGFzIGIsIFN0YW5kYXJkT3BlbkFQSVNlcmlhbGl6ZXIgYXMgYywgZ2V0RHluYW1pY1BhcmFtcyBhcyBnLCBzdGFuZGFyZGl6ZUhUVFBQYXRoIGFzIHMgfTtcbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMCwxLDIsMyw0LDVdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsU0FBUyw0QkFBNEIsTUFBTTtBQUN6QyxRQUFPLEtBQUssTUFBTSxFQUFFOztBQUd0QixTQUFTLFFBQVEsU0FBTztBQUN0QixRQUFPLE1BQU0sUUFBUUEsUUFBTSxHQUFHQSxVQUFRQSxZQUFVLEtBQUssS0FBS0EsWUFBVSxPQUFPLEVBQUUsR0FBRyxDQUFDQSxRQUFNOztBQWV6RixNQUFNLDJCQUEyQjtBQUNqQyxNQUFNLDhCQUE4QjtBQVNwQyxTQUFTLEtBQUssSUFBSTtDQUNoQixJQUFJO0FBQ0osY0FBYTtBQUNYLE1BQUksT0FDRixRQUFPLE9BQU87RUFFaEIsTUFBTSxTQUFTLElBQUk7QUFDbkIsV0FBUyxFQUFFLFFBQVE7QUFDbkIsU0FBTzs7O0FBR1gsU0FBUyxXQUFXLElBQUk7Q0FDdEIsSUFBSSx1QkFBdUIsUUFBUSxTQUFTO0FBQzVDLFNBQVEsR0FBRyxTQUFTO0FBQ2xCLFNBQU8s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
583
+ export { value as _, toHttpPath as a, fallbackORPCErrorStatus as c, findDeepMatches as d, isObject as f, tryDecodeURIComponent as g, toArray as h, standardizeHTTPPath as i, isORPCErrorStatus as l, stringifyJSON as m, StandardOpenAPISerializer as n, StandardBracketNotationSerializer as o, once as p, getDynamicParams as r, fallbackORPCErrorMessage as s, StandardOpenAPIJsonSerializer as t, clone as u };
584
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbmRhcmQtQ1lhUmF5ODkubWpzIiwibmFtZXMiOlsidmFsdWUiLCIjY2xlYW51cCIsIiNuZXh0IiwiI2lzRG9uZSIsIiNpc0V4ZWN1dGVDb21wbGV0ZSIsIk9SUENFcnJvciIsInZhbHVlIiwidmFsdWUiLCIjc2VyaWFsaXplIiwidmFsdWUiXSwic291cmNlcyI6WyIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmJ1bi9Ab3JwYytzaGFyZWRAMS4xMC40L25vZGVfbW9kdWxlcy9Ab3JwYy9zaGFyZWQvZGlzdC9pbmRleC5tanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmJ1bi9Ab3JwYytzdGFuZGFyZC1zZXJ2ZXJAMS4xMC40L25vZGVfbW9kdWxlcy9Ab3JwYy9zdGFuZGFyZC1zZXJ2ZXIvZGlzdC9pbmRleC5tanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmJ1bi9Ab3JwYytjbGllbnRAMS4xMC40L25vZGVfbW9kdWxlcy9Ab3JwYy9jbGllbnQvZGlzdC9zaGFyZWQvY2xpZW50LkRta01kX0dCLm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYnVuL0BvcnBjK29wZW5hcGktY2xpZW50QDEuMTAuNC9ub2RlX21vZHVsZXMvQG9ycGMvb3BlbmFwaS1jbGllbnQvZGlzdC9zaGFyZWQvb3BlbmFwaS1jbGllbnQudDlmQ0FlM3gubWpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5idW4vQG9ycGMrY2xpZW50QDEuMTAuNC9ub2RlX21vZHVsZXMvQG9ycGMvY2xpZW50L2Rpc3Qvc2hhcmVkL2NsaWVudC5EaTY1TVd4di5tanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmJ1bi9Ab3JwYytvcGVuYXBpLWNsaWVudEAxLjEwLjQvbm9kZV9tb2R1bGVzL0BvcnBjL29wZW5hcGktY2xpZW50L2Rpc3Qvc2hhcmVkL29wZW5hcGktY2xpZW50LkIyUTlxVTVtLm1qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBncm91cCwgZ3VhcmQsIG1hcEVudHJpZXMsIG1hcFZhbHVlcywgb21pdCwgcmV0cnksIHNsZWVwIH0gZnJvbSAncmFkYXNoJztcblxuZnVuY3Rpb24gcmVzb2x2ZU1heWJlT3B0aW9uYWxPcHRpb25zKHJlc3QpIHtcbiAgcmV0dXJuIHJlc3RbMF0gPz8ge307XG59XG5cbmZ1bmN0aW9uIHRvQXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiB2YWx1ZSA9PT0gdm9pZCAwIHx8IHZhbHVlID09PSBudWxsID8gW10gOiBbdmFsdWVdO1xufVxuZnVuY3Rpb24gc3BsaXRJbkhhbGYoYXJyKSB7XG4gIGNvbnN0IGhhbGYgPSBNYXRoLmNlaWwoYXJyLmxlbmd0aCAvIDIpO1xuICByZXR1cm4gW2Fyci5zbGljZSgwLCBoYWxmKSwgYXJyLnNsaWNlKGhhbGYpXTtcbn1cblxuZnVuY3Rpb24gcmVhZEFzQnVmZmVyKHNvdXJjZSkge1xuICBpZiAodHlwZW9mIHNvdXJjZS5ieXRlcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIHNvdXJjZS5ieXRlcygpO1xuICB9XG4gIHJldHVybiBzb3VyY2UuYXJyYXlCdWZmZXIoKTtcbn1cblxuY29uc3QgT1JQQ19OQU1FID0gXCJvcnBjXCI7XG5jb25zdCBPUlBDX1NIQVJFRF9QQUNLQUdFX05BTUUgPSBcIkBvcnBjL3NoYXJlZFwiO1xuY29uc3QgT1JQQ19TSEFSRURfUEFDS0FHRV9WRVJTSU9OID0gXCIxLjEwLjRcIjtcblxuY2xhc3MgQWJvcnRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoLi4ucmVzdCkge1xuICAgIHN1cGVyKC4uLnJlc3QpO1xuICAgIHRoaXMubmFtZSA9IFwiQWJvcnRFcnJvclwiO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9uY2UoZm4pIHtcbiAgbGV0IGNhY2hlZDtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gZm4oKTtcbiAgICBjYWNoZWQgPSB7IHJlc3VsdCB9O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5mdW5jdGlvbiBzZXF1ZW50aWFsKGZuKSB7XG4gIGxldCBsYXN0T3BlcmF0aW9uUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICByZXR1cm4gKC4uLmFyZ3MpID0+IHtcbiAgICByZXR1cm4gbGFzdE9wZXJhdGlvblByb21pc2UgPSBsYXN0T3BlcmF0aW9uUHJvbWlzZS5jYXRjaCgoKSA9PiB7XG4gICAgfSkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gZm4oLi4uYXJncyk7XG4gICAgfSk7XG4gIH07XG59XG5mdW5jdGlvbiBkZWZlcihjYWxsYmFjaykge1xuICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHNldFRpbWVvdXQoY2FsbGJhY2ssIDApO1xuICB9IGVsc2Uge1xuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGNhbGxiYWNrKSkpO1xuICB9XG59XG5cbmNvbnN0IFNQQU5fRVJST1JfU1RBVFVTID0gMjtcbmNvbnN0IEdMT0JBTF9PVEVMX0NPTkZJR19LRVkgPSBgX18ke09SUENfU0hBUkVEX1BBQ0tBR0VfTkFNRX1AJHtPUlBDX1NIQVJFRF9QQUNLQUdFX1ZFUlNJT059L290ZWwvY29uZmlnX19gO1xuZnVuY3Rpb24gc2V0R2xvYmFsT3RlbENvbmZpZyhjb25maWcpIHtcbiAgZ2xvYmFsVGhpc1tHTE9CQUxfT1RFTF9DT05GSUdfS0VZXSA9IGNvbmZpZztcbn1cbmZ1bmN0aW9uIGdldEdsb2JhbE90ZWxDb25maWcoKSB7XG4gIHJldHVybiBnbG9iYWxUaGlzW0dMT0JBTF9PVEVMX0NPTkZJR19LRVldO1xufVxuZnVuY3Rpb24gc3RhcnRTcGFuKG5hbWUsIG9wdGlvbnMgPSB7fSwgY29udGV4dCkge1xuICBjb25zdCB0cmFjZXIgPSBnZXRHbG9iYWxPdGVsQ29uZmlnKCk/LnRyYWNlcjtcbiAgcmV0dXJuIHRyYWNlcj8uc3RhcnRTcGFuKG5hbWUsIG9wdGlvbnMsIGNvbnRleHQpO1xufVxuZnVuY3Rpb24gc2V0U3BhbkVycm9yKHNwYW4sIGVycm9yLCBvcHRpb25zID0ge30pIHtcbiAgaWYgKCFzcGFuKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGV4Y2VwdGlvbiA9IHRvT3RlbEV4Y2VwdGlvbihlcnJvcik7XG4gIHNwYW4ucmVjb3JkRXhjZXB0aW9uKGV4Y2VwdGlvbik7XG4gIGlmICghb3B0aW9ucy5zaWduYWw/LmFib3J0ZWQgfHwgb3B0aW9ucy5zaWduYWwucmVhc29uICE9PSBlcnJvcikge1xuICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgIGNvZGU6IFNQQU5fRVJST1JfU1RBVFVTLFxuICAgICAgbWVzc2FnZTogZXhjZXB0aW9uLm1lc3NhZ2VcbiAgICB9KTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0U3BhbkF0dHJpYnV0ZShzcGFuLCBrZXksIHZhbHVlKSB7XG4gIGlmICghc3BhbiB8fCB2YWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNwYW4uc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpO1xufVxuZnVuY3Rpb24gdG9PdGVsRXhjZXB0aW9uKGVycm9yKSB7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgY29uc3QgZXhjZXB0aW9uID0ge1xuICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICAgIG5hbWU6IGVycm9yLm5hbWUsXG4gICAgICBzdGFjazogZXJyb3Iuc3RhY2tcbiAgICB9O1xuICAgIGlmIChcImNvZGVcIiBpbiBlcnJvciAmJiAodHlwZW9mIGVycm9yLmNvZGUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGVycm9yLmNvZGUgPT09IFwibnVtYmVyXCIpKSB7XG4gICAgICBleGNlcHRpb24uY29kZSA9IGVycm9yLmNvZGU7XG4gICAgfVxuICAgIHJldHVybiBleGNlcHRpb247XG4gIH1cbiAgcmV0dXJuIHsgbWVzc2FnZTogU3RyaW5nKGVycm9yKSB9O1xufVxuZnVuY3Rpb24gdG9TcGFuQXR0cmlidXRlVmFsdWUoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuIFwidW5kZWZpbmVkXCI7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSwgKF8sIHZhbHVlKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImJpZ2ludFwiKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwIHx8IHZhbHVlIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFN0cmluZyhkYXRhKTtcbiAgfVxufVxuYXN5bmMgZnVuY3Rpb24gcnVuV2l0aFNwYW4oeyBuYW1lLCBjb250ZXh0LCAuLi5vcHRpb25zIH0sIGZuKSB7XG4gIGNvbnN0IHRyYWNlciA9IGdldEdsb2JhbE90ZWxDb25maWcoKT8udHJhY2VyO1xuICBpZiAoIXRyYWNlcikge1xuICAgIHJldHVybiBmbigpO1xuICB9XG4gIGNvbnN0IGNhbGxiYWNrID0gYXN5bmMgKHNwYW4pID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZuKHNwYW4pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNldFNwYW5FcnJvcihzcGFuLCBlLCBvcHRpb25zKTtcbiAgICAgIHRocm93IGU7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNwYW4uZW5kKCk7XG4gICAgfVxuICB9O1xuICBpZiAoY29udGV4dCkge1xuICAgIHJldHVybiB0cmFjZXIuc3RhcnRBY3RpdmVTcGFuKG5hbWUsIG9wdGlvbnMsIGNvbnRleHQsIGNhbGxiYWNrKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdHJhY2VyLnN0YXJ0QWN0aXZlU3BhbihuYW1lLCBvcHRpb25zLCBjYWxsYmFjayk7XG4gIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIHJ1bkluU3BhbkNvbnRleHQoc3BhbiwgZm4pIHtcbiAgY29uc3Qgb3RlbENvbmZpZyA9IGdldEdsb2JhbE90ZWxDb25maWcoKTtcbiAgaWYgKCFzcGFuIHx8ICFvdGVsQ29uZmlnKSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH1cbiAgY29uc3QgY3R4ID0gb3RlbENvbmZpZy50cmFjZS5zZXRTcGFuKG90ZWxDb25maWcuY29udGV4dC5hY3RpdmUoKSwgc3Bhbik7XG4gIHJldHVybiBvdGVsQ29uZmlnLmNvbnRleHQud2l0aChjdHgsIGZuKTtcbn1cblxuY2xhc3MgQXN5bmNJZFF1ZXVlIHtcbiAgb3BlbklkcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIHF1ZXVlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIHdhaXRlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLm9wZW5JZHMuc2l6ZTtcbiAgfVxuICBnZXQgd2FpdGVySWRzKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMud2FpdGVycy5rZXlzKCkpO1xuICB9XG4gIGhhc0J1ZmZlcmVkSXRlbXMoaWQpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLnF1ZXVlcy5nZXQoaWQpPy5sZW5ndGgpO1xuICB9XG4gIG9wZW4oaWQpIHtcbiAgICB0aGlzLm9wZW5JZHMuYWRkKGlkKTtcbiAgfVxuICBpc09wZW4oaWQpIHtcbiAgICByZXR1cm4gdGhpcy5vcGVuSWRzLmhhcyhpZCk7XG4gIH1cbiAgcHVzaChpZCwgaXRlbSkge1xuICAgIHRoaXMuYXNzZXJ0T3BlbihpZCk7XG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMud2FpdGVycy5nZXQoaWQpO1xuICAgIGlmIChwZW5kaW5nPy5sZW5ndGgpIHtcbiAgICAgIHBlbmRpbmcuc2hpZnQoKVswXShpdGVtKTtcbiAgICAgIGlmIChwZW5kaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLndhaXRlcnMuZGVsZXRlKGlkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLnF1ZXVlcy5nZXQoaWQpO1xuICAgICAgaWYgKGl0ZW1zKSB7XG4gICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnF1ZXVlcy5zZXQoaWQsIFtpdGVtXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGFzeW5jIHB1bGwoaWQpIHtcbiAgICB0aGlzLmFzc2VydE9wZW4oaWQpO1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5xdWV1ZXMuZ2V0KGlkKTtcbiAgICBpZiAoaXRlbXM/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zLnNoaWZ0KCk7XG4gICAgICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMucXVldWVzLmRlbGV0ZShpZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHdhaXRpbmdQdWxscyA9IHRoaXMud2FpdGVycy5nZXQoaWQpO1xuICAgICAgY29uc3QgcGVuZGluZyA9IFtyZXNvbHZlLCByZWplY3RdO1xuICAgICAgaWYgKHdhaXRpbmdQdWxscykge1xuICAgICAgICB3YWl0aW5nUHVsbHMucHVzaChwZW5kaW5nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMud2FpdGVycy5zZXQoaWQsIFtwZW5kaW5nXSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgY2xvc2UoeyBpZCwgcmVhc29uIH0gPSB7fSkge1xuICAgIGlmIChpZCA9PT0gdm9pZCAwKSB7XG4gICAgICB0aGlzLndhaXRlcnMuZm9yRWFjaCgocGVuZGluZ1B1bGxzLCBpZDIpID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3IyID0gcmVhc29uID8/IG5ldyBBYm9ydEVycm9yKGBbQXN5bmNJZFF1ZXVlXSBRdWV1ZVske2lkMn1dIHdhcyBjbG9zZWQgb3IgYWJvcnRlZCB3aGlsZSB3YWl0aW5nIGZvciBwdWxsaW5nLmApO1xuICAgICAgICBwZW5kaW5nUHVsbHMuZm9yRWFjaCgoWywgcmVqZWN0XSkgPT4gcmVqZWN0KGVycm9yMikpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLndhaXRlcnMuY2xlYXIoKTtcbiAgICAgIHRoaXMub3Blbklkcy5jbGVhcigpO1xuICAgICAgdGhpcy5xdWV1ZXMuY2xlYXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXJyb3IgPSByZWFzb24gPz8gbmV3IEFib3J0RXJyb3IoYFtBc3luY0lkUXVldWVdIFF1ZXVlWyR7aWR9XSB3YXMgY2xvc2VkIG9yIGFib3J0ZWQgd2hpbGUgd2FpdGluZyBmb3IgcHVsbGluZy5gKTtcbiAgICB0aGlzLndhaXRlcnMuZ2V0KGlkKT8uZm9yRWFjaCgoWywgcmVqZWN0XSkgPT4gcmVqZWN0KGVycm9yKSk7XG4gICAgdGhpcy53YWl0ZXJzLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5vcGVuSWRzLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5xdWV1ZXMuZGVsZXRlKGlkKTtcbiAgfVxuICBhc3NlcnRPcGVuKGlkKSB7XG4gICAgaWYgKCF0aGlzLmlzT3BlbihpZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW0FzeW5jSWRRdWV1ZV0gQ2Fubm90IGFjY2VzcyBxdWV1ZVske2lkfV0gYmVjYXVzZSBpdCBpcyBub3Qgb3BlbiBvciBhYm9ydGVkLmApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc0FzeW5jSXRlcmF0b3JPYmplY3QobWF5YmUpIHtcbiAgaWYgKCFtYXliZSB8fCB0eXBlb2YgbWF5YmUgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIFwibmV4dFwiIGluIG1heWJlICYmIHR5cGVvZiBtYXliZS5uZXh0ID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLmFzeW5jSXRlcmF0b3IgaW4gbWF5YmUgJiYgdHlwZW9mIG1heWJlW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9PT0gXCJmdW5jdGlvblwiO1xufVxuY29uc3QgZmFsbGJhY2tBc3luY0Rpc3Bvc2VTeW1ib2wgPSBTeW1ib2wuZm9yKFwiYXN5bmNEaXNwb3NlXCIpO1xuY29uc3QgYXN5bmNEaXNwb3NlU3ltYm9sID0gU3ltYm9sLmFzeW5jRGlzcG9zZSA/PyBmYWxsYmFja0FzeW5jRGlzcG9zZVN5bWJvbDtcbmNsYXNzIEFzeW5jSXRlcmF0b3JDbGFzcyB7XG4gICNpc0RvbmUgPSBmYWxzZTtcbiAgI2lzRXhlY3V0ZUNvbXBsZXRlID0gZmFsc2U7XG4gICNjbGVhbnVwO1xuICAjbmV4dDtcbiAgY29uc3RydWN0b3IobmV4dCwgY2xlYW51cCkge1xuICAgIHRoaXMuI2NsZWFudXAgPSBjbGVhbnVwO1xuICAgIHRoaXMuI25leHQgPSBzZXF1ZW50aWFsKGFzeW5jICgpID0+IHtcbiAgICAgIGlmICh0aGlzLiNpc0RvbmUpIHtcbiAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHZvaWQgMCB9O1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbmV4dCgpO1xuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICB0aGlzLiNpc0RvbmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy4jaXNEb25lID0gdHJ1ZTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHRoaXMuI2lzRG9uZSAmJiAhdGhpcy4jaXNFeGVjdXRlQ29tcGxldGUpIHtcbiAgICAgICAgICB0aGlzLiNpc0V4ZWN1dGVDb21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgYXdhaXQgdGhpcy4jY2xlYW51cChcIm5leHRcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBuZXh0KCkge1xuICAgIHJldHVybiB0aGlzLiNuZXh0KCk7XG4gIH1cbiAgYXN5bmMgcmV0dXJuKHZhbHVlKSB7XG4gICAgdGhpcy4jaXNEb25lID0gdHJ1ZTtcbiAgICBpZiAoIXRoaXMuI2lzRXhlY3V0ZUNvbXBsZXRlKSB7XG4gICAgICB0aGlzLiNpc0V4ZWN1dGVDb21wbGV0ZSA9IHRydWU7XG4gICAgICBhd2FpdCB0aGlzLiNjbGVhbnVwKFwicmV0dXJuXCIpO1xuICAgIH1cbiAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZSB9O1xuICB9XG4gIGFzeW5jIHRocm93KGVycikge1xuICAgIHRoaXMuI2lzRG9uZSA9IHRydWU7XG4gICAgaWYgKCF0aGlzLiNpc0V4ZWN1dGVDb21wbGV0ZSkge1xuICAgICAgdGhpcy4jaXNFeGVjdXRlQ29tcGxldGUgPSB0cnVlO1xuICAgICAgYXdhaXQgdGhpcy4jY2xlYW51cChcInRocm93XCIpO1xuICAgIH1cbiAgICB0aHJvdyBlcnI7XG4gIH1cbiAgLyoqXG4gICAqIGFzeW5jRGlzcG9zZSBzeW1ib2wgb25seSBhdmFpbGFibGUgaW4gZXNuZXh0LCB3ZSBzaG91bGQgZmFsbGJhY2sgdG8gU3ltYm9sLmZvcignYXN5bmNEaXNwb3NlJylcbiAgICovXG4gIGFzeW5jIFthc3luY0Rpc3Bvc2VTeW1ib2xdKCkge1xuICAgIHRoaXMuI2lzRG9uZSA9IHRydWU7XG4gICAgaWYgKCF0aGlzLiNpc0V4ZWN1dGVDb21wbGV0ZSkge1xuICAgICAgdGhpcy4jaXNFeGVjdXRlQ29tcGxldGUgPSB0cnVlO1xuICAgICAgYXdhaXQgdGhpcy4jY2xlYW51cChcImRpc3Bvc2VcIik7XG4gICAgfVxuICB9XG4gIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlcGxpY2F0ZUFzeW5jSXRlcmF0b3Ioc291cmNlLCBjb3VudCkge1xuICBjb25zdCBxdWV1ZSA9IG5ldyBBc3luY0lkUXVldWUoKTtcbiAgY29uc3QgaWRzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogY291bnQgfSwgKF8sIGkpID0+IGkudG9TdHJpbmcoKSk7XG4gIGxldCBpc1NvdXJjZUZpbmlzaGVkID0gZmFsc2U7XG4gIGNvbnN0IHN0YXJ0ID0gb25jZShhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBhd2FpdCBzb3VyY2UubmV4dCgpO1xuICAgICAgICBpZHMuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgICBpZiAocXVldWUuaXNPcGVuKGlkKSkge1xuICAgICAgICAgICAgcXVldWUucHVzaChpZCwgeyBuZXh0OiBpdGVtIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpdGVtLmRvbmUpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZHMuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgaWYgKHF1ZXVlLmlzT3BlbihpZCkpIHtcbiAgICAgICAgICBxdWV1ZS5wdXNoKGlkLCB7IGVycm9yIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaXNTb3VyY2VGaW5pc2hlZCA9IHRydWU7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgcmVwbGljYXRlZCA9IGlkcy5tYXAoKGlkKSA9PiB7XG4gICAgcXVldWUub3BlbihpZCk7XG4gICAgcmV0dXJuIG5ldyBBc3luY0l0ZXJhdG9yQ2xhc3MoXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIHN0YXJ0KCk7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBhd2FpdCBxdWV1ZS5wdWxsKGlkKTtcbiAgICAgICAgaWYgKGl0ZW0ubmV4dCkge1xuICAgICAgICAgIHJldHVybiBpdGVtLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgaXRlbS5lcnJvcjtcbiAgICAgIH0sXG4gICAgICBhc3luYyAocmVhc29uKSA9PiB7XG4gICAgICAgIHF1ZXVlLmNsb3NlKHsgaWQgfSk7XG4gICAgICAgIGlmIChyZWFzb24gIT09IFwibmV4dFwiICYmICFxdWV1ZS5sZW5ndGggJiYgIWlzU291cmNlRmluaXNoZWQpIHtcbiAgICAgICAgICBpc1NvdXJjZUZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICBhd2FpdCBzb3VyY2U/LnJldHVybj8uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9KTtcbiAgcmV0dXJuIHJlcGxpY2F0ZWQ7XG59XG5mdW5jdGlvbiBhc3luY0l0ZXJhdG9yV2l0aFNwYW4oeyBuYW1lLCAuLi5vcHRpb25zIH0sIGl0ZXJhdG9yKSB7XG4gIGxldCBzcGFuO1xuICByZXR1cm4gbmV3IEFzeW5jSXRlcmF0b3JDbGFzcyhcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICBzcGFuID8/PSBzdGFydFNwYW4obmFtZSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW5JblNwYW5Db250ZXh0KHNwYW4sICgpID0+IGl0ZXJhdG9yLm5leHQoKSk7XG4gICAgICAgIHNwYW4/LmFkZEV2ZW50KHJlc3VsdC5kb25lID8gXCJjb21wbGV0ZWRcIiA6IFwieWllbGRlZFwiKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzZXRTcGFuRXJyb3Ioc3BhbiwgZXJyLCBvcHRpb25zKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgKHJlYXNvbikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHJlYXNvbiAhPT0gXCJuZXh0XCIpIHtcbiAgICAgICAgICBhd2FpdCBydW5JblNwYW5Db250ZXh0KHNwYW4sICgpID0+IGl0ZXJhdG9yLnJldHVybj8uKCkpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgc2V0U3BhbkVycm9yKHNwYW4sIGVyciwgb3B0aW9ucyk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNwYW4/LmVuZCgpO1xuICAgICAgfVxuICAgIH1cbiAgKTtcbn1cblxuY2xhc3MgRXZlbnRQdWJsaXNoZXIge1xuICAjbGlzdGVuZXJzTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgI21heEJ1ZmZlcmVkRXZlbnRzO1xuICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcbiAgICB0aGlzLiNtYXhCdWZmZXJlZEV2ZW50cyA9IG9wdGlvbnMubWF4QnVmZmVyZWRFdmVudHMgPz8gMTAwO1xuICB9XG4gIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLiNsaXN0ZW5lcnNNYXAuc2l6ZTtcbiAgfVxuICAvKipcbiAgICogRW1pdHMgYW4gZXZlbnQgYW5kIGRlbGl2ZXJzIHRoZSBwYXlsb2FkIHRvIGFsbCBzdWJzY3JpYmVkIGxpc3RlbmVycy5cbiAgICovXG4gIHB1Ymxpc2goZXZlbnQsIHBheWxvYWQpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLiNsaXN0ZW5lcnNNYXAuZ2V0KGV2ZW50KTtcbiAgICBpZiAoIWxpc3RlbmVycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIGxpc3RlbmVycykge1xuICAgICAgbGlzdGVuZXIocGF5bG9hZCk7XG4gICAgfVxuICB9XG4gIHN1YnNjcmliZShldmVudCwgbGlzdGVuZXJPck9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIGxpc3RlbmVyT3JPcHRpb25zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGxldCBsaXN0ZW5lcnMgPSB0aGlzLiNsaXN0ZW5lcnNNYXAuZ2V0KGV2ZW50KTtcbiAgICAgIGlmICghbGlzdGVuZXJzKSB7XG4gICAgICAgIHRoaXMuI2xpc3RlbmVyc01hcC5zZXQoZXZlbnQsIGxpc3RlbmVycyA9IFtdKTtcbiAgICAgIH1cbiAgICAgIGxpc3RlbmVycy5wdXNoKGxpc3RlbmVyT3JPcHRpb25zKTtcbiAgICAgIHJldHVybiBvbmNlKCgpID0+IHtcbiAgICAgICAgbGlzdGVuZXJzLnNwbGljZShsaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lck9yT3B0aW9ucyksIDEpO1xuICAgICAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuI2xpc3RlbmVyc01hcC5kZWxldGUoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3Qgc2lnbmFsID0gbGlzdGVuZXJPck9wdGlvbnM/LnNpZ25hbDtcbiAgICBjb25zdCBtYXhCdWZmZXJlZEV2ZW50cyA9IGxpc3RlbmVyT3JPcHRpb25zPy5tYXhCdWZmZXJlZEV2ZW50cyA/PyB0aGlzLiNtYXhCdWZmZXJlZEV2ZW50cztcbiAgICBzaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgY29uc3QgYnVmZmVyZWRFdmVudHMgPSBbXTtcbiAgICBjb25zdCBwdWxsUmVzb2x2ZXJzID0gW107XG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSB0aGlzLnN1YnNjcmliZShldmVudCwgKHBheWxvYWQpID0+IHtcbiAgICAgIGNvbnN0IHJlc29sdmVyID0gcHVsbFJlc29sdmVycy5zaGlmdCgpO1xuICAgICAgaWYgKHJlc29sdmVyKSB7XG4gICAgICAgIHJlc29sdmVyWzBdKHsgZG9uZTogZmFsc2UsIHZhbHVlOiBwYXlsb2FkIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnVmZmVyZWRFdmVudHMucHVzaChwYXlsb2FkKTtcbiAgICAgICAgaWYgKGJ1ZmZlcmVkRXZlbnRzLmxlbmd0aCA+IG1heEJ1ZmZlcmVkRXZlbnRzKSB7XG4gICAgICAgICAgYnVmZmVyZWRFdmVudHMuc2hpZnQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGFib3J0TGlzdGVuZXIgPSAoZXZlbnQyKSA9PiB7XG4gICAgICB1bnN1YnNjcmliZSgpO1xuICAgICAgcHVsbFJlc29sdmVycy5mb3JFYWNoKChyZXNvbHZlcikgPT4gcmVzb2x2ZXJbMV0oZXZlbnQyLnRhcmdldC5yZWFzb24pKTtcbiAgICAgIHB1bGxSZXNvbHZlcnMubGVuZ3RoID0gMDtcbiAgICAgIGJ1ZmZlcmVkRXZlbnRzLmxlbmd0aCA9IDA7XG4gICAgfTtcbiAgICBzaWduYWw/LmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydExpc3RlbmVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgcmV0dXJuIG5ldyBBc3luY0l0ZXJhdG9yQ2xhc3MoYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKHNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgICB0aHJvdyBzaWduYWwucmVhc29uO1xuICAgICAgfVxuICAgICAgaWYgKGJ1ZmZlcmVkRXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBidWZmZXJlZEV2ZW50cy5zaGlmdCgpIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBwdWxsUmVzb2x2ZXJzLnB1c2goW3Jlc29sdmUsIHJlamVjdF0pO1xuICAgICAgfSk7XG4gICAgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgIHNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGFib3J0TGlzdGVuZXIpO1xuICAgICAgcHVsbFJlc29sdmVycy5mb3JFYWNoKChyZXNvbHZlcikgPT4gcmVzb2x2ZXJbMF0oeyBkb25lOiB0cnVlLCB2YWx1ZTogdm9pZCAwIH0pKTtcbiAgICAgIHB1bGxSZXNvbHZlcnMubGVuZ3RoID0gMDtcbiAgICAgIGJ1ZmZlcmVkRXZlbnRzLmxlbmd0aCA9IDA7XG4gICAgfSk7XG4gIH1cbn1cblxuY2xhc3MgU2VxdWVudGlhbElkR2VuZXJhdG9yIHtcbiAgaW5kZXggPSBCaWdJbnQoMSk7XG4gIGdlbmVyYXRlKCkge1xuICAgIGNvbnN0IGlkID0gdGhpcy5pbmRleC50b1N0cmluZygzNik7XG4gICAgdGhpcy5pbmRleCsrO1xuICAgIHJldHVybiBpZDtcbiAgfVxufVxuZnVuY3Rpb24gY29tcGFyZVNlcXVlbnRpYWxJZHMoYSwgYikge1xuICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGEubGVuZ3RoIC0gYi5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwO1xufVxuXG5mdW5jdGlvbiBvblN0YXJ0KGNhbGxiYWNrKSB7XG4gIHJldHVybiBhc3luYyAob3B0aW9ucywgLi4ucmVzdCkgPT4ge1xuICAgIGF3YWl0IGNhbGxiYWNrKG9wdGlvbnMsIC4uLnJlc3QpO1xuICAgIHJldHVybiBhd2FpdCBvcHRpb25zLm5leHQoKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIG9uU3VjY2VzcyhjYWxsYmFjaykge1xuICByZXR1cm4gYXN5bmMgKG9wdGlvbnMsIC4uLnJlc3QpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvcHRpb25zLm5leHQoKTtcbiAgICBhd2FpdCBjYWxsYmFjayhyZXN1bHQsIG9wdGlvbnMsIC4uLnJlc3QpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5mdW5jdGlvbiBvbkVycm9yKGNhbGxiYWNrKSB7XG4gIHJldHVybiBhc3luYyAob3B0aW9ucywgLi4ucmVzdCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgb3B0aW9ucy5uZXh0KCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGNhbGxiYWNrKGVycm9yLCBvcHRpb25zLCAuLi5yZXN0KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIG9uRmluaXNoKGNhbGxiYWNrKSB7XG4gIGxldCBzdGF0ZTtcbiAgcmV0dXJuIGFzeW5jIChvcHRpb25zLCAuLi5yZXN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9wdGlvbnMubmV4dCgpO1xuICAgICAgc3RhdGUgPSBbbnVsbCwgcmVzdWx0LCB0cnVlXTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHN0YXRlID0gW2Vycm9yLCB2b2lkIDAsIGZhbHNlXTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjYWxsYmFjayhzdGF0ZSwgb3B0aW9ucywgLi4ucmVzdCk7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gaW50ZXJjZXB0KGludGVyY2VwdG9ycywgb3B0aW9ucywgbWFpbikge1xuICBjb25zdCBuZXh0ID0gKG9wdGlvbnMyLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGludGVyY2VwdG9yID0gaW50ZXJjZXB0b3JzW2luZGV4XTtcbiAgICBpZiAoIWludGVyY2VwdG9yKSB7XG4gICAgICByZXR1cm4gbWFpbihvcHRpb25zMik7XG4gICAgfVxuICAgIHJldHVybiBpbnRlcmNlcHRvcih7XG4gICAgICAuLi5vcHRpb25zMixcbiAgICAgIG5leHQ6IChuZXdPcHRpb25zID0gb3B0aW9uczIpID0+IG5leHQobmV3T3B0aW9ucywgaW5kZXggKyAxKVxuICAgIH0pO1xuICB9O1xuICByZXR1cm4gbmV4dChvcHRpb25zLCAwKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VFbXB0eWFibGVKU09OKHRleHQpIHtcbiAgaWYgKCF0ZXh0KSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KTtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeUpTT04odmFsdWUpIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gZmluZERlZXBNYXRjaGVzKGNoZWNrLCBwYXlsb2FkLCBzZWdtZW50cyA9IFtdLCBtYXBzID0gW10sIHZhbHVlcyA9IFtdKSB7XG4gIGlmIChjaGVjayhwYXlsb2FkKSkge1xuICAgIG1hcHMucHVzaChzZWdtZW50cyk7XG4gICAgdmFsdWVzLnB1c2gocGF5bG9hZCk7XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShwYXlsb2FkKSkge1xuICAgIHBheWxvYWQuZm9yRWFjaCgodiwgaSkgPT4ge1xuICAgICAgZmluZERlZXBNYXRjaGVzKGNoZWNrLCB2LCBbLi4uc2VnbWVudHMsIGldLCBtYXBzLCB2YWx1ZXMpO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHBheWxvYWQpKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gcGF5bG9hZCkge1xuICAgICAgZmluZERlZXBNYXRjaGVzKGNoZWNrLCBwYXlsb2FkW2tleV0sIFsuLi5zZWdtZW50cywga2V5XSwgbWFwcywgdmFsdWVzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgbWFwcywgdmFsdWVzIH07XG59XG5mdW5jdGlvbiBnZXRDb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICBpZiAoIWlzVHlwZXNjcmlwdE9iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKT8uY29uc3RydWN0b3I7XG59XG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIHJldHVybiBwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCAhcHJvdG8gfHwgIXByb3RvLmNvbnN0cnVjdG9yO1xufVxuZnVuY3Rpb24gaXNUeXBlc2NyaXB0T2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpO1xufVxuZnVuY3Rpb24gY2xvbmUodmFsdWUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLm1hcChjbG9uZSk7XG4gIH1cbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlKSB7XG4gICAgICByZXN1bHRba2V5XSA9IGNsb25lKHZhbHVlW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGdldChvYmplY3QsIHBhdGgpIHtcbiAgbGV0IGN1cnJlbnQgPSBvYmplY3Q7XG4gIGZvciAoY29uc3Qga2V5IG9mIHBhdGgpIHtcbiAgICBpZiAoIWlzVHlwZXNjcmlwdE9iamVjdChjdXJyZW50KSkge1xuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgfVxuICByZXR1cm4gY3VycmVudDtcbn1cbmZ1bmN0aW9uIGlzUHJvcGVydHlLZXkodmFsdWUpIHtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuIHR5cGUgPT09IFwic3RyaW5nXCIgfHwgdHlwZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlID09PSBcInN5bWJvbFwiO1xufVxuY29uc3QgTnVsbFByb3RvT2JqID0gLyogQF9fUFVSRV9fICovICgoKSA9PiB7XG4gIGNvbnN0IGUgPSBmdW5jdGlvbigpIHtcbiAgfTtcbiAgZS5wcm90b3R5cGUgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgT2JqZWN0LmZyZWV6ZShlLnByb3RvdHlwZSk7XG4gIHJldHVybiBlO1xufSkoKTtcblxuZnVuY3Rpb24gdmFsdWUodmFsdWUyLCAuLi5hcmdzKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdmFsdWUyKC4uLmFyZ3MpO1xuICB9XG4gIHJldHVybiB2YWx1ZTI7XG59XG5mdW5jdGlvbiBmYWxsYmFjayh2YWx1ZTIsIGZhbGxiYWNrMikge1xuICByZXR1cm4gdmFsdWUyID09PSB2b2lkIDAgPyBmYWxsYmFjazIgOiB2YWx1ZTI7XG59XG5cbmZ1bmN0aW9uIHByZXZlbnROYXRpdmVBd2FpdCh0YXJnZXQpIHtcbiAgcmV0dXJuIG5ldyBQcm94eSh0YXJnZXQsIHtcbiAgICBnZXQodGFyZ2V0MiwgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IFJlZmxlY3QuZ2V0KHRhcmdldDIsIHByb3AsIHJlY2VpdmVyKTtcbiAgICAgIGlmIChwcm9wICE9PSBcInRoZW5cIiB8fCB0eXBlb2YgdmFsdWUyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlMjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUHJveHkodmFsdWUyLCB7XG4gICAgICAgIGFwcGx5KHRhcmdldEZuLCB0aGlzQXJnLCBhcmdzKSB7XG4gICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAyIHx8IGFyZ3Muc29tZSgoYXJnKSA9PiAhaXNOYXRpdmVGdW5jdGlvbihhcmcpKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkodGFyZ2V0Rm4sIHRoaXNBcmcsIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgc2hvdWxkT21pdCA9IHRydWU7XG4gICAgICAgICAgYXJnc1swXS5jYWxsKHRoaXNBcmcsIHByZXZlbnROYXRpdmVBd2FpdChuZXcgUHJveHkodGFyZ2V0Miwge1xuICAgICAgICAgICAgZ2V0OiAodGFyZ2V0MywgcHJvcDIsIHJlY2VpdmVyMikgPT4ge1xuICAgICAgICAgICAgICBpZiAoc2hvdWxkT21pdCAmJiBwcm9wMiA9PT0gXCJ0aGVuXCIpIHtcbiAgICAgICAgICAgICAgICBzaG91bGRPbWl0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0MywgcHJvcDIsIHJlY2VpdmVyMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cbmNvbnN0IE5BVElWRV9GVU5DVElPTl9SRUdFWCA9IC9eXFxzKmZ1bmN0aW9uXFxzKlxcKFxcKVxccypcXHtcXHMqXFxbbmF0aXZlIGNvZGVcXF1cXHMqXFx9XFxzKiQvO1xuZnVuY3Rpb24gaXNOYXRpdmVGdW5jdGlvbihmbikge1xuICByZXR1cm4gdHlwZW9mIGZuID09PSBcImZ1bmN0aW9uXCIgJiYgTkFUSVZFX0ZVTkNUSU9OX1JFR0VYLnRlc3QoZm4udG9TdHJpbmcoKSk7XG59XG5mdW5jdGlvbiBvdmVybGF5UHJveHkodGFyZ2V0LCBwYXJ0aWFsKSB7XG4gIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHR5cGVvZiB0YXJnZXQgPT09IFwiZnVuY3Rpb25cIiA/IHBhcnRpYWwgOiB0YXJnZXQsIHtcbiAgICBnZXQoXywgcHJvcCkge1xuICAgICAgY29uc3QgdGFyZ2V0VmFsdWUgPSBwcm9wIGluIHBhcnRpYWwgPyBwYXJ0aWFsIDogdmFsdWUodGFyZ2V0KTtcbiAgICAgIGNvbnN0IHYgPSBSZWZsZWN0LmdldCh0YXJnZXRWYWx1ZSwgcHJvcCk7XG4gICAgICByZXR1cm4gdHlwZW9mIHYgPT09IFwiZnVuY3Rpb25cIiA/IHYuYmluZCh0YXJnZXRWYWx1ZSkgOiB2O1xuICAgIH0sXG4gICAgaGFzKF8sIHByb3ApIHtcbiAgICAgIHJldHVybiBSZWZsZWN0LmhhcyhwYXJ0aWFsLCBwcm9wKSB8fCBSZWZsZWN0Lmhhcyh2YWx1ZSh0YXJnZXQpLCBwcm9wKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcHJveHk7XG59XG5cbmZ1bmN0aW9uIHN0cmVhbVRvQXN5bmNJdGVyYXRvckNsYXNzKHN0cmVhbSkge1xuICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XG4gIHJldHVybiBuZXcgQXN5bmNJdGVyYXRvckNsYXNzKFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIHJldHVybiByZWFkZXIucmVhZCgpO1xuICAgIH0sXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgcmVhZGVyLmNhbmNlbCgpO1xuICAgIH1cbiAgKTtcbn1cbmZ1bmN0aW9uIGFzeW5jSXRlcmF0b3JUb1N0cmVhbShpdGVyYXRvcikge1xuICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKHtcbiAgICBhc3luYyBwdWxsKGNvbnRyb2xsZXIpIHtcbiAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgIGlmIChkb25lKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBjYW5jZWwoKSB7XG4gICAgICBhd2FpdCBpdGVyYXRvci5yZXR1cm4/LigpO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBhc3luY0l0ZXJhdG9yVG9VbnByb3hpZWREYXRhU3RyZWFtKGl0ZXJhdG9yKSB7XG4gIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcikge1xuICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgaXRlcmF0b3IubmV4dCgpO1xuICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdW5wcm94aWVkID0gaXNPYmplY3QodmFsdWUpID8geyAuLi52YWx1ZSB9IDogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5tYXAoKGkpID0+IGkpIDogdmFsdWU7XG4gICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh1bnByb3hpZWQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgY2FuY2VsKCkge1xuICAgICAgYXdhaXQgaXRlcmF0b3IucmV0dXJuPy4oKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0cnlEZWNvZGVVUklDb21wb25lbnQodmFsdWUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCB7IEFib3J0RXJyb3IsIEFzeW5jSWRRdWV1ZSwgQXN5bmNJdGVyYXRvckNsYXNzLCBFdmVudFB1Ymxpc2hlciwgTnVsbFByb3RvT2JqLCBPUlBDX05BTUUsIE9SUENfU0hBUkVEX1BBQ0tBR0VfTkFNRSwgT1JQQ19TSEFSRURfUEFDS0FHRV9WRVJTSU9OLCBTZXF1ZW50aWFsSWRHZW5lcmF0b3IsIGFzeW5jSXRlcmF0b3JUb1N0cmVhbSwgYXN5bmNJdGVyYXRvclRvVW5wcm94aWVkRGF0YVN0cmVhbSwgYXN5bmNJdGVyYXRvcldpdGhTcGFuLCBjbG9uZSwgY29tcGFyZVNlcXVlbnRpYWxJZHMsIGRlZmVyLCBmYWxsYmFjaywgZmluZERlZXBNYXRjaGVzLCBnZXQsIGdldENvbnN0cnVjdG9yLCBnZXRHbG9iYWxPdGVsQ29uZmlnLCBpbnRlcmNlcHQsIGlzQXN5bmNJdGVyYXRvck9iamVjdCwgaXNPYmplY3QsIGlzUHJvcGVydHlLZXksIGlzVHlwZXNjcmlwdE9iamVjdCwgb25FcnJvciwgb25GaW5pc2gsIG9uU3RhcnQsIG9uU3VjY2Vzcywgb25jZSwgb3ZlcmxheVByb3h5LCBwYXJzZUVtcHR5YWJsZUpTT04sIHByZXZlbnROYXRpdmVBd2FpdCwgcmVhZEFzQnVmZmVyLCByZXBsaWNhdGVBc3luY0l0ZXJhdG9yLCByZXNvbHZlTWF5YmVPcHRpb25hbE9wdGlvbnMsIHJ1bkluU3BhbkNvbnRleHQsIHJ1bldpdGhTcGFuLCBzZXF1ZW50aWFsLCBzZXRHbG9iYWxPdGVsQ29uZmlnLCBzZXRTcGFuQXR0cmlidXRlLCBzZXRTcGFuRXJyb3IsIHNwbGl0SW5IYWxmLCBzdGFydFNwYW4sIHN0cmVhbVRvQXN5bmNJdGVyYXRvckNsYXNzLCBzdHJpbmdpZnlKU09OLCB0b0FycmF5LCB0b090ZWxFeGNlcHRpb24sIHRvU3BhbkF0dHJpYnV0ZVZhbHVlLCB0cnlEZWNvZGVVUklDb21wb25lbnQsIHZhbHVlIH07XG4iLCJpbXBvcnQgeyBpc1R5cGVzY3JpcHRPYmplY3QsIEFzeW5jSXRlcmF0b3JDbGFzcywgdHJ5RGVjb2RlVVJJQ29tcG9uZW50LCB0b0FycmF5LCBvbmNlLCBpc0FzeW5jSXRlcmF0b3JPYmplY3QsIHJlcGxpY2F0ZUFzeW5jSXRlcmF0b3IgfSBmcm9tICdAb3JwYy9zaGFyZWQnO1xuXG5jbGFzcyBFdmVudEVuY29kZXJFcnJvciBleHRlbmRzIFR5cGVFcnJvciB7XG59XG5jbGFzcyBFdmVudERlY29kZXJFcnJvciBleHRlbmRzIFR5cGVFcnJvciB7XG59XG5jbGFzcyBFcnJvckV2ZW50IGV4dGVuZHMgRXJyb3Ige1xuICBkYXRhO1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucz8ubWVzc2FnZSA/PyBcIkFuIGVycm9yIGV2ZW50IHdhcyByZWNlaXZlZFwiLCBvcHRpb25zKTtcbiAgICB0aGlzLmRhdGEgPSBvcHRpb25zPy5kYXRhO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlY29kZUV2ZW50TWVzc2FnZShlbmNvZGVkKSB7XG4gIGNvbnN0IGxpbmVzID0gZW5jb2RlZC5yZXBsYWNlKC9cXG4rJC8sIFwiXCIpLnNwbGl0KC9cXG4vKTtcbiAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICBkYXRhOiB2b2lkIDAsXG4gICAgZXZlbnQ6IHZvaWQgMCxcbiAgICBpZDogdm9pZCAwLFxuICAgIHJldHJ5OiB2b2lkIDAsXG4gICAgY29tbWVudHM6IFtdXG4gIH07XG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGNvbnN0IGluZGV4ID0gbGluZS5pbmRleE9mKFwiOlwiKTtcbiAgICBjb25zdCBrZXkgPSBpbmRleCA9PT0gLTEgPyBsaW5lIDogbGluZS5zbGljZSgwLCBpbmRleCk7XG4gICAgY29uc3QgdmFsdWUgPSBpbmRleCA9PT0gLTEgPyBcIlwiIDogbGluZS5zbGljZShpbmRleCArIDEpLnJlcGxhY2UoL15cXHMvLCBcIlwiKTtcbiAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgIG1lc3NhZ2UuY29tbWVudHMucHVzaCh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwiZGF0YVwiKSB7XG4gICAgICBtZXNzYWdlLmRhdGEgPz89IFwiXCI7XG4gICAgICBtZXNzYWdlLmRhdGEgKz0gYCR7dmFsdWV9XG5gO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcImV2ZW50XCIpIHtcbiAgICAgIG1lc3NhZ2UuZXZlbnQgPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJpZFwiKSB7XG4gICAgICBtZXNzYWdlLmlkID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwicmV0cnlcIikge1xuICAgICAgY29uc3QgbWF5YmVJbnRlZ2VyID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlKTtcbiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG1heWJlSW50ZWdlcikgJiYgbWF5YmVJbnRlZ2VyID49IDAgJiYgbWF5YmVJbnRlZ2VyLnRvU3RyaW5nKCkgPT09IHZhbHVlKSB7XG4gICAgICAgIG1lc3NhZ2UucmV0cnkgPSBtYXliZUludGVnZXI7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIG1lc3NhZ2UuZGF0YSA9IG1lc3NhZ2UuZGF0YT8ucmVwbGFjZSgvXFxuJC8sIFwiXCIpO1xuICByZXR1cm4gbWVzc2FnZTtcbn1cbmNsYXNzIEV2ZW50RGVjb2RlciB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cbiAgaW5jb21wbGV0ZSA9IFwiXCI7XG4gIGZlZWQoY2h1bmspIHtcbiAgICB0aGlzLmluY29tcGxldGUgKz0gY2h1bms7XG4gICAgY29uc3QgbGFzdENvbXBsZXRlSW5kZXggPSB0aGlzLmluY29tcGxldGUubGFzdEluZGV4T2YoXCJcXG5cXG5cIik7XG4gICAgaWYgKGxhc3RDb21wbGV0ZUluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb21wbGV0ZXMgPSB0aGlzLmluY29tcGxldGUuc2xpY2UoMCwgbGFzdENvbXBsZXRlSW5kZXgpLnNwbGl0KC9cXG5cXG4vKTtcbiAgICB0aGlzLmluY29tcGxldGUgPSB0aGlzLmluY29tcGxldGUuc2xpY2UobGFzdENvbXBsZXRlSW5kZXggKyAyKTtcbiAgICBmb3IgKGNvbnN0IGVuY29kZWQgb2YgY29tcGxldGVzKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZGVjb2RlRXZlbnRNZXNzYWdlKGAke2VuY29kZWR9XG5cbmApO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkV2ZW50KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5vbkV2ZW50KG1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmluY29tcGxldGUgPSBcIlwiO1xuICB9XG4gIGVuZCgpIHtcbiAgICBpZiAodGhpcy5pbmNvbXBsZXRlKSB7XG4gICAgICB0aHJvdyBuZXcgRXZlbnREZWNvZGVyRXJyb3IoXCJFdmVudCBJdGVyYXRvciBlbmRlZCBiZWZvcmUgY29tcGxldGVcIik7XG4gICAgfVxuICB9XG59XG5jbGFzcyBFdmVudERlY29kZXJTdHJlYW0gZXh0ZW5kcyBUcmFuc2Zvcm1TdHJlYW0ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBsZXQgZGVjb2RlcjtcbiAgICBzdXBlcih7XG4gICAgICBzdGFydChjb250cm9sbGVyKSB7XG4gICAgICAgIGRlY29kZXIgPSBuZXcgRXZlbnREZWNvZGVyKHtcbiAgICAgICAgICBvbkV2ZW50OiAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICB0cmFuc2Zvcm0oY2h1bmspIHtcbiAgICAgICAgZGVjb2Rlci5mZWVkKGNodW5rKTtcbiAgICAgIH0sXG4gICAgICBmbHVzaCgpIHtcbiAgICAgICAgZGVjb2Rlci5lbmQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRFdmVudElkKGlkKSB7XG4gIGlmIChpZC5pbmNsdWRlcyhcIlxcblwiKSkge1xuICAgIHRocm93IG5ldyBFdmVudEVuY29kZXJFcnJvcihcIkV2ZW50J3MgaWQgbXVzdCBub3QgY29udGFpbiBhIG5ld2xpbmUgY2hhcmFjdGVyXCIpO1xuICB9XG59XG5mdW5jdGlvbiBhc3NlcnRFdmVudE5hbWUoZXZlbnQpIHtcbiAgaWYgKGV2ZW50LmluY2x1ZGVzKFwiXFxuXCIpKSB7XG4gICAgdGhyb3cgbmV3IEV2ZW50RW5jb2RlckVycm9yKFwiRXZlbnQncyBldmVudCBtdXN0IG5vdCBjb250YWluIGEgbmV3bGluZSBjaGFyYWN0ZXJcIik7XG4gIH1cbn1cbmZ1bmN0aW9uIGFzc2VydEV2ZW50UmV0cnkocmV0cnkpIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHJldHJ5KSB8fCByZXRyeSA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXZlbnRFbmNvZGVyRXJyb3IoXCJFdmVudCdzIHJldHJ5IG11c3QgYmUgYSBpbnRlZ2VyIGFuZCA+PSAwXCIpO1xuICB9XG59XG5mdW5jdGlvbiBhc3NlcnRFdmVudENvbW1lbnQoY29tbWVudCkge1xuICBpZiAoY29tbWVudC5pbmNsdWRlcyhcIlxcblwiKSkge1xuICAgIHRocm93IG5ldyBFdmVudEVuY29kZXJFcnJvcihcIkV2ZW50J3MgY29tbWVudCBtdXN0IG5vdCBjb250YWluIGEgbmV3bGluZSBjaGFyYWN0ZXJcIik7XG4gIH1cbn1cbmZ1bmN0aW9uIGVuY29kZUV2ZW50RGF0YShkYXRhKSB7XG4gIGNvbnN0IGxpbmVzID0gZGF0YT8uc3BsaXQoL1xcbi8pID8/IFtdO1xuICBsZXQgb3V0cHV0ID0gXCJcIjtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgb3V0cHV0ICs9IGBkYXRhOiAke2xpbmV9XG5gO1xuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59XG5mdW5jdGlvbiBlbmNvZGVFdmVudENvbW1lbnRzKGNvbW1lbnRzKSB7XG4gIGxldCBvdXRwdXQgPSBcIlwiO1xuICBmb3IgKGNvbnN0IGNvbW1lbnQgb2YgY29tbWVudHMgPz8gW10pIHtcbiAgICBhc3NlcnRFdmVudENvbW1lbnQoY29tbWVudCk7XG4gICAgb3V0cHV0ICs9IGA6ICR7Y29tbWVudH1cbmA7XG4gIH1cbiAgcmV0dXJuIG91dHB1dDtcbn1cbmZ1bmN0aW9uIGVuY29kZUV2ZW50TWVzc2FnZShtZXNzYWdlKSB7XG4gIGxldCBvdXRwdXQgPSBcIlwiO1xuICBvdXRwdXQgKz0gZW5jb2RlRXZlbnRDb21tZW50cyhtZXNzYWdlLmNvbW1lbnRzKTtcbiAgaWYgKG1lc3NhZ2UuZXZlbnQgIT09IHZvaWQgMCkge1xuICAgIGFzc2VydEV2ZW50TmFtZShtZXNzYWdlLmV2ZW50KTtcbiAgICBvdXRwdXQgKz0gYGV2ZW50OiAke21lc3NhZ2UuZXZlbnR9XG5gO1xuICB9XG4gIGlmIChtZXNzYWdlLnJldHJ5ICE9PSB2b2lkIDApIHtcbiAgICBhc3NlcnRFdmVudFJldHJ5KG1lc3NhZ2UucmV0cnkpO1xuICAgIG91dHB1dCArPSBgcmV0cnk6ICR7bWVzc2FnZS5yZXRyeX1cbmA7XG4gIH1cbiAgaWYgKG1lc3NhZ2UuaWQgIT09IHZvaWQgMCkge1xuICAgIGFzc2VydEV2ZW50SWQobWVzc2FnZS5pZCk7XG4gICAgb3V0cHV0ICs9IGBpZDogJHttZXNzYWdlLmlkfVxuYDtcbiAgfVxuICBvdXRwdXQgKz0gZW5jb2RlRXZlbnREYXRhKG1lc3NhZ2UuZGF0YSk7XG4gIG91dHB1dCArPSBcIlxcblwiO1xuICByZXR1cm4gb3V0cHV0O1xufVxuXG5jb25zdCBFVkVOVF9TT1VSQ0VfTUVUQV9TWU1CT0wgPSBTeW1ib2woXCJPUlBDX0VWRU5UX1NPVVJDRV9NRVRBXCIpO1xuZnVuY3Rpb24gd2l0aEV2ZW50TWV0YShjb250YWluZXIsIG1ldGEpIHtcbiAgaWYgKG1ldGEuaWQgPT09IHZvaWQgMCAmJiBtZXRhLnJldHJ5ID09PSB2b2lkIDAgJiYgIW1ldGEuY29tbWVudHM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBjb250YWluZXI7XG4gIH1cbiAgaWYgKG1ldGEuaWQgIT09IHZvaWQgMCkge1xuICAgIGFzc2VydEV2ZW50SWQobWV0YS5pZCk7XG4gIH1cbiAgaWYgKG1ldGEucmV0cnkgIT09IHZvaWQgMCkge1xuICAgIGFzc2VydEV2ZW50UmV0cnkobWV0YS5yZXRyeSk7XG4gIH1cbiAgaWYgKG1ldGEuY29tbWVudHMgIT09IHZvaWQgMCkge1xuICAgIGZvciAoY29uc3QgY29tbWVudCBvZiBtZXRhLmNvbW1lbnRzKSB7XG4gICAgICBhc3NlcnRFdmVudENvbW1lbnQoY29tbWVudCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXcgUHJveHkoY29udGFpbmVyLCB7XG4gICAgZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgICAgIGlmIChwcm9wID09PSBFVkVOVF9TT1VSQ0VfTUVUQV9TWU1CT0wpIHtcbiAgICAgICAgcmV0dXJuIG1ldGE7XG4gICAgICB9XG4gICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIGdldEV2ZW50TWV0YShjb250YWluZXIpIHtcbiAgcmV0dXJuIGlzVHlwZXNjcmlwdE9iamVjdChjb250YWluZXIpID8gUmVmbGVjdC5nZXQoY29udGFpbmVyLCBFVkVOVF9TT1VSQ0VfTUVUQV9TWU1CT0wpIDogdm9pZCAwO1xufVxuXG5jbGFzcyBIaWJlcm5hdGlvbkV2ZW50SXRlcmF0b3IgZXh0ZW5kcyBBc3luY0l0ZXJhdG9yQ2xhc3Mge1xuICAvKipcbiAgICogdGhpcyBwcm9wZXJ0eSBpcyBub3QgdHJhbnNmZXJyZWQgdG8gdGhlIGNsaWVudCwgc28gaXQgc2hvdWxkIGJlIG9wdGlvbmFsIGZvciB0eXBlIHNhZmV0eVxuICAgKi9cbiAgaGliZXJuYXRpb25DYWxsYmFjaztcbiAgY29uc3RydWN0b3IoaGliZXJuYXRpb25DYWxsYmFjaykge1xuICAgIHN1cGVyKGFzeW5jICgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBpdGVyYXRlIG92ZXIgaGliZXJuYXRpbmcgaXRlcmF0b3IgZGlyZWN0bHlcIik7XG4gICAgfSwgYXN5bmMgKHJlYXNvbikgPT4ge1xuICAgICAgaWYgKHJlYXNvbiAhPT0gXCJuZXh0XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNsZWFudXAgaGliZXJuYXRpbmcgaXRlcmF0b3IgZGlyZWN0bHlcIik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5oaWJlcm5hdGlvbkNhbGxiYWNrID0gaGliZXJuYXRpb25DYWxsYmFjaztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUNvbnRlbnREaXNwb3NpdGlvbihmaWxlbmFtZSkge1xuICBjb25zdCBlc2NhcGVkRmlsZU5hbWUgPSBmaWxlbmFtZS5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJyk7XG4gIGNvbnN0IGVuY29kZWRGaWxlbmFtZVN0YXIgPSBlbmNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpLnJlcGxhY2UoL1snKCkqXS9nLCAoYykgPT4gYCUke2MuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX1gKS5yZXBsYWNlKC8lKDdDfDYwfDVFKS9nLCAoc3RyLCBoZXgpID0+IFN0cmluZy5mcm9tQ2hhckNvZGUoTnVtYmVyLnBhcnNlSW50KGhleCwgMTYpKSk7XG4gIHJldHVybiBgaW5saW5lOyBmaWxlbmFtZT1cIiR7ZXNjYXBlZEZpbGVOYW1lfVwiOyBmaWxlbmFtZSo9dXRmLTgnJyR7ZW5jb2RlZEZpbGVuYW1lU3Rhcn1gO1xufVxuZnVuY3Rpb24gZ2V0RmlsZW5hbWVGcm9tQ29udGVudERpc3Bvc2l0aW9uKGNvbnRlbnREaXNwb3NpdGlvbikge1xuICBjb25zdCBlbmNvZGVkRmlsZW5hbWVTdGFyTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24ubWF0Y2goL2ZpbGVuYW1lXFwqPShVVEYtOCcnKT8oW147XSopL2kpO1xuICBpZiAoZW5jb2RlZEZpbGVuYW1lU3Rhck1hdGNoICYmIHR5cGVvZiBlbmNvZGVkRmlsZW5hbWVTdGFyTWF0Y2hbMl0gPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gdHJ5RGVjb2RlVVJJQ29tcG9uZW50KGVuY29kZWRGaWxlbmFtZVN0YXJNYXRjaFsyXSk7XG4gIH1cbiAgY29uc3QgZW5jb2RlZEZpbGVuYW1lTWF0Y2ggPSBjb250ZW50RGlzcG9zaXRpb24ubWF0Y2goL2ZpbGVuYW1lPVwiKCg/OlxcXFxcInxbXlwiXSkqKVwiL2kpO1xuICBpZiAoZW5jb2RlZEZpbGVuYW1lTWF0Y2ggJiYgdHlwZW9mIGVuY29kZWRGaWxlbmFtZU1hdGNoWzFdID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGVuY29kZWRGaWxlbmFtZU1hdGNoWzFdLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKTtcbiAgfVxufVxuZnVuY3Rpb24gbWVyZ2VTdGFuZGFyZEhlYWRlcnMoYSwgYikge1xuICBjb25zdCBtZXJnZWQgPSB7IC4uLmEgfTtcbiAgZm9yIChjb25zdCBrZXkgaW4gYikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGJba2V5XSkpIHtcbiAgICAgIG1lcmdlZFtrZXldID0gWy4uLnRvQXJyYXkobWVyZ2VkW2tleV0pLCAuLi5iW2tleV1dO1xuICAgIH0gZWxzZSBpZiAoYltrZXldICE9PSB2b2lkIDApIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG1lcmdlZFtrZXldKSkge1xuICAgICAgICBtZXJnZWRba2V5XSA9IFsuLi5tZXJnZWRba2V5XSwgYltrZXldXTtcbiAgICAgIH0gZWxzZSBpZiAobWVyZ2VkW2tleV0gIT09IHZvaWQgMCkge1xuICAgICAgICBtZXJnZWRba2V5XSA9IFttZXJnZWRba2V5XSwgYltrZXldXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lcmdlZFtrZXldID0gYltrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbWVyZ2VkO1xufVxuZnVuY3Rpb24gZmxhdHRlbkhlYWRlcihoZWFkZXIpIHtcbiAgaWYgKHR5cGVvZiBoZWFkZXIgPT09IFwic3RyaW5nXCIgfHwgaGVhZGVyID09PSB2b2lkIDApIHtcbiAgICByZXR1cm4gaGVhZGVyO1xuICB9XG4gIGlmIChoZWFkZXIubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICByZXR1cm4gaGVhZGVyLmpvaW4oXCIsIFwiKTtcbn1cbmZ1bmN0aW9uIHJlcGxpY2F0ZVN0YW5kYXJkTGF6eVJlc3BvbnNlKHJlc3BvbnNlLCBjb3VudCkge1xuICBjb25zdCByZXBsaWNhdGVkID0gW107XG4gIGxldCBib2R5UHJvbWlzZTtcbiAgbGV0IHJlcGxpY2F0ZWRBc3luY0l0ZXJhdG9yT2JqZWN0cztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgcmVwbGljYXRlZC5wdXNoKHtcbiAgICAgIC4uLnJlc3BvbnNlLFxuICAgICAgYm9keTogb25jZShhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCAoYm9keVByb21pc2UgPz89IHJlc3BvbnNlLmJvZHkoKSk7XG4gICAgICAgIGlmICghaXNBc3luY0l0ZXJhdG9yT2JqZWN0KGJvZHkpKSB7XG4gICAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgICAgIH1cbiAgICAgICAgcmVwbGljYXRlZEFzeW5jSXRlcmF0b3JPYmplY3RzID8/PSByZXBsaWNhdGVBc3luY0l0ZXJhdG9yKGJvZHksIGNvdW50KTtcbiAgICAgICAgcmV0dXJuIHJlcGxpY2F0ZWRBc3luY0l0ZXJhdG9yT2JqZWN0cy5zaGlmdCgpO1xuICAgICAgfSlcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVwbGljYXRlZDtcbn1cbmZ1bmN0aW9uIGlzRXZlbnRJdGVyYXRvckhlYWRlcnMoaGVhZGVycykge1xuICByZXR1cm4gQm9vbGVhbihmbGF0dGVuSGVhZGVyKGhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0pPy5zdGFydHNXaXRoKFwidGV4dC9ldmVudC1zdHJlYW1cIikgJiYgZmxhdHRlbkhlYWRlcihoZWFkZXJzW1wiY29udGVudC1kaXNwb3NpdGlvblwiXSkgPT09IHZvaWQgMCk7XG59XG5cbmV4cG9ydCB7IEVycm9yRXZlbnQsIEV2ZW50RGVjb2RlciwgRXZlbnREZWNvZGVyRXJyb3IsIEV2ZW50RGVjb2RlclN0cmVhbSwgRXZlbnRFbmNvZGVyRXJyb3IsIEhpYmVybmF0aW9uRXZlbnRJdGVyYXRvciwgYXNzZXJ0RXZlbnRDb21tZW50LCBhc3NlcnRFdmVudElkLCBhc3NlcnRFdmVudE5hbWUsIGFzc2VydEV2ZW50UmV0cnksIGRlY29kZUV2ZW50TWVzc2FnZSwgZW5jb2RlRXZlbnRDb21tZW50cywgZW5jb2RlRXZlbnREYXRhLCBlbmNvZGVFdmVudE1lc3NhZ2UsIGZsYXR0ZW5IZWFkZXIsIGdlbmVyYXRlQ29udGVudERpc3Bvc2l0aW9uLCBnZXRFdmVudE1ldGEsIGdldEZpbGVuYW1lRnJvbUNvbnRlbnREaXNwb3NpdGlvbiwgaXNFdmVudEl0ZXJhdG9ySGVhZGVycywgbWVyZ2VTdGFuZGFyZEhlYWRlcnMsIHJlcGxpY2F0ZVN0YW5kYXJkTGF6eVJlc3BvbnNlLCB3aXRoRXZlbnRNZXRhIH07XG4iLCJpbXBvcnQgeyByZXNvbHZlTWF5YmVPcHRpb25hbE9wdGlvbnMsIGdldENvbnN0cnVjdG9yLCBpc09iamVjdCwgQXN5bmNJdGVyYXRvckNsYXNzLCBpc1R5cGVzY3JpcHRPYmplY3QgfSBmcm9tICdAb3JwYy9zaGFyZWQnO1xuaW1wb3J0IHsgZ2V0RXZlbnRNZXRhLCB3aXRoRXZlbnRNZXRhIH0gZnJvbSAnQG9ycGMvc3RhbmRhcmQtc2VydmVyJztcblxuY29uc3QgT1JQQ19DTElFTlRfUEFDS0FHRV9OQU1FID0gXCJAb3JwYy9jbGllbnRcIjtcbmNvbnN0IE9SUENfQ0xJRU5UX1BBQ0tBR0VfVkVSU0lPTiA9IFwiMS4xMC40XCI7XG5cbmNvbnN0IENPTU1PTl9PUlBDX0VSUk9SX0RFRlMgPSB7XG4gIEJBRF9SRVFVRVNUOiB7XG4gICAgc3RhdHVzOiA0MDAsXG4gICAgbWVzc2FnZTogXCJCYWQgUmVxdWVzdFwiXG4gIH0sXG4gIFVOQVVUSE9SSVpFRDoge1xuICAgIHN0YXR1czogNDAxLFxuICAgIG1lc3NhZ2U6IFwiVW5hdXRob3JpemVkXCJcbiAgfSxcbiAgRk9SQklEREVOOiB7XG4gICAgc3RhdHVzOiA0MDMsXG4gICAgbWVzc2FnZTogXCJGb3JiaWRkZW5cIlxuICB9LFxuICBOT1RfRk9VTkQ6IHtcbiAgICBzdGF0dXM6IDQwNCxcbiAgICBtZXNzYWdlOiBcIk5vdCBGb3VuZFwiXG4gIH0sXG4gIE1FVEhPRF9OT1RfU1VQUE9SVEVEOiB7XG4gICAgc3RhdHVzOiA0MDUsXG4gICAgbWVzc2FnZTogXCJNZXRob2QgTm90IFN1cHBvcnRlZFwiXG4gIH0sXG4gIE5PVF9BQ0NFUFRBQkxFOiB7XG4gICAgc3RhdHVzOiA0MDYsXG4gICAgbWVzc2FnZTogXCJOb3QgQWNjZXB0YWJsZVwiXG4gIH0sXG4gIFRJTUVPVVQ6IHtcbiAgICBzdGF0dXM6IDQwOCxcbiAgICBtZXNzYWdlOiBcIlJlcXVlc3QgVGltZW91dFwiXG4gIH0sXG4gIENPTkZMSUNUOiB7XG4gICAgc3RhdHVzOiA0MDksXG4gICAgbWVzc2FnZTogXCJDb25mbGljdFwiXG4gIH0sXG4gIFBSRUNPTkRJVElPTl9GQUlMRUQ6IHtcbiAgICBzdGF0dXM6IDQxMixcbiAgICBtZXNzYWdlOiBcIlByZWNvbmRpdGlvbiBGYWlsZWRcIlxuICB9LFxuICBQQVlMT0FEX1RPT19MQVJHRToge1xuICAgIHN0YXR1czogNDEzLFxuICAgIG1lc3NhZ2U6IFwiUGF5bG9hZCBUb28gTGFyZ2VcIlxuICB9LFxuICBVTlNVUFBPUlRFRF9NRURJQV9UWVBFOiB7XG4gICAgc3RhdHVzOiA0MTUsXG4gICAgbWVzc2FnZTogXCJVbnN1cHBvcnRlZCBNZWRpYSBUeXBlXCJcbiAgfSxcbiAgVU5QUk9DRVNTQUJMRV9DT05URU5UOiB7XG4gICAgc3RhdHVzOiA0MjIsXG4gICAgbWVzc2FnZTogXCJVbnByb2Nlc3NhYmxlIENvbnRlbnRcIlxuICB9LFxuICBUT09fTUFOWV9SRVFVRVNUUzoge1xuICAgIHN0YXR1czogNDI5LFxuICAgIG1lc3NhZ2U6IFwiVG9vIE1hbnkgUmVxdWVzdHNcIlxuICB9LFxuICBDTElFTlRfQ0xPU0VEX1JFUVVFU1Q6IHtcbiAgICBzdGF0dXM6IDQ5OSxcbiAgICBtZXNzYWdlOiBcIkNsaWVudCBDbG9zZWQgUmVxdWVzdFwiXG4gIH0sXG4gIElOVEVSTkFMX1NFUlZFUl9FUlJPUjoge1xuICAgIHN0YXR1czogNTAwLFxuICAgIG1lc3NhZ2U6IFwiSW50ZXJuYWwgU2VydmVyIEVycm9yXCJcbiAgfSxcbiAgTk9UX0lNUExFTUVOVEVEOiB7XG4gICAgc3RhdHVzOiA1MDEsXG4gICAgbWVzc2FnZTogXCJOb3QgSW1wbGVtZW50ZWRcIlxuICB9LFxuICBCQURfR0FURVdBWToge1xuICAgIHN0YXR1czogNTAyLFxuICAgIG1lc3NhZ2U6IFwiQmFkIEdhdGV3YXlcIlxuICB9LFxuICBTRVJWSUNFX1VOQVZBSUxBQkxFOiB7XG4gICAgc3RhdHVzOiA1MDMsXG4gICAgbWVzc2FnZTogXCJTZXJ2aWNlIFVuYXZhaWxhYmxlXCJcbiAgfSxcbiAgR0FURVdBWV9USU1FT1VUOiB7XG4gICAgc3RhdHVzOiA1MDQsXG4gICAgbWVzc2FnZTogXCJHYXRld2F5IFRpbWVvdXRcIlxuICB9XG59O1xuZnVuY3Rpb24gZmFsbGJhY2tPUlBDRXJyb3JTdGF0dXMoY29kZSwgc3RhdHVzKSB7XG4gIHJldHVybiBzdGF0dXMgPz8gQ09NTU9OX09SUENfRVJST1JfREVGU1tjb2RlXT8uc3RhdHVzID8/IDUwMDtcbn1cbmZ1bmN0aW9uIGZhbGxiYWNrT1JQQ0Vycm9yTWVzc2FnZShjb2RlLCBtZXNzYWdlKSB7XG4gIHJldHVybiBtZXNzYWdlIHx8IENPTU1PTl9PUlBDX0VSUk9SX0RFRlNbY29kZV0/Lm1lc3NhZ2UgfHwgY29kZTtcbn1cbmNvbnN0IEdMT0JBTF9PUlBDX0VSUk9SX0NPTlNUUlVDVE9SU19TWU1CT0wgPSBTeW1ib2wuZm9yKGBfXyR7T1JQQ19DTElFTlRfUEFDS0FHRV9OQU1FfUAke09SUENfQ0xJRU5UX1BBQ0tBR0VfVkVSU0lPTn0vZXJyb3IvT1JQQ19FUlJPUl9DT05TVFJVQ1RPUlNfX2ApO1xudm9pZCAoZ2xvYmFsVGhpc1tHTE9CQUxfT1JQQ19FUlJPUl9DT05TVFJVQ1RPUlNfU1lNQk9MXSA/Pz0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrU2V0KCkpO1xuY29uc3QgZ2xvYmFsT1JQQ0Vycm9yQ29uc3RydWN0b3JzID0gZ2xvYmFsVGhpc1tHTE9CQUxfT1JQQ19FUlJPUl9DT05TVFJVQ1RPUlNfU1lNQk9MXTtcbmNsYXNzIE9SUENFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgZGVmaW5lZDtcbiAgY29kZTtcbiAgc3RhdHVzO1xuICBkYXRhO1xuICBjb25zdHJ1Y3Rvcihjb2RlLCAuLi5yZXN0KSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHJlc29sdmVNYXliZU9wdGlvbmFsT3B0aW9ucyhyZXN0KTtcbiAgICBpZiAob3B0aW9ucy5zdGF0dXMgIT09IHZvaWQgMCAmJiAhaXNPUlBDRXJyb3JTdGF0dXMob3B0aW9ucy5zdGF0dXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbT1JQQ0Vycm9yXSBJbnZhbGlkIGVycm9yIHN0YXR1cyBjb2RlLlwiKTtcbiAgICB9XG4gICAgY29uc3QgbWVzc2FnZSA9IGZhbGxiYWNrT1JQQ0Vycm9yTWVzc2FnZShjb2RlLCBvcHRpb25zLm1lc3NhZ2UpO1xuICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgdGhpcy5zdGF0dXMgPSBmYWxsYmFja09SUENFcnJvclN0YXR1cyhjb2RlLCBvcHRpb25zLnN0YXR1cyk7XG4gICAgdGhpcy5kZWZpbmVkID0gb3B0aW9ucy5kZWZpbmVkID8/IGZhbHNlO1xuICAgIHRoaXMuZGF0YSA9IG9wdGlvbnMuZGF0YTtcbiAgfVxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlZmluZWQ6IHRoaXMuZGVmaW5lZCxcbiAgICAgIGNvZGU6IHRoaXMuY29kZSxcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBkYXRhOiB0aGlzLmRhdGFcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBXb3JrYXJvdW5kIGZvciBOZXh0LmpzIHdoZXJlIGRpZmZlcmVudCBjb250ZXh0cyB1c2Ugc2VwYXJhdGVcbiAgICogZGVwZW5kZW5jeSBncmFwaHMsIGNhdXNpbmcgbXVsdGlwbGUgT1JQQ0Vycm9yIGNvbnN0cnVjdG9ycyBleGlzdGluZyBhbmQgYnJlYWtpbmdcbiAgICogYGluc3RhbmNlb2ZgIGNoZWNrcyBhY3Jvc3MgY29udGV4dHMuXG4gICAqXG4gICAqIFRoaXMgaXMgcGFydGljdWxhcmx5IHByb2JsZW1hdGljIHdpdGggXCJPcHRpbWl6ZWQgU1NSXCIsIHdoZXJlIG9ycGMtY2xpZW50XG4gICAqIGV4ZWN1dGVzIGluIG9uZSBjb250ZXh0IGJ1dCBpcyBpbnZva2VkIGZyb20gYW5vdGhlci4gV2hlbiBhbiBlcnJvciBpcyB0aHJvd25cbiAgICogaW4gdGhlIGV4ZWN1dGlvbiBjb250ZXh0LCBgaW5zdGFuY2VvZiBPUlBDRXJyb3JgIGNoZWNrcyBmYWlsIGluIHRoZVxuICAgKiBpbnZvY2F0aW9uIGNvbnRleHQgZHVlIHRvIHNlcGFyYXRlIGNsYXNzIGNvbnN0cnVjdG9ycy5cbiAgICpcbiAgICogQHRvZG8gUmVtb3ZlIHRoaXMgYW5kIHJlbGF0ZWQgY29kZSBpZiBOZXh0LmpzIHJlc29sdmVzIHRoZSBtdWx0aXBsZSBkZXBlbmRlbmN5IGdyYXBoIGlzc3VlLlxuICAgKi9cbiAgc3RhdGljIFtTeW1ib2wuaGFzSW5zdGFuY2VdKGluc3RhbmNlKSB7XG4gICAgaWYgKGdsb2JhbE9SUENFcnJvckNvbnN0cnVjdG9ycy5oYXModGhpcykpIHtcbiAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gZ2V0Q29uc3RydWN0b3IoaW5zdGFuY2UpO1xuICAgICAgaWYgKGNvbnN0cnVjdG9yICYmIGdsb2JhbE9SUENFcnJvckNvbnN0cnVjdG9ycy5oYXMoY29uc3RydWN0b3IpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3VwZXJbU3ltYm9sLmhhc0luc3RhbmNlXShpbnN0YW5jZSk7XG4gIH1cbn1cbmdsb2JhbE9SUENFcnJvckNvbnN0cnVjdG9ycy5hZGQoT1JQQ0Vycm9yKTtcbmZ1bmN0aW9uIGlzRGVmaW5lZEVycm9yKGVycm9yKSB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIE9SUENFcnJvciAmJiBlcnJvci5kZWZpbmVkO1xufVxuZnVuY3Rpb24gdG9PUlBDRXJyb3IoZXJyb3IpIHtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgT1JQQ0Vycm9yID8gZXJyb3IgOiBuZXcgT1JQQ0Vycm9yKFwiSU5URVJOQUxfU0VSVkVSX0VSUk9SXCIsIHtcbiAgICBtZXNzYWdlOiBcIkludGVybmFsIHNlcnZlciBlcnJvclwiLFxuICAgIGNhdXNlOiBlcnJvclxuICB9KTtcbn1cbmZ1bmN0aW9uIGlzT1JQQ0Vycm9yU3RhdHVzKHN0YXR1cykge1xuICByZXR1cm4gc3RhdHVzIDwgMjAwIHx8IHN0YXR1cyA+PSA0MDA7XG59XG5mdW5jdGlvbiBpc09SUENFcnJvckpzb24oanNvbikge1xuICBpZiAoIWlzT2JqZWN0KGpzb24pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHZhbGlkS2V5cyA9IFtcImRlZmluZWRcIiwgXCJjb2RlXCIsIFwic3RhdHVzXCIsIFwibWVzc2FnZVwiLCBcImRhdGFcIl07XG4gIGlmIChPYmplY3Qua2V5cyhqc29uKS5zb21lKChrKSA9PiAhdmFsaWRLZXlzLmluY2x1ZGVzKGspKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gXCJkZWZpbmVkXCIgaW4ganNvbiAmJiB0eXBlb2YganNvbi5kZWZpbmVkID09PSBcImJvb2xlYW5cIiAmJiBcImNvZGVcIiBpbiBqc29uICYmIHR5cGVvZiBqc29uLmNvZGUgPT09IFwic3RyaW5nXCIgJiYgXCJzdGF0dXNcIiBpbiBqc29uICYmIHR5cGVvZiBqc29uLnN0YXR1cyA9PT0gXCJudW1iZXJcIiAmJiBpc09SUENFcnJvclN0YXR1cyhqc29uLnN0YXR1cykgJiYgXCJtZXNzYWdlXCIgaW4ganNvbiAmJiB0eXBlb2YganNvbi5tZXNzYWdlID09PSBcInN0cmluZ1wiO1xufVxuZnVuY3Rpb24gY3JlYXRlT1JQQ0Vycm9yRnJvbUpzb24oanNvbiwgb3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBuZXcgT1JQQ0Vycm9yKGpzb24uY29kZSwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgLi4uanNvblxuICB9KTtcbn1cblxuZnVuY3Rpb24gbWFwRXZlbnRJdGVyYXRvcihpdGVyYXRvciwgbWFwcykge1xuICBjb25zdCBtYXBFcnJvciA9IGFzeW5jIChlcnJvcikgPT4ge1xuICAgIGxldCBtYXBwZWRFcnJvciA9IGF3YWl0IG1hcHMuZXJyb3IoZXJyb3IpO1xuICAgIGlmIChtYXBwZWRFcnJvciAhPT0gZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1ldGEgPSBnZXRFdmVudE1ldGEoZXJyb3IpO1xuICAgICAgaWYgKG1ldGEgJiYgaXNUeXBlc2NyaXB0T2JqZWN0KG1hcHBlZEVycm9yKSkge1xuICAgICAgICBtYXBwZWRFcnJvciA9IHdpdGhFdmVudE1ldGEobWFwcGVkRXJyb3IsIG1ldGEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFwcGVkRXJyb3I7XG4gIH07XG4gIHJldHVybiBuZXcgQXN5bmNJdGVyYXRvckNsYXNzKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IGF3YWl0IG1hcEVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIGxldCBtYXBwZWRWYWx1ZSA9IGF3YWl0IG1hcHMudmFsdWUodmFsdWUsIGRvbmUpO1xuICAgIGlmIChtYXBwZWRWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgIGNvbnN0IG1ldGEgPSBnZXRFdmVudE1ldGEodmFsdWUpO1xuICAgICAgaWYgKG1ldGEgJiYgaXNUeXBlc2NyaXB0T2JqZWN0KG1hcHBlZFZhbHVlKSkge1xuICAgICAgICBtYXBwZWRWYWx1ZSA9IHdpdGhFdmVudE1ldGEobWFwcGVkVmFsdWUsIG1ldGEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBkb25lLCB2YWx1ZTogbWFwcGVkVmFsdWUgfTtcbiAgfSwgYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBpdGVyYXRvci5yZXR1cm4/LigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBhd2FpdCBtYXBFcnJvcihlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IHsgQ09NTU9OX09SUENfRVJST1JfREVGUyBhcyBDLCBPUlBDX0NMSUVOVF9QQUNLQUdFX05BTUUgYXMgTywgT1JQQ19DTElFTlRfUEFDS0FHRV9WRVJTSU9OIGFzIGEsIGZhbGxiYWNrT1JQQ0Vycm9yTWVzc2FnZSBhcyBiLCBPUlBDRXJyb3IgYXMgYywgaXNPUlBDRXJyb3JTdGF0dXMgYXMgZCwgaXNPUlBDRXJyb3JKc29uIGFzIGUsIGZhbGxiYWNrT1JQQ0Vycm9yU3RhdHVzIGFzIGYsIGNyZWF0ZU9SUENFcnJvckZyb21Kc29uIGFzIGcsIGlzRGVmaW5lZEVycm9yIGFzIGksIG1hcEV2ZW50SXRlcmF0b3IgYXMgbSwgdG9PUlBDRXJyb3IgYXMgdCB9O1xuIiwiaW1wb3J0IHsgaXNPYmplY3QsIE51bGxQcm90b09iaiB9IGZyb20gJ0BvcnBjL3NoYXJlZCc7XG5cbmNsYXNzIFN0YW5kYXJkQnJhY2tldE5vdGF0aW9uU2VyaWFsaXplciB7XG4gIG1heEFycmF5SW5kZXg7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMubWF4QXJyYXlJbmRleCA9IG9wdGlvbnMubWF4QnJhY2tldE5vdGF0aW9uQXJyYXlJbmRleCA/PyA5OTk5O1xuICB9XG4gIHNlcmlhbGl6ZShkYXRhLCBzZWdtZW50cyA9IFtdLCByZXN1bHQgPSBbXSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICBkYXRhLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgdGhpcy5zZXJpYWxpemUoaXRlbSwgWy4uLnNlZ21lbnRzLCBpXSwgcmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICAgICAgdGhpcy5zZXJpYWxpemUoZGF0YVtrZXldLCBbLi4uc2VnbWVudHMsIGtleV0sIHJlc3VsdCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wdXNoKFt0aGlzLnN0cmluZ2lmeVBhdGgoc2VnbWVudHMpLCBkYXRhXSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZGVzZXJpYWxpemUoc2VyaWFsaXplZCkge1xuICAgIGlmIChzZXJpYWxpemVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjb25zdCBhcnJheVB1c2hTdHlsZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtTZXQoKTtcbiAgICBjb25zdCByZWYgPSB7IHZhbHVlOiBbXSB9O1xuICAgIGZvciAoY29uc3QgW3BhdGgsIHZhbHVlXSBvZiBzZXJpYWxpemVkKSB7XG4gICAgICBjb25zdCBzZWdtZW50cyA9IHRoaXMucGFyc2VQYXRoKHBhdGgpO1xuICAgICAgbGV0IGN1cnJlbnRSZWYgPSByZWY7XG4gICAgICBsZXQgbmV4dFNlZ21lbnQgPSBcInZhbHVlXCI7XG4gICAgICBzZWdtZW50cy5mb3JFYWNoKChzZWdtZW50LCBpKSA9PiB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjdXJyZW50UmVmW25leHRTZWdtZW50XSkgJiYgIWlzT2JqZWN0KGN1cnJlbnRSZWZbbmV4dFNlZ21lbnRdKSkge1xuICAgICAgICAgIGN1cnJlbnRSZWZbbmV4dFNlZ21lbnRdID0gW107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgIT09IHNlZ21lbnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50UmVmW25leHRTZWdtZW50XSkgJiYgIWlzVmFsaWRBcnJheUluZGV4KHNlZ21lbnQsIHRoaXMubWF4QXJyYXlJbmRleCkpIHtcbiAgICAgICAgICAgIGlmIChhcnJheVB1c2hTdHlsZXMuaGFzKGN1cnJlbnRSZWZbbmV4dFNlZ21lbnRdKSkge1xuICAgICAgICAgICAgICBhcnJheVB1c2hTdHlsZXMuZGVsZXRlKGN1cnJlbnRSZWZbbmV4dFNlZ21lbnRdKTtcbiAgICAgICAgICAgICAgY3VycmVudFJlZltuZXh0U2VnbWVudF0gPSBwdXNoU3R5bGVBcnJheVRvT2JqZWN0KGN1cnJlbnRSZWZbbmV4dFNlZ21lbnRdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRSZWZbbmV4dFNlZ21lbnRdID0gYXJyYXlUb09iamVjdChjdXJyZW50UmVmW25leHRTZWdtZW50XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnRSZWZbbmV4dFNlZ21lbnRdKSkge1xuICAgICAgICAgICAgaWYgKHNlZ21lbnQgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRSZWZbbmV4dFNlZ21lbnRdLmxlbmd0aCAmJiAhYXJyYXlQdXNoU3R5bGVzLmhhcyhjdXJyZW50UmVmW25leHRTZWdtZW50XSkpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UmVmW25leHRTZWdtZW50XSA9IGFycmF5VG9PYmplY3QoY3VycmVudFJlZltuZXh0U2VnbWVudF0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoYXJyYXlQdXNoU3R5bGVzLmhhcyhjdXJyZW50UmVmW25leHRTZWdtZW50XSkpIHtcbiAgICAgICAgICAgICAgICBhcnJheVB1c2hTdHlsZXMuZGVsZXRlKGN1cnJlbnRSZWZbbmV4dFNlZ21lbnRdKTtcbiAgICAgICAgICAgICAgICBjdXJyZW50UmVmW25leHRTZWdtZW50XSA9IHB1c2hTdHlsZUFycmF5VG9PYmplY3QoY3VycmVudFJlZltuZXh0U2VnbWVudF0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1ZhbGlkQXJyYXlJbmRleChzZWdtZW50LCB0aGlzLm1heEFycmF5SW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFJlZltuZXh0U2VnbWVudF0gPSBhcnJheVRvT2JqZWN0KGN1cnJlbnRSZWZbbmV4dFNlZ21lbnRdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50UmVmID0gY3VycmVudFJlZltuZXh0U2VnbWVudF07XG4gICAgICAgIG5leHRTZWdtZW50ID0gc2VnbWVudDtcbiAgICAgIH0pO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudFJlZikgJiYgbmV4dFNlZ21lbnQgPT09IFwiXCIpIHtcbiAgICAgICAgYXJyYXlQdXNoU3R5bGVzLmFkZChjdXJyZW50UmVmKTtcbiAgICAgICAgY3VycmVudFJlZi5wdXNoKHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAobmV4dFNlZ21lbnQgaW4gY3VycmVudFJlZikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50UmVmW25leHRTZWdtZW50XSkpIHtcbiAgICAgICAgICBjdXJyZW50UmVmW25leHRTZWdtZW50XS5wdXNoKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdXJyZW50UmVmW25leHRTZWdtZW50XSA9IFtjdXJyZW50UmVmW25leHRTZWdtZW50XSwgdmFsdWVdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50UmVmW25leHRTZWdtZW50XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVmLnZhbHVlO1xuICB9XG4gIHN0cmluZ2lmeVBhdGgoc2VnbWVudHMpIHtcbiAgICByZXR1cm4gc2VnbWVudHMubWFwKChzZWdtZW50KSA9PiB7XG4gICAgICByZXR1cm4gc2VnbWVudC50b1N0cmluZygpLnJlcGxhY2UoL1tcXFxcW1xcXV0vZywgKG1hdGNoKSA9PiB7XG4gICAgICAgIHN3aXRjaCAobWF0Y2gpIHtcbiAgICAgICAgICBjYXNlIFwiXFxcXFwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiXFxcXFxcXFxcIjtcbiAgICAgICAgICBjYXNlIFwiW1wiOlxuICAgICAgICAgICAgcmV0dXJuIFwiXFxcXFtcIjtcbiAgICAgICAgICBjYXNlIFwiXVwiOlxuICAgICAgICAgICAgcmV0dXJuIFwiXFxcXF1cIjtcbiAgICAgICAgICAvKiB2OCBpZ25vcmUgbmV4dCAyICovXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSkucmVkdWNlKChyZXN1bHQsIHNlZ21lbnQsIGkpID0+IHtcbiAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgIHJldHVybiBzZWdtZW50O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAke3Jlc3VsdH1bJHtzZWdtZW50fV1gO1xuICAgIH0sIFwiXCIpO1xuICB9XG4gIHBhcnNlUGF0aChwYXRoKSB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBbXTtcbiAgICBsZXQgaW5CcmFja2V0cyA9IGZhbHNlO1xuICAgIGxldCBjdXJyZW50U2VnbWVudCA9IFwiXCI7XG4gICAgbGV0IGJhY2tzbGFzaENvdW50ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoYXIgPSBwYXRoW2ldO1xuICAgICAgY29uc3QgbmV4dENoYXIgPSBwYXRoW2kgKyAxXTtcbiAgICAgIGlmIChpbkJyYWNrZXRzICYmIGNoYXIgPT09IFwiXVwiICYmIChuZXh0Q2hhciA9PT0gdm9pZCAwIHx8IG5leHRDaGFyID09PSBcIltcIikgJiYgYmFja3NsYXNoQ291bnQgJSAyID09PSAwKSB7XG4gICAgICAgIGlmIChuZXh0Q2hhciA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgaW5CcmFja2V0cyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHNlZ21lbnRzLnB1c2goY3VycmVudFNlZ21lbnQpO1xuICAgICAgICBjdXJyZW50U2VnbWVudCA9IFwiXCI7XG4gICAgICAgIGkrKztcbiAgICAgIH0gZWxzZSBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAwICYmIGNoYXIgPT09IFwiW1wiICYmIGJhY2tzbGFzaENvdW50ICUgMiA9PT0gMCkge1xuICAgICAgICBpbkJyYWNrZXRzID0gdHJ1ZTtcbiAgICAgICAgc2VnbWVudHMucHVzaChjdXJyZW50U2VnbWVudCk7XG4gICAgICAgIGN1cnJlbnRTZWdtZW50ID0gXCJcIjtcbiAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gXCJcXFxcXCIpIHtcbiAgICAgICAgYmFja3NsYXNoQ291bnQrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnRTZWdtZW50ICs9IFwiXFxcXFwiLnJlcGVhdChiYWNrc2xhc2hDb3VudCAvIDIpICsgY2hhcjtcbiAgICAgICAgYmFja3NsYXNoQ291bnQgPSAwO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5CcmFja2V0cyB8fCBzZWdtZW50cy5sZW5ndGggPT09IDAgPyBbcGF0aF0gOiBzZWdtZW50cztcbiAgfVxufVxuZnVuY3Rpb24gaXNWYWxpZEFycmF5SW5kZXgodmFsdWUsIG1heEluZGV4KSB7XG4gIHJldHVybiAvXjAkfF5bMS05XVxcZCokLy50ZXN0KHZhbHVlKSAmJiBOdW1iZXIodmFsdWUpIDw9IG1heEluZGV4O1xufVxuZnVuY3Rpb24gYXJyYXlUb09iamVjdChhcnJheSkge1xuICBjb25zdCBvYmogPSBuZXcgTnVsbFByb3RvT2JqKCk7XG4gIGFycmF5LmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICBvYmpbaV0gPSBpdGVtO1xuICB9KTtcbiAgcmV0dXJuIG9iajtcbn1cbmZ1bmN0aW9uIHB1c2hTdHlsZUFycmF5VG9PYmplY3QoYXJyYXkpIHtcbiAgY29uc3Qgb2JqID0gbmV3IE51bGxQcm90b09iaigpO1xuICBvYmpbXCJcIl0gPSBhcnJheS5sZW5ndGggPT09IDEgPyBhcnJheVswXSA6IGFycmF5O1xuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgeyBTdGFuZGFyZEJyYWNrZXROb3RhdGlvblNlcmlhbGl6ZXIgYXMgUyB9O1xuIiwiaW1wb3J0IHsgdG9BcnJheSwgcnVuV2l0aFNwYW4sIE9SUENfTkFNRSwgaXNBc3luY0l0ZXJhdG9yT2JqZWN0LCBhc3luY0l0ZXJhdG9yV2l0aFNwYW4sIGludGVyY2VwdCwgZ2V0R2xvYmFsT3RlbENvbmZpZywgaXNPYmplY3QsIHZhbHVlLCBzdHJpbmdpZnlKU09OIH0gZnJvbSAnQG9ycGMvc2hhcmVkJztcbmltcG9ydCB7IG1lcmdlU3RhbmRhcmRIZWFkZXJzLCBFcnJvckV2ZW50IH0gZnJvbSAnQG9ycGMvc3RhbmRhcmQtc2VydmVyJztcbmltcG9ydCB7IEMgYXMgQ09NTU9OX09SUENfRVJST1JfREVGUywgZCBhcyBpc09SUENFcnJvclN0YXR1cywgZSBhcyBpc09SUENFcnJvckpzb24sIGcgYXMgY3JlYXRlT1JQQ0Vycm9yRnJvbUpzb24sIGMgYXMgT1JQQ0Vycm9yLCBtIGFzIG1hcEV2ZW50SXRlcmF0b3IsIHQgYXMgdG9PUlBDRXJyb3IgfSBmcm9tICcuL2NsaWVudC5EbWtNZF9HQi5tanMnO1xuaW1wb3J0IHsgdG9TdGFuZGFyZEhlYWRlcnMgYXMgdG9TdGFuZGFyZEhlYWRlcnMkMSB9IGZyb20gJ0BvcnBjL3N0YW5kYXJkLXNlcnZlci1mZXRjaCc7XG5cbmNsYXNzIENvbXBvc2l0ZVN0YW5kYXJkTGlua1BsdWdpbiB7XG4gIHBsdWdpbnM7XG4gIGNvbnN0cnVjdG9yKHBsdWdpbnMgPSBbXSkge1xuICAgIHRoaXMucGx1Z2lucyA9IFsuLi5wbHVnaW5zXS5zb3J0KChhLCBiKSA9PiAoYS5vcmRlciA/PyAwKSAtIChiLm9yZGVyID8/IDApKTtcbiAgfVxuICBpbml0KG9wdGlvbnMpIHtcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMpIHtcbiAgICAgIHBsdWdpbi5pbml0Py4ob3B0aW9ucyk7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIFN0YW5kYXJkTGluayB7XG4gIGNvbnN0cnVjdG9yKGNvZGVjLCBzZW5kZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuY29kZWMgPSBjb2RlYztcbiAgICB0aGlzLnNlbmRlciA9IHNlbmRlcjtcbiAgICBjb25zdCBwbHVnaW4gPSBuZXcgQ29tcG9zaXRlU3RhbmRhcmRMaW5rUGx1Z2luKG9wdGlvbnMucGx1Z2lucyk7XG4gICAgcGx1Z2luLmluaXQob3B0aW9ucyk7XG4gICAgdGhpcy5pbnRlcmNlcHRvcnMgPSB0b0FycmF5KG9wdGlvbnMuaW50ZXJjZXB0b3JzKTtcbiAgICB0aGlzLmNsaWVudEludGVyY2VwdG9ycyA9IHRvQXJyYXkob3B0aW9ucy5jbGllbnRJbnRlcmNlcHRvcnMpO1xuICB9XG4gIGludGVyY2VwdG9ycztcbiAgY2xpZW50SW50ZXJjZXB0b3JzO1xuICBjYWxsKHBhdGgsIGlucHV0LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHJ1bldpdGhTcGFuKFxuICAgICAgeyBuYW1lOiBgJHtPUlBDX05BTUV9LiR7cGF0aC5qb2luKFwiL1wiKX1gLCBzaWduYWw6IG9wdGlvbnMuc2lnbmFsIH0sXG4gICAgICAoc3BhbikgPT4ge1xuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGUoXCJycGMuc3lzdGVtXCIsIE9SUENfTkFNRSk7XG4gICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZShcInJwYy5tZXRob2RcIiwgcGF0aC5qb2luKFwiLlwiKSk7XG4gICAgICAgIGlmIChpc0FzeW5jSXRlcmF0b3JPYmplY3QoaW5wdXQpKSB7XG4gICAgICAgICAgaW5wdXQgPSBhc3luY0l0ZXJhdG9yV2l0aFNwYW4oXG4gICAgICAgICAgICB7IG5hbWU6IFwiY29uc3VtZV9ldmVudF9pdGVyYXRvcl9pbnB1dFwiLCBzaWduYWw6IG9wdGlvbnMuc2lnbmFsIH0sXG4gICAgICAgICAgICBpbnB1dFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGludGVyY2VwdCh0aGlzLmludGVyY2VwdG9ycywgeyAuLi5vcHRpb25zLCBwYXRoLCBpbnB1dCB9LCBhc3luYyAoeyBwYXRoOiBwYXRoMiwgaW5wdXQ6IGlucHV0MiwgLi4ub3B0aW9uczIgfSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG90ZWxDb25maWcgPSBnZXRHbG9iYWxPdGVsQ29uZmlnKCk7XG4gICAgICAgICAgbGV0IG90ZWxDb250ZXh0O1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRTcGFuID0gb3RlbENvbmZpZz8udHJhY2UuZ2V0QWN0aXZlU3BhbigpID8/IHNwYW47XG4gICAgICAgICAgaWYgKGN1cnJlbnRTcGFuICYmIG90ZWxDb25maWcpIHtcbiAgICAgICAgICAgIG90ZWxDb250ZXh0ID0gb3RlbENvbmZpZz8udHJhY2Uuc2V0U3BhbihvdGVsQ29uZmlnLmNvbnRleHQuYWN0aXZlKCksIGN1cnJlbnRTcGFuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVxdWVzdCA9IGF3YWl0IHJ1bldpdGhTcGFuKFxuICAgICAgICAgICAgeyBuYW1lOiBcImVuY29kZV9yZXF1ZXN0XCIsIGNvbnRleHQ6IG90ZWxDb250ZXh0IH0sXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmNvZGVjLmVuY29kZShwYXRoMiwgaW5wdXQyLCBvcHRpb25zMilcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgaW50ZXJjZXB0KFxuICAgICAgICAgICAgdGhpcy5jbGllbnRJbnRlcmNlcHRvcnMsXG4gICAgICAgICAgICB7IC4uLm9wdGlvbnMyLCBpbnB1dDogaW5wdXQyLCBwYXRoOiBwYXRoMiwgcmVxdWVzdCB9LFxuICAgICAgICAgICAgKHsgaW5wdXQ6IGlucHV0MywgcGF0aDogcGF0aDMsIHJlcXVlc3Q6IHJlcXVlc3QyLCAuLi5vcHRpb25zMyB9KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBydW5XaXRoU3BhbihcbiAgICAgICAgICAgICAgICB7IG5hbWU6IFwic2VuZF9yZXF1ZXN0XCIsIHNpZ25hbDogb3B0aW9uczMuc2lnbmFsLCBjb250ZXh0OiBvdGVsQ29udGV4dCB9LFxuICAgICAgICAgICAgICAgICgpID0+IHRoaXMuc2VuZGVyLmNhbGwocmVxdWVzdDIsIG9wdGlvbnMzLCBwYXRoMywgaW5wdXQzKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgcnVuV2l0aFNwYW4oXG4gICAgICAgICAgICB7IG5hbWU6IFwiZGVjb2RlX3Jlc3BvbnNlXCIsIGNvbnRleHQ6IG90ZWxDb250ZXh0IH0sXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmNvZGVjLmRlY29kZShyZXNwb25zZSwgb3B0aW9uczIsIHBhdGgyLCBpbnB1dDIpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoaXNBc3luY0l0ZXJhdG9yT2JqZWN0KG91dHB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBhc3luY0l0ZXJhdG9yV2l0aFNwYW4oXG4gICAgICAgICAgICAgIHsgbmFtZTogXCJjb25zdW1lX2V2ZW50X2l0ZXJhdG9yX291dHB1dFwiLCBzaWduYWw6IG9wdGlvbnMyLnNpZ25hbCB9LFxuICAgICAgICAgICAgICBvdXRwdXRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuY29uc3QgU1RBTkRBUkRfUlBDX0pTT05fU0VSSUFMSVpFUl9CVUlMVF9JTl9UWVBFUyA9IHtcbiAgQklHSU5UOiAwLFxuICBEQVRFOiAxLFxuICBOQU46IDIsXG4gIFVOREVGSU5FRDogMyxcbiAgVVJMOiA0LFxuICBSRUdFWFA6IDUsXG4gIFNFVDogNixcbiAgTUFQOiA3XG59O1xuY2xhc3MgU3RhbmRhcmRSUENKc29uU2VyaWFsaXplciB7XG4gIGN1c3RvbVNlcmlhbGl6ZXJzO1xuICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmN1c3RvbVNlcmlhbGl6ZXJzID0gb3B0aW9ucy5jdXN0b21Kc29uU2VyaWFsaXplcnMgPz8gW107XG4gICAgaWYgKHRoaXMuY3VzdG9tU2VyaWFsaXplcnMubGVuZ3RoICE9PSBuZXcgU2V0KHRoaXMuY3VzdG9tU2VyaWFsaXplcnMubWFwKChjdXN0b20pID0+IGN1c3RvbS50eXBlKSkuc2l6ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ3VzdG9tIHNlcmlhbGl6ZXIgdHlwZSBtdXN0IGJlIHVuaXF1ZS5cIik7XG4gICAgfVxuICB9XG4gIHNlcmlhbGl6ZShkYXRhLCBzZWdtZW50cyA9IFtdLCBtZXRhID0gW10sIG1hcHMgPSBbXSwgYmxvYnMgPSBbXSkge1xuICAgIGZvciAoY29uc3QgY3VzdG9tIG9mIHRoaXMuY3VzdG9tU2VyaWFsaXplcnMpIHtcbiAgICAgIGlmIChjdXN0b20uY29uZGl0aW9uKGRhdGEpKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VyaWFsaXplKGN1c3RvbS5zZXJpYWxpemUoZGF0YSksIHNlZ21lbnRzLCBtZXRhLCBtYXBzLCBibG9icyk7XG4gICAgICAgIG1ldGEucHVzaChbY3VzdG9tLnR5cGUsIC4uLnNlZ21lbnRzXSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgQmxvYikge1xuICAgICAgbWFwcy5wdXNoKHNlZ21lbnRzKTtcbiAgICAgIGJsb2JzLnB1c2goZGF0YSk7XG4gICAgICByZXR1cm4gW2RhdGEsIG1ldGEsIG1hcHMsIGJsb2JzXTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSBcImJpZ2ludFwiKSB7XG4gICAgICBtZXRhLnB1c2goW1NUQU5EQVJEX1JQQ19KU09OX1NFUklBTElaRVJfQlVJTFRfSU5fVFlQRVMuQklHSU5ULCAuLi5zZWdtZW50c10pO1xuICAgICAgcmV0dXJuIFtkYXRhLnRvU3RyaW5nKCksIG1ldGEsIG1hcHMsIGJsb2JzXTtcbiAgICB9XG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICBtZXRhLnB1c2goW1NUQU5EQVJEX1JQQ19KU09OX1NFUklBTElaRVJfQlVJTFRfSU5fVFlQRVMuREFURSwgLi4uc2VnbWVudHNdKTtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4oZGF0YS5nZXRUaW1lKCkpKSB7XG4gICAgICAgIHJldHVybiBbbnVsbCwgbWV0YSwgbWFwcywgYmxvYnNdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtkYXRhLnRvSVNPU3RyaW5nKCksIG1ldGEsIG1hcHMsIGJsb2JzXTtcbiAgICB9XG4gICAgaWYgKE51bWJlci5pc05hTihkYXRhKSkge1xuICAgICAgbWV0YS5wdXNoKFtTVEFOREFSRF9SUENfSlNPTl9TRVJJQUxJWkVSX0JVSUxUX0lOX1RZUEVTLk5BTiwgLi4uc2VnbWVudHNdKTtcbiAgICAgIHJldHVybiBbbnVsbCwgbWV0YSwgbWFwcywgYmxvYnNdO1xuICAgIH1cbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFVSTCkge1xuICAgICAgbWV0YS5wdXNoKFtTVEFOREFSRF9SUENfSlNPTl9TRVJJQUxJWkVSX0JVSUxUX0lOX1RZUEVTLlVSTCwgLi4uc2VnbWVudHNdKTtcbiAgICAgIHJldHVybiBbZGF0YS50b1N0cmluZygpLCBtZXRhLCBtYXBzLCBibG9ic107XG4gICAgfVxuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICBtZXRhLnB1c2goW1NUQU5EQVJEX1JQQ19KU09OX1NFUklBTElaRVJfQlVJTFRfSU5fVFlQRVMuUkVHRVhQLCAuLi5zZWdtZW50c10pO1xuICAgICAgcmV0dXJuIFtkYXRhLnRvU3RyaW5nKCksIG1ldGEsIG1hcHMsIGJsb2JzXTtcbiAgICB9XG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VyaWFsaXplKEFycmF5LmZyb20oZGF0YSksIHNlZ21lbnRzLCBtZXRhLCBtYXBzLCBibG9icyk7XG4gICAgICBtZXRhLnB1c2goW1NUQU5EQVJEX1JQQ19KU09OX1NFUklBTElaRVJfQlVJTFRfSU5fVFlQRVMuU0VULCAuLi5zZWdtZW50c10pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VyaWFsaXplKEFycmF5LmZyb20oZGF0YS5lbnRyaWVzKCkpLCBzZWdtZW50cywgbWV0YSwgbWFwcywgYmxvYnMpO1xuICAgICAgbWV0YS5wdXNoKFtTVEFOREFSRF9SUENfSlNPTl9TRVJJQUxJWkVSX0JVSUxUX0lOX1RZUEVTLk1BUCwgLi4uc2VnbWVudHNdKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICBjb25zdCBqc29uID0gZGF0YS5tYXAoKHYsIGkpID0+IHtcbiAgICAgICAgaWYgKHYgPT09IHZvaWQgMCkge1xuICAgICAgICAgIG1ldGEucHVzaChbU1RBTkRBUkRfUlBDX0pTT05fU0VSSUFMSVpFUl9CVUlMVF9JTl9UWVBFUy5VTkRFRklORUQsIC4uLnNlZ21lbnRzLCBpXSk7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplKHYsIFsuLi5zZWdtZW50cywgaV0sIG1ldGEsIG1hcHMsIGJsb2JzKVswXTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFtqc29uLCBtZXRhLCBtYXBzLCBibG9ic107XG4gICAgfVxuICAgIGlmIChpc09iamVjdChkYXRhKSkge1xuICAgICAgY29uc3QganNvbiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBrIGluIGRhdGEpIHtcbiAgICAgICAgaWYgKGsgPT09IFwidG9KU09OXCIgJiYgdHlwZW9mIGRhdGFba10gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGpzb25ba10gPSB0aGlzLnNlcmlhbGl6ZShkYXRhW2tdLCBbLi4uc2VnbWVudHMsIGtdLCBtZXRhLCBtYXBzLCBibG9icylbMF07XG4gICAgICB9XG4gICAgICByZXR1cm4gW2pzb24sIG1ldGEsIG1hcHMsIGJsb2JzXTtcbiAgICB9XG4gICAgcmV0dXJuIFtkYXRhLCBtZXRhLCBtYXBzLCBibG9ic107XG4gIH1cbiAgZGVzZXJpYWxpemUoanNvbiwgbWV0YSwgbWFwcywgZ2V0QmxvYikge1xuICAgIGNvbnN0IHJlZiA9IHsgZGF0YToganNvbiB9O1xuICAgIGlmIChtYXBzICYmIGdldEJsb2IpIHtcbiAgICAgIG1hcHMuZm9yRWFjaCgoc2VnbWVudHMsIGkpID0+IHtcbiAgICAgICAgbGV0IGN1cnJlbnRSZWYgPSByZWY7XG4gICAgICAgIGxldCBwcmVTZWdtZW50ID0gXCJkYXRhXCI7XG4gICAgICAgIHNlZ21lbnRzLmZvckVhY2goKHNlZ21lbnQpID0+IHtcbiAgICAgICAgICBjdXJyZW50UmVmID0gY3VycmVudFJlZltwcmVTZWdtZW50XTtcbiAgICAgICAgICBwcmVTZWdtZW50ID0gc2VnbWVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIGN1cnJlbnRSZWZbcHJlU2VnbWVudF0gPSBnZXRCbG9iKGkpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBtZXRhKSB7XG4gICAgICBjb25zdCB0eXBlID0gaXRlbVswXTtcbiAgICAgIGxldCBjdXJyZW50UmVmID0gcmVmO1xuICAgICAgbGV0IHByZVNlZ21lbnQgPSBcImRhdGFcIjtcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgaXRlbS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjdXJyZW50UmVmID0gY3VycmVudFJlZltwcmVTZWdtZW50XTtcbiAgICAgICAgcHJlU2VnbWVudCA9IGl0ZW1baV07XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGN1c3RvbSBvZiB0aGlzLmN1c3RvbVNlcmlhbGl6ZXJzKSB7XG4gICAgICAgIGlmIChjdXN0b20udHlwZSA9PT0gdHlwZSkge1xuICAgICAgICAgIGN1cnJlbnRSZWZbcHJlU2VnbWVudF0gPSBjdXN0b20uZGVzZXJpYWxpemUoY3VycmVudFJlZltwcmVTZWdtZW50XSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFNUQU5EQVJEX1JQQ19KU09OX1NFUklBTElaRVJfQlVJTFRfSU5fVFlQRVMuQklHSU5UOlxuICAgICAgICAgIGN1cnJlbnRSZWZbcHJlU2VnbWVudF0gPSBCaWdJbnQoY3VycmVudFJlZltwcmVTZWdtZW50XSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU1RBTkRBUkRfUlBDX0pTT05fU0VSSUFMSVpFUl9CVUlMVF9JTl9UWVBFUy5EQVRFOlxuICAgICAgICAgIGN1cnJlbnRSZWZbcHJlU2VnbWVudF0gPSBuZXcgRGF0ZShjdXJyZW50UmVmW3ByZVNlZ21lbnRdID8/IFwiSW52YWxpZCBEYXRlXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFNUQU5EQVJEX1JQQ19KU09OX1NFUklBTElaRVJfQlVJTFRfSU5fVFlQRVMuTkFOOlxuICAgICAgICAgIGN1cnJlbnRSZWZbcHJlU2VnbWVudF0gPSBOdW1iZXIuTmFOO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFNUQU5EQVJEX1JQQ19KU09OX1NFUklBTElaRVJfQlVJTFRfSU5fVFlQRVMuVU5ERUZJTkVEOlxuICAgICAgICAgIGN1cnJlbnRSZWZbcHJlU2VnbWVudF0gPSB2b2lkIDA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU1RBTkRBUkRfUlBDX0pTT05fU0VSSUFMSVpFUl9CVUlMVF9JTl9UWVBFUy5VUkw6XG4gICAgICAgICAgY3VycmVudFJlZltwcmVTZWdtZW50XSA9IG5ldyBVUkwoY3VycmVudFJlZltwcmVTZWdtZW50XSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU1RBTkRBUkRfUlBDX0pTT05fU0VSSUFMSVpFUl9CVUlMVF9JTl9UWVBFUy5SRUdFWFA6IHtcbiAgICAgICAgICBjb25zdCBbLCBwYXR0ZXJuLCBmbGFnc10gPSBjdXJyZW50UmVmW3ByZVNlZ21lbnRdLm1hdGNoKC9eXFwvKC4qKVxcLyhbYS16XSopJC8pO1xuICAgICAgICAgIGN1cnJlbnRSZWZbcHJlU2VnbWVudF0gPSBuZXcgUmVnRXhwKHBhdHRlcm4sIGZsYWdzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFNUQU5EQVJEX1JQQ19KU09OX1NFUklBTElaRVJfQlVJTFRfSU5fVFlQRVMuU0VUOlxuICAgICAgICAgIGN1cnJlbnRSZWZbcHJlU2VnbWVudF0gPSBuZXcgU2V0KGN1cnJlbnRSZWZbcHJlU2VnbWVudF0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFNUQU5EQVJEX1JQQ19KU09OX1NFUklBTElaRVJfQlVJTFRfSU5fVFlQRVMuTUFQOlxuICAgICAgICAgIGN1cnJlbnRSZWZbcHJlU2VnbWVudF0gPSBuZXcgTWFwKGN1cnJlbnRSZWZbcHJlU2VnbWVudF0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVmLmRhdGE7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9IdHRwUGF0aChwYXRoKSB7XG4gIHJldHVybiBgLyR7cGF0aC5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKFwiL1wiKX1gO1xufVxuZnVuY3Rpb24gdG9TdGFuZGFyZEhlYWRlcnMoaGVhZGVycykge1xuICBpZiAodHlwZW9mIGhlYWRlcnMuZm9yRWFjaCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIHRvU3RhbmRhcmRIZWFkZXJzJDEoaGVhZGVycyk7XG4gIH1cbiAgcmV0dXJuIGhlYWRlcnM7XG59XG5mdW5jdGlvbiBnZXRNYWxmb3JtZWRSZXNwb25zZUVycm9yQ29kZShzdGF0dXMpIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKENPTU1PTl9PUlBDX0VSUk9SX0RFRlMpLmZpbmQoKFssIGRlZl0pID0+IGRlZi5zdGF0dXMgPT09IHN0YXR1cyk/LlswXSA/PyBcIk1BTEZPUk1FRF9PUlBDX0VSUk9SX1JFU1BPTlNFXCI7XG59XG5cbmNsYXNzIFN0YW5kYXJkUlBDTGlua0NvZGVjIHtcbiAgY29uc3RydWN0b3Ioc2VyaWFsaXplciwgb3B0aW9ucykge1xuICAgIHRoaXMuc2VyaWFsaXplciA9IHNlcmlhbGl6ZXI7XG4gICAgdGhpcy5iYXNlVXJsID0gb3B0aW9ucy51cmw7XG4gICAgdGhpcy5tYXhVcmxMZW5ndGggPSBvcHRpb25zLm1heFVybExlbmd0aCA/PyAyMDgzO1xuICAgIHRoaXMuZmFsbGJhY2tNZXRob2QgPSBvcHRpb25zLmZhbGxiYWNrTWV0aG9kID8/IFwiUE9TVFwiO1xuICAgIHRoaXMuZXhwZWN0ZWRNZXRob2QgPSBvcHRpb25zLm1ldGhvZCA/PyB0aGlzLmZhbGxiYWNrTWV0aG9kO1xuICAgIHRoaXMuaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycyA/PyB7fTtcbiAgfVxuICBiYXNlVXJsO1xuICBtYXhVcmxMZW5ndGg7XG4gIGZhbGxiYWNrTWV0aG9kO1xuICBleHBlY3RlZE1ldGhvZDtcbiAgaGVhZGVycztcbiAgYXN5bmMgZW5jb2RlKHBhdGgsIGlucHV0LCBvcHRpb25zKSB7XG4gICAgbGV0IGhlYWRlcnMgPSB0b1N0YW5kYXJkSGVhZGVycyhhd2FpdCB2YWx1ZSh0aGlzLmhlYWRlcnMsIG9wdGlvbnMsIHBhdGgsIGlucHV0KSk7XG4gICAgaWYgKG9wdGlvbnMubGFzdEV2ZW50SWQgIT09IHZvaWQgMCkge1xuICAgICAgaGVhZGVycyA9IG1lcmdlU3RhbmRhcmRIZWFkZXJzKGhlYWRlcnMsIHsgXCJsYXN0LWV2ZW50LWlkXCI6IG9wdGlvbnMubGFzdEV2ZW50SWQgfSk7XG4gICAgfVxuICAgIGNvbnN0IGV4cGVjdGVkTWV0aG9kID0gYXdhaXQgdmFsdWUodGhpcy5leHBlY3RlZE1ldGhvZCwgb3B0aW9ucywgcGF0aCwgaW5wdXQpO1xuICAgIGNvbnN0IGJhc2VVcmwgPSBhd2FpdCB2YWx1ZSh0aGlzLmJhc2VVcmwsIG9wdGlvbnMsIHBhdGgsIGlucHV0KTtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGJhc2VVcmwpO1xuICAgIHVybC5wYXRobmFtZSA9IGAke3VybC5wYXRobmFtZS5yZXBsYWNlKC9cXC8kLywgXCJcIil9JHt0b0h0dHBQYXRoKHBhdGgpfWA7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUoaW5wdXQpO1xuICAgIGlmIChleHBlY3RlZE1ldGhvZCA9PT0gXCJHRVRcIiAmJiAhKHNlcmlhbGl6ZWQgaW5zdGFuY2VvZiBGb3JtRGF0YSkgJiYgIWlzQXN5bmNJdGVyYXRvck9iamVjdChzZXJpYWxpemVkKSkge1xuICAgICAgY29uc3QgbWF4VXJsTGVuZ3RoID0gYXdhaXQgdmFsdWUodGhpcy5tYXhVcmxMZW5ndGgsIG9wdGlvbnMsIHBhdGgsIGlucHV0KTtcbiAgICAgIGNvbnN0IGdldFVybCA9IG5ldyBVUkwodXJsKTtcbiAgICAgIGdldFVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFwiZGF0YVwiLCBzdHJpbmdpZnlKU09OKHNlcmlhbGl6ZWQpKTtcbiAgICAgIGlmIChnZXRVcmwudG9TdHJpbmcoKS5sZW5ndGggPD0gbWF4VXJsTGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYm9keTogdm9pZCAwLFxuICAgICAgICAgIG1ldGhvZDogZXhwZWN0ZWRNZXRob2QsXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICB1cmw6IGdldFVybCxcbiAgICAgICAgICBzaWduYWw6IG9wdGlvbnMuc2lnbmFsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB1cmwsXG4gICAgICBtZXRob2Q6IGV4cGVjdGVkTWV0aG9kID09PSBcIkdFVFwiID8gdGhpcy5mYWxsYmFja01ldGhvZCA6IGV4cGVjdGVkTWV0aG9kLFxuICAgICAgaGVhZGVycyxcbiAgICAgIGJvZHk6IHNlcmlhbGl6ZWQsXG4gICAgICBzaWduYWw6IG9wdGlvbnMuc2lnbmFsXG4gICAgfTtcbiAgfVxuICBhc3luYyBkZWNvZGUocmVzcG9uc2UpIHtcbiAgICBjb25zdCBpc09rID0gIWlzT1JQQ0Vycm9yU3RhdHVzKHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgY29uc3QgZGVzZXJpYWxpemVkID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBpc0JvZHlPayA9IGZhbHNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3BvbnNlLmJvZHkoKTtcbiAgICAgICAgaXNCb2R5T2sgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGJvZHkpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFpc0JvZHlPaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBwYXJzZSByZXNwb25zZSBib2R5LCBwbGVhc2UgY2hlY2sgdGhlIHJlc3BvbnNlIGJvZHkgYW5kIGNvbnRlbnQtdHlwZS5cIiwge1xuICAgICAgICAgICAgY2F1c2U6IGVycm9yXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBSUEMgcmVzcG9uc2UgZm9ybWF0LlwiLCB7XG4gICAgICAgICAgY2F1c2U6IGVycm9yXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pKCk7XG4gICAgaWYgKCFpc09rKSB7XG4gICAgICBpZiAoaXNPUlBDRXJyb3JKc29uKGRlc2VyaWFsaXplZCkpIHtcbiAgICAgICAgdGhyb3cgY3JlYXRlT1JQQ0Vycm9yRnJvbUpzb24oZGVzZXJpYWxpemVkKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBPUlBDRXJyb3IoZ2V0TWFsZm9ybWVkUmVzcG9uc2VFcnJvckNvZGUocmVzcG9uc2Uuc3RhdHVzKSwge1xuICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgZGF0YTogeyAuLi5yZXNwb25zZSwgYm9keTogZGVzZXJpYWxpemVkIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZGVzZXJpYWxpemVkO1xuICB9XG59XG5cbmNsYXNzIFN0YW5kYXJkUlBDU2VyaWFsaXplciB7XG4gIGNvbnN0cnVjdG9yKGpzb25TZXJpYWxpemVyKSB7XG4gICAgdGhpcy5qc29uU2VyaWFsaXplciA9IGpzb25TZXJpYWxpemVyO1xuICB9XG4gIHNlcmlhbGl6ZShkYXRhKSB7XG4gICAgaWYgKGlzQXN5bmNJdGVyYXRvck9iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuIG1hcEV2ZW50SXRlcmF0b3IoZGF0YSwge1xuICAgICAgICB2YWx1ZTogYXN5bmMgKHZhbHVlKSA9PiB0aGlzLiNzZXJpYWxpemUodmFsdWUsIGZhbHNlKSxcbiAgICAgICAgZXJyb3I6IGFzeW5jIChlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBFcnJvckV2ZW50KHtcbiAgICAgICAgICAgIGRhdGE6IHRoaXMuI3NlcmlhbGl6ZSh0b09SUENFcnJvcihlKS50b0pTT04oKSwgZmFsc2UpLFxuICAgICAgICAgICAgY2F1c2U6IGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLiNzZXJpYWxpemUoZGF0YSwgdHJ1ZSk7XG4gIH1cbiAgI3NlcmlhbGl6ZShkYXRhLCBlbmFibGVGb3JtRGF0YSkge1xuICAgIGNvbnN0IFtqc29uLCBtZXRhXywgbWFwcywgYmxvYnNdID0gdGhpcy5qc29uU2VyaWFsaXplci5zZXJpYWxpemUoZGF0YSk7XG4gICAgY29uc3QgbWV0YSA9IG1ldGFfLmxlbmd0aCA9PT0gMCA/IHZvaWQgMCA6IG1ldGFfO1xuICAgIGlmICghZW5hYmxlRm9ybURhdGEgfHwgYmxvYnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBqc29uLFxuICAgICAgICBtZXRhXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgZm9ybS5zZXQoXCJkYXRhXCIsIHN0cmluZ2lmeUpTT04oeyBqc29uLCBtZXRhLCBtYXBzIH0pKTtcbiAgICBibG9icy5mb3JFYWNoKChibG9iLCBpKSA9PiB7XG4gICAgICBmb3JtLnNldChpLnRvU3RyaW5nKCksIGJsb2IpO1xuICAgIH0pO1xuICAgIHJldHVybiBmb3JtO1xuICB9XG4gIGRlc2VyaWFsaXplKGRhdGEpIHtcbiAgICBpZiAoaXNBc3luY0l0ZXJhdG9yT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm4gbWFwRXZlbnRJdGVyYXRvcihkYXRhLCB7XG4gICAgICAgIHZhbHVlOiBhc3luYyAodmFsdWUpID0+IHRoaXMuI2Rlc2VyaWFsaXplKHZhbHVlKSxcbiAgICAgICAgZXJyb3I6IGFzeW5jIChlKSA9PiB7XG4gICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIEVycm9yRXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZGVzZXJpYWxpemVkID0gdGhpcy4jZGVzZXJpYWxpemUoZS5kYXRhKTtcbiAgICAgICAgICBpZiAoaXNPUlBDRXJyb3JKc29uKGRlc2VyaWFsaXplZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVPUlBDRXJyb3JGcm9tSnNvbihkZXNlcmlhbGl6ZWQsIHsgY2F1c2U6IGUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgRXJyb3JFdmVudCh7XG4gICAgICAgICAgICBkYXRhOiBkZXNlcmlhbGl6ZWQsXG4gICAgICAgICAgICBjYXVzZTogZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuI2Rlc2VyaWFsaXplKGRhdGEpO1xuICB9XG4gICNkZXNlcmlhbGl6ZShkYXRhKSB7XG4gICAgaWYgKGRhdGEgPT09IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9XG4gICAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIEZvcm1EYXRhKSkge1xuICAgICAgcmV0dXJuIHRoaXMuanNvblNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGF0YS5qc29uLCBkYXRhLm1ldGEgPz8gW10pO1xuICAgIH1cbiAgICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5wYXJzZShkYXRhLmdldChcImRhdGFcIikpO1xuICAgIHJldHVybiB0aGlzLmpzb25TZXJpYWxpemVyLmRlc2VyaWFsaXplKFxuICAgICAgc2VyaWFsaXplZC5qc29uLFxuICAgICAgc2VyaWFsaXplZC5tZXRhID8/IFtdLFxuICAgICAgc2VyaWFsaXplZC5tYXBzLFxuICAgICAgKGkpID0+IGRhdGEuZ2V0KGkudG9TdHJpbmcoKSlcbiAgICApO1xuICB9XG59XG5cbmNsYXNzIFN0YW5kYXJkUlBDTGluayBleHRlbmRzIFN0YW5kYXJkTGluayB7XG4gIGNvbnN0cnVjdG9yKGxpbmtDbGllbnQsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBqc29uU2VyaWFsaXplciA9IG5ldyBTdGFuZGFyZFJQQ0pzb25TZXJpYWxpemVyKG9wdGlvbnMpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgU3RhbmRhcmRSUENTZXJpYWxpemVyKGpzb25TZXJpYWxpemVyKTtcbiAgICBjb25zdCBsaW5rQ29kZWMgPSBuZXcgU3RhbmRhcmRSUENMaW5rQ29kZWMoc2VyaWFsaXplciwgb3B0aW9ucyk7XG4gICAgc3VwZXIobGlua0NvZGVjLCBsaW5rQ2xpZW50LCBvcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgeyBDb21wb3NpdGVTdGFuZGFyZExpbmtQbHVnaW4gYXMgQywgU3RhbmRhcmRMaW5rIGFzIFMsIFNUQU5EQVJEX1JQQ19KU09OX1NFUklBTElaRVJfQlVJTFRfSU5fVFlQRVMgYXMgYSwgU3RhbmRhcmRSUENKc29uU2VyaWFsaXplciBhcyBiLCBTdGFuZGFyZFJQQ0xpbmsgYXMgYywgU3RhbmRhcmRSUENMaW5rQ29kZWMgYXMgZCwgU3RhbmRhcmRSUENTZXJpYWxpemVyIGFzIGUsIHRvU3RhbmRhcmRIZWFkZXJzIGFzIGYsIGdldE1hbGZvcm1lZFJlc3BvbnNlRXJyb3JDb2RlIGFzIGcsIHRvSHR0cFBhdGggYXMgdCB9O1xuIiwiaW1wb3J0IHsgdG9TdGFuZGFyZEhlYWRlcnMsIHRvSHR0cFBhdGgsIGdldE1hbGZvcm1lZFJlc3BvbnNlRXJyb3JDb2RlLCBTdGFuZGFyZExpbmsgfSBmcm9tICdAb3JwYy9jbGllbnQvc3RhbmRhcmQnO1xuaW1wb3J0IHsgUyBhcyBTdGFuZGFyZEJyYWNrZXROb3RhdGlvblNlcmlhbGl6ZXIgfSBmcm9tICcuL29wZW5hcGktY2xpZW50LnQ5ZkNBZTN4Lm1qcyc7XG5pbXBvcnQgeyBpc09iamVjdCwgdmFsdWUsIGdldCwgaXNBc3luY0l0ZXJhdG9yT2JqZWN0IH0gZnJvbSAnQG9ycGMvc2hhcmVkJztcbmltcG9ydCB7IGlzT1JQQ0Vycm9yU3RhdHVzLCBpc09SUENFcnJvckpzb24sIGNyZWF0ZU9SUENFcnJvckZyb21Kc29uLCBtYXBFdmVudEl0ZXJhdG9yLCB0b09SUENFcnJvciB9IGZyb20gJ0BvcnBjL2NsaWVudCc7XG5pbXBvcnQgeyBpc0NvbnRyYWN0UHJvY2VkdXJlLCBmYWxsYmFja0NvbnRyYWN0Q29uZmlnLCBPUlBDRXJyb3IgfSBmcm9tICdAb3JwYy9jb250cmFjdCc7XG5pbXBvcnQgeyBtZXJnZVN0YW5kYXJkSGVhZGVycywgRXJyb3JFdmVudCB9IGZyb20gJ0BvcnBjL3N0YW5kYXJkLXNlcnZlcic7XG5cbmNsYXNzIFN0YW5kYXJkT3BlbkFQSUpzb25TZXJpYWxpemVyIHtcbiAgY3VzdG9tU2VyaWFsaXplcnM7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuY3VzdG9tU2VyaWFsaXplcnMgPSBvcHRpb25zLmN1c3RvbUpzb25TZXJpYWxpemVycyA/PyBbXTtcbiAgfVxuICBzZXJpYWxpemUoZGF0YSwgaGFzQmxvYlJlZiA9IHsgdmFsdWU6IGZhbHNlIH0pIHtcbiAgICBmb3IgKGNvbnN0IGN1c3RvbSBvZiB0aGlzLmN1c3RvbVNlcmlhbGl6ZXJzKSB7XG4gICAgICBpZiAoY3VzdG9tLmNvbmRpdGlvbihkYXRhKSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlcmlhbGl6ZShjdXN0b20uc2VyaWFsaXplKGRhdGEpLCBoYXNCbG9iUmVmKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgICBoYXNCbG9iUmVmLnZhbHVlID0gdHJ1ZTtcbiAgICAgIHJldHVybiBbZGF0YSwgaGFzQmxvYlJlZi52YWx1ZV07XG4gICAgfVxuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemUoQXJyYXkuZnJvbShkYXRhKSwgaGFzQmxvYlJlZik7XG4gICAgfVxuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemUoQXJyYXkuZnJvbShkYXRhLmVudHJpZXMoKSksIGhhc0Jsb2JSZWYpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgY29uc3QganNvbiA9IGRhdGEubWFwKCh2KSA9PiB2ID09PSB2b2lkIDAgPyBudWxsIDogdGhpcy5zZXJpYWxpemUodiwgaGFzQmxvYlJlZilbMF0pO1xuICAgICAgcmV0dXJuIFtqc29uLCBoYXNCbG9iUmVmLnZhbHVlXTtcbiAgICB9XG4gICAgaWYgKGlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICBjb25zdCBqc29uID0ge307XG4gICAgICBmb3IgKGNvbnN0IGsgaW4gZGF0YSkge1xuICAgICAgICBpZiAoayA9PT0gXCJ0b0pTT05cIiAmJiB0eXBlb2YgZGF0YVtrXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAganNvbltrXSA9IHRoaXMuc2VyaWFsaXplKGRhdGFba10sIGhhc0Jsb2JSZWYpWzBdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtqc29uLCBoYXNCbG9iUmVmLnZhbHVlXTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSBcImJpZ2ludFwiIHx8IGRhdGEgaW5zdGFuY2VvZiBSZWdFeHAgfHwgZGF0YSBpbnN0YW5jZW9mIFVSTCkge1xuICAgICAgcmV0dXJuIFtkYXRhLnRvU3RyaW5nKCksIGhhc0Jsb2JSZWYudmFsdWVdO1xuICAgIH1cbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIHJldHVybiBbTnVtYmVyLmlzTmFOKGRhdGEuZ2V0VGltZSgpKSA/IG51bGwgOiBkYXRhLnRvSVNPU3RyaW5nKCksIGhhc0Jsb2JSZWYudmFsdWVdO1xuICAgIH1cbiAgICBpZiAoTnVtYmVyLmlzTmFOKGRhdGEpKSB7XG4gICAgICByZXR1cm4gW251bGwsIGhhc0Jsb2JSZWYudmFsdWVdO1xuICAgIH1cbiAgICByZXR1cm4gW2RhdGEsIGhhc0Jsb2JSZWYudmFsdWVdO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0YW5kYXJkaXplSFRUUFBhdGgocGF0aCkge1xuICByZXR1cm4gYC8ke3BhdGgucmVwbGFjZSgvXFwvezIsfS9nLCBcIi9cIikucmVwbGFjZSgvXlxcL3xcXC8kL2csIFwiXCIpfWA7XG59XG5mdW5jdGlvbiBnZXREeW5hbWljUGFyYW1zKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGggPyBzdGFuZGFyZGl6ZUhUVFBQYXRoKHBhdGgpLm1hdGNoKC9cXC9cXHtbXn1dK1xcfS9nKT8ubWFwKCh2KSA9PiAoe1xuICAgIHJhdzogdixcbiAgICBuYW1lOiB2Lm1hdGNoKC9cXHtcXCs/KFtefV0rKVxcfS8pWzFdXG4gIH0pKSA6IHZvaWQgMDtcbn1cblxuY2xhc3MgU3RhbmRhcmRPcGVuYXBpTGlua0NvZGVjIHtcbiAgY29uc3RydWN0b3IoY29udHJhY3QsIHNlcmlhbGl6ZXIsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmNvbnRyYWN0ID0gY29udHJhY3Q7XG4gICAgdGhpcy5zZXJpYWxpemVyID0gc2VyaWFsaXplcjtcbiAgICB0aGlzLmJhc2VVcmwgPSBvcHRpb25zLnVybDtcbiAgICB0aGlzLmhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgPz8ge307XG4gICAgdGhpcy5jdXN0b21FcnJvclJlc3BvbnNlQm9keURlY29kZXIgPSBvcHRpb25zLmN1c3RvbUVycm9yUmVzcG9uc2VCb2R5RGVjb2RlcjtcbiAgfVxuICBiYXNlVXJsO1xuICBoZWFkZXJzO1xuICBjdXN0b21FcnJvclJlc3BvbnNlQm9keURlY29kZXI7XG4gIGFzeW5jIGVuY29kZShwYXRoLCBpbnB1dCwgb3B0aW9ucykge1xuICAgIGxldCBoZWFkZXJzID0gdG9TdGFuZGFyZEhlYWRlcnMoYXdhaXQgdmFsdWUodGhpcy5oZWFkZXJzLCBvcHRpb25zLCBwYXRoLCBpbnB1dCkpO1xuICAgIGlmIChvcHRpb25zLmxhc3RFdmVudElkICE9PSB2b2lkIDApIHtcbiAgICAgIGhlYWRlcnMgPSBtZXJnZVN0YW5kYXJkSGVhZGVycyhoZWFkZXJzLCB7IFwibGFzdC1ldmVudC1pZFwiOiBvcHRpb25zLmxhc3RFdmVudElkIH0pO1xuICAgIH1cbiAgICBjb25zdCBiYXNlVXJsID0gYXdhaXQgdmFsdWUodGhpcy5iYXNlVXJsLCBvcHRpb25zLCBwYXRoLCBpbnB1dCk7XG4gICAgY29uc3QgcHJvY2VkdXJlID0gZ2V0KHRoaXMuY29udHJhY3QsIHBhdGgpO1xuICAgIGlmICghaXNDb250cmFjdFByb2NlZHVyZShwcm9jZWR1cmUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtTdGFuZGFyZE9wZW5hcGlMaW5rQ29kZWNdIGV4cGVjdCBhIGNvbnRyYWN0IHByb2NlZHVyZSBhdCAke3BhdGguam9pbihcIi5cIil9YCk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0U3RydWN0dXJlID0gZmFsbGJhY2tDb250cmFjdENvbmZpZyhcImRlZmF1bHRJbnB1dFN0cnVjdHVyZVwiLCBwcm9jZWR1cmVbXCJ+b3JwY1wiXS5yb3V0ZS5pbnB1dFN0cnVjdHVyZSk7XG4gICAgcmV0dXJuIGlucHV0U3RydWN0dXJlID09PSBcImNvbXBhY3RcIiA/IHRoaXMuI2VuY29kZUNvbXBhY3QocHJvY2VkdXJlLCBwYXRoLCBpbnB1dCwgb3B0aW9ucywgYmFzZVVybCwgaGVhZGVycykgOiB0aGlzLiNlbmNvZGVEZXRhaWxlZChwcm9jZWR1cmUsIHBhdGgsIGlucHV0LCBvcHRpb25zLCBiYXNlVXJsLCBoZWFkZXJzKTtcbiAgfVxuICAjZW5jb2RlQ29tcGFjdChwcm9jZWR1cmUsIHBhdGgsIGlucHV0LCBvcHRpb25zLCBiYXNlVXJsLCBoZWFkZXJzKSB7XG4gICAgbGV0IGh0dHBQYXRoID0gc3RhbmRhcmRpemVIVFRQUGF0aChwcm9jZWR1cmVbXCJ+b3JwY1wiXS5yb3V0ZS5wYXRoID8/IHRvSHR0cFBhdGgocGF0aCkpO1xuICAgIGxldCBodHRwQm9keSA9IGlucHV0O1xuICAgIGNvbnN0IGR5bmFtaWNQYXJhbXMgPSBnZXREeW5hbWljUGFyYW1zKGh0dHBQYXRoKTtcbiAgICBpZiAoZHluYW1pY1BhcmFtcz8ubGVuZ3RoKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KGlucHV0KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBbU3RhbmRhcmRPcGVuYXBpTGlua0NvZGVjXSBJbnZhbGlkIGlucHV0IHNoYXBlIGZvciBcImNvbXBhY3RcIiBzdHJ1Y3R1cmUgd2hlbiBoYXMgZHluYW1pYyBwYXJhbXMgYXQgJHtwYXRoLmpvaW4oXCIuXCIpfS5gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJvZHkgPSB7IC4uLmlucHV0IH07XG4gICAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIGR5bmFtaWNQYXJhbXMpIHtcbiAgICAgICAgY29uc3QgdmFsdWUyID0gaW5wdXRbcGFyYW0ubmFtZV07XG4gICAgICAgIGh0dHBQYXRoID0gaHR0cFBhdGgucmVwbGFjZShwYXJhbS5yYXcsIGAvJHtlbmNvZGVVUklDb21wb25lbnQoYCR7dGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZSh2YWx1ZTIpfWApfWApO1xuICAgICAgICBkZWxldGUgYm9keVtwYXJhbS5uYW1lXTtcbiAgICAgIH1cbiAgICAgIGh0dHBCb2R5ID0gT2JqZWN0LmtleXMoYm9keSkubGVuZ3RoID8gYm9keSA6IHZvaWQgMDtcbiAgICB9XG4gICAgY29uc3QgbWV0aG9kID0gZmFsbGJhY2tDb250cmFjdENvbmZpZyhcImRlZmF1bHRNZXRob2RcIiwgcHJvY2VkdXJlW1wifm9ycGNcIl0ucm91dGUubWV0aG9kKTtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGJhc2VVcmwpO1xuICAgIHVybC5wYXRobmFtZSA9IGAke3VybC5wYXRobmFtZS5yZXBsYWNlKC9cXC8kLywgXCJcIil9JHtodHRwUGF0aH1gO1xuICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGh0dHBCb2R5LCB7IG91dHB1dEZvcm1hdDogXCJVUkxTZWFyY2hQYXJhbXNcIiB9KTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWUyXSBvZiBzZXJpYWxpemVkKSB7XG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgdmFsdWUyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVybCxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBib2R5OiB2b2lkIDAsXG4gICAgICAgIHNpZ25hbDogb3B0aW9ucy5zaWduYWxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB1cmwsXG4gICAgICBtZXRob2QsXG4gICAgICBoZWFkZXJzLFxuICAgICAgYm9keTogdGhpcy5zZXJpYWxpemVyLnNlcmlhbGl6ZShodHRwQm9keSksXG4gICAgICBzaWduYWw6IG9wdGlvbnMuc2lnbmFsXG4gICAgfTtcbiAgfVxuICAjZW5jb2RlRGV0YWlsZWQocHJvY2VkdXJlLCBwYXRoLCBpbnB1dCwgb3B0aW9ucywgYmFzZVVybCwgaGVhZGVycykge1xuICAgIGxldCBodHRwUGF0aCA9IHN0YW5kYXJkaXplSFRUUFBhdGgocHJvY2VkdXJlW1wifm9ycGNcIl0ucm91dGUucGF0aCA/PyB0b0h0dHBQYXRoKHBhdGgpKTtcbiAgICBjb25zdCBkeW5hbWljUGFyYW1zID0gZ2V0RHluYW1pY1BhcmFtcyhodHRwUGF0aCk7XG4gICAgaWYgKCFpc09iamVjdChpbnB1dCkgJiYgaW5wdXQgIT09IHZvaWQgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgW1N0YW5kYXJkT3BlbmFwaUxpbmtDb2RlY10gSW52YWxpZCBpbnB1dCBzaGFwZSBmb3IgXCJkZXRhaWxlZFwiIHN0cnVjdHVyZSBhdCAke3BhdGguam9pbihcIi5cIil9LmApO1xuICAgIH1cbiAgICBpZiAoZHluYW1pY1BhcmFtcz8ubGVuZ3RoKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KGlucHV0Py5wYXJhbXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFtTdGFuZGFyZE9wZW5hcGlMaW5rQ29kZWNdIEludmFsaWQgaW5wdXQucGFyYW1zIHNoYXBlIGZvciBcImRldGFpbGVkXCIgc3RydWN0dXJlIHdoZW4gaGFzIGR5bmFtaWMgcGFyYW1zIGF0ICR7cGF0aC5qb2luKFwiLlwiKX0uYCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIGR5bmFtaWNQYXJhbXMpIHtcbiAgICAgICAgY29uc3QgdmFsdWUyID0gaW5wdXQucGFyYW1zW3BhcmFtLm5hbWVdO1xuICAgICAgICBodHRwUGF0aCA9IGh0dHBQYXRoLnJlcGxhY2UocGFyYW0ucmF3LCBgLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGAke3RoaXMuc2VyaWFsaXplci5zZXJpYWxpemUodmFsdWUyKX1gKX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IG1lcmdlZEhlYWRlcnMgPSBoZWFkZXJzO1xuICAgIGlmIChpbnB1dD8uaGVhZGVycyAhPT0gdm9pZCAwKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KGlucHV0LmhlYWRlcnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFtTdGFuZGFyZE9wZW5hcGlMaW5rQ29kZWNdIEludmFsaWQgaW5wdXQuaGVhZGVycyBzaGFwZSBmb3IgXCJkZXRhaWxlZFwiIHN0cnVjdHVyZSBhdCAke3BhdGguam9pbihcIi5cIil9LmApO1xuICAgICAgfVxuICAgICAgbWVyZ2VkSGVhZGVycyA9IG1lcmdlU3RhbmRhcmRIZWFkZXJzKGlucHV0LmhlYWRlcnMsIGhlYWRlcnMpO1xuICAgIH1cbiAgICBjb25zdCBtZXRob2QgPSBmYWxsYmFja0NvbnRyYWN0Q29uZmlnKFwiZGVmYXVsdE1ldGhvZFwiLCBwcm9jZWR1cmVbXCJ+b3JwY1wiXS5yb3V0ZS5tZXRob2QpO1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoYmFzZVVybCk7XG4gICAgdXJsLnBhdGhuYW1lID0gYCR7dXJsLnBhdGhuYW1lLnJlcGxhY2UoL1xcLyQvLCBcIlwiKX0ke2h0dHBQYXRofWA7XG4gICAgaWYgKGlucHV0Py5xdWVyeSAhPT0gdm9pZCAwKSB7XG4gICAgICBjb25zdCBxdWVyeSA9IHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUoaW5wdXQucXVlcnksIHsgb3V0cHV0Rm9ybWF0OiBcIlVSTFNlYXJjaFBhcmFtc1wiIH0pO1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZTJdIG9mIHF1ZXJ5KSB7XG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgdmFsdWUyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXJsLFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIGhlYWRlcnM6IG1lcmdlZEhlYWRlcnMsXG4gICAgICAgIGJvZHk6IHZvaWQgMCxcbiAgICAgICAgc2lnbmFsOiBvcHRpb25zLnNpZ25hbFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHVybCxcbiAgICAgIG1ldGhvZCxcbiAgICAgIGhlYWRlcnM6IG1lcmdlZEhlYWRlcnMsXG4gICAgICBib2R5OiB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGlucHV0Py5ib2R5KSxcbiAgICAgIHNpZ25hbDogb3B0aW9ucy5zaWduYWxcbiAgICB9O1xuICB9XG4gIGFzeW5jIGRlY29kZShyZXNwb25zZSwgX29wdGlvbnMsIHBhdGgpIHtcbiAgICBjb25zdCBpc09rID0gIWlzT1JQQ0Vycm9yU3RhdHVzKHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgY29uc3QgZGVzZXJpYWxpemVkID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBpc0JvZHlPayA9IGZhbHNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3BvbnNlLmJvZHkoKTtcbiAgICAgICAgaXNCb2R5T2sgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGJvZHkpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFpc0JvZHlPaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBwYXJzZSByZXNwb25zZSBib2R5LCBwbGVhc2UgY2hlY2sgdGhlIHJlc3BvbnNlIGJvZHkgYW5kIGNvbnRlbnQtdHlwZS5cIiwge1xuICAgICAgICAgICAgY2F1c2U6IGVycm9yXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBPcGVuQVBJIHJlc3BvbnNlIGZvcm1hdC5cIiwge1xuICAgICAgICAgIGNhdXNlOiBlcnJvclxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIGlmICghaXNPaykge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmN1c3RvbUVycm9yUmVzcG9uc2VCb2R5RGVjb2Rlcj8uKGRlc2VyaWFsaXplZCwgcmVzcG9uc2UpO1xuICAgICAgaWYgKGVycm9yICE9PSBudWxsICYmIGVycm9yICE9PSB2b2lkIDApIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoaXNPUlBDRXJyb3JKc29uKGRlc2VyaWFsaXplZCkpIHtcbiAgICAgICAgdGhyb3cgY3JlYXRlT1JQQ0Vycm9yRnJvbUpzb24oZGVzZXJpYWxpemVkKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBPUlBDRXJyb3IoZ2V0TWFsZm9ybWVkUmVzcG9uc2VFcnJvckNvZGUocmVzcG9uc2Uuc3RhdHVzKSwge1xuICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgZGF0YTogeyAuLi5yZXNwb25zZSwgYm9keTogZGVzZXJpYWxpemVkIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBwcm9jZWR1cmUgPSBnZXQodGhpcy5jb250cmFjdCwgcGF0aCk7XG4gICAgaWYgKCFpc0NvbnRyYWN0UHJvY2VkdXJlKHByb2NlZHVyZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1N0YW5kYXJkT3BlbmFwaUxpbmtDb2RlY10gZXhwZWN0IGEgY29udHJhY3QgcHJvY2VkdXJlIGF0ICR7cGF0aC5qb2luKFwiLlwiKX1gKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0U3RydWN0dXJlID0gZmFsbGJhY2tDb250cmFjdENvbmZpZyhcImRlZmF1bHRPdXRwdXRTdHJ1Y3R1cmVcIiwgcHJvY2VkdXJlW1wifm9ycGNcIl0ucm91dGUub3V0cHV0U3RydWN0dXJlKTtcbiAgICBpZiAob3V0cHV0U3RydWN0dXJlID09PSBcImNvbXBhY3RcIikge1xuICAgICAgcmV0dXJuIGRlc2VyaWFsaXplZDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgaGVhZGVyczogcmVzcG9uc2UuaGVhZGVycyxcbiAgICAgIGJvZHk6IGRlc2VyaWFsaXplZFxuICAgIH07XG4gIH1cbn1cblxuY2xhc3MgU3RhbmRhcmRPcGVuQVBJU2VyaWFsaXplciB7XG4gIGNvbnN0cnVjdG9yKGpzb25TZXJpYWxpemVyLCBicmFja2V0Tm90YXRpb24pIHtcbiAgICB0aGlzLmpzb25TZXJpYWxpemVyID0ganNvblNlcmlhbGl6ZXI7XG4gICAgdGhpcy5icmFja2V0Tm90YXRpb24gPSBicmFja2V0Tm90YXRpb247XG4gIH1cbiAgc2VyaWFsaXplKGRhdGEsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmIChpc0FzeW5jSXRlcmF0b3JPYmplY3QoZGF0YSkgJiYgIW9wdGlvbnMub3V0cHV0Rm9ybWF0KSB7XG4gICAgICByZXR1cm4gbWFwRXZlbnRJdGVyYXRvcihkYXRhLCB7XG4gICAgICAgIHZhbHVlOiBhc3luYyAodmFsdWUpID0+IHRoaXMuI3NlcmlhbGl6ZSh2YWx1ZSwgeyBvdXRwdXRGb3JtYXQ6IFwicGxhaW5cIiB9KSxcbiAgICAgICAgZXJyb3I6IGFzeW5jIChlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBFcnJvckV2ZW50KHtcbiAgICAgICAgICAgIGRhdGE6IHRoaXMuI3NlcmlhbGl6ZSh0b09SUENFcnJvcihlKS50b0pTT04oKSwgeyBvdXRwdXRGb3JtYXQ6IFwicGxhaW5cIiB9KSxcbiAgICAgICAgICAgIGNhdXNlOiBlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy4jc2VyaWFsaXplKGRhdGEsIG9wdGlvbnMpO1xuICB9XG4gICNzZXJpYWxpemUoZGF0YSwgb3B0aW9ucykge1xuICAgIGNvbnN0IFtqc29uLCBoYXNCbG9iXSA9IHRoaXMuanNvblNlcmlhbGl6ZXIuc2VyaWFsaXplKGRhdGEpO1xuICAgIGlmIChvcHRpb25zLm91dHB1dEZvcm1hdCA9PT0gXCJwbGFpblwiKSB7XG4gICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMub3V0cHV0Rm9ybWF0ID09PSBcIlVSTFNlYXJjaFBhcmFtc1wiKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgICBmb3IgKGNvbnN0IFtwYXRoLCB2YWx1ZV0gb2YgdGhpcy5icmFja2V0Tm90YXRpb24uc2VyaWFsaXplKGpzb24pKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICBwYXJhbXMuYXBwZW5kKHBhdGgsIHZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cbiAgICBpZiAoanNvbiBpbnN0YW5jZW9mIEJsb2IgfHwganNvbiA9PT0gdm9pZCAwIHx8ICFoYXNCbG9iKSB7XG4gICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gICAgY29uc3QgZm9ybSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIGZvciAoY29uc3QgW3BhdGgsIHZhbHVlXSBvZiB0aGlzLmJyYWNrZXROb3RhdGlvbi5zZXJpYWxpemUoanNvbikpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgZm9ybS5hcHBlbmQocGF0aCwgdmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQmxvYikge1xuICAgICAgICBmb3JtLmFwcGVuZChwYXRoLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3JtO1xuICB9XG4gIGRlc2VyaWFsaXplKGRhdGEpIHtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcyB8fCBkYXRhIGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICAgIHJldHVybiB0aGlzLmJyYWNrZXROb3RhdGlvbi5kZXNlcmlhbGl6ZShBcnJheS5mcm9tKGRhdGEuZW50cmllcygpKSk7XG4gICAgfVxuICAgIGlmIChpc0FzeW5jSXRlcmF0b3JPYmplY3QoZGF0YSkpIHtcbiAgICAgIHJldHVybiBtYXBFdmVudEl0ZXJhdG9yKGRhdGEsIHtcbiAgICAgICAgdmFsdWU6IGFzeW5jICh2YWx1ZSkgPT4gdmFsdWUsXG4gICAgICAgIGVycm9yOiBhc3luYyAoZSkgPT4ge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3JFdmVudCAmJiBpc09SUENFcnJvckpzb24oZS5kYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZU9SUENFcnJvckZyb21Kc29uKGUuZGF0YSwgeyBjYXVzZTogZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxufVxuXG5jbGFzcyBTdGFuZGFyZE9wZW5BUElMaW5rIGV4dGVuZHMgU3RhbmRhcmRMaW5rIHtcbiAgY29uc3RydWN0b3IoY29udHJhY3QsIGxpbmtDbGllbnQsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBqc29uU2VyaWFsaXplciA9IG5ldyBTdGFuZGFyZE9wZW5BUElKc29uU2VyaWFsaXplcihvcHRpb25zKTtcbiAgICBjb25zdCBicmFja2V0Tm90YXRpb25TZXJpYWxpemVyID0gbmV3IFN0YW5kYXJkQnJhY2tldE5vdGF0aW9uU2VyaWFsaXplcih7IG1heEJyYWNrZXROb3RhdGlvbkFycmF5SW5kZXg6IDQyOTQ5NjcyOTQgfSk7XG4gICAgY29uc3Qgc2VyaWFsaXplciA9IG5ldyBTdGFuZGFyZE9wZW5BUElTZXJpYWxpemVyKGpzb25TZXJpYWxpemVyLCBicmFja2V0Tm90YXRpb25TZXJpYWxpemVyKTtcbiAgICBjb25zdCBsaW5rQ29kZWMgPSBuZXcgU3RhbmRhcmRPcGVuYXBpTGlua0NvZGVjKGNvbnRyYWN0LCBzZXJpYWxpemVyLCBvcHRpb25zKTtcbiAgICBzdXBlcihsaW5rQ29kZWMsIGxpbmtDbGllbnQsIG9wdGlvbnMpO1xuICB9XG59XG5cbmV4cG9ydCB7IFN0YW5kYXJkT3BlbkFQSUpzb25TZXJpYWxpemVyIGFzIFMsIFN0YW5kYXJkT3BlbkFQSUxpbmsgYXMgYSwgU3RhbmRhcmRPcGVuYXBpTGlua0NvZGVjIGFzIGIsIFN0YW5kYXJkT3BlbkFQSVNlcmlhbGl6ZXIgYXMgYywgZ2V0RHluYW1pY1BhcmFtcyBhcyBnLCBzdGFuZGFyZGl6ZUhUVFBQYXRoIGFzIHMgfTtcbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMCwxLDIsMyw0LDVdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsU0FBUyw0QkFBNEIsTUFBTTtBQUN6QyxRQUFPLEtBQUssTUFBTSxFQUFFOztBQUd0QixTQUFTLFFBQVEsU0FBTztBQUN0QixRQUFPLE1BQU0sUUFBUUEsUUFBTSxHQUFHQSxVQUFRQSxZQUFVLEtBQUssS0FBS0EsWUFBVSxPQUFPLEVBQUUsR0FBRyxDQUFDQSxRQUFNOztBQWV6RixNQUFNLDJCQUEyQjtBQUNqQyxNQUFNLDhCQUE4QjtBQVNwQyxTQUFTLEtBQUssSUFBSTtDQUNoQixJQUFJO0FBQ0osY0FBYTtBQUNYLE1BQUksT0FDRixRQUFPLE9BQU87RUFFaEIsTUFBTSxTQUFTLElBQUk7QUFDbkIsV0FBUyxFQUFFLFFBQVE7QUFDbkIsU0FBTzs7O0FBR1gsU0FBUyxXQUFXLElBQUk7Q0FDdEIsSUFBSSx1QkFBdUIsUUFBUSxTQUFTO0FBQzVDLFNBQVEsR0FBRyxTQUFTO0FBQ2xCLFNBQU8s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
@@ -1,7 +1,7 @@
1
1
  const require_chunk = require('../chunk-zltIcp7o.cjs');
2
- const require_runtime = require('../runtime-Yfumucan.cjs');
2
+ const require_runtime = require('../runtime-LlP2xpdB.cjs');
3
3
  require('../normalize-D4Qh0wVk.cjs');
4
- require('../package-J60H0cK8.cjs');
4
+ require('../package-C2Mp8qeD.cjs');
5
5
  let effect = require("effect");
6
6
 
7
7
  //#region src/testing/mocks/module-federation.service.ts
@@ -1,7 +1,6 @@
1
- import "../zod-A7Pti5IV.cjs";
2
- import "../errors-DKPPPYYT.cjs";
3
- import { a as EveryPlugin, g as PluginRuntimeConfig, m as PluginRegistry, r as PluginService, t as PluginRuntime, x as LoadedPluginWithBinding, y as RegisteredPlugins } from "../index-matrPV4m.cjs";
4
- import "../normalize-BW7kk8Lk.cjs";
1
+ import "../errors-CpYzD_-M.cjs";
2
+ import { a as EveryPlugin, g as PluginRuntimeConfig, m as PluginRegistry, r as PluginService, t as PluginRuntime, x as LoadedPluginWithBinding, y as RegisteredPlugins } from "../index-BXfi8DqC.cjs";
3
+ import "../normalize-Tt7I_RdD.cjs";
5
4
  import { Layer } from "effect";
6
5
 
7
6
  //#region src/testing/mocks/module-federation.service.d.ts
@@ -57,4 +56,4 @@ declare function createLocalPluginRuntime<TMap extends PluginMap & ValidatePlugi
57
56
  declare const createTestPluginRuntime: typeof createLocalPluginRuntime;
58
57
  //#endregion
59
58
  export { type EveryPlugin, InferBindingsFromMap, type PluginMap, type PluginRegistry, type PluginRuntimeConfig, type RegisteredPlugins, createLocalPluginRuntime, createTestLayer, createTestPluginRuntime };
60
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC5jdHMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3RpbmcvbW9ja3MvbW9kdWxlLWZlZGVyYXRpb24uc2VydmljZS50cyIsIi4uLy4uL3NyYy90ZXN0aW5nL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7S0FLWSxTQUFBLEdBQVksZUFBZTs7Ozs7QUFBdkM7O0tDYUssNEJBQTRCLDJCQUNwQixJQUFJLGdCQUFnQixvQkFDN0IsRUFBRSxzQkFDZSxvRkFUc0Y7Ozs7Ozs7OztBQXNCM0c7O0FBQ2EsS0FERCxvQkFDQyxDQUFBLFVBRDhCLFNBQzlCLENBQUEsR0FBQSxRQUFJLE1BQUosQ0FBSSxHQUFBLENBQUEsQ0FBRSxDQUFGLENBQUEsRUFBRSxHQUNmLGlCQURlOzs7QUFPbkI7O0FBQThELGNBQWpELGVBQWlELEVBQUEsQ0FBQSxVQUFwQixpQkFBb0IsR0FBQSxpQkFBQSxDQUFBLENBQUEsTUFBQSxFQUNyRCxtQkFEcUQsQ0FDakMsQ0FEaUMsQ0FBQSxFQUFBLFNBQUEsRUFFbEQsU0FGa0QsRUFBQSxHQUV6QyxLQUFBLENBQUEsS0FGeUMsQ0FFekMsYUFGeUMsRUFBQSxLQUFBLEVBQUEsS0FBQSxDQUFBOzs7Ozs7O0FBaUQ5RDs7Ozs7Ozs7OztBQWFBOzs7OztpQkFiZ0Isc0NBQXNDLFlBQVksa0JBQWtCLGVBQzNFLGdDQUNHLE9BQ1QsY0FBYyxxQkFBcUI7Ozs7Y0FVekIsZ0NBQXVCIn0=
59
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC5jdHMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3RpbmcvbW9ja3MvbW9kdWxlLWZlZGVyYXRpb24uc2VydmljZS50cyIsIi4uLy4uL3NyYy90ZXN0aW5nL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbXSwibWFwcGluZ3MiOiI7Ozs7OztLQUtZLFNBQUEsR0FBWSxlQUFlOzs7O0FBQXZDOzs7S0NhSyw0QkFBNEIscUJBQTVCLE1BQ1EsQ0FEUixHQUNZLENBRFosU0FBaUIsTUFDVyxpQkFEWCxHQUVsQixDQUZrQixDQUVoQixDQUZnQixDQUFBLEdBQUEsaUJBR0QsQ0FIQyxHQUFBLE1BQUEsd0VBQUEsRUFBVzs7Ozs7Ozs7QUFnQmpDOzs7QUFDaUIsS0FETCxvQkFDSyxDQUFBLFVBRDBCLFNBQzFCLENBQUEsR0FBQSxRQUFFLE1BQU4sQ0FBTSxHQUFGLENBQUUsQ0FBQSxDQUFBLENBQUEsRUFDZixHQUFBLGlCQUFBOztBQU1KOzs7QUFDNkIsY0FEaEIsZUFDZ0IsRUFBQSxDQUFBLFVBRGEsaUJBQ2IsR0FEaUMsaUJBQ2pDLENBQUEsQ0FBQSxNQUFBLEVBQXBCLG1CQUFvQixDQUFBLENBQUEsQ0FBQSxFQUFBLFNBQUEsRUFDakIsU0FEaUIsRUFBQSxHQUNSLEtBQUEsQ0FBQSxLQURRLENBQ1IsYUFEUSxFQUFBLEtBQUEsRUFBQSxLQUFBLENBQUE7Ozs7OztBQWdEN0I7Ozs7Ozs7Ozs7QUFhQTs7Ozs7O2lCQWJnQixzQ0FBc0MsWUFBWSxrQkFBa0IsZUFDM0UsZ0NBQ0csT0FDVCxjQUFjLHFCQUFxQjs7OztjQVV6QixnQ0FBdUIifQ==
@@ -1,7 +1,6 @@
1
- import "../zod-D4CFw8d9.mjs";
2
- import "../errors-Car4tFVP.mjs";
3
- import { a as EveryPlugin, g as PluginRuntimeConfig, m as PluginRegistry, r as PluginService, t as PluginRuntime, x as LoadedPluginWithBinding, y as RegisteredPlugins } from "../index-bwAhA9ca.mjs";
4
- import "../normalize-BLTyqFww.mjs";
1
+ import "../errors-D2-thHKG.mjs";
2
+ import { a as EveryPlugin, g as PluginRuntimeConfig, m as PluginRegistry, r as PluginService, t as PluginRuntime, x as LoadedPluginWithBinding, y as RegisteredPlugins } from "../index-DvIxKA8K.mjs";
3
+ import "../normalize-BCE_FLe8.mjs";
5
4
  import { Layer } from "effect";
6
5
 
7
6
  //#region src/testing/mocks/module-federation.service.d.ts
@@ -57,4 +56,4 @@ declare function createLocalPluginRuntime<TMap extends PluginMap & ValidatePlugi
57
56
  declare const createTestPluginRuntime: typeof createLocalPluginRuntime;
58
57
  //#endregion
59
58
  export { type EveryPlugin, InferBindingsFromMap, type PluginMap, type PluginRegistry, type PluginRuntimeConfig, type RegisteredPlugins, createLocalPluginRuntime, createTestLayer, createTestPluginRuntime };
60
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC5tdHMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3RpbmcvbW9ja3MvbW9kdWxlLWZlZGVyYXRpb24uc2VydmljZS50cyIsIi4uLy4uL3NyYy90ZXN0aW5nL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7S0FLWSxTQUFBLEdBQVksZUFBZTs7Ozs7QUFBdkM7O0tDYUssNEJBQTRCLDJCQUNwQixJQUFJLGdCQUFnQixvQkFDN0IsRUFBRSxzQkFDZSxvRkFUc0Y7Ozs7Ozs7OztBQXNCM0c7O0FBQ2EsS0FERCxvQkFDQyxDQUFBLFVBRDhCLFNBQzlCLENBQUEsR0FBQSxRQUFJLE1BQUosQ0FBSSxHQUFBLENBQUEsQ0FBRSxDQUFGLENBQUEsRUFBRSxHQUNmLGlCQURlOzs7QUFPbkI7O0FBQThELGNBQWpELGVBQWlELEVBQUEsQ0FBQSxVQUFwQixpQkFBb0IsR0FBQSxpQkFBQSxDQUFBLENBQUEsTUFBQSxFQUNyRCxtQkFEcUQsQ0FDakMsQ0FEaUMsQ0FBQSxFQUFBLFNBQUEsRUFFbEQsU0FGa0QsRUFBQSxHQUV6QyxLQUFBLENBQUEsS0FGeUMsQ0FFekMsYUFGeUMsRUFBQSxLQUFBLEVBQUEsS0FBQSxDQUFBOzs7Ozs7O0FBaUQ5RDs7Ozs7Ozs7OztBQWFBOzs7OztpQkFiZ0Isc0NBQXNDLFlBQVksa0JBQWtCLGVBQzNFLGdDQUNHLE9BQ1QsY0FBYyxxQkFBcUI7Ozs7Y0FVekIsZ0NBQXVCIn0=
59
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC5tdHMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3RpbmcvbW9ja3MvbW9kdWxlLWZlZGVyYXRpb24uc2VydmljZS50cyIsIi4uLy4uL3NyYy90ZXN0aW5nL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbXSwibWFwcGluZ3MiOiI7Ozs7OztLQUtZLFNBQUEsR0FBWSxlQUFlOzs7O0FBQXZDOzs7S0NhSyw0QkFBNEIscUJBQTVCLE1BQ1EsQ0FEUixHQUNZLENBRFosU0FBaUIsTUFDVyxpQkFEWCxHQUVsQixDQUZrQixDQUVoQixDQUZnQixDQUFBLEdBQUEsaUJBR0QsQ0FIQyxHQUFBLE1BQUEsd0VBQUEsRUFBVzs7Ozs7Ozs7QUFnQmpDOzs7QUFDaUIsS0FETCxvQkFDSyxDQUFBLFVBRDBCLFNBQzFCLENBQUEsR0FBQSxRQUFFLE1BQU4sQ0FBTSxHQUFGLENBQUUsQ0FBQSxDQUFBLENBQUEsRUFDZixHQUFBLGlCQUFBOztBQU1KOzs7QUFDNkIsY0FEaEIsZUFDZ0IsRUFBQSxDQUFBLFVBRGEsaUJBQ2IsR0FEaUMsaUJBQ2pDLENBQUEsQ0FBQSxNQUFBLEVBQXBCLG1CQUFvQixDQUFBLENBQUEsQ0FBQSxFQUFBLFNBQUEsRUFDakIsU0FEaUIsRUFBQSxHQUNSLEtBQUEsQ0FBQSxLQURRLENBQ1IsYUFEUSxFQUFBLEtBQUEsRUFBQSxLQUFBLENBQUE7Ozs7OztBQWdEN0I7Ozs7Ozs7Ozs7QUFhQTs7Ozs7O2lCQWJnQixzQ0FBc0MsWUFBWSxrQkFBa0IsZUFDM0UsZ0NBQ0csT0FDVCxjQUFjLHFCQUFxQjs7OztjQVV6QixnQ0FBdUIifQ==
@@ -1,6 +1,6 @@
1
- import { a as PluginRegistryTag, c as SecretsService, d as ModuleFederationError, i as PluginLoaderService, l as PluginLifecycleService, o as RegistryService, r as PluginService, s as SecretsConfigTag, t as PluginRuntime, u as ModuleFederationService } from "../runtime-BShulKmh.mjs";
1
+ import { a as PluginRegistryTag, c as SecretsService, d as ModuleFederationError, i as PluginLoaderService, l as PluginLifecycleService, o as RegistryService, r as PluginService, s as SecretsConfigTag, t as PluginRuntime, u as ModuleFederationService } from "../runtime-BUQ0hy1J.mjs";
2
2
  import "../normalize-D7nae0Hn.mjs";
3
- import "../package-DVINhZcr.mjs";
3
+ import "../package-uEsV9Z-2.mjs";
4
4
  import { Effect, Layer, ManagedRuntime } from "effect";
5
5
 
6
6
  //#region src/testing/mocks/module-federation.service.ts
@@ -0,0 +1,10 @@
1
+ import { n as __reExport } from "./chunk-QQAxy9l9.mjs";
2
+
3
+ //#region src/zod.ts
4
+ var zod_exports = {};
5
+ import * as import___orpc_zod from "@orpc/zod";
6
+ __reExport(zod_exports, import___orpc_zod);
7
+
8
+ //#endregion
9
+ export { zod_exports as t };
10
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kLUJERGp5eUhRLm1qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi9zcmMvem9kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHVzZSBAb3JwYy96b2QgdG8gYXZvaWQgdHlwZSBwb3J0YWJpbGl0eSBpc3N1ZXNcbmV4cG9ydCAqIGZyb20gXCJAb3JwYy96b2RcIjtcbiJdLCJtYXBwaW5ncyI6IiJ9