system-testing 1.0.115 → 1.0.116
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 +4 -0
- package/build/browser.d.ts +9 -0
- package/build/browser.js +36 -6
- package/build/drivers/webdriver-driver.d.ts +11 -1
- package/build/drivers/webdriver-driver.js +57 -27
- package/build/system-test.d.ts +26 -2
- package/build/system-test.js +91 -23
- package/build/use-system-test-expo.js +7 -3
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -56,6 +56,10 @@ Minimal app-side requirements:
|
|
|
56
56
|
</View>
|
|
57
57
|
```
|
|
58
58
|
|
|
59
|
+
## Navigation discipline
|
|
60
|
+
|
|
61
|
+
App-flow specs should call `systemTest.visit(...)` once as the initial entry point, then use visible app UI, links, and actions to move around. A second `visit`, refresh, or direct route jump in one example should have a concrete documented reason, such as exercising an external callback or deep link.
|
|
62
|
+
|
|
59
63
|
## Usage
|
|
60
64
|
|
|
61
65
|
```js
|
package/build/browser.d.ts
CHANGED
|
@@ -172,6 +172,15 @@ export default class Browser {
|
|
|
172
172
|
clearAndSendKeys(elementOrIdentifier: import("selenium-webdriver").WebElement | string | ({
|
|
173
173
|
selector: string;
|
|
174
174
|
} & import("./system-test.js").InteractArgs), nextValue: string): Promise<void>;
|
|
175
|
+
/**
|
|
176
|
+
* @param {import("selenium-webdriver").WebElement|string|{selector: string} & import("./system-test.js").InteractArgs} elementOrIdentifier
|
|
177
|
+
* @returns {import("selenium-webdriver").WebElement|string|{selector: string} & import("./system-test.js").InteractArgs}
|
|
178
|
+
*/
|
|
179
|
+
textEntryClickTarget(elementOrIdentifier: import("selenium-webdriver").WebElement | string | ({
|
|
180
|
+
selector: string;
|
|
181
|
+
} & import("./system-test.js").InteractArgs)): import("selenium-webdriver").WebElement | string | ({
|
|
182
|
+
selector: string;
|
|
183
|
+
} & import("./system-test.js").InteractArgs);
|
|
175
184
|
/**
|
|
176
185
|
* Replaces an input-like element's value by test id.
|
|
177
186
|
* @param {string} testID Field `data-testid` to target.
|
package/build/browser.js
CHANGED
|
@@ -3,7 +3,7 @@ import fs from "node:fs/promises";
|
|
|
3
3
|
import { Key } from "selenium-webdriver";
|
|
4
4
|
import moment from "moment";
|
|
5
5
|
import { prettify } from "htmlfy";
|
|
6
|
-
import { waitFor } from "awaitery";
|
|
6
|
+
import { wait, waitFor } from "awaitery";
|
|
7
7
|
import timeout from "awaitery/build/timeout.js";
|
|
8
8
|
import SeleniumDriver from "./drivers/selenium-driver.js";
|
|
9
9
|
import AppiumDriver from "./drivers/appium-driver.js";
|
|
@@ -364,8 +364,39 @@ export default class Browser {
|
|
|
364
364
|
* @returns {Promise<void>}
|
|
365
365
|
*/
|
|
366
366
|
async clearAndSendKeys(elementOrIdentifier, nextValue) {
|
|
367
|
-
|
|
368
|
-
|
|
367
|
+
let actualValue;
|
|
368
|
+
for (let attempt = 1; attempt <= 3; attempt++) {
|
|
369
|
+
const tagName = String(await this.interact(elementOrIdentifier, "getTagName")).toLowerCase();
|
|
370
|
+
await this.interact(this.textEntryClickTarget(elementOrIdentifier), "click");
|
|
371
|
+
if (tagName === "input" || tagName === "textarea") {
|
|
372
|
+
await this.interact(elementOrIdentifier, "clear");
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
await this.interact(elementOrIdentifier, "sendKeys", Key.chord(Key.CONTROL, "a"));
|
|
376
|
+
await this.interact(elementOrIdentifier, "sendKeys", Key.BACK_SPACE);
|
|
377
|
+
}
|
|
378
|
+
await this.interact(elementOrIdentifier, "sendKeys", nextValue);
|
|
379
|
+
actualValue = await this.interact(elementOrIdentifier, "getProperty", "value");
|
|
380
|
+
if (actualValue === nextValue)
|
|
381
|
+
return;
|
|
382
|
+
if (attempt < 3)
|
|
383
|
+
await wait(50);
|
|
384
|
+
}
|
|
385
|
+
const actualLength = typeof actualValue == "string" ? actualValue.length : "missing";
|
|
386
|
+
throw new Error(`Input replacement did not update the element value after 3 attempts. Expected length ${nextValue.length}, got ${actualLength}.`);
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* @param {import("selenium-webdriver").WebElement|string|{selector: string} & import("./system-test.js").InteractArgs} elementOrIdentifier
|
|
390
|
+
* @returns {import("selenium-webdriver").WebElement|string|{selector: string} & import("./system-test.js").InteractArgs}
|
|
391
|
+
*/
|
|
392
|
+
textEntryClickTarget(elementOrIdentifier) {
|
|
393
|
+
if (typeof elementOrIdentifier === "string") {
|
|
394
|
+
return { selector: elementOrIdentifier, method: "actions" };
|
|
395
|
+
}
|
|
396
|
+
if (typeof elementOrIdentifier === "object" && elementOrIdentifier !== null && "selector" in elementOrIdentifier) {
|
|
397
|
+
return { ...elementOrIdentifier, method: "actions" };
|
|
398
|
+
}
|
|
399
|
+
return elementOrIdentifier;
|
|
369
400
|
}
|
|
370
401
|
/**
|
|
371
402
|
* Replaces an input-like element's value by test id.
|
|
@@ -377,8 +408,7 @@ export default class Browser {
|
|
|
377
408
|
async replaceTestIDInputValue(testID, nextValue, args = {}) {
|
|
378
409
|
await this.clearAndSendKeys({
|
|
379
410
|
selector: testIdSelector(testID),
|
|
380
|
-
timeout: args.timeout
|
|
381
|
-
withFallback: true
|
|
411
|
+
timeout: args.timeout
|
|
382
412
|
}, nextValue);
|
|
383
413
|
}
|
|
384
414
|
/**
|
|
@@ -659,4 +689,4 @@ export default class Browser {
|
|
|
659
689
|
}
|
|
660
690
|
}
|
|
661
691
|
}
|
|
662
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9icm93c2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDdEMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFBO0FBQzNCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxRQUFRLENBQUE7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFVBQVUsQ0FBQTtBQUNoQyxPQUFPLE9BQU8sTUFBTSwyQkFBMkIsQ0FBQTtBQUMvQyxPQUFPLGNBQWMsTUFBTSw4QkFBOEIsQ0FBQTtBQUN6RCxPQUFPLFlBQVksTUFBTSw0QkFBNEIsQ0FBQTtBQUVyRDs7Ozs7O0dBTUc7QUFDSDs7OztHQUlHO0FBQ0g7OztHQUdHO0FBQ0g7OztHQUdHO0FBQ0g7Ozs7Ozs7R0FPRztBQUNIOzs7R0FHRztBQUNIOzs7R0FHRztBQUVIOzs7O0dBSUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxNQUFNO0lBQzVCLE9BQU8saUJBQWlCLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUE7QUFDdkQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLEtBQUs7SUFDOUIsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0FBQ25FLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsS0FBSztJQUMzQixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUE7SUFDaEQsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FB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LENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFBO1FBQzlCLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFDeEMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDN0MsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFFMUQsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUE7UUFFN0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFDdkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsY0FBYyxDQUFDLENBQUE7UUFDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFFOUIsT0FBTztZQUNMLFVBQVU7WUFDVixJQUFJO1lBQ0osUUFBUTtZQUNSLElBQUk7WUFDSixRQUFRO1lBQ1IsY0FBYztTQUNmLENBQUE7SUFDSCxDQUFDO0lBRUQsK0JBQStCO0lBQy9CLEtBQUssQ0FBQyxVQUFVO1FBQ2QsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCB7S2V5fSBmcm9tIFwic2VsZW5pdW0td2ViZHJpdmVyXCJcbmltcG9ydCBtb21lbnQgZnJvbSBcIm1vbWVudFwiXG5pbXBvcnQge3ByZXR0aWZ5fSBmcm9tIFwiaHRtbGZ5XCJcbmltcG9ydCB7d2FpdEZvcn0gZnJvbSBcImF3YWl0ZXJ5XCJcbmltcG9ydCB0aW1lb3V0IGZyb20gXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCJcbmltcG9ydCBTZWxlbml1bURyaXZlciBmcm9tIFwiLi9kcml2ZXJzL3NlbGVuaXVtLWRyaXZlci5qc1wiXG5pbXBvcnQgQXBwaXVtRHJpdmVyIGZyb20gXCIuL2RyaXZlcnMvYXBwaXVtLWRyaXZlci5qc1wiXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQnJvd3NlckFyZ3NcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2RlYnVnXSBFbmFibGUgZGVidWcgbG9nZ2luZy5cbiAqIEBwcm9wZXJ0eSB7QnJvd3NlckRyaXZlckNvbmZpZ30gW2RyaXZlcl0gRHJpdmVyIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QtY29tbXVuaWNhdG9yLmpzXCIpLmRlZmF1bHR9IFtjb21tdW5pY2F0b3JdIE9wdGlvbmFsIGNvbW1hbmQgY29tbXVuaWNhdG9yIGZvciBoZWxwZXItZHJpdmVuIG5hdmlnYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NjcmVlbnNob3RzUGF0aF0gRGlyZWN0b3J5IHVzZWQgZm9yIHNhdmVkIHNjcmVlbnNob3RzIGFuZCBicm93c2VyIGFydGlmYWN0cy5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCcm93c2VyRHJpdmVyQ29uZmlnXG4gKiBAcHJvcGVydHkge1wic2VsZW5pdW1cInxcImFwcGl1bVwifSBbdHlwZV0gRHJpdmVyIGltcGxlbWVudGF0aW9uIHRvIHVzZS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW29wdGlvbnNdIERyaXZlci1zcGVjaWZpYyBvcHRpb25zLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJyb3dzZXJOYXZpZ2F0aW9uQXJnc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XSBPdmVycmlkZSB0aGUgdGltZW91dCBmb3IgdGhpcyBuYXZpZ2F0aW9uIGNvbW1hbmQuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQnJvd3NlclBhdGhXYWl0QXJnc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XSBPdmVycmlkZSB0aGUgdGltZW91dCBmb3IgdGhpcyBwYXRoIHdhaXQuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQnJvd3NlclRleHRXYWl0QXJnc1xuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3Njcm9sbENvbnRhaW5lclRlc3RJRHNdIE5hdGl2ZSB0ZXN0IElEcyB0aGF0IHNob3VsZCBiZSB0cmllZCBhcyBzY3JvbGwgY29udGFpbmVycyBiZWZvcmUgZmFsbGluZyBiYWNrIHRvIHZpZXdwb3J0IGdlc3R1cmVzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2Nyb2xsVG9dIFdoZXRoZXIgdG8gc2Nyb2xsIGZvdW5kIGVsZW1lbnRzIGludG8gdmlldyBiZWZvcmUgcmV0dXJuaW5nIHRoZW0uXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdIE92ZXJyaWRlIHRoZSB0aW1lb3V0IGZvciB0aGlzIHRleHQgd2FpdC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3VzZUJhc2VTZWxlY3Rvcl0gV2hldGhlciB0byBzY29wZSBieSB0aGUgYmFzZSBzZWxlY3Rvci5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbiB8IG51bGx9IFt2aXNpYmxlXSBXaGV0aGVyIHRvIHJlcXVpcmUgZWxlbWVudHMgdG8gYmUgdmlzaWJsZS5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCcm93c2VyQ3VycmVudFVybFdhaXRBcmdzXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdIE92ZXJyaWRlIHRoZSB0aW1lb3V0IGZvciB0aGlzIFVSTCB3YWl0LlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJyb3dzZXJUZXN0SURJbnB1dEFyZ3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF0gT3ZlcnJpZGUgdGltZW91dCBmb3IgdGhlIGlucHV0IGxvb2t1cC5cbiAqL1xuXG4vKipcbiAqIEJ1aWxkcyBhIGRhdGEtdGVzdGlkIENTUyBzZWxlY3Rvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SUQgUmF3IHZhbHVlIGZyb20gYSBgZGF0YS10ZXN0aWRgIGF0dHJpYnV0ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IENTUyBhdHRyaWJ1dGUgc2VsZWN0b3IuXG4gKi9cbmZ1bmN0aW9uIHRlc3RJZFNlbGVjdG9yKHRlc3RJRCkge1xuICByZXR1cm4gYFtkYXRhLXRlc3RpZD1cIiR7Y3NzQXR0cmlidXRlVmFsdWUodGVzdElEKX1cIl1gXG59XG5cbi8qKlxuICogRXNjYXBlcyBhIHZhbHVlIGZvciB1c2UgaW5zaWRlIGEgZG91YmxlLXF1b3RlZCBDU1MgYXR0cmlidXRlIHNlbGVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IHZhbHVlIFJhdyBhdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBFc2NhcGVkIHNlbGVjdG9yIHZhbHVlLlxuICovXG5mdW5jdGlvbiBjc3NBdHRyaWJ1dGVWYWx1ZSh2YWx1ZSkge1xuICByZXR1cm4gU3RyaW5nKHZhbHVlKS5yZXBsYWNlKC9cXFxcL2csIFwiXFxcXFxcXFxcIikucmVwbGFjZSgvXCIvZywgXCJcXFxcXFxcIlwiKVxufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBSR0IgY2hhbm5lbHMgZnJvbSBDU1MgYHJnYiguLi4pYC9gcmdiYSguLi4pYCB2YWx1ZXMgb3IgYW4gUkdCIGZyYWdtZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIENTUyBjb2xvciB2YWx1ZSBvciBSR0IgZnJhZ21lbnQgbGlrZSBgMzAsIDQxLCA1OWAuXG4gKiBAcmV0dXJucyB7W251bWJlciwgbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBjc3NSZ2JDaGFubmVscyh2YWx1ZSkge1xuICBjb25zdCByZ2JNYXRjaCA9IHZhbHVlLm1hdGNoKC9yZ2JhP1xcKChbXildKylcXCkvKVxuICBjb25zdCBjaGFubmVsc1ZhbHVlID0gcmdiTWF0Y2ggPyByZ2JNYXRjaFsxXSA6IHZhbHVlXG4gIGNvbnN0IGNoYW5uZWxzID0gY2hhbm5lbHNWYWx1ZVxuICAgIC5yZXBsYWNlKC9cXHMqXFwvLiokLywgXCJcIilcbiAgICAuc3BsaXQoL1ssXFxzXSsvKVxuICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAuc2xpY2UoMCwgMylcbiAgICAubWFwKChjaGFubmVsKSA9PiBOdW1iZXIoY2hhbm5lbCkpXG5cbiAgaWYgKGNoYW5uZWxzLmxlbmd0aCAhPT0gMyB8fCBjaGFubmVscy5zb21lKChjaGFubmVsKSA9PiAhTnVtYmVyLmlzRmluaXRlKGNoYW5uZWwpKSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIHJldHVybiAvKiogQHR5cGUge1tudW1iZXIsIG51bWJlciwgbnVtYmVyXX0gKi8gKGNoYW5uZWxzKVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgYnJvd3Nlci1ub3JtYWxpemVkIENTUyBjb2xvciBtYXRjaGVzIHRoZSBSR0IgdHJpcGxldC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhY3R1YWxWYWx1ZSBCcm93c2VyLW5vcm1hbGl6ZWQgQ1NTIGNvbG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IHJnYkZyYWdtZW50IFJHQiBmcmFnbWVudCBsaWtlIGAzMCwgNDEsIDU5YC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBSR0IgY2hhbm5lbHMgbWF0Y2guXG4gKi9cbmZ1bmN0aW9uIGNzc1ZhbHVlTWF0Y2hlc1JnYihhY3R1YWxWYWx1ZSwgcmdiRnJhZ21lbnQpIHtcbiAgY29uc3QgYWN0dWFsQ2hhbm5lbHMgPSBjc3NSZ2JDaGFubmVscyhhY3R1YWxWYWx1ZSlcbiAgY29uc3QgZXhwZWN0ZWRDaGFubmVscyA9IGNzc1JnYkNoYW5uZWxzKHJnYkZyYWdtZW50KVxuXG4gIGlmICghYWN0dWFsQ2hhbm5lbHMgfHwgIWV4cGVjdGVkQ2hhbm5lbHMpIHJldHVybiBmYWxzZVxuXG4gIHJldHVybiBhY3R1YWxDaGFubmVscy5ldmVyeSgoYWN0dWFsQ2hhbm5lbCwgaW5kZXgpID0+IGFjdHVhbENoYW5uZWwgPT09IGV4cGVjdGVkQ2hhbm5lbHNbaW5kZXhdKVxufVxuXG4vKiogR2VuZXJpYyBicm93c2VyIHNlc3Npb24gd3JhcHBlciBhcm91bmQgdGhlIGNvbmZpZ3VyZWQgZHJpdmVyLiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnJvd3NlciB7XG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkRyaXZlciB8IHVuZGVmaW5lZH0gKi9cbiAgZHJpdmVyID0gdW5kZWZpbmVkXG5cbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2RyaXZlcnMvd2ViZHJpdmVyLWRyaXZlci5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSAqL1xuICBkcml2ZXJBZGFwdGVyID0gdW5kZWZpbmVkXG5cbiAgX2RlYnVnID0gZmFsc2VcbiAgLyoqIEB0eXBlIHtCcm93c2VyRHJpdmVyQ29uZmlnIHwgdW5kZWZpbmVkfSAqL1xuICBfZHJpdmVyQ29uZmlnID0gdW5kZWZpbmVkXG4gIC8qKiBAdHlwZSB7RXJyb3IgfCB1bmRlZmluZWR9ICovXG4gIF9odHRwU2VydmVyRXJyb3IgPSB1bmRlZmluZWRcblxuICAvKiogQHBhcmFtIHtCcm93c2VyQXJnc30gW2FyZ3NdICovXG4gIGNvbnN0cnVjdG9yKHtkZWJ1ZyA9IGZhbHNlLCBkcml2ZXIsIGNvbW11bmljYXRvciwgc2NyZWVuc2hvdHNQYXRoID0gYCR7cHJvY2Vzcy5jd2QoKX0vdG1wL3NjcmVlbnNob3RzYCwgLi4ucmVzdEFyZ3N9ID0ge30pIHtcbiAgICBjb25zdCByZXN0QXJnc0tleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncylcblxuICAgIGlmIChyZXN0QXJnc0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGJyb3dzZXIgYXJndW1lbnRzOiAke3Jlc3RBcmdzS2V5cy5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICB0aGlzLl9kZWJ1ZyA9IGRlYnVnXG4gICAgdGhpcy5fZHJpdmVyQ29uZmlnID0gZHJpdmVyXG4gICAgdGhpcy5fc2NyZWVuc2hvdHNQYXRoID0gc2NyZWVuc2hvdHNQYXRoXG4gICAgdGhpcy5jb21tdW5pY2F0b3IgPSBjb21tdW5pY2F0b3JcbiAgICB0aGlzLmRyaXZlckFkYXB0ZXIgPSB0aGlzLmNyZWF0ZURyaXZlcihkcml2ZXIpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtCcm93c2VyRHJpdmVyQ29uZmlnfSBbZHJpdmVyQ29uZmlnXVxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9kcml2ZXJzL3dlYmRyaXZlci1kcml2ZXIuanNcIikuZGVmYXVsdH1cbiAgICovXG4gIGNyZWF0ZURyaXZlcihkcml2ZXJDb25maWcgPSB7fSkge1xuICAgIGNvbnN0IHt0eXBlID0gXCJzZWxlbml1bVwiLCBvcHRpb25zLCAuLi5yZXN0QXJnc30gPSBkcml2ZXJDb25maWdcbiAgICBjb25zdCByZXN0QXJnc0tleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncylcblxuICAgIGlmIChyZXN0QXJnc0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRyaXZlciBhcmdzOiAke3Jlc3RBcmdzS2V5cy5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gXCJzZWxlbml1bVwiKSB7XG4gICAgICByZXR1cm4gbmV3IFNlbGVuaXVtRHJpdmVyKHticm93c2VyOiB0aGlzLCBvcHRpb25zfSlcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gXCJhcHBpdW1cIikge1xuICAgICAgcmV0dXJuIG5ldyBBcHBpdW1Ecml2ZXIoe2Jyb3dzZXI6IHRoaXMsIG9wdGlvbnN9KVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZHJpdmVyIHR5cGU6ICR7dHlwZX1gKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC1jb21tdW5pY2F0b3IuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gY29tbXVuaWNhdG9yXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0Q29tbXVuaWNhdG9yKGNvbW11bmljYXRvcikge1xuICAgIHRoaXMuY29tbXVuaWNhdG9yID0gY29tbXVuaWNhdG9yXG4gIH1cblxuICAvKiogQHJldHVybnMge2Jvb2xlYW59ICovXG4gIGNvbW11bmljYXRvckV4aXN0cygpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLmNvbW11bmljYXRvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0QmFzZVNlbGVjdG9yKGJhc2VTZWxlY3RvcikgeyB0aGlzLl9iYXNlU2VsZWN0b3IgPSBiYXNlU2VsZWN0b3IgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqL1xuICBnZXRCYXNlU2VsZWN0b3IoKSB7IHJldHVybiB0aGlzLl9iYXNlU2VsZWN0b3IgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldFNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QmFzZVNlbGVjdG9yKCkgPyBgJHt0aGlzLmdldEJhc2VTZWxlY3RvcigpfSAke3NlbGVjdG9yfWAgOiBzZWxlY3RvclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZGVidWdFcnJvciguLi5hcmdzKSB7XG4gICAgY29uc29sZS5lcnJvcihcIltCcm93c2VyIGVycm9yXVwiLCAuLi5hcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZGVidWdMb2coLi4uYXJncykge1xuICAgIGlmICh0aGlzLl9kZWJ1Zykge1xuICAgICAgY29uc29sZS5sb2coXCJbQnJvd3NlciBkZWJ1Z11cIiwgLi4uYXJncylcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIHRocm93SWZIdHRwU2VydmVyRXJyb3IoKSB7XG4gICAgaWYgKHRoaXMuX2h0dHBTZXJ2ZXJFcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIHNlcnZlciBlcnJvcjogJHt0aGlzLl9odHRwU2VydmVyRXJyb3IubWVzc2FnZX1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG9uSHR0cFNlcnZlckVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG5cbiAgICB0aGlzLl9odHRwU2VydmVyRXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKVxuICAgIGNvbnNvbGUuZXJyb3IoYEhUVFAgc2VydmVyIGVycm9yOiAke2Vycm9yTWVzc2FnZX1gKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRHJpdmVyfSAqL1xuICBnZXREcml2ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmdldFdlYkRyaXZlcigpXG4gIH1cblxuICAvKiogQHJldHVybnMge2ltcG9ydChcIi4vZHJpdmVycy93ZWJkcml2ZXItZHJpdmVyLmpzXCIpLmRlZmF1bHR9ICovXG4gIGdldERyaXZlckFkYXB0ZXIoKSB7XG4gICAgaWYgKCF0aGlzLmRyaXZlckFkYXB0ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRyaXZlciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcIilcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kcml2ZXJBZGFwdGVyXG4gIH1cblxuICAvKiogQHJldHVybnMge251bWJlcn0gKi9cbiAgZ2V0VGltZW91dHMoKSB7IHJldHVybiB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5nZXRUaW1lb3V0cygpIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIHJlc3RvcmVUaW1lb3V0cygpIHtcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5yZXN0b3JlVGltZW91dHMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuZXdUaW1lb3V0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZHJpdmVyU2V0VGltZW91dHMobmV3VGltZW91dCkge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmRyaXZlclNldFRpbWVvdXRzKG5ld1RpbWVvdXQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IG5ld1RpbWVvdXRcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzZXRUaW1lb3V0cyhuZXdUaW1lb3V0KSB7XG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuc2V0VGltZW91dHMobmV3VGltZW91dClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59ICovXG4gIGFzeW5jIGdldEJyb3dzZXJMb2dzKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5nZXRCcm93c2VyTG9ncygpXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gKi9cbiAgYXN5bmMgZ2V0Q3VycmVudFVybCgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZ2V0Q3VycmVudFVybCgpXG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgdW50aWwgdGhlIGN1cnJlbnQgVVJMIHBhdGhuYW1lIGV4YWN0bHkgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkUGF0aFxuICAgKiBAcGFyYW0ge0Jyb3dzZXJQYXRoV2FpdEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JQYXRoKGV4cGVjdGVkUGF0aCwgYXJncyA9IHt9KSB7XG4gICAgYXdhaXQgd2FpdEZvcih7dGltZW91dDogdGhpcy5nZXRDb21tYW5kVGltZW91dChhcmdzLnRpbWVvdXQpfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFVybCA9IGF3YWl0IHRoaXMuZ2V0Q3VycmVudFVybCgpXG4gICAgICBjb25zdCBjdXJyZW50UGF0aCA9IG5ldyBVUkwoY3VycmVudFVybCkucGF0aG5hbWVcblxuICAgICAgaWYgKGN1cnJlbnRQYXRoICE9PSBleHBlY3RlZFBhdGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaW1lZCBvdXQgd2FpdGluZyBmb3IgcGF0aCAke2V4cGVjdGVkUGF0aH0uIEN1cnJlbnQgVVJMOiAke2N1cnJlbnRVcmx9YClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIHVudGlsIHRoZSBjdXJyZW50IFVSTCBleGFjdGx5IG1hdGNoZXMgdGhlIGV4cGVjdGVkIFVSTC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVXJsIEV4YWN0IFVSTCBleHBlY3RlZC5cbiAgICogQHBhcmFtIHtCcm93c2VyQ3VycmVudFVybFdhaXRBcmdzfSBbYXJnc10gT3B0aW9uYWwgdGltZW91dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yQ3VycmVudFVybChleHBlY3RlZFVybCwgYXJncyA9IHt9KSB7XG4gICAgYXdhaXQgd2FpdEZvcih7dGltZW91dDogdGhpcy5nZXRDb21tYW5kVGltZW91dChhcmdzLnRpbWVvdXQpfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFVybCA9IGF3YWl0IHRoaXMuZ2V0Q3VycmVudFVybCgpXG5cbiAgICAgIGlmIChjdXJyZW50VXJsICE9PSBleHBlY3RlZFVybCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRpbWVkIG91dCB3YWl0aW5nIGZvciBVUkwgJHtleHBlY3RlZFVybH0uIEN1cnJlbnQgVVJMOiAke2N1cnJlbnRVcmx9YClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIHVudGlsIHRoZSBjdXJyZW50IFVSTCBjb250YWlucyBhIGZyYWdtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRGcmFnbWVudCBGcmFnbWVudCB0aGF0IHNob3VsZCBhcHBlYXIuXG4gICAqIEBwYXJhbSB7QnJvd3NlckN1cnJlbnRVcmxXYWl0QXJnc30gW2FyZ3NdIE9wdGlvbmFsIHRpbWVvdXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvclVybENvbnRhaW5zKGV4cGVjdGVkRnJhZ21lbnQsIGFyZ3MgPSB7fSkge1xuICAgIGF3YWl0IHdhaXRGb3Ioe3RpbWVvdXQ6IHRoaXMuZ2V0Q29tbWFuZFRpbWVvdXQoYXJncy50aW1lb3V0KX0sIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRVcmwgPSBhd2FpdCB0aGlzLmdldEN1cnJlbnRVcmwoKVxuXG4gICAgICBpZiAoIWN1cnJlbnRVcmwuaW5jbHVkZXMoZXhwZWN0ZWRGcmFnbWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaW1lZCBvdXQgd2FpdGluZyBmb3IgVVJMIHRvIGluY2x1ZGUgJHtleHBlY3RlZEZyYWdtZW50fS4gQ3VycmVudCBVUkw6ICR7Y3VycmVudFVybH1gKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgdW50aWwgdGhlIGN1cnJlbnQgVVJMIGRvZXMgbm90IGNvbnRhaW4gYSBmcmFnbWVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuZXhwZWN0ZWRGcmFnbWVudCBGcmFnbWVudCB0aGF0IHNob3VsZCBkaXNhcHBlYXIuXG4gICAqIEBwYXJhbSB7QnJvd3NlckN1cnJlbnRVcmxXYWl0QXJnc30gW2FyZ3NdIE9wdGlvbmFsIHRpbWVvdXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvclVybEV4Y2x1ZGVzKHVuZXhwZWN0ZWRGcmFnbWVudCwgYXJncyA9IHt9KSB7XG4gICAgYXdhaXQgd2FpdEZvcih7dGltZW91dDogdGhpcy5nZXRDb21tYW5kVGltZW91dChhcmdzLnRpbWVvdXQpfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFVybCA9IGF3YWl0IHRoaXMuZ2V0Q3VycmVudFVybCgpXG5cbiAgICAgIGlmIChjdXJyZW50VXJsLmluY2x1ZGVzKHVuZXhwZWN0ZWRGcmFnbWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaW1lZCBvdXQgd2FpdGluZyBmb3IgVVJMIHRvIGV4Y2x1ZGUgJHt1bmV4cGVjdGVkRnJhZ21lbnR9LiBDdXJyZW50IFVSTDogJHtjdXJyZW50VXJsfWApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXT59XG4gICAqL1xuICBhc3luYyBhbGwoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5hbGwoc2VsZWN0b3IsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5GaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgYXN5bmMgZXhpc3RzKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZXhpc3RzKHNlbGVjdG9yLCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuRmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZmluZChzZWxlY3RvciwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5GaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmRCeVRlc3RJRCh0ZXN0SUQsIGFyZ3MpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZmluZEJ5VGVzdElEKHRlc3RJRCwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBuYXRpdmUgQW5kcm9pZCB2aXNpYmxlIHRleHQgb3IgYW4gYWNjZXNzaWJpbGl0eSBsYWJlbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRvIGxvY2F0ZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfSBbYXJnc10gT3B0aW9uYWwgbG9va3VwIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59IE1hdGNoaW5nIG5hdGl2ZSBlbGVtZW50LlxuICAgKi9cbiAgYXN5bmMgZmluZEJ5TmF0aXZlVGV4dChleHBlY3RlZFRleHQsIGFyZ3MgPSB7fSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5maW5kQnlOYXRpdmVUZXh0KGV4cGVjdGVkVGV4dCwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZE5vV2FpdChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmZpbmROb1dhaXQoc2VsZWN0b3IsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5GaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59XG4gICAqL1xuICBhc3luYyB0ZXh0KHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkudGV4dChzZWxlY3RvciwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5GaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgY2xpY2soZWxlbWVudE9ySWRlbnRpZmllciwgYXJncykge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmNsaWNrKGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudHxzdHJpbmd8e3NlbGVjdG9yOiBzdHJpbmd9ICYgaW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5JbnRlcmFjdEFyZ3N9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWVcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIGFzeW5jIGludGVyYWN0KGVsZW1lbnRPcklkZW50aWZpZXIsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuaW50ZXJhY3QoZWxlbWVudE9ySWRlbnRpZmllciwgbWV0aG9kTmFtZSwgLi4uYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgYW4gaW5wdXQgYW5kIHNlbmRzIHJlcGxhY2VtZW50IGtleXMgdGhyb3VnaCByZXRyeWFibGUgYnJvd3NlciBpbnRlcmFjdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR8c3RyaW5nfHtzZWxlY3Rvcjogc3RyaW5nfSAmIGltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuSW50ZXJhY3RBcmdzfSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZXh0VmFsdWVcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBjbGVhckFuZFNlbmRLZXlzKGVsZW1lbnRPcklkZW50aWZpZXIsIG5leHRWYWx1ZSkge1xuICAgIGF3YWl0IHRoaXMuaW50ZXJhY3QoZWxlbWVudE9ySWRlbnRpZmllciwgXCJjbGlja1wiKVxuICAgIGF3YWl0IHRoaXMuaW50ZXJhY3QoZWxlbWVudE9ySWRlbnRpZmllciwgXCJzZW5kS2V5c1wiLCBLZXkuY2hvcmQoS2V5LkNPTlRST0wsIFwiYVwiKSwgS2V5LkJBQ0tfU1BBQ0UsIG5leHRWYWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbiBpbnB1dC1saWtlIGVsZW1lbnQncyB2YWx1ZSBieSB0ZXN0IGlkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEIEZpZWxkIGBkYXRhLXRlc3RpZGAgdG8gdGFyZ2V0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmV4dFZhbHVlIFRleHQgdG8gbGVhdmUgaW4gdGhlIGZpZWxkLlxuICAgKiBAcGFyYW0ge0Jyb3dzZXJUZXN0SURJbnB1dEFyZ3N9IFthcmdzXSBPcHRpb25hbCBsb29rdXAgdGltZW91dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyByZXBsYWNlVGVzdElESW5wdXRWYWx1ZSh0ZXN0SUQsIG5leHRWYWx1ZSwgYXJncyA9IHt9KSB7XG4gICAgYXdhaXQgdGhpcy5jbGVhckFuZFNlbmRLZXlzKHtcbiAgICAgIHNlbGVjdG9yOiB0ZXN0SWRTZWxlY3Rvcih0ZXN0SUQpLFxuICAgICAgdGltZW91dDogYXJncy50aW1lb3V0LFxuICAgICAgd2l0aEZhbGxiYWNrOiB0cnVlXG4gICAgfSwgbmV4dFZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIHVudGlsIGEgdGVzdCBpZCBjb250YWlucyBleHBlY3RlZCB2aXNpYmxlIHRleHQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SUQgRWxlbWVudCBgZGF0YS10ZXN0aWRgIHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFRleHQgRnJhZ21lbnQgdGhhdCBtdXN0IGFwcGVhciBpbiB0aGUgZWxlbWVudCB0ZXh0LlxuICAgKiBAcGFyYW0ge0Jyb3dzZXJUZXh0V2FpdEFyZ3N9IFthcmdzXSBPcHRpb25hbCB0aW1lb3V0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JUZXN0SURUZXh0KHRlc3RJRCwgZXhwZWN0ZWRUZXh0LCBhcmdzID0ge30pIHtcbiAgICBjb25zdCB7dGltZW91dDogd2FpdFRpbWVvdXQsIC4uLmZpbmRBcmdzfSA9IGFyZ3NcblxuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLndhaXRGb3JUZXN0SURUZXh0KHRlc3RJRCwgZXhwZWN0ZWRUZXh0LCB7XG4gICAgICAuLi5maW5kQXJncyxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuZ2V0Q29tbWFuZFRpbWVvdXQod2FpdFRpbWVvdXQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyB1bnRpbCBhIHRlc3QgaWQgbm8gbG9uZ2VyIGNvbnRhaW5zIGV4Y2x1ZGVkIHZpc2libGUgdGV4dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRCBFbGVtZW50IGBkYXRhLXRlc3RpZGAgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4Y2x1ZGVkVGV4dCBGcmFnbWVudCB0aGF0IHNob3VsZCBkaXNhcHBlYXIgZnJvbSB0aGUgZWxlbWVudCB0ZXh0LlxuICAgKiBAcGFyYW0ge0Jyb3dzZXJUZXh0V2FpdEFyZ3N9IFthcmdzXSBPcHRpb25hbCB0aW1lb3V0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JUZXN0SURUZXh0RXhjbHVkZXModGVzdElELCBleGNsdWRlZFRleHQsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHt0aW1lb3V0OiB3YWl0VGltZW91dCwgLi4uZmluZEFyZ3N9ID0gYXJnc1xuXG4gICAgYXdhaXQgd2FpdEZvcih7dGltZW91dDogdGhpcy5nZXRDb21tYW5kVGltZW91dCh3YWl0VGltZW91dCl9LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gYXdhaXQgdGhpcy5maW5kQnlUZXN0SUQodGVzdElELCB7Li4uZmluZEFyZ3MsIHRpbWVvdXQ6IDB9KVxuICAgICAgY29uc3QgYWN0dWFsVGV4dCA9IGF3YWl0IGVsZW1lbnQuZ2V0VGV4dCgpXG5cbiAgICAgIGlmIChhY3R1YWxUZXh0LmluY2x1ZGVzKGV4Y2x1ZGVkVGV4dCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaW1lZCBvdXQgd2FpdGluZyBmb3IgdGV4dCB0byBleGNsdWRlICR7ZXhjbHVkZWRUZXh0fS4gTGFzdCB0ZXh0IHdhcyAke2FjdHVhbFRleHR9YClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFzc2VydHMgYSByZW5kZXJlZCBlbGVtZW50IGhhcyBhIENTUyBjb2xvciBmcm9tIHRoZSBleHBlY3RlZCBwYWxldHRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEIEVsZW1lbnQgYGRhdGEtdGVzdGlkYCB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlOYW1lIENTUyBwcm9wZXJ0eSB0byByZWFkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRSZ2IgRXhwZWN0ZWQgUkdCIGZyYWdtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGlnaHRSZ2IgRGlzYWxsb3dlZCBSR0IgZnJhZ21lbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvbiBIdW1hbi1yZWFkYWJsZSBlbGVtZW50IGRlc2NyaXB0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGV4cGVjdFRlc3RJRENzc0NvbG9yKHRlc3RJRCwgcHJvcGVydHlOYW1lLCBleHBlY3RlZFJnYiwgbGlnaHRSZ2IsIGRlc2NyaXB0aW9uKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHRoaXMuZmluZEJ5VGVzdElEKHRlc3RJRClcbiAgICBjb25zdCBhY3R1YWxWYWx1ZSA9IGF3YWl0IGVsZW1lbnQuZ2V0Q3NzVmFsdWUocHJvcGVydHlOYW1lKVxuXG4gICAgaWYgKGNzc1ZhbHVlTWF0Y2hlc1JnYihhY3R1YWxWYWx1ZSwgbGlnaHRSZ2IpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7ZGVzY3JpcHRpb259IHRvIGF2b2lkIHRoZSBsaWdodCBwYWxldHRlLCBnb3QgJHtwcm9wZXJ0eU5hbWV9ICR7YWN0dWFsVmFsdWV9YClcbiAgICB9XG4gICAgaWYgKCFjc3NWYWx1ZU1hdGNoZXNSZ2IoYWN0dWFsVmFsdWUsIGV4cGVjdGVkUmdiKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2Rlc2NyaXB0aW9ufSB0byBpbmNsdWRlIHJnYigke2V4cGVjdGVkUmdifSksIGdvdCAke3Byb3BlcnR5TmFtZX0gJHthY3R1YWxWYWx1ZX1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGxzIGFuIGVsZW1lbnQgaW50byB2aWV3LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fHN0cmluZ3x7c2VsZWN0b3I6IHN0cmluZ30gJiBpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5GaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc2Nyb2xsSW50b1ZpZXcoZWxlbWVudE9ySWRlbnRpZmllciwgYXJncykge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLnNjcm9sbEludG9WaWV3KGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xscyB0aGUgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiB0ZXN0IElEIGludG8gdmlldy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRFxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuRmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHNjcm9sbFRlc3RJZEludG9WaWV3KHRlc3RJRCwgYXJncykge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLnNjcm9sbFRlc3RJZEludG9WaWV3KHRlc3RJRCwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLldhaXRGb3JOb1NlbGVjdG9yQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvck5vU2VsZWN0b3Ioc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLndhaXRGb3JOb1NlbGVjdG9yKHNlbGVjdG9yLCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuRmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGV4cGVjdE5vRWxlbWVudChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgbGV0IGZvdW5kID0gZmFsc2VcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbmROb1dhaXQoc2VsZWN0b3IsIGFyZ3MpXG4gICAgICBmb3VuZCA9IHRydWVcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5zdGFydHNXaXRoKFwiRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBhZnRlciBcIikpIHtcbiAgICAgICAgLy8gSWdub3JlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmb3VuZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBub3QgdG8gZmluZDogJHtzZWxlY3Rvcn1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAqL1xuICBhc3luYyBnZXRIVE1MKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5nZXRIVE1MKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlciB8IHVuZGVmaW5lZH0gdGltZW91dE92ZXJyaWRlXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBnZXRDb21tYW5kVGltZW91dCh0aW1lb3V0T3ZlcnJpZGUpIHtcbiAgICBpZiAodGltZW91dE92ZXJyaWRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aW1lb3V0T3ZlcnJpZGVcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRUaW1lb3V0cygpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkcml2ZXJWaXNpdChwYXRoKSB7XG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZHJpdmVyVmlzaXQocGF0aClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgYXN5bmMgZGVsZXRlQWxsQ29va2llcygpIHtcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5kZWxldGVBbGxDb29raWVzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBjb29raWUgdG8gdGhlIGFjdGl2ZSBkcml2ZXIgc2Vzc2lvbiBmb3IgdGhlIGN1cnJlbnQgZG9jdW1lbnRcbiAgICogb3JpZ2luLiBVc2VmdWwgd2hlbiBhbiBvdXQtb2YtYmFuZCBsb2dpbiAoY3VybCwgZmV0Y2gsIGV0Yy4pIHJldHVybmVkXG4gICAqIGEgYFNldC1Db29raWVgIHZhbHVlIGFuZCB0aGUgdGVzdCBuZWVkcyB0aGUgYnJvd3NlciB0byBzdGFydFxuICAgKiBhdXRoZW50aWNhdGVkIHdpdGhvdXQgZHJpdmluZyB0aGUgc2lnbi1pbiBVSS5cbiAgICpcbiAgICogVGhlIGRyaXZlciBtdXN0IGFscmVhZHkgYmUgb24gYSBwYWdlIHdob3NlIG9yaWdpbi9kb21haW4gbWF0Y2hlcyB0aGVcbiAgICogY29va2llIGRvbWFpbiwgb3RoZXJ3aXNlIFNlbGVuaXVtIHdpbGwgcmVqZWN0IHRoZSBjYWxsLlxuICAgKiBAcGFyYW0ge3tuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIGRvbWFpbj86IHN0cmluZywgcGF0aD86IHN0cmluZywgc2VjdXJlPzogYm9vbGVhbiwgaHR0cE9ubHk/OiBib29sZWFuLCBleHBpcnk/OiBudW1iZXIsIHNhbWVTaXRlPzogXCJTdHJpY3RcIiB8IFwiTGF4XCIgfCBcIk5vbmVcIn19IGNvb2tpZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGFkZENvb2tpZShjb29raWUpIHtcbiAgICBpZiAoIWNvb2tpZSB8fCB0eXBlb2YgY29va2llLm5hbWUgIT09IFwic3RyaW5nXCIgfHwgY29va2llLm5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhZGRDb29raWUgcmVxdWlyZXMgYSBub24tZW1wdHkgYG5hbWVgXCIpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb29raWUudmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImFkZENvb2tpZSByZXF1aXJlcyBhIHN0cmluZyBgdmFsdWVgXCIpXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5tYW5hZ2UoKS5hZGRDb29raWUoY29va2llKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBhbiBhcmJpdHJhcnkgc2NyaXB0IGluIHRoZSBhY3RpdmUgYnJvd3NlciBzZXNzaW9uIGFuZCByZXR1cm4gdGhlXG4gICAqIHJlc29sdmVkIHZhbHVlLiBgc2NyaXB0YCBpcyB0aGUgZnVuY3Rpb24gYm9keSBleGVjdXRlZCBpbiB0aGUgYnJvd3NlclxuICAgKiAoYG5ldyBGdW5jdGlvbihcIi4uLlwiKWAtc3R5bGUpOyBgYXJnc2AgYXJlIGZvcndhcmRlZCBhcyBgYXJndW1lbnRzW2ldYC5cbiAgICogQXN5bmNocm9ub3VzIHNjcmlwdHMgbXVzdCBgcmV0dXJuYCBhIFByb21pc2UsIHdoaWNoIFNlbGVuaXVtIGF3YWl0cy5cbiAgICpcbiAgICogVXNlZnVsIGZvciB2ZXJpZmljYXRpb24gZmxvd3MgdGhhdCBuZWVkIHRvIGNhbGwgaW50byBhcHBsaWNhdGlvbiBjb2RlXG4gICAqIChlLmcuIGBmZXRjaChcIi9kZXZlbG9wbWVudC9zaWduLWluXCIsIHsuLi59KWApIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGVcbiAgICogVUksIG9yIHRvIHJlYWQgYnJvd3NlciBzdGF0ZSB0aGUgZXhpc3RpbmcgZmluZGVyL2ludGVyYWN0IGNvbW1hbmRzXG4gICAqIGRvbid0IGV4cG9zZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNjcmlwdFxuICAgKiBAcGFyYW0gey4uLmFueX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZVNjcmlwdChzY3JpcHQsIC4uLmFyZ3MpIHtcbiAgICBpZiAodHlwZW9mIHNjcmlwdCAhPT0gXCJzdHJpbmdcIiB8fCBzY3JpcHQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJleGVjdXRlU2NyaXB0IHJlcXVpcmVzIGEgbm9uLWVtcHR5IGBzY3JpcHRgIHN0cmluZ1wiKVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlcigpLmV4ZWN1dGVTY3JpcHQoc2NyaXB0LCAuLi5hcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7QnJvd3Nlck5hdmlnYXRpb25BcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzZW5kQnJvd3NlckNvbW1hbmQodHlwZSwgcGF0aCwgYXJncyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmNvbW11bmljYXRvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29tbXVuaWNhdG9yIGhhc24ndCBiZWVuIGluaXRpYWxpemVkIHlldFwiKVxuICAgIH1cblxuICAgIGF3YWl0IHRpbWVvdXQoXG4gICAgICB7dGltZW91dDogdGhpcy5nZXRDb21tYW5kVGltZW91dChhcmdzLnRpbWVvdXQpLCBlcnJvck1lc3NhZ2U6IGB0aW1lb3V0IHdoaWxlIHNlbmRpbmcgYnJvd3NlciBjb21tYW5kICR7dHlwZX06ICR7cGF0aH1gfSxcbiAgICAgIGFzeW5jICgpID0+IGF3YWl0IC8qKiBAdHlwZSB7Tm9uTnVsbGFibGU8dHlwZW9mIHRoaXMuY29tbXVuaWNhdG9yPn0gKi8gKHRoaXMuY29tbXVuaWNhdG9yKS5zZW5kQ29tbWFuZCh7dHlwZSwgcGF0aH0pXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIFZpc2l0cyBhIHBhdGggdXNpbmcgdGhlIGluamVjdGVkIGJyb3dzZXIgaGVscGVyIHdoZW4gYXZhaWxhYmxlLCBvdGhlcndpc2UgbmF2aWdhdGVzIGRpcmVjdGx5IHdpdGggdGhlIGRyaXZlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtCcm93c2VyTmF2aWdhdGlvbkFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHZpc2l0KHBhdGgsIGFyZ3MgPSB7fSkge1xuICAgIGlmICh0aGlzLmNvbW11bmljYXRvckV4aXN0cygpICYmICghdGhpcy5jb21tdW5pY2F0b3I/LndzIHx8IHRoaXMuY29tbXVuaWNhdG9yLndzLnJlYWR5U3RhdGUgPT09IDEpKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRCcm93c2VyQ29tbWFuZChcInZpc2l0XCIsIHBhdGgsIGFyZ3MpXG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRpbWVvdXQoXG4gICAgICAgIHt0aW1lb3V0OiB0aGlzLmdldENvbW1hbmRUaW1lb3V0KGFyZ3MudGltZW91dCksIGVycm9yTWVzc2FnZTogYHRpbWVvdXQgd2hpbGUgdmlzaXRpbmcgcGF0aDogJHtwYXRofWB9LFxuICAgICAgICBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmRyaXZlclZpc2l0KHBhdGgpXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc21pc3NlcyB0byBhIHBhdGggdmlhIHRoZSBpbmplY3RlZCBicm93c2VyIGhlbHBlciB3aGVuIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIG5hdmlnYXRlcyBkaXJlY3RseSB3aXRoIHRoZSBkcml2ZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7QnJvd3Nlck5hdmlnYXRpb25BcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkaXNtaXNzVG8ocGF0aCwgYXJncyA9IHt9KSB7XG4gICAgaWYgKHRoaXMuY29tbXVuaWNhdG9yRXhpc3RzKCkgJiYgKCF0aGlzLmNvbW11bmljYXRvcj8ud3MgfHwgdGhpcy5jb21tdW5pY2F0b3Iud3MucmVhZHlTdGF0ZSA9PT0gMSkpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZEJyb3dzZXJDb21tYW5kKFwiZGlzbWlzc1RvXCIsIHBhdGgsIGFyZ3MpXG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRpbWVvdXQoXG4gICAgICAgIHt0aW1lb3V0OiB0aGlzLmdldENvbW1hbmRUaW1lb3V0KGFyZ3MudGltZW91dCksIGVycm9yTWVzc2FnZTogYHRpbWVvdXQgd2hpbGUgZGlzbWlzc2luZyB0byBwYXRoOiAke3BhdGh9YH0sXG4gICAgICAgIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuZHJpdmVyVmlzaXQocGF0aClcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0cyBicm93c2VyIGxvZ3MgZm9yIGNvbnNvbGUgb3V0cHV0IGFuZCB0cnVuY2F0ZXMgb3Zlcmx5IGxvbmcgb3V0cHV0LlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBsb2dzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4TGluZXNdXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZvcm1hdEJyb3dzZXJMb2dzRm9yQ29uc29sZShsb2dzLCBtYXhMaW5lcyA9IDIwMCkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShsb2dzKSB8fCBsb2dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtcIihubyBicm93c2VyIGxvZ3MpXCJdXG4gICAgfVxuXG4gICAgaWYgKGxvZ3MubGVuZ3RoIDw9IG1heExpbmVzKSB7XG4gICAgICByZXR1cm4gbG9nc1xuICAgIH1cblxuICAgIGNvbnN0IGtlcHRMb2dzID0gbG9ncy5zbGljZShsb2dzLmxlbmd0aCAtIG1heExpbmVzKVxuICAgIGNvbnN0IGhpZGRlbkNvdW50ID0gbG9ncy5sZW5ndGggLSBtYXhMaW5lc1xuXG4gICAgcmV0dXJuIFtgKHNob3dpbmcgbGFzdCAke21heExpbmVzfSBvZiAke2xvZ3MubGVuZ3RofSBicm93c2VyIGxvZ3MsICR7aGlkZGVuQ291bnR9IG9taXR0ZWQpYCwgLi4ua2VwdExvZ3NdXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gbG9nc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHByaW50QnJvd3NlckxvZ3NGb3JGYWlsdXJlKGxvZ3MpIHtcbiAgICBjb25zb2xlLmxvZyhcIkJyb3dzZXIgbG9nczpcIilcblxuICAgIGZvciAoY29uc3QgbGluZSBvZiB0aGlzLmZvcm1hdEJyb3dzZXJMb2dzRm9yQ29uc29sZShsb2dzKSkge1xuICAgICAgY29uc29sZS5sb2cobGluZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgYSBzY3JlZW5zaG90LCB3cml0ZXMgSFRNTC9icm93c2VyIGxvZ3MgdG8gZGlzaywgYW5kIHJldHVybnMgdGhlIGNvbGxlY3RlZCBhcnRpZmFjdHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtjdXJyZW50VXJsOiBzdHJpbmcsIGh0bWw6IHN0cmluZywgaHRtbFBhdGg6IHN0cmluZywgbG9nczogc3RyaW5nW10sIGxvZ3NQYXRoOiBzdHJpbmcsIHNjcmVlbnNob3RQYXRoOiBzdHJpbmd9Pn1cbiAgICovXG4gIGFzeW5jIHRha2VTY3JlZW5zaG90KCkge1xuICAgIHRoaXMuZGVidWdMb2coXCJHZXR0aW5nIHBhdGggZm9yIHNjcmVlbnNob3RzXCIpXG4gICAgY29uc3QgcGF0aCA9IHRoaXMuX3NjcmVlbnNob3RzUGF0aFxuXG4gICAgdGhpcy5kZWJ1Z0xvZyhgQ3JlYXRpbmcgZGlyIHdpdGggcmVjdXJzaXZlOiAke3BhdGh9YClcbiAgICBhd2FpdCBmcy5ta2RpcihwYXRoLCB7cmVjdXJzaXZlOiB0cnVlfSlcblxuICAgIHRoaXMuZGVidWdMb2coXCJHZXR0aW5nIHNjcmVlbnNob3QgaW1hZ2UgY29udGVudFwiKVxuICAgIGNvbnN0IGltYWdlQ29udGVudCA9IGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IDUwMDAsIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIHRha2luZyBzY3JlZW5zaG90XCJ9LCBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS50YWtlU2NyZWVuc2hvdCgpKVxuXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIkdlbmVyYXRpbmcgZGF0ZSB2YXJpYWJsZXNcIilcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG4gICAgY29uc3QgdGltZXN0YW1wID0gbW9tZW50KG5vdykuZm9ybWF0KFwiWVlZWS1NTS1ERC1ISC1NTS1TU1wiKVxuICAgIGNvbnN0IHNjcmVlbnNob3RQYXRoID0gYCR7cGF0aH0vJHt0aW1lc3RhbXB9LnBuZ2BcbiAgICBjb25zdCBodG1sUGF0aCA9IGAke3BhdGh9LyR7dGltZXN0YW1wfS5odG1sYFxuICAgIGNvbnN0IGxvZ3NQYXRoID0gYCR7cGF0aH0vJHt0aW1lc3RhbXB9LmxvZ3MudHh0YFxuXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIkdldHRpbmcgYnJvd3NlciBsb2dzXCIpXG4gICAgY29uc3QgbG9ncyA9IGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IDUwMDAsIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIHJlYWRpbmcgYnJvd3NlciBsb2dzXCJ9LCBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmdldEJyb3dzZXJMb2dzKCkpXG4gICAgY29uc3QgaHRtbCA9IGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IDUwMDAsIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIHJlYWRpbmcgcGFnZSBIVE1MXCJ9LCBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmdldEhUTUwoKSlcbiAgICBjb25zdCBodG1sUHJldHR5ID0gcHJldHRpZnkoaHRtbClcbiAgICB0aGlzLnByaW50QnJvd3NlckxvZ3NGb3JGYWlsdXJlKGxvZ3MpXG5cbiAgICB0aGlzLmRlYnVnTG9nKFwiV3JpdGluZyBmaWxlc1wiKVxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShodG1sUGF0aCwgaHRtbFByZXR0eSlcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUobG9nc1BhdGgsIGxvZ3Muam9pbihcIlxcblwiKSlcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoc2NyZWVuc2hvdFBhdGgsIGltYWdlQ29udGVudCwgXCJiYXNlNjRcIilcblxuICAgIGNvbnN0IGN1cnJlbnRVcmwgPSBhd2FpdCB0aGlzLmdldEN1cnJlbnRVcmwoKVxuXG4gICAgY29uc29sZS5sb2coXCJDdXJyZW50IFVSTDpcIiwgY3VycmVudFVybClcbiAgICBjb25zb2xlLmxvZyhcIkxvZ3M6XCIsIGxvZ3NQYXRoKVxuICAgIGNvbnNvbGUubG9nKFwiU2NyZWVuc2hvdDpcIiwgc2NyZWVuc2hvdFBhdGgpXG4gICAgY29uc29sZS5sb2coXCJIVE1MOlwiLCBodG1sUGF0aClcblxuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VXJsLFxuICAgICAgaHRtbCxcbiAgICAgIGh0bWxQYXRoLFxuICAgICAgbG9ncyxcbiAgICAgIGxvZ3NQYXRoLFxuICAgICAgc2NyZWVuc2hvdFBhdGhcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIHN0b3BEcml2ZXIoKSB7XG4gICAgaWYgKHRoaXMuZHJpdmVyQWRhcHRlcikge1xuICAgICAgYXdhaXQgdGhpcy5kcml2ZXJBZGFwdGVyLnN0b3AoKVxuICAgIH1cbiAgfVxufVxuIl19
|
|
692
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9icm93c2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDdEMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFBO0FBQzNCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxRQUFRLENBQUE7QUFDL0IsT0FBTyxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUMsTUFBTSxVQUFVLENBQUE7QUFDdEMsT0FBTyxPQUFPLE1BQU0sMkJBQTJCLENBQUE7QUFDL0MsT0FBTyxjQUFjLE1BQU0sOEJBQThCLENBQUE7QUFDekQsT0FBTyxZQUFZLE1BQU0sNEJBQTRCLENBQUE7QUFFckQ7Ozs7OztHQU1HO0FBQ0g7Ozs7R0FJRztBQUNIOzs7R0FHRztBQUNIOzs7R0FHRztBQUNIOzs7Ozs7O0dBT0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFFSDs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsTUFBTTtJQUM1QixPQUFPLGlCQUFpQixpQkFBaUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFBO0FBQ3ZELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxLQUFLO0lBQzlCLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQTtBQUNuRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsY0FBYyxDQUFDLEtBQUs7SUFDM0IsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO0lBQ2hELE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFB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QUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCB7S2V5fSBmcm9tIFwic2VsZW5pdW0td2ViZHJpdmVyXCJcbmltcG9ydCBtb21lbnQgZnJvbSBcIm1vbWVudFwiXG5pbXBvcnQge3ByZXR0aWZ5fSBmcm9tIFwiaHRtbGZ5XCJcbmltcG9ydCB7d2FpdCwgd2FpdEZvcn0gZnJvbSBcImF3YWl0ZXJ5XCJcbmltcG9ydCB0aW1lb3V0IGZyb20gXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCJcbmltcG9ydCBTZWxlbml1bURyaXZlciBmcm9tIFwiLi9kcml2ZXJzL3NlbGVuaXVtLWRyaXZlci5qc1wiXG5pbXBvcnQgQXBwaXVtRHJpdmVyIGZyb20gXCIuL2RyaXZlcnMvYXBwaXVtLWRyaXZlci5qc1wiXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQnJvd3NlckFyZ3NcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2RlYnVnXSBFbmFibGUgZGVidWcgbG9nZ2luZy5cbiAqIEBwcm9wZXJ0eSB7QnJvd3NlckRyaXZlckNvbmZpZ30gW2RyaXZlcl0gRHJpdmVyIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QtY29tbXVuaWNhdG9yLmpzXCIpLmRlZmF1bHR9IFtjb21tdW5pY2F0b3JdIE9wdGlvbmFsIGNvbW1hbmQgY29tbXVuaWNhdG9yIGZvciBoZWxwZXItZHJpdmVuIG5hdmlnYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NjcmVlbnNob3RzUGF0aF0gRGlyZWN0b3J5IHVzZWQgZm9yIHNhdmVkIHNjcmVlbnNob3RzIGFuZCBicm93c2VyIGFydGlmYWN0cy5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCcm93c2VyRHJpdmVyQ29uZmlnXG4gKiBAcHJvcGVydHkge1wic2VsZW5pdW1cInxcImFwcGl1bVwifSBbdHlwZV0gRHJpdmVyIGltcGxlbWVudGF0aW9uIHRvIHVzZS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW29wdGlvbnNdIERyaXZlci1zcGVjaWZpYyBvcHRpb25zLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJyb3dzZXJOYXZpZ2F0aW9uQXJnc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XSBPdmVycmlkZSB0aGUgdGltZW91dCBmb3IgdGhpcyBuYXZpZ2F0aW9uIGNvbW1hbmQuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQnJvd3NlclBhdGhXYWl0QXJnc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XSBPdmVycmlkZSB0aGUgdGltZW91dCBmb3IgdGhpcyBwYXRoIHdhaXQuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQnJvd3NlclRleHRXYWl0QXJnc1xuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3Njcm9sbENvbnRhaW5lclRlc3RJRHNdIE5hdGl2ZSB0ZXN0IElEcyB0aGF0IHNob3VsZCBiZSB0cmllZCBhcyBzY3JvbGwgY29udGFpbmVycyBiZWZvcmUgZmFsbGluZyBiYWNrIHRvIHZpZXdwb3J0IGdlc3R1cmVzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2Nyb2xsVG9dIFdoZXRoZXIgdG8gc2Nyb2xsIGZvdW5kIGVsZW1lbnRzIGludG8gdmlldyBiZWZvcmUgcmV0dXJuaW5nIHRoZW0uXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdIE92ZXJyaWRlIHRoZSB0aW1lb3V0IGZvciB0aGlzIHRleHQgd2FpdC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3VzZUJhc2VTZWxlY3Rvcl0gV2hldGhlciB0byBzY29wZSBieSB0aGUgYmFzZSBzZWxlY3Rvci5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbiB8IG51bGx9IFt2aXNpYmxlXSBXaGV0aGVyIHRvIHJlcXVpcmUgZWxlbWVudHMgdG8gYmUgdmlzaWJsZS5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCcm93c2VyQ3VycmVudFVybFdhaXRBcmdzXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdIE92ZXJyaWRlIHRoZSB0aW1lb3V0IGZvciB0aGlzIFVSTCB3YWl0LlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJyb3dzZXJUZXN0SURJbnB1dEFyZ3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF0gT3ZlcnJpZGUgdGltZW91dCBmb3IgdGhlIGlucHV0IGxvb2t1cC5cbiAqL1xuXG4vKipcbiAqIEJ1aWxkcyBhIGRhdGEtdGVzdGlkIENTUyBzZWxlY3Rvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SUQgUmF3IHZhbHVlIGZyb20gYSBgZGF0YS10ZXN0aWRgIGF0dHJpYnV0ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IENTUyBhdHRyaWJ1dGUgc2VsZWN0b3IuXG4gKi9cbmZ1bmN0aW9uIHRlc3RJZFNlbGVjdG9yKHRlc3RJRCkge1xuICByZXR1cm4gYFtkYXRhLXRlc3RpZD1cIiR7Y3NzQXR0cmlidXRlVmFsdWUodGVzdElEKX1cIl1gXG59XG5cbi8qKlxuICogRXNjYXBlcyBhIHZhbHVlIGZvciB1c2UgaW5zaWRlIGEgZG91YmxlLXF1b3RlZCBDU1MgYXR0cmlidXRlIHNlbGVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IHZhbHVlIFJhdyBhdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBFc2NhcGVkIHNlbGVjdG9yIHZhbHVlLlxuICovXG5mdW5jdGlvbiBjc3NBdHRyaWJ1dGVWYWx1ZSh2YWx1ZSkge1xuICByZXR1cm4gU3RyaW5nKHZhbHVlKS5yZXBsYWNlKC9cXFxcL2csIFwiXFxcXFxcXFxcIikucmVwbGFjZSgvXCIvZywgXCJcXFxcXFxcIlwiKVxufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBSR0IgY2hhbm5lbHMgZnJvbSBDU1MgYHJnYiguLi4pYC9gcmdiYSguLi4pYCB2YWx1ZXMgb3IgYW4gUkdCIGZyYWdtZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIENTUyBjb2xvciB2YWx1ZSBvciBSR0IgZnJhZ21lbnQgbGlrZSBgMzAsIDQxLCA1OWAuXG4gKiBAcmV0dXJucyB7W251bWJlciwgbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBjc3NSZ2JDaGFubmVscyh2YWx1ZSkge1xuICBjb25zdCByZ2JNYXRjaCA9IHZhbHVlLm1hdGNoKC9yZ2JhP1xcKChbXildKylcXCkvKVxuICBjb25zdCBjaGFubmVsc1ZhbHVlID0gcmdiTWF0Y2ggPyByZ2JNYXRjaFsxXSA6IHZhbHVlXG4gIGNvbnN0IGNoYW5uZWxzID0gY2hhbm5lbHNWYWx1ZVxuICAgIC5yZXBsYWNlKC9cXHMqXFwvLiokLywgXCJcIilcbiAgICAuc3BsaXQoL1ssXFxzXSsvKVxuICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAuc2xpY2UoMCwgMylcbiAgICAubWFwKChjaGFubmVsKSA9PiBOdW1iZXIoY2hhbm5lbCkpXG5cbiAgaWYgKGNoYW5uZWxzLmxlbmd0aCAhPT0gMyB8fCBjaGFubmVscy5zb21lKChjaGFubmVsKSA9PiAhTnVtYmVyLmlzRmluaXRlKGNoYW5uZWwpKSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIHJldHVybiAvKiogQHR5cGUge1tudW1iZXIsIG51bWJlciwgbnVtYmVyXX0gKi8gKGNoYW5uZWxzKVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgYnJvd3Nlci1ub3JtYWxpemVkIENTUyBjb2xvciBtYXRjaGVzIHRoZSBSR0IgdHJpcGxldC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhY3R1YWxWYWx1ZSBCcm93c2VyLW5vcm1hbGl6ZWQgQ1NTIGNvbG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IHJnYkZyYWdtZW50IFJHQiBmcmFnbWVudCBsaWtlIGAzMCwgNDEsIDU5YC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBSR0IgY2hhbm5lbHMgbWF0Y2guXG4gKi9cbmZ1bmN0aW9uIGNzc1ZhbHVlTWF0Y2hlc1JnYihhY3R1YWxWYWx1ZSwgcmdiRnJhZ21lbnQpIHtcbiAgY29uc3QgYWN0dWFsQ2hhbm5lbHMgPSBjc3NSZ2JDaGFubmVscyhhY3R1YWxWYWx1ZSlcbiAgY29uc3QgZXhwZWN0ZWRDaGFubmVscyA9IGNzc1JnYkNoYW5uZWxzKHJnYkZyYWdtZW50KVxuXG4gIGlmICghYWN0dWFsQ2hhbm5lbHMgfHwgIWV4cGVjdGVkQ2hhbm5lbHMpIHJldHVybiBmYWxzZVxuXG4gIHJldHVybiBhY3R1YWxDaGFubmVscy5ldmVyeSgoYWN0dWFsQ2hhbm5lbCwgaW5kZXgpID0+IGFjdHVhbENoYW5uZWwgPT09IGV4cGVjdGVkQ2hhbm5lbHNbaW5kZXhdKVxufVxuXG4vKiogR2VuZXJpYyBicm93c2VyIHNlc3Npb24gd3JhcHBlciBhcm91bmQgdGhlIGNvbmZpZ3VyZWQgZHJpdmVyLiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnJvd3NlciB7XG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkRyaXZlciB8IHVuZGVmaW5lZH0gKi9cbiAgZHJpdmVyID0gdW5kZWZpbmVkXG5cbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2RyaXZlcnMvd2ViZHJpdmVyLWRyaXZlci5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSAqL1xuICBkcml2ZXJBZGFwdGVyID0gdW5kZWZpbmVkXG5cbiAgX2RlYnVnID0gZmFsc2VcbiAgLyoqIEB0eXBlIHtCcm93c2VyRHJpdmVyQ29uZmlnIHwgdW5kZWZpbmVkfSAqL1xuICBfZHJpdmVyQ29uZmlnID0gdW5kZWZpbmVkXG4gIC8qKiBAdHlwZSB7RXJyb3IgfCB1bmRlZmluZWR9ICovXG4gIF9odHRwU2VydmVyRXJyb3IgPSB1bmRlZmluZWRcblxuICAvKiogQHBhcmFtIHtCcm93c2VyQXJnc30gW2FyZ3NdICovXG4gIGNvbnN0cnVjdG9yKHtkZWJ1ZyA9IGZhbHNlLCBkcml2ZXIsIGNvbW11bmljYXRvciwgc2NyZWVuc2hvdHNQYXRoID0gYCR7cHJvY2Vzcy5jd2QoKX0vdG1wL3NjcmVlbnNob3RzYCwgLi4ucmVzdEFyZ3N9ID0ge30pIHtcbiAgICBjb25zdCByZXN0QXJnc0tleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncylcblxuICAgIGlmIChyZXN0QXJnc0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGJyb3dzZXIgYXJndW1lbnRzOiAke3Jlc3RBcmdzS2V5cy5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICB0aGlzLl9kZWJ1ZyA9IGRlYnVnXG4gICAgdGhpcy5fZHJpdmVyQ29uZmlnID0gZHJpdmVyXG4gICAgdGhpcy5fc2NyZWVuc2hvdHNQYXRoID0gc2NyZWVuc2hvdHNQYXRoXG4gICAgdGhpcy5jb21tdW5pY2F0b3IgPSBjb21tdW5pY2F0b3JcbiAgICB0aGlzLmRyaXZlckFkYXB0ZXIgPSB0aGlzLmNyZWF0ZURyaXZlcihkcml2ZXIpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtCcm93c2VyRHJpdmVyQ29uZmlnfSBbZHJpdmVyQ29uZmlnXVxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9kcml2ZXJzL3dlYmRyaXZlci1kcml2ZXIuanNcIikuZGVmYXVsdH1cbiAgICovXG4gIGNyZWF0ZURyaXZlcihkcml2ZXJDb25maWcgPSB7fSkge1xuICAgIGNvbnN0IHt0eXBlID0gXCJzZWxlbml1bVwiLCBvcHRpb25zLCAuLi5yZXN0QXJnc30gPSBkcml2ZXJDb25maWdcbiAgICBjb25zdCByZXN0QXJnc0tleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncylcblxuICAgIGlmIChyZXN0QXJnc0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRyaXZlciBhcmdzOiAke3Jlc3RBcmdzS2V5cy5qb2luKFwiLCBcIil9YClcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gXCJzZWxlbml1bVwiKSB7XG4gICAgICByZXR1cm4gbmV3IFNlbGVuaXVtRHJpdmVyKHticm93c2VyOiB0aGlzLCBvcHRpb25zfSlcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gXCJhcHBpdW1cIikge1xuICAgICAgcmV0dXJuIG5ldyBBcHBpdW1Ecml2ZXIoe2Jyb3dzZXI6IHRoaXMsIG9wdGlvbnN9KVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZHJpdmVyIHR5cGU6ICR7dHlwZX1gKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC1jb21tdW5pY2F0b3IuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gY29tbXVuaWNhdG9yXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0Q29tbXVuaWNhdG9yKGNvbW11bmljYXRvcikge1xuICAgIHRoaXMuY29tbXVuaWNhdG9yID0gY29tbXVuaWNhdG9yXG4gIH1cblxuICAvKiogQHJldHVybnMge2Jvb2xlYW59ICovXG4gIGNvbW11bmljYXRvckV4aXN0cygpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLmNvbW11bmljYXRvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0QmFzZVNlbGVjdG9yKGJhc2VTZWxlY3RvcikgeyB0aGlzLl9iYXNlU2VsZWN0b3IgPSBiYXNlU2VsZWN0b3IgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqL1xuICBnZXRCYXNlU2VsZWN0b3IoKSB7IHJldHVybiB0aGlzLl9iYXNlU2VsZWN0b3IgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldFNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QmFzZVNlbGVjdG9yKCkgPyBgJHt0aGlzLmdldEJhc2VTZWxlY3RvcigpfSAke3NlbGVjdG9yfWAgOiBzZWxlY3RvclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZGVidWdFcnJvciguLi5hcmdzKSB7XG4gICAgY29uc29sZS5lcnJvcihcIltCcm93c2VyIGVycm9yXVwiLCAuLi5hcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZGVidWdMb2coLi4uYXJncykge1xuICAgIGlmICh0aGlzLl9kZWJ1Zykge1xuICAgICAgY29uc29sZS5sb2coXCJbQnJvd3NlciBkZWJ1Z11cIiwgLi4uYXJncylcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIHRocm93SWZIdHRwU2VydmVyRXJyb3IoKSB7XG4gICAgaWYgKHRoaXMuX2h0dHBTZXJ2ZXJFcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIHNlcnZlciBlcnJvcjogJHt0aGlzLl9odHRwU2VydmVyRXJyb3IubWVzc2FnZX1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG9uSHR0cFNlcnZlckVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG5cbiAgICB0aGlzLl9odHRwU2VydmVyRXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKVxuICAgIGNvbnNvbGUuZXJyb3IoYEhUVFAgc2VydmVyIGVycm9yOiAke2Vycm9yTWVzc2FnZX1gKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRHJpdmVyfSAqL1xuICBnZXREcml2ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmdldFdlYkRyaXZlcigpXG4gIH1cblxuICAvKiogQHJldHVybnMge2ltcG9ydChcIi4vZHJpdmVycy93ZWJkcml2ZXItZHJpdmVyLmpzXCIpLmRlZmF1bHR9ICovXG4gIGdldERyaXZlckFkYXB0ZXIoKSB7XG4gICAgaWYgKCF0aGlzLmRyaXZlckFkYXB0ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRyaXZlciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcIilcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kcml2ZXJBZGFwdGVyXG4gIH1cblxuICAvKiogQHJldHVybnMge251bWJlcn0gKi9cbiAgZ2V0VGltZW91dHMoKSB7IHJldHVybiB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5nZXRUaW1lb3V0cygpIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIHJlc3RvcmVUaW1lb3V0cygpIHtcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5yZXN0b3JlVGltZW91dHMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuZXdUaW1lb3V0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZHJpdmVyU2V0VGltZW91dHMobmV3VGltZW91dCkge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmRyaXZlclNldFRpbWVvdXRzKG5ld1RpbWVvdXQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IG5ld1RpbWVvdXRcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzZXRUaW1lb3V0cyhuZXdUaW1lb3V0KSB7XG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuc2V0VGltZW91dHMobmV3VGltZW91dClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59ICovXG4gIGFzeW5jIGdldEJyb3dzZXJMb2dzKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5nZXRCcm93c2VyTG9ncygpXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gKi9cbiAgYXN5bmMgZ2V0Q3VycmVudFVybCgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZ2V0Q3VycmVudFVybCgpXG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgdW50aWwgdGhlIGN1cnJlbnQgVVJMIHBhdGhuYW1lIGV4YWN0bHkgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgcGF0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkUGF0aFxuICAgKiBAcGFyYW0ge0Jyb3dzZXJQYXRoV2FpdEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JQYXRoKGV4cGVjdGVkUGF0aCwgYXJncyA9IHt9KSB7XG4gICAgYXdhaXQgd2FpdEZvcih7dGltZW91dDogdGhpcy5nZXRDb21tYW5kVGltZW91dChhcmdzLnRpbWVvdXQpfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFVybCA9IGF3YWl0IHRoaXMuZ2V0Q3VycmVudFVybCgpXG4gICAgICBjb25zdCBjdXJyZW50UGF0aCA9IG5ldyBVUkwoY3VycmVudFVybCkucGF0aG5hbWVcblxuICAgICAgaWYgKGN1cnJlbnRQYXRoICE9PSBleHBlY3RlZFBhdGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaW1lZCBvdXQgd2FpdGluZyBmb3IgcGF0aCAke2V4cGVjdGVkUGF0aH0uIEN1cnJlbnQgVVJMOiAke2N1cnJlbnRVcmx9YClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIHVudGlsIHRoZSBjdXJyZW50IFVSTCBleGFjdGx5IG1hdGNoZXMgdGhlIGV4cGVjdGVkIFVSTC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVXJsIEV4YWN0IFVSTCBleHBlY3RlZC5cbiAgICogQHBhcmFtIHtCcm93c2VyQ3VycmVudFVybFdhaXRBcmdzfSBbYXJnc10gT3B0aW9uYWwgdGltZW91dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yQ3VycmVudFVybChleHBlY3RlZFVybCwgYXJncyA9IHt9KSB7XG4gICAgYXdhaXQgd2FpdEZvcih7dGltZW91dDogdGhpcy5nZXRDb21tYW5kVGltZW91dChhcmdzLnRpbWVvdXQpfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFVybCA9IGF3YWl0IHRoaXMuZ2V0Q3VycmVudFVybCgpXG5cbiAgICAgIGlmIChjdXJyZW50VXJsICE9PSBleHBlY3RlZFVybCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRpbWVkIG91dCB3YWl0aW5nIGZvciBVUkwgJHtleHBlY3RlZFVybH0uIEN1cnJlbnQgVVJMOiAke2N1cnJlbnRVcmx9YClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIHVudGlsIHRoZSBjdXJyZW50IFVSTCBjb250YWlucyBhIGZyYWdtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRGcmFnbWVudCBGcmFnbWVudCB0aGF0IHNob3VsZCBhcHBlYXIuXG4gICAqIEBwYXJhbSB7QnJvd3NlckN1cnJlbnRVcmxXYWl0QXJnc30gW2FyZ3NdIE9wdGlvbmFsIHRpbWVvdXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvclVybENvbnRhaW5zKGV4cGVjdGVkRnJhZ21lbnQsIGFyZ3MgPSB7fSkge1xuICAgIGF3YWl0IHdhaXRGb3Ioe3RpbWVvdXQ6IHRoaXMuZ2V0Q29tbWFuZFRpbWVvdXQoYXJncy50aW1lb3V0KX0sIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRVcmwgPSBhd2FpdCB0aGlzLmdldEN1cnJlbnRVcmwoKVxuXG4gICAgICBpZiAoIWN1cnJlbnRVcmwuaW5jbHVkZXMoZXhwZWN0ZWRGcmFnbWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaW1lZCBvdXQgd2FpdGluZyBmb3IgVVJMIHRvIGluY2x1ZGUgJHtleHBlY3RlZEZyYWdtZW50fS4gQ3VycmVudCBVUkw6ICR7Y3VycmVudFVybH1gKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgdW50aWwgdGhlIGN1cnJlbnQgVVJMIGRvZXMgbm90IGNvbnRhaW4gYSBmcmFnbWVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuZXhwZWN0ZWRGcmFnbWVudCBGcmFnbWVudCB0aGF0IHNob3VsZCBkaXNhcHBlYXIuXG4gICAqIEBwYXJhbSB7QnJvd3NlckN1cnJlbnRVcmxXYWl0QXJnc30gW2FyZ3NdIE9wdGlvbmFsIHRpbWVvdXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvclVybEV4Y2x1ZGVzKHVuZXhwZWN0ZWRGcmFnbWVudCwgYXJncyA9IHt9KSB7XG4gICAgYXdhaXQgd2FpdEZvcih7dGltZW91dDogdGhpcy5nZXRDb21tYW5kVGltZW91dChhcmdzLnRpbWVvdXQpfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFVybCA9IGF3YWl0IHRoaXMuZ2V0Q3VycmVudFVybCgpXG5cbiAgICAgIGlmIChjdXJyZW50VXJsLmluY2x1ZGVzKHVuZXhwZWN0ZWRGcmFnbWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaW1lZCBvdXQgd2FpdGluZyBmb3IgVVJMIHRvIGV4Y2x1ZGUgJHt1bmV4cGVjdGVkRnJhZ21lbnR9LiBDdXJyZW50IFVSTDogJHtjdXJyZW50VXJsfWApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXT59XG4gICAqL1xuICBhc3luYyBhbGwoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5hbGwoc2VsZWN0b3IsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5GaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgYXN5bmMgZXhpc3RzKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZXhpc3RzKHNlbGVjdG9yLCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuRmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZmluZChzZWxlY3RvciwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5GaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmRCeVRlc3RJRCh0ZXN0SUQsIGFyZ3MpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZmluZEJ5VGVzdElEKHRlc3RJRCwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBuYXRpdmUgQW5kcm9pZCB2aXNpYmxlIHRleHQgb3IgYW4gYWNjZXNzaWJpbGl0eSBsYWJlbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRvIGxvY2F0ZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfSBbYXJnc10gT3B0aW9uYWwgbG9va3VwIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59IE1hdGNoaW5nIG5hdGl2ZSBlbGVtZW50LlxuICAgKi9cbiAgYXN5bmMgZmluZEJ5TmF0aXZlVGV4dChleHBlY3RlZFRleHQsIGFyZ3MgPSB7fSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5maW5kQnlOYXRpdmVUZXh0KGV4cGVjdGVkVGV4dCwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZE5vV2FpdChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmZpbmROb1dhaXQoc2VsZWN0b3IsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5GaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59XG4gICAqL1xuICBhc3luYyB0ZXh0KHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkudGV4dChzZWxlY3RvciwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5GaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgY2xpY2soZWxlbWVudE9ySWRlbnRpZmllciwgYXJncykge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmNsaWNrKGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudHxzdHJpbmd8e3NlbGVjdG9yOiBzdHJpbmd9ICYgaW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5JbnRlcmFjdEFyZ3N9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWVcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIGFzeW5jIGludGVyYWN0KGVsZW1lbnRPcklkZW50aWZpZXIsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuaW50ZXJhY3QoZWxlbWVudE9ySWRlbnRpZmllciwgbWV0aG9kTmFtZSwgLi4uYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgYW4gaW5wdXQgYW5kIHNlbmRzIHJlcGxhY2VtZW50IGtleXMgdGhyb3VnaCByZXRyeWFibGUgYnJvd3NlciBpbnRlcmFjdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR8c3RyaW5nfHtzZWxlY3Rvcjogc3RyaW5nfSAmIGltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuSW50ZXJhY3RBcmdzfSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZXh0VmFsdWVcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBjbGVhckFuZFNlbmRLZXlzKGVsZW1lbnRPcklkZW50aWZpZXIsIG5leHRWYWx1ZSkge1xuICAgIGxldCBhY3R1YWxWYWx1ZVxuXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gMzsgYXR0ZW1wdCsrKSB7XG4gICAgICBjb25zdCB0YWdOYW1lID0gU3RyaW5nKGF3YWl0IHRoaXMuaW50ZXJhY3QoZWxlbWVudE9ySWRlbnRpZmllciwgXCJnZXRUYWdOYW1lXCIpKS50b0xvd2VyQ2FzZSgpXG5cbiAgICAgIGF3YWl0IHRoaXMuaW50ZXJhY3QodGhpcy50ZXh0RW50cnlDbGlja1RhcmdldChlbGVtZW50T3JJZGVudGlmaWVyKSwgXCJjbGlja1wiKVxuXG4gICAgICBpZiAodGFnTmFtZSA9PT0gXCJpbnB1dFwiIHx8IHRhZ05hbWUgPT09IFwidGV4dGFyZWFcIikge1xuICAgICAgICBhd2FpdCB0aGlzLmludGVyYWN0KGVsZW1lbnRPcklkZW50aWZpZXIsIFwiY2xlYXJcIilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW50ZXJhY3QoZWxlbWVudE9ySWRlbnRpZmllciwgXCJzZW5kS2V5c1wiLCBLZXkuY2hvcmQoS2V5LkNPTlRST0wsIFwiYVwiKSlcbiAgICAgICAgYXdhaXQgdGhpcy5pbnRlcmFjdChlbGVtZW50T3JJZGVudGlmaWVyLCBcInNlbmRLZXlzXCIsIEtleS5CQUNLX1NQQUNFKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmludGVyYWN0KGVsZW1lbnRPcklkZW50aWZpZXIsIFwic2VuZEtleXNcIiwgbmV4dFZhbHVlKVxuXG4gICAgICBhY3R1YWxWYWx1ZSA9IGF3YWl0IHRoaXMuaW50ZXJhY3QoZWxlbWVudE9ySWRlbnRpZmllciwgXCJnZXRQcm9wZXJ0eVwiLCBcInZhbHVlXCIpXG5cbiAgICAgIGlmIChhY3R1YWxWYWx1ZSA9PT0gbmV4dFZhbHVlKSByZXR1cm5cblxuICAgICAgaWYgKGF0dGVtcHQgPCAzKSBhd2FpdCB3YWl0KDUwKVxuICAgIH1cblxuICAgIGNvbnN0IGFjdHVhbExlbmd0aCA9IHR5cGVvZiBhY3R1YWxWYWx1ZSA9PSBcInN0cmluZ1wiID8gYWN0dWFsVmFsdWUubGVuZ3RoIDogXCJtaXNzaW5nXCJcblxuICAgIHRocm93IG5ldyBFcnJvcihgSW5wdXQgcmVwbGFjZW1lbnQgZGlkIG5vdCB1cGRhdGUgdGhlIGVsZW1lbnQgdmFsdWUgYWZ0ZXIgMyBhdHRlbXB0cy4gRXhwZWN0ZWQgbGVuZ3RoICR7bmV4dFZhbHVlLmxlbmd0aH0sIGdvdCAke2FjdHVhbExlbmd0aH0uYClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fHN0cmluZ3x7c2VsZWN0b3I6IHN0cmluZ30gJiBpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkludGVyYWN0QXJnc30gZWxlbWVudE9ySWRlbnRpZmllclxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR8c3RyaW5nfHtzZWxlY3Rvcjogc3RyaW5nfSAmIGltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuSW50ZXJhY3RBcmdzfVxuICAgKi9cbiAgdGV4dEVudHJ5Q2xpY2tUYXJnZXQoZWxlbWVudE9ySWRlbnRpZmllcikge1xuICAgIGlmICh0eXBlb2YgZWxlbWVudE9ySWRlbnRpZmllciA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHtzZWxlY3RvcjogZWxlbWVudE9ySWRlbnRpZmllciwgbWV0aG9kOiBcImFjdGlvbnNcIn1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGVsZW1lbnRPcklkZW50aWZpZXIgPT09IFwib2JqZWN0XCIgJiYgZWxlbWVudE9ySWRlbnRpZmllciAhPT0gbnVsbCAmJiBcInNlbGVjdG9yXCIgaW4gZWxlbWVudE9ySWRlbnRpZmllcikge1xuICAgICAgcmV0dXJuIHsuLi5lbGVtZW50T3JJZGVudGlmaWVyLCBtZXRob2Q6IFwiYWN0aW9uc1wifVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50T3JJZGVudGlmaWVyXG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMgYW4gaW5wdXQtbGlrZSBlbGVtZW50J3MgdmFsdWUgYnkgdGVzdCBpZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRCBGaWVsZCBgZGF0YS10ZXN0aWRgIHRvIHRhcmdldC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5leHRWYWx1ZSBUZXh0IHRvIGxlYXZlIGluIHRoZSBmaWVsZC5cbiAgICogQHBhcmFtIHtCcm93c2VyVGVzdElESW5wdXRBcmdzfSBbYXJnc10gT3B0aW9uYWwgbG9va3VwIHRpbWVvdXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVwbGFjZVRlc3RJRElucHV0VmFsdWUodGVzdElELCBuZXh0VmFsdWUsIGFyZ3MgPSB7fSkge1xuICAgIGF3YWl0IHRoaXMuY2xlYXJBbmRTZW5kS2V5cyh7XG4gICAgICBzZWxlY3RvcjogdGVzdElkU2VsZWN0b3IodGVzdElEKSxcbiAgICAgIHRpbWVvdXQ6IGFyZ3MudGltZW91dFxuICAgIH0sIG5leHRWYWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyB1bnRpbCBhIHRlc3QgaWQgY29udGFpbnMgZXhwZWN0ZWQgdmlzaWJsZSB0ZXh0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEIEVsZW1lbnQgYGRhdGEtdGVzdGlkYCB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRUZXh0IEZyYWdtZW50IHRoYXQgbXVzdCBhcHBlYXIgaW4gdGhlIGVsZW1lbnQgdGV4dC5cbiAgICogQHBhcmFtIHtCcm93c2VyVGV4dFdhaXRBcmdzfSBbYXJnc10gT3B0aW9uYWwgdGltZW91dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yVGVzdElEVGV4dCh0ZXN0SUQsIGV4cGVjdGVkVGV4dCwgYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge3RpbWVvdXQ6IHdhaXRUaW1lb3V0LCAuLi5maW5kQXJnc30gPSBhcmdzXG5cbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS53YWl0Rm9yVGVzdElEVGV4dCh0ZXN0SUQsIGV4cGVjdGVkVGV4dCwge1xuICAgICAgLi4uZmluZEFyZ3MsXG4gICAgICB0aW1lb3V0OiB0aGlzLmdldENvbW1hbmRUaW1lb3V0KHdhaXRUaW1lb3V0KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgdW50aWwgYSB0ZXN0IGlkIG5vIGxvbmdlciBjb250YWlucyBleGNsdWRlZCB2aXNpYmxlIHRleHQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SUQgRWxlbWVudCBgZGF0YS10ZXN0aWRgIHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleGNsdWRlZFRleHQgRnJhZ21lbnQgdGhhdCBzaG91bGQgZGlzYXBwZWFyIGZyb20gdGhlIGVsZW1lbnQgdGV4dC5cbiAgICogQHBhcmFtIHtCcm93c2VyVGV4dFdhaXRBcmdzfSBbYXJnc10gT3B0aW9uYWwgdGltZW91dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yVGVzdElEVGV4dEV4Y2x1ZGVzKHRlc3RJRCwgZXhjbHVkZWRUZXh0LCBhcmdzID0ge30pIHtcbiAgICBjb25zdCB7dGltZW91dDogd2FpdFRpbWVvdXQsIC4uLmZpbmRBcmdzfSA9IGFyZ3NcblxuICAgIGF3YWl0IHdhaXRGb3Ioe3RpbWVvdXQ6IHRoaXMuZ2V0Q29tbWFuZFRpbWVvdXQod2FpdFRpbWVvdXQpfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHRoaXMuZmluZEJ5VGVzdElEKHRlc3RJRCwgey4uLmZpbmRBcmdzLCB0aW1lb3V0OiAwfSlcbiAgICAgIGNvbnN0IGFjdHVhbFRleHQgPSBhd2FpdCBlbGVtZW50LmdldFRleHQoKVxuXG4gICAgICBpZiAoYWN0dWFsVGV4dC5pbmNsdWRlcyhleGNsdWRlZFRleHQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGltZWQgb3V0IHdhaXRpbmcgZm9yIHRleHQgdG8gZXhjbHVkZSAke2V4Y2x1ZGVkVGV4dH0uIExhc3QgdGV4dCB3YXMgJHthY3R1YWxUZXh0fWApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NlcnRzIGEgcmVuZGVyZWQgZWxlbWVudCBoYXMgYSBDU1MgY29sb3IgZnJvbSB0aGUgZXhwZWN0ZWQgcGFsZXR0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRCBFbGVtZW50IGBkYXRhLXRlc3RpZGAgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5TmFtZSBDU1MgcHJvcGVydHkgdG8gcmVhZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkUmdiIEV4cGVjdGVkIFJHQiBmcmFnbWVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpZ2h0UmdiIERpc2FsbG93ZWQgUkdCIGZyYWdtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb24gSHVtYW4tcmVhZGFibGUgZWxlbWVudCBkZXNjcmlwdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBleHBlY3RUZXN0SURDc3NDb2xvcih0ZXN0SUQsIHByb3BlcnR5TmFtZSwgZXhwZWN0ZWRSZ2IsIGxpZ2h0UmdiLCBkZXNjcmlwdGlvbikge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBhd2FpdCB0aGlzLmZpbmRCeVRlc3RJRCh0ZXN0SUQpXG4gICAgY29uc3QgYWN0dWFsVmFsdWUgPSBhd2FpdCBlbGVtZW50LmdldENzc1ZhbHVlKHByb3BlcnR5TmFtZSlcblxuICAgIGlmIChjc3NWYWx1ZU1hdGNoZXNSZ2IoYWN0dWFsVmFsdWUsIGxpZ2h0UmdiKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2Rlc2NyaXB0aW9ufSB0byBhdm9pZCB0aGUgbGlnaHQgcGFsZXR0ZSwgZ290ICR7cHJvcGVydHlOYW1lfSAke2FjdHVhbFZhbHVlfWApXG4gICAgfVxuICAgIGlmICghY3NzVmFsdWVNYXRjaGVzUmdiKGFjdHVhbFZhbHVlLCBleHBlY3RlZFJnYikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtkZXNjcmlwdGlvbn0gdG8gaW5jbHVkZSByZ2IoJHtleHBlY3RlZFJnYn0pLCBnb3QgJHtwcm9wZXJ0eU5hbWV9ICR7YWN0dWFsVmFsdWV9YClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xscyBhbiBlbGVtZW50IGludG8gdmlldy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudHxzdHJpbmd8e3NlbGVjdG9yOiBzdHJpbmd9ICYgaW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5GaW5kQXJnc30gZWxlbWVudE9ySWRlbnRpZmllclxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuRmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHNjcm9sbEludG9WaWV3KGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpIHtcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5zY3JvbGxJbnRvVmlldyhlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbHMgdGhlIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gdGVzdCBJRCBpbnRvIHZpZXcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SURcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzY3JvbGxUZXN0SWRJbnRvVmlldyh0ZXN0SUQsIGFyZ3MpIHtcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5zY3JvbGxUZXN0SWRJbnRvVmlldyh0ZXN0SUQsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5XYWl0Rm9yTm9TZWxlY3RvckFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JOb1NlbGVjdG9yKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS53YWl0Rm9yTm9TZWxlY3RvcihzZWxlY3RvciwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBleHBlY3ROb0VsZW1lbnQoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIGxldCBmb3VuZCA9IGZhbHNlXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5maW5kTm9XYWl0KHNlbGVjdG9yLCBhcmdzKVxuICAgICAgZm91bmQgPSB0cnVlXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aChcIkVsZW1lbnQgY291bGRuJ3QgYmUgZm91bmQgYWZ0ZXIgXCIpKSB7XG4gICAgICAgIC8vIElnbm9yZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZm91bmQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgbm90IHRvIGZpbmQ6ICR7c2VsZWN0b3J9YClcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gKi9cbiAgYXN5bmMgZ2V0SFRNTCgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZ2V0SFRNTCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXIgfCB1bmRlZmluZWR9IHRpbWVvdXRPdmVycmlkZVxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0Q29tbWFuZFRpbWVvdXQodGltZW91dE92ZXJyaWRlKSB7XG4gICAgaWYgKHRpbWVvdXRPdmVycmlkZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGltZW91dE92ZXJyaWRlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0VGltZW91dHMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZHJpdmVyVmlzaXQocGF0aCkge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmRyaXZlclZpc2l0KHBhdGgpXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIGRlbGV0ZUFsbENvb2tpZXMoKSB7XG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZGVsZXRlQWxsQ29va2llcygpXG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgY29va2llIHRvIHRoZSBhY3RpdmUgZHJpdmVyIHNlc3Npb24gZm9yIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gICAqIG9yaWdpbi4gVXNlZnVsIHdoZW4gYW4gb3V0LW9mLWJhbmQgbG9naW4gKGN1cmwsIGZldGNoLCBldGMuKSByZXR1cm5lZFxuICAgKiBhIGBTZXQtQ29va2llYCB2YWx1ZSBhbmQgdGhlIHRlc3QgbmVlZHMgdGhlIGJyb3dzZXIgdG8gc3RhcnRcbiAgICogYXV0aGVudGljYXRlZCB3aXRob3V0IGRyaXZpbmcgdGhlIHNpZ24taW4gVUkuXG4gICAqXG4gICAqIFRoZSBkcml2ZXIgbXVzdCBhbHJlYWR5IGJlIG9uIGEgcGFnZSB3aG9zZSBvcmlnaW4vZG9tYWluIG1hdGNoZXMgdGhlXG4gICAqIGNvb2tpZSBkb21haW4sIG90aGVyd2lzZSBTZWxlbml1bSB3aWxsIHJlamVjdCB0aGUgY2FsbC5cbiAgICogQHBhcmFtIHt7bmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBkb21haW4/OiBzdHJpbmcsIHBhdGg/OiBzdHJpbmcsIHNlY3VyZT86IGJvb2xlYW4sIGh0dHBPbmx5PzogYm9vbGVhbiwgZXhwaXJ5PzogbnVtYmVyLCBzYW1lU2l0ZT86IFwiU3RyaWN0XCIgfCBcIkxheFwiIHwgXCJOb25lXCJ9fSBjb29raWVcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBhZGRDb29raWUoY29va2llKSB7XG4gICAgaWYgKCFjb29raWUgfHwgdHlwZW9mIGNvb2tpZS5uYW1lICE9PSBcInN0cmluZ1wiIHx8IGNvb2tpZS5uYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYWRkQ29va2llIHJlcXVpcmVzIGEgbm9uLWVtcHR5IGBuYW1lYFwiKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29va2llLnZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhZGRDb29raWUgcmVxdWlyZXMgYSBzdHJpbmcgYHZhbHVlYFwiKVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkubWFuYWdlKCkuYWRkQ29va2llKGNvb2tpZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYW4gYXJiaXRyYXJ5IHNjcmlwdCBpbiB0aGUgYWN0aXZlIGJyb3dzZXIgc2Vzc2lvbiBhbmQgcmV0dXJuIHRoZVxuICAgKiByZXNvbHZlZCB2YWx1ZS4gYHNjcmlwdGAgaXMgdGhlIGZ1bmN0aW9uIGJvZHkgZXhlY3V0ZWQgaW4gdGhlIGJyb3dzZXJcbiAgICogKGBuZXcgRnVuY3Rpb24oXCIuLi5cIilgLXN0eWxlKTsgYGFyZ3NgIGFyZSBmb3J3YXJkZWQgYXMgYGFyZ3VtZW50c1tpXWAuXG4gICAqIEFzeW5jaHJvbm91cyBzY3JpcHRzIG11c3QgYHJldHVybmAgYSBQcm9taXNlLCB3aGljaCBTZWxlbml1bSBhd2FpdHMuXG4gICAqXG4gICAqIFVzZWZ1bCBmb3IgdmVyaWZpY2F0aW9uIGZsb3dzIHRoYXQgbmVlZCB0byBjYWxsIGludG8gYXBwbGljYXRpb24gY29kZVxuICAgKiAoZS5nLiBgZmV0Y2goXCIvZGV2ZWxvcG1lbnQvc2lnbi1pblwiLCB7Li4ufSlgKSB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhlXG4gICAqIFVJLCBvciB0byByZWFkIGJyb3dzZXIgc3RhdGUgdGhlIGV4aXN0aW5nIGZpbmRlci9pbnRlcmFjdCBjb21tYW5kc1xuICAgKiBkb24ndCBleHBvc2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY3JpcHRcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVTY3JpcHQoc2NyaXB0LCAuLi5hcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBzY3JpcHQgIT09IFwic3RyaW5nXCIgfHwgc2NyaXB0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZXhlY3V0ZVNjcmlwdCByZXF1aXJlcyBhIG5vbi1lbXB0eSBgc2NyaXB0YCBzdHJpbmdcIilcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5leGVjdXRlU2NyaXB0KHNjcmlwdCwgLi4uYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0Jyb3dzZXJOYXZpZ2F0aW9uQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc2VuZEJyb3dzZXJDb21tYW5kKHR5cGUsIHBhdGgsIGFyZ3MgPSB7fSkge1xuICAgIGlmICghdGhpcy5jb21tdW5pY2F0b3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbW11bmljYXRvciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcIilcbiAgICB9XG5cbiAgICBhd2FpdCB0aW1lb3V0KFxuICAgICAge3RpbWVvdXQ6IHRoaXMuZ2V0Q29tbWFuZFRpbWVvdXQoYXJncy50aW1lb3V0KSwgZXJyb3JNZXNzYWdlOiBgdGltZW91dCB3aGlsZSBzZW5kaW5nIGJyb3dzZXIgY29tbWFuZCAke3R5cGV9OiAke3BhdGh9YH0sXG4gICAgICBhc3luYyAoKSA9PiBhd2FpdCAvKiogQHR5cGUge05vbk51bGxhYmxlPHR5cGVvZiB0aGlzLmNvbW11bmljYXRvcj59ICovICh0aGlzLmNvbW11bmljYXRvcikuc2VuZENvbW1hbmQoe3R5cGUsIHBhdGh9KVxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBWaXNpdHMgYSBwYXRoIHVzaW5nIHRoZSBpbmplY3RlZCBicm93c2VyIGhlbHBlciB3aGVuIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIG5hdmlnYXRlcyBkaXJlY3RseSB3aXRoIHRoZSBkcml2ZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7QnJvd3Nlck5hdmlnYXRpb25BcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB2aXNpdChwYXRoLCBhcmdzID0ge30pIHtcbiAgICBpZiAodGhpcy5jb21tdW5pY2F0b3JFeGlzdHMoKSAmJiAoIXRoaXMuY29tbXVuaWNhdG9yPy53cyB8fCB0aGlzLmNvbW11bmljYXRvci53cy5yZWFkeVN0YXRlID09PSAxKSkge1xuICAgICAgYXdhaXQgdGhpcy5zZW5kQnJvd3NlckNvbW1hbmQoXCJ2aXNpdFwiLCBwYXRoLCBhcmdzKVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aW1lb3V0KFxuICAgICAgICB7dGltZW91dDogdGhpcy5nZXRDb21tYW5kVGltZW91dChhcmdzLnRpbWVvdXQpLCBlcnJvck1lc3NhZ2U6IGB0aW1lb3V0IHdoaWxlIHZpc2l0aW5nIHBhdGg6ICR7cGF0aH1gfSxcbiAgICAgICAgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5kcml2ZXJWaXNpdChwYXRoKVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNtaXNzZXMgdG8gYSBwYXRoIHZpYSB0aGUgaW5qZWN0ZWQgYnJvd3NlciBoZWxwZXIgd2hlbiBhdmFpbGFibGUsIG90aGVyd2lzZSBuYXZpZ2F0ZXMgZGlyZWN0bHkgd2l0aCB0aGUgZHJpdmVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0Jyb3dzZXJOYXZpZ2F0aW9uQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZGlzbWlzc1RvKHBhdGgsIGFyZ3MgPSB7fSkge1xuICAgIGlmICh0aGlzLmNvbW11bmljYXRvckV4aXN0cygpICYmICghdGhpcy5jb21tdW5pY2F0b3I/LndzIHx8IHRoaXMuY29tbXVuaWNhdG9yLndzLnJlYWR5U3RhdGUgPT09IDEpKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRCcm93c2VyQ29tbWFuZChcImRpc21pc3NUb1wiLCBwYXRoLCBhcmdzKVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aW1lb3V0KFxuICAgICAgICB7dGltZW91dDogdGhpcy5nZXRDb21tYW5kVGltZW91dChhcmdzLnRpbWVvdXQpLCBlcnJvck1lc3NhZ2U6IGB0aW1lb3V0IHdoaWxlIGRpc21pc3NpbmcgdG8gcGF0aDogJHtwYXRofWB9LFxuICAgICAgICBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmRyaXZlclZpc2l0KHBhdGgpXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgYnJvd3NlciBsb2dzIGZvciBjb25zb2xlIG91dHB1dCBhbmQgdHJ1bmNhdGVzIG92ZXJseSBsb25nIG91dHB1dC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gbG9nc1xuICAgKiBAcGFyYW0ge251bWJlcn0gW21heExpbmVzXVxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmb3JtYXRCcm93c2VyTG9nc0ZvckNvbnNvbGUobG9ncywgbWF4TGluZXMgPSAyMDApIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobG9ncykgfHwgbG9ncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXCIobm8gYnJvd3NlciBsb2dzKVwiXVxuICAgIH1cblxuICAgIGlmIChsb2dzLmxlbmd0aCA8PSBtYXhMaW5lcykge1xuICAgICAgcmV0dXJuIGxvZ3NcbiAgICB9XG5cbiAgICBjb25zdCBrZXB0TG9ncyA9IGxvZ3Muc2xpY2UobG9ncy5sZW5ndGggLSBtYXhMaW5lcylcbiAgICBjb25zdCBoaWRkZW5Db3VudCA9IGxvZ3MubGVuZ3RoIC0gbWF4TGluZXNcblxuICAgIHJldHVybiBbYChzaG93aW5nIGxhc3QgJHttYXhMaW5lc30gb2YgJHtsb2dzLmxlbmd0aH0gYnJvd3NlciBsb2dzLCAke2hpZGRlbkNvdW50fSBvbWl0dGVkKWAsIC4uLmtlcHRMb2dzXVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGxvZ3NcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBwcmludEJyb3dzZXJMb2dzRm9yRmFpbHVyZShsb2dzKSB7XG4gICAgY29uc29sZS5sb2coXCJCcm93c2VyIGxvZ3M6XCIpXG5cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgdGhpcy5mb3JtYXRCcm93c2VyTG9nc0ZvckNvbnNvbGUobG9ncykpIHtcbiAgICAgIGNvbnNvbGUubG9nKGxpbmUpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIGEgc2NyZWVuc2hvdCwgd3JpdGVzIEhUTUwvYnJvd3NlciBsb2dzIHRvIGRpc2ssIGFuZCByZXR1cm5zIHRoZSBjb2xsZWN0ZWQgYXJ0aWZhY3RzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7Y3VycmVudFVybDogc3RyaW5nLCBodG1sOiBzdHJpbmcsIGh0bWxQYXRoOiBzdHJpbmcsIGxvZ3M6IHN0cmluZ1tdLCBsb2dzUGF0aDogc3RyaW5nLCBzY3JlZW5zaG90UGF0aDogc3RyaW5nfT59XG4gICAqL1xuICBhc3luYyB0YWtlU2NyZWVuc2hvdCgpIHtcbiAgICB0aGlzLmRlYnVnTG9nKFwiR2V0dGluZyBwYXRoIGZvciBzY3JlZW5zaG90c1wiKVxuICAgIGNvbnN0IHBhdGggPSB0aGlzLl9zY3JlZW5zaG90c1BhdGhcblxuICAgIHRoaXMuZGVidWdMb2coYENyZWF0aW5nIGRpciB3aXRoIHJlY3Vyc2l2ZTogJHtwYXRofWApXG4gICAgYXdhaXQgZnMubWtkaXIocGF0aCwge3JlY3Vyc2l2ZTogdHJ1ZX0pXG5cbiAgICB0aGlzLmRlYnVnTG9nKFwiR2V0dGluZyBzY3JlZW5zaG90IGltYWdlIGNvbnRlbnRcIilcbiAgICBjb25zdCBpbWFnZUNvbnRlbnQgPSBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiA1MDAwLCBlcnJvck1lc3NhZ2U6IFwidGltZW91dCB3aGlsZSB0YWtpbmcgc2NyZWVuc2hvdFwifSwgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkudGFrZVNjcmVlbnNob3QoKSlcblxuICAgIHRoaXMuZGVidWdMb2coXCJHZW5lcmF0aW5nIGRhdGUgdmFyaWFibGVzXCIpXG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKVxuICAgIGNvbnN0IHRpbWVzdGFtcCA9IG1vbWVudChub3cpLmZvcm1hdChcIllZWVktTU0tREQtSEgtTU0tU1NcIilcbiAgICBjb25zdCBzY3JlZW5zaG90UGF0aCA9IGAke3BhdGh9LyR7dGltZXN0YW1wfS5wbmdgXG4gICAgY29uc3QgaHRtbFBhdGggPSBgJHtwYXRofS8ke3RpbWVzdGFtcH0uaHRtbGBcbiAgICBjb25zdCBsb2dzUGF0aCA9IGAke3BhdGh9LyR7dGltZXN0YW1wfS5sb2dzLnR4dGBcblxuICAgIHRoaXMuZGVidWdMb2coXCJHZXR0aW5nIGJyb3dzZXIgbG9nc1wiKVxuICAgIGNvbnN0IGxvZ3MgPSBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiA1MDAwLCBlcnJvck1lc3NhZ2U6IFwidGltZW91dCB3aGlsZSByZWFkaW5nIGJyb3dzZXIgbG9nc1wifSwgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5nZXRCcm93c2VyTG9ncygpKVxuICAgIGNvbnN0IGh0bWwgPSBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiA1MDAwLCBlcnJvck1lc3NhZ2U6IFwidGltZW91dCB3aGlsZSByZWFkaW5nIHBhZ2UgSFRNTFwifSwgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5nZXRIVE1MKCkpXG4gICAgY29uc3QgaHRtbFByZXR0eSA9IHByZXR0aWZ5KGh0bWwpXG4gICAgdGhpcy5wcmludEJyb3dzZXJMb2dzRm9yRmFpbHVyZShsb2dzKVxuXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIldyaXRpbmcgZmlsZXNcIilcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoaHRtbFBhdGgsIGh0bWxQcmV0dHkpXG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGxvZ3NQYXRoLCBsb2dzLmpvaW4oXCJcXG5cIikpXG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHNjcmVlbnNob3RQYXRoLCBpbWFnZUNvbnRlbnQsIFwiYmFzZTY0XCIpXG5cbiAgICBjb25zdCBjdXJyZW50VXJsID0gYXdhaXQgdGhpcy5nZXRDdXJyZW50VXJsKClcblxuICAgIGNvbnNvbGUubG9nKFwiQ3VycmVudCBVUkw6XCIsIGN1cnJlbnRVcmwpXG4gICAgY29uc29sZS5sb2coXCJMb2dzOlwiLCBsb2dzUGF0aClcbiAgICBjb25zb2xlLmxvZyhcIlNjcmVlbnNob3Q6XCIsIHNjcmVlbnNob3RQYXRoKVxuICAgIGNvbnNvbGUubG9nKFwiSFRNTDpcIiwgaHRtbFBhdGgpXG5cbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudFVybCxcbiAgICAgIGh0bWwsXG4gICAgICBodG1sUGF0aCxcbiAgICAgIGxvZ3MsXG4gICAgICBsb2dzUGF0aCxcbiAgICAgIHNjcmVlbnNob3RQYXRoXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBzdG9wRHJpdmVyKCkge1xuICAgIGlmICh0aGlzLmRyaXZlckFkYXB0ZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuZHJpdmVyQWRhcHRlci5zdG9wKClcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -79,6 +79,16 @@ export default class WebDriverDriver {
|
|
|
79
79
|
* @returns {Promise<void>}
|
|
80
80
|
*/
|
|
81
81
|
driverSetTimeouts(newTimeout: number): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* Runs a callback with Selenium's implicit wait temporarily changed. Finder
|
|
84
|
+
* methods do their own explicit polling, so leaving Selenium's implicit wait
|
|
85
|
+
* enabled would make short lookup timeouts block for the global driver wait.
|
|
86
|
+
* @template T
|
|
87
|
+
* @param {number} implicitTimeout
|
|
88
|
+
* @param {() => Promise<T>} callback
|
|
89
|
+
* @returns {Promise<T>}
|
|
90
|
+
*/
|
|
91
|
+
withTemporaryImplicitTimeout<T>(implicitTimeout: number, callback: () => Promise<T>): Promise<T>;
|
|
82
92
|
/**
|
|
83
93
|
* @returns {Promise<void>}
|
|
84
94
|
*/
|
|
@@ -320,7 +330,7 @@ export type FindArgs = {
|
|
|
320
330
|
*/
|
|
321
331
|
visible?: boolean | null | undefined;
|
|
322
332
|
/**
|
|
323
|
-
* Override the click path. `"actions"` uses the Selenium Actions API (real pointer move + click); `"human"` uses multiple pointer moves and pauses before clicking; `"js"` dispatches `element.click()` via `executeScript` inside the page's JS context
|
|
333
|
+
* Override the click path. `"actions"` uses the Selenium Actions API (real pointer move + click); `"human"` uses multiple pointer moves and pauses before clicking; `"js"` dispatches `element.click()` via `executeScript` inside the page's JS context and is for diagnostics only, not committed stabilization fixes.
|
|
324
334
|
*/
|
|
325
335
|
method?: "actions" | "human" | "js" | undefined;
|
|
326
336
|
/**
|