testcafe 3.1.0 → 3.3.0

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 (31) hide show
  1. package/lib/api/test-controller/assertion.js +1 -1
  2. package/lib/assertions/executor.js +1 -1
  3. package/lib/browser/connection/index.js +4 -1
  4. package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/index.js +4 -1
  5. package/lib/client/core/index.js +4 -0
  6. package/lib/client/core/index.min.js +1 -1
  7. package/lib/client-functions/selectors/selector-builder.js +3 -2
  8. package/lib/compiler/test-file/formats/dev-tools/compiler.js +8 -2
  9. package/lib/errors/get-callsite.js +3 -3
  10. package/lib/errors/runtime/templates.js +3 -1
  11. package/lib/errors/test-run/render-error-template/utils.js +2 -2
  12. package/lib/errors/test-run/utils.js +2 -2
  13. package/lib/errors/types.js +3 -1
  14. package/lib/native-automation/request-pipeline/index.js +25 -26
  15. package/lib/native-automation/request-pipeline/test-run-bridge.js +13 -1
  16. package/lib/native-automation/resource-injector.js +3 -1
  17. package/lib/runner/bootstrapper.js +32 -3
  18. package/lib/test-run/bookmark.js +1 -1
  19. package/lib/test-run/index.js +6 -4
  20. package/lib/test-run/request/create-request-options.js +1 -1
  21. package/lib/test-run/request/send.js +2 -2
  22. package/lib/utils/escape-unsafe-chars.js +13 -0
  23. package/lib/utils/get-browser.js +3 -2
  24. package/lib/utils/get-renderes.js +2 -2
  25. package/lib/utils/prerender-callsite.js +1 -1
  26. package/lib/utils/render-callsite-sync.js +2 -2
  27. package/package.json +7 -7
  28. package/ts-defs/index.d.ts +4 -0
  29. package/ts-defs/selectors.d.ts +4 -0
  30. package/ts-defs/testcafe-scripts.d.ts +4 -0
  31. package/CHANGELOG.md +0 -4956
@@ -97,8 +97,14 @@ class Bootstrapper {
97
97
  return !browserInfo.provider.supportNativeAutomation();
98
98
  });
99
99
  }
100
+ getBrowsersWithUserProfileEnabled(browserInfos) {
101
+ return browserInfos.filter(browserInfo => { var _a; return (_a = browserInfo.browserOption) === null || _a === void 0 ? void 0 : _a.userProfile; });
102
+ }
100
103
  _disableNativeAutomationIfNecessary(remotes, automated) {
101
- if (remotes.length || this._hasNotSupportedBrowserInNativeAutomation(automated))
104
+ // NOTE: CDP API allows connecting only for the local browser. So, the 'remote' browser cannot be run in the 'nativeAutomation' mode.
105
+ // However, sometimes in tests or TestCafe Studio Recorder, we use the 'remote' browser connection as a local one.
106
+ const containsNotAutomatedRemotes = remotes.some(remote => !remote.isNativeAutomationEnabled());
107
+ if (remotes.length && containsNotAutomatedRemotes || this._hasNotSupportedBrowserInNativeAutomation(automated))
102
108
  this.configuration.mergeOptions({ disableNativeAutomation: true });
103
109
  }
104
110
  async _getBrowserConnections(browserInfo) {
@@ -106,6 +112,7 @@ class Bootstrapper {
106
112
  if (remotes && remotes.length % this.concurrency)
107
113
  throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.cannotDivideRemotesCountByConcurrency);
108
114
  this._disableNativeAutomationIfNecessary(remotes, automated);
115
+ this._validateUserProfileOptionInNativeAutomation(automated);
109
116
  await this._setupProxy();
110
117
  let browserConnections = this._createAutomatedConnections(automated);
111
118
  remotes.forEach(remoteConnection => {
@@ -115,6 +122,14 @@ class Bootstrapper {
115
122
  browserConnections = browserConnections.concat((0, lodash_1.chunk)(remotes, this.concurrency));
116
123
  return browser_set_1.default.from(browserConnections, this._getBrowserSetOptions());
117
124
  }
125
+ _validateUserProfileOptionInNativeAutomation(automated) {
126
+ const isNativeAutomation = !this.configuration.getOption(option_names_1.default.disableNativeAutomation);
127
+ const browsersWithUserProfile = this.getBrowsersWithUserProfileEnabled(automated);
128
+ if (isNativeAutomation && browsersWithUserProfile.length) {
129
+ const browsers = browsersWithUserProfile.map(b => b.alias).join(', ');
130
+ throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.setUserProfileInNativeAutomation, browsers);
131
+ }
132
+ }
118
133
  async _filterTests(tests, predicate) {
119
134
  return (0, async_filter_1.default)(tests, test => {
120
135
  const testFixture = test.fixture;
@@ -227,6 +242,18 @@ class Bootstrapper {
227
242
  result[k] = this._wrapBootstrappingPromise(arg[k]);
228
243
  return result;
229
244
  }
245
+ async _assertNativeAutomationForLegacyTests(resources) {
246
+ var _a;
247
+ const isNativeAutomation = !this.configuration.getOption(option_names_1.default.disableNativeAutomation);
248
+ if (!isNativeAutomation)
249
+ return;
250
+ const hasLegacyTests = resources.tests.some(test => test.isLegacy);
251
+ if (!hasLegacyTests)
252
+ return;
253
+ await resources.browserSet.dispose();
254
+ await ((_a = resources.testedApp) === null || _a === void 0 ? void 0 : _a.kill());
255
+ throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.cannotRunLegacyTestsInNativeAutomationMode);
256
+ }
230
257
  async _bootstrapParallel(browserInfo, id) {
231
258
  const bootstrappingPromises = {
232
259
  browserSet: this._getBrowserConnections(browserInfo),
@@ -242,11 +269,13 @@ class Bootstrapper {
242
269
  const [browserSetResults, testResults, appResults] = bootstrappingResults;
243
270
  if (isPromiseError(browserSetResults) || isPromiseError(testResults) || isPromiseError(appResults))
244
271
  throw await this._getBootstrappingError(...bootstrappingResults);
245
- return {
272
+ const resources = {
246
273
  browserSet: browserSetResults.result,
247
274
  tests: testResults.result,
248
275
  testedApp: appResults.result,
249
276
  };
277
+ await this._assertNativeAutomationForLegacyTests(resources);
278
+ return resources;
250
279
  }
251
280
  // API
252
281
  async createRunnableConfiguration() {
@@ -265,4 +294,4 @@ class Bootstrapper {
265
294
  }
266
295
  exports.default = Bootstrapper;
267
296
  module.exports = exports.default;
268
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bm5lci9ib290c3RyYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxtQ0FNZ0I7QUFFaEIsa0RBQTBCO0FBQzFCLGtFQUF1QztBQUN2QywyREFBbUM7QUFDbkMsdUVBQXVFO0FBQ3ZFLGdFQUF1QztBQUN2QywrQ0FBaUQ7QUFDakQsMkNBQWlEO0FBQ2pELDhEQUFxQztBQUNyQywrRUFBcUQ7QUFDckQseUVBQThEO0FBQzlELDRDQUE4RDtBQVE5RCwrRUFBc0Q7QUFDdEQsdUZBQWdFO0FBQ2hFLHlGQUErRDtBQUMvRCx5RUFBZ0Q7QUFHaEQsbUZBQXlEO0FBQ3pELHVFQUFtRTtBQUNuRSw2REFBdUQ7QUFDdkQsbUZBQXFFO0FBQ3JFLGlGQUF5RDtBQUV6RCxrRkFBa0Y7QUFFbEYsTUFBTSxXQUFXLEdBQUcsdUJBQXVCLENBQUM7QUEyQjVDLFNBQVMsY0FBYyxDQUE4QixLQUEwQjtJQUMzRSxPQUFRLEtBQXlCLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDO0FBQ3ZELENBQUM7QUFhRCxNQUFxQixZQUFZO0lBc0I3QixZQUFvQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQW9CO1FBQ3pGLElBQUksQ0FBQyx3QkFBd0IsR0FBRyx3QkFBd0IsQ0FBQztRQUN6RCxJQUFJLENBQUMsV0FBVyxHQUFnQixDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBb0IsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxRQUFRLEdBQW1CLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsU0FBUyxHQUFrQixFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLE1BQU0sR0FBcUIsS0FBSyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLFVBQVUsR0FBaUIsS0FBSyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLFlBQVksR0FBZSxL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Q0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0o7QUF0VkQsK0JBc1ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBjaHVuayxcbiAgICB0aW1lcyxcbiAgICB1bmlvbixcbiAgICBjYXN0QXJyYXksXG4gICAgZmxhdHRlbkRlZXAgYXMgZmxhdHRlbixcbn0gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCBwcmV0dHlUaW1lIGZyb20gJ3ByZXR0eS1ocnRpbWUnO1xuaW1wb3J0IENvbXBpbGVyIGZyb20gJy4uL2NvbXBpbGVyJztcbmltcG9ydCBCcm93c2VyQ29ubmVjdGlvbiwgeyBCcm93c2VySW5mbyB9IGZyb20gJy4uL2Jyb3dzZXIvY29ubmVjdGlvbic7XG5pbXBvcnQgQnJvd3NlclNldCBmcm9tICcuL2Jyb3dzZXItc2V0JztcbmltcG9ydCB7IEdlbmVyYWxFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9ydW50aW1lJztcbmltcG9ydCB7IFJVTlRJTUVfRVJST1JTIH0gZnJvbSAnLi4vZXJyb3JzL3R5cGVzJztcbmltcG9ydCBUZXN0ZWRBcHAgZnJvbSAnLi90ZXN0ZWQtYXBwJztcbmltcG9ydCBwYXJzZUZpbGVMaXN0IGZyb20gJy4uL3V0aWxzL3BhcnNlLWZpbGUtbGlzdCc7XG5pbXBvcnQgbG9hZENsaWVudFNjcmlwdHMgZnJvbSAnLi4vY3VzdG9tLWNsaWVudC1zY3JpcHRzL2xvYWQnO1xuaW1wb3J0IHsgZ2V0Q29uY2F0ZW5hdGVkVmFsdWVzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvc3RyaW5nJztcbmltcG9ydCB7IFJlcG9ydGVyU291cmNlIH0gZnJvbSAnLi4vcmVwb3J0ZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgQ2xpZW50U2NyaXB0IGZyb20gJy4uL2N1c3RvbS1jbGllbnQtc2NyaXB0cy9jbGllbnQtc2NyaXB0JztcbmltcG9ydCBDbGllbnRTY3JpcHRJbml0IGZyb20gJy4uL2N1c3RvbS1jbGllbnQtc2NyaXB0cy9jbGllbnQtc2NyaXB0LWluaXQnO1xuaW1wb3J0IEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheSBmcm9tICcuLi9icm93c2VyL2Nvbm5lY3Rpb24vZ2F0ZXdheSc7XG5pbXBvcnQgeyBDb21waWxlckFyZ3VtZW50cyB9IGZyb20gJy4uL2NvbXBpbGVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IFRlc3QgZnJvbSAnLi4vYXBpL3N0cnVjdHVyZS90ZXN0JztcbmltcG9ydCB7IEJvb3RzdHJhcHBlckluaXQsIEJyb3dzZXJTZXRPcHRpb25zIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCBXYXJuaW5nTG9nIGZyb20gJy4uL25vdGlmaWNhdGlvbnMvd2FybmluZy1sb2cnO1xuaW1wb3J0IFdBUk5JTkdfTUVTU0FHRVMgZnJvbSAnLi4vbm90aWZpY2F0aW9ucy93YXJuaW5nLW1lc3NhZ2UnO1xuaW1wb3J0IGd1YXJkVGltZUV4ZWN1dGlvbiBmcm9tICcuLi91dGlscy9ndWFyZC10aW1lLWV4ZWN1dGlvbic7XG5pbXBvcnQgYXN5bmNGaWx0ZXIgZnJvbSAnLi4vdXRpbHMvYXN5bmMtZmlsdGVyJztcbmltcG9ydCBGaXh0dXJlIGZyb20gJy4uL2FwaS9zdHJ1Y3R1cmUvZml4dHVyZSc7XG5pbXBvcnQgTWVzc2FnZUJ1cyBmcm9tICcuLi91dGlscy9tZXNzYWdlLWJ1cyc7XG5pbXBvcnQgd3JhcFRlc3RGdW5jdGlvbiBmcm9tICcuLi9hcGkvd3JhcC10ZXN0LWZ1bmN0aW9uJztcbmltcG9ydCB7IGFzc2VydFR5cGUsIGlzIH0gZnJvbSAnLi4vZXJyb3JzL3J1bnRpbWUvdHlwZS1hc3NlcnRpb25zJztcbmltcG9ydCB7IGdlbmVyYXRlVW5pcXVlSWQgfSBmcm9tICd0ZXN0Y2FmZS1oYW1tZXJoZWFkJztcbmltcG9ydCBhc3NlcnRSZXF1ZXN0SG9va1R5cGUgZnJvbSAnLi4vYXBpL3JlcXVlc3QtaG9va3MvYXNzZXJ0LXR5cGUnO1xuaW1wb3J0IE9QVElPTl9OQU1FUyBmcm9tICcuLi9jb25maWd1cmF0aW9uL29wdGlvbi1uYW1lcyc7XG5pbXBvcnQgVGVzdENhZmVDb25maWd1cmF0aW9uIGZyb20gJy4uL2NvbmZpZ3VyYXRpb24vdGVzdGNhZmUtY29uZmlndXJhdGlvbic7XG5pbXBvcnQgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5U3RhdHVzIGZyb20gJy4uL2Jyb3dzZXIvY29ubmVjdGlvbi9nYXRld2F5L3N0YXR1cyc7XG5cbmNvbnN0IERFQlVHX1NDT1BFID0gJ3Rlc3RjYWZlOmJvb3RzdHJhcHBlcic7XG5cbnR5cGUgVGVzdFNvdXJjZSA9IHVua25vd247XG5cbnR5cGUgQnJvd3NlckluZm9Tb3VyY2UgPSBCcm93c2VySW5mbyB8IEJyb3dzZXJDb25uZWN0aW9uO1xuXG5pbnRlcmZhY2UgUHJvbWlzZVN1Y2Nlc3M8VD4ge1xuICAgIHJlc3VsdDogVDtcbn1cblxuaW50ZXJmYWNlIFByb21pc2VFcnJvcjxFIGV4dGVuZHMgRXJyb3IgPSBFcnJvcj4ge1xuICAgIGVycm9yOiBFO1xufVxuXG5pbnRlcmZhY2UgQmFzaWNSdW50aW1lUmVzb3VyY2VzIHtcbiAgICBicm93c2VyU2V0OiBCcm93c2VyU2V0O1xuICAgIHRlc3RzOiBUZXN0W107XG4gICAgdGVzdGVkQXBwPzogVGVzdGVkQXBwO1xufVxuXG5pbnRlcmZhY2UgUnVubmFibGVDb25maWd1cmF0aW9uIGV4dGVuZHMgQmFzaWNSdW50aW1lUmVzb3VyY2VzIHtcbiAgICBjb21tb25DbGllbnRTY3JpcHRzOiBDbGllbnRTY3JpcHRbXTtcbiAgICBpZDogc3RyaW5nO1xufVxuXG50eXBlIFByb21pc2VSZXN1bHQ8VCwgRSBleHRlbmRzIEVycm9yID0gRXJyb3I+ID0gUHJvbWlzZVN1Y2Nlc3M8VD4gfCBQcm9taXNlRXJyb3I8RT47XG5cbmZ1bmN0aW9uIGlzUHJvbWlzZUVycm9yPFQsIEUgZXh0ZW5kcyBFcnJvciA9IEVycm9yPiAodmFsdWU6IFByb21pc2VSZXN1bHQ8VCwgRT4pOiB2YWx1ZSBpcyBQcm9taXNlRXJyb3I8RT4ge1xuICAgIHJldHVybiAodmFsdWUgYXMgUHJvbWlzZUVycm9yPEU+KS5lcnJvciAhPT0gdm9pZCAwO1xufVxuXG5pbnRlcmZhY2UgU2VwYXJhdGVkQnJvd3NlckluZm8ge1xuICAgIHJlbW90ZXM6IEJyb3dzZXJDb25uZWN0aW9uW107XG4gICAgYXV0b21hdGVkOiBCcm93c2VySW5mb1tdO1xufVxuXG50eXBlIFByb21pc2VDb2xsZWN0aW9uPFQ+ID0ge1xuICAgIFtLIGluIGtleW9mIFRdOiBQcm9taXNlPFRbS10+XG59XG5cbnR5cGUgUmVzdWx0Q29sbGVjdGlvbjxUPiA9IHsgW1AgaW4ga2V5b2YgVF06IFByb21pc2VSZXN1bHQ8VFtQXT4gfTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQm9vdHN0cmFwcGVyIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheTogQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5O1xuICAgIHB1YmxpYyBjb25jdXJyZW5jeTogbnVtYmVyO1xuICAgIHB1YmxpYyBzb3VyY2VzOiBUZXN0U291cmNlW107XG4gICAgcHVibGljIGJyb3dzZXJzOiBCcm93c2VySW5mb1NvdXJjZVtdO1xuICAgIHB1YmxpYyByZXBvcnRlcnM6IFJlcG9ydGVyU291cmNlW107XG4gICAgcHVibGljIGZpbHRlcj86IEZpbHRlckZ1bmN0aW9uO1xuICAgIHB1YmxpYyBhcHBDb21tYW5kPzogc3RyaW5nO1xuICAgIHB1YmxpYyBhcHBJbml0RGVsYXk/OiBudW1iZXI7XG4gICAgcHVibGljIHRzQ29uZmlnUGF0aD86IHN0cmluZztcbiAgICBwdWJsaWMgY2xpZW50U2NyaXB0czogQ2xpZW50U2NyaXB0SW5pdFtdO1xuICAgIHB1YmxpYyBkaXNhYmxlTXVsdGlwbGVXaW5kb3dzOiBib29sZWFuO1xuICAgIHB1YmxpYyBjb21waWxlck9wdGlvbnM/OiBDb21waWxlck9wdGlvbnM7XG4gICAgcHVibGljIGJyb3dzZXJJbml0VGltZW91dD86IG51bWJlcjtcbiAgICBwdWJsaWMgaG9va3M/OiBHbG9iYWxIb29rcztcbiAgICBwdWJsaWMgY29uZmlndXJhdGlvbjogVGVzdENhZmVDb25maWd1cmF0aW9uO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVidWdMb2dnZXI6IGRlYnVnLkRlYnVnZ2VyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgd2FybmluZ0xvZzogV2FybmluZ0xvZztcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VCdXM6IE1lc3NhZ2VCdXM7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IFRFU1RTX0NPTVBJTEFUSU9OX1VQUEVSQk9VTkQ6IG51bWJlcjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoeyBicm93c2VyQ29ubmVjdGlvbkdhdGV3YXksIG1lc3NhZ2VCdXMsIGNvbmZpZ3VyYXRpb24gfTogQm9vdHN0cmFwcGVySW5pdCkge1xuICAgICAgICB0aGlzLmJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheSA9IGJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheTtcbiAgICAgICAgdGhpcy5jb25jdXJyZW5jeSAgICAgICAgICAgICAgPSAxO1xuICAgICAgICB0aGlzLnNvdXJjZXMgICAgICAgICAgICAgICAgICA9IFtdO1xuICAgICAgICB0aGlzLmJyb3dzZXJzICAgICAgICAgICAgICAgICA9IFtdO1xuICAgICAgICB0aGlzLnJlcG9ydGVycyAgICAgICAgICAgICAgICA9IFtdO1xuICAgICAgICB0aGlzLmZpbHRlciAgICAgICAgICAgICAgICAgICA9IHZvaWQgMDtcbiAgICAgICAgdGhpcy5hcHBDb21tYW5kICAgICAgICAgICAgICAgPSB2b2lkIDA7XG4gICAgICAgIHRoaXMuYXBwSW5pdERlbGF5ICAgICAgICAgICAgID0gdm9pZCAwO1xuICAgICAgICB0aGlzLnRzQ29uZmlnUGF0aCAgICAgICAgICAgICA9IHZvaWQgMDtcbiAgICAgICAgdGhpcy5jbGllbnRTY3JpcHRzICAgICAgICAgICAgPSBbXTtcbiAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlwbGVXaW5kb3dzICAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb21waWxlck9wdGlvbnMgICAgICAgICAgPSB2b2lkIDA7XG4gICAgICAgIHRoaXMuZGVidWdMb2dnZXIgICAgICAgICAgICAgID0gZGVidWcoREVCVUdfU0NPUEUpO1xuICAgICAgICB0aGlzLndhcm5pbmdMb2cgICAgICAgICAgICAgICA9IG5ldyBXYXJuaW5nTG9nKG51bGwsIFdhcm5pbmdMb2cuY3JlYXRlQWRkV2FybmluZ0NhbGxiYWNrKG1lc3NhZ2VCdXMpKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlQnVzICAgICAgICAgICAgICAgPSBtZXNzYWdlQnVzO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gICAgICAgICAgICA9IGNvbmZpZ3VyYXRpb247XG5cbiAgICAgICAgdGhpcy5URVNUU19DT01QSUxBVElPTl9VUFBFUkJPVU5EID0gNjA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2dldEJyb3dzZXJOYW1lIChicm93c2VyOiBCcm93c2VySW5mb1NvdXJjZSk6IHN0cmluZyB7XG4gICAgICAgIGlmIChicm93c2VyIGluc3RhbmNlb2YgQnJvd3NlckNvbm5lY3Rpb24pXG4gICAgICAgICAgICByZXR1cm4gYnJvd3Nlci5icm93c2VySW5mby5icm93c2VyTmFtZTtcblxuICAgICAgICByZXR1cm4gYnJvd3Nlci5icm93c2VyTmFtZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfc3BsaXRCcm93c2VySW5mbyAoYnJvd3NlckluZm86IEJyb3dzZXJJbmZvU291cmNlW10pOiBTZXBhcmF0ZWRCcm93c2VySW5mbyB7XG4gICAgICAgIGNvbnN0IHJlbW90ZXM6IEJyb3dzZXJDb25uZWN0aW9uW10gPSBbXTtcbiAgICAgICAgY29uc3QgYXV0b21hdGVkOiBCcm93c2VySW5mb1tdICAgICA9IFtdO1xuXG4gICAgICAgIGJyb3dzZXJJbmZvLmZvckVhY2goYnJvd3NlciA9PiB7XG4gICAgICAgICAgICBpZiAoYnJvd3NlciBpbnN0YW5jZW9mIEJyb3dzZXJDb25uZWN0aW9uKVxuICAgICAgICAgICAgICAgIHJlbW90ZXMucHVzaChicm93c2VyKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBhdXRvbWF0ZWQucHVzaChicm93c2VyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHsgcmVtb3RlcywgYXV0b21hdGVkIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY3JlYXRlQXV0b21hdGVkQ29ubmVjdGlvbnMgKGJyb3dzZXJJbmZvOiBCcm93c2VySW5mb1tdKTogQnJvd3NlckNvbm5lY3Rpb25bXVtdIHtcbiAgICAgICAgaWYgKCFicm93c2VySW5mbylcbiAgICAgICAgICAgIHJldHVybiBbXTtcblxuICAgICAgICByZXR1cm4gYnJvd3NlckluZm8ubWFwKGJyb3dzZXIgPT4gdGltZXModGhpcy5jb25jdXJyZW5jeSwgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTXVsdGlwbGVXaW5kb3dzOiB0aGlzLmRpc2FibGVNdWx0aXBsZVdpbmRvd3MsXG4gICAgICAgICAgICAgICAgZGV2ZWxvcG1lbnRNb2RlOiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuZGV2ZWxvcG1lbnRNb2RlKSBhcyBib29sZWFuLFxuICAgICAgICAgICAgICAgIG5hdGl2ZUF1dG9tYXRpb246ICAgICAgICF0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5kaXNhYmxlTmF0aXZlQXV0b21hdGlvbiksXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gbmV3IEJyb3dzZXJDb25uZWN0aW9uKHRoaXMuYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LCB7IC4uLmJyb3dzZXIgfSwgZmFsc2UsIG9wdGlvbnMsIHRoaXMubWVzc2FnZUJ1cyk7XG5cbiAgICAgICAgICAgIGNvbm5lY3Rpb24uaW5pdGlhbGl6ZSgpO1xuXG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldEJyb3dzZXJTZXRPcHRpb25zICgpOiBCcm93c2VyU2V0T3B0aW9ucyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb25jdXJyZW5jeTogICAgICAgIHRoaXMuY29uY3VycmVuY3ksXG4gICAgICAgICAgICBicm93c2VySW5pdFRpbWVvdXQ6IHRoaXMuYnJvd3NlckluaXRUaW1lb3V0LFxuICAgICAgICAgICAgd2FybmluZ0xvZzogICAgICAgICB0aGlzLndhcm5pbmdMb2csXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfc2V0dXBQcm94eSAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5zdGF0dXMgPT09IEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheVN0YXR1cy5pbml0aWFsaXplZClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uY2FsY3VsYXRlSG9zdG5hbWUoeyBuYXRpdmVBdXRvbWF0aW9uOiAhdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuZGlzYWJsZU5hdGl2ZUF1dG9tYXRpb24pIH0pO1xuXG4gICAgICAgIHRoaXMuYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LmluaXRpYWxpemUodGhpcy5jb25maWd1cmF0aW9uLnN0YXJ0T3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaGFzTm90U3VwcG9ydGVkQnJvd3NlckluTmF0aXZlQXV0b21hdGlvbiAoYnJvd3NlckluZm9zOiBCcm93c2VySW5mb1tdKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBicm93c2VySW5mb3Muc29tZShicm93c2VySW5mbyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gIWJyb3dzZXJJbmZvLnByb3ZpZGVyLnN1cHBvcnROYXRpdmVBdXRvbWF0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2Rpc2FibGVOYXRpdmVBdXRvbWF0aW9uSWZOZWNlc3NhcnkgKHJlbW90ZXM6IEJyb3dzZXJDb25uZWN0aW9uW10sIGF1dG9tYXRlZDogQnJvd3NlckluZm9bXSk6IHZvaWQge1xuICAgICAgICBpZiAocmVtb3Rlcy5sZW5ndGggfHwgdGhpcy5faGFzTm90U3VwcG9ydGVkQnJvd3NlckluTmF0aXZlQXV0b21hdGlvbihhdXRvbWF0ZWQpKVxuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1lcmdlT3B0aW9ucyh7IGRpc2FibGVOYXRpdmVBdXRvbWF0aW9uOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2dldEJyb3dzZXJDb25uZWN0aW9ucyAoYnJvd3NlckluZm86IEJyb3dzZXJJbmZvU291cmNlW10pOiBQcm9taXNlPEJyb3dzZXJTZXQ+IHtcbiAgICAgICAgY29uc3QgeyBhdXRvbWF0ZWQsIHJlbW90ZXMgfSA9IEJvb3RzdHJhcHBlci5fc3BsaXRCcm93c2VySW5mbyhicm93c2VySW5mbyk7XG5cbiAgICAgICAgaWYgKHJlbW90ZXMgJiYgcmVtb3Rlcy5sZW5ndGggJSB0aGlzLmNvbmN1cnJlbmN5KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5jYW5ub3REaXZpZGVSZW1vdGVzQ291bnRCeUNvbmN1cnJlbmN5KTtcblxuICAgICAgICB0aGlzLl9kaXNhYmxlTmF0aXZlQXV0b21hdGlvbklmTmVjZXNzYXJ5KHJlbW90ZXMsIGF1dG9tYXRlZCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5fc2V0dXBQcm94eSgpO1xuXG4gICAgICAgIGxldCBicm93c2VyQ29ubmVjdGlvbnMgPSB0aGlzLl9jcmVhdGVBdXRvbWF0ZWRDb25uZWN0aW9ucyhhdXRvbWF0ZWQpO1xuXG4gICAgICAgIHJlbW90ZXMuZm9yRWFjaChyZW1vdGVDb25uZWN0aW9uID0+IHtcbiAgICAgICAgICAgIHJlbW90ZUNvbm5lY3Rpb24ubWVzc2FnZUJ1cyA9IHRoaXMubWVzc2FnZUJ1cztcblxuICAgICAgICAgICAgcmVtb3RlQ29ubmVjdGlvbi5pbml0TWVzc2FnZUJ1cygpO1xuICAgICAgICB9KTtcblxuICAgICAgICBicm93c2VyQ29ubmVjdGlvbnMgPSBicm93c2VyQ29ubmVjdGlvbnMuY29uY2F0KGNodW5rKHJlbW90ZXMsIHRoaXMuY29uY3VycmVuY3kpKTtcblxuICAgICAgICByZXR1cm4gQnJvd3NlclNldC5mcm9tKGJyb3dzZXJDb25uZWN0aW9ucywgdGhpcy5fZ2V0QnJvd3NlclNldE9wdGlvbnMoKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZmlsdGVyVGVzdHMgKHRlc3RzOiBUZXN0W10sIHByZWRpY2F0ZTogRmlsdGVyRnVuY3Rpb24pOiBQcm9taXNlPFRlc3RbXT4ge1xuICAgICAgICByZXR1cm4gYXN5bmNGaWx0ZXIodGVzdHMsIHRlc3QgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGVzdEZpeHR1cmUgPSB0ZXN0LmZpeHR1cmUgYXMgRml4dHVyZTtcblxuICAgICAgICAgICAgcmV0dXJuIHByZWRpY2F0ZShcbiAgICAgICAgICAgICAgICB0ZXN0Lm5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgIHRlc3RGaXh0dXJlLm5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgIHRlc3RGaXh0dXJlLnBhdGgsXG4gICAgICAgICAgICAgICAgdGVzdC5tZXRhLFxuICAgICAgICAgICAgICAgIHRlc3RGaXh0dXJlLm1ldGEpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9jb21waWxlVGVzdHMgKHsgc291cmNlTGlzdCwgY29tcGlsZXJPcHRpb25zIH06IENvbXBpbGVyQXJndW1lbnRzKTogUHJvbWlzZTxUZXN0W10+IHtcbiAgICAgICAgY29uc3QgYmFzZVVybCAgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5iYXNlVXJsKSBhcyBzdHJpbmc7XG4gICAgICAgIGNvbnN0IGVzbSAgICAgID0gdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuZXNtKTtcbiAgICAgICAgY29uc3QgY29tcGlsZXIgPSBuZXcgQ29tcGlsZXIoc291cmNlTGlzdCwgY29tcGlsZXJPcHRpb25zLCB7IGJhc2VVcmwsIGVzbSB9KTtcblxuICAgICAgICByZXR1cm4gY29tcGlsZXIuZ2V0VGVzdHMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9hc3NlcnRHbG9iYWxIb29rcyAoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5ob29rcylcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBpZiAodGhpcy5ob29rcy5maXh0dXJlPy5iZWZvcmUpXG4gICAgICAgICAgICBhc3NlcnRUeXBlKGlzLmZ1bmN0aW9uLCAnZ2xvYmFsQmVmb3JlJywgJ1RoZSBmaXh0dXJlLmdsb2JhbEJlZm9yZSBob29rJywgdGhpcy5ob29rcy5maXh0dXJlLmJlZm9yZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuaG9va3MuZml4dHVyZT8uYWZ0ZXIpXG4gICAgICAgICAgICBhc3NlcnRUeXBlKGlzLmZ1bmN0aW9uLCAnZ2xvYmFsQWZ0ZXInLCAnVGhlIGZpeHR1cmUuZ2xvYmFsQWZ0ZXIgaG9vaycsIHRoaXMuaG9va3MuZml4dHVyZS5hZnRlcik7XG5cbiAgICAgICAgaWYgKHRoaXMuaG9va3MudGVzdD8uYmVmb3JlKVxuICAgICAgICAgICAgYXNzZXJ0VHlwZShpcy5mdW5jdGlvbiwgJ2dsb2JhbEJlZm9yZScsICdUaGUgdGVzdC5nbG9iYWxCZWZvcmUgaG9vaycsIHRoaXMuaG9va3MudGVzdC5iZWZvcmUpO1xuXG4gICAgICAgIGlmICh0aGlzLmhvb2tzLnRlc3Q/LmFmdGVyKVxuICAgICAgICAgICAgYXNzZXJ0VHlwZShpcy5mdW5jdGlvbiwgJ2dsb2JhbEFmdGVyJywgJ1RoZSB0ZXN0Lmdsb2JhbEFmdGVyIGhvb2snLCB0aGlzLmhvb2tzLnRlc3QuYWZ0ZXIpO1xuXG4gICAgICAgIGlmICh0aGlzLmhvb2tzLnJlcXVlc3QpXG4gICAgICAgICAgICBhc3NlcnRSZXF1ZXN0SG9va1R5cGUoZmxhdHRlbihjYXN0QXJyYXkodGhpcy5ob29rcy5yZXF1ZXN0KSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldEdsb2JhbEhvb2tzVG9UZXN0cyAodGVzdHM6IFRlc3RbXSk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaG9va3MpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy5fYXNzZXJ0R2xvYmFsSG9va3MoKTtcblxuICAgICAgICBjb25zdCBmaXh0dXJlQmVmb3JlID0gdGhpcy5ob29rcy5maXh0dXJlPy5iZWZvcmUgfHwgbnVsbDtcbiAgICAgICAgY29uc3QgZml4dHVyZUFmdGVyICA9IHRoaXMuaG9va3MuZml4dHVyZT8uYWZ0ZXIgfHwgbnVsbDtcbiAgICAgICAgY29uc3QgdGVzdEJlZm9yZSAgICA9IHRoaXMuaG9va3MudGVzdD8uYmVmb3JlID8gd3JhcFRlc3RGdW5jdGlvbih0aGlzLmhvb2tzLnRlc3QuYmVmb3JlKSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHRlc3RBZnRlciAgICAgPSB0aGlzLmhvb2tzLnRlc3Q/LmFmdGVyID8gd3JhcFRlc3RGdW5jdGlvbih0aGlzLmhvb2tzLnRlc3QuYWZ0ZXIpIDogbnVsbDtcbiAgICAgICAgY29uc3QgcmVxdWVzdCAgICAgICA9IHRoaXMuaG9va3MucmVxdWVzdCB8fCBbXTtcblxuICAgICAgICB0ZXN0cy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0uZml4dHVyZSkge1xuICAgICAgICAgICAgICAgIGl0ZW0uZml4dHVyZS5nbG9iYWxCZWZvcmVGbiA9IGl0ZW0uZml4dHVyZS5nbG9iYWxCZWZvcmVGbiB8fCBmaXh0dXJlQmVmb3JlO1xuICAgICAgICAgICAgICAgIGl0ZW0uZml4dHVyZS5nbG9iYWxBZnRlckZuICA9IGl0ZW0uZml4dHVyZS5nbG9iYWxBZnRlckZuIHx8IGZpeHR1cmVBZnRlcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaXRlbS5nbG9iYWxCZWZvcmVGbiA9IHRlc3RCZWZvcmU7XG4gICAgICAgICAgICBpdGVtLmdsb2JhbEFmdGVyRm4gID0gdGVzdEFmdGVyO1xuICAgICAgICAgICAgaXRlbS5yZXF1ZXN0SG9va3MgICA9IHVuaW9uKGZsYXR0ZW4oY2FzdEFycmF5KHJlcXVlc3QpKSwgaXRlbS5yZXF1ZXN0SG9va3MpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9nZXRUZXN0cyAoaWQ6IHN0cmluZyk6IFByb21pc2U8VGVzdFtdPiB7XG4gICAgICAgIGNvbnN0IGN3ZCAgICAgICAgPSBwcm9jZXNzLmN3ZCgpO1xuICAgICAgICBjb25zdCBzb3VyY2VMaXN0ID0gYXdhaXQgcGFyc2VGaWxlTGlzdCh0aGlzLnNvdXJjZXMsIGN3ZCk7XG5cbiAgICAgICAgaWYgKCFzb3VyY2VMaXN0Lmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMudGVzdEZpbGVzTm90Rm91bmQsIGN3ZCwgZ2V0Q29uY2F0ZW5hdGVkVmFsdWVzU3RyaW5nKHRoaXMuc291cmNlcywgJ1xcbicsICcnKSk7XG5cbiAgICAgICAgbGV0IHRlc3RzID0gYXdhaXQgZ3VhcmRUaW1lRXhlY3V0aW9uKFxuICAgICAgICAgICAgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5fY29tcGlsZVRlc3RzKHsgc291cmNlTGlzdCwgY29tcGlsZXJPcHRpb25zOiB0aGlzLmNvbXBpbGVyT3B0aW9ucywgcnVubmFibGVDb25maWd1cmF0aW9uSWQ6IGlkIH0pLFxuICAgICAgICAgICAgZWxhcHNlZFRpbWUgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVidWdMb2dnZXIoYHRlc3RzIGNvbXBpbGF0aW9uIHRvb2sgJHtwcmV0dHlUaW1lKGVsYXBzZWRUaW1lKX1gKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IFsgZWxhcHNlZFNlY29uZHMgXSA9IGVsYXBzZWRUaW1lO1xuXG4gICAgICAgICAgICAgICAgaWYgKGVsYXBzZWRTZWNvbmRzID4gdGhpcy5URVNUU19DT01QSUxBVElPTl9VUFBFUkJPVU5EKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLndhcm5pbmdMb2cuYWRkV2FybmluZyhXQVJOSU5HX01FU1NBR0VTLnRlc3RzQ29tcGlsYXRpb25UYWtlc1Rvb0xvbmcsIHByZXR0eVRpbWUoZWxhcHNlZFRpbWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCB0ZXN0c1dpdGhPbmx5RmxhZyA9IHRlc3RzLmZpbHRlcih0ZXN0ID0+IHRlc3Qub25seSk7XG5cbiAgICAgICAgaWYgKHRlc3RzV2l0aE9ubHlGbGFnLmxlbmd0aClcbiAgICAgICAgICAgIHRlc3RzID0gdGVzdHNXaXRoT25seUZsYWc7XG5cbiAgICAgICAgaWYgKCF0ZXN0cy5sZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLm5vVGVzdHNUb1J1bik7XG5cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyKVxuICAgICAgICAgICAgdGVzdHMgPSBhd2FpdCB0aGlzLl9maWx0ZXJUZXN0cyh0ZXN0cywgdGhpcy5maWx0ZXIpO1xuXG4gICAgICAgIGlmICghdGVzdHMubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5ub1Rlc3RzVG9SdW5EdWVGaWx0ZXJpbmcpO1xuXG4gICAgICAgIHRoaXMuX3NldEdsb2JhbEhvb2tzVG9UZXN0cyh0ZXN0cyk7XG5cbiAgICAgICAgcmV0dXJuIHRlc3RzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3N0YXJ0VGVzdGVkQXBwICgpOiBQcm9taXNlPFRlc3RlZEFwcHx1bmRlZmluZWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLmFwcENvbW1hbmQpXG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuXG4gICAgICAgIGNvbnN0IHRlc3RlZEFwcCA9IG5ldyBUZXN0ZWRBcHAoKTtcblxuICAgICAgICBhd2FpdCB0ZXN0ZWRBcHAuc3RhcnQodGhpcy5hcHBDb21tYW5kLCB0aGlzLmFwcEluaXREZWxheSBhcyBudW1iZXIpO1xuXG4gICAgICAgIHJldHVybiB0ZXN0ZWRBcHA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfY2FuVXNlUGFyYWxsZWxCb290c3RyYXBwaW5nIChicm93c2VySW5mbzogQnJvd3NlckluZm9Tb3VyY2VbXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBpc0xvY2FsUHJvbWlzZXMgPSBicm93c2VySW5mby5tYXAoYnJvd3NlciA9PiBicm93c2VyLnByb3ZpZGVyLmlzTG9jYWxCcm93c2VyKHZvaWQgMCwgQm9vdHN0cmFwcGVyLl9nZXRCcm93c2VyTmFtZShicm93c2VyKSkpO1xuICAgICAgICBjb25zdCBpc0xvY2FsQnJvd3NlcnMgPSBhd2FpdCBQcm9taXNlLmFsbChpc0xvY2FsUHJvbWlzZXMpO1xuXG4gICAgICAgIHJldHVybiBpc0xvY2FsQnJvd3NlcnMuZXZlcnkocmVzdWx0ID0+IHJlc3VsdCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfYm9vdHN0cmFwU2VxdWVuY2UgKGJyb3dzZXJJbmZvOiBCcm93c2VySW5mb1NvdXJjZVtdLCBpZDogc3RyaW5nKTogUHJvbWlzZTxCYXNpY1J1bnRpbWVSZXNvdXJjZXM+IHtcbiAgICAgICAgY29uc3QgdGVzdHMgICAgICA9IGF3YWl0IHRoaXMuX2dldFRlc3RzKGlkKTtcbiAgICAgICAgY29uc3QgdGVzdGVkQXBwICA9IGF3YWl0IHRoaXMuX3N0YXJ0VGVzdGVkQXBwKCk7XG4gICAgICAgIGNvbnN0IGJyb3dzZXJTZXQgPSBhd2FpdCB0aGlzLl9nZXRCcm93c2VyQ29ubmVjdGlvbnMoYnJvd3NlckluZm8pO1xuXG4gICAgICAgIHJldHVybiB7IHRlc3RzLCB0ZXN0ZWRBcHAsIGJyb3dzZXJTZXQgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF93cmFwQm9vdHN0cmFwcGluZ1Byb21pc2U8VD4gKHByb21pc2U6IFByb21pc2U8VD4pOiBQcm9taXNlPFByb21pc2VSZXN1bHQ8VD4+IHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgICAgICAgIC50aGVuKHJlc3VsdCA9PiAoeyBlcnJvcjogdm9pZCAwLCByZXN1bHQgfSkpXG4gICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4gKHsgcmVzdWx0OiB2b2lkIDAsIGVycm9yIH0pKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9nZXRCb290c3RyYXBwaW5nRXJyb3IgKGJyb3dzZXJTZXRTdGF0dXM6IFByb21pc2VSZXN1bHQ8QnJvd3NlclNldD4sIHRlc3RzU3RhdHVzOiBQcm9taXNlUmVzdWx0PFRlc3RbXT4sIHRlc3RlZEFwcFN0YXR1czogUHJvbWlzZVJlc3VsdDxUZXN0ZWRBcHB8dW5kZWZpbmVkPik6IFByb21pc2U8RXJyb3I+IHtcbiAgICAgICAgaWYgKCFpc1Byb21pc2VFcnJvcihicm93c2VyU2V0U3RhdHVzKSlcbiAgICAgICAgICAgIGF3YWl0IGJyb3dzZXJTZXRTdGF0dXMucmVzdWx0LmRpc3Bvc2UoKTtcblxuICAgICAgICBpZiAoIWlzUHJvbWlzZUVycm9yKGJyb3dzZXJTZXRTdGF0dXMpICYmICFpc1Byb21pc2VFcnJvcih0ZXN0ZWRBcHBTdGF0dXMpICYmIHRlc3RlZEFwcFN0YXR1cy5yZXN1bHQpXG4gICAgICAgICAgICBhd2FpdCB0ZXN0ZWRBcHBTdGF0dXMucmVzdWx0LmtpbGwoKTtcblxuICAgICAgICBpZiAoaXNQcm9taXNlRXJyb3IodGVzdHNTdGF0dXMpKVxuICAgICAgICAgICAgcmV0dXJuIHRlc3RzU3RhdHVzLmVycm9yO1xuXG4gICAgICAgIGlmIChpc1Byb21pc2VFcnJvcih0ZXN0ZWRBcHBTdGF0dXMpKVxuICAgICAgICAgICAgcmV0dXJuIHRlc3RlZEFwcFN0YXR1cy5lcnJvcjtcblxuICAgICAgICBpZiAoaXNQcm9taXNlRXJyb3IoYnJvd3NlclNldFN0YXR1cykpXG4gICAgICAgICAgICByZXR1cm4gYnJvd3NlclNldFN0YXR1cy5lcnJvcjtcblxuICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdVbmV4cGVjdGVkIGNhbGwnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRCb290c3RyYXBwaW5nUHJvbWlzZXM8VD4gKGFyZzogUHJvbWlzZUNvbGxlY3Rpb248VD4pOiBQcm9taXNlQ29sbGVjdGlvbjxSZXN1bHRDb2xsZWN0aW9uPFQ+PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIHVua25vd24gYXMgUHJvbWlzZUNvbGxlY3Rpb248UmVzdWx0Q29sbGVjdGlvbjxUPj47XG5cbiAgICAgICAgZm9yIChjb25zdCBrIGluIGFyZylcbiAgICAgICAgICAgIHJlc3VsdFtrXSA9IHRoaXMuX3dyYXBCb290c3RyYXBwaW5nUHJvbWlzZShhcmdba10pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfYm9vdHN0cmFwUGFyYWxsZWwgKGJyb3dzZXJJbmZvOiBCcm93c2VySW5mb1NvdXJjZVtdLCBpZDogc3RyaW5nKTogUHJvbWlzZTxCYXNpY1J1bnRpbWVSZXNvdXJjZXM+IHtcbiAgICAgICAgY29uc3QgYm9vdHN0cmFwcGluZ1Byb21pc2VzID0ge1xuICAgICAgICAgICAgYnJvd3NlclNldDogdGhpcy5fZ2V0QnJvd3NlckNvbm5lY3Rpb25zKGJyb3dzZXJJbmZvKSxcbiAgICAgICAgICAgIHRlc3RzOiAgICAgIHRoaXMuX2dldFRlc3RzKGlkKSxcbiAgICAgICAgICAgIGFwcDogICAgICAgIHRoaXMuX3N0YXJ0VGVzdGVkQXBwKCksXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgYm9vdHN0cmFwcGluZ1Jlc3VsdFByb21pc2VzID0gdGhpcy5fZ2V0Qm9vdHN0cmFwcGluZ1Byb21pc2VzKGJvb3RzdHJhcHBpbmdQcm9taXNlcyk7XG5cbiAgICAgICAgY29uc3QgYm9vdHN0cmFwcGluZ1Jlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICBib290c3RyYXBwaW5nUmVzdWx0UHJvbWlzZXMuYnJvd3NlclNldCxcbiAgICAgICAgICAgIGJvb3RzdHJhcHBpbmdSZXN1bHRQcm9taXNlcy50ZXN0cyxcbiAgICAgICAgICAgIGJvb3RzdHJhcHBpbmdSZXN1bHRQcm9taXNlcy5hcHAsXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGNvbnN0IFticm93c2VyU2V0UmVzdWx0cywgdGVzdFJlc3VsdHMsIGFwcFJlc3VsdHNdID0gYm9vdHN0cmFwcGluZ1Jlc3VsdHM7XG5cbiAgICAgICAgaWYgKGlzUHJvbWlzZUVycm9yKGJyb3dzZXJTZXRSZXN1bHRzKSB8fCBpc1Byb21pc2VFcnJvcih0ZXN0UmVzdWx0cykgfHwgaXNQcm9taXNlRXJyb3IoYXBwUmVzdWx0cykpXG4gICAgICAgICAgICB0aHJvdyBhd2FpdCB0aGlzLl9nZXRCb290c3RyYXBwaW5nRXJyb3IoLi4uYm9vdHN0cmFwcGluZ1Jlc3VsdHMpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBicm93c2VyU2V0OiBicm93c2VyU2V0UmVzdWx0cy5yZXN1bHQsXG4gICAgICAgICAgICB0ZXN0czogICAgICB0ZXN0UmVzdWx0cy5yZXN1bHQsXG4gICAgICAgICAgICB0ZXN0ZWRBcHA6ICBhcHBSZXN1bHRzLnJlc3VsdCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBBUElcbiAgICBwdWJsaWMgYXN5bmMgY3JlYXRlUnVubmFibGVDb25maWd1cmF0aW9uICgpOiBQcm9taXNlPFJ1bm5hYmxlQ29uZmlndXJhdGlvbj4ge1xuICAgICAgICBjb25zdCBpZCAgICAgICAgICAgICAgICAgID0gZ2VuZXJhdGVVbmlxdWVJZCgpO1xuICAgICAgICBjb25zdCBjb21tb25DbGllbnRTY3JpcHRzID0gYXdhaXQgbG9hZENsaWVudFNjcmlwdHModGhpcy5jbGllbnRTY3JpcHRzKTtcblxuICAgICAgICBpZiAoYXdhaXQgdGhpcy5fY2FuVXNlUGFyYWxsZWxCb290c3RyYXBwaW5nKHRoaXMuYnJvd3NlcnMpKVxuICAgICAgICAgICAgcmV0dXJuIHsgLi4uYXdhaXQgdGhpcy5fYm9vdHN0cmFwUGFyYWxsZWwodGhpcy5icm93c2VycywgaWQpLCBjb21tb25DbGllbnRTY3JpcHRzLCBpZCB9O1xuXG4gICAgICAgIHJldHVybiB7IC4uLmF3YWl0IHRoaXMuX2Jvb3RzdHJhcFNlcXVlbmNlKHRoaXMuYnJvd3NlcnMsIGlkKSwgY29tbW9uQ2xpZW50U2NyaXB0cywgaWQgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzdG9yZU1lc3NhZ2VCdXNMaXN0ZW5lcnMgKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb25uZWN0aW9ucyA9IHRoaXMuYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LmdldENvbm5lY3Rpb25zKCk7XG5cbiAgICAgICAgT2JqZWN0LnZhbHVlcyhjb25uZWN0aW9ucykuZm9yRWFjaChjb25uZWN0aW9uID0+IHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb24uYXNzaWduVGVzdFJ1blN0YXJ0RXZlbnRMaXN0ZW5lcigpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
297
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bm5lci9ib290c3RyYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxtQ0FNZ0I7QUFFaEIsa0RBQTBCO0FBQzFCLGtFQUF1QztBQUN2QywyREFBbUM7QUFDbkMsdUVBQXVFO0FBQ3ZFLGdFQUF1QztBQUN2QywrQ0FBaUQ7QUFDakQsMkNBQWlEO0FBQ2pELDhEQUFxQztBQUNyQywrRUFBcUQ7QUFDckQseUVBQThEO0FBQzlELDRDQUE4RDtBQVE5RCwrRUFBc0Q7QUFDdEQsdUZBQWdFO0FBQ2hFLHlGQUErRDtBQUMvRCx5RUFBZ0Q7QUFHaEQsbUZBQXlEO0FBQ3pELHVFQUFtRTtBQUNuRSw2REFBdUQ7QUFDdkQsbUZBQXFFO0FBQ3JFLGlGQUF5RDtBQUV6RCxrRkFBa0Y7QUFFbEYsTUFBTSxXQUFXLEdBQUcsdUJBQXVCLENBQUM7QUEyQjVDLFNBQVMsY0FBYyxDQUE4QixLQUEwQjtJQUMzRSxPQUFRLEtBQXlCLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDO0FBQ3ZELENBQUM7QUFhRCxNQUFxQixZQUFZO0lBc0I3QixZQUFvQixFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQW9CO1FBQ3pGLElBQUksQ0FBQyx3QkFBd0IsR0FBRyx3QkFBd0IsQ0FBQztRQUN6RCxJQUFJLENBQUMsV0FBVyxHQUFnQixDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBb0IsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxRQUFRLEdBQW1CLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsU0FBUyxHQUFrQixFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLE1BQU0sR0FBcUIsS0FBSyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLFVBQVUsR0FBaUIsS0FBSyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLFlBQVksR0FBZSxL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TSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsS0FBRSxtQkFBbUIsRUFBRSxFQUFFLElBQUc7UUFFNUYsdUNBQVksTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsS0FBRSxtQkFBbUIsRUFBRSxFQUFFLElBQUc7SUFDNUYsQ0FBQztJQUVNLDBCQUEwQjtRQUM3QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFbkUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDNUMsVUFBVSxDQUFDLCtCQUErQixFQUFFLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0o7QUFoWUQsK0JBZ1lDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBjaHVuayxcbiAgICB0aW1lcyxcbiAgICB1bmlvbixcbiAgICBjYXN0QXJyYXksXG4gICAgZmxhdHRlbkRlZXAgYXMgZmxhdHRlbixcbn0gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCBwcmV0dHlUaW1lIGZyb20gJ3ByZXR0eS1ocnRpbWUnO1xuaW1wb3J0IENvbXBpbGVyIGZyb20gJy4uL2NvbXBpbGVyJztcbmltcG9ydCBCcm93c2VyQ29ubmVjdGlvbiwgeyBCcm93c2VySW5mbyB9IGZyb20gJy4uL2Jyb3dzZXIvY29ubmVjdGlvbic7XG5pbXBvcnQgQnJvd3NlclNldCBmcm9tICcuL2Jyb3dzZXItc2V0JztcbmltcG9ydCB7IEdlbmVyYWxFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9ydW50aW1lJztcbmltcG9ydCB7IFJVTlRJTUVfRVJST1JTIH0gZnJvbSAnLi4vZXJyb3JzL3R5cGVzJztcbmltcG9ydCBUZXN0ZWRBcHAgZnJvbSAnLi90ZXN0ZWQtYXBwJztcbmltcG9ydCBwYXJzZUZpbGVMaXN0IGZyb20gJy4uL3V0aWxzL3BhcnNlLWZpbGUtbGlzdCc7XG5pbXBvcnQgbG9hZENsaWVudFNjcmlwdHMgZnJvbSAnLi4vY3VzdG9tLWNsaWVudC1zY3JpcHRzL2xvYWQnO1xuaW1wb3J0IHsgZ2V0Q29uY2F0ZW5hdGVkVmFsdWVzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvc3RyaW5nJztcbmltcG9ydCB7IFJlcG9ydGVyU291cmNlIH0gZnJvbSAnLi4vcmVwb3J0ZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgQ2xpZW50U2NyaXB0IGZyb20gJy4uL2N1c3RvbS1jbGllbnQtc2NyaXB0cy9jbGllbnQtc2NyaXB0JztcbmltcG9ydCBDbGllbnRTY3JpcHRJbml0IGZyb20gJy4uL2N1c3RvbS1jbGllbnQtc2NyaXB0cy9jbGllbnQtc2NyaXB0LWluaXQnO1xuaW1wb3J0IEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheSBmcm9tICcuLi9icm93c2VyL2Nvbm5lY3Rpb24vZ2F0ZXdheSc7XG5pbXBvcnQgeyBDb21waWxlckFyZ3VtZW50cyB9IGZyb20gJy4uL2NvbXBpbGVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IFRlc3QgZnJvbSAnLi4vYXBpL3N0cnVjdHVyZS90ZXN0JztcbmltcG9ydCB7IEJvb3RzdHJhcHBlckluaXQsIEJyb3dzZXJTZXRPcHRpb25zIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCBXYXJuaW5nTG9nIGZyb20gJy4uL25vdGlmaWNhdGlvbnMvd2FybmluZy1sb2cnO1xuaW1wb3J0IFdBUk5JTkdfTUVTU0FHRVMgZnJvbSAnLi4vbm90aWZpY2F0aW9ucy93YXJuaW5nLW1lc3NhZ2UnO1xuaW1wb3J0IGd1YXJkVGltZUV4ZWN1dGlvbiBmcm9tICcuLi91dGlscy9ndWFyZC10aW1lLWV4ZWN1dGlvbic7XG5pbXBvcnQgYXN5bmNGaWx0ZXIgZnJvbSAnLi4vdXRpbHMvYXN5bmMtZmlsdGVyJztcbmltcG9ydCBGaXh0dXJlIGZyb20gJy4uL2FwaS9zdHJ1Y3R1cmUvZml4dHVyZSc7XG5pbXBvcnQgTWVzc2FnZUJ1cyBmcm9tICcuLi91dGlscy9tZXNzYWdlLWJ1cyc7XG5pbXBvcnQgd3JhcFRlc3RGdW5jdGlvbiBmcm9tICcuLi9hcGkvd3JhcC10ZXN0LWZ1bmN0aW9uJztcbmltcG9ydCB7IGFzc2VydFR5cGUsIGlzIH0gZnJvbSAnLi4vZXJyb3JzL3J1bnRpbWUvdHlwZS1hc3NlcnRpb25zJztcbmltcG9ydCB7IGdlbmVyYXRlVW5pcXVlSWQgfSBmcm9tICd0ZXN0Y2FmZS1oYW1tZXJoZWFkJztcbmltcG9ydCBhc3NlcnRSZXF1ZXN0SG9va1R5cGUgZnJvbSAnLi4vYXBpL3JlcXVlc3QtaG9va3MvYXNzZXJ0LXR5cGUnO1xuaW1wb3J0IE9QVElPTl9OQU1FUyBmcm9tICcuLi9jb25maWd1cmF0aW9uL29wdGlvbi1uYW1lcyc7XG5pbXBvcnQgVGVzdENhZmVDb25maWd1cmF0aW9uIGZyb20gJy4uL2NvbmZpZ3VyYXRpb24vdGVzdGNhZmUtY29uZmlndXJhdGlvbic7XG5pbXBvcnQgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5U3RhdHVzIGZyb20gJy4uL2Jyb3dzZXIvY29ubmVjdGlvbi9nYXRld2F5L3N0YXR1cyc7XG5cbmNvbnN0IERFQlVHX1NDT1BFID0gJ3Rlc3RjYWZlOmJvb3RzdHJhcHBlcic7XG5cbnR5cGUgVGVzdFNvdXJjZSA9IHVua25vd247XG5cbnR5cGUgQnJvd3NlckluZm9Tb3VyY2UgPSBCcm93c2VySW5mbyB8IEJyb3dzZXJDb25uZWN0aW9uO1xuXG5pbnRlcmZhY2UgUHJvbWlzZVN1Y2Nlc3M8VD4ge1xuICAgIHJlc3VsdDogVDtcbn1cblxuaW50ZXJmYWNlIFByb21pc2VFcnJvcjxFIGV4dGVuZHMgRXJyb3IgPSBFcnJvcj4ge1xuICAgIGVycm9yOiBFO1xufVxuXG5pbnRlcmZhY2UgQmFzaWNSdW50aW1lUmVzb3VyY2VzIHtcbiAgICBicm93c2VyU2V0OiBCcm93c2VyU2V0O1xuICAgIHRlc3RzOiBUZXN0W107XG4gICAgdGVzdGVkQXBwPzogVGVzdGVkQXBwO1xufVxuXG5pbnRlcmZhY2UgUnVubmFibGVDb25maWd1cmF0aW9uIGV4dGVuZHMgQmFzaWNSdW50aW1lUmVzb3VyY2VzIHtcbiAgICBjb21tb25DbGllbnRTY3JpcHRzOiBDbGllbnRTY3JpcHRbXTtcbiAgICBpZDogc3RyaW5nO1xufVxuXG50eXBlIFByb21pc2VSZXN1bHQ8VCwgRSBleHRlbmRzIEVycm9yID0gRXJyb3I+ID0gUHJvbWlzZVN1Y2Nlc3M8VD4gfCBQcm9taXNlRXJyb3I8RT47XG5cbmZ1bmN0aW9uIGlzUHJvbWlzZUVycm9yPFQsIEUgZXh0ZW5kcyBFcnJvciA9IEVycm9yPiAodmFsdWU6IFByb21pc2VSZXN1bHQ8VCwgRT4pOiB2YWx1ZSBpcyBQcm9taXNlRXJyb3I8RT4ge1xuICAgIHJldHVybiAodmFsdWUgYXMgUHJvbWlzZUVycm9yPEU+KS5lcnJvciAhPT0gdm9pZCAwO1xufVxuXG5pbnRlcmZhY2UgU2VwYXJhdGVkQnJvd3NlckluZm8ge1xuICAgIHJlbW90ZXM6IEJyb3dzZXJDb25uZWN0aW9uW107XG4gICAgYXV0b21hdGVkOiBCcm93c2VySW5mb1tdO1xufVxuXG50eXBlIFByb21pc2VDb2xsZWN0aW9uPFQ+ID0ge1xuICAgIFtLIGluIGtleW9mIFRdOiBQcm9taXNlPFRbS10+XG59XG5cbnR5cGUgUmVzdWx0Q29sbGVjdGlvbjxUPiA9IHsgW1AgaW4ga2V5b2YgVF06IFByb21pc2VSZXN1bHQ8VFtQXT4gfTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQm9vdHN0cmFwcGVyIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheTogQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5O1xuICAgIHB1YmxpYyBjb25jdXJyZW5jeTogbnVtYmVyO1xuICAgIHB1YmxpYyBzb3VyY2VzOiBUZXN0U291cmNlW107XG4gICAgcHVibGljIGJyb3dzZXJzOiBCcm93c2VySW5mb1NvdXJjZVtdO1xuICAgIHB1YmxpYyByZXBvcnRlcnM6IFJlcG9ydGVyU291cmNlW107XG4gICAgcHVibGljIGZpbHRlcj86IEZpbHRlckZ1bmN0aW9uO1xuICAgIHB1YmxpYyBhcHBDb21tYW5kPzogc3RyaW5nO1xuICAgIHB1YmxpYyBhcHBJbml0RGVsYXk/OiBudW1iZXI7XG4gICAgcHVibGljIHRzQ29uZmlnUGF0aD86IHN0cmluZztcbiAgICBwdWJsaWMgY2xpZW50U2NyaXB0czogQ2xpZW50U2NyaXB0SW5pdFtdO1xuICAgIHB1YmxpYyBkaXNhYmxlTXVsdGlwbGVXaW5kb3dzOiBib29sZWFuO1xuICAgIHB1YmxpYyBjb21waWxlck9wdGlvbnM/OiBDb21waWxlck9wdGlvbnM7XG4gICAgcHVibGljIGJyb3dzZXJJbml0VGltZW91dD86IG51bWJlcjtcbiAgICBwdWJsaWMgaG9va3M/OiBHbG9iYWxIb29rcztcbiAgICBwdWJsaWMgY29uZmlndXJhdGlvbjogVGVzdENhZmVDb25maWd1cmF0aW9uO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVidWdMb2dnZXI6IGRlYnVnLkRlYnVnZ2VyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgd2FybmluZ0xvZzogV2FybmluZ0xvZztcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VCdXM6IE1lc3NhZ2VCdXM7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IFRFU1RTX0NPTVBJTEFUSU9OX1VQUEVSQk9VTkQ6IG51bWJlcjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoeyBicm93c2VyQ29ubmVjdGlvbkdhdGV3YXksIG1lc3NhZ2VCdXMsIGNvbmZpZ3VyYXRpb24gfTogQm9vdHN0cmFwcGVySW5pdCkge1xuICAgICAgICB0aGlzLmJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheSA9IGJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheTtcbiAgICAgICAgdGhpcy5jb25jdXJyZW5jeSAgICAgICAgICAgICAgPSAxO1xuICAgICAgICB0aGlzLnNvdXJjZXMgICAgICAgICAgICAgICAgICA9IFtdO1xuICAgICAgICB0aGlzLmJyb3dzZXJzICAgICAgICAgICAgICAgICA9IFtdO1xuICAgICAgICB0aGlzLnJlcG9ydGVycyAgICAgICAgICAgICAgICA9IFtdO1xuICAgICAgICB0aGlzLmZpbHRlciAgICAgICAgICAgICAgICAgICA9IHZvaWQgMDtcbiAgICAgICAgdGhpcy5hcHBDb21tYW5kICAgICAgICAgICAgICAgPSB2b2lkIDA7XG4gICAgICAgIHRoaXMuYXBwSW5pdERlbGF5ICAgICAgICAgICAgID0gdm9pZCAwO1xuICAgICAgICB0aGlzLnRzQ29uZmlnUGF0aCAgICAgICAgICAgICA9IHZvaWQgMDtcbiAgICAgICAgdGhpcy5jbGllbnRTY3JpcHRzICAgICAgICAgICAgPSBbXTtcbiAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlwbGVXaW5kb3dzICAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb21waWxlck9wdGlvbnMgICAgICAgICAgPSB2b2lkIDA7XG4gICAgICAgIHRoaXMuZGVidWdMb2dnZXIgICAgICAgICAgICAgID0gZGVidWcoREVCVUdfU0NPUEUpO1xuICAgICAgICB0aGlzLndhcm5pbmdMb2cgICAgICAgICAgICAgICA9IG5ldyBXYXJuaW5nTG9nKG51bGwsIFdhcm5pbmdMb2cuY3JlYXRlQWRkV2FybmluZ0NhbGxiYWNrKG1lc3NhZ2VCdXMpKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlQnVzICAgICAgICAgICAgICAgPSBtZXNzYWdlQnVzO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gICAgICAgICAgICA9IGNvbmZpZ3VyYXRpb247XG5cbiAgICAgICAgdGhpcy5URVNUU19DT01QSUxBVElPTl9VUFBFUkJPVU5EID0gNjA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2dldEJyb3dzZXJOYW1lIChicm93c2VyOiBCcm93c2VySW5mb1NvdXJjZSk6IHN0cmluZyB7XG4gICAgICAgIGlmIChicm93c2VyIGluc3RhbmNlb2YgQnJvd3NlckNvbm5lY3Rpb24pXG4gICAgICAgICAgICByZXR1cm4gYnJvd3Nlci5icm93c2VySW5mby5icm93c2VyTmFtZTtcblxuICAgICAgICByZXR1cm4gYnJvd3Nlci5icm93c2VyTmFtZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfc3BsaXRCcm93c2VySW5mbyAoYnJvd3NlckluZm86IEJyb3dzZXJJbmZvU291cmNlW10pOiBTZXBhcmF0ZWRCcm93c2VySW5mbyB7XG4gICAgICAgIGNvbnN0IHJlbW90ZXM6IEJyb3dzZXJDb25uZWN0aW9uW10gPSBbXTtcbiAgICAgICAgY29uc3QgYXV0b21hdGVkOiBCcm93c2VySW5mb1tdICAgICA9IFtdO1xuXG4gICAgICAgIGJyb3dzZXJJbmZvLmZvckVhY2goYnJvd3NlciA9PiB7XG4gICAgICAgICAgICBpZiAoYnJvd3NlciBpbnN0YW5jZW9mIEJyb3dzZXJDb25uZWN0aW9uKVxuICAgICAgICAgICAgICAgIHJlbW90ZXMucHVzaChicm93c2VyKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBhdXRvbWF0ZWQucHVzaChicm93c2VyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHsgcmVtb3RlcywgYXV0b21hdGVkIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY3JlYXRlQXV0b21hdGVkQ29ubmVjdGlvbnMgKGJyb3dzZXJJbmZvOiBCcm93c2VySW5mb1tdKTogQnJvd3NlckNvbm5lY3Rpb25bXVtdIHtcbiAgICAgICAgaWYgKCFicm93c2VySW5mbylcbiAgICAgICAgICAgIHJldHVybiBbXTtcblxuICAgICAgICByZXR1cm4gYnJvd3NlckluZm8ubWFwKGJyb3dzZXIgPT4gdGltZXModGhpcy5jb25jdXJyZW5jeSwgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICBkaXNhYmxlTXVsdGlwbGVXaW5kb3dzOiB0aGlzLmRpc2FibGVNdWx0aXBsZVdpbmRvd3MsXG4gICAgICAgICAgICAgICAgZGV2ZWxvcG1lbnRNb2RlOiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuZGV2ZWxvcG1lbnRNb2RlKSBhcyBib29sZWFuLFxuICAgICAgICAgICAgICAgIG5hdGl2ZUF1dG9tYXRpb246ICAgICAgICF0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5kaXNhYmxlTmF0aXZlQXV0b21hdGlvbiksXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gbmV3IEJyb3dzZXJDb25uZWN0aW9uKHRoaXMuYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LCB7IC4uLmJyb3dzZXIgfSwgZmFsc2UsIG9wdGlvbnMsIHRoaXMubWVzc2FnZUJ1cyk7XG5cbiAgICAgICAgICAgIGNvbm5lY3Rpb24uaW5pdGlhbGl6ZSgpO1xuXG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldEJyb3dzZXJTZXRPcHRpb25zICgpOiBCcm93c2VyU2V0T3B0aW9ucyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb25jdXJyZW5jeTogICAgICAgIHRoaXMuY29uY3VycmVuY3ksXG4gICAgICAgICAgICBicm93c2VySW5pdFRpbWVvdXQ6IHRoaXMuYnJvd3NlckluaXRUaW1lb3V0LFxuICAgICAgICAgICAgd2FybmluZ0xvZzogICAgICAgICB0aGlzLndhcm5pbmdMb2csXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfc2V0dXBQcm94eSAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5zdGF0dXMgPT09IEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheVN0YXR1cy5pbml0aWFsaXplZClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uY2FsY3VsYXRlSG9zdG5hbWUoeyBuYXRpdmVBdXRvbWF0aW9uOiAhdGhpcy5jb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuZGlzYWJsZU5hdGl2ZUF1dG9tYXRpb24pIH0pO1xuXG4gICAgICAgIHRoaXMuYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LmluaXRpYWxpemUodGhpcy5jb25maWd1cmF0aW9uLnN0YXJ0T3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaGFzTm90U3VwcG9ydGVkQnJvd3NlckluTmF0aXZlQXV0b21hdGlvbiAoYnJvd3NlckluZm9zOiBCcm93c2VySW5mb1tdKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBicm93c2VySW5mb3Muc29tZShicm93c2VySW5mbyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gIWJyb3dzZXJJbmZvLnByb3ZpZGVyLnN1cHBvcnROYXRpdmVBdXRvbWF0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0QnJvd3NlcnNXaXRoVXNlclByb2ZpbGVFbmFibGVkIChicm93c2VySW5mb3M6IEJyb3dzZXJJbmZvW10pOiBCcm93c2VySW5mb1tdIHtcbiAgICAgICAgcmV0dXJuIGJyb3dzZXJJbmZvcy5maWx0ZXIoYnJvd3NlckluZm8gPT4gKGJyb3dzZXJJbmZvLmJyb3dzZXJPcHRpb24gYXMgYW55KT8udXNlclByb2ZpbGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2Rpc2FibGVOYXRpdmVBdXRvbWF0aW9uSWZOZWNlc3NhcnkgKHJlbW90ZXM6IEJyb3dzZXJDb25uZWN0aW9uW10sIGF1dG9tYXRlZDogQnJvd3NlckluZm9bXSk6IHZvaWQge1xuICAgICAgICAvLyBOT1RFOiBDRFAgQVBJIGFsbG93cyBjb25uZWN0aW5nIG9ubHkgZm9yIHRoZSBsb2NhbCBicm93c2VyLiBTbywgdGhlICdyZW1vdGUnIGJyb3dzZXIgY2Fubm90IGJlIHJ1biBpbiB0aGUgJ25hdGl2ZUF1dG9tYXRpb24nIG1vZGUuXG4gICAgICAgIC8vIEhvd2V2ZXIsIHNvbWV0aW1lcyBpbiB0ZXN0cyBvciBUZXN0Q2FmZSBTdHVkaW8gUmVjb3JkZXIsIHdlIHVzZSB0aGUgJ3JlbW90ZScgYnJvd3NlciBjb25uZWN0aW9uIGFzIGEgbG9jYWwgb25lLlxuICAgICAgICBjb25zdCBjb250YWluc05vdEF1dG9tYXRlZFJlbW90ZXMgPSByZW1vdGVzLnNvbWUocmVtb3RlID0+ICFyZW1vdGUuaXNOYXRpdmVBdXRvbWF0aW9uRW5hYmxlZCgpKTtcblxuICAgICAgICBpZiAocmVtb3Rlcy5sZW5ndGggJiYgY29udGFpbnNOb3RBdXRvbWF0ZWRSZW1vdGVzIHx8IHRoaXMuX2hhc05vdFN1cHBvcnRlZEJyb3dzZXJJbk5hdGl2ZUF1dG9tYXRpb24oYXV0b21hdGVkKSlcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tZXJnZU9wdGlvbnMoeyBkaXNhYmxlTmF0aXZlQXV0b21hdGlvbjogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9nZXRCcm93c2VyQ29ubmVjdGlvbnMgKGJyb3dzZXJJbmZvOiBCcm93c2VySW5mb1NvdXJjZVtdKTogUHJvbWlzZTxCcm93c2VyU2V0PiB7XG4gICAgICAgIGNvbnN0IHsgYXV0b21hdGVkLCByZW1vdGVzIH0gPSBCb290c3RyYXBwZXIuX3NwbGl0QnJvd3NlckluZm8oYnJvd3NlckluZm8pO1xuXG4gICAgICAgIGlmIChyZW1vdGVzICYmIHJlbW90ZXMubGVuZ3RoICUgdGhpcy5jb25jdXJyZW5jeSlcbiAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMuY2Fubm90RGl2aWRlUmVtb3Rlc0NvdW50QnlDb25jdXJyZW5jeSk7XG5cbiAgICAgICAgdGhpcy5fZGlzYWJsZU5hdGl2ZUF1dG9tYXRpb25JZk5lY2Vzc2FyeShyZW1vdGVzLCBhdXRvbWF0ZWQpO1xuXG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlVXNlclByb2ZpbGVPcHRpb25Jbk5hdGl2ZUF1dG9tYXRpb24oYXV0b21hdGVkKTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9zZXR1cFByb3h5KCk7XG5cbiAgICAgICAgbGV0IGJyb3dzZXJDb25uZWN0aW9ucyA9IHRoaXMuX2NyZWF0ZUF1dG9tYXRlZENvbm5lY3Rpb25zKGF1dG9tYXRlZCk7XG5cbiAgICAgICAgcmVtb3Rlcy5mb3JFYWNoKHJlbW90ZUNvbm5lY3Rpb24gPT4ge1xuICAgICAgICAgICAgcmVtb3RlQ29ubmVjdGlvbi5tZXNzYWdlQnVzID0gdGhpcy5tZXNzYWdlQnVzO1xuXG4gICAgICAgICAgICByZW1vdGVDb25uZWN0aW9uLmluaXRNZXNzYWdlQnVzKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJyb3dzZXJDb25uZWN0aW9ucyA9IGJyb3dzZXJDb25uZWN0aW9ucy5jb25jYXQoY2h1bmsocmVtb3RlcywgdGhpcy5jb25jdXJyZW5jeSkpO1xuXG4gICAgICAgIHJldHVybiBCcm93c2VyU2V0LmZyb20oYnJvd3NlckNvbm5lY3Rpb25zLCB0aGlzLl9nZXRCcm93c2VyU2V0T3B0aW9ucygpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3ZhbGlkYXRlVXNlclByb2ZpbGVPcHRpb25Jbk5hdGl2ZUF1dG9tYXRpb24gKGF1dG9tYXRlZDogQnJvd3NlckluZm9bXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpc05hdGl2ZUF1dG9tYXRpb24gICAgICA9ICF0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5kaXNhYmxlTmF0aXZlQXV0b21hdGlvbik7XG4gICAgICAgIGNvbnN0IGJyb3dzZXJzV2l0aFVzZXJQcm9maWxlID0gdGhpcy5nZXRCcm93c2Vyc1dpdGhVc2VyUHJvZmlsZUVuYWJsZWQoYXV0b21hdGVkKTtcblxuICAgICAgICBpZiAoaXNOYXRpdmVBdXRvbWF0aW9uICYmIGJyb3dzZXJzV2l0aFVzZXJQcm9maWxlLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgYnJvd3NlcnMgPSBicm93c2Vyc1dpdGhVc2VyUHJvZmlsZS5tYXAoYiA9PiBiLmFsaWFzKS5qb2luKCcsICcpO1xuXG4gICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLnNldFVzZXJQcm9maWxlSW5OYXRpdmVBdXRvbWF0aW9uLCBicm93c2Vycyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9maWx0ZXJUZXN0cyAodGVzdHM6IFRlc3RbXSwgcHJlZGljYXRlOiBGaWx0ZXJGdW5jdGlvbik6IFByb21pc2U8VGVzdFtdPiB7XG4gICAgICAgIHJldHVybiBhc3luY0ZpbHRlcih0ZXN0cywgdGVzdCA9PiB7XG4gICAgICAgICAgICBjb25zdCB0ZXN0Rml4dHVyZSA9IHRlc3QuZml4dHVyZSBhcyBGaXh0dXJlO1xuXG4gICAgICAgICAgICByZXR1cm4gcHJlZGljYXRlKFxuICAgICAgICAgICAgICAgIHRlc3QubmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgdGVzdEZpeHR1cmUubmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgdGVzdEZpeHR1cmUucGF0aCxcbiAgICAgICAgICAgICAgICB0ZXN0Lm1ldGEsXG4gICAgICAgICAgICAgICAgdGVzdEZpeHR1cmUubWV0YSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2NvbXBpbGVUZXN0cyAoeyBzb3VyY2VMaXN0LCBjb21waWxlck9wdGlvbnMgfTogQ29tcGlsZXJBcmd1bWVudHMpOiBQcm9taXNlPFRlc3RbXT4ge1xuICAgICAgICBjb25zdCBiYXNlVXJsICA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRPcHRpb24oT1BUSU9OX05BTUVTLmJhc2VVcmwpIGFzIHN0cmluZztcbiAgICAgICAgY29uc3QgZXNtICAgICAgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5lc20pO1xuICAgICAgICBjb25zdCBjb21waWxlciA9IG5ldyBDb21waWxlcihzb3VyY2VMaXN0LCBjb21waWxlck9wdGlvbnMsIHsgYmFzZVVybCwgZXNtIH0pO1xuXG4gICAgICAgIHJldHVybiBjb21waWxlci5nZXRUZXN0cygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2Fzc2VydEdsb2JhbEhvb2tzICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmhvb2tzKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGlmICh0aGlzLmhvb2tzLmZpeHR1cmU/LmJlZm9yZSlcbiAgICAgICAgICAgIGFzc2VydFR5cGUoaXMuZnVuY3Rpb24sICdnbG9iYWxCZWZvcmUnLCAnVGhlIGZpeHR1cmUuZ2xvYmFsQmVmb3JlIGhvb2snLCB0aGlzLmhvb2tzLmZpeHR1cmUuYmVmb3JlKTtcblxuICAgICAgICBpZiAodGhpcy5ob29rcy5maXh0dXJlPy5hZnRlcilcbiAgICAgICAgICAgIGFzc2VydFR5cGUoaXMuZnVuY3Rpb24sICdnbG9iYWxBZnRlcicsICdUaGUgZml4dHVyZS5nbG9iYWxBZnRlciBob29rJywgdGhpcy5ob29rcy5maXh0dXJlLmFmdGVyKTtcblxuICAgICAgICBpZiAodGhpcy5ob29rcy50ZXN0Py5iZWZvcmUpXG4gICAgICAgICAgICBhc3NlcnRUeXBlKGlzLmZ1bmN0aW9uLCAnZ2xvYmFsQmVmb3JlJywgJ1RoZSB0ZXN0Lmdsb2JhbEJlZm9yZSBob29rJywgdGhpcy5ob29rcy50ZXN0LmJlZm9yZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuaG9va3MudGVzdD8uYWZ0ZXIpXG4gICAgICAgICAgICBhc3NlcnRUeXBlKGlzLmZ1bmN0aW9uLCAnZ2xvYmFsQWZ0ZXInLCAnVGhlIHRlc3QuZ2xvYmFsQWZ0ZXIgaG9vaycsIHRoaXMuaG9va3MudGVzdC5hZnRlcik7XG5cbiAgICAgICAgaWYgKHRoaXMuaG9va3MucmVxdWVzdClcbiAgICAgICAgICAgIGFzc2VydFJlcXVlc3RIb29rVHlwZShmbGF0dGVuKGNhc3RBcnJheSh0aGlzLmhvb2tzLnJlcXVlc3QpKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0R2xvYmFsSG9va3NUb1Rlc3RzICh0ZXN0czogVGVzdFtdKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5ob29rcylcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aGlzLl9hc3NlcnRHbG9iYWxIb29rcygpO1xuXG4gICAgICAgIGNvbnN0IGZpeHR1cmVCZWZvcmUgPSB0aGlzLmhvb2tzLmZpeHR1cmU/LmJlZm9yZSB8fCBudWxsO1xuICAgICAgICBjb25zdCBmaXh0dXJlQWZ0ZXIgID0gdGhpcy5ob29rcy5maXh0dXJlPy5hZnRlciB8fCBudWxsO1xuICAgICAgICBjb25zdCB0ZXN0QmVmb3JlICAgID0gdGhpcy5ob29rcy50ZXN0Py5iZWZvcmUgPyB3cmFwVGVzdEZ1bmN0aW9uKHRoaXMuaG9va3MudGVzdC5iZWZvcmUpIDogbnVsbDtcbiAgICAgICAgY29uc3QgdGVzdEFmdGVyICAgICA9IHRoaXMuaG9va3MudGVzdD8uYWZ0ZXIgPyB3cmFwVGVzdEZ1bmN0aW9uKHRoaXMuaG9va3MudGVzdC5hZnRlcikgOiBudWxsO1xuICAgICAgICBjb25zdCByZXF1ZXN0ICAgICAgID0gdGhpcy5ob29rcy5yZXF1ZXN0IHx8IFtdO1xuXG4gICAgICAgIHRlc3RzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbS5maXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgaXRlbS5maXh0dXJlLmdsb2JhbEJlZm9yZUZuID0gaXRlbS5maXh0dXJlLmdsb2JhbEJlZm9yZUZuIHx8IGZpeHR1cmVCZWZvcmU7XG4gICAgICAgICAgICAgICAgaXRlbS5maXh0dXJlLmdsb2JhbEFmdGVyRm4gID0gaXRlbS5maXh0dXJlLmdsb2JhbEFmdGVyRm4gfHwgZml4dHVyZUFmdGVyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpdGVtLmdsb2JhbEJlZm9yZUZuID0gdGVzdEJlZm9yZTtcbiAgICAgICAgICAgIGl0ZW0uZ2xvYmFsQWZ0ZXJGbiAgPSB0ZXN0QWZ0ZXI7XG4gICAgICAgICAgICBpdGVtLnJlcXVlc3RIb29rcyAgID0gdW5pb24oZmxhdHRlbihjYXN0QXJyYXkocmVxdWVzdCkpLCBpdGVtLnJlcXVlc3RIb29rcyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2dldFRlc3RzIChpZDogc3RyaW5nKTogUHJvbWlzZTxUZXN0W10+IHtcbiAgICAgICAgY29uc3QgY3dkICAgICAgICA9IHByb2Nlc3MuY3dkKCk7XG4gICAgICAgIGNvbnN0IHNvdXJjZUxpc3QgPSBhd2FpdCBwYXJzZUZpbGVMaXN0KHRoaXMuc291cmNlcywgY3dkKTtcblxuICAgICAgICBpZiAoIXNvdXJjZUxpc3QubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy50ZXN0RmlsZXNOb3RGb3VuZCwgY3dkLCBnZXRDb25jYXRlbmF0ZWRWYWx1ZXNTdHJpbmcodGhpcy5zb3VyY2VzLCAnXFxuJywgJycpKTtcblxuICAgICAgICBsZXQgdGVzdHMgPSBhd2FpdCBndWFyZFRpbWVFeGVjdXRpb24oXG4gICAgICAgICAgICBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLl9jb21waWxlVGVzdHMoeyBzb3VyY2VMaXN0LCBjb21waWxlck9wdGlvbnM6IHRoaXMuY29tcGlsZXJPcHRpb25zLCBydW5uYWJsZUNvbmZpZ3VyYXRpb25JZDogaWQgfSksXG4gICAgICAgICAgICBlbGFwc2VkVGltZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWJ1Z0xvZ2dlcihgdGVzdHMgY29tcGlsYXRpb24gdG9vayAke3ByZXR0eVRpbWUoZWxhcHNlZFRpbWUpfWApO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgWyBlbGFwc2VkU2Vjb25kcyBdID0gZWxhcHNlZFRpbWU7XG5cbiAgICAgICAgICAgICAgICBpZiAoZWxhcHNlZFNlY29uZHMgPiB0aGlzLlRFU1RTX0NPTVBJTEFUSU9OX1VQUEVSQk9VTkQpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2FybmluZ0xvZy5hZGRXYXJuaW5nKFdBUk5JTkdfTUVTU0FHRVMudGVzdHNDb21waWxhdGlvblRha2VzVG9vTG9uZywgcHJldHR5VGltZShlbGFwc2VkVGltZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHRlc3RzV2l0aE9ubHlGbGFnID0gdGVzdHMuZmlsdGVyKHRlc3QgPT4gdGVzdC5vbmx5KTtcblxuICAgICAgICBpZiAodGVzdHNXaXRoT25seUZsYWcubGVuZ3RoKVxuICAgICAgICAgICAgdGVzdHMgPSB0ZXN0c1dpdGhPbmx5RmxhZztcblxuICAgICAgICBpZiAoIXRlc3RzLmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMubm9UZXN0c1RvUnVuKTtcblxuICAgICAgICBpZiAodGhpcy5maWx0ZXIpXG4gICAgICAgICAgICB0ZXN0cyA9IGF3YWl0IHRoaXMuX2ZpbHRlclRlc3RzKHRlc3RzLCB0aGlzLmZpbHRlcik7XG5cbiAgICAgICAgaWYgKCF0ZXN0cy5sZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLm5vVGVzdHNUb1J1bkR1ZUZpbHRlcmluZyk7XG5cbiAgICAgICAgdGhpcy5fc2V0R2xvYmFsSG9va3NUb1Rlc3RzKHRlc3RzKTtcblxuICAgICAgICByZXR1cm4gdGVzdHM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfc3RhcnRUZXN0ZWRBcHAgKCk6IFByb21pc2U8VGVzdGVkQXBwfHVuZGVmaW5lZD4ge1xuICAgICAgICBpZiAoIXRoaXMuYXBwQ29tbWFuZClcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG5cbiAgICAgICAgY29uc3QgdGVzdGVkQXBwID0gbmV3IFRlc3RlZEFwcCgpO1xuXG4gICAgICAgIGF3YWl0IHRlc3RlZEFwcC5zdGFydCh0aGlzLmFwcENvbW1hbmQsIHRoaXMuYXBwSW5pdERlbGF5IGFzIG51bWJlcik7XG5cbiAgICAgICAgcmV0dXJuIHRlc3RlZEFwcDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9jYW5Vc2VQYXJhbGxlbEJvb3RzdHJhcHBpbmcgKGJyb3dzZXJJbmZvOiBCcm93c2VySW5mb1NvdXJjZVtdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGlzTG9jYWxQcm9taXNlcyA9IGJyb3dzZXJJbmZvLm1hcChicm93c2VyID0+IGJyb3dzZXIucHJvdmlkZXIuaXNMb2NhbEJyb3dzZXIodm9pZCAwLCBCb290c3RyYXBwZXIuX2dldEJyb3dzZXJOYW1lKGJyb3dzZXIpKSk7XG4gICAgICAgIGNvbnN0IGlzTG9jYWxCcm93c2VycyA9IGF3YWl0IFByb21pc2UuYWxsKGlzTG9jYWxQcm9taXNlcyk7XG5cbiAgICAgICAgcmV0dXJuIGlzTG9jYWxCcm93c2Vycy5ldmVyeShyZXN1bHQgPT4gcmVzdWx0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9ib290c3RyYXBTZXF1ZW5jZSAoYnJvd3NlckluZm86IEJyb3dzZXJJbmZvU291cmNlW10sIGlkOiBzdHJpbmcpOiBQcm9taXNlPEJhc2ljUnVudGltZVJlc291cmNlcz4ge1xuICAgICAgICBjb25zdCB0ZXN0cyAgICAgID0gYXdhaXQgdGhpcy5fZ2V0VGVzdHMoaWQpO1xuICAgICAgICBjb25zdCB0ZXN0ZWRBcHAgID0gYXdhaXQgdGhpcy5fc3RhcnRUZXN0ZWRBcHAoKTtcbiAgICAgICAgY29uc3QgYnJvd3NlclNldCA9IGF3YWl0IHRoaXMuX2dldEJyb3dzZXJDb25uZWN0aW9ucyhicm93c2VySW5mbyk7XG5cbiAgICAgICAgcmV0dXJuIHsgdGVzdHMsIHRlc3RlZEFwcCwgYnJvd3NlclNldCB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgX3dyYXBCb290c3RyYXBwaW5nUHJvbWlzZTxUPiAocHJvbWlzZTogUHJvbWlzZTxUPik6IFByb21pc2U8UHJvbWlzZVJlc3VsdDxUPj4ge1xuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4ocmVzdWx0ID0+ICh7IGVycm9yOiB2b2lkIDAsIHJlc3VsdCB9KSlcbiAgICAgICAgICAgIC5jYXRjaChlcnJvciA9PiAoeyByZXN1bHQ6IHZvaWQgMCwgZXJyb3IgfSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2dldEJvb3RzdHJhcHBpbmdFcnJvciAoYnJvd3NlclNldFN0YXR1czogUHJvbWlzZVJlc3VsdDxCcm93c2VyU2V0PiwgdGVzdHNTdGF0dXM6IFByb21pc2VSZXN1bHQ8VGVzdFtdPiwgdGVzdGVkQXBwU3RhdHVzOiBQcm9taXNlUmVzdWx0PFRlc3RlZEFwcHx1bmRlZmluZWQ+KTogUHJvbWlzZTxFcnJvcj4ge1xuICAgICAgICBpZiAoIWlzUHJvbWlzZUVycm9yKGJyb3dzZXJTZXRTdGF0dXMpKVxuICAgICAgICAgICAgYXdhaXQgYnJvd3NlclNldFN0YXR1cy5yZXN1bHQuZGlzcG9zZSgpO1xuXG4gICAgICAgIGlmICghaXNQcm9taXNlRXJyb3IoYnJvd3NlclNldFN0YXR1cykgJiYgIWlzUHJvbWlzZUVycm9yKHRlc3RlZEFwcFN0YXR1cykgJiYgdGVzdGVkQXBwU3RhdHVzLnJlc3VsdClcbiAgICAgICAgICAgIGF3YWl0IHRlc3RlZEFwcFN0YXR1cy5yZXN1bHQua2lsbCgpO1xuXG4gICAgICAgIGlmIChpc1Byb21pc2VFcnJvcih0ZXN0c1N0YXR1cykpXG4gICAgICAgICAgICByZXR1cm4gdGVzdHNTdGF0dXMuZXJyb3I7XG5cbiAgICAgICAgaWYgKGlzUHJvbWlzZUVycm9yKHRlc3RlZEFwcFN0YXR1cykpXG4gICAgICAgICAgICByZXR1cm4gdGVzdGVkQXBwU3RhdHVzLmVycm9yO1xuXG4gICAgICAgIGlmIChpc1Byb21pc2VFcnJvcihicm93c2VyU2V0U3RhdHVzKSlcbiAgICAgICAgICAgIHJldHVybiBicm93c2VyU2V0U3RhdHVzLmVycm9yO1xuXG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgY2FsbCcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldEJvb3RzdHJhcHBpbmdQcm9taXNlczxUPiAoYXJnOiBQcm9taXNlQ29sbGVjdGlvbjxUPik6IFByb21pc2VDb2xsZWN0aW9uPFJlc3VsdENvbGxlY3Rpb248VD4+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgdW5rbm93biBhcyBQcm9taXNlQ29sbGVjdGlvbjxSZXN1bHRDb2xsZWN0aW9uPFQ+PjtcblxuICAgICAgICBmb3IgKGNvbnN0IGsgaW4gYXJnKVxuICAgICAgICAgICAgcmVzdWx0W2tdID0gdGhpcy5fd3JhcEJvb3RzdHJhcHBpbmdQcm9taXNlKGFyZ1trXSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9hc3NlcnROYXRpdmVBdXRvbWF0aW9uRm9yTGVnYWN5VGVzdHMgKHJlc291cmNlczogQmFzaWNSdW50aW1lUmVzb3VyY2VzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGlzTmF0aXZlQXV0b21hdGlvbiA9ICF0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0T3B0aW9uKE9QVElPTl9OQU1FUy5kaXNhYmxlTmF0aXZlQXV0b21hdGlvbik7XG5cbiAgICAgICAgaWYgKCFpc05hdGl2ZUF1dG9tYXRpb24pXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3QgaGFzTGVnYWN5VGVzdHMgPSByZXNvdXJjZXMudGVzdHMuc29tZSh0ZXN0ID0+ICh0ZXN0IGFzIGFueSkuaXNMZWdhY3kpO1xuXG4gICAgICAgIGlmICghaGFzTGVnYWN5VGVzdHMpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgYXdhaXQgcmVzb3VyY2VzLmJyb3dzZXJTZXQuZGlzcG9zZSgpO1xuICAgICAgICBhd2FpdCByZXNvdXJjZXMudGVzdGVkQXBwPy5raWxsKCk7XG5cbiAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5jYW5ub3RSdW5MZWdhY3lUZXN0c0luTmF0aXZlQXV0b21hdGlvbk1vZGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2Jvb3RzdHJhcFBhcmFsbGVsIChicm93c2VySW5mbzogQnJvd3NlckluZm9Tb3VyY2VbXSwgaWQ6IHN0cmluZyk6IFByb21pc2U8QmFzaWNSdW50aW1lUmVzb3VyY2VzPiB7XG4gICAgICAgIGNvbnN0IGJvb3RzdHJhcHBpbmdQcm9taXNlcyA9IHtcbiAgICAgICAgICAgIGJyb3dzZXJTZXQ6IHRoaXMuX2dldEJyb3dzZXJDb25uZWN0aW9ucyhicm93c2VySW5mbyksXG4gICAgICAgICAgICB0ZXN0czogICAgICB0aGlzLl9nZXRUZXN0cyhpZCksXG4gICAgICAgICAgICBhcHA6ICAgICAgICB0aGlzLl9zdGFydFRlc3RlZEFwcCgpLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGJvb3RzdHJhcHBpbmdSZXN1bHRQcm9taXNlcyA9IHRoaXMuX2dldEJvb3RzdHJhcHBpbmdQcm9taXNlcyhib290c3RyYXBwaW5nUHJvbWlzZXMpO1xuXG4gICAgICAgIGNvbnN0IGJvb3RzdHJhcHBpbmdSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgYm9vdHN0cmFwcGluZ1Jlc3VsdFByb21pc2VzLmJyb3dzZXJTZXQsXG4gICAgICAgICAgICBib290c3RyYXBwaW5nUmVzdWx0UHJvbWlzZXMudGVzdHMsXG4gICAgICAgICAgICBib290c3RyYXBwaW5nUmVzdWx0UHJvbWlzZXMuYXBwLFxuICAgICAgICBdKTtcblxuICAgICAgICBjb25zdCBbYnJvd3NlclNldFJlc3VsdHMsIHRlc3RSZXN1bHRzLCBhcHBSZXN1bHRzXSA9IGJvb3RzdHJhcHBpbmdSZXN1bHRzO1xuXG4gICAgICAgIGlmIChpc1Byb21pc2VFcnJvcihicm93c2VyU2V0UmVzdWx0cykgfHwgaXNQcm9taXNlRXJyb3IodGVzdFJlc3VsdHMpIHx8IGlzUHJvbWlzZUVycm9yKGFwcFJlc3VsdHMpKVxuICAgICAgICAgICAgdGhyb3cgYXdhaXQgdGhpcy5fZ2V0Qm9vdHN0cmFwcGluZ0Vycm9yKC4uLmJvb3RzdHJhcHBpbmdSZXN1bHRzKTtcblxuICAgICAgICBjb25zdCByZXNvdXJjZXMgPSB7XG4gICAgICAgICAgICBicm93c2VyU2V0OiBicm93c2VyU2V0UmVzdWx0cy5yZXN1bHQsXG4gICAgICAgICAgICB0ZXN0czogICAgICB0ZXN0UmVzdWx0cy5yZXN1bHQsXG4gICAgICAgICAgICB0ZXN0ZWRBcHA6ICBhcHBSZXN1bHRzLnJlc3VsdCxcbiAgICAgICAgfTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9hc3NlcnROYXRpdmVBdXRvbWF0aW9uRm9yTGVnYWN5VGVzdHMocmVzb3VyY2VzKTtcblxuICAgICAgICByZXR1cm4gcmVzb3VyY2VzO1xuICAgIH1cblxuICAgIC8vIEFQSVxuICAgIHB1YmxpYyBhc3luYyBjcmVhdGVSdW5uYWJsZUNvbmZpZ3VyYXRpb24gKCk6IFByb21pc2U8UnVubmFibGVDb25maWd1cmF0aW9uPiB7XG4gICAgICAgIGNvbnN0IGlkICAgICAgICAgICAgICAgICAgPSBnZW5lcmF0ZVVuaXF1ZUlkKCk7XG4gICAgICAgIGNvbnN0IGNvbW1vbkNsaWVudFNjcmlwdHMgPSBhd2FpdCBsb2FkQ2xpZW50U2NyaXB0cyh0aGlzLmNsaWVudFNjcmlwdHMpO1xuXG4gICAgICAgIGlmIChhd2FpdCB0aGlzLl9jYW5Vc2VQYXJhbGxlbEJvb3RzdHJhcHBpbmcodGhpcy5icm93c2VycykpXG4gICAgICAgICAgICByZXR1cm4geyAuLi5hd2FpdCB0aGlzLl9ib290c3RyYXBQYXJhbGxlbCh0aGlzLmJyb3dzZXJzLCBpZCksIGNvbW1vbkNsaWVudFNjcmlwdHMsIGlkIH07XG5cbiAgICAgICAgcmV0dXJuIHsgLi4uYXdhaXQgdGhpcy5fYm9vdHN0cmFwU2VxdWVuY2UodGhpcy5icm93c2VycywgaWQpLCBjb21tb25DbGllbnRTY3JpcHRzLCBpZCB9O1xuICAgIH1cblxuICAgIHB1YmxpYyByZXN0b3JlTWVzc2FnZUJ1c0xpc3RlbmVycyAoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb25zID0gdGhpcy5icm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuZ2V0Q29ubmVjdGlvbnMoKTtcblxuICAgICAgICBPYmplY3QudmFsdWVzKGNvbm5lY3Rpb25zKS5mb3JFYWNoKGNvbm5lY3Rpb24gPT4ge1xuICAgICAgICAgICAgY29ubmVjdGlvbi5hc3NpZ25UZXN0UnVuU3RhcnRFdmVudExpc3RlbmVyKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==
@@ -112,4 +112,4 @@ class TestRunBookmark {
112
112
  }
113
113
  exports.default = TestRunBookmark;
114
114
  module.exports = exports.default;
115
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9va21hcmsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC1ydW4vYm9va21hcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4REFBK0M7QUFDL0MsMkNBQWtEO0FBQ2xELDZEQUF3RTtBQUV4RSxnREFNNEI7QUFFNUIsaURBQStGO0FBSS9GLG9FQUFzRTtBQUt0RSxNQUFxQixlQUFlO0lBWWhDLFlBQW9CLE9BQWdCLEVBQUUsSUFBVTtRQUM1QyxJQUFJLENBQUMsT0FBTyxHQUFXLE9BQU8sQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFjLElBQUksQ0FBQztRQUM1QixJQUFJLENBQUMsR0FBRyxHQUFlLHdDQUFrQixDQUFDO1FBQzFDLElBQUksQ0FBQyxHQUFHLEdBQWUsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxVQUFVLEdBQVEsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxhQUFhLEdBQUssSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxjQUFjLEdBQUksSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxLQUFLLEdBQWEsb0NBQW1CLENBQUM7UUFDM0MsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDO1FBQ3hELElBQUksQ0FBQyxjQUFjLEdBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQztRQUN6RCxJQUFJLENBQUMsS0FBSyxHQUFhLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQzFDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUM7UUFDcEQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQXlDLENBQUM7SUFDbEYs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LElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRW5FLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFFcEQsSUFBSSxDQUFDLFdBQVc7Z0JBQ1osTUFBTSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztTQUN6QztRQUNELE9BQU8sR0FBUSxFQUFFO1lBQ2IsR0FBRyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7WUFFeEIsTUFBTSxHQUFHLENBQUM7U0FDYjtRQUVELElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUIsQ0FBQztDQUNKO0FBMUlELGtDQTBJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBURVNUX1JVTl9QSEFTRSBmcm9tICcuLi90ZXN0LXJ1bi9waGFzZSc7XG5pbXBvcnQgeyBURVNUX1JVTl9FUlJPUlMgfSBmcm9tICcuLi9lcnJvcnMvdHlwZXMnO1xuaW1wb3J0IHsgU1BFQ0lBTF9CTEFOS19QQUdFLCBTdGF0ZVNuYXBzaG90IH0gZnJvbSAndGVzdGNhZmUtaGFtbWVyaGVhZCc7XG5cbmltcG9ydCB7XG4gICAgU3dpdGNoVG9NYWluV2luZG93Q29tbWFuZCxcbiAgICBTd2l0Y2hUb0lmcmFtZUNvbW1hbmQsXG4gICAgU2V0TmF0aXZlRGlhbG9nSGFuZGxlckNvbW1hbmQsXG4gICAgU2V0VGVzdFNwZWVkQ29tbWFuZCxcbiAgICBTZXRQYWdlTG9hZFRpbWVvdXRDb21tYW5kLFxufSBmcm9tICcuL2NvbW1hbmRzL2FjdGlvbnMnO1xuXG5pbXBvcnQgeyBDdXJyZW50SWZyYW1lTm90Rm91bmRFcnJvciwgQ3VycmVudElmcmFtZUlzTm90TG9hZGVkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvdGVzdC1ydW4nO1xuaW1wb3J0IFRlc3RSdW4gZnJvbSAnLi9pbmRleCc7XG5pbXBvcnQgeyBFeGVjdXRlQ2xpZW50RnVuY3Rpb25Db21tYW5kLCBFeGVjdXRlU2VsZWN0b3JDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9vYnNlcnZhdGlvbic7XG5pbXBvcnQgUm9sZSwgeyBSZWRpcmVjdFVybCB9IGZyb20gJy4uL3JvbGUvcm9sZSc7XG5pbXBvcnQgeyBERUZBVUxUX1NQRUVEX1ZBTFVFIH0gZnJvbSAnLi4vY29uZmlndXJhdGlvbi9kZWZhdWx0LXZhbHVlcyc7XG5pbXBvcnQgQnJvd3NlckNvbnNvbGVNZXNzYWdlcyBmcm9tICcuL2Jyb3dzZXItY29uc29sZS1tZXNzYWdlcyc7XG5pbXBvcnQgeyBDb21tYW5kQmFzZSB9IGZyb20gJy4vY29tbWFuZHMvYmFzZSc7XG5pbXBvcnQgeyBDYWxsc2l0ZVJlY29yZCB9IGZyb20gJ2NhbGxzaXRlLXJlY29yZCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlc3RSdW5Cb29rbWFyayB7XG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZXN0UnVuOiBUZXN0UnVuO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcm9sZTogUm9sZTtcbiAgICBwcml2YXRlIHVybDogc3RyaW5nO1xuICAgIHByaXZhdGUgY3R4OiBvYmplY3QgfCBudWxsO1xuICAgIHByaXZhdGUgZml4dHVyZUN0eDogb2JqZWN0IHwgbnVsbDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRpYWxvZ0hhbmRsZXI6IEV4ZWN1dGVDbGllbnRGdW5jdGlvbkNvbW1hbmQgfCBudWxsO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaWZyYW1lU2VsZWN0b3I6IEV4ZWN1dGVTZWxlY3RvckNvbW1hbmQgfCBudWxsO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3BlZWQ6IG51bWJlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhZ2VMb2FkVGltZW91dDogbnVtYmVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uc29sZU1lc3NhZ2VzOiBCcm93c2VyQ29uc29sZU1lc3NhZ2VzIHwgbnVsbDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAodGVzdFJ1bjogVGVzdFJ1biwgcm9sZTogUm9sZSkge1xuICAgICAgICB0aGlzLnRlc3RSdW4gICAgICAgICA9IHRlc3RSdW47XG4gICAgICAgIHRoaXMucm9sZSAgICAgICAgICAgID0gcm9sZTtcbiAgICAgICAgdGhpcy51cmwgICAgICAgICAgICAgPSBTUEVDSUFMX0JMQU5LX1BBR0U7XG4gICAgICAgIHRoaXMuY3R4ICAgICAgICAgICAgID0gbnVsbDtcbiAgICAgICAgdGhpcy5maXh0dXJlQ3R4ICAgICAgPSBudWxsO1xuICAgICAgICB0aGlzLmRpYWxvZ0hhbmRsZXIgICA9IG51bGw7XG4gICAgICAgIHRoaXMuaWZyYW1lU2VsZWN0b3IgID0gbnVsbDtcbiAgICAgICAgdGhpcy5zcGVlZCAgICAgICAgICAgPSBERUZBVUxUX1NQRUVEX1ZBTFVFO1xuICAgICAgICB0aGlzLnBhZ2VMb2FkVGltZW91dCA9IDA7XG4gICAgICAgIHRoaXMuY29uc29sZU1lc3NhZ2VzID0gbnVsbDtcbiAgICAgICAgdGhpcy5kaWFsb2dIYW5kbGVyICAgPSB0aGlzLnRlc3RSdW4uYWN0aXZlRGlhbG9nSGFuZGxlcjtcbiAgICAgICAgdGhpcy5pZnJhbWVTZWxlY3RvciAgPSB0aGlzLnRlc3RSdW4uYWN0aXZlSWZyYW1lU2VsZWN0b3I7XG4gICAgICAgIHRoaXMuc3BlZWQgICAgICAgICAgID0gdGhpcy50ZXN0UnVuLnNwZWVkO1xuICAgICAgICB0aGlzLnBhZ2VMb2FkVGltZW91dCA9IHRoaXMudGVzdFJ1bi5wYWdlTG9hZFRpbWVvdXQ7XG4gICAgICAgIHRoaXMuY29uc29sZU1lc3NhZ2VzID0gdGhpcy50ZXN0UnVuLmNvbnNvbGVNZXNzYWdlcyBhcyBCcm93c2VyQ29uc29sZU1lc3NhZ2VzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2luaXRDdHhzICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5jdHggICAgICAgID0gdGhpcy50ZXN0UnVuLmN0eDtcbiAgICAgICAgdGhpcy5maXh0dXJlQ3R4ID0gdGhpcy50ZXN0UnVuLmZpeHR1cmVDdHggYXMgb2JqZWN0O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3Jlc3RvcmVDdHhzICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy50ZXN0UnVuLmN0eCAgICAgICAgPSB0aGlzLmN0eCBhcyBvYmplY3Q7XG4gICAgICAgIHRoaXMudGVzdFJ1bi5maXh0dXJlQ3R4ID0gdGhpcy5maXh0dXJlQ3R4O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBpbml0ICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5faW5pdEN0eHMoKTtcblxuICAgICAgICBpZiAodGhpcy50ZXN0UnVuLmFjdGl2ZUlmcmFtZVNlbGVjdG9yKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy50ZXN0UnVuLmV4ZWN1dGVDb21tYW5kKG5ldyBTd2l0Y2hUb01haW5XaW5kb3dDb21tYW5kKCkgYXMgQ29tbWFuZEJhc2UpO1xuXG4gICAgICAgIGlmICghdGhpcy5yb2xlLm9wdHMucHJlc2VydmVVcmwpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJvbGUuc2V0Q3VycmVudFVybEFzUmVkaXJlY3RVcmwodGhpcy50ZXN0UnVuKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9yZXN0b3JlRGlhbG9nSGFuZGxlciAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnRlc3RSdW4uYWN0aXZlRGlhbG9nSGFuZGxlciAhPT0gdGhpcy5kaWFsb2dIYW5kbGVyKSB7XG4gICAgICAgICAgICBjb25zdCByZXN0b3JlRGlhbG9nQ29tbWFuZCA9IG5ldyBTZXROYXRpdmVEaWFsb2dIYW5kbGVyQ29tbWFuZCh7IGRpYWxvZ0hhbmRsZXI6IHsgZm46IHRoaXMuZGlhbG9nSGFuZGxlciB9IH0pO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnRlc3RSdW4uZXhlY3V0ZUNvbW1hbmQocmVzdG9yZURpYWxvZ0NvbW1hbmQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcmVzdG9yZVNwZWVkICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMudGVzdFJ1bi5zcGVlZCAhPT0gdGhpcy5zcGVlZCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdG9yZVNwZWVkQ29tbWFuZCA9IG5ldyBTZXRUZXN0U3BlZWRDb21tYW5kKHsgc3BlZWQ6IHRoaXMuc3BlZWQgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMudGVzdFJ1bi5leGVjdXRlQ29tbWFuZChyZXN0b3JlU3BlZWRDb21tYW5kKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3Jlc3RvcmVQYWdlTG9hZFRpbWVvdXQgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy50ZXN0UnVuLnBhZ2VMb2FkVGltZW91dCAhPT0gdGhpcy5wYWdlTG9hZFRpbWVvdXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3RvcmVQYWdlTG9hZFRpbWVvdXRDb21tYW5kID0gbmV3IFNldFBhZ2VMb2FkVGltZW91dENvbW1hbmQoeyBkdXJhdGlvbjogdGhpcy5wYWdlTG9hZFRpbWVvdXQgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMudGVzdFJ1bi5leGVjdXRlQ29tbWFuZChyZXN0b3JlUGFnZUxvYWRUaW1lb3V0Q29tbWFuZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9yZXN0b3JlV29ya2luZ0ZyYW1lICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMudGVzdFJ1bi5hY3RpdmVJZnJhbWVTZWxlY3RvciAhPT0gdGhpcy5pZnJhbWVTZWxlY3Rvcikge1xuICAgICAgICAgICAgY29uc3Qgc3dpdGNoV29ya2luZ0ZyYW1lQ29tbWFuZCA9IHRoaXMuaWZyYW1lU2VsZWN0b3IgP1xuICAgICAgICAgICAgICAgIG5ldyBTd2l0Y2hUb0lmcmFtZUNvbW1hbmQoeyBzZWxlY3RvcjogdGhpcy5pZnJhbWVTZWxlY3RvciB9KSA6XG4gICAgICAgICAgICAgICAgbmV3IFN3aXRjaFRvTWFpbldpbmRvd0NvbW1hbmQoKTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnRlc3RSdW4uZXhlY3V0ZUNvbW1hbmQoc3dpdGNoV29ya2luZ0ZyYW1lQ29tbWFuZCBhcyBDb21tYW5kQmFzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyLmNvZGUgPT09IFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25FbGVtZW50Tm90Rm91bmRFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEN1cnJlbnRJZnJhbWVOb3RGb3VuZEVycm9yKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZXJyLmNvZGUgPT09IFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25JZnJhbWVJc05vdExvYWRlZEVycm9yKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ3VycmVudElmcmFtZUlzTm90TG9hZGVkRXJyb3IoKTtcblxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3Jlc3RvcmVQYWdlICh1cmw6IHN0cmluZywgc3RhdGVTbmFwc2hvdDogU3RhdGVTbmFwc2hvdCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnRlc3RSdW4ubmF2aWdhdGVUb1VybCh1cmwsIHRydWUsIEpTT04uc3RyaW5naWZ5KHN0YXRlU25hcHNob3QpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRDb25zb2xlTWVzc2FnZXMgKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRlc3RSdW4uY29uc29sZU1lc3NhZ2VzID0gdGhpcy5jb25zb2xlTWVzc2FnZXMgYXMgQnJvd3NlckNvbnNvbGVNZXNzYWdlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRQaGFzZSAodmFsdWU6IFRFU1RfUlVOX1BIQVNFKTogdm9pZCB7XG4gICAgICAgIHRoaXMudGVzdFJ1bi5waGFzZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXN0b3JlIChjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQsIHN0YXRlU25hcHNob3Q6IFN0YXRlU25hcHNob3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcHJldlBoYXNlID0gYXdhaXQgdGhpcy50ZXN0UnVuLnBoYXNlO1xuXG4gICAgICAgIHRoaXMuX3NldFBoYXNlKFRFU1RfUlVOX1BIQVNFLmluQm9va21hcmtSZXN0b3JlKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fcmVzdG9yZUN0eHMoKTtcbiAgICAgICAgdGhpcy5fc2V0Q29uc29sZU1lc3NhZ2VzKCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3Jlc3RvcmVTcGVlZCgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fcmVzdG9yZVBhZ2VMb2FkVGltZW91dCgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fcmVzdG9yZURpYWxvZ0hhbmRsZXIoKTtcblxuICAgICAgICAgICAgY29uc3QgcHJlc2VydmVVcmwgPSB0aGlzLnJvbGUub3B0cy5wcmVzZXJ2ZVVybDtcblxuICAgICAgICAgICAgY29uc3QgcmVkaXJlY3RVcmwgPSBwcmVzZXJ2ZVVybFxuICAgICAgICAgICAgICAgID8gdGhpcy5yb2xlLnJlZGlyZWN0VXJsIGFzIHN0cmluZ1xuICAgICAgICAgICAgICAgIDogKHRoaXMucm9sZS5yZWRpcmVjdFVybCBhcyBSZWRpcmVjdFVybClbdGhpcy50ZXN0UnVuLnRlc3QuaWRdO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9yZXN0b3JlUGFnZShyZWRpcmVjdFVybCwgc3RhdGVTbmFwc2hvdCk7XG5cbiAgICAgICAgICAgIGlmICghcHJlc2VydmVVcmwpXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fcmVzdG9yZVdvcmtpbmdGcmFtZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgZXJyLmNhbGxzaXRlID0gY2FsbHNpdGU7XG5cbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3NldFBoYXNlKHByZXZQaGFzZSk7XG4gICAgfVxufVxuIl19
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9va21hcmsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC1ydW4vYm9va21hcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4REFBK0M7QUFDL0MsMkNBQWtEO0FBQ2xELDZEQUF3RTtBQUV4RSxnREFNNEI7QUFFNUIsaURBQStGO0FBSS9GLG9FQUFzRTtBQUt0RSxNQUFxQixlQUFlO0lBWWhDLFlBQW9CLE9BQWdCLEVBQUUsSUFBVTtRQUM1QyxJQUFJLENBQUMsT0FBTyxHQUFXLE9BQU8sQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFjLElBQUksQ0FBQztRQUM1QixJQUFJLENBQUMsR0FBRyxHQUFlLHdDQUFrQixDQUFDO1FBQzFDLElBQUksQ0FBQyxHQUFHLEdBQWUsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxVQUFVLEdBQVEsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxhQUFhLEdBQUssSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxjQUFjLEdBQUksSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxLQUFLLEdBQWEsb0NBQW1CLENBQUM7UUFDM0MsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDO1FBQ3hELElBQUksQ0FBQyxjQUFjLEdBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQztRQUN6RCxJQUFJLENBQUMsS0FBSyxHQUFhLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQzFDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUM7UUFDcEQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQXlDLENBQUM7SUFDbEYs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LElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRW5FLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFFcEQsSUFBSSxDQUFDLFdBQVc7Z0JBQ1osTUFBTSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztTQUN6QztRQUNELE9BQU8sR0FBUSxFQUFFO1lBQ2IsR0FBRyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7WUFFeEIsTUFBTSxHQUFHLENBQUM7U0FDYjtRQUVELElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUIsQ0FBQztDQUNKO0FBMUlELGtDQTBJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBURVNUX1JVTl9QSEFTRSBmcm9tICcuLi90ZXN0LXJ1bi9waGFzZSc7XG5pbXBvcnQgeyBURVNUX1JVTl9FUlJPUlMgfSBmcm9tICcuLi9lcnJvcnMvdHlwZXMnO1xuaW1wb3J0IHsgU1BFQ0lBTF9CTEFOS19QQUdFLCBTdGF0ZVNuYXBzaG90IH0gZnJvbSAndGVzdGNhZmUtaGFtbWVyaGVhZCc7XG5cbmltcG9ydCB7XG4gICAgU3dpdGNoVG9NYWluV2luZG93Q29tbWFuZCxcbiAgICBTd2l0Y2hUb0lmcmFtZUNvbW1hbmQsXG4gICAgU2V0TmF0aXZlRGlhbG9nSGFuZGxlckNvbW1hbmQsXG4gICAgU2V0VGVzdFNwZWVkQ29tbWFuZCxcbiAgICBTZXRQYWdlTG9hZFRpbWVvdXRDb21tYW5kLFxufSBmcm9tICcuL2NvbW1hbmRzL2FjdGlvbnMnO1xuXG5pbXBvcnQgeyBDdXJyZW50SWZyYW1lTm90Rm91bmRFcnJvciwgQ3VycmVudElmcmFtZUlzTm90TG9hZGVkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvdGVzdC1ydW4nO1xuaW1wb3J0IFRlc3RSdW4gZnJvbSAnLi9pbmRleCc7XG5pbXBvcnQgeyBFeGVjdXRlQ2xpZW50RnVuY3Rpb25Db21tYW5kLCBFeGVjdXRlU2VsZWN0b3JDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9vYnNlcnZhdGlvbic7XG5pbXBvcnQgUm9sZSwgeyBSZWRpcmVjdFVybCB9IGZyb20gJy4uL3JvbGUvcm9sZSc7XG5pbXBvcnQgeyBERUZBVUxUX1NQRUVEX1ZBTFVFIH0gZnJvbSAnLi4vY29uZmlndXJhdGlvbi9kZWZhdWx0LXZhbHVlcyc7XG5pbXBvcnQgQnJvd3NlckNvbnNvbGVNZXNzYWdlcyBmcm9tICcuL2Jyb3dzZXItY29uc29sZS1tZXNzYWdlcyc7XG5pbXBvcnQgeyBDb21tYW5kQmFzZSB9IGZyb20gJy4vY29tbWFuZHMvYmFzZSc7XG5pbXBvcnQgeyBDYWxsc2l0ZVJlY29yZCB9IGZyb20gJ0BkZXZleHByZXNzL2NhbGxzaXRlLXJlY29yZCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlc3RSdW5Cb29rbWFyayB7XG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZXN0UnVuOiBUZXN0UnVuO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcm9sZTogUm9sZTtcbiAgICBwcml2YXRlIHVybDogc3RyaW5nO1xuICAgIHByaXZhdGUgY3R4OiBvYmplY3QgfCBudWxsO1xuICAgIHByaXZhdGUgZml4dHVyZUN0eDogb2JqZWN0IHwgbnVsbDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRpYWxvZ0hhbmRsZXI6IEV4ZWN1dGVDbGllbnRGdW5jdGlvbkNvbW1hbmQgfCBudWxsO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaWZyYW1lU2VsZWN0b3I6IEV4ZWN1dGVTZWxlY3RvckNvbW1hbmQgfCBudWxsO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3BlZWQ6IG51bWJlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhZ2VMb2FkVGltZW91dDogbnVtYmVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uc29sZU1lc3NhZ2VzOiBCcm93c2VyQ29uc29sZU1lc3NhZ2VzIHwgbnVsbDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAodGVzdFJ1bjogVGVzdFJ1biwgcm9sZTogUm9sZSkge1xuICAgICAgICB0aGlzLnRlc3RSdW4gICAgICAgICA9IHRlc3RSdW47XG4gICAgICAgIHRoaXMucm9sZSAgICAgICAgICAgID0gcm9sZTtcbiAgICAgICAgdGhpcy51cmwgICAgICAgICAgICAgPSBTUEVDSUFMX0JMQU5LX1BBR0U7XG4gICAgICAgIHRoaXMuY3R4ICAgICAgICAgICAgID0gbnVsbDtcbiAgICAgICAgdGhpcy5maXh0dXJlQ3R4ICAgICAgPSBudWxsO1xuICAgICAgICB0aGlzLmRpYWxvZ0hhbmRsZXIgICA9IG51bGw7XG4gICAgICAgIHRoaXMuaWZyYW1lU2VsZWN0b3IgID0gbnVsbDtcbiAgICAgICAgdGhpcy5zcGVlZCAgICAgICAgICAgPSBERUZBVUxUX1NQRUVEX1ZBTFVFO1xuICAgICAgICB0aGlzLnBhZ2VMb2FkVGltZW91dCA9IDA7XG4gICAgICAgIHRoaXMuY29uc29sZU1lc3NhZ2VzID0gbnVsbDtcbiAgICAgICAgdGhpcy5kaWFsb2dIYW5kbGVyICAgPSB0aGlzLnRlc3RSdW4uYWN0aXZlRGlhbG9nSGFuZGxlcjtcbiAgICAgICAgdGhpcy5pZnJhbWVTZWxlY3RvciAgPSB0aGlzLnRlc3RSdW4uYWN0aXZlSWZyYW1lU2VsZWN0b3I7XG4gICAgICAgIHRoaXMuc3BlZWQgICAgICAgICAgID0gdGhpcy50ZXN0UnVuLnNwZWVkO1xuICAgICAgICB0aGlzLnBhZ2VMb2FkVGltZW91dCA9IHRoaXMudGVzdFJ1bi5wYWdlTG9hZFRpbWVvdXQ7XG4gICAgICAgIHRoaXMuY29uc29sZU1lc3NhZ2VzID0gdGhpcy50ZXN0UnVuLmNvbnNvbGVNZXNzYWdlcyBhcyBCcm93c2VyQ29uc29sZU1lc3NhZ2VzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2luaXRDdHhzICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5jdHggICAgICAgID0gdGhpcy50ZXN0UnVuLmN0eDtcbiAgICAgICAgdGhpcy5maXh0dXJlQ3R4ID0gdGhpcy50ZXN0UnVuLmZpeHR1cmVDdHggYXMgb2JqZWN0O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3Jlc3RvcmVDdHhzICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy50ZXN0UnVuLmN0eCAgICAgICAgPSB0aGlzLmN0eCBhcyBvYmplY3Q7XG4gICAgICAgIHRoaXMudGVzdFJ1bi5maXh0dXJlQ3R4ID0gdGhpcy5maXh0dXJlQ3R4O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBpbml0ICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5faW5pdEN0eHMoKTtcblxuICAgICAgICBpZiAodGhpcy50ZXN0UnVuLmFjdGl2ZUlmcmFtZVNlbGVjdG9yKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy50ZXN0UnVuLmV4ZWN1dGVDb21tYW5kKG5ldyBTd2l0Y2hUb01haW5XaW5kb3dDb21tYW5kKCkgYXMgQ29tbWFuZEJhc2UpO1xuXG4gICAgICAgIGlmICghdGhpcy5yb2xlLm9wdHMucHJlc2VydmVVcmwpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJvbGUuc2V0Q3VycmVudFVybEFzUmVkaXJlY3RVcmwodGhpcy50ZXN0UnVuKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9yZXN0b3JlRGlhbG9nSGFuZGxlciAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnRlc3RSdW4uYWN0aXZlRGlhbG9nSGFuZGxlciAhPT0gdGhpcy5kaWFsb2dIYW5kbGVyKSB7XG4gICAgICAgICAgICBjb25zdCByZXN0b3JlRGlhbG9nQ29tbWFuZCA9IG5ldyBTZXROYXRpdmVEaWFsb2dIYW5kbGVyQ29tbWFuZCh7IGRpYWxvZ0hhbmRsZXI6IHsgZm46IHRoaXMuZGlhbG9nSGFuZGxlciB9IH0pO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnRlc3RSdW4uZXhlY3V0ZUNvbW1hbmQocmVzdG9yZURpYWxvZ0NvbW1hbmQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcmVzdG9yZVNwZWVkICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMudGVzdFJ1bi5zcGVlZCAhPT0gdGhpcy5zcGVlZCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdG9yZVNwZWVkQ29tbWFuZCA9IG5ldyBTZXRUZXN0U3BlZWRDb21tYW5kKHsgc3BlZWQ6IHRoaXMuc3BlZWQgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMudGVzdFJ1bi5leGVjdXRlQ29tbWFuZChyZXN0b3JlU3BlZWRDb21tYW5kKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3Jlc3RvcmVQYWdlTG9hZFRpbWVvdXQgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy50ZXN0UnVuLnBhZ2VMb2FkVGltZW91dCAhPT0gdGhpcy5wYWdlTG9hZFRpbWVvdXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3RvcmVQYWdlTG9hZFRpbWVvdXRDb21tYW5kID0gbmV3IFNldFBhZ2VMb2FkVGltZW91dENvbW1hbmQoeyBkdXJhdGlvbjogdGhpcy5wYWdlTG9hZFRpbWVvdXQgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMudGVzdFJ1bi5leGVjdXRlQ29tbWFuZChyZXN0b3JlUGFnZUxvYWRUaW1lb3V0Q29tbWFuZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9yZXN0b3JlV29ya2luZ0ZyYW1lICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMudGVzdFJ1bi5hY3RpdmVJZnJhbWVTZWxlY3RvciAhPT0gdGhpcy5pZnJhbWVTZWxlY3Rvcikge1xuICAgICAgICAgICAgY29uc3Qgc3dpdGNoV29ya2luZ0ZyYW1lQ29tbWFuZCA9IHRoaXMuaWZyYW1lU2VsZWN0b3IgP1xuICAgICAgICAgICAgICAgIG5ldyBTd2l0Y2hUb0lmcmFtZUNvbW1hbmQoeyBzZWxlY3RvcjogdGhpcy5pZnJhbWVTZWxlY3RvciB9KSA6XG4gICAgICAgICAgICAgICAgbmV3IFN3aXRjaFRvTWFpbldpbmRvd0NvbW1hbmQoKTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnRlc3RSdW4uZXhlY3V0ZUNvbW1hbmQoc3dpdGNoV29ya2luZ0ZyYW1lQ29tbWFuZCBhcyBDb21tYW5kQmFzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyLmNvZGUgPT09IFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25FbGVtZW50Tm90Rm91bmRFcnJvcilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEN1cnJlbnRJZnJhbWVOb3RGb3VuZEVycm9yKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZXJyLmNvZGUgPT09IFRFU1RfUlVOX0VSUk9SUy5hY3Rpb25JZnJhbWVJc05vdExvYWRlZEVycm9yKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ3VycmVudElmcmFtZUlzTm90TG9hZGVkRXJyb3IoKTtcblxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3Jlc3RvcmVQYWdlICh1cmw6IHN0cmluZywgc3RhdGVTbmFwc2hvdDogU3RhdGVTbmFwc2hvdCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnRlc3RSdW4ubmF2aWdhdGVUb1VybCh1cmwsIHRydWUsIEpTT04uc3RyaW5naWZ5KHN0YXRlU25hcHNob3QpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRDb25zb2xlTWVzc2FnZXMgKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRlc3RSdW4uY29uc29sZU1lc3NhZ2VzID0gdGhpcy5jb25zb2xlTWVzc2FnZXMgYXMgQnJvd3NlckNvbnNvbGVNZXNzYWdlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRQaGFzZSAodmFsdWU6IFRFU1RfUlVOX1BIQVNFKTogdm9pZCB7XG4gICAgICAgIHRoaXMudGVzdFJ1bi5waGFzZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXN0b3JlIChjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQsIHN0YXRlU25hcHNob3Q6IFN0YXRlU25hcHNob3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcHJldlBoYXNlID0gYXdhaXQgdGhpcy50ZXN0UnVuLnBoYXNlO1xuXG4gICAgICAgIHRoaXMuX3NldFBoYXNlKFRFU1RfUlVOX1BIQVNFLmluQm9va21hcmtSZXN0b3JlKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fcmVzdG9yZUN0eHMoKTtcbiAgICAgICAgdGhpcy5fc2V0Q29uc29sZU1lc3NhZ2VzKCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3Jlc3RvcmVTcGVlZCgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fcmVzdG9yZVBhZ2VMb2FkVGltZW91dCgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fcmVzdG9yZURpYWxvZ0hhbmRsZXIoKTtcblxuICAgICAgICAgICAgY29uc3QgcHJlc2VydmVVcmwgPSB0aGlzLnJvbGUub3B0cy5wcmVzZXJ2ZVVybDtcblxuICAgICAgICAgICAgY29uc3QgcmVkaXJlY3RVcmwgPSBwcmVzZXJ2ZVVybFxuICAgICAgICAgICAgICAgID8gdGhpcy5yb2xlLnJlZGlyZWN0VXJsIGFzIHN0cmluZ1xuICAgICAgICAgICAgICAgIDogKHRoaXMucm9sZS5yZWRpcmVjdFVybCBhcyBSZWRpcmVjdFVybClbdGhpcy50ZXN0UnVuLnRlc3QuaWRdO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9yZXN0b3JlUGFnZShyZWRpcmVjdFVybCwgc3RhdGVTbmFwc2hvdCk7XG5cbiAgICAgICAgICAgIGlmICghcHJlc2VydmVVcmwpXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fcmVzdG9yZVdvcmtpbmdGcmFtZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgZXJyLmNhbGxzaXRlID0gY2FsbHNpdGU7XG5cbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3NldFBoYXNlKHByZXZQaGFzZSk7XG4gICAgfVxufVxuIl19