velocious 1.0.576 → 1.0.577

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +46 -1
  2. package/build/background-jobs/main.js +13 -2
  3. package/build/background-jobs/scheduler.js +11 -7
  4. package/build/background-jobs/store.js +18 -13
  5. package/build/environment-handlers/node/cli/commands/test.js +2 -0
  6. package/build/environment-handlers/node/source-peer-package.js +172 -0
  7. package/build/routes/resolver.js +3 -50
  8. package/build/src/background-jobs/main.d.ts.map +1 -1
  9. package/build/src/background-jobs/main.js +13 -3
  10. package/build/src/background-jobs/scheduler.d.ts +2 -2
  11. package/build/src/background-jobs/scheduler.d.ts.map +1 -1
  12. package/build/src/background-jobs/scheduler.js +11 -8
  13. package/build/src/background-jobs/store.d.ts +5 -4
  14. package/build/src/background-jobs/store.d.ts.map +1 -1
  15. package/build/src/background-jobs/store.js +17 -12
  16. package/build/src/environment-handlers/node/cli/commands/test.d.ts.map +1 -1
  17. package/build/src/environment-handlers/node/cli/commands/test.js +3 -1
  18. package/build/src/environment-handlers/node/source-peer-package.d.ts +46 -0
  19. package/build/src/environment-handlers/node/source-peer-package.d.ts.map +1 -0
  20. package/build/src/environment-handlers/node/source-peer-package.js +148 -0
  21. package/build/src/routes/resolver.d.ts.map +1 -1
  22. package/build/src/routes/resolver.js +4 -45
  23. package/build/tsconfig.tsbuildinfo +1 -1
  24. package/package.json +2 -1
  25. package/scripts/run-tests.js +61 -20
  26. package/scripts/test-browser.js +6 -1
  27. package/src/background-jobs/main.js +13 -2
  28. package/src/background-jobs/scheduler.js +11 -7
  29. package/src/background-jobs/store.js +18 -13
  30. package/src/environment-handlers/node/cli/commands/test.js +2 -0
  31. package/src/environment-handlers/node/source-peer-package.js +172 -0
  32. package/src/routes/resolver.js +3 -50
  33. package/build/deployment-api/controller.js +0 -437
  34. package/build/deployment-api/index.js +0 -210
  35. package/build/deployment-api/path-matcher.js +0 -45
  36. package/build/deployment-api/registry.js +0 -84
  37. package/build/deployment-api/run-store.js +0 -798
  38. package/build/deployment-api/sanitize.js +0 -114
  39. package/build/src/deployment-api/controller.d.ts +0 -117
  40. package/build/src/deployment-api/controller.d.ts.map +0 -1
  41. package/build/src/deployment-api/controller.js +0 -384
  42. package/build/src/deployment-api/index.d.ts +0 -46
  43. package/build/src/deployment-api/index.d.ts.map +0 -1
  44. package/build/src/deployment-api/index.js +0 -178
  45. package/build/src/deployment-api/path-matcher.d.ts +0 -31
  46. package/build/src/deployment-api/path-matcher.d.ts.map +0 -1
  47. package/build/src/deployment-api/path-matcher.js +0 -39
  48. package/build/src/deployment-api/registry.d.ts +0 -106
  49. package/build/src/deployment-api/registry.d.ts.map +0 -1
  50. package/build/src/deployment-api/registry.js +0 -74
  51. package/build/src/deployment-api/run-store.d.ts +0 -402
  52. package/build/src/deployment-api/run-store.d.ts.map +0 -1
  53. package/build/src/deployment-api/run-store.js +0 -711
  54. package/build/src/deployment-api/sanitize.d.ts +0 -27
  55. package/build/src/deployment-api/sanitize.d.ts.map +0 -1
  56. package/build/src/deployment-api/sanitize.js +0 -100
  57. package/src/deployment-api/controller.js +0 -437
  58. package/src/deployment-api/index.js +0 -210
  59. package/src/deployment-api/path-matcher.js +0 -45
  60. package/src/deployment-api/registry.js +0 -84
  61. package/src/deployment-api/run-store.js +0 -798
  62. package/src/deployment-api/sanitize.js +0 -114
@@ -1 +1 @@
1
- {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../../../../src/environment-handlers/node/cli/commands/test.js"],"names":[],"mappings":"AA0IA;;;;;;GAMG;AACH,kDAHW,MAAM,GAAG,SAAS,GAChB,MAAM,CAMlB;AA5ID;IACE,yBA6HC;CACF;wBAtIuB,iCAAiC"}
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../../../../src/environment-handlers/node/cli/commands/test.js"],"names":[],"mappings":"AA4IA;;;;;;GAMG;AACH,kDAHW,MAAM,GAAG,SAAS,GAChB,MAAM,CAMlB;AA7ID;IACE,yBA8HC;CACF;wBAxIuB,iCAAiC"}
@@ -5,8 +5,10 @@ import TestFilesFinder from "../../../../testing/test-files-finder.js";
5
5
  import TestRunner from "../../../../testing/test-runner.js";
6
6
  import TestSuiteSplitter from "../../../../testing/test-suite-splitter.js";
7
7
  import { normalizeExamplePatterns, parseFilters } from "../../../../testing/test-filter-parser.js";
8
+ import { prepareSourcePeerPackage } from "../../source-peer-package.js";
8
9
  export default class VelociousCliCommandsTest extends BaseCommand {
9
10
  async execute() {
11
+ await prepareSourcePeerPackage();
10
12
  this.getConfiguration().setEnvironment("test");
11
13
  let directory;
12
14
  const directories = [];
@@ -125,4 +127,4 @@ export function resolveSlowTestCount(rawEnvValue) {
125
127
  return 10;
126
128
  return Math.max(0, Math.floor(Number(rawEnvValue)) || 0);
127
129
  }
128
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9lbnZpcm9ubWVudC1oYW5kbGVycy9ub2RlL2NsaS9jb21tYW5kcy90ZXN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFdBQVcsTUFBTSxpQ0FBaUMsQ0FBQTtBQUN6RCxPQUFPLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDbkMsT0FBTyxlQUFlLE1BQU0sMENBQTBDLENBQUE7QUFDdEUsT0FBTyxVQUFVLE1BQU0sb0NBQW9DLENBQUE7QUFDM0QsT0FBTyxpQkFBaUIsTUFBTSw0Q0FBNEMsQ0FBQTtBQUMxRSxPQUFPLEVBQUMsd0JBQXdCLEVBQUUsWUFBWSxFQUFDLE1BQU0sMkNBQTJDLENBQUE7QUFFaEcsTUFBTSxDQUFDLE9BQU8sT0FBTyx3QkFBeUIsU0FBUSxXQUFXO0lBQy9ELEtBQUssQ0FBQyxPQUFPO1FBQ1gsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRTlDLElBQUksU0FBUyxDQUFBO1FBQ2IsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFBO1FBRXRCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ25DLFNBQVMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFBO1lBQzFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1FBQ2xELENBQUM7YUFBTSxDQUFDO1lBQ04sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTtZQUM1QixXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQTtZQUNqRCxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMs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QzFELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IEJhc2VDb21tYW5kIGZyb20gXCIuLi8uLi8uLi8uLi9jbGkvYmFzZS1jb21tYW5kLmpzXCJcbmltcG9ydCBwaWNvY29sb3JzIGZyb20gXCJwaWNvY29sb3JzXCJcbmltcG9ydCBUZXN0RmlsZXNGaW5kZXIgZnJvbSBcIi4uLy4uLy4uLy4uL3Rlc3RpbmcvdGVzdC1maWxlcy1maW5kZXIuanNcIlxuaW1wb3J0IFRlc3RSdW5uZXIgZnJvbSBcIi4uLy4uLy4uLy4uL3Rlc3RpbmcvdGVzdC1ydW5uZXIuanNcIlxuaW1wb3J0IFRlc3RTdWl0ZVNwbGl0dGVyIGZyb20gXCIuLi8uLi8uLi8uLi90ZXN0aW5nL3Rlc3Qtc3VpdGUtc3BsaXR0ZXIuanNcIlxuaW1wb3J0IHtub3JtYWxpemVFeGFtcGxlUGF0dGVybnMsIHBhcnNlRmlsdGVyc30gZnJvbSBcIi4uLy4uLy4uLy4uL3Rlc3RpbmcvdGVzdC1maWx0ZXItcGFyc2VyLmpzXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzQ2xpQ29tbWFuZHNUZXN0IGV4dGVuZHMgQmFzZUNvbW1hbmQge1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLnNldEVudmlyb25tZW50KFwidGVzdFwiKVxuXG4gICAgbGV0IGRpcmVjdG9yeVxuICAgIGNvbnN0IGRpcmVjdG9yaWVzID0gW11cblxuICAgIGlmIChwcm9jZXNzLmVudi5WRUxPQ0lPVVNfVEVTVF9ESVIpIHtcbiAgICAgIGRpcmVjdG9yeSA9IHByb2Nlc3MuZW52LlZFTE9DSU9VU19URVNUX0RJUlxuICAgICAgZGlyZWN0b3JpZXMucHVzaChwcm9jZXNzLmVudi5WRUxPQ0lPVVNfVEVTVF9ESVIpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRpcmVjdG9yeSA9IHRoaXMuZGlyZWN0b3J5KClcbiAgICAgIGRpcmVjdG9yaWVzLnB1c2goYCR7dGhpcy5kaXJlY3RvcnkoKX0vX190ZXN0c19fYClcbiAgICAgIGRpcmVjdG9yaWVzLnB1c2goYCR7dGhpcy5kaXJlY3RvcnkoKX0vdGVzdHNgKVxuICAgICAgZGlyZWN0b3JpZXMucHVzaChgJHt0aGlzLmRpcmVjdG9yeSgpfS9zcGVjYClcbiAgICB9XG5cbiAgICBjb25zdCB7aW5jbHVkZVRhZ3MsIGV4Y2x1ZGVUYWdzLCBleGFtcGxlUGF0dGVybnMsIGZpbHRlcmVkUHJvY2Vzc0FyZ3MsIGdyb3VwcywgZ3JvdXBOdW1iZXJ9ID0gcGFyc2VGaWx0ZXJzKHRoaXMucHJvY2Vzc0FyZ3MgfHwgW10pXG4gICAgY29uc3QgdGVzdEZpbGVzRmluZGVyID0gbmV3IFRlc3RGaWxlc0ZpbmRlcih7ZGlyZWN0b3J5LCBkaXJlY3RvcmllcywgcHJvY2Vzc0FyZ3M6IGZpbHRlcmVkUHJvY2Vzc0FyZ3N9KVxuICAgIGxldCB0ZXN0RmlsZXMgPSBhd2FpdCB0ZXN0RmlsZXNGaW5kZXIuZmluZFRlc3RGaWxlcygpXG5cbiAgICBpZiAoZ3JvdXBzICE9PSB1bmRlZmluZWQgfHwgZ3JvdXBOdW1iZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGdyb3VwcyA9PT0gdW5kZWZpbmVkIHx8IGdyb3VwTnVtYmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQm90aCAtLWdyb3VwcyBhbmQgLS1ncm91cC1udW1iZXIgbXVzdCBiZSBwcm92aWRlZCB0b2dldGhlclwiKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzcGxpdHRlciA9IG5ldyBUZXN0U3VpdGVTcGxpdHRlcih7Z3JvdXBzLCBncm91cE51bWJlciwgdGVzdEZpbGVzLCBiYXNlRGlyZWN0b3J5OiBkaXJlY3Rvcnl9KVxuXG4gICAgICB0ZXN0RmlsZXMgPSBzcGxpdHRlci5nZXRHcm91cEZpbGVzKClcbiAgICAgIGNvbnNvbGUubG9nKHBpY29jb2xvcnMuY3lhbihgUnVubmluZyBncm91cCAke2dyb3VwTnVtYmVyfSBvZiAke2dyb3Vwc30gKCR7dGVzdEZpbGVzLmxlbmd0aH0gZmlsZXMpYCkpXG4gICAgfVxuXG4gICAgY29uc3QgdGVzdFJ1bm5lciA9IG5ldyBUZXN0UnVubmVyKHtcbiAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLFxuICAgICAgZXhjbHVkZVRhZ3MsXG4gICAgICBpbmNsdWRlVGFncyxcbiAgICAgIHRlc3RGaWxlcyxcbiAgICAgIGxpbmVGaWx0ZXJzOiB0ZXN0RmlsZXNGaW5kZXIuZ2V0TGluZUZpbHRlcnNCeUZpbGUoKSxcbiAgICAgIGV4YW1wbGVQYXR0ZXJuczogbm9ybWFsaXplRXhhbXBsZVBhdHRlcm5zKGV4YW1wbGVQYXR0ZXJucylcbiAgICB9KVxuICAgIGxldCBzaWduYWxIYW5kbGVkID0gZmFsc2VcblxuICAgIGNvbnN0IGhhbmRsZVNpZ25hbCA9IGFzeW5jICgvKiogQHR5cGUge3N0cmluZ30gKi8gc2lnbmFsKSA9PiB7XG4gICAgICBpZiAoc2lnbmFsSGFuZGxlZCkgcmV0dXJuXG4gICAgICBzaWduYWxIYW5kbGVkID0gdHJ1ZVxuICAgICAgY29uc29sZS5lcnJvcihgXFxuUmVjZWl2ZWQgJHtzaWduYWx9LCBydW5uaW5nIGFmdGVyQWxsIGhvb2tzIGJlZm9yZSBleGl0Li4uYClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGVzdFJ1bm5lci5ydW5BZnRlckFsbHNGb3JBY3RpdmVTY29wZXMoKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB3aGlsZSBydW5uaW5nIGFmdGVyQWxsIGhvb2tzOlwiLCBlcnJvcilcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxMzApXG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvY2Vzcy5vbmNlKFwiU0lHSU5UXCIsICgpID0+IHsgdm9pZCBoYW5kbGVTaWduYWwoXCJTSUdJTlRcIikgfSlcbiAgICBwcm9jZXNzLm9uY2UoXCJTSUdURVJNXCIsICgpID0+IHsgdm9pZCBoYW5kbGVTaWduYWwoXCJTSUdURVJNXCIpIH0pXG5cbiAgICBhd2FpdCB0ZXN0UnVubmVyLnByZXBhcmUoKVxuXG4gICAgaWYgKHRlc3RSdW5uZXIuZ2V0VGVzdHNDb3VudCgpID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGVzdFJ1bm5lci5nZXRUZXN0c0NvdW50KCl9IHRlc3RzIHdhcyBmb3VuZCBpbiAke3Rlc3RGaWxlcy5sZW5ndGh9IGZpbGUocylgKVxuICAgIH1cblxuICAgIGF3YWl0IHRlc3RSdW5uZXIucnVuKClcblxuICAgIGNvbnN0IGV4ZWN1dGVkVGVzdHMgPSB0ZXN0UnVubmVyLmdldEV4ZWN1dGVkVGVzdHNDb3VudCgpXG5cbiAgICBjb25zdCBsaW5lRmlsdGVycyA9IHRlc3RSdW5uZXIuZ2V0TGluZUZpbHRlcnMoKVxuICAgIGNvbnN0IGhhc0xpbmVGaWx0ZXJzID0gT2JqZWN0LmtleXMobGluZUZpbHRlcnMpLmxlbmd0aCA+IDBcbiAgICBjb25zdCBoYXNFeGFtcGxlRmlsdGVycyA9IGV4YW1wbGVQYXR0ZXJucy5sZW5ndGggPiAwXG4gICAgY29uc3QgaGFzVGFnRmlsdGVycyA9IGluY2x1ZGVUYWdzLmxlbmd0aCA+IDAgfHwgZXhjbHVkZVRhZ3MubGVuZ3RoID4gMFxuXG4gICAgaWYgKChoYXNUYWdGaWx0ZXJzIHx8IGhhc0xpbmVGaWx0ZXJzIHx8IGhhc0V4YW1wbGVGaWx0ZXJzKSAmJiBleGVjdXRlZFRlc3RzID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKHBpY29jb2xvcnMucmVkKFwiXFxuTm8gdGVzdHMgbWF0Y2hlZCB0aGUgcHJvdmlkZWQgZmlsdGVyc1wiKSlcbiAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgIH1cblxuICAgIC8vIFJlcG9ydCB0aGUgc2xvd2VzdCB0ZXN0cyBzbyBzdWl0ZSBob3RzcG90cyBhcmUgdmlzaWJsZSBldmVyeSBydW4uIERlZmF1bHRzIHRvXG4gICAgLy8gdGhlIHRvcCAxMDsgdHVuZSB3aXRoIFZFTE9DSU9VU19TTE9XX1RFU1RfQ09VTlQgKDAgZGlzYWJsZXMpLiBTa2lwcGVkIGZvclxuICAgIC8vIHNpbmdsZS10ZXN0IHJ1bnMgd2hlcmUgaXQgd291bGQganVzdCBiZSBub2lzZS5cbiAgICBjb25zdCBzbG93VGVzdENvdW50ID0gcmVzb2x2ZVNsb3dUZXN0Q291bnQocHJvY2Vzcy5lbnYuVkVMT0NJT1VTX1NMT1dfVEVTVF9DT1VOVClcblxuICAgIGlmIChzbG93VGVzdENvdW50ID4gMCAmJiBleGVjdXRlZFRlc3RzID4gMSkge1xuICAgICAgY29uc3Qgc2xvd2VzdFRlc3RzID0gdGVzdFJ1bm5lci5nZXRTbG93ZXN0VGVzdHMoc2xvd1Rlc3RDb3VudClcblxuICAgICAgaWYgKHNsb3dlc3RUZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHBpY29jb2xvcnMuY3lhbihgXFxuU2xvd2VzdCAke3Nsb3dlc3RUZXN0cy5sZW5ndGh9IHRlc3RzOmApKVxuXG4gICAgICAgIGZvciAoY29uc3Qgc2xvd1Rlc3Qgb2Ygc2xvd2VzdFRlc3RzKSB7XG4gICAgICAgICAgY29uc3QgbG9jYXRpb24gPSBzbG93VGVzdC5maWxlUGF0aCAmJiBzbG93VGVzdC5saW5lID8gYCAoJHtzbG93VGVzdC5maWxlUGF0aH06JHtzbG93VGVzdC5saW5lfSlgIDogXCJcIlxuXG4gICAgICAgICAgY29uc29sZS5sb2cocGljb2NvbG9ycy5jeWFuKGAgICR7U3RyaW5nKHNsb3dUZXN0LmR1cmF0aW9uTXMpLnBhZFN0YXJ0KDYpfW1zICAke3Nsb3dUZXN0LmZ1bGxEZXNjcmlwdGlvbn0ke2xvY2F0aW9ufWApKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRlc3RSdW5uZXIuaXNGYWlsZWQoKSkge1xuICAgICAgYXdhaXQgdGVzdFJ1bm5lci5wZXJzaXN0RmFpbGVkVGVzdENvbnNvbGVPdXRwdXRzVG9Bc3NldHMoKVxuICAgICAgY29uc3QgZmFpbGVkVGVzdHMgPSB0ZXN0UnVubmVyLmdldEZhaWxlZFRlc3REZXRhaWxzKClcblxuICAgICAgaWYgKGZhaWxlZFRlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IocGljb2NvbG9ycy5yZWQoXCJcXG5GYWlsZWQgdGVzdHM6XCIpKVxuXG4gICAgICAgIGZvciAoY29uc3QgZmFpbGVkIG9mIGZhaWxlZFRlc3RzKSB7XG4gICAgICAgICAgY29uc3QgbG9jYXRpb24gPSBmYWlsZWQuZmlsZVBhdGggJiYgZmFpbGVkLmxpbmVcbiAgICAgICAgICAgID8gYCAoJHtmYWlsZWQuZmlsZVBhdGh9OiR7ZmFpbGVkLmxpbmV9KWBcbiAgICAgICAgICAgIDogXCJcIlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IocGljb2NvbG9ycy5yZWQoYC0gJHtmYWlsZWQuZnVsbERlc2NyaXB0aW9ufSR7bG9jYXRpb259YCkpXG5cbiAgICAgICAgICBpZiAoZmFpbGVkLmNvbnNvbGVMb2dQYXRoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKHBpY29jb2xvcnMucmVkKGAgIENvbnNvbGUgbG9nOiAke2ZhaWxlZC5jb25zb2xlTG9nUGF0aH1gKSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc29sZS5lcnJvcihwaWNvY29sb3JzLnJlZChgXFxuVGVzdCBydW4gZmFpbGVkIHdpdGggJHt0ZXN0UnVubmVyLmdldEZhaWxlZFRlc3RzKCl9IGZhaWxlZCB0ZXN0cyBhbmQgJHt0ZXN0UnVubmVyLmdldFN1Y2Nlc3NmdWxUZXN0cygpfSBzdWNjZXNzZnVsbGApKVxuICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgfSBlbHNlIGlmICh0ZXN0UnVubmVyLmFyZUFueVRlc3RzRm9jdXNzZWQoKSkge1xuICAgICAgY29uc29sZS5lcnJvcihwaWNvY29sb3JzLnJlZChgXFxuRm9jdXNzZWQgcnVuIHdpdGggJHt0ZXN0UnVubmVyLmdldEZhaWxlZFRlc3RzKCl9IGZhaWxlZCB0ZXN0cyBhbmQgJHt0ZXN0UnVubmVyLmdldFN1Y2Nlc3NmdWxUZXN0cygpfSBzdWNjZXNzZnVsbGApKVxuICAgICAgcHJvY2Vzcy5leGl0KDEpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKHBpY29jb2xvcnMuZ3JlZW4oYFxcblRlc3QgcnVuIHN1Y2NlZWRlZCB3aXRoICR7dGVzdFJ1bm5lci5nZXRTdWNjZXNzZnVsVGVzdHMoKX0gc3VjY2Vzc2Z1bCB0ZXN0c2ApKVxuICAgICAgcHJvY2Vzcy5leGl0KDApXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgaG93IG1hbnkgc2xvd2VzdCB0ZXN0cyB0byByZXBvcnQgZnJvbSB0aGUgYFZFTE9DSU9VU19TTE9XX1RFU1RfQ09VTlRgXG4gKiBlbnYgdmFsdWU6IGRlZmF1bHRzIHRvIDEwIHdoZW4gdW5zZXQ7IDAgKG9yIGFuIHVucGFyc2VhYmxlIHZhbHVlKSBkaXNhYmxlcyB0aGVcbiAqIHJlcG9ydDsgb3RoZXJ3aXNlIHRoZSBmbG9vcmVkLCBub24tbmVnYXRpdmUgaW50ZWdlci5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSByYXdFbnZWYWx1ZSAtIFJhdyBlbnYgdmFsdWUuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSAtIE51bWJlciBvZiBzbG93ZXN0IHRlc3RzIHRvIHJlcG9ydCAoMCBkaXNhYmxlcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU2xvd1Rlc3RDb3VudChyYXdFbnZWYWx1ZSkge1xuICBpZiAocmF3RW52VmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDEwXG5cbiAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGguZmxvb3IoTnVtYmVyKHJhd0VudlZhbHVlKSkgfHwgMClcbn1cbiJdfQ==
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9lbnZpcm9ubWVudC1oYW5kbGVycy9ub2RlL2NsaS9jb21tYW5kcy90ZXN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLFdBQVcsTUFBTSxpQ0FBaUMsQ0FBQTtBQUN6RCxPQUFPLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDbkMsT0FBTyxlQUFlLE1BQU0sMENBQTBDLENBQUE7QUFDdEUsT0FBTyxVQUFVLE1BQU0sb0NBQW9DLENBQUE7QUFDM0QsT0FBTyxpQkFBaUIsTUFBTSw0Q0FBNEMsQ0FBQTtBQUMxRSxPQUFPLEVBQUMsd0JBQXdCLEVBQUUsWUFBWSxFQUFDLE1BQU0sMkNBQTJDLENBQUE7QUFDaEcsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sOEJBQThCLENBQUE7QUFFckUsTUFBTSxDQUFDLE9BQU8sT0FBTyx3QkFBeUIsU0FBUSxXQUFXO0lBQy9ELEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSx3QkFBd0IsRUFBRSxDQUFBO1FBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUU5QyxJQUFJLFNBQVMsQ0FBQTtRQUNiLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQTtRQUV0QixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUNuQyxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQTtZQUMxQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtRQUNsRCxDQUFDO2FBQU0sQ0FBQztZQUNOLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUE7WUFDNUIsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsWUFB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LEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtBQUMxRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBCYXNlQ29tbWFuZCBmcm9tIFwiLi4vLi4vLi4vLi4vY2xpL2Jhc2UtY29tbWFuZC5qc1wiXG5pbXBvcnQgcGljb2NvbG9ycyBmcm9tIFwicGljb2NvbG9yc1wiXG5pbXBvcnQgVGVzdEZpbGVzRmluZGVyIGZyb20gXCIuLi8uLi8uLi8uLi90ZXN0aW5nL3Rlc3QtZmlsZXMtZmluZGVyLmpzXCJcbmltcG9ydCBUZXN0UnVubmVyIGZyb20gXCIuLi8uLi8uLi8uLi90ZXN0aW5nL3Rlc3QtcnVubmVyLmpzXCJcbmltcG9ydCBUZXN0U3VpdGVTcGxpdHRlciBmcm9tIFwiLi4vLi4vLi4vLi4vdGVzdGluZy90ZXN0LXN1aXRlLXNwbGl0dGVyLmpzXCJcbmltcG9ydCB7bm9ybWFsaXplRXhhbXBsZVBhdHRlcm5zLCBwYXJzZUZpbHRlcnN9IGZyb20gXCIuLi8uLi8uLi8uLi90ZXN0aW5nL3Rlc3QtZmlsdGVyLXBhcnNlci5qc1wiXG5pbXBvcnQge3ByZXBhcmVTb3VyY2VQZWVyUGFja2FnZX0gZnJvbSBcIi4uLy4uL3NvdXJjZS1wZWVyLXBhY2thZ2UuanNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNDbGlDb21tYW5kc1Rlc3QgZXh0ZW5kcyBCYXNlQ29tbWFuZCB7XG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgYXdhaXQgcHJlcGFyZVNvdXJjZVBlZXJQYWNrYWdlKClcbiAgICB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5zZXRFbnZpcm9ubWVudChcInRlc3RcIilcblxuICAgIGxldCBkaXJlY3RvcnlcbiAgICBjb25zdCBkaXJlY3RvcmllcyA9IFtdXG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuVkVMT0NJT1VTX1RFU1RfRElSKSB7XG4gICAgICBkaXJlY3RvcnkgPSBwcm9jZXNzLmVudi5WRUxPQ0lPVVNfVEVTVF9ESVJcbiAgICAgIGRpcmVjdG9yaWVzLnB1c2gocHJvY2Vzcy5lbnYuVkVMT0NJT1VTX1RFU1RfRElSKVxuICAgIH0gZWxzZSB7XG4gICAgICBkaXJlY3RvcnkgPSB0aGlzLmRpcmVjdG9yeSgpXG4gICAgICBkaXJlY3Rvcmllcy5wdXNoKGAke3RoaXMuZGlyZWN0b3J5KCl9L19fdGVzdHNfX2ApXG4gICAgICBkaXJlY3Rvcmllcy5wdXNoKGAke3RoaXMuZGlyZWN0b3J5KCl9L3Rlc3RzYClcbiAgICAgIGRpcmVjdG9yaWVzLnB1c2goYCR7dGhpcy5kaXJlY3RvcnkoKX0vc3BlY2ApXG4gICAgfVxuXG4gICAgY29uc3Qge2luY2x1ZGVUYWdzLCBleGNsdWRlVGFncywgZXhhbXBsZVBhdHRlcm5zLCBmaWx0ZXJlZFByb2Nlc3NBcmdzLCBncm91cHMsIGdyb3VwTnVtYmVyfSA9IHBhcnNlRmlsdGVycyh0aGlzLnByb2Nlc3NBcmdzIHx8IFtdKVxuICAgIGNvbnN0IHRlc3RGaWxlc0ZpbmRlciA9IG5ldyBUZXN0RmlsZXNGaW5kZXIoe2RpcmVjdG9yeSwgZGlyZWN0b3JpZXMsIHByb2Nlc3NBcmdzOiBmaWx0ZXJlZFByb2Nlc3NBcmdzfSlcbiAgICBsZXQgdGVzdEZpbGVzID0gYXdhaXQgdGVzdEZpbGVzRmluZGVyLmZpbmRUZXN0RmlsZXMoKVxuXG4gICAgaWYgKGdyb3VwcyAhPT0gdW5kZWZpbmVkIHx8IGdyb3VwTnVtYmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChncm91cHMgPT09IHVuZGVmaW5lZCB8fCBncm91cE51bWJlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJvdGggLS1ncm91cHMgYW5kIC0tZ3JvdXAtbnVtYmVyIG11c3QgYmUgcHJvdmlkZWQgdG9nZXRoZXJcIilcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3BsaXR0ZXIgPSBuZXcgVGVzdFN1aXRlU3BsaXR0ZXIoe2dyb3VwcywgZ3JvdXBOdW1iZXIsIHRlc3RGaWxlcywgYmFzZURpcmVjdG9yeTogZGlyZWN0b3J5fSlcblxuICAgICAgdGVzdEZpbGVzID0gc3BsaXR0ZXIuZ2V0R3JvdXBGaWxlcygpXG4gICAgICBjb25zb2xlLmxvZyhwaWNvY29sb3JzLmN5YW4oYFJ1bm5pbmcgZ3JvdXAgJHtncm91cE51bWJlcn0gb2YgJHtncm91cHN9ICgke3Rlc3RGaWxlcy5sZW5ndGh9IGZpbGVzKWApKVxuICAgIH1cblxuICAgIGNvbnN0IHRlc3RSdW5uZXIgPSBuZXcgVGVzdFJ1bm5lcih7XG4gICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKSxcbiAgICAgIGV4Y2x1ZGVUYWdzLFxuICAgICAgaW5jbHVkZVRhZ3MsXG4gICAgICB0ZXN0RmlsZXMsXG4gICAgICBsaW5lRmlsdGVyczogdGVzdEZpbGVzRmluZGVyLmdldExpbmVGaWx0ZXJzQnlGaWxlKCksXG4gICAgICBleGFtcGxlUGF0dGVybnM6IG5vcm1hbGl6ZUV4YW1wbGVQYXR0ZXJucyhleGFtcGxlUGF0dGVybnMpXG4gICAgfSlcbiAgICBsZXQgc2lnbmFsSGFuZGxlZCA9IGZhbHNlXG5cbiAgICBjb25zdCBoYW5kbGVTaWduYWwgPSBhc3luYyAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIHNpZ25hbCkgPT4ge1xuICAgICAgaWYgKHNpZ25hbEhhbmRsZWQpIHJldHVyblxuICAgICAgc2lnbmFsSGFuZGxlZCA9IHRydWVcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFxcblJlY2VpdmVkICR7c2lnbmFsfSwgcnVubmluZyBhZnRlckFsbCBob29rcyBiZWZvcmUgZXhpdC4uLmApXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRlc3RSdW5uZXIucnVuQWZ0ZXJBbGxzRm9yQWN0aXZlU2NvcGVzKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgd2hpbGUgcnVubmluZyBhZnRlckFsbCBob29rczpcIiwgZXJyb3IpXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBwcm9jZXNzLmV4aXQoMTMwKVxuICAgICAgfVxuICAgIH1cblxuICAgIHByb2Nlc3Mub25jZShcIlNJR0lOVFwiLCAoKSA9PiB7IHZvaWQgaGFuZGxlU2lnbmFsKFwiU0lHSU5UXCIpIH0pXG4gICAgcHJvY2Vzcy5vbmNlKFwiU0lHVEVSTVwiLCAoKSA9PiB7IHZvaWQgaGFuZGxlU2lnbmFsKFwiU0lHVEVSTVwiKSB9KVxuXG4gICAgYXdhaXQgdGVzdFJ1bm5lci5wcmVwYXJlKClcblxuICAgIGlmICh0ZXN0UnVubmVyLmdldFRlc3RzQ291bnQoKSA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Rlc3RSdW5uZXIuZ2V0VGVzdHNDb3VudCgpfSB0ZXN0cyB3YXMgZm91bmQgaW4gJHt0ZXN0RmlsZXMubGVuZ3RofSBmaWxlKHMpYClcbiAgICB9XG5cbiAgICBhd2FpdCB0ZXN0UnVubmVyLnJ1bigpXG5cbiAgICBjb25zdCBleGVjdXRlZFRlc3RzID0gdGVzdFJ1bm5lci5nZXRFeGVjdXRlZFRlc3RzQ291bnQoKVxuXG4gICAgY29uc3QgbGluZUZpbHRlcnMgPSB0ZXN0UnVubmVyLmdldExpbmVGaWx0ZXJzKClcbiAgICBjb25zdCBoYXNMaW5lRmlsdGVycyA9IE9iamVjdC5rZXlzKGxpbmVGaWx0ZXJzKS5sZW5ndGggPiAwXG4gICAgY29uc3QgaGFzRXhhbXBsZUZpbHRlcnMgPSBleGFtcGxlUGF0dGVybnMubGVuZ3RoID4gMFxuICAgIGNvbnN0IGhhc1RhZ0ZpbHRlcnMgPSBpbmNsdWRlVGFncy5sZW5ndGggPiAwIHx8IGV4Y2x1ZGVUYWdzLmxlbmd0aCA+IDBcblxuICAgIGlmICgoaGFzVGFnRmlsdGVycyB8fCBoYXNMaW5lRmlsdGVycyB8fCBoYXNFeGFtcGxlRmlsdGVycykgJiYgZXhlY3V0ZWRUZXN0cyA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihwaWNvY29sb3JzLnJlZChcIlxcbk5vIHRlc3RzIG1hdGNoZWQgdGhlIHByb3ZpZGVkIGZpbHRlcnNcIikpXG4gICAgICBwcm9jZXNzLmV4aXQoMSlcbiAgICB9XG5cbiAgICAvLyBSZXBvcnQgdGhlIHNsb3dlc3QgdGVzdHMgc28gc3VpdGUgaG90c3BvdHMgYXJlIHZpc2libGUgZXZlcnkgcnVuLiBEZWZhdWx0cyB0b1xuICAgIC8vIHRoZSB0b3AgMTA7IHR1bmUgd2l0aCBWRUxPQ0lPVVNfU0xPV19URVNUX0NPVU5UICgwIGRpc2FibGVzKS4gU2tpcHBlZCBmb3JcbiAgICAvLyBzaW5nbGUtdGVzdCBydW5zIHdoZXJlIGl0IHdvdWxkIGp1c3QgYmUgbm9pc2UuXG4gICAgY29uc3Qgc2xvd1Rlc3RDb3VudCA9IHJlc29sdmVTbG93VGVzdENvdW50KHByb2Nlc3MuZW52LlZFTE9DSU9VU19TTE9XX1RFU1RfQ09VTlQpXG5cbiAgICBpZiAoc2xvd1Rlc3RDb3VudCA+IDAgJiYgZXhlY3V0ZWRUZXN0cyA+IDEpIHtcbiAgICAgIGNvbnN0IHNsb3dlc3RUZXN0cyA9IHRlc3RSdW5uZXIuZ2V0U2xvd2VzdFRlc3RzKHNsb3dUZXN0Q291bnQpXG5cbiAgICAgIGlmIChzbG93ZXN0VGVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhwaWNvY29sb3JzLmN5YW4oYFxcblNsb3dlc3QgJHtzbG93ZXN0VGVzdHMubGVuZ3RofSB0ZXN0czpgKSlcblxuICAgICAgICBmb3IgKGNvbnN0IHNsb3dUZXN0IG9mIHNsb3dlc3RUZXN0cykge1xuICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gc2xvd1Rlc3QuZmlsZVBhdGggJiYgc2xvd1Rlc3QubGluZSA/IGAgKCR7c2xvd1Rlc3QuZmlsZVBhdGh9OiR7c2xvd1Rlc3QubGluZX0pYCA6IFwiXCJcblxuICAgICAgICAgIGNvbnNvbGUubG9nKHBpY29jb2xvcnMuY3lhbihgICAke1N0cmluZyhzbG93VGVzdC5kdXJhdGlvbk1zKS5wYWRTdGFydCg2KX1tcyAgJHtzbG93VGVzdC5mdWxsRGVzY3JpcHRpb259JHtsb2NhdGlvbn1gKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0ZXN0UnVubmVyLmlzRmFpbGVkKCkpIHtcbiAgICAgIGF3YWl0IHRlc3RSdW5uZXIucGVyc2lzdEZhaWxlZFRlc3RDb25zb2xlT3V0cHV0c1RvQXNzZXRzKClcbiAgICAgIGNvbnN0IGZhaWxlZFRlc3RzID0gdGVzdFJ1bm5lci5nZXRGYWlsZWRUZXN0RGV0YWlscygpXG5cbiAgICAgIGlmIChmYWlsZWRUZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKHBpY29jb2xvcnMucmVkKFwiXFxuRmFpbGVkIHRlc3RzOlwiKSlcblxuICAgICAgICBmb3IgKGNvbnN0IGZhaWxlZCBvZiBmYWlsZWRUZXN0cykge1xuICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gZmFpbGVkLmZpbGVQYXRoICYmIGZhaWxlZC5saW5lXG4gICAgICAgICAgICA/IGAgKCR7ZmFpbGVkLmZpbGVQYXRofToke2ZhaWxlZC5saW5lfSlgXG4gICAgICAgICAgICA6IFwiXCJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKHBpY29jb2xvcnMucmVkKGAtICR7ZmFpbGVkLmZ1bGxEZXNjcmlwdGlvbn0ke2xvY2F0aW9ufWApKVxuXG4gICAgICAgICAgaWYgKGZhaWxlZC5jb25zb2xlTG9nUGF0aCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihwaWNvY29sb3JzLnJlZChgICBDb25zb2xlIGxvZzogJHtmYWlsZWQuY29uc29sZUxvZ1BhdGh9YCkpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUuZXJyb3IocGljb2NvbG9ycy5yZWQoYFxcblRlc3QgcnVuIGZhaWxlZCB3aXRoICR7dGVzdFJ1bm5lci5nZXRGYWlsZWRUZXN0cygpfSBmYWlsZWQgdGVzdHMgYW5kICR7dGVzdFJ1bm5lci5nZXRTdWNjZXNzZnVsVGVzdHMoKX0gc3VjY2Vzc2Z1bGxgKSlcbiAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgIH0gZWxzZSBpZiAodGVzdFJ1bm5lci5hcmVBbnlUZXN0c0ZvY3Vzc2VkKCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IocGljb2NvbG9ycy5yZWQoYFxcbkZvY3Vzc2VkIHJ1biB3aXRoICR7dGVzdFJ1bm5lci5nZXRGYWlsZWRUZXN0cygpfSBmYWlsZWQgdGVzdHMgYW5kICR7dGVzdFJ1bm5lci5nZXRTdWNjZXNzZnVsVGVzdHMoKX0gc3VjY2Vzc2Z1bGxgKSlcbiAgICAgIHByb2Nlc3MuZXhpdCgxKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhwaWNvY29sb3JzLmdyZWVuKGBcXG5UZXN0IHJ1biBzdWNjZWVkZWQgd2l0aCAke3Rlc3RSdW5uZXIuZ2V0U3VjY2Vzc2Z1bFRlc3RzKCl9IHN1Y2Nlc3NmdWwgdGVzdHNgKSlcbiAgICAgIHByb2Nlc3MuZXhpdCgwKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIGhvdyBtYW55IHNsb3dlc3QgdGVzdHMgdG8gcmVwb3J0IGZyb20gdGhlIGBWRUxPQ0lPVVNfU0xPV19URVNUX0NPVU5UYFxuICogZW52IHZhbHVlOiBkZWZhdWx0cyB0byAxMCB3aGVuIHVuc2V0OyAwIChvciBhbiB1bnBhcnNlYWJsZSB2YWx1ZSkgZGlzYWJsZXMgdGhlXG4gKiByZXBvcnQ7IG90aGVyd2lzZSB0aGUgZmxvb3JlZCwgbm9uLW5lZ2F0aXZlIGludGVnZXIuXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gcmF3RW52VmFsdWUgLSBSYXcgZW52IHZhbHVlLlxuICogQHJldHVybnMge251bWJlcn0gLSBOdW1iZXIgb2Ygc2xvd2VzdCB0ZXN0cyB0byByZXBvcnQgKDAgZGlzYWJsZXMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVNsb3dUZXN0Q291bnQocmF3RW52VmFsdWUpIHtcbiAgaWYgKHJhd0VudlZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiAxMFxuXG4gIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLmZsb29yKE51bWJlcihyYXdFbnZWYWx1ZSkpIHx8IDApXG59XG4iXX0=
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Invocation-owned source peer package shim.
3
+ */
4
+ export type SourcePeerPackage = {
5
+ /**
6
+ * - Removes only this invocation's shim.
7
+ */
8
+ cleanup: () => Promise<void>;
9
+ /**
10
+ * - Whether this invocation created the shim.
11
+ */
12
+ created: boolean;
13
+ /**
14
+ * - Package path used for peer resolution.
15
+ */
16
+ packageDirectory: string;
17
+ };
18
+ /**
19
+ * Invocation-owned source peer package shim.
20
+ * @typedef {object} SourcePeerPackage
21
+ * @property {() => Promise<void>} cleanup - Removes only this invocation's shim.
22
+ * @property {boolean} created - Whether this invocation created the shim.
23
+ * @property {string} packageDirectory - Package path used for peer resolution.
24
+ */
25
+ export const SOURCE_PEER_SHIM_MARKER_FILE: ".velocious-source-peer-shim";
26
+ /**
27
+ * Resolves the Velocious package directory from source or compiled execution.
28
+ * @returns {Promise<string>} - Velocious package directory.
29
+ */
30
+ export function frameworkPackageDirectory(): Promise<string>;
31
+ /**
32
+ * Exposes this checkout to published peer packages without loading duplicate
33
+ * classes from generated build output.
34
+ * @param {string} [projectDirectory] - Velocious source checkout.
35
+ * @returns {Promise<SourcePeerPackage>} - Invocation-owned shim handle.
36
+ */
37
+ export function prepareSourcePeerPackage(projectDirectory?: string): Promise<SourcePeerPackage>;
38
+ /**
39
+ * Runs work while the source peer package is available.
40
+ * @template Result
41
+ * @param {string} projectDirectory - Velocious source checkout.
42
+ * @param {() => Promise<Result>} callback - Work requiring source peer resolution.
43
+ * @returns {Promise<Result>} - Callback result.
44
+ */
45
+ export function withSourcePeerPackage<Result>(projectDirectory: string, callback: () => Promise<Result>): Promise<Result>;
46
+ //# sourceMappingURL=source-peer-package.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-peer-package.d.ts","sourceRoot":"","sources":["../../../../src/environment-handlers/node/source-peer-package.js"],"names":[],"mappings":";;;;;;;aASc,MAAM,OAAO,CAAC,IAAI,CAAC;;;;aACnB,OAAO;;;;sBACP,MAAM;;AALpB;;;;;;GAMG;AAEH,2CAAqC,6BAA6B,CAAA;AAYlE;;;GAGG;AACH,6CAFa,OAAO,CAAC,MAAM,CAAC,CAe3B;AAkDD;;;;;GAKG;AACH,4DAHW,MAAM,GACJ,OAAO,CAAC,iBAAiB,CAAC,CAuDtC;AAED;;;;;;GAMG;AACH,sCALa,MAAM,oBACR,MAAM,YACN,MAAM,OAAO,CAAC,MAAM,CAAC,GACnB,OAAO,CAAC,MAAM,CAAC,CAU3B"}
@@ -0,0 +1,148 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import fsSync from "node:fs";
3
+ import fs from "node:fs/promises";
4
+ import path from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ /**
7
+ * Invocation-owned source peer package shim.
8
+ * @typedef {object} SourcePeerPackage
9
+ * @property {() => Promise<void>} cleanup - Removes only this invocation's shim.
10
+ * @property {boolean} created - Whether this invocation created the shim.
11
+ * @property {string} packageDirectory - Package path used for peer resolution.
12
+ */
13
+ const SOURCE_PEER_SHIM_MARKER_FILE = ".velocious-source-peer-shim";
14
+ /**
15
+ * Checks a filesystem error code.
16
+ * @param {unknown} error - Filesystem error.
17
+ * @param {string} code - Expected Node error code.
18
+ * @returns {boolean} - Whether the error has the expected code.
19
+ */
20
+ function errorHasCode(error, code) {
21
+ return error instanceof Error && "code" in error && error.code === code;
22
+ }
23
+ /**
24
+ * Resolves the Velocious package directory from source or compiled execution.
25
+ * @returns {Promise<string>} - Velocious package directory.
26
+ */
27
+ async function frameworkPackageDirectory() {
28
+ const helperDirectory = path.dirname(fileURLToPath(import.meta.url));
29
+ const sourceLayoutDirectory = path.resolve(helperDirectory, "..", "..", "..");
30
+ try {
31
+ await fs.access(path.join(sourceLayoutDirectory, "package.json"));
32
+ return sourceLayoutDirectory;
33
+ }
34
+ catch (error) {
35
+ if (!errorHasCode(error, "ENOENT"))
36
+ throw error;
37
+ return path.dirname(sourceLayoutDirectory);
38
+ }
39
+ }
40
+ /**
41
+ * Removes an invocation-owned shim asynchronously.
42
+ * @param {object} args - Cleanup ownership.
43
+ * @param {string} args.markerPath - Marker file path.
44
+ * @param {string} args.packageDirectory - Synthetic package directory.
45
+ * @param {string} args.token - Invocation ownership token.
46
+ * @returns {Promise<void>} - Resolves after owned cleanup.
47
+ */
48
+ async function cleanupOwnedShim({ markerPath, packageDirectory, token }) {
49
+ let marker;
50
+ try {
51
+ marker = await fs.readFile(markerPath, "utf8");
52
+ }
53
+ catch (error) {
54
+ if (errorHasCode(error, "ENOENT"))
55
+ return;
56
+ throw error;
57
+ }
58
+ if (marker !== `${token}\n`)
59
+ return;
60
+ await fs.rm(packageDirectory, { recursive: true, force: true });
61
+ }
62
+ /**
63
+ * Removes an invocation-owned shim during process exit.
64
+ * @param {object} args - Cleanup ownership.
65
+ * @param {string} args.markerPath - Marker file path.
66
+ * @param {string} args.packageDirectory - Synthetic package directory.
67
+ * @param {string} args.token - Invocation ownership token.
68
+ * @returns {void} - No return value.
69
+ */
70
+ function cleanupOwnedShimSync({ markerPath, packageDirectory, token }) {
71
+ let marker;
72
+ try {
73
+ marker = fsSync.readFileSync(markerPath, "utf8");
74
+ }
75
+ catch (error) {
76
+ if (errorHasCode(error, "ENOENT"))
77
+ return;
78
+ throw error;
79
+ }
80
+ if (marker !== `${token}\n`)
81
+ return;
82
+ fsSync.rmSync(packageDirectory, { recursive: true, force: true });
83
+ }
84
+ /**
85
+ * Exposes this checkout to published peer packages without loading duplicate
86
+ * classes from generated build output.
87
+ * @param {string} [projectDirectory] - Velocious source checkout.
88
+ * @returns {Promise<SourcePeerPackage>} - Invocation-owned shim handle.
89
+ */
90
+ async function prepareSourcePeerPackage(projectDirectory) {
91
+ const resolvedProjectDirectory = projectDirectory ?? await frameworkPackageDirectory();
92
+ const nodeModulesDirectory = path.join(resolvedProjectDirectory, "node_modules");
93
+ const packageDirectory = path.join(nodeModulesDirectory, "velocious");
94
+ await fs.mkdir(nodeModulesDirectory, { recursive: true });
95
+ try {
96
+ await fs.mkdir(packageDirectory);
97
+ }
98
+ catch (error) {
99
+ if (!errorHasCode(error, "EEXIST"))
100
+ throw error;
101
+ return {
102
+ cleanup: async () => { },
103
+ created: false,
104
+ packageDirectory
105
+ };
106
+ }
107
+ const token = randomUUID();
108
+ const markerPath = path.join(packageDirectory, SOURCE_PEER_SHIM_MARKER_FILE);
109
+ const cleanupOnExit = () => cleanupOwnedShimSync({ markerPath, packageDirectory, token });
110
+ let cleanupPromise;
111
+ const cleanup = () => {
112
+ cleanupPromise ??= cleanupOwnedShim({ markerPath, packageDirectory, token })
113
+ .then(() => process.removeListener("exit", cleanupOnExit));
114
+ return cleanupPromise;
115
+ };
116
+ try {
117
+ const buildDirectory = path.join(packageDirectory, "build");
118
+ await fs.writeFile(markerPath, `${token}\n`, { encoding: "utf8", flag: "wx" });
119
+ process.once("exit", cleanupOnExit);
120
+ await fs.mkdir(buildDirectory);
121
+ await fs.writeFile(path.join(packageDirectory, "package.json"), `${JSON.stringify({ name: "velocious", private: true, type: "module" }, null, 2)}\n`, "utf8");
122
+ await fs.symlink(path.join(resolvedProjectDirectory, "src"), path.join(buildDirectory, "src"), process.platform === "win32" ? "junction" : "dir");
123
+ }
124
+ catch (error) {
125
+ process.removeListener("exit", cleanupOnExit);
126
+ await fs.rm(packageDirectory, { recursive: true, force: true });
127
+ throw error;
128
+ }
129
+ return { cleanup, created: true, packageDirectory };
130
+ }
131
+ /**
132
+ * Runs work while the source peer package is available.
133
+ * @template Result
134
+ * @param {string} projectDirectory - Velocious source checkout.
135
+ * @param {() => Promise<Result>} callback - Work requiring source peer resolution.
136
+ * @returns {Promise<Result>} - Callback result.
137
+ */
138
+ async function withSourcePeerPackage(projectDirectory, callback) {
139
+ const sourcePeerPackage = await prepareSourcePeerPackage(projectDirectory);
140
+ try {
141
+ return await callback();
142
+ }
143
+ finally {
144
+ await sourcePeerPackage.cleanup();
145
+ }
146
+ }
147
+ export { SOURCE_PEER_SHIM_MARKER_FILE, frameworkPackageDirectory, prepareSourcePeerPackage, withSourcePeerPackage };
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlLXBlZXItcGFja2FnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9lbnZpcm9ubWVudC1oYW5kbGVycy9ub2RlL3NvdXJjZS1wZWVyLXBhY2thZ2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGFBQWEsQ0FBQTtBQUN0QyxPQUFPLE1BQU0sTUFBTSxTQUFTLENBQUE7QUFDNUIsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDakMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxVQUFVLENBQUE7QUFFdEM7Ozs7OztHQU1HO0FBRUgsTUFBTSw0QkFBNEIsR0FBRyw2QkFBNkIsQ0FBQTtBQUVsRTs7Ozs7R0FLRztBQUNILFNBQVMsWUFBWSxDQUFDLEtBQUssRUFBRSxJQUFJO0lBQy9CLE9BQU8sS0FBSyxZQUFZLEtBQUssSUFBSSxNQUFNLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFBO0FBQ3pFLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxLQUFLLFVBQVUseUJBQXlCO0lBQ3RDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUNwRSxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFFN0UsSUFBSSxDQUFDO1FBQ0gsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQTtRQUVqRSxPQUFPLHFCQUFxQixDQUFBO0lBQzlCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFD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LENBQUMsUUFBUSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQ2xELENBQUE7SUFDSCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE9BQU8sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFBO1FBQzdDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7UUFDN0QsTUFBTSxLQUFLLENBQUE7SUFDYixDQUFDO0lBRUQsT0FBTyxFQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFDLENBQUE7QUFDbkQsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILEtBQUssVUFBVSxxQkFBcUIsQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRO0lBQzdELE1BQU0saUJBQWlCLEdBQUcsTUFBTSx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO0lBRTFFLElBQUksQ0FBQztRQUNILE9BQU8sTUFBTSxRQUFRLEVBQUUsQ0FBQTtJQUN6QixDQUFDO1lBQVMsQ0FBQztRQUNULE1BQU0saUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDbkMsQ0FBQztBQUNILENBQUM7QUFFRCxPQUFPLEVBQUMsNEJBQTRCLEVBQUUseUJBQXlCLEVBQUUsd0JBQXdCLEVBQUUscUJBQXFCLEVBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7cmFuZG9tVVVJRH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCJcbmltcG9ydCBmc1N5bmMgZnJvbSBcIm5vZGU6ZnNcIlxuaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHtmaWxlVVJMVG9QYXRofSBmcm9tIFwibm9kZTp1cmxcIlxuXG4vKipcbiAqIEludm9jYXRpb24tb3duZWQgc291cmNlIHBlZXIgcGFja2FnZSBzaGltLlxuICogQHR5cGVkZWYge29iamVjdH0gU291cmNlUGVlclBhY2thZ2VcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gY2xlYW51cCAtIFJlbW92ZXMgb25seSB0aGlzIGludm9jYXRpb24ncyBzaGltLlxuICogQHByb3BlcnR5IHtib29sZWFufSBjcmVhdGVkIC0gV2hldGhlciB0aGlzIGludm9jYXRpb24gY3JlYXRlZCB0aGUgc2hpbS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYWNrYWdlRGlyZWN0b3J5IC0gUGFja2FnZSBwYXRoIHVzZWQgZm9yIHBlZXIgcmVzb2x1dGlvbi5cbiAqL1xuXG5jb25zdCBTT1VSQ0VfUEVFUl9TSElNX01BUktFUl9GSUxFID0gXCIudmVsb2Npb3VzLXNvdXJjZS1wZWVyLXNoaW1cIlxuXG4vKipcbiAqIENoZWNrcyBhIGZpbGVzeXN0ZW0gZXJyb3IgY29kZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgLSBGaWxlc3lzdGVtIGVycm9yLlxuICogQHBhcmFtIHtzdHJpbmd9IGNvZGUgLSBFeHBlY3RlZCBOb2RlIGVycm9yIGNvZGUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBlcnJvciBoYXMgdGhlIGV4cGVjdGVkIGNvZGUuXG4gKi9cbmZ1bmN0aW9uIGVycm9ySGFzQ29kZShlcnJvciwgY29kZSkge1xuICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBcImNvZGVcIiBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSBjb2RlXG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIFZlbG9jaW91cyBwYWNrYWdlIGRpcmVjdG9yeSBmcm9tIHNvdXJjZSBvciBjb21waWxlZCBleGVjdXRpb24uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIFZlbG9jaW91cyBwYWNrYWdlIGRpcmVjdG9yeS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZnJhbWV3b3JrUGFja2FnZURpcmVjdG9yeSgpIHtcbiAgY29uc3QgaGVscGVyRGlyZWN0b3J5ID0gcGF0aC5kaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSlcbiAgY29uc3Qgc291cmNlTGF5b3V0RGlyZWN0b3J5ID0gcGF0aC5yZXNvbHZlKGhlbHBlckRpcmVjdG9yeSwgXCIuLlwiLCBcIi4uXCIsIFwiLi5cIilcblxuICB0cnkge1xuICAgIGF3YWl0IGZzLmFjY2VzcyhwYXRoLmpvaW4oc291cmNlTGF5b3V0RGlyZWN0b3J5LCBcInBhY2thZ2UuanNvblwiKSlcblxuICAgIHJldHVybiBzb3VyY2VMYXlvdXREaXJlY3RvcnlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoIWVycm9ySGFzQ29kZShlcnJvciwgXCJFTk9FTlRcIikpIHRocm93IGVycm9yXG5cbiAgICByZXR1cm4gcGF0aC5kaXJuYW1lKHNvdXJjZUxheW91dERpcmVjdG9yeSlcbiAgfVxufVxuXG4vKipcbiAqIFJlbW92ZXMgYW4gaW52b2NhdGlvbi1vd25lZCBzaGltIGFzeW5jaHJvbm91c2x5LlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBDbGVhbnVwIG93bmVyc2hpcC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm1hcmtlclBhdGggLSBNYXJrZXIgZmlsZSBwYXRoLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucGFja2FnZURpcmVjdG9yeSAtIFN5bnRoZXRpYyBwYWNrYWdlIGRpcmVjdG9yeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnRva2VuIC0gSW52b2NhdGlvbiBvd25lcnNoaXAgdG9rZW4uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyBhZnRlciBvd25lZCBjbGVhbnVwLlxuICovXG5hc3luYyBmdW5jdGlvbiBjbGVhbnVwT3duZWRTaGltKHttYXJrZXJQYXRoLCBwYWNrYWdlRGlyZWN0b3J5LCB0b2tlbn0pIHtcbiAgbGV0IG1hcmtlclxuXG4gIHRyeSB7XG4gICAgbWFya2VyID0gYXdhaXQgZnMucmVhZEZpbGUobWFya2VyUGF0aCwgXCJ1dGY4XCIpXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9ySGFzQ29kZShlcnJvciwgXCJFTk9FTlRcIikpIHJldHVyblxuXG4gICAgdGhyb3cgZXJyb3JcbiAgfVxuXG4gIGlmIChtYXJrZXIgIT09IGAke3Rva2VufVxcbmApIHJldHVyblxuXG4gIGF3YWl0IGZzLnJtKHBhY2thZ2VEaXJlY3RvcnksIHtyZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlfSlcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGFuIGludm9jYXRpb24tb3duZWQgc2hpbSBkdXJpbmcgcHJvY2VzcyBleGl0LlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBDbGVhbnVwIG93bmVyc2hpcC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm1hcmtlclBhdGggLSBNYXJrZXIgZmlsZSBwYXRoLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucGFja2FnZURpcmVjdG9yeSAtIFN5bnRoZXRpYyBwYWNrYWdlIGRpcmVjdG9yeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnRva2VuIC0gSW52b2NhdGlvbiBvd25lcnNoaXAgdG9rZW4uXG4gKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGNsZWFudXBPd25lZFNoaW1TeW5jKHttYXJrZXJQYXRoLCBwYWNrYWdlRGlyZWN0b3J5LCB0b2tlbn0pIHtcbiAgbGV0IG1hcmtlclxuXG4gIHRyeSB7XG4gICAgbWFya2VyID0gZnNTeW5jLnJlYWRGaWxlU3luYyhtYXJrZXJQYXRoLCBcInV0ZjhcIilcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3JIYXNDb2RlKGVycm9yLCBcIkVOT0VOVFwiKSkgcmV0dXJuXG5cbiAgICB0aHJvdyBlcnJvclxuICB9XG5cbiAgaWYgKG1hcmtlciAhPT0gYCR7dG9rZW59XFxuYCkgcmV0dXJuXG5cbiAgZnNTeW5jLnJtU3luYyhwYWNrYWdlRGlyZWN0b3J5LCB7cmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZX0pXG59XG5cbi8qKlxuICogRXhwb3NlcyB0aGlzIGNoZWNrb3V0IHRvIHB1Ymxpc2hlZCBwZWVyIHBhY2thZ2VzIHdpdGhvdXQgbG9hZGluZyBkdXBsaWNhdGVcbiAqIGNsYXNzZXMgZnJvbSBnZW5lcmF0ZWQgYnVpbGQgb3V0cHV0LlxuICogQHBhcmFtIHtzdHJpbmd9IFtwcm9qZWN0RGlyZWN0b3J5XSAtIFZlbG9jaW91cyBzb3VyY2UgY2hlY2tvdXQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxTb3VyY2VQZWVyUGFja2FnZT59IC0gSW52b2NhdGlvbi1vd25lZCBzaGltIGhhbmRsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJlcGFyZVNvdXJjZVBlZXJQYWNrYWdlKHByb2plY3REaXJlY3RvcnkpIHtcbiAgY29uc3QgcmVzb2x2ZWRQcm9qZWN0RGlyZWN0b3J5ID0gcHJvamVjdERpcmVjdG9yeSA/PyBhd2FpdCBmcmFtZXdvcmtQYWNrYWdlRGlyZWN0b3J5KClcbiAgY29uc3Qgbm9kZU1vZHVsZXNEaXJlY3RvcnkgPSBwYXRoLmpvaW4ocmVzb2x2ZWRQcm9qZWN0RGlyZWN0b3J5LCBcIm5vZGVfbW9kdWxlc1wiKVxuICBjb25zdCBwYWNrYWdlRGlyZWN0b3J5ID0gcGF0aC5qb2luKG5vZGVNb2R1bGVzRGlyZWN0b3J5LCBcInZlbG9jaW91c1wiKVxuXG4gIGF3YWl0IGZzLm1rZGlyKG5vZGVNb2R1bGVzRGlyZWN0b3J5LCB7cmVjdXJzaXZlOiB0cnVlfSlcblxuICB0cnkge1xuICAgIGF3YWl0IGZzLm1rZGlyKHBhY2thZ2VEaXJlY3RvcnkpXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCFlcnJvckhhc0NvZGUoZXJyb3IsIFwiRUVYSVNUXCIpKSB0aHJvdyBlcnJvclxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNsZWFudXA6IGFzeW5jICgpID0+IHt9LFxuICAgICAgY3JlYXRlZDogZmFsc2UsXG4gICAgICBwYWNrYWdlRGlyZWN0b3J5XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdG9rZW4gPSByYW5kb21VVUlEKClcbiAgY29uc3QgbWFya2VyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyZWN0b3J5LCBTT1VSQ0VfUEVFUl9TSElNX01BUktFUl9GSUxFKVxuICBjb25zdCBjbGVhbnVwT25FeGl0ID0gKCkgPT4gY2xlYW51cE93bmVkU2hpbVN5bmMoe21hcmtlclBhdGgsIHBhY2thZ2VEaXJlY3RvcnksIHRva2VufSlcbiAgbGV0IGNsZWFudXBQcm9taXNlXG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgY2xlYW51cFByb21pc2UgPz89IGNsZWFudXBPd25lZFNoaW0oe21hcmtlclBhdGgsIHBhY2thZ2VEaXJlY3RvcnksIHRva2VufSlcbiAgICAgIC50aGVuKCgpID0+IHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoXCJleGl0XCIsIGNsZWFudXBPbkV4aXQpKVxuXG4gICAgcmV0dXJuIGNsZWFudXBQcm9taXNlXG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGJ1aWxkRGlyZWN0b3J5ID0gcGF0aC5qb2luKHBhY2thZ2VEaXJlY3RvcnksIFwiYnVpbGRcIilcblxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShtYXJrZXJQYXRoLCBgJHt0b2tlbn1cXG5gLCB7ZW5jb2Rpbmc6IFwidXRmOFwiLCBmbGFnOiBcInd4XCJ9KVxuICAgIHByb2Nlc3Mub25jZShcImV4aXRcIiwgY2xlYW51cE9uRXhpdClcbiAgICBhd2FpdCBmcy5ta2RpcihidWlsZERpcmVjdG9yeSlcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoXG4gICAgICBwYXRoLmpvaW4ocGFja2FnZURpcmVjdG9yeSwgXCJwYWNrYWdlLmpzb25cIiksXG4gICAgICBgJHtKU09OLnN0cmluZ2lmeSh7bmFtZTogXCJ2ZWxvY2lvdXNcIiwgcHJpdmF0ZTogdHJ1ZSwgdHlwZTogXCJtb2R1bGVcIn0sIG51bGwsIDIpfVxcbmAsXG4gICAgICBcInV0ZjhcIlxuICAgIClcbiAgICBhd2FpdCBmcy5zeW1saW5rKFxuICAgICAgcGF0aC5qb2luKHJlc29sdmVkUHJvamVjdERpcmVjdG9yeSwgXCJzcmNcIiksXG4gICAgICBwYXRoLmpvaW4oYnVpbGREaXJlY3RvcnksIFwic3JjXCIpLFxuICAgICAgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiID8gXCJqdW5jdGlvblwiIDogXCJkaXJcIlxuICAgIClcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKFwiZXhpdFwiLCBjbGVhbnVwT25FeGl0KVxuICAgIGF3YWl0IGZzLnJtKHBhY2thZ2VEaXJlY3RvcnksIHtyZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlfSlcbiAgICB0aHJvdyBlcnJvclxuICB9XG5cbiAgcmV0dXJuIHtjbGVhbnVwLCBjcmVhdGVkOiB0cnVlLCBwYWNrYWdlRGlyZWN0b3J5fVxufVxuXG4vKipcbiAqIFJ1bnMgd29yayB3aGlsZSB0aGUgc291cmNlIHBlZXIgcGFja2FnZSBpcyBhdmFpbGFibGUuXG4gKiBAdGVtcGxhdGUgUmVzdWx0XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvamVjdERpcmVjdG9yeSAtIFZlbG9jaW91cyBzb3VyY2UgY2hlY2tvdXQuXG4gKiBAcGFyYW0geygpID0+IFByb21pc2U8UmVzdWx0Pn0gY2FsbGJhY2sgLSBXb3JrIHJlcXVpcmluZyBzb3VyY2UgcGVlciByZXNvbHV0aW9uLlxuICogQHJldHVybnMge1Byb21pc2U8UmVzdWx0Pn0gLSBDYWxsYmFjayByZXN1bHQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdpdGhTb3VyY2VQZWVyUGFja2FnZShwcm9qZWN0RGlyZWN0b3J5LCBjYWxsYmFjaykge1xuICBjb25zdCBzb3VyY2VQZWVyUGFja2FnZSA9IGF3YWl0IHByZXBhcmVTb3VyY2VQZWVyUGFja2FnZShwcm9qZWN0RGlyZWN0b3J5KVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBzb3VyY2VQZWVyUGFja2FnZS5jbGVhbnVwKClcbiAgfVxufVxuXG5leHBvcnQge1NPVVJDRV9QRUVSX1NISU1fTUFSS0VSX0ZJTEUsIGZyYW1ld29ya1BhY2thZ2VEaXJlY3RvcnksIHByZXBhcmVTb3VyY2VQZWVyUGFja2FnZSwgd2l0aFNvdXJjZVBlZXJQYWNrYWdlfVxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/routes/resolver.js"],"names":[],"mappings":"AAqDA;IAME;;;;;;OAMG;IACH,kDAJG;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO;QACmF,OAAO,EAA/H,OAAO,kCAAkC,EAAE,OAAO,GAAG,OAAO,4CAA4C,EAAE,OAAO;QACvD,QAAQ,EAAlE,OAAO,mCAAmC,EAAE,OAAO;KAC7D,EAcA;IAzBD;;oCAEgC;IAChC,QADU,MAAM,GAAG,SAAS,CACtB;IAcJ,qDAAkC;IAGlC;;MAAgC;IAGhC,2HAAsB;IACtB,8DAAwB;IAG1B;;;OAGG;IACH,mBAFa,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoBlC;IAED,yBAkKC;IAjKC,gFAAyC;IAmK3C;;;;;OAKG;IACH,2CAHG;QAAqB,cAAc,EAA3B,MAAM;KACd,GAAU,OAAO,CAAC,cAAc,kBAAkB,EAAE,OAAO,CAAC,CAsB9D;IAED;;;;;OAKG;IACH,2BAJW,OAAO,iBAAiB,EAAE,OAAO,QACjC,MAAM,GACJ;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,GAAG,SAAS,CAiC1C;IAED;;;;;;OAMG;IACH,uCALW,MAAM,YAEd;QAA0B,sBAAsB;KAChD,GAAU,OAAO,CAAC,OAAO,2BAA2B,EAAE,uBAAuB,GAAG,IAAI,CAAC,CAgEvF;IAED;;;;;;;OAOG;IACH,wDALG;QAAqB,MAAM,EAAnB,MAAM;QAC0C,eAAe,EAA/D,cAAc,kBAAkB,EAAE,OAAO;QAClB,SAAS,EAAhC,OAAO,GAAG,MAAM;KACxB,GAAU,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED;;;OAGG;IACH,cAFa,OAAO,GAAG,MAAM,CAI5B;IAED;;;;;OAKG;IACH,mBAJa,CAAC,YACH,MAAM,OAAO,CAAC,CAAC,CAAC,GACd,OAAO,CAAC,CAAC,CAAC,CAQtB;IAED;;;;;;OAMG;IACH,yDAJG;QAAwD,eAAe,EAA/D,cAAc,kBAAkB,EAAE,OAAO;QAClB,SAAS,EAAhC,OAAO,GAAG,MAAM;KACxB,GAAU,IAAI,CAShB;IAED;;;;OAIG;IACH,uBAHW,IAAI,GACF,MAAM,CAsBlB;IAED;;;;OAIG;IACH,iCAHW,OAAC,GACC,OAAC,CA6Bb;CACF;mBA1gBkB,cAAc"}
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/routes/resolver.js"],"names":[],"mappings":"AAoBA;IAME;;;;;;OAMG;IACH,kDAJG;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO;QACmF,OAAO,EAA/H,OAAO,kCAAkC,EAAE,OAAO,GAAG,OAAO,4CAA4C,EAAE,OAAO;QACvD,QAAQ,EAAlE,OAAO,mCAAmC,EAAE,OAAO;KAC7D,EAcA;IAzBD;;oCAEgC;IAChC,QADU,MAAM,GAAG,SAAS,CACtB;IAcJ,qDAAkC;IAGlC;;MAAgC;IAGhC,2HAAsB;IACtB,8DAAwB;IAG1B;;;OAGG;IACH,mBAFa,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoBlC;IAED,yBAkKC;IAjKC,gFAAyC;IAmK3C;;;;;OAKG;IACH,2CAHG;QAAqB,cAAc,EAA3B,MAAM;KACd,GAAU,OAAO,CAAC,cAAc,kBAAkB,EAAE,OAAO,CAAC,CAQ9D;IAED;;;;;OAKG;IACH,2BAJW,OAAO,iBAAiB,EAAE,OAAO,QACjC,MAAM,GACJ;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,GAAG,SAAS,CAiC1C;IAED;;;;;;OAMG;IACH,uCALW,MAAM,YAEd;QAA0B,sBAAsB;KAChD,GAAU,OAAO,CAAC,OAAO,2BAA2B,EAAE,uBAAuB,GAAG,IAAI,CAAC,CAgEvF;IAED;;;;;;;OAOG;IACH,wDALG;QAAqB,MAAM,EAAnB,MAAM;QAC0C,eAAe,EAA/D,cAAc,kBAAkB,EAAE,OAAO;QAClB,SAAS,EAAhC,OAAO,GAAG,MAAM;KACxB,GAAU,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED;;;OAGG;IACH,cAFa,OAAO,GAAG,MAAM,CAI5B;IAED;;;;;OAKG;IACH,mBAJa,CAAC,YACH,MAAM,OAAO,CAAC,CAAC,CAAC,GACd,OAAO,CAAC,CAAC,CAAC,CAQtB;IAED;;;;;;OAMG;IACH,yDAJG;QAAwD,eAAe,EAA/D,cAAc,kBAAkB,EAAE,OAAO;QAClB,SAAS,EAAhC,OAAO,GAAG,MAAM;KACxB,GAAU,IAAI,CAShB;IAED;;;;OAIG;IACH,uBAHW,IAAI,GACF,MAAM,CAsBlB;IAED;;;;OAIG;IACH,iCAHW,OAAC,GACC,OAAC,CA6Bb;CACF;mBA3dkB,cAAc"}
@@ -15,34 +15,6 @@ import toImportSpecifier from "../utils/to-import-specifier.js";
15
15
  function normalizeActionName(actionName) {
16
16
  return inflection.camelize(actionName.replaceAll("-", "_").replaceAll("/", "_"), true);
17
17
  }
18
- /**
19
- * Runs missing module specifier from error.
20
- * @param {Error} error - Import error.
21
- * @returns {string | undefined} - Missing module specifier from an ERR_MODULE_NOT_FOUND message.
22
- */
23
- function missingModuleSpecifierFromError(error) {
24
- const firstLine = error.message.split("\n")[0] || "";
25
- const match = firstLine.match(/^Cannot find (?:module|package) ['"](.+?)['"] imported from /);
26
- return match?.[1];
27
- }
28
- /**
29
- * Runs is missing target module error.
30
- * @param {object} args - Arguments.
31
- * @param {Error} args.error - Import error.
32
- * @param {string} args.targetPath - Target controller path.
33
- * @param {string} args.targetImportSpecifier - Target controller import specifier.
34
- * @returns {boolean} - True when the missing module is the target controller file.
35
- */
36
- function isMissingTargetModuleError({ error, targetPath, targetImportSpecifier }) {
37
- const ensuredError = ensureError(error);
38
- const isModuleNotFoundError = "code" in ensuredError && ensuredError.code === "ERR_MODULE_NOT_FOUND";
39
- if (!isModuleNotFoundError)
40
- return false;
41
- const missingSpecifier = missingModuleSpecifierFromError(ensuredError);
42
- if (!missingSpecifier)
43
- return false;
44
- return missingSpecifier === targetPath || missingSpecifier === targetImportSpecifier;
45
- }
46
18
  export default class VelociousRoutesResolver {
47
19
  /**
48
20
  * Narrows the runtime value to the documented type.
@@ -243,23 +215,10 @@ export default class VelociousRoutesResolver {
243
215
  * @returns {Promise<typeof import("../controller.js").default>} - The resolved controller class.
244
216
  */
245
217
  async resolveControllerClass({ controllerPath }) {
218
+ if (this.routeHookControllerClass)
219
+ return this.routeHookControllerClass;
246
220
  const controllerImportSpecifier = toImportSpecifier(controllerPath);
247
- if (!this.routeHookControllerClass) {
248
- return /** @type {typeof import("../controller.js").default} */ ((await import(controllerImportSpecifier)).default);
249
- }
250
- try {
251
- return /** @type {typeof import("../controller.js").default} */ ((await import(controllerImportSpecifier)).default);
252
- }
253
- catch (error) {
254
- const isMissingControllerFileError = isMissingTargetModuleError({
255
- error: ensureError(error),
256
- targetImportSpecifier: controllerImportSpecifier,
257
- targetPath: controllerPath
258
- });
259
- if (!isMissingControllerFileError)
260
- throw ensureError(error);
261
- return /** @type {typeof import("../controller.js").default} */ (this.routeHookControllerClass);
262
- }
221
+ return /** @type {typeof import("../controller.js").default} */ ((await import(controllerImportSpecifier)).default);
263
222
  }
264
223
  /**
265
224
  * Runs match path with routes.
@@ -455,4 +414,4 @@ export default class VelociousRoutesResolver {
455
414
  return value;
456
415
  }
457
416
  }
458
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGVzL3Jlc29sdmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxLQUFLLENBQUE7QUFDakMsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzVCLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxTQUFTLENBQUE7QUFDbkMsT0FBTyxNQUFNLE1BQU0sY0FBYyxDQUFBO0FBQ2pDLE9BQU8sWUFBWSxNQUFNLHNEQUFzRCxDQUFBO0FBQy9FLE9BQU8saUJBQWlCLE1BQU0saUNBQWlDLENBQUE7QUFFL0Q7Ozs7R0FJRztBQUNILFNBQVMsbUJBQW1CLENBQUMsVUFBVTtJQUNyQyxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUN4RixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsK0JBQStCLENBQUMsS0FBSztJQUM1QyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDcEQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyw4REFBOEQsQ0FBQyxDQUFBO0lBRTdGLE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDbkIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLDBCQUEwQixDQUFDLEVBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxx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QUFJLFVBQVUsR0FBRyxXQUFXLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQTtJQUN0SCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILHlCQUF5QixDQUFDLEtBQUs7UUFDN0IsSUFBSSxLQUFLLFlBQVksWUFBWSxFQUFFLENBQUM7WUFDbEMsT0FBTztnQkFDTCxTQUFTLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJO2dCQUNqQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRTtnQkFDMUIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUU7YUFDbkIsQ0FBQTtRQUNILENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ2xFLENBQUM7UUFFRCxJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN2Qzs7MkNBRStCO1lBQy9CLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQTtZQUVqQixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtZQUMxRCxDQUFDO1lBRUQsT0FBTyxNQUFNLENBQUE7UUFDZixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtkaXJuYW1lfSBmcm9tIFwicGF0aFwiXG5pbXBvcnQge2ZpbGVVUkxUb1BhdGh9IGZyb20gXCJ1cmxcIlxuaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCB7ZW5zdXJlRXJyb3J9IGZyb20gXCJ0eXBhbmljXCJcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgVXBsb2FkZWRGaWxlIGZyb20gXCIuLi9odHRwLXNlcnZlci9jbGllbnQvdXBsb2FkZWQtZmlsZS91cGxvYWRlZC1maWxlLmpzXCJcbmltcG9ydCB0b0ltcG9ydFNwZWNpZmllciBmcm9tIFwiLi4vdXRpbHMvdG8taW1wb3J0LXNwZWNpZmllci5qc1wiXG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgYWN0aW9uIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uTmFtZSAtIFJhdyBhY3Rpb24gbmFtZSBmcm9tIHJvdXRlIHBhcmFtcyBvciByb3V0ZSBob29rLlxuICogQHJldHVybnMge3N0cmluZ30gLSBOb3JtYWxpemVkIGNvbnRyb2xsZXIgbWV0aG9kIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFjdGlvbk5hbWUoYWN0aW9uTmFtZSkge1xuICByZXR1cm4gaW5mbGVjdGlvbi5jYW1lbGl6ZShhY3Rpb25OYW1lLnJlcGxhY2VBbGwoXCItXCIsIFwiX1wiKS5yZXBsYWNlQWxsKFwiL1wiLCBcIl9cIiksIHRydWUpXG59XG5cbi8qKlxuICogUnVucyBtaXNzaW5nIG1vZHVsZSBzcGVjaWZpZXIgZnJvbSBlcnJvci5cbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gSW1wb3J0IGVycm9yLlxuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBNaXNzaW5nIG1vZHVsZSBzcGVjaWZpZXIgZnJvbSBhbiBFUlJfTU9EVUxFX05PVF9GT1VORCBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBtaXNzaW5nTW9kdWxlU3BlY2lmaWVyRnJvbUVycm9yKGVycm9yKSB7XG4gIGNvbnN0IGZpcnN0TGluZSA9IGVycm9yLm1lc3NhZ2Uuc3BsaXQoXCJcXG5cIilbMF0gfHwgXCJcIlxuICBjb25zdCBtYXRjaCA9IGZpcnN0TGluZS5tYXRjaCgvXkNhbm5vdCBmaW5kICg/Om1vZHVsZXxwYWNrYWdlKSBbJ1wiXSguKz8pWydcIl0gaW1wb3J0ZWQgZnJvbSAvKVxuXG4gIHJldHVybiBtYXRjaD8uWzFdXG59XG5cbi8qKlxuICogUnVucyBpcyBtaXNzaW5nIHRhcmdldCBtb2R1bGUgZXJyb3IuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7RXJyb3J9IGFyZ3MuZXJyb3IgLSBJbXBvcnQgZXJyb3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy50YXJnZXRQYXRoIC0gVGFyZ2V0IGNvbnRyb2xsZXIgcGF0aC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnRhcmdldEltcG9ydFNwZWNpZmllciAtIFRhcmdldCBjb250cm9sbGVyIGltcG9ydCBzcGVjaWZpZXIuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUcnVlIHdoZW4gdGhlIG1pc3NpbmcgbW9kdWxlIGlzIHRoZSB0YXJnZXQgY29udHJvbGxlciBmaWxlLlxuICovXG5mdW5jdGlvbiBpc01pc3NpbmdUYXJnZXRNb2R1bGVFcnJvcih7ZXJyb3IsIHRhcmdldFBhdGgsIHRhcmdldEltcG9ydFNwZWNpZmllcn0pIHtcbiAgY29uc3QgZW5zdXJlZEVycm9yID0gZW5zdXJlRXJyb3IoZXJyb3IpXG4gIGNvbnN0IGlzTW9kdWxlTm90Rm91bmRFcnJvciA9IFwiY29kZVwiIGluIGVuc3VyZWRFcnJvciAmJiBlbnN1cmVkRXJyb3IuY29kZSA9PT0gXCJFUlJfTU9EVUxFX05PVF9GT1VORFwiXG5cbiAgaWYgKCFpc01vZHVsZU5vdEZvdW5kRXJyb3IpIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IG1pc3NpbmdTcGVjaWZpZXIgPSBtaXNzaW5nTW9kdWxlU3BlY2lmaWVyRnJvbUVycm9yKGVuc3VyZWRFcnJvcilcblxuICBpZiAoIW1pc3NpbmdTcGVjaWZpZXIpIHJldHVybiBmYWxzZVxuXG4gIHJldHVybiBtaXNzaW5nU3BlY2lmaWVyID09PSB0YXJnZXRQYXRoIHx8IG1pc3NpbmdTcGVjaWZpZXIgPT09IHRhcmdldEltcG9ydFNwZWNpZmllclxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNSb3V0ZXNSZXNvbHZlciB7XG4gIC8qKlxuICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAqIEB0eXBlIHtMb2dnZXIgfCB1bmRlZmluZWR9ICovXG4gIGxvZ2dlclxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1yZXF1ZXN0LmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVxdWVzdCAtIFJlcXVlc3Qgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2h0dHAtc2VydmVyL2NsaWVudC9yZXNwb25zZS5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlc3BvbnNlIC0gUmVzcG9uc2Ugb2JqZWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIHJlcXVlc3QsIHJlc3BvbnNlfSkge1xuICAgIGlmICghY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiTm8gY29uZmlndXJhdGlvbiBnaXZlblwiKVxuICAgIGlmICghcmVxdWVzdCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVxdWVzdCBnaXZlblwiKVxuICAgIGlmICghcmVzcG9uc2UpIHRocm93IG5ldyBFcnJvcihcIk5vIHJlc3BvbnNlIGdpdmVuXCIpXG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKFwiUm91dGVzUmVzb2x2ZXJcIiwge2NvbmZpZ3VyYXRpb259KVxuICAgIGNvbnN0IHJlcXVlc3RQYXJhbXMgPSByZXF1ZXN0LnBhcmFtcygpIHx8IHt9XG4gICAgdGhpcy5wYXJhbXMgPSB7Li4ucmVxdWVzdFBhcmFtc31cbiAgICBkZWxldGUgdGhpcy5wYXJhbXMuYWN0aW9uXG4gICAgZGVsZXRlIHRoaXMucGFyYW1zLmNvbnRyb2xsZXJcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0XG4gICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBxdWVyeSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gLSBGbGF0IHF1ZXJ5IHBhcmFtcyBmb3IgdGVuYW50L2FiaWxpdHkgcmVzb2x1dGlvbi5cbiAgICovXG4gIHF1ZXJ5UGFyYW1ldGVycygpIHtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMucmVxdWVzdC5wYXRoKCkuc3BsaXQoXCI/XCIpWzFdXG5cbiAgICBpZiAoIXF1ZXJ5KSByZXR1cm4ge31cblxuICAgIC8qKlxuICAgICAqIFBhcmFtcy5cbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgICBjb25zdCBwYXJhbXMgPSB7fVxuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocXVlcnkpXG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBzZWFyY2hQYXJhbXMuZW50cmllcygpKSB7XG4gICAgICBpZiAocGFyYW1zW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYXJhbXNba2V5XSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtc1xuICB9XG5cbiAgYXN5bmMgcmVzb2x2ZSgpIHtcbiAgICB0aGlzLnJvdXRlSG9va0NvbnRyb2xsZXJDbGFzcyA9IHVuZGVmaW5lZFxuICAgIGxldCBjb250cm9sbGVyUGF0aFxuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb25Sb3V0ZXMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Um91dGVzKClcbiAgICBjb25zdCBjdXJyZW50Um91dGUgPSBjb25maWd1cmF0aW9uUm91dGVzPy5yb290Um91dGVcbiAgICBjb25zdCByYXdQYXRoID0gdGhpcy5yZXF1ZXN0LnBhdGgoKVxuICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gcmF3UGF0aC5zcGxpdChcIj9cIilbMF1cbiAgICBsZXQgdmlld1BhdGhcblxuICAgIGNvbnN0IHByZUNoZWNrUGFyYW1zID0gey4uLnRoaXMucGFyYW1zfVxuICAgIGNvbnN0IGhhc01hdGNoaW5nQ3VzdG9tUm91dGUgPSBjdXJyZW50Um91dGUgPyAhIXRoaXMubWF0Y2hQYXRoV2l0aFJvdXRlcyhjdXJyZW50Um91dGUsIGN1cnJlbnRQYXRoKSA6IGZhbHNlXG5cbiAgICBpZiAoaGFzTWF0Y2hpbmdDdXN0b21Sb3V0ZSkge1xuICAgICAgdGhpcy5wYXJhbXMgPSBwcmVDaGVja1BhcmFtc1xuICAgIH1cblxuICAgIGNvbnN0IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2ggPSBhd2FpdCB0aGlzLnJlc29sdmVSb3V0ZVJlc29sdmVySG9va3MoY3VycmVudFBhdGgsIHtoYXNNYXRjaGluZ0N1c3RvbVJvdXRlfSlcbiAgICBsZXQgc2tpcENvbnRyb2xsZXJDb25uZWN0aW9ucyA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2g/LnNraXBDb250cm9sbGVyQ29ubmVjdGlvbnMgPT09IHRydWVcbiAgICBsZXQgc2tpcEFiaWxpdHlSZXNvbHV0aW9uID0gcm91dGVSZXNvbHZlckhvb2tNYXRjaD8uc2tpcEFiaWxpdHlSZXNvbHV0aW9uID09PSB0cnVlXG4gICAgbGV0IHNraXBUZW5hbnRSZXNvbHV0aW9uID0gcm91dGVSZXNvbHZlckhvb2tNYXRjaD8uc2tpcFRlbmFudFJlc29sdXRpb24gPT09IHRydWVcbiAgICBjb25zdCBtYXRjaFJlc3VsdCA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2ggfHwgIWN1cnJlbnRSb3V0ZSA/IHVuZGVmaW5lZCA6IHRoaXMubWF0Y2hQYXRoV2l0aFJvdXRlcyhjdXJyZW50Um91dGUsIGN1cnJlbnRQYXRoKVxuICAgIGNvbnN0IGFjdGlvblBhcmFtID0gdGhpcy5wYXJhbXMuYWN0aW9uXG4gICAgY29uc3QgY29udHJvbGxlclBhcmFtID0gdGhpcy5wYXJhbXMuY29udHJvbGxlclxuICAgIGNvbnN0IGFjdGlvblZhbHVlID0gdHlwZW9mIGFjdGlvblBhcmFtID09IFwic3RyaW5nXCIgPyBhY3Rpb25QYXJhbSA6IChBcnJheS5pc0FycmF5KGFjdGlvblBhcmFtKSA/IGFjdGlvblBhcmFtWzBdIDogdW5kZWZpbmVkKVxuICAgIGxldCBhY3Rpb24gPSB0eXBlb2YgYWN0aW9uVmFsdWUgPT0gXCJzdHJpbmdcIiA/IG5vcm1hbGl6ZUFjdGlvbk5hbWUoYWN0aW9uVmFsdWUpIDogdW5kZWZpbmVkXG4gICAgbGV0IGNvbnRyb2xsZXIgPSB0eXBlb2YgY29udHJvbGxlclBhcmFtID09IFwic3RyaW5nXCIgPyBjb250cm9sbGVyUGFyYW0gOiAoQXJyYXkuaXNBcnJheShjb250cm9sbGVyUGFyYW0pID8gY29udHJvbGxlclBhcmFtWzBdIDogdW5kZWZpbmVkKVxuXG4gICAgaWYgKHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2gpIHtcbiAgICAgIGNvbnN0IHJvdXRlSG9va0NvbnRyb2xsZXJDbGFzcyA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2guY29udHJvbGxlckNsYXNzXG4gICAgICBsZXQgcm91dGVIb29rQ29udHJvbGxlclBhdGhcbiAgICAgIGxldCByb3V0ZUhvb2tWaWV3UGF0aFxuXG4gICAgICBpZiAodHlwZW9mIHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2guY29udHJvbGxlclBhdGggPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcm91dGVIb29rQ29udHJvbGxlclBhdGggPSByb3V0ZVJlc29sdmVySG9va01hdGNoLmNvbnRyb2xsZXJQYXRoXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygcm91dGVSZXNvbHZlckhvb2tNYXRjaC52aWV3UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByb3V0ZUhvb2tWaWV3UGF0aCA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2gudmlld1BhdGhcbiAgICAgIH1cblxuICAgICAgY29udHJvbGxlciA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2guY29udHJvbGxlclxuICAgICAgYWN0aW9uID0gbm9ybWFsaXplQWN0aW9uTmFtZShyb3V0ZVJlc29sdmVySG9va01hdGNoLmFjdGlvbilcbiAgICAgIHRoaXMucGFyYW1zLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyXG4gICAgICB0aGlzLnBhcmFtcy5hY3Rpb24gPSByb3V0ZVJlc29sdmVySG9va01hdGNoLmFjdGlvblxuICAgICAgY29udHJvbGxlclBhdGggPSByb3V0ZUhvb2tDb250cm9sbGVyUGF0aCB8fCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0b3J5KCl9L3NyYy9yb3V0ZXMvJHtjb250cm9sbGVyfS9jb250cm9sbGVyLmpzYFxuICAgICAgdmlld1BhdGggPSByb3V0ZUhvb2tWaWV3UGF0aCB8fCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0b3J5KCl9L3NyYy9yb3V0ZXMvJHtjb250cm9sbGVyfWBcbiAgICAgIHRoaXMucm91dGVIb29rQ29udHJvbGxlckNsYXNzID0gcm91dGVIb29rQ29udHJvbGxlckNsYXNzXG4gICAgfSBlbHNlIGlmICghbWF0Y2hSZXN1bHQpIHtcbiAgICAgIGNvbnN0IF9fZmlsZW5hbWUgPSBmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybClcbiAgICAgIGNvbnN0IF9fZGlybmFtZSA9IGRpcm5hbWUoX19maWxlbmFtZSlcbiAgICAgIGNvbnN0IHJlcXVlc3RlZFBhdGggPSBjdXJyZW50UGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIikgfHwgXCJfcm9vdFwiXG4gICAgICBjb25zdCBhdHRlbXB0ZWRDb250cm9sbGVyUGF0aCA9IGAke3RoaXMuY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL3JvdXRlcy8ke3JlcXVlc3RlZFBhdGh9L2NvbnRyb2xsZXIuanNgXG5cbiAgICAgIGNvbnN0IGxvZ2dlciA9IHRoaXMubG9nZ2VyXG5cbiAgICAgIGlmICghbG9nZ2VyKSB0aHJvdyBuZXcgRXJyb3IoXCJMb2dnZXIgbm90IGluaXRpYWxpemVkXCIpXG5cbiAgICAgIGF3YWl0IGxvZ2dlci53YXJuKGBObyByb3V0ZSBtYXRjaGVkIGZvciAke3Jhd1BhdGh9LiBUcmllZCBjb250cm9sbGVyIGF0ICR7YXR0ZW1wdGVkQ29udHJvbGxlclBhdGh9YClcblxuICAgICAgY29udHJvbGxlciA9IFwiZXJyb3JzXCJcbiAgICAgIGNvbnRyb2xsZXJQYXRoID0gXCIuL2J1aWx0LWluL2Vycm9ycy9jb250cm9sbGVyLmpzXCJcbiAgICAgIGFjdGlvbiA9IFwibm90Rm91bmRcIlxuICAgICAgc2tpcEFiaWxpdHlSZXNvbHV0aW9uID0gdHJ1ZVxuICAgICAgc2tpcENvbnRyb2xsZXJDb25uZWN0aW9ucyA9IHRydWVcbiAgICAgIHNraXBUZW5hbnRSZXNvbHV0aW9uID0gdHJ1ZVxuICAgICAgdmlld1BhdGggPSBhd2FpdCBmcy5yZWFscGF0aChgJHtfX2Rpcm5hbWV9L2J1aWx0LWluL2Vycm9yc2ApXG4gICAgfSBlbHNlIGlmIChhY3Rpb24pIHtcbiAgICAgIGlmICghY29udHJvbGxlcikgY29udHJvbGxlciA9IFwiX3Jvb3RcIlxuXG4gICAgICBjb250cm9sbGVyUGF0aCA9IGAke3RoaXMuY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL3JvdXRlcy8ke2NvbnRyb2xsZXJ9L2NvbnRyb2xsZXIuanNgXG4gICAgICB2aWV3UGF0aCA9IGAke3RoaXMuY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL3JvdXRlcy8ke2NvbnRyb2xsZXJ9YFxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1hdGNoZWQgdGhlIHJvdXRlIGJ1dCBkaWRuJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggaXQ6ICR7cmF3UGF0aH0gKGFjdGlvbjogJHthY3Rpb259LCBjb250cm9sbGVyOiAke2NvbnRyb2xsZXJ9LCBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5wYXJhbXMpfSlgKVxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRyb2xsZXJDbGFzcyA9IGF3YWl0IHRoaXMucmVzb2x2ZUNvbnRyb2xsZXJDbGFzcyh7Y29udHJvbGxlclBhdGh9KVxuICAgIGNvbnN0IGNvbnRyb2xsZXJSZXF1ZXN0ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSAqLyAodGhpcy5yZXF1ZXN0KVxuICAgIGNvbnN0IGNvbnRyb2xsZXJJbnN0YW5jZSA9IG5ldyBjb250cm9sbGVyQ2xhc3Moe1xuICAgICAgYWN0aW9uLFxuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgY29udHJvbGxlcixcbiAgICAgIHBhcmFtczogdGhpcy5wYXJhbXMsXG4gICAgICByZXF1ZXN0OiBjb250cm9sbGVyUmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlLFxuICAgICAgdmlld1BhdGhcbiAgICB9KVxuXG4gICAgaWYgKCEoYWN0aW9uIGluIGNvbnRyb2xsZXJJbnN0YW5jZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBhY3Rpb24gb24gY29udHJvbGxlcjogJHtjb250cm9sbGVyfSMke2FjdGlvbn1gKVxuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbkhhbmRsZXJzID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPj59ICovICgvKiogQHR5cGUgez99ICovIChjb250cm9sbGVySW5zdGFuY2UpKVxuXG4gICAgY29uc3QgbG9nTWV0aG9kID0gdGhpcy5fbG9nTWV0aG9kKClcblxuICAgIHRoaXMuX3NldENvbXBsZXRlZExvZ01ldGFkYXRhKHtjb250cm9sbGVyQ2xhc3MsIGxvZ01ldGhvZH0pXG4gICAgYXdhaXQgdGhpcy5fbG9nQWN0aW9uU3RhcnQoe2FjdGlvbiwgY29udHJvbGxlckNsYXNzLCBsb2dNZXRob2R9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbmFudCA9IHNraXBUZW5hbnRSZXNvbHV0aW9uIHx8ICF0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0VGVuYW50UmVzb2x2ZXIoKVxuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5lbnN1cmVDb25uZWN0aW9ucyh7bmFtZTogYCR7Y29udHJvbGxlckNsYXNzLm5hbWV9LiR7YWN0aW9ufSB0ZW5hbnQgcmVzb2x1dGlvbmB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJlc29sdmVUZW5hbnQoe1xuICAgICAgICAgICAgICBwYXJhbXM6IHsuLi50aGlzLnF1ZXJ5UGFyYW1ldGVycygpLCAuLi50aGlzLnBhcmFtc30sXG4gICAgICAgICAgICAgIHJlcXVlc3Q6IHRoaXMucmVxdWVzdCxcbiAgICAgICAgICAgICAgcmVzcG9uc2U6IHRoaXMucmVzcG9uc2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcblxuICAgICAgY29uc3QgcnVuQWN0aW9uID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBydW5Db250cm9sbGVyQWN0aW9uID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWJpbGl0eSA9IHNraXBBYmlsaXR5UmVzb2x1dGlvblxuICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA6IGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5yZXNvbHZlQWJpbGl0eSh7XG4gICAgICAgICAgICAgICAgICBwYXJhbXM6IHRoaXMucGFyYW1zLFxuICAgICAgICAgICAgICAgICAgcmVxdWVzdDogdGhpcy5yZXF1ZXN0LFxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6IHRoaXMucmVzcG9uc2VcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aEFiaWxpdHkoYWJpbGl0eSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9tZWFzdXJlQ29udHJvbGxlcihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbGxlckluc3RhbmNlLl9ydW5CZWZvcmVDYWxsYmFja3MoKVxuICAgICAgICAgICAgICAgIGF3YWl0IGFjdGlvbkhhbmRsZXJzW2FjdGlvbl0oKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2tpcENvbnRyb2xsZXJDb25uZWN0aW9ucykge1xuICAgICAgICAgICAgYXdhaXQgcnVuQ29udHJvbGxlckFjdGlvbigpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5lbnN1cmVDb25uZWN0aW9ucyh7bmFtZTogYCR7Y29udHJvbGxlckNsYXNzLm5hbWV9LiR7YWN0aW9ufWB9LCBydW5Db250cm9sbGVyQWN0aW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXJvdW5kQWN0aW9uID0gdGhpcy5jb25maWd1cmF0aW9uLmdldEFyb3VuZEFjdGlvbj8uKClcblxuICAgICAgaWYgKGFyb3VuZEFjdGlvbikge1xuICAgICAgICBhd2FpdCBhcm91bmRBY3Rpb24oe3JlcXVlc3Q6IHRoaXMucmVxdWVzdCwgcmVzcG9uc2U6IHRoaXMucmVzcG9uc2UsIG5leHQ6IHJ1bkFjdGlvbn0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBydW5BY3Rpb24oKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlbnN1cmVkRXJyb3IgPSBlbnN1cmVFcnJvcihlcnJvcilcbiAgICAgIGNvbnN0IGVycm9yQ29udGV4dCA9IHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjb250cm9sbGVyLFxuICAgICAgICBodHRwTWV0aG9kOiB0aGlzLnJlcXVlc3QuaHR0cE1ldGhvZCgpLFxuICAgICAgICBwYXRoOiB0aGlzLnJlcXVlc3QucGF0aCgpLFxuICAgICAgICBzdGFnZTogXCJjb250cm9sbGVyLWFjdGlvblwiXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9yV2l0aENvbnRleHQgPSAvKiogQHR5cGUge3t2ZWxvY2lvdXNDb250ZXh0Pzogb2JqZWN0fX0gKi8gKGVuc3VyZWRFcnJvcilcblxuICAgICAgZXJyb3JXaXRoQ29udGV4dC52ZWxvY2lvdXNDb250ZXh0ID0ge1xuICAgICAgICAuLi4oZXJyb3JXaXRoQ29udGV4dC52ZWxvY2lvdXNDb250ZXh0IHx8IHt9KSxcbiAgICAgICAgY29udHJvbGxlckFjdGlvbjogZXJyb3JDb250ZXh0XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVuc3VyZWRFcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc29sdmUgY29udHJvbGxlciBjbGFzcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb250cm9sbGVyUGF0aCAtIENvbnRyb2xsZXIgaW1wb3J0IHBhdGguXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHR5cGVvZiBpbXBvcnQoXCIuLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHQ+fSAtIFRoZSByZXNvbHZlZCBjb250cm9sbGVyIGNsYXNzLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZUNvbnRyb2xsZXJDbGFzcyh7Y29udHJvbGxlclBhdGh9KSB7XG4gICAgY29uc3QgY29udHJvbGxlckltcG9ydFNwZWNpZmllciA9IHRvSW1wb3J0U3BlY2lmaWVyKGNvbnRyb2xsZXJQYXRoKVxuXG4gICAgaWYgKCF0aGlzLnJvdXRlSG9va0NvbnRyb2xsZXJDbGFzcykge1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4uL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdH0gKi8gKChhd2FpdCBpbXBvcnQoY29udHJvbGxlckltcG9ydFNwZWNpZmllcikpLmRlZmF1bHQpXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHR9ICovICgoYXdhaXQgaW1wb3J0KGNvbnRyb2xsZXJJbXBvcnRTcGVjaWZpZXIpKS5kZWZhdWx0KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBpc01pc3NpbmdDb250cm9sbGVyRmlsZUVycm9yID0gaXNNaXNzaW5nVGFyZ2V0TW9kdWxlRXJyb3Ioe1xuICAgICAgICBlcnJvcjogZW5zdXJlRXJyb3IoZXJyb3IpLFxuICAgICAgICB0YXJnZXRJbXBvcnRTcGVjaWZpZXI6IGNvbnRyb2xsZXJJbXBvcnRTcGVjaWZpZXIsXG4gICAgICAgIHRhcmdldFBhdGg6IGNvbnRyb2xsZXJQYXRoXG4gICAgICB9KVxuXG4gICAgICBpZiAoIWlzTWlzc2luZ0NvbnRyb2xsZXJGaWxlRXJyb3IpIHRocm93IGVuc3VyZUVycm9yKGVycm9yKVxuXG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSAqLyAodGhpcy5yb3V0ZUhvb2tDb250cm9sbGVyQ2xhc3MpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbWF0Y2ggcGF0aCB3aXRoIHJvdXRlcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2Jhc2Utcm91dGUuanNcIikuZGVmYXVsdH0gcm91dGUgLSBSb3V0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXRoLlxuICAgKiBAcmV0dXJucyB7e3Jlc3RQYXRoOiBzdHJpbmd9IHwgdW5kZWZpbmVkfSAtIFJFU1QgcGF0aCBtZXRhZGF0YSBmb3IgdGhpcyByb3V0ZS5cbiAgICovXG4gIG1hdGNoUGF0aFdpdGhSb3V0ZXMocm91dGUsIHBhdGgpIHtcbiAgICBjb25zdCBwYXRoV2l0aG91dFNsYXNoID0gcGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIikuc3BsaXQoXCI/XCIpWzBdXG5cbiAgICBmb3IgKGNvbnN0IHN1YlJvdXRlIG9mIHJvdXRlLnJvdXRlcykge1xuICAgICAgY29uc3QgcGFyYW1zU25hcHNob3QgPSB7Li4udGhpcy5wYXJhbXN9XG4gICAgICBjb25zdCBtYXRjaFJlc3VsdCA9IHN1YlJvdXRlLm1hdGNoV2l0aFBhdGgoe1xuICAgICAgICBwYXJhbXM6IHRoaXMucGFyYW1zLFxuICAgICAgICBwYXRoOiBwYXRoV2l0aG91dFNsYXNoLFxuICAgICAgICByZXF1ZXN0OiB0aGlzLnJlcXVlc3RcbiAgICAgIH0pXG5cbiAgICAgIGlmICghbWF0Y2hSZXN1bHQpIHtcbiAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXNTbmFwc2hvdFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7cmVzdFBhdGh9ID0gbWF0Y2hSZXN1bHRcblxuICAgICAgaWYgKHJlc3RQYXRoKSB7XG4gICAgICAgIGNvbnN0IHJlY3Vyc2l2ZU1hdGNoID0gdGhpcy5tYXRjaFBhdGhXaXRoUm91dGVzKHN1YlJvdXRlLCByZXN0UGF0aClcblxuICAgICAgICBpZiAocmVjdXJzaXZlTWF0Y2gpIHtcbiAgICAgICAgICByZXR1cm4gcmVjdXJzaXZlTWF0Y2hcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zU25hcHNob3RcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1hdGNoUmVzdWx0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVzb2x2ZSByb3V0ZSByZXNvbHZlciBob29rcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGN1cnJlbnRQYXRoIC0gUmVxdWVzdCBwYXRoIHdpdGhvdXQgcXVlcnkgc3RyaW5nLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIFJlc29sdmVyIGhvb2sgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5oYXNNYXRjaGluZ0N1c3RvbVJvdXRlXSAtIFRydWUgd2hlbiB0aGUgcGF0aCBtYXRjaGVkIGFuIGV4cGxpY2l0IGN1c3RvbSByb3V0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Sb3V0ZVJlc29sdmVySG9va1Jlc3VsdCB8IG51bGw+fSAtIE1hdGNoZWQgYWN0aW9uL2NvbnRyb2xsZXIgZnJvbSBob29rcy5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVSb3V0ZVJlc29sdmVySG9va3MoY3VycmVudFBhdGgsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHtoYXNNYXRjaGluZ0N1c3RvbVJvdXRlID0gZmFsc2V9ID0gb3B0aW9uc1xuXG4gICAgY29uc3QgaG9va3MgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Um91dGVSZXNvbHZlckhvb2tzPy4oKSB8fCBbXVxuXG4gICAgZm9yIChjb25zdCBob29rIG9mIGhvb2tzKSB7XG4gICAgICBjb25zdCBob29rUmVzdWx0ID0gYXdhaXQgaG9vayh7XG4gICAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgY3VycmVudFBhdGgsXG4gICAgICAgIGhhc01hdGNoaW5nQ3VzdG9tUm91dGUsXG4gICAgICAgIHBhcmFtczogdGhpcy5wYXJhbXMsXG4gICAgICAgIHJlcXVlc3Q6IHRoaXMucmVxdWVzdCxcbiAgICAgICAgcmVzb2x2ZXI6IHRoaXMsXG4gICAgICAgIHJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlXG4gICAgICB9KVxuXG4gICAgICBpZiAoIWhvb2tSZXN1bHQpIGNvbnRpbnVlXG5cbiAgICAgIGlmICh0eXBlb2YgaG9va1Jlc3VsdC5hY3Rpb24gIT09IFwic3RyaW5nXCIgfHwgaG9va1Jlc3VsdC5hY3Rpb24ubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHJvdXRlIHJlc29sdmVyIGhvb2sgYWN0aW9uIHRvIGJlIGEgc3RyaW5nLCBnb3Q6ICR7aG9va1Jlc3VsdC5hY3Rpb259YClcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBob29rUmVzdWx0LmNvbnRyb2xsZXIgIT09IFwic3RyaW5nXCIgfHwgaG9va1Jlc3VsdC5jb250cm9sbGVyLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCByb3V0ZSByZXNvbHZlciBob29rIGNvbnRyb2xsZXIgdG8gYmUgYSBzdHJpbmcsIGdvdDogJHtob29rUmVzdWx0LmNvbnRyb2xsZXJ9YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQucGFyYW1zICYmIHR5cGVvZiBob29rUmVzdWx0LnBhcmFtcyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHJvdXRlIHJlc29sdmVyIGhvb2sgcGFyYW1zIHRvIGJlIGFuIG9iamVjdCwgZ290OiAke2hvb2tSZXN1bHQucGFyYW1zfWApXG4gICAgICB9XG5cbiAgICAgIGlmIChob29rUmVzdWx0LmNvbnRyb2xsZXJDbGFzcyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBob29rUmVzdWx0LmNvbnRyb2xsZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayBjb250cm9sbGVyQ2xhc3MgdG8gYmUgYSBjbGFzcy9mdW5jdGlvbiB3aGVuIHByb3ZpZGVkLCBnb3Q6ICR7aG9va1Jlc3VsdC5jb250cm9sbGVyQ2xhc3N9YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQuY29udHJvbGxlclBhdGggIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgaG9va1Jlc3VsdC5jb250cm9sbGVyUGF0aCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHJvdXRlIHJlc29sdmVyIGhvb2sgY29udHJvbGxlclBhdGggdG8gYmUgYSBzdHJpbmcgd2hlbiBwcm92aWRlZCwgZ290OiAke2hvb2tSZXN1bHQuY29udHJvbGxlclBhdGh9YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQuc2tpcENvbnRyb2xsZXJDb25uZWN0aW9ucyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBob29rUmVzdWx0LnNraXBDb250cm9sbGVyQ29ubmVjdGlvbnMgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayBza2lwQ29udHJvbGxlckNvbm5lY3Rpb25zIHRvIGJlIGEgYm9vbGVhbiB3aGVuIHByb3ZpZGVkLCBnb3Q6ICR7aG9va1Jlc3VsdC5za2lwQ29udHJvbGxlckNvbm5lY3Rpb25zfWApXG4gICAgICB9XG5cbiAgICAgIGlmIChob29rUmVzdWx0LnNraXBBYmlsaXR5UmVzb2x1dGlvbiAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBob29rUmVzdWx0LnNraXBBYmlsaXR5UmVzb2x1dGlvbiAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCByb3V0ZSByZXNvbHZlciBob29rIHNraXBBYmlsaXR5UmVzb2x1dGlvbiB0byBiZSBhIGJvb2xlYW4gd2hlbiBwcm92aWRlZCwgZ290OiAke2hvb2tSZXN1bHQuc2tpcEFiaWxpdHlSZXNvbHV0aW9ufWApXG4gICAgICB9XG5cbiAgICAgIGlmIChob29rUmVzdWx0LnNraXBUZW5hbnRSZXNvbHV0aW9uICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGhvb2tSZXN1bHQuc2tpcFRlbmFudFJlc29sdXRpb24gIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayBza2lwVGVuYW50UmVzb2x1dGlvbiB0byBiZSBhIGJvb2xlYW4gd2hlbiBwcm92aWRlZCwgZ290OiAke2hvb2tSZXN1bHQuc2tpcFRlbmFudFJlc29sdXRpb259YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQudmlld1BhdGggIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgaG9va1Jlc3VsdC52aWV3UGF0aCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHJvdXRlIHJlc29sdmVyIGhvb2sgdmlld1BhdGggdG8gYmUgYSBzdHJpbmcgd2hlbiBwcm92aWRlZCwgZ290OiAke2hvb2tSZXN1bHQudmlld1BhdGh9YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQucGFyYW1zKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5wYXJhbXMsIGhvb2tSZXN1bHQucGFyYW1zKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gaG9va1Jlc3VsdFxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBsb2cgYWN0aW9uIHN0YXJ0LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hY3Rpb24gLSBBY3Rpb24uXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdH0gYXJncy5jb250cm9sbGVyQ2xhc3MgLSBDb250cm9sbGVyIGNsYXNzLlxuICAgKiBAcGFyYW0ge1wiZGVidWdcIiB8IFwiaW5mb1wifSBhcmdzLmxvZ01ldGhvZCAtIExvZ2dlciBtZXRob2QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfbG9nQWN0aW9uU3RhcnQoe2FjdGlvbiwgY29udHJvbGxlckNsYXNzLCBsb2dNZXRob2R9KSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucmVxdWVzdFxuICAgIGNvbnN0IHRpbWVzdGFtcCA9IHRoaXMuX2Zvcm1hdFRpbWVzdGFtcChuZXcgRGF0ZSgpKVxuICAgIGNvbnN0IHJlbW90ZUFkZHJlc3MgPSByZXF1ZXN0LnJlbW90ZUFkZHJlc3MoKSB8fCBcInVua25vd25cIlxuICAgIGNvbnN0IGxvZ2dlZFBhcmFtcyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovICh0aGlzLl9zYW5pdGl6ZVBhcmFtc0ZvckxvZ2dpbmcodGhpcy5wYXJhbXMpKVxuXG4gICAgZGVsZXRlIGxvZ2dlZFBhcmFtcy5hY3Rpb25cbiAgICBkZWxldGUgbG9nZ2VkUGFyYW1zLmNvbnRyb2xsZXJcblxuICAgIGNvbnN0IGNvbnRyb2xsZXJMb2dnZXIgPSBuZXcgTG9nZ2VyKGNvbnRyb2xsZXJDbGFzcy5uYW1lLCB7Y29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9ufSlcblxuICAgIGF3YWl0IGNvbnRyb2xsZXJMb2dnZXJbbG9nTWV0aG9kXSgoKSA9PiBgU3RhcnRlZCAke3JlcXVlc3QuaHR0cE1ldGhvZCgpfSBcIiR7cmVxdWVzdC5wYXRoKCl9XCIgZm9yICR7cmVtb3RlQWRkcmVzc30gYXQgJHt0aW1lc3RhbXB9YClcbiAgICBhd2FpdCBjb250cm9sbGVyTG9nZ2VyW2xvZ01ldGhvZF0oKCkgPT4gYFByb2Nlc3NpbmcgYnkgJHtjb250cm9sbGVyQ2xhc3MubmFtZX0jJHthY3Rpb259YClcbiAgICBhd2FpdCBjb250cm9sbGVyTG9nZ2VyW2xvZ01ldGhvZF0oKCkgPT4gW2AgIFBhcmFtZXRlcnM6YCwgbG9nZ2VkUGFyYW1zXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGxvZyBtZXRob2QuXG4gICAqIEByZXR1cm5zIHtcImRlYnVnXCIgfCBcImluZm9cIn0gLSBSZXF1ZXN0IGxvZyBtZXRob2QuXG4gICAqL1xuICBfbG9nTWV0aG9kKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RW52aXJvbm1lbnQoKSA9PT0gXCJ0ZXN0XCIgPyBcImRlYnVnXCIgOiBcImluZm9cIlxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbWVhc3VyZSBjb250cm9sbGVyLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gbWVhc3VyZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgX21lYXN1cmVDb250cm9sbGVyKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgcmVxdWVzdFRpbWluZyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRDdXJyZW50UmVxdWVzdFRpbWluZygpXG5cbiAgICByZXR1cm4gcmVxdWVzdFRpbWluZ1xuICAgICAgPyBhd2FpdCByZXF1ZXN0VGltaW5nLm1lYXN1cmUoXCJjb250cm9sbGVyXCIsIGNhbGxiYWNrKVxuICAgICAgOiBhd2FpdCBjYWxsYmFjaygpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgY29tcGxldGVkIGxvZyBtZXRhZGF0YS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbnRyb2xsZXJDbGFzcyAtIENvbnRyb2xsZXIgY2xhc3MuXG4gICAqIEBwYXJhbSB7XCJkZWJ1Z1wiIHwgXCJpbmZvXCJ9IGFyZ3MubG9nTWV0aG9kIC0gTG9nZ2VyIG1ldGhvZC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgX3NldENvbXBsZXRlZExvZ01ldGFkYXRhKHtjb250cm9sbGVyQ2xhc3MsIGxvZ01ldGhvZH0pIHtcbiAgICBjb25zdCByZXF1ZXN0VGltaW5nID0gdGhpcy5jb25maWd1cmF0aW9uLmdldEN1cnJlbnRSZXF1ZXN0VGltaW5nKClcblxuICAgIGlmICghcmVxdWVzdFRpbWluZykgcmV0dXJuXG5cbiAgICByZXF1ZXN0VGltaW5nLmNvbXBsZXRlZExvZ1N1YmplY3QgPSBjb250cm9sbGVyQ2xhc3MubmFtZVxuICAgIHJlcXVlc3RUaW1pbmcuY29tcGxldGVkTG9nTWV0aG9kID0gbG9nTWV0aG9kXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmb3JtYXQgdGltZXN0YW1wLlxuICAgKiBAcGFyYW0ge0RhdGV9IGRhdGUgLSBEYXRlIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSB0aW1lc3RhbXAuXG4gICAqL1xuICBfZm9ybWF0VGltZXN0YW1wKGRhdGUpIHtcbiAgICAvKipcbiAgICAgKiBQYWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bSAtIE51bS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBwYWQuXG4gICAgICovXG4gICAgY29uc3QgcGFkID0gKG51bSkgPT4gU3RyaW5nKG51bSkucGFkU3RhcnQoMiwgXCIwXCIpXG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKVxuICAgIGNvbnN0IG1vbnRoID0gcGFkKGRhdGUuZ2V0TW9udGgoKSArIDEpXG4gICAgY29uc3QgZGF5ID0gcGFkKGRhdGUuZ2V0RGF0ZSgpKVxuICAgIGNvbnN0IGhvdXJzID0gcGFkKGRhdGUuZ2V0SG91cnMoKSlcbiAgICBjb25zdCBtaW51dGVzID0gcGFkKGRhdGUuZ2V0TWludXRlcygpKVxuICAgIGNvbnN0IHNlY29uZHMgPSBwYWQoZGF0ZS5nZXRTZWNvbmRzKCkpXG4gICAgY29uc3Qgb2Zmc2V0TWludXRlcyA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKVxuICAgIGNvbnN0IG9mZnNldFNpZ24gPSBvZmZzZXRNaW51dGVzID4gMCA/IFwiLVwiIDogXCIrXCJcbiAgICBjb25zdCBvZmZzZXRUb3RhbE1pbnV0ZXMgPSBNYXRoLmFicyhvZmZzZXRNaW51dGVzKVxuICAgIGNvbnN0IG9mZnNldEhvdXJzID0gcGFkKE1hdGguZmxvb3Iob2Zmc2V0VG90YWxNaW51dGVzIC8gNjApKVxuICAgIGNvbnN0IG9mZnNldFJlbWFpbmluZ01pbnV0ZXMgPSBwYWQob2Zmc2V0VG90YWxNaW51dGVzICUgNjApXG5cbiAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9ICR7aG91cnN9OiR7bWludXRlc306JHtzZWNvbmRzfSAke29mZnNldFNpZ259JHtvZmZzZXRIb3Vyc30ke29mZnNldFJlbWFpbmluZ01pbnV0ZXN9YFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2FuaXRpemUgcGFyYW1zIGZvciBsb2dnaW5nLlxuICAgKiBAcGFyYW0gez99IHZhbHVlIC0gVmFsdWUgdG8gdXNlLlxuICAgKiBAcmV0dXJucyB7P30gLSBUaGUgc2FuaXRpemUgcGFyYW1zIGZvciBsb2dnaW5nLlxuICAgKi9cbiAgX3Nhbml0aXplUGFyYW1zRm9yTG9nZ2luZyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVwbG9hZGVkRmlsZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2xhc3NOYW1lOiB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgICBmaWxlbmFtZTogdmFsdWUuZmlsZW5hbWUoKSxcbiAgICAgICAgc2l6ZTogdmFsdWUuc2l6ZSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUubWFwKChpdGVtKSA9PiB0aGlzLl9zYW5pdGl6ZVBhcmFtc0ZvckxvZ2dpbmcoaXRlbSkpXG4gICAgfVxuXG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgLyoqXG4gICAgICAgKiBSZXN1bHQuXG4gICAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gICAgICBjb25zdCByZXN1bHQgPSB7fVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLl9zYW5pdGl6ZVBhcmFtc0ZvckxvZ2dpbmcodmFsdWVba2V5XSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG59XG4iXX0=
417
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGVzL3Jlc29sdmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxLQUFLLENBQUE7QUFDakMsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzVCLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxTQUFTLENBQUE7QUFDbkMsT0FBTyxNQUFNLE1BQU0sY0FBYyxDQUFBO0FBQ2pDLE9BQU8sWUFBWSxNQUFNLHNEQUFzRCxDQUFBO0FBQy9FLE9BQU8saUJBQWlCLE1BQU0saUNBQWlDLENBQUE7QUFFL0Q7Ozs7R0FJRztBQUNILFNBQVMsbUJBQW1CLENBQUMsVUFBVTtJQUNyQyxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUN4RixDQUFDO0FBRUQsTUFBTSxDQUFDLE9BQU8sT0FBTyx1QkFBdUI7SUFDMUM7O29DQUVnQztJQUNoQyxNQUFNLENBQUE7SUFFTjs7Ozs7O09BTUc7SUFDSCxZQUFZLEVBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUM7UUFDNUMsSUFBSSxDQUFDLGFBQWE7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUE7UUFDN0QsSUFBSSxDQUFDLE9BQU87WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUE7UUFDakQsSUFBSSxDQUFDLFFBQVE7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUE7UUFFbkQsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFDbEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFDLGFBQWEsRUFBQyxDQUFDLENBQUE7UUFDM0QsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQTtRQUM1QyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUMsR0FBRyxhQUFhLEVBQUMsQ0FBQTtRQUNoQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFBO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUE7UUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7UUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUE7SUFDMUIsQ0FBQztJQUVEOzs7T0FHRztJQUNILGVBQWU7UUFDYixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUUvQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sRUFBRSxDQUFBO1FBRXJCOzs0Q0FFb0M7UUFDcEMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFBO1FBQ2pCLE1BQU0sWUFBWSxHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRS9DLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxZQUFZLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUNsRCxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDOUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQTtZQUNyQixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFBO0lBQ2YsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPO1FBQ1gsSUFBSSxDQUFDLHdCQUF3QixHQUFHLFNBQVMsQ0FBQTtRQUN6QyxJQUFJLGNBQWMsQ0FBQTtRQUNsQixNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUE7UUFDMUQsTUFBTSxZQUFZLEdBQUcsbUJBQW1CLEVBQUUsU0FBUyxDQUFBO1FBQ25ELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDbkMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUN6QyxJQUFJLFFBQVEsQ0FBQTtRQUVaLE1BQU0sY0FBYyxHQUFHLEVBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFDLENBQUE7UUFDdkMsTUFBTSxzQkFBc0IsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUE7UUFFM0csSUFBSSxzQkFBc0IsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUFBO1FBQzlCLENBQUM7UUFFRCxNQUFNLHNCQUFzQixHQUFHLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLFdBQVcsRUFBRSxFQUFDLHNCQUFzQixFQUFDLENBQUMsQ0FBQTtRQUMxRyxJQUFJLHlCQUF5QixHQUFHLHNCQUFzQixFQUFFLHlCQUF5QixLQUFLLElBQUksQ0FBQTtRQUMxRixJQUFJLHFCQUFxQixHQUFHLHNCQUFzQixFQUFFLHFCQUFxQixLQUFLLElBQUksQ0FBQTtRQUNsRixJQUFJLG9CQUFvQixHQUFHLHNCQUFzQixFQUFFLG9CQUFvQixLQUFLLElBQUksQ0FBQTtRQUNoRixNQUFNLFdBQVcsR0FBRyxzQkFBc0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFBO1FBQzdILE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFBO1FBQ3RDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFBO1FBQzlDLE1BQU0sV0FBVyxHQUFHLE9BQU8sV0FBVyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDNUgsSUFBSSxNQUFNLEdBQUcsT0FBTyxXQUFXLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO1FBQzFGLElBQUksVUFBVSxHQUFHLE9BQU8sZUFBZSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUE7UUFFekksSUFBSSxzQkFBc0IsRUFBRSxDQUFDO1lBQzNCLE1BQU0sd0JBQXdCLEdBQUcsc0JBQXNCLENBQUMsZUFBZSxDQUFBO1lBQ3ZFLElBQUksdUJBQXVCLENBQUE7WUFDM0IsSUFBSSxpQkFBaUIsQ0FBQTtZQUVyQixJQUFJLE9BQU8sc0JBQXNCLENBQUMsY0FBYyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM5RCx1QkFBdUIsR0FBRyxzQkFBc0IsQ0FBQyxjQUFjLENBQUE7WUFDakUsQ0FBQztZQUVELElBQUksT0FBTyxzQkFBc0IsQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3hELGlCQUFpQixHQUFHLHNCQUFzQixDQUFDLFFBQVEsQ0FBQTtZQUNyRCxDQUFDO1lBRUQsVUFBVSxHQUFHLHNCQUFzQixDQUFDLFVBQVUsQ0FBQTtZQUM5QyxNQUFNLEdBQUcsbUJBQW1CLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDM0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFBO1lBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLHNCQUFzQixDQUFDLE1BQU0sQ0FBQTtZQUNsRCxjQUFjLEdBQUcsdUJBQXVCLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxlQUFlLFVBQVUsZ0JBQWdCLENBQUE7WUFDekgsUUFBUSxHQUFHLGlCQUFpQixJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsZUFBZSxVQUFVLEVBQUUsQ0FBQTtZQUMvRixJQUFJLENBQUMsd0JBQXdCLEdBQUcsd0JBQXdCLENBQUE7UUFDMUQsQ0FBQzthQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN4QixNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNqRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDckMsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFBO1lBQy9ELE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxlQUFlLGFBQWEsZ0JBQWdCLENBQUE7WUFFaEgsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQTtZQUUxQixJQUFJLENBQUMsTUFBTTtnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUE7WUFFdEQsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixPQUFPLHlCQUF5Qix1QkFBdUIsRUFBRSxDQUFDLENBQUE7WUFFcEcsVUFBVSxHQUFHLFFBQVEsQ0FBQTtZQUNyQixjQUFjLEdBQUcsaUNBQWlDLENBQUE7WUFDbEQsTUFBTSxHQUFHLFVBQVUsQ0FBQTtZQUNuQixxQkFBcUIsR0FBRyxJQUFJLENBQUE7WUFDNUIseUJBQXlCLEdBQUcsSUFBSSxDQUFBO1lBQ2hDLG9CQUFvQixHQUFHLElBQUksQ0FBQTtZQUMzQixRQUFRLEdBQUcsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsU0FBUyxrQkFBa0IsQ0FBQyxDQUFBO1FBQzlELENBQUM7YUFBTSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxVQUFVO2dCQUFFLFVBQVUsR0FBRyxPQUFPLENBQUE7WUFFckMsY0FBYyxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsZUFBZSxVQUFVLGdCQUFnQixDQUFBO1lBQzlGLFFBQVEsR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLGVBQWUsVUFBVSxFQUFFLENBQUE7UUFDNUUsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksS0FBSyxDQUFDLHlEQUF5RCxPQUFPLGFBQWEsTUFBTSxpQkFBaUIsVUFBVSxhQUFhLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUM1SyxDQUFDO1FBRUQsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsRUFBQyxjQUFjLEVBQUMsQ0FBQyxDQUFBO1FBQzNFLE1BQU0saUJBQWlCLEdBQUcsaUVBQWlFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDMUcsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLGVBQWUsQ0FBQztZQUM3QyxNQUFNO1lBQ04sYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ2pDLFVBQVU7WUFDVixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsT0FBTyxFQUFFLGlCQUFpQjtZQUMxQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsUUFBUTtTQUNULENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7WUFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsVUFBVSxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDMUUsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLHlEQUF5RCxDQUFDLEVBQUMsZ0JBQWlCLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFBO1FBRXhILE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUVuQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsRUFBQyxlQUFlLEVBQUUsU0FBUyxFQUFDLENBQUMsQ0FBQTtRQUMzRCxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUE7UUFFaEUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsb0JBQW9CLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixFQUFFO2dCQUM1RSxDQUFDLENBQUMsU0FBUztnQkFDWCxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLEVBQUMsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLElBQUksSUFBSSxNQUFNLG9CQUFvQixFQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUU7b0JBQ25ILE9BQU8sTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQzt3QkFDNUMsTUFBTSxFQUFFLEVBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFDO3dCQUNuRCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87d0JBQ3JCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtxQkFDeEIsQ0FBQyxDQUFBO2dCQUNKLENBQUMsQ0FBQyxDQUFBO1lBRU4sTUFBTSxTQUFTLEdBQUcsS0FBSyxJQUFJLEVBQUU7Z0JBQzNCLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxFQUFFO29CQUN4RCxNQUFNLG1CQUFtQixHQUFHLEtBQUssSUFBSSxFQUFFO3dCQUNyQyxNQUFNLE9BQU8sR0FBRyxxQkFBcUI7NEJBQ25DLENBQUMsQ0FBQyxTQUFTOzRCQUNYLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDO2dDQUN0QyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0NBQ25CLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztnQ0FDckIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFROzZCQUN4QixDQUFDLENBQUE7d0JBRU4sTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJLEVBQUU7NEJBQzFELE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssSUFBSSxFQUFFO2dDQUN2QyxNQUFNLGtCQUFrQixDQUFDLG1CQUFtQixFQUFFLENBQUE7Z0NBQzlDLE1BQU0sY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUE7NEJBQ2hDLENBQUMsQ0FBQyxDQUFBO3dCQUNKLENBQUMsQ0FBQyxDQUFBO29CQUNKLENBQUMsQ0FBQTtvQkFFRCxJQUFJLHlCQUF5QixFQUFFLENBQUM7d0JBQzlCLE1BQU0sbUJBQW1CLEVBQUUsQ0FBQTtvQkFDN0IsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFDLElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxJQUFJLElBQUksTUFBTSxFQUFFLEVBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFBO29CQUM5RyxDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFBO1lBQ0osQ0FBQyxDQUFBO1lBRUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFBO1lBRTNELElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sWUFBWSxDQUFDLEVBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUE7WUFDdkYsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sU0FBUyxFQUFFLENBQUE7WUFDbkIsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3ZDLE1BQU0sWUFBWSxHQUFHO2dCQUNuQixNQUFNO2dCQUNOLFVBQVU7Z0JBQ1YsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFO2dCQUNyQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7Z0JBQ3pCLEtBQUssRUFBRSxtQkFBbUI7YUFDM0IsQ0FBQTtZQUVELE1BQU0sZ0JBQWdCLEdBQUcsMENBQTBDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUVsRixnQkFBZ0IsQ0FBQyxnQkFBZ0IsR0FBRztnQkFDbEMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQztnQkFDNUMsZ0JBQWdCLEVBQUUsWUFBWTthQUMvQixDQUFBO1lBRUQsTUFBTSxZQUFZLENBQUE7UUFDcEIsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxFQUFDLGNBQWMsRUFBQztRQUMzQyxJQUFJLElBQUksQ0FBQyx3QkFBd0I7WUFBRSxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQTtRQUV2RSxNQUFNLHlCQUF5QixHQUFHLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBRW5FLE9BQU8sd0RBQXdELENBQUMsQ0FBQyxDQUFDLE1BQU0sTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNySCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsSUFBSTtRQUM3QixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUU5RCxLQUFLLE1BQU0sUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNwQyxNQUFNLGNBQWMsR0FBRyxFQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBQyxDQUFBO1lBQ3ZDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7Z0JBQ3pDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsSUFBSSxFQUFFLGdCQUFnQjtnQkFDdEIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO2FBQ3RCLENBQUMsQ0FBQTtZQUVGLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUE7Z0JBQzVCLFNBQVE7WUFDVixDQUFDO1lBRUQsTUFBTSxFQUFDLFFBQVEsRUFBQyxHQUFHLFdBQVcsQ0FBQTtZQUU5QixJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUE7Z0JBRW5FLElBQUksY0FBYyxFQUFFLENBQUM7b0JBQ25CLE9BQU8sY0FBYyxDQUFBO2dCQUN2QixDQUFDO2dCQUVELElBQUksQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUFBO2dCQUM1QixTQUFRO1lBQ1YsQ0FBQztZQUVELE9BQU8sV0FBVyxDQUFBO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLHlCQUF5QixDQUFDLFdBQVcsRUFBRSxPQUFPLEdBQUcsRUFBRTtRQUN2RCxNQUFNLEVBQUMsc0JBQXNCLEdBQUcsS0FBSyxFQUFDLEdBQUcsT0FBTyxDQUFBO1FBRWhELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQTtRQUVoRSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDO2dCQUM1QixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7Z0JBQ2pDLFdBQVc7Z0JBQ1gsc0JBQXNCO2dCQUN0QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ25CLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDckIsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2FBQ3hCLENBQUMsQ0FBQTtZQUVGLElBQUksQ0FBQyxVQUFVO2dCQUFFLFNBQVE7WUFFekIsSUFBSSxPQUFPLFVBQVUsQ0FBQyxNQUFNLEtBQUssUUFBUSxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMxRSxNQUFNLElBQUksS0FBSyxDQUFDLDREQUE0RCxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtZQUNsRyxDQUFDO1lBRUQsSUFBSSxPQUFPLFVBQVUsQ0FBQyxVQUFVLEtBQUssUUFBUSxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNsRixNQUFNLElBQUksS0FBSyxDQUFDLGdFQUFnRSxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQTtZQUMxRyxDQUFDO1lBRUQsSUFBSSxVQUFVLENBQUMsTUFBTSxJQUFJLE9BQU8sVUFBVSxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDL0QsTUFBTSxJQUFJLEtBQUssQ0FBQyw2REFBNkQsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7WUFDbkcsQ0FBQztZQUVELElBQUksVUFBVSxDQUFDLGVBQWUsS0FBSyxTQUFTLElBQUksT0FBTyxVQUFVLENBQUMsZUFBZSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUNqRyxNQUFNLElBQUksS0FBSyxDQUFDLDJGQUEyRixVQUFVLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQTtZQUMxSSxDQUFDO1lBRUQsSUFBSSxVQUFVLENBQUMsY0FBYyxLQUFLLFNBQVMsSUFBSSxPQUFPLFVBQVUsQ0FBQyxjQUFjLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzdGLE1BQU0sSUFBSSxLQUFLLENBQUMsa0ZBQWtGLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFBO1lBQ2hJLENBQUM7WUFFRCxJQUFJLFVBQVUsQ0FBQyx5QkFBeUIsS0FBSyxTQUFTLElBQUksT0FBTyxVQUFVLENBQUMseUJBQXlCLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3BILE1BQU0sSUFBSSxLQUFLLENBQUMsOEZBQThGLFVBQVUsQ0FBQyx5QkFBeUIsRUFBRSxDQUFDLENBQUE7WUFDdkosQ0FBQztZQUVELElBQUksVUFBVSxDQUFDLHFCQUFxQixLQUFLLFNBQVMsSUFBSSxPQUFPLFVBQVUsQ0FBQyxxQkFBcUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDNUcsTUFBTSxJQUFJLEtBQUssQ0FBQywwRkFBMEYsVUFBVSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQTtZQUMvSSxDQUFDO1lBRUQsSUFBSSxVQUFVLENBQUMsb0JBQW9CLEtBQUssU0FBUyxJQUFJLE9BQU8sVUFBVSxDQUFDLG9CQUFvQixLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMxRyxNQUFNLElBQUksS0FBSyxDQUFDLHlGQUF5RixVQUFVLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFBO1lBQzdJLENBQUM7WUFFRCxJQUFJLFVBQVUsQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLE9BQU8sVUFBVSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDakYsTUFBTSxJQUFJLEtBQUssQ0FBQyw0RUFBNEUsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7WUFDcEgsQ0FBQztZQUVELElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN0QixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQy9DLENBQUM7WUFFRCxPQUFPLFVBQVUsQ0FBQTtRQUNuQixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxlQUFlLENBQUMsRUFBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBQztRQUN4RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFBO1FBQzVCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUE7UUFDbkQsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsRUFBRSxJQUFJLFNBQVMsQ0FBQTtRQUMxRCxNQUFNLFlBQVksR0FBRyxnQ0FBZ0MsQ0FBQyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtRQUVuRyxPQUFPLFlBQVksQ0FBQyxNQUFNLENBQUE7UUFDMUIsT0FBTyxZQUFZLENBQUMsVUFBVSxDQUFBO1FBRTlCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxFQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFDLENBQUMsQ0FBQTtRQUU5RixNQUFNLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsT0FBTyxDQUFDLFVBQVUsRUFBRSxLQUFLLE9BQU8sQ0FBQyxJQUFJLEVBQUUsU0FBUyxhQUFhLE9BQU8sU0FBUyxFQUFFLENBQUMsQ0FBQTtRQUNuSSxNQUFNLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixlQUFlLENBQUMsSUFBSSxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDMUYsTUFBTSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLGVBQWUsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFBO0lBQzFFLENBQUM7SUFFRDs7O09BR0c7SUFDSCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUE7SUFDMUUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFFBQVE7UUFDL0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsRUFBRSxDQUFBO1FBRWxFLE9BQU8sYUFBYTtZQUNsQixDQUFDLENBQUMsTUFBTSxhQUFhLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUM7WUFDckQsQ0FBQyxDQUFDLE1BQU0sUUFBUSxFQUFFLENBQUE7SUFDdEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILHdCQUF3QixDQUFDLEVBQUMsZUFBZSxFQUFFLFNBQVMsRUFBQztRQUNuRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLHVCQUF1QixFQUFFLENBQUE7UUFFbEUsSUFBSSxDQUFDLGFBQWE7WUFBRSxPQUFNO1FBRTFCLGFBQWEsQ0FBQyxtQkFBbUIsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFBO1FBQ3hELGFBQWEsQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLENBQUE7SUFDOUMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxnQkFBZ0IsQ0FBQyxJQUFJO1FBQ25COzs7O1dBSUc7UUFDSCxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUE7UUFDakQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQy9CLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFDdEMsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO1FBQy9CLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtRQUNsQyxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUE7UUFDdEMsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFBO1FBQ3RDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO1FBQzlDLE1BQU0sVUFBVSxHQUFHLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFBO1FBQ2hELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUNsRCxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQzVELE1BQU0sc0JBQXNCLEdBQUcsR0FBRyxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQyxDQUFBO1FBRTNELE9BQU8sR0FBRyxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxLQUFLLElBQUksT0FBTyxJQUFJLE9BQU8sSUFBSSxVQUFVLEdBQUcsV0FBVyxHQUFHLHNCQUFzQixFQUFFLENBQUE7SUFDdEgsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCx5QkFBeUIsQ0FBQyxLQUFLO1FBQzdCLElBQUksS0FBSyxZQUFZLFlBQVksRUFBRSxDQUFDO1lBQ2xDLE9BQU87Z0JBQ0wsU0FBUyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSTtnQkFDakMsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUU7Z0JBQzFCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFO2FBQ25CLENBQUE7UUFDSCxDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUNsRSxDQUFDO1FBRUQsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDdkM7OzJDQUUrQjtZQUMvQixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUE7WUFFakIsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7WUFDMUQsQ0FBQztZQUVELE9BQU8sTUFBTSxDQUFBO1FBQ2YsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7ZGlybmFtZX0gZnJvbSBcInBhdGhcIlxuaW1wb3J0IHtmaWxlVVJMVG9QYXRofSBmcm9tIFwidXJsXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQge2Vuc3VyZUVycm9yfSBmcm9tIFwidHlwYW5pY1wiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi9sb2dnZXIuanNcIlxuaW1wb3J0IFVwbG9hZGVkRmlsZSBmcm9tIFwiLi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3VwbG9hZGVkLWZpbGUvdXBsb2FkZWQtZmlsZS5qc1wiXG5pbXBvcnQgdG9JbXBvcnRTcGVjaWZpZXIgZnJvbSBcIi4uL3V0aWxzL3RvLWltcG9ydC1zcGVjaWZpZXIuanNcIlxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIGFjdGlvbiBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbk5hbWUgLSBSYXcgYWN0aW9uIG5hbWUgZnJvbSByb3V0ZSBwYXJhbXMgb3Igcm91dGUgaG9vay5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gTm9ybWFsaXplZCBjb250cm9sbGVyIG1ldGhvZCBuYW1lLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVBY3Rpb25OYW1lKGFjdGlvbk5hbWUpIHtcbiAgcmV0dXJuIGluZmxlY3Rpb24uY2FtZWxpemUoYWN0aW9uTmFtZS5yZXBsYWNlQWxsKFwiLVwiLCBcIl9cIikucmVwbGFjZUFsbChcIi9cIiwgXCJfXCIpLCB0cnVlKVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNSb3V0ZXNSZXNvbHZlciB7XG4gIC8qKlxuICAgKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuXG4gICAqIEB0eXBlIHtMb2dnZXIgfCB1bmRlZmluZWR9ICovXG4gIGxvZ2dlclxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1yZXF1ZXN0LmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVxdWVzdCAtIFJlcXVlc3Qgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2h0dHAtc2VydmVyL2NsaWVudC9yZXNwb25zZS5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlc3BvbnNlIC0gUmVzcG9uc2Ugb2JqZWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIHJlcXVlc3QsIHJlc3BvbnNlfSkge1xuICAgIGlmICghY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiTm8gY29uZmlndXJhdGlvbiBnaXZlblwiKVxuICAgIGlmICghcmVxdWVzdCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVxdWVzdCBnaXZlblwiKVxuICAgIGlmICghcmVzcG9uc2UpIHRocm93IG5ldyBFcnJvcihcIk5vIHJlc3BvbnNlIGdpdmVuXCIpXG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKFwiUm91dGVzUmVzb2x2ZXJcIiwge2NvbmZpZ3VyYXRpb259KVxuICAgIGNvbnN0IHJlcXVlc3RQYXJhbXMgPSByZXF1ZXN0LnBhcmFtcygpIHx8IHt9XG4gICAgdGhpcy5wYXJhbXMgPSB7Li4ucmVxdWVzdFBhcmFtc31cbiAgICBkZWxldGUgdGhpcy5wYXJhbXMuYWN0aW9uXG4gICAgZGVsZXRlIHRoaXMucGFyYW1zLmNvbnRyb2xsZXJcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0XG4gICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBxdWVyeSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gLSBGbGF0IHF1ZXJ5IHBhcmFtcyBmb3IgdGVuYW50L2FiaWxpdHkgcmVzb2x1dGlvbi5cbiAgICovXG4gIHF1ZXJ5UGFyYW1ldGVycygpIHtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMucmVxdWVzdC5wYXRoKCkuc3BsaXQoXCI/XCIpWzFdXG5cbiAgICBpZiAoIXF1ZXJ5KSByZXR1cm4ge31cblxuICAgIC8qKlxuICAgICAqIFBhcmFtcy5cbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgICBjb25zdCBwYXJhbXMgPSB7fVxuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocXVlcnkpXG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBzZWFyY2hQYXJhbXMuZW50cmllcygpKSB7XG4gICAgICBpZiAocGFyYW1zW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYXJhbXNba2V5XSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtc1xuICB9XG5cbiAgYXN5bmMgcmVzb2x2ZSgpIHtcbiAgICB0aGlzLnJvdXRlSG9va0NvbnRyb2xsZXJDbGFzcyA9IHVuZGVmaW5lZFxuICAgIGxldCBjb250cm9sbGVyUGF0aFxuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb25Sb3V0ZXMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Um91dGVzKClcbiAgICBjb25zdCBjdXJyZW50Um91dGUgPSBjb25maWd1cmF0aW9uUm91dGVzPy5yb290Um91dGVcbiAgICBjb25zdCByYXdQYXRoID0gdGhpcy5yZXF1ZXN0LnBhdGgoKVxuICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gcmF3UGF0aC5zcGxpdChcIj9cIilbMF1cbiAgICBsZXQgdmlld1BhdGhcblxuICAgIGNvbnN0IHByZUNoZWNrUGFyYW1zID0gey4uLnRoaXMucGFyYW1zfVxuICAgIGNvbnN0IGhhc01hdGNoaW5nQ3VzdG9tUm91dGUgPSBjdXJyZW50Um91dGUgPyAhIXRoaXMubWF0Y2hQYXRoV2l0aFJvdXRlcyhjdXJyZW50Um91dGUsIGN1cnJlbnRQYXRoKSA6IGZhbHNlXG5cbiAgICBpZiAoaGFzTWF0Y2hpbmdDdXN0b21Sb3V0ZSkge1xuICAgICAgdGhpcy5wYXJhbXMgPSBwcmVDaGVja1BhcmFtc1xuICAgIH1cblxuICAgIGNvbnN0IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2ggPSBhd2FpdCB0aGlzLnJlc29sdmVSb3V0ZVJlc29sdmVySG9va3MoY3VycmVudFBhdGgsIHtoYXNNYXRjaGluZ0N1c3RvbVJvdXRlfSlcbiAgICBsZXQgc2tpcENvbnRyb2xsZXJDb25uZWN0aW9ucyA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2g/LnNraXBDb250cm9sbGVyQ29ubmVjdGlvbnMgPT09IHRydWVcbiAgICBsZXQgc2tpcEFiaWxpdHlSZXNvbHV0aW9uID0gcm91dGVSZXNvbHZlckhvb2tNYXRjaD8uc2tpcEFiaWxpdHlSZXNvbHV0aW9uID09PSB0cnVlXG4gICAgbGV0IHNraXBUZW5hbnRSZXNvbHV0aW9uID0gcm91dGVSZXNvbHZlckhvb2tNYXRjaD8uc2tpcFRlbmFudFJlc29sdXRpb24gPT09IHRydWVcbiAgICBjb25zdCBtYXRjaFJlc3VsdCA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2ggfHwgIWN1cnJlbnRSb3V0ZSA/IHVuZGVmaW5lZCA6IHRoaXMubWF0Y2hQYXRoV2l0aFJvdXRlcyhjdXJyZW50Um91dGUsIGN1cnJlbnRQYXRoKVxuICAgIGNvbnN0IGFjdGlvblBhcmFtID0gdGhpcy5wYXJhbXMuYWN0aW9uXG4gICAgY29uc3QgY29udHJvbGxlclBhcmFtID0gdGhpcy5wYXJhbXMuY29udHJvbGxlclxuICAgIGNvbnN0IGFjdGlvblZhbHVlID0gdHlwZW9mIGFjdGlvblBhcmFtID09IFwic3RyaW5nXCIgPyBhY3Rpb25QYXJhbSA6IChBcnJheS5pc0FycmF5KGFjdGlvblBhcmFtKSA/IGFjdGlvblBhcmFtWzBdIDogdW5kZWZpbmVkKVxuICAgIGxldCBhY3Rpb24gPSB0eXBlb2YgYWN0aW9uVmFsdWUgPT0gXCJzdHJpbmdcIiA/IG5vcm1hbGl6ZUFjdGlvbk5hbWUoYWN0aW9uVmFsdWUpIDogdW5kZWZpbmVkXG4gICAgbGV0IGNvbnRyb2xsZXIgPSB0eXBlb2YgY29udHJvbGxlclBhcmFtID09IFwic3RyaW5nXCIgPyBjb250cm9sbGVyUGFyYW0gOiAoQXJyYXkuaXNBcnJheShjb250cm9sbGVyUGFyYW0pID8gY29udHJvbGxlclBhcmFtWzBdIDogdW5kZWZpbmVkKVxuXG4gICAgaWYgKHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2gpIHtcbiAgICAgIGNvbnN0IHJvdXRlSG9va0NvbnRyb2xsZXJDbGFzcyA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2guY29udHJvbGxlckNsYXNzXG4gICAgICBsZXQgcm91dGVIb29rQ29udHJvbGxlclBhdGhcbiAgICAgIGxldCByb3V0ZUhvb2tWaWV3UGF0aFxuXG4gICAgICBpZiAodHlwZW9mIHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2guY29udHJvbGxlclBhdGggPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcm91dGVIb29rQ29udHJvbGxlclBhdGggPSByb3V0ZVJlc29sdmVySG9va01hdGNoLmNvbnRyb2xsZXJQYXRoXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygcm91dGVSZXNvbHZlckhvb2tNYXRjaC52aWV3UGF0aCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByb3V0ZUhvb2tWaWV3UGF0aCA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2gudmlld1BhdGhcbiAgICAgIH1cblxuICAgICAgY29udHJvbGxlciA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2guY29udHJvbGxlclxuICAgICAgYWN0aW9uID0gbm9ybWFsaXplQWN0aW9uTmFtZShyb3V0ZVJlc29sdmVySG9va01hdGNoLmFjdGlvbilcbiAgICAgIHRoaXMucGFyYW1zLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyXG4gICAgICB0aGlzLnBhcmFtcy5hY3Rpb24gPSByb3V0ZVJlc29sdmVySG9va01hdGNoLmFjdGlvblxuICAgICAgY29udHJvbGxlclBhdGggPSByb3V0ZUhvb2tDb250cm9sbGVyUGF0aCB8fCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0b3J5KCl9L3NyYy9yb3V0ZXMvJHtjb250cm9sbGVyfS9jb250cm9sbGVyLmpzYFxuICAgICAgdmlld1BhdGggPSByb3V0ZUhvb2tWaWV3UGF0aCB8fCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0b3J5KCl9L3NyYy9yb3V0ZXMvJHtjb250cm9sbGVyfWBcbiAgICAgIHRoaXMucm91dGVIb29rQ29udHJvbGxlckNsYXNzID0gcm91dGVIb29rQ29udHJvbGxlckNsYXNzXG4gICAgfSBlbHNlIGlmICghbWF0Y2hSZXN1bHQpIHtcbiAgICAgIGNvbnN0IF9fZmlsZW5hbWUgPSBmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybClcbiAgICAgIGNvbnN0IF9fZGlybmFtZSA9IGRpcm5hbWUoX19maWxlbmFtZSlcbiAgICAgIGNvbnN0IHJlcXVlc3RlZFBhdGggPSBjdXJyZW50UGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIikgfHwgXCJfcm9vdFwiXG4gICAgICBjb25zdCBhdHRlbXB0ZWRDb250cm9sbGVyUGF0aCA9IGAke3RoaXMuY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL3JvdXRlcy8ke3JlcXVlc3RlZFBhdGh9L2NvbnRyb2xsZXIuanNgXG5cbiAgICAgIGNvbnN0IGxvZ2dlciA9IHRoaXMubG9nZ2VyXG5cbiAgICAgIGlmICghbG9nZ2VyKSB0aHJvdyBuZXcgRXJyb3IoXCJMb2dnZXIgbm90IGluaXRpYWxpemVkXCIpXG5cbiAgICAgIGF3YWl0IGxvZ2dlci53YXJuKGBObyByb3V0ZSBtYXRjaGVkIGZvciAke3Jhd1BhdGh9LiBUcmllZCBjb250cm9sbGVyIGF0ICR7YXR0ZW1wdGVkQ29udHJvbGxlclBhdGh9YClcblxuICAgICAgY29udHJvbGxlciA9IFwiZXJyb3JzXCJcbiAgICAgIGNvbnRyb2xsZXJQYXRoID0gXCIuL2J1aWx0LWluL2Vycm9ycy9jb250cm9sbGVyLmpzXCJcbiAgICAgIGFjdGlvbiA9IFwibm90Rm91bmRcIlxuICAgICAgc2tpcEFiaWxpdHlSZXNvbHV0aW9uID0gdHJ1ZVxuICAgICAgc2tpcENvbnRyb2xsZXJDb25uZWN0aW9ucyA9IHRydWVcbiAgICAgIHNraXBUZW5hbnRSZXNvbHV0aW9uID0gdHJ1ZVxuICAgICAgdmlld1BhdGggPSBhd2FpdCBmcy5yZWFscGF0aChgJHtfX2Rpcm5hbWV9L2J1aWx0LWluL2Vycm9yc2ApXG4gICAgfSBlbHNlIGlmIChhY3Rpb24pIHtcbiAgICAgIGlmICghY29udHJvbGxlcikgY29udHJvbGxlciA9IFwiX3Jvb3RcIlxuXG4gICAgICBjb250cm9sbGVyUGF0aCA9IGAke3RoaXMuY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL3JvdXRlcy8ke2NvbnRyb2xsZXJ9L2NvbnRyb2xsZXIuanNgXG4gICAgICB2aWV3UGF0aCA9IGAke3RoaXMuY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL3JvdXRlcy8ke2NvbnRyb2xsZXJ9YFxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1hdGNoZWQgdGhlIHJvdXRlIGJ1dCBkaWRuJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggaXQ6ICR7cmF3UGF0aH0gKGFjdGlvbjogJHthY3Rpb259LCBjb250cm9sbGVyOiAke2NvbnRyb2xsZXJ9LCBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5wYXJhbXMpfSlgKVxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRyb2xsZXJDbGFzcyA9IGF3YWl0IHRoaXMucmVzb2x2ZUNvbnRyb2xsZXJDbGFzcyh7Y29udHJvbGxlclBhdGh9KVxuICAgIGNvbnN0IGNvbnRyb2xsZXJSZXF1ZXN0ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSAqLyAodGhpcy5yZXF1ZXN0KVxuICAgIGNvbnN0IGNvbnRyb2xsZXJJbnN0YW5jZSA9IG5ldyBjb250cm9sbGVyQ2xhc3Moe1xuICAgICAgYWN0aW9uLFxuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgY29udHJvbGxlcixcbiAgICAgIHBhcmFtczogdGhpcy5wYXJhbXMsXG4gICAgICByZXF1ZXN0OiBjb250cm9sbGVyUmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlLFxuICAgICAgdmlld1BhdGhcbiAgICB9KVxuXG4gICAgaWYgKCEoYWN0aW9uIGluIGNvbnRyb2xsZXJJbnN0YW5jZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBhY3Rpb24gb24gY29udHJvbGxlcjogJHtjb250cm9sbGVyfSMke2FjdGlvbn1gKVxuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbkhhbmRsZXJzID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPj59ICovICgvKiogQHR5cGUgez99ICovIChjb250cm9sbGVySW5zdGFuY2UpKVxuXG4gICAgY29uc3QgbG9nTWV0aG9kID0gdGhpcy5fbG9nTWV0aG9kKClcblxuICAgIHRoaXMuX3NldENvbXBsZXRlZExvZ01ldGFkYXRhKHtjb250cm9sbGVyQ2xhc3MsIGxvZ01ldGhvZH0pXG4gICAgYXdhaXQgdGhpcy5fbG9nQWN0aW9uU3RhcnQoe2FjdGlvbiwgY29udHJvbGxlckNsYXNzLCBsb2dNZXRob2R9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbmFudCA9IHNraXBUZW5hbnRSZXNvbHV0aW9uIHx8ICF0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0VGVuYW50UmVzb2x2ZXIoKVxuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5lbnN1cmVDb25uZWN0aW9ucyh7bmFtZTogYCR7Y29udHJvbGxlckNsYXNzLm5hbWV9LiR7YWN0aW9ufSB0ZW5hbnQgcmVzb2x1dGlvbmB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJlc29sdmVUZW5hbnQoe1xuICAgICAgICAgICAgICBwYXJhbXM6IHsuLi50aGlzLnF1ZXJ5UGFyYW1ldGVycygpLCAuLi50aGlzLnBhcmFtc30sXG4gICAgICAgICAgICAgIHJlcXVlc3Q6IHRoaXMucmVxdWVzdCxcbiAgICAgICAgICAgICAgcmVzcG9uc2U6IHRoaXMucmVzcG9uc2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcblxuICAgICAgY29uc3QgcnVuQWN0aW9uID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBydW5Db250cm9sbGVyQWN0aW9uID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWJpbGl0eSA9IHNraXBBYmlsaXR5UmVzb2x1dGlvblxuICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA6IGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5yZXNvbHZlQWJpbGl0eSh7XG4gICAgICAgICAgICAgICAgICBwYXJhbXM6IHRoaXMucGFyYW1zLFxuICAgICAgICAgICAgICAgICAgcmVxdWVzdDogdGhpcy5yZXF1ZXN0LFxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6IHRoaXMucmVzcG9uc2VcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucnVuV2l0aEFiaWxpdHkoYWJpbGl0eSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9tZWFzdXJlQ29udHJvbGxlcihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbGxlckluc3RhbmNlLl9ydW5CZWZvcmVDYWxsYmFja3MoKVxuICAgICAgICAgICAgICAgIGF3YWl0IGFjdGlvbkhhbmRsZXJzW2FjdGlvbl0oKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2tpcENvbnRyb2xsZXJDb25uZWN0aW9ucykge1xuICAgICAgICAgICAgYXdhaXQgcnVuQ29udHJvbGxlckFjdGlvbigpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5lbnN1cmVDb25uZWN0aW9ucyh7bmFtZTogYCR7Y29udHJvbGxlckNsYXNzLm5hbWV9LiR7YWN0aW9ufWB9LCBydW5Db250cm9sbGVyQWN0aW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXJvdW5kQWN0aW9uID0gdGhpcy5jb25maWd1cmF0aW9uLmdldEFyb3VuZEFjdGlvbj8uKClcblxuICAgICAgaWYgKGFyb3VuZEFjdGlvbikge1xuICAgICAgICBhd2FpdCBhcm91bmRBY3Rpb24oe3JlcXVlc3Q6IHRoaXMucmVxdWVzdCwgcmVzcG9uc2U6IHRoaXMucmVzcG9uc2UsIG5leHQ6IHJ1bkFjdGlvbn0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBydW5BY3Rpb24oKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlbnN1cmVkRXJyb3IgPSBlbnN1cmVFcnJvcihlcnJvcilcbiAgICAgIGNvbnN0IGVycm9yQ29udGV4dCA9IHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjb250cm9sbGVyLFxuICAgICAgICBodHRwTWV0aG9kOiB0aGlzLnJlcXVlc3QuaHR0cE1ldGhvZCgpLFxuICAgICAgICBwYXRoOiB0aGlzLnJlcXVlc3QucGF0aCgpLFxuICAgICAgICBzdGFnZTogXCJjb250cm9sbGVyLWFjdGlvblwiXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9yV2l0aENvbnRleHQgPSAvKiogQHR5cGUge3t2ZWxvY2lvdXNDb250ZXh0Pzogb2JqZWN0fX0gKi8gKGVuc3VyZWRFcnJvcilcblxuICAgICAgZXJyb3JXaXRoQ29udGV4dC52ZWxvY2lvdXNDb250ZXh0ID0ge1xuICAgICAgICAuLi4oZXJyb3JXaXRoQ29udGV4dC52ZWxvY2lvdXNDb250ZXh0IHx8IHt9KSxcbiAgICAgICAgY29udHJvbGxlckFjdGlvbjogZXJyb3JDb250ZXh0XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVuc3VyZWRFcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlc29sdmUgY29udHJvbGxlciBjbGFzcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb250cm9sbGVyUGF0aCAtIENvbnRyb2xsZXIgaW1wb3J0IHBhdGguXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHR5cGVvZiBpbXBvcnQoXCIuLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHQ+fSAtIFRoZSByZXNvbHZlZCBjb250cm9sbGVyIGNsYXNzLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZUNvbnRyb2xsZXJDbGFzcyh7Y29udHJvbGxlclBhdGh9KSB7XG4gICAgaWYgKHRoaXMucm91dGVIb29rQ29udHJvbGxlckNsYXNzKSByZXR1cm4gdGhpcy5yb3V0ZUhvb2tDb250cm9sbGVyQ2xhc3NcblxuICAgIGNvbnN0IGNvbnRyb2xsZXJJbXBvcnRTcGVjaWZpZXIgPSB0b0ltcG9ydFNwZWNpZmllcihjb250cm9sbGVyUGF0aClcblxuICAgIHJldHVybiAvKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHR9ICovICgoYXdhaXQgaW1wb3J0KGNvbnRyb2xsZXJJbXBvcnRTcGVjaWZpZXIpKS5kZWZhdWx0KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbWF0Y2ggcGF0aCB3aXRoIHJvdXRlcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2Jhc2Utcm91dGUuanNcIikuZGVmYXVsdH0gcm91dGUgLSBSb3V0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXRoLlxuICAgKiBAcmV0dXJucyB7e3Jlc3RQYXRoOiBzdHJpbmd9IHwgdW5kZWZpbmVkfSAtIFJFU1QgcGF0aCBtZXRhZGF0YSBmb3IgdGhpcyByb3V0ZS5cbiAgICovXG4gIG1hdGNoUGF0aFdpdGhSb3V0ZXMocm91dGUsIHBhdGgpIHtcbiAgICBjb25zdCBwYXRoV2l0aG91dFNsYXNoID0gcGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIikuc3BsaXQoXCI/XCIpWzBdXG5cbiAgICBmb3IgKGNvbnN0IHN1YlJvdXRlIG9mIHJvdXRlLnJvdXRlcykge1xuICAgICAgY29uc3QgcGFyYW1zU25hcHNob3QgPSB7Li4udGhpcy5wYXJhbXN9XG4gICAgICBjb25zdCBtYXRjaFJlc3VsdCA9IHN1YlJvdXRlLm1hdGNoV2l0aFBhdGgoe1xuICAgICAgICBwYXJhbXM6IHRoaXMucGFyYW1zLFxuICAgICAgICBwYXRoOiBwYXRoV2l0aG91dFNsYXNoLFxuICAgICAgICByZXF1ZXN0OiB0aGlzLnJlcXVlc3RcbiAgICAgIH0pXG5cbiAgICAgIGlmICghbWF0Y2hSZXN1bHQpIHtcbiAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXNTbmFwc2hvdFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7cmVzdFBhdGh9ID0gbWF0Y2hSZXN1bHRcblxuICAgICAgaWYgKHJlc3RQYXRoKSB7XG4gICAgICAgIGNvbnN0IHJlY3Vyc2l2ZU1hdGNoID0gdGhpcy5tYXRjaFBhdGhXaXRoUm91dGVzKHN1YlJvdXRlLCByZXN0UGF0aClcblxuICAgICAgICBpZiAocmVjdXJzaXZlTWF0Y2gpIHtcbiAgICAgICAgICByZXR1cm4gcmVjdXJzaXZlTWF0Y2hcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zU25hcHNob3RcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1hdGNoUmVzdWx0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVzb2x2ZSByb3V0ZSByZXNvbHZlciBob29rcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGN1cnJlbnRQYXRoIC0gUmVxdWVzdCBwYXRoIHdpdGhvdXQgcXVlcnkgc3RyaW5nLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIFJlc29sdmVyIGhvb2sgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5oYXNNYXRjaGluZ0N1c3RvbVJvdXRlXSAtIFRydWUgd2hlbiB0aGUgcGF0aCBtYXRjaGVkIGFuIGV4cGxpY2l0IGN1c3RvbSByb3V0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Sb3V0ZVJlc29sdmVySG9va1Jlc3VsdCB8IG51bGw+fSAtIE1hdGNoZWQgYWN0aW9uL2NvbnRyb2xsZXIgZnJvbSBob29rcy5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVSb3V0ZVJlc29sdmVySG9va3MoY3VycmVudFBhdGgsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHtoYXNNYXRjaGluZ0N1c3RvbVJvdXRlID0gZmFsc2V9ID0gb3B0aW9uc1xuXG4gICAgY29uc3QgaG9va3MgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Um91dGVSZXNvbHZlckhvb2tzPy4oKSB8fCBbXVxuXG4gICAgZm9yIChjb25zdCBob29rIG9mIGhvb2tzKSB7XG4gICAgICBjb25zdCBob29rUmVzdWx0ID0gYXdhaXQgaG9vayh7XG4gICAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgY3VycmVudFBhdGgsXG4gICAgICAgIGhhc01hdGNoaW5nQ3VzdG9tUm91dGUsXG4gICAgICAgIHBhcmFtczogdGhpcy5wYXJhbXMsXG4gICAgICAgIHJlcXVlc3Q6IHRoaXMucmVxdWVzdCxcbiAgICAgICAgcmVzb2x2ZXI6IHRoaXMsXG4gICAgICAgIHJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlXG4gICAgICB9KVxuXG4gICAgICBpZiAoIWhvb2tSZXN1bHQpIGNvbnRpbnVlXG5cbiAgICAgIGlmICh0eXBlb2YgaG9va1Jlc3VsdC5hY3Rpb24gIT09IFwic3RyaW5nXCIgfHwgaG9va1Jlc3VsdC5hY3Rpb24ubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHJvdXRlIHJlc29sdmVyIGhvb2sgYWN0aW9uIHRvIGJlIGEgc3RyaW5nLCBnb3Q6ICR7aG9va1Jlc3VsdC5hY3Rpb259YClcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBob29rUmVzdWx0LmNvbnRyb2xsZXIgIT09IFwic3RyaW5nXCIgfHwgaG9va1Jlc3VsdC5jb250cm9sbGVyLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCByb3V0ZSByZXNvbHZlciBob29rIGNvbnRyb2xsZXIgdG8gYmUgYSBzdHJpbmcsIGdvdDogJHtob29rUmVzdWx0LmNvbnRyb2xsZXJ9YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQucGFyYW1zICYmIHR5cGVvZiBob29rUmVzdWx0LnBhcmFtcyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHJvdXRlIHJlc29sdmVyIGhvb2sgcGFyYW1zIHRvIGJlIGFuIG9iamVjdCwgZ290OiAke2hvb2tSZXN1bHQucGFyYW1zfWApXG4gICAgICB9XG5cbiAgICAgIGlmIChob29rUmVzdWx0LmNvbnRyb2xsZXJDbGFzcyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBob29rUmVzdWx0LmNvbnRyb2xsZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayBjb250cm9sbGVyQ2xhc3MgdG8gYmUgYSBjbGFzcy9mdW5jdGlvbiB3aGVuIHByb3ZpZGVkLCBnb3Q6ICR7aG9va1Jlc3VsdC5jb250cm9sbGVyQ2xhc3N9YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQuY29udHJvbGxlclBhdGggIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgaG9va1Jlc3VsdC5jb250cm9sbGVyUGF0aCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHJvdXRlIHJlc29sdmVyIGhvb2sgY29udHJvbGxlclBhdGggdG8gYmUgYSBzdHJpbmcgd2hlbiBwcm92aWRlZCwgZ290OiAke2hvb2tSZXN1bHQuY29udHJvbGxlclBhdGh9YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQuc2tpcENvbnRyb2xsZXJDb25uZWN0aW9ucyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBob29rUmVzdWx0LnNraXBDb250cm9sbGVyQ29ubmVjdGlvbnMgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayBza2lwQ29udHJvbGxlckNvbm5lY3Rpb25zIHRvIGJlIGEgYm9vbGVhbiB3aGVuIHByb3ZpZGVkLCBnb3Q6ICR7aG9va1Jlc3VsdC5za2lwQ29udHJvbGxlckNvbm5lY3Rpb25zfWApXG4gICAgICB9XG5cbiAgICAgIGlmIChob29rUmVzdWx0LnNraXBBYmlsaXR5UmVzb2x1dGlvbiAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBob29rUmVzdWx0LnNraXBBYmlsaXR5UmVzb2x1dGlvbiAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCByb3V0ZSByZXNvbHZlciBob29rIHNraXBBYmlsaXR5UmVzb2x1dGlvbiB0byBiZSBhIGJvb2xlYW4gd2hlbiBwcm92aWRlZCwgZ290OiAke2hvb2tSZXN1bHQuc2tpcEFiaWxpdHlSZXNvbHV0aW9ufWApXG4gICAgICB9XG5cbiAgICAgIGlmIChob29rUmVzdWx0LnNraXBUZW5hbnRSZXNvbHV0aW9uICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGhvb2tSZXN1bHQuc2tpcFRlbmFudFJlc29sdXRpb24gIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayBza2lwVGVuYW50UmVzb2x1dGlvbiB0byBiZSBhIGJvb2xlYW4gd2hlbiBwcm92aWRlZCwgZ290OiAke2hvb2tSZXN1bHQuc2tpcFRlbmFudFJlc29sdXRpb259YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQudmlld1BhdGggIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgaG9va1Jlc3VsdC52aWV3UGF0aCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHJvdXRlIHJlc29sdmVyIGhvb2sgdmlld1BhdGggdG8gYmUgYSBzdHJpbmcgd2hlbiBwcm92aWRlZCwgZ290OiAke2hvb2tSZXN1bHQudmlld1BhdGh9YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQucGFyYW1zKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5wYXJhbXMsIGhvb2tSZXN1bHQucGFyYW1zKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gaG9va1Jlc3VsdFxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBsb2cgYWN0aW9uIHN0YXJ0LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hY3Rpb24gLSBBY3Rpb24uXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdH0gYXJncy5jb250cm9sbGVyQ2xhc3MgLSBDb250cm9sbGVyIGNsYXNzLlxuICAgKiBAcGFyYW0ge1wiZGVidWdcIiB8IFwiaW5mb1wifSBhcmdzLmxvZ01ldGhvZCAtIExvZ2dlciBtZXRob2QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfbG9nQWN0aW9uU3RhcnQoe2FjdGlvbiwgY29udHJvbGxlckNsYXNzLCBsb2dNZXRob2R9KSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucmVxdWVzdFxuICAgIGNvbnN0IHRpbWVzdGFtcCA9IHRoaXMuX2Zvcm1hdFRpbWVzdGFtcChuZXcgRGF0ZSgpKVxuICAgIGNvbnN0IHJlbW90ZUFkZHJlc3MgPSByZXF1ZXN0LnJlbW90ZUFkZHJlc3MoKSB8fCBcInVua25vd25cIlxuICAgIGNvbnN0IGxvZ2dlZFBhcmFtcyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovICh0aGlzLl9zYW5pdGl6ZVBhcmFtc0ZvckxvZ2dpbmcodGhpcy5wYXJhbXMpKVxuXG4gICAgZGVsZXRlIGxvZ2dlZFBhcmFtcy5hY3Rpb25cbiAgICBkZWxldGUgbG9nZ2VkUGFyYW1zLmNvbnRyb2xsZXJcblxuICAgIGNvbnN0IGNvbnRyb2xsZXJMb2dnZXIgPSBuZXcgTG9nZ2VyKGNvbnRyb2xsZXJDbGFzcy5uYW1lLCB7Y29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9ufSlcblxuICAgIGF3YWl0IGNvbnRyb2xsZXJMb2dnZXJbbG9nTWV0aG9kXSgoKSA9PiBgU3RhcnRlZCAke3JlcXVlc3QuaHR0cE1ldGhvZCgpfSBcIiR7cmVxdWVzdC5wYXRoKCl9XCIgZm9yICR7cmVtb3RlQWRkcmVzc30gYXQgJHt0aW1lc3RhbXB9YClcbiAgICBhd2FpdCBjb250cm9sbGVyTG9nZ2VyW2xvZ01ldGhvZF0oKCkgPT4gYFByb2Nlc3NpbmcgYnkgJHtjb250cm9sbGVyQ2xhc3MubmFtZX0jJHthY3Rpb259YClcbiAgICBhd2FpdCBjb250cm9sbGVyTG9nZ2VyW2xvZ01ldGhvZF0oKCkgPT4gW2AgIFBhcmFtZXRlcnM6YCwgbG9nZ2VkUGFyYW1zXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGxvZyBtZXRob2QuXG4gICAqIEByZXR1cm5zIHtcImRlYnVnXCIgfCBcImluZm9cIn0gLSBSZXF1ZXN0IGxvZyBtZXRob2QuXG4gICAqL1xuICBfbG9nTWV0aG9kKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RW52aXJvbm1lbnQoKSA9PT0gXCJ0ZXN0XCIgPyBcImRlYnVnXCIgOiBcImluZm9cIlxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbWVhc3VyZSBjb250cm9sbGVyLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gQ2FsbGJhY2sgdG8gbWVhc3VyZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgX21lYXN1cmVDb250cm9sbGVyKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgcmVxdWVzdFRpbWluZyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRDdXJyZW50UmVxdWVzdFRpbWluZygpXG5cbiAgICByZXR1cm4gcmVxdWVzdFRpbWluZ1xuICAgICAgPyBhd2FpdCByZXF1ZXN0VGltaW5nLm1lYXN1cmUoXCJjb250cm9sbGVyXCIsIGNhbGxiYWNrKVxuICAgICAgOiBhd2FpdCBjYWxsYmFjaygpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzZXQgY29tcGxldGVkIGxvZyBtZXRhZGF0YS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbnRyb2xsZXJDbGFzcyAtIENvbnRyb2xsZXIgY2xhc3MuXG4gICAqIEBwYXJhbSB7XCJkZWJ1Z1wiIHwgXCJpbmZvXCJ9IGFyZ3MubG9nTWV0aG9kIC0gTG9nZ2VyIG1ldGhvZC5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgX3NldENvbXBsZXRlZExvZ01ldGFkYXRhKHtjb250cm9sbGVyQ2xhc3MsIGxvZ01ldGhvZH0pIHtcbiAgICBjb25zdCByZXF1ZXN0VGltaW5nID0gdGhpcy5jb25maWd1cmF0aW9uLmdldEN1cnJlbnRSZXF1ZXN0VGltaW5nKClcblxuICAgIGlmICghcmVxdWVzdFRpbWluZykgcmV0dXJuXG5cbiAgICByZXF1ZXN0VGltaW5nLmNvbXBsZXRlZExvZ1N1YmplY3QgPSBjb250cm9sbGVyQ2xhc3MubmFtZVxuICAgIHJlcXVlc3RUaW1pbmcuY29tcGxldGVkTG9nTWV0aG9kID0gbG9nTWV0aG9kXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmb3JtYXQgdGltZXN0YW1wLlxuICAgKiBAcGFyYW0ge0RhdGV9IGRhdGUgLSBEYXRlIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSB0aW1lc3RhbXAuXG4gICAqL1xuICBfZm9ybWF0VGltZXN0YW1wKGRhdGUpIHtcbiAgICAvKipcbiAgICAgKiBQYWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bSAtIE51bS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBwYWQuXG4gICAgICovXG4gICAgY29uc3QgcGFkID0gKG51bSkgPT4gU3RyaW5nKG51bSkucGFkU3RhcnQoMiwgXCIwXCIpXG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKVxuICAgIGNvbnN0IG1vbnRoID0gcGFkKGRhdGUuZ2V0TW9udGgoKSArIDEpXG4gICAgY29uc3QgZGF5ID0gcGFkKGRhdGUuZ2V0RGF0ZSgpKVxuICAgIGNvbnN0IGhvdXJzID0gcGFkKGRhdGUuZ2V0SG91cnMoKSlcbiAgICBjb25zdCBtaW51dGVzID0gcGFkKGRhdGUuZ2V0TWludXRlcygpKVxuICAgIGNvbnN0IHNlY29uZHMgPSBwYWQoZGF0ZS5nZXRTZWNvbmRzKCkpXG4gICAgY29uc3Qgb2Zmc2V0TWludXRlcyA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKVxuICAgIGNvbnN0IG9mZnNldFNpZ24gPSBvZmZzZXRNaW51dGVzID4gMCA/IFwiLVwiIDogXCIrXCJcbiAgICBjb25zdCBvZmZzZXRUb3RhbE1pbnV0ZXMgPSBNYXRoLmFicyhvZmZzZXRNaW51dGVzKVxuICAgIGNvbnN0IG9mZnNldEhvdXJzID0gcGFkKE1hdGguZmxvb3Iob2Zmc2V0VG90YWxNaW51dGVzIC8gNjApKVxuICAgIGNvbnN0IG9mZnNldFJlbWFpbmluZ01pbnV0ZXMgPSBwYWQob2Zmc2V0VG90YWxNaW51dGVzICUgNjApXG5cbiAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9ICR7aG91cnN9OiR7bWludXRlc306JHtzZWNvbmRzfSAke29mZnNldFNpZ259JHtvZmZzZXRIb3Vyc30ke29mZnNldFJlbWFpbmluZ01pbnV0ZXN9YFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2FuaXRpemUgcGFyYW1zIGZvciBsb2dnaW5nLlxuICAgKiBAcGFyYW0gez99IHZhbHVlIC0gVmFsdWUgdG8gdXNlLlxuICAgKiBAcmV0dXJucyB7P30gLSBUaGUgc2FuaXRpemUgcGFyYW1zIGZvciBsb2dnaW5nLlxuICAgKi9cbiAgX3Nhbml0aXplUGFyYW1zRm9yTG9nZ2luZyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVwbG9hZGVkRmlsZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2xhc3NOYW1lOiB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgICBmaWxlbmFtZTogdmFsdWUuZmlsZW5hbWUoKSxcbiAgICAgICAgc2l6ZTogdmFsdWUuc2l6ZSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUubWFwKChpdGVtKSA9PiB0aGlzLl9zYW5pdGl6ZVBhcmFtc0ZvckxvZ2dpbmcoaXRlbSkpXG4gICAgfVxuXG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgLyoqXG4gICAgICAgKiBSZXN1bHQuXG4gICAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gICAgICBjb25zdCByZXN1bHQgPSB7fVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLl9zYW5pdGl6ZVBhcmFtc0ZvckxvZ2dpbmcodmFsdWVba2V5XSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG59XG4iXX0=