system-testing 1.0.110 → 1.0.112
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.
- package/README.md +13 -1
- package/build/browser.d.ts +35 -0
- package/build/browser.js +36 -5
- package/build/drivers/appium-driver.d.ts +106 -0
- package/build/drivers/appium-driver.js +292 -3
- package/build/drivers/webdriver-driver.d.ts +23 -0
- package/build/drivers/webdriver-driver.js +37 -2
- package/build/system-test-browser-helper.js +2 -2
- package/build/system-test.d.ts +12 -1
- package/build/system-test.js +37 -3
- package/package.json +1 -1
|
@@ -88,6 +88,7 @@ function shouldIgnoreBrowserLogEntry(entry, message) {
|
|
|
88
88
|
* @property {boolean | null} [visible] Whether to require elements to be visible (`true`) or hidden (`false`). Use `null` to disable visibility filtering.
|
|
89
89
|
* @property {"actions" | "js"} [method] Override the click path. `"actions"` uses the Selenium Actions API (real pointer move + click); `"js"` dispatches `element.click()` via `executeScript` inside the page's JS context (skips WebDriver's pointer synthesis entirely — useful when the default click is dropped by a framework responder that refuses synthetic WebDriver pointer events).
|
|
90
90
|
* @property {boolean} [scrollTo] Whether to scroll found elements into view before returning them.
|
|
91
|
+
* @property {string[]} [scrollContainerTestIDs] Native test IDs that should be tried as scroll containers before falling back to viewport gestures.
|
|
91
92
|
* @property {boolean} [useBaseSelector] Whether to scope by the base selector.
|
|
92
93
|
*/
|
|
93
94
|
/**
|
|
@@ -376,7 +377,8 @@ export default class WebDriverDriver {
|
|
|
376
377
|
* @returns {Promise<import("selenium-webdriver").WebElement[]>}
|
|
377
378
|
*/
|
|
378
379
|
async all(selector, args = {}) {
|
|
379
|
-
const { scrollTo = false, visible = true, timeout, useBaseSelector = true, ...restArgs } = args;
|
|
380
|
+
const { scrollContainerTestIDs, scrollTo = false, visible = true, timeout, useBaseSelector = true, ...restArgs } = args;
|
|
381
|
+
void scrollContainerTestIDs;
|
|
380
382
|
const restArgsKeys = Object.keys(restArgs);
|
|
381
383
|
let actualTimeout;
|
|
382
384
|
if (timeout === undefined) {
|
|
@@ -444,6 +446,21 @@ export default class WebDriverDriver {
|
|
|
444
446
|
}
|
|
445
447
|
return elements;
|
|
446
448
|
}
|
|
449
|
+
/**
|
|
450
|
+
* @param {string} selector
|
|
451
|
+
* @param {FindArgs} [args]
|
|
452
|
+
* @returns {Promise<boolean>}
|
|
453
|
+
*/
|
|
454
|
+
async exists(selector, args = {}) {
|
|
455
|
+
try {
|
|
456
|
+
return (await this.all(selector, args)).length > 0;
|
|
457
|
+
}
|
|
458
|
+
catch (error) {
|
|
459
|
+
if (isElementLookupTimeoutError(error))
|
|
460
|
+
return false;
|
|
461
|
+
throw error;
|
|
462
|
+
}
|
|
463
|
+
}
|
|
447
464
|
/**
|
|
448
465
|
* Finds a single element by CSS selector
|
|
449
466
|
* @param {string} selector
|
|
@@ -472,6 +489,14 @@ export default class WebDriverDriver {
|
|
|
472
489
|
}
|
|
473
490
|
return elements[0];
|
|
474
491
|
}
|
|
492
|
+
/**
|
|
493
|
+
* @param {string} selector
|
|
494
|
+
* @param {FindArgs} [args]
|
|
495
|
+
* @returns {Promise<string>}
|
|
496
|
+
*/
|
|
497
|
+
async text(selector, args = {}) {
|
|
498
|
+
return await (await this.find(selector, args)).getText();
|
|
499
|
+
}
|
|
475
500
|
/**
|
|
476
501
|
* Finds a single element by test ID
|
|
477
502
|
* @param {string} testID
|
|
@@ -481,6 +506,16 @@ export default class WebDriverDriver {
|
|
|
481
506
|
async findByTestID(testID, args) {
|
|
482
507
|
return await this.find(`[data-testid='${testID}']`, args);
|
|
483
508
|
}
|
|
509
|
+
/**
|
|
510
|
+
* Finds native Android visible text or an accessibility label.
|
|
511
|
+
* @param {string} expectedText Text to locate.
|
|
512
|
+
* @param {FindArgs} [args] Optional lookup settings.
|
|
513
|
+
* @returns {Promise<import("selenium-webdriver").WebElement>} Matching native element.
|
|
514
|
+
*/
|
|
515
|
+
async findByNativeText(expectedText, args = {}) {
|
|
516
|
+
void args;
|
|
517
|
+
throw new Error(`findByNativeText is only supported for native Appium sessions: ${expectedText}`);
|
|
518
|
+
}
|
|
484
519
|
/**
|
|
485
520
|
* Checks whether an element with the given test ID is currently rendered.
|
|
486
521
|
* @param {string} testID
|
|
@@ -921,4 +956,4 @@ export default class WebDriverDriver {
|
|
|
921
956
|
}
|
|
922
957
|
}
|
|
923
958
|
}
|
|
924
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViZHJpdmVyLWRyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kcml2ZXJzL3dlYmRyaXZlci1kcml2ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLEVBQUUsRUFBRSxLQUFLLElBQUksYUFBYSxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDN0QsT0FBTyxPQUFPLE1BQU0sbUNBQW1DLENBQUE7QUFDdkQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFVBQVUsQ0FBQTtBQUM3QixPQUFPLE9BQU8sTUFBTSwyQkFBMkIsQ0FBQTtBQUUvQzs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsT0FBTyxFQUFFLEtBQUs7SUFDcEMsTUFBTSxLQUFLLEdBQUcsdUNBQXVDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO0lBQzFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO0lBQ25CLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsa0JBQWtCLENBQUMsT0FBTztJQUNqQyxPQUFPLE9BQU8sQ0FDWixPQUFPO1FBQ1AsT0FBTyxPQUFPLEtBQUssUUFBUTtRQUMzQixPQUFPLElBQUksT0FBTztRQUNsQixPQUFPLE9BQU8sQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUNwQyxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsWUFBWSxDQUFDLEtBQUs7SUFDekIsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7UUFDM0IsT0FBTyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQTtJQUMvQixDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsNkJBQTZCLENBQUMsS0FBSztJQUMxQyxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUE7SUFFeEIsT0FBTyxZQUFZ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QUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksS0FBSyxZQUFZLGNBQWMsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLGNBQWMsQ0FBQyxZQUFZLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUNyRixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxLQUFLLENBQUE7WUFDYixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QnksIGVycm9yIGFzIFNlbGVuaXVtRXJyb3J9IGZyb20gXCJzZWxlbml1bS13ZWJkcml2ZXJcIlxuaW1wb3J0IGxvZ2dpbmcgZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlci9saWIvbG9nZ2luZy5qc1wiXG5pbXBvcnQge3dhaXR9IGZyb20gXCJhd2FpdGVyeVwiXG5pbXBvcnQgdGltZW91dCBmcm9tIFwiYXdhaXRlcnkvYnVpbGQvdGltZW91dC5qc1wiXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2F1c2VcbiAqIEByZXR1cm5zIHtFcnJvciAmIHtjYXVzZTogdW5rbm93bn19XG4gKi9cbmZ1bmN0aW9uIGVycm9yV2l0aENhdXNlKG1lc3NhZ2UsIGNhdXNlKSB7XG4gIGNvbnN0IGVycm9yID0gLyoqIEB0eXBlIHtFcnJvciAmIHtjYXVzZTogdW5rbm93bn19ICovIChuZXcgRXJyb3IobWVzc2FnZSkpXG4gIGVycm9yLmNhdXNlID0gY2F1c2VcbiAgcmV0dXJuIGVycm9yXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBlbGVtZW50XG4gKiBAcmV0dXJucyB7ZWxlbWVudCBpcyBpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH1cbiAqL1xuZnVuY3Rpb24gaXNXZWJEcml2ZXJFbGVtZW50KGVsZW1lbnQpIHtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgZWxlbWVudCAmJlxuICAgIHR5cGVvZiBlbGVtZW50ID09PSBcIm9iamVjdFwiICYmXG4gICAgXCJnZXRJZFwiIGluIGVsZW1lbnQgJiZcbiAgICB0eXBlb2YgZWxlbWVudC5nZXRJZCA9PT0gXCJmdW5jdGlvblwiXG4gIClcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGVycm9yXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBnZXRFcnJvck5hbWUoZXJyb3IpIHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gZXJyb3IuY29uc3RydWN0b3IubmFtZVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3JcbiAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIGdldFJldHJ5YWJsZUludGVyYWN0RXJyb3JOYW1lKGVycm9yKSB7XG4gIGxldCBjdXJyZW50RXJyb3IgPSBlcnJvclxuXG4gIHdoaWxlIChjdXJyZW50RXJyb3IpIHtcbiAgICBjb25zdCBlcnJvck5hbWUgPSBnZXRFcnJvck5hbWUoY3VycmVudEVycm9yKVxuXG4gICAgaWYgKGVycm9yTmFtZSA9PT0gXCJFbGVtZW50Tm90SW50ZXJhY3RhYmxlRXJyb3JcIiB8fCBlcnJvck5hbWUgPT09IFwiRWxlbWVudENsaWNrSW50ZXJjZXB0ZWRFcnJvclwiIHx8IGVycm9yTmFtZSA9PT0gXCJTdGFsZUVsZW1lbnRSZWZlcmVuY2VFcnJvclwiKSB7XG4gICAgICByZXR1cm4gZXJyb3JOYW1lXG4gICAgfVxuXG4gICAgaWYgKCEoY3VycmVudEVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHx8ICEoXCJjYXVzZVwiIGluIGN1cnJlbnRFcnJvcikpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBjdXJyZW50RXJyb3IgPSBjdXJyZW50RXJyb3IuY2F1c2VcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBAcGFyYW0gey4uLmFueX0gYXJnc1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZ2V0U2VuZEtleXNUZXh0QXBwZW5kKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3NcbiAgICAubWFwKChhcmcpID0+IHtcbiAgICAgIGNvbnN0IHN0cmluZ0FyZyA9IFN0cmluZyhhcmcpXG5cbiAgICAgIGlmICgvW1xcdUUwMDlcXHVFMDNEXWFcXHVFMDAwL2kudGVzdChzdHJpbmdBcmcpKSB7XG4gICAgICAgIHJldHVybiBcIlwiXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdHJpbmdBcmcucmVwbGFjZSgvW1xcdUUwMDAtXFx1RjhGRl0vZywgXCJcIilcbiAgICB9KVxuICAgIC5qb2luKFwiXCIpXG59XG5cbi8qKlxuICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBnZXRTZW5kS2V5c1VzZXNTZWxlY3RBbGxBbmREZWxldGUoLi4uYXJncykge1xuICByZXR1cm4gYXJncy5zb21lKChhcmcpID0+IC9bXFx1RTAwOVxcdUUwM0RdYVxcdUUwMDAvaS50ZXN0KFN0cmluZyhhcmcpKSkgJiZcbiAgICBhcmdzLnNvbWUoKGFyZykgPT4gU3RyaW5nKGFyZykuaW5jbHVkZXMoXCJcXHVFMDAzXCIpIHx8IFN0cmluZyhhcmcpLmluY2x1ZGVzKFwiXFx1RTAxN1wiKSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3tsZXZlbDoge25hbWU6IHN0cmluZ30sIG1lc3NhZ2U6IHN0cmluZ319IGVudHJ5XG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHNob3VsZElnbm9yZUJyb3dzZXJMb2dFbnRyeShlbnRyeSwgbWVzc2FnZSkge1xuICByZXR1cm4gZW50cnkubGV2ZWwubmFtZSA9PT0gXCJERUJVR1wiICYmXG4gICAgLyg/Ol58XFxzLVxccylcXFtET01cXF0gUGFzc3dvcmQgZmllbGQgaXMgbm90IGNvbnRhaW5lZCBpbiBhIGZvcm06L2kudGVzdChtZXNzYWdlKVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZpbmRBcmdzXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdIE92ZXJyaWRlIHRpbWVvdXQgZm9yIGxvb2t1cC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbiB8IG51bGx9IFt2aXNpYmxlXSBXaGV0aGVyIHRvIHJlcXVpcmUgZWxlbWVudHMgdG8gYmUgdmlzaWJsZSAoYHRydWVgKSBvciBoaWRkZW4gKGBmYWxzZWApLiBVc2UgYG51bGxgIHRvIGRpc2FibGUgdmlzaWJpbGl0eSBmaWx0ZXJpbmcuXG4gKiBAcHJvcGVydHkge1wiYWN0aW9uc1wiIHwgXCJqc1wifSBbbWV0aG9kXSBPdmVycmlkZSB0aGUgY2xpY2sgcGF0aC4gYFwiYWN0aW9uc1wiYCB1c2VzIHRoZSBTZWxlbml1bSBBY3Rpb25zIEFQSSAocmVhbCBwb2ludGVyIG1vdmUgKyBjbGljayk7IGBcImpzXCJgIGRpc3BhdGNoZXMgYGVsZW1lbnQuY2xpY2soKWAgdmlhIGBleGVjdXRlU2NyaXB0YCBpbnNpZGUgdGhlIHBhZ2UncyBKUyBjb250ZXh0IChza2lwcyBXZWJEcml2ZXIncyBwb2ludGVyIHN5bnRoZXNpcyBlbnRpcmVseSDigJQgdXNlZnVsIHdoZW4gdGhlIGRlZmF1bHQgY2xpY2sgaXMgZHJvcHBlZCBieSBhIGZyYW1ld29yayByZXNwb25kZXIgdGhhdCByZWZ1c2VzIHN5bnRoZXRpYyBXZWJEcml2ZXIgcG9pbnRlciBldmVudHMpLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2Nyb2xsVG9dIFdoZXRoZXIgdG8gc2Nyb2xsIGZvdW5kIGVsZW1lbnRzIGludG8gdmlldyBiZWZvcmUgcmV0dXJuaW5nIHRoZW0uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1c2VCYXNlU2VsZWN0b3JdIFdoZXRoZXIgdG8gc2NvcGUgYnkgdGhlIGJhc2Ugc2VsZWN0b3IuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge0ZpbmRBcmdzICYge3dpdGhGYWxsYmFjaz86IGJvb2xlYW59fSBJbnRlcmFjdEFyZ3NcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBXYWl0Rm9yTm9TZWxlY3RvckFyZ3NcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3VzZUJhc2VTZWxlY3Rvcl0gV2hldGhlciB0byBzY29wZSBieSB0aGUgYmFzZSBzZWxlY3Rvci5cbiAqL1xuXG5jbGFzcyBFbGVtZW50Tm90Rm91bmRFcnJvciBleHRlbmRzIEVycm9yIHsgfVxuY29uc3Qge1dlYkRyaXZlckVycm9yfSA9IFNlbGVuaXVtRXJyb3JcblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWR9IGFyZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBoYXNPd25BcmcoYXJncywga2V5KSB7XG4gIHJldHVybiBCb29sZWFuKGFyZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFyZ3MsIGtleSkpXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBlcnJvclxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzRWxlbWVudE5vdEZvdW5kRXJyb3IoZXJyb3IpIHtcbiAgbGV0IGN1cnJlbnRFcnJvciA9IGVycm9yXG5cbiAgd2hpbGUgKGN1cnJlbnRFcnJvcikge1xuICAgIGlmIChjdXJyZW50RXJyb3IgaW5zdGFuY2VvZiBFbGVtZW50Tm90Rm91bmRFcnJvcikgcmV0dXJuIHRydWVcblxuICAgIGlmICghKGN1cnJlbnRFcnJvciBpbnN0YW5jZW9mIEVycm9yKSB8fCAhKFwiY2F1c2VcIiBpbiBjdXJyZW50RXJyb3IpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjdXJyZW50RXJyb3IgPSBjdXJyZW50RXJyb3IuY2F1c2VcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3JcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0VsZW1lbnRMb29rdXBUaW1lb3V0RXJyb3IoZXJyb3IpIHtcbiAgbGV0IGN1cnJlbnRFcnJvciA9IGVycm9yXG5cbiAgd2hpbGUgKGN1cnJlbnRFcnJvcikge1xuICAgIGlmIChjdXJyZW50RXJyb3IgaW5zdGFuY2VvZiBTZWxlbml1bUVycm9yLlRpbWVvdXRFcnJvcikgcmV0dXJuIHRydWVcblxuICAgIGlmICghKGN1cnJlbnRFcnJvciBpbnN0YW5jZW9mIEVycm9yKSB8fCAhKFwiY2F1c2VcIiBpbiBjdXJyZW50RXJyb3IpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjdXJyZW50RXJyb3IgPSBjdXJyZW50RXJyb3IuY2F1c2VcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3JcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0VsZW1lbnRVbmF2YWlsYWJsZUZvclNjcm9sbEVycm9yKGVycm9yKSB7XG4gIHJldHVybiBpc0VsZW1lbnROb3RGb3VuZEVycm9yKGVycm9yKSB8fCBpc0VsZW1lbnRMb29rdXBUaW1lb3V0RXJyb3IoZXJyb3IpXG59XG5cbi8qKlxuICogQmFzZSBkcml2ZXIgdXNpbmcgc2VsZW5pdW0td2ViZHJpdmVyIHNlc3Npb25zLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXZWJEcml2ZXJEcml2ZXIge1xuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9icm93c2VyLmpzXCIpLmRlZmF1bHR9IGFyZ3MuYnJvd3NlclxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFthcmdzLm9wdGlvbnNdXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7YnJvd3Nlciwgb3B0aW9ucyA9IHt9fSkge1xuICAgIHRoaXMuYnJvd3NlciA9IGJyb3dzZXJcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gICAgdGhpcy5iYXNlVXJsID0gdW5kZWZpbmVkXG4gICAgdGhpcy53ZWJEcml2ZXIgPSB1bmRlZmluZWRcbiAgICB0aGlzLl9kcml2ZXJUaW1lb3V0cyA9IDUwMDBcbiAgICB0aGlzLl90aW1lb3V0cyA9IDUwMDBcbiAgICAvKipcbiAgICAgKiBQcm9jZXNzLWV4aXQgaGFuZGxlcnMgaW5zdGFsbGVkIHdoaWxlIGEgV2ViRHJpdmVyIHNlc3Npb24gaXMgYWxpdmUuXG4gICAgICogUmV0YWluZWQgc28gYHN0b3AoKWAgY2FuIGRlcmVnaXN0ZXIgdGhlbSBiZWZvcmUgcmVtb3ZpbmcgdGhlXG4gICAgICogV2ViRHJpdmVyIHJlZmVyZW5jZS5cbiAgICAgKiBAdHlwZSB7e3NpZ2ludDogKCkgPT4gdm9pZCwgc2lndGVybTogKCkgPT4gdm9pZCwgYmVmb3JlRXhpdDogKCkgPT4gdm9pZH0gfCBudWxsfVxuICAgICAqL1xuICAgIHRoaXMuX2V4aXRIYW5kbGVycyA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVybFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNldEJhc2VVcmwoYmFzZVVybCkge1xuICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmxcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBnZXRCYXNlVXJsKCkge1xuICAgIGlmICghdGhpcy5iYXNlVXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEcml2ZXIgYmFzZSBVUkwgaGFzIG5vdCBiZWVuIHNldFwiKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJhc2VVcmxcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7bnVtYmVyfSAqL1xuICBnZXRUaW1lb3V0cygpIHsgcmV0dXJuIHRoaXMuX3RpbWVvdXRzIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJEcml2ZXJ9XG4gICAqL1xuICBnZXRXZWJEcml2ZXIoKSB7XG4gICAgaWYgKCF0aGlzLndlYkRyaXZlcikgdGhyb3cgbmV3IEVycm9yKFwiRHJpdmVyIGhhc24ndCBiZWVuIGluaXRpYWxpemVkIHlldFwiKVxuICAgIHRoaXMuYnJvd3Nlci50aHJvd0lmSHR0cFNlcnZlckVycm9yKClcblxuICAgIHJldHVybiB0aGlzLndlYkRyaXZlclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkRyaXZlcn0gd2ViRHJpdmVyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0V2ViRHJpdmVyKHdlYkRyaXZlcikge1xuICAgIHRoaXMud2ViRHJpdmVyID0gd2ViRHJpdmVyXG4gICAgdGhpcy5icm93c2VyLmRyaXZlciA9IHdlYkRyaXZlclxuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGxzIHByb2Nlc3MtbGV2ZWwgaGFuZGxlcnMgdGhhdCB0ZXJtaW5hdGUgdGhlIFdlYkRyaXZlciBzZXNzaW9uXG4gICAqIGlmIHRoZSBOb2RlIHByb2Nlc3MgZXhpdHMgd2l0aG91dCBhbiBleHBsaWNpdCBgc3RvcCgpYCBjYWxsLiBXaXRob3V0XG4gICAqIHRoaXMsIHRoZSBjaHJvbWVkcml2ZXItc3Bhd25lZCBDaHJvbWUgaXMgb3JwaGFuZWQgdG8gaW5pdCAoUFBJRD0xKVxuICAgKiB3aGVuIHRoZSB0ZXN0IHJ1bm5lciBleGl0cyDigJQgZWFjaCBgbnB4IHZlbG9jaW91cyB0ZXN0YCBydW4gdGhhdFxuICAgKiBza2lwcyBleHBsaWNpdCBjbGVhbnVwIGxlYXZlcyBhIENocm9tZSBwbHVzIHRob3VzYW5kcyBvZlxuICAgKiBgL3RtcC9vcmcuY2hyb21pdW0uQ2hyb21pdW0uc2NvcGVkX2Rpci4qYCBiZWhpbmQuIERyaXZlciBzdWJjbGFzc1xuICAgKiBgc3RhcnQoKWAgaW1wbGVtZW50YXRpb25zIG11c3QgY2FsbCB0aGlzIGFmdGVyIHNldHRpbmcgdGhlXG4gICAqIFdlYkRyaXZlciBvbiBhIGZyZXNoIHNlc3Npb247IHRlc3RzIHRoYXQgc3R1YiBgc2V0V2ViRHJpdmVyYFxuICAgKiBkaXJlY3RseSBkZWxpYmVyYXRlbHkgYnlwYXNzIGl0LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGluc3RhbGxFeGl0SGFuZGxlcnMoKSB7XG4gICAgaWYgKHRoaXMuX2V4aXRIYW5kbGVycykgcmV0dXJuXG4gICAgY29uc3Qgc2lnaW50ID0gKCkgPT4geyB2b2lkIHRoaXMuX29uRXhpdFNpZ25hbChcIlNJR0lOVFwiKSB9XG4gICAgY29uc3Qgc2lndGVybSA9ICgpID0+IHsgdm9pZCB0aGlzLl9vbkV4aXRTaWduYWwoXCJTSUdURVJNXCIpIH1cbiAgICBjb25zdCBiZWZvcmVFeGl0ID0gKCkgPT4geyB2b2lkIHRoaXMuX29uRXhpdFNpZ25hbChcImJlZm9yZUV4aXRcIikgfVxuICAgIHByb2Nlc3Mub25jZShcIlNJR0lOVFwiLCBzaWdpbnQpXG4gICAgcHJvY2Vzcy5vbmNlKFwiU0lHVEVSTVwiLCBzaWd0ZXJtKVxuICAgIHByb2Nlc3Mub25jZShcImJlZm9yZUV4aXRcIiwgYmVmb3JlRXhpdClcbiAgICB0aGlzLl9leGl0SGFuZGxlcnMgPSB7c2lnaW50LCBzaWd0ZXJtLCBiZWZvcmVFeGl0fVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBfcmVtb3ZlRXhpdEhhbmRsZXJzKCkge1xuICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5fZXhpdEhhbmRsZXJzXG4gICAgaWYgKCFoYW5kbGVycykgcmV0dXJuXG4gICAgdGhpcy5fZXhpdEhhbmRsZXJzID0gbnVsbFxuICAgIHByb2Nlc3Mub2ZmKFwiU0lHSU5UXCIsIGhhbmRsZXJzLnNpZ2ludClcbiAgICBwcm9jZXNzLm9mZihcIlNJR1RFUk1cIiwgaGFuZGxlcnMuc2lndGVybSlcbiAgICBwcm9jZXNzLm9mZihcImJlZm9yZUV4aXRcIiwgaGFuZGxlcnMuYmVmb3JlRXhpdClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1wiU0lHSU5UXCIgfCBcIlNJR1RFUk1cIiB8IFwiYmVmb3JlRXhpdFwifSBzaWduYWxcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfb25FeGl0U2lnbmFsKHNpZ25hbCkge1xuICAgIHRoaXMuX3JlbW92ZUV4aXRIYW5kbGVycygpXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc3RvcCgpXG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBCZXN0LWVmZm9ydCDigJQgdGhlIHByb2Nlc3MgaXMgZ29pbmcgZG93biBhbnl3YXksIGFuZCB3ZSdkIHJhdGhlclxuICAgICAgLy8gb3JwaGFuIGEgYnJvd3NlciB0aGFuIHRocm93IGZyb20gYSBzaWduYWwgaGFuZGxlci5cbiAgICB9XG4gICAgLy8gUHJlc2VydmUgdGhlIGNvbnZlbnRpb25hbCBzaWduYWwtZXhpdCBzdGF0dXMgKDEyOCArIHNpZ25hbCBudW1iZXIpXG4gICAgLy8gc28gQ0kgLyB3cmFwcGVyIHNjcmlwdHMgY2FuIHN0aWxsIHRlbGwgaW50ZXJydXB0ZWQgcnVucyBhcGFydFxuICAgIC8vIGZyb20gYSBjbGVhbiBwYXNzLiBQbGFpbiBgcHJvY2Vzcy5leGl0KDApYCB3b3VsZCBtaXNyZXBvcnQgYVxuICAgIC8vIGNhbmNlbGxlZCBydW4gYXMgc3VjY2Vzc2Z1bC5cbiAgICBpZiAoc2lnbmFsID09PSBcIlNJR0lOVFwiKSBwcm9jZXNzLmV4aXQoMTMwKVxuICAgIGlmIChzaWduYWwgPT09IFwiU0lHVEVSTVwiKSBwcm9jZXNzLmV4aXQoMTQzKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwic3RhcnQoKSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkcml2ZXJcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgdGhpcy5fcmVtb3ZlRXhpdEhhbmRsZXJzKClcbiAgICBpZiAodGhpcy53ZWJEcml2ZXIpIHtcbiAgICAgIGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IHRoaXMuZ2V0VGltZW91dHMoKSwgZXJyb3JNZXNzYWdlOiBcInRpbWVvdXQgd2hpbGUgcXVpdHRpbmcgV2ViRHJpdmVyXCJ9LCBhc3luYyAoKSA9PiBhd2FpdCAvKiogQHR5cGUge05vbk51bGxhYmxlPHR5cGVvZiB0aGlzLndlYkRyaXZlcj59ICovICh0aGlzLndlYkRyaXZlcikucXVpdCgpKVxuICAgIH1cblxuICAgIHRoaXMud2ViRHJpdmVyID0gdW5kZWZpbmVkXG4gICAgdGhpcy5icm93c2VyLmRyaXZlciA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuZXdUaW1lb3V0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZHJpdmVyU2V0VGltZW91dHMobmV3VGltZW91dCkge1xuICAgIHRoaXMuX2RyaXZlclRpbWVvdXRzID0gbmV3VGltZW91dFxuICAgIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkubWFuYWdlKCkuc2V0VGltZW91dHMoe2ltcGxpY2l0OiBuZXdUaW1lb3V0fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlc3RvcmVUaW1lb3V0cygpIHtcbiAgICBpZiAoIXRoaXMuZ2V0VGltZW91dHMoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGltZW91dHMgaGF2ZW4ndCBwcmV2aW91c2x5IGJlZW4gc2V0XCIpXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5kcml2ZXJTZXRUaW1lb3V0cyh0aGlzLmdldFRpbWVvdXRzKCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IG5ld1RpbWVvdXRcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzZXRUaW1lb3V0cyhuZXdUaW1lb3V0KSB7XG4gICAgdGhpcy5fdGltZW91dHMgPSBuZXdUaW1lb3V0XG4gICAgYXdhaXQgdGhpcy5yZXN0b3JlVGltZW91dHMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0U2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy5icm93c2VyLmdldFNlbGVjdG9yKHNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZHJpdmVyVmlzaXQocGF0aCkge1xuICAgIGNvbnN0IGlzQWJzb2x1dGVVcmwgPSAvXlthLXpdKzpcXC9cXC8vaS50ZXN0KHBhdGgpXG4gICAgY29uc3QgdXJsID0gaXNBYnNvbHV0ZVVybCA/IHBhdGggOiBgJHt0aGlzLmdldEJhc2VVcmwoKX0ke3BhdGh9YFxuXG4gICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5nZXQodXJsKVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYWxsIGNvb2tpZXMgZm9yIHRoZSBjdXJyZW50IGJyb3dzZXIgc2Vzc2lvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkZWxldGVBbGxDb29raWVzKCkge1xuICAgIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkubWFuYWdlKCkuZGVsZXRlQWxsQ29va2llcygpXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gKi9cbiAgYXN5bmMgZ2V0Q3VycmVudFVybCgpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZ2V0Q3VycmVudFVybCgpXG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gXCJcIlxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAqL1xuICBhc3luYyBnZXRIVE1MKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmdldFBhZ2VTb3VyY2UoKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59ICovXG4gIGFzeW5jIHRha2VTY3JlZW5zaG90KCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLnRha2VTY3JlZW5zaG90KClcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGJyb3dzZXIgbG9nc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59XG4gICAqL1xuICBhc3luYyBnZXRCcm93c2VyTG9ncygpIHtcbiAgICBsZXQgZW50cmllc1xuXG4gICAgdHJ5IHtcbiAgICAgIGVudHJpZXMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLm1hbmFnZSgpLmxvZ3MoKS5nZXQobG9nZ2luZy5UeXBlLkJST1dTRVIpXG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gICAgY29uc3QgYnJvd3NlckxvZ3MgPSBbXVxuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtZXNzYWdlTWF0Y2ggPSBlbnRyeS5tZXNzYWdlLm1hdGNoKC9eKC4rKSAoXFxkKyk6KFxcZCspICguKykkLylcbiAgICAgIGxldCBtZXNzYWdlXG5cbiAgICAgIGlmIChtZXNzYWdlTWF0Y2gpIHtcbiAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VNYXRjaFs0XVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWVzc2FnZSA9IGVudHJ5Lm1lc3NhZ2VcbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZElnbm9yZUJyb3dzZXJMb2dFbnRyeShlbnRyeSwgbWVzc2FnZSkpIGNvbnRpbnVlXG5cbiAgICAgIGJyb3dzZXJMb2dzLnB1c2goYCR7ZW50cnkubGV2ZWwubmFtZX06ICR7bWVzc2FnZX1gKVxuICAgIH1cblxuICAgIHJldHVybiBicm93c2VyTG9nc1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFsbCBlbGVtZW50cyBieSBDU1Mgc2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdPn1cbiAgICovXG4gIGFzeW5jIGFsbChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge3Njcm9sbFRvID0gZmFsc2UsIHZpc2libGUgPSB0cnVlLCB0aW1lb3V0LCB1c2VCYXNlU2VsZWN0b3IgPSB0cnVlLCAuLi5yZXN0QXJnc30gPSBhcmdzXG4gICAgY29uc3QgcmVzdEFyZ3NLZXlzID0gT2JqZWN0LmtleXMocmVzdEFyZ3MpXG4gICAgbGV0IGFjdHVhbFRpbWVvdXRcblxuICAgIGlmICh0aW1lb3V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGFjdHVhbFRpbWVvdXQgPSB0aGlzLl9kcml2ZXJUaW1lb3V0c1xuICAgIH0gZWxzZSB7XG4gICAgICBhY3R1YWxUaW1lb3V0ID0gdGltZW91dFxuICAgIH1cblxuICAgIGlmIChyZXN0QXJnc0tleXMubGVuZ3RoID4gMCkgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFyZ3VtZW50czogJHtyZXN0QXJnc0tleXMuam9pbihcIiwgXCIpfWApXG5cbiAgICBjb25zdCBhY3R1YWxTZWxlY3RvciA9IHVzZUJhc2VTZWxlY3RvciA/IHRoaXMuZ2V0U2VsZWN0b3Ioc2VsZWN0b3IpIDogc2VsZWN0b3JcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgY29uc3QgZ2V0VGltZUxlZnQgPSAoKSA9PiBNYXRoLm1heChhY3R1YWxUaW1lb3V0IC0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpLCAwKVxuICAgIGNvbnN0IGdldEVsZW1lbnRzID0gYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZm91bmRFbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZmluZEVsZW1lbnRzKEJ5LmNzcyhhY3R1YWxTZWxlY3RvcikpXG5cbiAgICAgIGlmICh2aXNpYmxlICE9PSB0cnVlICYmIHZpc2libGUgIT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmb3VuZEVsZW1lbnRzXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbHRlcmVkRWxlbWVudHMgPSBbXVxuXG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZm91bmRFbGVtZW50cykge1xuICAgICAgICBjb25zdCBpc0Rpc3BsYXllZCA9IGF3YWl0IGVsZW1lbnQuaXNEaXNwbGF5ZWQoKVxuXG4gICAgICAgIGlmICh2aXNpYmxlICYmICFpc0Rpc3BsYXllZCkgY29udGludWVcbiAgICAgICAgaWYgKCF2aXNpYmxlICYmIGlzRGlzcGxheWVkKSBjb250aW51ZVxuXG4gICAgICAgIGZpbHRlcmVkRWxlbWVudHMucHVzaChlbGVtZW50KVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmlsdGVyZWRFbGVtZW50c1xuICAgIH1cbiAgICAvKiogQHR5cGUge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W119ICovXG4gICAgbGV0IGVsZW1lbnRzID0gW11cblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCB0aW1lTGVmdCA9IGFjdHVhbFRpbWVvdXQgPT0gMCA/IDAgOiBnZXRUaW1lTGVmdCgpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aW1lTGVmdCA9PSAwKSB7XG4gICAgICAgICAgZWxlbWVudHMgPSBhd2FpdCBnZXRFbGVtZW50cygpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS53YWl0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnRzID0gYXdhaXQgZ2V0RWxlbWVudHMoKVxuXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudHMubGVuZ3RoID4gMFxuICAgICAgICAgIH0sIHRpbWVMZWZ0KVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxldCBpc1N0YWxlRWxlbWVudEVycm9yID0gZmFsc2VcblxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTZWxlbml1bUVycm9yLlN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yKSB7XG4gICAgICAgICAgaXNTdGFsZUVsZW1lbnRFcnJvciA9IHRydWVcbiAgICAgICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIFdlYkRyaXZlckVycm9yICYmIGVycm9yLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhcInN0YWxlIGVsZW1lbnQgcmVmZXJlbmNlXCIpKSB7XG4gICAgICAgICAgaXNTdGFsZUVsZW1lbnRFcnJvciA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAoZXJyb3IgaW5zdGFuY2VvZiBTZWxlbml1bUVycm9yLlRpbWVvdXRFcnJvciB8fCBpc1N0YWxlRWxlbWVudEVycm9yKVxuICAgICAgICAgICYmIGdldFRpbWVMZWZ0KCkgPiAwXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgQ291bGRuJ3QgZ2V0IGVsZW1lbnRzIHdpdGggc2VsZWN0b3I6ICR7YWN0dWFsU2VsZWN0b3J9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3J9YCwgZXJyb3IpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzY3JvbGxUbykge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsRWxlbWVudEludG9WaWV3KGVsZW1lbnQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRzXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBzaW5nbGUgZWxlbWVudCBieSBDU1Mgc2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdfSAqL1xuICAgIGxldCBlbGVtZW50c1xuXG4gICAgdHJ5IHtcbiAgICAgIGVsZW1lbnRzID0gYXdhaXQgdGhpcy5hbGwoc2VsZWN0b3IsIGFyZ3MpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke2Vycm9yLmNvbnN0cnVjdG9yLm5hbWV9IC0gJHtlcnJvci5tZXNzYWdlfSAoc2VsZWN0b3I6ICR7dGhpcy5nZXRTZWxlY3RvcihzZWxlY3Rvcil9KWAsIGVycm9yKVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgJHt0eXBlb2YgZXJyb3J9IC0gJHtlcnJvcn0gKHNlbGVjdG9yOiAke3RoaXMuZ2V0U2VsZWN0b3Ioc2VsZWN0b3IpfSlgLCBlcnJvcilcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3JlIHRoYW4gMSBlbGVtZW50cyAoJHtlbGVtZW50cy5sZW5ndGh9KSB3YXMgZm91bmQgYnkgQ1NTOiAke3RoaXMuZ2V0U2VsZWN0b3Ioc2VsZWN0b3IpfWApXG4gICAgfVxuXG4gICAgaWYgKCFlbGVtZW50c1swXSkge1xuICAgICAgY29uc3QgZWxhcHNlZFNlY29uZHMgPSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSkgLyAxMDAwXG4gICAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IoYEVsZW1lbnQgY291bGRuJ3QgYmUgZm91bmQgYWZ0ZXIgJHtlbGFwc2VkU2Vjb25kcy50b0ZpeGVkKDIpfXMgYnkgQ1NTOiAke3RoaXMuZ2V0U2VsZWN0b3Ioc2VsZWN0b3IpfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRzWzBdXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBzaW5nbGUgZWxlbWVudCBieSB0ZXN0IElEXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SURcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmRCeVRlc3RJRCh0ZXN0SUQsIGFyZ3MpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kKGBbZGF0YS10ZXN0aWQ9JyR7dGVzdElEfSddYCwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhbiBlbGVtZW50IHdpdGggdGhlIGdpdmVuIHRlc3QgSUQgaXMgY3VycmVudGx5IHJlbmRlcmVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGhhc1Rlc3RJRCh0ZXN0SUQsIGFyZ3MpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5maW5kQnlUZXN0SUQodGVzdElELCB7Li4uYXJncywgdGltZW91dDogMH0pXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFbGVtZW50Tm90Rm91bmRFcnJvcikge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR8KHtzZWxlY3Rvcjogc3RyaW5nfSAmIEZpbmRBcmdzICYge3dpdGhGYWxsYmFjaz86IGJvb2xlYW59KX0gZWxlbWVudE9ySWRlbnRpZmllclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgX2ZpbmRFbGVtZW50KGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpIHtcbiAgICAvKiogQHR5cGUge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fSAqL1xuICAgIGxldCBlbGVtZW50XG5cbiAgICBpZiAodHlwZW9mIGVsZW1lbnRPcklkZW50aWZpZXIgPT0gXCJzdHJpbmdcIikge1xuICAgICAgZWxlbWVudCA9IGF3YWl0IHRoaXMuZmluZChlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVsZW1lbnRPcklkZW50aWZpZXIgPT0gXCJvYmplY3RcIiAmJiBlbGVtZW50T3JJZGVudGlmaWVyICE9PSBudWxsICYmIFwic2VsZWN0b3JcIiBpbiBlbGVtZW50T3JJZGVudGlmaWVyKSB7XG4gICAgICBjb25zdCB7c2VsZWN0b3IsIC4uLnJlc3RBcmdzfSA9IGVsZW1lbnRPcklkZW50aWZpZXJcblxuICAgICAgZGVsZXRlIHJlc3RBcmdzLndpdGhGYWxsYmFja1xuXG4gICAgICBlbGVtZW50ID0gYXdhaXQgdGhpcy5maW5kKHNlbGVjdG9yLCByZXN0QXJncylcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9ICovIChlbGVtZW50T3JJZGVudGlmaWVyKVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBzaW5nbGUgZWxlbWVudCBieSBDU1Mgc2VsZWN0b3Igd2l0aG91dCB3YWl0aW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZE5vV2FpdChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgYXdhaXQgdGhpcy5kcml2ZXJTZXRUaW1lb3V0cygwKVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmQoc2VsZWN0b3IsIGFyZ3MpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMucmVzdG9yZVRpbWVvdXRzKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xpY2tzIGFuIGVsZW1lbnQsIGFsbG93aW5nIHNlbGVjdG9yIGFyZ3Mgd2hlbiB1c2luZyBhIENTUyBzZWxlY3Rvci5cbiAgICogQHBhcmFtIHtzdHJpbmd8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgY2xpY2soZWxlbWVudE9ySWRlbnRpZmllciwgYXJncykge1xuICAgIGNvbnN0IHttZXRob2QsIHNjcm9sbFRvID0gZmFsc2UsIC4uLmZpbmRBcmdzfSA9IGFyZ3MgfHwge31cbiAgICBsZXQgdHJpZXMgPSAwXG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdHJpZXMrK1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gYXdhaXQgdGhpcy5fZmluZEVsZW1lbnQoZWxlbWVudE9ySWRlbnRpZmllciwgZmluZEFyZ3MpXG5cbiAgICAgICAgaWYgKHNjcm9sbFRvKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxFbGVtZW50SW50b1ZpZXcoZWxlbWVudClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRob2QgPT09IFwiYWN0aW9uc1wiKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5hY3Rpb25zKHthc3luYzogdHJ1ZX0pLm1vdmUoe29yaWdpbjogZWxlbWVudH0pLmNsaWNrKCkucGVyZm9ybSgpXG4gICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSBcImpzXCIpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmV4ZWN1dGVTY3JpcHQoXCJhcmd1bWVudHNbMF0uY2xpY2soKVwiLCBlbGVtZW50KVxuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYXdhaXQgZWxlbWVudC5jbGljaygpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIG1ldGhvZDogJHttZXRob2R9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGlmIChlcnJvci5jb25zdHJ1Y3Rvci5uYW1lID09PSBcIkVsZW1lbnRDbGlja0ludGVyY2VwdGVkRXJyb3JcIiB8fCBlcnJvci5jb25zdHJ1Y3Rvci5uYW1lID09PSBcIlN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yXCIpIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgICAgfSBlbHNlIGlmIChlcnJvci5jb25zdHJ1Y3Rvci5uYW1lID09PSBcIkVsZW1lbnROb3RJbnRlcmFjdGFibGVFcnJvclwiKSB7XG4gICAgICAgICAgICBpZiAodHJpZXMgPj0gMykge1xuICAgICAgICAgICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgRWxlbWVudCAke2VsZW1lbnRPcklkZW50aWZpZXIuY29uc3RydWN0b3IubmFtZX0gY2xpY2sgZmFpbGVkIGFmdGVyICR7dHJpZXN9IHRyaWVzIC0gJHtlcnJvci5jb25zdHJ1Y3Rvci5uYW1lfTogJHtlcnJvci5tZXNzYWdlfWAsIGVycm9yKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYXdhaXQgd2FpdCg1MClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYEVsZW1lbnQgJHtlbGVtZW50T3JJZGVudGlmaWVyLmNvbnN0cnVjdG9yLm5hbWV9IGNsaWNrIGZhaWxlZCAtICR7ZXJyb3IuY29uc3RydWN0b3IubmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gLCBlcnJvcilcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYEVsZW1lbnQgJHtlbGVtZW50T3JJZGVudGlmaWVyLmNvbnN0cnVjdG9yLm5hbWV9IGNsaWNrIGZhaWxlZCAtICR7dHlwZW9mIGVycm9yfTogJHtlcnJvcn1gLCBlcnJvcilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc2Nyb2xsRWxlbWVudEludG9WaWV3KGVsZW1lbnQpIHtcbiAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmFjdGlvbnMoe2FzeW5jOiB0cnVlfSkubW92ZSh7b3JpZ2luOiBlbGVtZW50fSkucGVyZm9ybSgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR8KHtzZWxlY3Rvcjogc3RyaW5nfSAmIEZpbmRBcmdzICYge3dpdGhGYWxsYmFjaz86IGJvb2xlYW59KX0gZWxlbWVudE9ySWRlbnRpZmllclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZFNjcm9sbFRhcmdldChlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9maW5kRWxlbWVudChlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzRWxlbWVudFVuYXZhaWxhYmxlRm9yU2Nyb2xsRXJyb3IoZXJyb3IpIHx8IHRoaXMuaGFzRXhwbGljaXRWaXNpYmxlU2Nyb2xsTG9va3VwKGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpKSB7XG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmRSZW5kZXJlZFNjcm9sbFRhcmdldChlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzLCBlcnJvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR8KHtzZWxlY3Rvcjogc3RyaW5nfSAmIEZpbmRBcmdzICYge3dpdGhGYWxsYmFjaz86IGJvb2xlYW59KX0gZWxlbWVudE9ySWRlbnRpZmllclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBoYXNFeHBsaWNpdFZpc2libGVTY3JvbGxMb29rdXAoZWxlbWVudE9ySWRlbnRpZmllciwgYXJncykge1xuICAgIGlmIChoYXNPd25BcmcoYXJncywgXCJ2aXNpYmxlXCIpKSByZXR1cm4gdHJ1ZVxuXG4gICAgcmV0dXJuIEJvb2xlYW4oXG4gICAgICB0eXBlb2YgZWxlbWVudE9ySWRlbnRpZmllciA9PSBcIm9iamVjdFwiICYmXG4gICAgICBlbGVtZW50T3JJZGVudGlmaWVyICE9PSBudWxsICYmXG4gICAgICBcInNlbGVjdG9yXCIgaW4gZWxlbWVudE9ySWRlbnRpZmllciAmJlxuICAgICAgaGFzT3duQXJnKGVsZW1lbnRPcklkZW50aWZpZXIsIFwidmlzaWJsZVwiKVxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudHwoe3NlbGVjdG9yOiBzdHJpbmd9ICYgRmluZEFyZ3MgJiB7d2l0aEZhbGxiYWNrPzogYm9vbGVhbn0pfSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7RmluZEFyZ3MgfCB1bmRlZmluZWR9IGFyZ3NcbiAgICogQHBhcmFtIHt1bmtub3dufSBvcmlnaW5hbEVycm9yXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmRSZW5kZXJlZFNjcm9sbFRhcmdldChlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzLCBvcmlnaW5hbEVycm9yKSB7XG4gICAgY29uc3Qgc2VsZWN0b3JBbmRBcmdzID0gdGhpcy5nZXRTZWxlY3RvclNjcm9sbExvb2t1cEFyZ3MoZWxlbWVudE9ySWRlbnRpZmllciwgYXJncylcblxuICAgIGlmICghc2VsZWN0b3JBbmRBcmdzKSB0aHJvdyBvcmlnaW5hbEVycm9yXG5cbiAgICBjb25zdCB7c2VsZWN0b3IsIGZpbmRBcmdzfSA9IHNlbGVjdG9yQW5kQXJnc1xuICAgIGNvbnN0IHJlbmRlcmVkRWxlbWVudHMgPSBbXVxuICAgIGNvbnN0IGZvdW5kRWxlbWVudHMgPSBhd2FpdCB0aGlzLmFsbChzZWxlY3Rvciwgey4uLmZpbmRBcmdzLCBzY3JvbGxUbzogZmFsc2UsIHRpbWVvdXQ6IDAsIHZpc2libGU6IG51bGx9KVxuXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGZvdW5kRWxlbWVudHMpIHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLmlzUmVuZGVyZWRTY3JvbGxUYXJnZXQoZWxlbWVudCkpIHtcbiAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5wdXNoKGVsZW1lbnQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlbmRlcmVkRWxlbWVudHMubGVuZ3RoID09PSAxKSByZXR1cm4gcmVuZGVyZWRFbGVtZW50c1swXVxuXG4gICAgaWYgKHJlbmRlcmVkRWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3JlIHRoYW4gMSByZW5kZXJlZCBlbGVtZW50cyAoJHtyZW5kZXJlZEVsZW1lbnRzLmxlbmd0aH0pIHdhcyBmb3VuZCBieSBDU1M6ICR7dGhpcy5nZXRTZWxlY3RvcihzZWxlY3Rvcil9YClcbiAgICB9XG5cbiAgICB0aHJvdyBvcmlnaW5hbEVycm9yXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR8KHtzZWxlY3Rvcjogc3RyaW5nfSAmIEZpbmRBcmdzICYge3dpdGhGYWxsYmFjaz86IGJvb2xlYW59KX0gZWxlbWVudE9ySWRlbnRpZmllclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge3tzZWxlY3Rvcjogc3RyaW5nLCBmaW5kQXJnczogRmluZEFyZ3N9IHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgZ2V0U2VsZWN0b3JTY3JvbGxMb29rdXBBcmdzKGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpIHtcbiAgICBpZiAodHlwZW9mIGVsZW1lbnRPcklkZW50aWZpZXIgPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHtzZWxlY3RvcjogZWxlbWVudE9ySWRlbnRpZmllciwgZmluZEFyZ3M6IGFyZ3MgfHwge319XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBlbGVtZW50T3JJZGVudGlmaWVyID09IFwib2JqZWN0XCIgJiYgZWxlbWVudE9ySWRlbnRpZmllciAhPT0gbnVsbCAmJiBcInNlbGVjdG9yXCIgaW4gZWxlbWVudE9ySWRlbnRpZmllcikge1xuICAgICAgY29uc3Qge3NlbGVjdG9yLCAuLi5yZXN0QXJnc30gPSBlbGVtZW50T3JJZGVudGlmaWVyXG5cbiAgICAgIGRlbGV0ZSByZXN0QXJncy53aXRoRmFsbGJhY2tcblxuICAgICAgcmV0dXJuIHtzZWxlY3RvciwgZmluZEFyZ3M6IHJlc3RBcmdzfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgYXN5bmMgaXNSZW5kZXJlZFNjcm9sbFRhcmdldChlbGVtZW50KSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5leGVjdXRlU2NyaXB0KGBcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBhcmd1bWVudHNbMF1cbiAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuIGZhbHNlXG5cbiAgICAgIGZvciAobGV0IGN1cnJlbnQgPSBlbGVtZW50OyBjdXJyZW50OyBjdXJyZW50ID0gY3VycmVudC5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoY3VycmVudClcbiAgICAgICAgaWYgKGN1cnJlbnQuaGlkZGVuKSByZXR1cm4gZmFsc2VcbiAgICAgICAgaWYgKGN1cnJlbnQuZ2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIikgPT09IFwidHJ1ZVwiKSByZXR1cm4gZmFsc2VcbiAgICAgICAgaWYgKHN0eWxlLmRpc3BsYXkgPT09IFwibm9uZVwiKSByZXR1cm4gZmFsc2VcbiAgICAgICAgaWYgKHN0eWxlLnZpc2liaWxpdHkgPT09IFwiaGlkZGVuXCIgfHwgc3R5bGUudmlzaWJpbGl0eSA9PT0gXCJjb2xsYXBzZVwiKSByZXR1cm4gZmFsc2VcbiAgICAgICAgaWYgKHN0eWxlLm9wYWNpdHkgPT09IFwiMFwiKSByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIEFycmF5LmZyb20oZWxlbWVudC5nZXRDbGllbnRSZWN0cygpKS5zb21lKChyZWN0KSA9PiByZWN0LndpZHRoID4gMCAmJiByZWN0LmhlaWdodCA+IDApXG4gICAgYCwgZWxlbWVudCkpXG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xscyBhbiBlbGVtZW50IGludG8gdmlldy5cbiAgICogQHBhcmFtIHtzdHJpbmd8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR8KHtzZWxlY3Rvcjogc3RyaW5nfSAmIEZpbmRBcmdzICYge3dpdGhGYWxsYmFjaz86IGJvb2xlYW59KX0gZWxlbWVudE9ySWRlbnRpZmllclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzY3JvbGxJbnRvVmlldyhlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHRoaXMuZmluZFNjcm9sbFRhcmdldChlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKVxuXG4gICAgYXdhaXQgdGhpcy5zY3JvbGxFbGVtZW50SW50b1ZpZXcoZWxlbWVudClcbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGxzIHRoZSBlbGVtZW50IHdpdGggdGhlIGdpdmVuIHRlc3QgSUQgaW50byB2aWV3LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHNjcm9sbFRlc3RJZEludG9WaWV3KHRlc3RJRCwgYXJncykge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBhd2FpdCB0aGlzLmZpbmRTY3JvbGxUYXJnZXQoYFtkYXRhLXRlc3RpZD0nJHt0ZXN0SUR9J11gLCBhcmdzKVxuXG4gICAgYXdhaXQgdGhpcy5zY3JvbGxFbGVtZW50SW50b1ZpZXcoZWxlbWVudClcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcmFjdHMgd2l0aCBhbiBlbGVtZW50IGJ5IGNhbGxpbmcgYSBtZXRob2Qgb24gaXQgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLlxuICAgKiBSZXRyeWluZyBvbiBFbGVtZW50Tm90SW50ZXJhY3RhYmxlRXJyb3IsIEVsZW1lbnRDbGlja0ludGVyY2VwdGVkRXJyb3IsIG9yIFN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fHN0cmluZ3x7c2VsZWN0b3I6IHN0cmluZ30gJiBJbnRlcmFjdEFyZ3N9IGVsZW1lbnRPcklkZW50aWZpZXIgVGhlIGVsZW1lbnQgb3IgYSBDU1Mgc2VsZWN0b3IgdG8gZmluZCB0aGUgZWxlbWVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG1ldGhvZCBuYW1lIHRvIGNhbGwgb24gdGhlIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBhc3luYyBpbnRlcmFjdChlbGVtZW50T3JJZGVudGlmaWVyLCBtZXRob2ROYW1lLCAuLi5hcmdzKSB7XG4gICAgbGV0IHRyaWVzID0gMFxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRyaWVzKytcblxuICAgICAgLyoqIEB0eXBlIHtJbnRlcmFjdEFyZ3MgfCB1bmRlZmluZWR9ICovXG4gICAgICBsZXQgaW50ZXJhY3RBcmdzXG5cbiAgICAgIGlmICh0eXBlb2YgZWxlbWVudE9ySWRlbnRpZmllciA9PT0gXCJvYmplY3RcIiAmJiBlbGVtZW50T3JJZGVudGlmaWVyICYmICFpc1dlYkRyaXZlckVsZW1lbnQoZWxlbWVudE9ySWRlbnRpZmllcikpIHtcbiAgICAgICAgaW50ZXJhY3RBcmdzID0gZWxlbWVudE9ySWRlbnRpZmllclxuICAgICAgfVxuXG4gICAgICAvKiogQHR5cGUge0ZpbmRBcmdzIHwgdW5kZWZpbmVkfSAqL1xuICAgICAgbGV0IGZpbmRBcmdzXG5cbiAgICAgIGlmIChpbnRlcmFjdEFyZ3MpIHtcbiAgICAgICAgLyoqIEB0eXBlIHtGaW5kQXJncyAmIHtzZWxlY3Rvcj86IHN0cmluZywgbWV0aG9kPzogYW55LCB3aXRoRmFsbGJhY2s/OiBhbnl9fSAqL1xuICAgICAgICBjb25zdCBzYW5pdGl6ZWRGaW5kQXJncyA9IHsuLi5pbnRlcmFjdEFyZ3N9XG5cbiAgICAgICAgZGVsZXRlIHNhbml0aXplZEZpbmRBcmdzLnNlbGVjdG9yXG4gICAgICAgIGRlbGV0ZSBzYW5pdGl6ZWRGaW5kQXJncy5tZXRob2RcbiAgICAgICAgZGVsZXRlIHNhbml0aXplZEZpbmRBcmdzLndpdGhGYWxsYmFja1xuICAgICAgICBmaW5kQXJncyA9IHNhbml0aXplZEZpbmRBcmdzXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBpbnRlcmFjdEFyZ3NcbiAgICAgICAgPyBhd2FpdCB0aGlzLl9maW5kRWxlbWVudCgvKiogQHR5cGUge3tzZWxlY3Rvcjogc3RyaW5nfX0gKi8gKGludGVyYWN0QXJncykuc2VsZWN0b3IsIGZpbmRBcmdzKVxuICAgICAgICA6IGF3YWl0IHRoaXMuX2ZpbmRFbGVtZW50KGVsZW1lbnRPcklkZW50aWZpZXIsIGZpbmRBcmdzKVxuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAobWV0aG9kTmFtZSA9PT0gXCJzZW5kS2V5c1wiKSB7XG4gICAgICAgICAgaWYgKGludGVyYWN0QXJncz8ud2l0aEZhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5pbnRlcmFjdFNlbmRLZXlzV2l0aEZhbGxiYWNrKGVsZW1lbnQsIC4uLmFyZ3MpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGF3YWl0IGVsZW1lbnQuc2VuZEtleXMoLi4uYXJncylcbiAgICAgICAgfSBlbHNlIGlmIChtZXRob2ROYW1lID09PSBcImNsaWNrXCIpIHtcbiAgICAgICAgICBpZiAoaXNXZWJEcml2ZXJFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAvKiogQHR5cGUge0ZpbmRBcmdzfSAqL1xuICAgICAgICAgICAgY29uc3QgY2xpY2tBcmdzID0ge31cbiAgICAgICAgICAgIGlmIChpbnRlcmFjdEFyZ3M/Lm1ldGhvZCAhPT0gdW5kZWZpbmVkKSBjbGlja0FyZ3MubWV0aG9kID0gaW50ZXJhY3RBcmdzLm1ldGhvZFxuICAgICAgICAgICAgaWYgKGludGVyYWN0QXJncz8uc2Nyb2xsVG8gIT09IHVuZGVmaW5lZCkgY2xpY2tBcmdzLnNjcm9sbFRvID0gaW50ZXJhY3RBcmdzLnNjcm9sbFRvXG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2xpY2soZWxlbWVudCwgY2xpY2tBcmdzKVxuXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGF3YWl0IC8qKiBAdHlwZSB7e2NsaWNrOiAoLi4uY2xpY2tBcmdzOiBhbnlbXSkgPT4gUHJvbWlzZTxhbnk+fX0gKi8gKGVsZW1lbnQpLmNsaWNrKC4uLmFyZ3MpXG4gICAgICAgIH0gZWxzZSBpZiAoISgvKiogQHR5cGUge2FueX0gKi8gKGVsZW1lbnQpKVttZXRob2ROYW1lXSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbGVtZW50LmNvbnN0cnVjdG9yLm5hbWV9IGhhc24ndCBhbiBhdHRyaWJ1dGUgbmFtZWQ6ICR7bWV0aG9kTmFtZX1gKVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiAoLyoqIEB0eXBlIHthbnl9ICovIChlbGVtZW50KSlbbWV0aG9kTmFtZV0gIT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VsZW1lbnQuY29uc3RydWN0b3IubmFtZX0jJHttZXRob2ROYW1lfSBpcyBub3QgYSBmdW5jdGlvbmApXG4gICAgICAgIH1cblxuICAgICAgICAvLyBEb250IGNhbGwgd2l0aCBjYW5kaWRhdGUsIGJlY2F1c2UgdGhhdCB3aWxsIGJpbmQgdGhlIGZ1bmN0aW9uIHdyb25nLlxuICAgICAgICByZXR1cm4gYXdhaXQgKC8qKiBAdHlwZSB7YW55fSAqLyAoZWxlbWVudCkpW21ldGhvZE5hbWVdKC4uLmFyZ3MpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGNvbnN0IHJldHJ5YWJsZUVycm9yTmFtZSA9IGdldFJldHJ5YWJsZUludGVyYWN0RXJyb3JOYW1lKGVycm9yKVxuXG4gICAgICAgICAgaWYgKHJldHJ5YWJsZUVycm9yTmFtZSkge1xuICAgICAgICAgICAgLy8gUmV0cnkgZmluZGluZyB0aGUgZWxlbWVudCBhbmQgaW50ZXJhY3Rpbmcgd2l0aCBpdFxuICAgICAgICAgICAgaWYgKHRyaWVzID49IDMpIHtcbiAgICAgICAgICAgICAgbGV0IGVsZW1lbnREZXNjcmlwdGlvblxuXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudE9ySWRlbnRpZmllciA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudERlc2NyaXB0aW9uID0gYENTUyBzZWxlY3RvciAke2VsZW1lbnRPcklkZW50aWZpZXJ9YFxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVsZW1lbnREZXNjcmlwdGlvbiA9IGAke2VsZW1lbnQuY29uc3RydWN0b3IubmFtZX1gXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgJHtlbGVtZW50RGVzY3JpcHRpb259ICR7bWV0aG9kTmFtZX0gZmFpbGVkIGFmdGVyICR7dHJpZXN9IHRyaWVzIC0gJHtyZXRyeWFibGVFcnJvck5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YCwgZXJyb3IpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhd2FpdCB3YWl0KDUwKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgJHtlbGVtZW50LmNvbnN0cnVjdG9yLm5hbWV9ICR7bWV0aG9kTmFtZX0gZmFpbGVkIC0gJHtlcnJvci5jb25zdHJ1Y3Rvci5uYW1lfTogJHtlcnJvci5tZXNzYWdlfWAsIGVycm9yKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgJHtlbGVtZW50LmNvbnN0cnVjdG9yLm5hbWV9ICR7bWV0aG9kTmFtZX0gZmFpbGVkIC0gJHt0eXBlb2YgZXJyb3J9OiAke2Vycm9yfWAsIGVycm9yKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPn1cbiAgICovXG4gIGFzeW5jIHJlYWRJbnRlcmFjdGFibGVWYWx1ZShlbGVtZW50KSB7XG4gICAgY29uc3QgdmFsdWVQcm9wZXJ0eSA9IGF3YWl0IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidmFsdWVcIilcblxuICAgIGlmICh0eXBlb2YgdmFsdWVQcm9wZXJ0eSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdmFsdWVQcm9wZXJ0eVxuICAgIH1cblxuICAgIGNvbnN0IHRleHRDb250ZW50ID0gYXdhaXQgZWxlbWVudC5nZXRUZXh0KClcblxuICAgIGlmICh0eXBlb2YgdGV4dENvbnRlbnQgPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHRleHRDb250ZW50XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8dW5rbm93bj59XG4gICAqL1xuICBhc3luYyBpbnRlcmFjdFNlbmRLZXlzV2l0aEZhbGxiYWNrKGVsZW1lbnQsIC4uLmFyZ3MpIHtcbiAgICBjb25zdCBleHBlY3RlZEFwcGVuZCA9IGdldFNlbmRLZXlzVGV4dEFwcGVuZCguLi5hcmdzKVxuICAgIGNvbnN0IGJlZm9yZVZhbHVlID0gYXdhaXQgdGhpcy5yZWFkSW50ZXJhY3RhYmxlVmFsdWUoZWxlbWVudClcbiAgICBjb25zdCBzZW5kS2V5c1Jlc3VsdCA9IGF3YWl0IGVsZW1lbnQuc2VuZEtleXMoLi4uYXJncylcbiAgICBjb25zdCBhZnRlclZhbHVlID0gYXdhaXQgdGhpcy5yZWFkSW50ZXJhY3RhYmxlVmFsdWUoZWxlbWVudClcblxuICAgIGlmICh0eXBlb2YgYmVmb3JlVmFsdWUgPT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgYWZ0ZXJWYWx1ZSA9PSBcInN0cmluZ1wiICYmIGFmdGVyVmFsdWUgIT09IGJlZm9yZVZhbHVlKSB7XG4gICAgICByZXR1cm4gc2VuZEtleXNSZXN1bHRcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0VmFsdWUgPSBnZXRTZW5kS2V5c1VzZXNTZWxlY3RBbGxBbmREZWxldGUoLi4uYXJncykgPyBleHBlY3RlZEFwcGVuZCA6IGAke2JlZm9yZVZhbHVlIHx8IFwiXCJ9JHtleHBlY3RlZEFwcGVuZH1gXG5cbiAgICBpZiAodHlwZW9mIGJlZm9yZVZhbHVlID09IFwic3RyaW5nXCIgJiYgbmV4dFZhbHVlID09PSBiZWZvcmVWYWx1ZSkge1xuICAgICAgcmV0dXJuIHNlbmRLZXlzUmVzdWx0XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5leGVjdXRlU2NyaXB0KGBcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBhcmd1bWVudHNbMF1cbiAgICAgIGNvbnN0IG5leHRWYWx1ZSA9IFN0cmluZyhhcmd1bWVudHNbMV0gPz8gXCJcIilcblxuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LmZvY3VzID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBlbGVtZW50LmZvY3VzKClcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnZhbHVlID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGVsZW1lbnQpXG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvdHlwZSwgXCJ2YWx1ZVwiKSB8fCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdy5IVE1MVGV4dEFyZWFFbGVtZW50LnByb3RvdHlwZSwgXCJ2YWx1ZVwiKSB8fCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdy5IVE1MSW5wdXRFbGVtZW50LnByb3RvdHlwZSwgXCJ2YWx1ZVwiKVxuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gU3RyaW5nKGVsZW1lbnQudmFsdWUpXG5cbiAgICAgICAgaWYgKGRlc2NyaXB0b3IgJiYgdHlwZW9mIGRlc2NyaXB0b3Iuc2V0ID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGRlc2NyaXB0b3Iuc2V0LmNhbGwoZWxlbWVudCwgbmV4dFZhbHVlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZW1lbnQudmFsdWUgPSBuZXh0VmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbGVtZW50Ll92YWx1ZVRyYWNrZXIgJiYgdHlwZW9mIGVsZW1lbnQuX3ZhbHVlVHJhY2tlci5zZXRWYWx1ZSA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBlbGVtZW50Ll92YWx1ZVRyYWNrZXIuc2V0VmFsdWUocHJldmlvdXNWYWx1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiLCB7YnViYmxlczogdHJ1ZX0pKVxuICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiY2hhbmdlXCIsIHtidWJibGVzOiB0cnVlfSkpXG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlXG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVtZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSBuZXh0VmFsdWVcbiAgICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIsIHtidWJibGVzOiB0cnVlfSkpXG4gICAgICAgIHJldHVybiBlbGVtZW50LnRleHRDb250ZW50XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsXG4gICAgYCwgZWxlbWVudCwgbmV4dFZhbHVlKVxuXG4gICAgcmV0dXJuIHNlbmRLZXlzUmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7V2FpdEZvck5vU2VsZWN0b3JBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yTm9TZWxlY3RvcihzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge3VzZUJhc2VTZWxlY3RvciwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKHJlc3RBcmdzKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYXJnczogJHtPYmplY3Qua2V5cyhyZXN0QXJncykuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsU2VsZWN0b3IgPSB1c2VCYXNlU2VsZWN0b3IgPyB0aGlzLmdldFNlbGVjdG9yKHNlbGVjdG9yKSA6IHNlbGVjdG9yXG5cbiAgICBhd2FpdCB0aGlzLmRyaXZlclNldFRpbWVvdXRzKDApXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fd2l0aFJldGhyb3duRXJyb3JzKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS53YWl0KFxuICAgICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5maW5kRWxlbWVudHMoQnkuY3NzKGFjdHVhbFNlbGVjdG9yKSlcblxuICAgICAgICAgICAgLy8gTm90IGZvdW5kIGF0IGFsbFxuICAgICAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGb3VuZCBidXQgbm90IHZpc2libGVcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGlzRGlzcGxheWVkID0gYXdhaXQgZWxlbWVudHNbMF0uaXNEaXNwbGF5ZWQoKVxuXG4gICAgICAgICAgICAgIHJldHVybiAhaXNEaXNwbGF5ZWRcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmXG4gICAgICAgICAgICAgICAgKGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3JcIiB8fCBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwic3RhbGUgZWxlbWVudCByZWZlcmVuY2VcIikpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHRoaXMuZ2V0VGltZW91dHMoKVxuICAgICAgICApXG4gICAgICB9KVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLnJlc3RvcmVUaW1lb3V0cygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxhbnk+fSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgYXN5bmMgX3dpdGhSZXRocm93bkVycm9ycyhjYWxsYmFjaykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXZWJEcml2ZXJFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgU2VsZW5pdW0gJHtlcnJvci5jb25zdHJ1Y3Rvci5uYW1lfTogJHtlcnJvci5tZXNzYWdlfWAsIGVycm9yKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
959
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViZHJpdmVyLWRyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kcml2ZXJzL3dlYmRyaXZlci1kcml2ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLEVBQUUsRUFBRSxLQUFLLElBQUksYUFBYSxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDN0QsT0FBTyxPQUFPLE1BQU0sbUNBQW1DLENBQUE7QUFDdkQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFVBQVUsQ0FBQTtBQUM3QixPQUFPLE9BQU8sTUFBTSwyQkFBMkIsQ0FBQTtBQUUvQzs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsT0FBTyxFQUFFLEtBQUs7SUFDcEMsTUFBTSxLQUFLLEdBQUcsdUNBQXVDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO0lBQzFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO0lBQ25CLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsa0JBQWtCLENBQUMsT0FBTztJQUNqQyxPQUFPLE9BQU8sQ0FDWixPQUFPO1FBQ1AsT0FBTyxPQUFPLEtBQUssUUFBUTtRQUMzQixPQUFPLElBQUksT0FBTztRQUNsQixPQUFPLE9BQU8sQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUNwQyxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsWUFBWSxDQUFDLEtBQUs7SUFDekIsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7UUFDM0IsT0FBTyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQTtJQUMvQixDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsNkJBQTZCLENBQUMsS0FBSztJQUMxQyxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUE7SUFFeEIsT0FBTyxZQUFZ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OlsiaW1wb3J0IHtCeSwgZXJyb3IgYXMgU2VsZW5pdW1FcnJvcn0gZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlclwiXG5pbXBvcnQgbG9nZ2luZyBmcm9tIFwic2VsZW5pdW0td2ViZHJpdmVyL2xpYi9sb2dnaW5nLmpzXCJcbmltcG9ydCB7d2FpdH0gZnJvbSBcImF3YWl0ZXJ5XCJcbmltcG9ydCB0aW1lb3V0IGZyb20gXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCJcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICogQHBhcmFtIHt1bmtub3dufSBjYXVzZVxuICogQHJldHVybnMge0Vycm9yICYge2NhdXNlOiB1bmtub3dufX1cbiAqL1xuZnVuY3Rpb24gZXJyb3JXaXRoQ2F1c2UobWVzc2FnZSwgY2F1c2UpIHtcbiAgY29uc3QgZXJyb3IgPSAvKiogQHR5cGUge0Vycm9yICYge2NhdXNlOiB1bmtub3dufX0gKi8gKG5ldyBFcnJvcihtZXNzYWdlKSlcbiAgZXJyb3IuY2F1c2UgPSBjYXVzZVxuICByZXR1cm4gZXJyb3Jcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGVsZW1lbnRcbiAqIEByZXR1cm5zIHtlbGVtZW50IGlzIGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fVxuICovXG5mdW5jdGlvbiBpc1dlYkRyaXZlckVsZW1lbnQoZWxlbWVudCkge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICBlbGVtZW50ICYmXG4gICAgdHlwZW9mIGVsZW1lbnQgPT09IFwib2JqZWN0XCIgJiZcbiAgICBcImdldElkXCIgaW4gZWxlbWVudCAmJlxuICAgIHR5cGVvZiBlbGVtZW50LmdldElkID09PSBcImZ1bmN0aW9uXCJcbiAgKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3JcbiAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIGdldEVycm9yTmFtZShlcnJvcikge1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiBlcnJvci5jb25zdHJ1Y3Rvci5uYW1lXG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBlcnJvclxuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gZ2V0UmV0cnlhYmxlSW50ZXJhY3RFcnJvck5hbWUoZXJyb3IpIHtcbiAgbGV0IGN1cnJlbnRFcnJvciA9IGVycm9yXG5cbiAgd2hpbGUgKGN1cnJlbnRFcnJvcikge1xuICAgIGNvbnN0IGVycm9yTmFtZSA9IGdldEVycm9yTmFtZShjdXJyZW50RXJyb3IpXG5cbiAgICBpZiAoZXJyb3JOYW1lID09PSBcIkVsZW1lbnROb3RJbnRlcmFjdGFibGVFcnJvclwiIHx8IGVycm9yTmFtZSA9PT0gXCJFbGVtZW50Q2xpY2tJbnRlcmNlcHRlZEVycm9yXCIgfHwgZXJyb3JOYW1lID09PSBcIlN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yXCIpIHtcbiAgICAgIHJldHVybiBlcnJvck5hbWVcbiAgICB9XG5cbiAgICBpZiAoIShjdXJyZW50RXJyb3IgaW5zdGFuY2VvZiBFcnJvcikgfHwgIShcImNhdXNlXCIgaW4gY3VycmVudEVycm9yKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGN1cnJlbnRFcnJvciA9IGN1cnJlbnRFcnJvci5jYXVzZVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIEBwYXJhbSB7Li4uYW55fSBhcmdzXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXRTZW5kS2V5c1RleHRBcHBlbmQoLi4uYXJncykge1xuICByZXR1cm4gYXJnc1xuICAgIC5tYXAoKGFyZykgPT4ge1xuICAgICAgY29uc3Qgc3RyaW5nQXJnID0gU3RyaW5nKGFyZylcblxuICAgICAgaWYgKC9bXFx1RTAwOVxcdUUwM0RdYVxcdUUwMDAvaS50ZXN0KHN0cmluZ0FyZykpIHtcbiAgICAgICAgcmV0dXJuIFwiXCJcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0cmluZ0FyZy5yZXBsYWNlKC9bXFx1RTAwMC1cXHVGOEZGXS9nLCBcIlwiKVxuICAgIH0pXG4gICAgLmpvaW4oXCJcIilcbn1cblxuLyoqXG4gKiBAcGFyYW0gey4uLmFueX0gYXJnc1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGdldFNlbmRLZXlzVXNlc1NlbGVjdEFsbEFuZERlbGV0ZSguLi5hcmdzKSB7XG4gIHJldHVybiBhcmdzLnNvbWUoKGFyZykgPT4gL1tcXHVFMDA5XFx1RTAzRF1hXFx1RTAwMC9pLnRlc3QoU3RyaW5nKGFyZykpKSAmJlxuICAgIGFyZ3Muc29tZSgoYXJnKSA9PiBTdHJpbmcoYXJnKS5pbmNsdWRlcyhcIlxcdUUwMDNcIikgfHwgU3RyaW5nKGFyZykuaW5jbHVkZXMoXCJcXHVFMDE3XCIpKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7e2xldmVsOiB7bmFtZTogc3RyaW5nfSwgbWVzc2FnZTogc3RyaW5nfX0gZW50cnlcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gc2hvdWxkSWdub3JlQnJvd3NlckxvZ0VudHJ5KGVudHJ5LCBtZXNzYWdlKSB7XG4gIHJldHVybiBlbnRyeS5sZXZlbC5uYW1lID09PSBcIkRFQlVHXCIgJiZcbiAgICAvKD86XnxcXHMtXFxzKVxcW0RPTVxcXSBQYXNzd29yZCBmaWVsZCBpcyBub3QgY29udGFpbmVkIGluIGEgZm9ybTovaS50ZXN0KG1lc3NhZ2UpXG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRmluZEFyZ3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF0gT3ZlcnJpZGUgdGltZW91dCBmb3IgbG9va3VwLlxuICogQHByb3BlcnR5IHtib29sZWFuIHwgbnVsbH0gW3Zpc2libGVdIFdoZXRoZXIgdG8gcmVxdWlyZSBlbGVtZW50cyB0byBiZSB2aXNpYmxlIChgdHJ1ZWApIG9yIGhpZGRlbiAoYGZhbHNlYCkuIFVzZSBgbnVsbGAgdG8gZGlzYWJsZSB2aXNpYmlsaXR5IGZpbHRlcmluZy5cbiAqIEBwcm9wZXJ0eSB7XCJhY3Rpb25zXCIgfCBcImpzXCJ9IFttZXRob2RdIE92ZXJyaWRlIHRoZSBjbGljayBwYXRoLiBgXCJhY3Rpb25zXCJgIHVzZXMgdGhlIFNlbGVuaXVtIEFjdGlvbnMgQVBJIChyZWFsIHBvaW50ZXIgbW92ZSArIGNsaWNrKTsgYFwianNcImAgZGlzcGF0Y2hlcyBgZWxlbWVudC5jbGljaygpYCB2aWEgYGV4ZWN1dGVTY3JpcHRgIGluc2lkZSB0aGUgcGFnZSdzIEpTIGNvbnRleHQgKHNraXBzIFdlYkRyaXZlcidzIHBvaW50ZXIgc3ludGhlc2lzIGVudGlyZWx5IOKAlCB1c2VmdWwgd2hlbiB0aGUgZGVmYXVsdCBjbGljayBpcyBkcm9wcGVkIGJ5IGEgZnJhbWV3b3JrIHJlc3BvbmRlciB0aGF0IHJlZnVzZXMgc3ludGhldGljIFdlYkRyaXZlciBwb2ludGVyIGV2ZW50cykuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzY3JvbGxUb10gV2hldGhlciB0byBzY3JvbGwgZm91bmQgZWxlbWVudHMgaW50byB2aWV3IGJlZm9yZSByZXR1cm5pbmcgdGhlbS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtzY3JvbGxDb250YWluZXJUZXN0SURzXSBOYXRpdmUgdGVzdCBJRHMgdGhhdCBzaG91bGQgYmUgdHJpZWQgYXMgc2Nyb2xsIGNvbnRhaW5lcnMgYmVmb3JlIGZhbGxpbmcgYmFjayB0byB2aWV3cG9ydCBnZXN0dXJlcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3VzZUJhc2VTZWxlY3Rvcl0gV2hldGhlciB0byBzY29wZSBieSB0aGUgYmFzZSBzZWxlY3Rvci5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7RmluZEFyZ3MgJiB7d2l0aEZhbGxiYWNrPzogYm9vbGVhbn19IEludGVyYWN0QXJnc1xuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdhaXRGb3JOb1NlbGVjdG9yQXJnc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbdXNlQmFzZVNlbGVjdG9yXSBXaGV0aGVyIHRvIHNjb3BlIGJ5IHRoZSBiYXNlIHNlbGVjdG9yLlxuICovXG5cbmNsYXNzIEVsZW1lbnROb3RGb3VuZEVycm9yIGV4dGVuZHMgRXJyb3IgeyB9XG5jb25zdCB7V2ViRHJpdmVyRXJyb3J9ID0gU2VsZW5pdW1FcnJvclxuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZH0gYXJnc1xuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGhhc093bkFyZyhhcmdzLCBrZXkpIHtcbiAgcmV0dXJuIEJvb2xlYW4oYXJncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXJncywga2V5KSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGVycm9yXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNFbGVtZW50Tm90Rm91bmRFcnJvcihlcnJvcikge1xuICBsZXQgY3VycmVudEVycm9yID0gZXJyb3JcblxuICB3aGlsZSAoY3VycmVudEVycm9yKSB7XG4gICAgaWYgKGN1cnJlbnRFcnJvciBpbnN0YW5jZW9mIEVsZW1lbnROb3RGb3VuZEVycm9yKSByZXR1cm4gdHJ1ZVxuXG4gICAgaWYgKCEoY3VycmVudEVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHx8ICEoXCJjYXVzZVwiIGluIGN1cnJlbnRFcnJvcikpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGN1cnJlbnRFcnJvciA9IGN1cnJlbnRFcnJvci5jYXVzZVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBlcnJvclxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzRWxlbWVudExvb2t1cFRpbWVvdXRFcnJvcihlcnJvcikge1xuICBsZXQgY3VycmVudEVycm9yID0gZXJyb3JcblxuICB3aGlsZSAoY3VycmVudEVycm9yKSB7XG4gICAgaWYgKGN1cnJlbnRFcnJvciBpbnN0YW5jZW9mIFNlbGVuaXVtRXJyb3IuVGltZW91dEVycm9yKSByZXR1cm4gdHJ1ZVxuXG4gICAgaWYgKCEoY3VycmVudEVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHx8ICEoXCJjYXVzZVwiIGluIGN1cnJlbnRFcnJvcikpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGN1cnJlbnRFcnJvciA9IGN1cnJlbnRFcnJvci5jYXVzZVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBlcnJvclxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzRWxlbWVudFVuYXZhaWxhYmxlRm9yU2Nyb2xsRXJyb3IoZXJyb3IpIHtcbiAgcmV0dXJuIGlzRWxlbWVudE5vdEZvdW5kRXJyb3IoZXJyb3IpIHx8IGlzRWxlbWVudExvb2t1cFRpbWVvdXRFcnJvcihlcnJvcilcbn1cblxuLyoqXG4gKiBCYXNlIGRyaXZlciB1c2luZyBzZWxlbml1bS13ZWJkcml2ZXIgc2Vzc2lvbnMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdlYkRyaXZlckRyaXZlciB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jyb3dzZXIuanNcIikuZGVmYXVsdH0gYXJncy5icm93c2VyXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2FyZ3Mub3B0aW9uc11cbiAgICovXG4gIGNvbnN0cnVjdG9yKHticm93c2VyLCBvcHRpb25zID0ge319KSB7XG4gICAgdGhpcy5icm93c2VyID0gYnJvd3NlclxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLmJhc2VVcmwgPSB1bmRlZmluZWRcbiAgICB0aGlzLndlYkRyaXZlciA9IHVuZGVmaW5lZFxuICAgIHRoaXMuX2RyaXZlclRpbWVvdXRzID0gNTAwMFxuICAgIHRoaXMuX3RpbWVvdXRzID0gNTAwMFxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MtZXhpdCBoYW5kbGVycyBpbnN0YWxsZWQgd2hpbGUgYSBXZWJEcml2ZXIgc2Vzc2lvbiBpcyBhbGl2ZS5cbiAgICAgKiBSZXRhaW5lZCBzbyBgc3RvcCgpYCBjYW4gZGVyZWdpc3RlciB0aGVtIGJlZm9yZSByZW1vdmluZyB0aGVcbiAgICAgKiBXZWJEcml2ZXIgcmVmZXJlbmNlLlxuICAgICAqIEB0eXBlIHt7c2lnaW50OiAoKSA9PiB2b2lkLCBzaWd0ZXJtOiAoKSA9PiB2b2lkLCBiZWZvcmVFeGl0OiAoKSA9PiB2b2lkfSB8IG51bGx9XG4gICAgICovXG4gICAgdGhpcy5fZXhpdEhhbmRsZXJzID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVXJsXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0QmFzZVVybChiYXNlVXJsKSB7XG4gICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gIGdldEJhc2VVcmwoKSB7XG4gICAgaWYgKCF0aGlzLmJhc2VVcmwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRyaXZlciBiYXNlIFVSTCBoYXMgbm90IGJlZW4gc2V0XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYmFzZVVybFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtudW1iZXJ9ICovXG4gIGdldFRpbWVvdXRzKCkgeyByZXR1cm4gdGhpcy5fdGltZW91dHMgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkRyaXZlcn1cbiAgICovXG4gIGdldFdlYkRyaXZlcigpIHtcbiAgICBpZiAoIXRoaXMud2ViRHJpdmVyKSB0aHJvdyBuZXcgRXJyb3IoXCJEcml2ZXIgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XCIpXG4gICAgdGhpcy5icm93c2VyLnRocm93SWZIdHRwU2VydmVyRXJyb3IoKVxuXG4gICAgcmV0dXJuIHRoaXMud2ViRHJpdmVyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRHJpdmVyfSB3ZWJEcml2ZXJcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXRXZWJEcml2ZXIod2ViRHJpdmVyKSB7XG4gICAgdGhpcy53ZWJEcml2ZXIgPSB3ZWJEcml2ZXJcbiAgICB0aGlzLmJyb3dzZXIuZHJpdmVyID0gd2ViRHJpdmVyXG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbHMgcHJvY2Vzcy1sZXZlbCBoYW5kbGVycyB0aGF0IHRlcm1pbmF0ZSB0aGUgV2ViRHJpdmVyIHNlc3Npb25cbiAgICogaWYgdGhlIE5vZGUgcHJvY2VzcyBleGl0cyB3aXRob3V0IGFuIGV4cGxpY2l0IGBzdG9wKClgIGNhbGwuIFdpdGhvdXRcbiAgICogdGhpcywgdGhlIGNocm9tZWRyaXZlci1zcGF3bmVkIENocm9tZSBpcyBvcnBoYW5lZCB0byBpbml0IChQUElEPTEpXG4gICAqIHdoZW4gdGhlIHRlc3QgcnVubmVyIGV4aXRzIOKAlCBlYWNoIGBucHggdmVsb2Npb3VzIHRlc3RgIHJ1biB0aGF0XG4gICAqIHNraXBzIGV4cGxpY2l0IGNsZWFudXAgbGVhdmVzIGEgQ2hyb21lIHBsdXMgdGhvdXNhbmRzIG9mXG4gICAqIGAvdG1wL29yZy5jaHJvbWl1bS5DaHJvbWl1bS5zY29wZWRfZGlyLipgIGJlaGluZC4gRHJpdmVyIHN1YmNsYXNzXG4gICAqIGBzdGFydCgpYCBpbXBsZW1lbnRhdGlvbnMgbXVzdCBjYWxsIHRoaXMgYWZ0ZXIgc2V0dGluZyB0aGVcbiAgICogV2ViRHJpdmVyIG9uIGEgZnJlc2ggc2Vzc2lvbjsgdGVzdHMgdGhhdCBzdHViIGBzZXRXZWJEcml2ZXJgXG4gICAqIGRpcmVjdGx5IGRlbGliZXJhdGVseSBieXBhc3MgaXQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgaW5zdGFsbEV4aXRIYW5kbGVycygpIHtcbiAgICBpZiAodGhpcy5fZXhpdEhhbmRsZXJzKSByZXR1cm5cbiAgICBjb25zdCBzaWdpbnQgPSAoKSA9PiB7IHZvaWQgdGhpcy5fb25FeGl0U2lnbmFsKFwiU0lHSU5UXCIpIH1cbiAgICBjb25zdCBzaWd0ZXJtID0gKCkgPT4geyB2b2lkIHRoaXMuX29uRXhpdFNpZ25hbChcIlNJR1RFUk1cIikgfVxuICAgIGNvbnN0IGJlZm9yZUV4aXQgPSAoKSA9PiB7IHZvaWQgdGhpcy5fb25FeGl0U2lnbmFsKFwiYmVmb3JlRXhpdFwiKSB9XG4gICAgcHJvY2Vzcy5vbmNlKFwiU0lHSU5UXCIsIHNpZ2ludClcbiAgICBwcm9jZXNzLm9uY2UoXCJTSUdURVJNXCIsIHNpZ3Rlcm0pXG4gICAgcHJvY2Vzcy5vbmNlKFwiYmVmb3JlRXhpdFwiLCBiZWZvcmVFeGl0KVxuICAgIHRoaXMuX2V4aXRIYW5kbGVycyA9IHtzaWdpbnQsIHNpZ3Rlcm0sIGJlZm9yZUV4aXR9XG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIF9yZW1vdmVFeGl0SGFuZGxlcnMoKSB7XG4gICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLl9leGl0SGFuZGxlcnNcbiAgICBpZiAoIWhhbmRsZXJzKSByZXR1cm5cbiAgICB0aGlzLl9leGl0SGFuZGxlcnMgPSBudWxsXG4gICAgcHJvY2Vzcy5vZmYoXCJTSUdJTlRcIiwgaGFuZGxlcnMuc2lnaW50KVxuICAgIHByb2Nlc3Mub2ZmKFwiU0lHVEVSTVwiLCBoYW5kbGVycy5zaWd0ZXJtKVxuICAgIHByb2Nlc3Mub2ZmKFwiYmVmb3JlRXhpdFwiLCBoYW5kbGVycy5iZWZvcmVFeGl0KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7XCJTSUdJTlRcIiB8IFwiU0lHVEVSTVwiIHwgXCJiZWZvcmVFeGl0XCJ9IHNpZ25hbFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIF9vbkV4aXRTaWduYWwoc2lnbmFsKSB7XG4gICAgdGhpcy5fcmVtb3ZlRXhpdEhhbmRsZXJzKClcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zdG9wKClcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEJlc3QtZWZmb3J0IOKAlCB0aGUgcHJvY2VzcyBpcyBnb2luZyBkb3duIGFueXdheSwgYW5kIHdlJ2QgcmF0aGVyXG4gICAgICAvLyBvcnBoYW4gYSBicm93c2VyIHRoYW4gdGhyb3cgZnJvbSBhIHNpZ25hbCBoYW5kbGVyLlxuICAgIH1cbiAgICAvLyBQcmVzZXJ2ZSB0aGUgY29udmVudGlvbmFsIHNpZ25hbC1leGl0IHN0YXR1cyAoMTI4ICsgc2lnbmFsIG51bWJlcilcbiAgICAvLyBzbyBDSSAvIHdyYXBwZXIgc2NyaXB0cyBjYW4gc3RpbGwgdGVsbCBpbnRlcnJ1cHRlZCBydW5zIGFwYXJ0XG4gICAgLy8gZnJvbSBhIGNsZWFuIHBhc3MuIFBsYWluIGBwcm9jZXNzLmV4aXQoMClgIHdvdWxkIG1pc3JlcG9ydCBhXG4gICAgLy8gY2FuY2VsbGVkIHJ1biBhcyBzdWNjZXNzZnVsLlxuICAgIGlmIChzaWduYWwgPT09IFwiU0lHSU5UXCIpIHByb2Nlc3MuZXhpdCgxMzApXG4gICAgaWYgKHNpZ25hbCA9PT0gXCJTSUdURVJNXCIpIHByb2Nlc3MuZXhpdCgxNDMpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdGFydCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdGFydCgpIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRyaXZlclwiKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RvcCgpIHtcbiAgICB0aGlzLl9yZW1vdmVFeGl0SGFuZGxlcnMoKVxuICAgIGlmICh0aGlzLndlYkRyaXZlcikge1xuICAgICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogdGhpcy5nZXRUaW1lb3V0cygpLCBlcnJvck1lc3NhZ2U6IFwidGltZW91dCB3aGlsZSBxdWl0dGluZyBXZWJEcml2ZXJcIn0sIGFzeW5jICgpID0+IGF3YWl0IC8qKiBAdHlwZSB7Tm9uTnVsbGFibGU8dHlwZW9mIHRoaXMud2ViRHJpdmVyPn0gKi8gKHRoaXMud2ViRHJpdmVyKS5xdWl0KCkpXG4gICAgfVxuXG4gICAgdGhpcy53ZWJEcml2ZXIgPSB1bmRlZmluZWRcbiAgICB0aGlzLmJyb3dzZXIuZHJpdmVyID0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IG5ld1RpbWVvdXRcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkcml2ZXJTZXRUaW1lb3V0cyhuZXdUaW1lb3V0KSB7XG4gICAgdGhpcy5fZHJpdmVyVGltZW91dHMgPSBuZXdUaW1lb3V0XG4gICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5tYW5hZ2UoKS5zZXRUaW1lb3V0cyh7aW1wbGljaXQ6IG5ld1RpbWVvdXR9KVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVzdG9yZVRpbWVvdXRzKCkge1xuICAgIGlmICghdGhpcy5nZXRUaW1lb3V0cygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaW1lb3V0cyBoYXZlbid0IHByZXZpb3VzbHkgYmVlbiBzZXRcIilcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmRyaXZlclNldFRpbWVvdXRzKHRoaXMuZ2V0VGltZW91dHMoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gbmV3VGltZW91dFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHNldFRpbWVvdXRzKG5ld1RpbWVvdXQpIHtcbiAgICB0aGlzLl90aW1lb3V0cyA9IG5ld1RpbWVvdXRcbiAgICBhd2FpdCB0aGlzLnJlc3RvcmVUaW1lb3V0cygpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXRTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLmJyb3dzZXIuZ2V0U2VsZWN0b3Ioc2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkcml2ZXJWaXNpdChwYXRoKSB7XG4gICAgY29uc3QgaXNBYnNvbHV0ZVVybCA9IC9eW2Etel0rOlxcL1xcLy9pLnRlc3QocGF0aClcbiAgICBjb25zdCB1cmwgPSBpc0Fic29sdXRlVXJsID8gcGF0aCA6IGAke3RoaXMuZ2V0QmFzZVVybCgpfSR7cGF0aH1gXG5cbiAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmdldCh1cmwpXG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhbGwgY29va2llcyBmb3IgdGhlIGN1cnJlbnQgYnJvd3NlciBzZXNzaW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGRlbGV0ZUFsbENvb2tpZXMoKSB7XG4gICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5tYW5hZ2UoKS5kZWxldGVBbGxDb29raWVzKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAqL1xuICBhc3luYyBnZXRDdXJyZW50VXJsKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5nZXRDdXJyZW50VXJsKClcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBcIlwiXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59ICovXG4gIGFzeW5jIGdldEhUTUwoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZ2V0UGFnZVNvdXJjZSgpXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gKi9cbiAgYXN5bmMgdGFrZVNjcmVlbnNob3QoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkudGFrZVNjcmVlbnNob3QoKVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYnJvd3NlciBsb2dzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn1cbiAgICovXG4gIGFzeW5jIGdldEJyb3dzZXJMb2dzKCkge1xuICAgIGxldCBlbnRyaWVzXG5cbiAgICB0cnkge1xuICAgICAgZW50cmllcyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkubWFuYWdlKCkubG9ncygpLmdldChsb2dnaW5nLlR5cGUuQlJPV1NFUilcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgICBjb25zdCBicm93c2VyTG9ncyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2VNYXRjaCA9IGVudHJ5Lm1lc3NhZ2UubWF0Y2goL14oLispIChcXGQrKTooXFxkKykgKC4rKSQvKVxuICAgICAgbGV0IG1lc3NhZ2VcblxuICAgICAgaWYgKG1lc3NhZ2VNYXRjaCkge1xuICAgICAgICBtZXNzYWdlID0gbWVzc2FnZU1hdGNoWzRdXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXNzYWdlID0gZW50cnkubWVzc2FnZVxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkSWdub3JlQnJvd3NlckxvZ0VudHJ5KGVudHJ5LCBtZXNzYWdlKSkgY29udGludWVcblxuICAgICAgYnJvd3NlckxvZ3MucHVzaChgJHtlbnRyeS5sZXZlbC5uYW1lfTogJHttZXNzYWdlfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGJyb3dzZXJMb2dzXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYWxsIGVsZW1lbnRzIGJ5IENTUyBzZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W10+fVxuICAgKi9cbiAgYXN5bmMgYWxsKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCB7c2Nyb2xsQ29udGFpbmVyVGVzdElEcywgc2Nyb2xsVG8gPSBmYWxzZSwgdmlzaWJsZSA9IHRydWUsIHRpbWVvdXQsIHVzZUJhc2VTZWxlY3RvciA9IHRydWUsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcbiAgICB2b2lkIHNjcm9sbENvbnRhaW5lclRlc3RJRHNcbiAgICBjb25zdCByZXN0QXJnc0tleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncylcbiAgICBsZXQgYWN0dWFsVGltZW91dFxuXG4gICAgaWYgKHRpbWVvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYWN0dWFsVGltZW91dCA9IHRoaXMuX2RyaXZlclRpbWVvdXRzXG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdHVhbFRpbWVvdXQgPSB0aW1lb3V0XG4gICAgfVxuXG4gICAgaWYgKHJlc3RBcmdzS2V5cy5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYXJndW1lbnRzOiAke3Jlc3RBcmdzS2V5cy5qb2luKFwiLCBcIil9YClcblxuICAgIGNvbnN0IGFjdHVhbFNlbGVjdG9yID0gdXNlQmFzZVNlbGVjdG9yID8gdGhpcy5nZXRTZWxlY3RvcihzZWxlY3RvcikgOiBzZWxlY3RvclxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgICBjb25zdCBnZXRUaW1lTGVmdCA9ICgpID0+IE1hdGgubWF4KGFjdHVhbFRpbWVvdXQgLSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSksIDApXG4gICAgY29uc3QgZ2V0RWxlbWVudHMgPSBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmb3VuZEVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5maW5kRWxlbWVudHMoQnkuY3NzKGFjdHVhbFNlbGVjdG9yKSlcblxuICAgICAgaWYgKHZpc2libGUgIT09IHRydWUgJiYgdmlzaWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZvdW5kRWxlbWVudHNcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsdGVyZWRFbGVtZW50cyA9IFtdXG5cbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBmb3VuZEVsZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IGlzRGlzcGxheWVkID0gYXdhaXQgZWxlbWVudC5pc0Rpc3BsYXllZCgpXG5cbiAgICAgICAgaWYgKHZpc2libGUgJiYgIWlzRGlzcGxheWVkKSBjb250aW51ZVxuICAgICAgICBpZiAoIXZpc2libGUgJiYgaXNEaXNwbGF5ZWQpIGNvbnRpbnVlXG5cbiAgICAgICAgZmlsdGVyZWRFbGVtZW50cy5wdXNoKGVsZW1lbnQpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaWx0ZXJlZEVsZW1lbnRzXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXX0gKi9cbiAgICBsZXQgZWxlbWVudHMgPSBbXVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHRpbWVMZWZ0ID0gYWN0dWFsVGltZW91dCA9PSAwID8gMCA6IGdldFRpbWVMZWZ0KClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHRpbWVMZWZ0ID09IDApIHtcbiAgICAgICAgICBlbGVtZW50cyA9IGF3YWl0IGdldEVsZW1lbnRzKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLndhaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudHMgPSBhd2FpdCBnZXRFbGVtZW50cygpXG5cbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50cy5sZW5ndGggPiAwXG4gICAgICAgICAgfSwgdGltZUxlZnQpXG4gICAgICAgIH1cblxuICAgICAgICBicmVha1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbGV0IGlzU3RhbGVFbGVtZW50RXJyb3IgPSBmYWxzZVxuXG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlbGVuaXVtRXJyb3IuU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IpIHtcbiAgICAgICAgICBpc1N0YWxlRWxlbWVudEVycm9yID0gdHJ1ZVxuICAgICAgICB9IGVsc2UgaWYgKGVycm9yIGluc3RhbmNlb2YgV2ViRHJpdmVyRXJyb3IgJiYgZXJyb3IubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwic3RhbGUgZWxlbWVudCByZWZlcmVuY2VcIikpIHtcbiAgICAgICAgICBpc1N0YWxlRWxlbWVudEVycm9yID0gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIChlcnJvciBpbnN0YW5jZW9mIFNlbGVuaXVtRXJyb3IuVGltZW91dEVycm9yIHx8IGlzU3RhbGVFbGVtZW50RXJyb3IpXG4gICAgICAgICAgJiYgZ2V0VGltZUxlZnQoKSA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGBDb3VsZG4ndCBnZXQgZWxlbWVudHMgd2l0aCBzZWxlY3RvcjogJHthY3R1YWxTZWxlY3Rvcn06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcn1gLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNjcm9sbFRvKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxFbGVtZW50SW50b1ZpZXcoZWxlbWVudClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgYXN5bmMgZXhpc3RzKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmFsbChzZWxlY3RvciwgYXJncykpLmxlbmd0aCA+IDBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGlzRWxlbWVudExvb2t1cFRpbWVvdXRFcnJvcihlcnJvcikpIHJldHVybiBmYWxzZVxuXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIHNpbmdsZSBlbGVtZW50IGJ5IENTUyBzZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmQoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgICAvKiogQHR5cGUge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W119ICovXG4gICAgbGV0IGVsZW1lbnRzXG5cbiAgICB0cnkge1xuICAgICAgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmFsbChzZWxlY3RvciwgYXJncylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYCR7ZXJyb3IuY29uc3RydWN0b3IubmFtZX0gLSAke2Vycm9yLm1lc3NhZ2V9IChzZWxlY3RvcjogJHt0aGlzLmdldFNlbGVjdG9yKHNlbGVjdG9yKX0pYCwgZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke3R5cGVvZiBlcnJvcn0gLSAke2Vycm9yfSAoc2VsZWN0b3I6ICR7dGhpcy5nZXRTZWxlY3RvcihzZWxlY3Rvcil9KWAsIGVycm9yKVxuICAgIH1cblxuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vcmUgdGhhbiAxIGVsZW1lbnRzICgke2VsZW1lbnRzLmxlbmd0aH0pIHdhcyBmb3VuZCBieSBDU1M6ICR7dGhpcy5nZXRTZWxlY3RvcihzZWxlY3Rvcil9YClcbiAgICB9XG5cbiAgICBpZiAoIWVsZW1lbnRzWzBdKSB7XG4gICAgICBjb25zdCBlbGFwc2VkU2Vjb25kcyA9IChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSAvIDEwMDBcbiAgICAgIHRocm93IG5ldyBFbGVtZW50Tm90Rm91bmRFcnJvcihgRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBhZnRlciAke2VsYXBzZWRTZWNvbmRzLnRvRml4ZWQoMil9cyBieSBDU1M6ICR7dGhpcy5nZXRTZWxlY3RvcihzZWxlY3Rvcil9YClcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudHNbMF1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59XG4gICAqL1xuICBhc3luYyB0ZXh0KHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICByZXR1cm4gYXdhaXQgKGF3YWl0IHRoaXMuZmluZChzZWxlY3RvciwgYXJncykpLmdldFRleHQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGEgc2luZ2xlIGVsZW1lbnQgYnkgdGVzdCBJRFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kQnlUZXN0SUQodGVzdElELCBhcmdzKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZChgW2RhdGEtdGVzdGlkPScke3Rlc3RJRH0nXWAsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbmF0aXZlIEFuZHJvaWQgdmlzaWJsZSB0ZXh0IG9yIGFuIGFjY2Vzc2liaWxpdHkgbGFiZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFRleHQgVGV4dCB0byBsb2NhdGUuXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXSBPcHRpb25hbCBsb29rdXAgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn0gTWF0Y2hpbmcgbmF0aXZlIGVsZW1lbnQuXG4gICAqL1xuICBhc3luYyBmaW5kQnlOYXRpdmVUZXh0KGV4cGVjdGVkVGV4dCwgYXJncyA9IHt9KSB7XG4gICAgdm9pZCBhcmdzXG4gICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnlOYXRpdmVUZXh0IGlzIG9ubHkgc3VwcG9ydGVkIGZvciBuYXRpdmUgQXBwaXVtIHNlc3Npb25zOiAke2V4cGVjdGVkVGV4dH1gKVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGFuIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gdGVzdCBJRCBpcyBjdXJyZW50bHkgcmVuZGVyZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SURcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgYXN5bmMgaGFzVGVzdElEKHRlc3RJRCwgYXJncykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbmRCeVRlc3RJRCh0ZXN0SUQsIHsuLi5hcmdzLCB0aW1lb3V0OiAwfSlcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVsZW1lbnROb3RGb3VuZEVycm9yKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudHwoe3NlbGVjdG9yOiBzdHJpbmd9ICYgRmluZEFyZ3MgJiB7d2l0aEZhbGxiYWNrPzogYm9vbGVhbn0pfSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBfZmluZEVsZW1lbnQoZWxlbWVudE9ySWRlbnRpZmllciwgYXJncykge1xuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9ICovXG4gICAgbGV0IGVsZW1lbnRcblxuICAgIGlmICh0eXBlb2YgZWxlbWVudE9ySWRlbnRpZmllciA9PSBcInN0cmluZ1wiKSB7XG4gICAgICBlbGVtZW50ID0gYXdhaXQgdGhpcy5maW5kKGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZWxlbWVudE9ySWRlbnRpZmllciA9PSBcIm9iamVjdFwiICYmIGVsZW1lbnRPcklkZW50aWZpZXIgIT09IG51bGwgJiYgXCJzZWxlY3RvclwiIGluIGVsZW1lbnRPcklkZW50aWZpZXIpIHtcbiAgICAgIGNvbnN0IHtzZWxlY3RvciwgLi4ucmVzdEFyZ3N9ID0gZWxlbWVudE9ySWRlbnRpZmllclxuXG4gICAgICBkZWxldGUgcmVzdEFyZ3Mud2l0aEZhbGxiYWNrXG5cbiAgICAgIGVsZW1lbnQgPSBhd2FpdCB0aGlzLmZpbmQoc2VsZWN0b3IsIHJlc3RBcmdzKVxuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gKi8gKGVsZW1lbnRPcklkZW50aWZpZXIpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIHNpbmdsZSBlbGVtZW50IGJ5IENTUyBzZWxlY3RvciB3aXRob3V0IHdhaXRpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kTm9XYWl0KHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICBhd2FpdCB0aGlzLmRyaXZlclNldFRpbWVvdXRzKDApXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZChzZWxlY3RvciwgYXJncylcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlVGltZW91dHMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGlja3MgYW4gZWxlbWVudCwgYWxsb3dpbmcgc2VsZWN0b3IgYXJncyB3aGVuIHVzaW5nIGEgQ1NTIHNlbGVjdG9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ3xpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gZWxlbWVudE9ySWRlbnRpZmllclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBjbGljayhlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKSB7XG4gICAgY29uc3Qge21ldGhvZCwgc2Nyb2xsVG8gPSBmYWxzZSwgLi4uZmluZEFyZ3N9ID0gYXJncyB8fCB7fVxuICAgIGxldCB0cmllcyA9IDBcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0cmllcysrXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBhd2FpdCB0aGlzLl9maW5kRWxlbWVudChlbGVtZW50T3JJZGVudGlmaWVyLCBmaW5kQXJncylcblxuICAgICAgICBpZiAoc2Nyb2xsVG8pIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNjcm9sbEVsZW1lbnRJbnRvVmlldyhlbGVtZW50KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJhY3Rpb25zXCIpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmFjdGlvbnMoe2FzeW5jOiB0cnVlfSkubW92ZSh7b3JpZ2luOiBlbGVtZW50fSkuY2xpY2soKS5wZXJmb3JtKClcbiAgICAgICAgfSBlbHNlIGlmIChtZXRob2QgPT09IFwianNcIikge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZXhlY3V0ZVNjcmlwdChcImFyZ3VtZW50c1swXS5jbGljaygpXCIsIGVsZW1lbnQpXG4gICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhd2FpdCBlbGVtZW50LmNsaWNrKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbWV0aG9kOiAke21ldGhvZH1gKVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgaWYgKGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiRWxlbWVudENsaWNrSW50ZXJjZXB0ZWRFcnJvclwiIHx8IGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3JcIikge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgICB9IGVsc2UgaWYgKGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiRWxlbWVudE5vdEludGVyYWN0YWJsZUVycm9yXCIpIHtcbiAgICAgICAgICAgIGlmICh0cmllcyA+PSAzKSB7XG4gICAgICAgICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGBFbGVtZW50ICR7ZWxlbWVudE9ySWRlbnRpZmllci5jb25zdHJ1Y3Rvci5uYW1lfSBjbGljayBmYWlsZWQgYWZ0ZXIgJHt0cmllc30gdHJpZXMgLSAke2Vycm9yLmNvbnN0cnVjdG9yLm5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YCwgZXJyb3IpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhd2FpdCB3YWl0KDUwKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgRWxlbWVudCAke2VsZW1lbnRPcklkZW50aWZpZXIuY29uc3RydWN0b3IubmFtZX0gY2xpY2sgZmFpbGVkIC0gJHtlcnJvci5jb25zdHJ1Y3Rvci5uYW1lfTogJHtlcnJvci5tZXNzYWdlfWAsIGVycm9yKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgRWxlbWVudCAke2VsZW1lbnRPcklkZW50aWZpZXIuY29uc3RydWN0b3IubmFtZX0gY2xpY2sgZmFpbGVkIC0gJHt0eXBlb2YgZXJyb3J9OiAke2Vycm9yfWAsIGVycm9yKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzY3JvbGxFbGVtZW50SW50b1ZpZXcoZWxlbWVudCkge1xuICAgIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuYWN0aW9ucyh7YXN5bmM6IHRydWV9KS5tb3ZlKHtvcmlnaW46IGVsZW1lbnR9KS5wZXJmb3JtKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudHwoe3NlbGVjdG9yOiBzdHJpbmd9ICYgRmluZEFyZ3MgJiB7d2l0aEZhbGxiYWNrPzogYm9vbGVhbn0pfSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kU2Nyb2xsVGFyZ2V0KGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2ZpbmRFbGVtZW50KGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNFbGVtZW50VW5hdmFpbGFibGVGb3JTY3JvbGxFcnJvcihlcnJvcikgfHwgdGhpcy5oYXNFeHBsaWNpdFZpc2libGVTY3JvbGxMb29rdXAoZWxlbWVudE9ySWRlbnRpZmllciwgYXJncykpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZFJlbmRlcmVkU2Nyb2xsVGFyZ2V0KGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MsIGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudHwoe3NlbGVjdG9yOiBzdHJpbmd9ICYgRmluZEFyZ3MgJiB7d2l0aEZhbGxiYWNrPzogYm9vbGVhbn0pfSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGhhc0V4cGxpY2l0VmlzaWJsZVNjcm9sbExvb2t1cChlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKSB7XG4gICAgaWYgKGhhc093bkFyZyhhcmdzLCBcInZpc2libGVcIikpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gQm9vbGVhbihcbiAgICAgIHR5cGVvZiBlbGVtZW50T3JJZGVudGlmaWVyID09IFwib2JqZWN0XCIgJiZcbiAgICAgIGVsZW1lbnRPcklkZW50aWZpZXIgIT09IG51bGwgJiZcbiAgICAgIFwic2VsZWN0b3JcIiBpbiBlbGVtZW50T3JJZGVudGlmaWVyICYmXG4gICAgICBoYXNPd25BcmcoZWxlbWVudE9ySWRlbnRpZmllciwgXCJ2aXNpYmxlXCIpXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fCh7c2VsZWN0b3I6IHN0cmluZ30gJiBGaW5kQXJncyAmIHt3aXRoRmFsbGJhY2s/OiBib29sZWFufSl9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHBhcmFtIHtGaW5kQXJncyB8IHVuZGVmaW5lZH0gYXJnc1xuICAgKiBAcGFyYW0ge3Vua25vd259IG9yaWdpbmFsRXJyb3JcbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZFJlbmRlcmVkU2Nyb2xsVGFyZ2V0KGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MsIG9yaWdpbmFsRXJyb3IpIHtcbiAgICBjb25zdCBzZWxlY3RvckFuZEFyZ3MgPSB0aGlzLmdldFNlbGVjdG9yU2Nyb2xsTG9va3VwQXJncyhlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKVxuXG4gICAgaWYgKCFzZWxlY3RvckFuZEFyZ3MpIHRocm93IG9yaWdpbmFsRXJyb3JcblxuICAgIGNvbnN0IHtzZWxlY3RvciwgZmluZEFyZ3N9ID0gc2VsZWN0b3JBbmRBcmdzXG4gICAgY29uc3QgcmVuZGVyZWRFbGVtZW50cyA9IFtdXG4gICAgY29uc3QgZm91bmRFbGVtZW50cyA9IGF3YWl0IHRoaXMuYWxsKHNlbGVjdG9yLCB7Li4uZmluZEFyZ3MsIHNjcm9sbFRvOiBmYWxzZSwgdGltZW91dDogMCwgdmlzaWJsZTogbnVsbH0pXG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZm91bmRFbGVtZW50cykge1xuICAgICAgaWYgKGF3YWl0IHRoaXMuaXNSZW5kZXJlZFNjcm9sbFRhcmdldChlbGVtZW50KSkge1xuICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnB1c2goZWxlbWVudClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVuZGVyZWRFbGVtZW50cy5sZW5ndGggPT09IDEpIHJldHVybiByZW5kZXJlZEVsZW1lbnRzWzBdXG5cbiAgICBpZiAocmVuZGVyZWRFbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vcmUgdGhhbiAxIHJlbmRlcmVkIGVsZW1lbnRzICgke3JlbmRlcmVkRWxlbWVudHMubGVuZ3RofSkgd2FzIGZvdW5kIGJ5IENTUzogJHt0aGlzLmdldFNlbGVjdG9yKHNlbGVjdG9yKX1gKVxuICAgIH1cblxuICAgIHRocm93IG9yaWdpbmFsRXJyb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudHwoe3NlbGVjdG9yOiBzdHJpbmd9ICYgRmluZEFyZ3MgJiB7d2l0aEZhbGxiYWNrPzogYm9vbGVhbn0pfSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7e3NlbGVjdG9yOiBzdHJpbmcsIGZpbmRBcmdzOiBGaW5kQXJnc30gfCB1bmRlZmluZWR9XG4gICAqL1xuICBnZXRTZWxlY3RvclNjcm9sbExvb2t1cEFyZ3MoZWxlbWVudE9ySWRlbnRpZmllciwgYXJncykge1xuICAgIGlmICh0eXBlb2YgZWxlbWVudE9ySWRlbnRpZmllciA9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4ge3NlbGVjdG9yOiBlbGVtZW50T3JJZGVudGlmaWVyLCBmaW5kQXJnczogYXJncyB8fCB7fX1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGVsZW1lbnRPcklkZW50aWZpZXIgPT0gXCJvYmplY3RcIiAmJiBlbGVtZW50T3JJZGVudGlmaWVyICE9PSBudWxsICYmIFwic2VsZWN0b3JcIiBpbiBlbGVtZW50T3JJZGVudGlmaWVyKSB7XG4gICAgICBjb25zdCB7c2VsZWN0b3IsIC4uLnJlc3RBcmdzfSA9IGVsZW1lbnRPcklkZW50aWZpZXJcblxuICAgICAgZGVsZXRlIHJlc3RBcmdzLndpdGhGYWxsYmFja1xuXG4gICAgICByZXR1cm4ge3NlbGVjdG9yLCBmaW5kQXJnczogcmVzdEFyZ3N9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gICAqL1xuICBhc3luYyBpc1JlbmRlcmVkU2Nyb2xsVGFyZ2V0KGVsZW1lbnQpIHtcbiAgICByZXR1cm4gQm9vbGVhbihhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmV4ZWN1dGVTY3JpcHQoYFxuICAgICAgY29uc3QgZWxlbWVudCA9IGFyZ3VtZW50c1swXVxuICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm4gZmFsc2VcblxuICAgICAgZm9yIChsZXQgY3VycmVudCA9IGVsZW1lbnQ7IGN1cnJlbnQ7IGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjdXJyZW50KVxuICAgICAgICBpZiAoY3VycmVudC5oaWRkZW4pIHJldHVybiBmYWxzZVxuICAgICAgICBpZiAoY3VycmVudC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSA9PT0gXCJ0cnVlXCIpIHJldHVybiBmYWxzZVxuICAgICAgICBpZiAoc3R5bGUuZGlzcGxheSA9PT0gXCJub25lXCIpIHJldHVybiBmYWxzZVxuICAgICAgICBpZiAoc3R5bGUudmlzaWJpbGl0eSA9PT0gXCJoaWRkZW5cIiB8fCBzdHlsZS52aXNpYmlsaXR5ID09PSBcImNvbGxhcHNlXCIpIHJldHVybiBmYWxzZVxuICAgICAgICBpZiAoc3R5bGUub3BhY2l0eSA9PT0gXCIwXCIpIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gQXJyYXkuZnJvbShlbGVtZW50LmdldENsaWVudFJlY3RzKCkpLnNvbWUoKHJlY3QpID0+IHJlY3Qud2lkdGggPiAwICYmIHJlY3QuaGVpZ2h0ID4gMClcbiAgICBgLCBlbGVtZW50KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGxzIGFuIGVsZW1lbnQgaW50byB2aWV3LlxuICAgKiBAcGFyYW0ge3N0cmluZ3xpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudHwoe3NlbGVjdG9yOiBzdHJpbmd9ICYgRmluZEFyZ3MgJiB7d2l0aEZhbGxiYWNrPzogYm9vbGVhbn0pfSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHNjcm9sbEludG9WaWV3KGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gYXdhaXQgdGhpcy5maW5kU2Nyb2xsVGFyZ2V0KGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpXG5cbiAgICBhd2FpdCB0aGlzLnNjcm9sbEVsZW1lbnRJbnRvVmlldyhlbGVtZW50KVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbHMgdGhlIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gdGVzdCBJRCBpbnRvIHZpZXcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SURcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc2Nyb2xsVGVzdElkSW50b1ZpZXcodGVzdElELCBhcmdzKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHRoaXMuZmluZFNjcm9sbFRhcmdldChgW2RhdGEtdGVzdGlkPScke3Rlc3RJRH0nXWAsIGFyZ3MpXG5cbiAgICBhd2FpdCB0aGlzLnNjcm9sbEVsZW1lbnRJbnRvVmlldyhlbGVtZW50KVxuICB9XG5cbiAgLyoqXG4gICAqIEludGVyYWN0cyB3aXRoIGFuIGVsZW1lbnQgYnkgY2FsbGluZyBhIG1ldGhvZCBvbiBpdCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuXG4gICAqIFJldHJ5aW5nIG9uIEVsZW1lbnROb3RJbnRlcmFjdGFibGVFcnJvciwgRWxlbWVudENsaWNrSW50ZXJjZXB0ZWRFcnJvciwgb3IgU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR8c3RyaW5nfHtzZWxlY3Rvcjogc3RyaW5nfSAmIEludGVyYWN0QXJnc30gZWxlbWVudE9ySWRlbnRpZmllciBUaGUgZWxlbWVudCBvciBhIENTUyBzZWxlY3RvciB0byBmaW5kIHRoZSBlbGVtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBUaGUgbWV0aG9kIG5hbWUgdG8gY2FsbCBvbiB0aGUgZWxlbWVudC5cbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3MgQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIGFzeW5jIGludGVyYWN0KGVsZW1lbnRPcklkZW50aWZpZXIsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHtcbiAgICBsZXQgdHJpZXMgPSAwXG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdHJpZXMrK1xuXG4gICAgICAvKiogQHR5cGUge0ludGVyYWN0QXJncyB8IHVuZGVmaW5lZH0gKi9cbiAgICAgIGxldCBpbnRlcmFjdEFyZ3NcblxuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50T3JJZGVudGlmaWVyID09PSBcIm9iamVjdFwiICYmIGVsZW1lbnRPcklkZW50aWZpZXIgJiYgIWlzV2ViRHJpdmVyRWxlbWVudChlbGVtZW50T3JJZGVudGlmaWVyKSkge1xuICAgICAgICBpbnRlcmFjdEFyZ3MgPSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAgICB9XG5cbiAgICAgIC8qKiBAdHlwZSB7RmluZEFyZ3MgfCB1bmRlZmluZWR9ICovXG4gICAgICBsZXQgZmluZEFyZ3NcblxuICAgICAgaWYgKGludGVyYWN0QXJncykge1xuICAgICAgICAvKiogQHR5cGUge0ZpbmRBcmdzICYge3NlbGVjdG9yPzogc3RyaW5nLCBtZXRob2Q/OiBhbnksIHdpdGhGYWxsYmFjaz86IGFueX19ICovXG4gICAgICAgIGNvbnN0IHNhbml0aXplZEZpbmRBcmdzID0gey4uLmludGVyYWN0QXJnc31cblxuICAgICAgICBkZWxldGUgc2FuaXRpemVkRmluZEFyZ3Muc2VsZWN0b3JcbiAgICAgICAgZGVsZXRlIHNhbml0aXplZEZpbmRBcmdzLm1ldGhvZFxuICAgICAgICBkZWxldGUgc2FuaXRpemVkRmluZEFyZ3Mud2l0aEZhbGxiYWNrXG4gICAgICAgIGZpbmRBcmdzID0gc2FuaXRpemVkRmluZEFyZ3NcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWxlbWVudCA9IGludGVyYWN0QXJnc1xuICAgICAgICA/IGF3YWl0IHRoaXMuX2ZpbmRFbGVtZW50KC8qKiBAdHlwZSB7e3NlbGVjdG9yOiBzdHJpbmd9fSAqLyAoaW50ZXJhY3RBcmdzKS5zZWxlY3RvciwgZmluZEFyZ3MpXG4gICAgICAgIDogYXdhaXQgdGhpcy5fZmluZEVsZW1lbnQoZWxlbWVudE9ySWRlbnRpZmllciwgZmluZEFyZ3MpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChtZXRob2ROYW1lID09PSBcInNlbmRLZXlzXCIpIHtcbiAgICAgICAgICBpZiAoaW50ZXJhY3RBcmdzPy53aXRoRmFsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmludGVyYWN0U2VuZEtleXNXaXRoRmFsbGJhY2soZWxlbWVudCwgLi4uYXJncylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYXdhaXQgZWxlbWVudC5zZW5kS2V5cyguLi5hcmdzKVxuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUgPT09IFwiY2xpY2tcIikge1xuICAgICAgICAgIGlmIChpc1dlYkRyaXZlckVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7RmluZEFyZ3N9ICovXG4gICAgICAgICAgICBjb25zdCBjbGlja0FyZ3MgPSB7fVxuICAgICAgICAgICAgaWYgKGludGVyYWN0QXJncz8ubWV0aG9kICE9PSB1bmRlZmluZWQpIGNsaWNrQXJncy5tZXRob2QgPSBpbnRlcmFjdEFyZ3MubWV0aG9kXG4gICAgICAgICAgICBpZiAoaW50ZXJhY3RBcmdzPy5zY3JvbGxUbyAhPT0gdW5kZWZpbmVkKSBjbGlja0FyZ3Muc2Nyb2xsVG8gPSBpbnRlcmFjdEFyZ3Muc2Nyb2xsVG9cblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jbGljayhlbGVtZW50LCBjbGlja0FyZ3MpXG5cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYXdhaXQgLyoqIEB0eXBlIHt7Y2xpY2s6ICguLi5jbGlja0FyZ3M6IGFueVtdKSA9PiBQcm9taXNlPGFueT59fSAqLyAoZWxlbWVudCkuY2xpY2soLi4uYXJncylcbiAgICAgICAgfSBlbHNlIGlmICghKC8qKiBAdHlwZSB7YW55fSAqLyAoZWxlbWVudCkpW21ldGhvZE5hbWVdKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VsZW1lbnQuY29uc3RydWN0b3IubmFtZX0gaGFzbid0IGFuIGF0dHJpYnV0ZSBuYW1lZDogJHttZXRob2ROYW1lfWApXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mICgvKiogQHR5cGUge2FueX0gKi8gKGVsZW1lbnQpKVttZXRob2ROYW1lXSAhPSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZWxlbWVudC5jb25zdHJ1Y3Rvci5uYW1lfSMke21ldGhvZE5hbWV9IGlzIG5vdCBhIGZ1bmN0aW9uYClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERvbnQgY2FsbCB3aXRoIGNhbmRpZGF0ZSwgYmVjYXVzZSB0aGF0IHdpbGwgYmluZCB0aGUgZnVuY3Rpb24gd3JvbmcuXG4gICAgICAgIHJldHVybiBhd2FpdCAoLyoqIEB0eXBlIHthbnl9ICovIChlbGVtZW50KSlbbWV0aG9kTmFtZV0oLi4uYXJncylcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgY29uc3QgcmV0cnlhYmxlRXJyb3JOYW1lID0gZ2V0UmV0cnlhYmxlSW50ZXJhY3RFcnJvck5hbWUoZXJyb3IpXG5cbiAgICAgICAgICBpZiAocmV0cnlhYmxlRXJyb3JOYW1lKSB7XG4gICAgICAgICAgICAvLyBSZXRyeSBmaW5kaW5nIHRoZSBlbGVtZW50IGFuZCBpbnRlcmFjdGluZyB3aXRoIGl0XG4gICAgICAgICAgICBpZiAodHJpZXMgPj0gMykge1xuICAgICAgICAgICAgICBsZXQgZWxlbWVudERlc2NyaXB0aW9uXG5cbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50T3JJZGVudGlmaWVyID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50RGVzY3JpcHRpb24gPSBgQ1NTIHNlbGVjdG9yICR7ZWxlbWVudE9ySWRlbnRpZmllcn1gXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudERlc2NyaXB0aW9uID0gYCR7ZWxlbWVudC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke2VsZW1lbnREZXNjcmlwdGlvbn0gJHttZXRob2ROYW1lfSBmYWlsZWQgYWZ0ZXIgJHt0cmllc30gdHJpZXMgLSAke3JldHJ5YWJsZUVycm9yTmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gLCBlcnJvcilcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGF3YWl0IHdhaXQoNTApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke2VsZW1lbnQuY29uc3RydWN0b3IubmFtZX0gJHttZXRob2ROYW1lfSBmYWlsZWQgLSAke2Vycm9yLmNvbnN0cnVjdG9yLm5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YCwgZXJyb3IpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke2VsZW1lbnQuY29uc3RydWN0b3IubmFtZX0gJHttZXRob2ROYW1lfSBmYWlsZWQgLSAke3R5cGVvZiBlcnJvcn06ICR7ZXJyb3J9YCwgZXJyb3IpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVhZEludGVyYWN0YWJsZVZhbHVlKGVsZW1lbnQpIHtcbiAgICBjb25zdCB2YWx1ZVByb3BlcnR5ID0gYXdhaXQgZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZVByb3BlcnR5ID09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB2YWx1ZVByb3BlcnR5XG4gICAgfVxuXG4gICAgY29uc3QgdGV4dENvbnRlbnQgPSBhd2FpdCBlbGVtZW50LmdldFRleHQoKVxuXG4gICAgaWYgKHR5cGVvZiB0ZXh0Q29udGVudCA9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdGV4dENvbnRlbnRcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0gey4uLmFueX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmtub3duPn1cbiAgICovXG4gIGFzeW5jIGludGVyYWN0U2VuZEtleXNXaXRoRmFsbGJhY2soZWxlbWVudCwgLi4uYXJncykge1xuICAgIGNvbnN0IGV4cGVjdGVkQXBwZW5kID0gZ2V0U2VuZEtleXNUZXh0QXBwZW5kKC4uLmFyZ3MpXG4gICAgY29uc3QgYmVmb3JlVmFsdWUgPSBhd2FpdCB0aGlzLnJlYWRJbnRlcmFjdGFibGVWYWx1ZShlbGVtZW50KVxuICAgIGNvbnN0IHNlbmRLZXlzUmVzdWx0ID0gYXdhaXQgZWxlbWVudC5zZW5kS2V5cyguLi5hcmdzKVxuICAgIGNvbnN0IGFmdGVyVmFsdWUgPSBhd2FpdCB0aGlzLnJlYWRJbnRlcmFjdGFibGVWYWx1ZShlbGVtZW50KVxuXG4gICAgaWYgKHR5cGVvZiBiZWZvcmVWYWx1ZSA9PSBcInN0cmluZ1wiICYmIHR5cGVvZiBhZnRlclZhbHVlID09IFwic3RyaW5nXCIgJiYgYWZ0ZXJWYWx1ZSAhPT0gYmVmb3JlVmFsdWUpIHtcbiAgICAgIHJldHVybiBzZW5kS2V5c1Jlc3VsdFxuICAgIH1cblxuICAgIGNvbnN0IG5leHRWYWx1ZSA9IGdldFNlbmRLZXlzVXNlc1NlbGVjdEFsbEFuZERlbGV0ZSguLi5hcmdzKSA/IGV4cGVjdGVkQXBwZW5kIDogYCR7YmVmb3JlVmFsdWUgfHwgXCJcIn0ke2V4cGVjdGVkQXBwZW5kfWBcblxuICAgIGlmICh0eXBlb2YgYmVmb3JlVmFsdWUgPT0gXCJzdHJpbmdcIiAmJiBuZXh0VmFsdWUgPT09IGJlZm9yZVZhbHVlKSB7XG4gICAgICByZXR1cm4gc2VuZEtleXNSZXN1bHRcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmV4ZWN1dGVTY3JpcHQoYFxuICAgICAgY29uc3QgZWxlbWVudCA9IGFyZ3VtZW50c1swXVxuICAgICAgY29uc3QgbmV4dFZhbHVlID0gU3RyaW5nKGFyZ3VtZW50c1sxXSA/PyBcIlwiKVxuXG4gICAgICBpZiAodHlwZW9mIGVsZW1lbnQuZm9jdXMgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGVsZW1lbnQuZm9jdXMoKVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGVsZW1lbnQudmFsdWUgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZWxlbWVudClcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG90eXBlLCBcInZhbHVlXCIpIHx8IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LkhUTUxUZXh0QXJlYUVsZW1lbnQucHJvdG90eXBlLCBcInZhbHVlXCIpIHx8IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LkhUTUxJbnB1dEVsZW1lbnQucHJvdG90eXBlLCBcInZhbHVlXCIpXG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBTdHJpbmcoZWxlbWVudC52YWx1ZSlcblxuICAgICAgICBpZiAoZGVzY3JpcHRvciAmJiB0eXBlb2YgZGVzY3JpcHRvci5zZXQgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgZGVzY3JpcHRvci5zZXQuY2FsbChlbGVtZW50LCBuZXh0VmFsdWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWxlbWVudC52YWx1ZSA9IG5leHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVsZW1lbnQuX3ZhbHVlVHJhY2tlciAmJiB0eXBlb2YgZWxlbWVudC5fdmFsdWVUcmFja2VyLnNldFZhbHVlID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGVsZW1lbnQuX3ZhbHVlVHJhY2tlci5zZXRWYWx1ZShwcmV2aW91c1ZhbHVlKVxuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIsIHtidWJibGVzOiB0cnVlfSkpXG4gICAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJjaGFuZ2VcIiwge2J1YmJsZXM6IHRydWV9KSlcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWVcbiAgICAgIH1cblxuICAgICAgaWYgKGVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IG5leHRWYWx1ZVxuICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiaW5wdXRcIiwge2J1YmJsZXM6IHRydWV9KSlcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudGV4dENvbnRlbnRcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGxcbiAgICBgLCBlbGVtZW50LCBuZXh0VmFsdWUpXG5cbiAgICByZXR1cm4gc2VuZEtleXNSZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtXYWl0Rm9yTm9TZWxlY3RvckFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JOb1NlbGVjdG9yKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCB7dXNlQmFzZVNlbGVjdG9yLCAuLi5yZXN0QXJnc30gPSBhcmdzXG5cbiAgICBpZiAoT2JqZWN0LmtleXMocmVzdEFyZ3MpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBhcmdzOiAke09iamVjdC5rZXlzKHJlc3RBcmdzKS5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICBjb25zdCBhY3R1YWxTZWxlY3RvciA9IHVzZUJhc2VTZWxlY3RvciA/IHRoaXMuZ2V0U2VsZWN0b3Ioc2VsZWN0b3IpIDogc2VsZWN0b3JcblxuICAgIGF3YWl0IHRoaXMuZHJpdmVyU2V0VGltZW91dHMoMClcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl93aXRoUmV0aHJvd25FcnJvcnMoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLndhaXQoXG4gICAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmZpbmRFbGVtZW50cyhCeS5jc3MoYWN0dWFsU2VsZWN0b3IpKVxuXG4gICAgICAgICAgICAvLyBOb3QgZm91bmQgYXQgYWxsXG4gICAgICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZvdW5kIGJ1dCBub3QgdmlzaWJsZVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgaXNEaXNwbGF5ZWQgPSBhd2FpdCBlbGVtZW50c1swXS5pc0Rpc3BsYXllZCgpXG5cbiAgICAgICAgICAgICAgcmV0dXJuICFpc0Rpc3BsYXllZFxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiZcbiAgICAgICAgICAgICAgICAoZXJyb3IuY29uc3RydWN0b3IubmFtZSA9PT0gXCJTdGFsZUVsZW1lbnRSZWZlcmVuY2VFcnJvclwiIHx8IGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJzdGFsZSBlbGVtZW50IHJlZmVyZW5jZVwiKSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGhpcy5nZXRUaW1lb3V0cygpXG4gICAgICAgIClcbiAgICAgIH0pXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMucmVzdG9yZVRpbWVvdXRzKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPGFueT59IGNhbGxiYWNrXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBhc3luYyBfd2l0aFJldGhyb3duRXJyb3JzKGNhbGxiYWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjaygpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdlYkRyaXZlckVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGBTZWxlbml1bSAke2Vycm9yLmNvbnN0cnVjdG9yLm5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YCwgZXJyb3IpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -4,7 +4,7 @@ import ClientWebSocket from "scoundrel-remote-eval/build/client/connections/web-
|
|
|
4
4
|
import { EventEmitter } from "eventemitter3";
|
|
5
5
|
import SystemTestCommunicator from "./system-test-communicator.js";
|
|
6
6
|
const CLIENT_WEBSOCKET_RECONNECT_DELAY_MS = 250;
|
|
7
|
-
const CLIENT_WEBSOCKET_RECONNECT_WINDOW_MS =
|
|
7
|
+
const CLIENT_WEBSOCKET_RECONNECT_WINDOW_MS = 120000;
|
|
8
8
|
const CLIENT_WEBSOCKET_MAX_RECONNECT_ATTEMPTS = Math.ceil(CLIENT_WEBSOCKET_RECONNECT_WINDOW_MS / CLIENT_WEBSOCKET_RECONNECT_DELAY_MS);
|
|
9
9
|
/** @type {{systemTestBrowserHelper: SystemTestBrowserHelper | null}} */
|
|
10
10
|
const shared = {
|
|
@@ -381,4 +381,4 @@ class SystemTestBrowserHelper {
|
|
|
381
381
|
/** @type {string | undefined} */
|
|
382
382
|
SystemTestBrowserHelper._defaultHost = undefined;
|
|
383
383
|
export default SystemTestBrowserHelper;
|
|
384
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLXRlc3QtYnJvd3Nlci1oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3lzdGVtLXRlc3QtYnJvd3Nlci1oZWxwZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sTUFBTSxNQUFNLDZDQUE2QyxDQUFBO0FBQ2hFLE9BQU8sZUFBZSxNQUFNLG9FQUFvRSxDQUFBO0FBQ2hHLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxlQUFlLENBQUE7QUFFMUMsT0FBTyxzQkFBc0IsTUFBTSwrQkFBK0IsQ0FBQTtBQUVsRSxNQUFNLG1DQUFtQyxHQUFHLEdBQUcsQ0FBQTtBQUMvQyxNQUFNLG9DQUFvQyxHQUFHLEtBQUssQ0FBQTtBQUNsRCxNQUFNLHVDQUF1QyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQ3ZELG9DQUFvQyxHQUFHLG1DQUFtQyxDQUMzRSxDQUFBO0FBRUQsd0VBQXdFO0FBQ3hFLE1BQU0sTUFBTSxHQUFHO0lBQ2IsdUJBQXVCLEVBQUUsSUFBSTtDQUM5QixDQUFBO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxjQUFjLENBQUMsS0FBSztJQUMzQixJQUFJLEtBQUssWUFBWSxLQUFLO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFFeEMsT0FBTyxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7QUFDaEUsQ0FBQztBQUVELE1BQXFCLHVCQUF1QjtJQUsxQzs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUk7UUFDeEIsdUJBQXVCLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQTtJQUM3QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGlCQUFpQixDQUFDLGFBQWEsRUFBRSxRQUFRO1FBQ3ZDLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUE7UUFDcEMsTUFBTSxNQUFNLEdBQUcsUUFBUSxFQUFFLE1BQU0sQ0FBQTtRQUUv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O0lBQ0gsaUJBQWlCLENBQUMsUUFBUTtRQUN4QixJQUFJLENBQUMsMEJBQTBCLEdBQUcsUUFBUSxDQUFBO0lBQzVDLENBQUM7SUFFRCxzQkFBc0I7SUFDdEIsa0JBQWtCO1FBQ2hCLElBQUksSUFBSSxDQUFDLG9CQUFvQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3pELE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQTtRQUNqRSxDQUFDO1FBRUQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUE7UUFDekMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUE7UUFFckMsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUE7UUFDckMsT0FBTyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFBO0lBQ25DLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUc7UUFDakIsbUJBQW1CO1FBQ25CLE9BQU8sTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFDLENBQUMsQ0FBQTtJQUNsRSxDQUFDOztBQS9aRCxpQ0FBaUM7QUFDMUIsb0NBQVksR0FBRyxTQUFTLEFBQVosQ0FBWTtlQUZaLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQ2xpZW50IGZyb20gXCJzY291bmRyZWwtcmVtb3RlLWV2YWwvYnVpbGQvY2xpZW50L2luZGV4LmpzXCJcbmltcG9ydCBDbGllbnRXZWJTb2NrZXQgZnJvbSBcInNjb3VuZHJlbC1yZW1vdGUtZXZhbC9idWlsZC9jbGllbnQvY29ubmVjdGlvbnMvd2ViLXNvY2tldC9pbmRleC5qc1wiXG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSBcImV2ZW50ZW1pdHRlcjNcIlxuXG5pbXBvcnQgU3lzdGVtVGVzdENvbW11bmljYXRvciBmcm9tIFwiLi9zeXN0ZW0tdGVzdC1jb21tdW5pY2F0b3IuanNcIlxuXG5jb25zdCBDTElFTlRfV0VCU09DS0VUX1JFQ09OTkVDVF9ERUxBWV9NUyA9IDI1MFxuY29uc3QgQ0xJRU5UX1dFQlNPQ0tFVF9SRUNPTk5FQ1RfV0lORE9XX01TID0gMzAwMDBcbmNvbnN0IENMSUVOVF9XRUJTT0NLRVRfTUFYX1JFQ09OTkVDVF9BVFRFTVBUUyA9IE1hdGguY2VpbChcbiAgQ0xJRU5UX1dFQlNPQ0tFVF9SRUNPTk5FQ1RfV0lORE9XX01TIC8gQ0xJRU5UX1dFQlNPQ0tFVF9SRUNPTk5FQ1RfREVMQVlfTVNcbilcblxuLyoqIEB0eXBlIHt7c3lzdGVtVGVzdEJyb3dzZXJIZWxwZXI6IFN5c3RlbVRlc3RCcm93c2VySGVscGVyIHwgbnVsbH19ICovXG5jb25zdCBzaGFyZWQgPSB7XG4gIHN5c3RlbVRlc3RCcm93c2VySGVscGVyOiBudWxsXG59XG5cbi8qKlxuICogQHBhcmFtIHtFdmVudCB8IEVycm9yfSBlcnJvclxuICogQHJldHVybnMge0Vycm9yfVxuICovXG5mdW5jdGlvbiB3ZWJTb2NrZXRFcnJvcihlcnJvcikge1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIGVycm9yXG5cbiAgcmV0dXJuIG5ldyBFcnJvcihgV2ViU29ja2V0IGNvbm5lY3Rpb24gZmFpbGVkOiAke2Vycm9yLnR5cGV9YClcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIge1xuICAvKiogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH0gKi9cbiAgc3RhdGljIF9kZWZhdWx0SG9zdCA9IHVuZGVmaW5lZFxuICBjbGllbnRXZWJTb2NrZXRSZWNvbm5lY3RBdHRlbXB0cyA9IDBcblxuICAvKipcbiAgICogU2V0cyB0aGUgZGVmYXVsdCBob3N0IGZvciBhbGwgYnJvd3NlciBoZWxwZXJzLiBVc2UgdGhpcyB0byBvdmVycmlkZSB0aGVcbiAgICogYXV0by1kZXRlY3RlZCBob3N0IHdoZW4gRVhQT19QVUJMSUNfKiBlbnYgdmFycyBjYW5ub3QgYmUgaW5saW5lZCAoZS5nLixcbiAgICogY29kZSBpbiBub2RlX21vZHVsZXMgaXMgbm90IHByb2Nlc3NlZCBieSBiYWJlbC1wcmVzZXQtZXhwbykuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBob3N0XG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHNldERlZmF1bHRIb3N0KGhvc3QpIHtcbiAgICBTeXN0ZW1UZXN0QnJvd3NlckhlbHBlci5fZGVmYXVsdEhvc3QgPSBob3N0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtZXRlck5hbWVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGZhbGxiYWNrXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBnZXRTeXN0ZW1UZXN0UG9ydChwYXJhbWV0ZXJOYW1lLCBmYWxsYmFjaykge1xuICAgIGNvbnN0IGxvY2F0aW9uID0gZ2xvYmFsVGhpcy5sb2NhdGlvblxuICAgIGNvbnN0IHNlYXJjaCA9IGxvY2F0aW9uPy5zZWFyY2hcblxuICAgIGlmICghc2VhcmNoKSB7XG4gICAgICByZXR1cm4gZmFsbGJhY2tcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoc2VhcmNoKS5nZXQocGFyYW1ldGVyTmFtZSlcblxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxsYmFja1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSlcblxuICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHBhcnNlZCkgJiYgcGFyc2VkID4gMCA/IHBhcnNlZCA6IGZhbGxiYWNrXG4gIH1cblxuICAvKiogQHJldHVybnMge1N5c3RlbVRlc3RCcm93c2VySGVscGVyIHwgbnVsbH0gKi9cbiAgc3RhdGljIGdldEN1cnJlbnQoKSB7XG4gICAgcmV0dXJuIHNoYXJlZC5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlclxuICB9XG5cbiAgc3RhdGljIGN1cnJlbnQoKSB7XG4gICAgaWYgKCFzaGFyZWQuc3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGN1cnJlbnQgU3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIgc2V0XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHNoYXJlZC5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlclxuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jb21tdW5pY2F0b3IgPSBuZXcgU3lzdGVtVGVzdENvbW11bmljYXRvcih7cGFyZW50OiB0aGlzLCBvbkNvbW1hbmQ6IHRoaXMub25Db21tYW5kfSlcbiAgICB0aGlzLl9lbmFibGVkID0gZmFsc2VcbiAgICB0aGlzLl9oYXNJbml0aWFsaXplZCA9IGZhbHNlXG4gICAgdGhpcy5ldmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKClcblxuICAgIHNoYXJlZC5zeXN0ZW1UZXN0QnJvd3NlckhlbHBlciA9IHRoaXNcblxuICAgIHRoaXMuc3RhcnRTY291bmRyZWwoKVxuICB9XG5cbiAgYXN5bmMgc3RhcnRTY291bmRyZWwoKSB7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuZ2V0U3lzdGVtVGVzdEhvc3QoKVxuICAgIGNvbnN0IHNjb3VuZHJlbFBvcnQgPSB0aGlzLmdldFN5c3RlbVRlc3RQb3J0KFwic3lzdGVtVGVzdFNjb3VuZHJlbFBvcnRcIiwgODA5MClcblxuICAgIHRoaXMuc2NvdW5kcmVsV3MgPSBuZXcgV2ViU29ja2V0KGB3czovLyR7aG9zdH06JHtzY291bmRyZWxQb3J0fWApXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgdGhpcy5zY291bmRyZWxDbGllbnRXZWJTb2NrZXQgPSBuZXcgQ2xpZW50V2ViU29ja2V0KHRoaXMuc2NvdW5kcmVsV3MpXG5cbiAgICBhd2FpdCB0aGlzLnNjb3VuZHJlbENsaWVudFdlYlNvY2tldC53YWl0Rm9yT3BlbmVkKClcblxuICAgIHRoaXMuc2NvdW5kcmVsQ2xpZW50ID0gbmV3IENsaWVudCh0aGlzLnNjb3VuZHJlbENsaWVudFdlYlNvY2tldCwge2VuYWJsZVNlcnZlckNvbnRyb2w6IHRydWV9KVxuICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJzY291bmRyZWxTdGFydGVkXCIpXG4gIH1cblxuICB3YWl0Rm9yU2NvdW5kcmVsU3RhcnRlZCgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGlmICh0aGlzLnNjb3VuZHJlbENsaWVudCkge1xuICAgICAgICByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXZlbnRzLm9uY2UoXCJzY291bmRyZWxTdGFydGVkXCIsICgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZ2V0U2NvdW5kcmVsKCkge1xuICAgIGlmICghdGhpcy5zY291bmRyZWxDbGllbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNjb3VuZHJlbCBjbGllbnQgaXMgbm90IHN0YXJ0ZWQgeWV0XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2NvdW5kcmVsQ2xpZW50XG4gIH1cblxuICBjb25uZWN0T25FcnJvcigpIHtcbiAgICBpZiAoIXdpbmRvdz8uYWRkRXZlbnRMaXN0ZW5lcikgcmV0dXJuXG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIChldmVudCkgPT4ge1xuICAgICAgdGhpcy5oYW5kbGVFcnJvcih7XG4gICAgICAgIHR5cGU6IFwiZXJyb3JcIixcbiAgICAgICAgZXJyb3I6IGV2ZW50LmVycm9yLFxuICAgICAgICBlcnJvckNsYXNzOiBldmVudC5lcnJvcj8ubmFtZSxcbiAgICAgICAgZmlsZTogZXZlbnQuZmlsZW5hbWUsXG4gICAgICAgIGxpbmU6IGV2ZW50LmxpbmVubyxcbiAgICAgICAgbWVzc2FnZTogZXZlbnQubWVzc2FnZSB8fCBcIlVua25vd24gZXJyb3JcIixcbiAgICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZlxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgY29ubmVjdFVuaGFuZGxlZFJlamVjdGlvbigpIHtcbiAgICBpZiAoIXdpbmRvdz8uYWRkRXZlbnRMaXN0ZW5lcikgcmV0dXJuXG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInVuaGFuZGxlZHJlamVjdGlvblwiLCAoZXZlbnQpID0+IHtcbiAgICAgIHRoaXMuaGFuZGxlRXJyb3Ioe1xuICAgICAgICB0eXBlOiBcInVuaGFuZGxlZHJlamVjdGlvblwiLFxuICAgICAgICBlcnJvcjogZXZlbnQucmVhc29uLFxuICAgICAgICBlcnJvckNsYXNzOiBcIlVuaGFuZGxlZFJlamVjdGlvblwiLFxuICAgICAgICBtZXNzYWdlOiBldmVudC5yZWFzb24ubWVzc2FnZSB8fCBldmVudC5yZWFzb24gfHwgXCJVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24gd2l0aG91dCBhIG1lc3NhZ2VcIixcbiAgICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZlxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YS5iYWNrdHJhY2VdXG4gICAqIEBwYXJhbSB7RXJyb3J9IFtkYXRhLmVycm9yXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RhdGEuZXJyb3JDbGFzc11cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLmZpbGVdXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGF0YS5saW5lXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RhdGEubWVzc2FnZV1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLnR5cGVdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YS51cmxdXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgaGFuZGxlRXJyb3IoZGF0YSkge1xuICAgIGxldCBiYWNrdHJhY2VcblxuICAgIGlmIChkYXRhLmVycm9yICYmIGRhdGEuZXJyb3Iuc3RhY2spIHtcbiAgICAgIGJhY2t0cmFjZSA9IGRhdGEuZXJyb3Iuc3RhY2suc3BsaXQoXCJcXG5cIilcbiAgICAgIGJhY2t0cmFjZS5zaGlmdCgpXG4gICAgICBiYWNrdHJhY2UgPSBiYWNrdHJhY2Uuam9pbihcIlxcblwiKVxuICAgIH0gZWxzZSBpZiAoZGF0YS5maWxlKSB7XG4gICAgICBiYWNrdHJhY2UgPSBgJHtkYXRhLmZpbGV9OiR7ZGF0YS5saW5lfWBcbiAgICB9XG5cbiAgICBkYXRhLmJhY2t0cmFjZSA9IGJhY2t0cmFjZVxuXG4gICAgdGhpcy5jb21tdW5pY2F0b3Iuc2VuZENvbW1hbmQoZGF0YSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgY29ubmVjdFdlYlNvY2tldCgpIHtcbiAgICB0aGlzLmNsaWVudFdlYlNvY2tldFJlY29ubmVjdEF0dGVtcHRzID0gMFxuICAgIHRoaXMuY29ubmVjdENsaWVudFdlYlNvY2tldCgpXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIGNvbm5lY3RDbGllbnRXZWJTb2NrZXQoKSB7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuZ2V0U3lzdGVtVGVzdEhvc3QoKVxuICAgIGNvbnN0IGNsaWVudFdzUG9ydCA9IHRoaXMuZ2V0U3lzdGVtVGVzdFBvcnQoXCJzeXN0ZW1UZXN0Q2xpZW50V3NQb3J0XCIsIDE5ODUpXG4gICAgY29uc3Qgd2Vic29ja2V0ID0gbmV3IFdlYlNvY2tldChgd3M6Ly8ke2hvc3R9OiR7Y2xpZW50V3NQb3J0fWApXG4gICAgbGV0IG9wZW5lZCA9IGZhbHNlXG4gICAgbGV0IHJlY29ubmVjdFNjaGVkdWxlZCA9IGZhbHNlXG5cbiAgICB0aGlzLndzID0gd2Vic29ja2V0XG4gICAgdGhpcy5jb21tdW5pY2F0b3Iud3MgPSB3ZWJzb2NrZXRcblxuICAgIC8qKiBAcGFyYW0ge0V2ZW50IHwgRXJyb3J9IGVycm9yICovXG4gICAgY29uc3Qgc2NoZWR1bGVSZWNvbm5lY3QgPSAoZXJyb3IpID0+IHtcbiAgICAgIGlmIChvcGVuZWQpIHtcbiAgICAgICAgdGhpcy5jb21tdW5pY2F0b3Iub25FcnJvcih3ZWJTb2NrZXRFcnJvcihlcnJvcikpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAocmVjb25uZWN0U2NoZWR1bGVkIHx8IHRoaXMud3MgIT09IHdlYnNvY2tldCkgcmV0dXJuXG5cbiAgICAgIHRoaXMuY2xpZW50V2ViU29ja2V0UmVjb25uZWN0QXR0ZW1wdHMgKz0gMVxuICAgICAgaWYgKHRoaXMuY2xpZW50V2ViU29ja2V0UmVjb25uZWN0QXR0ZW1wdHMgPiBDTElFTlRfV0VCU09DS0VUX01BWF9SRUNPTk5FQ1RfQVRURU1QVFMpIHtcbiAgICAgICAgdGhpcy5jb21tdW5pY2F0b3Iub25FcnJvcih3ZWJTb2NrZXRFcnJvcihlcnJvcikpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICByZWNvbm5lY3RTY2hlZHVsZWQgPSB0cnVlXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKG9wZW5lZCB8fCB0aGlzLndzICE9PSB3ZWJzb2NrZXQpIHJldHVyblxuXG4gICAgICAgIHRoaXMuY29ubmVjdENsaWVudFdlYlNvY2tldCgpXG4gICAgICB9LCBDTElFTlRfV0VCU09DS0VUX1JFQ09OTkVDVF9ERUxBWV9NUylcbiAgICB9XG5cbiAgICB3ZWJzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIHNjaGVkdWxlUmVjb25uZWN0KVxuICAgIHdlYnNvY2tldC5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgc2NoZWR1bGVSZWNvbm5lY3QpXG4gICAgd2Vic29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJvcGVuXCIsICgpID0+IHtcbiAgICAgIG9wZW5lZCA9IHRydWVcbiAgICAgIHRoaXMuY2xpZW50V2ViU29ja2V0UmVjb25uZWN0QXR0ZW1wdHMgPSAwXG4gICAgICB0aGlzLmNvbW11bmljYXRvci5vbk9wZW4oKVxuICAgIH0pXG4gICAgd2Vic29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIChldmVudCkgPT4gdGhpcy5jb21tdW5pY2F0b3Iub25NZXNzYWdlKGV2ZW50LmRhdGEpKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gIGdldFN5c3RlbVRlc3RIb3N0KCkge1xuICAgIGNvbnN0IGxvY2F0aW9uID0gZ2xvYmFsVGhpcy5sb2NhdGlvblxuICAgIGNvbnN0IGRlZmF1bHRIb3N0ID0gbG9jYXRpb24/Lmhvc3RuYW1lIHx8IFwibG9jYWxob3N0XCJcbiAgICBjb25zdCBzZWFyY2ggPSBsb2NhdGlvbj8uc2VhcmNoXG4gICAgY29uc3QgZW52SG9zdCA9IHByb2Nlc3MuZW52LkVYUE9fUFVCTElDX1NZU1RFTV9URVNUX0hPU1RcblxuICAgIGlmIChlbnZIb3N0KSByZXR1cm4gZW52SG9zdFxuXG4gICAgaWYgKFN5c3RlbVRlc3RCcm93c2VySGVscGVyLl9kZWZhdWx0SG9zdCkgcmV0dXJuIFN5c3RlbVRlc3RCcm93c2VySGVscGVyLl9kZWZhdWx0SG9zdFxuXG4gICAgaWYgKCFzZWFyY2gpIHJldHVybiBkZWZhdWx0SG9zdFxuXG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhzZWFyY2gpXG4gICAgY29uc3QgaG9zdCA9IHBhcmFtcy5nZXQoXCJzeXN0ZW1UZXN0SG9zdFwiKVxuXG4gICAgY29uc3QgcmVzb2x2ZWRIb3N0ID0gaG9zdCB8fCBkZWZhdWx0SG9zdFxuXG4gICAgaWYgKHJlc29sdmVkSG9zdCA9PT0gXCIwLjAuMC4wXCIpIHJldHVybiBcIjEyNy4wLjAuMVwiXG5cbiAgICByZXR1cm4gcmVzb2x2ZWRIb3N0XG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIGVuYWJsZU9uQnJvd3NlcigpIHtcbiAgICBpZiAodGhpcy5fZW5hYmxlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fZW5hYmxlZCA9IHRydWVcbiAgICB0aGlzLmNvbm5lY3RXZWJTb2NrZXQoKVxuICAgIHRoaXMuY29ubmVjdE9uRXJyb3IoKVxuICAgIHRoaXMuY29ubmVjdFVuaGFuZGxlZFJlamVjdGlvbigpXG4gICAgdGhpcy5vdmVycmlkZUNvbnNvbGVMb2coKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFufSAqL1xuICBnZXRFbmFibGVkKCkgeyByZXR1cm4gdGhpcy5fZW5hYmxlZCB9XG5cbiAgLyoqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9ICovXG4gIGdldEV2ZW50cygpIHsgcmV0dXJuIHRoaXMuZXZlbnRzIH1cblxuICAvKipcbiAgICogRW1pdHMgYSBjb21tYW5kIGV2ZW50IGFuZCB0aHJvd3Mgd2hlbiBubyBsaXN0ZW5lciBoYW5kbGVkIGl0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7e3BhdGg6IHN0cmluZ319IHBheWxvYWRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBlbWl0Q29tbWFuZEV2ZW50KGV2ZW50TmFtZSwgcGF5bG9hZCkge1xuICAgIGNvbnN0IGRpZEVtaXQgPSB0aGlzLmV2ZW50cy5lbWl0KGV2ZW50TmFtZSwgcGF5bG9hZClcblxuICAgIGlmICghZGlkRW1pdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBsaXN0ZW5lciByZWdpc3RlcmVkIGZvciBjb21tYW5kIGV2ZW50OiAke2V2ZW50TmFtZX0gKCR7cGF5bG9hZC5wYXRofSlgKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZmFrZUNvbnNvbGVFcnJvciA9ICguLi5hcmdzKSA9PiB7XG4gICAgdGhpcy5jb21tdW5pY2F0b3Iuc2VuZENvbW1hbmQoe3R5cGU6IFwiY29uc29sZS5lcnJvclwiLCB2YWx1ZTogdGhpcy5jb25zb2xlTG9nTWVzc2FnZShhcmdzKX0pXG5cbiAgICBpZiAodGhpcy5vcmlnaW5hbENvbnNvbGVFcnJvcikge1xuICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxDb25zb2xlRXJyb3IoLi4uYXJncylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnlbXX0gYXJnc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZha2VDb25zb2xlTG9nID0gKC4uLmFyZ3MpID0+IHtcbiAgICB0aGlzLmNvbW11bmljYXRvci5zZW5kQ29tbWFuZCh7dHlwZTogXCJjb25zb2xlLmxvZ1wiLCB2YWx1ZTogdGhpcy5jb25zb2xlTG9nTWVzc2FnZShhcmdzKX0pXG5cbiAgICBpZiAodGhpcy5vcmlnaW5hbENvbnNvbGVMb2cpIHtcbiAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsQ29uc29sZUxvZyguLi5hcmdzKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gYXJnXG4gICAqIEBwYXJhbSB7YW55W119IFtzY2FubmVkT2JqZWN0c11cbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGNvbnNvbGVMb2dNZXNzYWdlKGFyZywgc2Nhbm5lZE9iamVjdHMgPSBbXSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcbiAgICAgIGlmIChzY2FubmVkT2JqZWN0cy5pbmNsdWRlcyhhcmcpKSB7XG4gICAgICAgIHJldHVybiBcIltyZWN1cnNpdmVdXCJcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNjYW5uZWRPYmplY3RzLnB1c2goYXJnKVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBbXVxuXG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGFyZykge1xuICAgICAgICByZXN1bHQucHVzaCh0aGlzLmNvbnNvbGVMb2dNZXNzYWdlKHZhbHVlLCBzY2FubmVkT2JqZWN0cykpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgaWYgKHNjYW5uZWRPYmplY3RzLmluY2x1ZGVzKGFyZykpIHtcbiAgICAgICAgcmV0dXJuIFwiW3JlY3Vyc2l2ZV1cIlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2Nhbm5lZE9iamVjdHMucHVzaChhcmcpXG4gICAgICB9XG5cbiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGFyZykge1xuICAgICAgICByZXN1bHRba2V5XSA9IHRoaXMuY29uc29sZUxvZ01lc3NhZ2UoYXJnW2tleV0sIHNjYW5uZWRPYmplY3RzKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXJnID09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBgW29iamVjdCAke2FyZz8uY29uc3RydWN0b3I/Lm5hbWV9XWBcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGFyZ1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3tkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+fX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgb25Db21tYW5kID0gYXN5bmMgKHtkYXRhfSkgPT4ge1xuICAgIGlmIChkYXRhLnR5cGUgPT0gXCJpbml0aWFsaXplXCIpIHtcbiAgICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJpbml0aWFsaXplXCIpXG5cbiAgICAgIGlmICghdGhpcy5faGFzSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgdGhpcy5faGFzSW5pdGlhbGl6ZWQgPSB0cnVlXG5cbiAgICAgICAgaWYgKHRoaXMuX29uRmlyc3RJbml0aWFsaXplQ2FsbGJhY2spIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLl9vbkZpcnN0SW5pdGlhbGl6ZUNhbGxiYWNrKClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fb25Jbml0aWFsaXplQ2FsbGJhY2spIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fb25Jbml0aWFsaXplQ2FsbGJhY2soKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge3Jlc3VsdDogXCJpbml0aWFsaXplZFwifVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09IFwidGVhcmRvd25cIikge1xuICAgICAgdGhpcy5ldmVudHMuZW1pdChcInRlYXJkb3duXCIpXG5cbiAgICAgIGlmICh0aGlzLl9vblRlYXJkb3duQ2FsbGJhY2spIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fb25UZWFyZG93bkNhbGxiYWNrKClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtyZXN1bHQ6IFwidG9ybi1kb3duXCJ9XG4gICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT0gXCJ3YWl0Rm9yU2NvdW5kcmVsXCIpIHtcbiAgICAgIGF3YWl0IHRoaXMud2FpdEZvclNjb3VuZHJlbFN0YXJ0ZWQoKVxuICAgICAgcmV0dXJuIHtyZXN1bHQ6IFwic2NvdW5kcmVsLXJlYWR5XCJ9XG4gICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT0gXCJ2aXNpdFwiKSB7XG4gICAgICB0aGlzLmVtaXRDb21tYW5kRXZlbnQoXCJuYXZpZ2F0ZVwiLCB7cGF0aDogZGF0YS5wYXRofSlcbiAgICAgIHJldHVybiB7cmVzdWx0OiBcInZpc2l0ZWRcIn1cbiAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PSBcImRpc21pc3NUb1wiKSB7XG4gICAgICB0aGlzLmVtaXRDb21tYW5kRXZlbnQoXCJkaXNtaXNzVG9cIiwge3BhdGg6IGRhdGEucGF0aH0pXG4gICAgICByZXR1cm4ge3Jlc3VsdDogXCJkaXNtaXNzZWRcIn1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNvbW1hbmQgdHlwZSBmb3IgU3lzdGVtVGVzdEJyb3dzZXJIZWxwZXI6ICR7ZGF0YS50eXBlfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oKSA6IHZvaWR9IGNhbGxiYWNrXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgb25Jbml0aWFsaXplKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fb25Jbml0aWFsaXplQ2FsbGJhY2sgPSBjYWxsYmFja1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oKSA6IHZvaWR9IGNhbGxiYWNrXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgb25UZWFyZG93bihjYWxsYmFjaykge1xuICAgIHRoaXMuX29uVGVhcmRvd25DYWxsYmFjayA9IGNhbGxiYWNrXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtmdW5jdGlvbigpIDogdm9pZH0gY2FsbGJhY2tcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBvbkZpcnN0SW5pdGlhbGl6ZShjYWxsYmFjaykge1xuICAgIHRoaXMuX29uRmlyc3RJbml0aWFsaXplQ2FsbGJhY2sgPSBjYWxsYmFja1xuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBvdmVycmlkZUNvbnNvbGVMb2coKSB7XG4gICAgaWYgKHRoaXMub3JpZ2luYWxDb25zb2xlRXJyb3IgfHwgdGhpcy5vcmlnaW5hbENvbnNvbGVMb2cpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnNvbGUgbWV0aG9kcyBoYXMgYWxyZWFkeSBiZWVuIG92ZXJyaWRkZW4hXCIpXG4gICAgfVxuXG4gICAgdGhpcy5vcmlnaW5hbENvbnNvbGVFcnJvciA9IGNvbnNvbGUuZXJyb3JcbiAgICB0aGlzLm9yaWdpbmFsQ29uc29sZUxvZyA9IGNvbnNvbGUubG9nXG5cbiAgICBjb25zb2xlLmVycm9yID0gdGhpcy5mYWtlQ29uc29sZUVycm9yXG4gICAgY29uc29sZS5sb2cgPSB0aGlzLmZha2VDb25zb2xlTG9nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNxbFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pj59XG4gICAqL1xuICBhc3luYyBzZW5kUXVlcnkoc3FsKSB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbW11bmljYXRvci5zZW5kQ29tbWFuZCh7dHlwZTogXCJxdWVyeVwiLCBzcWx9KVxuICB9XG59XG4iXX0=
|
|
384
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLXRlc3QtYnJvd3Nlci1oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3lzdGVtLXRlc3QtYnJvd3Nlci1oZWxwZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sTUFBTSxNQUFNLDZDQUE2QyxDQUFBO0FBQ2hFLE9BQU8sZUFBZSxNQUFNLG9FQUFvRSxDQUFBO0FBQ2hHLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxlQUFlLENBQUE7QUFFMUMsT0FBTyxzQkFBc0IsTUFBTSwrQkFBK0IsQ0FBQTtBQUVsRSxNQUFNLG1DQUFtQyxHQUFHLEdBQUcsQ0FBQTtBQUMvQyxNQUFNLG9DQUFvQyxHQUFHLE1BQU0sQ0FBQTtBQUNuRCxNQUFNLHVDQUF1QyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQ3ZELG9DQUFvQyxHQUFHLG1DQUFtQyxDQUMzRSxDQUFBO0FBRUQsd0VBQXdFO0FBQ3hFLE1BQU0sTUFBTSxHQUFHO0lBQ2IsdUJBQXVCLEVBQUUsSUFBSTtDQUM5QixDQUFBO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxjQUFjLENBQUMsS0FBSztJQUMzQixJQUFJLEtBQUssWUFBWSxLQUFLO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFFeEMsT0FBTyxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7QUFDaEUsQ0FBQztBQUVELE1BQXFCLHVCQUF1QjtJQUsxQzs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUk7UUFDeEIsdUJBQXVCLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQTtJQUM3QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGlCQUFpQixDQUFDLGFBQWEsRUFBRSxRQUFRO1FBQ3ZDLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUE7UUFDcEMsTUFBTSxNQUFNLEdBQUcsUUFBUSxFQUFFLE1BQU0sQ0FBQTtRQUUv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O0lBQ0gsaUJBQWlCLENBQUMsUUFBUTtRQUN4QixJQUFJLENBQUMsMEJBQTBCLEdBQUcsUUFBUSxDQUFBO0lBQzVDLENBQUM7SUFFRCxzQkFBc0I7SUFDdEIsa0JBQWtCO1FBQ2hCLElBQUksSUFBSSxDQUFDLG9CQUFvQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3pELE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQTtRQUNqRSxDQUFDO1FBRUQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUE7UUFDekMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUE7UUFFckMsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUE7UUFDckMsT0FBTyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFBO0lBQ25DLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUc7UUFDakIsbUJBQW1CO1FBQ25CLE9BQU8sTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFDLENBQUMsQ0FBQTtJQUNsRSxDQUFDOztBQS9aRCxpQ0FBaUM7QUFDMUIsb0NBQVksR0FBRyxTQUFTLEFBQVosQ0FBWTtlQUZaLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQ2xpZW50IGZyb20gXCJzY291bmRyZWwtcmVtb3RlLWV2YWwvYnVpbGQvY2xpZW50L2luZGV4LmpzXCJcbmltcG9ydCBDbGllbnRXZWJTb2NrZXQgZnJvbSBcInNjb3VuZHJlbC1yZW1vdGUtZXZhbC9idWlsZC9jbGllbnQvY29ubmVjdGlvbnMvd2ViLXNvY2tldC9pbmRleC5qc1wiXG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSBcImV2ZW50ZW1pdHRlcjNcIlxuXG5pbXBvcnQgU3lzdGVtVGVzdENvbW11bmljYXRvciBmcm9tIFwiLi9zeXN0ZW0tdGVzdC1jb21tdW5pY2F0b3IuanNcIlxuXG5jb25zdCBDTElFTlRfV0VCU09DS0VUX1JFQ09OTkVDVF9ERUxBWV9NUyA9IDI1MFxuY29uc3QgQ0xJRU5UX1dFQlNPQ0tFVF9SRUNPTk5FQ1RfV0lORE9XX01TID0gMTIwMDAwXG5jb25zdCBDTElFTlRfV0VCU09DS0VUX01BWF9SRUNPTk5FQ1RfQVRURU1QVFMgPSBNYXRoLmNlaWwoXG4gIENMSUVOVF9XRUJTT0NLRVRfUkVDT05ORUNUX1dJTkRPV19NUyAvIENMSUVOVF9XRUJTT0NLRVRfUkVDT05ORUNUX0RFTEFZX01TXG4pXG5cbi8qKiBAdHlwZSB7e3N5c3RlbVRlc3RCcm93c2VySGVscGVyOiBTeXN0ZW1UZXN0QnJvd3NlckhlbHBlciB8IG51bGx9fSAqL1xuY29uc3Qgc2hhcmVkID0ge1xuICBzeXN0ZW1UZXN0QnJvd3NlckhlbHBlcjogbnVsbFxufVxuXG4vKipcbiAqIEBwYXJhbSB7RXZlbnQgfCBFcnJvcn0gZXJyb3JcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuZnVuY3Rpb24gd2ViU29ja2V0RXJyb3IoZXJyb3IpIHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBlcnJvclxuXG4gIHJldHVybiBuZXcgRXJyb3IoYFdlYlNvY2tldCBjb25uZWN0aW9uIGZhaWxlZDogJHtlcnJvci50eXBlfWApXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5c3RlbVRlc3RCcm93c2VySGVscGVyIHtcbiAgLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gIHN0YXRpYyBfZGVmYXVsdEhvc3QgPSB1bmRlZmluZWRcbiAgY2xpZW50V2ViU29ja2V0UmVjb25uZWN0QXR0ZW1wdHMgPSAwXG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGRlZmF1bHQgaG9zdCBmb3IgYWxsIGJyb3dzZXIgaGVscGVycy4gVXNlIHRoaXMgdG8gb3ZlcnJpZGUgdGhlXG4gICAqIGF1dG8tZGV0ZWN0ZWQgaG9zdCB3aGVuIEVYUE9fUFVCTElDXyogZW52IHZhcnMgY2Fubm90IGJlIGlubGluZWQgKGUuZy4sXG4gICAqIGNvZGUgaW4gbm9kZV9tb2R1bGVzIGlzIG5vdCBwcm9jZXNzZWQgYnkgYmFiZWwtcHJlc2V0LWV4cG8pLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaG9zdFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBzZXREZWZhdWx0SG9zdChob3N0KSB7XG4gICAgU3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIuX2RlZmF1bHRIb3N0ID0gaG9zdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbWV0ZXJOYW1lXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmYWxsYmFja1xuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0U3lzdGVtVGVzdFBvcnQocGFyYW1ldGVyTmFtZSwgZmFsbGJhY2spIHtcbiAgICBjb25zdCBsb2NhdGlvbiA9IGdsb2JhbFRoaXMubG9jYXRpb25cbiAgICBjb25zdCBzZWFyY2ggPSBsb2NhdGlvbj8uc2VhcmNoXG5cbiAgICBpZiAoIXNlYXJjaCkge1xuICAgICAgcmV0dXJuIGZhbGxiYWNrXG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHNlYXJjaCkuZ2V0KHBhcmFtZXRlck5hbWUpXG5cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gZmFsbGJhY2tcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUpXG5cbiAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihwYXJzZWQpICYmIHBhcnNlZCA+IDAgPyBwYXJzZWQgOiBmYWxsYmFja1xuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtTeXN0ZW1UZXN0QnJvd3NlckhlbHBlciB8IG51bGx9ICovXG4gIHN0YXRpYyBnZXRDdXJyZW50KCkge1xuICAgIHJldHVybiBzaGFyZWQuc3lzdGVtVGVzdEJyb3dzZXJIZWxwZXJcbiAgfVxuXG4gIHN0YXRpYyBjdXJyZW50KCkge1xuICAgIGlmICghc2hhcmVkLnN5c3RlbVRlc3RCcm93c2VySGVscGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjdXJyZW50IFN5c3RlbVRlc3RCcm93c2VySGVscGVyIHNldFwiKVxuICAgIH1cblxuICAgIHJldHVybiBzaGFyZWQuc3lzdGVtVGVzdEJyb3dzZXJIZWxwZXJcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY29tbXVuaWNhdG9yID0gbmV3IFN5c3RlbVRlc3RDb21tdW5pY2F0b3Ioe3BhcmVudDogdGhpcywgb25Db21tYW5kOiB0aGlzLm9uQ29tbWFuZH0pXG4gICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlXG4gICAgdGhpcy5faGFzSW5pdGlhbGl6ZWQgPSBmYWxzZVxuICAgIHRoaXMuZXZlbnRzID0gbmV3IEV2ZW50RW1pdHRlcigpXG5cbiAgICBzaGFyZWQuc3lzdGVtVGVzdEJyb3dzZXJIZWxwZXIgPSB0aGlzXG5cbiAgICB0aGlzLnN0YXJ0U2NvdW5kcmVsKClcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0U2NvdW5kcmVsKCkge1xuICAgIGNvbnN0IGhvc3QgPSB0aGlzLmdldFN5c3RlbVRlc3RIb3N0KClcbiAgICBjb25zdCBzY291bmRyZWxQb3J0ID0gdGhpcy5nZXRTeXN0ZW1UZXN0UG9ydChcInN5c3RlbVRlc3RTY291bmRyZWxQb3J0XCIsIDgwOTApXG5cbiAgICB0aGlzLnNjb3VuZHJlbFdzID0gbmV3IFdlYlNvY2tldChgd3M6Ly8ke2hvc3R9OiR7c2NvdW5kcmVsUG9ydH1gKVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIHRoaXMuc2NvdW5kcmVsQ2xpZW50V2ViU29ja2V0ID0gbmV3IENsaWVudFdlYlNvY2tldCh0aGlzLnNjb3VuZHJlbFdzKVxuXG4gICAgYXdhaXQgdGhpcy5zY291bmRyZWxDbGllbnRXZWJTb2NrZXQud2FpdEZvck9wZW5lZCgpXG5cbiAgICB0aGlzLnNjb3VuZHJlbENsaWVudCA9IG5ldyBDbGllbnQodGhpcy5zY291bmRyZWxDbGllbnRXZWJTb2NrZXQsIHtlbmFibGVTZXJ2ZXJDb250cm9sOiB0cnVlfSlcbiAgICB0aGlzLmV2ZW50cy5lbWl0KFwic2NvdW5kcmVsU3RhcnRlZFwiKVxuICB9XG5cbiAgd2FpdEZvclNjb3VuZHJlbFN0YXJ0ZWQoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBpZiAodGhpcy5zY291bmRyZWxDbGllbnQpIHtcbiAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmV2ZW50cy5vbmNlKFwic2NvdW5kcmVsU3RhcnRlZFwiLCAoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGdldFNjb3VuZHJlbCgpIHtcbiAgICBpZiAoIXRoaXMuc2NvdW5kcmVsQ2xpZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTY291bmRyZWwgY2xpZW50IGlzIG5vdCBzdGFydGVkIHlldFwiKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNjb3VuZHJlbENsaWVudFxuICB9XG5cbiAgY29ubmVjdE9uRXJyb3IoKSB7XG4gICAgaWYgKCF3aW5kb3c/LmFkZEV2ZW50TGlzdGVuZXIpIHJldHVyblxuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCAoZXZlbnQpID0+IHtcbiAgICAgIHRoaXMuaGFuZGxlRXJyb3Ioe1xuICAgICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICAgIGVycm9yOiBldmVudC5lcnJvcixcbiAgICAgICAgZXJyb3JDbGFzczogZXZlbnQuZXJyb3I/Lm5hbWUsXG4gICAgICAgIGZpbGU6IGV2ZW50LmZpbGVuYW1lLFxuICAgICAgICBsaW5lOiBldmVudC5saW5lbm8sXG4gICAgICAgIG1lc3NhZ2U6IGV2ZW50Lm1lc3NhZ2UgfHwgXCJVbmtub3duIGVycm9yXCIsXG4gICAgICAgIHVybDogd2luZG93LmxvY2F0aW9uLmhyZWZcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIGNvbm5lY3RVbmhhbmRsZWRSZWplY3Rpb24oKSB7XG4gICAgaWYgKCF3aW5kb3c/LmFkZEV2ZW50TGlzdGVuZXIpIHJldHVyblxuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ1bmhhbmRsZWRyZWplY3Rpb25cIiwgKGV2ZW50KSA9PiB7XG4gICAgICB0aGlzLmhhbmRsZUVycm9yKHtcbiAgICAgICAgdHlwZTogXCJ1bmhhbmRsZWRyZWplY3Rpb25cIixcbiAgICAgICAgZXJyb3I6IGV2ZW50LnJlYXNvbixcbiAgICAgICAgZXJyb3JDbGFzczogXCJVbmhhbmRsZWRSZWplY3Rpb25cIixcbiAgICAgICAgbWVzc2FnZTogZXZlbnQucmVhc29uLm1lc3NhZ2UgfHwgZXZlbnQucmVhc29uIHx8IFwiVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIHdpdGhvdXQgYSBtZXNzYWdlXCIsXG4gICAgICAgIHVybDogd2luZG93LmxvY2F0aW9uLmhyZWZcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RhdGEuYmFja3RyYWNlXVxuICAgKiBAcGFyYW0ge0Vycm9yfSBbZGF0YS5lcnJvcl1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLmVycm9yQ2xhc3NdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YS5maWxlXVxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RhdGEubGluZV1cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkYXRhLm1lc3NhZ2VdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGF0YS50eXBlXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2RhdGEudXJsXVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGhhbmRsZUVycm9yKGRhdGEpIHtcbiAgICBsZXQgYmFja3RyYWNlXG5cbiAgICBpZiAoZGF0YS5lcnJvciAmJiBkYXRhLmVycm9yLnN0YWNrKSB7XG4gICAgICBiYWNrdHJhY2UgPSBkYXRhLmVycm9yLnN0YWNrLnNwbGl0KFwiXFxuXCIpXG4gICAgICBiYWNrdHJhY2Uuc2hpZnQoKVxuICAgICAgYmFja3RyYWNlID0gYmFja3RyYWNlLmpvaW4oXCJcXG5cIilcbiAgICB9IGVsc2UgaWYgKGRhdGEuZmlsZSkge1xuICAgICAgYmFja3RyYWNlID0gYCR7ZGF0YS5maWxlfToke2RhdGEubGluZX1gXG4gICAgfVxuXG4gICAgZGF0YS5iYWNrdHJhY2UgPSBiYWNrdHJhY2VcblxuICAgIHRoaXMuY29tbXVuaWNhdG9yLnNlbmRDb21tYW5kKGRhdGEpXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIGNvbm5lY3RXZWJTb2NrZXQoKSB7XG4gICAgdGhpcy5jbGllbnRXZWJTb2NrZXRSZWNvbm5lY3RBdHRlbXB0cyA9IDBcbiAgICB0aGlzLmNvbm5lY3RDbGllbnRXZWJTb2NrZXQoKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBjb25uZWN0Q2xpZW50V2ViU29ja2V0KCkge1xuICAgIGNvbnN0IGhvc3QgPSB0aGlzLmdldFN5c3RlbVRlc3RIb3N0KClcbiAgICBjb25zdCBjbGllbnRXc1BvcnQgPSB0aGlzLmdldFN5c3RlbVRlc3RQb3J0KFwic3lzdGVtVGVzdENsaWVudFdzUG9ydFwiLCAxOTg1KVxuICAgIGNvbnN0IHdlYnNvY2tldCA9IG5ldyBXZWJTb2NrZXQoYHdzOi8vJHtob3N0fToke2NsaWVudFdzUG9ydH1gKVxuICAgIGxldCBvcGVuZWQgPSBmYWxzZVxuICAgIGxldCByZWNvbm5lY3RTY2hlZHVsZWQgPSBmYWxzZVxuXG4gICAgdGhpcy53cyA9IHdlYnNvY2tldFxuICAgIHRoaXMuY29tbXVuaWNhdG9yLndzID0gd2Vic29ja2V0XG5cbiAgICAvKiogQHBhcmFtIHtFdmVudCB8IEVycm9yfSBlcnJvciAqL1xuICAgIGNvbnN0IHNjaGVkdWxlUmVjb25uZWN0ID0gKGVycm9yKSA9PiB7XG4gICAgICBpZiAob3BlbmVkKSB7XG4gICAgICAgIHRoaXMuY29tbXVuaWNhdG9yLm9uRXJyb3Iod2ViU29ja2V0RXJyb3IoZXJyb3IpKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29ubmVjdFNjaGVkdWxlZCB8fCB0aGlzLndzICE9PSB3ZWJzb2NrZXQpIHJldHVyblxuXG4gICAgICB0aGlzLmNsaWVudFdlYlNvY2tldFJlY29ubmVjdEF0dGVtcHRzICs9IDFcbiAgICAgIGlmICh0aGlzLmNsaWVudFdlYlNvY2tldFJlY29ubmVjdEF0dGVtcHRzID4gQ0xJRU5UX1dFQlNPQ0tFVF9NQVhfUkVDT05ORUNUX0FUVEVNUFRTKSB7XG4gICAgICAgIHRoaXMuY29tbXVuaWNhdG9yLm9uRXJyb3Iod2ViU29ja2V0RXJyb3IoZXJyb3IpKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgcmVjb25uZWN0U2NoZWR1bGVkID0gdHJ1ZVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChvcGVuZWQgfHwgdGhpcy53cyAhPT0gd2Vic29ja2V0KSByZXR1cm5cblxuICAgICAgICB0aGlzLmNvbm5lY3RDbGllbnRXZWJTb2NrZXQoKVxuICAgICAgfSwgQ0xJRU5UX1dFQlNPQ0tFVF9SRUNPTk5FQ1RfREVMQVlfTVMpXG4gICAgfVxuXG4gICAgd2Vic29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBzY2hlZHVsZVJlY29ubmVjdClcbiAgICB3ZWJzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihcImNsb3NlXCIsIHNjaGVkdWxlUmVjb25uZWN0KVxuICAgIHdlYnNvY2tldC5hZGRFdmVudExpc3RlbmVyKFwib3BlblwiLCAoKSA9PiB7XG4gICAgICBvcGVuZWQgPSB0cnVlXG4gICAgICB0aGlzLmNsaWVudFdlYlNvY2tldFJlY29ubmVjdEF0dGVtcHRzID0gMFxuICAgICAgdGhpcy5jb21tdW5pY2F0b3Iub25PcGVuKClcbiAgICB9KVxuICAgIHdlYnNvY2tldC5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCAoZXZlbnQpID0+IHRoaXMuY29tbXVuaWNhdG9yLm9uTWVzc2FnZShldmVudC5kYXRhKSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBnZXRTeXN0ZW1UZXN0SG9zdCgpIHtcbiAgICBjb25zdCBsb2NhdGlvbiA9IGdsb2JhbFRoaXMubG9jYXRpb25cbiAgICBjb25zdCBkZWZhdWx0SG9zdCA9IGxvY2F0aW9uPy5ob3N0bmFtZSB8fCBcImxvY2FsaG9zdFwiXG4gICAgY29uc3Qgc2VhcmNoID0gbG9jYXRpb24/LnNlYXJjaFxuICAgIGNvbnN0IGVudkhvc3QgPSBwcm9jZXNzLmVudi5FWFBPX1BVQkxJQ19TWVNURU1fVEVTVF9IT1NUXG5cbiAgICBpZiAoZW52SG9zdCkgcmV0dXJuIGVudkhvc3RcblxuICAgIGlmIChTeXN0ZW1UZXN0QnJvd3NlckhlbHBlci5fZGVmYXVsdEhvc3QpIHJldHVybiBTeXN0ZW1UZXN0QnJvd3NlckhlbHBlci5fZGVmYXVsdEhvc3RcblxuICAgIGlmICghc2VhcmNoKSByZXR1cm4gZGVmYXVsdEhvc3RcblxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoc2VhcmNoKVxuICAgIGNvbnN0IGhvc3QgPSBwYXJhbXMuZ2V0KFwic3lzdGVtVGVzdEhvc3RcIilcblxuICAgIGNvbnN0IHJlc29sdmVkSG9zdCA9IGhvc3QgfHwgZGVmYXVsdEhvc3RcblxuICAgIGlmIChyZXNvbHZlZEhvc3QgPT09IFwiMC4wLjAuMFwiKSByZXR1cm4gXCIxMjcuMC4wLjFcIlxuXG4gICAgcmV0dXJuIHJlc29sdmVkSG9zdFxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBlbmFibGVPbkJyb3dzZXIoKSB7XG4gICAgaWYgKHRoaXMuX2VuYWJsZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlXG4gICAgdGhpcy5jb25uZWN0V2ViU29ja2V0KClcbiAgICB0aGlzLmNvbm5lY3RPbkVycm9yKClcbiAgICB0aGlzLmNvbm5lY3RVbmhhbmRsZWRSZWplY3Rpb24oKVxuICAgIHRoaXMub3ZlcnJpZGVDb25zb2xlTG9nKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgZ2V0RW5hYmxlZCgpIHsgcmV0dXJuIHRoaXMuX2VuYWJsZWQgfVxuXG4gIC8qKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSAqL1xuICBnZXRFdmVudHMoKSB7IHJldHVybiB0aGlzLmV2ZW50cyB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGEgY29tbWFuZCBldmVudCBhbmQgdGhyb3dzIHdoZW4gbm8gbGlzdGVuZXIgaGFuZGxlZCBpdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge3twYXRoOiBzdHJpbmd9fSBwYXlsb2FkXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZW1pdENvbW1hbmRFdmVudChldmVudE5hbWUsIHBheWxvYWQpIHtcbiAgICBjb25zdCBkaWRFbWl0ID0gdGhpcy5ldmVudHMuZW1pdChldmVudE5hbWUsIHBheWxvYWQpXG5cbiAgICBpZiAoIWRpZEVtaXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gbGlzdGVuZXIgcmVnaXN0ZXJlZCBmb3IgY29tbWFuZCBldmVudDogJHtldmVudE5hbWV9ICgke3BheWxvYWQucGF0aH0pYClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnlbXX0gYXJnc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZha2VDb25zb2xlRXJyb3IgPSAoLi4uYXJncykgPT4ge1xuICAgIHRoaXMuY29tbXVuaWNhdG9yLnNlbmRDb21tYW5kKHt0eXBlOiBcImNvbnNvbGUuZXJyb3JcIiwgdmFsdWU6IHRoaXMuY29uc29sZUxvZ01lc3NhZ2UoYXJncyl9KVxuXG4gICAgaWYgKHRoaXMub3JpZ2luYWxDb25zb2xlRXJyb3IpIHtcbiAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsQ29uc29sZUVycm9yKC4uLmFyZ3MpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3NcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmYWtlQ29uc29sZUxvZyA9ICguLi5hcmdzKSA9PiB7XG4gICAgdGhpcy5jb21tdW5pY2F0b3Iuc2VuZENvbW1hbmQoe3R5cGU6IFwiY29uc29sZS5sb2dcIiwgdmFsdWU6IHRoaXMuY29uc29sZUxvZ01lc3NhZ2UoYXJncyl9KVxuXG4gICAgaWYgKHRoaXMub3JpZ2luYWxDb25zb2xlTG9nKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbENvbnNvbGVMb2coLi4uYXJncylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGFyZ1xuICAgKiBAcGFyYW0ge2FueVtdfSBbc2Nhbm5lZE9iamVjdHNdXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBjb25zb2xlTG9nTWVzc2FnZShhcmcsIHNjYW5uZWRPYmplY3RzID0gW10pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICBpZiAoc2Nhbm5lZE9iamVjdHMuaW5jbHVkZXMoYXJnKSkge1xuICAgICAgICByZXR1cm4gXCJbcmVjdXJzaXZlXVwiXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2FubmVkT2JqZWN0cy5wdXNoKGFyZylcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gW11cblxuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhcmcpIHtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5jb25zb2xlTG9nTWVzc2FnZSh2YWx1ZSwgc2Nhbm5lZE9iamVjdHMpKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfSBlbHNlIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJnKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIGlmIChzY2FubmVkT2JqZWN0cy5pbmNsdWRlcyhhcmcpKSB7XG4gICAgICAgIHJldHVybiBcIltyZWN1cnNpdmVdXCJcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNjYW5uZWRPYmplY3RzLnB1c2goYXJnKVxuICAgICAgfVxuXG4gICAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgICBjb25zdCByZXN1bHQgPSB7fVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBhcmcpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLmNvbnNvbGVMb2dNZXNzYWdlKGFyZ1trZXldLCBzY2FubmVkT2JqZWN0cylcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZyA9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gYFtvYmplY3QgJHthcmc/LmNvbnN0cnVjdG9yPy5uYW1lfV1gXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBhcmdcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt7ZGF0YTogUmVjb3JkPHN0cmluZywgYW55Pn19IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIG9uQ29tbWFuZCA9IGFzeW5jICh7ZGF0YX0pID0+IHtcbiAgICBpZiAoZGF0YS50eXBlID09IFwiaW5pdGlhbGl6ZVwiKSB7XG4gICAgICB0aGlzLmV2ZW50cy5lbWl0KFwiaW5pdGlhbGl6ZVwiKVxuXG4gICAgICBpZiAoIXRoaXMuX2hhc0luaXRpYWxpemVkKSB7XG4gICAgICAgIHRoaXMuX2hhc0luaXRpYWxpemVkID0gdHJ1ZVxuXG4gICAgICAgIGlmICh0aGlzLl9vbkZpcnN0SW5pdGlhbGl6ZUNhbGxiYWNrKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fb25GaXJzdEluaXRpYWxpemVDYWxsYmFjaygpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX29uSW5pdGlhbGl6ZUNhbGxiYWNrKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX29uSW5pdGlhbGl6ZUNhbGxiYWNrKClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtyZXN1bHQ6IFwiaW5pdGlhbGl6ZWRcIn1cbiAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PSBcInRlYXJkb3duXCIpIHtcbiAgICAgIHRoaXMuZXZlbnRzLmVtaXQoXCJ0ZWFyZG93blwiKVxuXG4gICAgICBpZiAodGhpcy5fb25UZWFyZG93bkNhbGxiYWNrKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX29uVGVhcmRvd25DYWxsYmFjaygpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7cmVzdWx0OiBcInRvcm4tZG93blwifVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09IFwid2FpdEZvclNjb3VuZHJlbFwiKSB7XG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JTY291bmRyZWxTdGFydGVkKClcbiAgICAgIHJldHVybiB7cmVzdWx0OiBcInNjb3VuZHJlbC1yZWFkeVwifVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09IFwidmlzaXRcIikge1xuICAgICAgdGhpcy5lbWl0Q29tbWFuZEV2ZW50KFwibmF2aWdhdGVcIiwge3BhdGg6IGRhdGEucGF0aH0pXG4gICAgICByZXR1cm4ge3Jlc3VsdDogXCJ2aXNpdGVkXCJ9XG4gICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT0gXCJkaXNtaXNzVG9cIikge1xuICAgICAgdGhpcy5lbWl0Q29tbWFuZEV2ZW50KFwiZGlzbWlzc1RvXCIsIHtwYXRoOiBkYXRhLnBhdGh9KVxuICAgICAgcmV0dXJuIHtyZXN1bHQ6IFwiZGlzbWlzc2VkXCJ9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjb21tYW5kIHR5cGUgZm9yIFN5c3RlbVRlc3RCcm93c2VySGVscGVyOiAke2RhdGEudHlwZX1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCkgOiB2b2lkfSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG9uSW5pdGlhbGl6ZShjYWxsYmFjaykge1xuICAgIHRoaXMuX29uSW5pdGlhbGl6ZUNhbGxiYWNrID0gY2FsbGJhY2tcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCkgOiB2b2lkfSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG9uVGVhcmRvd24oY2FsbGJhY2spIHtcbiAgICB0aGlzLl9vblRlYXJkb3duQ2FsbGJhY2sgPSBjYWxsYmFja1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oKSA6IHZvaWR9IGNhbGxiYWNrXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgb25GaXJzdEluaXRpYWxpemUoY2FsbGJhY2spIHtcbiAgICB0aGlzLl9vbkZpcnN0SW5pdGlhbGl6ZUNhbGxiYWNrID0gY2FsbGJhY2tcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgb3ZlcnJpZGVDb25zb2xlTG9nKCkge1xuICAgIGlmICh0aGlzLm9yaWdpbmFsQ29uc29sZUVycm9yIHx8IHRoaXMub3JpZ2luYWxDb25zb2xlTG9nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb25zb2xlIG1ldGhvZHMgaGFzIGFscmVhZHkgYmVlbiBvdmVycmlkZGVuIVwiKVxuICAgIH1cblxuICAgIHRoaXMub3JpZ2luYWxDb25zb2xlRXJyb3IgPSBjb25zb2xlLmVycm9yXG4gICAgdGhpcy5vcmlnaW5hbENvbnNvbGVMb2cgPSBjb25zb2xlLmxvZ1xuXG4gICAgY29uc29sZS5lcnJvciA9IHRoaXMuZmFrZUNvbnNvbGVFcnJvclxuICAgIGNvbnNvbGUubG9nID0gdGhpcy5mYWtlQ29uc29sZUxvZ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzcWxcbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fVxuICAgKi9cbiAgYXN5bmMgc2VuZFF1ZXJ5KHNxbCkge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jb21tdW5pY2F0b3Iuc2VuZENvbW1hbmQoe3R5cGU6IFwicXVlcnlcIiwgc3FsfSlcbiAgfVxufVxuIl19
|