@kontur.candy/tools 2.190.0 → 2.191.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,12 +4,18 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.extractGfvFromFormPath = extractGfvFromFormPath;
7
- var _TypingUtils = require("./TypingUtils");
8
7
  var _WellKnownDirectories = require("./WellKnownDirectories");
9
8
  function extractGfvFromFormPath(formPath) {
10
- var _ref, _match$groups$gfv, _match$groups, _match$groups2;
9
+ var _match$groups$gfv, _match$groups, _match$groups2;
11
10
  const regexp = new RegExp(`([\\/\\\\](?<gfv1>\\d{6,})[\\/\\\\]${_WellKnownDirectories.WellKnownDirectories.CandySubdirectoryName})|(((\\.farm)|(${_WellKnownDirectories.WellKnownDirectories.TestFarmDir}))[\\/\\\\]forms[\\/\\\\](?<gfv2>\\d{6,}))`);
12
11
  const match = regexp.exec(formPath);
13
- return (_ref = (_match$groups$gfv = match === null || match === void 0 || (_match$groups = match.groups) === null || _match$groups === void 0 ? void 0 : _match$groups["gfv1"]) !== null && _match$groups$gfv !== void 0 ? _match$groups$gfv : match === null || match === void 0 || (_match$groups2 = match.groups) === null || _match$groups2 === void 0 ? void 0 : _match$groups2["gfv2"]) !== null && _ref !== void 0 ? _ref : (0, _TypingUtils.reject)(`Unable to determine gfv from path: ${formPath}`);
12
+ const gfv = (_match$groups$gfv = match === null || match === void 0 || (_match$groups = match.groups) === null || _match$groups === void 0 ? void 0 : _match$groups["gfv1"]) !== null && _match$groups$gfv !== void 0 ? _match$groups$gfv : match === null || match === void 0 || (_match$groups2 = match.groups) === null || _match$groups2 === void 0 ? void 0 : _match$groups2["gfv2"];
13
+ if (gfv) {
14
+ return gfv;
15
+ }
16
+ // Ошибка не долетает до консоли при работе с сервисранера. Поэтому доп. консолька
17
+ // eslint-disable-next-line no-console
18
+ console.trace(`[Error] Unable to determine gfv from path: ${formPath}`);
19
+ throw new Error(`Unable to determine gfv from path: ${formPath}`);
14
20
  }
15
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfVHlwaW5nVXRpbHMiLCJyZXF1aXJlIiwiX1dlbGxLbm93bkRpcmVjdG9yaWVzIiwiZXh0cmFjdEdmdkZyb21Gb3JtUGF0aCIsImZvcm1QYXRoIiwiX3JlZiIsIl9tYXRjaCRncm91cHMkZ2Z2IiwiX21hdGNoJGdyb3VwcyIsIl9tYXRjaCRncm91cHMyIiwicmVnZXhwIiwiUmVnRXhwIiwiV2VsbEtub3duRGlyZWN0b3JpZXMiLCJDYW5keVN1YmRpcmVjdG9yeU5hbWUiLCJUZXN0RmFybURpciIsIm1hdGNoIiwiZXhlYyIsImdyb3VwcyIsInJlamVjdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL0NvbW1vbi9Gb3JtUGF0aFV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlamVjdCB9IGZyb20gXCIuL1R5cGluZ1V0aWxzXCI7XG5pbXBvcnQgeyBXZWxsS25vd25EaXJlY3RvcmllcyB9IGZyb20gXCIuL1dlbGxLbm93bkRpcmVjdG9yaWVzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0R2Z2RnJvbUZvcm1QYXRoKGZvcm1QYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlZ2V4cCA9IG5ldyBSZWdFeHAoXG4gICAgICAgIGAoW1xcXFwvXFxcXFxcXFxdKD88Z2Z2MT5cXFxcZHs2LH0pW1xcXFwvXFxcXFxcXFxdJHtXZWxsS25vd25EaXJlY3Rvcmllcy5DYW5keVN1YmRpcmVjdG9yeU5hbWV9KXwoKChcXFxcLmZhcm0pfCgke1dlbGxLbm93bkRpcmVjdG9yaWVzLlRlc3RGYXJtRGlyfSkpW1xcXFwvXFxcXFxcXFxdZm9ybXNbXFxcXC9cXFxcXFxcXF0oPzxnZnYyPlxcXFxkezYsfSkpYFxuICAgICk7XG4gICAgY29uc3QgbWF0Y2ggPSByZWdleHAuZXhlYyhmb3JtUGF0aCk7XG4gICAgcmV0dXJuIChcbiAgICAgICAgbWF0Y2g/Lmdyb3Vwcz8uW1wiZ2Z2MVwiXSA/PyBtYXRjaD8uZ3JvdXBzPy5bXCJnZnYyXCJdID8/IHJlamVjdChgVW5hYmxlIHRvIGRldGVybWluZSBnZnYgZnJvbSBwYXRoOiAke2Zvcm1QYXRofWApXG4gICAgKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBQUEsWUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMscUJBQUEsR0FBQUQsT0FBQTtBQUVPLFNBQVNFLHNCQUFzQkEsQ0FBQ0MsUUFBZ0IsRUFBVTtFQUFBLElBQUFDLElBQUEsRUFBQUMsaUJBQUEsRUFBQUMsYUFBQSxFQUFBQyxjQUFBO0VBQzdELE1BQU1DLE1BQU0sR0FBRyxJQUFJQyxNQUFNLENBQ3JCLHNDQUFzQ0MsMENBQW9CLENBQUNDLHFCQUFxQixrQkFBa0JELDBDQUFvQixDQUFDRSxXQUFXLDRDQUN0SSxDQUFDO0VBQ0QsTUFBTUMsS0FBSyxHQUFHTCxNQUFNLENBQUNNLElBQUksQ0FBQ1gsUUFBUSxDQUFDO0VBQ25DLFFBQUFDLElBQUEsSUFBQUMsaUJBQUEsR0FDSVEsS0FBSyxhQUFMQSxLQUFLLGdCQUFBUCxhQUFBLEdBQUxPLEtBQUssQ0FBRUUsTUFBTSxjQUFBVCxhQUFBLHVCQUFiQSxhQUFBLENBQWdCLE1BQU0sQ0FBQyxjQUFBRCxpQkFBQSxjQUFBQSxpQkFBQSxHQUFJUSxLQUFLLGFBQUxBLEtBQUssZ0JBQUFOLGNBQUEsR0FBTE0sS0FBSyxDQUFFRSxNQUFNLGNBQUFSLGNBQUEsdUJBQWJBLGNBQUEsQ0FBZ0IsTUFBTSxDQUFDLGNBQUFILElBQUEsY0FBQUEsSUFBQSxHQUFJLElBQUFZLG1CQUFNLEVBQUMsc0NBQXNDYixRQUFRLEVBQUUsQ0FBQztBQUV0SCIsImlnbm9yZUxpc3QiOltdfQ==
21
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfV2VsbEtub3duRGlyZWN0b3JpZXMiLCJyZXF1aXJlIiwiZXh0cmFjdEdmdkZyb21Gb3JtUGF0aCIsImZvcm1QYXRoIiwiX21hdGNoJGdyb3VwcyRnZnYiLCJfbWF0Y2gkZ3JvdXBzIiwiX21hdGNoJGdyb3VwczIiLCJyZWdleHAiLCJSZWdFeHAiLCJXZWxsS25vd25EaXJlY3RvcmllcyIsIkNhbmR5U3ViZGlyZWN0b3J5TmFtZSIsIlRlc3RGYXJtRGlyIiwibWF0Y2giLCJleGVjIiwiZ2Z2IiwiZ3JvdXBzIiwiY29uc29sZSIsInRyYWNlIiwiRXJyb3IiXSwic291cmNlcyI6WyIuLi8uLi8uLi9Db21tb24vRm9ybVBhdGhVdGlscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXZWxsS25vd25EaXJlY3RvcmllcyB9IGZyb20gXCIuL1dlbGxLbm93bkRpcmVjdG9yaWVzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0R2Z2RnJvbUZvcm1QYXRoKGZvcm1QYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlZ2V4cCA9IG5ldyBSZWdFeHAoXG4gICAgICAgIGAoW1xcXFwvXFxcXFxcXFxdKD88Z2Z2MT5cXFxcZHs2LH0pW1xcXFwvXFxcXFxcXFxdJHtXZWxsS25vd25EaXJlY3Rvcmllcy5DYW5keVN1YmRpcmVjdG9yeU5hbWV9KXwoKChcXFxcLmZhcm0pfCgke1dlbGxLbm93bkRpcmVjdG9yaWVzLlRlc3RGYXJtRGlyfSkpW1xcXFwvXFxcXFxcXFxdZm9ybXNbXFxcXC9cXFxcXFxcXF0oPzxnZnYyPlxcXFxkezYsfSkpYFxuICAgICk7XG4gICAgY29uc3QgbWF0Y2ggPSByZWdleHAuZXhlYyhmb3JtUGF0aCk7XG4gICAgY29uc3QgZ2Z2ID0gbWF0Y2g/Lmdyb3Vwcz8uW1wiZ2Z2MVwiXSA/PyBtYXRjaD8uZ3JvdXBzPy5bXCJnZnYyXCJdO1xuICAgIGlmIChnZnYpIHtcbiAgICAgICAgcmV0dXJuIGdmdjtcbiAgICB9XG4gICAgLy8g0J7RiNC40LHQutCwINC90LUg0LTQvtC70LXRgtCw0LXRgiDQtNC+INC60L7QvdGB0L7Qu9C4INC/0YDQuCDRgNCw0LHQvtGC0LUg0YEg0YHQtdGA0LLQuNGB0YDQsNC90LXRgNCwLiDQn9C+0Y3RgtC+0LzRgyDQtNC+0L8uINC60L7QvdGB0L7Qu9GM0LrQsFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS50cmFjZShgW0Vycm9yXSBVbmFibGUgdG8gZGV0ZXJtaW5lIGdmdiBmcm9tIHBhdGg6ICR7Zm9ybVBhdGh9YCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZGV0ZXJtaW5lIGdmdiBmcm9tIHBhdGg6ICR7Zm9ybVBhdGh9YCk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLHFCQUFBLEdBQUFDLE9BQUE7QUFFTyxTQUFTQyxzQkFBc0JBLENBQUNDLFFBQWdCLEVBQVU7RUFBQSxJQUFBQyxpQkFBQSxFQUFBQyxhQUFBLEVBQUFDLGNBQUE7RUFDN0QsTUFBTUMsTUFBTSxHQUFHLElBQUlDLE1BQU0sQ0FDckIsc0NBQXNDQywwQ0FBb0IsQ0FBQ0MscUJBQXFCLGtCQUFrQkQsMENBQW9CLENBQUNFLFdBQVcsNENBQ3RJLENBQUM7RUFDRCxNQUFNQyxLQUFLLEdBQUdMLE1BQU0sQ0FBQ00sSUFBSSxDQUFDVixRQUFRLENBQUM7RUFDbkMsTUFBTVcsR0FBRyxJQUFBVixpQkFBQSxHQUFHUSxLQUFLLGFBQUxBLEtBQUssZ0JBQUFQLGFBQUEsR0FBTE8sS0FBSyxDQUFFRyxNQUFNLGNBQUFWLGFBQUEsdUJBQWJBLGFBQUEsQ0FBZ0IsTUFBTSxDQUFDLGNBQUFELGlCQUFBLGNBQUFBLGlCQUFBLEdBQUlRLEtBQUssYUFBTEEsS0FBSyxnQkFBQU4sY0FBQSxHQUFMTSxLQUFLLENBQUVHLE1BQU0sY0FBQVQsY0FBQSx1QkFBYkEsY0FBQSxDQUFnQixNQUFNLENBQUM7RUFDOUQsSUFBSVEsR0FBRyxFQUFFO0lBQ0wsT0FBT0EsR0FBRztFQUNkO0VBQ0E7RUFDQTtFQUNBRSxPQUFPLENBQUNDLEtBQUssQ0FBQyw4Q0FBOENkLFFBQVEsRUFBRSxDQUFDO0VBQ3ZFLE1BQU0sSUFBSWUsS0FBSyxDQUFDLHNDQUFzQ2YsUUFBUSxFQUFFLENBQUM7QUFDckUiLCJpZ25vcmVMaXN0IjpbXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"FormPathUtils.js","names":["_TypingUtils","require","_WellKnownDirectories","extractGfvFromFormPath","formPath","_ref","_match$groups$gfv","_match$groups","_match$groups2","regexp","RegExp","WellKnownDirectories","CandySubdirectoryName","TestFarmDir","match","exec","groups","reject"],"sources":["../../../Common/FormPathUtils.ts"],"sourcesContent":["import { reject } from \"./TypingUtils\";\nimport { WellKnownDirectories } from \"./WellKnownDirectories\";\n\nexport function extractGfvFromFormPath(formPath: string): string {\n const regexp = new RegExp(\n `([\\\\/\\\\\\\\](?<gfv1>\\\\d{6,})[\\\\/\\\\\\\\]${WellKnownDirectories.CandySubdirectoryName})|(((\\\\.farm)|(${WellKnownDirectories.TestFarmDir}))[\\\\/\\\\\\\\]forms[\\\\/\\\\\\\\](?<gfv2>\\\\d{6,}))`\n );\n const match = regexp.exec(formPath);\n return (\n match?.groups?.[\"gfv1\"] ?? match?.groups?.[\"gfv2\"] ?? reject(`Unable to determine gfv from path: ${formPath}`)\n );\n}\n"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,qBAAA,GAAAD,OAAA;AAEO,SAASE,sBAAsBA,CAACC,QAAgB,EAAU;EAAA,IAAAC,IAAA,EAAAC,iBAAA,EAAAC,aAAA,EAAAC,cAAA;EAC7D,MAAMC,MAAM,GAAG,IAAIC,MAAM,CACrB,sCAAsCC,0CAAoB,CAACC,qBAAqB,kBAAkBD,0CAAoB,CAACE,WAAW,4CACtI,CAAC;EACD,MAAMC,KAAK,GAAGL,MAAM,CAACM,IAAI,CAACX,QAAQ,CAAC;EACnC,QAAAC,IAAA,IAAAC,iBAAA,GACIQ,KAAK,aAALA,KAAK,gBAAAP,aAAA,GAALO,KAAK,CAAEE,MAAM,cAAAT,aAAA,uBAAbA,aAAA,CAAgB,MAAM,CAAC,cAAAD,iBAAA,cAAAA,iBAAA,GAAIQ,KAAK,aAALA,KAAK,gBAAAN,cAAA,GAALM,KAAK,CAAEE,MAAM,cAAAR,cAAA,uBAAbA,cAAA,CAAgB,MAAM,CAAC,cAAAH,IAAA,cAAAA,IAAA,GAAI,IAAAY,mBAAM,EAAC,sCAAsCb,QAAQ,EAAE,CAAC;AAEtH","ignoreList":[]}
1
+ {"version":3,"file":"FormPathUtils.js","names":["_WellKnownDirectories","require","extractGfvFromFormPath","formPath","_match$groups$gfv","_match$groups","_match$groups2","regexp","RegExp","WellKnownDirectories","CandySubdirectoryName","TestFarmDir","match","exec","gfv","groups","console","trace","Error"],"sources":["../../../Common/FormPathUtils.ts"],"sourcesContent":["import { WellKnownDirectories } from \"./WellKnownDirectories\";\n\nexport function extractGfvFromFormPath(formPath: string): string {\n const regexp = new RegExp(\n `([\\\\/\\\\\\\\](?<gfv1>\\\\d{6,})[\\\\/\\\\\\\\]${WellKnownDirectories.CandySubdirectoryName})|(((\\\\.farm)|(${WellKnownDirectories.TestFarmDir}))[\\\\/\\\\\\\\]forms[\\\\/\\\\\\\\](?<gfv2>\\\\d{6,}))`\n );\n const match = regexp.exec(formPath);\n const gfv = match?.groups?.[\"gfv1\"] ?? match?.groups?.[\"gfv2\"];\n if (gfv) {\n return gfv;\n }\n // Ошибка не долетает до консоли при работе с сервисранера. Поэтому доп. консолька\n // eslint-disable-next-line no-console\n console.trace(`[Error] Unable to determine gfv from path: ${formPath}`);\n throw new Error(`Unable to determine gfv from path: ${formPath}`);\n}\n"],"mappings":";;;;;;AAAA,IAAAA,qBAAA,GAAAC,OAAA;AAEO,SAASC,sBAAsBA,CAACC,QAAgB,EAAU;EAAA,IAAAC,iBAAA,EAAAC,aAAA,EAAAC,cAAA;EAC7D,MAAMC,MAAM,GAAG,IAAIC,MAAM,CACrB,sCAAsCC,0CAAoB,CAACC,qBAAqB,kBAAkBD,0CAAoB,CAACE,WAAW,4CACtI,CAAC;EACD,MAAMC,KAAK,GAAGL,MAAM,CAACM,IAAI,CAACV,QAAQ,CAAC;EACnC,MAAMW,GAAG,IAAAV,iBAAA,GAAGQ,KAAK,aAALA,KAAK,gBAAAP,aAAA,GAALO,KAAK,CAAEG,MAAM,cAAAV,aAAA,uBAAbA,aAAA,CAAgB,MAAM,CAAC,cAAAD,iBAAA,cAAAA,iBAAA,GAAIQ,KAAK,aAALA,KAAK,gBAAAN,cAAA,GAALM,KAAK,CAAEG,MAAM,cAAAT,cAAA,uBAAbA,cAAA,CAAgB,MAAM,CAAC;EAC9D,IAAIQ,GAAG,EAAE;IACL,OAAOA,GAAG;EACd;EACA;EACA;EACAE,OAAO,CAACC,KAAK,CAAC,8CAA8Cd,QAAQ,EAAE,CAAC;EACvE,MAAM,IAAIe,KAAK,CAAC,sCAAsCf,QAAQ,EAAE,CAAC;AACrE","ignoreList":[]}
@@ -335,6 +335,11 @@ class ModelPathImpl {
335
335
  const otherParts = modelPath.getPathPartsAsArray();
336
336
  return otherParts.every((value, index) => value === thisParts[index]);
337
337
  }
338
+ endsWith(modelPath) {
339
+ const thisParts = this.getPathPartsAsArray().slice().reverse();
340
+ const otherParts = modelPath.getPathPartsAsArray().slice().reverse();
341
+ return otherParts.every((value, index) => value === thisParts[index]);
342
+ }
338
343
  *splitByMultiplicity() {
339
344
  let lastSimpleParts = new _ModelPathBuilder.ModelPathBuilder(this.isAbsolute());
340
345
  for (const token of this.tokens) {
@@ -459,4 +464,4 @@ class ModelPathImpl {
459
464
  }
460
465
  }
461
466
  exports.ModelPathImpl = ModelPathImpl;
462
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfSXRlcmFibGVVdGlscyIsInJlcXVpcmUiLCJfVHlwaW5nVXRpbHMiLCJfRWFjaEN1cnJlbnRDb2xsaXNpb24iLCJfTW9kZWxQYXRoQnVpbGRlciIsIl9QYXRoTWF0Y2hlciIsIkVhY2hTeW1ib2wiLCJTeW1ib2wiLCJmb3IiLCJDdXJyZW50U3ltYm9sIiwiUGF0aFRva2VucyIsImlzTXVsdGlUb2tlbiIsInBhcnQiLCJlYWNoIiwiY3VycmVudCIsImlzU2ltcGxlVG9rZW4iLCJpc0luc3RhbmNlVG9rZW4iLCJ0ZXN0IiwiaXNJbnN0YW5jZVRva2VuT3JJbnN0YW5jZXNTcGVjIiwiZXhwb3J0cyIsImlzTW9kZWxQYXRoIiwicGF0aCIsIk1vZGVsUGF0aEltcGwiLCJjb252ZXJ0VG9MZWdhY3lQYXRoIiwidG9MZWdhY3lQYXRoIiwiY29udmVydFRvQWJzb2x1dGVNb2RlbFBhdGgiLCJjcmVhdGVBYnNvbHV0ZUZyb21NYXNrIiwiZW1wdHlNb2RlbFBhdGgiLCJlbXB0eUFic29sdXRlTW9kZWxQYXRoIiwiY3JlYXRlTW9kZWxQYXRoIiwiYWJzb2x1dGUiLCJwYXJ0UGFydFN0cmluZ3MiLCJzcGxpdCIsImVuc3VyZVBsYWluUGF0aFBhcnRzRG9lc05vdENvbnRhaW5NdWx0aXBsaWNpdHkiLCJzdGFydHNXaXRoIiwic2xpY2UiLCJjcmVhdGVGcm9tTWFzayIsIm11bHRpcGxpY2l0eVN5bWJvbCIsIm1hcCIsIngiLCJwYXJ0cyIsInNvbWUiLCJFcnJvciIsImNyZWF0ZUFic29sdXRlIiwiY3JlYXRlUmVsYXRpdmVSZXNvbHZlZE1vZGVsUGF0aCIsImNyZWF0ZUFic29sdXRlRnJvbVRva2VucyIsInRva2VucyIsImNyZWF0ZUFic29sdXRlUmVzb2x2ZWRGcm9tVG9rZW5zIiwiY3JlYXRlUmVsYXRpdmVGcm9tVG9rZW5zIiwiam9pbk1vZGVsUGF0aHMiLCJyZXN1bHRQYXJ0cyIsImpvaW5JdGVtIiwicHVzaCIsImlzQWJzb2x1dGUiLCJnZXRQYXRoUGFydHNBc0FycmF5IiwiQXJyYXkiLCJpc0FycmF5IiwiaXNBbGxUb2tlbnNSZXNvbHZlZCIsImV2ZXJ5IiwiY29uc3RydWN0b3IiLCJwYXRoUGFydHMiLCJsZWdhY3lQYXRoIiwiY2FjaGVkSGFzaCIsImZpbHRlciIsInJlc29sdmVkIiwiZ2V0UGF0aFBhcnRzIiwiZ2V0U2ltcGxlVG9rZW5zU3RyaWN0IiwidG9rZW4iLCJnZXRTaW1wbGVUb2tlbnNBc0FycmF5U3RyaWN0Iiwiam9pbldpdGgiLCJpc1Jlc29sdmVkIiwicmVzb2x2ZUFsbCIsImluc3RhbmNlIiwiaXNDb250YWluSXRlcmF0aW9uIiwiaXNDb250YWluQ3VycmVudEl0ZXJhdGlvbiIsImlzQ29udGFpbkN1cnJlbnRPckVhY2hJdGVyYXRpb24iLCJnZXRMYXN0TGlzdFBhdGgiLCJsYXN0SXRlcmF0aW9uSW5kZXgiLCJsYXN0SW5kZXhPZiIsImlzRW5kc1dpdGhJdGVyYXRpb24iLCJsYXN0SXRlbSIsIkl0ZXJVdGlscyIsImxhc3QiLCJpc0VuZHNXaXRoQ3VycmVudEl0ZXJhdGlvbiIsInRvU3RyaW5nIiwibGVuZ3RoIiwicGF0aFBhcnRUb1N0cmluZyIsImpvaW4iLCJfdGhpcyRsZWdhY3lQYXRoIiwiaXNFcXVhbHMiLCJtb2RlbFBhdGgiLCJlYWNoQ3VycmVudENvbGxpc2lvbiIsIkVhY2hDdXJyZW50Q29sbGlzaW9uIiwiQXJlU2FtZSIsIkl0ZXJhdG9yIiwiZnJvbSIsInppcCIsInQxIiwidDIiLCJnZXRIYXNoIiwidW5kZWZpbmVkIiwiaGFzaCIsInJldmVyc2VBcnJheSIsImN1cnJlbnRTdHIiLCJBcmVEaWZmZXJlbnQiLCJzdHJpbmdJbmRleCIsImNoYXJDb2RlQXQiLCJpc0luY2x1ZGVzIiwidGFyZ2V0VG9rZW5zIiwiaSIsImxlZnRQYXJ0IiwicmlnaHRQYXJ0IiwiaXNGaW5pdGUiLCJOdW1iZXIiLCJnZXRJdGVyYXRpb25SYW5rIiwiY291bnQiLCJpc0VtcHR5IiwibWF0Y2hGb3IiLCJQYXRoTWF0Y2hlciIsIm1hdGNoIiwidGhpc1BhcnRzIiwib3RoZXJQYXJ0cyIsInZhbHVlIiwiaW5kZXgiLCJzcGxpdEJ5TXVsdGlwbGljaXR5IiwibGFzdFNpbXBsZVBhcnRzIiwiTW9kZWxQYXRoQnVpbGRlciIsImFwcGVuZCIsImVtcHR5IiwidG9SZXNvbHZlZFBhdGgiLCJub3JtYWxpemUiLCJyZXN1bHRUb2tlbnMiLCJwYXRoUGFydCIsInBvcCIsInRvQ3VycmVudEl0ZXJhdGlvbiIsInRvRWFjaEl0ZXJhdGlvbiIsInRvQWJzb2x1dGUiLCJnZXRBbGxQYXJlbnRQYXRocyIsInJlc3VsdCIsInNraXBMYXN0IiwidG9QYXRoIiwidHJpbUxhc3RTdGFySWZMYXN0VG9rZW4iLCJnZXRQYXJlbnRQYXRoIiwiYXBwbHlJbnN0YW5jZXNEaXJ0eSIsImluc3RhbmNlcyIsImZpbGxXaXRoTXVsdGlwbGljaXR5SWZIYXNOb0luc3RhbmNlIiwiaW5zdGFuY2VDb3VudGVyIiwiX2luc3RhbmNlcyRpbnN0YW5jZUNvIiwiaW5zdGFuY2VPckVhY2giLCJyZWplY3QiLCJlbnN1cmVBbmRHZXRTdHJpbmciXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9Db21tb24vTW9kZWxQYXRoL01vZGVsUGF0aC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCaW5kaW5nUGF0aCB9IGZyb20gXCIuLi8uLi9FbmdpbmUvc3JjL0VuZ2luZS9Db3JlL0NvcmVUeXBlc1wiO1xuaW1wb3J0IHsgY291bnQsIEl0ZXJVdGlscywgcmV2ZXJzZUFycmF5IH0gZnJvbSBcIi4uL0l0ZXJhYmxlVXRpbHNcIjtcbmltcG9ydCB7IGVuc3VyZUFuZEdldFN0cmluZywgcmVqZWN0IH0gZnJvbSBcIi4uL1R5cGluZ1V0aWxzXCI7XG5cbmltcG9ydCB7IEVhY2hDdXJyZW50Q29sbGlzaW9uIH0gZnJvbSBcIi4vRWFjaEN1cnJlbnRDb2xsaXNpb25cIjtcbmltcG9ydCB7IE1vZGVsUGF0aEJ1aWxkZXIgfSBmcm9tIFwiLi9Nb2RlbFBhdGhCdWlsZGVyXCI7XG5pbXBvcnQgeyBQYXRoTWF0Y2hlciwgUGF0aE1hdGNoaW5nIH0gZnJvbSBcIi4vUGF0aE1hdGNoZXJcIjtcbmltcG9ydCB7IElFcXVhdGFibGUgfSBmcm9tIFwiLi9JRXF1YXRhYmxlXCI7XG5cbmNvbnN0IEVhY2hTeW1ib2wgPSBTeW1ib2wuZm9yKFwiX19FQUNIX19cIik7XG5jb25zdCBDdXJyZW50U3ltYm9sID0gU3ltYm9sLmZvcihcIl9fQ1VSUkVOVF9fXCIpO1xuXG5leHBvcnQgY2xhc3MgUGF0aFRva2VucyB7XG4gICAgcHVibGljIHN0YXRpYyBlYWNoOiB0eXBlb2YgRWFjaFN5bWJvbCA9IEVhY2hTeW1ib2w7XG4gICAgcHVibGljIHN0YXRpYyBjdXJyZW50OiB0eXBlb2YgQ3VycmVudFN5bWJvbCA9IEN1cnJlbnRTeW1ib2w7XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzTXVsdGlUb2tlbihwYXJ0OiB1bmRlZmluZWQgfCBQYXRoVG9rZW4pOiBwYXJ0IGlzIHR5cGVvZiBFYWNoU3ltYm9sIHwgdHlwZW9mIEN1cnJlbnRTeW1ib2wge1xuICAgICAgICByZXR1cm4gcGFydCA9PT0gUGF0aFRva2Vucy5lYWNoIHx8IHBhcnQgPT09IFBhdGhUb2tlbnMuY3VycmVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzU2ltcGxlVG9rZW4ocGFydDogdW5kZWZpbmVkIHwgUGF0aFRva2VuKTogcGFydCBpcyBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHBhcnQgPT09IFwic3RyaW5nXCI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0luc3RhbmNlVG9rZW4ocGFydDogdW5kZWZpbmVkIHwgUGF0aFRva2VuKTogcGFydCBpcyBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHBhcnQgPT09IFwic3RyaW5nXCIgJiYgL15cXGQrJC9pLnRlc3QocGFydCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0luc3RhbmNlVG9rZW5Pckluc3RhbmNlc1NwZWMocGFydDogdW5kZWZpbmVkIHwgUGF0aFRva2VuKTogcGFydCBpcyBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHBhcnQgPT09IFwic3RyaW5nXCIgJiYgKC9eXFxkKyQvaS50ZXN0KHBhcnQpIHx8IC9eXFxbKFxcZCtcXCw/KStcXF0kL2kudGVzdChwYXJ0KSk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBTaW1wbGVQYXRoVG9rZW4gPSBzdHJpbmc7XG5cbmV4cG9ydCB0eXBlIFBhdGhUb2tlbiA9IFNpbXBsZVBhdGhUb2tlbiB8IHR5cGVvZiBFYWNoU3ltYm9sIHwgdHlwZW9mIEN1cnJlbnRTeW1ib2w7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01vZGVsUGF0aChwYXRoOiBCaW5kaW5nUGF0aCB8IE1vZGVsUGF0aCB8IHVua25vd24pOiBwYXRoIGlzIE1vZGVsUGF0aCB7XG4gICAgcmV0dXJuIHR5cGVvZiBwYXRoICE9PSBcInN0cmluZ1wiICYmIHBhdGggaW5zdGFuY2VvZiBNb2RlbFBhdGhJbXBsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFRvTGVnYWN5UGF0aChwYXRoOiBCaW5kaW5nUGF0aCB8IE1vZGVsUGF0aCk6IEJpbmRpbmdQYXRoIHtcbiAgICByZXR1cm4gaXNNb2RlbFBhdGgocGF0aCkgPyBwYXRoLnRvTGVnYWN5UGF0aCgpIDogcGF0aDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb0Fic29sdXRlTW9kZWxQYXRoPFIgZXh0ZW5kcyBib29sZWFuLCBBIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgcGF0aDogQmluZGluZ1BhdGggfCBJTW9kZWxQYXRoPFIsIEE+XG4pOiBJTW9kZWxQYXRoPFIsIHRydWU+O1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb0Fic29sdXRlTW9kZWxQYXRoKHBhdGg6IEJpbmRpbmdQYXRoIHwgQWJzb2x1dGVNb2RlbFBhdGgpOiBBYnNvbHV0ZU1vZGVsUGF0aCB7XG4gICAgcmV0dXJuIGlzTW9kZWxQYXRoKHBhdGgpID8gcGF0aCA6IGNyZWF0ZUFic29sdXRlRnJvbU1hc2socGF0aCwgUGF0aFRva2Vucy5lYWNoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVtcHR5TW9kZWxQYXRoKCk6IFJlbGF0aXZlUmVzb2x2ZWRNb2RlbFBhdGgge1xuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDx0cnVlLCBmYWxzZT4oW10sIGZhbHNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVtcHR5QWJzb2x1dGVNb2RlbFBhdGgoKTogQWJzb2x1dGVSZXNvbHZlZE1vZGVsUGF0aCB7XG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIHRydWU+KFtdLCB0cnVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vZGVsUGF0aChwYXRoOiBzdHJpbmcsIGFic29sdXRlOiB0cnVlKTogQWJzb2x1dGVSZXNvbHZlZE1vZGVsUGF0aDtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2RlbFBhdGgocGF0aDogc3RyaW5nLCBhYnNvbHV0ZTogZmFsc2UpOiBSZWxhdGl2ZVJlc29sdmVkTW9kZWxQYXRoO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vZGVsUGF0aChwYXRoOiBzdHJpbmcsIGFic29sdXRlOiBcImF1dG9cIik6IFJlc29sdmVkTW9kZWxQYXRoO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vZGVsUGF0aChwYXRoOiBzdHJpbmcsIGFic29sdXRlOiBib29sZWFuIHwgXCJhdXRvXCIpOiBSZXNvbHZlZE1vZGVsUGF0aCB7XG4gICAgY29uc3QgcGFydFBhcnRTdHJpbmdzID0gcGF0aC5zcGxpdChcIi9cIik7XG4gICAgZW5zdXJlUGxhaW5QYXRoUGFydHNEb2VzTm90Q29udGFpbk11bHRpcGxpY2l0eShwYXJ0UGFydFN0cmluZ3MpO1xuICAgIGlmIChhYnNvbHV0ZSA9PT0gXCJhdXRvXCIpIHtcbiAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDx0cnVlLCB0cnVlPihwYXJ0UGFydFN0cmluZ3Muc2xpY2UoMSksIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIGZhbHNlPihwYXJ0UGFydFN0cmluZ3MsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYWJzb2x1dGUgJiYgcGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8dHJ1ZSwgdHJ1ZT4ocGFydFBhcnRTdHJpbmdzLnNsaWNlKDEpLCB0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIGJvb2xlYW4+KHBhcnRQYXJ0U3RyaW5ncywgYWJzb2x1dGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnJvbU1hc2socGF0aDogc3RyaW5nLCBhYnNvbHV0ZTogdHJ1ZSwgbXVsdGlwbGljaXR5U3ltYm9sOiBQYXRoVG9rZW4pOiBBYnNvbHV0ZU1vZGVsUGF0aDtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGcm9tTWFzayhwYXRoOiBzdHJpbmcsIGFic29sdXRlOiBmYWxzZSwgbXVsdGlwbGljaXR5U3ltYm9sOiBQYXRoVG9rZW4pOiBSZXNvbHZlZE1vZGVsUGF0aDtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGcm9tTWFzayhwYXRoOiBzdHJpbmcsIGFic29sdXRlOiBcImF1dG9cIiwgbXVsdGlwbGljaXR5U3ltYm9sOiBQYXRoVG9rZW4pOiBNb2RlbFBhdGg7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnJvbU1hc2socGF0aDogc3RyaW5nLCBhYnNvbHV0ZTogYm9vbGVhbiB8IFwiYXV0b1wiLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IE1vZGVsUGF0aCB7XG4gICAgY29uc3QgcGFydFBhcnRTdHJpbmdzID0gcGF0aC5zcGxpdChcIi9cIikubWFwKHggPT4gKHggPT09IFwiKlwiID8gbXVsdGlwbGljaXR5U3ltYm9sIDogeCkpO1xuICAgIGlmIChhYnNvbHV0ZSA9PT0gXCJhdXRvXCIpIHtcbiAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbChwYXJ0UGFydFN0cmluZ3Muc2xpY2UoMSksIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHBhcnRQYXJ0U3RyaW5ncywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChhYnNvbHV0ZSAmJiBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbChwYXJ0UGFydFN0cmluZ3Muc2xpY2UoMSksIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGwocGFydFBhcnRTdHJpbmdzLCBhYnNvbHV0ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBYnNvbHV0ZUZyb21NYXNrKHBhdGg6IHN0cmluZywgbXVsdGlwbGljaXR5U3ltYm9sOiBQYXRoVG9rZW4pOiBBYnNvbHV0ZU1vZGVsUGF0aCB7XG4gICAgY29uc3QgcGFydFBhcnRTdHJpbmdzID0gcGF0aC5zcGxpdChcIi9cIikubWFwKHggPT4gKHggPT09IFwiKlwiID8gbXVsdGlwbGljaXR5U3ltYm9sIDogeCkpO1xuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbChwYXJ0UGFydFN0cmluZ3Muc2xpY2UoMSksIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGwocGFydFBhcnRTdHJpbmdzLCB0cnVlKTtcbn1cblxuZnVuY3Rpb24gZW5zdXJlUGxhaW5QYXRoUGFydHNEb2VzTm90Q29udGFpbk11bHRpcGxpY2l0eShwYXJ0czogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICBpZiAocGFydHMuc29tZSh4ID0+IHggPT09IFwiKlwiKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXRoIG11c3Qgbm90IGNvbnRhaW4gKiBzeW1ib2xcIik7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQWJzb2x1dGUocGF0aDogc3RyaW5nKTogQWJzb2x1dGVSZXNvbHZlZE1vZGVsUGF0aCB7XG4gICAgY29uc3QgcGFydFBhcnRTdHJpbmdzID0gcGF0aC5zcGxpdChcIi9cIik7XG4gICAgZW5zdXJlUGxhaW5QYXRoUGFydHNEb2VzTm90Q29udGFpbk11bHRpcGxpY2l0eShwYXJ0UGFydFN0cmluZ3MpO1xuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDx0cnVlLCB0cnVlPihwYXJ0UGFydFN0cmluZ3Muc2xpY2UoMSksIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8dHJ1ZSwgdHJ1ZT4ocGFydFBhcnRTdHJpbmdzLCB0cnVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlbGF0aXZlUmVzb2x2ZWRNb2RlbFBhdGgocGF0aDogc3RyaW5nKTogUmVsYXRpdmVSZXNvbHZlZE1vZGVsUGF0aCB7XG4gICAgY29uc3QgcGFydFBhcnRTdHJpbmdzID0gcGF0aC5zcGxpdChcIi9cIik7XG4gICAgZW5zdXJlUGxhaW5QYXRoUGFydHNEb2VzTm90Q29udGFpbk11bHRpcGxpY2l0eShwYXJ0UGFydFN0cmluZ3MpO1xuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDx0cnVlLCBmYWxzZT4ocGFydFBhcnRTdHJpbmdzLCBmYWxzZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBYnNvbHV0ZUZyb21Ub2tlbnModG9rZW5zOiBQYXRoVG9rZW5bXSk6IEFic29sdXRlTW9kZWxQYXRoIHtcbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8ZmFsc2UsIHRydWU+KHRva2VucywgdHJ1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBYnNvbHV0ZVJlc29sdmVkRnJvbVRva2Vucyh0b2tlbnM6IHJlYWRvbmx5IHN0cmluZ1tdKTogQWJzb2x1dGVSZXNvbHZlZE1vZGVsUGF0aCB7XG4gICAgZW5zdXJlUGxhaW5QYXRoUGFydHNEb2VzTm90Q29udGFpbk11bHRpcGxpY2l0eSh0b2tlbnMpO1xuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDx0cnVlLCB0cnVlPih0b2tlbnMsIHRydWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVsYXRpdmVGcm9tVG9rZW5zKHRva2VuczogcmVhZG9ubHkgc3RyaW5nW10pOiBSZWxhdGl2ZVJlc29sdmVkTW9kZWxQYXRoO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlbGF0aXZlRnJvbVRva2Vucyh0b2tlbnM6IHJlYWRvbmx5IFBhdGhUb2tlbltdKTogUmVsYXRpdmVNb2RlbFBhdGg7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVsYXRpdmVGcm9tVG9rZW5zKHRva2VuczogcmVhZG9ubHkgUGF0aFRva2VuW10pOiBSZWxhdGl2ZU1vZGVsUGF0aCB7XG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPGZhbHNlLCBmYWxzZT4odG9rZW5zLCBmYWxzZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBqb2luTW9kZWxQYXRocyguLi5wYXJ0czogQXJyYXk8TW9kZWxQYXRoIHwgUGF0aFRva2VuIHwgUGF0aFRva2VuW10+KTogTW9kZWxQYXRoIHtcbiAgICBsZXQgYWJzb2x1dGUgPSBmYWxzZTtcbiAgICBsZXQgcmVzdWx0UGFydHM6IFBhdGhUb2tlbltdID0gW107XG4gICAgZm9yIChjb25zdCBqb2luSXRlbSBvZiBwYXJ0cykge1xuICAgICAgICBpZiAodHlwZW9mIGpvaW5JdGVtID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXN1bHRQYXJ0cy5wdXNoKGpvaW5JdGVtKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc01vZGVsUGF0aChqb2luSXRlbSkpIHtcbiAgICAgICAgICAgIGlmIChqb2luSXRlbS5pc0Fic29sdXRlKCkpIHtcbiAgICAgICAgICAgICAgICBhYnNvbHV0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmVzdWx0UGFydHMgPSBbLi4uam9pbkl0ZW0uZ2V0UGF0aFBhcnRzQXNBcnJheSgpXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0UGFydHMucHVzaCguLi5qb2luSXRlbS5nZXRQYXRoUGFydHNBc0FycmF5KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoam9pbkl0ZW0pKSB7XG4gICAgICAgICAgICByZXN1bHRQYXJ0cy5wdXNoKC4uLmpvaW5JdGVtKTtcbiAgICAgICAgfSBlbHNlIGlmIChQYXRoVG9rZW5zLmlzTXVsdGlUb2tlbihqb2luSXRlbSkpIHtcbiAgICAgICAgICAgIHJlc3VsdFBhcnRzLnB1c2goam9pbkl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHJlc3VsdFBhcnRzLCBhYnNvbHV0ZSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1vZGVsUGF0aDxUUmVzb2x2ZWQgZXh0ZW5kcyBib29sZWFuLCBUQWJzb2x1dGUgZXh0ZW5kcyBib29sZWFuPlxuICAgIGV4dGVuZHMgSUVxdWF0YWJsZTxJTW9kZWxQYXRoPGJvb2xlYW4sIGJvb2xlYW4+PiB7XG4gICAgcmVhZG9ubHkgcmVzb2x2ZWQ6IFRSZXNvbHZlZDtcbiAgICByZWFkb25seSBhYnNvbHV0ZTogVEFic29sdXRlO1xuXG4gICAgaXNFcXVhbHMobW9kZWxQYXRoOiBNb2RlbFBhdGgsIGVhY2hDdXJyZW50Q29sbGlzaW9uPzogRWFjaEN1cnJlbnRDb2xsaXNpb24pOiBib29sZWFuO1xuICAgIGdldEhhc2goZWFjaEN1cnJlbnRDb2xsaXNpb24/OiBFYWNoQ3VycmVudENvbGxpc2lvbik6IG51bWJlcjtcblxuICAgIGlzUmVzb2x2ZWQoKTogdGhpcyBpcyBJTW9kZWxQYXRoPHRydWUsIFRBYnNvbHV0ZT47XG4gICAgaXNBYnNvbHV0ZSgpOiB0aGlzIGlzIElNb2RlbFBhdGg8VFJlc29sdmVkLCB0cnVlPjtcbiAgICB0b0Fic29sdXRlKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCB0cnVlPjtcblxuICAgIGpvaW5XaXRoKC4uLnBhdGg6IHN0cmluZ1tdKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT47XG4gICAgam9pbldpdGgoLi4ucGF0aDogUGF0aFRva2VuW10pOiBJTW9kZWxQYXRoPGJvb2xlYW4sIFRBYnNvbHV0ZT47XG4gICAgam9pbldpdGgoLi4ucGF0aDogQXJyYXk8UmVzb2x2ZWRNb2RlbFBhdGggfCBzdHJpbmc+KTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT47XG4gICAgam9pbldpdGgoLi4ucGF0aDogQXJyYXk8QWJzb2x1dGVSZXNvbHZlZE1vZGVsUGF0aCB8IHN0cmluZz4pOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgdHJ1ZT47XG4gICAgam9pbldpdGgoLi4ucGF0aDogQXJyYXk8TW9kZWxQYXRoIHwgUGF0aFRva2VuPik6IElNb2RlbFBhdGg8Ym9vbGVhbiwgVEFic29sdXRlPjtcblxuICAgIGdldFBhdGhQYXJ0cygpOiBJdGVyYWJsZTxQYXRoVG9rZW5TcGVjPFRSZXNvbHZlZD4+O1xuICAgIGdldFBhdGhQYXJ0c0FzQXJyYXkoKTogUmVhZG9ubHlBcnJheTxQYXRoVG9rZW5TcGVjPFRSZXNvbHZlZD4+O1xuICAgIGdldFNpbXBsZVRva2Vuc1N0cmljdCgpOiBJdGVyYWJsZTxTaW1wbGVQYXRoVG9rZW4+O1xuICAgIGdldFNpbXBsZVRva2Vuc0FzQXJyYXlTdHJpY3QoKTogcmVhZG9ubHkgU2ltcGxlUGF0aFRva2VuW107XG5cbiAgICByZXNvbHZlQWxsKGluc3RhbmNlOiBzdHJpbmcpOiBNb2RlbFBhdGg7XG4gICAgaXNDb250YWluSXRlcmF0aW9uKCk6IGJvb2xlYW47XG4gICAgaXNDb250YWluQ3VycmVudEl0ZXJhdGlvbigpOiBib29sZWFuO1xuICAgIGlzQ29udGFpbkN1cnJlbnRPckVhY2hJdGVyYXRpb24oKTogYm9vbGVhbjtcbiAgICBnZXRMYXN0TGlzdFBhdGgoKTogUGF0aFRva2VuW107XG4gICAgaXNFbmRzV2l0aEl0ZXJhdGlvbigpOiBib29sZWFuO1xuICAgIGlzRW5kc1dpdGhDdXJyZW50SXRlcmF0aW9uKCk6IGJvb2xlYW47XG4gICAgaXNJbmNsdWRlcyhtb2RlbFBhdGg6IE1vZGVsUGF0aCk6IGJvb2xlYW47XG4gICAgZ2V0SXRlcmF0aW9uUmFuayhlYWNoQ3VycmVudENvbGxpc2lvbj86IEVhY2hDdXJyZW50Q29sbGlzaW9uKTogbnVtYmVyO1xuICAgIGlzRW1wdHkoKTogYm9vbGVhbjtcbiAgICBtYXRjaEZvcihtb2RlbFBhdGg6IE1vZGVsUGF0aCk6IFBhdGhNYXRjaGluZztcbiAgICBzdGFydHNXaXRoKG1vZGVsUGF0aDogTW9kZWxQYXRoKTogYm9vbGVhbjtcbiAgICBzcGxpdEJ5TXVsdGlwbGljaXR5KCk6IEl0ZXJhYmxlPFJlc29sdmVkTW9kZWxQYXRoIHwgdHlwZW9mIEVhY2hTeW1ib2wgfCB0eXBlb2YgQ3VycmVudFN5bWJvbD47XG4gICAgbm9ybWFsaXplKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+O1xuICAgIHRvQ3VycmVudEl0ZXJhdGlvbigpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICB0b0VhY2hJdGVyYXRpb24oKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT47XG4gICAgZ2V0QWxsUGFyZW50UGF0aHMoKTogSXRlcmFibGU8TW9kZWxQYXRoPjtcbiAgICB0cmltTGFzdFN0YXJJZkxhc3RUb2tlbigpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICBnZXRQYXJlbnRQYXRoKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+O1xuICAgIGFwcGx5SW5zdGFuY2VzRGlydHkoXG4gICAgICAgIGluc3RhbmNlczogU2ltcGxlUGF0aFRva2VuW10sXG4gICAgICAgIGZpbGxXaXRoTXVsdGlwbGljaXR5SWZIYXNOb0luc3RhbmNlPzogYm9vbGVhblxuICAgICk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+O1xuXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nO1xuICAgIHRvTGVnYWN5UGF0aCgpOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIE1vZGVsUGF0aCA9IElNb2RlbFBhdGg8Ym9vbGVhbiwgYm9vbGVhbj47XG5leHBvcnQgdHlwZSBSZXNvbHZlZE1vZGVsUGF0aCA9IElNb2RlbFBhdGg8dHJ1ZSwgYm9vbGVhbj47XG5leHBvcnQgdHlwZSBBYnNvbHV0ZU1vZGVsUGF0aCA9IElNb2RlbFBhdGg8Ym9vbGVhbiwgdHJ1ZT47XG5leHBvcnQgdHlwZSBBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoID0gSU1vZGVsUGF0aDx0cnVlLCB0cnVlPjtcblxuZXhwb3J0IHR5cGUgUmVsYXRpdmVNb2RlbFBhdGggPSBJTW9kZWxQYXRoPGJvb2xlYW4sIGZhbHNlPjtcbmV4cG9ydCB0eXBlIFJlbGF0aXZlUmVzb2x2ZWRNb2RlbFBhdGggPSBJTW9kZWxQYXRoPHRydWUsIGZhbHNlPjtcblxudHlwZSBQYXRoVG9rZW5TcGVjPFRSZXNvbHZlZCBleHRlbmRzIGJvb2xlYW4+ID0gVFJlc29sdmVkIGV4dGVuZHMgdHJ1ZSA/IHN0cmluZyA6IFBhdGhUb2tlbjtcblxudHlwZSBQYXRoVG9rZW5zU3BlYzxUUmVzb2x2ZWQgZXh0ZW5kcyBib29sZWFuPiA9IEFycmF5PFBhdGhUb2tlblNwZWM8VFJlc29sdmVkPj47XG5cbnR5cGUgUmVhZG9ubHlQYXRoVG9rZW5zU3BlYzxUUmVzb2x2ZWQgZXh0ZW5kcyBib29sZWFuPiA9IFJlYWRvbmx5QXJyYXk8UGF0aFRva2VuU3BlYzxUUmVzb2x2ZWQ+PjtcblxuZnVuY3Rpb24gaXNBbGxUb2tlbnNSZXNvbHZlZDxUUmVzb2x2ZWQgZXh0ZW5kcyBib29sZWFuPih0b2tlbnM6IFJlYWRvbmx5UGF0aFRva2Vuc1NwZWM8VFJlc29sdmVkPik6IFRSZXNvbHZlZCB7XG4gICAgLy8g0K8g0YfRgtC+LdGC0L4g0L3QtdC80L7Qs9GDINGB0L7QvtCx0YDQsNC30LjRgtGMINC60LDQuiDRgtGD0YIg0LLRgdGRINGB0YLRgNC+0LPQviDQvdCw0L/QuNGB0LDRgtGMLi4uXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIHJldHVybiB0b2tlbnMuZXZlcnkoUGF0aFRva2Vucy5pc1NpbXBsZVRva2VuKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vZGVsUGF0aEltcGw8VFJlc29sdmVkIGV4dGVuZHMgYm9vbGVhbiwgVEFic29sdXRlIGV4dGVuZHMgYm9vbGVhbj5cbiAgICBpbXBsZW1lbnRzIElFcXVhdGFibGU8TW9kZWxQYXRoPiwgSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT5cbntcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRva2VuczogUmVhZG9ubHlQYXRoVG9rZW5zU3BlYzxUUmVzb2x2ZWQ+O1xuICAgIHB1YmxpYyByZWFkb25seSBhYnNvbHV0ZTogVEFic29sdXRlO1xuICAgIHByaXZhdGUgbGVnYWN5UGF0aDogdW5kZWZpbmVkIHwgc3RyaW5nO1xuICAgIHByaXZhdGUgY2FjaGVkSGFzaDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBhdGhQYXJ0czogUmVhZG9ubHlQYXRoVG9rZW5zU3BlYzxUUmVzb2x2ZWQ+LCBhYnNvbHV0ZTogVEFic29sdXRlKSB7XG4gICAgICAgIHRoaXMudG9rZW5zID0gcGF0aFBhcnRzLmZpbHRlcih4ID0+IHggIT09IFwiXCIpO1xuICAgICAgICB0aGlzLmFic29sdXRlID0gYWJzb2x1dGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXNvbHZlZCgpOiBUUmVzb2x2ZWQge1xuICAgICAgICByZXR1cm4gaXNBbGxUb2tlbnNSZXNvbHZlZCh0aGlzLnRva2Vucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhdGhQYXJ0cygpOiBJdGVyYWJsZTxQYXRoVG9rZW5TcGVjPFRSZXNvbHZlZD4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXRoUGFydHNBc0FycmF5KCk6IFJlYWRvbmx5QXJyYXk8UGF0aFRva2VuU3BlYzxUUmVzb2x2ZWQ+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2VucztcbiAgICB9XG5cbiAgICBwdWJsaWMgKmdldFNpbXBsZVRva2Vuc1N0cmljdCgpOiBJdGVyYWJsZTxTaW1wbGVQYXRoVG9rZW4+IHtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiB0aGlzLnRva2Vucykge1xuICAgICAgICAgICAgaWYgKCFQYXRoVG9rZW5zLmlzU2ltcGxlVG9rZW4odG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGF0aCBtdXN0IG5vdCBjb250YWluIHNwZWMgdG9rZW5zXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeWllbGQgdG9rZW47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2ltcGxlVG9rZW5zQXNBcnJheVN0cmljdCgpOiByZWFkb25seSBTaW1wbGVQYXRoVG9rZW5bXSB7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdGhpcy50b2tlbnMpIHtcbiAgICAgICAgICAgIGlmICghUGF0aFRva2Vucy5pc1NpbXBsZVRva2VuKHRva2VuKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhdGggbXVzdCBub3QgY29udGFpbiBzcGVjIHRva2Vuc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyDQn9GA0L7QstC10YDQutCwINCy0YvRiNC1INCz0LDRgNCw0LXQvdGC0LjRgNGD0LXRgiDRh9GC0L4g0LHRg9C00YPRgiDRgtC+0LvRjNC60L4gU2ltcGxlUGF0aFRva2VuLlxuICAgICAgICAvLyDQktGB0LUgbWFwINC4IGZpbHRlciDRg9Cx0YDQsNC90Ysg0LTQu9GPINC/0YDQvtC40LfQstC+0LTQuNGC0LXQu9GM0L3QvtGB0YLQuFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiB0aGlzLnRva2VucztcbiAgICB9XG5cbiAgICBwdWJsaWMgam9pbldpdGgoLi4ucGF0aDogc3RyaW5nW10pOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICBwdWJsaWMgam9pbldpdGgoLi4ucGF0aDogUGF0aFRva2VuW10pOiBJTW9kZWxQYXRoPGJvb2xlYW4sIFRBYnNvbHV0ZT47XG4gICAgcHVibGljIGpvaW5XaXRoKC4uLnBhdGg6IEFycmF5PFJlc29sdmVkTW9kZWxQYXRoIHwgc3RyaW5nPik6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+O1xuICAgIHB1YmxpYyBqb2luV2l0aCguLi5wYXRoOiBBcnJheTxBYnNvbHV0ZVJlc29sdmVkTW9kZWxQYXRoIHwgc3RyaW5nPik6IElNb2RlbFBhdGg8VFJlc29sdmVkLCB0cnVlPjtcbiAgICBwdWJsaWMgam9pbldpdGgoLi4ucGF0aDogQXJyYXk8TW9kZWxQYXRoIHwgUGF0aFRva2VuPik6IElNb2RlbFBhdGg8Ym9vbGVhbiwgVEFic29sdXRlPjtcbiAgICBwdWJsaWMgam9pbldpdGgoLi4ucGF0aDogQXJyYXk8TW9kZWxQYXRoIHwgUGF0aFRva2VuPik6IElNb2RlbFBhdGg8Ym9vbGVhbiwgYm9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gam9pbk1vZGVsUGF0aHModGhpcywgLi4ucGF0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzUmVzb2x2ZWQoKTogdGhpcyBpcyBJTW9kZWxQYXRoPHRydWUsIFRBYnNvbHV0ZT4ge1xuICAgICAgICByZXR1cm4gaXNBbGxUb2tlbnNSZXNvbHZlZCh0aGlzLnRva2Vucyk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlc29sdmVBbGwoaW5zdGFuY2U6IHN0cmluZyk6IE1vZGVsUGF0aCB7XG4gICAgICAgIGNvbnN0IHRva2VucyA9IHRoaXMudG9rZW5zLm1hcCh0b2tlbiA9PiB7XG4gICAgICAgICAgICBpZiAoUGF0aFRva2Vucy5pc1NpbXBsZVRva2VuKHRva2VuKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGwodG9rZW5zLCB0aGlzLmFic29sdXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNDb250YWluSXRlcmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMuc29tZSh4ID0+IHggPT09IFBhdGhUb2tlbnMuZWFjaCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQ29udGFpbkN1cnJlbnRJdGVyYXRpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2Vucy5zb21lKHggPT4geCA9PT0gUGF0aFRva2Vucy5jdXJyZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNDb250YWluQ3VycmVudE9yRWFjaEl0ZXJhdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zLnNvbWUoeCA9PiB4ID09PSBQYXRoVG9rZW5zLmN1cnJlbnQgfHwgeCA9PT0gUGF0aFRva2Vucy5lYWNoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TGFzdExpc3RQYXRoKCk6IFBhdGhUb2tlbltdIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzQ29udGFpbkl0ZXJhdGlvbigpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXRoIG11c3QgY29udGFpbiBpdGVyYXRpb25cIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDQn9GA0L7QstC10YDQutCwINCy0YvRiNC1INCz0LDRgNCw0L3RgtC40YDRg9C10YIsINGH0YLQviDQsdGD0LTQtdGCIFBhdGhUb2tlbnMuZWFjaFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IGxhc3RJdGVyYXRpb25JbmRleCA9IHRoaXMudG9rZW5zLmxhc3RJbmRleE9mKFBhdGhUb2tlbnMuZWFjaCk7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2Vucy5zbGljZSgwLCBsYXN0SXRlcmF0aW9uSW5kZXgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0VuZHNXaXRoSXRlcmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBsYXN0SXRlbSA9IEl0ZXJVdGlscy5sYXN0KHRoaXMudG9rZW5zKTtcbiAgICAgICAgcmV0dXJuIGxhc3RJdGVtID09IFBhdGhUb2tlbnMuZWFjaDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNFbmRzV2l0aEN1cnJlbnRJdGVyYXRpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGxhc3RJdGVtID0gSXRlclV0aWxzLmxhc3QodGhpcy50b2tlbnMpO1xuICAgICAgICByZXR1cm4gbGFzdEl0ZW0gPT0gUGF0aFRva2Vucy5jdXJyZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0Fic29sdXRlKCk6IHRoaXMgaXMgSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIHRydWU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWJzb2x1dGU7XG4gICAgfVxuXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLnRva2Vucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAodGhpcy5hYnNvbHV0ZSA/IFwiL1wiIDogXCJcIikgKyB0aGlzLnRva2Vucy5tYXAoeCA9PiB0aGlzLnBhdGhQYXJ0VG9TdHJpbmcoeCkpLmpvaW4oXCIvXCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0xlZ2FjeVBhdGgoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVnYWN5UGF0aCA/PyAodGhpcy5sZWdhY3lQYXRoID0gdGhpcy50b2tlbnMubWFwKHggPT4gdGhpcy5wYXRoUGFydFRvU3RyaW5nKHgpKS5qb2luKFwiL1wiKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRXF1YWxzKFxuICAgICAgICBtb2RlbFBhdGg6IE1vZGVsUGF0aCxcbiAgICAgICAgZWFjaEN1cnJlbnRDb2xsaXNpb246IEVhY2hDdXJyZW50Q29sbGlzaW9uID0gRWFjaEN1cnJlbnRDb2xsaXNpb24uQXJlU2FtZVxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoZWFjaEN1cnJlbnRDb2xsaXNpb24gPT09IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZVNhbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvTGVnYWN5UGF0aCgpID09PSBtb2RlbFBhdGgudG9MZWdhY3lQYXRoKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHRoaXMuaXNBYnNvbHV0ZSgpID09PSBtb2RlbFBhdGguaXNBYnNvbHV0ZSgpICYmXG4gICAgICAgICAgICAgICAgSXRlcmF0b3IuZnJvbShJdGVyVXRpbHMuemlwKHRoaXMuZ2V0UGF0aFBhcnRzKCksIG1vZGVsUGF0aC5nZXRQYXRoUGFydHMoKSkpLmV2ZXJ5KFxuICAgICAgICAgICAgICAgICAgICAoW3QxLCB0Ml0pID0+IHQxID09PSB0MlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQktGB0LXQs9C00LAg0YbQtdC70L7QtSDQv9C+0LvQvtC20LjRgtC10LvRjNC90L7QtSDQsdC10LfQt9C90LDQutC+0LLQvtC1IDMyLdCx0LjRgtC90L7QtSDRh9C40YHQu9C+XG4gICAgICovXG4gICAgcHVibGljIGdldEhhc2goZWFjaEN1cnJlbnRDb2xsaXNpb246IEVhY2hDdXJyZW50Q29sbGlzaW9uID0gRWFjaEN1cnJlbnRDb2xsaXNpb24uQXJlU2FtZSk6IG51bWJlciB7XG4gICAgICAgIGlmICh0aGlzLmNhY2hlZEhhc2ggPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgaGFzaCA9IDUzODE7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHJldmVyc2VBcnJheSh0aGlzLnRva2VucykpIHtcbiAgICAgICAgICAgICAgICBsZXQgY3VycmVudFN0cjogc3RyaW5nO1xuICAgICAgICAgICAgICAgIGlmIChQYXRoVG9rZW5zLmlzU2ltcGxlVG9rZW4odG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdHIgPSB0b2tlbjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWFjaEN1cnJlbnRDb2xsaXNpb24gPT09IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZURpZmZlcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0ciA9IHRva2VuID09PSBQYXRoVG9rZW5zLmVhY2ggPyBcIipcIiA6IFwiIVwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0ciA9IFwiKlwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBzdHJpbmdJbmRleCA9IGN1cnJlbnRTdHIubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHdoaWxlIChzdHJpbmdJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYml0d2lzZVxuICAgICAgICAgICAgICAgICAgICBoYXNoID0gKGhhc2ggKiAzMykgXiBjdXJyZW50U3RyLmNoYXJDb2RlQXQoLS1zdHJpbmdJbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1iaXR3aXNlXG4gICAgICAgICAgICAgICAgSmF2YVNjcmlwdCBkb2VzIGJpdHdpc2Ugb3BlcmF0aW9ucyAobGlrZSBYT1IsIGFib3ZlKSBvbiAzMi1iaXQgc2lnbmVkXG4gICAgICAgICAgICAgICAgaW50ZWdlcnMuIFNpbmNlIHdlIHdhbnQgdGhlIHJlc3VsdHMgdG8gYmUgYWx3YXlzIHBvc2l0aXZlLCBjb252ZXJ0IHRoZVxuICAgICAgICAgICAgICAgIHNpZ25lZCBpbnQgdG8gYW4gdW5zaWduZWQgYnkgZG9pbmcgYW4gdW5zaWduZWQgYml0c2hpZnQuXG4gICAgICAgICAgKi9cbiAgICAgICAgICAgIHRoaXMuY2FjaGVkSGFzaCA9IGhhc2ggPj4+IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkSGFzaDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNJbmNsdWRlcyhtb2RlbFBhdGg6IE1vZGVsUGF0aCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB0YXJnZXRUb2tlbnMgPSBtb2RlbFBhdGguZ2V0UGF0aFBhcnRzQXNBcnJheSgpO1xuICAgICAgICBpZiAodGhpcy50b2tlbnMubGVuZ3RoICE9PSB0YXJnZXRUb2tlbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbGVmdFBhcnQgPSB0aGlzLnRva2Vuc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0UGFydCA9IHRhcmdldFRva2Vuc1tpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGVmdFBhcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJpZ2h0UGFydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGVmdFBhcnQgIT09IHJpZ2h0UGFydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxlZnRQYXJ0ID09PSBQYXRoVG9rZW5zLmN1cnJlbnQgfHwgbGVmdFBhcnQgPT09IFBhdGhUb2tlbnMuZWFjaCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmlnaHRQYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNGaW5pdGUoTnVtYmVyKHJpZ2h0UGFydCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0UGFydCAhPT0gUGF0aFRva2Vucy5jdXJyZW50ICYmIHJpZ2h0UGFydCAhPT0gUGF0aFRva2Vucy5lYWNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJdGVyYXRpb25SYW5rKGVhY2hDdXJyZW50Q29sbGlzaW9uOiBFYWNoQ3VycmVudENvbGxpc2lvbiA9IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZURpZmZlcmVudCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBjb3VudChcbiAgICAgICAgICAgIEl0ZXJhdG9yLmZyb20odGhpcy50b2tlbnMpLmZpbHRlcih4ID0+XG4gICAgICAgICAgICAgICAgZWFjaEN1cnJlbnRDb2xsaXNpb24gPT0gRWFjaEN1cnJlbnRDb2xsaXNpb24uQXJlRGlmZmVyZW50XG4gICAgICAgICAgICAgICAgICAgID8geCA9PT0gUGF0aFRva2Vucy5lYWNoXG4gICAgICAgICAgICAgICAgICAgIDogUGF0aFRva2Vucy5pc011bHRpVG9rZW4oeClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zLmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgbWF0Y2hGb3IobW9kZWxQYXRoOiBNb2RlbFBhdGgpOiBQYXRoTWF0Y2hpbmcge1xuICAgICAgICBpZiAoIXRoaXMuaXNBYnNvbHV0ZSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBtYXRjaCBub24gYWJzb2x1dGUgcGF0aCAnJHt0aGlzLnRvU3RyaW5nKCl9J2ApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbW9kZWxQYXRoLmlzQWJzb2x1dGUoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgbWF0Y2ggbm9uIGFic29sdXRlIHBhdGggJyR7bW9kZWxQYXRoLnRvU3RyaW5nKCl9J2ApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQYXRoTWF0Y2hlci5tYXRjaCh0aGlzLnRva2VucywgbW9kZWxQYXRoLmdldFBhdGhQYXJ0c0FzQXJyYXkoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXJ0c1dpdGgobW9kZWxQYXRoOiBNb2RlbFBhdGgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdGhpc1BhcnRzID0gdGhpcy5nZXRQYXRoUGFydHNBc0FycmF5KCk7XG4gICAgICAgIGNvbnN0IG90aGVyUGFydHMgPSBtb2RlbFBhdGguZ2V0UGF0aFBhcnRzQXNBcnJheSgpO1xuICAgICAgICByZXR1cm4gb3RoZXJQYXJ0cy5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB2YWx1ZSA9PT0gdGhpc1BhcnRzW2luZGV4XSk7XG4gICAgfVxuXG4gICAgcHVibGljICpzcGxpdEJ5TXVsdGlwbGljaXR5KCk6IEl0ZXJhYmxlPFJlc29sdmVkTW9kZWxQYXRoIHwgdHlwZW9mIEVhY2hTeW1ib2wgfCB0eXBlb2YgQ3VycmVudFN5bWJvbD4ge1xuICAgICAgICBsZXQgbGFzdFNpbXBsZVBhcnRzID0gbmV3IE1vZGVsUGF0aEJ1aWxkZXIodGhpcy5pc0Fic29sdXRlKCkpO1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRoaXMudG9rZW5zKSB7XG4gICAgICAgICAgICBpZiAoUGF0aFRva2Vucy5pc1NpbXBsZVRva2VuKHRva2VuKSkge1xuICAgICAgICAgICAgICAgIGxhc3RTaW1wbGVQYXJ0cy5hcHBlbmQodG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIWxhc3RTaW1wbGVQYXJ0cy5lbXB0eSkge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBsYXN0U2ltcGxlUGFydHMudG9SZXNvbHZlZFBhdGgoKTtcbiAgICAgICAgICAgICAgICAgICAgbGFzdFNpbXBsZVBhcnRzID0gbmV3IE1vZGVsUGF0aEJ1aWxkZXIoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWxhc3RTaW1wbGVQYXJ0cy5lbXB0eSkge1xuICAgICAgICAgICAgeWllbGQgbGFzdFNpbXBsZVBhcnRzLnRvUmVzb2x2ZWRQYXRoKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbm9ybWFsaXplKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0VG9rZW5zOiBQYXRoVG9rZW5zU3BlYzxUUmVzb2x2ZWQ+ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcGF0aFBhcnQgb2YgdGhpcy50b2tlbnMpIHtcbiAgICAgICAgICAgIGlmIChwYXRoUGFydCA9PT0gXCIuLlwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRUb2tlbnMucG9wKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNBYnNvbHV0ZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggaXMgaW52YWxpZCAnJHt0aGlzLnRvU3RyaW5nKCl9J2ApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0VG9rZW5zLnB1c2goXCIuLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBhdGhQYXJ0ID09PSBcIi5cIikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0VG9rZW5zLnB1c2gocGF0aFBhcnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT4ocmVzdWx0VG9rZW5zLCB0aGlzLmFic29sdXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAc3VtbWFyeSDQodC/0LXRhtC40YTQuNC60LDRgtC+0YDRiyDQvNC90L7QttC10YHRgtCy0LXQvdC90L7RgdGC0LggRWFjaCDQt9Cw0LzQtdC90Y/QtdGCINC90LAgQ3VycmVudFxuICAgICAqL1xuICAgIHB1YmxpYyB0b0N1cnJlbnRJdGVyYXRpb24oKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT4ge1xuICAgICAgICBpZiAodGhpcy5pc1Jlc29sdmVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTk9URSDQotGD0YIg0L3QtSDQv9C+0LvRg9GH0LDQtdGC0YHRjyDQvdCw0LvQvtC20LjRgtGMINC00LjRgdC60YDQuNC80LjQvdCw0YLQvtGAXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICBjb25zdCBwYXRoUGFydHM6IFBhdGhUb2tlbnNTcGVjPFRSZXNvbHZlZD4gPSB0aGlzLnRva2Vucy5tYXAoeCA9PlxuICAgICAgICAgICAgICAgIHggPT09IFBhdGhUb2tlbnMuZWFjaCA/IFBhdGhUb2tlbnMuY3VycmVudCA6IHhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8VFJlc29sdmVkLCBUQWJzb2x1dGU+KHBhdGhQYXJ0cywgdGhpcy5hYnNvbHV0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdG9FYWNoSXRlcmF0aW9uKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNSZXNvbHZlZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5PVEUg0KLRg9GCINC90LUg0L/QvtC70YPRh9Cw0LXRgtGB0Y8g0L3QsNC70L7QttC40YLRjCDQtNC40YHQutGA0LjQvNC40L3QsNGC0L7RgFxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgY29uc3QgcGF0aFBhcnRzOiBQYXRoVG9rZW5zU3BlYzxUUmVzb2x2ZWQ+ID0gdGhpcy50b2tlbnMubWFwKHggPT5cbiAgICAgICAgICAgICAgICB4ID09PSBQYXRoVG9rZW5zLmN1cnJlbnQgPyBQYXRoVG9rZW5zLmVhY2ggOiB4XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPFRSZXNvbHZlZCwgVEFic29sdXRlPihwYXRoUGFydHMsIHRoaXMuYWJzb2x1dGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHRvQWJzb2x1dGUoKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIHRydWU+IHtcbiAgICAgICAgaWYgKCF0aGlzLmFic29sdXRlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggJyR7dGhpcy50b0xlZ2FjeVBhdGgoKX0gaXMgbm90IGFic29sdXRlJ2ApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDxUUmVzb2x2ZWQsIHRydWU+KHRoaXMudG9rZW5zLCB0cnVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKmdldEFsbFBhcmVudFBhdGhzKCk6IEl0ZXJhYmxlPE1vZGVsUGF0aD4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTW9kZWxQYXRoQnVpbGRlcih0aGlzLmlzQWJzb2x1dGUoKSk7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgSXRlclV0aWxzLnNraXBMYXN0KHRoaXMuZ2V0UGF0aFBhcnRzKCksIDEpKSB7XG4gICAgICAgICAgICByZXN1bHQuYXBwZW5kKHRva2VuKTtcbiAgICAgICAgICAgIHlpZWxkIHJlc3VsdC50b1BhdGgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB0cmltTGFzdFN0YXJJZkxhc3RUb2tlbigpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPiB7XG4gICAgICAgIGNvbnN0IGxhc3RJdGVtID0gSXRlclV0aWxzLmxhc3QodGhpcy50b2tlbnMpO1xuICAgICAgICBpZiAobGFzdEl0ZW0gIT0gdW5kZWZpbmVkICYmIFBhdGhUb2tlbnMuaXNNdWx0aVRva2VuKGxhc3RJdGVtKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHRoaXMudG9rZW5zLnNsaWNlKDAsIC0xKSwgdGhpcy5hYnNvbHV0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhcmVudFBhdGgoKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTW9kZWxQYXRoQnVpbGRlcih0aGlzLmFic29sdXRlKTtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiBJdGVyVXRpbHMuc2tpcExhc3QodGhpcy5nZXRQYXRoUGFydHMoKSwgMSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodG9rZW4pO1xuICAgICAgICB9XG4gICAgICAgIC8vINCi0YPRgiDQv9C+0LvRg9GH0LDQtdGC0YHRjyDRgtCw0LosINGH0YLQviDQv9C+INC00YDRg9Cz0L7QvNGDINC90LjQutCw0LpcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICByZXR1cm4gcmVzdWx0LnRvUGF0aCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhcHBseUluc3RhbmNlc0RpcnR5KFxuICAgICAgICBpbnN0YW5jZXM6IFNpbXBsZVBhdGhUb2tlbltdLFxuICAgICAgICBmaWxsV2l0aE11bHRpcGxpY2l0eUlmSGFzTm9JbnN0YW5jZT86IGJvb2xlYW5cbiAgICApOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPiB7XG4gICAgICAgIGlmICh0aGlzLmlzUmVzb2x2ZWQoKSB8fCBpbnN0YW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5zdGFuY2VDb3VudGVyID0gMDtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IE1vZGVsUGF0aEJ1aWxkZXIodHJ1ZSk7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdGhpcy5nZXRQYXRoUGFydHMoKSkge1xuICAgICAgICAgICAgaWYgKFBhdGhUb2tlbnMuaXNNdWx0aVRva2VuKHRva2VuKSAmJiBpbnN0YW5jZUNvdW50ZXIgPCBpbnN0YW5jZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VPckVhY2ggPVxuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZXNbaW5zdGFuY2VDb3VudGVyXSA/P1xuICAgICAgICAgICAgICAgICAgICAoZmlsbFdpdGhNdWx0aXBsaWNpdHlJZkhhc05vSW5zdGFuY2UgPT0gdHJ1ZSA/IFBhdGhUb2tlbnMuZWFjaCA6IHJlamVjdCgpKTtcbiAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGluc3RhbmNlT3JFYWNoKTtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUNvdW50ZXIrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8g0KLRg9GCINC/0L7Qu9GD0YfQsNC10YLRgdGPINGC0LDQuiwg0YfRgtC+INC/0L4g0LTRgNGD0LPQvtC80YMg0L3QuNC60LDQulxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIHJldHVybiByZXN1bHQudG9QYXRoKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXRoUGFydFRvU3RyaW5nKHBhdGhQYXJ0OiBQYXRoVG9rZW4pOiBzdHJpbmcge1xuICAgICAgICBpZiAodHlwZW9mIHBhdGhQYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gcGF0aFBhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGhQYXJ0ID09PSBQYXRoVG9rZW5zLmVhY2gpIHtcbiAgICAgICAgICAgIHJldHVybiBcIipcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aFBhcnQgPT09IFBhdGhUb2tlbnMuY3VycmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiKlwiO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXRoIHBhcnQgc3BlY2lmaWVkOiAke2Vuc3VyZUFuZEdldFN0cmluZyhwYXRoUGFydCl9YCk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLElBQUFBLGNBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLFlBQUEsR0FBQUQsT0FBQTtBQUVBLElBQUFFLHFCQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxpQkFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksWUFBQSxHQUFBSixPQUFBO0FBR0EsTUFBTUssVUFBVSxHQUFHQyxNQUFNLENBQUNDLEdBQUcsQ0FBQyxVQUFVLENBQUM7QUFDekMsTUFBTUMsYUFBYSxHQUFHRixNQUFNLENBQUNDLEdBQUcsQ0FBQyxhQUFhLENBQUM7QUFFeEMsTUFBTUUsVUFBVSxDQUFDO0VBSXBCLE9BQWNDLFlBQVlBLENBQUNDLElBQTJCLEVBQW9EO0lBQ3RHLE9BQU9BLElBQUksS0FBS0YsVUFBVSxDQUFDRyxJQUFJLElBQUlELElBQUksS0FBS0YsVUFBVSxDQUFDSSxPQUFPO0VBQ2xFO0VBRUEsT0FBY0MsYUFBYUEsQ0FBQ0gsSUFBMkIsRUFBa0I7SUFDckUsT0FBTyxPQUFPQSxJQUFJLEtBQUssUUFBUTtFQUNuQztFQUVBLE9BQWNJLGVBQWVBLENBQUNKLElBQTJCLEVBQWtCO0lBQ3ZFLE9BQU8sT0FBT0EsSUFBSSxLQUFLLFFBQVEsSUFBSSxRQUFRLENBQUNLLElBQUksQ0FBQ0wsSUFBSSxDQUFDO0VBQzFEO0VBRUEsT0FBY00sOEJBQThCQSxDQUFDTixJQUEyQixFQUFr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
467
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfSXRlcmFibGVVdGlscyIsInJlcXVpcmUiLCJfVHlwaW5nVXRpbHMiLCJfRWFjaEN1cnJlbnRDb2xsaXNpb24iLCJfTW9kZWxQYXRoQnVpbGRlciIsIl9QYXRoTWF0Y2hlciIsIkVhY2hTeW1ib2wiLCJTeW1ib2wiLCJmb3IiLCJDdXJyZW50U3ltYm9sIiwiUGF0aFRva2VucyIsImlzTXVsdGlUb2tlbiIsInBhcnQiLCJlYWNoIiwiY3VycmVudCIsImlzU2ltcGxlVG9rZW4iLCJpc0luc3RhbmNlVG9rZW4iLCJ0ZXN0IiwiaXNJbnN0YW5jZVRva2VuT3JJbnN0YW5jZXNTcGVjIiwiZXhwb3J0cyIsImlzTW9kZWxQYXRoIiwicGF0aCIsIk1vZGVsUGF0aEltcGwiLCJjb252ZXJ0VG9MZWdhY3lQYXRoIiwidG9MZWdhY3lQYXRoIiwiY29udmVydFRvQWJzb2x1dGVNb2RlbFBhdGgiLCJjcmVhdGVBYnNvbHV0ZUZyb21NYXNrIiwiZW1wdHlNb2RlbFBhdGgiLCJlbXB0eUFic29sdXRlTW9kZWxQYXRoIiwiY3JlYXRlTW9kZWxQYXRoIiwiYWJzb2x1dGUiLCJwYXJ0UGFydFN0cmluZ3MiLCJzcGxpdCIsImVuc3VyZVBsYWluUGF0aFBhcnRzRG9lc05vdENvbnRhaW5NdWx0aXBsaWNpdHkiLCJzdGFydHNXaXRoIiwic2xpY2UiLCJjcmVhdGVGcm9tTWFzayIsIm11bHRpcGxpY2l0eVN5bWJvbCIsIm1hcCIsIngiLCJwYXJ0cyIsInNvbWUiLCJFcnJvciIsImNyZWF0ZUFic29sdXRlIiwiY3JlYXRlUmVsYXRpdmVSZXNvbHZlZE1vZGVsUGF0aCIsImNyZWF0ZUFic29sdXRlRnJvbVRva2VucyIsInRva2VucyIsImNyZWF0ZUFic29sdXRlUmVzb2x2ZWRGcm9tVG9rZW5zIiwiY3JlYXRlUmVsYXRpdmVGcm9tVG9rZW5zIiwiam9pbk1vZGVsUGF0aHMiLCJyZXN1bHRQYXJ0cyIsImpvaW5JdGVtIiwicHVzaCIsImlzQWJzb2x1dGUiLCJnZXRQYXRoUGFydHNBc0FycmF5IiwiQXJyYXkiLCJpc0FycmF5IiwiaXNBbGxUb2tlbnNSZXNvbHZlZCIsImV2ZXJ5IiwiY29uc3RydWN0b3IiLCJwYXRoUGFydHMiLCJsZWdhY3lQYXRoIiwiY2FjaGVkSGFzaCIsImZpbHRlciIsInJlc29sdmVkIiwiZ2V0UGF0aFBhcnRzIiwiZ2V0U2ltcGxlVG9rZW5zU3RyaWN0IiwidG9rZW4iLCJnZXRTaW1wbGVUb2tlbnNBc0FycmF5U3RyaWN0Iiwiam9pbldpdGgiLCJpc1Jlc29sdmVkIiwicmVzb2x2ZUFsbCIsImluc3RhbmNlIiwiaXNDb250YWluSXRlcmF0aW9uIiwiaXNDb250YWluQ3VycmVudEl0ZXJhdGlvbiIsImlzQ29udGFpbkN1cnJlbnRPckVhY2hJdGVyYXRpb24iLCJnZXRMYXN0TGlzdFBhdGgiLCJsYXN0SXRlcmF0aW9uSW5kZXgiLCJsYXN0SW5kZXhPZiIsImlzRW5kc1dpdGhJdGVyYXRpb24iLCJsYXN0SXRlbSIsIkl0ZXJVdGlscyIsImxhc3QiLCJpc0VuZHNXaXRoQ3VycmVudEl0ZXJhdGlvbiIsInRvU3RyaW5nIiwibGVuZ3RoIiwicGF0aFBhcnRUb1N0cmluZyIsImpvaW4iLCJfdGhpcyRsZWdhY3lQYXRoIiwiaXNFcXVhbHMiLCJtb2RlbFBhdGgiLCJlYWNoQ3VycmVudENvbGxpc2lvbiIsIkVhY2hDdXJyZW50Q29sbGlzaW9uIiwiQXJlU2FtZSIsIkl0ZXJhdG9yIiwiZnJvbSIsInppcCIsInQxIiwidDIiLCJnZXRIYXNoIiwidW5kZWZpbmVkIiwiaGFzaCIsInJldmVyc2VBcnJheSIsImN1cnJlbnRTdHIiLCJBcmVEaWZmZXJlbnQiLCJzdHJpbmdJbmRleCIsImNoYXJDb2RlQXQiLCJpc0luY2x1ZGVzIiwidGFyZ2V0VG9rZW5zIiwiaSIsImxlZnRQYXJ0IiwicmlnaHRQYXJ0IiwiaXNGaW5pdGUiLCJOdW1iZXIiLCJnZXRJdGVyYXRpb25SYW5rIiwiY291bnQiLCJpc0VtcHR5IiwibWF0Y2hGb3IiLCJQYXRoTWF0Y2hlciIsIm1hdGNoIiwidGhpc1BhcnRzIiwib3RoZXJQYXJ0cyIsInZhbHVlIiwiaW5kZXgiLCJlbmRzV2l0aCIsInJldmVyc2UiLCJzcGxpdEJ5TXVsdGlwbGljaXR5IiwibGFzdFNpbXBsZVBhcnRzIiwiTW9kZWxQYXRoQnVpbGRlciIsImFwcGVuZCIsImVtcHR5IiwidG9SZXNvbHZlZFBhdGgiLCJub3JtYWxpemUiLCJyZXN1bHRUb2tlbnMiLCJwYXRoUGFydCIsInBvcCIsInRvQ3VycmVudEl0ZXJhdGlvbiIsInRvRWFjaEl0ZXJhdGlvbiIsInRvQWJzb2x1dGUiLCJnZXRBbGxQYXJlbnRQYXRocyIsInJlc3VsdCIsInNraXBMYXN0IiwidG9QYXRoIiwidHJpbUxhc3RTdGFySWZMYXN0VG9rZW4iLCJnZXRQYXJlbnRQYXRoIiwiYXBwbHlJbnN0YW5jZXNEaXJ0eSIsImluc3RhbmNlcyIsImZpbGxXaXRoTXVsdGlwbGljaXR5SWZIYXNOb0luc3RhbmNlIiwiaW5zdGFuY2VDb3VudGVyIiwiX2luc3RhbmNlcyRpbnN0YW5jZUNvIiwiaW5zdGFuY2VPckVhY2giLCJyZWplY3QiLCJlbnN1cmVBbmRHZXRTdHJpbmciXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9Db21tb24vTW9kZWxQYXRoL01vZGVsUGF0aC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCaW5kaW5nUGF0aCB9IGZyb20gXCIuLi8uLi9FbmdpbmUvc3JjL0VuZ2luZS9Db3JlL0NvcmVUeXBlc1wiO1xuaW1wb3J0IHsgY291bnQsIEl0ZXJVdGlscywgcmV2ZXJzZUFycmF5IH0gZnJvbSBcIi4uL0l0ZXJhYmxlVXRpbHNcIjtcbmltcG9ydCB7IGVuc3VyZUFuZEdldFN0cmluZywgcmVqZWN0IH0gZnJvbSBcIi4uL1R5cGluZ1V0aWxzXCI7XG5cbmltcG9ydCB7IEVhY2hDdXJyZW50Q29sbGlzaW9uIH0gZnJvbSBcIi4vRWFjaEN1cnJlbnRDb2xsaXNpb25cIjtcbmltcG9ydCB7IE1vZGVsUGF0aEJ1aWxkZXIgfSBmcm9tIFwiLi9Nb2RlbFBhdGhCdWlsZGVyXCI7XG5pbXBvcnQgeyBQYXRoTWF0Y2hlciwgUGF0aE1hdGNoaW5nIH0gZnJvbSBcIi4vUGF0aE1hdGNoZXJcIjtcbmltcG9ydCB7IElFcXVhdGFibGUgfSBmcm9tIFwiLi9JRXF1YXRhYmxlXCI7XG5cbmNvbnN0IEVhY2hTeW1ib2wgPSBTeW1ib2wuZm9yKFwiX19FQUNIX19cIik7XG5jb25zdCBDdXJyZW50U3ltYm9sID0gU3ltYm9sLmZvcihcIl9fQ1VSUkVOVF9fXCIpO1xuXG5leHBvcnQgY2xhc3MgUGF0aFRva2VucyB7XG4gICAgcHVibGljIHN0YXRpYyBlYWNoOiB0eXBlb2YgRWFjaFN5bWJvbCA9IEVhY2hTeW1ib2w7XG4gICAgcHVibGljIHN0YXRpYyBjdXJyZW50OiB0eXBlb2YgQ3VycmVudFN5bWJvbCA9IEN1cnJlbnRTeW1ib2w7XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzTXVsdGlUb2tlbihwYXJ0OiB1bmRlZmluZWQgfCBQYXRoVG9rZW4pOiBwYXJ0IGlzIHR5cGVvZiBFYWNoU3ltYm9sIHwgdHlwZW9mIEN1cnJlbnRTeW1ib2wge1xuICAgICAgICByZXR1cm4gcGFydCA9PT0gUGF0aFRva2Vucy5lYWNoIHx8IHBhcnQgPT09IFBhdGhUb2tlbnMuY3VycmVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzU2ltcGxlVG9rZW4ocGFydDogdW5kZWZpbmVkIHwgUGF0aFRva2VuKTogcGFydCBpcyBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHBhcnQgPT09IFwic3RyaW5nXCI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0luc3RhbmNlVG9rZW4ocGFydDogdW5kZWZpbmVkIHwgUGF0aFRva2VuKTogcGFydCBpcyBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHBhcnQgPT09IFwic3RyaW5nXCIgJiYgL15cXGQrJC9pLnRlc3QocGFydCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0luc3RhbmNlVG9rZW5Pckluc3RhbmNlc1NwZWMocGFydDogdW5kZWZpbmVkIHwgUGF0aFRva2VuKTogcGFydCBpcyBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHBhcnQgPT09IFwic3RyaW5nXCIgJiYgKC9eXFxkKyQvaS50ZXN0KHBhcnQpIHx8IC9eXFxbKFxcZCtcXCw/KStcXF0kL2kudGVzdChwYXJ0KSk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBTaW1wbGVQYXRoVG9rZW4gPSBzdHJpbmc7XG5cbmV4cG9ydCB0eXBlIFBhdGhUb2tlbiA9IFNpbXBsZVBhdGhUb2tlbiB8IHR5cGVvZiBFYWNoU3ltYm9sIHwgdHlwZW9mIEN1cnJlbnRTeW1ib2w7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01vZGVsUGF0aChwYXRoOiBCaW5kaW5nUGF0aCB8IE1vZGVsUGF0aCB8IHVua25vd24pOiBwYXRoIGlzIE1vZGVsUGF0aCB7XG4gICAgcmV0dXJuIHR5cGVvZiBwYXRoICE9PSBcInN0cmluZ1wiICYmIHBhdGggaW5zdGFuY2VvZiBNb2RlbFBhdGhJbXBsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFRvTGVnYWN5UGF0aChwYXRoOiBCaW5kaW5nUGF0aCB8IE1vZGVsUGF0aCk6IEJpbmRpbmdQYXRoIHtcbiAgICByZXR1cm4gaXNNb2RlbFBhdGgocGF0aCkgPyBwYXRoLnRvTGVnYWN5UGF0aCgpIDogcGF0aDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb0Fic29sdXRlTW9kZWxQYXRoPFIgZXh0ZW5kcyBib29sZWFuLCBBIGV4dGVuZHMgYm9vbGVhbj4oXG4gICAgcGF0aDogQmluZGluZ1BhdGggfCBJTW9kZWxQYXRoPFIsIEE+XG4pOiBJTW9kZWxQYXRoPFIsIHRydWU+O1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb0Fic29sdXRlTW9kZWxQYXRoKHBhdGg6IEJpbmRpbmdQYXRoIHwgQWJzb2x1dGVNb2RlbFBhdGgpOiBBYnNvbHV0ZU1vZGVsUGF0aCB7XG4gICAgcmV0dXJuIGlzTW9kZWxQYXRoKHBhdGgpID8gcGF0aCA6IGNyZWF0ZUFic29sdXRlRnJvbU1hc2socGF0aCwgUGF0aFRva2Vucy5lYWNoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVtcHR5TW9kZWxQYXRoKCk6IFJlbGF0aXZlUmVzb2x2ZWRNb2RlbFBhdGgge1xuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDx0cnVlLCBmYWxzZT4oW10sIGZhbHNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVtcHR5QWJzb2x1dGVNb2RlbFBhdGgoKTogQWJzb2x1dGVSZXNvbHZlZE1vZGVsUGF0aCB7XG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIHRydWU+KFtdLCB0cnVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vZGVsUGF0aChwYXRoOiBzdHJpbmcsIGFic29sdXRlOiB0cnVlKTogQWJzb2x1dGVSZXNvbHZlZE1vZGVsUGF0aDtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2RlbFBhdGgocGF0aDogc3RyaW5nLCBhYnNvbHV0ZTogZmFsc2UpOiBSZWxhdGl2ZVJlc29sdmVkTW9kZWxQYXRoO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vZGVsUGF0aChwYXRoOiBzdHJpbmcsIGFic29sdXRlOiBcImF1dG9cIik6IFJlc29sdmVkTW9kZWxQYXRoO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vZGVsUGF0aChwYXRoOiBzdHJpbmcsIGFic29sdXRlOiBib29sZWFuIHwgXCJhdXRvXCIpOiBSZXNvbHZlZE1vZGVsUGF0aCB7XG4gICAgY29uc3QgcGFydFBhcnRTdHJpbmdzID0gcGF0aC5zcGxpdChcIi9cIik7XG4gICAgZW5zdXJlUGxhaW5QYXRoUGFydHNEb2VzTm90Q29udGFpbk11bHRpcGxpY2l0eShwYXJ0UGFydFN0cmluZ3MpO1xuICAgIGlmIChhYnNvbHV0ZSA9PT0gXCJhdXRvXCIpIHtcbiAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDx0cnVlLCB0cnVlPihwYXJ0UGFydFN0cmluZ3Muc2xpY2UoMSksIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIGZhbHNlPihwYXJ0UGFydFN0cmluZ3MsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYWJzb2x1dGUgJiYgcGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8dHJ1ZSwgdHJ1ZT4ocGFydFBhcnRTdHJpbmdzLnNsaWNlKDEpLCB0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPHRydWUsIGJvb2xlYW4+KHBhcnRQYXJ0U3RyaW5ncywgYWJzb2x1dGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnJvbU1hc2socGF0aDogc3RyaW5nLCBhYnNvbHV0ZTogdHJ1ZSwgbXVsdGlwbGljaXR5U3ltYm9sOiBQYXRoVG9rZW4pOiBBYnNvbHV0ZU1vZGVsUGF0aDtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGcm9tTWFzayhwYXRoOiBzdHJpbmcsIGFic29sdXRlOiBmYWxzZSwgbXVsdGlwbGljaXR5U3ltYm9sOiBQYXRoVG9rZW4pOiBSZXNvbHZlZE1vZGVsUGF0aDtcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGcm9tTWFzayhwYXRoOiBzdHJpbmcsIGFic29sdXRlOiBcImF1dG9cIiwgbXVsdGlwbGljaXR5U3ltYm9sOiBQYXRoVG9rZW4pOiBNb2RlbFBhdGg7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnJvbU1hc2socGF0aDogc3RyaW5nLCBhYnNvbHV0ZTogYm9vbGVhbiB8IFwiYXV0b1wiLCBtdWx0aXBsaWNpdHlTeW1ib2w6IFBhdGhUb2tlbik6IE1vZGVsUGF0aCB7XG4gICAgY29uc3QgcGFydFBhcnRTdHJpbmdzID0gcGF0aC5zcGxpdChcIi9cIikubWFwKHggPT4gKHggPT09IFwiKlwiID8gbXVsdGlwbGljaXR5U3ltYm9sIDogeCkpO1xuICAgIGlmIChhYnNvbHV0ZSA9PT0gXCJhdXRvXCIpIHtcbiAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbChwYXJ0UGFydFN0cmluZ3Muc2xpY2UoMSksIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHBhcnRQYXJ0U3RyaW5ncywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChhYnNvbHV0ZSAmJiBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbChwYXJ0UGFydFN0cmluZ3Muc2xpY2UoMSksIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGwocGFydFBhcnRTdHJpbmdzLCBhYnNvbHV0ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBYnNvbHV0ZUZyb21NYXNrKHBhdGg6IHN0cmluZywgbXVsdGlwbGljaXR5U3ltYm9sOiBQYXRoVG9rZW4pOiBBYnNvbHV0ZU1vZGVsUGF0aCB7XG4gICAgY29uc3QgcGFydFBhcnRTdHJpbmdzID0gcGF0aC5zcGxpdChcIi9cIikubWFwKHggPT4gKHggPT09IFwiKlwiID8gbXVsdGlwbGljaXR5U3ltYm9sIDogeCkpO1xuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbChwYXJ0UGFydFN0cmluZ3Muc2xpY2UoMSksIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGwocGFydFBhcnRTdHJpbmdzLCB0cnVlKTtcbn1cblxuZnVuY3Rpb24gZW5zdXJlUGxhaW5QYXRoUGFydHNEb2VzTm90Q29udGFpbk11bHRpcGxpY2l0eShwYXJ0czogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICBpZiAocGFydHMuc29tZSh4ID0+IHggPT09IFwiKlwiKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXRoIG11c3Qgbm90IGNvbnRhaW4gKiBzeW1ib2xcIik7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQWJzb2x1dGUocGF0aDogc3RyaW5nKTogQWJzb2x1dGVSZXNvbHZlZE1vZGVsUGF0aCB7XG4gICAgY29uc3QgcGFydFBhcnRTdHJpbmdzID0gcGF0aC5zcGxpdChcIi9cIik7XG4gICAgZW5zdXJlUGxhaW5QYXRoUGFydHNEb2VzTm90Q29udGFpbk11bHRpcGxpY2l0eShwYXJ0UGFydFN0cmluZ3MpO1xuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDx0cnVlLCB0cnVlPihwYXJ0UGFydFN0cmluZ3Muc2xpY2UoMSksIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8dHJ1ZSwgdHJ1ZT4ocGFydFBhcnRTdHJpbmdzLCB0cnVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlbGF0aXZlUmVzb2x2ZWRNb2RlbFBhdGgocGF0aDogc3RyaW5nKTogUmVsYXRpdmVSZXNvbHZlZE1vZGVsUGF0aCB7XG4gICAgY29uc3QgcGFydFBhcnRTdHJpbmdzID0gcGF0aC5zcGxpdChcIi9cIik7XG4gICAgZW5zdXJlUGxhaW5QYXRoUGFydHNEb2VzTm90Q29udGFpbk11bHRpcGxpY2l0eShwYXJ0UGFydFN0cmluZ3MpO1xuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDx0cnVlLCBmYWxzZT4ocGFydFBhcnRTdHJpbmdzLCBmYWxzZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBYnNvbHV0ZUZyb21Ub2tlbnModG9rZW5zOiBQYXRoVG9rZW5bXSk6IEFic29sdXRlTW9kZWxQYXRoIHtcbiAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8ZmFsc2UsIHRydWU+KHRva2VucywgdHJ1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBYnNvbHV0ZVJlc29sdmVkRnJvbVRva2Vucyh0b2tlbnM6IHJlYWRvbmx5IHN0cmluZ1tdKTogQWJzb2x1dGVSZXNvbHZlZE1vZGVsUGF0aCB7XG4gICAgZW5zdXJlUGxhaW5QYXRoUGFydHNEb2VzTm90Q29udGFpbk11bHRpcGxpY2l0eSh0b2tlbnMpO1xuICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDx0cnVlLCB0cnVlPih0b2tlbnMsIHRydWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVsYXRpdmVGcm9tVG9rZW5zKHRva2VuczogcmVhZG9ubHkgc3RyaW5nW10pOiBSZWxhdGl2ZVJlc29sdmVkTW9kZWxQYXRoO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlbGF0aXZlRnJvbVRva2Vucyh0b2tlbnM6IHJlYWRvbmx5IFBhdGhUb2tlbltdKTogUmVsYXRpdmVNb2RlbFBhdGg7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVsYXRpdmVGcm9tVG9rZW5zKHRva2VuczogcmVhZG9ubHkgUGF0aFRva2VuW10pOiBSZWxhdGl2ZU1vZGVsUGF0aCB7XG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPGZhbHNlLCBmYWxzZT4odG9rZW5zLCBmYWxzZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBqb2luTW9kZWxQYXRocyguLi5wYXJ0czogQXJyYXk8TW9kZWxQYXRoIHwgUGF0aFRva2VuIHwgUGF0aFRva2VuW10+KTogTW9kZWxQYXRoIHtcbiAgICBsZXQgYWJzb2x1dGUgPSBmYWxzZTtcbiAgICBsZXQgcmVzdWx0UGFydHM6IFBhdGhUb2tlbltdID0gW107XG4gICAgZm9yIChjb25zdCBqb2luSXRlbSBvZiBwYXJ0cykge1xuICAgICAgICBpZiAodHlwZW9mIGpvaW5JdGVtID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXN1bHRQYXJ0cy5wdXNoKGpvaW5JdGVtKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc01vZGVsUGF0aChqb2luSXRlbSkpIHtcbiAgICAgICAgICAgIGlmIChqb2luSXRlbS5pc0Fic29sdXRlKCkpIHtcbiAgICAgICAgICAgICAgICBhYnNvbHV0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmVzdWx0UGFydHMgPSBbLi4uam9pbkl0ZW0uZ2V0UGF0aFBhcnRzQXNBcnJheSgpXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0UGFydHMucHVzaCguLi5qb2luSXRlbS5nZXRQYXRoUGFydHNBc0FycmF5KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoam9pbkl0ZW0pKSB7XG4gICAgICAgICAgICByZXN1bHRQYXJ0cy5wdXNoKC4uLmpvaW5JdGVtKTtcbiAgICAgICAgfSBlbHNlIGlmIChQYXRoVG9rZW5zLmlzTXVsdGlUb2tlbihqb2luSXRlbSkpIHtcbiAgICAgICAgICAgIHJlc3VsdFBhcnRzLnB1c2goam9pbkl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHJlc3VsdFBhcnRzLCBhYnNvbHV0ZSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1vZGVsUGF0aDxUUmVzb2x2ZWQgZXh0ZW5kcyBib29sZWFuLCBUQWJzb2x1dGUgZXh0ZW5kcyBib29sZWFuPlxuICAgIGV4dGVuZHMgSUVxdWF0YWJsZTxJTW9kZWxQYXRoPGJvb2xlYW4sIGJvb2xlYW4+PiB7XG4gICAgcmVhZG9ubHkgcmVzb2x2ZWQ6IFRSZXNvbHZlZDtcbiAgICByZWFkb25seSBhYnNvbHV0ZTogVEFic29sdXRlO1xuXG4gICAgaXNFcXVhbHMobW9kZWxQYXRoOiBNb2RlbFBhdGgsIGVhY2hDdXJyZW50Q29sbGlzaW9uPzogRWFjaEN1cnJlbnRDb2xsaXNpb24pOiBib29sZWFuO1xuICAgIGdldEhhc2goZWFjaEN1cnJlbnRDb2xsaXNpb24/OiBFYWNoQ3VycmVudENvbGxpc2lvbik6IG51bWJlcjtcblxuICAgIGlzUmVzb2x2ZWQoKTogdGhpcyBpcyBJTW9kZWxQYXRoPHRydWUsIFRBYnNvbHV0ZT47XG4gICAgaXNBYnNvbHV0ZSgpOiB0aGlzIGlzIElNb2RlbFBhdGg8VFJlc29sdmVkLCB0cnVlPjtcbiAgICB0b0Fic29sdXRlKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCB0cnVlPjtcblxuICAgIGpvaW5XaXRoKC4uLnBhdGg6IHN0cmluZ1tdKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT47XG4gICAgam9pbldpdGgoLi4ucGF0aDogUGF0aFRva2VuW10pOiBJTW9kZWxQYXRoPGJvb2xlYW4sIFRBYnNvbHV0ZT47XG4gICAgam9pbldpdGgoLi4ucGF0aDogQXJyYXk8UmVzb2x2ZWRNb2RlbFBhdGggfCBzdHJpbmc+KTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT47XG4gICAgam9pbldpdGgoLi4ucGF0aDogQXJyYXk8QWJzb2x1dGVSZXNvbHZlZE1vZGVsUGF0aCB8IHN0cmluZz4pOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgdHJ1ZT47XG4gICAgam9pbldpdGgoLi4ucGF0aDogQXJyYXk8TW9kZWxQYXRoIHwgUGF0aFRva2VuPik6IElNb2RlbFBhdGg8Ym9vbGVhbiwgVEFic29sdXRlPjtcblxuICAgIGdldFBhdGhQYXJ0cygpOiBJdGVyYWJsZTxQYXRoVG9rZW5TcGVjPFRSZXNvbHZlZD4+O1xuICAgIGdldFBhdGhQYXJ0c0FzQXJyYXkoKTogUmVhZG9ubHlBcnJheTxQYXRoVG9rZW5TcGVjPFRSZXNvbHZlZD4+O1xuICAgIGdldFNpbXBsZVRva2Vuc1N0cmljdCgpOiBJdGVyYWJsZTxTaW1wbGVQYXRoVG9rZW4+O1xuICAgIGdldFNpbXBsZVRva2Vuc0FzQXJyYXlTdHJpY3QoKTogcmVhZG9ubHkgU2ltcGxlUGF0aFRva2VuW107XG5cbiAgICByZXNvbHZlQWxsKGluc3RhbmNlOiBzdHJpbmcpOiBNb2RlbFBhdGg7XG4gICAgaXNDb250YWluSXRlcmF0aW9uKCk6IGJvb2xlYW47XG4gICAgaXNDb250YWluQ3VycmVudEl0ZXJhdGlvbigpOiBib29sZWFuO1xuICAgIGlzQ29udGFpbkN1cnJlbnRPckVhY2hJdGVyYXRpb24oKTogYm9vbGVhbjtcbiAgICBnZXRMYXN0TGlzdFBhdGgoKTogUGF0aFRva2VuW107XG4gICAgaXNFbmRzV2l0aEl0ZXJhdGlvbigpOiBib29sZWFuO1xuICAgIGlzRW5kc1dpdGhDdXJyZW50SXRlcmF0aW9uKCk6IGJvb2xlYW47XG4gICAgaXNJbmNsdWRlcyhtb2RlbFBhdGg6IE1vZGVsUGF0aCk6IGJvb2xlYW47XG4gICAgZ2V0SXRlcmF0aW9uUmFuayhlYWNoQ3VycmVudENvbGxpc2lvbj86IEVhY2hDdXJyZW50Q29sbGlzaW9uKTogbnVtYmVyO1xuICAgIGlzRW1wdHkoKTogYm9vbGVhbjtcbiAgICBtYXRjaEZvcihtb2RlbFBhdGg6IE1vZGVsUGF0aCk6IFBhdGhNYXRjaGluZztcbiAgICBzdGFydHNXaXRoKG1vZGVsUGF0aDogTW9kZWxQYXRoKTogYm9vbGVhbjtcbiAgICBlbmRzV2l0aChtb2RlbFBhdGg6IE1vZGVsUGF0aCk6IGJvb2xlYW47XG4gICAgc3BsaXRCeU11bHRpcGxpY2l0eSgpOiBJdGVyYWJsZTxSZXNvbHZlZE1vZGVsUGF0aCB8IHR5cGVvZiBFYWNoU3ltYm9sIHwgdHlwZW9mIEN1cnJlbnRTeW1ib2w+O1xuICAgIG5vcm1hbGl6ZSgpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICB0b0N1cnJlbnRJdGVyYXRpb24oKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT47XG4gICAgdG9FYWNoSXRlcmF0aW9uKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+O1xuICAgIGdldEFsbFBhcmVudFBhdGhzKCk6IEl0ZXJhYmxlPE1vZGVsUGF0aD47XG4gICAgdHJpbUxhc3RTdGFySWZMYXN0VG9rZW4oKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT47XG4gICAgZ2V0UGFyZW50UGF0aCgpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICBhcHBseUluc3RhbmNlc0RpcnR5KFxuICAgICAgICBpbnN0YW5jZXM6IFNpbXBsZVBhdGhUb2tlbltdLFxuICAgICAgICBmaWxsV2l0aE11bHRpcGxpY2l0eUlmSGFzTm9JbnN0YW5jZT86IGJvb2xlYW5cbiAgICApOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcblxuICAgIHRvU3RyaW5nKCk6IHN0cmluZztcbiAgICB0b0xlZ2FjeVBhdGgoKTogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBNb2RlbFBhdGggPSBJTW9kZWxQYXRoPGJvb2xlYW4sIGJvb2xlYW4+O1xuZXhwb3J0IHR5cGUgUmVzb2x2ZWRNb2RlbFBhdGggPSBJTW9kZWxQYXRoPHRydWUsIGJvb2xlYW4+O1xuZXhwb3J0IHR5cGUgQWJzb2x1dGVNb2RlbFBhdGggPSBJTW9kZWxQYXRoPGJvb2xlYW4sIHRydWU+O1xuZXhwb3J0IHR5cGUgQWJzb2x1dGVSZXNvbHZlZE1vZGVsUGF0aCA9IElNb2RlbFBhdGg8dHJ1ZSwgdHJ1ZT47XG5cbmV4cG9ydCB0eXBlIFJlbGF0aXZlTW9kZWxQYXRoID0gSU1vZGVsUGF0aDxib29sZWFuLCBmYWxzZT47XG5leHBvcnQgdHlwZSBSZWxhdGl2ZVJlc29sdmVkTW9kZWxQYXRoID0gSU1vZGVsUGF0aDx0cnVlLCBmYWxzZT47XG5cbnR5cGUgUGF0aFRva2VuU3BlYzxUUmVzb2x2ZWQgZXh0ZW5kcyBib29sZWFuPiA9IFRSZXNvbHZlZCBleHRlbmRzIHRydWUgPyBzdHJpbmcgOiBQYXRoVG9rZW47XG5cbnR5cGUgUGF0aFRva2Vuc1NwZWM8VFJlc29sdmVkIGV4dGVuZHMgYm9vbGVhbj4gPSBBcnJheTxQYXRoVG9rZW5TcGVjPFRSZXNvbHZlZD4+O1xuXG50eXBlIFJlYWRvbmx5UGF0aFRva2Vuc1NwZWM8VFJlc29sdmVkIGV4dGVuZHMgYm9vbGVhbj4gPSBSZWFkb25seUFycmF5PFBhdGhUb2tlblNwZWM8VFJlc29sdmVkPj47XG5cbmZ1bmN0aW9uIGlzQWxsVG9rZW5zUmVzb2x2ZWQ8VFJlc29sdmVkIGV4dGVuZHMgYm9vbGVhbj4odG9rZW5zOiBSZWFkb25seVBhdGhUb2tlbnNTcGVjPFRSZXNvbHZlZD4pOiBUUmVzb2x2ZWQge1xuICAgIC8vINCvINGH0YLQvi3RgtC+INC90LXQvNC+0LPRgyDRgdC+0L7QsdGA0LDQt9C40YLRjCDQutCw0Log0YLRg9GCINCy0YHRkSDRgdGC0YDQvtCz0L4g0L3QsNC/0LjRgdCw0YLRjC4uLlxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICByZXR1cm4gdG9rZW5zLmV2ZXJ5KFBhdGhUb2tlbnMuaXNTaW1wbGVUb2tlbik7XG59XG5cbmV4cG9ydCBjbGFzcyBNb2RlbFBhdGhJbXBsPFRSZXNvbHZlZCBleHRlbmRzIGJvb2xlYW4sIFRBYnNvbHV0ZSBleHRlbmRzIGJvb2xlYW4+XG4gICAgaW1wbGVtZW50cyBJRXF1YXRhYmxlPE1vZGVsUGF0aD4sIElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+XG57XG4gICAgcHJpdmF0ZSByZWFkb25seSB0b2tlbnM6IFJlYWRvbmx5UGF0aFRva2Vuc1NwZWM8VFJlc29sdmVkPjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgYWJzb2x1dGU6IFRBYnNvbHV0ZTtcbiAgICBwcml2YXRlIGxlZ2FjeVBhdGg6IHVuZGVmaW5lZCB8IHN0cmluZztcbiAgICBwcml2YXRlIGNhY2hlZEhhc2g6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXRoUGFydHM6IFJlYWRvbmx5UGF0aFRva2Vuc1NwZWM8VFJlc29sdmVkPiwgYWJzb2x1dGU6IFRBYnNvbHV0ZSkge1xuICAgICAgICB0aGlzLnRva2VucyA9IHBhdGhQYXJ0cy5maWx0ZXIoeCA9PiB4ICE9PSBcIlwiKTtcbiAgICAgICAgdGhpcy5hYnNvbHV0ZSA9IGFic29sdXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVzb2x2ZWQoKTogVFJlc29sdmVkIHtcbiAgICAgICAgcmV0dXJuIGlzQWxsVG9rZW5zUmVzb2x2ZWQodGhpcy50b2tlbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXRoUGFydHMoKTogSXRlcmFibGU8UGF0aFRva2VuU3BlYzxUUmVzb2x2ZWQ+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2VucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGF0aFBhcnRzQXNBcnJheSgpOiBSZWFkb25seUFycmF5PFBhdGhUb2tlblNwZWM8VFJlc29sdmVkPj4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnM7XG4gICAgfVxuXG4gICAgcHVibGljICpnZXRTaW1wbGVUb2tlbnNTdHJpY3QoKTogSXRlcmFibGU8U2ltcGxlUGF0aFRva2VuPiB7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdGhpcy50b2tlbnMpIHtcbiAgICAgICAgICAgIGlmICghUGF0aFRva2Vucy5pc1NpbXBsZVRva2VuKHRva2VuKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhdGggbXVzdCBub3QgY29udGFpbiBzcGVjIHRva2Vuc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkIHRva2VuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNpbXBsZVRva2Vuc0FzQXJyYXlTdHJpY3QoKTogcmVhZG9ubHkgU2ltcGxlUGF0aFRva2VuW10ge1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRoaXMudG9rZW5zKSB7XG4gICAgICAgICAgICBpZiAoIVBhdGhUb2tlbnMuaXNTaW1wbGVUb2tlbih0b2tlbikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXRoIG11c3Qgbm90IGNvbnRhaW4gc3BlYyB0b2tlbnNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8g0J/RgNC+0LLQtdGA0LrQsCDQstGL0YjQtSDQs9Cw0YDQsNC10L3RgtC40YDRg9C10YIg0YfRgtC+INCx0YPQtNGD0YIg0YLQvtC70YzQutC+IFNpbXBsZVBhdGhUb2tlbi5cbiAgICAgICAgLy8g0JLRgdC1IG1hcCDQuCBmaWx0ZXIg0YPQsdGA0LDQvdGLINC00LvRjyDQv9GA0L7QuNC30LLQvtC00LjRgtC10LvRjNC90L7RgdGC0LhcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGpvaW5XaXRoKC4uLnBhdGg6IHN0cmluZ1tdKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT47XG4gICAgcHVibGljIGpvaW5XaXRoKC4uLnBhdGg6IFBhdGhUb2tlbltdKTogSU1vZGVsUGF0aDxib29sZWFuLCBUQWJzb2x1dGU+O1xuICAgIHB1YmxpYyBqb2luV2l0aCguLi5wYXRoOiBBcnJheTxSZXNvbHZlZE1vZGVsUGF0aCB8IHN0cmluZz4pOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPjtcbiAgICBwdWJsaWMgam9pbldpdGgoLi4ucGF0aDogQXJyYXk8QWJzb2x1dGVSZXNvbHZlZE1vZGVsUGF0aCB8IHN0cmluZz4pOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgdHJ1ZT47XG4gICAgcHVibGljIGpvaW5XaXRoKC4uLnBhdGg6IEFycmF5PE1vZGVsUGF0aCB8IFBhdGhUb2tlbj4pOiBJTW9kZWxQYXRoPGJvb2xlYW4sIFRBYnNvbHV0ZT47XG4gICAgcHVibGljIGpvaW5XaXRoKC4uLnBhdGg6IEFycmF5PE1vZGVsUGF0aCB8IFBhdGhUb2tlbj4pOiBJTW9kZWxQYXRoPGJvb2xlYW4sIGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIGpvaW5Nb2RlbFBhdGhzKHRoaXMsIC4uLnBhdGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1Jlc29sdmVkKCk6IHRoaXMgaXMgSU1vZGVsUGF0aDx0cnVlLCBUQWJzb2x1dGU+IHtcbiAgICAgICAgcmV0dXJuIGlzQWxsVG9rZW5zUmVzb2x2ZWQodGhpcy50b2tlbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXNvbHZlQWxsKGluc3RhbmNlOiBzdHJpbmcpOiBNb2RlbFBhdGgge1xuICAgICAgICBjb25zdCB0b2tlbnMgPSB0aGlzLnRva2Vucy5tYXAodG9rZW4gPT4ge1xuICAgICAgICAgICAgaWYgKFBhdGhUb2tlbnMuaXNTaW1wbGVUb2tlbih0b2tlbikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsKHRva2VucywgdGhpcy5hYnNvbHV0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQ29udGFpbkl0ZXJhdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zLnNvbWUoeCA9PiB4ID09PSBQYXRoVG9rZW5zLmVhY2gpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0NvbnRhaW5DdXJyZW50SXRlcmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMuc29tZSh4ID0+IHggPT09IFBhdGhUb2tlbnMuY3VycmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQ29udGFpbkN1cnJlbnRPckVhY2hJdGVyYXRpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2Vucy5zb21lKHggPT4geCA9PT0gUGF0aFRva2Vucy5jdXJyZW50IHx8IHggPT09IFBhdGhUb2tlbnMuZWFjaCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldExhc3RMaXN0UGF0aCgpOiBQYXRoVG9rZW5bXSB7XG4gICAgICAgIGlmICghdGhpcy5pc0NvbnRhaW5JdGVyYXRpb24oKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGF0aCBtdXN0IGNvbnRhaW4gaXRlcmF0aW9uXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g0J/RgNC+0LLQtdGA0LrQsCDQstGL0YjQtSDQs9Cw0YDQsNC90YLQuNGA0YPQtdGCLCDRh9GC0L4g0LHRg9C00LXRgiBQYXRoVG9rZW5zLmVhY2hcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb25zdCBsYXN0SXRlcmF0aW9uSW5kZXggPSB0aGlzLnRva2Vucy5sYXN0SW5kZXhPZihQYXRoVG9rZW5zLmVhY2gpO1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbnMuc2xpY2UoMCwgbGFzdEl0ZXJhdGlvbkluZGV4KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNFbmRzV2l0aEl0ZXJhdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgbGFzdEl0ZW0gPSBJdGVyVXRpbHMubGFzdCh0aGlzLnRva2Vucyk7XG4gICAgICAgIHJldHVybiBsYXN0SXRlbSA9PSBQYXRoVG9rZW5zLmVhY2g7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRW5kc1dpdGhDdXJyZW50SXRlcmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBsYXN0SXRlbSA9IEl0ZXJVdGlscy5sYXN0KHRoaXMudG9rZW5zKTtcbiAgICAgICAgcmV0dXJuIGxhc3RJdGVtID09IFBhdGhUb2tlbnMuY3VycmVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBYnNvbHV0ZSgpOiB0aGlzIGlzIElNb2RlbFBhdGg8VFJlc29sdmVkLCB0cnVlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFic29sdXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy50b2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHRoaXMuYWJzb2x1dGUgPyBcIi9cIiA6IFwiXCIpICsgdGhpcy50b2tlbnMubWFwKHggPT4gdGhpcy5wYXRoUGFydFRvU3RyaW5nKHgpKS5qb2luKFwiL1wiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9MZWdhY3lQYXRoKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmxlZ2FjeVBhdGggPz8gKHRoaXMubGVnYWN5UGF0aCA9IHRoaXMudG9rZW5zLm1hcCh4ID0+IHRoaXMucGF0aFBhcnRUb1N0cmluZyh4KSkuam9pbihcIi9cIikpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0VxdWFscyhcbiAgICAgICAgbW9kZWxQYXRoOiBNb2RlbFBhdGgsXG4gICAgICAgIGVhY2hDdXJyZW50Q29sbGlzaW9uOiBFYWNoQ3VycmVudENvbGxpc2lvbiA9IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZVNhbWVcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGVhY2hDdXJyZW50Q29sbGlzaW9uID09PSBFYWNoQ3VycmVudENvbGxpc2lvbi5BcmVTYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50b0xlZ2FjeVBhdGgoKSA9PT0gbW9kZWxQYXRoLnRvTGVnYWN5UGF0aCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICB0aGlzLmlzQWJzb2x1dGUoKSA9PT0gbW9kZWxQYXRoLmlzQWJzb2x1dGUoKSAmJlxuICAgICAgICAgICAgICAgIEl0ZXJhdG9yLmZyb20oSXRlclV0aWxzLnppcCh0aGlzLmdldFBhdGhQYXJ0cygpLCBtb2RlbFBhdGguZ2V0UGF0aFBhcnRzKCkpKS5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgKFt0MSwgdDJdKSA9PiB0MSA9PT0gdDJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JLRgdC10LPQtNCwINGG0LXQu9C+0LUg0L/QvtC70L7QttC40YLQtdC70YzQvdC+0LUg0LHQtdC30LfQvdCw0LrQvtCy0L7QtSAzMi3QsdC40YLQvdC+0LUg0YfQuNGB0LvQvlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRIYXNoKGVhY2hDdXJyZW50Q29sbGlzaW9uOiBFYWNoQ3VycmVudENvbGxpc2lvbiA9IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZVNhbWUpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5jYWNoZWRIYXNoID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGV0IGhhc2ggPSA1MzgxO1xuICAgICAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiByZXZlcnNlQXJyYXkodGhpcy50b2tlbnMpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRTdHI6IHN0cmluZztcbiAgICAgICAgICAgICAgICBpZiAoUGF0aFRva2Vucy5pc1NpbXBsZVRva2VuKHRva2VuKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RyID0gdG9rZW47XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVhY2hDdXJyZW50Q29sbGlzaW9uID09PSBFYWNoQ3VycmVudENvbGxpc2lvbi5BcmVEaWZmZXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdHIgPSB0b2tlbiA9PT0gUGF0aFRva2Vucy5lYWNoID8gXCIqXCIgOiBcIiFcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdHIgPSBcIipcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgc3RyaW5nSW5kZXggPSBjdXJyZW50U3RyLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoc3RyaW5nSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWJpdHdpc2VcbiAgICAgICAgICAgICAgICAgICAgaGFzaCA9IChoYXNoICogMzMpIF4gY3VycmVudFN0ci5jaGFyQ29kZUF0KC0tc3RyaW5nSW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYml0d2lzZVxuICAgICAgICAgICAgICAgIEphdmFTY3JpcHQgZG9lcyBiaXR3aXNlIG9wZXJhdGlvbnMgKGxpa2UgWE9SLCBhYm92ZSkgb24gMzItYml0IHNpZ25lZFxuICAgICAgICAgICAgICAgIGludGVnZXJzLiBTaW5jZSB3ZSB3YW50IHRoZSByZXN1bHRzIHRvIGJlIGFsd2F5cyBwb3NpdGl2ZSwgY29udmVydCB0aGVcbiAgICAgICAgICAgICAgICBzaWduZWQgaW50IHRvIGFuIHVuc2lnbmVkIGJ5IGRvaW5nIGFuIHVuc2lnbmVkIGJpdHNoaWZ0LlxuICAgICAgICAgICovXG4gICAgICAgICAgICB0aGlzLmNhY2hlZEhhc2ggPSBoYXNoID4+PiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlZEhhc2g7XG4gICAgfVxuXG4gICAgcHVibGljIGlzSW5jbHVkZXMobW9kZWxQYXRoOiBNb2RlbFBhdGgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0VG9rZW5zID0gbW9kZWxQYXRoLmdldFBhdGhQYXJ0c0FzQXJyYXkoKTtcbiAgICAgICAgaWYgKHRoaXMudG9rZW5zLmxlbmd0aCAhPT0gdGFyZ2V0VG9rZW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGxlZnRQYXJ0ID0gdGhpcy50b2tlbnNbaV07XG4gICAgICAgICAgICBjb25zdCByaWdodFBhcnQgPSB0YXJnZXRUb2tlbnNbaV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGxlZnRQYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByaWdodFBhcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxlZnRQYXJ0ICE9PSByaWdodFBhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChsZWZ0UGFydCA9PT0gUGF0aFRva2Vucy5jdXJyZW50IHx8IGxlZnRQYXJ0ID09PSBQYXRoVG9rZW5zLmVhY2gpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJpZ2h0UGFydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRmluaXRlKE51bWJlcihyaWdodFBhcnQpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyaWdodFBhcnQgIT09IFBhdGhUb2tlbnMuY3VycmVudCAmJiByaWdodFBhcnQgIT09IFBhdGhUb2tlbnMuZWFjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SXRlcmF0aW9uUmFuayhlYWNoQ3VycmVudENvbGxpc2lvbjogRWFjaEN1cnJlbnRDb2xsaXNpb24gPSBFYWNoQ3VycmVudENvbGxpc2lvbi5BcmVEaWZmZXJlbnQpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gY291bnQoXG4gICAgICAgICAgICBJdGVyYXRvci5mcm9tKHRoaXMudG9rZW5zKS5maWx0ZXIoeCA9PlxuICAgICAgICAgICAgICAgIGVhY2hDdXJyZW50Q29sbGlzaW9uID09IEVhY2hDdXJyZW50Q29sbGlzaW9uLkFyZURpZmZlcmVudFxuICAgICAgICAgICAgICAgICAgICA/IHggPT09IFBhdGhUb2tlbnMuZWFjaFxuICAgICAgICAgICAgICAgICAgICA6IFBhdGhUb2tlbnMuaXNNdWx0aVRva2VuKHgpXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2Vucy5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgcHVibGljIG1hdGNoRm9yKG1vZGVsUGF0aDogTW9kZWxQYXRoKTogUGF0aE1hdGNoaW5nIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzQWJzb2x1dGUoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgbWF0Y2ggbm9uIGFic29sdXRlIHBhdGggJyR7dGhpcy50b1N0cmluZygpfSdgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1vZGVsUGF0aC5pc0Fic29sdXRlKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IG1hdGNoIG5vbiBhYnNvbHV0ZSBwYXRoICcke21vZGVsUGF0aC50b1N0cmluZygpfSdgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUGF0aE1hdGNoZXIubWF0Y2godGhpcy50b2tlbnMsIG1vZGVsUGF0aC5nZXRQYXRoUGFydHNBc0FycmF5KCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGFydHNXaXRoKG1vZGVsUGF0aDogTW9kZWxQYXRoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHRoaXNQYXJ0cyA9IHRoaXMuZ2V0UGF0aFBhcnRzQXNBcnJheSgpO1xuICAgICAgICBjb25zdCBvdGhlclBhcnRzID0gbW9kZWxQYXRoLmdldFBhdGhQYXJ0c0FzQXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIG90aGVyUGFydHMuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4gdmFsdWUgPT09IHRoaXNQYXJ0c1tpbmRleF0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBlbmRzV2l0aChtb2RlbFBhdGg6IE1vZGVsUGF0aCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB0aGlzUGFydHMgPSB0aGlzLmdldFBhdGhQYXJ0c0FzQXJyYXkoKS5zbGljZSgpLnJldmVyc2UoKTtcbiAgICAgICAgY29uc3Qgb3RoZXJQYXJ0cyA9IG1vZGVsUGF0aC5nZXRQYXRoUGFydHNBc0FycmF5KCkuc2xpY2UoKS5yZXZlcnNlKCk7XG4gICAgICAgIHJldHVybiBvdGhlclBhcnRzLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IHZhbHVlID09PSB0aGlzUGFydHNbaW5kZXhdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgKnNwbGl0QnlNdWx0aXBsaWNpdHkoKTogSXRlcmFibGU8UmVzb2x2ZWRNb2RlbFBhdGggfCB0eXBlb2YgRWFjaFN5bWJvbCB8IHR5cGVvZiBDdXJyZW50U3ltYm9sPiB7XG4gICAgICAgIGxldCBsYXN0U2ltcGxlUGFydHMgPSBuZXcgTW9kZWxQYXRoQnVpbGRlcih0aGlzLmlzQWJzb2x1dGUoKSk7XG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdGhpcy50b2tlbnMpIHtcbiAgICAgICAgICAgIGlmIChQYXRoVG9rZW5zLmlzU2ltcGxlVG9rZW4odG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgbGFzdFNpbXBsZVBhcnRzLmFwcGVuZCh0b2tlbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghbGFzdFNpbXBsZVBhcnRzLmVtcHR5KSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGxhc3RTaW1wbGVQYXJ0cy50b1Jlc29sdmVkUGF0aCgpO1xuICAgICAgICAgICAgICAgICAgICBsYXN0U2ltcGxlUGFydHMgPSBuZXcgTW9kZWxQYXRoQnVpbGRlcihmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHlpZWxkIHRva2VuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghbGFzdFNpbXBsZVBhcnRzLmVtcHR5KSB7XG4gICAgICAgICAgICB5aWVsZCBsYXN0U2ltcGxlUGFydHMudG9SZXNvbHZlZFBhdGgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBub3JtYWxpemUoKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT4ge1xuICAgICAgICBjb25zdCByZXN1bHRUb2tlbnM6IFBhdGhUb2tlbnNTcGVjPFRSZXNvbHZlZD4gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwYXRoUGFydCBvZiB0aGlzLnRva2Vucykge1xuICAgICAgICAgICAgaWYgKHBhdGhQYXJ0ID09PSBcIi4uXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdFRva2Vucy5wb3AoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Fic29sdXRlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCBpcyBpbnZhbGlkICcke3RoaXMudG9TdHJpbmcoKX0nYCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRUb2tlbnMucHVzaChcIi4uXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGF0aFBhcnQgPT09IFwiLlwiKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHRUb2tlbnMucHVzaChwYXRoUGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPFRSZXNvbHZlZCwgVEFic29sdXRlPihyZXN1bHRUb2tlbnMsIHRoaXMuYWJzb2x1dGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5INCh0L/QtdGG0LjRhNC40LrQsNGC0L7RgNGLINC80L3QvtC20LXRgdGC0LLQtdC90L3QvtGB0YLQuCBFYWNoINC30LDQvNC10L3Rj9C10YIg0L3QsCBDdXJyZW50XG4gICAgICovXG4gICAgcHVibGljIHRvQ3VycmVudEl0ZXJhdGlvbigpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPiB7XG4gICAgICAgIGlmICh0aGlzLmlzUmVzb2x2ZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBOT1RFINCi0YPRgiDQvdC1INC/0L7Qu9GD0YfQsNC10YLRgdGPINC90LDQu9C+0LbQuNGC0Ywg0LTQuNGB0LrRgNC40LzQuNC90LDRgtC+0YBcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICAgIGNvbnN0IHBhdGhQYXJ0czogUGF0aFRva2Vuc1NwZWM8VFJlc29sdmVkPiA9IHRoaXMudG9rZW5zLm1hcCh4ID0+XG4gICAgICAgICAgICAgICAgeCA9PT0gUGF0aFRva2Vucy5lYWNoID8gUGF0aFRva2Vucy5jdXJyZW50IDogeFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxQYXRoSW1wbDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT4ocGF0aFBhcnRzLCB0aGlzLmFic29sdXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB0b0VhY2hJdGVyYXRpb24oKTogSU1vZGVsUGF0aDxUUmVzb2x2ZWQsIFRBYnNvbHV0ZT4ge1xuICAgICAgICBpZiAodGhpcy5pc1Jlc29sdmVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTk9URSDQotGD0YIg0L3QtSDQv9C+0LvRg9GH0LDQtdGC0YHRjyDQvdCw0LvQvtC20LjRgtGMINC00LjRgdC60YDQuNC80LjQvdCw0YLQvtGAXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICBjb25zdCBwYXRoUGFydHM6IFBhdGhUb2tlbnNTcGVjPFRSZXNvbHZlZD4gPSB0aGlzLnRva2Vucy5tYXAoeCA9PlxuICAgICAgICAgICAgICAgIHggPT09IFBhdGhUb2tlbnMuY3VycmVudCA/IFBhdGhUb2tlbnMuZWFjaCA6IHhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGw8VFJlc29sdmVkLCBUQWJzb2x1dGU+KHBhdGhQYXJ0cywgdGhpcy5hYnNvbHV0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdG9BYnNvbHV0ZSgpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgdHJ1ZT4ge1xuICAgICAgICBpZiAoIXRoaXMuYWJzb2x1dGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCAnJHt0aGlzLnRvTGVnYWN5UGF0aCgpfSBpcyBub3QgYWJzb2x1dGUnYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFBhdGhJbXBsPFRSZXNvbHZlZCwgdHJ1ZT4odGhpcy50b2tlbnMsIHRydWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyAqZ2V0QWxsUGFyZW50UGF0aHMoKTogSXRlcmFibGU8TW9kZWxQYXRoPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNb2RlbFBhdGhCdWlsZGVyKHRoaXMuaXNBYnNvbHV0ZSgpKTtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiBJdGVyVXRpbHMuc2tpcExhc3QodGhpcy5nZXRQYXRoUGFydHMoKSwgMSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodG9rZW4pO1xuICAgICAgICAgICAgeWllbGQgcmVzdWx0LnRvUGF0aCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHRyaW1MYXN0U3RhcklmTGFzdFRva2VuKCk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+IHtcbiAgICAgICAgY29uc3QgbGFzdEl0ZW0gPSBJdGVyVXRpbHMubGFzdCh0aGlzLnRva2Vucyk7XG4gICAgICAgIGlmIChsYXN0SXRlbSAhPSB1bmRlZmluZWQgJiYgUGF0aFRva2Vucy5pc011bHRpVG9rZW4obGFzdEl0ZW0pKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsUGF0aEltcGwodGhpcy50b2tlbnMuc2xpY2UoMCwgLTEpLCB0aGlzLmFic29sdXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFyZW50UGF0aCgpOiBJTW9kZWxQYXRoPFRSZXNvbHZlZCwgVEFic29sdXRlPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNb2RlbFBhdGhCdWlsZGVyKHRoaXMuYWJzb2x1dGUpO1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIEl0ZXJVdGlscy5za2lwTGFzdCh0aGlzLmdldFBhdGhQYXJ0cygpLCAxKSkge1xuICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgICAgLy8g0KLRg9GCINC/0L7Qu9GD0YfQsNC10YLRgdGPINGC0LDQuiwg0YfRgtC+INC/0L4g0LTRgNGD0LPQvtC80YMg0L3QuNC60LDQulxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIHJldHVybiByZXN1bHQudG9QYXRoKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFwcGx5SW5zdGFuY2VzRGlydHkoXG4gICAgICAgIGluc3RhbmNlczogU2ltcGxlUGF0aFRva2VuW10sXG4gICAgICAgIGZpbGxXaXRoTXVsdGlwbGljaXR5SWZIYXNOb0luc3RhbmNlPzogYm9vbGVhblxuICAgICk6IElNb2RlbFBhdGg8VFJlc29sdmVkLCBUQWJzb2x1dGU+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNSZXNvbHZlZCgpIHx8IGluc3RhbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbnN0YW5jZUNvdW50ZXIgPSAwO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTW9kZWxQYXRoQnVpbGRlcih0cnVlKTtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiB0aGlzLmdldFBhdGhQYXJ0cygpKSB7XG4gICAgICAgICAgICBpZiAoUGF0aFRva2Vucy5pc011bHRpVG9rZW4odG9rZW4pICYmIGluc3RhbmNlQ291bnRlciA8IGluc3RhbmNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZU9yRWFjaCA9XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlc1tpbnN0YW5jZUNvdW50ZXJdID8/XG4gICAgICAgICAgICAgICAgICAgIChmaWxsV2l0aE11bHRpcGxpY2l0eUlmSGFzTm9JbnN0YW5jZSA9PSB0cnVlID8gUGF0aFRva2Vucy5lYWNoIDogcmVqZWN0KCkpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaW5zdGFuY2VPckVhY2gpO1xuICAgICAgICAgICAgICAgIGluc3RhbmNlQ291bnRlcisrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyDQotGD0YIg0L/QvtC70YPRh9Cw0LXRgtGB0Y8g0YLQsNC6LCDRh9GC0L4g0L/QviDQtNGA0YPQs9C+0LzRgyDQvdC40LrQsNC6XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgcmV0dXJuIHJlc3VsdC50b1BhdGgoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhdGhQYXJ0VG9TdHJpbmcocGF0aFBhcnQ6IFBhdGhUb2tlbik6IHN0cmluZyB7XG4gICAgICAgIGlmICh0eXBlb2YgcGF0aFBhcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXRoUGFydDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aFBhcnQgPT09IFBhdGhUb2tlbnMuZWFjaCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiKlwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXRoUGFydCA9PT0gUGF0aFRva2Vucy5jdXJyZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gXCIqXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHBhdGggcGFydCBzcGVjaWZpZWQ6ICR7ZW5zdXJlQW5kR2V0U3RyaW5nKHBhdGhQYXJ0KX1gKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsSUFBQUEsY0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsWUFBQSxHQUFBRCxPQUFBO0FBRUEsSUFBQUUscUJBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLGlCQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxZQUFBLEdBQUFKLE9BQUE7QUFHQSxNQUFNSyxVQUFVLEdBQUdDLE1BQU0sQ0FBQ0MsR0FBRyxDQUFDLFVBQVUsQ0FBQztBQUN6QyxNQUFNQyxhQUFhLEdBQUdGLE1BQU0sQ0FBQ0MsR0FBRyxDQUFDLGFBQWEsQ0FBQztBQUV4QyxNQUFNRSxVQUFVLENBQUM7RUFJcEIsT0FBY0MsWUFBWUEsQ0FBQ0MsSUFBMkIsRUFBb0Q7SUFDdEcsT0FBT0EsSUFBSSxLQUFLRixVQUFVLENBQUNHLElBQUksSUFBSUQsSUFBSSxLQUFLRixVQUFVLENBQUNJLE9BQU87RUFDbEU7RUFFQSxPQUFjQyxhQUFhQSxDQUFDSCxJQUEyQixFQUFrQjtJQUNyRSxPQUFPLE9BQU9BLElBQUksS0FBSyxRQUFRO0VBQ25DO0VBRUEsT0FBY0ksZUFBZUEsQ0FBQ0osSUFBMkIsRUFBa0I7SUFDdkUsT0FBTyxPQUFPQSxJQUFJLEtBQUssUUFBUSxJQUFJLFFBQVEsQ0FBQ0ssSUFBSSxDQUFDTCxJQUFJLENBQUM7RUFDMUQ7RUFFQSxPQUFjTSw4QkFBOEJBLENBQUNOLElBQTJCLEVBQWtCO0lBQ3RGLE9BQU8sT0FBT0EsSUFBSSxLQUFLLFFBQVEsS0FBSyxRQUFRLENBQUNLLElBQUksQ0FBQ0wsSUFBSSxDQUFDLElBQUksa0JBQWtCLENBQUNLLElBQUksQ0FBQ0wsSUFBSSxDQUFDLENBQUM7RUFDN0Y7QUFDSjtBQUFDTyxPQUFBLENBQUFULFVBQUEsR0FBQUEsVUFBQTtBQW5CWUEsVUFBVSxDQUNMRyxJQUFJLEdBQXNCUCxVQUFVO0FBRHpDSSxVQUFVLENBRUxJLE9BQU8sR0FBeUJMLGFBQWE7QUF1QnhELFNBQVNXLFdBQVdBLENBQUNDLElBQXVDLEVBQXFCO0VBQ3BGLE9BQU8sT0FBT0EsSUFBSSxLQUFLLFFBQVEsSUFBSUEsSUFBSSxZQUFZQyxhQUFhO0FBQ3BFO0FBRU8sU0FBU0MsbUJBQW1CQSxDQUFDRixJQUE2QixFQUFlO0VBQzVFLE9BQU9ELFdBQVcsQ0FBQ0MsSUFBSSxDQUFDLEdBQUdBLElBQUksQ0FBQ0csWUFBWSxDQUFDLENBQUMsR0FBR0gsSUFBSTtBQUN6RDtBQUtPLFNBQVNJLDBCQUEwQkEsQ0FBQ0osSUFBcUMsRUFBcUI7RUFDakcsT0FBT0QsV0FBVyxDQUFDQyxJQUFJLENBQUMsR0FBR0EsSUFBSSxHQUFHSyxzQkFBc0IsQ0FBQ0wsSUFBSSxFQUFFWCxVQUFVLENBQUNHLElBQUksQ0FBQztBQUNuRjtBQUVPLFNBQVNjLGNBQWNBLENBQUEsRUFBOEI7RUFDeEQsT0FBTyxJQUFJTCxhQUFhLENBQWMsRUFBRSxFQUFFLEtBQUssQ0FBQztBQUNwRDtBQUVPLFNBQVNNLHNCQUFzQkEsQ0FBQSxFQUE4QjtFQUNoRSxPQUFPLElBQUlOLGFBQWEsQ0FBYSxFQUFFLEVBQUUsSUFBSSxDQUFDO0FBQ2xEO0FBS08sU0FBU08sZUFBZUEsQ0FBQ1IsSUFBWSxFQUFFUyxRQUEwQixFQUFxQjtFQUN6RixNQUFNQyxlQUFlLEdBQUdWLElBQUksQ0FBQ1csS0FBSyxDQUFDLEdBQUcsQ0FBQztFQUN2Q0MsOENBQThDLENBQUNGLGVBQWUsQ0FBQztFQUMvRCxJQUFJRCxRQUFRLEtBQUssTUFBTSxFQUFFO0lBQ3JCLElBQUlULElBQUksQ0FBQ2EsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO01BQ3RCLE9BQU8sSUFBSVosYUFBYSxDQUFhUyxlQUFlLENBQUNJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7SUFDeEUsQ0FBQyxNQUFNO01BQ0gsT0FBTyxJQUFJYixhQUFhLENBQWNTLGVBQWUsRUFBRSxLQUFLLENBQUM7SUFDakU7RUFDSjtFQUNBLElBQUlELFFBQVEsSUFBSVQsSUFBSSxDQUFDYSxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7SUFDbEMsT0FBTyxJQUFJWixhQUFhLENBQWFTLGVBQWUsQ0FBQ0ksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztFQUN4RTtFQUNBLE9BQU8sSUFBSWIsYUFBYSxDQUFnQlMsZUFBZSxFQUFFRCxRQUFRLENBQUM7QUFDdEU7QUFLTyxTQUFTTSxjQUFjQSxDQUFDZixJQUFZLEVBQUVTLFFBQTBCLEVBQUVPLGtCQUE2QixFQUFhO0VBQy9HLE1BQU1OLGVBQWUsR0FBR1YsSUFBSSxDQUFDVyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUNNLEdBQUcsQ0FBQ0MsQ0FBQyxJQUFLQSxDQUFDLEtBQUssR0FBRyxHQUFHRixrQkFBa0IsR0FBR0UsQ0FBRSxDQUFDO0VBQ3RGLElBQUlULFFBQVEsS0FBSyxNQUFNLEVBQUU7SUFDckIsSUFBSVQsSUFBSSxDQUFDYSxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7TUFDdEIsT0FBTyxJQUFJWixhQUFhLENBQUNTLGVBQWUsQ0FBQ0ksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztJQUM1RCxDQUFDLE1BQU07TUFDSCxPQUFPLElBQUliLGFBQWEsQ0FBQ1MsZUFBZSxFQUFFLEtBQUssQ0FBQztJQUNwRDtFQUNKO0VBQ0EsSUFBSUQsUUFBUSxJQUFJVCxJQUFJLENBQUNhLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtJQUNsQyxPQUFPLElBQUlaLGFBQWEsQ0FBQ1MsZUFBZSxDQUFDSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO0VBQzVEO0VBQ0EsT0FBTyxJQUFJYixhQUFhLENBQUNTLGVBQWUsRUFBRUQsUUFBUSxDQUFDO0FBQ3ZEO0FBRU8sU0FBU0osc0JBQXNCQSxDQUFDTCxJQUFZLEVBQUVnQixrQkFBNkIsRUFBcUI7RUFDbkcsTUFBTU4sZUFBZSxHQUFHVixJQUFJLENBQUNXLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQ00sR0FBRyxDQUFDQyxDQUFDLElBQUtBLENBQUMsS0FBSyxHQUFHLEdBQUdGLGtCQUFrQixHQUFHRSxDQUFFLENBQUM7RUFDdEYsSUFBSWxCLElBQUksQ0FBQ2EsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0lBQ3RCLE9BQU8sSUFBSVosYUFBYSxDQUFDUyxlQUFlLENBQUNJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7RUFDNUQ7RUFDQSxPQUFPLElBQUliLGFBQWEsQ0FBQ1MsZUFBZSxFQUFFLElBQUksQ0FBQztBQUNuRDtBQUVBLFNBQVNFLDhDQUE4Q0EsQ0FBQ08sS0FBd0IsRUFBUTtFQUNwRixJQUFJQSxLQUFLLENBQUNDLElBQUksQ0FBQ0YsQ0FBQyxJQUFJQSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUU7SUFDNUIsTUFBTSxJQUFJRyxLQUFLLENBQUMsZ0NBQWdDLENBQUM7RUFDckQ7QUFDSjtBQUVPLFNBQVNDLGNBQWNBLENBQUN0QixJQUFZLEVBQTZCO0VBQ3BFLE1BQU1VLGVBQWUsR0FBR1YsSUFBSSxDQUFDVyxLQUFLLENBQUMsR0FBRyxDQUFDO0VBQ3ZDQyw4Q0FBOEMsQ0FBQ0YsZUFBZSxDQUFDO0VBQy9ELElBQUlWLElBQUksQ0FBQ2EsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0lBQ3RCLE9BQU8sSUFBSVosYUFBYSxDQUFhUyxlQUFlLENBQUNJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7RUFDeEU7RUFDQSxPQUFPLElBQUliLGFBQWEsQ0FBYVMsZUFBZSxFQUFFLElBQUksQ0FBQztBQUMvRDtBQUVPLFNBQVNhLCtCQUErQkEsQ0FBQ3ZCLElBQVksRUFBNkI7RUFDckYsTUFBTVUsZUFBZSxHQUFHVixJQUFJLENBQUNXLEtBQUssQ0FBQyxHQUFHLENBQUM7RUFDdkNDLDhDQUE4QyxDQUFDRixlQUFlLENBQUM7RUFDL0QsT0FBTyxJQUFJVCxhQUFhLENBQWNTLGVBQWUsRUFBRSxLQUFLLENBQUM7QUFDakU7QUFFTyxTQUFTYyx3QkFBd0JBLENBQUNDLE1BQW1CLEVBQXFCO0VBQzdFLE9BQU8sSUFBSXhCLGFBQWEsQ0FBY3dCLE1BQU0sRUFBRSxJQUFJLENBQUM7QUFDdkQ7QUFFTyxTQUFTQyxnQ0FBZ0NBLENBQUNELE1BQXlCLEVBQTZCO0VBQ25HYiw4Q0FBOEMsQ0FBQ2EsTUFBTSxDQUFDO0VBQ3RELE9BQU8sSUFBSXhCLGFBQWEsQ0FBYXdCLE1BQU0sRUFBRSxJQUFJLENBQUM7QUFDdEQ7QUFJTyxTQUFTRSx3QkFBd0JBLENBQUNGLE1BQTRCLEVBQXFCO0VBQ3RGLE9BQU8sSUFBSXhCLGFBQWEsQ0FBZXdCLE1BQU0sRUFBRSxLQUFLLENBQUM7QUFDekQ7QUFFTyxTQUFTRyxjQUFjQSxDQUFDLEdBQUdULEtBQWlELEVBQWE7RUFDNUYsSUFBSVYsUUFBUSxHQUFHLEtBQUs7RUFDcEIsSUFBSW9CLFdBQXdCLEdBQUcsRUFBRTtFQUNqQyxLQUFLLE1BQU1DLFFBQVEsSUFBSVgsS0FBSyxFQUFFO0lBQzFCLElBQUksT0FBT1csUUFBUSxLQUFLLFFBQVEsRUFBRTtNQUM5QkQsV0FBVyxDQUFDRSxJQUFJLENBQUNELFFBQVEsQ0FBQztJQUM5QixDQUFDLE1BQU0sSUFBSS9CLFdBQVcsQ0FBQytCLFFBQVEsQ0FBQyxFQUFFO01BQzlCLElBQUlBLFFBQVEsQ0FBQ0UsVUFBVSxDQUFDLENBQUMsRUFBRTtRQUN2QnZCLFFBQVEsR0FBRyxJQUFJO1FBQ2ZvQixXQUFXLEdBQUcsQ0FBQyxHQUFHQyxRQUFRLENBQUNHLG1CQUFtQixDQUFDLENBQUMsQ0FBQztNQUNyRCxDQUFDLE1BQU07UUFDSEosV0FBVyxDQUFDRSxJQUFJLENBQUMsR0FBR0QsUUFBUSxDQUFDRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7TUFDdkQ7SUFDSixDQUFDLE1BQU0sSUFBSUMsS0FBSyxDQUFDQyxPQUFPLENBQUNMLFFBQVEsQ0FBQyxFQUFFO01BQ2hDRCxXQUFXLENBQUNFLElBQUksQ0FBQyxHQUFHRCxRQUFRLENBQUM7SUFDakMsQ0FBQyxNQUFNLElBQUl6QyxVQUFVLENBQUNDLFlBQVksQ0FBQ3dDLFFBQVEsQ0FBQyxFQUFFO01BQzFDRCxXQUFXLENBQUNFLElBQUksQ0FBQ0QsUUFBUSxDQUFDO0lBQzlCO0VBQ0o7RUFFQSxPQUFPLElBQUk3QixhQUFhLENBQUM0QixXQUFXLEVBQUVwQixRQUFRLENBQUM7QUFDbkQ7QUFvRUEsU0FBUzJCLG1CQUFtQkEsQ0FBNEJYLE1BQXlDLEVBQWE7RUFDMUc7RUFDQTtFQUNBLE9BQU9BLE1BQU0sQ0FBQ1ksS0FBSyxDQUFDaEQsVUFBVSxDQUFDSyxhQUFhLENBQUM7QUFDakQ7QUFFTyxNQUFNTyxhQUFhLENBRTFCO0VBTVdxQyxXQUFXQSxDQUFDQyxTQUE0QyxFQUFFOUIsUUFBbUIsRUFBRTtJQUFBLEtBTHJFZ0IsTUFBTTtJQUFBLEtBQ1BoQixRQUFRO0lBQUEsS0FDaEIrQixVQUFVO0lBQUEsS0FDVkMsVUFBVTtJQUdkLElBQUksQ0FBQ2hCLE1BQU0sR0FBR2MsU0FBUyxDQUFDRyxNQUFNLENBQUN4QixDQUFDLElBQUlBLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDN0MsSUFBSSxDQUFDVCxRQUFRLEdBQUdBLFFBQVE7RUFDNUI7RUFFQSxJQUFXa0MsUUFBUUEsQ0FBQSxFQUFjO0lBQzdCLE9BQU9QLG1CQUFtQixDQUFDLElBQUksQ0FBQ1gsTUFBTSxDQUFDO0VBQzNDO0VBRU9tQixZQUFZQSxDQUFBLEVBQXVDO0lBQ3RELE9BQU8sSUFBSSxDQUFDbkIsTUFBTTtFQUN0QjtFQUVPUSxtQkFBbUJBLENBQUEsRUFBNEM7SUFDbEUsT0FBTyxJQUFJLENBQUNSLE1BQU07RUFDdEI7RUFFQSxDQUFRb0IscUJBQXFCQSxDQUFBLEVBQThCO0lBQ3ZELEtBQUssTUFBTUMsS0FBSyxJQUFJLElBQUksQ0FBQ3JCLE1BQU0sRUFBRTtNQUM3QixJQUFJLENBQUNwQyxVQUFVLENBQUNLLGFBQWEsQ0FBQ29ELEtBQUssQ0FBQyxFQUFFO1FBQ2xDLE1BQU0sSUFBSXpCLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQztNQUN4RDtNQUNBLE1BQU15QixLQUFLO0lBQ2Y7RUFDSjtFQUVPQyw0QkFBNEJBLENBQUEsRUFBK0I7SUFDOUQsS0FBSyxNQUFNRCxLQUFLLElBQUksSUFBSSxDQUFDckIsTUFBTSxFQUFFO01BQzdCLElBQUksQ0FBQ3BDLFVBQVUsQ0FBQ0ssYUFBYSxDQUFDb0QsS0FBSyxDQUFDLEVBQUU7UUFDbEMsTUFBTSxJQUFJekIsS0FBSyxDQUFDLG1DQUFtQyxDQUFDO01BQ3hEO0lBQ0o7SUFDQTtJQUNBO0lBQ0E7SUFDQSxPQUFPLElBQUksQ0FBQ0ksTUFBTTtFQUN0QjtFQU9PdUIsUUFBUUEsQ0FBQyxHQUFHaEQsSUFBa0MsRUFBZ0M7SUFDakYsT0FBTzRCLGNBQWMsQ0FBQyxJQUFJLEVBQUUsR0FBRzVCLElBQUksQ0FBQztFQUN4QztFQUVPaUQsVUFBVUEsQ0FBQSxFQUF3QztJQUNyRCxPQUFPYixtQkFBbUIsQ0FBQyxJQUFJLENBQUNYLE1BQU0sQ0FBQztFQUMzQztFQUVPeUIsVUFBVUEsQ0FBQ0MsUUFBZ0IsRUFBYTtJQUMzQyxNQUFNMUIsTUFBTSxHQUFHLElBQUksQ0FBQ0EsTUFBTSxDQUFDUixHQUFHLENBQUM2QixLQUFLLElBQUk7TUFDcEMsSUFBSXpELFVBQVUsQ0FBQ0ssYUFBYSxDQUFDb0QsS0FBSyxDQUFDLEVBQUU7UUFDakMsT0FBT0EsS0FBSztNQUNoQixDQUFDLE1BQU07UUFDSCxPQUFPSyxRQUFRO01BQ25CO0lBQ0osQ0FBQyxDQUFDO0lBRUYsT0FBTyxJQUFJbEQsYUFBYSxDQUFDd0IsTUFBTSxFQUFFLElBQUksQ0FBQ2hCLFFBQVEsQ0FBQztFQUNuRDtFQUVPMkMsa0JBQWtCQSxDQUFBLEVBQVk7SUFDakMsT0FBTyxJQUFJLENBQUMzQixNQUFNLENBQUNMLElBQUksQ0FBQ0YsQ0FBQyxJQUFJQSxDQUFDLEtBQUs3QixVQUFVLENBQUNHLElBQUksQ0FBQztFQUN2RDtFQUVPNkQseUJBQXlCQSxDQUFBLEVBQVk7SUFDeEMsT0FBTyxJQUFJLENBQUM1QixNQUFNLENBQUNMLElBQUksQ0FBQ0YsQ0FBQyxJQUFJQSxDQUFDLEtBQUs3QixVQUFVLENBQUNJLE9BQU8sQ0FBQztFQUMxRDtFQUVPNkQsK0JBQStCQSxDQUFBLEVBQVk7SUFDOUMsT0FBTyxJQUFJLENBQUM3QixNQUFNLENBQUNMLElBQUksQ0FBQ0YsQ0FBQyxJQUFJQSxDQUFDLEtBQUs3QixVQUFVLENBQUNJLE9BQU8sSUFBSXlCLENBQUMsS0FBSzdCLFVBQVUsQ0FBQ0csSUFBSSxDQUFDO0VBQ25GO0VBRU8rRCxlQUFlQSxDQUFBLEVBQWdCO0lBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUNILGtCQUFrQixDQUFDLENBQUMsRUFBRTtNQUM1QixNQUFNLElBQUkvQixLQUFLLENBQUMsNkJBQTZCLENBQUM7SUFDbEQ7O0lBRUE7SUFDQTtJQUNBLE1BQU1tQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMvQixNQUFNLENBQUNnQyxXQUFXLENBQUNwRSxVQUFVLENBQUNHLElBQUksQ0FBQztJQUNuRSxPQUFPLElBQUksQ0FBQ2lDLE1BQU0sQ0FBQ1gsS0FBSyxDQUFDLENBQUMsRUFBRTBDLGtCQUFrQixDQUFDO0VBQ25EO0VBRU9FLG1CQUFtQkEsQ0FBQSxFQUFZO0lBQ2xDLE1BQU1DLFFBQVEsR0FBR0Msd0JBQVMsQ0FBQ0MsSUFBSSxDQUFDLElBQUksQ0FBQ3BDLE1BQU0sQ0FBQztJQUM1QyxPQUFPa0MsUUFBUSxJQUFJdEUsVUFBVSxDQUFDRyxJQUFJO0VBQ3RDO0VBRU9zRSwwQkFBMEJBLENBQUEsRUFBWTtJQUN6QyxNQUFNSCxRQUFRLEdBQUdDLHdCQUFTLENBQUNDLElBQUksQ0FBQyxJQUFJLENBQUNwQyxNQUFNLENBQUM7SUFDNUMsT0FBT2tDLFFBQVEsSUFBSXRFLFVBQVUsQ0FBQ0ksT0FBTztFQUN6QztFQUVPdUMsVUFBVUEsQ0FBQSxFQUF3QztJQUNyRCxPQUFPLElBQUksQ0FBQ3ZCLFFBQVE7RUFDeEI7RUFFT3NELFFBQVFBLENBQUEsRUFBVztJQUN0QixJQUFJLElBQUksQ0FBQ3RDLE1BQU0sQ0FBQ3VDLE1BQU0sS0FBSyxDQUFDLEVBQUU7TUFDMUIsT0FBTyxFQUFFO0lBQ2I7SUFDQSxPQUFPLENBQUMsSUFBSSxDQUFDdkQsUUFBUSxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDZ0IsTUFBTSxDQUFDUixHQUFHLENBQUNDLENBQUMsSUFBSSxJQUFJLENBQUMrQyxnQkFBZ0IsQ0FBQy9DLENBQUMsQ0FBQyxDQUFDLENBQUNnRCxJQUFJLENBQUMsR0FBRyxDQUFDO0VBQ2hHO0VBRU8vRCxZQUFZQSxDQUFBLEVBQVc7SUFBQSxJQUFBZ0UsZ0JBQUE7SUFDMUIsUUFBQUEsZ0JBQUEsR0FBTyxJQUFJLENBQUMzQixVQUFVLGNBQUEyQixnQkFBQSxjQUFBQSxnQkFBQSxHQUFLLElBQUksQ0FBQzNCLFVBQVUsR0FBRyxJQUFJLENBQUNmLE1BQU0sQ0FBQ1IsR0FBRyxDQUFDQyxDQUFDLElBQUksSUFBSSxDQUFDK0MsZ0JBQWdCLENBQUMvQyxDQUFDLENBQUMsQ0FBQyxDQUFDZ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQztFQUN6RztFQUVPRSxRQUFRQSxDQUNYQyxTQUFvQixFQUNwQkMsb0JBQTBDLEdBQUdDLDBDQUFvQixDQUFDQyxPQUFPLEVBQ2xFO0lBQ1AsSUFBSUYsb0JBQW9CLEtBQUtDLDBDQUFvQixDQUFDQyxPQUFPLEVBQUU7TUFDdkQsT0FBTyxJQUFJLENBQUNyRSxZQUFZLENBQUMsQ0FBQyxLQUFLa0UsU0FBUyxDQUFDbEUsWUFBWSxDQUFDLENBQUM7SUFDM0QsQ0FBQyxNQUFNO01BQ0gsT0FDSSxJQUFJLENBQUM2QixVQUFVLENBQUMsQ0FBQyxLQUFLcUMsU0FBUyxDQUFDckMsVUFBVSxDQUFDLENBQUMsSUFDNUN5QyxRQUFRLENBQUNDLElBQUksQ0FBQ2Qsd0JBQVMsQ0FBQ2UsR0FBRyxDQUFDLElBQUksQ0FBQy9CLFlBQVksQ0FBQyxDQUFDLEVBQUV5QixTQUFTLENBQUN6QixZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQ1AsS0FBSyxDQUM3RSxDQUFDLENBQUN1QyxFQUFFLEVBQUVDLEVBQUUsQ0FBQyxLQUFLRCxFQUFFLEtBQUtDLEVBQ3pCLENBQUM7SUFFVDtFQUNKOztFQUVBO0FBQ0o7QUFDQTtFQUNXQyxPQUFPQSxDQUFDUixvQkFBMEMsR0FBR0MsMENBQW9CLENBQUNDLE9BQU8sRUFBVTtJQUM5RixJQUFJLElBQUksQ0FBQy9CLFVBQVUsSUFBSXNDLFNBQVMsRUFBRTtNQUM5QixJQUFJQyxJQUFJLEdBQUcsSUFBSTtNQUNmLEtBQUssTUFBTWxDLEtBQUssSUFBSSxJQUFBbUMsMkJBQVksRUFBQyxJQUFJLENBQUN4RCxNQUFNLENBQUMsRUFBRTtRQUMzQyxJQUFJeUQsVUFBa0I7UUFDdEIsSUFBSTdGLFVBQVUsQ0FBQ0ssYUFBYSxDQUFDb0QsS0FBSyxDQUFDLEVBQUU7VUFDakNvQyxVQUFVLEdBQUdwQyxLQUFLO1FBQ3RCLENBQUMsTUFBTTtVQUNILElBQUl3QixvQkFBb0IsS0FBS0MsMENBQW9CLENBQUNZLFlBQVksRUFBRTtZQUM1REQsVUFBVSxHQUFHcEMsS0FBSyxLQUFLekQsVUFBVSxDQUFDRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUc7VUFDdEQsQ0FBQyxNQUFNO1lBQ0gwRixVQUFVLEdBQUcsR0FBRztVQUNwQjtRQUNKO1FBQ0EsSUFBSUUsV0FBVyxHQUFHRixVQUFVLENBQUNsQixNQUFNO1FBQ25DLE9BQU9vQixXQUFXLEVBQUU7VUFDaEI7VUFDQUosSUFBSSxHQUFJQSxJQUFJLEdBQUcsRUFBRSxHQUFJRSxVQUFVLENBQUNHLFVBQVUsQ0FBQyxFQUFFRCxXQUFXLENBQUM7UUFDN0Q7TUFDSjs7TUFFQTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7TUFDWSxJQUFJLENBQUMzQyxVQUFVLEdBQUd1QyxJQUFJLEtBQUssQ0FBQztJQUNoQztJQUNBLE9BQU8sSUFBSSxDQUFDdkMsVUFBVTtFQUMxQjtFQUVPNkMsVUFBVUEsQ0FBQ2pCLFNBQW9CLEVBQVc7SUFDN0MsTUFBTWtCLFlBQVksR0FBR2xCLFNBQVMsQ0FBQ3BDLG1CQUFtQixDQUFDLENBQUM7SUFDcEQsSUFBSSxJQUFJLENBQUNSLE1BQU0sQ0FBQ3VDLE1BQU0sS0FBS3VCLFlBQVksQ0FBQ3ZCLE1BQU0sRUFBRTtNQUM1QyxPQUFPLEtBQUs7SUFDaEI7SUFDQSxLQUFLLElBQUl3QixDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUcsSUFBSSxDQUFDL0QsTUFBTSxDQUFDdUMsTUFBTSxFQUFFd0IsQ0FBQyxFQUFFLEVBQUU7TUFDekMsTUFBTUMsUUFBUSxHQUFHLElBQUksQ0FBQ2hFLE1BQU0sQ0FBQytELENBQUMsQ0FBQztNQUMvQixNQUFNRSxTQUFTLEdBQUdILFlBQVksQ0FBQ0MsQ0FBQyxDQUFDO01BQ2pDLElBQUksT0FBT0MsUUFBUSxLQUFLLFFBQVEsRUFBRTtRQUM5QixJQUFJLE9BQU9DLFNBQVMsS0FBSyxRQUFRLEVBQUU7VUFDL0IsSUFBSUQsUUFBUSxLQUFLQyxTQUFTLEVBQUU7WUFDeEIsT0FBTyxLQUFLO1VBQ2hCO1VBQ0E7UUFDSixDQUFDLE1BQU07VUFDSCxPQUFPLEtBQUs7UUFDaEI7TUFDSixDQUFDLE1BQU0sSUFBSUQsUUFBUSxLQUFLcEcsVUFBVSxDQUFDSSxPQUFPLElBQUlnRyxRQUFRLEtBQUtwRyxVQUFVLENBQUNHLElBQUksRUFBRTtRQUN4RSxJQUFJLE9BQU9rRyxTQUFTLEtBQUssUUFBUSxFQUFFO1VBQy9CLElBQUksQ0FBQ0MsUUFBUSxDQUFDQyxNQUFNLENBQUNGLFNBQVMsQ0FBQyxDQUFDLEVBQUU7WUFDOUIsT0FBTyxLQUFLO1VBQ2hCO1VBQ0E7UUFDSixDQUFDLE1BQU07VUFDSCxJQUFJQSxTQUFTLEtBQUtyRyxVQUFVLENBQUNJLE9BQU8sSUFBSWlHLFNBQVMsS0FBS3JHLFVBQVUsQ0FBQ0csSUFBSSxFQUFFO1lBQ25FLE9BQU8sS0FBSztVQUNoQjtVQUNBO1FBQ0o7TUFDSjtJQUNKO0lBQ0EsT0FBTyxJQUFJO0VBQ2Y7RUFFT3FHLGdCQUFnQkEsQ0FBQ3ZCLG9CQUEwQyxHQUFHQywwQ0FBb0IsQ0FBQ1ksWUFBWSxFQUFVO0lBQzVHLE9BQU8sSUFBQVcsb0JBQUssRUFDUnJCLFFBQVEsQ0FBQ0MsSUFBSSxDQUFDLElBQUksQ0FBQ2pELE1BQU0sQ0FBQyxDQUFDaUIsTUFBTSxDQUFDeEIsQ0FBQyxJQUMvQm9ELG9CQUFvQixJQUFJQywwQ0FBb0IsQ0FBQ1ksWUFBWSxHQUNuRGpFLENBQUMsS0FBSzdCLFVBQVUsQ0FBQ0csSUFBSSxHQUNyQkgsVUFBVSxDQUFDQyxZQUFZLENBQUM0QixDQUFDLENBQ25DLENBQ0osQ0FBQztFQUNMO0VBRU82RSxPQUFPQSxDQUFBLEVBQVk7SUFDdEIsT0FBTyxJQUFJLENBQUN0RSxNQUFNLENBQUN1QyxNQUFNLEtBQUssQ0FBQztFQUNuQztFQUVPZ0MsUUFBUUEsQ0FBQzNCLFNBQW9CLEVBQWdCO0lBQ2hELElBQUksQ0FBQyxJQUFJLENBQUNyQyxVQUFVLENBQUMsQ0FBQyxFQUFFO01BQ3BCLE1BQU0sSUFBSVgsS0FBSyxDQUFDLG1DQUFtQyxJQUFJLENBQUMwQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDMUU7SUFDQSxJQUFJLENBQUNNLFNBQVMsQ0FBQ3JDLFVBQVUsQ0FBQyxDQUFDLEVBQUU7TUFDekIsTUFBTSxJQUFJWCxLQUFLLENBQUMsbUNBQW1DZ0QsU0FBUyxDQUFDTixRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDL0U7SUFDQSxPQUFPa0Msd0JBQVcsQ0FBQ0MsS0FBSyxDQUFDLElBQUksQ0FBQ3pFLE1BQU0sRUFBRTRDLFNBQVMsQ0FBQ3BDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztFQUMxRTtFQUVPcEIsVUFBVUEsQ0FBQ3dELFNBQW9CLEVBQVc7SUFDN0MsTUFBTThCLFNBQVMsR0FBRyxJQUFJLENBQUNsRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQzVDLE1BQU1tRSxVQUFVLEdBQUcvQixTQUFTLENBQUNwQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ2xELE9BQU9tRSxVQUFVLENBQUMvRCxLQUFLLENBQUMsQ0FBQ2dFLEtBQUssRUFBRUMsS0FBSyxLQUFLRCxLQUFLLEtBQUtGLFNBQVMsQ0FBQ0csS0FBSyxDQUFDLENBQUM7RUFDekU7RUFFT0MsUUFBUUEsQ0FBQ2xDLFNBQW9CLEVBQVc7SUFDM0MsTUFBTThCLFNBQVMsR0FBRyxJQUFJLENBQUNsRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUNuQixLQUFLLENBQUMsQ0FBQyxDQUFDMEYsT0FBTyxDQUFDLENBQUM7SUFDOUQsTUFBTUosVUFBVSxHQUFHL0IsU0FBUyxDQUFDcEMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDbkIsS0FBSyxDQUFDLENBQUMsQ0FBQzBGLE9BQU8sQ0FBQyxDQUFDO0lBQ3BFLE9BQU9KLFVBQVUsQ0FBQy9ELEtBQUssQ0FBQyxDQUFDZ0UsS0FBSyxFQUFFQyxLQUFLLEtBQUtELEtBQUssS0FBS0YsU0FBUyxDQUFDRyxLQUFLLENBQUMsQ0FBQztFQUN6RTtFQUVBLENBQVFHLG1CQUFtQkEsQ0FBQSxFQUEyRTtJQUNsRyxJQUFJQyxlQUFlLEdBQUcsSUFBSUMsa0NBQWdCLENBQUMsSUFBSSxDQUFDM0UsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUM3RCxLQUFLLE1BQU1jLEtBQUssSUFBSSxJQUFJLENBQUNyQixNQUFNLEVBQUU7TUFDN0IsSUFBSXBDLFVBQVUsQ0FBQ0ssYUFBYSxDQUFDb0QsS0FBSyxDQUFDLEVBQUU7UUFDakM0RCxlQUFlLENBQUNFLE1BQU0sQ0FBQzlELEtBQUssQ0FBQztNQUNqQyxDQUFDLE1BQU07UUFDSCxJQUFJLENBQUM0RCxlQUFlLENBQUNHLEtBQUssRUFBRTtVQUN4QixNQUFNSCxlQUFlLENBQUNJLGNBQWMsQ0FBQyxDQUFDO1VBQ3RDSixlQUFlLEdBQUcsSUFBSUMsa0NBQWdCLENBQUMsS0FBSyxDQUFDO1FBQ2pEO1FBQ0EsTUFBTTdELEtBQUs7TUFDZjtJQUNKO0lBQ0EsSUFBSSxDQUFDNEQsZUFBZSxDQUFDRyxLQUFLLEVBQUU7TUFDeEIsTUFBTUgsZUFBZSxDQUFDSSxjQUFjLENBQUMsQ0FBQztJQUMxQztFQUNKO0VBRU9DLFNBQVNBLENBQUEsRUFBcUM7SUFDakQsTUFBTUMsWUFBdUMsR0FBRyxFQUFFO0lBQ2xELEtBQUssTUFBTUMsUUFBUSxJQUFJLElBQUksQ0FBQ3hGLE1BQU0sRUFBRTtNQUNoQyxJQUFJd0YsUUFBUSxLQUFLLElBQUksRUFBRTtRQUNuQixJQUFJLENBQUNELFlBQVksQ0FBQ0UsR0FBRyxDQUFDLENBQUMsRUFBRTtVQUNyQixJQUFJLElBQUksQ0FBQ2xGLFVBQVUsQ0FBQyxDQUFDLEVBQUU7WUFDbkIsTUFBTSxJQUFJWCxLQUFLLENBQUMsb0JBQW9CLElBQUksQ0FBQzBDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQztVQUMzRCxDQUFDLE1BQU07WUFDSGlELFlBQVksQ0FBQ2pGLElBQUksQ0FBQyxJQUFJLENBQUM7VUFDM0I7UUFDSjtRQUNBO01BQ0o7TUFFQSxJQUFJa0YsUUFBUSxLQUFLLEdBQUcsRUFBRTtRQUNsQjtNQUNKO01BQ0FELFlBQVksQ0FBQ2pGLElBQUksQ0FBQ2tGLFFBQVEsQ0FBQztJQUMvQjtJQUNBLE9BQU8sSUFBSWhILGFBQWEsQ0FBdUIrRyxZQUFZLEVBQUUsSUFBSSxDQUFDdkcsUUFBUSxDQUFDO0VBQy9FOztFQUVBO0FBQ0o7QUFDQTtFQUNXMEcsa0JBQWtCQSxDQUFBLEVBQXFDO0lBQzFELElBQUksSUFBSSxDQUFDbEUsVUFBVSxDQUFDLENBQUMsRUFBRTtNQUNuQixPQUFPLElBQUk7SUFDZixDQUFDLE1BQU07TUFDSDtNQUNBO01BQ0EsTUFBTVYsU0FBb0MsR0FBRyxJQUFJLENBQUNkLE1BQU0sQ0FBQ1IsR0FBRyxDQUFDQyxDQUFDLElBQzFEQSxDQUFDLEtBQUs3QixVQUFVLENBQUNHLElBQUksR0FBR0gsVUFBVSxDQUFDSSxPQUFPLEdBQUd5QixDQUNqRCxDQUFDO01BQ0QsT0FBTyxJQUFJakIsYUFBYSxDQUF1QnNDLFNBQVMsRUFBRSxJQUFJLENBQUM5QixRQUFRLENBQUM7SUFDNUU7RUFDSjtFQUVPMkcsZUFBZUEsQ0FBQSxFQUFxQztJQUN2RCxJQUFJLElBQUksQ0FBQ25FLFVBQVUsQ0FBQyxDQUFDLEVBQUU7TUFDbkIsT0FBTyxJQUFJO0lBQ2YsQ0FBQyxNQUFNO01BQ0g7TUFDQTtNQUNBLE1BQU1WLFNBQW9DLEdBQUcsSUFBSSxDQUFDZCxNQUFNLENBQUNSLEdBQUcsQ0FBQ0MsQ0FBQyxJQUMxREEsQ0FBQyxLQUFLN0IsVUFBVSxDQUFDSSxPQUFPLEdBQUdKLFVBQVUsQ0FBQ0csSUFBSSxHQUFHMEIsQ0FDakQsQ0FBQztNQUNELE9BQU8sSUFBSWpCLGFBQWEsQ0FBdUJzQyxTQUFTLEVBQUUsSUFBSSxDQUFDOUIsUUFBUSxDQUFDO0lBQzVFO0VBQ0o7RUFFTzRHLFVBQVVBLENBQUEsRUFBZ0M7SUFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQzVHLFFBQVEsRUFBRTtNQUNoQixNQUFNLElBQUlZLEtBQUssQ0FBQyxTQUFTLElBQUksQ0FBQ2xCLFlBQVksQ0FBQyxDQUFDLG1CQUFtQixDQUFDO0lBQ3BFO0lBQ0EsT0FBTyxJQUFJRixhQUFhLENBQWtCLElBQUksQ0FBQ3dCLE1BQU0sRUFBRSxJQUFJLENBQUM7RUFDaEU7RUFFQSxDQUFRNkYsaUJBQWlCQSxDQUFBLEVBQXdCO0lBQzdDLE1BQU1DLE1BQU0sR0FBRyxJQUFJWixrQ0FBZ0IsQ0FBQyxJQUFJLENBQUMzRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ3RELEtBQUssTUFBTWMsS0FBSyxJQUFJYyx3QkFBUyxDQUFDNEQsUUFBUSxDQUFDLElBQUksQ0FBQzVFLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7TUFDNUQyRSxNQUFNLENBQUNYLE1BQU0sQ0FBQzlELEtBQUssQ0FBQztNQUNwQixNQUFNeUUsTUFBTSxDQUFDRSxNQUFNLENBQUMsQ0FBQztJQUN6QjtFQUNKO0VBRU9DLHVCQUF1QkEsQ0FBQSxFQUFxQztJQUMvRCxNQUFNL0QsUUFBUSxHQUFHQyx3QkFBUyxDQUFDQyxJQUFJLENBQUMsSUFBSSxDQUFDcEMsTUFBTSxDQUFDO0lBQzVDLElBQUlrQyxRQUFRLElBQUlvQixTQUFTLElBQUkxRixVQUFVLENBQUNDLFlBQVksQ0FBQ3FFLFFBQVEsQ0FBQyxFQUFFO01BQzVELE9BQU8sSUFBSTFELGFBQWEsQ0FBQyxJQUFJLENBQUN3QixNQUFNLENBQUNYLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUNMLFFBQVEsQ0FBQztJQUNyRTtJQUNBLE9BQU8sSUFBSTtFQUNmO0VBRU9rSCxhQUFhQSxDQUFBLEVBQXFDO0lBQ3JELE1BQU1KLE1BQU0sR0FBRyxJQUFJWixrQ0FBZ0IsQ0FBQyxJQUFJLENBQUNsRyxRQUFRLENBQUM7SUFDbEQsS0FBSyxNQUFNcUMsS0FBSyxJQUFJYyx3QkFBUyxDQUFDNEQsUUFBUSxDQUFDLElBQUksQ0FBQzVFLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7TUFDNUQyRSxNQUFNLENBQUNYLE1BQU0sQ0FBQzlELEtBQUssQ0FBQztJQUN4QjtJQUNBO0lBQ0E7SUFDQSxPQUFPeUUsTUFBTSxDQUFDRSxNQUFNLENBQUMsQ0FBQztFQUMxQjtFQUVPRyxtQkFBbUJBLENBQ3RCQyxTQUE0QixFQUM1QkMsbUNBQTZDLEVBQ2I7SUFDaEMsSUFBSSxJQUFJLENBQUM3RSxVQUFVLENBQUMsQ0FBQyxJQUFJNEUsU0FBUyxDQUFDN0QsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUM3QyxPQUFPLElBQUk7SUFDZjtJQUNBLElBQUkrRCxlQUFlLEdBQUcsQ0FBQztJQUN2QixNQUFNUixNQUFNLEdBQUcsSUFBSVosa0NBQWdCLENBQUMsSUFBSSxDQUFDO0lBQ3pDLEtBQUssTUFBTTdELEtBQUssSUFBSSxJQUFJLENBQUNGLFlBQVksQ0FBQyxDQUFDLEVBQUU7TUFDckMsSUFBSXZELFVBQVUsQ0FBQ0MsWUFBWSxDQUFDd0QsS0FBSyxDQUFDLElBQUlpRixlQUFlLEdBQUdGLFNBQVMsQ0FBQzdELE1BQU0sRUFBRTtRQUFBLElBQUFnRSxxQkFBQTtRQUN0RSxNQUFNQyxjQUFjLElBQUFELHFCQUFBLEdBQ2hCSCxTQUFTLENBQUNFLGVBQWUsQ0FBQyxjQUFBQyxxQkFBQSxjQUFBQSxxQkFBQSxHQUN6QkYsbUNBQW1DLElBQUksSUFBSSxHQUFHekksVUFBVSxDQUFDRyxJQUFJLEdBQUcsSUFBQTBJLG1CQUFNLEVBQUMsQ0FBRTtRQUM5RVgsTUFBTSxDQUFDWCxNQUFNLENBQUNxQixjQUFjLENBQUM7UUFDN0JGLGVBQWUsRUFBRTtNQUNyQixDQUFDLE1BQU07UUFDSFIsTUFBTSxDQUFDWCxNQUFNLENBQUM5RCxLQUFLLENBQUM7TUFDeEI7SUFDSjtJQUNBO0lBQ0E7SUFDQSxPQUFPeUUsTUFBTSxDQUFDRSxNQUFNLENBQUMsQ0FBQztFQUMxQjtFQUVReEQsZ0JBQWdCQSxDQUFDZ0QsUUFBbUIsRUFBVTtJQUNsRCxJQUFJLE9BQU9BLFFBQVEsS0FBSyxRQUFRLEVBQUU7TUFDOUIsT0FBT0EsUUFBUTtJQUNuQjtJQUNBLElBQUlBLFFBQVEsS0FBSzVILFVBQVUsQ0FBQ0csSUFBSSxFQUFFO01BQzlCLE9BQU8sR0FBRztJQUNkO0lBQ0EsSUFBSXlILFFBQVEsS0FBSzVILFVBQVUsQ0FBQ0ksT0FBTyxFQUFFO01BQ2pDLE9BQU8sR0FBRztJQUNkO0lBQ0EsTUFBTSxJQUFJNEIsS0FBSyxDQUFDLGdDQUFnQyxJQUFBOEcsK0JBQWtCLEVBQUNsQixRQUFRLENBQUMsRUFBRSxDQUFDO0VBQ25GO0FBQ0o7QUFBQ25ILE9BQUEsQ0FBQUcsYUFBQSxHQUFBQSxhQUFBIiwiaWdub3JlTGlzdCI6W119
@@ -1 +1 @@
1
- {"version":3,"file":"ModelPath.js","names":["_IterableUtils","require","_TypingUtils","_EachCurrentCollision","_ModelPathBuilder","_PathMatcher","EachSymbol","Symbol","for","CurrentSymbol","PathTokens","isMultiToken","part","each","current","isSimpleToken","isInstanceToken","test","isInstanceTokenOrInstancesSpec","exports","isModelPath","path","ModelPathImpl","convertToLegacyPath","toLegacyPath","convertToAbsoluteModelPath","createAbsoluteFromMask","emptyModelPath","emptyAbsoluteModelPath","createModelPath","absolute","partPartStrings","split","ensurePlainPathPartsDoesNotContainMultiplicity","startsWith","slice","createFromMask","multiplicitySymbol","map","x","parts","some","Error","createAbsolute","createRelativeResolvedModelPath","createAbsoluteFromTokens","tokens","createAbsoluteResolvedFromTokens","createRelativeFromTokens","joinModelPaths","resultParts","joinItem","push","isAbsolute","getPathPartsAsArray","Array","isArray","isAllTokensResolved","every","constructor","pathParts","legacyPath","cachedHash","filter","resolved","getPathParts","getSimpleTokensStrict","token","getSimpleTokensAsArrayStrict","joinWith","isResolved","resolveAll","instance","isContainIteration","isContainCurrentIteration","isContainCurrentOrEachIteration","getLastListPath","lastIterationIndex","lastIndexOf","isEndsWithIteration","lastItem","IterUtils","last","isEndsWithCurrentIteration","toString","length","pathPartToString","join","_this$legacyPath","isEquals","modelPath","eachCurrentCollision","EachCurrentCollision","AreSame","Iterator","from","zip","t1","t2","getHash","undefined","hash","reverseArray","currentStr","AreDifferent","stringIndex","charCodeAt","isIncludes","targetTokens","i","leftPart","rightPart","isFinite","Number","getIterationRank","count","isEmpty","matchFor","PathMatcher","match","thisParts","otherParts","value","index","splitByMultiplicity","lastSimpleParts","ModelPathBuilder","append","empty","toResolvedPath","normalize","resultTokens","pathPart","pop","toCurrentIteration","toEachIteration","toAbsolute","getAllParentPaths","result","skipLast","toPath","trimLastStarIfLastToken","getParentPath","applyInstancesDirty","instances","fillWithMultiplicityIfHasNoInstance","instanceCounter","_instances$instanceCo","instanceOrEach","reject","ensureAndGetString"],"sources":["../../../../Common/ModelPath/ModelPath.ts"],"sourcesContent":["import { BindingPath } from \"../../Engine/src/Engine/Core/CoreTypes\";\nimport { count, IterUtils, reverseArray } from \"../IterableUtils\";\nimport { ensureAndGetString, reject } from \"../TypingUtils\";\n\nimport { EachCurrentCollision } from \"./EachCurrentCollision\";\nimport { ModelPathBuilder } from \"./ModelPathBuilder\";\nimport { PathMatcher, PathMatching } from \"./PathMatcher\";\nimport { IEquatable } from \"./IEquatable\";\n\nconst EachSymbol = Symbol.for(\"__EACH__\");\nconst CurrentSymbol = Symbol.for(\"__CURRENT__\");\n\nexport class PathTokens {\n public static each: typeof EachSymbol = EachSymbol;\n public static current: typeof CurrentSymbol = CurrentSymbol;\n\n public static isMultiToken(part: undefined | PathToken): part is typeof EachSymbol | typeof CurrentSymbol {\n return part === PathTokens.each || part === PathTokens.current;\n }\n\n public static isSimpleToken(part: undefined | PathToken): part is string {\n return typeof part === \"string\";\n }\n\n public static isInstanceToken(part: undefined | PathToken): part is string {\n return typeof part === \"string\" && /^\\d+$/i.test(part);\n }\n\n public static isInstanceTokenOrInstancesSpec(part: undefined | PathToken): part is string {\n return typeof part === \"string\" && (/^\\d+$/i.test(part) || /^\\[(\\d+\\,?)+\\]$/i.test(part));\n }\n}\n\nexport type SimplePathToken = string;\n\nexport type PathToken = SimplePathToken | typeof EachSymbol | typeof CurrentSymbol;\n\nexport function isModelPath(path: BindingPath | ModelPath | unknown): path is ModelPath {\n return typeof path !== \"string\" && path instanceof ModelPathImpl;\n}\n\nexport function convertToLegacyPath(path: BindingPath | ModelPath): BindingPath {\n return isModelPath(path) ? path.toLegacyPath() : path;\n}\n\nexport function convertToAbsoluteModelPath<R extends boolean, A extends boolean>(\n path: BindingPath | IModelPath<R, A>\n): IModelPath<R, true>;\nexport function convertToAbsoluteModelPath(path: BindingPath | AbsoluteModelPath): AbsoluteModelPath {\n return isModelPath(path) ? path : createAbsoluteFromMask(path, PathTokens.each);\n}\n\nexport function emptyModelPath(): RelativeResolvedModelPath {\n return new ModelPathImpl<true, false>([], false);\n}\n\nexport function emptyAbsoluteModelPath(): AbsoluteResolvedModelPath {\n return new ModelPathImpl<true, true>([], true);\n}\n\nexport function createModelPath(path: string, absolute: true): AbsoluteResolvedModelPath;\nexport function createModelPath(path: string, absolute: false): RelativeResolvedModelPath;\nexport function createModelPath(path: string, absolute: \"auto\"): ResolvedModelPath;\nexport function createModelPath(path: string, absolute: boolean | \"auto\"): ResolvedModelPath {\n const partPartStrings = path.split(\"/\");\n ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);\n if (absolute === \"auto\") {\n if (path.startsWith(\"/\")) {\n return new ModelPathImpl<true, true>(partPartStrings.slice(1), true);\n } else {\n return new ModelPathImpl<true, false>(partPartStrings, false);\n }\n }\n if (absolute && path.startsWith(\"/\")) {\n return new ModelPathImpl<true, true>(partPartStrings.slice(1), true);\n }\n return new ModelPathImpl<true, boolean>(partPartStrings, absolute);\n}\n\nexport function createFromMask(path: string, absolute: true, multiplicitySymbol: PathToken): AbsoluteModelPath;\nexport function createFromMask(path: string, absolute: false, multiplicitySymbol: PathToken): ResolvedModelPath;\nexport function createFromMask(path: string, absolute: \"auto\", multiplicitySymbol: PathToken): ModelPath;\nexport function createFromMask(path: string, absolute: boolean | \"auto\", multiplicitySymbol: PathToken): ModelPath {\n const partPartStrings = path.split(\"/\").map(x => (x === \"*\" ? multiplicitySymbol : x));\n if (absolute === \"auto\") {\n if (path.startsWith(\"/\")) {\n return new ModelPathImpl(partPartStrings.slice(1), true);\n } else {\n return new ModelPathImpl(partPartStrings, false);\n }\n }\n if (absolute && path.startsWith(\"/\")) {\n return new ModelPathImpl(partPartStrings.slice(1), true);\n }\n return new ModelPathImpl(partPartStrings, absolute);\n}\n\nexport function createAbsoluteFromMask(path: string, multiplicitySymbol: PathToken): AbsoluteModelPath {\n const partPartStrings = path.split(\"/\").map(x => (x === \"*\" ? multiplicitySymbol : x));\n if (path.startsWith(\"/\")) {\n return new ModelPathImpl(partPartStrings.slice(1), true);\n }\n return new ModelPathImpl(partPartStrings, true);\n}\n\nfunction ensurePlainPathPartsDoesNotContainMultiplicity(parts: readonly string[]): void {\n if (parts.some(x => x === \"*\")) {\n throw new Error(\"Path must not contain * symbol\");\n }\n}\n\nexport function createAbsolute(path: string): AbsoluteResolvedModelPath {\n const partPartStrings = path.split(\"/\");\n ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);\n if (path.startsWith(\"/\")) {\n return new ModelPathImpl<true, true>(partPartStrings.slice(1), true);\n }\n return new ModelPathImpl<true, true>(partPartStrings, true);\n}\n\nexport function createRelativeResolvedModelPath(path: string): RelativeResolvedModelPath {\n const partPartStrings = path.split(\"/\");\n ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);\n return new ModelPathImpl<true, false>(partPartStrings, false);\n}\n\nexport function createAbsoluteFromTokens(tokens: PathToken[]): AbsoluteModelPath {\n return new ModelPathImpl<false, true>(tokens, true);\n}\n\nexport function createAbsoluteResolvedFromTokens(tokens: readonly string[]): AbsoluteResolvedModelPath {\n ensurePlainPathPartsDoesNotContainMultiplicity(tokens);\n return new ModelPathImpl<true, true>(tokens, true);\n}\n\nexport function createRelativeFromTokens(tokens: readonly string[]): RelativeResolvedModelPath;\nexport function createRelativeFromTokens(tokens: readonly PathToken[]): RelativeModelPath;\nexport function createRelativeFromTokens(tokens: readonly PathToken[]): RelativeModelPath {\n return new ModelPathImpl<false, false>(tokens, false);\n}\n\nexport function joinModelPaths(...parts: Array<ModelPath | PathToken | PathToken[]>): ModelPath {\n let absolute = false;\n let resultParts: PathToken[] = [];\n for (const joinItem of parts) {\n if (typeof joinItem === \"string\") {\n resultParts.push(joinItem);\n } else if (isModelPath(joinItem)) {\n if (joinItem.isAbsolute()) {\n absolute = true;\n resultParts = [...joinItem.getPathPartsAsArray()];\n } else {\n resultParts.push(...joinItem.getPathPartsAsArray());\n }\n } else if (Array.isArray(joinItem)) {\n resultParts.push(...joinItem);\n } else if (PathTokens.isMultiToken(joinItem)) {\n resultParts.push(joinItem);\n }\n }\n\n return new ModelPathImpl(resultParts, absolute);\n}\n\nexport interface IModelPath<TResolved extends boolean, TAbsolute extends boolean>\n extends IEquatable<IModelPath<boolean, boolean>> {\n readonly resolved: TResolved;\n readonly absolute: TAbsolute;\n\n isEquals(modelPath: ModelPath, eachCurrentCollision?: EachCurrentCollision): boolean;\n getHash(eachCurrentCollision?: EachCurrentCollision): number;\n\n isResolved(): this is IModelPath<true, TAbsolute>;\n isAbsolute(): this is IModelPath<TResolved, true>;\n toAbsolute(): IModelPath<TResolved, true>;\n\n joinWith(...path: string[]): IModelPath<TResolved, TAbsolute>;\n joinWith(...path: PathToken[]): IModelPath<boolean, TAbsolute>;\n joinWith(...path: Array<ResolvedModelPath | string>): IModelPath<TResolved, TAbsolute>;\n joinWith(...path: Array<AbsoluteResolvedModelPath | string>): IModelPath<TResolved, true>;\n joinWith(...path: Array<ModelPath | PathToken>): IModelPath<boolean, TAbsolute>;\n\n getPathParts(): Iterable<PathTokenSpec<TResolved>>;\n getPathPartsAsArray(): ReadonlyArray<PathTokenSpec<TResolved>>;\n getSimpleTokensStrict(): Iterable<SimplePathToken>;\n getSimpleTokensAsArrayStrict(): readonly SimplePathToken[];\n\n resolveAll(instance: string): ModelPath;\n isContainIteration(): boolean;\n isContainCurrentIteration(): boolean;\n isContainCurrentOrEachIteration(): boolean;\n getLastListPath(): PathToken[];\n isEndsWithIteration(): boolean;\n isEndsWithCurrentIteration(): boolean;\n isIncludes(modelPath: ModelPath): boolean;\n getIterationRank(eachCurrentCollision?: EachCurrentCollision): number;\n isEmpty(): boolean;\n matchFor(modelPath: ModelPath): PathMatching;\n startsWith(modelPath: ModelPath): boolean;\n splitByMultiplicity(): Iterable<ResolvedModelPath | typeof EachSymbol | typeof CurrentSymbol>;\n normalize(): IModelPath<TResolved, TAbsolute>;\n toCurrentIteration(): IModelPath<TResolved, TAbsolute>;\n toEachIteration(): IModelPath<TResolved, TAbsolute>;\n getAllParentPaths(): Iterable<ModelPath>;\n trimLastStarIfLastToken(): IModelPath<TResolved, TAbsolute>;\n getParentPath(): IModelPath<TResolved, TAbsolute>;\n applyInstancesDirty(\n instances: SimplePathToken[],\n fillWithMultiplicityIfHasNoInstance?: boolean\n ): IModelPath<TResolved, TAbsolute>;\n\n toString(): string;\n toLegacyPath(): string;\n}\n\nexport type ModelPath = IModelPath<boolean, boolean>;\nexport type ResolvedModelPath = IModelPath<true, boolean>;\nexport type AbsoluteModelPath = IModelPath<boolean, true>;\nexport type AbsoluteResolvedModelPath = IModelPath<true, true>;\n\nexport type RelativeModelPath = IModelPath<boolean, false>;\nexport type RelativeResolvedModelPath = IModelPath<true, false>;\n\ntype PathTokenSpec<TResolved extends boolean> = TResolved extends true ? string : PathToken;\n\ntype PathTokensSpec<TResolved extends boolean> = Array<PathTokenSpec<TResolved>>;\n\ntype ReadonlyPathTokensSpec<TResolved extends boolean> = ReadonlyArray<PathTokenSpec<TResolved>>;\n\nfunction isAllTokensResolved<TResolved extends boolean>(tokens: ReadonlyPathTokensSpec<TResolved>): TResolved {\n // Я что-то немогу сообразить как тут всё строго написать...\n // @ts-expect-error\n return tokens.every(PathTokens.isSimpleToken);\n}\n\nexport class ModelPathImpl<TResolved extends boolean, TAbsolute extends boolean>\n implements IEquatable<ModelPath>, IModelPath<TResolved, TAbsolute>\n{\n private readonly tokens: ReadonlyPathTokensSpec<TResolved>;\n public readonly absolute: TAbsolute;\n private legacyPath: undefined | string;\n private cachedHash: number | undefined;\n\n public constructor(pathParts: ReadonlyPathTokensSpec<TResolved>, absolute: TAbsolute) {\n this.tokens = pathParts.filter(x => x !== \"\");\n this.absolute = absolute;\n }\n\n public get resolved(): TResolved {\n return isAllTokensResolved(this.tokens);\n }\n\n public getPathParts(): Iterable<PathTokenSpec<TResolved>> {\n return this.tokens;\n }\n\n public getPathPartsAsArray(): ReadonlyArray<PathTokenSpec<TResolved>> {\n return this.tokens;\n }\n\n public *getSimpleTokensStrict(): Iterable<SimplePathToken> {\n for (const token of this.tokens) {\n if (!PathTokens.isSimpleToken(token)) {\n throw new Error(\"Path must not contain spec tokens\");\n }\n yield token;\n }\n }\n\n public getSimpleTokensAsArrayStrict(): readonly SimplePathToken[] {\n for (const token of this.tokens) {\n if (!PathTokens.isSimpleToken(token)) {\n throw new Error(\"Path must not contain spec tokens\");\n }\n }\n // Проверка выше гараентирует что будут только SimplePathToken.\n // Все map и filter убраны для производительности\n // @ts-ignore\n return this.tokens;\n }\n\n public joinWith(...path: string[]): IModelPath<TResolved, TAbsolute>;\n public joinWith(...path: PathToken[]): IModelPath<boolean, TAbsolute>;\n public joinWith(...path: Array<ResolvedModelPath | string>): IModelPath<TResolved, TAbsolute>;\n public joinWith(...path: Array<AbsoluteResolvedModelPath | string>): IModelPath<TResolved, true>;\n public joinWith(...path: Array<ModelPath | PathToken>): IModelPath<boolean, TAbsolute>;\n public joinWith(...path: Array<ModelPath | PathToken>): IModelPath<boolean, boolean> {\n return joinModelPaths(this, ...path);\n }\n\n public isResolved(): this is IModelPath<true, TAbsolute> {\n return isAllTokensResolved(this.tokens);\n }\n\n public resolveAll(instance: string): ModelPath {\n const tokens = this.tokens.map(token => {\n if (PathTokens.isSimpleToken(token)) {\n return token;\n } else {\n return instance;\n }\n });\n\n return new ModelPathImpl(tokens, this.absolute);\n }\n\n public isContainIteration(): boolean {\n return this.tokens.some(x => x === PathTokens.each);\n }\n\n public isContainCurrentIteration(): boolean {\n return this.tokens.some(x => x === PathTokens.current);\n }\n\n public isContainCurrentOrEachIteration(): boolean {\n return this.tokens.some(x => x === PathTokens.current || x === PathTokens.each);\n }\n\n public getLastListPath(): PathToken[] {\n if (!this.isContainIteration()) {\n throw new Error(\"Path must contain iteration\");\n }\n\n // Проверка выше гарантирует, что будет PathTokens.each\n // @ts-ignore\n const lastIterationIndex = this.tokens.lastIndexOf(PathTokens.each);\n return this.tokens.slice(0, lastIterationIndex);\n }\n\n public isEndsWithIteration(): boolean {\n const lastItem = IterUtils.last(this.tokens);\n return lastItem == PathTokens.each;\n }\n\n public isEndsWithCurrentIteration(): boolean {\n const lastItem = IterUtils.last(this.tokens);\n return lastItem == PathTokens.current;\n }\n\n public isAbsolute(): this is IModelPath<TResolved, true> {\n return this.absolute;\n }\n\n public toString(): string {\n if (this.tokens.length === 0) {\n return \"\";\n }\n return (this.absolute ? \"/\" : \"\") + this.tokens.map(x => this.pathPartToString(x)).join(\"/\");\n }\n\n public toLegacyPath(): string {\n return this.legacyPath ?? (this.legacyPath = this.tokens.map(x => this.pathPartToString(x)).join(\"/\"));\n }\n\n public isEquals(\n modelPath: ModelPath,\n eachCurrentCollision: EachCurrentCollision = EachCurrentCollision.AreSame\n ): boolean {\n if (eachCurrentCollision === EachCurrentCollision.AreSame) {\n return this.toLegacyPath() === modelPath.toLegacyPath();\n } else {\n return (\n this.isAbsolute() === modelPath.isAbsolute() &&\n Iterator.from(IterUtils.zip(this.getPathParts(), modelPath.getPathParts())).every(\n ([t1, t2]) => t1 === t2\n )\n );\n }\n }\n\n /**\n * Всегда целое положительное беззнаковое 32-битное число\n */\n public getHash(eachCurrentCollision: EachCurrentCollision = EachCurrentCollision.AreSame): number {\n if (this.cachedHash == undefined) {\n let hash = 5381;\n for (const token of reverseArray(this.tokens)) {\n let currentStr: string;\n if (PathTokens.isSimpleToken(token)) {\n currentStr = token;\n } else {\n if (eachCurrentCollision === EachCurrentCollision.AreDifferent) {\n currentStr = token === PathTokens.each ? \"*\" : \"!\";\n } else {\n currentStr = \"*\";\n }\n }\n let stringIndex = currentStr.length;\n while (stringIndex) {\n // tslint:disable-next-line:no-bitwise\n hash = (hash * 33) ^ currentStr.charCodeAt(--stringIndex);\n }\n }\n\n /*\n tslint:disable-next-line:no-bitwise\n JavaScript does bitwise operations (like XOR, above) on 32-bit signed\n integers. Since we want the results to be always positive, convert the\n signed int to an unsigned by doing an unsigned bitshift.\n */\n this.cachedHash = hash >>> 0;\n }\n return this.cachedHash;\n }\n\n public isIncludes(modelPath: ModelPath): boolean {\n const targetTokens = modelPath.getPathPartsAsArray();\n if (this.tokens.length !== targetTokens.length) {\n return false;\n }\n for (let i = 0; i < this.tokens.length; i++) {\n const leftPart = this.tokens[i];\n const rightPart = targetTokens[i];\n if (typeof leftPart === \"string\") {\n if (typeof rightPart === \"string\") {\n if (leftPart !== rightPart) {\n return false;\n }\n continue;\n } else {\n return false;\n }\n } else if (leftPart === PathTokens.current || leftPart === PathTokens.each) {\n if (typeof rightPart === \"string\") {\n if (!isFinite(Number(rightPart))) {\n return false;\n }\n continue;\n } else {\n if (rightPart !== PathTokens.current && rightPart !== PathTokens.each) {\n return false;\n }\n continue;\n }\n }\n }\n return true;\n }\n\n public getIterationRank(eachCurrentCollision: EachCurrentCollision = EachCurrentCollision.AreDifferent): number {\n return count(\n Iterator.from(this.tokens).filter(x =>\n eachCurrentCollision == EachCurrentCollision.AreDifferent\n ? x === PathTokens.each\n : PathTokens.isMultiToken(x)\n )\n );\n }\n\n public isEmpty(): boolean {\n return this.tokens.length === 0;\n }\n\n public matchFor(modelPath: ModelPath): PathMatching {\n if (!this.isAbsolute()) {\n throw new Error(`Cannot match non absolute path '${this.toString()}'`);\n }\n if (!modelPath.isAbsolute()) {\n throw new Error(`Cannot match non absolute path '${modelPath.toString()}'`);\n }\n return PathMatcher.match(this.tokens, modelPath.getPathPartsAsArray());\n }\n\n public startsWith(modelPath: ModelPath): boolean {\n const thisParts = this.getPathPartsAsArray();\n const otherParts = modelPath.getPathPartsAsArray();\n return otherParts.every((value, index) => value === thisParts[index]);\n }\n\n public *splitByMultiplicity(): Iterable<ResolvedModelPath | typeof EachSymbol | typeof CurrentSymbol> {\n let lastSimpleParts = new ModelPathBuilder(this.isAbsolute());\n for (const token of this.tokens) {\n if (PathTokens.isSimpleToken(token)) {\n lastSimpleParts.append(token);\n } else {\n if (!lastSimpleParts.empty) {\n yield lastSimpleParts.toResolvedPath();\n lastSimpleParts = new ModelPathBuilder(false);\n }\n yield token;\n }\n }\n if (!lastSimpleParts.empty) {\n yield lastSimpleParts.toResolvedPath();\n }\n }\n\n public normalize(): IModelPath<TResolved, TAbsolute> {\n const resultTokens: PathTokensSpec<TResolved> = [];\n for (const pathPart of this.tokens) {\n if (pathPart === \"..\") {\n if (!resultTokens.pop()) {\n if (this.isAbsolute()) {\n throw new Error(`Path is invalid '${this.toString()}'`);\n } else {\n resultTokens.push(\"..\");\n }\n }\n continue;\n }\n\n if (pathPart === \".\") {\n continue;\n }\n resultTokens.push(pathPart);\n }\n return new ModelPathImpl<TResolved, TAbsolute>(resultTokens, this.absolute);\n }\n\n /**\n * @summary Спецификаторы множественности Each заменяет на Current\n */\n public toCurrentIteration(): IModelPath<TResolved, TAbsolute> {\n if (this.isResolved()) {\n return this;\n } else {\n // NOTE Тут не получается наложить дискриминатор\n // @ts-expect-error\n const pathParts: PathTokensSpec<TResolved> = this.tokens.map(x =>\n x === PathTokens.each ? PathTokens.current : x\n );\n return new ModelPathImpl<TResolved, TAbsolute>(pathParts, this.absolute);\n }\n }\n\n public toEachIteration(): IModelPath<TResolved, TAbsolute> {\n if (this.isResolved()) {\n return this;\n } else {\n // NOTE Тут не получается наложить дискриминатор\n // @ts-expect-error\n const pathParts: PathTokensSpec<TResolved> = this.tokens.map(x =>\n x === PathTokens.current ? PathTokens.each : x\n );\n return new ModelPathImpl<TResolved, TAbsolute>(pathParts, this.absolute);\n }\n }\n\n public toAbsolute(): IModelPath<TResolved, true> {\n if (!this.absolute) {\n throw new Error(`Path '${this.toLegacyPath()} is not absolute'`);\n }\n return new ModelPathImpl<TResolved, true>(this.tokens, true);\n }\n\n public *getAllParentPaths(): Iterable<ModelPath> {\n const result = new ModelPathBuilder(this.isAbsolute());\n for (const token of IterUtils.skipLast(this.getPathParts(), 1)) {\n result.append(token);\n yield result.toPath();\n }\n }\n\n public trimLastStarIfLastToken(): IModelPath<TResolved, TAbsolute> {\n const lastItem = IterUtils.last(this.tokens);\n if (lastItem != undefined && PathTokens.isMultiToken(lastItem)) {\n return new ModelPathImpl(this.tokens.slice(0, -1), this.absolute);\n }\n return this;\n }\n\n public getParentPath(): IModelPath<TResolved, TAbsolute> {\n const result = new ModelPathBuilder(this.absolute);\n for (const token of IterUtils.skipLast(this.getPathParts(), 1)) {\n result.append(token);\n }\n // Тут получается так, что по другому никак\n // @ts-expect-error\n return result.toPath();\n }\n\n public applyInstancesDirty(\n instances: SimplePathToken[],\n fillWithMultiplicityIfHasNoInstance?: boolean\n ): IModelPath<TResolved, TAbsolute> {\n if (this.isResolved() || instances.length === 0) {\n return this;\n }\n let instanceCounter = 0;\n const result = new ModelPathBuilder(true);\n for (const token of this.getPathParts()) {\n if (PathTokens.isMultiToken(token) && instanceCounter < instances.length) {\n const instanceOrEach =\n instances[instanceCounter] ??\n (fillWithMultiplicityIfHasNoInstance == true ? PathTokens.each : reject());\n result.append(instanceOrEach);\n instanceCounter++;\n } else {\n result.append(token);\n }\n }\n // Тут получается так, что по другому никак\n // @ts-expect-error\n return result.toPath();\n }\n\n private pathPartToString(pathPart: PathToken): string {\n if (typeof pathPart === \"string\") {\n return pathPart;\n }\n if (pathPart === PathTokens.each) {\n return \"*\";\n }\n if (pathPart === PathTokens.current) {\n return \"*\";\n }\n throw new Error(`Unknown path part specified: ${ensureAndGetString(pathPart)}`);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"ModelPath.js","names":["_IterableUtils","require","_TypingUtils","_EachCurrentCollision","_ModelPathBuilder","_PathMatcher","EachSymbol","Symbol","for","CurrentSymbol","PathTokens","isMultiToken","part","each","current","isSimpleToken","isInstanceToken","test","isInstanceTokenOrInstancesSpec","exports","isModelPath","path","ModelPathImpl","convertToLegacyPath","toLegacyPath","convertToAbsoluteModelPath","createAbsoluteFromMask","emptyModelPath","emptyAbsoluteModelPath","createModelPath","absolute","partPartStrings","split","ensurePlainPathPartsDoesNotContainMultiplicity","startsWith","slice","createFromMask","multiplicitySymbol","map","x","parts","some","Error","createAbsolute","createRelativeResolvedModelPath","createAbsoluteFromTokens","tokens","createAbsoluteResolvedFromTokens","createRelativeFromTokens","joinModelPaths","resultParts","joinItem","push","isAbsolute","getPathPartsAsArray","Array","isArray","isAllTokensResolved","every","constructor","pathParts","legacyPath","cachedHash","filter","resolved","getPathParts","getSimpleTokensStrict","token","getSimpleTokensAsArrayStrict","joinWith","isResolved","resolveAll","instance","isContainIteration","isContainCurrentIteration","isContainCurrentOrEachIteration","getLastListPath","lastIterationIndex","lastIndexOf","isEndsWithIteration","lastItem","IterUtils","last","isEndsWithCurrentIteration","toString","length","pathPartToString","join","_this$legacyPath","isEquals","modelPath","eachCurrentCollision","EachCurrentCollision","AreSame","Iterator","from","zip","t1","t2","getHash","undefined","hash","reverseArray","currentStr","AreDifferent","stringIndex","charCodeAt","isIncludes","targetTokens","i","leftPart","rightPart","isFinite","Number","getIterationRank","count","isEmpty","matchFor","PathMatcher","match","thisParts","otherParts","value","index","endsWith","reverse","splitByMultiplicity","lastSimpleParts","ModelPathBuilder","append","empty","toResolvedPath","normalize","resultTokens","pathPart","pop","toCurrentIteration","toEachIteration","toAbsolute","getAllParentPaths","result","skipLast","toPath","trimLastStarIfLastToken","getParentPath","applyInstancesDirty","instances","fillWithMultiplicityIfHasNoInstance","instanceCounter","_instances$instanceCo","instanceOrEach","reject","ensureAndGetString"],"sources":["../../../../Common/ModelPath/ModelPath.ts"],"sourcesContent":["import { BindingPath } from \"../../Engine/src/Engine/Core/CoreTypes\";\nimport { count, IterUtils, reverseArray } from \"../IterableUtils\";\nimport { ensureAndGetString, reject } from \"../TypingUtils\";\n\nimport { EachCurrentCollision } from \"./EachCurrentCollision\";\nimport { ModelPathBuilder } from \"./ModelPathBuilder\";\nimport { PathMatcher, PathMatching } from \"./PathMatcher\";\nimport { IEquatable } from \"./IEquatable\";\n\nconst EachSymbol = Symbol.for(\"__EACH__\");\nconst CurrentSymbol = Symbol.for(\"__CURRENT__\");\n\nexport class PathTokens {\n public static each: typeof EachSymbol = EachSymbol;\n public static current: typeof CurrentSymbol = CurrentSymbol;\n\n public static isMultiToken(part: undefined | PathToken): part is typeof EachSymbol | typeof CurrentSymbol {\n return part === PathTokens.each || part === PathTokens.current;\n }\n\n public static isSimpleToken(part: undefined | PathToken): part is string {\n return typeof part === \"string\";\n }\n\n public static isInstanceToken(part: undefined | PathToken): part is string {\n return typeof part === \"string\" && /^\\d+$/i.test(part);\n }\n\n public static isInstanceTokenOrInstancesSpec(part: undefined | PathToken): part is string {\n return typeof part === \"string\" && (/^\\d+$/i.test(part) || /^\\[(\\d+\\,?)+\\]$/i.test(part));\n }\n}\n\nexport type SimplePathToken = string;\n\nexport type PathToken = SimplePathToken | typeof EachSymbol | typeof CurrentSymbol;\n\nexport function isModelPath(path: BindingPath | ModelPath | unknown): path is ModelPath {\n return typeof path !== \"string\" && path instanceof ModelPathImpl;\n}\n\nexport function convertToLegacyPath(path: BindingPath | ModelPath): BindingPath {\n return isModelPath(path) ? path.toLegacyPath() : path;\n}\n\nexport function convertToAbsoluteModelPath<R extends boolean, A extends boolean>(\n path: BindingPath | IModelPath<R, A>\n): IModelPath<R, true>;\nexport function convertToAbsoluteModelPath(path: BindingPath | AbsoluteModelPath): AbsoluteModelPath {\n return isModelPath(path) ? path : createAbsoluteFromMask(path, PathTokens.each);\n}\n\nexport function emptyModelPath(): RelativeResolvedModelPath {\n return new ModelPathImpl<true, false>([], false);\n}\n\nexport function emptyAbsoluteModelPath(): AbsoluteResolvedModelPath {\n return new ModelPathImpl<true, true>([], true);\n}\n\nexport function createModelPath(path: string, absolute: true): AbsoluteResolvedModelPath;\nexport function createModelPath(path: string, absolute: false): RelativeResolvedModelPath;\nexport function createModelPath(path: string, absolute: \"auto\"): ResolvedModelPath;\nexport function createModelPath(path: string, absolute: boolean | \"auto\"): ResolvedModelPath {\n const partPartStrings = path.split(\"/\");\n ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);\n if (absolute === \"auto\") {\n if (path.startsWith(\"/\")) {\n return new ModelPathImpl<true, true>(partPartStrings.slice(1), true);\n } else {\n return new ModelPathImpl<true, false>(partPartStrings, false);\n }\n }\n if (absolute && path.startsWith(\"/\")) {\n return new ModelPathImpl<true, true>(partPartStrings.slice(1), true);\n }\n return new ModelPathImpl<true, boolean>(partPartStrings, absolute);\n}\n\nexport function createFromMask(path: string, absolute: true, multiplicitySymbol: PathToken): AbsoluteModelPath;\nexport function createFromMask(path: string, absolute: false, multiplicitySymbol: PathToken): ResolvedModelPath;\nexport function createFromMask(path: string, absolute: \"auto\", multiplicitySymbol: PathToken): ModelPath;\nexport function createFromMask(path: string, absolute: boolean | \"auto\", multiplicitySymbol: PathToken): ModelPath {\n const partPartStrings = path.split(\"/\").map(x => (x === \"*\" ? multiplicitySymbol : x));\n if (absolute === \"auto\") {\n if (path.startsWith(\"/\")) {\n return new ModelPathImpl(partPartStrings.slice(1), true);\n } else {\n return new ModelPathImpl(partPartStrings, false);\n }\n }\n if (absolute && path.startsWith(\"/\")) {\n return new ModelPathImpl(partPartStrings.slice(1), true);\n }\n return new ModelPathImpl(partPartStrings, absolute);\n}\n\nexport function createAbsoluteFromMask(path: string, multiplicitySymbol: PathToken): AbsoluteModelPath {\n const partPartStrings = path.split(\"/\").map(x => (x === \"*\" ? multiplicitySymbol : x));\n if (path.startsWith(\"/\")) {\n return new ModelPathImpl(partPartStrings.slice(1), true);\n }\n return new ModelPathImpl(partPartStrings, true);\n}\n\nfunction ensurePlainPathPartsDoesNotContainMultiplicity(parts: readonly string[]): void {\n if (parts.some(x => x === \"*\")) {\n throw new Error(\"Path must not contain * symbol\");\n }\n}\n\nexport function createAbsolute(path: string): AbsoluteResolvedModelPath {\n const partPartStrings = path.split(\"/\");\n ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);\n if (path.startsWith(\"/\")) {\n return new ModelPathImpl<true, true>(partPartStrings.slice(1), true);\n }\n return new ModelPathImpl<true, true>(partPartStrings, true);\n}\n\nexport function createRelativeResolvedModelPath(path: string): RelativeResolvedModelPath {\n const partPartStrings = path.split(\"/\");\n ensurePlainPathPartsDoesNotContainMultiplicity(partPartStrings);\n return new ModelPathImpl<true, false>(partPartStrings, false);\n}\n\nexport function createAbsoluteFromTokens(tokens: PathToken[]): AbsoluteModelPath {\n return new ModelPathImpl<false, true>(tokens, true);\n}\n\nexport function createAbsoluteResolvedFromTokens(tokens: readonly string[]): AbsoluteResolvedModelPath {\n ensurePlainPathPartsDoesNotContainMultiplicity(tokens);\n return new ModelPathImpl<true, true>(tokens, true);\n}\n\nexport function createRelativeFromTokens(tokens: readonly string[]): RelativeResolvedModelPath;\nexport function createRelativeFromTokens(tokens: readonly PathToken[]): RelativeModelPath;\nexport function createRelativeFromTokens(tokens: readonly PathToken[]): RelativeModelPath {\n return new ModelPathImpl<false, false>(tokens, false);\n}\n\nexport function joinModelPaths(...parts: Array<ModelPath | PathToken | PathToken[]>): ModelPath {\n let absolute = false;\n let resultParts: PathToken[] = [];\n for (const joinItem of parts) {\n if (typeof joinItem === \"string\") {\n resultParts.push(joinItem);\n } else if (isModelPath(joinItem)) {\n if (joinItem.isAbsolute()) {\n absolute = true;\n resultParts = [...joinItem.getPathPartsAsArray()];\n } else {\n resultParts.push(...joinItem.getPathPartsAsArray());\n }\n } else if (Array.isArray(joinItem)) {\n resultParts.push(...joinItem);\n } else if (PathTokens.isMultiToken(joinItem)) {\n resultParts.push(joinItem);\n }\n }\n\n return new ModelPathImpl(resultParts, absolute);\n}\n\nexport interface IModelPath<TResolved extends boolean, TAbsolute extends boolean>\n extends IEquatable<IModelPath<boolean, boolean>> {\n readonly resolved: TResolved;\n readonly absolute: TAbsolute;\n\n isEquals(modelPath: ModelPath, eachCurrentCollision?: EachCurrentCollision): boolean;\n getHash(eachCurrentCollision?: EachCurrentCollision): number;\n\n isResolved(): this is IModelPath<true, TAbsolute>;\n isAbsolute(): this is IModelPath<TResolved, true>;\n toAbsolute(): IModelPath<TResolved, true>;\n\n joinWith(...path: string[]): IModelPath<TResolved, TAbsolute>;\n joinWith(...path: PathToken[]): IModelPath<boolean, TAbsolute>;\n joinWith(...path: Array<ResolvedModelPath | string>): IModelPath<TResolved, TAbsolute>;\n joinWith(...path: Array<AbsoluteResolvedModelPath | string>): IModelPath<TResolved, true>;\n joinWith(...path: Array<ModelPath | PathToken>): IModelPath<boolean, TAbsolute>;\n\n getPathParts(): Iterable<PathTokenSpec<TResolved>>;\n getPathPartsAsArray(): ReadonlyArray<PathTokenSpec<TResolved>>;\n getSimpleTokensStrict(): Iterable<SimplePathToken>;\n getSimpleTokensAsArrayStrict(): readonly SimplePathToken[];\n\n resolveAll(instance: string): ModelPath;\n isContainIteration(): boolean;\n isContainCurrentIteration(): boolean;\n isContainCurrentOrEachIteration(): boolean;\n getLastListPath(): PathToken[];\n isEndsWithIteration(): boolean;\n isEndsWithCurrentIteration(): boolean;\n isIncludes(modelPath: ModelPath): boolean;\n getIterationRank(eachCurrentCollision?: EachCurrentCollision): number;\n isEmpty(): boolean;\n matchFor(modelPath: ModelPath): PathMatching;\n startsWith(modelPath: ModelPath): boolean;\n endsWith(modelPath: ModelPath): boolean;\n splitByMultiplicity(): Iterable<ResolvedModelPath | typeof EachSymbol | typeof CurrentSymbol>;\n normalize(): IModelPath<TResolved, TAbsolute>;\n toCurrentIteration(): IModelPath<TResolved, TAbsolute>;\n toEachIteration(): IModelPath<TResolved, TAbsolute>;\n getAllParentPaths(): Iterable<ModelPath>;\n trimLastStarIfLastToken(): IModelPath<TResolved, TAbsolute>;\n getParentPath(): IModelPath<TResolved, TAbsolute>;\n applyInstancesDirty(\n instances: SimplePathToken[],\n fillWithMultiplicityIfHasNoInstance?: boolean\n ): IModelPath<TResolved, TAbsolute>;\n\n toString(): string;\n toLegacyPath(): string;\n}\n\nexport type ModelPath = IModelPath<boolean, boolean>;\nexport type ResolvedModelPath = IModelPath<true, boolean>;\nexport type AbsoluteModelPath = IModelPath<boolean, true>;\nexport type AbsoluteResolvedModelPath = IModelPath<true, true>;\n\nexport type RelativeModelPath = IModelPath<boolean, false>;\nexport type RelativeResolvedModelPath = IModelPath<true, false>;\n\ntype PathTokenSpec<TResolved extends boolean> = TResolved extends true ? string : PathToken;\n\ntype PathTokensSpec<TResolved extends boolean> = Array<PathTokenSpec<TResolved>>;\n\ntype ReadonlyPathTokensSpec<TResolved extends boolean> = ReadonlyArray<PathTokenSpec<TResolved>>;\n\nfunction isAllTokensResolved<TResolved extends boolean>(tokens: ReadonlyPathTokensSpec<TResolved>): TResolved {\n // Я что-то немогу сообразить как тут всё строго написать...\n // @ts-expect-error\n return tokens.every(PathTokens.isSimpleToken);\n}\n\nexport class ModelPathImpl<TResolved extends boolean, TAbsolute extends boolean>\n implements IEquatable<ModelPath>, IModelPath<TResolved, TAbsolute>\n{\n private readonly tokens: ReadonlyPathTokensSpec<TResolved>;\n public readonly absolute: TAbsolute;\n private legacyPath: undefined | string;\n private cachedHash: number | undefined;\n\n public constructor(pathParts: ReadonlyPathTokensSpec<TResolved>, absolute: TAbsolute) {\n this.tokens = pathParts.filter(x => x !== \"\");\n this.absolute = absolute;\n }\n\n public get resolved(): TResolved {\n return isAllTokensResolved(this.tokens);\n }\n\n public getPathParts(): Iterable<PathTokenSpec<TResolved>> {\n return this.tokens;\n }\n\n public getPathPartsAsArray(): ReadonlyArray<PathTokenSpec<TResolved>> {\n return this.tokens;\n }\n\n public *getSimpleTokensStrict(): Iterable<SimplePathToken> {\n for (const token of this.tokens) {\n if (!PathTokens.isSimpleToken(token)) {\n throw new Error(\"Path must not contain spec tokens\");\n }\n yield token;\n }\n }\n\n public getSimpleTokensAsArrayStrict(): readonly SimplePathToken[] {\n for (const token of this.tokens) {\n if (!PathTokens.isSimpleToken(token)) {\n throw new Error(\"Path must not contain spec tokens\");\n }\n }\n // Проверка выше гараентирует что будут только SimplePathToken.\n // Все map и filter убраны для производительности\n // @ts-ignore\n return this.tokens;\n }\n\n public joinWith(...path: string[]): IModelPath<TResolved, TAbsolute>;\n public joinWith(...path: PathToken[]): IModelPath<boolean, TAbsolute>;\n public joinWith(...path: Array<ResolvedModelPath | string>): IModelPath<TResolved, TAbsolute>;\n public joinWith(...path: Array<AbsoluteResolvedModelPath | string>): IModelPath<TResolved, true>;\n public joinWith(...path: Array<ModelPath | PathToken>): IModelPath<boolean, TAbsolute>;\n public joinWith(...path: Array<ModelPath | PathToken>): IModelPath<boolean, boolean> {\n return joinModelPaths(this, ...path);\n }\n\n public isResolved(): this is IModelPath<true, TAbsolute> {\n return isAllTokensResolved(this.tokens);\n }\n\n public resolveAll(instance: string): ModelPath {\n const tokens = this.tokens.map(token => {\n if (PathTokens.isSimpleToken(token)) {\n return token;\n } else {\n return instance;\n }\n });\n\n return new ModelPathImpl(tokens, this.absolute);\n }\n\n public isContainIteration(): boolean {\n return this.tokens.some(x => x === PathTokens.each);\n }\n\n public isContainCurrentIteration(): boolean {\n return this.tokens.some(x => x === PathTokens.current);\n }\n\n public isContainCurrentOrEachIteration(): boolean {\n return this.tokens.some(x => x === PathTokens.current || x === PathTokens.each);\n }\n\n public getLastListPath(): PathToken[] {\n if (!this.isContainIteration()) {\n throw new Error(\"Path must contain iteration\");\n }\n\n // Проверка выше гарантирует, что будет PathTokens.each\n // @ts-ignore\n const lastIterationIndex = this.tokens.lastIndexOf(PathTokens.each);\n return this.tokens.slice(0, lastIterationIndex);\n }\n\n public isEndsWithIteration(): boolean {\n const lastItem = IterUtils.last(this.tokens);\n return lastItem == PathTokens.each;\n }\n\n public isEndsWithCurrentIteration(): boolean {\n const lastItem = IterUtils.last(this.tokens);\n return lastItem == PathTokens.current;\n }\n\n public isAbsolute(): this is IModelPath<TResolved, true> {\n return this.absolute;\n }\n\n public toString(): string {\n if (this.tokens.length === 0) {\n return \"\";\n }\n return (this.absolute ? \"/\" : \"\") + this.tokens.map(x => this.pathPartToString(x)).join(\"/\");\n }\n\n public toLegacyPath(): string {\n return this.legacyPath ?? (this.legacyPath = this.tokens.map(x => this.pathPartToString(x)).join(\"/\"));\n }\n\n public isEquals(\n modelPath: ModelPath,\n eachCurrentCollision: EachCurrentCollision = EachCurrentCollision.AreSame\n ): boolean {\n if (eachCurrentCollision === EachCurrentCollision.AreSame) {\n return this.toLegacyPath() === modelPath.toLegacyPath();\n } else {\n return (\n this.isAbsolute() === modelPath.isAbsolute() &&\n Iterator.from(IterUtils.zip(this.getPathParts(), modelPath.getPathParts())).every(\n ([t1, t2]) => t1 === t2\n )\n );\n }\n }\n\n /**\n * Всегда целое положительное беззнаковое 32-битное число\n */\n public getHash(eachCurrentCollision: EachCurrentCollision = EachCurrentCollision.AreSame): number {\n if (this.cachedHash == undefined) {\n let hash = 5381;\n for (const token of reverseArray(this.tokens)) {\n let currentStr: string;\n if (PathTokens.isSimpleToken(token)) {\n currentStr = token;\n } else {\n if (eachCurrentCollision === EachCurrentCollision.AreDifferent) {\n currentStr = token === PathTokens.each ? \"*\" : \"!\";\n } else {\n currentStr = \"*\";\n }\n }\n let stringIndex = currentStr.length;\n while (stringIndex) {\n // tslint:disable-next-line:no-bitwise\n hash = (hash * 33) ^ currentStr.charCodeAt(--stringIndex);\n }\n }\n\n /*\n tslint:disable-next-line:no-bitwise\n JavaScript does bitwise operations (like XOR, above) on 32-bit signed\n integers. Since we want the results to be always positive, convert the\n signed int to an unsigned by doing an unsigned bitshift.\n */\n this.cachedHash = hash >>> 0;\n }\n return this.cachedHash;\n }\n\n public isIncludes(modelPath: ModelPath): boolean {\n const targetTokens = modelPath.getPathPartsAsArray();\n if (this.tokens.length !== targetTokens.length) {\n return false;\n }\n for (let i = 0; i < this.tokens.length; i++) {\n const leftPart = this.tokens[i];\n const rightPart = targetTokens[i];\n if (typeof leftPart === \"string\") {\n if (typeof rightPart === \"string\") {\n if (leftPart !== rightPart) {\n return false;\n }\n continue;\n } else {\n return false;\n }\n } else if (leftPart === PathTokens.current || leftPart === PathTokens.each) {\n if (typeof rightPart === \"string\") {\n if (!isFinite(Number(rightPart))) {\n return false;\n }\n continue;\n } else {\n if (rightPart !== PathTokens.current && rightPart !== PathTokens.each) {\n return false;\n }\n continue;\n }\n }\n }\n return true;\n }\n\n public getIterationRank(eachCurrentCollision: EachCurrentCollision = EachCurrentCollision.AreDifferent): number {\n return count(\n Iterator.from(this.tokens).filter(x =>\n eachCurrentCollision == EachCurrentCollision.AreDifferent\n ? x === PathTokens.each\n : PathTokens.isMultiToken(x)\n )\n );\n }\n\n public isEmpty(): boolean {\n return this.tokens.length === 0;\n }\n\n public matchFor(modelPath: ModelPath): PathMatching {\n if (!this.isAbsolute()) {\n throw new Error(`Cannot match non absolute path '${this.toString()}'`);\n }\n if (!modelPath.isAbsolute()) {\n throw new Error(`Cannot match non absolute path '${modelPath.toString()}'`);\n }\n return PathMatcher.match(this.tokens, modelPath.getPathPartsAsArray());\n }\n\n public startsWith(modelPath: ModelPath): boolean {\n const thisParts = this.getPathPartsAsArray();\n const otherParts = modelPath.getPathPartsAsArray();\n return otherParts.every((value, index) => value === thisParts[index]);\n }\n\n public endsWith(modelPath: ModelPath): boolean {\n const thisParts = this.getPathPartsAsArray().slice().reverse();\n const otherParts = modelPath.getPathPartsAsArray().slice().reverse();\n return otherParts.every((value, index) => value === thisParts[index]);\n }\n\n public *splitByMultiplicity(): Iterable<ResolvedModelPath | typeof EachSymbol | typeof CurrentSymbol> {\n let lastSimpleParts = new ModelPathBuilder(this.isAbsolute());\n for (const token of this.tokens) {\n if (PathTokens.isSimpleToken(token)) {\n lastSimpleParts.append(token);\n } else {\n if (!lastSimpleParts.empty) {\n yield lastSimpleParts.toResolvedPath();\n lastSimpleParts = new ModelPathBuilder(false);\n }\n yield token;\n }\n }\n if (!lastSimpleParts.empty) {\n yield lastSimpleParts.toResolvedPath();\n }\n }\n\n public normalize(): IModelPath<TResolved, TAbsolute> {\n const resultTokens: PathTokensSpec<TResolved> = [];\n for (const pathPart of this.tokens) {\n if (pathPart === \"..\") {\n if (!resultTokens.pop()) {\n if (this.isAbsolute()) {\n throw new Error(`Path is invalid '${this.toString()}'`);\n } else {\n resultTokens.push(\"..\");\n }\n }\n continue;\n }\n\n if (pathPart === \".\") {\n continue;\n }\n resultTokens.push(pathPart);\n }\n return new ModelPathImpl<TResolved, TAbsolute>(resultTokens, this.absolute);\n }\n\n /**\n * @summary Спецификаторы множественности Each заменяет на Current\n */\n public toCurrentIteration(): IModelPath<TResolved, TAbsolute> {\n if (this.isResolved()) {\n return this;\n } else {\n // NOTE Тут не получается наложить дискриминатор\n // @ts-expect-error\n const pathParts: PathTokensSpec<TResolved> = this.tokens.map(x =>\n x === PathTokens.each ? PathTokens.current : x\n );\n return new ModelPathImpl<TResolved, TAbsolute>(pathParts, this.absolute);\n }\n }\n\n public toEachIteration(): IModelPath<TResolved, TAbsolute> {\n if (this.isResolved()) {\n return this;\n } else {\n // NOTE Тут не получается наложить дискриминатор\n // @ts-expect-error\n const pathParts: PathTokensSpec<TResolved> = this.tokens.map(x =>\n x === PathTokens.current ? PathTokens.each : x\n );\n return new ModelPathImpl<TResolved, TAbsolute>(pathParts, this.absolute);\n }\n }\n\n public toAbsolute(): IModelPath<TResolved, true> {\n if (!this.absolute) {\n throw new Error(`Path '${this.toLegacyPath()} is not absolute'`);\n }\n return new ModelPathImpl<TResolved, true>(this.tokens, true);\n }\n\n public *getAllParentPaths(): Iterable<ModelPath> {\n const result = new ModelPathBuilder(this.isAbsolute());\n for (const token of IterUtils.skipLast(this.getPathParts(), 1)) {\n result.append(token);\n yield result.toPath();\n }\n }\n\n public trimLastStarIfLastToken(): IModelPath<TResolved, TAbsolute> {\n const lastItem = IterUtils.last(this.tokens);\n if (lastItem != undefined && PathTokens.isMultiToken(lastItem)) {\n return new ModelPathImpl(this.tokens.slice(0, -1), this.absolute);\n }\n return this;\n }\n\n public getParentPath(): IModelPath<TResolved, TAbsolute> {\n const result = new ModelPathBuilder(this.absolute);\n for (const token of IterUtils.skipLast(this.getPathParts(), 1)) {\n result.append(token);\n }\n // Тут получается так, что по другому никак\n // @ts-expect-error\n return result.toPath();\n }\n\n public applyInstancesDirty(\n instances: SimplePathToken[],\n fillWithMultiplicityIfHasNoInstance?: boolean\n ): IModelPath<TResolved, TAbsolute> {\n if (this.isResolved() || instances.length === 0) {\n return this;\n }\n let instanceCounter = 0;\n const result = new ModelPathBuilder(true);\n for (const token of this.getPathParts()) {\n if (PathTokens.isMultiToken(token) && instanceCounter < instances.length) {\n const instanceOrEach =\n instances[instanceCounter] ??\n (fillWithMultiplicityIfHasNoInstance == true ? PathTokens.each : reject());\n result.append(instanceOrEach);\n instanceCounter++;\n } else {\n result.append(token);\n }\n }\n // Тут получается так, что по другому никак\n // @ts-expect-error\n return result.toPath();\n }\n\n private pathPartToString(pathPart: PathToken): string {\n if (typeof pathPart === \"string\") {\n return pathPart;\n }\n if (pathPart === PathTokens.each) {\n return \"*\";\n }\n if (pathPart === PathTokens.current) {\n return \"*\";\n }\n throw new Error(`Unknown path part specified: ${ensureAndGetString(pathPart)}`);\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.EngineVersionUtils = void 0;
7
7
  class EngineVersionUtils {
8
8
  static extractVersionFromEngineFileName(engineFileName) {
9
- const regex = /^candy_v(\d+)_(\d+)_(\d+)(?:_([\w\d_]+?)_([^_\.]+))?(?:\.(?:[\d\w-]+))?(?:\.test)?(?:\.min)?(?:(?:\.js)|(?:\.css))(?:\.map)?$/;
9
+ const regex = /candy_v(\d+)_(\d+)_(\d+)(?:_([\w\d_]+?)_([^_\.]+))?(?:\.(?:[\d\w-]+))?(?:\.test)?(?:\.min)?(?:(?:\.js)|(?:\.css))(?:\.map)?$/;
10
10
  const match = regex.exec(engineFileName);
11
11
  if (match == undefined) {
12
12
  throw new Error(`Cannot extract engine version from '${engineFileName}'`);
@@ -27,4 +27,4 @@ class EngineVersionUtils {
27
27
  }
28
28
  }
29
29
  exports.EngineVersionUtils = EngineVersionUtils;
30
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFbmdpbmVWZXJzaW9uVXRpbHMiLCJleHRyYWN0VmVyc2lvbkZyb21FbmdpbmVGaWxlTmFtZSIsImVuZ2luZUZpbGVOYW1lIiwicmVnZXgiLCJtYXRjaCIsImV4ZWMiLCJ1bmRlZmluZWQiLCJFcnJvciIsIm1ham9yIiwibWlub3IiLCJwYXRjaCIsInByZUlkIiwicHJlcmVsZWFzZU51bWJlciIsInJlc3VsdCIsInJlcGxhY2UiLCJlbmdpbmVWZXJzaW9uVG9OYW1lIiwiZW5naW5lVmVyc2lvbiIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvQnVpbGRUYXNrcy9FbmdpbmVWZXJzaW9uVXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIEVuZ2luZVZlcnNpb25VdGlscyB7XG4gICAgcHVibGljIHN0YXRpYyBleHRyYWN0VmVyc2lvbkZyb21FbmdpbmVGaWxlTmFtZShlbmdpbmVGaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcmVnZXggPVxuICAgICAgICAgICAgL15jYW5keV92KFxcZCspXyhcXGQrKV8oXFxkKykoPzpfKFtcXHdcXGRfXSs/KV8oW15fXFwuXSspKT8oPzpcXC4oPzpbXFxkXFx3LV0rKSk/KD86XFwudGVzdCk/KD86XFwubWluKT8oPzooPzpcXC5qcyl8KD86XFwuY3NzKSkoPzpcXC5tYXApPyQvO1xuICAgICAgICBjb25zdCBtYXRjaCA9IHJlZ2V4LmV4ZWMoZW5naW5lRmlsZU5hbWUpO1xuICAgICAgICBpZiAobWF0Y2ggPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBleHRyYWN0IGVuZ2luZSB2ZXJzaW9uIGZyb20gJyR7ZW5naW5lRmlsZU5hbWV9J2ApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1ham9yID0gbWF0Y2hbMV07XG4gICAgICAgIGNvbnN0IG1pbm9yID0gbWF0Y2hbMl07XG4gICAgICAgIGNvbnN0IHBhdGNoID0gbWF0Y2hbM107XG4gICAgICAgIGNvbnN0IHByZUlkID0gbWF0Y2hbNF07XG4gICAgICAgIGNvbnN0IHByZXJlbGVhc2VOdW1iZXIgPSBtYXRjaFs1XTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGAke21ham9yfS4ke21pbm9yfS4ke3BhdGNofWA7XG4gICAgICAgIGlmIChwcmVJZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBgLSR7cHJlSWQucmVwbGFjZSgvXy9nLCBcIi1cIil9LiR7cHJlcmVsZWFzZU51bWJlcn1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBlbmdpbmVWZXJzaW9uVG9OYW1lKGVuZ2luZVZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgdiR7ZW5naW5lVmVyc2lvbi5yZXBsYWNlKC9bXFwuXFwtXS9naSwgXCJfXCIpfWA7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBTyxNQUFNQSxrQkFBa0IsQ0FBQztFQUM1QixPQUFjQyxnQ0FBZ0NBLENBQUNDLGNBQXNCLEVBQVU7SUFDM0UsTUFBTUMsS0FBSyxHQUNQLCtIQUErSDtJQUNuSSxNQUFNQyxLQUFLLEdBQUdELEtBQUssQ0FBQ0UsSUFBSSxDQUFDSCxjQUFjLENBQUM7SUFDeEMsSUFBSUUsS0FBSyxJQUFJRSxTQUFTLEVBQUU7TUFDcEIsTUFBTSxJQUFJQyxLQUFLLENBQUMsdUNBQXVDTCxjQUFjLEdBQUcsQ0FBQztJQUM3RTtJQUNBLE1BQU1NLEtBQUssR0FBR0osS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN0QixNQUFNSyxLQUFLLEdBQUdMLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDdEIsTUFBTU0sS0FBSyxHQUFHTixLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLE1BQU1PLEtBQUssR0FBR1AsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN0QixNQUFNUSxnQkFBZ0IsR0FBR1IsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNqQyxJQUFJUyxNQUFNLEdBQUcsR0FBR0wsS0FBSyxJQUFJQyxLQUFLLElBQUlDLEtBQUssRUFBRTtJQUN6QyxJQUFJQyxLQUFLLElBQUlMLFNBQVMsRUFBRTtNQUNwQk8sTUFBTSxJQUFJLElBQUlGLEtBQUssQ0FBQ0csT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSUYsZ0JBQWdCLEVBQUU7SUFDaEU7SUFDQSxPQUFPQyxNQUFNO0VBQ2pCO0VBRUEsT0FBY0UsbUJBQW1CQSxDQUFDQyxhQUFxQixFQUFVO0lBQzdELE9BQU8sSUFBSUEsYUFBYSxDQUFDRixPQUFPLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxFQUFFO0VBQ3ZEO0FBQ0o7QUFBQ0csT0FBQSxDQUFBakIsa0JBQUEsR0FBQUEsa0JBQUEiLCJpZ25vcmVMaXN0IjpbXX0=
30
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJFbmdpbmVWZXJzaW9uVXRpbHMiLCJleHRyYWN0VmVyc2lvbkZyb21FbmdpbmVGaWxlTmFtZSIsImVuZ2luZUZpbGVOYW1lIiwicmVnZXgiLCJtYXRjaCIsImV4ZWMiLCJ1bmRlZmluZWQiLCJFcnJvciIsIm1ham9yIiwibWlub3IiLCJwYXRjaCIsInByZUlkIiwicHJlcmVsZWFzZU51bWJlciIsInJlc3VsdCIsInJlcGxhY2UiLCJlbmdpbmVWZXJzaW9uVG9OYW1lIiwiZW5naW5lVmVyc2lvbiIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvQnVpbGRUYXNrcy9FbmdpbmVWZXJzaW9uVXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIEVuZ2luZVZlcnNpb25VdGlscyB7XG4gICAgcHVibGljIHN0YXRpYyBleHRyYWN0VmVyc2lvbkZyb21FbmdpbmVGaWxlTmFtZShlbmdpbmVGaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcmVnZXggPVxuICAgICAgICAgICAgL2NhbmR5X3YoXFxkKylfKFxcZCspXyhcXGQrKSg/Ol8oW1xcd1xcZF9dKz8pXyhbXl9cXC5dKykpPyg/OlxcLig/OltcXGRcXHctXSspKT8oPzpcXC50ZXN0KT8oPzpcXC5taW4pPyg/Oig/OlxcLmpzKXwoPzpcXC5jc3MpKSg/OlxcLm1hcCk/JC87XG4gICAgICAgIGNvbnN0IG1hdGNoID0gcmVnZXguZXhlYyhlbmdpbmVGaWxlTmFtZSk7XG4gICAgICAgIGlmIChtYXRjaCA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGV4dHJhY3QgZW5naW5lIHZlcnNpb24gZnJvbSAnJHtlbmdpbmVGaWxlTmFtZX0nYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWFqb3IgPSBtYXRjaFsxXTtcbiAgICAgICAgY29uc3QgbWlub3IgPSBtYXRjaFsyXTtcbiAgICAgICAgY29uc3QgcGF0Y2ggPSBtYXRjaFszXTtcbiAgICAgICAgY29uc3QgcHJlSWQgPSBtYXRjaFs0XTtcbiAgICAgICAgY29uc3QgcHJlcmVsZWFzZU51bWJlciA9IG1hdGNoWzVdO1xuICAgICAgICBsZXQgcmVzdWx0ID0gYCR7bWFqb3J9LiR7bWlub3J9LiR7cGF0Y2h9YDtcbiAgICAgICAgaWYgKHByZUlkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0ICs9IGAtJHtwcmVJZC5yZXBsYWNlKC9fL2csIFwiLVwiKX0uJHtwcmVyZWxlYXNlTnVtYmVyfWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGVuZ2luZVZlcnNpb25Ub05hbWUoZW5naW5lVmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGB2JHtlbmdpbmVWZXJzaW9uLnJlcGxhY2UoL1tcXC5cXC1dL2dpLCBcIl9cIil9YDtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFPLE1BQU1BLGtCQUFrQixDQUFDO0VBQzVCLE9BQWNDLGdDQUFnQ0EsQ0FBQ0MsY0FBc0IsRUFBVTtJQUMzRSxNQUFNQyxLQUFLLEdBQ1AsOEhBQThIO0lBQ2xJLE1BQU1DLEtBQUssR0FBR0QsS0FBSyxDQUFDRSxJQUFJLENBQUNILGNBQWMsQ0FBQztJQUN4QyxJQUFJRSxLQUFLLElBQUlFLFNBQVMsRUFBRTtNQUNwQixNQUFNLElBQUlDLEtBQUssQ0FBQyx1Q0FBdUNMLGNBQWMsR0FBRyxDQUFDO0lBQzdFO0lBQ0EsTUFBTU0sS0FBSyxHQUFHSixLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLE1BQU1LLEtBQUssR0FBR0wsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN0QixNQUFNTSxLQUFLLEdBQUdOLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDdEIsTUFBTU8sS0FBSyxHQUFHUCxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLE1BQU1RLGdCQUFnQixHQUFHUixLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLElBQUlTLE1BQU0sR0FBRyxHQUFHTCxLQUFLLElBQUlDLEtBQUssSUFBSUMsS0FBSyxFQUFFO0lBQ3pDLElBQUlDLEtBQUssSUFBSUwsU0FBUyxFQUFFO01BQ3BCTyxNQUFNLElBQUksSUFBSUYsS0FBSyxDQUFDRyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJRixnQkFBZ0IsRUFBRTtJQUNoRTtJQUNBLE9BQU9DLE1BQU07RUFDakI7RUFFQSxPQUFjRSxtQkFBbUJBLENBQUNDLGFBQXFCLEVBQVU7SUFDN0QsT0FBTyxJQUFJQSxhQUFhLENBQUNGLE9BQU8sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLEVBQUU7RUFDdkQ7QUFDSjtBQUFDRyxPQUFBLENBQUFqQixrQkFBQSxHQUFBQSxrQkFBQSIsImlnbm9yZUxpc3QiOltdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"EngineVersionUtils.js","names":["EngineVersionUtils","extractVersionFromEngineFileName","engineFileName","regex","match","exec","undefined","Error","major","minor","patch","preId","prereleaseNumber","result","replace","engineVersionToName","engineVersion","exports"],"sources":["../../../../src/BuildTasks/EngineVersionUtils.ts"],"sourcesContent":["export class EngineVersionUtils {\n public static extractVersionFromEngineFileName(engineFileName: string): string {\n const regex =\n /^candy_v(\\d+)_(\\d+)_(\\d+)(?:_([\\w\\d_]+?)_([^_\\.]+))?(?:\\.(?:[\\d\\w-]+))?(?:\\.test)?(?:\\.min)?(?:(?:\\.js)|(?:\\.css))(?:\\.map)?$/;\n const match = regex.exec(engineFileName);\n if (match == undefined) {\n throw new Error(`Cannot extract engine version from '${engineFileName}'`);\n }\n const major = match[1];\n const minor = match[2];\n const patch = match[3];\n const preId = match[4];\n const prereleaseNumber = match[5];\n let result = `${major}.${minor}.${patch}`;\n if (preId != undefined) {\n result += `-${preId.replace(/_/g, \"-\")}.${prereleaseNumber}`;\n }\n return result;\n }\n\n public static engineVersionToName(engineVersion: string): string {\n return `v${engineVersion.replace(/[\\.\\-]/gi, \"_\")}`;\n }\n}\n"],"mappings":";;;;;;AAAO,MAAMA,kBAAkB,CAAC;EAC5B,OAAcC,gCAAgCA,CAACC,cAAsB,EAAU;IAC3E,MAAMC,KAAK,GACP,+HAA+H;IACnI,MAAMC,KAAK,GAAGD,KAAK,CAACE,IAAI,CAACH,cAAc,CAAC;IACxC,IAAIE,KAAK,IAAIE,SAAS,EAAE;MACpB,MAAM,IAAIC,KAAK,CAAC,uCAAuCL,cAAc,GAAG,CAAC;IAC7E;IACA,MAAMM,KAAK,GAAGJ,KAAK,CAAC,CAAC,CAAC;IACtB,MAAMK,KAAK,GAAGL,KAAK,CAAC,CAAC,CAAC;IACtB,MAAMM,KAAK,GAAGN,KAAK,CAAC,CAAC,CAAC;IACtB,MAAMO,KAAK,GAAGP,KAAK,CAAC,CAAC,CAAC;IACtB,MAAMQ,gBAAgB,GAAGR,KAAK,CAAC,CAAC,CAAC;IACjC,IAAIS,MAAM,GAAG,GAAGL,KAAK,IAAIC,KAAK,IAAIC,KAAK,EAAE;IACzC,IAAIC,KAAK,IAAIL,SAAS,EAAE;MACpBO,MAAM,IAAI,IAAIF,KAAK,CAACG,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,IAAIF,gBAAgB,EAAE;IAChE;IACA,OAAOC,MAAM;EACjB;EAEA,OAAcE,mBAAmBA,CAACC,aAAqB,EAAU;IAC7D,OAAO,IAAIA,aAAa,CAACF,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE;EACvD;AACJ;AAACG,OAAA,CAAAjB,kBAAA,GAAAA,kBAAA","ignoreList":[]}
1
+ {"version":3,"file":"EngineVersionUtils.js","names":["EngineVersionUtils","extractVersionFromEngineFileName","engineFileName","regex","match","exec","undefined","Error","major","minor","patch","preId","prereleaseNumber","result","replace","engineVersionToName","engineVersion","exports"],"sources":["../../../../src/BuildTasks/EngineVersionUtils.ts"],"sourcesContent":["export class EngineVersionUtils {\n public static extractVersionFromEngineFileName(engineFileName: string): string {\n const regex =\n /candy_v(\\d+)_(\\d+)_(\\d+)(?:_([\\w\\d_]+?)_([^_\\.]+))?(?:\\.(?:[\\d\\w-]+))?(?:\\.test)?(?:\\.min)?(?:(?:\\.js)|(?:\\.css))(?:\\.map)?$/;\n const match = regex.exec(engineFileName);\n if (match == undefined) {\n throw new Error(`Cannot extract engine version from '${engineFileName}'`);\n }\n const major = match[1];\n const minor = match[2];\n const patch = match[3];\n const preId = match[4];\n const prereleaseNumber = match[5];\n let result = `${major}.${minor}.${patch}`;\n if (preId != undefined) {\n result += `-${preId.replace(/_/g, \"-\")}.${prereleaseNumber}`;\n }\n return result;\n }\n\n public static engineVersionToName(engineVersion: string): string {\n return `v${engineVersion.replace(/[\\.\\-]/gi, \"_\")}`;\n }\n}\n"],"mappings":";;;;;;AAAO,MAAMA,kBAAkB,CAAC;EAC5B,OAAcC,gCAAgCA,CAACC,cAAsB,EAAU;IAC3E,MAAMC,KAAK,GACP,8HAA8H;IAClI,MAAMC,KAAK,GAAGD,KAAK,CAACE,IAAI,CAACH,cAAc,CAAC;IACxC,IAAIE,KAAK,IAAIE,SAAS,EAAE;MACpB,MAAM,IAAIC,KAAK,CAAC,uCAAuCL,cAAc,GAAG,CAAC;IAC7E;IACA,MAAMM,KAAK,GAAGJ,KAAK,CAAC,CAAC,CAAC;IACtB,MAAMK,KAAK,GAAGL,KAAK,CAAC,CAAC,CAAC;IACtB,MAAMM,KAAK,GAAGN,KAAK,CAAC,CAAC,CAAC;IACtB,MAAMO,KAAK,GAAGP,KAAK,CAAC,CAAC,CAAC;IACtB,MAAMQ,gBAAgB,GAAGR,KAAK,CAAC,CAAC,CAAC;IACjC,IAAIS,MAAM,GAAG,GAAGL,KAAK,IAAIC,KAAK,IAAIC,KAAK,EAAE;IACzC,IAAIC,KAAK,IAAIL,SAAS,EAAE;MACpBO,MAAM,IAAI,IAAIF,KAAK,CAACG,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,IAAIF,gBAAgB,EAAE;IAChE;IACA,OAAOC,MAAM;EACjB;EAEA,OAAcE,mBAAmBA,CAACC,aAAqB,EAAU;IAC7D,OAAO,IAAIA,aAAa,CAACF,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE;EACvD;AACJ;AAACG,OAAA,CAAAjB,kBAAA,GAAAA,kBAAA","ignoreList":[]}