testcafe 3.3.0-rc.2 → 3.4.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/lib/api/request-hooks/request-logger.js +6 -3
  2. package/lib/api/structure/fixture.js +6 -1
  3. package/lib/api/structure/test-file.js +2 -2
  4. package/lib/api/structure/testing-unit.js +2 -1
  5. package/lib/api/test-page-url.js +2 -2
  6. package/lib/browser/connection/index.js +3 -1
  7. package/lib/cli/argument-parser/index.js +2 -2
  8. package/lib/client/automation/index.js +133 -189
  9. package/lib/client/automation/index.min.js +1 -1
  10. package/lib/client/browser/idle-page/index.html.mustache +1 -1
  11. package/lib/client/core/index.js +61 -295
  12. package/lib/client/core/index.min.js +1 -1
  13. package/lib/client/core/utils/array.js +3 -18
  14. package/lib/client/core/utils/dom.js +12 -32
  15. package/lib/client/driver/index.js +4 -32
  16. package/lib/client/driver/index.min.js +1 -1
  17. package/lib/client/test-run/index.js.mustache +1 -6
  18. package/lib/client/ui/index.js +63 -48
  19. package/lib/client/ui/index.min.js +1 -1
  20. package/lib/client/ui/styles.css +62 -2
  21. package/lib/client-functions/selectors/selector-text-filter.js +1 -3
  22. package/lib/compiler/test-file/formats/typescript/compiler.js +2 -1
  23. package/lib/errors/runtime/templates.js +2 -2
  24. package/lib/native-automation/client/deps/hammerhead.js +25 -0
  25. package/lib/native-automation/client/event-descriptor.js +12 -1
  26. package/lib/native-automation/client/input.js +17 -5
  27. package/lib/native-automation/request-hooks/event-factory/request-paused-event-based.js +2 -2
  28. package/lib/role/index.js +1 -4
  29. package/lib/role/role.js +9 -1
  30. package/lib/runner/browser-job.js +29 -5
  31. package/lib/test-run/index.js +4 -1
  32. package/package.json +16 -17
@@ -48,7 +48,7 @@ const should_move_option_to_end_1 = __importDefault(require("../utils/should-mov
48
48
  const REMOTE_ALIAS_RE = /^remote(?::(\d*))?$/;
49
49
  const DESCRIPTION = (0, dedent_1.default)(`
50
50
 
51
- To select a browser, specify an alias ("ie", "chrome", etc.) or the path to the browser executable. You can select more than one browser.
51
+ To select a browser, specify an alias ("edge", "chrome", etc.) or the path to the browser executable. You can select more than one browser.
52
52
 
53
53
  Use the "all" alias to run tests against all available browsers.
54
54
  Use the "remote" alias to run tests on remote devices, like smartphones or tablets. Specify the number of remote browsers after the semicolon ("remote:3").
@@ -376,4 +376,4 @@ class CLIArgumentParser {
376
376
  }
377
377
  exports.default = CLIArgumentParser;
378
378
  module.exports = exports.default;
379
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2FyZ3VtZW50LXBhcnNlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbUNBQWtDO0FBRWxDLHVEQUdtQjtBQUVuQixvREFBNEI7QUFDNUIsa0RBQW9EO0FBQ3BELDhDQUFvRDtBQUNwRCwwRUFBc0U7QUFDdEUsd0ZBQThEO0FBQzlELCtDQUErRDtBQUMvRCx5REFTaUM7QUFFakMsOEVBQW9EO0FBQ3BELDBHQUFrRjtBQUNsRiw0RkFBb0U7QUFNcEUsMEdBQWtGO0FBQ2xGLG9FQUF1RTtBQUN2RSw0RkFBa0U7QUFDbEUsK0NBQTJEO0FBQzNELG9FQUE0QztBQUM1QyxpR0FBNkc7QUFDN0csbUdBQXVFO0FBRXZFLE1BQU0sZUFBZSxHQUFHLHFCQUFxQixDQUFDO0FBRTlDLE1BQU0sV0FBVyxHQUFHLElBQUEsZ0JBQU0sRUFBQzs7Ozs7Ozs7Ozs7Q0FXMUIsQ0FBQyxDQUFDO0FBd0NILE1BQXFCLGlCQUFpQjtJQU9sQyxZQUFvQixHQUFZO1FBQzVCLElBQUksQ0FBQyxHQUFHLEdBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxHQUFVLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsSUFBSSxHQUFVLEVBQUUsQ0FBQztRQUV0QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRWxELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDNUMsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRU8sTUFBTSxDQUFDLGlCQUFpQjtRQUM1Qix3RUFBd0U7UUFDeEUsZ0ZBQWdG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QUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sTUFBMEIsQ0FBQztJQUN0QyxDQUFDO0NBQ0o7QUF6WkQsb0NBeVpDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaGFzLCBzZXQgfSBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgcHJvZ3JhbSwge1xuICAgIENvbW1hbmQsXG4gICAgT3B0aW9uLFxufSBmcm9tICdjb21tYW5kZXInO1xuXG5pbXBvcnQgZGVkZW50IGZyb20gJ2RlZGVudCc7XG5pbXBvcnQgeyBHZW5lcmFsRXJyb3IgfSBmcm9tICcuLi8uLi9lcnJvcnMvcnVudGltZSc7XG5pbXBvcnQgeyBSVU5USU1FX0VSUk9SUyB9IGZyb20gJy4uLy4uL2Vycm9ycy90eXBlcyc7XG5pbXBvcnQgeyBhc3NlcnRUeXBlLCBpcyB9IGZyb20gJy4uLy4uL2Vycm9ycy9ydW50aW1lL3R5cGUtYXNzZXJ0aW9ucyc7XG5pbXBvcnQgZ2V0Vmlld1BvcnRXaWR0aCBmcm9tICcuLi8uLi91dGlscy9nZXQtdmlld3BvcnQtd2lkdGgnO1xuaW1wb3J0IHsgd29yZFdyYXAsIHNwbGl0UXVvdGVkVGV4dCB9IGZyb20gJy4uLy4uL3V0aWxzL3N0cmluZyc7XG5pbXBvcnQge1xuICAgIGdldFNTTE9wdGlvbnMsXG4gICAgZ2V0UXVhcmFudGluZU9wdGlvbnMsXG4gICAgZ2V0U2NyZWVuc2hvdE9wdGlvbnMsXG4gICAgZ2V0U2tpcEpzRXJyb3JzT3B0aW9ucyxcbiAgICBnZXRWaWRlb09wdGlvbnMsXG4gICAgZ2V0TWV0YU9wdGlvbnMsXG4gICAgZ2V0R3JlcE9wdGlvbnMsXG4gICAgZ2V0Q29tcGlsZXJPcHRpb25zLFxufSBmcm9tICcuLi8uLi91dGlscy9nZXQtb3B0aW9ucyc7XG5cbmltcG9ydCBnZXRGaWx0ZXJGbiBmcm9tICcuLi8uLi91dGlscy9nZXQtZmlsdGVyLWZuJztcbmltcG9ydCBTQ1JFRU5TSE9UX09QVElPTl9OQU1FUyBmcm9tICcuLi8uLi9jb25maWd1cmF0aW9uL3NjcmVlbnNob3Qtb3B0aW9uLW5hbWVzJztcbmltcG9ydCBSVU5fT1BUSU9OX05BTUVTIGZyb20gJy4uLy4uL2NvbmZpZ3VyYXRpb24vcnVuLW9wdGlvbi1uYW1lcyc7XG5pbXBvcnQge1xuICAgIERpY3Rpb25hcnksXG4gICAgUmVwb3J0ZXJPcHRpb24sXG4gICAgUnVubmVyUnVuT3B0aW9ucyxcbn0gZnJvbSAnLi4vLi4vY29uZmlndXJhdGlvbi9pbnRlcmZhY2VzJztcbmltcG9ydCBRVUFSQU5USU5FX09QVElPTl9OQU1FUyBmcm9tICcuLi8uLi9jb25maWd1cmF0aW9uL3F1YXJhbnRpbmUtb3B0aW9uLW5hbWVzJztcbmltcG9ydCB7IGV4dHJhY3ROb2RlUHJvY2Vzc0FyZ3VtZW50cyB9IGZyb20gJy4uL25vZGUtYXJndW1lbnRzLWZpbHRlcic7XG5pbXBvcnQgZ2V0VGVzdENhZmVWZXJzaW9uIGZyb20gJy4uLy4uL3V0aWxzL2dldC10ZXN0Y2FmZS12ZXJzaW9uJztcbmltcG9ydCB7IHBhcnNlUG9ydE51bWJlciwgcGFyc2VMaXN0IH0gZnJvbSAnLi9wYXJzZS11dGlscyc7XG5pbXBvcnQgQ09NTUFORF9OQU1FUyBmcm9tICcuL2NvbW1hbmQtbmFtZXMnO1xuaW1wb3J0IHsgU0tJUF9KU19FUlJPUlNfT1BUSU9OU19PQkpFQ1RfT1BUSU9OX05BTUVTIH0gZnJvbSAnLi4vLi4vY29uZmlndXJhdGlvbi9za2lwLWpzLWVycm9ycy1vcHRpb24tbmFtZXMnO1xuaW1wb3J0IHNob3VsZE1vdmVPcHRpb25Ub0VuZCBmcm9tICcuLi91dGlscy9zaG91bGQtbW92ZS1vcHRpb24tdG8tZW5kJztcblxuY29uc3QgUkVNT1RFX0FMSUFTX1JFID0gL15yZW1vdGUoPzo6KFxcZCopKT8kLztcblxuY29uc3QgREVTQ1JJUFRJT04gPSBkZWRlbnQoYFxuXG4gICAgVG8gc2VsZWN0IGEgYnJvd3Nlciwgc3BlY2lmeSBhbiBhbGlhcyAoXCJpZVwiLCBcImNocm9tZVwiLCBldGMuKSBvciB0aGUgcGF0aCB0byB0aGUgYnJvd3NlciBleGVjdXRhYmxlLiBZb3UgY2FuIHNlbGVjdCBtb3JlIHRoYW4gb25lIGJyb3dzZXIuXG5cbiAgICBVc2UgdGhlIFwiYWxsXCIgYWxpYXMgdG8gcnVuIHRlc3RzIGFnYWluc3QgYWxsIGF2YWlsYWJsZSBicm93c2Vycy5cbiAgICBVc2UgdGhlIFwicmVtb3RlXCIgYWxpYXMgdG8gcnVuIHRlc3RzIG9uIHJlbW90ZSBkZXZpY2VzLCBsaWtlIHNtYXJ0cGhvbmVzIG9yIHRhYmxldHMuIFNwZWNpZnkgdGhlIG51bWJlciBvZiByZW1vdGUgYnJvd3NlcnMgYWZ0ZXIgdGhlIHNlbWljb2xvbiAoXCJyZW1vdGU6M1wiKS5cbiAgICBJZiB5b3UgdXNlIGEgYnJvd3NlciBwcm92aWRlciBwbHVnaW4sIHNwZWNpZnkgYm90aCB0aGUgbmFtZSBvZiB0aGUgcGx1Z2luIGFuZCB0aGUgbmFtZSBvZiB0aGUgYnJvd3Nlci4gU2VwYXJhdGUgdGhlIHR3byB3aXRoIGEgc2VtaWNvbG9uIChcInNhdWNlbGFiczpjaHJvbWVANTFcIikuXG5cbiAgICBUbyBleGVjdXRlIG11bHRpcGxlIHRlc3QgZmlsZXMsIHNwZWNpZnkgbXVsdGlwbGUgZmlsZSBwYXRocyBvciBnbG9iIHBhdHRlcm5zLlxuXG4gICAgRnVsbCBkb2N1bWVudGF0aW9uOiBodHRwczovL3Rlc3RjYWZlLmlvL2RvY3VtZW50YXRpb24vNDAyNjM5L3JlZmVyZW5jZS9jb21tYW5kLWxpbmUtaW50ZXJmYWNlXG5gKTtcblxuaW50ZXJmYWNlIENvbW1hbmRMaW5lT3B0aW9ucyB7XG4gICAgdGVzdEdyZXA/OiBzdHJpbmcgfCBSZWdFeHA7XG4gICAgZml4dHVyZUdyZXA/OiBzdHJpbmcgfCBSZWdFeHA7XG4gICAgc3JjPzogc3RyaW5nW107XG4gICAgYnJvd3NlcnM/OiBzdHJpbmdbXTtcbiAgICBsaXN0QnJvd3NlcnM/OiBib29sZWFuIHwgc3RyaW5nO1xuICAgIHRlc3RNZXRhPzogc3RyaW5nIHwgRGljdGlvbmFyeTxzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPjtcbiAgICBmaXh0dXJlTWV0YT86IHN0cmluZyB8IERpY3Rpb25hcnk8c3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj47XG4gICAgZmlsdGVyPzogRnVuY3Rpb247XG4gICAgYXBwSW5pdERlbGF5Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIGFzc2VydGlvblRpbWVvdXQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgc2VsZWN0b3JUaW1lb3V0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIHNwZWVkPzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIHBhZ2VMb2FkVGltZW91dD86IHN0cmluZyB8IG51bWJlcjtcbiAgICBwYWdlUmVxdWVzdFRpbWVvdXQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgYWpheFJlcXVlc3RUaW1lb3V0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIGJyb3dzZXJJbml0VGltZW91dD86IHN0cmluZyB8IG51bWJlcjtcbiAgICB0ZXN0RXhlY3V0aW9uVGltZW91dD86IHN0cmluZyB8IG51bWJlcjtcbiAgICBydW5FeGVjdXRpb25UaW1lb3V0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIGNvbmN1cnJlbmN5Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIHF1YXJhbnRpbmVNb2RlPzogYm9vbGVhbiB8IERpY3Rpb25hcnk8c3RyaW5nIHwgbnVtYmVyPjtcbiAgICBwb3J0cz86IHN0cmluZyB8IG51bWJlcltdO1xuICAgIHByb3ZpZGVyTmFtZT86IHN0cmluZztcbiAgICBzc2w/OiBzdHJpbmcgfCBEaWN0aW9uYXJ5PHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+O1xuICAgIHJlcG9ydGVyPzogc3RyaW5nIHwgUmVwb3J0ZXJPcHRpb25bXTtcbiAgICBzY3JlZW5zaG90cz86IERpY3Rpb25hcnk8c3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj4gfCBzdHJpbmc7XG4gICAgc2NyZWVuc2hvdFBhdGhQYXR0ZXJuPzogc3RyaW5nO1xuICAgIHNjcmVlbnNob3RzT25GYWlscz86IGJvb2xlYW47XG4gICAgdmlkZW9PcHRpb25zPzogc3RyaW5nIHwgRGljdGlvbmFyeTxudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuPjtcbiAgICB2aWRlb0VuY29kaW5nT3B0aW9ucz86IHN0cmluZyB8IERpY3Rpb25hcnk8bnVtYmVyIHwgc3RyaW5nIHwgYm9vbGVhbj47XG4gICAgY29tcGlsZXJPcHRpb25zPzogc3RyaW5nIHwgRGljdGlvbmFyeTxudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuPjtcbiAgICBjb25maWdGaWxlPzogc3RyaW5nO1xuICAgIG5hdGl2ZUF1dG9tYXRpb24/OiBib29sZWFuO1xuICAgIHY4RmxhZ3M/OiBzdHJpbmdbXTtcbiAgICBiYXNlVXJsPzogc3RyaW5nO1xuICAgIHNraXBKc0Vycm9ycz86IGJvb2xlYW4gfCBEaWN0aW9uYXJ5PFJlZ0V4cCB8IHN0cmluZz47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENMSUFyZ3VtZW50UGFyc2VyIHtcbiAgICBwcml2YXRlIGN3ZDogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVtb3RlQ291bnQ6IG51bWJlcjtcbiAgICBwdWJsaWMgb3B0czogQ29tbWFuZExpbmVPcHRpb25zO1xuICAgIHB1YmxpYyBhcmdzOiBzdHJpbmdbXTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRlc3RDYWZlQ29tbWFuZDogQ29tbWFuZDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoY3dkPzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuY3dkICAgICAgICAgPSBjd2QgfHwgcHJvY2Vzcy5jd2QoKTtcbiAgICAgICAgdGhpcy5yZW1vdGVDb3VudCA9IDA7XG4gICAgICAgIHRoaXMub3B0cyAgICAgICAgPSB7fTtcbiAgICAgICAgdGhpcy5hcmdzICAgICAgICA9IFtdO1xuXG4gICAgICAgIHRoaXMudGVzdENhZmVDb21tYW5kID0gdGhpcy5fYWRkVGVzdENhZmVDb21tYW5kKCk7XG5cbiAgICAgICAgdGhpcy5fcGF0Y2hIZWxwT3V0cHV0KHRoaXMudGVzdENhZmVDb21tYW5kKTtcbiAgICAgICAgQ0xJQXJndW1lbnRQYXJzZXIuX3NldHVwUm9vdENvbW1hbmQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfc2V0dXBSb290Q29tbWFuZCAoKTogdm9pZCB7XG4gICAgICAgIC8vIE5PVEU6IFdlIGFyZSBmb3JjZWQgdG8gc2V0IHRoZSBuYW1lIG9mIHRoZSByb290IGNvbW1hbmQgdG8gJ3Rlc3RjYWZlJ1xuICAgICAgICAvLyB0byBhdm9pZCB0aGUgYXV0b21hdGljIGNvbW1hbmQgbmFtZSBjYWxjdWxhdGlvbiB1c2luZyB0aGUgZXhlY3V0ZWQgZmlsZSBwYXRoLlxuICAgICAgICAvLyBJdCdzIG5lY2Vzc2FyeSB0byBjb3JyZWN0IGNvbW1hbmQgZGVzY3JpcHRpb24gZm9yIG5lc3RlZCBjb21tYW5kcy5cbiAgICAgICAgKHByb2dyYW0gYXMgdW5rbm93biBhcyBDb21tYW5kKS5uYW1lKENPTU1BTkRfTkFNRVMuVGVzdENhZmUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIF9yZW1vdmVDb21tYW5kSWZFeGlzdHMgKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICAvLyBOT1RFOiBCdWcgaW4gdGhlICdjb21tYW5kZXInIG1vZHVsZS5cbiAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0byBhZGQgYSBmZXcgY29tbWFuZHMgd2l0aCB0aGUgc2FtZSBuYW1lLlxuICAgICAgICAvLyBBbHNvLCByZW1vdmluZyBpcyBhIGJldHRlciB0aGFuIGNvbmRpdGlvbmFsbHkgYWRkaW5nXG4gICAgICAgIC8vIGJlY2F1c2UgaXQgYWxsb3dzIGF2b2lkaW5nIHRoZSBwYXJzZWQgb3B0aW9uIGR1cGxpY2F0ZXMuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gKHByb2dyYW0gYXMgdW5rbm93biBhcyBDb21tYW5kKS5jb21tYW5kcy5maW5kSW5kZXgoY21kID0+IGNtZC5uYW1lKCkgPT09IG5hbWUpO1xuXG4gICAgICAgIGlmIChpbmRleCA+IC0xKVxuICAgICAgICAgICAgKHByb2dyYW0gYXMgdW5rbm93biBhcyBDb21tYW5kKS5jb21tYW5kcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIF9nZXREZXNjcmlwdGlvbiAoKTogc3RyaW5nIHtcbiAgICAgICAgLy8gTk9URTogYWRkIGVtcHR5IGxpbmUgdG8gd29ya2Fyb3VuZCBjb21tYW5kZXItZm9yY2VkIGluZGVudGF0aW9uIG9uIHRoZSBmaXJzdCBsaW5lLlxuICAgICAgICByZXR1cm4gJ1xcbicgKyB3b3JkV3JhcChERVNDUklQVElPTiwgMiwgZ2V0Vmlld1BvcnRXaWR0aChwcm9jZXNzLnN0ZG91dCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2FkZFRlc3RDYWZlQ29tbWFuZCAoKTogQ29tbWFuZCB7XG4gICAgICAgIENMSUFyZ3VtZW50UGFyc2VyLl9yZW1vdmVDb21tYW5kSWZFeGlzdHMoQ09NTUFORF9OQU1FUy5UZXN0Q2FmZSk7XG5cbiAgICAgICAgcmV0dXJuIChwcm9ncmFtIGFzIHVua25vd24gYXMgQ29tbWFuZClcbiAgICAgICAgICAgIC5jb21tYW5kKENPTU1BTkRfTkFNRVMuVGVzdENhZmUsIHsgaXNEZWZhdWx0OiB0cnVlIH0pXG4gICAgICAgICAgICAudmVyc2lvbihnZXRUZXN0Q2FmZVZlcnNpb24oKSwgJy12LCAtLXZlcnNpb24nKVxuICAgICAgICAgICAgLnVzYWdlKCdbb3B0aW9uc10gPGNvbW1hLXNlcGFyYXRlZC1icm93c2VyLWxpc3Q+IDxmaWxlLW9yLWdsb2IgLi4uPicpXG4gICAgICAgICAgICAuZGVzY3JpcHRpb24oQ0xJQXJndW1lbnRQYXJzZXIuX2dldERlc2NyaXB0aW9uKCkpXG5cbiAgICAgICAgICAgIC5hbGxvd1Vua25vd25PcHRpb24oKVxuICAgICAgICAgICAgLm9wdGlvbignLWIsIC0tbGlzdC1icm93c2VycyBbcHJvdmlkZXJdJywgJ2Rpc3BsYXkgdGhlIGxpc3Qgb2YgYWxpYXNlcyBmb3IgYXZhaWxhYmxlIGJyb3dzZXJzIGFuZCBicm93c2VyIHByb3ZpZGVycycpXG4gICAgICAgICAgICAub3B0aW9uKCctciwgLS1yZXBvcnRlciA8bmFtZVs6b3V0cHV0RmlsZV1bLC4uLl0+JywgJ3NwZWNpZnkgcmVwb3J0ZXJzIGFuZCByZXBvcnQgZmlsZW5hbWVzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1zLCAtLXNjcmVlbnNob3RzIDxvcHRpb249dmFsdWVbLC4uLl0+JywgJ3NwZWNpZnkgc2NyZWVuc2hvdCBvcHRpb25zJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1TLCAtLXNjcmVlbnNob3RzLW9uLWZhaWxzJywgJ3Rha2UgYSBzY3JlZW5zaG90IG9uIHRlc3QgZmFpbHVyZScpXG4gICAgICAgICAgICAub3B0aW9uKCctcCwgLS1zY3JlZW5zaG90LXBhdGgtcGF0dGVybiA8cGF0dGVybj4nLCAnc3BlY2lmeSB0aGUgbmFtaW5nIHNjaGVtYSBmb3Igc2NyZWVuc2hvdCBmaWxlbmFtZXMgYW5kIHBhdGhzOiAke0JST1dTRVJ9LCAke0JST1dTRVJfVkVSU0lPTn0sICR7T1N9LCBldGMuJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1xLCAtLXF1YXJhbnRpbmUtbW9kZSBbb3B0aW9uPXZhbHVlLC4uLl0nLCAnZW5hYmxlIGFuZCBjb25maWd1cmUgcXVhcmFudGluZSBtb2RlJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1kLCAtLWRlYnVnLW1vZGUnLCAnZW5hYmxlIGRlYnVnIG1vZGUuIFdoZW4geW91IHJ1biBUZXN0Q2FmZSBpbiBkZWJ1ZyBtb2RlLCBpdCBleGVjdXRlcyB0ZXN0IHN0ZXBzIG9uZSBieSBvbmUsIGFuZCBwYXVzZXMgdGhlIHRlc3QgYWZ0ZXIgZWFjaCBzdGVwLicpXG4gICAgICAgICAgICAub3B0aW9uKCctZSwgLS1za2lwLWpzLWVycm9ycyBbb3B0aW9uPXZhbHVlLC4uLl0nLCAnaWdub3JlIEphdmFTY3JpcHQgZXJyb3JzIHRoYXQgbWF0Y2ggdGhlIHNwZWNpZmllZCBjcml0ZXJpYScpXG4gICAgICAgICAgICAub3B0aW9uKCctdSwgLS1za2lwLXVuY2F1Z2h0LWVycm9ycycsICdpZ25vcmUgdW5jYXVnaHQgZXJyb3JzIGFuZCB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb25zJylcbiAgICAgICAgICAgIC5vcHRpb24oJy10LCAtLXRlc3QgPG5hbWU+JywgJ2ZpbHRlciB0ZXN0cyBieSBuYW1lJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1ULCAtLXRlc3QtZ3JlcCA8cGF0dGVybj4nLCAnZmlsdGVyIHRlc3RzIGJ5IHJlZ3VsYXIgZXhwcmVzc2lvbicpXG4gICAgICAgICAgICAub3B0aW9uKCctZiwgLS1maXh0dXJlIDxuYW1lPicsICdmaWx0ZXIgZml4dHVyZXMgYnkgbmFtZScpXG4gICAgICAgICAgICAub3B0aW9uKCctRiwgLS1maXh0dXJlLWdyZXAgPHBhdHRlcm4+JywgJ2ZpbHRlciBmaXh0dXJlcyBieSByZWd1bGFyIGV4cHJlc3Npb24nKVxuICAgICAgICAgICAgLm9wdGlvbignLWEsIC0tYXBwIDxjb21tYW5kPicsICdleGVjdXRlIGEgc2hlbGwgY29tbWFuZCBvbiBzdGFydHVwIHRvIGxhdW5jaCBhIHdlYiBhcHBsaWNhdGlvbiBvciBwZXJmb3JtIG90aGVyIHByZXBhcmF0b3J5IHRhc2tzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1jLCAtLWNvbmN1cnJlbmN5IDxudW1iZXI+JywgJ3J1biB0ZXN0cyBjb25jdXJyZW50bHknKVxuICAgICAgICAgICAgLm9wdGlvbignLUwsIC0tbGl2ZScsICdlbmFibGUgbGl2ZSBtb2RlLiBMaXZlIG1vZGUgcmVzdGFydHMgdGVzdHMgd2hlbiB5b3UgbWFrZSBjaGFuZ2VzIHRvIHRlc3QgZmlsZXMuJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tdGVzdC1tZXRhIDxrZXk9dmFsdWVbLGtleTI9dmFsdWUyLC4uLl0+JywgJ2ZpbHRlciB0ZXN0cyBieSBtZXRhZGF0YScpXG4gICAgICAgICAgICAub3B0aW9uKCctLWZpeHR1cmUtbWV0YSA8a2V5PXZhbHVlWyxrZXkyPXZhbHVlMiwuLi5dPicsICdmaWx0ZXIgZml4dHVyZXMgYnkgbWV0YWRhdGEnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1kZWJ1Zy1vbi1mYWlsJywgJ3BhdXNlIHRlc3RzIG9uIGZhaWx1cmUnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1kaXNhYmxlLW5hdGl2ZS1hdXRvbWF0aW9uJywgJ2Rpc2FibGUgbmF0aXZlIGF1dG9tYXRpb24nKVxuICAgICAgICAgICAgLm9wdGlvbignLS1hcHAtaW5pdC1kZWxheSA8bXM+JywgJ3NwZWNpZnkgeW91ciBhcHBsaWNhdGlvbmBzIGluaXRpYWxpemF0aW9uIHRpbWUnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1zZWxlY3Rvci10aW1lb3V0IDxtcz4nLCAnc3BlY2lmeSB0aGUgbWF4aW11bSBTZWxlY3RvciByZXNvbHV0aW9uIHRpbWUnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1hc3NlcnRpb24tdGltZW91dCA8bXM+JywgJ3NwZWNpZnkgdGhlIG1heGltdW0gQXNzZXJ0aW9uIHJlc29sdXRpb24gdGltZScpXG4gICAgICAgICAgICAub3B0aW9uKCctLXBhZ2UtbG9hZC10aW1lb3V0IDxtcz4nLCAnc3BlY2lmeSB0aGUgbWF4aW11bSB0aW1lIGJldHdlZW4gdGhlIHdpbmRvdy5sb2FkIGV2ZW50IGFuZCB0aGUgRE9NQ29udGVudExvYWRlZCBldmVudCAobXMpJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tcGFnZS1yZXF1ZXN0LXRpbWVvdXQgPG1zPicsICdzcGVjaWZ5IHRoZSBtYXhpbXVtIHBhZ2UgcmVxdWVzdCByZXNvbHV0aW9uIHRpbWUnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1hamF4LXJlcXVlc3QtdGltZW91dCA8bXM+JywgJ3NwZWNpZnkgdGhlIG1heGltdW0gQUpBWCByZXF1ZXN0IHJlc29sdXRpb24gdGltZScpXG4gICAgICAgICAgICAub3B0aW9uKCctLWJyb3dzZXItaW5pdC10aW1lb3V0IDxtcz4nLCAnc3BlY2lmeSB0aGUgbWF4aW11bSBicm93c2VyIHN0YXJ0dXAgdGltZScpXG4gICAgICAgICAgICAub3B0aW9uKCctLXRlc3QtZXhlY3V0aW9uLXRpbWVvdXQgPG1zPicsICdzcGVjaWZ5IHRoZSBtYXhpbXVtIHRlc3QgZXhlY3V0aW9uIHRpbWUnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1ydW4tZXhlY3V0aW9uLXRpbWVvdXQgPG1zPicsICdzcGVjaWZ5IHRoZSBtYXhpbXVtIHRlc3QgcnVuIHRpbWUnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1zcGVlZCA8ZmFjdG9yPicsICdzZXQgdGVzdCBleGVjdXRpb24gc3BlZWQgKDAuMDEgLi4uIDEpJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tcG9ydHMgPHBvcnQxLHBvcnQyPicsICdzcGVjaWZ5IG5ldHdvcmsgcG9ydHMgdG8gdXNlIGR1cmluZyB0aGUgdGVzdCBydW4uIFRoZSBzZWNvbmQgcG9ydCBpcyBuZWNlc3NhcnkgdG8gYWNjZXNzIGNyb3NzLWRvbWFpbiByZXNvdXJjZXMuJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0taG9zdG5hbWUgPG5hbWU+JywgYHNwZWNpZnkgeW91ciBob3N0bmFtZS4gTmVjZXNzYXJ5IHRvIHJ1biB0ZXN0cyBpbiByZW1vdGUgYnJvd3NlcnMuYClcbiAgICAgICAgICAgIC5vcHRpb24oJy0tcHJveHkgPGhvc3Q+JywgJ3NwZWNpZnkgdGhlIHByb3h5IHNlcnZlciBob3N0bmFtZSBvciBJUCBhZGRyZXNzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tcHJveHktYnlwYXNzIDxydWxlcz4nLCAnc3BlY2lmeSBVUkxzIHRoYXQgYnlwYXNzIHRoZSBwcm94eSBzZXJ2ZXInKVxuICAgICAgICAgICAgLm9wdGlvbignLS1zc2wgPG9wdGlvbnM+JywgJ3NwZWNpZnkgU1NMIG9wdGlvbnMgdG8gcnVuIFRlc3RDYWZlIG92ZXIgSFRUUFMnKVxuICAgICAgICAgICAgLm9wdGlvbignLS12aWRlbyA8cGF0aD4nLCAncmVjb3JkIHZpZGVvcyBvZiB0ZXN0IHJ1bnMnKVxuICAgICAgICAgICAgLm9wdGlvbignLS12aWRlby1vcHRpb25zIDxvcHRpb249dmFsdWVbLC4uLl0+JywgJ3NwZWNpZnkgdmlkZW8gcmVjb3JkaW5nIG9wdGlvbnMnKVxuICAgICAgICAgICAgLm9wdGlvbignLS12aWRlby1lbmNvZGluZy1vcHRpb25zIDxvcHRpb249dmFsdWVbLC4uLl0+JywgJ3NwZWNpZnkgdmlkZW8gZW5jb2Rpbmcgb3B0aW9ucycpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRldicsICdsb2cgYW5kIGRpYWdub3NlIFRlc3RDYWZlIGVycm9ycycpXG4gICAgICAgICAgICAub3B0aW9uKCctLXFyLWNvZGUnLCAnb3V0cHV0IFFSIGNvZGVzIHdpdGggVVJMcyBmb3IgcmVtb3RlIGJyb3dzZXIgY29ubmVjdGlvbnMnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1zZiwgLS1zdG9wLW9uLWZpcnN0LWZhaWwnLCAnc3RvcCB0aGUgdGVzdCBydW4gaWYgYW55IHRlc3QgZmFpbHMnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1jb25maWctZmlsZSA8cGF0aD4nLCAnc3BlY2lmeSBhIGN1c3RvbSBwYXRoIHRvIHRoZSB0ZXN0Y2FmZSBjb25maWd1cmF0aW9uIGZpbGUnKVxuICAgICAgICAgICAgLm9wdGlvbignLS10cy1jb25maWctcGF0aCA8cGF0aD4nLCAnc3BlY2lmeSB0aGUgcGF0aCB0byBhIGN1c3RvbSBUeXBlU2NyaXB0IGNvbmZpZ3VyYXRpb24gZmlsZScpXG4gICAgICAgICAgICAub3B0aW9uKCctLWNzLCAtLWNsaWVudC1zY3JpcHRzIDxwYXRocz4nLCAnaW5qZWN0IGNsaWVudC1zaWRlIHNjcmlwdHMgaW50byB0aGUgcGFnZScsIHBhcnNlTGlzdCwgW10pXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGUtcGFnZS1jYWNoaW5nJywgJ2RvIG5vdCBjYWNoZSBwYWdlcycpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGUtcGFnZS1yZWxvYWRzJywgJ2RvIG5vdCByZWxvYWQgcGFnZXMgYmV0d2VlbiB0ZXN0cycpXG4gICAgICAgICAgICAub3B0aW9uKCctLXJldHJ5LXRlc3QtcGFnZXMnLCAncmV0cnkgcGFnZSByZXF1ZXN0cyBpbiBjYXNlIG9mIGZhaWx1cmUnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1kaXNhYmxlLXNjcmVlbnNob3RzJywgJ2Rpc2FibGUgc2NyZWVuc2hvdHMnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1zY3JlZW5zaG90cy1mdWxsLXBhZ2UnLCAnZW5hYmxlIGZ1bGwtcGFnZSBzY3JlZW5zaG90cycpXG4gICAgICAgICAgICAub3B0aW9uKCctLWNvbXBpbGVyLW9wdGlvbnMgPG9wdGlvbj12YWx1ZVssLi4uXT4nLCAnc3BlY2lmeSB0ZXN0IGNvbXBpbGF0aW9uIHNldHRpbmdzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZS1tdWx0aXBsZS13aW5kb3dzJywgJ2Rpc2FibGUgdGhlIG11bHRpLXdpbmRvdyBtb2RlJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZS1odHRwMicsICdmb3JjZSB0aGUgcHJveHkgdG8gaXNzdWUgSFRUUC8xLjEgcmVxdWVzdHMnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1jYWNoZScsICdjYWNoZSB3ZWIgYXNzZXRzIGJldHdlZW4gdGVzdCBydW5zJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tYmFzZS11cmwgPHVybD4nLCAnc2V0IHRoZSBiYXNlIHVybCBmb3IgdGhlIHRlc3QgcnVuJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZXNtJywgJ2VuYWJsZSBFU00gbW9kdWxlIHN1cHBvcnQnKVxuXG4gICAgICAgICAgICAvLyBOT1RFOiB0aGVzZSBvcHRpb25zIHdpbGwgYmUgaGFuZGxlZCBieSBjaGFsayBpbnRlcm5hbGx5XG4gICAgICAgICAgICAub3B0aW9uKCctLWNvbG9yJywgJ2ZvcmNlIFRlc3RDYWZlIHRvIGZvcm1hdCBDTEkgb3V0cHV0IHdpdGggY29sb3InKVxuICAgICAgICAgICAgLm9wdGlvbignLS1uby1jb2xvcicsICdkaXNhYmxlIHRleHQgY29sb3IgZm9ybWF0dGluZyBpbiB0aGUgQ0xJJylcblxuICAgICAgICAgICAgLy8gTk9URTogVGVtcG9yYXJpbHkgZXhjbHVkZSBleHBlcmltZW50YWwgb3B0aW9ucyBmcm9tIC0taGVscCBvdXRwdXRcbiAgICAgICAgICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1kaXNhYmxlLWNyb3NzLWRvbWFpbicsICdleHBlcmltZW50YWwnKS5oaWRlSGVscCgpKVxuICAgICAgICAgICAgLmFjdGlvbigob3B0czogQ29tbWFuZExpbmVPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3BhdGNoSGVscE91dHB1dCAoZGVmYXVsdFN1YkNvbW1hbmQ6IENvbW1hbmQpOiB2b2lkIHtcbiAgICAgICAgLy8gTk9URTogSW4gdGhlIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGUgJ2NvbW1hbmRlcicgbW9kdWxlXG4gICAgICAgIC8vIG5lZWQgdG8gaW52ZXN0aWdhdGUgaG93IHRvIHJlbW92ZSB0aGlzIGhhY2suXG4gICAgICAgIChwcm9ncmFtIGFzIHVua25vd24gYXMgQ29tbWFuZCkub3V0cHV0SGVscCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0b3JlZFBhcmVudCA9IGRlZmF1bHRTdWJDb21tYW5kLnBhcmVudDtcblxuICAgICAgICAgICAgZGVmYXVsdFN1YkNvbW1hbmQucGFyZW50ID0gbnVsbDtcblxuICAgICAgICAgICAgZGVmYXVsdFN1YkNvbW1hbmQub3V0cHV0SGVscCgpO1xuXG4gICAgICAgICAgICBkZWZhdWx0U3ViQ29tbWFuZC5wYXJlbnQgPSBzdG9yZWRQYXJlbnQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY2hlY2tBbmRDb3VudFJlbW90ZXMgKGJyb3dzZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCByZW1vdGVNYXRjaCA9IGJyb3dzZXIubWF0Y2goUkVNT1RFX0FMSUFTX1JFKTtcblxuICAgICAgICBpZiAocmVtb3RlTWF0Y2gpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3RlQ291bnQgKz0gcGFyc2VJbnQocmVtb3RlTWF0Y2hbMV0sIDEwKSB8fCAxO1xuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX3BhcnNlRmlsdGVyaW5nT3B0aW9ucyAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMudGVzdEdyZXApXG4gICAgICAgICAgICB0aGlzLm9wdHMudGVzdEdyZXAgPSBnZXRHcmVwT3B0aW9ucygnLS10ZXN0LWdyZXAnLCB0aGlzLm9wdHMudGVzdEdyZXAgYXMgc3RyaW5nKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRzLmZpeHR1cmVHcmVwKVxuICAgICAgICAgICAgdGhpcy5vcHRzLmZpeHR1cmVHcmVwID0gZ2V0R3JlcE9wdGlvbnMoJy0tZml4dHVyZS1ncmVwJywgdGhpcy5vcHRzLmZpeHR1cmVHcmVwIGFzIHN0cmluZyk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0cy50ZXN0TWV0YSlcbiAgICAgICAgICAgIHRoaXMub3B0cy50ZXN0TWV0YSA9IGF3YWl0IGdldE1ldGFPcHRpb25zKCctLXRlc3QtbWV0YScsIHRoaXMub3B0cy50ZXN0TWV0YSBhcyBzdHJpbmcpO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdHMuZml4dHVyZU1ldGEpXG4gICAgICAgICAgICB0aGlzLm9wdHMuZml4dHVyZU1ldGEgPSBhd2FpdCBnZXRNZXRhT3B0aW9ucygnLS1maXh0dXJlLW1ldGEnLCB0aGlzLm9wdHMuZml4dHVyZU1ldGEgYXMgc3RyaW5nKTtcblxuICAgICAgICB0aGlzLm9wdHMuZmlsdGVyID0gZ2V0RmlsdGVyRm4odGhpcy5vcHRzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZUFwcEluaXREZWxheSAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuYXBwSW5pdERlbGF5KSB7XG4gICAgICAgICAgICBhc3NlcnRUeXBlKGlzLm5vbk5lZ2F0aXZlTnVtYmVyU3RyaW5nLCBudWxsLCAnVGhlIHRlc3RlZCBhcHAgaW5pdGlhbGl6YXRpb24gZGVsYXknLCB0aGlzLm9wdHMuYXBwSW5pdERlbGF5KTtcblxuICAgICAgICAgICAgdGhpcy5vcHRzLmFwcEluaXREZWxheSA9IHBhcnNlSW50KHRoaXMub3B0cy5hcHBJbml0RGVsYXkgYXMgc3RyaW5nLCAxMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZVNlbGVjdG9yVGltZW91dCAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuc2VsZWN0b3JUaW1lb3V0KSB7XG4gICAgICAgICAgICBhc3NlcnRUeXBlKGlzLm5vbk5lZ2F0aXZlTnVtYmVyU3RyaW5nLCBudWxsLCAnVGhlIFNlbGVjdG9yIHRpbWVvdXQnLCB0aGlzLm9wdHMuc2VsZWN0b3JUaW1lb3V0KTtcblxuICAgICAgICAgICAgdGhpcy5vcHRzLnNlbGVjdG9yVGltZW91dCA9IHBhcnNlSW50KHRoaXMub3B0cy5zZWxlY3RvclRpbWVvdXQgYXMgc3RyaW5nLCAxMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZUFzc2VydGlvblRpbWVvdXQgKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcHRzLmFzc2VydGlvblRpbWVvdXQpIHtcbiAgICAgICAgICAgIGFzc2VydFR5cGUoaXMubm9uTmVnYXRpdmVOdW1iZXJTdHJpbmcsIG51bGwsICdUaGUgYXNzZXJ0aW9uIHRpbWVvdXQnLCB0aGlzLm9wdHMuYXNzZXJ0aW9uVGltZW91dCk7XG5cbiAgICAgICAgICAgIHRoaXMub3B0cy5hc3NlcnRpb25UaW1lb3V0ID0gcGFyc2VJbnQodGhpcy5vcHRzLmFzc2VydGlvblRpbWVvdXQgYXMgc3RyaW5nLCAxMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZVBhZ2VMb2FkVGltZW91dCAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMucGFnZUxvYWRUaW1lb3V0KSB7XG4gICAgICAgICAgICBhc3NlcnRUeXBlKGlzLm5vbk5lZ2F0aXZlTnVtYmVyU3RyaW5nLCBudWxsLCAnVGhlIHBhZ2UgbG9hZCB0aW1lb3V0JywgdGhpcy5vcHRzLnBhZ2VMb2FkVGltZW91dCk7XG5cbiAgICAgICAgICAgIHRoaXMub3B0cy5wYWdlTG9hZFRpbWVvdXQgPSBwYXJzZUludCh0aGlzLm9wdHMucGFnZUxvYWRUaW1lb3V0IGFzIHN0cmluZywgMTApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VQYWdlUmVxdWVzdFRpbWVvdXQgKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMub3B0cy5wYWdlUmVxdWVzdFRpbWVvdXQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgYXNzZXJ0VHlwZShpcy5ub25OZWdhdGl2ZU51bWJlclN0cmluZywgbnVsbCwgJ1RoZSBwYWdlIHJlcXVlc3QgdGltZW91dCcsIHRoaXMub3B0cy5wYWdlUmVxdWVzdFRpbWVvdXQpO1xuXG4gICAgICAgIHRoaXMub3B0cy5wYWdlUmVxdWVzdFRpbWVvdXQgPSBwYXJzZUludCh0aGlzLm9wdHMucGFnZVJlcXVlc3RUaW1lb3V0IGFzIHN0cmluZywgMTApO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlQWpheFJlcXVlc3RUaW1lb3V0ICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdHMuYWpheFJlcXVlc3RUaW1lb3V0KVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGFzc2VydFR5cGUoaXMubm9uTmVnYXRpdmVOdW1iZXJTdHJpbmcsIG51bGwsICdUaGUgQUpBWCByZXF1ZXN0IHRpbWVvdXQnLCB0aGlzLm9wdHMuYWpheFJlcXVlc3RUaW1lb3V0KTtcblxuICAgICAgICB0aGlzLm9wdHMuYWpheFJlcXVlc3RUaW1lb3V0ID0gcGFyc2VJbnQodGhpcy5vcHRzLmFqYXhSZXF1ZXN0VGltZW91dCBhcyBzdHJpbmcsIDEwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZUJyb3dzZXJJbml0VGltZW91dCAoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5vcHRzLmJyb3dzZXJJbml0VGltZW91dClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBhc3NlcnRUeXBlKGlzLm5vbk5lZ2F0aXZlTnVtYmVyU3RyaW5nLCBudWxsLCAnVGhlIGJyb3dzZXIgaW5pdGlhbGl6YXRpb24gdGltZW91dCcsIHRoaXMub3B0cy5icm93c2VySW5pdFRpbWVvdXQpO1xuXG4gICAgICAgIHRoaXMub3B0cy5icm93c2VySW5pdFRpbWVvdXQgPSBwYXJzZUludCh0aGlzLm9wdHMuYnJvd3NlckluaXRUaW1lb3V0IGFzIHN0cmluZywgMTApO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlVGVzdEV4ZWN1dGlvblRpbWVvdXQgKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnRlc3RFeGVjdXRpb25UaW1lb3V0KSB7XG4gICAgICAgICAgICBhc3NlcnRUeXBlKGlzLm5vbk5lZ2F0aXZlTnVtYmVyU3RyaW5nLCBudWxsLCAnVGhlIHRlc3QgZXhlY3V0aW9uIHRpbWVvdXQnLCB0aGlzLm9wdHMudGVzdEV4ZWN1dGlvblRpbWVvdXQpO1xuXG4gICAgICAgICAgICB0aGlzLm9wdHMudGVzdEV4ZWN1dGlvblRpbWVvdXQgPSBwYXJzZUludCh0aGlzLm9wdHMudGVzdEV4ZWN1dGlvblRpbWVvdXQgYXMgc3RyaW5nLCAxMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZVJ1bkV4ZWN1dGlvblRpbWVvdXQgKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnJ1bkV4ZWN1dGlvblRpbWVvdXQpIHtcbiAgICAgICAgICAgIGFzc2VydFR5cGUoaXMubm9uTmVnYXRpdmVOdW1iZXJTdHJpbmcsIG51bGwsICdUaGUgcnVuIGV4ZWN1dGlvbiB0aW1lb3V0JywgdGhpcy5vcHRzLnJ1bkV4ZWN1dGlvblRpbWVvdXQpO1xuXG4gICAgICAgICAgICB0aGlzLm9wdHMucnVuRXhlY3V0aW9uVGltZW91dCA9IHBhcnNlSW50KHRoaXMub3B0cy5ydW5FeGVjdXRpb25UaW1lb3V0IGFzIHN0cmluZywgMTApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VTcGVlZCAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuc3BlZWQpXG4gICAgICAgICAgICB0aGlzLm9wdHMuc3BlZWQgPSBwYXJzZUZsb2F0KHRoaXMub3B0cy5zcGVlZCBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlQ29uY3VycmVuY3kgKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcHRzLmNvbmN1cnJlbmN5KVxuICAgICAgICAgICAgdGhpcy5vcHRzLmNvbmN1cnJlbmN5ID0gcGFyc2VJbnQodGhpcy5vcHRzLmNvbmN1cnJlbmN5IGFzIHN0cmluZywgMTApO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3BhcnNlUXVhcmFudGluZU9wdGlvbnMgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnF1YXJhbnRpbmVNb2RlICE9PSB2b2lkIDApXG4gICAgICAgICAgICB0aGlzLm9wdHMucXVhcmFudGluZU1vZGUgPSBhd2FpdCBnZXRRdWFyYW50aW5lT3B0aW9ucygnLS1xdWFyYW50aW5lLW1vZGUnLCB0aGlzLm9wdHMucXVhcmFudGluZU1vZGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3BhcnNlU2tpcEpzRXJyb3JzT3B0aW9ucyAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuc2tpcEpzRXJyb3JzICE9PSB2b2lkIDApXG4gICAgICAgICAgICB0aGlzLm9wdHMuc2tpcEpzRXJyb3JzID0gYXdhaXQgZ2V0U2tpcEpzRXJyb3JzT3B0aW9ucygnLS1za2lwLWpzLWVycm9ycycsIHRoaXMub3B0cy5za2lwSnNFcnJvcnMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlUG9ydHMgKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnBvcnRzKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRQb3J0cyA9ICh0aGlzLm9wdHMucG9ydHMgYXMgc3RyaW5nKSAvKiBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWV4dHJhLXBhcmVucyAqL1xuICAgICAgICAgICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgICAgICAgICAgLm1hcChwYXJzZVBvcnROdW1iZXIpO1xuXG4gICAgICAgICAgICBpZiAocGFyc2VkUG9ydHMubGVuZ3RoIDwgMilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLnBvcnRzT3B0aW9uUmVxdWlyZXNUd29OdW1iZXJzKTtcblxuICAgICAgICAgICAgdGhpcy5vcHRzLnBvcnRzID0gcGFyc2VkUG9ydHMgYXMgbnVtYmVyW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZUJyb3dzZXJzRnJvbUFyZ3MgKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBicm93c2Vyc0FyZyA9IHRoaXMudGVzdENhZmVDb21tYW5kLmFyZ3NbMF0gfHwgJyc7XG5cbiAgICAgICAgdGhpcy5vcHRzLmJyb3dzZXJzID0gc3BsaXRRdW90ZWRUZXh0KGJyb3dzZXJzQXJnLCAnLCcpXG4gICAgICAgICAgICAuZmlsdGVyKGJyb3dzZXIgPT4gYnJvd3NlciAmJiB0aGlzLl9jaGVja0FuZENvdW50UmVtb3Rlcyhicm93c2VyKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIF9wYXJzZVNzbE9wdGlvbnMgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnNzbClcbiAgICAgICAgICAgIHRoaXMub3B0cy5zc2wgPSBhd2FpdCBnZXRTU0xPcHRpb25zKHRoaXMub3B0cy5zc2wgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9wYXJzZVJlcG9ydGVycyAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHJlcG9ydGVycyA9IHRoaXMub3B0cy5yZXBvcnRlciA/ICh0aGlzLm9wdHMucmVwb3J0ZXIgYXMgc3RyaW5nKS5zcGxpdCgnLCcpIDogW107IC8qIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZXh0cmEtcGFyZW5zKi9cblxuICAgICAgICB0aGlzLm9wdHMucmVwb3J0ZXIgPSByZXBvcnRlcnMubWFwKChyZXBvcnRlcjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IHJlcG9ydGVyLmluZGV4T2YoJzonKTtcblxuICAgICAgICAgICAgaWYgKHNlcGFyYXRvckluZGV4IDwgMClcbiAgICAgICAgICAgICAgICByZXR1cm4geyBuYW1lOiByZXBvcnRlciB9O1xuXG4gICAgICAgICAgICBjb25zdCBuYW1lICAgPSByZXBvcnRlci5zdWJzdHJpbmcoMCwgc2VwYXJhdG9ySW5kZXgpO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gcmVwb3J0ZXIuc3Vic3RyaW5nKHNlcGFyYXRvckluZGV4ICsgMSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7IG5hbWUsIG91dHB1dCB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZUZpbGVMaXN0ICgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vcHRzLnNyYyA9IHRoaXMudGVzdENhZmVDb21tYW5kLmFyZ3Muc2xpY2UoMSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcGFyc2VTY3JlZW5zaG90T3B0aW9ucyAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuc2NyZWVuc2hvdHMpXG4gICAgICAgICAgICB0aGlzLm9wdHMuc2NyZWVuc2hvdHMgPSBhd2FpdCBnZXRTY3JlZW5zaG90T3B0aW9ucyh0aGlzLm9wdHMuc2NyZWVuc2hvdHMpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLm9wdHMuc2NyZWVuc2hvdHMgPSB7fTtcblxuICAgICAgICBpZiAoIWhhcyh0aGlzLm9wdHMuc2NyZWVuc2hvdHMsIFNDUkVFTlNIT1RfT1BUSU9OX05BTUVTLnBhdGhQYXR0ZXJuKSAmJiB0aGlzLm9wdHMuc2NyZWVuc2hvdFBhdGhQYXR0ZXJuKVxuICAgICAgICAgICAgdGhpcy5vcHRzLnNjcmVlbnNob3RzW1NDUkVFTlNIT1RfT1BUSU9OX05BTUVTLnBhdGhQYXR0ZXJuXSA9IHRoaXMub3B0cy5zY3JlZW5zaG90UGF0aFBhdHRlcm47XG5cbiAgICAgICAgaWYgKCFoYXModGhpcy5vcHRzLnNjcmVlbnNob3RzLCBTQ1JFRU5TSE9UX09QVElPTl9OQU1FUy50YWtlT25GYWlscykgJiYgdGhpcy5vcHRzLnNjcmVlbnNob3RzT25GYWlscylcbiAgICAgICAgICAgIHRoaXMub3B0cy5zY3JlZW5zaG90c1tTQ1JFRU5TSE9UX09QVElPTl9OQU1FUy50YWtlT25GYWlsc10gPSB0aGlzLm9wdHMuc2NyZWVuc2hvdHNPbkZhaWxzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3BhcnNlVmlkZW9PcHRpb25zICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy52aWRlb09wdGlvbnMpXG4gICAgICAgICAgICB0aGlzLm9wdHMudmlkZW9PcHRpb25zID0gYXdhaXQgZ2V0VmlkZW9PcHRpb25zKHRoaXMub3B0cy52aWRlb09wdGlvbnMgYXMgc3RyaW5nKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRzLnZpZGVvRW5jb2RpbmdPcHRpb25zKVxuICAgICAgICAgICAgdGhpcy5vcHRzLnZpZGVvRW5jb2RpbmdPcHRpb25zID0gYXdhaXQgZ2V0VmlkZW9PcHRpb25zKHRoaXMub3B0cy52aWRlb0VuY29kaW5nT3B0aW9ucyBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3BhcnNlQ29tcGlsZXJPcHRpb25zICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdHMuY29tcGlsZXJPcHRpb25zKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZENvbXBpbGVyT3B0aW9ucyA9IGF3YWl0IGdldENvbXBpbGVyT3B0aW9ucyh0aGlzLm9wdHMuY29tcGlsZXJPcHRpb25zIGFzIHN0cmluZyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdENvbXBpbGVyT3B0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkQ29tcGlsZXJPcHRpb25zKSlcbiAgICAgICAgICAgIHNldChyZXN1bHRDb21waWxlck9wdGlvbnMsIGtleSwgdmFsdWUpO1xuXG4gICAgICAgIHRoaXMub3B0cy5jb21waWxlck9wdGlvbnMgPSByZXN1bHRDb21waWxlck9wdGlvbnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VMaXN0QnJvd3NlcnMgKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBsaXN0QnJvd3Nlck9wdGlvbiA9IHRoaXMub3B0cy5saXN0QnJvd3NlcnM7XG5cbiAgICAgICAgdGhpcy5vcHRzLmxpc3RCcm93c2VycyA9ICEhdGhpcy5vcHRzLmxpc3RCcm93c2VycztcblxuICAgICAgICBpZiAoIXRoaXMub3B0cy5saXN0QnJvd3NlcnMpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy5vcHRzLnByb3ZpZGVyTmFtZSA9IHR5cGVvZiBsaXN0QnJvd3Nlck9wdGlvbiA9PT0gJ3N0cmluZycgPyBsaXN0QnJvd3Nlck9wdGlvbiA6ICdsb2NhbGx5LWluc3RhbGxlZCc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX3ByZXBhcmVCb29sZWFuT3JPYmplY3RPcHRpb24gKGFyZ3Y6IHN0cmluZ1tdLCBvcHRpb25OYW1lczogc3RyaW5nW10sIHN1Yk9wdGlvbnNOYW1lczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICAgICAgLy8gTk9URTogbW92ZSBvcHRpb25zIHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5IHRvIGNvcnJlY3RseSBwYXJzZSBib3RoIEJvb2xlYW4gYW5kIE9iamVjdCB0eXBlIGFyZ3VtZW50cyAoR0gtNjIzMSlcbiAgICAgICAgY29uc3Qgb3B0aW9uSW5kZXggPSBhcmd2LmZpbmRJbmRleChcbiAgICAgICAgICAgIGVsID0+IG9wdGlvbk5hbWVzLnNvbWUob3B0ID0+IGVsLnN0YXJ0c1dpdGgob3B0KSkpO1xuXG4gICAgICAgIGlmIChvcHRpb25JbmRleCA+IC0xICYmIHNob3VsZE1vdmVPcHRpb25Ub0VuZChhcmd2LCBvcHRpb25JbmRleCwgc3ViT3B0aW9uc05hbWVzKSlcbiAgICAgICAgICAgIGFyZ3YucHVzaChhcmd2LnNwbGljZShvcHRpb25JbmRleCwgMSlbMF0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBwYXJzZSAoYXJndjogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgQ0xJQXJndW1lbnRQYXJzZXIuX3ByZXBhcmVCb29sZWFuT3JPYmplY3RPcHRpb24oYXJndiwgWyctcScsICctLXF1YXJhbnRpbmUtbW9kZSddLCBPYmplY3QudmFsdWVzKFFVQVJBTlRJTkVfT1BUSU9OX05BTUVTKSk7XG4gICAgICAgIENMSUFyZ3VtZW50UGFyc2VyLl9wcmVwYXJlQm9vbGVhbk9yT2JqZWN0T3B0aW9uKGFyZ3YsIFsnLWUnLCAnLS1za2lwLWpzLWVycm9ycyddLCBPYmplY3QudmFsdWVzKFNLSVBfSlNfRVJST1JTX09QVElPTlNfT0JKRUNUX09QVElPTl9OQU1FUykpO1xuXG4gICAgICAgIGNvbnN0IHsgYXJncywgdjhGbGFncyB9ID0gZXh0cmFjdE5vZGVQcm9jZXNzQXJndW1lbnRzKGFyZ3YpO1xuXG4gICAgICAgIChwcm9ncmFtIGFzIHVua25vd24gYXMgQ29tbWFuZCkucGFyc2UoYXJncyk7XG5cbiAgICAgICAgdGhpcy5hcmdzID0gKHByb2dyYW0gYXMgdW5rbm93biBhcyBDb21tYW5kKS5hcmdzO1xuICAgICAgICB0aGlzLm9wdHMgPSBPYmplY3QuYXNzaWduKHRoaXMub3B0cywgeyB2OEZsYWdzIH0pO1xuXG4gICAgICAgIHRoaXMuX3BhcnNlTGlzdEJyb3dzZXJzKCk7XG5cbiAgICAgICAgLy8gTk9URTogdGhlICctLWxpc3QtYnJvd3NlcnMnIG9wdGlvbiBvbmx5IGxpc3RzIGJyb3dzZXJzIGFuZCBpbW1lZGlhdGVseSBleGl0cyB0aGUgYXBwLlxuICAgICAgICAvLyBUaGVyZWZvcmUsIHdlIGRvbid0IG5lZWQgdG8gcHJvY2VzcyBvdGhlciBhcmd1bWVudHMuXG4gICAgICAgIGlmICh0aGlzLm9wdHMubGlzdEJyb3dzZXJzKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuX3BhcnNlU2VsZWN0b3JUaW1lb3V0KCk7XG4gICAgICAgIHRoaXMuX3BhcnNlQXNzZXJ0aW9uVGltZW91dCgpO1xuICAgICAgICB0aGlzLl9wYXJzZVBhZ2VMb2FkVGltZW91dCgpO1xuICAgICAgICB0aGlzLl9wYXJzZVBhZ2VSZXF1ZXN0VGltZW91dCgpO1xuICAgICAgICB0aGlzLl9wYXJzZUFqYXhSZXF1ZXN0VGltZW91dCgpO1xuICAgICAgICB0aGlzLl9wYXJzZUJyb3dzZXJJbml0VGltZW91dCgpO1xuICAgICAgICB0aGlzLl9wYXJzZVRlc3RFeGVjdXRpb25UaW1lb3V0KCk7XG4gICAgICAgIHRoaXMuX3BhcnNlUnVuRXhlY3V0aW9uVGltZW91dCgpO1xuICAgICAgICB0aGlzLl9wYXJzZUFwcEluaXREZWxheSgpO1xuICAgICAgICB0aGlzLl9wYXJzZVNwZWVkKCk7XG4gICAgICAgIHRoaXMuX3BhcnNlUG9ydHMoKTtcbiAgICAgICAgdGhpcy5fcGFyc2VCcm93c2Vyc0Zyb21BcmdzKCk7XG4gICAgICAgIHRoaXMuX3BhcnNlQ29uY3VycmVuY3koKTtcbiAgICAgICAgdGhpcy5fcGFyc2VGaWxlTGlzdCgpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuX3BhcnNlRmlsdGVyaW5nT3B0aW9ucygpO1xuICAgICAgICBhd2FpdCB0aGlzLl9wYXJzZVF1YXJhbnRpbmVPcHRpb25zKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuX3BhcnNlU2tpcEpzRXJyb3JzT3B0aW9ucygpO1xuICAgICAgICBhd2FpdCB0aGlzLl9wYXJzZVNjcmVlbnNob3RPcHRpb25zKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuX3BhcnNlVmlkZW9PcHRpb25zKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuX3BhcnNlQ29tcGlsZXJPcHRpb25zKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuX3BhcnNlU3NsT3B0aW9ucygpO1xuICAgICAgICBhd2FpdCB0aGlzLl9wYXJzZVJlcG9ydGVycygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSdW5PcHRpb25zICgpOiBSdW5uZXJSdW5PcHRpb25zIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgICAgICBSVU5fT1BUSU9OX05BTUVTLmZvckVhY2gob3B0aW9uTmFtZSA9PiB7XG4gICAgICAgICAgICBpZiAob3B0aW9uTmFtZSBpbiB0aGlzLm9wdHMpXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBhIGhhY2sgdG8gYWRkIGFuIGluZGV4IHNpZ25hdHVyZSB0byBpbnRlcmZhY2VcbiAgICAgICAgICAgICAgICByZXN1bHRbb3B0aW9uTmFtZV0gPSB0aGlzLm9wdHNbb3B0aW9uTmFtZV07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQgYXMgUnVubmVyUnVuT3B0aW9ucztcbiAgICB9XG59XG4iXX0=
379
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2FyZ3VtZW50LXBhcnNlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbUNBQWtDO0FBRWxDLHVEQUdtQjtBQUVuQixvREFBNEI7QUFDNUIsa0RBQW9EO0FBQ3BELDhDQUFvRDtBQUNwRCwwRUFBc0U7QUFDdEUsd0ZBQThEO0FBQzlELCtDQUErRDtBQUMvRCx5REFTaUM7QUFFakMsOEVBQW9EO0FBQ3BELDBHQUFrRjtBQUNsRiw0RkFBb0U7QUFNcEUsMEdBQWtGO0FBQ2xGLG9FQUF1RTtBQUN2RSw0RkFBa0U7QUFDbEUsK0NBQTJEO0FBQzNELG9FQUE0QztBQUM1QyxpR0FBNkc7QUFDN0csbUdBQXVFO0FBRXZFLE1BQU0sZUFBZSxHQUFHLHFCQUFxQixDQUFDO0FBRTlDLE1BQU0sV0FBVyxHQUFHLElBQUEsZ0JBQU0sRUFBQzs7Ozs7Ozs7Ozs7Q0FXMUIsQ0FBQyxDQUFDO0FBd0NILE1BQXFCLGlCQUFpQjtJQU9sQyxZQUFvQixHQUFZO1FBQzVCLElBQUksQ0FBQyxHQUFHLEdBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxHQUFVLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsSUFBSSxHQUFVLEVBQUUsQ0FBQztRQUV0QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRWxELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDNUMsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRU8sTUFBTSxDQUFDLGlCQUFpQjtRQUM1Qix3RUFBd0U7UUFDeEUsZ0ZBQWdG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QUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sTUFBMEIsQ0FBQztJQUN0QyxDQUFDO0NBQ0o7QUF6WkQsb0NBeVpDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaGFzLCBzZXQgfSBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgcHJvZ3JhbSwge1xuICAgIENvbW1hbmQsXG4gICAgT3B0aW9uLFxufSBmcm9tICdjb21tYW5kZXInO1xuXG5pbXBvcnQgZGVkZW50IGZyb20gJ2RlZGVudCc7XG5pbXBvcnQgeyBHZW5lcmFsRXJyb3IgfSBmcm9tICcuLi8uLi9lcnJvcnMvcnVudGltZSc7XG5pbXBvcnQgeyBSVU5USU1FX0VSUk9SUyB9IGZyb20gJy4uLy4uL2Vycm9ycy90eXBlcyc7XG5pbXBvcnQgeyBhc3NlcnRUeXBlLCBpcyB9IGZyb20gJy4uLy4uL2Vycm9ycy9ydW50aW1lL3R5cGUtYXNzZXJ0aW9ucyc7XG5pbXBvcnQgZ2V0Vmlld1BvcnRXaWR0aCBmcm9tICcuLi8uLi91dGlscy9nZXQtdmlld3BvcnQtd2lkdGgnO1xuaW1wb3J0IHsgd29yZFdyYXAsIHNwbGl0UXVvdGVkVGV4dCB9IGZyb20gJy4uLy4uL3V0aWxzL3N0cmluZyc7XG5pbXBvcnQge1xuICAgIGdldFNTTE9wdGlvbnMsXG4gICAgZ2V0UXVhcmFudGluZU9wdGlvbnMsXG4gICAgZ2V0U2NyZWVuc2hvdE9wdGlvbnMsXG4gICAgZ2V0U2tpcEpzRXJyb3JzT3B0aW9ucyxcbiAgICBnZXRWaWRlb09wdGlvbnMsXG4gICAgZ2V0TWV0YU9wdGlvbnMsXG4gICAgZ2V0R3JlcE9wdGlvbnMsXG4gICAgZ2V0Q29tcGlsZXJPcHRpb25zLFxufSBmcm9tICcuLi8uLi91dGlscy9nZXQtb3B0aW9ucyc7XG5cbmltcG9ydCBnZXRGaWx0ZXJGbiBmcm9tICcuLi8uLi91dGlscy9nZXQtZmlsdGVyLWZuJztcbmltcG9ydCBTQ1JFRU5TSE9UX09QVElPTl9OQU1FUyBmcm9tICcuLi8uLi9jb25maWd1cmF0aW9uL3NjcmVlbnNob3Qtb3B0aW9uLW5hbWVzJztcbmltcG9ydCBSVU5fT1BUSU9OX05BTUVTIGZyb20gJy4uLy4uL2NvbmZpZ3VyYXRpb24vcnVuLW9wdGlvbi1uYW1lcyc7XG5pbXBvcnQge1xuICAgIERpY3Rpb25hcnksXG4gICAgUmVwb3J0ZXJPcHRpb24sXG4gICAgUnVubmVyUnVuT3B0aW9ucyxcbn0gZnJvbSAnLi4vLi4vY29uZmlndXJhdGlvbi9pbnRlcmZhY2VzJztcbmltcG9ydCBRVUFSQU5USU5FX09QVElPTl9OQU1FUyBmcm9tICcuLi8uLi9jb25maWd1cmF0aW9uL3F1YXJhbnRpbmUtb3B0aW9uLW5hbWVzJztcbmltcG9ydCB7IGV4dHJhY3ROb2RlUHJvY2Vzc0FyZ3VtZW50cyB9IGZyb20gJy4uL25vZGUtYXJndW1lbnRzLWZpbHRlcic7XG5pbXBvcnQgZ2V0VGVzdENhZmVWZXJzaW9uIGZyb20gJy4uLy4uL3V0aWxzL2dldC10ZXN0Y2FmZS12ZXJzaW9uJztcbmltcG9ydCB7IHBhcnNlUG9ydE51bWJlciwgcGFyc2VMaXN0IH0gZnJvbSAnLi9wYXJzZS11dGlscyc7XG5pbXBvcnQgQ09NTUFORF9OQU1FUyBmcm9tICcuL2NvbW1hbmQtbmFtZXMnO1xuaW1wb3J0IHsgU0tJUF9KU19FUlJPUlNfT1BUSU9OU19PQkpFQ1RfT1BUSU9OX05BTUVTIH0gZnJvbSAnLi4vLi4vY29uZmlndXJhdGlvbi9za2lwLWpzLWVycm9ycy1vcHRpb24tbmFtZXMnO1xuaW1wb3J0IHNob3VsZE1vdmVPcHRpb25Ub0VuZCBmcm9tICcuLi91dGlscy9zaG91bGQtbW92ZS1vcHRpb24tdG8tZW5kJztcblxuY29uc3QgUkVNT1RFX0FMSUFTX1JFID0gL15yZW1vdGUoPzo6KFxcZCopKT8kLztcblxuY29uc3QgREVTQ1JJUFRJT04gPSBkZWRlbnQoYFxuXG4gICAgVG8gc2VsZWN0IGEgYnJvd3Nlciwgc3BlY2lmeSBhbiBhbGlhcyAoXCJlZGdlXCIsIFwiY2hyb21lXCIsIGV0Yy4pIG9yIHRoZSBwYXRoIHRvIHRoZSBicm93c2VyIGV4ZWN1dGFibGUuIFlvdSBjYW4gc2VsZWN0IG1vcmUgdGhhbiBvbmUgYnJvd3Nlci5cblxuICAgIFVzZSB0aGUgXCJhbGxcIiBhbGlhcyB0byBydW4gdGVzdHMgYWdhaW5zdCBhbGwgYXZhaWxhYmxlIGJyb3dzZXJzLlxuICAgIFVzZSB0aGUgXCJyZW1vdGVcIiBhbGlhcyB0byBydW4gdGVzdHMgb24gcmVtb3RlIGRldmljZXMsIGxpa2Ugc21hcnRwaG9uZXMgb3IgdGFibGV0cy4gU3BlY2lmeSB0aGUgbnVtYmVyIG9mIHJlbW90ZSBicm93c2VycyBhZnRlciB0aGUgc2VtaWNvbG9uIChcInJlbW90ZTozXCIpLlxuICAgIElmIHlvdSB1c2UgYSBicm93c2VyIHByb3ZpZGVyIHBsdWdpbiwgc3BlY2lmeSBib3RoIHRoZSBuYW1lIG9mIHRoZSBwbHVnaW4gYW5kIHRoZSBuYW1lIG9mIHRoZSBicm93c2VyLiBTZXBhcmF0ZSB0aGUgdHdvIHdpdGggYSBzZW1pY29sb24gKFwic2F1Y2VsYWJzOmNocm9tZUA1MVwiKS5cblxuICAgIFRvIGV4ZWN1dGUgbXVsdGlwbGUgdGVzdCBmaWxlcywgc3BlY2lmeSBtdWx0aXBsZSBmaWxlIHBhdGhzIG9yIGdsb2IgcGF0dGVybnMuXG5cbiAgICBGdWxsIGRvY3VtZW50YXRpb246IGh0dHBzOi8vdGVzdGNhZmUuaW8vZG9jdW1lbnRhdGlvbi80MDI2MzkvcmVmZXJlbmNlL2NvbW1hbmQtbGluZS1pbnRlcmZhY2VcbmApO1xuXG5pbnRlcmZhY2UgQ29tbWFuZExpbmVPcHRpb25zIHtcbiAgICB0ZXN0R3JlcD86IHN0cmluZyB8IFJlZ0V4cDtcbiAgICBmaXh0dXJlR3JlcD86IHN0cmluZyB8IFJlZ0V4cDtcbiAgICBzcmM/OiBzdHJpbmdbXTtcbiAgICBicm93c2Vycz86IHN0cmluZ1tdO1xuICAgIGxpc3RCcm93c2Vycz86IGJvb2xlYW4gfCBzdHJpbmc7XG4gICAgdGVzdE1ldGE/OiBzdHJpbmcgfCBEaWN0aW9uYXJ5PHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+O1xuICAgIGZpeHR1cmVNZXRhPzogc3RyaW5nIHwgRGljdGlvbmFyeTxzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPjtcbiAgICBmaWx0ZXI/OiBGdW5jdGlvbjtcbiAgICBhcHBJbml0RGVsYXk/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgYXNzZXJ0aW9uVGltZW91dD86IHN0cmluZyB8IG51bWJlcjtcbiAgICBzZWxlY3RvclRpbWVvdXQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgc3BlZWQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgcGFnZUxvYWRUaW1lb3V0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIHBhZ2VSZXF1ZXN0VGltZW91dD86IHN0cmluZyB8IG51bWJlcjtcbiAgICBhamF4UmVxdWVzdFRpbWVvdXQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgYnJvd3NlckluaXRUaW1lb3V0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIHRlc3RFeGVjdXRpb25UaW1lb3V0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIHJ1bkV4ZWN1dGlvblRpbWVvdXQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgY29uY3VycmVuY3k/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgcXVhcmFudGluZU1vZGU/OiBib29sZWFuIHwgRGljdGlvbmFyeTxzdHJpbmcgfCBudW1iZXI+O1xuICAgIHBvcnRzPzogc3RyaW5nIHwgbnVtYmVyW107XG4gICAgcHJvdmlkZXJOYW1lPzogc3RyaW5nO1xuICAgIHNzbD86IHN0cmluZyB8IERpY3Rpb25hcnk8c3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj47XG4gICAgcmVwb3J0ZXI/OiBzdHJpbmcgfCBSZXBvcnRlck9wdGlvbltdO1xuICAgIHNjcmVlbnNob3RzPzogRGljdGlvbmFyeTxzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPiB8IHN0cmluZztcbiAgICBzY3JlZW5zaG90UGF0aFBhdHRlcm4/OiBzdHJpbmc7XG4gICAgc2NyZWVuc2hvdHNPbkZhaWxzPzogYm9vbGVhbjtcbiAgICB2aWRlb09wdGlvbnM/OiBzdHJpbmcgfCBEaWN0aW9uYXJ5PG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW4+O1xuICAgIHZpZGVvRW5jb2RpbmdPcHRpb25zPzogc3RyaW5nIHwgRGljdGlvbmFyeTxudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuPjtcbiAgICBjb21waWxlck9wdGlvbnM/OiBzdHJpbmcgfCBEaWN0aW9uYXJ5PG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW4+O1xuICAgIGNvbmZpZ0ZpbGU/OiBzdHJpbmc7XG4gICAgbmF0aXZlQXV0b21hdGlvbj86IGJvb2xlYW47XG4gICAgdjhGbGFncz86IHN0cmluZ1tdO1xuICAgIGJhc2VVcmw/OiBzdHJpbmc7XG4gICAgc2tpcEpzRXJyb3JzPzogYm9vbGVhbiB8IERpY3Rpb25hcnk8UmVnRXhwIHwgc3RyaW5nPjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ0xJQXJndW1lbnRQYXJzZXIge1xuICAgIHByaXZhdGUgY3dkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZW1vdGVDb3VudDogbnVtYmVyO1xuICAgIHB1YmxpYyBvcHRzOiBDb21tYW5kTGluZU9wdGlvbnM7XG4gICAgcHVibGljIGFyZ3M6IHN0cmluZ1tdO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGVzdENhZmVDb21tYW5kOiBDb21tYW5kO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yIChjd2Q/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5jd2QgICAgICAgICA9IGN3ZCB8fCBwcm9jZXNzLmN3ZCgpO1xuICAgICAgICB0aGlzLnJlbW90ZUNvdW50ID0gMDtcbiAgICAgICAgdGhpcy5vcHRzICAgICAgICA9IHt9O1xuICAgICAgICB0aGlzLmFyZ3MgICAgICAgID0gW107XG5cbiAgICAgICAgdGhpcy50ZXN0Q2FmZUNvbW1hbmQgPSB0aGlzLl9hZGRUZXN0Q2FmZUNvbW1hbmQoKTtcblxuICAgICAgICB0aGlzLl9wYXRjaEhlbHBPdXRwdXQodGhpcy50ZXN0Q2FmZUNvbW1hbmQpO1xuICAgICAgICBDTElBcmd1bWVudFBhcnNlci5fc2V0dXBSb290Q29tbWFuZCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIF9zZXR1cFJvb3RDb21tYW5kICgpOiB2b2lkIHtcbiAgICAgICAgLy8gTk9URTogV2UgYXJlIGZvcmNlZCB0byBzZXQgdGhlIG5hbWUgb2YgdGhlIHJvb3QgY29tbWFuZCB0byAndGVzdGNhZmUnXG4gICAgICAgIC8vIHRvIGF2b2lkIHRoZSBhdXRvbWF0aWMgY29tbWFuZCBuYW1lIGNhbGN1bGF0aW9uIHVzaW5nIHRoZSBleGVjdXRlZCBmaWxlIHBhdGguXG4gICAgICAgIC8vIEl0J3MgbmVjZXNzYXJ5IHRvIGNvcnJlY3QgY29tbWFuZCBkZXNjcmlwdGlvbiBmb3IgbmVzdGVkIGNvbW1hbmRzLlxuICAgICAgICAocHJvZ3JhbSBhcyB1bmtub3duIGFzIENvbW1hbmQpLm5hbWUoQ09NTUFORF9OQU1FUy5UZXN0Q2FmZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX3JlbW92ZUNvbW1hbmRJZkV4aXN0cyAobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIC8vIE5PVEU6IEJ1ZyBpbiB0aGUgJ2NvbW1hbmRlcicgbW9kdWxlLlxuICAgICAgICAvLyBJdCdzIHBvc3NpYmxlIHRvIGFkZCBhIGZldyBjb21tYW5kcyB3aXRoIHRoZSBzYW1lIG5hbWUuXG4gICAgICAgIC8vIEFsc28sIHJlbW92aW5nIGlzIGEgYmV0dGVyIHRoYW4gY29uZGl0aW9uYWxseSBhZGRpbmdcbiAgICAgICAgLy8gYmVjYXVzZSBpdCBhbGxvd3MgYXZvaWRpbmcgdGhlIHBhcnNlZCBvcHRpb24gZHVwbGljYXRlcy5cbiAgICAgICAgY29uc3QgaW5kZXggPSAocHJvZ3JhbSBhcyB1bmtub3duIGFzIENvbW1hbmQpLmNvbW1hbmRzLmZpbmRJbmRleChjbWQgPT4gY21kLm5hbWUoKSA9PT0gbmFtZSk7XG5cbiAgICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgICAgICAocHJvZ3JhbSBhcyB1bmtub3duIGFzIENvbW1hbmQpLmNvbW1hbmRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2dldERlc2NyaXB0aW9uICgpOiBzdHJpbmcge1xuICAgICAgICAvLyBOT1RFOiBhZGQgZW1wdHkgbGluZSB0byB3b3JrYXJvdW5kIGNvbW1hbmRlci1mb3JjZWQgaW5kZW50YXRpb24gb24gdGhlIGZpcnN0IGxpbmUuXG4gICAgICAgIHJldHVybiAnXFxuJyArIHdvcmRXcmFwKERFU0NSSVBUSU9OLCAyLCBnZXRWaWV3UG9ydFdpZHRoKHByb2Nlc3Muc3Rkb3V0KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYWRkVGVzdENhZmVDb21tYW5kICgpOiBDb21tYW5kIHtcbiAgICAgICAgQ0xJQXJndW1lbnRQYXJzZXIuX3JlbW92ZUNvbW1hbmRJZkV4aXN0cyhDT01NQU5EX05BTUVTLlRlc3RDYWZlKTtcblxuICAgICAgICByZXR1cm4gKHByb2dyYW0gYXMgdW5rbm93biBhcyBDb21tYW5kKVxuICAgICAgICAgICAgLmNvbW1hbmQoQ09NTUFORF9OQU1FUy5UZXN0Q2FmZSwgeyBpc0RlZmF1bHQ6IHRydWUgfSlcbiAgICAgICAgICAgIC52ZXJzaW9uKGdldFRlc3RDYWZlVmVyc2lvbigpLCAnLXYsIC0tdmVyc2lvbicpXG4gICAgICAgICAgICAudXNhZ2UoJ1tvcHRpb25zXSA8Y29tbWEtc2VwYXJhdGVkLWJyb3dzZXItbGlzdD4gPGZpbGUtb3ItZ2xvYiAuLi4+JylcbiAgICAgICAgICAgIC5kZXNjcmlwdGlvbihDTElBcmd1bWVudFBhcnNlci5fZ2V0RGVzY3JpcHRpb24oKSlcblxuICAgICAgICAgICAgLmFsbG93VW5rbm93bk9wdGlvbigpXG4gICAgICAgICAgICAub3B0aW9uKCctYiwgLS1saXN0LWJyb3dzZXJzIFtwcm92aWRlcl0nLCAnZGlzcGxheSB0aGUgbGlzdCBvZiBhbGlhc2VzIGZvciBhdmFpbGFibGUgYnJvd3NlcnMgYW5kIGJyb3dzZXIgcHJvdmlkZXJzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1yLCAtLXJlcG9ydGVyIDxuYW1lWzpvdXRwdXRGaWxlXVssLi4uXT4nLCAnc3BlY2lmeSByZXBvcnRlcnMgYW5kIHJlcG9ydCBmaWxlbmFtZXMnKVxuICAgICAgICAgICAgLm9wdGlvbignLXMsIC0tc2NyZWVuc2hvdHMgPG9wdGlvbj12YWx1ZVssLi4uXT4nLCAnc3BlY2lmeSBzY3JlZW5zaG90IG9wdGlvbnMnKVxuICAgICAgICAgICAgLm9wdGlvbignLVMsIC0tc2NyZWVuc2hvdHMtb24tZmFpbHMnLCAndGFrZSBhIHNjcmVlbnNob3Qgb24gdGVzdCBmYWlsdXJlJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1wLCAtLXNjcmVlbnNob3QtcGF0aC1wYXR0ZXJuIDxwYXR0ZXJuPicsICdzcGVjaWZ5IHRoZSBuYW1pbmcgc2NoZW1hIGZvciBzY3JlZW5zaG90IGZpbGVuYW1lcyBhbmQgcGF0aHM6ICR7QlJPV1NFUn0sICR7QlJPV1NFUl9WRVJTSU9OfSwgJHtPU30sIGV0Yy4nKVxuICAgICAgICAgICAgLm9wdGlvbignLXEsIC0tcXVhcmFudGluZS1tb2RlIFtvcHRpb249dmFsdWUsLi4uXScsICdlbmFibGUgYW5kIGNvbmZpZ3VyZSBxdWFyYW50aW5lIG1vZGUnKVxuICAgICAgICAgICAgLm9wdGlvbignLWQsIC0tZGVidWctbW9kZScsICdlbmFibGUgZGVidWcgbW9kZS4gV2hlbiB5b3UgcnVuIFRlc3RDYWZlIGluIGRlYnVnIG1vZGUsIGl0IGV4ZWN1dGVzIHRlc3Qgc3RlcHMgb25lIGJ5IG9uZSwgYW5kIHBhdXNlcyB0aGUgdGVzdCBhZnRlciBlYWNoIHN0ZXAuJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1lLCAtLXNraXAtanMtZXJyb3JzIFtvcHRpb249dmFsdWUsLi4uXScsICdpZ25vcmUgSmF2YVNjcmlwdCBlcnJvcnMgdGhhdCBtYXRjaCB0aGUgc3BlY2lmaWVkIGNyaXRlcmlhJylcbiAgICAgICAgICAgIC5vcHRpb24oJy11LCAtLXNraXAtdW5jYXVnaHQtZXJyb3JzJywgJ2lnbm9yZSB1bmNhdWdodCBlcnJvcnMgYW5kIHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbnMnKVxuICAgICAgICAgICAgLm9wdGlvbignLXQsIC0tdGVzdCA8bmFtZT4nLCAnZmlsdGVyIHRlc3RzIGJ5IG5hbWUnKVxuICAgICAgICAgICAgLm9wdGlvbignLVQsIC0tdGVzdC1ncmVwIDxwYXR0ZXJuPicsICdmaWx0ZXIgdGVzdHMgYnkgcmVndWxhciBleHByZXNzaW9uJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1mLCAtLWZpeHR1cmUgPG5hbWU+JywgJ2ZpbHRlciBmaXh0dXJlcyBieSBuYW1lJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1GLCAtLWZpeHR1cmUtZ3JlcCA8cGF0dGVybj4nLCAnZmlsdGVyIGZpeHR1cmVzIGJ5IHJlZ3VsYXIgZXhwcmVzc2lvbicpXG4gICAgICAgICAgICAub3B0aW9uKCctYSwgLS1hcHAgPGNvbW1hbmQ+JywgJ2V4ZWN1dGUgYSBzaGVsbCBjb21tYW5kIG9uIHN0YXJ0dXAgdG8gbGF1bmNoIGEgd2ViIGFwcGxpY2F0aW9uIG9yIHBlcmZvcm0gb3RoZXIgcHJlcGFyYXRvcnkgdGFza3MnKVxuICAgICAgICAgICAgLm9wdGlvbignLWMsIC0tY29uY3VycmVuY3kgPG51bWJlcj4nLCAncnVuIHRlc3RzIGNvbmN1cnJlbnRseScpXG4gICAgICAgICAgICAub3B0aW9uKCctTCwgLS1saXZlJywgJ2VuYWJsZSBsaXZlIG1vZGUuIExpdmUgbW9kZSByZXN0YXJ0cyB0ZXN0cyB3aGVuIHlvdSBtYWtlIGNoYW5nZXMgdG8gdGVzdCBmaWxlcy4nKVxuICAgICAgICAgICAgLm9wdGlvbignLS10ZXN0LW1ldGEgPGtleT12YWx1ZVssa2V5Mj12YWx1ZTIsLi4uXT4nLCAnZmlsdGVyIHRlc3RzIGJ5IG1ldGFkYXRhJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZml4dHVyZS1tZXRhIDxrZXk9dmFsdWVbLGtleTI9dmFsdWUyLC4uLl0+JywgJ2ZpbHRlciBmaXh0dXJlcyBieSBtZXRhZGF0YScpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRlYnVnLW9uLWZhaWwnLCAncGF1c2UgdGVzdHMgb24gZmFpbHVyZScpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGUtbmF0aXZlLWF1dG9tYXRpb24nLCAnZGlzYWJsZSBuYXRpdmUgYXV0b21hdGlvbicpXG4gICAgICAgICAgICAub3B0aW9uKCctLWFwcC1pbml0LWRlbGF5IDxtcz4nLCAnc3BlY2lmeSB5b3VyIGFwcGxpY2F0aW9uYHMgaW5pdGlhbGl6YXRpb24gdGltZScpXG4gICAgICAgICAgICAub3B0aW9uKCctLXNlbGVjdG9yLXRpbWVvdXQgPG1zPicsICdzcGVjaWZ5IHRoZSBtYXhpbXVtIFNlbGVjdG9yIHJlc29sdXRpb24gdGltZScpXG4gICAgICAgICAgICAub3B0aW9uKCctLWFzc2VydGlvbi10aW1lb3V0IDxtcz4nLCAnc3BlY2lmeSB0aGUgbWF4aW11bSBBc3NlcnRpb24gcmVzb2x1dGlvbiB0aW1lJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tcGFnZS1sb2FkLXRpbWVvdXQgPG1zPicsICdzcGVjaWZ5IHRoZSBtYXhpbXVtIHRpbWUgYmV0d2VlbiB0aGUgd2luZG93LmxvYWQgZXZlbnQgYW5kIHRoZSBET01Db250ZW50TG9hZGVkIGV2ZW50IChtcyknKVxuICAgICAgICAgICAgLm9wdGlvbignLS1wYWdlLXJlcXVlc3QtdGltZW91dCA8bXM+JywgJ3NwZWNpZnkgdGhlIG1heGltdW0gcGFnZSByZXF1ZXN0IHJlc29sdXRpb24gdGltZScpXG4gICAgICAgICAgICAub3B0aW9uKCctLWFqYXgtcmVxdWVzdC10aW1lb3V0IDxtcz4nLCAnc3BlY2lmeSB0aGUgbWF4aW11bSBBSkFYIHJlcXVlc3QgcmVzb2x1dGlvbiB0aW1lJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tYnJvd3Nlci1pbml0LXRpbWVvdXQgPG1zPicsICdzcGVjaWZ5IHRoZSBtYXhpbXVtIGJyb3dzZXIgc3RhcnR1cCB0aW1lJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tdGVzdC1leGVjdXRpb24tdGltZW91dCA8bXM+JywgJ3NwZWNpZnkgdGhlIG1heGltdW0gdGVzdCBleGVjdXRpb24gdGltZScpXG4gICAgICAgICAgICAub3B0aW9uKCctLXJ1bi1leGVjdXRpb24tdGltZW91dCA8bXM+JywgJ3NwZWNpZnkgdGhlIG1heGltdW0gdGVzdCBydW4gdGltZScpXG4gICAgICAgICAgICAub3B0aW9uKCctLXNwZWVkIDxmYWN0b3I+JywgJ3NldCB0ZXN0IGV4ZWN1dGlvbiBzcGVlZCAoMC4wMSAuLi4gMSknKVxuICAgICAgICAgICAgLm9wdGlvbignLS1wb3J0cyA8cG9ydDEscG9ydDI+JywgJ3NwZWNpZnkgbmV0d29yayBwb3J0cyB0byB1c2UgZHVyaW5nIHRoZSB0ZXN0IHJ1bi4gVGhlIHNlY29uZCBwb3J0IGlzIG5lY2Vzc2FyeSB0byBhY2Nlc3MgY3Jvc3MtZG9tYWluIHJlc291cmNlcy4nKVxuICAgICAgICAgICAgLm9wdGlvbignLS1ob3N0bmFtZSA8bmFtZT4nLCBgc3BlY2lmeSB5b3VyIGhvc3RuYW1lLiBOZWNlc3NhcnkgdG8gcnVuIHRlc3RzIGluIHJlbW90ZSBicm93c2Vycy5gKVxuICAgICAgICAgICAgLm9wdGlvbignLS1wcm94eSA8aG9zdD4nLCAnc3BlY2lmeSB0aGUgcHJveHkgc2VydmVyIGhvc3RuYW1lIG9yIElQIGFkZHJlc3MnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1wcm94eS1ieXBhc3MgPHJ1bGVzPicsICdzcGVjaWZ5IFVSTHMgdGhhdCBieXBhc3MgdGhlIHByb3h5IHNlcnZlcicpXG4gICAgICAgICAgICAub3B0aW9uKCctLXNzbCA8b3B0aW9ucz4nLCAnc3BlY2lmeSBTU0wgb3B0aW9ucyB0byBydW4gVGVzdENhZmUgb3ZlciBIVFRQUycpXG4gICAgICAgICAgICAub3B0aW9uKCctLXZpZGVvIDxwYXRoPicsICdyZWNvcmQgdmlkZW9zIG9mIHRlc3QgcnVucycpXG4gICAgICAgICAgICAub3B0aW9uKCctLXZpZGVvLW9wdGlvbnMgPG9wdGlvbj12YWx1ZVssLi4uXT4nLCAnc3BlY2lmeSB2aWRlbyByZWNvcmRpbmcgb3B0aW9ucycpXG4gICAgICAgICAgICAub3B0aW9uKCctLXZpZGVvLWVuY29kaW5nLW9wdGlvbnMgPG9wdGlvbj12YWx1ZVssLi4uXT4nLCAnc3BlY2lmeSB2aWRlbyBlbmNvZGluZyBvcHRpb25zJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGV2JywgJ2xvZyBhbmQgZGlhZ25vc2UgVGVzdENhZmUgZXJyb3JzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tcXItY29kZScsICdvdXRwdXQgUVIgY29kZXMgd2l0aCBVUkxzIGZvciByZW1vdGUgYnJvd3NlciBjb25uZWN0aW9ucycpXG4gICAgICAgICAgICAub3B0aW9uKCctLXNmLCAtLXN0b3Atb24tZmlyc3QtZmFpbCcsICdzdG9wIHRoZSB0ZXN0IHJ1biBpZiBhbnkgdGVzdCBmYWlscycpXG4gICAgICAgICAgICAub3B0aW9uKCctLWNvbmZpZy1maWxlIDxwYXRoPicsICdzcGVjaWZ5IGEgY3VzdG9tIHBhdGggdG8gdGhlIHRlc3RjYWZlIGNvbmZpZ3VyYXRpb24gZmlsZScpXG4gICAgICAgICAgICAub3B0aW9uKCctLXRzLWNvbmZpZy1wYXRoIDxwYXRoPicsICdzcGVjaWZ5IHRoZSBwYXRoIHRvIGEgY3VzdG9tIFR5cGVTY3JpcHQgY29uZmlndXJhdGlvbiBmaWxlJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tY3MsIC0tY2xpZW50LXNjcmlwdHMgPHBhdGhzPicsICdpbmplY3QgY2xpZW50LXNpZGUgc2NyaXB0cyBpbnRvIHRoZSBwYWdlJywgcGFyc2VMaXN0LCBbXSlcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZS1wYWdlLWNhY2hpbmcnLCAnZG8gbm90IGNhY2hlIHBhZ2VzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZS1wYWdlLXJlbG9hZHMnLCAnZG8gbm90IHJlbG9hZCBwYWdlcyBiZXR3ZWVuIHRlc3RzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tcmV0cnktdGVzdC1wYWdlcycsICdyZXRyeSBwYWdlIHJlcXVlc3RzIGluIGNhc2Ugb2YgZmFpbHVyZScpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGUtc2NyZWVuc2hvdHMnLCAnZGlzYWJsZSBzY3JlZW5zaG90cycpXG4gICAgICAgICAgICAub3B0aW9uKCctLXNjcmVlbnNob3RzLWZ1bGwtcGFnZScsICdlbmFibGUgZnVsbC1wYWdlIHNjcmVlbnNob3RzJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tY29tcGlsZXItb3B0aW9ucyA8b3B0aW9uPXZhbHVlWywuLi5dPicsICdzcGVjaWZ5IHRlc3QgY29tcGlsYXRpb24gc2V0dGluZ3MnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1kaXNhYmxlLW11bHRpcGxlLXdpbmRvd3MnLCAnZGlzYWJsZSB0aGUgbXVsdGktd2luZG93IG1vZGUnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1kaXNhYmxlLWh0dHAyJywgJ2ZvcmNlIHRoZSBwcm94eSB0byBpc3N1ZSBIVFRQLzEuMSByZXF1ZXN0cycpXG4gICAgICAgICAgICAub3B0aW9uKCctLWNhY2hlJywgJ2NhY2hlIHdlYiBhc3NldHMgYmV0d2VlbiB0ZXN0IHJ1bnMnKVxuICAgICAgICAgICAgLm9wdGlvbignLS1iYXNlLXVybCA8dXJsPicsICdzZXQgdGhlIGJhc2UgdXJsIGZvciB0aGUgdGVzdCBydW4nKVxuICAgICAgICAgICAgLm9wdGlvbignLS1lc20nLCAnZW5hYmxlIEVTTSBtb2R1bGUgc3VwcG9ydCcpXG5cbiAgICAgICAgICAgIC8vIE5PVEU6IHRoZXNlIG9wdGlvbnMgd2lsbCBiZSBoYW5kbGVkIGJ5IGNoYWxrIGludGVybmFsbHlcbiAgICAgICAgICAgIC5vcHRpb24oJy0tY29sb3InLCAnZm9yY2UgVGVzdENhZmUgdG8gZm9ybWF0IENMSSBvdXRwdXQgd2l0aCBjb2xvcicpXG4gICAgICAgICAgICAub3B0aW9uKCctLW5vLWNvbG9yJywgJ2Rpc2FibGUgdGV4dCBjb2xvciBmb3JtYXR0aW5nIGluIHRoZSBDTEknKVxuXG4gICAgICAgICAgICAvLyBOT1RFOiBUZW1wb3JhcmlseSBleGNsdWRlIGV4cGVyaW1lbnRhbCBvcHRpb25zIGZyb20gLS1oZWxwIG91dHB1dFxuICAgICAgICAgICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctLWRpc2FibGUtY3Jvc3MtZG9tYWluJywgJ2V4cGVyaW1lbnRhbCcpLmhpZGVIZWxwKCkpXG4gICAgICAgICAgICAuYWN0aW9uKChvcHRzOiBDb21tYW5kTGluZU9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdHMgPSBvcHRzO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGF0Y2hIZWxwT3V0cHV0IChkZWZhdWx0U3ViQ29tbWFuZDogQ29tbWFuZCk6IHZvaWQge1xuICAgICAgICAvLyBOT1RFOiBJbiB0aGUgZnV0dXJlIHZlcnNpb25zIG9mIHRoZSAnY29tbWFuZGVyJyBtb2R1bGVcbiAgICAgICAgLy8gbmVlZCB0byBpbnZlc3RpZ2F0ZSBob3cgdG8gcmVtb3ZlIHRoaXMgaGFjay5cbiAgICAgICAgKHByb2dyYW0gYXMgdW5rbm93biBhcyBDb21tYW5kKS5vdXRwdXRIZWxwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3Qgc3RvcmVkUGFyZW50ID0gZGVmYXVsdFN1YkNvbW1hbmQucGFyZW50O1xuXG4gICAgICAgICAgICBkZWZhdWx0U3ViQ29tbWFuZC5wYXJlbnQgPSBudWxsO1xuXG4gICAgICAgICAgICBkZWZhdWx0U3ViQ29tbWFuZC5vdXRwdXRIZWxwKCk7XG5cbiAgICAgICAgICAgIGRlZmF1bHRTdWJDb21tYW5kLnBhcmVudCA9IHN0b3JlZFBhcmVudDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jaGVja0FuZENvdW50UmVtb3RlcyAoYnJvd3Nlcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHJlbW90ZU1hdGNoID0gYnJvd3Nlci5tYXRjaChSRU1PVEVfQUxJQVNfUkUpO1xuXG4gICAgICAgIGlmIChyZW1vdGVNYXRjaCkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdGVDb3VudCArPSBwYXJzZUludChyZW1vdGVNYXRjaFsxXSwgMTApIHx8IDE7XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBfcGFyc2VGaWx0ZXJpbmdPcHRpb25zICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy50ZXN0R3JlcClcbiAgICAgICAgICAgIHRoaXMub3B0cy50ZXN0R3JlcCA9IGdldEdyZXBPcHRpb25zKCctLXRlc3QtZ3JlcCcsIHRoaXMub3B0cy50ZXN0R3JlcCBhcyBzdHJpbmcpO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdHMuZml4dHVyZUdyZXApXG4gICAgICAgICAgICB0aGlzLm9wdHMuZml4dHVyZUdyZXAgPSBnZXRHcmVwT3B0aW9ucygnLS1maXh0dXJlLWdyZXAnLCB0aGlzLm9wdHMuZml4dHVyZUdyZXAgYXMgc3RyaW5nKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRzLnRlc3RNZXRhKVxuICAgICAgICAgICAgdGhpcy5vcHRzLnRlc3RNZXRhID0gYXdhaXQgZ2V0TWV0YU9wdGlvbnMoJy0tdGVzdC1tZXRhJywgdGhpcy5vcHRzLnRlc3RNZXRhIGFzIHN0cmluZyk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0cy5maXh0dXJlTWV0YSlcbiAgICAgICAgICAgIHRoaXMub3B0cy5maXh0dXJlTWV0YSA9IGF3YWl0IGdldE1ldGFPcHRpb25zKCctLWZpeHR1cmUtbWV0YScsIHRoaXMub3B0cy5maXh0dXJlTWV0YSBhcyBzdHJpbmcpO1xuXG4gICAgICAgIHRoaXMub3B0cy5maWx0ZXIgPSBnZXRGaWx0ZXJGbih0aGlzLm9wdHMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlQXBwSW5pdERlbGF5ICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5hcHBJbml0RGVsYXkpIHtcbiAgICAgICAgICAgIGFzc2VydFR5cGUoaXMubm9uTmVnYXRpdmVOdW1iZXJTdHJpbmcsIG51bGwsICdUaGUgdGVzdGVkIGFwcCBpbml0aWFsaXphdGlvbiBkZWxheScsIHRoaXMub3B0cy5hcHBJbml0RGVsYXkpO1xuXG4gICAgICAgICAgICB0aGlzLm9wdHMuYXBwSW5pdERlbGF5ID0gcGFyc2VJbnQodGhpcy5vcHRzLmFwcEluaXREZWxheSBhcyBzdHJpbmcsIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlU2VsZWN0b3JUaW1lb3V0ICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5zZWxlY3RvclRpbWVvdXQpIHtcbiAgICAgICAgICAgIGFzc2VydFR5cGUoaXMubm9uTmVnYXRpdmVOdW1iZXJTdHJpbmcsIG51bGwsICdUaGUgU2VsZWN0b3IgdGltZW91dCcsIHRoaXMub3B0cy5zZWxlY3RvclRpbWVvdXQpO1xuXG4gICAgICAgICAgICB0aGlzLm9wdHMuc2VsZWN0b3JUaW1lb3V0ID0gcGFyc2VJbnQodGhpcy5vcHRzLnNlbGVjdG9yVGltZW91dCBhcyBzdHJpbmcsIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlQXNzZXJ0aW9uVGltZW91dCAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuYXNzZXJ0aW9uVGltZW91dCkge1xuICAgICAgICAgICAgYXNzZXJ0VHlwZShpcy5ub25OZWdhdGl2ZU51bWJlclN0cmluZywgbnVsbCwgJ1RoZSBhc3NlcnRpb24gdGltZW91dCcsIHRoaXMub3B0cy5hc3NlcnRpb25UaW1lb3V0KTtcblxuICAgICAgICAgICAgdGhpcy5vcHRzLmFzc2VydGlvblRpbWVvdXQgPSBwYXJzZUludCh0aGlzLm9wdHMuYXNzZXJ0aW9uVGltZW91dCBhcyBzdHJpbmcsIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlUGFnZUxvYWRUaW1lb3V0ICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5wYWdlTG9hZFRpbWVvdXQpIHtcbiAgICAgICAgICAgIGFzc2VydFR5cGUoaXMubm9uTmVnYXRpdmVOdW1iZXJTdHJpbmcsIG51bGwsICdUaGUgcGFnZSBsb2FkIHRpbWVvdXQnLCB0aGlzLm9wdHMucGFnZUxvYWRUaW1lb3V0KTtcblxuICAgICAgICAgICAgdGhpcy5vcHRzLnBhZ2VMb2FkVGltZW91dCA9IHBhcnNlSW50KHRoaXMub3B0cy5wYWdlTG9hZFRpbWVvdXQgYXMgc3RyaW5nLCAxMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZVBhZ2VSZXF1ZXN0VGltZW91dCAoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5vcHRzLnBhZ2VSZXF1ZXN0VGltZW91dClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBhc3NlcnRUeXBlKGlzLm5vbk5lZ2F0aXZlTnVtYmVyU3RyaW5nLCBudWxsLCAnVGhlIHBhZ2UgcmVxdWVzdCB0aW1lb3V0JywgdGhpcy5vcHRzLnBhZ2VSZXF1ZXN0VGltZW91dCk7XG5cbiAgICAgICAgdGhpcy5vcHRzLnBhZ2VSZXF1ZXN0VGltZW91dCA9IHBhcnNlSW50KHRoaXMub3B0cy5wYWdlUmVxdWVzdFRpbWVvdXQgYXMgc3RyaW5nLCAxMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VBamF4UmVxdWVzdFRpbWVvdXQgKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMub3B0cy5hamF4UmVxdWVzdFRpbWVvdXQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgYXNzZXJ0VHlwZShpcy5ub25OZWdhdGl2ZU51bWJlclN0cmluZywgbnVsbCwgJ1RoZSBBSkFYIHJlcXVlc3QgdGltZW91dCcsIHRoaXMub3B0cy5hamF4UmVxdWVzdFRpbWVvdXQpO1xuXG4gICAgICAgIHRoaXMub3B0cy5hamF4UmVxdWVzdFRpbWVvdXQgPSBwYXJzZUludCh0aGlzLm9wdHMuYWpheFJlcXVlc3RUaW1lb3V0IGFzIHN0cmluZywgMTApO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlQnJvd3NlckluaXRUaW1lb3V0ICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdHMuYnJvd3NlckluaXRUaW1lb3V0KVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGFzc2VydFR5cGUoaXMubm9uTmVnYXRpdmVOdW1iZXJTdHJpbmcsIG51bGwsICdUaGUgYnJvd3NlciBpbml0aWFsaXphdGlvbiB0aW1lb3V0JywgdGhpcy5vcHRzLmJyb3dzZXJJbml0VGltZW91dCk7XG5cbiAgICAgICAgdGhpcy5vcHRzLmJyb3dzZXJJbml0VGltZW91dCA9IHBhcnNlSW50KHRoaXMub3B0cy5icm93c2VySW5pdFRpbWVvdXQgYXMgc3RyaW5nLCAxMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VUZXN0RXhlY3V0aW9uVGltZW91dCAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMudGVzdEV4ZWN1dGlvblRpbWVvdXQpIHtcbiAgICAgICAgICAgIGFzc2VydFR5cGUoaXMubm9uTmVnYXRpdmVOdW1iZXJTdHJpbmcsIG51bGwsICdUaGUgdGVzdCBleGVjdXRpb24gdGltZW91dCcsIHRoaXMub3B0cy50ZXN0RXhlY3V0aW9uVGltZW91dCk7XG5cbiAgICAgICAgICAgIHRoaXMub3B0cy50ZXN0RXhlY3V0aW9uVGltZW91dCA9IHBhcnNlSW50KHRoaXMub3B0cy50ZXN0RXhlY3V0aW9uVGltZW91dCBhcyBzdHJpbmcsIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlUnVuRXhlY3V0aW9uVGltZW91dCAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMucnVuRXhlY3V0aW9uVGltZW91dCkge1xuICAgICAgICAgICAgYXNzZXJ0VHlwZShpcy5ub25OZWdhdGl2ZU51bWJlclN0cmluZywgbnVsbCwgJ1RoZSBydW4gZXhlY3V0aW9uIHRpbWVvdXQnLCB0aGlzLm9wdHMucnVuRXhlY3V0aW9uVGltZW91dCk7XG5cbiAgICAgICAgICAgIHRoaXMub3B0cy5ydW5FeGVjdXRpb25UaW1lb3V0ID0gcGFyc2VJbnQodGhpcy5vcHRzLnJ1bkV4ZWN1dGlvblRpbWVvdXQgYXMgc3RyaW5nLCAxMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZVNwZWVkICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5zcGVlZClcbiAgICAgICAgICAgIHRoaXMub3B0cy5zcGVlZCA9IHBhcnNlRmxvYXQodGhpcy5vcHRzLnNwZWVkIGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VDb25jdXJyZW5jeSAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuY29uY3VycmVuY3kpXG4gICAgICAgICAgICB0aGlzLm9wdHMuY29uY3VycmVuY3kgPSBwYXJzZUludCh0aGlzLm9wdHMuY29uY3VycmVuY3kgYXMgc3RyaW5nLCAxMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcGFyc2VRdWFyYW50aW5lT3B0aW9ucyAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMucXVhcmFudGluZU1vZGUgIT09IHZvaWQgMClcbiAgICAgICAgICAgIHRoaXMub3B0cy5xdWFyYW50aW5lTW9kZSA9IGF3YWl0IGdldFF1YXJhbnRpbmVPcHRpb25zKCctLXF1YXJhbnRpbmUtbW9kZScsIHRoaXMub3B0cy5xdWFyYW50aW5lTW9kZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcGFyc2VTa2lwSnNFcnJvcnNPcHRpb25zICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5za2lwSnNFcnJvcnMgIT09IHZvaWQgMClcbiAgICAgICAgICAgIHRoaXMub3B0cy5za2lwSnNFcnJvcnMgPSBhd2FpdCBnZXRTa2lwSnNFcnJvcnNPcHRpb25zKCctLXNraXAtanMtZXJyb3JzJywgdGhpcy5vcHRzLnNraXBKc0Vycm9ycyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VQb3J0cyAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMucG9ydHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFBvcnRzID0gKHRoaXMub3B0cy5wb3J0cyBhcyBzdHJpbmcpIC8qIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZXh0cmEtcGFyZW5zICovXG4gICAgICAgICAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgICAgICAgICAubWFwKHBhcnNlUG9ydE51bWJlcik7XG5cbiAgICAgICAgICAgIGlmIChwYXJzZWRQb3J0cy5sZW5ndGggPCAyKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMucG9ydHNPcHRpb25SZXF1aXJlc1R3b051bWJlcnMpO1xuXG4gICAgICAgICAgICB0aGlzLm9wdHMucG9ydHMgPSBwYXJzZWRQb3J0cyBhcyBudW1iZXJbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlQnJvd3NlcnNGcm9tQXJncyAoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGJyb3dzZXJzQXJnID0gdGhpcy50ZXN0Q2FmZUNvbW1hbmQuYXJnc1swXSB8fCAnJztcblxuICAgICAgICB0aGlzLm9wdHMuYnJvd3NlcnMgPSBzcGxpdFF1b3RlZFRleHQoYnJvd3NlcnNBcmcsICcsJylcbiAgICAgICAgICAgIC5maWx0ZXIoYnJvd3NlciA9PiBicm93c2VyICYmIHRoaXMuX2NoZWNrQW5kQ291bnRSZW1vdGVzKGJyb3dzZXIpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX3BhcnNlU3NsT3B0aW9ucyAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuc3NsKVxuICAgICAgICAgICAgdGhpcy5vcHRzLnNzbCA9IGF3YWl0IGdldFNTTE9wdGlvbnModGhpcy5vcHRzLnNzbCBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3BhcnNlUmVwb3J0ZXJzICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcmVwb3J0ZXJzID0gdGhpcy5vcHRzLnJlcG9ydGVyID8gKHRoaXMub3B0cy5yZXBvcnRlciBhcyBzdHJpbmcpLnNwbGl0KCcsJykgOiBbXTsgLyogZXNsaW50LWRpc2FibGUtbGluZSBuby1leHRyYS1wYXJlbnMqL1xuXG4gICAgICAgIHRoaXMub3B0cy5yZXBvcnRlciA9IHJlcG9ydGVycy5tYXAoKHJlcG9ydGVyOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlcGFyYXRvckluZGV4ID0gcmVwb3J0ZXIuaW5kZXhPZignOicpO1xuXG4gICAgICAgICAgICBpZiAoc2VwYXJhdG9ySW5kZXggPCAwKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IHJlcG9ydGVyIH07XG5cbiAgICAgICAgICAgIGNvbnN0IG5hbWUgICA9IHJlcG9ydGVyLnN1YnN0cmluZygwLCBzZXBhcmF0b3JJbmRleCk7XG4gICAgICAgICAgICBjb25zdCBvdXRwdXQgPSByZXBvcnRlci5zdWJzdHJpbmcoc2VwYXJhdG9ySW5kZXggKyAxKTtcblxuICAgICAgICAgICAgcmV0dXJuIHsgbmFtZSwgb3V0cHV0IH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlRmlsZUxpc3QgKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9wdHMuc3JjID0gdGhpcy50ZXN0Q2FmZUNvbW1hbmQuYXJncy5zbGljZSgxKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9wYXJzZVNjcmVlbnNob3RPcHRpb25zICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5zY3JlZW5zaG90cylcbiAgICAgICAgICAgIHRoaXMub3B0cy5zY3JlZW5zaG90cyA9IGF3YWl0IGdldFNjcmVlbnNob3RPcHRpb25zKHRoaXMub3B0cy5zY3JlZW5zaG90cyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMub3B0cy5zY3JlZW5zaG90cyA9IHt9O1xuXG4gICAgICAgIGlmICghaGFzKHRoaXMub3B0cy5zY3JlZW5zaG90cywgU0NSRUVOU0hPVF9PUFRJT05fTkFNRVMucGF0aFBhdHRlcm4pICYmIHRoaXMub3B0cy5zY3JlZW5zaG90UGF0aFBhdHRlcm4pXG4gICAgICAgICAgICB0aGlzLm9wdHMuc2NyZWVuc2hvdHNbU0NSRUVOU0hPVF9PUFRJT05fTkFNRVMucGF0aFBhdHRlcm5dID0gdGhpcy5vcHRzLnNjcmVlbnNob3RQYXRoUGF0dGVybjtcblxuICAgICAgICBpZiAoIWhhcyh0aGlzLm9wdHMuc2NyZWVuc2hvdHMsIFNDUkVFTlNIT1RfT1BUSU9OX05BTUVTLnRha2VPbkZhaWxzKSAmJiB0aGlzLm9wdHMuc2NyZWVuc2hvdHNPbkZhaWxzKVxuICAgICAgICAgICAgdGhpcy5vcHRzLnNjcmVlbnNob3RzW1NDUkVFTlNIT1RfT1BUSU9OX05BTUVTLnRha2VPbkZhaWxzXSA9IHRoaXMub3B0cy5zY3JlZW5zaG90c09uRmFpbHM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcGFyc2VWaWRlb09wdGlvbnMgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5vcHRzLnZpZGVvT3B0aW9ucylcbiAgICAgICAgICAgIHRoaXMub3B0cy52aWRlb09wdGlvbnMgPSBhd2FpdCBnZXRWaWRlb09wdGlvbnModGhpcy5vcHRzLnZpZGVvT3B0aW9ucyBhcyBzdHJpbmcpO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdHMudmlkZW9FbmNvZGluZ09wdGlvbnMpXG4gICAgICAgICAgICB0aGlzLm9wdHMudmlkZW9FbmNvZGluZ09wdGlvbnMgPSBhd2FpdCBnZXRWaWRlb09wdGlvbnModGhpcy5vcHRzLnZpZGVvRW5jb2RpbmdPcHRpb25zIGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcGFyc2VDb21waWxlck9wdGlvbnMgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMub3B0cy5jb21waWxlck9wdGlvbnMpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcGFyc2VkQ29tcGlsZXJPcHRpb25zID0gYXdhaXQgZ2V0Q29tcGlsZXJPcHRpb25zKHRoaXMub3B0cy5jb21waWxlck9wdGlvbnMgYXMgc3RyaW5nKTtcbiAgICAgICAgY29uc3QgcmVzdWx0Q29tcGlsZXJPcHRpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWRDb21waWxlck9wdGlvbnMpKVxuICAgICAgICAgICAgc2V0KHJlc3VsdENvbXBpbGVyT3B0aW9ucywga2V5LCB2YWx1ZSk7XG5cbiAgICAgICAgdGhpcy5vcHRzLmNvbXBpbGVyT3B0aW9ucyA9IHJlc3VsdENvbXBpbGVyT3B0aW9ucztcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wYXJzZUxpc3RCcm93c2VycyAoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGxpc3RCcm93c2VyT3B0aW9uID0gdGhpcy5vcHRzLmxpc3RCcm93c2VycztcblxuICAgICAgICB0aGlzLm9wdHMubGlzdEJyb3dzZXJzID0gISF0aGlzLm9wdHMubGlzdEJyb3dzZXJzO1xuXG4gICAgICAgIGlmICghdGhpcy5vcHRzLmxpc3RCcm93c2VycylcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aGlzLm9wdHMucHJvdmlkZXJOYW1lID0gdHlwZW9mIGxpc3RCcm93c2VyT3B0aW9uID09PSAnc3RyaW5nJyA/IGxpc3RCcm93c2VyT3B0aW9uIDogJ2xvY2FsbHktaW5zdGFsbGVkJztcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfcHJlcGFyZUJvb2xlYW5Pck9iamVjdE9wdGlvbiAoYXJndjogc3RyaW5nW10sIG9wdGlvbk5hbWVzOiBzdHJpbmdbXSwgc3ViT3B0aW9uc05hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgICAgICAvLyBOT1RFOiBtb3ZlIG9wdGlvbnMgdG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkgdG8gY29ycmVjdGx5IHBhcnNlIGJvdGggQm9vbGVhbiBhbmQgT2JqZWN0IHR5cGUgYXJndW1lbnRzIChHSC02MjMxKVxuICAgICAgICBjb25zdCBvcHRpb25JbmRleCA9IGFyZ3YuZmluZEluZGV4KFxuICAgICAgICAgICAgZWwgPT4gb3B0aW9uTmFtZXMuc29tZShvcHQgPT4gZWwuc3RhcnRzV2l0aChvcHQpKSk7XG5cbiAgICAgICAgaWYgKG9wdGlvbkluZGV4ID4gLTEgJiYgc2hvdWxkTW92ZU9wdGlvblRvRW5kKGFyZ3YsIG9wdGlvbkluZGV4LCBzdWJPcHRpb25zTmFtZXMpKVxuICAgICAgICAgICAgYXJndi5wdXNoKGFyZ3Yuc3BsaWNlKG9wdGlvbkluZGV4LCAxKVswXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHBhcnNlIChhcmd2OiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBDTElBcmd1bWVudFBhcnNlci5fcHJlcGFyZUJvb2xlYW5Pck9iamVjdE9wdGlvbihhcmd2LCBbJy1xJywgJy0tcXVhcmFudGluZS1tb2RlJ10sIE9iamVjdC52YWx1ZXMoUVVBUkFOVElORV9PUFRJT05fTkFNRVMpKTtcbiAgICAgICAgQ0xJQXJndW1lbnRQYXJzZXIuX3ByZXBhcmVCb29sZWFuT3JPYmplY3RPcHRpb24oYXJndiwgWyctZScsICctLXNraXAtanMtZXJyb3JzJ10sIE9iamVjdC52YWx1ZXMoU0tJUF9KU19FUlJPUlNfT1BUSU9OU19PQkpFQ1RfT1BUSU9OX05BTUVTKSk7XG5cbiAgICAgICAgY29uc3QgeyBhcmdzLCB2OEZsYWdzIH0gPSBleHRyYWN0Tm9kZVByb2Nlc3NBcmd1bWVudHMoYXJndik7XG5cbiAgICAgICAgKHByb2dyYW0gYXMgdW5rbm93biBhcyBDb21tYW5kKS5wYXJzZShhcmdzKTtcblxuICAgICAgICB0aGlzLmFyZ3MgPSAocHJvZ3JhbSBhcyB1bmtub3duIGFzIENvbW1hbmQpLmFyZ3M7XG4gICAgICAgIHRoaXMub3B0cyA9IE9iamVjdC5hc3NpZ24odGhpcy5vcHRzLCB7IHY4RmxhZ3MgfSk7XG5cbiAgICAgICAgdGhpcy5fcGFyc2VMaXN0QnJvd3NlcnMoKTtcblxuICAgICAgICAvLyBOT1RFOiB0aGUgJy0tbGlzdC1icm93c2Vycycgb3B0aW9uIG9ubHkgbGlzdHMgYnJvd3NlcnMgYW5kIGltbWVkaWF0ZWx5IGV4aXRzIHRoZSBhcHAuXG4gICAgICAgIC8vIFRoZXJlZm9yZSwgd2UgZG9uJ3QgbmVlZCB0byBwcm9jZXNzIG90aGVyIGFyZ3VtZW50cy5cbiAgICAgICAgaWYgKHRoaXMub3B0cy5saXN0QnJvd3NlcnMpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy5fcGFyc2VTZWxlY3RvclRpbWVvdXQoKTtcbiAgICAgICAgdGhpcy5fcGFyc2VBc3NlcnRpb25UaW1lb3V0KCk7XG4gICAgICAgIHRoaXMuX3BhcnNlUGFnZUxvYWRUaW1lb3V0KCk7XG4gICAgICAgIHRoaXMuX3BhcnNlUGFnZVJlcXVlc3RUaW1lb3V0KCk7XG4gICAgICAgIHRoaXMuX3BhcnNlQWpheFJlcXVlc3RUaW1lb3V0KCk7XG4gICAgICAgIHRoaXMuX3BhcnNlQnJvd3NlckluaXRUaW1lb3V0KCk7XG4gICAgICAgIHRoaXMuX3BhcnNlVGVzdEV4ZWN1dGlvblRpbWVvdXQoKTtcbiAgICAgICAgdGhpcy5fcGFyc2VSdW5FeGVjdXRpb25UaW1lb3V0KCk7XG4gICAgICAgIHRoaXMuX3BhcnNlQXBwSW5pdERlbGF5KCk7XG4gICAgICAgIHRoaXMuX3BhcnNlU3BlZWQoKTtcbiAgICAgICAgdGhpcy5fcGFyc2VQb3J0cygpO1xuICAgICAgICB0aGlzLl9wYXJzZUJyb3dzZXJzRnJvbUFyZ3MoKTtcbiAgICAgICAgdGhpcy5fcGFyc2VDb25jdXJyZW5jeSgpO1xuICAgICAgICB0aGlzLl9wYXJzZUZpbGVMaXN0KCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5fcGFyc2VGaWx0ZXJpbmdPcHRpb25zKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuX3BhcnNlUXVhcmFudGluZU9wdGlvbnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fcGFyc2VTa2lwSnNFcnJvcnNPcHRpb25zKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuX3BhcnNlU2NyZWVuc2hvdE9wdGlvbnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fcGFyc2VWaWRlb09wdGlvbnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fcGFyc2VDb21waWxlck9wdGlvbnMoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fcGFyc2VTc2xPcHRpb25zKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuX3BhcnNlUmVwb3J0ZXJzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJ1bk9wdGlvbnMgKCk6IFJ1bm5lclJ1bk9wdGlvbnMge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgICAgIFJVTl9PUFRJT05fTkFNRVMuZm9yRWFjaChvcHRpb25OYW1lID0+IHtcbiAgICAgICAgICAgIGlmIChvcHRpb25OYW1lIGluIHRoaXMub3B0cylcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIGEgaGFjayB0byBhZGQgYW4gaW5kZXggc2lnbmF0dXJlIHRvIGludGVyZmFjZVxuICAgICAgICAgICAgICAgIHJlc3VsdFtvcHRpb25OYW1lXSA9IHRoaXMub3B0c1tvcHRpb25OYW1lXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyBSdW5uZXJSdW5PcHRpb25zO1xuICAgIH1cbn1cbiJdfQ==