@aws-cdk-testing/cli-integ 3.35.0 → 3.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/with-cdk-app.js
CHANGED
|
@@ -424,8 +424,17 @@ class TestFixture extends shell_1.ShellHelper {
|
|
|
424
424
|
throw new Error(`Invalid verbose state: verbose is false and verboseLevel is ${options.verboseLevel}`);
|
|
425
425
|
}
|
|
426
426
|
const verboseLevel = options.verboseLevel ?? 1;
|
|
427
|
+
// When '--json' is requested, the returned output must be valid JSON. CDK writes its data
|
|
428
|
+
// output to stdout and its logs (verbose traces, notices, warnings) to stderr, so we require
|
|
429
|
+
// 'captureStderr: false' to isolate stdout. Without it, the returned output is 'stdout + stderr'
|
|
430
|
+
// and the interleaved logs would corrupt the JSON regardless of the command's actual behavior.
|
|
431
|
+
const assertJson = hasJsonFlag(args) && !options.onlyStderr;
|
|
432
|
+
if (assertJson && options.captureStderr !== false) {
|
|
433
|
+
throw new Error(`'cdk ${args.join(' ')}' uses '--json' but does not pass 'captureStderr: false'; ` +
|
|
434
|
+
'this is required so stdout (the JSON output) is isolated from logs written to stderr');
|
|
435
|
+
}
|
|
427
436
|
await this.cli.makeCliAvailable();
|
|
428
|
-
|
|
437
|
+
const output = await this.shell([
|
|
429
438
|
'cdk',
|
|
430
439
|
...(verbose ? [`-${'v'.repeat(verboseLevel)}`] : []),
|
|
431
440
|
...args,
|
|
@@ -436,6 +445,15 @@ class TestFixture extends shell_1.ShellHelper {
|
|
|
436
445
|
...options.modEnv,
|
|
437
446
|
},
|
|
438
447
|
});
|
|
448
|
+
if (assertJson) {
|
|
449
|
+
try {
|
|
450
|
+
JSON.parse(output);
|
|
451
|
+
}
|
|
452
|
+
catch (e) {
|
|
453
|
+
throw new Error(`Expected JSON output from 'cdk ${args.join(' ')}' but could not parse it: ${e.message}\nOutput was:\n${output}`);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
return output;
|
|
439
457
|
}
|
|
440
458
|
/**
|
|
441
459
|
* Return the environment variables with which to execute CDK
|
|
@@ -626,7 +644,7 @@ async function bootstrapWithRetryOnBucketExists(envSpecifier, fixture) {
|
|
|
626
644
|
if (out.includes(`Environment ${envSpecifier} bootstrapped`)) {
|
|
627
645
|
break;
|
|
628
646
|
}
|
|
629
|
-
if (out.includes(`${bootstrapBucket} already exists`)) {
|
|
647
|
+
if (out.includes(`${bootstrapBucket} already exists`) || out.includes('Service: S3, Status Code: 409')) {
|
|
630
648
|
// might be an s3 eventualy consistency issue due to recycled environments.
|
|
631
649
|
if (Date.now() < timeoutDate.getTime()) {
|
|
632
650
|
fixture.log(`Bootstrap of ${envSpecifier} failed due to bucket existence check. Retrying in ${retryAfterSeconds} seconds...`);
|
|
@@ -640,6 +658,16 @@ async function bootstrapWithRetryOnBucketExists(envSpecifier, fixture) {
|
|
|
640
658
|
function defined(x) {
|
|
641
659
|
return x !== undefined;
|
|
642
660
|
}
|
|
661
|
+
/**
|
|
662
|
+
* Whether the '--json' flag appears anywhere in the CDK arguments.
|
|
663
|
+
*
|
|
664
|
+
* Arguments may be passed either as separate tokens (e.g. `['ls', '--json']`)
|
|
665
|
+
* or as a single space-joined string (e.g. `['ls --show-dependencies --json']`),
|
|
666
|
+
* so we match on word boundaries within each argument.
|
|
667
|
+
*/
|
|
668
|
+
function hasJsonFlag(args) {
|
|
669
|
+
return args.some((arg) => /(^|\s)--json(\s|=|$)/.test(arg));
|
|
670
|
+
}
|
|
643
671
|
/**
|
|
644
672
|
* Install the given NPM packages, identified by their names and versions
|
|
645
673
|
*
|
|
@@ -696,4 +724,4 @@ async function installNpmPackages(fixture, packages) {
|
|
|
696
724
|
}
|
|
697
725
|
}
|
|
698
726
|
const ALREADY_BOOTSTRAPPED_IN_THIS_RUN = new Set();
|
|
699
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1jZGstYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsid2l0aC1jZGstYXBwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVDQSxnREErQ0M7QUFLRCxnQ0FLQztBQUVELDhDQStDQztBQVdELGdEQUVDO0FBRUQsa0RBRUM7QUFFRCxnRUFFQztBQUVELHNEQUVDO0FBU0QsOEJBcUJDO0FBbUJELDRDQUtDO0FBaUJELHdDQUlDO0FBc2hCRCxnREEyQkM7QUFnRUQsZ0RBdUNDO0FBNzRCRCwrQkFBK0I7QUFDL0Isb0RBQTRCO0FBQzVCLHVDQUF5QjtBQUN6Qix1Q0FBeUI7QUFDekIsMkNBQTZCO0FBRTdCLDBFQUF1RTtBQUN2RSxrRUFBMEU7QUFFMUUsK0JBQStDO0FBRy9DLDZEQUEwRDtBQUMxRCwyQ0FBNEM7QUFFNUMsbUNBQXFEO0FBRXJELHlDQUF3RDtBQUN4RCxpREFBNkM7QUFDN0MsaUNBQTBDO0FBRTdCLFFBQUEsc0JBQXNCLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFBLHVCQUF1QixHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFTL0M7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLGtCQUFrQixDQUNoQyxPQUFlLEVBQ2YsS0FBOEM7SUFFOUMsT0FBTyxLQUFLLEVBQUUsT0FBMkQsRUFBRSxFQUFFO1FBQzNFLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7UUFDbkMsTUFBTSxlQUFlLEdBQUcsV0FBVyxLQUFLLEVBQUUsQ0FBQztRQUMzQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUM7UUFFbEUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLGVBQWUsSUFBSSxDQUFDLENBQUM7UUFDOUQsT0FBTyxD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ZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB0eXBlIHsgU3RhY2sgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgRGVzY3JpYmVTdGFja3NDb21tYW5kIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IEdldEF1dGhvcml6YXRpb25Ub2tlbkNvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtZWNyLXB1YmxpYyc7XG5pbXBvcnQgdHlwZSB7IEF3c0NsaWVudHMgfSBmcm9tICcuL2F3cyc7XG5pbXBvcnQgeyBvdXRwdXRGcm9tU3RhY2ssIHNsZWVwIH0gZnJvbSAnLi9hd3MnO1xuaW1wb3J0IHR5cGUgeyBUZXN0Q29udGV4dCB9IGZyb20gJy4vaW50ZWctdGVzdCc7XG5pbXBvcnQgdHlwZSB7IElUZXN0Q2xpU291cmNlLCBJVGVzdExpYnJhcnlTb3VyY2UgfSBmcm9tICcuL3BhY2thZ2Utc291cmNlcy9zb3VyY2UnO1xuaW1wb3J0IHsgdGVzdFNvdXJjZSB9IGZyb20gJy4vcGFja2FnZS1zb3VyY2VzL3N1YnByb2Nlc3MnO1xuaW1wb3J0IHsgUkVTT1VSQ0VTX0RJUiB9IGZyb20gJy4vcmVzb3VyY2VzJztcbmltcG9ydCB0eXBlIHsgU2hlbGxPcHRpb25zIH0gZnJvbSAnLi9zaGVsbCc7XG5pbXBvcnQgeyBzaGVsbCwgU2hlbGxIZWxwZXIsIHJpbXJhZiB9IGZyb20gJy4vc2hlbGwnO1xuaW1wb3J0IHR5cGUgeyBBd3NDb250ZXh0LCBBd3NDb250ZXh0T3B0aW9ucyB9IGZyb20gJy4vd2l0aC1hd3MnO1xuaW1wb3J0IHsgYXRtb3NwaGVyZUVuYWJsZWQsIHdpdGhBd3MgfSBmcm9tICcuL3dpdGgtYXdzJztcbmltcG9ydCB7IHdpdGhUaW1lb3V0IH0gZnJvbSAnLi93aXRoLXRpbWVvdXQnO1xuaW1wb3J0IHsgZmluZFlhcm5QYWNrYWdlcyB9IGZyb20gJy4veWFybic7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RFU1RfVElNRU9VVF9TID0gMjAgKiA2MDtcbmV4cG9ydCBjb25zdCBFWFRFTkRFRF9URVNUX1RJTUVPVVRfUyA9IDMwICogNjA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2RrQXBwQ29udGV4dE9wdGlvbnMge1xuICAvKipcbiAgICogQ29uZmlndXJlIHRoZSBBV1MgY29udGV4dCBvZiB0aGUgYXBwLlxuICAgKi9cbiAgcmVhZG9ubHkgYXdzPzogQXdzQ29udGV4dE9wdGlvbnM7XG59XG5cbi8qKlxuICogSGlnaGVyIG9yZGVyIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYSBibG9jayB3aXRoIGEgQ0RLIGFwcCBmaXh0dXJlXG4gKlxuICogUmVxdWlyZXMgYW4gQVdTIGNsaWVudCB0byBiZSBwYXNzZWQgaW4uXG4gKlxuICogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgdGVzdHMgKHNvIHdlIGRvbid0IGhhdmUgdG8gY2hhbmdlXG4gKiB0b28gbXVjaCkgdGhlIGlubmVyIGJsb2NrIGlzIGV4cGVjdGVkIHRvIHRha2UgYSBgVGVzdEZpeHR1cmVgIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhTcGVjaWZpY0Nka0FwcChcbiAgYXBwTmFtZTogc3RyaW5nLFxuICBibG9jazogKGNvbnRleHQ6IFRlc3RGaXh0dXJlKSA9PiBQcm9taXNlPHZvaWQ+LFxuKTogKGNvbnRleHQ6IFRlc3RDb250ZXh0ICYgQXdzQ29udGV4dCAmIERpc2FibGVCb290c3RyYXBDb250ZXh0KSA9PiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGFzeW5jIChjb250ZXh0OiBUZXN0Q29udGV4dCAmIEF3c0NvbnRleHQgJiBEaXNhYmxlQm9vdHN0cmFwQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHJhbmR5ID0gY29udGV4dC5yYW5kb21TdHJpbmc7XG4gICAgY29uc3Qgc3RhY2tOYW1lUHJlZml4ID0gYGNka3Rlc3QtJHtyYW5keX1gO1xuICAgIGNvbnN0IGludGVnVGVzdERpciA9IHBhdGguam9pbihvcy50bXBkaXIoKSwgYGNkay1pbnRlZy0ke3JhbmR5fWApO1xuXG4gICAgY29udGV4dC5vdXRwdXQud3JpdGUoYCBTdGFjayBwcmVmaXg6ICAgJHtzdGFja05hbWVQcmVmaXh9XFxuYCk7XG4gICAgY29udGV4dC5vdXRwdXQud3JpdGUoYCBUZXN0IGRpcmVjdG9yeTogJHtpbnRlZ1Rlc3REaXJ9XFxuYCk7XG4gICAgY29udGV4dC5vdXRwdXQud3JpdGUoYCBSZWdpb246ICAgICAgICAgJHtjb250ZXh0LmF3cy5yZWdpb259XFxuYCk7XG5cbiAgICBhd2FpdCBjbG9uZURpcmVjdG9yeShwYXRoLmpvaW4oUkVTT1VSQ0VTX0RJUiwgJ2Nkay1hcHBzJywgYXBwTmFtZSksIGludGVnVGVzdERpciwgY29udGV4dC5vdXRwdXQpO1xuICAgIGNvbnN0IGZpeHR1cmUgPSBuZXcgVGVzdEZpeHR1cmUoXG4gICAgICBpbnRlZ1Rlc3REaXIsXG4gICAgICBzdGFja05hbWVQcmVmaXgsXG4gICAgICBjb250ZXh0Lm91dHB1dCxcbiAgICAgIGNvbnRleHQuYXdzLFxuICAgICAgY29udGV4dC5yYW5kb21TdHJpbmcpO1xuICAgIGF3YWl0IGZpeHR1cmUuZWNyUHVibGljTG9naW4oKTtcblxuICAgIGxldCBzdWNjZXNzID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaW5zdGFsbGF0aW9uVmVyc2lvbiA9IGZpeHR1cmUubGlicmFyeS5yZXF1ZXN0ZWRWZXJzaW9uKCk7XG5cbiAgICAgIGF3YWl0IGluc3RhbGxOcG1QYWNrYWdlcyhmaXh0dXJlLCB7XG4gICAgICAgICdhd3MtY2RrLWxpYic6IGluc3RhbGxhdGlvblZlcnNpb24sXG4gICAgICAgICdjb25zdHJ1Y3RzJzogJ14xMCcsXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFjb250ZXh0LmRpc2FibGVCb290c3RyYXApIHtcbiAgICAgICAgYXdhaXQgZW5zdXJlQm9vdHN0cmFwcGVkKGZpeHR1cmUpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBibG9jayhmaXh0dXJlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzdWNjZXNzID0gZmFsc2U7XG4gICAgICB0aHJvdyBlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuSU5URUdfTk9fQ0xFQU4pIHtcbiAgICAgICAgY29udGV4dC5sb2coYExlZnQgdGVzdCBkaXJlY3RvcnkgaW4gJyR7aW50ZWdUZXN0RGlyfScgKCRJTlRFR19OT19DTEVBTilcXG5gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IGZpeHR1cmUuZGlzcG9zZShzdWNjZXNzKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogTGlrZSBgd2l0aFNwZWNpZmljQ2RrQXBwYCwgYnV0IHVzZXMgdGhlIGRlZmF1bHQgaW50ZWdyYXRpb24gdGVzdGluZyBhcHAgd2l0aCBhIG1pbGxpb24gc3RhY2tzIGluIGl0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoQ2RrQXBwKFxuICBibG9jazogKGNvbnRleHQ6IFRlc3RGaXh0dXJlKSA9PiBQcm9taXNlPHZvaWQ+LFxuKTogKGNvbnRleHQ6IFRlc3RDb250ZXh0ICYgQXdzQ29udGV4dCAmIERpc2FibGVCb290c3RyYXBDb250ZXh0KSA9PiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gJ2FwcCcgaXMgdGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgaW50ZWdyYXRpb24gYXBwIGluIHRoZSBgY2RrLWFwcHNgIGRpcmVjdG9yeVxuICByZXR1cm4gd2l0aFNwZWNpZmljQ2RrQXBwKCdhcHAnLCBibG9jayk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoQ2RrTWlncmF0ZUFwcChcbiAgbGFuZ3VhZ2U6IHN0cmluZyxcbiAgYmxvY2s6IChjb250ZXh0OiBUZXN0Rml4dHVyZSkgPT4gUHJvbWlzZTx2b2lkPixcbik6IChjb250ZXh0OiBUZXN0Q29udGV4dCAmIEF3c0NvbnRleHQgJiBEaXNhYmxlQm9vdHN0cmFwQ29udGV4dCkgPT4gUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBhc3luYyAoY29udGV4dDogVGVzdENvbnRleHQgJiBBd3NDb250ZXh0ICYgRGlzYWJsZUJvb3RzdHJhcENvbnRleHQpID0+IHtcbiAgICBjb25zdCBzdGFja05hbWUgPSBgY2RrLW1pZ3JhdGUtJHtsYW5ndWFnZX0taW50ZWctJHtjb250ZXh0LnJhbmRvbVN0cmluZ31gO1xuICAgIGNvbnN0IGludGVnVGVzdERpciA9IHBhdGguam9pbihvcy50bXBkaXIoKSwgYGNkay1taWdyYXRlLSR7bGFuZ3VhZ2V9LWludGVnLSR7Y29udGV4dC5yYW5kb21TdHJpbmd9YCk7XG5cbiAgICBjb250ZXh0Lm91dHB1dC53cml0ZShgIFN0YWNrIG5hbWU6ICAgJHtzdGFja05hbWV9XFxuYCk7XG4gICAgY29udGV4dC5vdXRwdXQud3JpdGUoYCBUZXN0IGRpcmVjdG9yeTogJHtpbnRlZ1Rlc3REaXJ9XFxuYCk7XG5cbiAgICBmcy5ta2RpclN5bmMoaW50ZWdUZXN0RGlyKTtcbiAgICBjb25zdCBmaXh0dXJlID0gbmV3IFRlc3RGaXh0dXJlKFxuICAgICAgaW50ZWdUZXN0RGlyLFxuICAgICAgc3RhY2tOYW1lLFxuICAgICAgY29udGV4dC5vdXRwdXQsXG4gICAgICBjb250ZXh0LmF3cyxcbiAgICAgIGNvbnRleHQucmFuZG9tU3RyaW5nLFxuICAgICk7XG4gICAgYXdhaXQgZml4dHVyZS5lY3JQdWJsaWNMb2dpbigpO1xuXG4gICAgYXdhaXQgZW5zdXJlQm9vdHN0cmFwcGVkKGZpeHR1cmUpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtNaWdyYXRlKGxhbmd1YWdlLCBzdGFja05hbWUpO1xuXG4gICAgY29uc3QgdGVzdEZpeHR1cmUgPSBuZXcgVGVzdEZpeHR1cmUoXG4gICAgICBwYXRoLmpvaW4oaW50ZWdUZXN0RGlyLCBzdGFja05hbWUpLFxuICAgICAgc3RhY2tOYW1lLFxuICAgICAgY29udGV4dC5vdXRwdXQsXG4gICAgICBjb250ZXh0LmF3cyxcbiAgICAgIGNvbnRleHQucmFuZG9tU3RyaW5nLFxuICAgICk7XG5cbiAgICBsZXQgc3VjY2VzcyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGJsb2NrKHRlc3RGaXh0dXJlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzdWNjZXNzID0gZmFsc2U7XG4gICAgICB0aHJvdyBlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuSU5URUdfTk9fQ0xFQU4pIHtcbiAgICAgICAgY29udGV4dC5sb2coYExlZnQgdGVzdCBkaXJlY3RvcnkgaW4gJyR7aW50ZWdUZXN0RGlyfScgKCRJTlRFR19OT19DTEVBTilgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IGZpeHR1cmUuZGlzcG9zZShzdWNjZXNzKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogRGVmYXVsdCB0ZXN0IGZpeHR1cmUgZm9yIG1vc3QgKGFsbD8pIGludGVnIHRlc3RzXG4gKlxuICogSXQncyBhIGNvbXBvc2l0aW9uIG9mIHdpdGhBd3Mvd2l0aENka0FwcCwgZXhwZWN0aW5nIHRoZSB0ZXN0IGJsb2NrIHRvIHRha2UgYSBgVGVzdEZpeHR1cmVgXG4gKiBvYmplY3QuXG4gKlxuICogV2UgY291bGQgaGF2ZSBwdXQgYHdpdGhBd3Mod2l0aENka0FwcChmaXh0dXJlID0+IHsgLy4uLiBhY3R1YWwgdGVzdCBoZXJlLi4uLyB9KSlgIGluIGV2ZXJ5XG4gKiB0ZXN0IGRlY2xhcmF0aW9uIGJ1dCBjZW50cmFsaXppbmcgaXQgaXMgZ29pbmcgdG8gbWFrZSBpdCBjb252ZW5pZW50IHRvIG1vZGlmeSBpbiB0aGUgZnV0dXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aERlZmF1bHRGaXh0dXJlKGJsb2NrOiAoY29udGV4dDogVGVzdEZpeHR1cmUpID0+IFByb21pc2U8dm9pZD4sIG9wdGlvbnM6IENka0FwcENvbnRleHRPcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIHdpdGhBd3Mod2l0aFRpbWVvdXQoREVGQVVMVF9URVNUX1RJTUVPVVRfUywgd2l0aENka0FwcChibG9jaykpLCBvcHRpb25zLmF3cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoU3BlY2lmaWNGaXh0dXJlKGFwcE5hbWU6IHN0cmluZywgYmxvY2s6IChjb250ZXh0OiBUZXN0Rml4dHVyZSkgPT4gUHJvbWlzZTx2b2lkPiwgb3B0aW9uczogQ2RrQXBwQ29udGV4dE9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gd2l0aEF3cyh3aXRoVGltZW91dChERUZBVUxUX1RFU1RfVElNRU9VVF9TLCB3aXRoU3BlY2lmaWNDZGtBcHAoYXBwTmFtZSwgYmxvY2spKSwgb3B0aW9ucy5hd3MpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aEV4dGVuZGVkVGltZW91dEZpeHR1cmUoYmxvY2s6IChjb250ZXh0OiBUZXN0Rml4dHVyZSkgPT4gUHJvbWlzZTx2b2lkPiwgb3B0aW9uczogQ2RrQXBwQ29udGV4dE9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gd2l0aEF3cyh3aXRoVGltZW91dChFWFRFTkRFRF9URVNUX1RJTUVPVVRfUywgd2l0aENka0FwcChibG9jaykpLCBvcHRpb25zLmF3cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoQ0RLTWlncmF0ZUZpeHR1cmUobGFuZ3VhZ2U6IHN0cmluZywgYmxvY2s6IChjb250ZW50OiBUZXN0Rml4dHVyZSkgPT4gUHJvbWlzZTx2b2lkPiwgb3B0aW9uczogQ2RrQXBwQ29udGV4dE9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gd2l0aEF3cyh3aXRoVGltZW91dChERUZBVUxUX1RFU1RfVElNRU9VVF9TLCB3aXRoQ2RrTWlncmF0ZUFwcChsYW5ndWFnZSwgYmxvY2spKSwgb3B0aW9ucy5hd3MpO1xufVxuXG4vKipcbiAqIFJldHJ5IHdyYXBwZXIgdGhhdCBleGVjdXRlcyBhIHRlc3QgY2FsbGJhY2sgdXAgdG8gbWF4QXR0ZW1wdHMgdGltZXNcbiAqXG4gKiBJZiBhbnkgYXR0ZW1wdCBzdWNjZWVkcywgaXQgcmV0dXJucyBpbW1lZGlhdGVseS4gSWYgYWxsIGF0dGVtcHRzIGZhaWwsXG4gKiBpdCB0aHJvd3MgdGhlIGxhc3QgZXJyb3IgZW5jb3VudGVyZWQuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhSZXRyeTxUIGV4dGVuZHMgVGVzdENvbnRleHQ+KFxuICBjYWxsYmFjazogKGNvbnRleHQ6IFQpID0+IFByb21pc2U8dm9pZD4sXG4gIG1heEF0dGVtcHRzOiBudW1iZXIgPSAyLFxuKTogKGNvbnRleHQ6IFQpID0+IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gYXN5bmMgKGNvbnRleHQ6IFQpID0+IHtcbiAgICBsZXQgbGFzdEVycm9yO1xuXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gbWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY2FsbGJhY2soY29udGV4dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yO1xuICAgICAgICBpZiAoYXR0ZW1wdCA8IG1heEF0dGVtcHRzKSB7XG4gICAgICAgICAgY29udGV4dC5sb2coYEF0dGVtcHQgJHthdHRlbXB0fS8ke21heEF0dGVtcHRzfSBmYWlsZWQ6ICR7ZXJyb3J9LiBSZXRyeWluZy4uLmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbGFzdEVycm9yO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERpc2FibGVCb290c3RyYXBDb250ZXh0IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGlzYWJsZSBjcmVhdGluZyB0aGUgZGVmYXVsdCBib290c3RyYXBcbiAgICogc3RhY2sgcHJpb3IgdG8gcnVubmluZyB0aGUgdGVzdFxuICAgKlxuICAgKiBUaGlzIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSB3aGVuIHJ1bm5pbmcgdGVzdHMgdGhhdFxuICAgKiBleHBsaWNpdGx5IGNyZWF0ZSBhIGJvb3RzdHJhcCBzdGFja1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZGlzYWJsZUJvb3RzdHJhcD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVG8gYmUgdXNlZCBpbiBwbGFjZSBvZiBgd2l0aERlZmF1bHRGaXh0dXJlYCB3aGVuIHRoZSB0ZXN0XG4gKiBzaG91bGQgbm90IGNyZWF0ZSB0aGUgZGVmYXVsdCBib290c3RyYXAgc3RhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhvdXRCb290c3RyYXAoYmxvY2s6IChjb250ZXh0OiBUZXN0Rml4dHVyZSkgPT4gUHJvbWlzZTx2b2lkPiwgb3B0aW9uczogQ2RrQXBwQ29udGV4dE9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gd2l0aEF3cyh3aXRoQ2RrQXBwKGJsb2NrKSwge1xuICAgIC4uLm9wdGlvbnMuYXdzLFxuICAgIGRpc2FibGVCb290c3RyYXA6IHRydWUsXG4gIH0pO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENka0NsaU9wdGlvbnMgZXh0ZW5kcyBTaGVsbE9wdGlvbnMge1xuICBvcHRpb25zPzogc3RyaW5nW107XG4gIG5ldmVyUmVxdWlyZUFwcHJvdmFsPzogYm9vbGVhbjtcbiAgdmVyYm9zZT86IGJvb2xlYW47XG4gIHZlcmJvc2VMZXZlbD86IG51bWJlcjtcbiAgdGVsZW1ldHJ5RmlsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDZGtEZXN0cm95Q2xpT3B0aW9ucyBleHRlbmRzIENka0NsaU9wdGlvbnMge1xuICByZWFkb25seSBmb3JjZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHJlcGFyZSBhIHRhcmdldCBkaXIgYnlyZXBsaWNhdGluZyBhIHNvdXJjZSBkaXJlY3RvcnlcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsb25lRGlyZWN0b3J5KHNvdXJjZTogc3RyaW5nLCB0YXJnZXQ6IHN0cmluZywgb3V0cHV0PzogTm9kZUpTLldyaXRhYmxlU3RyZWFtKSB7XG4gIGF3YWl0IHNoZWxsKFsncm0nLCAnLXJmJywgdGFyZ2V0XSwgeyBvdXRwdXRzOiBvdXRwdXQgPyBbb3V0cHV0XSA6IFtdIH0pO1xuICBhd2FpdCBzaGVsbChbJ21rZGlyJywgJy1wJywgdGFyZ2V0XSwgeyBvdXRwdXRzOiBvdXRwdXQgPyBbb3V0cHV0XSA6IFtdIH0pO1xuICBhd2FpdCBzaGVsbChbJ2NwJywgJy1SJywgc291cmNlICsgJy8qJywgdGFyZ2V0XSwgeyBvdXRwdXRzOiBvdXRwdXQgPyBbb3V0cHV0XSA6IFtdIH0pO1xufVxuXG5pbnRlcmZhY2UgQ29tbW9uQ2RrQm9vdHN0cmFwQ29tbWFuZE9wdGlvbnMge1xuICAvKipcbiAgICogUGF0aCB0byBhIGN1c3RvbSBib290c3RyYXAgdGVtcGxhdGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGRlZmF1bHQgQ0RLIGJvb3RzdHJhcCB0ZW1wbGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGJvb3RzdHJhcFRlbXBsYXRlPzogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IHRvb2xraXRTdGFja05hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHZlcmJvc2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAZGVmYXVsdCAtIGF1dG8tZ2VuZXJhdGVkIENsb3VkRm9ybWF0aW9uIG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGJvb3RzdHJhcEJ1Y2tldE5hbWU/OiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgY2xpT3B0aW9ucz86IENka0NsaU9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEBkZWZhdWx0IC0gbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlZmF1bHQgLSB0aGUgZGVmYXVsdCBDREsgcXVhbGlmaWVyXG4gICAqL1xuICByZWFkb25seSBxdWFsaWZpZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2RrTGVnYWN5Qm9vdHN0cmFwQ29tbWFuZE9wdGlvbnMgZXh0ZW5kcyBDb21tb25DZGtCb290c3RyYXBDb21tYW5kT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgbm9FeGVjdXRlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGljQWNjZXNzQmxvY2tDb25maWd1cmF0aW9uPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDZGtNb2Rlcm5Cb290c3RyYXBDb21tYW5kT3B0aW9ucyBleHRlbmRzIENvbW1vbkNka0Jvb3RzdHJhcENvbW1hbmRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBmb3JjZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBkZWZhdWx0IC0gbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgY2ZuRXhlY3V0aW9uUG9saWN5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc2hvd1RlbXBsYXRlPzogYm9vbGVhbjtcblxuICByZWFkb25seSB0ZW1wbGF0ZT86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHRlcm1pbmF0aW9uUHJvdGVjdGlvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgZXhhbXBsZVBlcm1pc3Npb25zQm91bmRhcnk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbVBlcm1pc3Npb25zQm91bmRhcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGRlbnlFeHRlcm5hbElkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICByZWFkb25seSB1c2VQcmV2aW91c1BhcmFtZXRlcnM/OiBib29sZWFuO1xuXG4gIHJlYWRvbmx5IHRydXN0Pzogc3RyaW5nW107XG5cbiAgcmVhZG9ubHkgdW50cnVzdD86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENka0dhcmJhZ2VDb2xsZWN0aW9uQ29tbWFuZE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGFtb3VudCBvZiBkYXlzIGFuIGFzc2V0IHNob3VsZCBzdGF5IGlzb2xhdGVkIGJlZm9yZSBkZWxldGlvbiwgdG9cbiAgICogZ3VhcmQgYWdhaW5zdCBzb21lIHBpcGVsaW5lIHJvbGxiYWNrIHNjZW5hcmlvc1xuICAgKlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICByZWFkb25seSByb2xsYmFja0J1ZmZlckRheXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIGFzc2V0IHRoYXQgaXMgZ2V0dGluZyBnYXJiYWdlIGNvbGxlY3RlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgJ2FsbCdcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU/OiAnZWNyJyB8ICdzMycgfCAnYWxsJztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGJvb3RzdHJhcCBzdGFja1xuICAgKlxuICAgKiBAZGVmYXVsdCAnQ2RrVG9vbGtpdCdcbiAgICovXG4gIHJlYWRvbmx5IGJvb3RzdHJhcFN0YWNrTmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFRlc3RGaXh0dXJlIGV4dGVuZHMgU2hlbGxIZWxwZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgcXVhbGlmaWVyOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnVja2V0c1RvRGVsZXRlID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgcHVibGljIHJlYWRvbmx5IGNsaTogSVRlc3RDbGlTb3VyY2U7XG4gIHB1YmxpYyByZWFkb25seSBjZGtBc3NldHM6IElUZXN0Q2xpU291cmNlO1xuICBwdWJsaWMgcmVhZG9ubHkgbGlicmFyeTogSVRlc3RMaWJyYXJ5U291cmNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBpbnRlZ1Rlc3REaXI6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3RhY2tOYW1lUHJlZml4OiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IG91dHB1dDogTm9kZUpTLldyaXRhYmxlU3RyZWFtLFxuICAgIHB1YmxpYyByZWFkb25seSBhd3M6IEF3c0NsaWVudHMsXG4gICAgcHVibGljIHJlYWRvbmx5IHJhbmRvbVN0cmluZzogc3RyaW5nKSB7XG4gICAgc3VwZXIoaW50ZWdUZXN0RGlyLCBvdXRwdXQpO1xuXG4gICAgdGhpcy5xdWFsaWZpZXIgPSB0aGlzLnJhbmRvbVN0cmluZy5zbGljZSgwLCAxMCk7XG4gICAgdGhpcy5jbGkgPSB0ZXN0U291cmNlKCdjbGknKTtcbiAgICB0aGlzLmNka0Fzc2V0cyA9IHRlc3RTb3VyY2UoJ2Nka0Fzc2V0cycpO1xuICAgIHRoaXMubGlicmFyeSA9IHRlc3RTb3VyY2UoJ2xpYnJhcnknKTtcbiAgfVxuXG4gIHB1YmxpYyBsb2coczogc3RyaW5nKSB7XG4gICAgdGhpcy5vdXRwdXQud3JpdGUoYCR7c31cXG5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dpbiB0byB0aGUgcHVibGljIEVDUiBnYWxsZXJ5IHVzaW5nIHRoZSBjdXJyZW50IEFXUyBjcmVkZW50aWFscy5cbiAgICogVXNlIHRoaXMgaWYgeW91ciB0ZXN0IG5lZWRzIHRvIGRpcmVjdGx5IHB1bGwgaW1hZ2VzIG91dHNpZGUgb2YgYSBgY2RrYCBvciBgY2RrLWFzc2V0c2AgY29tbWFuZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlY3JQdWJsaWNMb2dpbigpIHtcbiAgICBjb25zdCB0b2tlblJlc3BvbnNlID0gYXdhaXQgdGhpcy5hd3MuZWNyUHVibGljLnNlbmQobmV3IEdldEF1dGhvcml6YXRpb25Ub2tlbkNvbW1hbmQoe30pKTtcbiAgICBjb25zdCBhdXRoRGF0YSA9IHRva2VuUmVzcG9uc2UuYXV0aG9yaXphdGlvbkRhdGE/LmF1dGhvcml6YXRpb25Ub2tlbjtcblxuICAgIGNvbnN0IGRvY2tlciA9IHByb2Nlc3MuZW52LkNES19ET0NLRVIgPz8gJ2RvY2tlcic7XG5cbiAgICBpZiAoIWF1dGhEYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCByZXRyaWV2ZSBFQ1IgcHVibGljIGF1dGggdG9rZW4uJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVjb2RlZCA9IEJ1ZmZlci5mcm9tKGF1dGhEYXRhLCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgY29uc3QgW3VzZXJuYW1lLCBwYXNzd29yZF0gPSBkZWNvZGVkLnNwbGl0KCc6Jyk7XG5cbiAgICBhd2FpdCB0aGlzLnNoZWxsKFtkb2NrZXIsICdsb2dpbicsXG4gICAgICAnLS11c2VybmFtZScsIHVzZXJuYW1lLFxuICAgICAgJy0tcGFzc3dvcmQnLCAnJHtFQ1JfUEFTU1dPUkR9JyxcbiAgICAgICdwdWJsaWMuZWNyLmF3cyddLCB7XG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIG1vZEVudjoge1xuICAgICAgICBFQ1JfUEFTU1dPUkQ6IHBhc3N3b3JkLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB0aGUgY2FwdHVyZWQgb3V0cHV0IG9mIHRoZSBkZXBsb3kgY29tbWFuZC5cbiAgICogISEhIERPIE5PVCBhc3N1bWUgdGhpcyBpcyB0aGUgc3RhY2sncyBBUk4uIEl0IHdpbGwgY29udGFpbiBvdGhlciBvdXRwdXQuICEhIVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNka0RlcGxveShzdGFja05hbWVzOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3B0aW9uczogQ2RrQ2xpT3B0aW9ucyA9IHt9LCBza2lwU3RhY2tSZW5hbWU/OiBib29sZWFuKSB7XG4gICAgcmV0dXJuIHRoaXMuY2RrKHRoaXMuY2RrRGVwbG95Q29tbWFuZExpbmUoc3RhY2tOYW1lcywgb3B0aW9ucywgc2tpcFN0YWNrUmVuYW1lKSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY2RrRGVwbG95Q29tbWFuZExpbmUoc3RhY2tOYW1lczogc3RyaW5nIHwgc3RyaW5nW10sIG9wdGlvbnM6IENka0NsaU9wdGlvbnMgPSB7fSwgc2tpcFN0YWNrUmVuYW1lPzogYm9vbGVhbikge1xuICAgIHN0YWNrTmFtZXMgPSB0eXBlb2Ygc3RhY2tOYW1lcyA9PT0gJ3N0cmluZycgPyBbc3RhY2tOYW1lc10gOiBzdGFja05hbWVzO1xuICAgIGNvbnN0IG5ldmVyUmVxdWlyZUFwcHJvdmFsID0gb3B0aW9ucy5uZXZlclJlcXVpcmVBcHByb3ZhbCA/PyB0cnVlO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgICdkZXBsb3knLFxuICAgICAgLi4uKG5ldmVyUmVxdWlyZUFwcHJvdmFsID8gWyctLXJlcXVpcmUtYXBwcm92YWw9bmV2ZXInXSA6IFtdKSwgLy8gRGVmYXVsdCB0byBubyBhcHByb3ZhbCBpbiBhbiB1bmF0dGVuZGVkIHRlc3RcbiAgICAgIC4uLihvcHRpb25zLm9wdGlvbnMgPz8gW10pLFxuICAgICAgLy8gdXNlIGV2ZW50cyBiZWNhdXNlIGJhciByZW5kZXJzIGJhZCBpbiB0ZXN0c1xuICAgICAgJy0tcHJvZ3Jlc3MnLCAnZXZlbnRzJyxcbiAgICAgIC4uLihza2lwU3RhY2tSZW5hbWUgPyBzdGFja05hbWVzIDogdGhpcy5mdWxsU3RhY2tOYW1lKHN0YWNrTmFtZXMpKSxcbiAgICAgIC4uLihvcHRpb25zLnRlbGVtZXRyeUZpbGUgPyBbYC0tdGVsZW1ldHJ5LWZpbGU9JHtvcHRpb25zLnRlbGVtZXRyeUZpbGV9YF0gOiBbXSksXG4gICAgXTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjZGtTeW50aChvcHRpb25zOiBDZGtDbGlPcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5jZGsoW1xuICAgICAgJ3N5bnRoJyxcbiAgICAgIC4uLihvcHRpb25zLnRlbGVtZXRyeUZpbGUgPyBbYC0tdGVsZW1ldHJ5LWZpbGU9JHtvcHRpb25zLnRlbGVtZXRyeUZpbGV9YF0gOiBbXSksXG4gICAgICAuLi4ob3B0aW9ucy5vcHRpb25zID8/IFtdKSxcbiAgICBdLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjZGtSZWZhY3RvcihvcHRpb25zOiBDZGtDbGlPcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5jZGsoW1xuICAgICAgJ3JlZmFjdG9yJyxcbiAgICAgIC4uLihvcHRpb25zLm9wdGlvbnMgPz8gW10pLFxuICAgIF0sIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNka0Rlc3Ryb3koc3RhY2tOYW1lczogc3RyaW5nIHwgc3RyaW5nW10sIG9wdGlvbnM6IENka0Rlc3Ryb3lDbGlPcHRpb25zID0ge30pIHtcbiAgICBzdGFja05hbWVzID0gdHlwZW9mIHN0YWNrTmFtZXMgPT09ICdzdHJpbmcnID8gW3N0YWNrTmFtZXNdIDogc3RhY2tOYW1lcztcblxuICAgIC8vIGRlZmF1bHQgdG8gdHJ1ZSBiZWNhdXNlIG1vc3QgdGVzdHMgZG9uJ3QgdGVzdCB1c2VyIGludGVyYWN0aW9uXG4gICAgY29uc3QgZm9yY2UgPSBvcHRpb25zLmZvcmNlID8/IHRydWU7XG5cbiAgICByZXR1cm4gdGhpcy5jZGsoWydkZXN0cm95JyxcbiAgICAgIC4uLihmb3JjZSA/IFsnLWYnXSA6IFtdKSwgLy8gcGFzcyAtZiBpZiB1c2VyIGludGVyYWN0aW9uIGlzIG5vdCBkZXNpcmVkXG4gICAgICAuLi4ob3B0aW9ucy5vcHRpb25zID8/IFtdKSxcbiAgICAgIC4uLnRoaXMuZnVsbFN0YWNrTmFtZShzdGFja05hbWVzKV0sIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNka0Jvb3RzdHJhcExlZ2FjeShvcHRpb25zOiBDZGtMZWdhY3lCb290c3RyYXBDb21tYW5kT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgYXJncyA9IFsnYm9vdHN0cmFwJ107XG5cbiAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICBhcmdzLnB1c2goJy12Jyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnLS10b29sa2l0LXN0YWNrLW5hbWUnLCBvcHRpb25zLnRvb2xraXRTdGFja05hbWUpO1xuICAgIGlmIChvcHRpb25zLmJvb3RzdHJhcEJ1Y2tldE5hbWUpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1ib290c3RyYXAtYnVja2V0LW5hbWUnLCBvcHRpb25zLmJvb3RzdHJhcEJ1Y2tldE5hbWUpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5ub0V4ZWN1dGUpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1uby1leGVjdXRlJyk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnB1YmxpY0FjY2Vzc0Jsb2NrQ29uZmlndXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhcmdzLnB1c2goJy0tcHVibGljLWFjY2Vzcy1ibG9jay1jb25maWd1cmF0aW9uJywgb3B0aW9ucy5wdWJsaWNBY2Nlc3NCbG9ja0NvbmZpZ3VyYXRpb24udG9TdHJpbmcoKSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRhZ3MpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS10YWdzJywgb3B0aW9ucy50YWdzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jZGsoYXJncywge1xuICAgICAgLi4ub3B0aW9ucy5jbGlPcHRpb25zLFxuICAgICAgbW9kRW52OiB7XG4gICAgICAgIC4uLm9wdGlvbnMuY2xpT3B0aW9ucz8ubW9kRW52LFxuICAgICAgICAvLyBzbyB0aGF0IHRoaXMgd29ya3MgZm9yIFYyLFxuICAgICAgICAvLyB3aGVyZSB0aGUgXCJuZXdcIiBib290c3RyYXAgaXMgdGhlIGRlZmF1bHRcbiAgICAgICAgQ0RLX0xFR0FDWV9CT09UU1RSQVA6ICcxJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2RrQm9vdHN0cmFwTW9kZXJuKG9wdGlvbnM6IENka01vZGVybkJvb3RzdHJhcENvbW1hbmRPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBhcmdzID0gWydib290c3RyYXAnXTtcblxuICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgIGFyZ3MucHVzaCgnLXYnKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuc2hvd1RlbXBsYXRlKSB7XG4gICAgICBhcmdzLnB1c2goJy0tc2hvdy10ZW1wbGF0ZScpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy50ZW1wbGF0ZSkge1xuICAgICAgYXJncy5wdXNoKCctLXRlbXBsYXRlJywgb3B0aW9ucy50ZW1wbGF0ZSk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnLS10b29sa2l0LXN0YWNrLW5hbWUnLCBvcHRpb25zLnRvb2xraXRTdGFja05hbWUpO1xuICAgIGlmIChvcHRpb25zLmJvb3RzdHJhcEJ1Y2tldE5hbWUpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1ib290c3RyYXAtYnVja2V0LW5hbWUnLCBvcHRpb25zLmJvb3RzdHJhcEJ1Y2tldE5hbWUpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJy0tcXVhbGlmaWVyJywgb3B0aW9ucy5xdWFsaWZpZXIgPz8gdGhpcy5xdWFsaWZpZXIpO1xuICAgIGlmIChvcHRpb25zLmNmbkV4ZWN1dGlvblBvbGljeSkge1xuICAgICAgYXJncy5wdXNoKCctLWNsb3VkZm9ybWF0aW9uLWV4ZWN1dGlvbi1wb2xpY2llcycsIG9wdGlvbnMuY2ZuRXhlY3V0aW9uUG9saWN5KTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudGVybWluYXRpb25Qcm90ZWN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS10ZXJtaW5hdGlvbi1wcm90ZWN0aW9uJywgb3B0aW9ucy50ZXJtaW5hdGlvblByb3RlY3Rpb24udG9TdHJpbmcoKSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmZvcmNlKSB7XG4gICAgICBhcmdzLnB1c2goJy0tZm9yY2UnKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudGFncykge1xuICAgICAgYXJncy5wdXNoKCctLXRhZ3MnLCBvcHRpb25zLnRhZ3MpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5jdXN0b21QZXJtaXNzaW9uc0JvdW5kYXJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1jdXN0b20tcGVybWlzc2lvbnMtYm91bmRhcnknLCBvcHRpb25zLmN1c3RvbVBlcm1pc3Npb25zQm91bmRhcnkpO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5leGFtcGxlUGVybWlzc2lvbnNCb3VuZGFyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhcmdzLnB1c2goJy0tZXhhbXBsZS1wZXJtaXNzaW9ucy1ib3VuZGFyeScpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5kZW55RXh0ZXJuYWxJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhcmdzLnB1c2gob3B0aW9ucy5kZW55RXh0ZXJuYWxJZCA/ICctLWRlbnktZXh0ZXJuYWwtaWQnIDogJy0tbm8tZGVueS1leHRlcm5hbC1pZCcpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnVzZVByZXZpb3VzUGFyYW1ldGVycyA9PT0gZmFsc2UpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1uby1wcmV2aW91cy1wYXJhbWV0ZXJzJyk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmJvb3RzdHJhcFRlbXBsYXRlKSB7XG4gICAgICBhcmdzLnB1c2goJy0tdGVtcGxhdGUnLCBvcHRpb25zLmJvb3RzdHJhcFRlbXBsYXRlKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy50cnVzdCAhPSBudWxsKSB7XG4gICAgICBhcmdzLnB1c2goJy0tdHJ1c3QnLCBvcHRpb25zLnRydXN0LmpvaW4oJywnKSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnVudHJ1c3QgIT0gbnVsbCkge1xuICAgICAgYXJncy5wdXNoKCctLXVudHJ1c3QnLCBvcHRpb25zLnVudHJ1c3Quam9pbignLCcpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jZGsoYXJncywge1xuICAgICAgLi4ub3B0aW9ucy5jbGlPcHRpb25zLFxuICAgICAgbW9kRW52OiB7XG4gICAgICAgIC4uLm9wdGlvbnMuY2xpT3B0aW9ucz8ubW9kRW52LFxuICAgICAgICAvLyBzbyB0aGF0IHRoaXMgd29ya3MgZm9yIFYxLFxuICAgICAgICAvLyB3aGVyZSB0aGUgXCJvbGRcIiBib290c3RyYXAgaXMgdGhlIGRlZmF1bHRcbiAgICAgICAgQ0RLX05FV19CT09UU1RSQVA6ICcxJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2RrR2FyYmFnZUNvbGxlY3Qob3B0aW9uczogQ2RrR2FyYmFnZUNvbGxlY3Rpb25Db21tYW5kT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgYXJncyA9IFtcbiAgICAgICdnYycsXG4gICAgICAnLS11bnN0YWJsZT1nYycsIC8vIFRPRE86IHJlbW92ZSB3aGVuIHN0YWJpbGl6aW5nXG4gICAgICAnLS1jb25maXJtPWZhbHNlJyxcbiAgICAgICctLWNyZWF0ZWQtYnVmZmVyLWRheXM9MCcsIC8vIE90aGVyd2lzZSBhbGwgYXNzZXRzIGNyZWF0ZWQgZHVyaW5nIGludGVnIHRlc3RzIGFyZSB0b28geW91bmdcbiAgICBdO1xuICAgIGlmIChvcHRpb25zLnJvbGxiYWNrQnVmZmVyRGF5cykge1xuICAgICAgYXJncy5wdXNoKCctLXJvbGxiYWNrLWJ1ZmZlci1kYXlzJywgU3RyaW5nKG9wdGlvbnMucm9sbGJhY2tCdWZmZXJEYXlzKSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnR5cGUpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS10eXBlJywgb3B0aW9ucy50eXBlKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuYm9vdHN0cmFwU3RhY2tOYW1lKSB7XG4gICAgICBhcmdzLnB1c2goJy0tYm9vdHN0cmFwU3RhY2tOYW1lJywgb3B0aW9ucy5ib290c3RyYXBTdGFja05hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNkayhhcmdzKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjZGtNaWdyYXRlKGxhbmd1YWdlOiBzdHJpbmcsIHN0YWNrTmFtZTogc3RyaW5nLCBpbnB1dFBhdGg/OiBzdHJpbmcsIG9wdGlvbnM/OiBDZGtDbGlPcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuY2RrKFtcbiAgICAgICdtaWdyYXRlJyxcbiAgICAgICctLWxhbmd1YWdlJyxcbiAgICAgIGxhbmd1YWdlLFxuICAgICAgJy0tc3RhY2stbmFtZScsXG4gICAgICBzdGFja05hbWUsXG4gICAgICAnLS1mcm9tLXBhdGgnLFxuICAgICAgaW5wdXRQYXRoID8/IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICdyZXNvdXJjZXMnLCAndGVtcGxhdGVzJywgJ3Nxcy10ZW1wbGF0ZS5qc29uJykudG9TdHJpbmcoKSxcbiAgICAgIC4uLihvcHRpb25zPy5vcHRpb25zID8/IFtdKSxcbiAgICBdLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjZGsoYXJnczogc3RyaW5nW10sIG9wdGlvbnM6IENka0NsaU9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHZlcmJvc2UgPSBvcHRpb25zLnZlcmJvc2UgPz8gdHJ1ZTtcblxuICAgIGlmICghdmVyYm9zZSAmJiBvcHRpb25zLnZlcmJvc2VMZXZlbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZlcmJvc2Ugc3RhdGU6IHZlcmJvc2UgaXMgZmFsc2UgYW5kIHZlcmJvc2VMZXZlbCBpcyAke29wdGlvbnMudmVyYm9zZUxldmVsfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHZlcmJvc2VMZXZlbCA9IG9wdGlvbnMudmVyYm9zZUxldmVsID8/IDE7XG5cbiAgICBhd2FpdCB0aGlzLmNsaS5tYWtlQ2xpQXZhaWxhYmxlKCk7XG5cbiAgICByZXR1cm4gdGhpcy5zaGVsbChbXG4gICAgICAnY2RrJyxcbiAgICAgIC4uLih2ZXJib3NlID8gW2AtJHsndicucmVwZWF0KHZlcmJvc2VMZXZlbCl9YF0gOiBbXSksXG4gICAgICAuLi5hcmdzLFxuICAgIF0sIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBtb2RFbnY6IHtcbiAgICAgICAgLi4udGhpcy5jZGtTaGVsbEVudigpLFxuICAgICAgICAuLi5vcHRpb25zLm1vZEVudixcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2l0aCB3aGljaCB0byBleGVjdXRlIENES1xuICAgKi9cbiAgcHVibGljIGNka1NoZWxsRW52KCkge1xuICAgIC8vIGlmIHRlc3RzIGFyZSB1c2luZyBhbiBleHBsaWNpdCBhd3MgaWRlbnRpdHkgYWxyZWFkeSAoaS5lIGNyZWRzKVxuICAgIC8vIGZvcmNlIGV2ZXJ5IGNkayBjb21tYW5kIHRvIHVzZSB0aGUgc2FtZSBpZGVudGl0eS5cbiAgICBjb25zdCBhd3NDcmVkcyA9IHRoaXMuYXdzLmlkZW50aXR5RW52KCkgPz8ge307XG5cbiAgICByZXR1cm4ge1xuICAgICAgQVdTX1JFR0lPTjogdGhpcy5hd3MucmVnaW9uLFxuICAgICAgQVdTX0RFRkFVTFRfUkVHSU9OOiB0aGlzLmF3cy5yZWdpb24sXG4gICAgICBTVEFDS19OQU1FX1BSRUZJWDogdGhpcy5zdGFja05hbWVQcmVmaXgsXG4gICAgICBQQUNLQUdFX0xBWU9VVF9WRVJTSU9OOiAnMicsXG4gICAgICBURVNUSU5HX0NESzogJ3RydWUnLFxuICAgICAgLy8gSW4gdGhlc2UgdGVzdHMgd2Ugd2FudCB0byBtYWtlIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBzdGRvdXQgYW5kIHN0ZXJyXG4gICAgICBDSTogJ2ZhbHNlJyxcbiAgICAgIC4uLmF3c0NyZWRzLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgdGVtcGxhdGUoc3RhY2tOYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIGNvbnN0IGZ1bGxTdGFja05hbWUgPSB0aGlzLmZ1bGxTdGFja05hbWUoc3RhY2tOYW1lKTtcbiAgICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBwYXRoLmpvaW4odGhpcy5pbnRlZ1Rlc3REaXIsICdjZGsub3V0JywgYCR7ZnVsbFN0YWNrTmFtZX0udGVtcGxhdGUuanNvbmApO1xuICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0ZW1wbGF0ZVBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSkudG9TdHJpbmcoKSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYm9vdHN0cmFwUmVwb05hbWUoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBlbnN1cmVCb290c3RyYXBwZWQodGhpcyk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXdzLmNsb3VkRm9ybWF0aW9uLnNlbmQobmV3IERlc2NyaWJlU3RhY2tzQ29tbWFuZCh7fSkpO1xuXG4gICAgY29uc3Qgc3RhY2sgPSAocmVzcG9uc2UuU3RhY2tzID8/IFtdKVxuICAgICAgLmZpbHRlcigocykgPT4gcy5TdGFja05hbWUgJiYgcy5TdGFja05hbWUgPT0gdGhpcy5ib290c3RyYXBTdGFja05hbWUpO1xuICAgIGFzc2VydChzdGFjay5sZW5ndGggPT0gMSk7XG4gICAgcmV0dXJuIG91dHB1dEZyb21TdGFjaygnSW1hZ2VSZXBvc2l0b3J5TmFtZScsIHN0YWNrWzBdKSA/PyAnJztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYm9vdHN0cmFwU3RhY2tOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmZ1bGxTdGFja05hbWUoJ2Jvb3RzdHJhcC1zdGFjaycpO1xuICB9XG5cbiAgcHVibGljIGZ1bGxTdGFja05hbWUoc3RhY2tOYW1lOiBzdHJpbmcpOiBzdHJpbmc7XG4gIHB1YmxpYyBmdWxsU3RhY2tOYW1lKHN0YWNrTmFtZXM6IHN0cmluZ1tdKTogc3RyaW5nW107XG4gIHB1YmxpYyBmdWxsU3RhY2tOYW1lKHN0YWNrTmFtZXM6IHN0cmluZyB8IHN0cmluZ1tdKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIGlmICh0eXBlb2Ygc3RhY2tOYW1lcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLnN0YWNrTmFtZVByZWZpeH0tJHtzdGFja05hbWVzfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzdGFja05hbWVzLm1hcChzID0+IGAke3RoaXMuc3RhY2tOYW1lUHJlZml4fS0ke3N9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZCB0aGlzIHRvIHRoZSBsaXN0IG9mIGJ1Y2tldHMgdG8gcG90ZW50aWFsbHkgZGVsZXRlXG4gICAqXG4gICAqIEF0IHRoZSBlbmQgb2YgYSB0ZXN0LCB3ZSBjbGVhbiB1cCBidWNrZXRzIHRoYXQgbWF5IG5vdCBoYXZlIGdvdHRlbiBkZXN0cm95ZWRcbiAgICogKGZvciB3aGF0ZXZlciByZWFzb24pLlxuICAgKi9cbiAgcHVibGljIHJlbWVtYmVyVG9EZWxldGVCdWNrZXQoYnVja2V0TmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5idWNrZXRzVG9EZWxldGUucHVzaChidWNrZXROYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbnVwIGxlZnRvdmVyIHN0YWNrcyBhbmQgYm9vdHN0cmFwcGVkIHJlc291cmNlc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc3Bvc2Uoc3VjY2VzczogYm9vbGVhbikge1xuICAgIC8vIHdoZW4gdXNpbmcgdGhlIGF0bW9zcGhlcmUgc2VydmljZSwgaXQgZG9lcyByZXNvdXJjZSBjbGVhbnVwIG9uIG91ciBiZWhhbGZcbiAgICAvLyBzbyB3ZSBkb24ndCBoYXZlIHRvIHdhaXQgZm9yIGl0LlxuICAgIGlmICghYXRtb3NwaGVyZUVuYWJsZWQoKSkge1xuICAgICAgY29uc3Qgc3RhY2tzVG9EZWxldGUgPSBhd2FpdCB0aGlzLmRlbGV0ZWFibGVTdGFja3ModGhpcy5zdGFja05hbWVQcmVmaXgpO1xuXG4gICAgICB0aGlzLnNvcnRCb290c3RyYXBTdGFja3NUb1RoZUVuZChzdGFja3NUb0RlbGV0ZSk7XG5cbiAgICAgIC8vIEJvb3RzdHJhcCBzdGFja3MgaGF2ZSBidWNrZXRzIHRoYXQgbmVlZCB0byBiZSBjbGVhbmVkXG4gICAgICBjb25zdCBidWNrZXROYW1lcyA9IHN0YWNrc1RvRGVsZXRlLm1hcChzdGFjayA9PiBvdXRwdXRGcm9tU3RhY2soJ0J1Y2tldE5hbWUnLCBzdGFjaykpLmZpbHRlcihkZWZpbmVkKTtcbiAgICAgIC8vIFBhcmFsbGVsaXNtIHdpbGwgYmUgcmVhc29uYWJsZVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBjZGtsYWJzL3Byb21pc2VhbGwtbm8tdW5ib3VuZGVkLXBhcmFsbGVsaXNtXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChidWNrZXROYW1lcy5tYXAoYiA9PiB0aGlzLmF3cy5lbXB0eUJ1Y2tldChiKSkpO1xuICAgICAgLy8gVGhlIGJvb3RzdHJhcCBidWNrZXQgaGFzIGEgcmVtb3ZhbCBwb2xpY3kgb2YgUkVUQUlOIGJ5IGRlZmF1bHQsIHNvIGFkZCBpdCB0byB0aGUgYnVja2V0cyB0byBiZSBjbGVhbmVkIHVwLlxuICAgICAgdGhpcy5idWNrZXRzVG9EZWxldGUucHVzaCguLi5idWNrZXROYW1lcyk7XG5cbiAgICAgIC8vIEJvb3RzdHJhcCBzdGFja3MgaGF2ZSBFQ1IgcmVwb3NpdG9yaWVzIHdpdGggaW1hZ2VzIHdoaWNoIHNob3VsZCBiZSBkZWxldGVkXG4gICAgICBjb25zdCBpbWFnZVJlcG9zaXRvcnlOYW1lcyA9IHN0YWNrc1RvRGVsZXRlLm1hcChzdGFjayA9PiBvdXRwdXRGcm9tU3RhY2soJ0ltYWdlUmVwb3NpdG9yeU5hbWUnLCBzdGFjaykpLmZpbHRlcihkZWZpbmVkKTtcbiAgICAgIC8vIFBhcmFsbGVsaXNtIHdpbGwgYmUgcmVhc29uYWJsZVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBjZGtsYWJzL3Byb21pc2VhbGwtbm8tdW5ib3VuZGVkLXBhcmFsbGVsaXNtXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChpbWFnZVJlcG9zaXRvcnlOYW1lcy5tYXAociA9PiB0aGlzLmF3cy5kZWxldGVJbWFnZVJlcG9zaXRvcnkocikpKTtcblxuICAgICAgYXdhaXQgdGhpcy5hd3MuZGVsZXRlU3RhY2tzKFxuICAgICAgICAuLi5zdGFja3NUb0RlbGV0ZS5tYXAoKHMpID0+IHtcbiAgICAgICAgICBpZiAoIXMuU3RhY2tOYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0YWNrIG5hbWUgaXMgcmVxdWlyZWQgdG8gZGVsZXRlIGEgc3RhY2suJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBzLlN0YWNrTmFtZTtcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICAvLyBXZSBtaWdodCBoYXZlIGxlYWtlZCBzb21lIGJ1Y2tldHMgYnkgdXBncmFkaW5nIHRoZSBib290c3RyYXAgc3RhY2suIEJlXG4gICAgICAvLyBzdXJlIHRvIGNsZWFuIGV2ZXJ5dGhpbmcuXG4gICAgICBmb3IgKGNvbnN0IGJ1Y2tldCBvZiB0aGlzLmJ1Y2tldHNUb0RlbGV0ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmF3cy5kZWxldGVCdWNrZXQoYnVja2V0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgdGVzdHMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgaGFwcGlseSBkZWxldGUgdGhlIGZpeHR1cmVcbiAgICAvLyAob3RoZXJ3aXNlIGxlYXZlIGl0IGZvciBodW1hbnMgdG8gaW5zcGVjdClcbiAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgY29uc3QgY2xlYW5lZCA9IHJpbXJhZih0aGlzLmludGVnVGVzdERpcik7XG4gICAgICBpZiAoIWNsZWFuZWQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNsZWFuIHVwICR7dGhpcy5pbnRlZ1Rlc3REaXJ9IGR1ZSB0byBwZXJtaXNzaW9ucyBpc3N1ZXMgKERvY2tlciBydW5uaW5nIGFzIHJvb3Q/KWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHN0YWNrcyBzdGFydGluZyB3aXRoIG91ciB0ZXN0aW5nIHByZWZpeCB0aGF0IHNob3VsZCBiZSBkZWxldGVkXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRlbGV0ZWFibGVTdGFja3MocHJlZml4OiBzdHJpbmcpOiBQcm9taXNlPFN0YWNrW10+IHtcbiAgICBjb25zdCBzdGF0dXNGaWx0ZXIgPSBbXG4gICAgICAnQ1JFQVRFX0lOX1BST0dSRVNTJywgJ0NSRUFURV9GQUlMRUQnLCAnQ1JFQVRFX0NPTVBMRVRFJyxcbiAgICAgICdST0xMQkFDS19JTl9QUk9HUkVTUycsICdST0xMQkFDS19GQUlMRUQnLCAnUk9MTEJBQ0tfQ09NUExFVEUnLFxuICAgICAgJ0RFTEVURV9GQUlMRUQnLFxuICAgICAgJ1VQREFURV9JTl9QUk9HUkVTUycsICdVUERBVEVfQ09NUExFVEVfQ0xFQU5VUF9JTl9QUk9HUkVTUycsXG4gICAgICAnVVBEQVRFX0NPTVBMRVRFJywgJ1VQREFURV9ST0xMQkFDS19JTl9QUk9HUkVTUycsXG4gICAgICAnVVBEQVRFX1JPTExCQUNLX0ZBSUxFRCcsXG4gICAgICAnVVBEQVRFX1JPTExCQUNLX0NPTVBMRVRFX0NMRUFOVVBfSU5fUFJPR1JFU1MnLFxuICAgICAgJ1VQREFURV9ST0xMQkFDS19DT01QTEVURScsICdSRVZJRVdfSU5fUFJPR1JFU1MnLFxuICAgICAgJ0lNUE9SVF9JTl9QUk9HUkVTUycsICdJTVBPUlRfQ09NUExFVEUnLFxuICAgICAgJ0lNUE9SVF9ST0xMQkFDS19JTl9QUk9HUkVTUycsICdJTVBPUlRfUk9MTEJBQ0tfRkFJTEVEJyxcbiAgICAgICdJTVBPUlRfUk9MTEJBQ0tfQ09NUExFVEUnLFxuICAgIF07XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXdzLmNsb3VkRm9ybWF0aW9uLnNlbmQobmV3IERlc2NyaWJlU3RhY2tzQ29tbWFuZCh7fSkpO1xuXG4gICAgcmV0dXJuIChyZXNwb25zZS5TdGFja3MgPz8gW10pXG4gICAgICAuZmlsdGVyKChzKSA9PiBzLlN0YWNrTmFtZSAmJiBzLlN0YWNrTmFtZS5zdGFydHNXaXRoKHByZWZpeCkpXG4gICAgICAuZmlsdGVyKChzKSA9PiBzLlN0YWNrU3RhdHVzICYmIHN0YXR1c0ZpbHRlci5pbmNsdWRlcyhzLlN0YWNrU3RhdHVzKSlcbiAgICAgIC5maWx0ZXIoKHMpID0+IHMuUm9vdElkID09PSB1bmRlZmluZWQpOyAvLyBPbmx5IGRlbGV0ZSBwYXJlbnQgc3RhY2tzLiBOZXN0ZWQgc3RhY2tzIGFyZSBkZWxldGVkIGluIHRoZSBwcm9jZXNzXG4gIH1cblxuICBwcml2YXRlIHNvcnRCb290c3RyYXBTdGFja3NUb1RoZUVuZChzdGFja3M6IFN0YWNrW10pIHtcbiAgICBzdGFja3Muc29ydCgoYSwgYikgPT4ge1xuICAgICAgaWYgKCFhLlN0YWNrTmFtZSB8fCAhYi5TdGFja05hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdGFjayBuYW1lcyBkbyBub3QgZXhpc3RzLiBUaGVzZSBhcmUgcmVxdWlyZWQgZm9yIHNvcnRpbmcgdGhlIGJvb3RzdHJhcCBzdGFja3MuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFCcyA9IGEuU3RhY2tOYW1lLnN0YXJ0c1dpdGgodGhpcy5ib290c3RyYXBTdGFja05hbWUpO1xuICAgICAgY29uc3QgYkJzID0gYi5TdGFja05hbWUuc3RhcnRzV2l0aCh0aGlzLmJvb3RzdHJhcFN0YWNrTmFtZSk7XG5cbiAgICAgIHJldHVybiBhQnMgIT0gYkJzXG4gICAgICAgIC8vICcrJyBjb252ZXJ0cyBhIGJvb2xlYW4gdG8gMCBvciAxXG4gICAgICAgID8gKCthQnMpIC0gKCtiQnMpXG4gICAgICAgIDogYS5TdGFja05hbWUubG9jYWxlQ29tcGFyZShiLlN0YWNrTmFtZSk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBNYWtlIHN1cmUgdGhhdCB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgaXMgYm9vdHN0cmFwcGVkXG4gKlxuICogU2luY2Ugd2UgZ28gc3RyaXBpbmcgYWNyb3NzIHJlZ2lvbnMsIGl0J3MgZ29pbmcgdG8gc3VjayBkb2luZyB0aGlzXG4gKiBieSBoYW5kIHNvIGxldCdzIGp1c3QgbWFzcy1hdXRvbWF0ZSBpdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUJvb3RzdHJhcHBlZChmaXh0dXJlOiBUZXN0Rml4dHVyZSkge1xuICAvLyBBbHdheXMgdXNlIHRoZSBtb2Rlcm4gYm9vdHN0cmFwIHN0YWNrLCBvdGhlcndpc2Ugd2UgbWF5IGdldCB0aGUgZXJyb3JcbiAgLy8gXCJyZWZ1c2luZyB0byBkb3duZ3JhZGUgZnJvbSB2ZXJzaW9uIDcgdG8gdmVyc2lvbiAwXCIgd2hlbiBib290c3RyYXBwaW5nIHdpdGggZGVmYXVsdFxuICAvLyBzZXR0aW5ncyB1c2luZyBhIHYxIENMSS5cbiAgLy9cbiAgLy8gSXQgZG9lc24ndCBtYXR0ZXIgZm9yIHRlc3RzOiB3aGVuIHRoZXkgd2FudCB0byB0ZXN0IHNvbWV0aGluZyBhYm91dCBhbiBhY3R1YWwgbGVnYWN5XG4gIC8vIGJvb3RzdHJhcCBzdGFjaywgdGhleSdsbCBjcmVhdGUgYSBib290c3RyYXAgc3RhY2sgd2l0aCBhIG5vbi1kZWZhdWx0IG5hbWUgdG8gdGVzdCB0aGF0IGV4YWN0IHByb3BlcnR5LlxuICBjb25zdCBlbnZTcGVjaWZpZXIgPSBgYXdzOi8vJHthd2FpdCBmaXh0dXJlLmF3cy5hY2NvdW50KCl9LyR7Zml4dHVyZS5hd3MucmVnaW9ufWA7XG4gIGlmIChBTFJFQURZX0JPT1RTVFJBUFBFRF9JTl9USElTX1JVTi5oYXMoZW52U3BlY2lmaWVyKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChhdG1vc3BoZXJlRW5hYmxlZCgpKSB7XG4gICAgLy8gd2hlbiBhdG1vc3BoZXJlIGlzIGVuYWJsZWQsIGVhY2ggdGVzdCBzdGFydHMgd2l0aCBhbiBlbXB0eSBlbnZpcm9ubWVudFxuICAgIC8vIGFuZCBuZWVkcyB0byBkZXBsb3kgdGhlIGJvb3RzdHJhcCBzdGFjay4gaW4gY2FzZSBlbnZpcm9ubWVudHMgYXJlIHJlY3lsY2VkIHRvbyBxdWlja2x5LFxuICAgIC8vIGNsb3VkZm9ybWF0aW9uIG1heSB0aGluayB0aGUgYm9vdHN0cmFwIGJ1Y2tldCBzdGlsbCBleGlzdHMgZXZlbiB0aG91Z2ggaXQgZG9lc250IChiZWNhdXNlIG9mIHMzIGV2ZW50dWFsIGNvbnNpc3RlbmN5KS5cbiAgICAvLyBzbyB3ZSByZXRyeSBvbiB0aGUgc3BlY2lmaWMgZXJyb3IgZm9yIGEgd2hpbGUuXG4gICAgYXdhaXQgYm9vdHN0cmFwV2l0aFJldHJ5T25CdWNrZXRFeGlzdHMoZW52U3BlY2lmaWVyLCBmaXh0dXJlKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBkb0Jvb3RzdHJhcChlbnZTcGVjaWZpZXIsIGZpeHR1cmUsIGZhbHNlKTtcbiAgfVxuXG4gIC8vIHdoZW4gdXNpbmcgdGhlIGF0bW9zcGhlcmUgc2VydmljZSwgZXZlcnkgdGVzdCBuZWVkcyB0byBib290c3RyYXBcbiAgLy8gaXRzIG93biBlbnZpcm9ubWVudC5cbiAgaWYgKCFhdG1vc3BoZXJlRW5hYmxlZCgpKSB7XG4gICAgQUxSRUFEWV9CT09UU1RSQVBQRURfSU5fVEhJU19SVU4uYWRkKGVudlNwZWNpZmllcik7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZG9Cb290c3RyYXAoZW52U3BlY2lmaWVyOiBzdHJpbmcsIGZpeHR1cmU6IFRlc3RGaXh0dXJlLCBhbGxvd0VyckV4aXQ6IGJvb2xlYW4pIHtcbiAgcmV0dXJuIGZpeHR1cmUuY2RrKFsnYm9vdHN0cmFwJywgJy0tYm9vdHN0cmFwLWttcy1rZXktaWQnLCAnQVdTX01BTkFHRURfS0VZJywgZW52U3BlY2lmaWVyXSwge1xuICAgIG1vZEVudjoge1xuICAgICAgLy8gRXZlbiBmb3IgdjEsIHVzZSBuZXcgYm9vdHN0cmFwXG4gICAgICBDREtfTkVXX0JPT1RTVFJBUDogJzEnLFxuICAgICAgLy8gd2hlbiBhbGxvd2luZyBlcnJvciBleGl0LCB3ZSBwcm9iYWJseSB3YW50IHRvIGluc3BlY3RcbiAgICAgIC8vIGFuZCBjb21wYXJlIG91dHB1dCwgd2hpY2ggaXMgYmV0dGVyIGRvbmUgd2l0aG91dCBjb2xvciBjaGFyYWN0ZXJzLlxuICAgICAgLi4uKGFsbG93RXJyRXhpdCA/IHsgRk9SQ0VfQ09MT1I6ICcwJyB9IDoge30pLFxuICAgIH0sXG4gICAgYWxsb3dFcnJFeGl0LFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYm9vdHN0cmFwV2l0aFJldHJ5T25CdWNrZXRFeGlzdHMoZW52U3BlY2lmaWVyOiBzdHJpbmcsIGZpeHR1cmU6IFRlc3RGaXh0dXJlKSB7XG4gIGNvbnN0IGFjY291bnQgPSBhd2FpdCBmaXh0dXJlLmF3cy5hY2NvdW50KCk7XG4gIGNvbnN0IHJldHJ5QWZ0ZXJTZWNvbmRzID0gMzA7XG4gIGNvbnN0IGJvb3RzdHJhcEJ1Y2tldCA9IGBjZGstaG5iNjU5ZmRzLWFzc2V0cy0ke2FjY291bnR9LSR7Zml4dHVyZS5hd3MucmVnaW9ufWA7XG5cbiAgLy8gczMgc2F5cyB0aGF0IGEgYnVja2V0IGRlbGV0aW9uIGNhbiB0YWtlIHVwIHRvIGFuIGhvdXIgdG8gYmUgZnVsbHkgdmlzaWJsZS5cbiAgLy8gZW1waXJpY2FsbHkgd2Ugc2VlIHRoYXQgYSBmZXcgbWludXRlcyBpcyBlbm91Z2ggdGhvdWdoLiBsZXRzIGdpdmUgMTAgdG8gYmUgb24gdGhlIHNhZmUocikgc2lkZS5cbiAgY29uc3QgdGltZW91dE1pbnV0ZXMgPSAxMDtcblxuICBjb25zdCB0aW1lb3V0RGF0ZSA9IG5ldyBEYXRlKERhdGUubm93KCkgKyB0aW1lb3V0TWludXRlcyAqIDYwICogMTAwMCk7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3Qgb3V0ID0gYXdhaXQgZG9Cb290c3RyYXAoZW52U3BlY2lmaWVyLCBmaXh0dXJlLCB0cnVlKTtcbiAgICBpZiAob3V0LmluY2x1ZGVzKGBFbnZpcm9ubWVudCAke2VudlNwZWNpZmllcn0gYm9vdHN0cmFwcGVkYCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAob3V0LmluY2x1ZGVzKGAke2Jvb3RzdHJhcEJ1Y2tldH0gYWxyZWFkeSBleGlzdHNgKSkge1xuICAgICAgLy8gbWlnaHQgYmUgYW4gczMgZXZlbnR1YWx5IGNvbnNpc3RlbmN5IGlzc3VlIGR1ZSB0byByZWN5Y2xlZCBlbnZpcm9ubWVudHMuXG4gICAgICBpZiAoRGF0ZS5ub3coKSA8IHRpbWVvdXREYXRlLmdldFRpbWUoKSkge1xuICAgICAgICBmaXh0dXJlLmxvZyhgQm9vdHN0cmFwIG9mICR7ZW52U3BlY2lmaWVyfSBmYWlsZWQgZHVlIHRvIGJ1Y2tldCBleGlzdGVuY2UgY2hlY2suIFJldHJ5aW5nIGluICR7cmV0cnlBZnRlclNlY29uZHN9IHNlY29uZHMuLi5gKTtcbiAgICAgICAgYXdhaXQgc2xlZXAocmV0cnlBZnRlclNlY29uZHMgKiAxMDAwKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIGJvb3RzdHJhcHBpbmcgJHtlbnZTcGVjaWZpZXJ9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVmaW5lZDxBPih4OiBBKTogeCBpcyBOb25OdWxsYWJsZTxBPiB7XG4gIHJldHVybiB4ICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogSW5zdGFsbCB0aGUgZ2l2ZW4gTlBNIHBhY2thZ2VzLCBpZGVudGlmaWVkIGJ5IHRoZWlyIG5hbWVzIGFuZCB2ZXJzaW9uc1xuICpcbiAqIFdvcmtzIGJ5IHdyaXRpbmcgdGhlIHBhY2thZ2VzIHRvIGEgYHBhY2thZ2UuanNvbmAgZmlsZSwgYW5kXG4gKiB0aGVuIHJ1bm5pbmcgTlBNNydzIFwiaW5zdGFsbFwiIG9uIGl0LiBUaGUgdXNlIG9mIE5QTTcgd2lsbCBhdXRvbWF0aWNhbGx5XG4gKiBpbnN0YWxsIHJlcXVpcmVkIHBlZXJEZXBlbmRlbmNpZXMuXG4gKlxuICogSWYgd2UncmUgcnVubmluZyBpbiBSRVBPIG1vZGUgYW5kIHdlIGZpbmQgdGhlIHBhY2thZ2UgaW4gdGhlIHNldCBvZiBsb2NhbFxuICogcGFja2FnZXMgaW4gdGhlIHJlcG9zaXRvcnksIHdlJ2xsIHdyaXRlIHRoZSBkaXJlY3RvcnkgbmFtZSB0byBgcGFja2FnZS5qc29uYFxuICogc28gdGhhdCBOUE0gd2lsbCBjcmVhdGUgYSBzeW1saW5rICh0aGlzIGFsbG93cyBydW5uaW5nIHRlc3RzIGFnYWluc3RcbiAqIGJ1aWx0LWJ1dC11bnBhY2thZ2VkIG1vZHVsZXMsIGFuZCBzYXZlcyBkZXYgY3ljbGUgdGltZSkuXG4gKlxuICogQmUgYXdhcmUgeW91IE1VU1QgaW5zdGFsbCBhbGwgdGhlIHBhY2thZ2VzIHlvdSBkaXJlY3RseSBkZXBlbmQgdXBvbiEgSW4gdGhlIGNhc2VcbiAqIG9mIGEgcmVwby9zeW1saW5raW5nIGluc3RhbGwsIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIFdJTEwgTk9UIGJlIGluc3RhbGxlZCBpbiB0aGVcbiAqIGN1cnJlbnQgZGlyZWN0b3J5J3MgYG5vZGVfbW9kdWxlc2AgZGlyZWN0b3J5LCBiZWNhdXNlIHRoZXkgd2lsbCBhbHJlYWR5IGhhdmUgYmVlblxuICogc3ltbGlua2VkIGZyb20gdGhlIFRBUkdFVCBkaXJlY3RvcnkncyBgbm9kZV9tb2R1bGVzYCBkaXJlY3RvcnkgKHdoaWNoIGlzIHN1ZmZpY2llbnRcbiAqIGZvciBOb2RlJ3MgZGVwZW5kZW5jeSBsb29rdXAgbWVjaGFuaXNtKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxOcG1QYWNrYWdlcyhmaXh0dXJlOiBUZXN0Rml4dHVyZSwgcGFja2FnZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHtcbiAgaWYgKHByb2Nlc3MuZW52LlJFUE9fUk9PVCkge1xuICAgIGNvbnN0IG1vbm9SZXBvID0gYXdhaXQgZmluZFlhcm5QYWNrYWdlcyhwcm9jZXNzLmVudi5SRVBPX1JPT1QpO1xuXG4gICAgLy8gUmVwbGFjZSB0aGUgaW5zdGFsbCB0YXJnZXQgd2l0aCB0aGUgcGh5c2ljYWwgbG9jYXRpb24gb2YgdGhpcyBwYWNrYWdlXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocGFja2FnZXMpKSB7XG4gICAgICBpZiAoa2V5IGluIG1vbm9SZXBvKSB7XG4gICAgICAgIHBhY2thZ2VzW2tleV0gPSBtb25vUmVwb1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKGZpeHR1cmUuaW50ZWdUZXN0RGlyLCAncGFja2FnZS5qc29uJyksIEpTT04uc3RyaW5naWZ5KHtcbiAgICBuYW1lOiAnY2RrLWludGVnLXRlc3RzJyxcbiAgICBwcml2YXRlOiB0cnVlLFxuICAgIHZlcnNpb246ICcwLjAuMScsXG4gICAgZGV2RGVwZW5kZW5jaWVzOiBwYWNrYWdlcyxcbiAgfSwgdW5kZWZpbmVkLCAyKSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcblxuICAvLyB3ZSBvZnRlbiBFQ09OTlJFU0VUIGZyb20gTlBNIHNvIGxldHMgcmV0cnkuIHRoaXMgbWlnaHQgYmUgYmVjYXVzZSBvZiBoaWdoIGNvbmN1cnJlbmN5XG4gIC8vIHdoaWNoIG92ZXJ3aGVsbWVzIHN5c3RlbSByZXNvdXJjZXMuXG4gIGNvbnN0IHRpbWVvdXRNaW51dGVzID0gMTA7XG4gIGNvbnN0IHRpbWVvdXREYXRlID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIHRpbWVvdXRNaW51dGVzICogNjAgKiAxMDAwKTtcbiAgY29uc3QgcmV0cnlBZnRlclNlY29uZHMgPSAzMDtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHRyeSB7XG4gICAgICAvLyBOb3cgaW5zdGFsbCB0aGF0IGBwYWNrYWdlLmpzb25gIHVzaW5nIE5QTTdcbiAgICAgIGF3YWl0IGZpeHR1cmUuc2hlbGwoWydub2RlJywgcmVxdWlyZS5yZXNvbHZlKCducG0nKSwgJ2luc3RhbGwnXSk7XG4gICAgICBicmVhaztcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGlmIChEYXRlLm5vdygpIDwgdGltZW91dERhdGUuZ2V0VGltZSgpICYmIGZpeHR1cmUub3V0cHV0LnRvU3RyaW5nKCkuaW5jbHVkZXMoJ0VDT05OUkVTRVQnICkpIHtcbiAgICAgICAgZml4dHVyZS5sb2coYG5wbSBpbnN0YWxsIGZhaWxlZCBkdWUgdG8gRUNPTk5SRVNFVC4gUmV0cnlpbmcgaW4gJHtyZXRyeUFmdGVyU2Vjb25kc30gc2Vjb25kcy4uLmApO1xuICAgICAgICBhd2FpdCBzbGVlcChyZXRyeUFmdGVyU2Vjb25kcyAqIDEwMDApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IEFMUkVBRFlfQk9PVFNUUkFQUEVEX0lOX1RISVNfUlVOID0gbmV3IFNldCgpO1xuIl19
|
|
727
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1jZGstYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsid2l0aC1jZGstYXBwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVDQSxnREErQ0M7QUFLRCxnQ0FLQztBQUVELDhDQStDQztBQVdELGdEQUVDO0FBRUQsa0RBRUM7QUFFRCxnRUFFQztBQUVELHNEQUVDO0FBU0QsOEJBcUJDO0FBbUJELDRDQUtDO0FBaUJELHdDQUlDO0FBMGlCRCxnREEyQkM7QUEyRUQsZ0RBdUNDO0FBNTZCRCwrQkFBK0I7QUFDL0Isb0RBQTRCO0FBQzVCLHVDQUF5QjtBQUN6Qix1Q0FBeUI7QUFDekIsMkNBQTZCO0FBRTdCLDBFQUF1RTtBQUN2RSxrRUFBMEU7QUFFMUUsK0JBQStDO0FBRy9DLDZEQUEwRDtBQUMxRCwyQ0FBNEM7QUFFNUMsbUNBQXFEO0FBRXJELHlDQUF3RDtBQUN4RCxpREFBNkM7QUFDN0MsaUNBQTBDO0FBRTdCLFFBQUEsc0JBQXNCLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFBLHVCQUF1QixHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFTL0M7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLGtCQUFrQixDQUNoQyxPQUFlLEVBQ2YsS0FBOEM7SUFFOUMsT0FBTyxLQUFLLEVBQUUsT0FBMkQsRUFBRSxFQUFFO1FBQzNFLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7UUFDbkMsTUFBTSxlQUFlLEdBQUcsV0FBVyxLQUFLLEVBQUUsQ0FBQztRQUMzQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxhQUFhLEtBQUssRUFBRSxDQUFDLENBQUM7UUFFbEUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLGVBQWUsSUFBSSxDQUFDLENBQUM7UUFDOUQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLFlBQVksSUFBSSxDQUFDLENBQUM7UUFDM0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUVqRSxNQUFNLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUFhLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEcsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQzdCLFlBQVksRUFDWixlQUFlLEVBQ2YsT0FBTyxDQUFDLE1BQU0sRUFDZCxPQUFPLENBQUMsR0FBRyxFQUNYLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4QixNQUFNLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUUvQixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxtQkFBbUIsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFFL0QsTUFBTSxrQkFBa0IsQ0FBQyxPQUFPLEVBQUU7Z0JBQ2hDLGFBQWEsRUFBRSxtQkFBbUI7Z0JBQ2xDLFlBQVksRUFBRSxLQUFLO2FBQ3BCLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDOUIsTUFBTSxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwQyxDQUFDO1lBRUQsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkIsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ2hCLE1BQU0sQ0FBQyxDQUFDO1FBQ1YsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixZQUFZLHVCQUF1QixDQUFDLENBQUM7WUFDOUUsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNqQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLFVBQVUsQ0FDeEIsS0FBOEM7SUFFOUMsK0VBQStFO0lBQy9FLE9BQU8sa0JBQWtCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzFDLENBQUM7QUFFRCxTQUFnQixpQkFBaUIsQ0FDL0IsUUFBZ0IsRUFDaEIsS0FBOEM7SUFFOUMsT0FBTyxLQUFLLEVBQUUsT0FBMkQsRUFBRSxFQUFFO1FBQzNFLE1BQU0sU0FBUyxHQUFHLGVBQWUsUUFBUSxVQUFVLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMxRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxlQUFlLFFBQVEsVUFBVSxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUVyRyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsU0FBUyxJQUFJLENBQUMsQ0FBQztRQUN0RCxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsWUFBWSxJQUFJLENBQUMsQ0FBQztRQUUzRCxFQUFFLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzNCLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxDQUM3QixZQUFZLEVBQ1osU0FBUyxFQUNULE9BQU8sQ0FBQyxNQUFNLEVBQ2QsT0FBTyxDQUFDLEdBQUcsRUFDWCxPQUFPLENBQUMsWUFBWSxDQUNyQixDQUFDO1FBQ0YsTUFBTSxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFL0IsTUFBTSxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVsQyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRTlDLE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxDQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsRUFDbEMsU0FBUyxFQUNULE9BQU8sQ0FBQyxNQUFNLEVBQ2QsT0FBTyxDQUFDLEdBQUcsRUFDWCxPQUFPLENBQUMsWUFBWSxDQUNyQixDQUFDO1FBRUYsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ25CLElBQUksQ0FBQztZQUNILE1BQU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNoQixNQUFNLENBQUMsQ0FBQztRQUNWLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDL0IsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsWUFBWSxxQkFBcUIsQ0FBQyxDQUFDO1lBQzVFLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDakMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxLQUE4QyxFQUFFLFVBQWdDLEVBQUU7SUFDbkgsT0FBTyxJQUFBLGtCQUFPLEVBQUMsSUFBQSwwQkFBVyxFQUFDLDhCQUFzQixFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0RixDQUFDO0FBRUQsU0FBZ0IsbUJBQW1CLENBQUMsT0FBZSxFQUFFLEtBQThDLEVBQUUsVUFBZ0MsRUFBRTtJQUNySSxPQUFPLElBQUEsa0JBQU8sRUFBQyxJQUFBLDBCQUFXLEVBQUMsOEJBQXNCLEVBQUUsa0JBQWtCLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZHLENBQUM7QUFFRCxTQUFnQiwwQkFBMEIsQ0FBQyxLQUE4QyxFQUFFLFVBQWdDLEVBQUU7SUFDM0gsT0FBTyxJQUFBLGtCQUFPLEVBQUMsSUFBQSwwQkFBVyxFQUFDLCtCQUF1QixFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2RixDQUFDO0FBRUQsU0FBZ0IscUJBQXFCLENBQUMsUUFBZ0IsRUFBRSxLQUE4QyxFQUFFLFVBQWdDLEVBQUU7SUFDeEksT0FBTyxJQUFBLGtCQUFPLEVBQUMsSUFBQSwwQkFBVyxFQUFDLDhCQUFzQixFQUFFLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2RyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFFSCxTQUFnQixTQUFTLENBQ3ZCLFFBQXVDLEVBQ3ZDLGNBQXNCLENBQUM7SUFFdkIsT0FBTyxLQUFLLEVBQUUsT0FBVSxFQUFFLEVBQUU7UUFDMUIsSUFBSSxTQUFTLENBQUM7UUFFZCxLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLElBQUksV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDeEQsSUFBSSxDQUFDO2dCQUNILE1BQU0sUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN4QixPQUFPO1lBQ1QsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFDbEIsSUFBSSxPQUFPLEdBQUcsV0FBVyxFQUFFLENBQUM7b0JBQzFCLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxPQUFPLElBQUksV0FBVyxZQUFZLEtBQUssZUFBZSxDQUFDLENBQUM7Z0JBQ2pGLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sU0FBUyxDQUFDO0lBQ2xCLENBQUMsQ0FBQztBQUNKLENBQUM7QUFlRDs7O0dBR0c7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxLQUE4QyxFQUFFLFVBQWdDLEVBQUU7SUFDakgsT0FBTyxJQUFBLGtCQUFPLEVBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ2hDLEdBQUcsT0FBTyxDQUFDLEdBQUc7UUFDZCxnQkFBZ0IsRUFBRSxJQUFJO0tBQ3ZCLENBQUMsQ0FBQztBQUNMLENBQUM7QUFjRDs7R0FFRztBQUNJLEtBQUssVUFBVSxjQUFjLENBQUMsTUFBYyxFQUFFLE1BQWMsRUFBRSxNQUE4QjtJQUNqRyxNQUFNLElBQUEsYUFBSyxFQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDeEUsTUFBTSxJQUFBLGFBQUssRUFBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sSUFBQSxhQUFLLEVBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sR0FBRyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3hGLENBQUM7QUF1SEQsTUFBYSxXQUFZLFNBQVEsbUJBQVc7SUFReEI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQVhGLFNBQVMsQ0FBUztJQUNqQixlQUFlLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztJQUN2QyxHQUFHLENBQWlCO0lBQ3BCLFNBQVMsQ0FBaUI7SUFDMUIsT0FBTyxDQUFxQjtJQUU1QyxZQUNrQixZQUFvQixFQUNwQixlQUF1QixFQUN2QixNQUE2QixFQUM3QixHQUFlLEVBQ2YsWUFBb0I7UUFDcEMsS0FBSyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUxaLGlCQUFZLEdBQVosWUFBWSxDQUFRO1FBQ3BCLG9CQUFlLEdBQWYsZUFBZSxDQUFRO1FBQ3ZCLFdBQU0sR0FBTixNQUFNLENBQXVCO1FBQzdCLFFBQUcsR0FBSCxHQUFHLENBQVk7UUFDZixpQkFBWSxHQUFaLFlBQVksQ0FBUTtRQUdwQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUEsdUJBQVUsRUFBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUEsdUJBQVUsRUFBQyxXQUFXLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUEsdUJBQVUsRUFBQyxTQUFTLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRU0sR0FBRyxDQUFDLENBQVM7UUFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLLENBQUMsY0FBYztRQUN6QixNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLGdEQUE0QixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDMUYsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixDQUFDO1FBRXJFLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQztRQUVsRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsRSxNQUFNLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFaEQsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU87WUFDL0IsWUFBWSxFQUFFLFFBQVE7WUFDdEIsWUFBWSxFQUFFLGlCQUFpQjtZQUMvQixnQkFBZ0IsQ0FBQyxFQUFFO1lBQ25CLEtBQUssRUFBRSxJQUFJO1lBQ1gsTUFBTSxFQUFFO2dCQUNOLFlBQVksRUFBRSxRQUFRO2FBQ3ZCO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxTQUFTLENBQUMsVUFBNkIsRUFBRSxVQUF5QixFQUFFLEVBQUUsZUFBeUI7UUFDMUcsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLGVBQWUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFFTSxvQkFBb0IsQ0FBQyxVQUE2QixFQUFFLFVBQXlCLEVBQUUsRUFBRSxlQUF5QjtRQUMvRyxVQUFVLEdBQUcsT0FBTyxVQUFVLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDeEUsTUFBTSxvQkFBb0IsR0FBRyxPQUFPLENBQUMsb0JBQW9CLElBQUksSUFBSSxDQUFDO1FBRWxFLE9BQU87WUFDTCxRQUFRO1lBQ1IsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLCtDQUErQztZQUM5RyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDMUIsOENBQThDO1lBQzlDLFlBQVksRUFBRSxRQUFRO1lBQ3RCLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNsRSxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNoRixDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBeUIsRUFBRTtRQUMvQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDZCxPQUFPO1lBQ1AsR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDL0UsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO1NBQzNCLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDZCxDQUFDO0lBRU0sS0FBSyxDQUFDLFdBQVcsQ0FBQyxVQUF5QixFQUFFO1FBQ2xELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUNkLFVBQVU7WUFDVixHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7U0FDM0IsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNkLENBQUM7SUFFTSxLQUFLLENBQUMsVUFBVSxDQUFDLFVBQTZCLEVBQUUsVUFBZ0MsRUFBRTtRQUN2RixVQUFVLEdBQUcsT0FBTyxVQUFVLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFFeEUsaUVBQWlFO1FBQ2pFLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDO1FBRXBDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVM7WUFDeEIsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsNkNBQTZDO1lBQ3ZFLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUMxQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRU0sS0FBSyxDQUFDLGtCQUFrQixDQUFDLE9BQXlDO1FBQ3ZFLE1BQU0sSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFM0IsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM1RCxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLDhCQUE4QixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3pELElBQUksQ0FBQyxJQUFJLENBQUMscUNBQXFDLEVBQUUsT0FBTyxDQUFDLDhCQUE4QixDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDdEcsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRTtZQUNwQixHQUFHLE9BQU8sQ0FBQyxVQUFVO1lBQ3JCLE1BQU0sRUFBRTtnQkFDTixHQUFHLE9BQU8sQ0FBQyxVQUFVLEVBQUUsTUFBTTtnQkFDN0IsNkJBQTZCO2dCQUM3QiwyQ0FBMkM7Z0JBQzNDLG9CQUFvQixFQUFFLEdBQUc7YUFDMUI7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSyxDQUFDLGtCQUFrQixDQUFDLE9BQXlDO1FBQ3ZFLE1BQU0sSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFM0IsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQy9CLENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDNUQsSUFBSSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5RCxJQUFJLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMscUNBQXFDLEVBQUUsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLHFCQUFxQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2hELElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsT0FBTyxDQUFDLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDbEYsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkIsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMseUJBQXlCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQywrQkFBK0IsRUFBRSxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUNoRixDQUFDO2FBQU0sSUFBSSxPQUFPLENBQUMsMEJBQTBCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDNUQsSUFBSSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxjQUFjLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNyRixDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMscUJBQXFCLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUU7WUFDcEIsR0FBRyxPQUFPLENBQUMsVUFBVTtZQUNyQixNQUFNLEVBQUU7Z0JBQ04sR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLE1BQU07Z0JBQzdCLDZCQUE2QjtnQkFDN0IsMkNBQTJDO2dCQUMzQyxpQkFBaUIsRUFBRSxHQUFHO2FBQ3ZCO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUEyQztRQUN4RSxNQUFNLElBQUksR0FBRztZQUNYLElBQUk7WUFDSixlQUFlLEVBQUUsZ0NBQWdDO1lBQ2pELGlCQUFpQjtZQUNqQix5QkFBeUIsRUFBRSxnRUFBZ0U7U0FDNUYsQ0FBQztRQUNGLElBQUksT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztRQUMxRSxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRU0sS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFnQixFQUFFLFNBQWlCLEVBQUUsU0FBa0IsRUFBRSxPQUF1QjtRQUN0RyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDZCxTQUFTO1lBQ1QsWUFBWTtZQUNaLFFBQVE7WUFDUixjQUFjO1lBQ2QsU0FBUztZQUNULGFBQWE7WUFDYixTQUFTLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxRQUFRLEVBQUU7WUFDakcsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO1NBQzVCLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDZCxDQUFDO0lBRU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFjLEVBQUUsVUFBeUIsRUFBRTtRQUMxRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQztRQUV4QyxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLCtEQUErRCxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUN6RyxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUM7UUFFL0MsMEZBQTBGO1FBQzFGLDZGQUE2RjtRQUM3RixpR0FBaUc7UUFDakcsK0ZBQStGO1FBQy9GLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7UUFDNUQsSUFBSSxVQUFVLElBQUksT0FBTyxDQUFDLGFBQWEsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUNsRCxNQUFNLElBQUksS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsNERBQTREO2dCQUNoRyxzRkFBc0YsQ0FBQyxDQUFDO1FBQzVGLENBQUM7UUFFRCxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUVsQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDOUIsS0FBSztZQUNMLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3BELEdBQUcsSUFBSTtTQUNSLEVBQUU7WUFDRCxHQUFHLE9BQU87WUFDVixNQUFNLEVBQUU7Z0JBQ04sR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNyQixHQUFHLE9BQU8sQ0FBQyxNQUFNO2FBQ2xCO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQztnQkFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3JCLENBQUM7WUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO2dCQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLE9BQU8sa0JBQWtCLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDcEksQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxXQUFXO1FBQ2hCLGtFQUFrRTtRQUNsRSxvREFBb0Q7UUFDcEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFOUMsT0FBTztZQUNMLFVBQVUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU07WUFDM0Isa0JBQWtCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNO1lBQ25DLGlCQUFpQixFQUFFLElBQUksQ0FBQyxlQUFlO1lBQ3ZDLHNCQUFzQixFQUFFLEdBQUc7WUFDM0IsV0FBVyxFQUFFLE1BQU07WUFDbkIsd0VBQXdFO1lBQ3hFLEVBQUUsRUFBRSxPQUFPO1lBQ1gsR0FBRyxRQUFRO1NBQ1osQ0FBQztJQUNKLENBQUM7SUFFTSxRQUFRLENBQUMsU0FBaUI7UUFDL0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsU0FBUyxFQUFFLEdBQUcsYUFBYSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQy9GLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVNLEtBQUssQ0FBQyxpQkFBaUI7UUFDNUIsTUFBTSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUvQixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLDZDQUFxQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFbkYsTUFBTSxLQUFLLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQzthQUNsQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN4RSxJQUFBLGdCQUFNLEVBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMxQixPQUFPLElBQUEscUJBQWUsRUFBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDaEUsQ0FBQztJQUVELElBQVcsa0JBQWtCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFJTSxhQUFhLENBQUMsVUFBNkI7UUFDaEQsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNqRCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdELENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxzQkFBc0IsQ0FBQyxVQUFrQjtRQUM5QyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQWdCO1FBQ25DLDRFQUE0RTtRQUM1RSxtQ0FBbUM7UUFDbkMsSUFBSSxDQUFDLElBQUEsNEJBQWlCLEdBQUUsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUV6RSxJQUFJLENBQUMsMkJBQTJCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFakQsd0RBQXdEO1lBQ3hELE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFBLHFCQUFlLEVBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RHLGlDQUFpQztZQUNqQyx3RUFBd0U7WUFDeEUsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakUsNkdBQTZHO1lBQzdHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUM7WUFFMUMsNkVBQTZFO1lBQzdFLE1BQU0sb0JBQW9CLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUEscUJBQWUsRUFBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4SCxpQ0FBaUM7WUFDakMsd0VBQXdFO1lBQ3hFLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVwRixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUN6QixHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDMUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO2dCQUMvRCxDQUFDO2dCQUNELE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNyQixDQUFDLENBQUMsQ0FDSCxDQUFDO1lBRUYseUVBQXlFO1lBQ3pFLDRCQUE0QjtZQUM1QixLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDMUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0QyxDQUFDO1FBQ0gsQ0FBQztRQUVELGtFQUFrRTtRQUNsRSw2Q0FBNkM7UUFDN0MsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLE1BQU0sT0FBTyxHQUFHLElBQUEsY0FBTSxFQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLFlBQVksc0RBQXNELENBQUMsQ0FBQztZQUMvRyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFjO1FBQzNDLE1BQU0sWUFBWSxHQUFHO1lBQ25CLG9CQUFvQixFQUFFLGVBQWUsRUFBRSxpQkFBaUI7WUFDeEQsc0JBQXNCLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CO1lBQzlELGVBQWU7WUFDZixvQkFBb0IsRUFBRSxxQ0FBcUM7WUFDM0QsaUJBQWlCLEVBQUUsNkJBQTZCO1lBQ2hELHdCQUF3QjtZQUN4Qiw4Q0FBOEM7WUFDOUMsMEJBQTBCLEVBQUUsb0JBQW9CO1lBQ2hELG9CQUFvQixFQUFFLGlCQUFpQjtZQUN2Qyw2QkFBNkIsRUFBRSx3QkFBd0I7WUFDdkQsMEJBQTBCO1NBQzNCLENBQUM7UUFFRixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLDZDQUFxQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFbkYsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO2FBQzNCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUM1RCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDcEUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsc0VBQXNFO0lBQ2xILENBQUM7SUFFTywyQkFBMkIsQ0FBQyxNQUFlO1FBQ2pELE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsaUZBQWlGLENBQUMsQ0FBQztZQUNyRyxDQUFDO1lBRUQsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDNUQsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFFNUQsT0FBTyxHQUFHLElBQUksR0FBRztnQkFDZixtQ0FBbUM7Z0JBQ25DLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDakIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTNhRCxrQ0EyYUM7QUFFRDs7Ozs7R0FLRztBQUNJLEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxPQUFvQjtJQUMzRCx3RUFBd0U7SUFDeEUsc0ZBQXNGO0lBQ3RGLDJCQUEyQjtJQUMzQixFQUFFO0lBQ0YsdUZBQXVGO0lBQ3ZGLHlHQUF5RztJQUN6RyxNQUFNLFlBQVksR0FBRyxTQUFTLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2xGLElBQUksZ0NBQWdDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7UUFDdkQsT0FBTztJQUNULENBQUM7SUFFRCxJQUFJLElBQUEsNEJBQWlCLEdBQUUsRUFBRSxDQUFDO1FBQ3hCLHlFQUF5RTtRQUN6RSwwRkFBMEY7UUFDMUYseUhBQXlIO1FBQ3pILGlEQUFpRDtRQUNqRCxNQUFNLGdDQUFnQyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoRSxDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sV0FBVyxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELG1FQUFtRTtJQUNuRSx1QkFBdUI7SUFDdkIsSUFBSSxDQUFDLElBQUEsNEJBQWlCLEdBQUUsRUFBRSxDQUFDO1FBQ3pCLGdDQUFnQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNyRCxDQUFDO0FBQ0gsQ0FBQztBQUVELEtBQUssVUFBVSxXQUFXLENBQUMsWUFBb0IsRUFBRSxPQUFvQixFQUFFLFlBQXFCO0lBQzFGLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSx3QkFBd0IsRUFBRSxpQkFBaUIsRUFBRSxZQUFZLENBQUMsRUFBRTtRQUMzRixNQUFNLEVBQUU7WUFDTixpQ0FBaUM7WUFDakMsaUJBQWlCLEVBQUUsR0FBRztZQUN0Qix3REFBd0Q7WUFDeEQscUVBQXFFO1lBQ3JFLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDOUM7UUFDRCxZQUFZO0tBQ2IsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELEtBQUssVUFBVSxnQ0FBZ0MsQ0FBQyxZQUFvQixFQUFFLE9BQW9CO0lBQ3hGLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM1QyxNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztJQUM3QixNQUFNLGVBQWUsR0FBRyx3QkFBd0IsT0FBTyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7SUFFaEYsNkVBQTZFO0lBQzdFLGtHQUFrRztJQUNsRyxNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7SUFFMUIsTUFBTSxXQUFXLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLGNBQWMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDdEUsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNaLE1BQU0sR0FBRyxHQUFHLE1BQU0sV0FBVyxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0QsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLGVBQWUsWUFBWSxlQUFlLENBQUMsRUFBRSxDQUFDO1lBQzdELE1BQU07UUFDUixDQUFDO1FBQ0QsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsZUFBZSxpQkFBaUIsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsK0JBQStCLENBQUMsRUFBRSxDQUFDO1lBQ3ZHLDJFQUEyRTtZQUMzRSxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxXQUFXLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztnQkFDdkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsWUFBWSxzREFBc0QsaUJBQWlCLGFBQWEsQ0FBQyxDQUFDO2dCQUM5SCxNQUFNLElBQUEsV0FBSyxFQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxDQUFDO2dCQUN0QyxTQUFTO1lBQ1gsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQzFELENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUksQ0FBSTtJQUN0QixPQUFPLENBQUMsS0FBSyxTQUFTLENBQUM7QUFDekIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsV0FBVyxDQUFDLElBQWM7SUFDakMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5RCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0ksS0FBSyxVQUFVLGtCQUFrQixDQUFDLE9BQW9CLEVBQUUsUUFBZ0M7SUFDN0YsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzFCLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBQSx1QkFBZ0IsRUFBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRS9ELHdFQUF3RTtRQUN4RSxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUN4QyxJQUFJLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDcEIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxjQUFjLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQy9FLElBQUksRUFBRSxpQkFBaUI7UUFDdkIsT0FBTyxFQUFFLElBQUk7UUFDYixPQUFPLEVBQUUsT0FBTztRQUNoQixlQUFlLEVBQUUsUUFBUTtLQUMxQixFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBRXpDLHdGQUF3RjtJQUN4RixzQ0FBc0M7SUFDdEMsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDO0lBQzFCLE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxjQUFjLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3RFLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDO0lBRTdCLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDWixJQUFJLENBQUM7WUFDSCw2Q0FBNkM7WUFDN0MsTUFBTSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNqRSxNQUFNO1FBQ1IsQ0FBQztRQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7WUFDaEIsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBRSxFQUFFLENBQUM7Z0JBQzVGLE9BQU8sQ0FBQyxHQUFHLENBQUMscURBQXFELGlCQUFpQixhQUFhLENBQUMsQ0FBQztnQkFDakcsTUFBTSxJQUFBLFdBQUssRUFBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsQ0FBQztnQkFDdEMsU0FBUztZQUNYLENBQUM7WUFDRCxNQUFNLENBQUMsQ0FBQztRQUNWLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sZ0NBQWdDLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgdHlwZSB7IFN0YWNrIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB7IERlc2NyaWJlU3RhY2tzQ29tbWFuZCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1jbG91ZGZvcm1hdGlvbic7XG5pbXBvcnQgeyBHZXRBdXRob3JpemF0aW9uVG9rZW5Db21tYW5kIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWVjci1wdWJsaWMnO1xuaW1wb3J0IHR5cGUgeyBBd3NDbGllbnRzIH0gZnJvbSAnLi9hd3MnO1xuaW1wb3J0IHsgb3V0cHV0RnJvbVN0YWNrLCBzbGVlcCB9IGZyb20gJy4vYXdzJztcbmltcG9ydCB0eXBlIHsgVGVzdENvbnRleHQgfSBmcm9tICcuL2ludGVnLXRlc3QnO1xuaW1wb3J0IHR5cGUgeyBJVGVzdENsaVNvdXJjZSwgSVRlc3RMaWJyYXJ5U291cmNlIH0gZnJvbSAnLi9wYWNrYWdlLXNvdXJjZXMvc291cmNlJztcbmltcG9ydCB7IHRlc3RTb3VyY2UgfSBmcm9tICcuL3BhY2thZ2Utc291cmNlcy9zdWJwcm9jZXNzJztcbmltcG9ydCB7IFJFU09VUkNFU19ESVIgfSBmcm9tICcuL3Jlc291cmNlcyc7XG5pbXBvcnQgdHlwZSB7IFNoZWxsT3B0aW9ucyB9IGZyb20gJy4vc2hlbGwnO1xuaW1wb3J0IHsgc2hlbGwsIFNoZWxsSGVscGVyLCByaW1yYWYgfSBmcm9tICcuL3NoZWxsJztcbmltcG9ydCB0eXBlIHsgQXdzQ29udGV4dCwgQXdzQ29udGV4dE9wdGlvbnMgfSBmcm9tICcuL3dpdGgtYXdzJztcbmltcG9ydCB7IGF0bW9zcGhlcmVFbmFibGVkLCB3aXRoQXdzIH0gZnJvbSAnLi93aXRoLWF3cyc7XG5pbXBvcnQgeyB3aXRoVGltZW91dCB9IGZyb20gJy4vd2l0aC10aW1lb3V0JztcbmltcG9ydCB7IGZpbmRZYXJuUGFja2FnZXMgfSBmcm9tICcuL3lhcm4nO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9URVNUX1RJTUVPVVRfUyA9IDIwICogNjA7XG5leHBvcnQgY29uc3QgRVhURU5ERURfVEVTVF9USU1FT1VUX1MgPSAzMCAqIDYwO1xuXG5leHBvcnQgaW50ZXJmYWNlIENka0FwcENvbnRleHRPcHRpb25zIHtcbiAgLyoqXG4gICAqIENvbmZpZ3VyZSB0aGUgQVdTIGNvbnRleHQgb2YgdGhlIGFwcC5cbiAgICovXG4gIHJlYWRvbmx5IGF3cz86IEF3c0NvbnRleHRPcHRpb25zO1xufVxuXG4vKipcbiAqIEhpZ2hlciBvcmRlciBmdW5jdGlvbiB0byBleGVjdXRlIGEgYmxvY2sgd2l0aCBhIENESyBhcHAgZml4dHVyZVxuICpcbiAqIFJlcXVpcmVzIGFuIEFXUyBjbGllbnQgdG8gYmUgcGFzc2VkIGluLlxuICpcbiAqIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIHRlc3RzIChzbyB3ZSBkb24ndCBoYXZlIHRvIGNoYW5nZVxuICogdG9vIG11Y2gpIHRoZSBpbm5lciBibG9jayBpcyBleHBlY3RlZCB0byB0YWtlIGEgYFRlc3RGaXh0dXJlYCBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoU3BlY2lmaWNDZGtBcHAoXG4gIGFwcE5hbWU6IHN0cmluZyxcbiAgYmxvY2s6IChjb250ZXh0OiBUZXN0Rml4dHVyZSkgPT4gUHJvbWlzZTx2b2lkPixcbik6IChjb250ZXh0OiBUZXN0Q29udGV4dCAmIEF3c0NvbnRleHQgJiBEaXNhYmxlQm9vdHN0cmFwQ29udGV4dCkgPT4gUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBhc3luYyAoY29udGV4dDogVGVzdENvbnRleHQgJiBBd3NDb250ZXh0ICYgRGlzYWJsZUJvb3RzdHJhcENvbnRleHQpID0+IHtcbiAgICBjb25zdCByYW5keSA9IGNvbnRleHQucmFuZG9tU3RyaW5nO1xuICAgIGNvbnN0IHN0YWNrTmFtZVByZWZpeCA9IGBjZGt0ZXN0LSR7cmFuZHl9YDtcbiAgICBjb25zdCBpbnRlZ1Rlc3REaXIgPSBwYXRoLmpvaW4ob3MudG1wZGlyKCksIGBjZGstaW50ZWctJHtyYW5keX1gKTtcblxuICAgIGNvbnRleHQub3V0cHV0LndyaXRlKGAgU3RhY2sgcHJlZml4OiAgICR7c3RhY2tOYW1lUHJlZml4fVxcbmApO1xuICAgIGNvbnRleHQub3V0cHV0LndyaXRlKGAgVGVzdCBkaXJlY3Rvcnk6ICR7aW50ZWdUZXN0RGlyfVxcbmApO1xuICAgIGNvbnRleHQub3V0cHV0LndyaXRlKGAgUmVnaW9uOiAgICAgICAgICR7Y29udGV4dC5hd3MucmVnaW9ufVxcbmApO1xuXG4gICAgYXdhaXQgY2xvbmVEaXJlY3RvcnkocGF0aC5qb2luKFJFU09VUkNFU19ESVIsICdjZGstYXBwcycsIGFwcE5hbWUpLCBpbnRlZ1Rlc3REaXIsIGNvbnRleHQub3V0cHV0KTtcbiAgICBjb25zdCBmaXh0dXJlID0gbmV3IFRlc3RGaXh0dXJlKFxuICAgICAgaW50ZWdUZXN0RGlyLFxuICAgICAgc3RhY2tOYW1lUHJlZml4LFxuICAgICAgY29udGV4dC5vdXRwdXQsXG4gICAgICBjb250ZXh0LmF3cyxcbiAgICAgIGNvbnRleHQucmFuZG9tU3RyaW5nKTtcbiAgICBhd2FpdCBmaXh0dXJlLmVjclB1YmxpY0xvZ2luKCk7XG5cbiAgICBsZXQgc3VjY2VzcyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGluc3RhbGxhdGlvblZlcnNpb24gPSBmaXh0dXJlLmxpYnJhcnkucmVxdWVzdGVkVmVyc2lvbigpO1xuXG4gICAgICBhd2FpdCBpbnN0YWxsTnBtUGFja2FnZXMoZml4dHVyZSwge1xuICAgICAgICAnYXdzLWNkay1saWInOiBpbnN0YWxsYXRpb25WZXJzaW9uLFxuICAgICAgICAnY29uc3RydWN0cyc6ICdeMTAnLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghY29udGV4dC5kaXNhYmxlQm9vdHN0cmFwKSB7XG4gICAgICAgIGF3YWl0IGVuc3VyZUJvb3RzdHJhcHBlZChmaXh0dXJlKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgYmxvY2soZml4dHVyZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc3VjY2VzcyA9IGZhbHNlO1xuICAgICAgdGhyb3cgZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52LklOVEVHX05PX0NMRUFOKSB7XG4gICAgICAgIGNvbnRleHQubG9nKGBMZWZ0IHRlc3QgZGlyZWN0b3J5IGluICcke2ludGVnVGVzdERpcn0nICgkSU5URUdfTk9fQ0xFQU4pXFxuYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBmaXh0dXJlLmRpc3Bvc2Uoc3VjY2Vzcyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIExpa2UgYHdpdGhTcGVjaWZpY0Nka0FwcGAsIGJ1dCB1c2VzIHRoZSBkZWZhdWx0IGludGVncmF0aW9uIHRlc3RpbmcgYXBwIHdpdGggYSBtaWxsaW9uIHN0YWNrcyBpbiBpdFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aENka0FwcChcbiAgYmxvY2s6IChjb250ZXh0OiBUZXN0Rml4dHVyZSkgPT4gUHJvbWlzZTx2b2lkPixcbik6IChjb250ZXh0OiBUZXN0Q29udGV4dCAmIEF3c0NvbnRleHQgJiBEaXNhYmxlQm9vdHN0cmFwQ29udGV4dCkgPT4gUHJvbWlzZTx2b2lkPiB7XG4gIC8vICdhcHAnIGlzIHRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IGludGVncmF0aW9uIGFwcCBpbiB0aGUgYGNkay1hcHBzYCBkaXJlY3RvcnlcbiAgcmV0dXJuIHdpdGhTcGVjaWZpY0Nka0FwcCgnYXBwJywgYmxvY2spO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aENka01pZ3JhdGVBcHAoXG4gIGxhbmd1YWdlOiBzdHJpbmcsXG4gIGJsb2NrOiAoY29udGV4dDogVGVzdEZpeHR1cmUpID0+IFByb21pc2U8dm9pZD4sXG4pOiAoY29udGV4dDogVGVzdENvbnRleHQgJiBBd3NDb250ZXh0ICYgRGlzYWJsZUJvb3RzdHJhcENvbnRleHQpID0+IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gYXN5bmMgKGNvbnRleHQ6IFRlc3RDb250ZXh0ICYgQXdzQ29udGV4dCAmIERpc2FibGVCb290c3RyYXBDb250ZXh0KSA9PiB7XG4gICAgY29uc3Qgc3RhY2tOYW1lID0gYGNkay1taWdyYXRlLSR7bGFuZ3VhZ2V9LWludGVnLSR7Y29udGV4dC5yYW5kb21TdHJpbmd9YDtcbiAgICBjb25zdCBpbnRlZ1Rlc3REaXIgPSBwYXRoLmpvaW4ob3MudG1wZGlyKCksIGBjZGstbWlncmF0ZS0ke2xhbmd1YWdlfS1pbnRlZy0ke2NvbnRleHQucmFuZG9tU3RyaW5nfWApO1xuXG4gICAgY29udGV4dC5vdXRwdXQud3JpdGUoYCBTdGFjayBuYW1lOiAgICR7c3RhY2tOYW1lfVxcbmApO1xuICAgIGNvbnRleHQub3V0cHV0LndyaXRlKGAgVGVzdCBkaXJlY3Rvcnk6ICR7aW50ZWdUZXN0RGlyfVxcbmApO1xuXG4gICAgZnMubWtkaXJTeW5jKGludGVnVGVzdERpcik7XG4gICAgY29uc3QgZml4dHVyZSA9IG5ldyBUZXN0Rml4dHVyZShcbiAgICAgIGludGVnVGVzdERpcixcbiAgICAgIHN0YWNrTmFtZSxcbiAgICAgIGNvbnRleHQub3V0cHV0LFxuICAgICAgY29udGV4dC5hd3MsXG4gICAgICBjb250ZXh0LnJhbmRvbVN0cmluZyxcbiAgICApO1xuICAgIGF3YWl0IGZpeHR1cmUuZWNyUHVibGljTG9naW4oKTtcblxuICAgIGF3YWl0IGVuc3VyZUJvb3RzdHJhcHBlZChmaXh0dXJlKTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrTWlncmF0ZShsYW5ndWFnZSwgc3RhY2tOYW1lKTtcblxuICAgIGNvbnN0IHRlc3RGaXh0dXJlID0gbmV3IFRlc3RGaXh0dXJlKFxuICAgICAgcGF0aC5qb2luKGludGVnVGVzdERpciwgc3RhY2tOYW1lKSxcbiAgICAgIHN0YWNrTmFtZSxcbiAgICAgIGNvbnRleHQub3V0cHV0LFxuICAgICAgY29udGV4dC5hd3MsXG4gICAgICBjb250ZXh0LnJhbmRvbVN0cmluZyxcbiAgICApO1xuXG4gICAgbGV0IHN1Y2Nlc3MgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBibG9jayh0ZXN0Rml4dHVyZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc3VjY2VzcyA9IGZhbHNlO1xuICAgICAgdGhyb3cgZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52LklOVEVHX05PX0NMRUFOKSB7XG4gICAgICAgIGNvbnRleHQubG9nKGBMZWZ0IHRlc3QgZGlyZWN0b3J5IGluICcke2ludGVnVGVzdERpcn0nICgkSU5URUdfTk9fQ0xFQU4pYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBmaXh0dXJlLmRpc3Bvc2Uoc3VjY2Vzcyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIERlZmF1bHQgdGVzdCBmaXh0dXJlIGZvciBtb3N0IChhbGw/KSBpbnRlZyB0ZXN0c1xuICpcbiAqIEl0J3MgYSBjb21wb3NpdGlvbiBvZiB3aXRoQXdzL3dpdGhDZGtBcHAsIGV4cGVjdGluZyB0aGUgdGVzdCBibG9jayB0byB0YWtlIGEgYFRlc3RGaXh0dXJlYFxuICogb2JqZWN0LlxuICpcbiAqIFdlIGNvdWxkIGhhdmUgcHV0IGB3aXRoQXdzKHdpdGhDZGtBcHAoZml4dHVyZSA9PiB7IC8uLi4gYWN0dWFsIHRlc3QgaGVyZS4uLi8gfSkpYCBpbiBldmVyeVxuICogdGVzdCBkZWNsYXJhdGlvbiBidXQgY2VudHJhbGl6aW5nIGl0IGlzIGdvaW5nIHRvIG1ha2UgaXQgY29udmVuaWVudCB0byBtb2RpZnkgaW4gdGhlIGZ1dHVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhEZWZhdWx0Rml4dHVyZShibG9jazogKGNvbnRleHQ6IFRlc3RGaXh0dXJlKSA9PiBQcm9taXNlPHZvaWQ+LCBvcHRpb25zOiBDZGtBcHBDb250ZXh0T3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiB3aXRoQXdzKHdpdGhUaW1lb3V0KERFRkFVTFRfVEVTVF9USU1FT1VUX1MsIHdpdGhDZGtBcHAoYmxvY2spKSwgb3B0aW9ucy5hd3MpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aFNwZWNpZmljRml4dHVyZShhcHBOYW1lOiBzdHJpbmcsIGJsb2NrOiAoY29udGV4dDogVGVzdEZpeHR1cmUpID0+IFByb21pc2U8dm9pZD4sIG9wdGlvbnM6IENka0FwcENvbnRleHRPcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIHdpdGhBd3Mod2l0aFRpbWVvdXQoREVGQVVMVF9URVNUX1RJTUVPVVRfUywgd2l0aFNwZWNpZmljQ2RrQXBwKGFwcE5hbWUsIGJsb2NrKSksIG9wdGlvbnMuYXdzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhFeHRlbmRlZFRpbWVvdXRGaXh0dXJlKGJsb2NrOiAoY29udGV4dDogVGVzdEZpeHR1cmUpID0+IFByb21pc2U8dm9pZD4sIG9wdGlvbnM6IENka0FwcENvbnRleHRPcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIHdpdGhBd3Mod2l0aFRpbWVvdXQoRVhURU5ERURfVEVTVF9USU1FT1VUX1MsIHdpdGhDZGtBcHAoYmxvY2spKSwgb3B0aW9ucy5hd3MpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aENES01pZ3JhdGVGaXh0dXJlKGxhbmd1YWdlOiBzdHJpbmcsIGJsb2NrOiAoY29udGVudDogVGVzdEZpeHR1cmUpID0+IFByb21pc2U8dm9pZD4sIG9wdGlvbnM6IENka0FwcENvbnRleHRPcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIHdpdGhBd3Mod2l0aFRpbWVvdXQoREVGQVVMVF9URVNUX1RJTUVPVVRfUywgd2l0aENka01pZ3JhdGVBcHAobGFuZ3VhZ2UsIGJsb2NrKSksIG9wdGlvbnMuYXdzKTtcbn1cblxuLyoqXG4gKiBSZXRyeSB3cmFwcGVyIHRoYXQgZXhlY3V0ZXMgYSB0ZXN0IGNhbGxiYWNrIHVwIHRvIG1heEF0dGVtcHRzIHRpbWVzXG4gKlxuICogSWYgYW55IGF0dGVtcHQgc3VjY2VlZHMsIGl0IHJldHVybnMgaW1tZWRpYXRlbHkuIElmIGFsbCBhdHRlbXB0cyBmYWlsLFxuICogaXQgdGhyb3dzIHRoZSBsYXN0IGVycm9yIGVuY291bnRlcmVkLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUmV0cnk8VCBleHRlbmRzIFRlc3RDb250ZXh0PihcbiAgY2FsbGJhY2s6IChjb250ZXh0OiBUKSA9PiBQcm9taXNlPHZvaWQ+LFxuICBtYXhBdHRlbXB0czogbnVtYmVyID0gMixcbik6IChjb250ZXh0OiBUKSA9PiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGFzeW5jIChjb250ZXh0OiBUKSA9PiB7XG4gICAgbGV0IGxhc3RFcnJvcjtcblxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG1heEF0dGVtcHRzOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNhbGxiYWNrKGNvbnRleHQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvcjtcbiAgICAgICAgaWYgKGF0dGVtcHQgPCBtYXhBdHRlbXB0cykge1xuICAgICAgICAgIGNvbnRleHQubG9nKGBBdHRlbXB0ICR7YXR0ZW1wdH0vJHttYXhBdHRlbXB0c30gZmFpbGVkOiAke2Vycm9yfS4gUmV0cnlpbmcuLi5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IGxhc3RFcnJvcjtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEaXNhYmxlQm9vdHN0cmFwQ29udGV4dCB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRpc2FibGUgY3JlYXRpbmcgdGhlIGRlZmF1bHQgYm9vdHN0cmFwXG4gICAqIHN0YWNrIHByaW9yIHRvIHJ1bm5pbmcgdGhlIHRlc3RcbiAgICpcbiAgICogVGhpcyBzaG91bGQgYmUgc2V0IHRvIHRydWUgd2hlbiBydW5uaW5nIHRlc3RzIHRoYXRcbiAgICogZXhwbGljaXRseSBjcmVhdGUgYSBib290c3RyYXAgc3RhY2tcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGRpc2FibGVCb290c3RyYXA/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRvIGJlIHVzZWQgaW4gcGxhY2Ugb2YgYHdpdGhEZWZhdWx0Rml4dHVyZWAgd2hlbiB0aGUgdGVzdFxuICogc2hvdWxkIG5vdCBjcmVhdGUgdGhlIGRlZmF1bHQgYm9vdHN0cmFwIHN0YWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRob3V0Qm9vdHN0cmFwKGJsb2NrOiAoY29udGV4dDogVGVzdEZpeHR1cmUpID0+IFByb21pc2U8dm9pZD4sIG9wdGlvbnM6IENka0FwcENvbnRleHRPcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIHdpdGhBd3Mod2l0aENka0FwcChibG9jayksIHtcbiAgICAuLi5vcHRpb25zLmF3cyxcbiAgICBkaXNhYmxlQm9vdHN0cmFwOiB0cnVlLFxuICB9KTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDZGtDbGlPcHRpb25zIGV4dGVuZHMgU2hlbGxPcHRpb25zIHtcbiAgb3B0aW9ucz86IHN0cmluZ1tdO1xuICBuZXZlclJlcXVpcmVBcHByb3ZhbD86IGJvb2xlYW47XG4gIHZlcmJvc2U/OiBib29sZWFuO1xuICB2ZXJib3NlTGV2ZWw/OiBudW1iZXI7XG4gIHRlbGVtZXRyeUZpbGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2RrRGVzdHJveUNsaU9wdGlvbnMgZXh0ZW5kcyBDZGtDbGlPcHRpb25zIHtcbiAgcmVhZG9ubHkgZm9yY2U/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFByZXBhcmUgYSB0YXJnZXQgZGlyIGJ5cmVwbGljYXRpbmcgYSBzb3VyY2UgZGlyZWN0b3J5XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbG9uZURpcmVjdG9yeShzb3VyY2U6IHN0cmluZywgdGFyZ2V0OiBzdHJpbmcsIG91dHB1dD86IE5vZGVKUy5Xcml0YWJsZVN0cmVhbSkge1xuICBhd2FpdCBzaGVsbChbJ3JtJywgJy1yZicsIHRhcmdldF0sIHsgb3V0cHV0czogb3V0cHV0ID8gW291dHB1dF0gOiBbXSB9KTtcbiAgYXdhaXQgc2hlbGwoWydta2RpcicsICctcCcsIHRhcmdldF0sIHsgb3V0cHV0czogb3V0cHV0ID8gW291dHB1dF0gOiBbXSB9KTtcbiAgYXdhaXQgc2hlbGwoWydjcCcsICctUicsIHNvdXJjZSArICcvKicsIHRhcmdldF0sIHsgb3V0cHV0czogb3V0cHV0ID8gW291dHB1dF0gOiBbXSB9KTtcbn1cblxuaW50ZXJmYWNlIENvbW1vbkNka0Jvb3RzdHJhcENvbW1hbmRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFBhdGggdG8gYSBjdXN0b20gYm9vdHN0cmFwIHRlbXBsYXRlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBkZWZhdWx0IENESyBib290c3RyYXAgdGVtcGxhdGUuXG4gICAqL1xuICByZWFkb25seSBib290c3RyYXBUZW1wbGF0ZT86IHN0cmluZztcblxuICByZWFkb25seSB0b29sa2l0U3RhY2tOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSB2ZXJib3NlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlZmF1bHQgLSBhdXRvLWdlbmVyYXRlZCBDbG91ZEZvcm1hdGlvbiBuYW1lXG4gICAqL1xuICByZWFkb25seSBib290c3RyYXBCdWNrZXROYW1lPzogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IGNsaU9wdGlvbnM/OiBDZGtDbGlPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGRlZmF1bHQgQ0RLIHF1YWxpZmllclxuICAgKi9cbiAgcmVhZG9ubHkgcXVhbGlmaWVyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENka0xlZ2FjeUJvb3RzdHJhcENvbW1hbmRPcHRpb25zIGV4dGVuZHMgQ29tbW9uQ2RrQm9vdHN0cmFwQ29tbWFuZE9wdGlvbnMge1xuICAvKipcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IG5vRXhlY3V0ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHB1YmxpY0FjY2Vzc0Jsb2NrQ29uZmlndXJhdGlvbj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2RrTW9kZXJuQm9vdHN0cmFwQ29tbWFuZE9wdGlvbnMgZXh0ZW5kcyBDb21tb25DZGtCb290c3RyYXBDb21tYW5kT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZm9yY2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGNmbkV4ZWN1dGlvblBvbGljeT86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHNob3dUZW1wbGF0ZT86IGJvb2xlYW47XG5cbiAgcmVhZG9ubHkgdGVtcGxhdGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSB0ZXJtaW5hdGlvblByb3RlY3Rpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IGV4YW1wbGVQZXJtaXNzaW9uc0JvdW5kYXJ5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICByZWFkb25seSBjdXN0b21QZXJtaXNzaW9uc0JvdW5kYXJ5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBkZW55RXh0ZXJuYWxJZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgdXNlUHJldmlvdXNQYXJhbWV0ZXJzPzogYm9vbGVhbjtcblxuICByZWFkb25seSB0cnVzdD86IHN0cmluZ1tdO1xuXG4gIHJlYWRvbmx5IHVudHJ1c3Q/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDZGtHYXJiYWdlQ29sbGVjdGlvbkNvbW1hbmRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBhbW91bnQgb2YgZGF5cyBhbiBhc3NldCBzaG91bGQgc3RheSBpc29sYXRlZCBiZWZvcmUgZGVsZXRpb24sIHRvXG4gICAqIGd1YXJkIGFnYWluc3Qgc29tZSBwaXBlbGluZSByb2xsYmFjayBzY2VuYXJpb3NcbiAgICpcbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgcmVhZG9ubHkgcm9sbGJhY2tCdWZmZXJEYXlzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBhc3NldCB0aGF0IGlzIGdldHRpbmcgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdhbGwnXG4gICAqL1xuICByZWFkb25seSB0eXBlPzogJ2VjcicgfCAnczMnIHwgJ2FsbCc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBib290c3RyYXAgc3RhY2tcbiAgICpcbiAgICogQGRlZmF1bHQgJ0Nka1Rvb2xraXQnXG4gICAqL1xuICByZWFkb25seSBib290c3RyYXBTdGFja05hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBUZXN0Rml4dHVyZSBleHRlbmRzIFNoZWxsSGVscGVyIHtcbiAgcHVibGljIHJlYWRvbmx5IHF1YWxpZmllcjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGJ1Y2tldHNUb0RlbGV0ZSA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gIHB1YmxpYyByZWFkb25seSBjbGk6IElUZXN0Q2xpU291cmNlO1xuICBwdWJsaWMgcmVhZG9ubHkgY2RrQXNzZXRzOiBJVGVzdENsaVNvdXJjZTtcbiAgcHVibGljIHJlYWRvbmx5IGxpYnJhcnk6IElUZXN0TGlicmFyeVNvdXJjZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgaW50ZWdUZXN0RGlyOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHN0YWNrTmFtZVByZWZpeDogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBvdXRwdXQ6IE5vZGVKUy5Xcml0YWJsZVN0cmVhbSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgYXdzOiBBd3NDbGllbnRzLFxuICAgIHB1YmxpYyByZWFkb25seSByYW5kb21TdHJpbmc6IHN0cmluZykge1xuICAgIHN1cGVyKGludGVnVGVzdERpciwgb3V0cHV0KTtcblxuICAgIHRoaXMucXVhbGlmaWVyID0gdGhpcy5yYW5kb21TdHJpbmcuc2xpY2UoMCwgMTApO1xuICAgIHRoaXMuY2xpID0gdGVzdFNvdXJjZSgnY2xpJyk7XG4gICAgdGhpcy5jZGtBc3NldHMgPSB0ZXN0U291cmNlKCdjZGtBc3NldHMnKTtcbiAgICB0aGlzLmxpYnJhcnkgPSB0ZXN0U291cmNlKCdsaWJyYXJ5Jyk7XG4gIH1cblxuICBwdWJsaWMgbG9nKHM6IHN0cmluZykge1xuICAgIHRoaXMub3V0cHV0LndyaXRlKGAke3N9XFxuYCk7XG4gIH1cblxuICAvKipcbiAgICogTG9naW4gdG8gdGhlIHB1YmxpYyBFQ1IgZ2FsbGVyeSB1c2luZyB0aGUgY3VycmVudCBBV1MgY3JlZGVudGlhbHMuXG4gICAqIFVzZSB0aGlzIGlmIHlvdXIgdGVzdCBuZWVkcyB0byBkaXJlY3RseSBwdWxsIGltYWdlcyBvdXRzaWRlIG9mIGEgYGNka2Agb3IgYGNkay1hc3NldHNgIGNvbW1hbmQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZWNyUHVibGljTG9naW4oKSB7XG4gICAgY29uc3QgdG9rZW5SZXNwb25zZSA9IGF3YWl0IHRoaXMuYXdzLmVjclB1YmxpYy5zZW5kKG5ldyBHZXRBdXRob3JpemF0aW9uVG9rZW5Db21tYW5kKHt9KSk7XG4gICAgY29uc3QgYXV0aERhdGEgPSB0b2tlblJlc3BvbnNlLmF1dGhvcml6YXRpb25EYXRhPy5hdXRob3JpemF0aW9uVG9rZW47XG5cbiAgICBjb25zdCBkb2NrZXIgPSBwcm9jZXNzLmVudi5DREtfRE9DS0VSID8/ICdkb2NrZXInO1xuXG4gICAgaWYgKCFhdXRoRGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgcmV0cmlldmUgRUNSIHB1YmxpYyBhdXRoIHRva2VuLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY29kZWQgPSBCdWZmZXIuZnJvbShhdXRoRGF0YSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCd1dGYtOCcpO1xuICAgIGNvbnN0IFt1c2VybmFtZSwgcGFzc3dvcmRdID0gZGVjb2RlZC5zcGxpdCgnOicpO1xuXG4gICAgYXdhaXQgdGhpcy5zaGVsbChbZG9ja2VyLCAnbG9naW4nLFxuICAgICAgJy0tdXNlcm5hbWUnLCB1c2VybmFtZSxcbiAgICAgICctLXBhc3N3b3JkJywgJyR7RUNSX1BBU1NXT1JEfScsXG4gICAgICAncHVibGljLmVjci5hd3MnXSwge1xuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBtb2RFbnY6IHtcbiAgICAgICAgRUNSX1BBU1NXT1JEOiBwYXNzd29yZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgdGhlIGNhcHR1cmVkIG91dHB1dCBvZiB0aGUgZGVwbG95IGNvbW1hbmQuXG4gICAqICEhISBETyBOT1QgYXNzdW1lIHRoaXMgaXMgdGhlIHN0YWNrJ3MgQVJOLiBJdCB3aWxsIGNvbnRhaW4gb3RoZXIgb3V0cHV0LiAhISFcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjZGtEZXBsb3koc3RhY2tOYW1lczogc3RyaW5nIHwgc3RyaW5nW10sIG9wdGlvbnM6IENka0NsaU9wdGlvbnMgPSB7fSwgc2tpcFN0YWNrUmVuYW1lPzogYm9vbGVhbikge1xuICAgIHJldHVybiB0aGlzLmNkayh0aGlzLmNka0RlcGxveUNvbW1hbmRMaW5lKHN0YWNrTmFtZXMsIG9wdGlvbnMsIHNraXBTdGFja1JlbmFtZSksIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGNka0RlcGxveUNvbW1hbmRMaW5lKHN0YWNrTmFtZXM6IHN0cmluZyB8IHN0cmluZ1tdLCBvcHRpb25zOiBDZGtDbGlPcHRpb25zID0ge30sIHNraXBTdGFja1JlbmFtZT86IGJvb2xlYW4pIHtcbiAgICBzdGFja05hbWVzID0gdHlwZW9mIHN0YWNrTmFtZXMgPT09ICdzdHJpbmcnID8gW3N0YWNrTmFtZXNdIDogc3RhY2tOYW1lcztcbiAgICBjb25zdCBuZXZlclJlcXVpcmVBcHByb3ZhbCA9IG9wdGlvbnMubmV2ZXJSZXF1aXJlQXBwcm92YWwgPz8gdHJ1ZTtcblxuICAgIHJldHVybiBbXG4gICAgICAnZGVwbG95JyxcbiAgICAgIC4uLihuZXZlclJlcXVpcmVBcHByb3ZhbCA/IFsnLS1yZXF1aXJlLWFwcHJvdmFsPW5ldmVyJ10gOiBbXSksIC8vIERlZmF1bHQgdG8gbm8gYXBwcm92YWwgaW4gYW4gdW5hdHRlbmRlZCB0ZXN0XG4gICAgICAuLi4ob3B0aW9ucy5vcHRpb25zID8/IFtdKSxcbiAgICAgIC8vIHVzZSBldmVudHMgYmVjYXVzZSBiYXIgcmVuZGVycyBiYWQgaW4gdGVzdHNcbiAgICAgICctLXByb2dyZXNzJywgJ2V2ZW50cycsXG4gICAgICAuLi4oc2tpcFN0YWNrUmVuYW1lID8gc3RhY2tOYW1lcyA6IHRoaXMuZnVsbFN0YWNrTmFtZShzdGFja05hbWVzKSksXG4gICAgICAuLi4ob3B0aW9ucy50ZWxlbWV0cnlGaWxlID8gW2AtLXRlbGVtZXRyeS1maWxlPSR7b3B0aW9ucy50ZWxlbWV0cnlGaWxlfWBdIDogW10pLFxuICAgIF07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2RrU3ludGgob3B0aW9uczogQ2RrQ2xpT3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuY2RrKFtcbiAgICAgICdzeW50aCcsXG4gICAgICAuLi4ob3B0aW9ucy50ZWxlbWV0cnlGaWxlID8gW2AtLXRlbGVtZXRyeS1maWxlPSR7b3B0aW9ucy50ZWxlbWV0cnlGaWxlfWBdIDogW10pLFxuICAgICAgLi4uKG9wdGlvbnMub3B0aW9ucyA/PyBbXSksXG4gICAgXSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2RrUmVmYWN0b3Iob3B0aW9uczogQ2RrQ2xpT3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuY2RrKFtcbiAgICAgICdyZWZhY3RvcicsXG4gICAgICAuLi4ob3B0aW9ucy5vcHRpb25zID8/IFtdKSxcbiAgICBdLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjZGtEZXN0cm95KHN0YWNrTmFtZXM6IHN0cmluZyB8IHN0cmluZ1tdLCBvcHRpb25zOiBDZGtEZXN0cm95Q2xpT3B0aW9ucyA9IHt9KSB7XG4gICAgc3RhY2tOYW1lcyA9IHR5cGVvZiBzdGFja05hbWVzID09PSAnc3RyaW5nJyA/IFtzdGFja05hbWVzXSA6IHN0YWNrTmFtZXM7XG5cbiAgICAvLyBkZWZhdWx0IHRvIHRydWUgYmVjYXVzZSBtb3N0IHRlc3RzIGRvbid0IHRlc3QgdXNlciBpbnRlcmFjdGlvblxuICAgIGNvbnN0IGZvcmNlID0gb3B0aW9ucy5mb3JjZSA/PyB0cnVlO1xuXG4gICAgcmV0dXJuIHRoaXMuY2RrKFsnZGVzdHJveScsXG4gICAgICAuLi4oZm9yY2UgPyBbJy1mJ10gOiBbXSksIC8vIHBhc3MgLWYgaWYgdXNlciBpbnRlcmFjdGlvbiBpcyBub3QgZGVzaXJlZFxuICAgICAgLi4uKG9wdGlvbnMub3B0aW9ucyA/PyBbXSksXG4gICAgICAuLi50aGlzLmZ1bGxTdGFja05hbWUoc3RhY2tOYW1lcyldLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjZGtCb290c3RyYXBMZWdhY3kob3B0aW9uczogQ2RrTGVnYWN5Qm9vdHN0cmFwQ29tbWFuZE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGFyZ3MgPSBbJ2Jvb3RzdHJhcCddO1xuXG4gICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgYXJncy5wdXNoKCctdicpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJy0tdG9vbGtpdC1zdGFjay1uYW1lJywgb3B0aW9ucy50b29sa2l0U3RhY2tOYW1lKTtcbiAgICBpZiAob3B0aW9ucy5ib290c3RyYXBCdWNrZXROYW1lKSB7XG4gICAgICBhcmdzLnB1c2goJy0tYm9vdHN0cmFwLWJ1Y2tldC1uYW1lJywgb3B0aW9ucy5ib290c3RyYXBCdWNrZXROYW1lKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMubm9FeGVjdXRlKSB7XG4gICAgICBhcmdzLnB1c2goJy0tbm8tZXhlY3V0ZScpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5wdWJsaWNBY2Nlc3NCbG9ja0NvbmZpZ3VyYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXJncy5wdXNoKCctLXB1YmxpYy1hY2Nlc3MtYmxvY2stY29uZmlndXJhdGlvbicsIG9wdGlvbnMucHVibGljQWNjZXNzQmxvY2tDb25maWd1cmF0aW9uLnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy50YWdzKSB7XG4gICAgICBhcmdzLnB1c2goJy0tdGFncycsIG9wdGlvbnMudGFncyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2RrKGFyZ3MsIHtcbiAgICAgIC4uLm9wdGlvbnMuY2xpT3B0aW9ucyxcbiAgICAgIG1vZEVudjoge1xuICAgICAgICAuLi5vcHRpb25zLmNsaU9wdGlvbnM/Lm1vZEVudixcbiAgICAgICAgLy8gc28gdGhhdCB0aGlzIHdvcmtzIGZvciBWMixcbiAgICAgICAgLy8gd2hlcmUgdGhlIFwibmV3XCIgYm9vdHN0cmFwIGlzIHRoZSBkZWZhdWx0XG4gICAgICAgIENES19MRUdBQ1lfQk9PVFNUUkFQOiAnMScsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNka0Jvb3RzdHJhcE1vZGVybihvcHRpb25zOiBDZGtNb2Rlcm5Cb290c3RyYXBDb21tYW5kT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgYXJncyA9IFsnYm9vdHN0cmFwJ107XG5cbiAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICBhcmdzLnB1c2goJy12Jyk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnNob3dUZW1wbGF0ZSkge1xuICAgICAgYXJncy5wdXNoKCctLXNob3ctdGVtcGxhdGUnKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMudGVtcGxhdGUpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS10ZW1wbGF0ZScsIG9wdGlvbnMudGVtcGxhdGUpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJy0tdG9vbGtpdC1zdGFjay1uYW1lJywgb3B0aW9ucy50b29sa2l0U3RhY2tOYW1lKTtcbiAgICBpZiAob3B0aW9ucy5ib290c3RyYXBCdWNrZXROYW1lKSB7XG4gICAgICBhcmdzLnB1c2goJy0tYm9vdHN0cmFwLWJ1Y2tldC1uYW1lJywgb3B0aW9ucy5ib290c3RyYXBCdWNrZXROYW1lKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKCctLXF1YWxpZmllcicsIG9wdGlvbnMucXVhbGlmaWVyID8/IHRoaXMucXVhbGlmaWVyKTtcbiAgICBpZiAob3B0aW9ucy5jZm5FeGVjdXRpb25Qb2xpY3kpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1jbG91ZGZvcm1hdGlvbi1leGVjdXRpb24tcG9saWNpZXMnLCBvcHRpb25zLmNmbkV4ZWN1dGlvblBvbGljeSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRlcm1pbmF0aW9uUHJvdGVjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhcmdzLnB1c2goJy0tdGVybWluYXRpb24tcHJvdGVjdGlvbicsIG9wdGlvbnMudGVybWluYXRpb25Qcm90ZWN0aW9uLnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5mb3JjZSkge1xuICAgICAgYXJncy5wdXNoKCctLWZvcmNlJyk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRhZ3MpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS10YWdzJywgb3B0aW9ucy50YWdzKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuY3VzdG9tUGVybWlzc2lvbnNCb3VuZGFyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhcmdzLnB1c2goJy0tY3VzdG9tLXBlcm1pc3Npb25zLWJvdW5kYXJ5Jywgb3B0aW9ucy5jdXN0b21QZXJtaXNzaW9uc0JvdW5kYXJ5KTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZXhhbXBsZVBlcm1pc3Npb25zQm91bmRhcnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXJncy5wdXNoKCctLWV4YW1wbGUtcGVybWlzc2lvbnMtYm91bmRhcnknKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZGVueUV4dGVybmFsSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXJncy5wdXNoKG9wdGlvbnMuZGVueUV4dGVybmFsSWQgPyAnLS1kZW55LWV4dGVybmFsLWlkJyA6ICctLW5vLWRlbnktZXh0ZXJuYWwtaWQnKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy51c2VQcmV2aW91c1BhcmFtZXRlcnMgPT09IGZhbHNlKSB7XG4gICAgICBhcmdzLnB1c2goJy0tbm8tcHJldmlvdXMtcGFyYW1ldGVycycpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5ib290c3RyYXBUZW1wbGF0ZSkge1xuICAgICAgYXJncy5wdXNoKCctLXRlbXBsYXRlJywgb3B0aW9ucy5ib290c3RyYXBUZW1wbGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMudHJ1c3QgIT0gbnVsbCkge1xuICAgICAgYXJncy5wdXNoKCctLXRydXN0Jywgb3B0aW9ucy50cnVzdC5qb2luKCcsJykpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy51bnRydXN0ICE9IG51bGwpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS11bnRydXN0Jywgb3B0aW9ucy51bnRydXN0LmpvaW4oJywnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2RrKGFyZ3MsIHtcbiAgICAgIC4uLm9wdGlvbnMuY2xpT3B0aW9ucyxcbiAgICAgIG1vZEVudjoge1xuICAgICAgICAuLi5vcHRpb25zLmNsaU9wdGlvbnM/Lm1vZEVudixcbiAgICAgICAgLy8gc28gdGhhdCB0aGlzIHdvcmtzIGZvciBWMSxcbiAgICAgICAgLy8gd2hlcmUgdGhlIFwib2xkXCIgYm9vdHN0cmFwIGlzIHRoZSBkZWZhdWx0XG4gICAgICAgIENES19ORVdfQk9PVFNUUkFQOiAnMScsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNka0dhcmJhZ2VDb2xsZWN0KG9wdGlvbnM6IENka0dhcmJhZ2VDb2xsZWN0aW9uQ29tbWFuZE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGFyZ3MgPSBbXG4gICAgICAnZ2MnLFxuICAgICAgJy0tdW5zdGFibGU9Z2MnLCAvLyBUT0RPOiByZW1vdmUgd2hlbiBzdGFiaWxpemluZ1xuICAgICAgJy0tY29uZmlybT1mYWxzZScsXG4gICAgICAnLS1jcmVhdGVkLWJ1ZmZlci1kYXlzPTAnLCAvLyBPdGhlcndpc2UgYWxsIGFzc2V0cyBjcmVhdGVkIGR1cmluZyBpbnRlZyB0ZXN0cyBhcmUgdG9vIHlvdW5nXG4gICAgXTtcbiAgICBpZiAob3B0aW9ucy5yb2xsYmFja0J1ZmZlckRheXMpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS1yb2xsYmFjay1idWZmZXItZGF5cycsIFN0cmluZyhvcHRpb25zLnJvbGxiYWNrQnVmZmVyRGF5cykpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy50eXBlKSB7XG4gICAgICBhcmdzLnB1c2goJy0tdHlwZScsIG9wdGlvbnMudHlwZSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmJvb3RzdHJhcFN0YWNrTmFtZSkge1xuICAgICAgYXJncy5wdXNoKCctLWJvb3RzdHJhcFN0YWNrTmFtZScsIG9wdGlvbnMuYm9vdHN0cmFwU3RhY2tOYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jZGsoYXJncyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2RrTWlncmF0ZShsYW5ndWFnZTogc3RyaW5nLCBzdGFja05hbWU6IHN0cmluZywgaW5wdXRQYXRoPzogc3RyaW5nLCBvcHRpb25zPzogQ2RrQ2xpT3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLmNkayhbXG4gICAgICAnbWlncmF0ZScsXG4gICAgICAnLS1sYW5ndWFnZScsXG4gICAgICBsYW5ndWFnZSxcbiAgICAgICctLXN0YWNrLW5hbWUnLFxuICAgICAgc3RhY2tOYW1lLFxuICAgICAgJy0tZnJvbS1wYXRoJyxcbiAgICAgIGlucHV0UGF0aCA/PyBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAncmVzb3VyY2VzJywgJ3RlbXBsYXRlcycsICdzcXMtdGVtcGxhdGUuanNvbicpLnRvU3RyaW5nKCksXG4gICAgICAuLi4ob3B0aW9ucz8ub3B0aW9ucyA/PyBbXSksXG4gICAgXSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2RrKGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zOiBDZGtDbGlPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB2ZXJib3NlID0gb3B0aW9ucy52ZXJib3NlID8/IHRydWU7XG5cbiAgICBpZiAoIXZlcmJvc2UgJiYgb3B0aW9ucy52ZXJib3NlTGV2ZWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB2ZXJib3NlIHN0YXRlOiB2ZXJib3NlIGlzIGZhbHNlIGFuZCB2ZXJib3NlTGV2ZWwgaXMgJHtvcHRpb25zLnZlcmJvc2VMZXZlbH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCB2ZXJib3NlTGV2ZWwgPSBvcHRpb25zLnZlcmJvc2VMZXZlbCA/PyAxO1xuXG4gICAgLy8gV2hlbiAnLS1qc29uJyBpcyByZXF1ZXN0ZWQsIHRoZSByZXR1cm5lZCBvdXRwdXQgbXVzdCBiZSB2YWxpZCBKU09OLiBDREsgd3JpdGVzIGl0cyBkYXRhXG4gICAgLy8gb3V0cHV0IHRvIHN0ZG91dCBhbmQgaXRzIGxvZ3MgKHZlcmJvc2UgdHJhY2VzLCBub3RpY2VzLCB3YXJuaW5ncykgdG8gc3RkZXJyLCBzbyB3ZSByZXF1aXJlXG4gICAgLy8gJ2NhcHR1cmVTdGRlcnI6IGZhbHNlJyB0byBpc29sYXRlIHN0ZG91dC4gV2l0aG91dCBpdCwgdGhlIHJldHVybmVkIG91dHB1dCBpcyAnc3Rkb3V0ICsgc3RkZXJyJ1xuICAgIC8vIGFuZCB0aGUgaW50ZXJsZWF2ZWQgbG9ncyB3b3VsZCBjb3JydXB0IHRoZSBKU09OIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbW1hbmQncyBhY3R1YWwgYmVoYXZpb3IuXG4gICAgY29uc3QgYXNzZXJ0SnNvbiA9IGhhc0pzb25GbGFnKGFyZ3MpICYmICFvcHRpb25zLm9ubHlTdGRlcnI7XG4gICAgaWYgKGFzc2VydEpzb24gJiYgb3B0aW9ucy5jYXB0dXJlU3RkZXJyICE9PSBmYWxzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAnY2RrICR7YXJncy5qb2luKCcgJyl9JyB1c2VzICctLWpzb24nIGJ1dCBkb2VzIG5vdCBwYXNzICdjYXB0dXJlU3RkZXJyOiBmYWxzZSc7IGAgK1xuICAgICAgICAndGhpcyBpcyByZXF1aXJlZCBzbyBzdGRvdXQgKHRoZSBKU09OIG91dHB1dCkgaXMgaXNvbGF0ZWQgZnJvbSBsb2dzIHdyaXR0ZW4gdG8gc3RkZXJyJyk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5jbGkubWFrZUNsaUF2YWlsYWJsZSgpO1xuXG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgdGhpcy5zaGVsbChbXG4gICAgICAnY2RrJyxcbiAgICAgIC4uLih2ZXJib3NlID8gW2AtJHsndicucmVwZWF0KHZlcmJvc2VMZXZlbCl9YF0gOiBbXSksXG4gICAgICAuLi5hcmdzLFxuICAgIF0sIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBtb2RFbnY6IHtcbiAgICAgICAgLi4udGhpcy5jZGtTaGVsbEVudigpLFxuICAgICAgICAuLi5vcHRpb25zLm1vZEVudixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAoYXNzZXJ0SnNvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgSlNPTi5wYXJzZShvdXRwdXQpO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgSlNPTiBvdXRwdXQgZnJvbSAnY2RrICR7YXJncy5qb2luKCcgJyl9JyBidXQgY291bGQgbm90IHBhcnNlIGl0OiAke2UubWVzc2FnZX1cXG5PdXRwdXQgd2FzOlxcbiR7b3V0cHV0fWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2l0aCB3aGljaCB0byBleGVjdXRlIENES1xuICAgKi9cbiAgcHVibGljIGNka1NoZWxsRW52KCkge1xuICAgIC8vIGlmIHRlc3RzIGFyZSB1c2luZyBhbiBleHBsaWNpdCBhd3MgaWRlbnRpdHkgYWxyZWFkeSAoaS5lIGNyZWRzKVxuICAgIC8vIGZvcmNlIGV2ZXJ5IGNkayBjb21tYW5kIHRvIHVzZSB0aGUgc2FtZSBpZGVudGl0eS5cbiAgICBjb25zdCBhd3NDcmVkcyA9IHRoaXMuYXdzLmlkZW50aXR5RW52KCkgPz8ge307XG5cbiAgICByZXR1cm4ge1xuICAgICAgQVdTX1JFR0lPTjogdGhpcy5hd3MucmVnaW9uLFxuICAgICAgQVdTX0RFRkFVTFRfUkVHSU9OOiB0aGlzLmF3cy5yZWdpb24sXG4gICAgICBTVEFDS19OQU1FX1BSRUZJWDogdGhpcy5zdGFja05hbWVQcmVmaXgsXG4gICAgICBQQUNLQUdFX0xBWU9VVF9WRVJTSU9OOiAnMicsXG4gICAgICBURVNUSU5HX0NESzogJ3RydWUnLFxuICAgICAgLy8gSW4gdGhlc2UgdGVzdHMgd2Ugd2FudCB0byBtYWtlIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBzdGRvdXQgYW5kIHN0ZXJyXG4gICAgICBDSTogJ2ZhbHNlJyxcbiAgICAgIC4uLmF3c0NyZWRzLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgdGVtcGxhdGUoc3RhY2tOYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIGNvbnN0IGZ1bGxTdGFja05hbWUgPSB0aGlzLmZ1bGxTdGFja05hbWUoc3RhY2tOYW1lKTtcbiAgICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBwYXRoLmpvaW4odGhpcy5pbnRlZ1Rlc3REaXIsICdjZGsub3V0JywgYCR7ZnVsbFN0YWNrTmFtZX0udGVtcGxhdGUuanNvbmApO1xuICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0ZW1wbGF0ZVBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSkudG9TdHJpbmcoKSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYm9vdHN0cmFwUmVwb05hbWUoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBlbnN1cmVCb290c3RyYXBwZWQodGhpcyk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXdzLmNsb3VkRm9ybWF0aW9uLnNlbmQobmV3IERlc2NyaWJlU3RhY2tzQ29tbWFuZCh7fSkpO1xuXG4gICAgY29uc3Qgc3RhY2sgPSAocmVzcG9uc2UuU3RhY2tzID8/IFtdKVxuICAgICAgLmZpbHRlcigocykgPT4gcy5TdGFja05hbWUgJiYgcy5TdGFja05hbWUgPT0gdGhpcy5ib290c3RyYXBTdGFja05hbWUpO1xuICAgIGFzc2VydChzdGFjay5sZW5ndGggPT0gMSk7XG4gICAgcmV0dXJuIG91dHB1dEZyb21TdGFjaygnSW1hZ2VSZXBvc2l0b3J5TmFtZScsIHN0YWNrWzBdKSA/PyAnJztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYm9vdHN0cmFwU3RhY2tOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmZ1bGxTdGFja05hbWUoJ2Jvb3RzdHJhcC1zdGFjaycpO1xuICB9XG5cbiAgcHVibGljIGZ1bGxTdGFja05hbWUoc3RhY2tOYW1lOiBzdHJpbmcpOiBzdHJpbmc7XG4gIHB1YmxpYyBmdWxsU3RhY2tOYW1lKHN0YWNrTmFtZXM6IHN0cmluZ1tdKTogc3RyaW5nW107XG4gIHB1YmxpYyBmdWxsU3RhY2tOYW1lKHN0YWNrTmFtZXM6IHN0cmluZyB8IHN0cmluZ1tdKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIGlmICh0eXBlb2Ygc3RhY2tOYW1lcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLnN0YWNrTmFtZVByZWZpeH0tJHtzdGFja05hbWVzfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzdGFja05hbWVzLm1hcChzID0+IGAke3RoaXMuc3RhY2tOYW1lUHJlZml4fS0ke3N9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZCB0aGlzIHRvIHRoZSBsaXN0IG9mIGJ1Y2tldHMgdG8gcG90ZW50aWFsbHkgZGVsZXRlXG4gICAqXG4gICAqIEF0IHRoZSBlbmQgb2YgYSB0ZXN0LCB3ZSBjbGVhbiB1cCBidWNrZXRzIHRoYXQgbWF5IG5vdCBoYXZlIGdvdHRlbiBkZXN0cm95ZWRcbiAgICogKGZvciB3aGF0ZXZlciByZWFzb24pLlxuICAgKi9cbiAgcHVibGljIHJlbWVtYmVyVG9EZWxldGVCdWNrZXQoYnVja2V0TmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5idWNrZXRzVG9EZWxldGUucHVzaChidWNrZXROYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbnVwIGxlZnRvdmVyIHN0YWNrcyBhbmQgYm9vdHN0cmFwcGVkIHJlc291cmNlc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc3Bvc2Uoc3VjY2VzczogYm9vbGVhbikge1xuICAgIC8vIHdoZW4gdXNpbmcgdGhlIGF0bW9zcGhlcmUgc2VydmljZSwgaXQgZG9lcyByZXNvdXJjZSBjbGVhbnVwIG9uIG91ciBiZWhhbGZcbiAgICAvLyBzbyB3ZSBkb24ndCBoYXZlIHRvIHdhaXQgZm9yIGl0LlxuICAgIGlmICghYXRtb3NwaGVyZUVuYWJsZWQoKSkge1xuICAgICAgY29uc3Qgc3RhY2tzVG9EZWxldGUgPSBhd2FpdCB0aGlzLmRlbGV0ZWFibGVTdGFja3ModGhpcy5zdGFja05hbWVQcmVmaXgpO1xuXG4gICAgICB0aGlzLnNvcnRCb290c3RyYXBTdGFja3NUb1RoZUVuZChzdGFja3NUb0RlbGV0ZSk7XG5cbiAgICAgIC8vIEJvb3RzdHJhcCBzdGFja3MgaGF2ZSBidWNrZXRzIHRoYXQgbmVlZCB0byBiZSBjbGVhbmVkXG4gICAgICBjb25zdCBidWNrZXROYW1lcyA9IHN0YWNrc1RvRGVsZXRlLm1hcChzdGFjayA9PiBvdXRwdXRGcm9tU3RhY2soJ0J1Y2tldE5hbWUnLCBzdGFjaykpLmZpbHRlcihkZWZpbmVkKTtcbiAgICAgIC8vIFBhcmFsbGVsaXNtIHdpbGwgYmUgcmVhc29uYWJsZVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBjZGtsYWJzL3Byb21pc2VhbGwtbm8tdW5ib3VuZGVkLXBhcmFsbGVsaXNtXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChidWNrZXROYW1lcy5tYXAoYiA9PiB0aGlzLmF3cy5lbXB0eUJ1Y2tldChiKSkpO1xuICAgICAgLy8gVGhlIGJvb3RzdHJhcCBidWNrZXQgaGFzIGEgcmVtb3ZhbCBwb2xpY3kgb2YgUkVUQUlOIGJ5IGRlZmF1bHQsIHNvIGFkZCBpdCB0byB0aGUgYnVja2V0cyB0byBiZSBjbGVhbmVkIHVwLlxuICAgICAgdGhpcy5idWNrZXRzVG9EZWxldGUucHVzaCguLi5idWNrZXROYW1lcyk7XG5cbiAgICAgIC8vIEJvb3RzdHJhcCBzdGFja3MgaGF2ZSBFQ1IgcmVwb3NpdG9yaWVzIHdpdGggaW1hZ2VzIHdoaWNoIHNob3VsZCBiZSBkZWxldGVkXG4gICAgICBjb25zdCBpbWFnZVJlcG9zaXRvcnlOYW1lcyA9IHN0YWNrc1RvRGVsZXRlLm1hcChzdGFjayA9PiBvdXRwdXRGcm9tU3RhY2soJ0ltYWdlUmVwb3NpdG9yeU5hbWUnLCBzdGFjaykpLmZpbHRlcihkZWZpbmVkKTtcbiAgICAgIC8vIFBhcmFsbGVsaXNtIHdpbGwgYmUgcmVhc29uYWJsZVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBjZGtsYWJzL3Byb21pc2VhbGwtbm8tdW5ib3VuZGVkLXBhcmFsbGVsaXNtXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChpbWFnZVJlcG9zaXRvcnlOYW1lcy5tYXAociA9PiB0aGlzLmF3cy5kZWxldGVJbWFnZVJlcG9zaXRvcnkocikpKTtcblxuICAgICAgYXdhaXQgdGhpcy5hd3MuZGVsZXRlU3RhY2tzKFxuICAgICAgICAuLi5zdGFja3NUb0RlbGV0ZS5tYXAoKHMpID0+IHtcbiAgICAgICAgICBpZiAoIXMuU3RhY2tOYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0YWNrIG5hbWUgaXMgcmVxdWlyZWQgdG8gZGVsZXRlIGEgc3RhY2suJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBzLlN0YWNrTmFtZTtcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICAvLyBXZSBtaWdodCBoYXZlIGxlYWtlZCBzb21lIGJ1Y2tldHMgYnkgdXBncmFkaW5nIHRoZSBib290c3RyYXAgc3RhY2suIEJlXG4gICAgICAvLyBzdXJlIHRvIGNsZWFuIGV2ZXJ5dGhpbmcuXG4gICAgICBmb3IgKGNvbnN0IGJ1Y2tldCBvZiB0aGlzLmJ1Y2tldHNUb0RlbGV0ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmF3cy5kZWxldGVCdWNrZXQoYnVja2V0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgdGVzdHMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgaGFwcGlseSBkZWxldGUgdGhlIGZpeHR1cmVcbiAgICAvLyAob3RoZXJ3aXNlIGxlYXZlIGl0IGZvciBodW1hbnMgdG8gaW5zcGVjdClcbiAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgY29uc3QgY2xlYW5lZCA9IHJpbXJhZih0aGlzLmludGVnVGVzdERpcik7XG4gICAgICBpZiAoIWNsZWFuZWQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNsZWFuIHVwICR7dGhpcy5pbnRlZ1Rlc3REaXJ9IGR1ZSB0byBwZXJtaXNzaW9ucyBpc3N1ZXMgKERvY2tlciBydW5uaW5nIGFzIHJvb3Q/KWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHN0YWNrcyBzdGFydGluZyB3aXRoIG91ciB0ZXN0aW5nIHByZWZpeCB0aGF0IHNob3VsZCBiZSBkZWxldGVkXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRlbGV0ZWFibGVTdGFja3MocHJlZml4OiBzdHJpbmcpOiBQcm9taXNlPFN0YWNrW10+IHtcbiAgICBjb25zdCBzdGF0dXNGaWx0ZXIgPSBbXG4gICAgICAnQ1JFQVRFX0lOX1BST0dSRVNTJywgJ0NSRUFURV9GQUlMRUQnLCAnQ1JFQVRFX0NPTVBMRVRFJyxcbiAgICAgICdST0xMQkFDS19JTl9QUk9HUkVTUycsICdST0xMQkFDS19GQUlMRUQnLCAnUk9MTEJBQ0tfQ09NUExFVEUnLFxuICAgICAgJ0RFTEVURV9GQUlMRUQnLFxuICAgICAgJ1VQREFURV9JTl9QUk9HUkVTUycsICdVUERBVEVfQ09NUExFVEVfQ0xFQU5VUF9JTl9QUk9HUkVTUycsXG4gICAgICAnVVBEQVRFX0NPTVBMRVRFJywgJ1VQREFURV9ST0xMQkFDS19JTl9QUk9HUkVTUycsXG4gICAgICAnVVBEQVRFX1JPTExCQUNLX0ZBSUxFRCcsXG4gICAgICAnVVBEQVRFX1JPTExCQUNLX0NPTVBMRVRFX0NMRUFOVVBfSU5fUFJPR1JFU1MnLFxuICAgICAgJ1VQREFURV9ST0xMQkFDS19DT01QTEVURScsICdSRVZJRVdfSU5fUFJPR1JFU1MnLFxuICAgICAgJ0lNUE9SVF9JTl9QUk9HUkVTUycsICdJTVBPUlRfQ09NUExFVEUnLFxuICAgICAgJ0lNUE9SVF9ST0xMQkFDS19JTl9QUk9HUkVTUycsICdJTVBPUlRfUk9MTEJBQ0tfRkFJTEVEJyxcbiAgICAgICdJTVBPUlRfUk9MTEJBQ0tfQ09NUExFVEUnLFxuICAgIF07XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXdzLmNsb3VkRm9ybWF0aW9uLnNlbmQobmV3IERlc2NyaWJlU3RhY2tzQ29tbWFuZCh7fSkpO1xuXG4gICAgcmV0dXJuIChyZXNwb25zZS5TdGFja3MgPz8gW10pXG4gICAgICAuZmlsdGVyKChzKSA9PiBzLlN0YWNrTmFtZSAmJiBzLlN0YWNrTmFtZS5zdGFydHNXaXRoKHByZWZpeCkpXG4gICAgICAuZmlsdGVyKChzKSA9PiBzLlN0YWNrU3RhdHVzICYmIHN0YXR1c0ZpbHRlci5pbmNsdWRlcyhzLlN0YWNrU3RhdHVzKSlcbiAgICAgIC5maWx0ZXIoKHMpID0+IHMuUm9vdElkID09PSB1bmRlZmluZWQpOyAvLyBPbmx5IGRlbGV0ZSBwYXJlbnQgc3RhY2tzLiBOZXN0ZWQgc3RhY2tzIGFyZSBkZWxldGVkIGluIHRoZSBwcm9jZXNzXG4gIH1cblxuICBwcml2YXRlIHNvcnRCb290c3RyYXBTdGFja3NUb1RoZUVuZChzdGFja3M6IFN0YWNrW10pIHtcbiAgICBzdGFja3Muc29ydCgoYSwgYikgPT4ge1xuICAgICAgaWYgKCFhLlN0YWNrTmFtZSB8fCAhYi5TdGFja05hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdGFjayBuYW1lcyBkbyBub3QgZXhpc3RzLiBUaGVzZSBhcmUgcmVxdWlyZWQgZm9yIHNvcnRpbmcgdGhlIGJvb3RzdHJhcCBzdGFja3MuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFCcyA9IGEuU3RhY2tOYW1lLnN0YXJ0c1dpdGgodGhpcy5ib290c3RyYXBTdGFja05hbWUpO1xuICAgICAgY29uc3QgYkJzID0gYi5TdGFja05hbWUuc3RhcnRzV2l0aCh0aGlzLmJvb3RzdHJhcFN0YWNrTmFtZSk7XG5cbiAgICAgIHJldHVybiBhQnMgIT0gYkJzXG4gICAgICAgIC8vICcrJyBjb252ZXJ0cyBhIGJvb2xlYW4gdG8gMCBvciAxXG4gICAgICAgID8gKCthQnMpIC0gKCtiQnMpXG4gICAgICAgIDogYS5TdGFja05hbWUubG9jYWxlQ29tcGFyZShiLlN0YWNrTmFtZSk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBNYWtlIHN1cmUgdGhhdCB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgaXMgYm9vdHN0cmFwcGVkXG4gKlxuICogU2luY2Ugd2UgZ28gc3RyaXBpbmcgYWNyb3NzIHJlZ2lvbnMsIGl0J3MgZ29pbmcgdG8gc3VjayBkb2luZyB0aGlzXG4gKiBieSBoYW5kIHNvIGxldCdzIGp1c3QgbWFzcy1hdXRvbWF0ZSBpdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUJvb3RzdHJhcHBlZChmaXh0dXJlOiBUZXN0Rml4dHVyZSkge1xuICAvLyBBbHdheXMgdXNlIHRoZSBtb2Rlcm4gYm9vdHN0cmFwIHN0YWNrLCBvdGhlcndpc2Ugd2UgbWF5IGdldCB0aGUgZXJyb3JcbiAgLy8gXCJyZWZ1c2luZyB0byBkb3duZ3JhZGUgZnJvbSB2ZXJzaW9uIDcgdG8gdmVyc2lvbiAwXCIgd2hlbiBib290c3RyYXBwaW5nIHdpdGggZGVmYXVsdFxuICAvLyBzZXR0aW5ncyB1c2luZyBhIHYxIENMSS5cbiAgLy9cbiAgLy8gSXQgZG9lc24ndCBtYXR0ZXIgZm9yIHRlc3RzOiB3aGVuIHRoZXkgd2FudCB0byB0ZXN0IHNvbWV0aGluZyBhYm91dCBhbiBhY3R1YWwgbGVnYWN5XG4gIC8vIGJvb3RzdHJhcCBzdGFjaywgdGhleSdsbCBjcmVhdGUgYSBib290c3RyYXAgc3RhY2sgd2l0aCBhIG5vbi1kZWZhdWx0IG5hbWUgdG8gdGVzdCB0aGF0IGV4YWN0IHByb3BlcnR5LlxuICBjb25zdCBlbnZTcGVjaWZpZXIgPSBgYXdzOi8vJHthd2FpdCBmaXh0dXJlLmF3cy5hY2NvdW50KCl9LyR7Zml4dHVyZS5hd3MucmVnaW9ufWA7XG4gIGlmIChBTFJFQURZX0JPT1RTVFJBUFBFRF9JTl9USElTX1JVTi5oYXMoZW52U3BlY2lmaWVyKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChhdG1vc3BoZXJlRW5hYmxlZCgpKSB7XG4gICAgLy8gd2hlbiBhdG1vc3BoZXJlIGlzIGVuYWJsZWQsIGVhY2ggdGVzdCBzdGFydHMgd2l0aCBhbiBlbXB0eSBlbnZpcm9ubWVudFxuICAgIC8vIGFuZCBuZWVkcyB0byBkZXBsb3kgdGhlIGJvb3RzdHJhcCBzdGFjay4gaW4gY2FzZSBlbnZpcm9ubWVudHMgYXJlIHJlY3lsY2VkIHRvbyBxdWlja2x5LFxuICAgIC8vIGNsb3VkZm9ybWF0aW9uIG1heSB0aGluayB0aGUgYm9vdHN0cmFwIGJ1Y2tldCBzdGlsbCBleGlzdHMgZXZlbiB0aG91Z2ggaXQgZG9lc250IChiZWNhdXNlIG9mIHMzIGV2ZW50dWFsIGNvbnNpc3RlbmN5KS5cbiAgICAvLyBzbyB3ZSByZXRyeSBvbiB0aGUgc3BlY2lmaWMgZXJyb3IgZm9yIGEgd2hpbGUuXG4gICAgYXdhaXQgYm9vdHN0cmFwV2l0aFJldHJ5T25CdWNrZXRFeGlzdHMoZW52U3BlY2lmaWVyLCBmaXh0dXJlKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBkb0Jvb3RzdHJhcChlbnZTcGVjaWZpZXIsIGZpeHR1cmUsIGZhbHNlKTtcbiAgfVxuXG4gIC8vIHdoZW4gdXNpbmcgdGhlIGF0bW9zcGhlcmUgc2VydmljZSwgZXZlcnkgdGVzdCBuZWVkcyB0byBib290c3RyYXBcbiAgLy8gaXRzIG93biBlbnZpcm9ubWVudC5cbiAgaWYgKCFhdG1vc3BoZXJlRW5hYmxlZCgpKSB7XG4gICAgQUxSRUFEWV9CT09UU1RSQVBQRURfSU5fVEhJU19SVU4uYWRkKGVudlNwZWNpZmllcik7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZG9Cb290c3RyYXAoZW52U3BlY2lmaWVyOiBzdHJpbmcsIGZpeHR1cmU6IFRlc3RGaXh0dXJlLCBhbGxvd0VyckV4aXQ6IGJvb2xlYW4pIHtcbiAgcmV0dXJuIGZpeHR1cmUuY2RrKFsnYm9vdHN0cmFwJywgJy0tYm9vdHN0cmFwLWttcy1rZXktaWQnLCAnQVdTX01BTkFHRURfS0VZJywgZW52U3BlY2lmaWVyXSwge1xuICAgIG1vZEVudjoge1xuICAgICAgLy8gRXZlbiBmb3IgdjEsIHVzZSBuZXcgYm9vdHN0cmFwXG4gICAgICBDREtfTkVXX0JPT1RTVFJBUDogJzEnLFxuICAgICAgLy8gd2hlbiBhbGxvd2luZyBlcnJvciBleGl0LCB3ZSBwcm9iYWJseSB3YW50IHRvIGluc3BlY3RcbiAgICAgIC8vIGFuZCBjb21wYXJlIG91dHB1dCwgd2hpY2ggaXMgYmV0dGVyIGRvbmUgd2l0aG91dCBjb2xvciBjaGFyYWN0ZXJzLlxuICAgICAgLi4uKGFsbG93RXJyRXhpdCA/IHsgRk9SQ0VfQ09MT1I6ICcwJyB9IDoge30pLFxuICAgIH0sXG4gICAgYWxsb3dFcnJFeGl0LFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYm9vdHN0cmFwV2l0aFJldHJ5T25CdWNrZXRFeGlzdHMoZW52U3BlY2lmaWVyOiBzdHJpbmcsIGZpeHR1cmU6IFRlc3RGaXh0dXJlKSB7XG4gIGNvbnN0IGFjY291bnQgPSBhd2FpdCBmaXh0dXJlLmF3cy5hY2NvdW50KCk7XG4gIGNvbnN0IHJldHJ5QWZ0ZXJTZWNvbmRzID0gMzA7XG4gIGNvbnN0IGJvb3RzdHJhcEJ1Y2tldCA9IGBjZGstaG5iNjU5ZmRzLWFzc2V0cy0ke2FjY291bnR9LSR7Zml4dHVyZS5hd3MucmVnaW9ufWA7XG5cbiAgLy8gczMgc2F5cyB0aGF0IGEgYnVja2V0IGRlbGV0aW9uIGNhbiB0YWtlIHVwIHRvIGFuIGhvdXIgdG8gYmUgZnVsbHkgdmlzaWJsZS5cbiAgLy8gZW1waXJpY2FsbHkgd2Ugc2VlIHRoYXQgYSBmZXcgbWludXRlcyBpcyBlbm91Z2ggdGhvdWdoLiBsZXRzIGdpdmUgMTAgdG8gYmUgb24gdGhlIHNhZmUocikgc2lkZS5cbiAgY29uc3QgdGltZW91dE1pbnV0ZXMgPSAxMDtcblxuICBjb25zdCB0aW1lb3V0RGF0ZSA9IG5ldyBEYXRlKERhdGUubm93KCkgKyB0aW1lb3V0TWludXRlcyAqIDYwICogMTAwMCk7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3Qgb3V0ID0gYXdhaXQgZG9Cb290c3RyYXAoZW52U3BlY2lmaWVyLCBmaXh0dXJlLCB0cnVlKTtcbiAgICBpZiAob3V0LmluY2x1ZGVzKGBFbnZpcm9ubWVudCAke2VudlNwZWNpZmllcn0gYm9vdHN0cmFwcGVkYCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAob3V0LmluY2x1ZGVzKGAke2Jvb3RzdHJhcEJ1Y2tldH0gYWxyZWFkeSBleGlzdHNgKSB8fCBvdXQuaW5jbHVkZXMoJ1NlcnZpY2U6IFMzLCBTdGF0dXMgQ29kZTogNDA5JykpIHtcbiAgICAgIC8vIG1pZ2h0IGJlIGFuIHMzIGV2ZW50dWFseSBjb25zaXN0ZW5jeSBpc3N1ZSBkdWUgdG8gcmVjeWNsZWQgZW52aXJvbm1lbnRzLlxuICAgICAgaWYgKERhdGUubm93KCkgPCB0aW1lb3V0RGF0ZS5nZXRUaW1lKCkpIHtcbiAgICAgICAgZml4dHVyZS5sb2coYEJvb3RzdHJhcCBvZiAke2VudlNwZWNpZmllcn0gZmFpbGVkIGR1ZSB0byBidWNrZXQgZXhpc3RlbmNlIGNoZWNrLiBSZXRyeWluZyBpbiAke3JldHJ5QWZ0ZXJTZWNvbmRzfSBzZWNvbmRzLi4uYCk7XG4gICAgICAgIGF3YWl0IHNsZWVwKHJldHJ5QWZ0ZXJTZWNvbmRzICogMTAwMCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCBib290c3RyYXBwaW5nICR7ZW52U3BlY2lmaWVyfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlZmluZWQ8QT4oeDogQSk6IHggaXMgTm9uTnVsbGFibGU8QT4ge1xuICByZXR1cm4geCAhPT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlICctLWpzb24nIGZsYWcgYXBwZWFycyBhbnl3aGVyZSBpbiB0aGUgQ0RLIGFyZ3VtZW50cy5cbiAqXG4gKiBBcmd1bWVudHMgbWF5IGJlIHBhc3NlZCBlaXRoZXIgYXMgc2VwYXJhdGUgdG9rZW5zIChlLmcuIGBbJ2xzJywgJy0tanNvbiddYClcbiAqIG9yIGFzIGEgc2luZ2xlIHNwYWNlLWpvaW5lZCBzdHJpbmcgKGUuZy4gYFsnbHMgLS1zaG93LWRlcGVuZGVuY2llcyAtLWpzb24nXWApLFxuICogc28gd2UgbWF0Y2ggb24gd29yZCBib3VuZGFyaWVzIHdpdGhpbiBlYWNoIGFyZ3VtZW50LlxuICovXG5mdW5jdGlvbiBoYXNKc29uRmxhZyhhcmdzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gYXJncy5zb21lKChhcmcpID0+IC8oXnxcXHMpLS1qc29uKFxcc3w9fCQpLy50ZXN0KGFyZykpO1xufVxuXG4vKipcbiAqIEluc3RhbGwgdGhlIGdpdmVuIE5QTSBwYWNrYWdlcywgaWRlbnRpZmllZCBieSB0aGVpciBuYW1lcyBhbmQgdmVyc2lvbnNcbiAqXG4gKiBXb3JrcyBieSB3cml0aW5nIHRoZSBwYWNrYWdlcyB0byBhIGBwYWNrYWdlLmpzb25gIGZpbGUsIGFuZFxuICogdGhlbiBydW5uaW5nIE5QTTcncyBcImluc3RhbGxcIiBvbiBpdC4gVGhlIHVzZSBvZiBOUE03IHdpbGwgYXV0b21hdGljYWxseVxuICogaW5zdGFsbCByZXF1aXJlZCBwZWVyRGVwZW5kZW5jaWVzLlxuICpcbiAqIElmIHdlJ3JlIHJ1bm5pbmcgaW4gUkVQTyBtb2RlIGFuZCB3ZSBmaW5kIHRoZSBwYWNrYWdlIGluIHRoZSBzZXQgb2YgbG9jYWxcbiAqIHBhY2thZ2VzIGluIHRoZSByZXBvc2l0b3J5LCB3ZSdsbCB3cml0ZSB0aGUgZGlyZWN0b3J5IG5hbWUgdG8gYHBhY2thZ2UuanNvbmBcbiAqIHNvIHRoYXQgTlBNIHdpbGwgY3JlYXRlIGEgc3ltbGluayAodGhpcyBhbGxvd3MgcnVubmluZyB0ZXN0cyBhZ2FpbnN0XG4gKiBidWlsdC1idXQtdW5wYWNrYWdlZCBtb2R1bGVzLCBhbmQgc2F2ZXMgZGV2IGN5Y2xlIHRpbWUpLlxuICpcbiAqIEJlIGF3YXJlIHlvdSBNVVNUIGluc3RhbGwgYWxsIHRoZSBwYWNrYWdlcyB5b3UgZGlyZWN0bHkgZGVwZW5kIHVwb24hIEluIHRoZSBjYXNlXG4gKiBvZiBhIHJlcG8vc3ltbGlua2luZyBpbnN0YWxsLCB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcyBXSUxMIE5PVCBiZSBpbnN0YWxsZWQgaW4gdGhlXG4gKiBjdXJyZW50IGRpcmVjdG9yeSdzIGBub2RlX21vZHVsZXNgIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGV5IHdpbGwgYWxyZWFkeSBoYXZlIGJlZW5cbiAqIHN5bWxpbmtlZCBmcm9tIHRoZSBUQVJHRVQgZGlyZWN0b3J5J3MgYG5vZGVfbW9kdWxlc2AgZGlyZWN0b3J5ICh3aGljaCBpcyBzdWZmaWNpZW50XG4gKiBmb3IgTm9kZSdzIGRlcGVuZGVuY3kgbG9va3VwIG1lY2hhbmlzbSkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsTnBtUGFja2FnZXMoZml4dHVyZTogVGVzdEZpeHR1cmUsIHBhY2thZ2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XG4gIGlmIChwcm9jZXNzLmVudi5SRVBPX1JPT1QpIHtcbiAgICBjb25zdCBtb25vUmVwbyA9IGF3YWl0IGZpbmRZYXJuUGFja2FnZXMocHJvY2Vzcy5lbnYuUkVQT19ST09UKTtcblxuICAgIC8vIFJlcGxhY2UgdGhlIGluc3RhbGwgdGFyZ2V0IHdpdGggdGhlIHBoeXNpY2FsIGxvY2F0aW9uIG9mIHRoaXMgcGFja2FnZVxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHBhY2thZ2VzKSkge1xuICAgICAgaWYgKGtleSBpbiBtb25vUmVwbykge1xuICAgICAgICBwYWNrYWdlc1trZXldID0gbW9ub1JlcG9ba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihmaXh0dXJlLmludGVnVGVzdERpciwgJ3BhY2thZ2UuanNvbicpLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgbmFtZTogJ2Nkay1pbnRlZy10ZXN0cycsXG4gICAgcHJpdmF0ZTogdHJ1ZSxcbiAgICB2ZXJzaW9uOiAnMC4wLjEnLFxuICAgIGRldkRlcGVuZGVuY2llczogcGFja2FnZXMsXG4gIH0sIHVuZGVmaW5lZCwgMiksIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG5cbiAgLy8gd2Ugb2Z0ZW4gRUNPTk5SRVNFVCBmcm9tIE5QTSBzbyBsZXRzIHJldHJ5LiB0aGlzIG1pZ2h0IGJlIGJlY2F1c2Ugb2YgaGlnaCBjb25jdXJyZW5jeVxuICAvLyB3aGljaCBvdmVyd2hlbG1lcyBzeXN0ZW0gcmVzb3VyY2VzLlxuICBjb25zdCB0aW1lb3V0TWludXRlcyA9IDEwO1xuICBjb25zdCB0aW1lb3V0RGF0ZSA9IG5ldyBEYXRlKERhdGUubm93KCkgKyB0aW1lb3V0TWludXRlcyAqIDYwICogMTAwMCk7XG4gIGNvbnN0IHJldHJ5QWZ0ZXJTZWNvbmRzID0gMzA7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICB0cnkge1xuICAgICAgLy8gTm93IGluc3RhbGwgdGhhdCBgcGFja2FnZS5qc29uYCB1c2luZyBOUE03XG4gICAgICBhd2FpdCBmaXh0dXJlLnNoZWxsKFsnbm9kZScsIHJlcXVpcmUucmVzb2x2ZSgnbnBtJyksICdpbnN0YWxsJ10pO1xuICAgICAgYnJlYWs7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA8IHRpbWVvdXREYXRlLmdldFRpbWUoKSAmJiBmaXh0dXJlLm91dHB1dC50b1N0cmluZygpLmluY2x1ZGVzKCdFQ09OTlJFU0VUJyApKSB7XG4gICAgICAgIGZpeHR1cmUubG9nKGBucG0gaW5zdGFsbCBmYWlsZWQgZHVlIHRvIEVDT05OUkVTRVQuIFJldHJ5aW5nIGluICR7cmV0cnlBZnRlclNlY29uZHN9IHNlY29uZHMuLi5gKTtcbiAgICAgICAgYXdhaXQgc2xlZXAocmV0cnlBZnRlclNlY29uZHMgKiAxMDAwKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBBTFJFQURZX0JPT1RTVFJBUFBFRF9JTl9USElTX1JVTiA9IG5ldyBTZXQoKTtcbiJdfQ==
|