cdk-nextjs 0.7.5 → 0.7.7
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/.jsii +38 -38
- package/.jsii.tabl.json +1 -1
- package/README.md +12 -3
- package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +31 -13
- package/docs/adapter-runtime.md +1 -1
- package/docs/caching-guide.md +11 -1
- package/docs/harness-coverage.md +11 -9
- package/lib/adapter/adapter.mjs +220 -149
- package/lib/adapter/aws-cache-store.d.ts +242 -7
- package/lib/adapter/aws-cache-store.js +520 -54
- package/lib/adapter/aws-cache-store.test.js +710 -3
- package/lib/adapter/build-outputs.js +23 -1
- package/lib/adapter/build-outputs.test.js +18 -1
- package/lib/adapter/cache-handler.d.ts +4 -3
- package/lib/adapter/cache-handler.js +1 -1
- package/lib/adapter/cache-handler.mjs +552 -91
- package/lib/adapter/cache-handler.test.js +31 -1
- package/lib/adapter/cache-utils.d.ts +68 -2
- package/lib/adapter/cache-utils.js +108 -2
- package/lib/adapter/cache-utils.test.js +45 -1
- package/lib/adapter/init-cache.d.ts +1 -1
- package/lib/adapter/init-cache.js +60 -37
- package/lib/adapter/init-cache.test.js +55 -2
- package/lib/adapter/local-file-cache-handler.d.ts +2 -2
- package/lib/adapter/local-file-cache-handler.js +4 -5
- package/lib/adapter/s3-cache-handler.d.ts +23 -7
- package/lib/adapter/s3-cache-handler.js +63 -27
- package/lib/adapter/s3-cache-handler.test.js +168 -1
- package/lib/adapter/use-cache-common.d.ts +53 -1
- package/lib/adapter/use-cache-common.js +121 -14
- package/lib/adapter/use-cache-common.test.js +138 -1
- package/lib/adapter/use-cache-default-handler.js +36 -6
- package/lib/adapter/use-cache-default-handler.mjs +557 -51
- package/lib/adapter/use-cache-handlers.test.js +247 -7
- package/lib/adapter/use-cache-remote-handler.js +10 -9
- package/lib/adapter/use-cache-remote-handler.mjs +597 -101
- package/lib/lambdas/post-deploy/prune-revalidation-table.d.ts +2 -1
- package/lib/lambdas/post-deploy/prune-revalidation-table.js +35 -13
- package/lib/lambdas/post-deploy/prune-revalidation-table.test.js +19 -1
- package/lib/nextjs-api.js +1 -1
- package/lib/nextjs-build/nextjs-build.d.ts +0 -7
- package/lib/nextjs-build/nextjs-build.js +4 -11
- package/lib/nextjs-build/nextjs-build.test.js +4 -3
- package/lib/nextjs-cache.js +1 -1
- package/lib/nextjs-compute/nextjs-containers.js +1 -1
- package/lib/nextjs-compute/nextjs-functions.js +1 -1
- package/lib/nextjs-distribution.js +1 -1
- package/lib/nextjs-post-deploy.js +1 -1
- package/lib/nextjs-static-assets.js +1 -1
- package/lib/root-constructs/nextjs-base-construct.js +1 -1
- package/lib/root-constructs/nextjs-global-containers.js +1 -1
- package/lib/root-constructs/nextjs-global-functions.js +1 -1
- package/lib/root-constructs/nextjs-regional-containers.js +1 -1
- package/lib/root-constructs/nextjs-regional-functions.js +1 -1
- package/lib/runtime/core.js +18 -4
- package/lib/runtime/core.test.js +17 -1
- package/lib/runtime/image.d.ts +19 -0
- package/lib/runtime/image.js +28 -2
- package/lib/runtime/image.test.js +43 -1
- package/lib/runtime/lambda.mjs +30 -6
- package/lib/runtime/server.mjs +30 -6
- package/lib/runtime/tag-manifest.d.ts +15 -0
- package/lib/runtime/tag-manifest.js +24 -0
- package/lib/runtime/tag-manifest.test.d.ts +1 -0
- package/lib/runtime/tag-manifest.test.js +21 -0
- package/lib/utils/deployment-build-id.d.ts +11 -0
- package/lib/utils/deployment-build-id.js +15 -0
- package/package.json +3 -3
- package/scripts/e2e-harness/README.md +1 -1
|
@@ -5,7 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.NextjsBuild = void 0;
|
|
7
7
|
exports.deploymentArchitecture = deploymentArchitecture;
|
|
8
|
-
exports.deploymentBuildId = deploymentBuildId;
|
|
9
8
|
exports.pickStagedSharpPackage = pickStagedSharpPackage;
|
|
10
9
|
exports.resolveNextSharp = resolveNextSharp;
|
|
11
10
|
exports.isSharpBinaryPackage = isSharpBinaryPackage;
|
|
@@ -33,6 +32,7 @@ const constants_1 = require("../constants");
|
|
|
33
32
|
const manifest_1 = require("../runtime/manifest");
|
|
34
33
|
const public_files_1 = require("../runtime/public-files");
|
|
35
34
|
const base_path_1 = require("../utils/base-path");
|
|
35
|
+
const deployment_build_id_1 = require("../utils/deployment-build-id");
|
|
36
36
|
const get_architecture_1 = require("../utils/get-architecture");
|
|
37
37
|
/**
|
|
38
38
|
* Lambda's hard limit on the unzipped size of a function's code, which
|
|
@@ -60,19 +60,12 @@ function deploymentArchitecture(props) {
|
|
|
60
60
|
props.nextjsType === constants_1.NextjsType.REGIONAL_FUNCTIONS;
|
|
61
61
|
return (isFunctions && props.architecture) || (0, get_architecture_1.getLambdaArchitecture)();
|
|
62
62
|
}
|
|
63
|
-
/** {@link NextjsBuild.buildId}: Next.js's build ID, suffixed with the app's `deploymentId`. */
|
|
64
|
-
function deploymentBuildId(manifest) {
|
|
65
|
-
const { deploymentId } = manifest.config;
|
|
66
|
-
return deploymentId
|
|
67
|
-
? `${manifest.buildId}-${deploymentId}`
|
|
68
|
-
: manifest.buildId;
|
|
69
|
-
}
|
|
70
63
|
/**
|
|
71
64
|
* Builds Next.js assets.
|
|
72
65
|
* @link https://nextjs.org/docs/pages/api-reference/next-config-js/output
|
|
73
66
|
*/
|
|
74
67
|
class NextjsBuild extends constructs_1.Construct {
|
|
75
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsBuild", version: "0.7.
|
|
68
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsBuild", version: "0.7.7" };
|
|
76
69
|
/**
|
|
77
70
|
* Unique id for this deployment. Used to partition cache storage and as
|
|
78
71
|
* metadata for static assets in S3 bucket.
|
|
@@ -207,7 +200,7 @@ class NextjsBuild extends constructs_1.Construct {
|
|
|
207
200
|
if (props.nextjsType === constants_1.NextjsType.GLOBAL_FUNCTIONS) {
|
|
208
201
|
this.patchFetchInClientJs();
|
|
209
202
|
}
|
|
210
|
-
this.buildId = deploymentBuildId(manifest);
|
|
203
|
+
this.buildId = (0, deployment_build_id_1.deploymentBuildId)(manifest);
|
|
211
204
|
this.publicDirEntries = this.getLocalPublicDirEntries();
|
|
212
205
|
// Next.js's resolved config, the same one it writes into
|
|
213
206
|
// `required-server-files.json`.
|
|
@@ -976,4 +969,4 @@ function patchClientChunk(chunk, patch, chunkPath) {
|
|
|
976
969
|
}
|
|
977
970
|
return `${open}\n${patch}\n${PATCH_FETCH_END_MARKER}\n${original}`;
|
|
978
971
|
}
|
|
979
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWJ1aWxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25leHRqcy1idWlsZC9uZXh0anMtYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBNkpBLHdEQUtDO0FBR0QsOENBUUM7QUF3MkJELHdEQW1CQztBQU1ELDRDQVVDO0FBcUJELG9EQVVDO0FBY0Qsd0NBRUM7QUFVRCw0QkFZQztBQVlELG9EQXNCQztBQVVELDhEQXNCQztBQXVCRCxrREFLQztBQVFELGdDQVFDO0FBYUQsNENBd0JDOztBQWh4Q0QsMkRBQTREO0FBQzVELDZDQUFzRDtBQUN0RCxxQ0FpQmlCO0FBQ2pCLDZDQUE0QztBQUM1QyxxQ0FBaUM7QUFDakMseUNBQXlEO0FBQ3pELDJDQUFvRDtBQUNwRCw2Q0FBMEM7QUFFMUMsMkNBQXVDO0FBQ3ZDLDZEQUE2RDtBQUM3RCxrREFBNkI7QUFDN0IsZ0VBS29DO0FBQ3BDLDRDQUFzRDtBQUV0RCxrREFRNkI7QUFDN0IsMERBQTBEO0FBQzFELGtEQUk0QjtBQUM1QixnRUFHbUM7QUFFbkM7Ozs7O0dBS0c7QUFDSCxNQUFNLDJCQUEyQixHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBRXREOzs7O0dBSUc7QUFDSCxNQUFNLGtCQUFrQixHQUFHLDJCQUEyQixDQUFDO0FBQ3ZELDJFQUEyRTtBQUMzRSxNQUFNLHNCQUFzQixHQUFHLGtDQUFrQyxDQUFDO0FBRWxFLE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBUSxFQUFDLHlCQUF5QixDQUFDLENBQUM7QUE4RWxEOzs7O0dBSUc7QUFDSCxTQUFnQixzQkFBc0IsQ0FBQyxLQUF1QjtJQUM1RCxNQUFNLFdBQVcsR0FDZixLQUFLLENBQUMsVUFBVSxLQUFLLHNCQUFVLENBQUMsZ0JBQWdCO1FBQ2hELEtBQUssQ0FBQyxVQUFVLEtBQUssc0JBQVUsQ0FBQyxrQkFBa0IsQ0FBQztJQUNyRCxPQUFPLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFBLHdDQUFxQixHQUFFLENBQUM7QUFDeEUsQ0FBQztBQUVELCtGQUErRjtBQUMvRixTQUFnQixpQkFBaUIsQ0FBQyxRQUdqQztJQUNDLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO0lBQ3pDLE9BQU8sWUFBWTtRQUNqQixDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxJQUFJLFlBQVksRUFBRTtRQUN2QyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztBQUN2QixDQUFDO0FBT0Q7OztHQUdHO0FBQ0gsTUFBYSxXQUFZLFNBQVEsc0JBQVM7O0lBQ3hDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BbUJHO0lBQ0gsT0FBTyxDQUFTO0lBQ2hCOzs7T0FHRztJQUNILFlBQVksQ0FBUztJQUNyQjs7O09BR0c7SUFDSCxnQkFBZ0IsQ0FBbUI7SUFDbkM7Ozs7O09BS0c7SUFDSCx3QkFBd0IsQ0FBUztJQUNqQzs7T0FFRztJQUNILFdBQVcsQ0FBUztJQUNwQjs7Ozs7T0FLRztJQUNILGtCQUFrQixDQUFTO0lBQzNCOzs7Ozs7Ozs7T0FTRztJQUNILHFCQUFxQixDQUFTO0lBQzlCOzs7Ozs7Ozs7T0FTRztJQUNILHlCQUF5QixDQUFTO0lBQ2xDOzs7Ozs7T0FNRztJQUNILGVBQWUsQ0FBeUI7SUFDeEM7Ozs7T0FJRztJQUNILHNCQUFzQixDQUFnQztJQUN0RDs7Ozs7T0FLRztJQUNILGtCQUFrQixDQUFTO0lBQzNCOzs7T0FHRztJQUNILFlBQVksQ0FBZTtJQUVuQixLQUFLLENBQW1CO0lBQ3hCLFlBQVksQ0FBUztJQUU3QixZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXVCO1FBQy9ELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFBLGdCQUFJLEVBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUV2RCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLElBQUksZUFBZSxDQUFDO1FBRTFELGdDQUFnQztRQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUEsZ0JBQUksRUFDdEIsS0FBSyxDQUFDLGNBQWMsRUFDcEIsT0FBTyxFQUNQLHVCQUF1QixDQUN4QixDQUFDO1FBRUYsNkVBQTZFO1FBQzdFLDZFQUE2RTtRQUM3RSx1RUFBdUU7UUFDdkUscUVBQXFFO1FBQ3JFLDJFQUEyRTtRQUMzRSxJQUFJLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN6QixJQUFBLHdDQUFzQixFQUFDLEtBQUssQ0FBQyxjQUFxQyxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUVELDhCQUE4QjtRQUM5QixJQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RCLENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxDQUFDLEdBQUcsc0JBQVUsY0FBYyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBRUQsMkVBQTJFO1FBQzNFLDJFQUEyRTtRQUMzRSw2Q0FBNkM7UUFDN0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFNUMsd0VBQXdFO1FBQ3hFLHdFQUF3RTtRQUN4RSwwRUFBMEU7UUFDMUUsdUVBQXVFO1FBQ3ZFLHVFQUF1RTtRQUN2RSwyREFBMkQ7UUFDM0QsSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLHNCQUFVLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNyRCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM5QixDQUFDO1FBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDeEQseURBQXlEO1FBQ3pELGdDQUFnQztRQUNoQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBQSw2QkFBaUIsRUFBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFBLCtCQUFtQixFQUM5QyxRQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FDNUIsQ0FBQztRQUNGLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFBLDJCQUFlLEVBQzlDLFFBQVEsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUM1QixDQUFDO1FBRUYsTUFBTSxXQUFXLEdBQ2YsS0FBSyxDQUFDLFVBQVUsS0FBSyxzQkFBVSxDQUFDLGdCQUFnQjtZQUNoRCxLQUFLLENBQUMsVUFBVSxLQUFLLHNCQUFVLENBQUMsa0JBQWtCLENBQUM7UUFFckQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQztRQUN0RCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBQSxZQUFTLEVBQUMsMkJBQWdCLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLFlBQVksR0FBRyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsUUFBUSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7UUFFdkQsMkVBQTJFO1FBQzNFLDBFQUEwRTtRQUMxRSwyRUFBMkU7UUFDM0UsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLFVBQVUsS0FBSyxzQkFBVSxDQUFDLG1CQUFtQixDQUFDO1FBQ3pFLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIseUVBQXlFO1lBQ3pFLHNFQUFzRTtZQUN0RSwyREFBMkQ7WUFDM0QsSUFBQSxtQkFBUyxFQUFDLElBQUEsZ0JBQUksRUFBQyxLQUFLLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkUsQ0FBQztRQUVELEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDeEQsMEVBQTBFO1lBQzFFLHVFQUF1RTtZQUN2RSwyQ0FBMkM7WUFDM0MsSUFBSSxDQUFDLG1CQUFtQixDQUN0QixJQUFJLEVBQ0osSUFBQSxnQkFBSSxFQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQ3hDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxJQUFBLHFDQUFrQixFQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUNsRixDQUFDO1lBQ0YsSUFBSSxDQUFDLDJCQUEyQixDQUM5QixJQUFJLEVBQ0osU0FBUyxJQUFBLHFDQUFrQixFQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUNqRCxDQUFDO1lBRUYsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSyxzQkFBc0IsQ0FDNUIsUUFBeUI7UUFFekIsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUUvQiw0RUFBNEU7UUFDNUUsMkVBQTJFO1FBQzNFLDBFQUEwRTtRQUMxRSwyRUFBMkU7UUFDM0Usb0RBQW9EO1FBQ3BELHdFQUF3RTtRQUN4RSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxNQUFNO1lBQzlDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUNqRCxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2QsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQztRQUVwQyxJQUNFLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUNyQyxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FDYixHQUFHLHNCQUFVLCtCQUErQjtnQkFDMUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsaUJBQWlCO2dCQUNwRSxNQUFNLElBQUksQ0FBQyxXQUFXLGtCQUFrQjtnQkFDeEMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixJQUFJO2dCQUM3RCx1RUFBdUU7Z0JBQ3ZFLE9BQU8seUNBQXVCLHVDQUF1QztnQkFDckUsbUVBQW1FO2dCQUNuRSxlQUFlLENBQ2xCLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHdDQUFzQixDQUFDLENBQUM7UUFDdEUsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNqQyxJQUFJO1lBQ0osSUFBSSxFQUFFLElBQUEsZ0JBQUksRUFDUixJQUFJLENBQUMsV0FBVyxFQUNoQiwyQkFBZ0IsRUFDaEIsR0FBRyxJQUFBLDhCQUFtQixFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQzdEO1lBQ0QsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7U0FDN0IsQ0FBQyxDQUFDLENBQUM7UUFFSixxRUFBcUU7UUFDckUseUJBQXlCO1FBQ3pCLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FDbEIsQ0FBQyxDQUFDLElBQUksS0FBSyx3Q0FBc0I7WUFDL0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLHdDQUFzQjtnQkFDakMsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FDbkMsQ0FBQztRQUVGLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLElBQUEsb0JBQVUsRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDM0IsTUFBTSxJQUFJLEtBQUssQ0FDYixHQUFHLHNCQUFVLDBDQUEwQztvQkFDckQsSUFBSSxJQUFJLENBQUMsSUFBSSxxQkFBcUIsSUFBSSxDQUFDLElBQUksdUJBQXVCO29CQUNsRSxxRUFBcUU7b0JBQ3JFLHFCQUFxQixDQUN4QixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLDJCQUEyQixDQUNqQyxJQUEwQixFQUMxQixNQUFjO1FBRWQsTUFBTSxPQUFPLEdBQUcseUJBQXlCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3BCLE9BQU87UUFDVCxDQUFDO1FBQ0QseUJBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUMvQixrQ0FBa0MsRUFDbEMsR0FBRyxzQkFBVSxxQkFBcUIsSUFBSSxDQUFDLElBQUksd0JBQXdCO1lBQ2pFLG1DQUFtQyxNQUFNLHNCQUFzQjtZQUMvRCxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtEQUFrRDtZQUN2RSx1RUFBdUU7WUFDdkUscUNBQXFDLE1BQU0seUJBQXlCO1lBQ3BFLE9BQU8sTUFBTSx5REFBeUQ7WUFDdEUsb0VBQW9FO1lBQ3BFLDZDQUE2QyxDQUNoRCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssc0JBQXNCLENBQUMsSUFBMEI7UUFDdkQsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxLQUFLLENBQ0gsR0FBRyxzQkFBVSxxQkFBcUIsSUFBSSxDQUFDLElBQUksUUFBUSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FDMUYsQ0FBQztRQUNGLElBQUksS0FBSyxJQUFJLDJCQUEyQixFQUFFLENBQUM7WUFDekMsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLEVBQUUsR0FBRyxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDdkUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sSUFBSSxLQUFLLENBQ2IsR0FBRyxzQkFBVSxvQkFBb0IsSUFBSSxDQUFDLElBQUksUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLGFBQWE7WUFDdEUsaUJBQWlCLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQyxVQUFVO1lBQzFELENBQUMsT0FBTztnQkFDTixDQUFDLENBQUMscUVBQXFFO29CQUNyRSxzRUFBc0U7b0JBQ3RFLHFEQUFxRDtnQkFDdkQsQ0FBQyxDQUFDLGtFQUFrRTtvQkFDbEUsaUVBQWlFO29CQUNqRSxxRUFBcUU7b0JBQ3JFLGlCQUFpQixDQUFDLENBQ3pCLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNLLG1CQUFtQjtRQUN6QixNQUFNLFlBQVksR0FBRyxJQUFBLGdCQUFJLEVBQ3ZCLElBQUksQ0FBQyxXQUFXLEVBQ2hCLDJCQUFnQixFQUNoQiw2QkFBa0IsQ0FDbkIsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFBLG9CQUFVLEVBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksS0FBSyxDQUNiLDRDQUE0QyxZQUFZLElBQUk7Z0JBQzFELElBQUksSUFBSSxDQUFDLFlBQVksK0NBQStDO2dCQUNwRSxtRUFBbUU7Z0JBQ25FLHVFQUF1RTtnQkFDdkUsdUVBQXVFO2dCQUN2RSxxRUFBcUU7Z0JBQ3JFLHNEQUFzRDtnQkFDdEQsNERBQTREO2dCQUM1RCw2REFBNkQ7Z0JBQzdELDRDQUE0QyxDQUMvQyxDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFvQixJQUFJLENBQUMsS0FBSyxDQUMxQyxJQUFBLHNCQUFZLEVBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUNwQyxDQUFDO1FBQ0YsSUFBSSxRQUFRLENBQUMsT0FBTyxLQUFLLG1DQUF3QixFQUFFLENBQUM7WUFDbEQsTUFBTSxJQUFJLEtBQUssQ0FDYixzQ0FBc0MsWUFBWSxjQUFjO2dCQUM5RCxHQUFHLFFBQVEsQ0FBQyxPQUFPLGlEQUFpRDtnQkFDcEUsR0FBRyxtQ0FBd0Isc0NBQXNDO2dCQUNqRSxzRUFBc0U7Z0JBQ3RFLGtFQUFrRSxDQUNyRSxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0ssWUFBWSxDQUNsQixjQUFzQixFQUN0QixXQUFvQixFQUNwQixZQUFxQjtRQUVyQixNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO1FBQ3hELE1BQU0sTUFBTSxHQUFHLElBQUEsZ0JBQUksRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV2RCxNQUFNLFVBQVUsR0FBRyxJQUFBLGdCQUFJLEVBQUMsY0FBYyxFQUFFLDJCQUFnQixDQUFDLENBQUM7UUFDMUQsMkVBQTJFO1FBQzNFLHNFQUFzRTtRQUN0RSxJQUFBLGdCQUFNLEVBQUMsVUFBVSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNyRCxJQUFBLG1CQUFTLEVBQUMsVUFBVSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDM0MsSUFBQSxnQkFBTSxFQUFDLE1BQU0sRUFBRSxJQUFBLGdCQUFJLEVBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDeEMsSUFBQSxnQkFBTSxFQUNKLElBQUEsZ0JBQUksRUFBQyxJQUFJLENBQUMsV0FBVyxFQUFFLDJCQUFnQixFQUFFLDZCQUFrQixDQUFDLEVBQzVELElBQUEsZ0JBQUksRUFBQyxVQUFVLEVBQUUsNkJBQWtCLENBQUMsQ0FDckMsQ0FBQztRQUNGLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNsQix1RUFBdUU7WUFDdkUsdUVBQXVFO1lBQ3ZFLHFDQUFxQztZQUNyQyx3RUFBd0U7WUFDeEUsMEVBQTBFO1lBQzFFLG1CQUFtQixDQUNqQixVQUFVLEVBQ1YsSUFBQSxnQkFBSSxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUMxQyxDQUFDO1FBQ0osQ0FBQztRQUNELEtBQUssQ0FDSCxHQUFHLHNCQUFVLFdBQVcsS0FBSyxRQUFRLDZCQUFrQixPQUFPLFVBQVUsRUFBRSxDQUMzRSxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BK0JHO0lBQ0ssY0FBYztRQUNwQixJQUFJLENBQUM7WUFDSCxPQUFPO2dCQUNMLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQUU7b0JBQ3ZELEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDO2lCQUNuQyxDQUFDO2FBQ0gsQ0FBQztRQUNKLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxLQUFLLENBQ0gsR0FBRyxzQkFBVSwrQ0FBK0M7Z0JBQzFELEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLHdDQUF3QztnQkFDcEUsdUNBQXVDLENBQzFDLENBQUM7WUFDRixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxZQUFZO1FBQ2xCLE9BQU8sQ0FBQyxHQUFHLENBQ1QsR0FBRyxzQkFBVSxjQUFjLElBQUksQ0FBQyxZQUFZLG1CQUFtQixJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUMzRixDQUFDO1FBRUYsMEVBQTBFO1FBQzFFLElBQUksSUFBQSxvQkFBVSxFQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQ2xDLElBQUEsZ0JBQU0sRUFBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM1RCxLQUFLLENBQUMscUNBQXFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCxJQUFBLDZCQUFRLEVBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDMUIsS0FBSyxFQUFFLFNBQVM7Z0JBQ2hCLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWM7Z0JBQzlCLEdBQUcsRUFBRTtvQkFDSCxHQUFHLE9BQU8sQ0FBQyxHQUFHO29CQUNkLHlCQUF5QixFQUFFLElBQUksQ0FBQyxZQUFZO29CQUM1QyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUU7b0JBQ3hCLGlFQUFpRTtvQkFDakUsZ0VBQWdFO29CQUNoRSwrREFBK0Q7b0JBQy9ELEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxNQUFNO3dCQUNuQyxDQUFDLENBQUM7NEJBQ0UsQ0FBQyx5Q0FBdUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQ3ZDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQ2hEO3lCQUNGO3dCQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQ1I7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDbEQsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQW1CRztJQUNLLG9CQUFvQjtRQUMxQixNQUFNLGdCQUFnQixHQUFHLElBQUEsZ0JBQUksRUFBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNwRSxNQUFNLFVBQVUsR0FBRyxJQUFBLHFCQUFXLEVBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQ3JELENBQUMsSUFBWSxFQUFFLEVBQUU7UUFDZiw4Q0FBOEM7UUFDOUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7WUFDNUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDMUQsQ0FBQztRQUVGLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUVELGtDQUFrQztRQUNsQyxNQUFNLGNBQWMsR0FBRyxJQUFBLGdCQUFJLEVBQUMsU0FBUyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDekQsTUFBTSxpQkFBaUIsR0FBRyxJQUFBLHNCQUFZLEVBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRWhFLHlFQUF5RTtRQUN6RSx3RUFBd0U7UUFDeEUsb0VBQW9FO1FBQ3BFLDREQUE0RDtRQUM1RCxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ25DLE1BQU0sYUFBYSxHQUFHLElBQUEsZ0JBQUksRUFBQyxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN4RCxNQUFNLGNBQWMsR0FBRyxnQkFBZ0IsQ0FDckMsSUFBQSxzQkFBWSxFQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsRUFDcEMsaUJBQWlCLEVBQ2pCLGFBQWEsQ0FDZCxDQUFDO1lBQ0YsSUFBSSxjQUFjLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ2pDLEtBQUssQ0FBQyxHQUFHLHNCQUFVLCtCQUErQixhQUFhLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRSxTQUFTO1lBQ1gsQ0FBQztZQUNELElBQUEsdUJBQWEsRUFBQyxhQUFhLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLHdCQUF3QjtRQUM5QixNQUFNLGFBQWEsR0FBRyxJQUFBLGdCQUFJLEVBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLElBQUEsb0JBQVUsRUFBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQy9CLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVELE9BQU8sSUFBQSxxQkFBVyxFQUFDLGFBQWEsRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN6RSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7WUFDaEIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUU7U0FDakMsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSyxtQkFBbUIsQ0FDekIsSUFBMEIsRUFDMUIsVUFBa0IsRUFDbEIsUUFBZ0I7UUFFaEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyx3Q0FBc0IsRUFBRSxDQUFDO2dCQUN6QyxPQUFPLENBQUMsSUFBSSxDQUNWLEdBQUcsc0JBQVUsOEhBQThILENBQzVJLENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsb0JBQW9CLENBQ3ZCLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQ3pCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQ25ELENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNLLDJCQUEyQixDQUNqQyxJQUFZLEVBQ1osVUFBa0I7UUFFbEIsTUFBTSxlQUFlLEdBQWEsRUFBRSxDQUFDO1FBRXJDLHFFQUFxRTtRQUNyRSx3RUFBd0U7UUFDeEUsa0VBQWtFO1FBQ2xFLGtDQUFrQztRQUNsQyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFbEMsd0VBQXdFO1FBQ3hFLDBFQUEwRTtRQUMxRSx5RUFBeUU7UUFDekUsd0VBQXdFO1FBQ3hFLHFEQUFxRDtRQUNyRCwyRUFBMkU7UUFDM0UsNEVBQTRFO1FBQzVFLE1BQU0sUUFBUSxHQUFhLEVBQUUsQ0FBQztRQUM5QixNQUFNLFdBQVcsR0FBYSxFQUFFLENBQUM7UUFFakMsS0FBSyxNQUFNLEtBQUssSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUMvQixJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUNsRCxNQUFNLElBQUksR0FBRyxJQUFBLGdCQUFJLEVBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hELElBQUksSUFBQSxvQkFBVSxFQUFDLElBQUEsZ0JBQUksRUFBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUMzQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM3QixDQUFDO2dCQUNELFNBQVM7WUFDWCxDQUFDO1lBQ0QsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQztnQkFBRSxTQUFTO1lBQ2xFLE1BQU0sUUFBUSxHQUFHLElBQUEsZ0JBQUksRUFBQyxLQUFLLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwRCxJQUFJLEtBQUssQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDO2dCQUMzQixRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFCLENBQUM7aUJBQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztnQkFDL0IsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3QixDQUFDO1FBQ0gsQ0FBQztRQUVELEtBQUssQ0FDSCxHQUFHLHNCQUFVLGFBQWEsUUFBUSxDQUFDLE1BQU0sOEJBQThCLFdBQVcsQ0FBQyxNQUFNLGNBQWMsQ0FDeEcsQ0FBQztRQUVGLEtBQUssTUFBTSxJQUFJLElBQUksUUFBUSxFQUFFLENBQUM7WUFDNUIsSUFBQSxvQkFBVSxFQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pCLEtBQUssQ0FBQyxHQUFHLHNCQUFVLGNBQWMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsS0FBSyxNQUFNLElBQUksSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUMvQixJQUFBLGdCQUFNLEVBQUMsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMvQyxLQUFLLENBQUMsR0FBRyxzQkFBVSxhQUFhLElBQUksRUFBRSxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUNELE9BQU8sc0JBQXNCLENBQzNCLGVBQWUsRUFDZixnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FDN0IsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSyxzQkFBc0IsQ0FDNUIsV0FBbUIsRUFDbkIsUUFBZ0I7UUFFaEIscURBQXFEO1FBQ3JELE1BQU0sUUFBUSxHQUFHO1lBQ2YsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLFFBQVEsRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUU7WUFDdkQsRUFBRSxJQUFJLEVBQUUsU0FBUyxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFO1NBQ2pELENBQUM7UUFFRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUN6QixJQUFBLHNCQUFZLEVBQUMsSUFBQSxnQkFBSSxFQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FDekQsQ0FBQztRQUNGLE1BQU0sb0JBQW9CLEdBQ3hCLFFBQVEsQ0FBQyxvQkFBb0IsSUFBSSxFQUFFLENBQUM7UUFFdEMsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDMUIsTUFBTSxPQUFPLEdBQUcsb0JBQW9CLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2IsT0FBTyxDQUFDLElBQUksQ0FDVixHQUFHLHNCQUFVLFVBQVUsUUFBUSxDQUFDLE9BQU8sdUJBQXVCLEdBQUcsQ0FBQyxJQUFJLHNCQUFzQixHQUFHLENBQUMsT0FBTyxHQUFHLENBQzNHLENBQUM7Z0JBQ0YsT0FBTyxHQUFHLENBQUM7WUFDYixDQUFDO1lBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNLLG9CQUFvQixDQUMxQixPQUFlLEVBQ2YsUUFBNkM7UUFFN0MsTUFBTSxRQUFRLEdBQUcsSUFBQSxnQkFBSSxFQUFDLElBQUEsZ0JBQU0sR0FBRSxFQUFFLHdCQUF3QixDQUFDLENBQUM7UUFDMUQsSUFBQSxtQkFBUyxFQUFDLFFBQVEsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXpDLEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7WUFDM0IsTUFBTSxTQUFTLEdBQUcsSUFBQSxnQkFBSSxFQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUMsTUFBTSxHQUFHLEdBQUcsbUNBQW1DLEdBQUcsQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsT0FBTyxNQUFNLENBQUM7WUFFM0YsaUVBQWlFO1lBQ2pFLE1BQU0sYUFBYSxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsT0FBTyxNQUFNLENBQUM7WUFDdkQsTUFBTSxVQUFVLEdBQUcsSUFBQSxnQkFBSSxFQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUVqRCxrRUFBa0U7WUFDbEUsMERBQTBEO1lBQzFELElBQUksSUFBQSxvQkFBVSxFQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUNqRSxLQUFLLENBQ0gsR0FBRyxzQkFBVSxpQkFBaUIsR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsT0FBTyxTQUFTLFVBQVUsRUFBRSxDQUMzRSxDQUFDO1lBQ0osQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEtBQUssQ0FBQyxHQUFHLHNCQUFVLGdCQUFnQixHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxPQUFPLEtBQUssQ0FBQyxDQUFDO2dCQUVqRSxnRUFBZ0U7Z0JBQ2hFLG1FQUFtRTtnQkFDbkUsbUVBQW1FO2dCQUNuRSxrRUFBa0U7Z0JBQ2xFLGtFQUFrRTtnQkFDbEUsNERBQTREO2dCQUM1RCxrREFBa0Q7Z0JBQ2xELE1BQU0sUUFBUSxHQUFHLElBQUEsZ0JBQUksRUFDbkIsUUFBUSxFQUNSLEdBQUcsYUFBYSxJQUFJLE9BQU8sQ0FBQyxHQUFHLElBQUksSUFBQSx5QkFBVyxFQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUN4RSxDQUFDO2dCQUNGLElBQUksQ0FBQztvQkFDSCw2REFBNkQ7b0JBQzdELDJEQUEyRDtvQkFDM0QseUJBQXlCO29CQUN6QixJQUFBLGlDQUFZLEVBQ1YsTUFBTSxFQUNOO3dCQUNFLElBQUk7d0JBQ0osUUFBUTt3QkFDUixTQUFTO3dCQUNULEdBQUc7d0JBQ0gsZUFBZTt3QkFDZixHQUFHO3dCQUNILElBQUk7d0JBQ0osUUFBUTt3QkFDUixHQUFHO3FCQUNKLEVBQ0QsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQ2xCLENBQUM7b0JBRUYsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO3dCQUN0QyxNQUFNLElBQUksS0FBSyxDQUNiLHVCQUF1QixHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxPQUFPLHlCQUF5QixRQUFRLEVBQUUsQ0FDbEYsQ0FBQztvQkFDSixDQUFDO29CQUVELElBQUEsb0JBQVUsRUFBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ25DLENBQUM7d0JBQVMsQ0FBQztvQkFDVCxJQUFBLGdCQUFNLEVBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ3BDLENBQUM7Z0JBRUQsS0FBSyxDQUNILEdBQUcsc0JBQVUsV0FBVyxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxPQUFPLE9BQU8sVUFBVSxFQUFFLENBQ25FLENBQUM7WUFDSixDQUFDO1lBRUQsSUFBQSxtQkFBUyxFQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzFDLElBQUEsaUNBQVksRUFDVixLQUFLLEVBQ0wsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsc0JBQXNCLENBQUMsRUFDN0QsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQ2xCLENBQUM7WUFFRixLQUFLLENBQUMsR0FBRyxzQkFBVSxjQUFjLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDOUQsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssaUJBQWlCLENBQUMsUUFBZ0I7UUFDeEMsSUFBSSxDQUFDO1lBQ0gsT0FBTyxJQUFBLGtCQUFRLEVBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQzs7QUExekJILGtDQTJ6QkM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLG9CQUFvQixDQUMzQixNQUFtQztJQUVuQyxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDOUQsQ0FBQztBQUVELGdFQUFnRTtBQUNoRSxTQUFTLGdCQUFnQixDQUN2QixNQUFnRDtJQUVoRCxPQUFPLE1BQU07UUFDWCxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ2xFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBZ0Isc0JBQXNCLENBQ3BDLFVBQW9CLEVBQ3BCLFNBQWtCO0lBRWxCLE1BQU0sSUFBSSxHQUNSLFNBQVM7UUFDVCxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FDNUIsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFBLHNCQUFZLEVBQUMsU0FBUyxDQUFDLEdBQUcsZUFBRyxDQUFDLENBQ3BELENBQUM7SUFDSixJQUFJLElBQUksRUFBRSxDQUFDO1FBQ1QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckUsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzFCLEtBQUssQ0FDSCxHQUFHLHNCQUFVLDBDQUEwQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDdkUsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQUMsVUFBa0I7SUFDakQsSUFBSSxDQUFDO1FBQ0gsMkVBQTJFO1FBQzNFLE1BQU0sV0FBVyxHQUFHLElBQUEsMkJBQWEsRUFDL0IsSUFBQSxnQkFBSSxFQUFDLFVBQVUsRUFBRSw4QkFBOEIsQ0FBQyxDQUNqRCxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQy9CLE9BQU8sSUFBQSwyQkFBYSxFQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsU0FBZ0Isb0JBQW9CLENBQ2xDLFVBQWtCLEVBQ2xCLElBQVk7SUFFWixNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLGVBQUcsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sTUFBTSxHQUNWLENBQUMsTUFBTSxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELENBQUMsTUFBTSxLQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDekQsT0FBTyxNQUFNLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFnQixjQUFjLENBQUMsSUFBWTtJQUN6QyxPQUFPLElBQUEsZ0JBQUksRUFBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsUUFBUSxDQUFDLElBQVk7SUFDbkMsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO0lBQzdCLE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkIsS0FBSyxJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxLQUFLLFNBQVMsRUFBRSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDckUsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFBLHFCQUFXLEVBQUMsR0FBRyxFQUFFLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM5RCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BCLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7Z0JBQ3hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBQSxnQkFBSSxFQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN0QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsTUFBTSxZQUFZLEdBQTJCLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDekUsTUFBTSxhQUFhLEdBQUc7SUFDcEIsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7Q0FDM0QsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxTQUFnQixvQkFBb0IsQ0FBQyxJQUFZO0lBQy9DLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEMsTUFBTSxFQUFFLEdBQUcsSUFBQSxrQkFBUSxFQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMvQixJQUFJLENBQUM7UUFDSCxJQUFBLGtCQUFRLEVBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1QyxDQUFDO1lBQVMsQ0FBQztRQUNULElBQUEsbUJBQVMsRUFBQyxFQUFFLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQyxJQUFJLEtBQUssS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUN6QixnRUFBZ0U7UUFDaEUsTUFBTSxPQUFPLEdBQ1gsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0RSxPQUFPLFNBQVMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLFdBQVcsT0FBTyxFQUFFLEVBQUUsQ0FBQztJQUNsRSxDQUFDO0lBQ0QsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEMsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzdDLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLHlCQUF5QixDQUN2QyxJQUFZLEVBQ1osTUFBYztJQUVkLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFrRCxDQUFDO0lBQzNFLEtBQUssTUFBTSxLQUFLLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztZQUFFLFNBQVM7UUFDL0QsTUFBTSxRQUFRLEdBQUcsb0JBQW9CLENBQUMsSUFBQSxnQkFBSSxFQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLFFBQVE7WUFBRSxTQUFTO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUNyRSxJQUFJLFFBQVEsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUN0QixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLENBQUM7UUFDRCxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBQ0QsT0FBTyxDQUFDLEdBQUcsUUFBUSxDQUFDO1NBQ2pCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7U0FDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBQSxvQkFBUSxFQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNuQyxJQUFJLEVBQUUsQ0FBQztBQUNaLENBQUM7QUFFRCwyRUFBMkU7QUFDM0UsU0FBUyxZQUFZLENBQUMsSUFBWSxFQUFFLEdBQVc7SUFDN0MsS0FDRSxJQUFJLE9BQU8sR0FBRyxHQUFHLEVBQ2pCLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQ3hCLE9BQU8sR0FBRyxJQUFBLG1CQUFPLEVBQUMsT0FBTyxDQUFDLEVBQzFCLENBQUM7UUFDRCxJQUFJLElBQUEsb0JBQVUsRUFBQyxJQUFBLGdCQUFJLEVBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM5QyxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBQ0QsSUFBSSxPQUFPLEtBQUssSUFBSTtZQUFFLE1BQU07SUFDOUIsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsVUFBa0IsRUFBRSxTQUFpQjtJQUN2RSxJQUFBLHVCQUFhLEVBQ1gsSUFBQSxnQkFBSSxFQUFDLFVBQVUsRUFBRSxpQ0FBc0IsQ0FBQyxFQUN4QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUEsOEJBQWUsRUFBQyxTQUFTLENBQUMsQ0FBQyxDQUMzQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsVUFBVSxDQUFDLElBQVk7SUFDckMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsS0FBSyxNQUFNLEtBQUssSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDekIsS0FBSyxJQUFJLElBQUEsbUJBQVMsRUFBQyxJQUFBLGdCQUFJLEVBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDOUQsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQzlCLEtBQWEsRUFDYixLQUFhLEVBQ2IsU0FBaUI7SUFFakIsTUFBTSxJQUFJLEdBQUcsSUFBQSx3QkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMzRSxNQUFNLElBQUksR0FBRyxHQUFHLGtCQUFrQixJQUFJLElBQUksS0FBSyxDQUFDO0lBQ2hELElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNsQyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7UUFDekMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLHNCQUFzQixJQUFJLENBQUMsQ0FBQztRQUMzRCxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2YscUVBQXFFO1lBQ3JFLGtFQUFrRTtZQUNsRSxNQUFNLElBQUksS0FBSyxDQUNiLEdBQUcsc0JBQVUsSUFBSSxTQUFTLHlDQUF5QztnQkFDakUsaUVBQWlFLENBQ3BFLENBQUM7UUFDSixDQUFDO1FBQ0QsUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLHNCQUFzQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBQ0QsT0FBTyxHQUFHLElBQUksS0FBSyxLQUFLLEtBQUssc0JBQXNCLEtBQUssUUFBUSxFQUFFLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWNGaWxlU3luYywgZXhlY1N5bmMgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBjcmVhdGVIYXNoLCByYW5kb21CeXRlcyB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHtcbiAgY2xvc2VTeW5jLFxuICBEaXJlbnQsXG4gIGV4aXN0c1N5bmMsXG4gIGxzdGF0U3luYyxcbiAgcmVhZEZpbGVTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgd3JpdGVGaWxlU3luYyxcbiAgcm1TeW5jLFxuICBta2RpclN5bmMsXG4gIGNwU3luYyxcbiAgb3BlblN5bmMsXG4gIHJlYWRTeW5jLFxuICByZW5hbWVTeW5jLFxuICByZWFscGF0aFN5bmMsXG4gIHN0YXRTeW5jLFxuICB1bmxpbmtTeW5jLFxufSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHJlbGF0aXZlLCBzZXAgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBqb2luIGFzIGpvaW5Qb3NpeCB9IGZyb20gXCJub2RlOnBhdGgvcG9zaXhcIjtcbmltcG9ydCB7IEFubm90YXRpb25zIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBBcmNoaXRlY3R1cmUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcbmltcG9ydCBnZXREZWJ1ZyBmcm9tIFwiZGVidWdcIjtcbmltcG9ydCB7XG4gIERFRkFVTFRfRlVOQ1RJT05fR1JPVVAsXG4gIEZVTkNUSU9OX0dST1VQU19FTlZfVkFSLFxuICBGdW5jdGlvbkdyb3VwU3BlYyxcbiAgdmFsaWRhdGVGdW5jdGlvbkdyb3Vwcyxcbn0gZnJvbSBcIi4uL2FkYXB0ZXIvZnVuY3Rpb24tZ3JvdXBzXCI7XG5pbXBvcnQgeyBMT0dfUFJFRklYLCBOZXh0anNUeXBlIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTmV4dGpzQmFzZVByb3BzIH0gZnJvbSBcIi4uL3Jvb3QtY29uc3RydWN0cy9uZXh0anMtYmFzZS1jb25zdHJ1Y3RcIjtcbmltcG9ydCB7XG4gIEFEQVBURVJfRElSX05BTUUsXG4gIEFEQVBURVJfTUFOSUZFU1RfVkVSU0lPTixcbiAgQWRhcHRlck1hbmlmZXN0LFxuICBNQU5JRkVTVF9GSUxFX05BTUUsXG4gIFBVQkxJQ19GSUxFU19GSUxFX05BTUUsXG4gIFJVTlRJTUVfRElSX05BTUUsXG4gIGdyb3VwU3RhZ2luZ0Rpck5hbWUsXG59IGZyb20gXCIuLi9ydW50aW1lL21hbmlmZXN0XCI7XG5pbXBvcnQgeyByZWFkUHVibGljRmlsZXMgfSBmcm9tIFwiLi4vcnVudGltZS9wdWJsaWMtZmlsZXNcIjtcbmltcG9ydCB7XG4gIGFzc2V0UHJlZml4UGF0aCxcbiAgbm9ybWFsaXplQmFzZVBhdGgsXG4gIHJlbGF0aXZlQXNzZXRQcmVmaXgsXG59IGZyb20gXCIuLi91dGlscy9iYXNlLXBhdGhcIjtcbmltcG9ydCB7XG4gIGdldExhbWJkYUFyY2hpdGVjdHVyZSxcbiAgdG9Ob2RlQXJjaGl0ZWN0dXJlLFxufSBmcm9tIFwiLi4vdXRpbHMvZ2V0LWFyY2hpdGVjdHVyZVwiO1xuXG4vKipcbiAqIExhbWJkYSdzIGhhcmQgbGltaXQgb24gdGhlIHVuemlwcGVkIHNpemUgb2YgYSBmdW5jdGlvbidzIGNvZGUsIHdoaWNoXG4gKiBDbG91ZEZvcm1hdGlvbiBvbmx5IGVuZm9yY2VzIGF0IGRlcGxveSB0aW1lLiBNZWFzdXJlZCBhdCBzeW50aCBpbnN0ZWFkLCBzbyB0aGVcbiAqIGVycm9yIG5hbWVzIHRoZSBncm91cCBhbmQgYXJyaXZlcyBpbiBzZWNvbmRzIHJhdGhlciB0aGFuIG1pbnV0ZXMuXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYW1iZGEvbGF0ZXN0L2RnL2dldHRpbmdzdGFydGVkLWxpbWl0cy5odG1sXG4gKi9cbmNvbnN0IExBTUJEQV9VTlpJUFBFRF9MSU1JVF9CWVRFUyA9IDI1MCAqIDEwMjQgKiAxMDI0O1xuXG4vKipcbiAqIE9wZW5zIHRoZSBwYXRjaCBgcGF0Y2hGZXRjaEluQ2xpZW50SnNgIHByZXBlbmRzIHRvIGEgY2xpZW50IGNodW5rLCBmb2xsb3dlZCBieVxuICogYSBoYXNoIG9mIHRoZSBwYXRjaCBpdHNlbGYsIHNvIGEgc2Vjb25kIHN5bnRoIG92ZXIgdGhlIHNhbWUgYC5uZXh0YCBpcyBhIG5vLW9wXG4gKiB3aGlsZSBvbmUgYnkgYSBjZGstbmV4dGpzIHdpdGggYSBkaWZmZXJlbnQgYHBhdGNoLWZldGNoLmpzYCByZXBsYWNlcyBpdC5cbiAqL1xuY29uc3QgUEFUQ0hfRkVUQ0hfTUFSS0VSID0gXCIvKiBjZGstbmV4dGpzOnBhdGNoLWZldGNoXCI7XG4vKiogQ2xvc2VzIHRoZSBwcmVwZW5kZWQgcGF0Y2g7IHRoZSBjaHVuaydzIG93biBjb250ZW50IHN0YXJ0cyBhZnRlciBpdC4gKi9cbmNvbnN0IFBBVENIX0ZFVENIX0VORF9NQVJLRVIgPSBcIi8qIGNkay1uZXh0anM6cGF0Y2gtZmV0Y2g6ZW5kICovXCI7XG5cbmNvbnN0IGRlYnVnID0gZ2V0RGVidWcoXCJjZGstbmV4dGpzOm5leHRqcy1idWlsZFwiKTtcblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNCdWlsZFByb3BzIHtcbiAgLyoqXG4gICAqIEBzZWUge0BsaW5rIE5leHRqc0Jhc2VQcm9wc1tcImJ1aWxkQ29tbWFuZFwiXX1cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkQ29tbWFuZDogTmV4dGpzQmFzZVByb3BzW1wiYnVpbGRDb21tYW5kXCJdO1xuICAvKipcbiAgICogRGlyZWN0b3J5IHdoZXJlIHRoZSBOZXh0LmpzIGFwcGxpY2F0aW9uIGlzIGxvY2F0ZWQgZm9yIGxvY2FsIGJ1aWxkcy5cbiAgICogVGhpcyBzaG91bGQgY29udGFpbiB0aGUgcGFja2FnZS5qc29uIGFuZCBOZXh0LmpzIGFwcGxpY2F0aW9uIGZpbGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGREaXJlY3Rvcnk6IHN0cmluZztcbiAgcmVhZG9ubHkgbmV4dGpzVHlwZTogTmV4dGpzVHlwZTtcbiAgLyoqXG4gICAqIEBzZWUge0BsaW5rIE5leHRqc0Jhc2VQcm9wcy5za2lwQnVpbGR9XG4gICAqL1xuICByZWFkb25seSBza2lwQnVpbGQ/OiBib29sZWFuO1xuICAvKipcbiAgICogUm91dGUgZ3JvdXBzIHRvIHBhY2thZ2UgaW50byBzZXBhcmF0ZSBMYW1iZGEgZnVuY3Rpb25zLiBPbmx5IHRoZSB0d29cbiAgICogRnVuY3Rpb25zIGBOZXh0anNUeXBlYHMgcGFzcyB0aGlzOyBzZWUgYE5leHRqc0Z1bmN0aW9uR3JvdXBgLlxuICAgKi9cbiAgcmVhZG9ubHkgZnVuY3Rpb25Hcm91cHM/OiBOZXh0anNGdW5jdGlvbkdyb3VwUm91dGVzW107XG4gIC8qKlxuICAgKiBMYW1iZGEgYXJjaGl0ZWN0dXJlIHRoZSBGdW5jdGlvbnMgdHlwZXMgZGVwbG95LCB3aGljaCBkZWNpZGVzIHRoZSBgc2hhcnBgXG4gICAqIGJpbmFyaWVzIHN0YWdlZCBpbnRvIHRoZSBkZXBsb3ltZW50IHJvb3RzLiBJZ25vcmVkIGJ5IHRoZSBDb250YWluZXJzXG4gICAqIHR5cGVzLCB3aG9zZSBpbWFnZSBpcyBidWlsdCBmb3IgdGhlIHN5bnRoIG1hY2hpbmUuXG4gICAqIEBkZWZhdWx0IC0gdGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgbWFjaGluZSBydW5uaW5nIHN5bnRoXG4gICAqL1xuICByZWFkb25seSBhcmNoaXRlY3R1cmU/OiBBcmNoaXRlY3R1cmU7XG59XG5cbi8qKlxuICogVGhlIHBhcnQgb2YgYSBmdW5jdGlvbiBncm91cCBgTmV4dGpzQnVpbGRgIG5lZWRzOiB3aGljaCByb3V0ZXMgaXQgb3ducy4gVGhlXG4gKiBwZXItZ3JvdXAgTGFtYmRhIGBvdmVycmlkZXNgIGFyZSBgTmV4dGpzRnVuY3Rpb25zYCcgYnVzaW5lc3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRnVuY3Rpb25Hcm91cFJvdXRlcyB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgcm91dGVzOiBzdHJpbmdbXTtcbn1cblxuLyoqIE9uZSBzdGFnZWQgZGVwbG95bWVudCByb290LCBhbmQgdGhlIGZ1bmN0aW9uIGdyb3VwIGl0IGJlbG9uZ3MgdG8uICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0RlcGxveW1lbnRSb290IHtcbiAgLyoqXG4gICAqIEdyb3VwIG5hbWUsIGBkZWZhdWx0YCBmb3IgdGhlIGltcGxpY2l0IGdyb3VwIHRoYXQgb3ducyBldmVyeSB1bmFzc2lnbmVkXG4gICAqIHJvdXRlLiBUaGUgb25seSBlbnRyeSBpcyBgZGVmYXVsdGAgd2hlbiBgZnVuY3Rpb25Hcm91cHNgIGlzIG5vdCB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgZGVwbG95bWVudCByb290OiB0aGUgTGFtYmRhIHppcCBhc3NldCdzIHNvdXJjZS4gKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuICAvKipcbiAgICogUm91dGUgdGVtcGxhdGVzIHRoaXMgcm9vdCdzIHBhY2thZ2UgaG9sZHMsIGFzIHRoZSBhZGFwdGVyIGFzc2lnbmVkIHRoZW0uXG4gICAqIEVtcHR5IGlzIGxlZ2FsOiB0aGUgZGVmYXVsdCBncm91cCBzdGlsbCBzZXJ2ZXMgYC9fbmV4dC9pbWFnZWAsIHRoZSBzdGF0aWNcbiAgICogZmlsZXMgdGhlIHJ1bnRpbWUgcmVhZHMgb2ZmIGRpc2ssIGFuZCBhbnl0aGluZyB0aGUgY2F0Y2gtYWxsIHJvdXRlcyB0byBpdC5cbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlczogc3RyaW5nW107XG59XG5cbi8qKlxuICogT25lIGJlaGF2aW9yIHRoYXQgcm91dGVzIGEgZnVuY3Rpb24gZ3JvdXAncyBVUkxzIHRvIGl0LCBhcyB0aGUgYWRhcHRlclxuICogY2hlY2tlZCB0aGVtIGFnYWluc3Qgd2hhdCBlYWNoIGdyb3VwIHdhcyBwYWNrYWdlZCB3aXRoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0Z1bmN0aW9uR3JvdXBCZWhhdmlvciB7XG4gIC8qKiBUaGUgZnVuY3Rpb24gZ3JvdXAgdGhlIGJlaGF2aW9yIHJvdXRlcyB0by4gKi9cbiAgcmVhZG9ubHkgZ3JvdXA6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBncm91cCBwYXR0ZXJuIGl0IGNhbWUgZnJvbSAoYC9ibG9nLyoqYCksIG9yIHRoZSBwYXJlbnQgb2YgYW4gb3B0aW9uYWxcbiAgICogY2F0Y2gtYWxsIGEgc3VidHJlZSBwYXR0ZXJuIG1vdmVkIGludG8gdGhlIGdyb3VwIChgL2Jsb2dgIGZvclxuICAgKiBgL2Jsb2cvW1suLi5zbHVnXV1gKSwgd2hpY2ggdGhhdCBzdWJ0cmVlJ3MgYmVoYXZpb3IgZG9lcyBub3QgbWF0Y2guXG4gICAqL1xuICByZWFkb25seSByb3V0ZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIENsb3VkRnJvbnQgcGF0aCBwYXR0ZXJuLCBiZWZvcmUgYmFzZVBhdGggYW5kIHdpdGhvdXQgYSBsZWFkaW5nIHNsYXNoOlxuICAgKiBgYmxvZy8qYCwgYHByaWNpbmdgLCBgcHJpY2luZy9gIGZvciBhIGB0cmFpbGluZ1NsYXNoYCBhcHAsIGFuZFxuICAgKiBgX25leHQvZGF0YS88YnVpbGRJZD4vYmxvZy8qYCBmb3IgYSBncm91cCBvd25pbmcgYSBQYWdlcyBSb3V0ZXIgcGFnZS5cbiAgICovXG4gIHJlYWRvbmx5IHBhdHRlcm46IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IGV2ZXJ5IGRlcGxveW1lbnQgcm9vdCBpcyBzdGFnZWQgZm9yOiB0aGUgYnVpbGQncyBgYXJjaGl0ZWN0dXJlYCwgZWxzZVxuICogdGhlIHN5bnRoIG1hY2hpbmUncy4gQ29udGFpbmVycyBpZ25vcmUgaXQ6IERvY2tlciBidWlsZHMgdGhlaXIgaW1hZ2VcbiAqIG5hdGl2ZWx5LCBzbyBpdCBjYW4gb25seSBtYXRjaCB0aGUgc3ludGggbWFjaGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlcGxveW1lbnRBcmNoaXRlY3R1cmUocHJvcHM6IE5leHRqc0J1aWxkUHJvcHMpOiBBcmNoaXRlY3R1cmUge1xuICBjb25zdCBpc0Z1bmN0aW9ucyA9XG4gICAgcHJvcHMubmV4dGpzVHlwZSA9PT0gTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TIHx8XG4gICAgcHJvcHMubmV4dGpzVHlwZSA9PT0gTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlM7XG4gIHJldHVybiAoaXNGdW5jdGlvbnMgJiYgcHJvcHMuYXJjaGl0ZWN0dXJlKSB8fCBnZXRMYW1iZGFBcmNoaXRlY3R1cmUoKTtcbn1cblxuLyoqIHtAbGluayBOZXh0anNCdWlsZC5idWlsZElkfTogTmV4dC5qcydzIGJ1aWxkIElELCBzdWZmaXhlZCB3aXRoIHRoZSBhcHAncyBgZGVwbG95bWVudElkYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXBsb3ltZW50QnVpbGRJZChtYW5pZmVzdDoge1xuICByZWFkb25seSBidWlsZElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbmZpZzogeyByZWFkb25seSBkZXBsb3ltZW50SWQ6IHN0cmluZyB9O1xufSk6IHN0cmluZyB7XG4gIGNvbnN0IHsgZGVwbG95bWVudElkIH0gPSBtYW5pZmVzdC5jb25maWc7XG4gIHJldHVybiBkZXBsb3ltZW50SWRcbiAgICA/IGAke21hbmlmZXN0LmJ1aWxkSWR9LSR7ZGVwbG95bWVudElkfWBcbiAgICA6IG1hbmlmZXN0LmJ1aWxkSWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVibGljRGlyRW50cnkge1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGlzRGlyZWN0b3J5OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBOZXh0LmpzIGFzc2V0cy5cbiAqIEBsaW5rIGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL3BhZ2VzL2FwaS1yZWZlcmVuY2UvbmV4dC1jb25maWctanMvb3V0cHV0XG4gKi9cbmV4cG9ydCBjbGFzcyBOZXh0anNCdWlsZCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBVbmlxdWUgaWQgZm9yIHRoaXMgZGVwbG95bWVudC4gVXNlZCB0byBwYXJ0aXRpb24gY2FjaGUgc3RvcmFnZSBhbmQgYXNcbiAgICogbWV0YWRhdGEgZm9yIHN0YXRpYyBhc3NldHMgaW4gUzMgYnVja2V0LlxuICAgKlxuICAgKiBOZXh0LmpzJ3MgYnVpbGQgSUQsIHN1ZmZpeGVkIHdpdGggdGhlIGFwcCdzIGBkZXBsb3ltZW50SWRgIHdoZW4gaXQgc2V0c1xuICAgKiBvbmUuIFRoZSBidWlsZCBJRCBhbG9uZSBpcyBub3QgdW5pcXVlIHBlciBkZXBsb3ltZW50OiBzZXR0aW5nXG4gICAqIGBkZXBsb3ltZW50SWRgIChvciBidWlsZGluZyB3aXRoIGBORVhUX0RFUExPWU1FTlRfSURgKSB0dXJucyBvbiBza2V3XG4gICAqIHByb3RlY3Rpb24sIGFuZCBuZXh0LmpzIHRoZW4gKnBpbnMqIHRoZSBidWlsZCBJRCB0byB0aGUgY29uc3RhbnRcbiAgICogYGJ1aWxkLVRmY3RzV1hwZmYyZktTYCDigJQgc2VlIGBnZXRCdWlsZElkYCBpbiBgbmV4dC9kaXN0L2J1aWxkL2luZGV4LmpzYCxcbiAgICogd2hpY2ggZG9lcyB0aGF0IGRlbGliZXJhdGVseSBzbyB0aGF0IHRvb2xpbmcgZG9pbmdcbiAgICogYC5yZXBsYWNlKGVzY2FwZWRCdWlsZElkLCDigKYpYCBzdGlsbCBoYXMgc29tZXRoaW5nIHRvIHJlcGxhY2UuIFR3b1xuICAgKiBzdWNjZXNzaXZlIGRlcGxveW1lbnRzIG9mIHN1Y2ggYW4gYXBwIHdvdWxkIHNoYXJlIG9uZSBjYWNoZSBwcmVmaXggYW5kIG9uZVxuICAgKiByZXZhbGlkYXRpb24tdGFibGUgcGFydGl0aW9uLCBhbmQgdGhlIG5ldyBvbmUgd291bGQgcmVhZCB0aGUgcHJldmlvdXNcbiAgICogb25lJ3MgcHJlcmVuZGVycy4gQXBwZW5kaW5nIHRoZSBkZXBsb3ltZW50IElEIHJlc3RvcmVzIHRoZSBcIm9uZVxuICAgKiBkZXBsb3ltZW50LCBvbmUgcGFydGl0aW9uXCIgaW52YXJpYW50IHRoYXQgSUQgZXhpc3RzIHRvIGNhcnJ5LlxuICAgKlxuICAgKiBOb3RoaW5nIHJvdXRlcyBvbiB0aGlzIHZhbHVlIOKAlCB0aGUgYC9fbmV4dC9kYXRhLzxidWlsZElkPi/igKZgIFVSTCBzcGFjZSBpc1xuICAgKiByb3V0ZWQgb24gTmV4dC5qcydzIG93biBidWlsZCBJRCwgd2hpY2ggaXMgd2hhdCB0aGUgYXBwJ3MgY2xpZW50IGJ1bmRsZXNcbiAgICogY2Fycnkg4oCUIHNvIGl0IGlzIGZyZWUgdG8gYmUgbG9uZ2VyIHRoYW4gbmV4dC5qcydzIG93bi5cbiAgICovXG4gIGJ1aWxkSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIGluaXQgY2FjaGUgZGlyZWN0b3J5XG4gICAqIEBleGFtcGxlIFwiL1VzZXJzL2pvaG4vbXlhcHAvLm5leHQvY2RrLW5leHRqcy1pbml0LWNhY2hlXCJcbiAgICovXG4gIGluaXRDYWNoZURpcjogc3RyaW5nO1xuICAvKipcbiAgICogQWJzb2x1dGUgcGF0aCB0byBwdWJsaWMuIFVzZSBieSBDbG91ZEZyb250L0FMQiB0byBjcmVhdGUgYmVoYXZpb3JzL3J1bGVzXG4gICAqIEBleGFtcGxlIFwiL1VzZXJzL2pvaG4vbXlhcHAvcHVibGljXCJcbiAgICovXG4gIHB1YmxpY0RpckVudHJpZXM6IFB1YmxpY0RpckVudHJ5W107XG4gIC8qKlxuICAgKiBUaGUgSmF2YVNjcmlwdCBmaWxlIE5vZGUuanMgcnVucyB0byBzZXJ2ZSByZXF1ZXN0cywgcmVsYXRpdmUgdG8gdGhlXG4gICAqIGRlcGxveW1lbnQgcm9vdC4gY2RrLW5leHRqcydzIG93biBjb250YWluZXIgc2hlbGwsIG5vdCBgbmV4dCBidWlsZGAgb3V0cHV0LFxuICAgKiBzbyBpdCBpcyB0aGUgc2FtZSBwYXRoIGZvciBldmVyeSBhcHAuXG4gICAqIEBleGFtcGxlIFwiY2RrLW5leHRqcy1ydW50aW1lL3NlcnZlci5tanNcIlxuICAgKi9cbiAgcmVsYXRpdmVQYXRoVG9FbnRyeXBvaW50OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSAubmV4dCBkaXJlY3RvcnkgY29udGFpbmluZyBOZXh0LmpzIGJ1aWxkIGFydGlmYWN0c1xuICAgKi9cbiAgZG90TmV4dFBhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBOZXh0LmpzIGFwcCdzIG93biBgYmFzZVBhdGhgIOKAlCB0aGUgVVJMIHByZWZpeCBpdCBnZW5lcmF0ZXMgaXRzIGxpbmtzIGFuZFxuICAgKiBhc3NldCBocmVmcyB1bmRlciDigJQgYXMgdGhlIGFkYXB0ZXIgbWFuaWZlc3QgcmVjb3JkZWQgaXQuIE5vcm1hbGl6ZWQgdG8gYSBiYXJlIHBhdGggc2VnbWVudCwgZW1wdHkgd2hlbiB0aGUgYXBwIHNldHMgbm9uZS4gRXhwb3NlZCBzb1xuICAgKiByb290IGNvbnN0cnVjdHMgY2FuIHJlY29uY2lsZSBpdCB3aXRoIHRoZSBDREsgYGJhc2VQYXRoYCBwcm9wLCB3aGljaCBpcyBhXG4gICAqIGRpc3RpbmN0IHRoaW5nOyBzZWUgYHJlc29sdmVCYXNlUGF0aGAuXG4gICAqL1xuICBuZXh0Q29uZmlnQmFzZVBhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBOZXh0LmpzIGFwcCdzIG93biBgYXNzZXRQcmVmaXhgLCBhcyBhIHBhdGggd2l0aCBhIGxlYWRpbmcgc2xhc2ggYW5kIG5vXG4gICAqIHRyYWlsaW5nIG9uZSwgZW1wdHkgd2hlbiB0aGUgYXBwIHNldHMgbm9uZSBvciBzZXRzIGFuIGFic29sdXRlIFVSTCAod2hpY2hcbiAgICogbmFtZXMgYW4gb3JpZ2luIGNkay1uZXh0anMgZG9lcyBub3Qgc2VydmUpLlxuICAgKlxuICAgKiBFeHBvc2VkIGJlY2F1c2UgaXQgaXMgdGhlIHNoYXBlIG9mIGBhc3NldFByZWZpeGAgdGhlIHJlZ2lvbmFsXG4gICAqIGBOZXh0anNUeXBlYHMgY2Fubm90IHNlcnZlIOKAlCBzZWUgYHdhcm5VbnNlcnZlZEFzc2V0UHJlZml4YC4gV2hhdCB0aGVcbiAgICogZGlzdHJpYnV0aW9uIGhhcyB0byBhbnN3ZXIgb24gaXMge0BsaW5rIG5leHRDb25maWdBc3NldFByZWZpeFBhdGh9LCB3aGljaFxuICAgKiBhbHNvIGNvdmVycyB0aGUgcGF0aCBhbiBhYnNvbHV0ZSBwcmVmaXggY2Fycmllcy5cbiAgICovXG4gIG5leHRDb25maWdBc3NldFByZWZpeDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBhdGggcG9ydGlvbiBvZiB0aGUgYXBwJ3MgYGFzc2V0UHJlZml4YCwgd2hpY2hldmVyIGZvcm0gaXQgdGFrZXM6IFwiL2NkblwiXG4gICAqIGZvciBib3RoIGBhc3NldFByZWZpeDogXCIvY2RuXCJgIGFuZCBgYXNzZXRQcmVmaXg6XG4gICAqIFwiaHR0cHM6Ly9jZG4uZXhhbXBsZS5jb20vY2RuXCJgLCBlbXB0eSB3aGVuIHRoZXJlIGlzIG5vIHBhdGggdG8gYW5zd2VyIG9uLlxuICAgKlxuICAgKiBFeHBvc2VkIGJlY2F1c2UgaXQgaXMgYSBVUkwgcHJlZml4IHRoZSBkaXN0cmlidXRpb24gaGFzIHRvIGFuc3dlciBvbjogTmV4dC5qc1xuICAgKiBlbWl0cyBgPGFzc2V0UHJlZml4Pi9fbmV4dC9zdGF0aWMvLi4uYCBmb3IgZXZlcnkgYnVuZGxlIGFuZCBjb21waWxlcyBhIHJld3JpdGVcbiAgICogdGhhdCBzZXJ2ZXMgdGhvc2UgVVJMcycgcGF0aHMgaXRzZWxmLCB3aGlsZSB0aGUgb2JqZWN0cyBsaXZlIGluIFMzIHVuZGVyXG4gICAqIGA8YmFzZVBhdGg+L19uZXh0L3N0YXRpYy8uLi5gLlxuICAgKi9cbiAgbmV4dENvbmZpZ0Fzc2V0UHJlZml4UGF0aDogc3RyaW5nO1xuICAvKipcbiAgICogRXZlcnkgc3RhZ2VkIGRlcGxveW1lbnQgcm9vdCwgb25lIHBlciBmdW5jdGlvbiBncm91cCwgYGRlZmF1bHRgIGZpcnN0OiB0aGVcbiAgICogc3RhZ2VkIHVuaW9uIG9mIGVhY2ggZ3JvdXAncyBzaGlwcGVkIG91dHB1dHMgYW5kIHRoZWlyIHRyYWNlZCBhc3NldHMsXG4gICAqIHdyaXR0ZW4gYnkgdGhlIGFkYXB0ZXIncyBgb25CdWlsZENvbXBsZXRlYC4gRXhhY3RseSBvbmUgZW50cnkgKG5hbWVkXG4gICAqIGBkZWZhdWx0YCwgYXQgYC5uZXh0L2Nkay1uZXh0anMtYWRhcHRlci9hcHBgKSB1bmxlc3MgYGZ1bmN0aW9uR3JvdXBzYFxuICAgKiBzcGxpdHMgdGhlIGFwcC4gVGhlIExhbWJkYSB6aXAgYXNzZXRzOyBDb250YWluZXJzIGBDT1BZYCB0aGUgYGRlZmF1bHRgIG9uZS5cbiAgICovXG4gIGRlcGxveW1lbnRSb290czogTmV4dGpzRGVwbG95bWVudFJvb3RbXTtcbiAgLyoqXG4gICAqIFdoYXQgcm91dGVzIGVhY2ggbm9uLWRlZmF1bHQgZnVuY3Rpb24gZ3JvdXAncyBVUkxzIHRvIGl0LCBtb3N0IHNwZWNpZmljXG4gICAqIGZpcnN0IOKAlCB0aGUgb3JkZXIgQ2xvdWRGcm9udCBoYXMgdG8gc2VlIHRoZW0gaW4sIHNpbmNlIGl0IHN0b3BzIGF0IHRoZVxuICAgKiBmaXJzdCBtYXRjaC4gRW1wdHkgdW5sZXNzIGBmdW5jdGlvbkdyb3Vwc2Agc3BsaXRzIHRoZSBhcHAuXG4gICAqL1xuICBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzOiBOZXh0anNGdW5jdGlvbkdyb3VwQmVoYXZpb3JbXTtcbiAgLyoqXG4gICAqIEZyb20gdGhlIGRlcGxveW1lbnQgcm9vdCB0byB0aGUgTmV4dC5qcyBwcm9qZWN0IGRpciwgUE9TSVgsIGBcIlwiYCB3aGVuXG4gICAqIHRoZSBhcHAgaXMgYXQgdGhlIHJlcG8gcm9vdC4gVGhlIHJ1bnRpbWUgYGNoZGlyYHMgaGVyZTsgQ29udGFpbmVycyBwYXNzIGl0IHRvXG4gICAqIHRoZWlyIERvY2tlcmZpbGUgc28gYC5uZXh0L3N0YXRpY2AgYW5kIGBwdWJsaWNgIGxhbmQgaW4gdGhlIHNhbWUgcGxhY2UuXG4gICAqIEBzZWUgQWRhcHRlck1hbmlmZXN0LnJlbGF0aXZlUHJvamVjdERpclxuICAgKi9cbiAgcmVsYXRpdmVQcm9qZWN0RGlyOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYXJjaGl0ZWN0dXJlIGV2ZXJ5IGRlcGxveW1lbnQgcm9vdCdzIG5hdGl2ZSBkZXBlbmRlbmNpZXMgKGBzaGFycGApXG4gICAqIHdlcmUgc3RhZ2VkIGZvci4gVGhlIExhbWJkYXMgZGVwbG95aW5nIHRoZW0gbXVzdCB1c2UgdGhlIHNhbWUgb25lLlxuICAgKi9cbiAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmU7XG5cbiAgcHJpdmF0ZSBwcm9wczogTmV4dGpzQnVpbGRQcm9wcztcbiAgcHJpdmF0ZSBidWlsZENvbW1hbmQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTmV4dGpzQnVpbGRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgIHRoaXMuZG90TmV4dFBhdGggPSBqb2luKHByb3BzLmJ1aWxkRGlyZWN0b3J5LCBcIi5uZXh0XCIpO1xuXG4gICAgdGhpcy5idWlsZENvbW1hbmQgPSBwcm9wcy5idWlsZENvbW1hbmQgfHwgXCJucG0gcnVuIGJ1aWxkXCI7XG5cbiAgICAvLyBTZXQgaW5pdCBjYWNoZSBkaXJlY3RvcnkgcGF0aFxuICAgIHRoaXMuaW5pdENhY2hlRGlyID0gam9pbihcbiAgICAgIHByb3BzLmJ1aWxkRGlyZWN0b3J5LFxuICAgICAgXCIubmV4dFwiLFxuICAgICAgXCJjZGstbmV4dGpzLWluaXQtY2FjaGVcIixcbiAgICApO1xuXG4gICAgLy8gQmVmb3JlIHRoZSBidWlsZCwgbm90IGFmdGVyIGl0OiB0aGUgYnVpbGQgaXMgbWludXRlcyBsb25nLCBhbmQgdGhlIGVudiB2YXJcbiAgICAvLyBpdCBwYXNzZXMgZ3JvdXBzIHRocm91Z2ggaXMgb25seSBzZXQgZm9yIGEgbm9uLWVtcHR5IGFycmF5IOKAlCBzbyBhbiBpbnZhbGlkXG4gICAgLy8gYGZ1bmN0aW9uR3JvdXBzYCAoYW4gZW1wdHkgYXJyYXksIGEgcmVzZXJ2ZWQgbmFtZSwgYSBncm91cCBvd25pbmcgbm9cbiAgICAvLyByb3V0ZXMpIHdvdWxkIG90aGVyd2lzZSBiZSByZXBvcnRlZCBhcyBcInRoZSBidWlsZCBzdGFnZWQgdGhlIHdyb25nXG4gICAgLy8gZ3JvdXBzXCIsIGFmdGVyIHBheWluZyBmb3IgdGhlIGJ1aWxkLCBpbnN0ZWFkIG9mIGFzIHRoZSBwcm9wIGVycm9yIGl0IGlzLlxuICAgIGlmIChwcm9wcy5mdW5jdGlvbkdyb3Vwcykge1xuICAgICAgdmFsaWRhdGVGdW5jdGlvbkdyb3Vwcyhwcm9wcy5mdW5jdGlvbkdyb3VwcyBhcyBGdW5jdGlvbkdyb3VwU3BlY1tdKTtcbiAgICB9XG5cbiAgICAvLyBFeGVjdXRlIGxvY2FsIGJ1aWxkIHByb2Nlc3NcbiAgICBpZiAocHJvcHMuc2tpcEJ1aWxkICE9PSB0cnVlKSB7XG4gICAgICB0aGlzLnJ1bk5leHRCdWlsZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1ZyhgJHtMT0dfUFJFRklYfSBTa2lwcGluZzogJHt0aGlzLmJ1aWxkQ29tbWFuZH1gKTtcbiAgICB9XG5cbiAgICAvLyBGaXJzdCwgYmVmb3JlIGFueXRoaW5nIGVsc2UgcmVhZHMgYC5uZXh0YDogYSBtaXNzaW5nIG1hbmlmZXN0IGlzIHRoZSBvbmVcbiAgICAvLyBlcnJvciB0aGF0IG5hbWVzIHRoZSBjYXVzZSAobm8gYnVpbGQsIG9yIG9uZSB3aXRob3V0IHRoZSBhZGFwdGVyKSwgd2hlcmVcbiAgICAvLyBldmVyeSBsYXRlciByZWFkIGZhaWxzIHdpdGggYSBiYXJlIEVOT0VOVC5cbiAgICBjb25zdCBtYW5pZmVzdCA9IHRoaXMucmVhZEFkYXB0ZXJNYW5pZmVzdCgpO1xuXG4gICAgLy8gRGVsaWJlcmF0ZWx5IG91dHNpZGUgdGhlIGBza2lwQnVpbGRgIGdhdGUuIFRoZSBwYXRjaCBpcyBhIHByb3BlcnR5IG9mXG4gICAgLy8gKnNlcnZpbmcqIHRocm91Z2ggQ2xvdWRGcm9udCwgbm90IG9mIHdobyByYW4gYG5leHQgYnVpbGRgOiB3aXRob3V0IGl0XG4gICAgLy8gZXZlcnkgUE9TVCB3aXRoIGEgYm9keSBpcyByZWplY3RlZCBieSB0aGUgTGFtYmRhIEZ1bmN0aW9uIFVSTCBiZWZvcmUgaXRcbiAgICAvLyByZWFjaGVzIHRoZSBhcHAgKHNlZSBgcGF0Y2hGZXRjaEluQ2xpZW50SnNgKS4gUnVubmluZyBpdCBvbmx5IGluc2lkZVxuICAgIC8vIGBydW5OZXh0QnVpbGRgIG1lYW50IGBza2lwQnVpbGQ6IHRydWVgIHNpbGVudGx5IHNoaXBwZWQgYW4gYXBwIHdob3NlXG4gICAgLy8gc2VydmVyIGFjdGlvbnMgYW5kIFBPU1Qgcm91dGUgaGFuZGxlcnMgYWxsIHJldHVybmVkIDQwMy5cbiAgICBpZiAocHJvcHMubmV4dGpzVHlwZSA9PT0gTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TKSB7XG4gICAgICB0aGlzLnBhdGNoRmV0Y2hJbkNsaWVudEpzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5idWlsZElkID0gZGVwbG95bWVudEJ1aWxkSWQobWFuaWZlc3QpO1xuICAgIHRoaXMucHVibGljRGlyRW50cmllcyA9IHRoaXMuZ2V0TG9jYWxQdWJsaWNEaXJFbnRyaWVzKCk7XG4gICAgLy8gTmV4dC5qcydzIHJlc29sdmVkIGNvbmZpZywgdGhlIHNhbWUgb25lIGl0IHdyaXRlcyBpbnRvXG4gICAgLy8gYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYC5cbiAgICB0aGlzLm5leHRDb25maWdCYXNlUGF0aCA9IG5vcm1hbGl6ZUJhc2VQYXRoKG1hbmlmZXN0LmNvbmZpZy5iYXNlUGF0aCk7XG4gICAgdGhpcy5uZXh0Q29uZmlnQXNzZXRQcmVmaXggPSByZWxhdGl2ZUFzc2V0UHJlZml4KFxuICAgICAgbWFuaWZlc3QuY29uZmlnLmFzc2V0UHJlZml4LFxuICAgICk7XG4gICAgdGhpcy5uZXh0Q29uZmlnQXNzZXRQcmVmaXhQYXRoID0gYXNzZXRQcmVmaXhQYXRoKFxuICAgICAgbWFuaWZlc3QuY29uZmlnLmFzc2V0UHJlZml4LFxuICAgICk7XG5cbiAgICBjb25zdCBpc0Z1bmN0aW9ucyA9XG4gICAgICBwcm9wcy5uZXh0anNUeXBlID09PSBOZXh0anNUeXBlLkdMT0JBTF9GVU5DVElPTlMgfHxcbiAgICAgIHByb3BzLm5leHRqc1R5cGUgPT09IE5leHRqc1R5cGUuUkVHSU9OQUxfRlVOQ1RJT05TO1xuXG4gICAgdGhpcy5yZWxhdGl2ZVByb2plY3REaXIgPSBtYW5pZmVzdC5yZWxhdGl2ZVByb2plY3REaXI7XG4gICAgdGhpcy5yZWxhdGl2ZVBhdGhUb0VudHJ5cG9pbnQgPSBqb2luUG9zaXgoUlVOVElNRV9ESVJfTkFNRSwgXCJzZXJ2ZXIubWpzXCIpO1xuICAgIHRoaXMuYXJjaGl0ZWN0dXJlID0gZGVwbG95bWVudEFyY2hpdGVjdHVyZShwcm9wcyk7XG4gICAgdGhpcy5kZXBsb3ltZW50Um9vdHMgPSB0aGlzLnJlc29sdmVEZXBsb3ltZW50Um9vdHMobWFuaWZlc3QpO1xuICAgIHRoaXMuZnVuY3Rpb25Hcm91cEJlaGF2aW9ycyA9IG1hbmlmZXN0LmJlaGF2aW9ycyA/PyBbXTtcblxuICAgIC8vIE9ubHkgdGhlIFJlZ2lvbmFsQ29udGFpbmVycyBpbWFnZSBjYXJyaWVzIGBwdWJsaWMvYDogbm90aGluZyBpcyBpbiBmcm9udFxuICAgIC8vIG9mIGl0IHRvIGFuc3dlciB0aG9zZSBwYXRocyBmcm9tIFMzLiBFdmVyeSBvdGhlciB0eXBlIGxpc3RzIGl0IGhlcmUgYW5kXG4gICAgLy8gcmVhZHMgYSBmaWxlIHRoZSBlZGdlIGRpZG4ndCByb3V0ZSB0byBTMyAoYSByZXdyaXRlIG9udG8gaXQpIGZyb20gdGhlcmUuXG4gICAgY29uc3QgcHVibGljT25EaXNrID0gcHJvcHMubmV4dGpzVHlwZSA9PT0gTmV4dGpzVHlwZS5SRUdJT05BTF9DT05UQUlORVJTO1xuICAgIGlmIChwdWJsaWNPbkRpc2spIHtcbiAgICAgIC8vIEl0cyBnZW5lcmF0ZWQgRG9ja2VyZmlsZSBgQ09QWWBzIGBwdWJsaWNgLCB3aGljaCBmYWlscyB0aGUgaW1hZ2UgYnVpbGRcbiAgICAgIC8vIHdoZW4gdGhlIGFwcCBoYXMgbm9uZS4gQW4gZW1wdHkgZGlyZWN0b3J5IGlzIHdoYXQgYG5leHQgc3RhcnRgIHNlZXNcbiAgICAgIC8vIGZvciBhbiBhcHAgd2l0aG91dCBvbmUgYW55d2F5LCBhbmQgZ2l0IGRvZXNuJ3QgdHJhY2sgaXQuXG4gICAgICBta2RpclN5bmMoam9pbihwcm9wcy5idWlsZERpcmVjdG9yeSwgXCJwdWJsaWNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgcm9vdCBvZiB0aGlzLmRlcGxveW1lbnRSb290cykge1xuICAgICAgdGhpcy5zdGFnZVJ1bnRpbWUocm9vdC5wYXRoLCBpc0Z1bmN0aW9ucywgcHVibGljT25EaXNrKTtcbiAgICAgIC8vIEZ1bmN0aW9ucyBydW4gb24gdGhlIExhbWJkYSBtYW5hZ2VkIHJ1bnRpbWUgKEFtYXpvbiBMaW51eCAyMDIzLCBnbGliYyksXG4gICAgICAvLyBmb3IgdGhlIGFyY2hpdGVjdHVyZSB0aGVpciBMYW1iZGEgZGVwbG95cywgd2hhdGV2ZXIgdGhpcyBtYWNoaW5lIGlzO1xuICAgICAgLy8gQ29udGFpbmVycyBydW4gb24gbm9kZToyNC1hbHBpbmUgKG11c2wpLlxuICAgICAgdGhpcy5zdGFnZVNoYXJwRm9yVGFyZ2V0KFxuICAgICAgICByb290LFxuICAgICAgICBqb2luKHJvb3QucGF0aCwgdGhpcy5yZWxhdGl2ZVByb2plY3REaXIpLFxuICAgICAgICBgJHtpc0Z1bmN0aW9ucyA/IFwibGludXhcIiA6IFwibGludXhtdXNsXCJ9LSR7dG9Ob2RlQXJjaGl0ZWN0dXJlKHRoaXMuYXJjaGl0ZWN0dXJlKX1gLFxuICAgICAgKTtcbiAgICAgIHRoaXMud2Fybk9uRm9yZWlnbk5hdGl2ZUJpbmFyaWVzKFxuICAgICAgICByb290LFxuICAgICAgICBgbGludXgtJHt0b05vZGVBcmNoaXRlY3R1cmUodGhpcy5hcmNoaXRlY3R1cmUpfWAsXG4gICAgICApO1xuXG4gICAgICBpZiAoaXNGdW5jdGlvbnMpIHtcbiAgICAgICAgdGhpcy5hc3NlcnRVbmRlckxhbWJkYUxpbWl0KHJvb3QpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaW5lIHVwIHRoZSBncm91cHMgdGhlIHByb3BzIGFza2VkIGZvciB3aXRoIHRoZSByb290cyB0aGUgYnVpbGQgYWN0dWFsbHlcbiAgICogc3RhZ2VkLCBhbmQgZmFpbCBsb3VkbHkgd2hlbiB0aGV5IGRpc2FncmVlLlxuICAgKlxuICAgKiBUaGV5IGNhbiBkaXNhZ3JlZSBpbiBib3RoIGRpcmVjdGlvbnMsIGFuZCBib3RoIG1lYW4gdGhlIHNhbWUgdGhpbmcg4oCUIHRoZVxuICAgKiBgLm5leHRgIG9uIGRpc2sgY2FtZSBmcm9tIGEgYnVpbGQgdGhhdCBkaWQgbm90IHNlZSB0aGlzIGBmdW5jdGlvbkdyb3Vwc2Ag4oCUXG4gICAqIGJ1dCB0aGUgY2F1c2VzIGRpZmZlcjogYHNraXBCdWlsZDogdHJ1ZWAgd2l0aCBhIGJ1aWxkIHJ1biBieSBoYW5kLCBvciBhXG4gICAqIHN0YWxlIGAubmV4dGAgZnJvbSBiZWZvcmUgdGhlIHByb3AgY2hhbmdlZC4gRWl0aGVyIHdheSBldmVyeSBsYXRlciBzeW1wdG9tXG4gICAqIChhIExhbWJkYSBtaXNzaW5nIGFuIGVudHJ5cG9pbnQsIGEgQ2xvdWRGcm9udCBiZWhhdmlvciBwb2ludGluZyBhdCBhXG4gICAqIGZ1bmN0aW9uIHRoYXQgY2Fubm90IHNlcnZlIGl0KSBpcyB0aGlzLCBzZXZlcmFsIHN0ZXBzIGRvd25zdHJlYW0uXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVEZXBsb3ltZW50Um9vdHMoXG4gICAgbWFuaWZlc3Q6IEFkYXB0ZXJNYW5pZmVzdCxcbiAgKTogTmV4dGpzRGVwbG95bWVudFJvb3RbXSB7XG4gICAgY29uc3Qgc3RhZ2VkID0gbWFuaWZlc3QuZ3JvdXBzO1xuXG4gICAgLy8gTmFtZXMgKmFuZCogcm91dGVzOiBtb3ZpbmcgYC9yZXBvcnRzLyoqYCBpbnRvIGFuIGV4aXN0aW5nIGdyb3VwIGtlZXBzIHRoZVxuICAgIC8vIG5hbWVzIGFuZCBzdGlsbCBsZWF2ZXMgdGhhdCBncm91cCdzIHppcCB3aXRob3V0IHRoZSByZXBvcnRzIGVudHJ5cG9pbnRzLlxuICAgIC8vIE9yZGVyIGlzIG5vdDogYXNzaWdubWVudCBhbmQgQ2xvdWRGcm9udCBiZWhhdmlvcnMgYm90aCBnbyBtb3N0IHNwZWNpZmljXG4gICAgLy8gZmlyc3QsIGFuZCBubyB0d28gZGlzdGluY3QgcGF0dGVybnMgdGllIG9uIGEgVVJMIChgZnVuY3Rpb24tZ3JvdXBzLnRzYCksXG4gICAgLy8gc28gcmVvcmRlcmluZyBncm91cHMgb3Igcm91dGVzIGlzIHRoZSBzYW1lIHNwbGl0LlxuICAgIC8vIEFscmVhZHkgdmFsaWRhdGVkIGluIHRoZSBjb25zdHJ1Y3Rvciwgc28gdGhpcyBpcyBhYnNlbnQgb3Igbm9uLWVtcHR5LlxuICAgIGNvbnN0IHdhbnRlZCA9IHRoaXMucHJvcHMuZnVuY3Rpb25Hcm91cHM/Lmxlbmd0aFxuICAgICAgPyB0b0Z1bmN0aW9uR3JvdXBTcGVjcyh0aGlzLnByb3BzLmZ1bmN0aW9uR3JvdXBzKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZ290ID0gbWFuaWZlc3QuZnVuY3Rpb25Hcm91cHM7XG5cbiAgICBpZiAoXG4gICAgICBKU09OLnN0cmluZ2lmeShzb3J0ZWRHcm91cFNwZWNzKHdhbnRlZCkpICE9PVxuICAgICAgSlNPTi5zdHJpbmdpZnkoc29ydGVkR3JvdXBTcGVjcyhnb3QpKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSBcXGBmdW5jdGlvbkdyb3Vwc1xcYCBhc2tzIGZvciBgICtcbiAgICAgICAgICBgJHt3YW50ZWQgPyBKU09OLnN0cmluZ2lmeSh3YW50ZWQpIDogXCJubyBzcGxpdHRpbmdcIn0gYnV0IHRoZSBidWlsZCBgICtcbiAgICAgICAgICBgaW4gJHt0aGlzLmRvdE5leHRQYXRofSB3YXMgc3BsaXQgaW50byBgICtcbiAgICAgICAgICBgJHtnb3QgPyBKU09OLnN0cmluZ2lmeShnb3QpIDogXCJhIHNpbmdsZSBkZXBsb3ltZW50IHJvb3RcIn0uIGAgK1xuICAgICAgICAgIGBHcm91cHMgYXJlIHJlc29sdmVkIGR1cmluZyBcXGBuZXh0IGJ1aWxkXFxgIChjZGstbmV4dGpzIHBhc3NlcyB0aGVtIGluIGAgK1xuICAgICAgICAgIGB2aWEgJHtGVU5DVElPTl9HUk9VUFNfRU5WX1ZBUn0pLCBzbyB0aGlzIG1lYW5zIHRoZSBidWlsZCBvdXRwdXQgaXMgYCArXG4gICAgICAgICAgYHN0YWxlLCBvciBcXGBza2lwQnVpbGQ6IHRydWVcXGAgYW5kIHRoZSBidWlsZCB3YXMgcnVuIHdpdGhvdXQgdGhhdCBgICtcbiAgICAgICAgICBgdmFyaWFibGUgc2V0LmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG5hbWVzID0gc3RhZ2VkID8gT2JqZWN0LmtleXMoc3RhZ2VkKSA6IFtERUZBVUxUX0ZVTkNUSU9OX0dST1VQXTtcbiAgICBjb25zdCByb290cyA9IG5hbWVzLm1hcCgobmFtZSkgPT4gKHtcbiAgICAgIG5hbWUsXG4gICAgICBwYXRoOiBqb2luKFxuICAgICAgICB0aGlzLmRvdE5leHRQYXRoLFxuICAgICAgICBBREFQVEVSX0RJUl9OQU1FLFxuICAgICAgICAuLi5ncm91cFN0YWdpbmdEaXJOYW1lKHN0YWdlZCA/IG5hbWUgOiB1bmRlZmluZWQpLnNwbGl0KFwiL1wiKSxcbiAgICAgICksXG4gICAgICByb3V0ZXM6IHN0YWdlZD8uW25hbWVdID8/IFtdLFxuICAgIH0pKTtcblxuICAgIC8vIGBkZWZhdWx0YCBmaXJzdCwgc28gYW55IFwidGhlIHJvb3RcIiBjYWxsZXIgZ2V0cyB0aGUgZ3JvdXAgdGhhdCBvd25zXG4gICAgLy8gZXZlcnl0aGluZyB1bmFzc2lnbmVkLlxuICAgIHJvb3RzLnNvcnQoKGEsIGIpID0+XG4gICAgICBhLm5hbWUgPT09IERFRkFVTFRfRlVOQ1RJT05fR1JPVVBcbiAgICAgICAgPyAtMVxuICAgICAgICA6IGIubmFtZSA9PT0gREVGQVVMVF9GVU5DVElPTl9HUk9VUFxuICAgICAgICAgID8gMVxuICAgICAgICAgIDogYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSxcbiAgICApO1xuXG4gICAgZm9yIChjb25zdCByb290IG9mIHJvb3RzKSB7XG4gICAgICBpZiAoIWV4aXN0c1N5bmMocm9vdC5wYXRoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYCR7TE9HX1BSRUZJWH0gVGhlIGRlcGxveW1lbnQgcm9vdCBmb3IgZnVuY3Rpb24gZ3JvdXAgYCArXG4gICAgICAgICAgICBgXCIke3Jvb3QubmFtZX1cIiBpcyBtaXNzaW5nIGZyb20gJHtyb290LnBhdGh9LCB0aG91Z2ggdGhlIGFkYXB0ZXIgYCArXG4gICAgICAgICAgICBgbWFuaWZlc3QgbGlzdHMgaXQuIFRoZSBcXGAubmV4dFxcYCBkaXJlY3RvcnkgaGFzIGJlZW4gbW9kaWZpZWQgc2luY2UgYCArXG4gICAgICAgICAgICBgXFxgbmV4dCBidWlsZFxcYCByYW4uYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvb3RzO1xuICB9XG5cbiAgLyoqXG4gICAqIGBuZXh0IGJ1aWxkYCB0cmFjZXMgbmF0aXZlIGFkZG9ucyBmcm9tIHRoZSBtYWNoaW5lIGl0IHJ1bnMgb24sIGFuZCBvbmx5XG4gICAqIGBzaGFycGAgaXMgc3dhcHBlZCBmb3IgdGhlIHRhcmdldC4gQW55dGhpbmcgZWxzZSBidWlsdCBmb3IgYW5vdGhlciBwbGF0Zm9ybVxuICAgKiBmYWlscyB3aXRoIE1PRFVMRV9OT1RfRk9VTkQgb3IgRVJSX0RMT1BFTl9GQUlMRUQgb24gdGhlIGZpcnN0IHJlcXVlc3QgdGhhdFxuICAgKiBsb2FkcyBpdCwgc28gc2F5IHdoaWNoIHBhY2thZ2UgYXQgc3ludGguIEEgd2FybmluZywgbm90IGFuIGVycm9yOiBzb21lXG4gICAqIGFkZG9ucyBhcmUgb3B0aW9uYWwgKGB3c2AncyBgYnVmZmVydXRpbGAsIGBmc2V2ZW50c2ApIGFuZCBmYWxsIGJhY2sgdG8gSlMuXG4gICAqXG4gICAqIE9ubHkgdGhlIE9TIGFuZCBDUFUgYXJlIGNoZWNrZWQ6IGdsaWJjIGFuZCBtdXNsIGJ1aWxkcyBzaGFyZSBhIGhlYWRlci5cbiAgICovXG4gIHByaXZhdGUgd2Fybk9uRm9yZWlnbk5hdGl2ZUJpbmFyaWVzKFxuICAgIHJvb3Q6IE5leHRqc0RlcGxveW1lbnRSb290LFxuICAgIHRhcmdldDogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBmb3JlaWduID0gZmluZEZvcmVpZ25OYXRpdmVQYWNrYWdlcyhyb290LnBhdGgsIHRhcmdldCk7XG4gICAgaWYgKCFmb3JlaWduLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nVjIoXG4gICAgICBcImNkay1uZXh0anM6Zm9yZWlnbk5hdGl2ZUJpbmFyaWVzXCIsXG4gICAgICBgJHtMT0dfUFJFRklYfSBEZXBsb3ltZW50IHJvb3QgXCIke3Jvb3QubmFtZX1cIiBoYXMgbmF0aXZlIGJpbmFyaWVzIGAgK1xuICAgICAgICBgYnVpbHQgZm9yIGEgcGxhdGZvcm0gb3RoZXIgdGhhbiAke3RhcmdldH0sIHdoaWNoIGl0IHJ1bnMgb246IGAgK1xuICAgICAgICBgJHtmb3JlaWduLmpvaW4oXCIsIFwiKX0uIFxcYG5leHQgYnVpbGRcXGAgdHJhY2VkIHRoZW0gZnJvbSB0aGlzIG1hY2hpbmUsIGAgK1xuICAgICAgICBgc28gdGhleSBmYWlsIG9uIHRoZSBmaXJzdCByZXF1ZXN0IHRoYXQgbG9hZHMgdGhlbSB1bmxlc3MgdGhlIHBhY2thZ2UgYCArXG4gICAgICAgIGBmYWxscyBiYWNrIHdpdGhvdXQgdGhlbS4gQnVpbGQgb24gJHt0YXJnZXR9LCBvciByZXBsYWNlIGVhY2ggd2l0aCBgICtcbiAgICAgICAgYHRoZSAke3RhcmdldH0gdmFyaWFudCBhZnRlciBcXGBuZXh0IGJ1aWxkXFxgIChlLmcuIFxcYG5wbSBwYWNrXFxgIGl0IGluIGAgK1xuICAgICAgICBgeW91ciBcXGBidWlsZENvbW1hbmRcXGApLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2Nka2xhYnMvY2RrLW5leHRqcy9gICtcbiAgICAgICAgYGJsb2IvbWFpbi9kb2NzL25hdGl2ZS1kZXBlbmRlbmNpZXMtZ3VpZGUubWRgLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTGFtYmRhIGVuZm9yY2VzIDI1MCBNQiB1bnppcHBlZCBhdCBDbG91ZEZvcm1hdGlvbiB0aW1lLCB3aGljaCBpcyBtaW51dGVzXG4gICAqIGludG8gYSBkZXBsb3kgYW5kIHJlcG9ydHMgb25seSBhIHNpemUuIFNwbGl0dGluZyBleGlzdHMgdG8gc3RheSB1bmRlciB0aGF0XG4gICAqIGNhcCwgc28gdGhlIGVycm9yIHRoYXQgdGVsbHMgeW91IHRvIHNwbGl0IGZ1cnRoZXIgaGFzIHRvIG5hbWUgdGhlIGdyb3VwLCBpdHNcbiAgICogc2l6ZSwgYW5kIHdoYXQgdG8gZG8g4oCUIGFuZCBhcnJpdmUgYXQgc3ludGguXG4gICAqL1xuICBwcml2YXRlIGFzc2VydFVuZGVyTGFtYmRhTGltaXQocm9vdDogTmV4dGpzRGVwbG95bWVudFJvb3QpOiB2b2lkIHtcbiAgICBjb25zdCBieXRlcyA9IHN0b3JlZFNpemUocm9vdC5wYXRoKTtcbiAgICBkZWJ1ZyhcbiAgICAgIGAke0xPR19QUkVGSVh9IERlcGxveW1lbnQgcm9vdCBcIiR7cm9vdC5uYW1lfVwiIGlzICR7KGJ5dGVzIC8gMWU2KS50b0ZpeGVkKDEpfSBNQiB1bnppcHBlZGAsXG4gICAgKTtcbiAgICBpZiAoYnl0ZXMgPD0gTEFNQkRBX1VOWklQUEVEX0xJTUlUX0JZVEVTKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1iID0gKHZhbHVlOiBudW1iZXIpID0+IGAkeyh2YWx1ZSAvIDEwMjQgLyAxMDI0KS50b0ZpeGVkKDApfSBNQmA7XG4gICAgY29uc3QgaXNTcGxpdCA9IHRoaXMuZGVwbG95bWVudFJvb3RzLmxlbmd0aCA+IDE7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7TE9HX1BSRUZJWH0gRnVuY3Rpb24gZ3JvdXAgXCIke3Jvb3QubmFtZX1cIiBpcyAke21iKGJ5dGVzKX0gdW56aXBwZWQsIGAgK1xuICAgICAgICBgb3ZlciBMYW1iZGEncyAke21iKExBTUJEQV9VTlpJUFBFRF9MSU1JVF9CWVRFUyl9IGxpbWl0LiBgICtcbiAgICAgICAgKGlzU3BsaXRcbiAgICAgICAgICA/IGBTcGxpdCBpdHMgcm91dGVzIGZ1cnRoZXIsIG9yIG1vdmUgc29tZSBvZiB0aGVtIGludG8gYW5vdGhlciBncm91cDogYCArXG4gICAgICAgICAgICBgdGhlIGNhcCBpcyBwZXIgZnVuY3Rpb24sIHNvIHRoZSBzaGFyZWQgXFxgbmV4dFxcYCBjbG9zdXJlIGV2ZXJ5IGdyb3VwIGAgK1xuICAgICAgICAgICAgYGR1cGxpY2F0ZXMgY29zdHMgbm90aGluZyBhZ2FpbnN0IGFueSBzaW5nbGUgYnVkZ2V0LmBcbiAgICAgICAgICA6IGBVc2UgdGhlIFxcYGZ1bmN0aW9uR3JvdXBzXFxgIHByb3AgdG8gcGFja2FnZSByb3V0ZXMgaW50byBzZXBhcmF0ZSBgICtcbiAgICAgICAgICAgIGBmdW5jdGlvbnMuIE5vdGUgdGhhdCBzcGxpdHRpbmcgb25seSByZW1vdmVzIHJvdXRlLWxvY2FsIGNvZGUg4oCUIGAgK1xuICAgICAgICAgICAgYGFueXRoaW5nIHJlYWNoYWJsZSBmcm9tIGEgc2hhcmVkIGxheW91dCBvciB0aGUgXFxgbmV4dFxcYCBydW50aW1lIGlzIGAgK1xuICAgICAgICAgICAgYGluIGV2ZXJ5IGdyb3VwLmApLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCB0aGUgbWFuaWZlc3QgdGhlIGFkYXB0ZXIncyBgb25CdWlsZENvbXBsZXRlYCB3cm90ZS5cbiAgICpcbiAgICogSXRzIGFic2VuY2UgbWVhbnMgYG5leHQgYnVpbGRgIHJhbiB3aXRob3V0IGNkay1uZXh0anMncyBhZGFwdGVyIHJlZ2lzdGVyZWRcbiAgICogKG9yIHdpdGggYSBzdGFsZSBgbmV4dC5jb25maWdgKSwgd2hpY2ggaXMgd29ydGggc2F5aW5nIHBsYWlubHkgaGVyZTogZXZlcnlcbiAgICogbGF0ZXIgZmFpbHVyZSDigJQgYSBMYW1iZGEgdGhhdCBjYW5ub3QgZmluZCBgbWFuaWZlc3QuanNvbmAsIGFuIGVtcHR5IGFzc2V0IOKAlFxuICAgKiBpcyB0aGUgc2FtZSBjYXVzZSBzZXZlcmFsIHN0ZXBzIGRvd25zdHJlYW0uXG4gICAqL1xuICBwcml2YXRlIHJlYWRBZGFwdGVyTWFuaWZlc3QoKTogQWRhcHRlck1hbmlmZXN0IHtcbiAgICBjb25zdCBtYW5pZmVzdFBhdGggPSBqb2luKFxuICAgICAgdGhpcy5kb3ROZXh0UGF0aCxcbiAgICAgIEFEQVBURVJfRElSX05BTUUsXG4gICAgICBNQU5JRkVTVF9GSUxFX05BTUUsXG4gICAgKTtcbiAgICBpZiAoIWV4aXN0c1N5bmMobWFuaWZlc3RQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgY2RrLW5leHRqcyBhZGFwdGVyIG1hbmlmZXN0IG5vdCBmb3VuZCBhdCAke21hbmlmZXN0UGF0aH0uIGAgK1xuICAgICAgICAgIGBcIiR7dGhpcy5idWlsZENvbW1hbmR9XCIgbXVzdCBydW4gYSBOZXh0LmpzIGJ1aWxkIHdpdGggY2RrLW5leHRqcydzIGAgK1xuICAgICAgICAgIGBhZGFwdGVyIHJlZ2lzdGVyZWQuIGNkay1uZXh0anMgc2V0cyBcXGBORVhUX0FEQVBURVJfUEFUSFxcYCBvbiB0aGUgYCArXG4gICAgICAgICAgYGJ1aWxkIGl0IHJ1bnMgaXRzZWxmLCBzbyB0aGlzIHVzdWFsbHkgbWVhbnMgZWl0aGVyIHRoZSBidWlsZCBjb21tYW5kIGAgK1xuICAgICAgICAgIGBkb2VzIG5vdCByZWFjaCBcXGBuZXh0IGJ1aWxkXFxgIChhIHdyYXBwZXIgdGhhdCBkcm9wcyB0aGUgZW52aXJvbm1lbnQsIGAgK1xuICAgICAgICAgIGBvciBhIGNhY2hlZCBidWlsZCB0aGF0IGRpZCBub3QgcmUtcnVuKSwgb3IgXFxgc2tpcEJ1aWxkOiB0cnVlXFxgIGFuZCBgICtcbiAgICAgICAgICBgdGhlIGJ1aWxkIGhhcHBlbmVkIG91dHNpZGUgQ0RLLiBGb3IgdGhlIGxhdHRlciwgc2V0IGAgK1xuICAgICAgICAgIGBcXGBhZGFwdGVyUGF0aDogcmVxdWlyZS5yZXNvbHZlKFwiY2RrLW5leHRqcy9hZGFwdGVyXCIpXFxgIGluIGAgK1xuICAgICAgICAgIGBuZXh0LmNvbmZpZy4gQSBjdXN0b20gXFxgZGlzdERpclxcYCBpcyBub3Qgc3VwcG9ydGVkIGVpdGhlcjogYCArXG4gICAgICAgICAgYGNkay1uZXh0anMgcmVhZHMgdGhlIGJ1aWxkIGZyb20gXFxgLm5leHRcXGAuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IG1hbmlmZXN0OiBBZGFwdGVyTWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICAgICAgcmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgXCJ1dGYtOFwiKSxcbiAgICApO1xuICAgIGlmIChtYW5pZmVzdC52ZXJzaW9uICE9PSBBREFQVEVSX01BTklGRVNUX1ZFUlNJT04pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBjZGstbmV4dGpzIGFkYXB0ZXIgbWFuaWZlc3QgYXQgJHttYW5pZmVzdFBhdGh9IGlzIHZlcnNpb24gYCArXG4gICAgICAgICAgYCR7bWFuaWZlc3QudmVyc2lvbn0sIGJ1dCB0aGlzIHZlcnNpb24gb2YgY2RrLW5leHRqcyByZWFkcyB2ZXJzaW9uIGAgK1xuICAgICAgICAgIGAke0FEQVBURVJfTUFOSUZFU1RfVkVSU0lPTn0uIFRoZSBhZGFwdGVyIHRoYXQgd3JvdGUgaXQgYW5kIHRoZSBgICtcbiAgICAgICAgICBgY29uc3RydWN0cyByZWFkaW5nIGl0IGNvbWUgZnJvbSB0aGUgc2FtZSBwYWNrYWdlLCBzbyB0aGlzIG1lYW5zIHR3byBgICtcbiAgICAgICAgICBgY2RrLW5leHRqcyB2ZXJzaW9ucyBhcmUgaW5zdGFsbGVkLCBvciB0aGUgYnVpbGQgb3V0cHV0IGlzIHN0YWxlLmAsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbWFuaWZlc3Q7XG4gIH1cblxuICAvKipcbiAgICogQ29weSBjZGstbmV4dGpzJ3Mgb3duIGJ1bmRsZWQgcmVxdWVzdC1oYW5kbGluZyBzaGVsbCBhbmQgdGhlIG1hbmlmZXN0IGludG9cbiAgICogYDxkZXBsb3ltZW50Um9vdD4vY2RrLW5leHRqcy1ydW50aW1lL2AsIHdoaWNoIGlzIHdoZXJlXG4gICAqIGBkZXBsb3ltZW50Um9vdE9mYC9gZGVwbG95ZWRNYW5pZmVzdFBhdGhgIGV4cGVjdCB0byBmaW5kIHRoZW0uXG4gICAqXG4gICAqIE9ubHkgdGhlIHNoZWxsIHRoZSBkZXBsb3ltZW50IHR5cGUgYWN0dWFsbHkgcnVucyBpcyBjb3BpZWQg4oCUIHRoZSBMYW1iZGFcbiAgICogaGFuZGxlciBmb3IgRnVuY3Rpb25zLCB0aGUgYG5vZGU6aHR0cGAgc2VydmVyIGZvciBDb250YWluZXJzIOKAlCBzbyBub3RoaW5nXG4gICAqIHNoaXBzIH4xLjUgTUIgb2YgZGVhZCBjb2RlIGFuZCB0aGUgdHJlZSBzYXlzIHdoaWNoIHR5cGUgcHJvZHVjZWQgaXQuIEJvdGhcbiAgICogYXJlIGNvcGllZCBmcm9tIHRoaXMgcGFja2FnZSdzIGBsaWIvYCwgbmV4dCB0byB0aGUgY29tcGlsZWQgY29uc3RydWN0LlxuICAgKlxuICAgKiBFdmVyeSBncm91cCBnZXRzIHRoZSBzYW1lIHNoZWxsICphbmQgdGhlIHNhbWUgbWFuaWZlc3QqOiBhIGZ1bmN0aW9uIG9ubHlcbiAgICoga25vd3Mgd2hpY2ggcm91dGVzIGl0IG93bnMgc28gaXQgY2FuIHNheSBzbyB3aGVuIG1pc3JvdXRlZCwgYW5kIHRoYXQgY29tZXNcbiAgICogZnJvbSB7QGxpbmsgRlVOQ1RJT05fR1JPVVBfRU5WX1ZBUn0sIG5vdCBmcm9tIGEgcGVyLWdyb3VwIG1hbmlmZXN0LlxuICAgKi9cbiAgcHJpdmF0ZSBzdGFnZVJ1bnRpbWUoXG4gICAgZGVwbG95bWVudFJvb3Q6IHN0cmluZyxcbiAgICBpc0Z1bmN0aW9uczogYm9vbGVhbixcbiAgICBwdWJsaWNPbkRpc2s6IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHNoZWxsID0gaXNGdW5jdGlvbnMgPyBcImxhbWJkYS5tanNcIiA6IFwic2VydmVyLm1qc1wiO1xuICAgIGNvbnN0IHNvdXJjZSA9IGpvaW4oX19kaXJuYW1lLCBcIi4uXCIsIFwicnVudGltZVwiLCBzaGVsbCk7XG5cbiAgICBjb25zdCBydW50aW1lRGlyID0gam9pbihkZXBsb3ltZW50Um9vdCwgUlVOVElNRV9ESVJfTkFNRSk7XG4gICAgLy8gUmVtb3ZlZCByYXRoZXIgdGhhbiBtZXJnZWQ6IGEgc3RhbGUgc2hlbGwgZnJvbSB0aGUgb3RoZXIgZGVwbG95bWVudCB0eXBlXG4gICAgLy8gd291bGQgb3RoZXJ3aXNlIHNpdCBpbiB0aGUgYXNzZXQgYW5kIGNoYW5nZSBpdHMgaGFzaCBmb3Igbm8gcmVhc29uLlxuICAgIHJtU3luYyhydW50aW1lRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgbWtkaXJTeW5jKHJ1bnRpbWVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGNwU3luYyhzb3VyY2UsIGpvaW4ocnVudGltZURpciwgc2hlbGwpKTtcbiAgICBjcFN5bmMoXG4gICAgICBqb2luKHRoaXMuZG90TmV4dFBhdGgsIEFEQVBURVJfRElSX05BTUUsIE1BTklGRVNUX0ZJTEVfTkFNRSksXG4gICAgICBqb2luKHJ1bnRpbWVEaXIsIE1BTklGRVNUX0ZJTEVfTkFNRSksXG4gICAgKTtcbiAgICBpZiAoIXB1YmxpY09uRGlzaykge1xuICAgICAgLy8gVGhlIExhbWJkYSB6aXBzIGFuZCB0aGUgR2xvYmFsQ29udGFpbmVycyBpbWFnZSBkb24ndCBjYXJyeSBgcHVibGljL2BcbiAgICAgIC8vIChpdHMgYnl0ZXMgYXJlIGluIFMzKSwgc28gdGhlIHJ1bnRpbWUgY2FuJ3QgbGlzdCBpdCBhdCBzdGFydCB0aGUgd2F5XG4gICAgICAvLyB0aGUgUmVnaW9uYWxDb250YWluZXJzIGltYWdlIGRvZXMuXG4gICAgICAvLyBMaXN0ZWQgaGVyZSwgYWZ0ZXIgdGhlIGJ1aWxkIGNvbW1hbmQsIHNvIGBwb3N0YnVpbGRgIG91dHB1dCBpcyBpbiBpdDpcbiAgICAgIC8vIGEgcmV3cml0ZSBvbnRvIGEgbGlzdGVkIGZpbGUgaXMgdGhlbiBzZXJ2ZWQgZnJvbSBTMyByYXRoZXIgdGhhbiA0MDRpbmcuXG4gICAgICB3cml0ZVB1YmxpY0ZpbGVMaXN0KFxuICAgICAgICBydW50aW1lRGlyLFxuICAgICAgICBqb2luKHRoaXMucHJvcHMuYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIpLFxuICAgICAgKTtcbiAgICB9XG4gICAgZGVidWcoXG4gICAgICBgJHtMT0dfUFJFRklYfSBTdGFnZWQgJHtzaGVsbH0gYW5kICR7TUFOSUZFU1RfRklMRV9OQU1FfSBpbiAke3J1bnRpbWVEaXJ9YCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIGBORVhUX0FEQVBURVJfUEFUSGAgZm9yIHRoZSBidWlsZCwgc28gYGFkYXB0ZXJQYXRoYCBpbiBgbmV4dC5jb25maWdgIGlzXG4gICAqIG9wdGlvbmFsLlxuICAgKlxuICAgKiBOZXh0LmpzIHJlYWRzIHRoZSB2YXJpYWJsZSBhcyB0aGUgKmRlZmF1bHQqIHZhbHVlIG9mIGBhZGFwdGVyUGF0aGBcbiAgICogKGBuZXh0L2Rpc3Qvc2VydmVyL2NvbmZpZy1zaGFyZWQuanNgLCBgZGVmYXVsdENvbmZpZ2ApLCBzbyBhbiBhcHAgdGhhdCBkb2VzXG4gICAqIHNldCBgYWRhcHRlclBhdGhgIHN0aWxsIHdpbnMgYW5kIG5vdGhpbmcgZXhpc3RpbmcgY2hhbmdlcy5cbiAgICpcbiAgICogUmVzb2x2ZWQgZnJvbSB0aGUgTmV4dC5qcyBhcHAsIG5vdCBmcm9tIGNkay1uZXh0anMncyBvd24gYF9fZGlybmFtZWAgYW5kIG5vdFxuICAgKiBsZWZ0IGFzIGEgYmFyZSBzcGVjaWZpZXIuIEJvdGggYWx0ZXJuYXRpdmVzIHdlcmUgdHJpZWQgYW5kIGJvdGggYXJlIHdyb25nOlxuICAgKlxuICAgKiAtIGNkay1uZXh0anMncyBvd24gbG9jYXRpb24gbG9zZXMgYmVjYXVzZSB0aGUgYWRhcHRlciByZXNvbHZlcyBpdHMgc2libGluZ1xuICAgKiAgIGNhY2hlIGhhbmRsZXIgcmVsYXRpdmUgdG8gd2hlcmV2ZXIgKml0KiB3YXMgbG9hZGVkIGZyb20uIEFuIGFkYXB0ZXIgbG9hZGVkXG4gICAqICAgZnJvbSBvdXRzaWRlIHRoZSBhcHAncyB0cmVlIGhhbmRzIE5leHQuanMgYSBgY2FjaGVIYW5kbGVyYCBvdXRzaWRlXG4gICAqICAgYHR1cmJvcGFjay5yb290YCwgd2hpY2ggVHVyYm9wYWNrIHJlamVjdHMgb3V0cmlnaHQgKFwibGVhdmVzIHRoZSBmaWxlc3lzdGVtXG4gICAqICAgcm9vdFwiKS5cbiAgICogLSBBIGJhcmUgc3BlY2lmaWVyIGxvc2VzIGJlY2F1c2UgTmV4dC5qcyByZXNvbHZlcyBgYWRhcHRlclBhdGhgIGZyb20gaW5zaWRlXG4gICAqICAgaXRzIG93biBjb25maWcgbG9hZGVyLCBpLmUuIGZyb20gYG5leHRgJ3MgcmVhbHBhdGguIFVuZGVyIHBucG0gdGhhdCBpcyB0aGVcbiAgICogICB2aXJ0dWFsIHN0b3JlIChgbm9kZV9tb2R1bGVzLy5wbnBtL25leHRA4oCmL25vZGVfbW9kdWxlcy9uZXh0L2ApLCBhbmQgdGhlXG4gICAqICAgd2FsayB1cCBmcm9tIHRoZXJlIG5ldmVyIHJlYWNoZXMgdGhlIGFwcCdzIG93biBgbm9kZV9tb2R1bGVzYC5cbiAgICpcbiAgICogVW5zZXQgd2hlbiBgY2RrLW5leHRqc2AgaXMgbm90IHJlc29sdmFibGUgZnJvbSB0aGUgYXBwLCB3aGljaCBpcyBsZWdpdGltYXRlOlxuICAgKiB0aGUgTmV4dC5qcyBhcHAgYW5kIHRoZSBDREsgYXBwIGNhbiBiZSBzZXBhcmF0ZSBwYWNrYWdlcywgYW5kIG9ubHkgdGhlIENESyBvbmVcbiAgICogbmVjZXNzYXJpbHkgZGVwZW5kcyBvbiBjZGstbmV4dGpzLiB7QGxpbmsgcmVhZEFkYXB0ZXJNYW5pZmVzdH0gcmVwb3J0cyB0aGVcbiAgICogcmVzdWx0aW5nIGZhaWx1cmUgYW5kIG5hbWVzIHRoaXMgY2FzZS5cbiAgICpcbiAgICogT25lIHNldHVwIHRoaXMgY2Fubm90IHNlcnZlLCBhbmQgdGhlIHJlYXNvbiB0aGlzIHJlcG8ncyBvd24gZXhhbXBsZXMgc3RpbGwgc2V0XG4gICAqIGBhZGFwdGVyUGF0aGA6IGEgYGxpbms6YC9gZmlsZTpgIGRlcGVuZGVuY3kgb24gYSBjZGstbmV4dGpzIGNoZWNrb3V0ICpvdXRzaWRlKlxuICAgKiB0aGUgYXBwJ3MgcHJvamVjdCByb290LiBUaGUgc3ltbGluayByZXNvbHZlcyBvdXQgb2YgdGhlIHByb2plY3QsIHNvIHRoZVxuICAgKiBgY2FjaGVIYW5kbGVyYCBlc2NhcGUgYWJvdmUgYXBwbGllcy4gU2V0IGBhZGFwdGVyUGF0aGAgaW4gYG5leHQuY29uZmlnYCB0aGVyZVxuICAgKiDigJQgaXQgaXMgcmVzb2x2ZWQgYnkgdGhlIGJ1aWxkLCBhZnRlciB3aGF0ZXZlciBwdXQgdGhlIGFkYXB0ZXIgaW4gcGxhY2UuXG4gICAqL1xuICBwcml2YXRlIGFkYXB0ZXJQYXRoRW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBORVhUX0FEQVBURVJfUEFUSDogcmVxdWlyZS5yZXNvbHZlKFwiY2RrLW5leHRqcy9hZGFwdGVyXCIsIHtcbiAgICAgICAgICBwYXRoczogW3RoaXMucHJvcHMuYnVpbGREaXJlY3RvcnldLFxuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICBkZWJ1ZyhcbiAgICAgICAgYCR7TE9HX1BSRUZJWH0gQ291bGQgbm90IHJlc29sdmUgXCJjZGstbmV4dGpzL2FkYXB0ZXJcIiBmcm9tIGAgK1xuICAgICAgICAgIGAke3RoaXMucHJvcHMuYnVpbGREaXJlY3Rvcnl9OyBsZWF2aW5nIE5FWFRfQURBUFRFUl9QQVRIIHVuc2V0LCBzbyBgICtcbiAgICAgICAgICBgbmV4dC5jb25maWcgbXVzdCBzZXQgXFxgYWRhcHRlclBhdGhcXGAuYCxcbiAgICAgICk7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgbG9jYWwgYnVpbGQgY29tbWFuZCBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeVxuICAgKi9cbiAgcHJpdmF0ZSBydW5OZXh0QnVpbGQoKSB7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgJHtMT0dfUFJFRklYfSBSdW5uaW5nOiBcIiR7dGhpcy5idWlsZENvbW1hbmR9XCIgaW4gZGlyZWN0b3J5OiAke3RoaXMucHJvcHMuYnVpbGREaXJlY3Rvcnl9YCxcbiAgICApO1xuXG4gICAgLy8gQ2xlYW4gZXhpc3RpbmcgY2FjaGUgZGlyZWN0b3J5IHRvIGF2b2lkIHN0YWxlIGRhdGEgZnJvbSBwcmV2aW91cyBidWlsZHNcbiAgICBpZiAoZXhpc3RzU3luYyh0aGlzLmluaXRDYWNoZURpcikpIHtcbiAgICAgIHJtU3luYyh0aGlzLmluaXRDYWNoZURpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgZGVidWcoYENsZWFuZWQgZXhpc3RpbmcgY2FjaGUgZGlyZWN0b3J5OiAke3RoaXMuaW5pdENhY2hlRGlyfWApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBleGVjU3luYyh0aGlzLmJ1aWxkQ29tbWFuZCwge1xuICAgICAgICBzdGRpbzogXCJpbmhlcml0XCIsXG4gICAgICAgIGN3ZDogdGhpcy5wcm9wcy5idWlsZERpcmVjdG9yeSxcbiAgICAgICAgZW52OiB7XG4gICAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgICAgQ0RLX05FWFRKU19JTklUX0NBQ0hFX0RJUjogdGhpcy5pbml0Q2FjaGVEaXIsXG4gICAgICAgICAgLi4udGhpcy5hZGFwdGVyUGF0aEVudigpLFxuICAgICAgICAgIC8vIGBvbkJ1aWxkQ29tcGxldGVgIHJ1bnMgaW5zaWRlIHRoaXMgcHJvY2VzcyBhbmQgY2Fubm90IHJlYWQgQ0RLXG4gICAgICAgICAgLy8gcHJvcHMsIHNvIHRoZSByZXNvbHZlZCBncm91cHMgdHJhdmVsIGFzIEpTT04uIEFic2VudCB3aGVuIG5vdFxuICAgICAgICAgIC8vIHNwbGl0dGluZywgd2hpY2ggdGhlIGFkYXB0ZXIgcmVhZHMgYXMgXCJvbmUgZGVwbG95bWVudCByb290XCIuXG4gICAgICAgICAgLi4uKHRoaXMucHJvcHMuZnVuY3Rpb25Hcm91cHM/Lmxlbmd0aFxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgW0ZVTkNUSU9OX0dST1VQU19FTlZfVkFSXTogSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgICB0b0Z1bmN0aW9uR3JvdXBTcGVjcyh0aGlzLnByb3BzLmZ1bmN0aW9uR3JvdXBzKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExvY2FsIGJ1aWxkIGZhaWxlZDogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJlcGVuZCBgcGF0Y2gtZmV0Y2guanNgIHRvIHRoZSBjbGllbnQgZW50cnlwb2ludCBjaHVua3MsIGZvclxuICAgKiBgTmV4dGpzR2xvYmFsRnVuY3Rpb25zYCBvbmx5LlxuICAgKlxuICAgKiBUaGlzIGlzIHdoYXQgbWFrZXMgUE9TVCB3b3JrIGF0IGFsbCBvbiB0aGF0IHR5cGUuIENsb3VkRnJvbnQgcmVhY2hlcyB0aGVcbiAgICogc2VydmVyIHRocm91Z2ggYSBMYW1iZGEgRnVuY3Rpb24gVVJMIHdpdGggYEF1dGhUeXBlOiBBV1NfSUFNYCwgc2lnbmVkIGJ5IGFuXG4gICAqIG9yaWdpbiBhY2Nlc3MgY29udHJvbCwgYW5kIEFXUyBkb2N1bWVudHMgdGhlIGNvbnNlcXVlbmNlOiBcIklmIHlvdSB1c2UgUFVUIG9yXG4gICAqIFBPU1QgbWV0aG9kcyB3aXRoIHlvdXIgTGFtYmRhIGZ1bmN0aW9uIFVSTCwgeW91ciB1c2VycyBtdXN0IGNvbXB1dGUgdGhlXG4gICAqIFNIQTI1NiBvZiB0aGUgYm9keSBhbmQgaW5jbHVkZSB0aGUgcGF5bG9hZCBoYXNoIHZhbHVlIG9mIHRoZSByZXF1ZXN0IGJvZHkgaW5cbiAgICogdGhlIGB4LWFtei1jb250ZW50LXNoYTI1NmAgaGVhZGVyIHdoZW4gc2VuZGluZyB0aGUgcmVxdWVzdCB0byBDbG91ZEZyb250LlxuICAgKiBMYW1iZGEgZG9lc24ndCBzdXBwb3J0IHVuc2lnbmVkIHBheWxvYWRzLlwiXG4gICAqXG4gICAqIENsb3VkRnJvbnQgc2lnbnMgR0VUcyBpdHNlbGYgKGVtcHR5LWJvZHkgaGFzaCkgYnV0IHdpbGwgbm90IGhhc2ggYSBib2R5LCBhbmRcbiAgICogYSBicm93c2VyIGhhcyBubyB3YXkgdG8gYWRkIHRoYXQgaGVhZGVyIG9uIGl0cyBvd24sIHNvIGFuIHVucGF0Y2hlZCBhcHBcbiAgICogYW5zd2VycyBldmVyeSBzZXJ2ZXIgYWN0aW9uLCBmb3JtIHN1Ym1pc3Npb24gYW5kIFBPU1Qgcm91dGUgaGFuZGxlciB3aXRoXG4gICAqIGA0MDMgSW52YWxpZFNpZ25hdHVyZUV4Y2VwdGlvbmAgYmVmb3JlIHRoZSByZXF1ZXN0IHJlYWNoZXMgTmV4dC5qcy4gVGhlXG4gICAqIHBhdGNoIGluc3RhbGxzIGBmZXRjaGAvYFhNTEh0dHBSZXF1ZXN0YCB3cmFwcGVycyB0aGF0IGNvbXB1dGUgdGhlIGhhc2guXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL3ByaXZhdGUtY29udGVudC1yZXN0cmljdGluZy1hY2Nlc3MtdG8tbGFtYmRhLmh0bWxcbiAgICovXG4gIHByaXZhdGUgcGF0Y2hGZXRjaEluQ2xpZW50SnMoKSB7XG4gICAgY29uc3Qgc3RhdGljQ2h1bmtzUGF0aCA9IGpvaW4odGhpcy5kb3ROZXh0UGF0aCwgXCJzdGF0aWNcIiwgXCJjaHVua3NcIik7XG4gICAgY29uc3QgY2h1bmtGaWxlcyA9IHJlYWRkaXJTeW5jKHN0YXRpY0NodW5rc1BhdGgpLmZpbHRlcihcbiAgICAgIChmaWxlOiBzdHJpbmcpID0+XG4gICAgICAgIC8vIG1haW4tYXBwLSBmb3Igd2VicGFjaywgdHVyYm9wYWNrLSBmb3IgdHVyYm9cbiAgICAgICAgZmlsZS5zdGFydHNXaXRoKFwibWFpbi1hcHAtXCIpIHx8XG4gICAgICAgIChmaWxlLnN0YXJ0c1dpdGgoXCJ0dXJib3BhY2stXCIpICYmIGZpbGUuZW5kc1dpdGgoXCIuanNcIikpLFxuICAgICk7XG5cbiAgICBpZiAoY2h1bmtGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNsaWVudCBzaWRlIGpzIGVudHJ5cG9pbnQgZmlsZXMgZm91bmRcIik7XG4gICAgfVxuXG4gICAgLy8gUmVhZCB0aGUgcGF0Y2gtZmV0Y2guanMgY29udGVudFxuICAgIGNvbnN0IHBhdGNoRmV0Y2hQYXRoID0gam9pbihfX2Rpcm5hbWUsIFwicGF0Y2gtZmV0Y2guanNcIik7XG4gICAgY29uc3QgcGF0Y2hGZXRjaENvbnRlbnQgPSByZWFkRmlsZVN5bmMocGF0Y2hGZXRjaFBhdGgsIFwidXRmLThcIik7XG5cbiAgICAvLyBQcmVwZW5kIHBhdGNoLWZldGNoIGxvZ2ljIHRvIGVhY2ggZW50cnlwb2ludCwgb25jZS4gTm93IHRoYXQgdGhpcyBydW5zXG4gICAgLy8gb3V0c2lkZSBgcnVuTmV4dEJ1aWxkYCwgdGhlIHNhbWUgYC5uZXh0YCBjYW4gYmUgc3ludGhlc2l6ZWQgbW9yZSB0aGFuXG4gICAgLy8gb25jZSAoYHNraXBCdWlsZDogdHJ1ZWAsIGBjZGsgc3ludGhgIHRoZW4gYGNkayBkZXBsb3lgLCBhIHJldHJpZWRcbiAgICAvLyBkZXBsb3kpLCBhbmQgcHJlcGVuZGluZyB0d2ljZSB3b3VsZCByZS13cmFwIHRoZSB3cmFwcGVycy5cbiAgICBmb3IgKGNvbnN0IGNodW5rRmlsZSBvZiBjaHVua0ZpbGVzKSB7XG4gICAgICBjb25zdCBjaHVua0ZpbGVQYXRoID0gam9pbihzdGF0aWNDaHVua3NQYXRoLCBjaHVua0ZpbGUpO1xuICAgICAgY29uc3QgcGF0Y2hlZENvbnRlbnQgPSBwYXRjaENsaWVudENodW5rKFxuICAgICAgICByZWFkRmlsZVN5bmMoY2h1bmtGaWxlUGF0aCwgXCJ1dGYtOFwiKSxcbiAgICAgICAgcGF0Y2hGZXRjaENvbnRlbnQsXG4gICAgICAgIGNodW5rRmlsZVBhdGgsXG4gICAgICApO1xuICAgICAgaWYgKHBhdGNoZWRDb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVidWcoYCR7TE9HX1BSRUZJWH0gQWxyZWFkeSBwYXRjaGVkLCBza2lwcGluZzogJHtjaHVua0ZpbGVQYXRofWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHdyaXRlRmlsZVN5bmMoY2h1bmtGaWxlUGF0aCwgcGF0Y2hlZENvbnRlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcHVibGljIGRpcmVjdG9yeSBlbnRyaWVzIGZyb20gbG9jYWwgZmlsZXN5c3RlbVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRMb2NhbFB1YmxpY0RpckVudHJpZXMoKTogUHVibGljRGlyRW50cnlbXSB7XG4gICAgY29uc3QgcHVibGljRGlyUGF0aCA9IGpvaW4odGhpcy5wcm9wcy5idWlsZERpcmVjdG9yeSwgXCJwdWJsaWNcIik7XG4gICAgaWYgKCFleGlzdHNTeW5jKHB1YmxpY0RpclBhdGgpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlYWRkaXJTeW5jKHB1YmxpY0RpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KS5tYXAoKGVudHJ5KSA9PiAoe1xuICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgIGlzRGlyZWN0b3J5OiBlbnRyeS5pc0RpcmVjdG9yeSgpLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJpcCB3aGF0ZXZlciBwbGF0Zm9ybS1zcGVjaWZpYyBTaGFycCBiaW5hcmllcyBgbmV4dCBidWlsZGAncyBvdXRwdXQgZmlsZVxuICAgKiB0cmFjaW5nIHN0YWdlZCwgc2luY2UgdGhleSdyZSB0aGUgaG9zdCdzIChlLmcuIG1hY09TL2dsaWJjKSByYXRoZXIgdGhhbiB0aGVcbiAgICogZGVwbG95bWVudCB0YXJnZXQncywgdGhlbiBpbnN0YWxsIHRoZSB0YXJnZXQncy4gU2tpcHBpbmcgdGhpcyBpcyBzaWxlbnQ6XG4gICAqIGBpbWFnZU9wdGltaXplcmAgY2F0Y2hlcyB0aGUgbG9hZCBmYWlsdXJlIGludGVybmFsbHkgYW5kIHJldHVybnMgdGhlXG4gICAqIHVub3B0aW1pemVkIG9yaWdpbmFsIHdpdGggYW4gSFRUUCAyMDAuXG4gICAqXG4gICAqIE9ubHkgYSByb290IHdpdGggYHNoYXJwYCBzdGFnZWQgZ2V0cyB0aGUgYmluYXJpZXM6IHRoZSBpbWFnZSBvcHRpbWl6ZXJcbiAgICogYnJpbmdzIGl0IGludG8gYGRlZmF1bHRgLCB3aGljaCBzZXJ2ZXMgZXZlcnkgYC9fbmV4dC9pbWFnZWAsIGFuZCBhbm90aGVyXG4gICAqIGdyb3VwIGhhcyBpdCBvbmx5IGlmIGl0cyBvd24gcm91dGVzIHVzZSBpdC4gU28gb25seSBgZGVmYXVsdGAgd2FybnMgd2hlblxuICAgKiBpdCdzIG1pc3NpbmcuXG4gICAqL1xuICBwcml2YXRlIHN0YWdlU2hhcnBGb3JUYXJnZXQoXG4gICAgcm9vdDogTmV4dGpzRGVwbG95bWVudFJvb3QsXG4gICAgcHJvamVjdERpcjogc3RyaW5nLFxuICAgIHBsYXRmb3JtOiBzdHJpbmcsXG4gICkge1xuICAgIGNvbnN0IHNoYXJwU291cmNlID0gdGhpcy5yZW1vdmVFeGlzdGluZ1NoYXJwQmluYXJpZXMocm9vdC5wYXRoLCBwcm9qZWN0RGlyKTtcbiAgICBpZiAoIXNoYXJwU291cmNlKSB7XG4gICAgICBpZiAocm9vdC5uYW1lID09PSBERUZBVUxUX0ZVTkNUSU9OX0dST1VQKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgJHtMT0dfUFJFRklYfSBcInNoYXJwXCIgbm90IGZvdW5kIGluIHRoZSBzdGFnZWQgYnVpbGQgb3V0cHV0LiBBZGQgXCJzaGFycFwiIGFzIGEgZGVwZW5kZW5jeSBvZiB5b3VyIE5leHQuanMgYXBwIHRvIGVuYWJsZSBpbWFnZSBvcHRpbWl6YXRpb24uYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pbnN0YWxsU2hhcnBQYWNrYWdlcyhcbiAgICAgIHNoYXJwQmluYXJ5RGlyKHJvb3QucGF0aCksXG4gICAgICB0aGlzLmdldFNoYXJwQmluYXJ5UGFja2FnZXMoc2hhcnBTb3VyY2UsIHBsYXRmb3JtKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZWx5IGZpbmQgYW5kIHJlbW92ZSBleGlzdGluZyBTaGFycCBwbGF0Zm9ybSBiaW5hcmllcy5cbiAgICpcbiAgICogYHJvb3RgIGlzIHdhbGtlZCB3aG9sZSByYXRoZXIgdGhhbiBqdXN0IGl0cyBgbm9kZV9tb2R1bGVzYDogdGhlIHN0YWdlZCB0cmVlXG4gICAqIGlzIGtleWVkIGJ5IHJlcG8tcm9vdC1yZWxhdGl2ZSBwYXRoLCBzbyBpbiBhIG1vbm9yZXBvIHRoZSBgbm9kZV9tb2R1bGVzYFxuICAgKiBob2xkaW5nIGBzaGFycGAgaXMgc2V2ZXJhbCBkaXJlY3RvcmllcyBkb3duLiB7QGxpbmsgaXNTaGFycEJpbmFyeVBhY2thZ2V9IGlzXG4gICAqIHdoYXQga2VlcHMgdGhhdCBmcm9tIHJlYWNoaW5nIHRoZSBhcHAncyBvd24gb3V0cHV0IOKAlCB0aGUgc3RhZ2VkIHJvb3QgaG9sZHNcbiAgICogdGhlIGNvbXBpbGVkIGAubmV4dGAgYXMgd2VsbCBhcyB0aGUgZGVwZW5kZW5jaWVzLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvamVjdERpciB0aGUgYXBwJ3MgZGlyZWN0b3J5IGluc2lkZSBgcm9vdGAsIHdoaWNoIGBuZXh0YCBpc1xuICAgKiByZXNvbHZlZCBmcm9tLlxuICAgKiBAcmV0dXJucyB0aGUgc3RhZ2VkIGBzaGFycGAgSlMgd3JhcHBlciB0byBpbnN0YWxsIG5leHQgdG8sIGZvdW5kIGluIHRoZSBzYW1lXG4gICAqIHdhbGs6IGEgcm9vdCBjYW4gYmUgaHVuZHJlZHMgb2YgbWVnYWJ5dGVzLCBhbmQgZWFjaCBncm91cCBoYXMgb25lLlxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVFeGlzdGluZ1NoYXJwQmluYXJpZXMoXG4gICAgcm9vdDogc3RyaW5nLFxuICAgIHByb2plY3REaXI6IHN0cmluZyxcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzaGFycENhbmRpZGF0ZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBMaW5rcyBhcmUgbGlzdGVkLCBub3QgZm9sbG93ZWQ6IGV2ZXJ5IGxpbmsgaW4gYSBzdGFnZWQgcm9vdCBwb2ludHNcbiAgICAvLyBpbnNpZGUgaXQgKGBzdGFnZUZpbGVzYCBjb3BpZXMgdGhlIG9uZXMgdGhhdCBkb24ndCksIHNvIGl0cyB0YXJnZXQgaXNcbiAgICAvLyB3YWxrZWQgYXQgaXRzIG93biBwYXRoIGFueXdheSwgYW5kIGZvbGxvd2luZyB0aGVtIGlzIHdoYXQgbGV0IGFcbiAgICAvLyB3b3Jrc3BhY2UgY3ljbGUgaGFuZyB0aGUgc3ludGguXG4gICAgY29uc3QgYWxsRW50cmllcyA9IGxpc3RUcmVlKHJvb3QpO1xuXG4gICAgLy8gU3ltbGlua3MgYXJlIHVubGlua2VkLCBub3QgYHJtU3luY2BlZCwgYW5kIHRoZXkgZ28gZmlyc3QuIHBucG0gcG9pbnRzXG4gICAgLy8gc2V2ZXJhbCBsaW5rcyBhdCBvbmUgc3RvcmUgZGlyZWN0b3J5LCBhbmQgYHJtU3luYyjigKYsIHsgcmVjdXJzaXZlOiB0cnVlLFxuICAgIC8vIGZvcmNlOiB0cnVlIH0pYCAqc2lsZW50bHkgbm8tb3BzKiBvbiBhIHN5bWxpbmsgd2hvc2UgdGFyZ2V0IGlzIGFscmVhZHlcbiAgICAvLyBnb25lIOKAlCBgZm9yY2VgIHN3YWxsb3dzIHRoZSBFTk9FTlQgaXRzIGBybWRpcmAgZ2V0cy4gUmVtb3ZpbmcgYSBzdG9yZVxuICAgIC8vIGRpcmVjdG9yeSBiZWZvcmUgaXRzIGxpbmtzIHRoZXJlZm9yZSBsZWZ0IGRhbmdsaW5nXG4gICAgLy8gYEBpbWcvc2hhcnAtZGFyd2luLWFybTY0YCBlbnRyaWVzIGluIHRoZSBhc3NldCwgd2hpY2ggaXMgYSBsYXRlbnQgRU5PRU5UXG4gICAgLy8gaW4gd2hhdGV2ZXIgbmV4dCBmb2xsb3dzIHRoZW0gKGBzaGFycGAgZG9lcywgd2hlbiBpdCBsb29rcyBmb3IgYmluYXJpZXMpLlxuICAgIGNvbnN0IHN5bWxpbmtzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGRpcmVjdG9yaWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBhbGxFbnRyaWVzKSB7XG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSAmJiBlbnRyeS5uYW1lID09PSBcInNoYXJwXCIpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGpvaW4oZW50cnkucGFyZW50UGF0aCwgZW50cnkubmFtZSk7XG4gICAgICAgIGlmIChleGlzdHNTeW5jKGpvaW4ocGF0aCwgXCJwYWNrYWdlLmpzb25cIikpKSB7XG4gICAgICAgICAgc2hhcnBDYW5kaWRhdGVzLnB1c2gocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIWlzU2hhcnBCaW5hcnlQYWNrYWdlKGVudHJ5LnBhcmVudFBhdGgsIGVudHJ5Lm5hbWUpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gam9pbihlbnRyeS5wYXJlbnRQYXRoLCBlbnRyeS5uYW1lKTtcbiAgICAgIGlmIChlbnRyeS5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAgIHN5bWxpbmtzLnB1c2goZnVsbFBhdGgpO1xuICAgICAgfSBlbHNlIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGRpcmVjdG9yaWVzLnB1c2goZnVsbFBhdGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRlYnVnKFxuICAgICAgYCR7TE9HX1BSRUZJWH0gUmVtb3ZpbmcgJHtzeW1saW5rcy5sZW5ndGh9IFNoYXJwIGJpbmFyeSBzeW1saW5rcyBhbmQgJHtkaXJlY3Rvcmllcy5sZW5ndGh9IGRpcmVjdG9yaWVzYCxcbiAgICApO1xuXG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHN5bWxpbmtzKSB7XG4gICAgICB1bmxpbmtTeW5jKHBhdGgpO1xuICAgICAgZGVidWcoYCR7TE9HX1BSRUZJWH0gVW5saW5rZWQ6ICR7cGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIGRpcmVjdG9yaWVzKSB7XG4gICAgICBybVN5bmMocGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgZGVidWcoYCR7TE9HX1BSRUZJWH0gUmVtb3ZlZDogJHtwYXRofWApO1xuICAgIH1cbiAgICByZXR1cm4gcGlja1N0YWdlZFNoYXJwUGFja2FnZShcbiAgICAgIHNoYXJwQ2FuZGlkYXRlcyxcbiAgICAgIHJlc29sdmVOZXh0U2hhcnAocHJvamVjdERpciksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHRoZSBgQGltZy9zaGFycC08cGxhdGZvcm0+YCBhbmQgYEBpbWcvc2hhcnAtbGlidmlwcy08cGxhdGZvcm0+YFxuICAgKiB2ZXJzaW9ucyB0byBpbnN0YWxsIGZvciBhIGdpdmVuIHBsYXRmb3JtLlxuICAgKlxuICAgKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSBgc2hhcnBgIEpTIHdyYXBwZXIgdGhhdCBvdXRwdXQgZmlsZSB0cmFjaW5nIHN0YWdlZDpcbiAgICogYHNoYXJwYCdzIGBsaWIvbGlidmlwcy5qc2AgY29tcGFyZXMgdGhlIGJpbmFyeSdzXG4gICAqIHJlcG9ydGVkIGxpYnZpcHMgdmVyc2lvbiBhZ2FpbnN0IGl0cyBvd24gYG1pbmltdW1MaWJ2aXBzVmVyc2lvbmAgYW5kXG4gICAqIHRocm93cyBhdCBsb2FkIHdoZW4gdGhleSBkaXNhZ3JlZS4gYHNoYXJwYCBwaW5zIGJvdGggaW4gaXRzXG4gICAqIGBvcHRpb25hbERlcGVuZGVuY2llc2AsIHNvIHRoYXQgbWFuaWZlc3QgaXMgdGhlIGF1dGhvcml0YXRpdmUgc291cmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTaGFycEJpbmFyeVBhY2thZ2VzKFxuICAgIHNoYXJwU291cmNlOiBzdHJpbmcsXG4gICAgcGxhdGZvcm06IHN0cmluZyxcbiAgKTogeyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9W10ge1xuICAgIC8vIE9ubHkgZm9yIGEgYmluYXJ5IHRoZSBzdGFnZWQgYHNoYXJwYCBkb2VzIG5vdCBwaW4uXG4gICAgY29uc3QgZmFsbGJhY2sgPSBbXG4gICAgICB7IG5hbWU6IGBzaGFycC1saWJ2aXBzLSR7cGxhdGZvcm19YCwgdmVyc2lvbjogXCIxLjIuNFwiIH0sXG4gICAgICB7IG5hbWU6IGBzaGFycC0ke3BsYXRmb3JtfWAsIHZlcnNpb246IFwiMC4zNC41XCIgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICAgICAgcmVhZEZpbGVTeW5jKGpvaW4oc2hhcnBTb3VyY2UsIFwicGFja2FnZS5qc29uXCIpLCBcInV0Zi04XCIpLFxuICAgICk7XG4gICAgY29uc3Qgb3B0aW9uYWxEZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPVxuICAgICAgbWFuaWZlc3Qub3B0aW9uYWxEZXBlbmRlbmNpZXMgPz8ge307XG5cbiAgICByZXR1cm4gZmFsbGJhY2subWFwKChwa2cpID0+IHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSBvcHRpb25hbERlcGVuZGVuY2llc1tgQGltZy8ke3BrZy5uYW1lfWBdO1xuICAgICAgaWYgKCF2ZXJzaW9uKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgJHtMT0dfUFJFRklYfSBzaGFycEAke21hbmlmZXN0LnZlcnNpb259IGRvZXMgbm90IHBpbiBcIkBpbWcvJHtwa2cubmFtZX1cIjsgZmFsbGluZyBiYWNrIHRvICR7cGtnLnZlcnNpb259LmAsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBwa2c7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBuYW1lOiBwa2cubmFtZSwgdmVyc2lvbiB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERvd25sb2FkICh3aXRoIGNhY2hpbmcpIGFuZCBleHRyYWN0IFNoYXJwJ3MgcGxhdGZvcm0tc3BlY2lmaWMgYmluYXJ5XG4gICAqIHBhY2thZ2VzIGludG8gYGltZ1BhdGhgLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsU2hhcnBQYWNrYWdlcyhcbiAgICBpbWdQYXRoOiBzdHJpbmcsXG4gICAgcGFja2FnZXM6IHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfVtdLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBjYWNoZURpciA9IGpvaW4odG1wZGlyKCksIFwiY2RrLW5leHRqcy1zaGFycC1jYWNoZVwiKTtcbiAgICBta2RpclN5bmMoY2FjaGVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgZm9yIChjb25zdCBwa2cgb2YgcGFja2FnZXMpIHtcbiAgICAgIGNvbnN0IHRhcmdldERpciA9IGpvaW4oaW1nUGF0aCwgcGtnLm5hbWUpO1xuICAgICAgY29uc3QgdXJsID0gYGh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0BpbWcvJHtwa2cubmFtZX0vLS8ke3BrZy5uYW1lfS0ke3BrZy52ZXJzaW9ufS50Z3pgO1xuXG4gICAgICAvLyBDcmVhdGUgYSBjb25zaXN0ZW50IGZpbGVuYW1lIGJhc2VkIG9uIHBhY2thZ2UgbmFtZSBhbmQgdmVyc2lvblxuICAgICAgY29uc3QgY2FjaGVGaWxlTmFtZSA9IGAke3BrZy5uYW1lfS0ke3BrZy52ZXJzaW9ufS50Z3pgO1xuICAgICAgY29uc3QgY2FjaGVkRmlsZSA9IGpvaW4oY2FjaGVEaXIsIGNhY2hlRmlsZU5hbWUpO1xuXG4gICAgICAvLyBDaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgYSB2YWxpZCBwYWNrYWdlIGNhY2hlZDsgcmUtZG93bmxvYWQgaWZcbiAgICAgIC8vIGEgcHJldmlvdXMgcnVuIGxlZnQgYmVoaW5kIGEgdHJ1bmNhdGVkL2NvcnJ1cHQgZG93bmxvYWRcbiAgICAgIGlmIChleGlzdHNTeW5jKGNhY2hlZEZpbGUpICYmIHRoaXMuaXNDYWNoZWRGaWxlVmFsaWQoY2FjaGVkRmlsZSkpIHtcbiAgICAgICAgZGVidWcoXG4gICAgICAgICAgYCR7TE9HX1BSRUZJWH0gVXNpbmcgY2FjaGVkICR7cGtnLm5hbWV9QCR7cGtnLnZlcnNpb259IGZyb20gJHtjYWNoZWRGaWxlfWAsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWJ1ZyhgJHtMT0dfUFJFRklYfSBEb3dubG9hZGluZyAke3BrZy5uYW1lfUAke3BrZy52ZXJzaW9ufS4uLmApO1xuXG4gICAgICAgIC8vIERvd25sb2FkIHRvIGEgcHJvY2Vzcy11bmlxdWUgdGVtcCBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSxcbiAgICAgICAgLy8gdGhlbiBhdG9taWNhbGx5IHJlbmFtZSBpdCBvbnRvIHRoZSBzaGFyZWQgY2FjaGUgcGF0aC4gQ29uY3VycmVudFxuICAgICAgICAvLyBzeW50aCBwcm9jZXNzZXMgKGUuZy4gVHVyYm9yZXBvIHJ1bm5pbmcgbXVsdGlwbGUgYGNka2AgY29tbWFuZHMpXG4gICAgICAgIC8vIHNoYXJlIHRoaXMgY2FjaGUgZGlyLCBzbyB3cml0aW5nIGRpcmVjdGx5IHRvIGBjYWNoZWRGaWxlYCByaXNrc1xuICAgICAgICAvLyBhbm90aGVyIHByb2Nlc3MgZXh0cmFjdGluZyBhIGhhbGYtd3JpdHRlbiBmaWxlLiBSZW5hbWluZyB3aXRoaW5cbiAgICAgICAgLy8gdGhlIHNhbWUgZmlsZXN5c3RlbSBpcyBhdG9taWMsIHNvIHJlYWRlcnMgb25seSBldmVyIHNlZSBhXG4gICAgICAgIC8vIGNvbXBsZXRlIGZpbGUsIHdoaWNoZXZlciBwcm9jZXNzIHdpbnMgdGhlIHJhY2UuXG4gICAgICAgIGNvbnN0IHRlbXBGaWxlID0gam9pbihcbiAgICAgICAgICBjYWNoZURpcixcbiAgICAgICAgICBgJHtjYWNoZUZpbGVOYW1lfS4ke3Byb2Nlc3MucGlkfS0ke3JhbmRvbUJ5dGVzKDYpLnRvU3RyaW5nKFwiaGV4XCIpfS50bXBgLFxuICAgICAgICApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIC0tZmFpbCBtYWtlcyBjdXJsIGV4aXQgbm9uLXplcm8gb24gSFRUUCBlcnJvcnMgYW5kIC0tcmV0cnlcbiAgICAgICAgICAvLyBoYW5kbGVzIHRyYW5zaWVudCBjb25uZWN0aW9uIGRyb3BzIHNvIGEgcGFydGlhbCB0cmFuc2ZlclxuICAgICAgICAgIC8vIGlzbid0IGNhY2hlZCBhcyB2YWxpZC5cbiAgICAgICAgICBleGVjRmlsZVN5bmMoXG4gICAgICAgICAgICBcImN1cmxcIixcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgXCItTFwiLFxuICAgICAgICAgICAgICBcIi0tZmFpbFwiLFxuICAgICAgICAgICAgICBcIi0tcmV0cnlcIixcbiAgICAgICAgICAgICAgXCIzXCIsXG4gICAgICAgICAgICAgIFwiLS1yZXRyeS1kZWxheVwiLFxuICAgICAgICAgICAgICBcIjFcIixcbiAgICAgICAgICAgICAgXCItb1wiLFxuICAgICAgICAgICAgICB0ZW1wRmlsZSxcbiAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgc3RkaW86IFwicGlwZVwiIH0sXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICghdGhpcy5pc0NhY2hlZEZpbGVWYWxpZCh0ZW1wRmlsZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYERvd25sb2FkZWQgZmlsZSBmb3IgJHtwa2cubmFtZX1AJHtwa2cudmVyc2lvbn0gaXMgZW1wdHkgb3IgbWlzc2luZzogJHt0ZW1wRmlsZX1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZW5hbWVTeW5jKHRlbXBGaWxlLCBjYWNoZWRGaWxlKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBybVN5bmModGVtcEZpbGUsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICBgJHtMT0dfUFJFRklYfSBDYWNoZWQgJHtwa2cubmFtZX1AJHtwa2cudmVyc2lvbn0gdG8gJHtjYWNoZWRGaWxlfWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIG1rZGlyU3luYyh0YXJnZXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgZXhlY0ZpbGVTeW5jKFxuICAgICAgICBcInRhclwiLFxuICAgICAgICBbXCIteHpmXCIsIGNhY2hlZEZpbGUsIFwiLUNcIiwgdGFyZ2V0RGlyLCBcIi0tc3RyaXAtY29tcG9uZW50cz0xXCJdLFxuICAgICAgICB7IHN0ZGlvOiBcInBpcGVcIiB9LFxuICAgICAgKTtcblxuICAgICAgZGVidWcoYCR7TE9HX1BSRUZJWH0gSW5zdGFsbGVkICR7cGtnLm5hbWV9QCR7cGtnLnZlcnNpb259YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB0aGF0IGEgY2FjaGVkIFNoYXJwIGJpbmFyeSBhcmNoaXZlIGlzIG5vbi1lbXB0eS4gR3VhcmRzIGFnYWluc3RcbiAgICogYSB0cnVuY2F0ZWQvY29ycnVwdCBkb3dubG9hZCAoZS5nLiBmcm9tIGEgZHJvcHBlZCBjb25uZWN0aW9uKSBiZWluZ1xuICAgKiByZXVzZWQgYWNyb3NzIHN5bnRoIG9wZXJhdGlvbnMuXG4gICAqL1xuICBwcml2YXRlIGlzQ2FjaGVkRmlsZVZhbGlkKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHN0YXRTeW5jKGZpbGVQYXRoKS5zaXplID4gMDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBXaGF0IHRyYXZlbHMgdG8gdGhlIGFkYXB0ZXIgaW4ge0BsaW5rIEZVTkNUSU9OX0dST1VQU19FTlZfVkFSfSwgYW5kIHdoYXQgaXRcbiAqIHJlY29yZHMgYmFjayBhcyBgQWRhcHRlck1hbmlmZXN0LmZ1bmN0aW9uR3JvdXBzYC5cbiAqL1xuZnVuY3Rpb24gdG9GdW5jdGlvbkdyb3VwU3BlY3MoXG4gIGdyb3VwczogTmV4dGpzRnVuY3Rpb25Hcm91cFJvdXRlc1tdLFxuKTogRnVuY3Rpb25Hcm91cFNwZWNbXSB7XG4gIHJldHVybiBncm91cHMubWFwKCh7IG5hbWUsIHJvdXRlcyB9KSA9PiAoeyBuYW1lLCByb3V0ZXMgfSkpO1xufVxuXG4vKiogYGdyb3Vwc2AgaW4gYSBjYW5vbmljYWwgb3JkZXIsIGZvciBjb21wYXJpbmcgdHdvIG9mIHRoZW0uICovXG5mdW5jdGlvbiBzb3J0ZWRHcm91cFNwZWNzKFxuICBncm91cHM6IHJlYWRvbmx5IEZ1bmN0aW9uR3JvdXBTcGVjW10gfCB1bmRlZmluZWQsXG4pOiBGdW5jdGlvbkdyb3VwU3BlY1tdIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdyb3Vwc1xuICAgID8ubWFwKCh7IG5hbWUsIHJvdXRlcyB9KSA9PiAoeyBuYW1lLCByb3V0ZXM6IFsuLi5yb3V0ZXNdLnNvcnQoKSB9KSlcbiAgICAuc29ydCgoYSwgYikgPT4gKGEubmFtZSA8IGIubmFtZSA/IC0xIDogMSkpO1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIHN0YWdlZCBgc2hhcnBgIEpTIHdyYXBwZXIgb3V0IG9mIGV2ZXJ5IGNvcHkgZm91bmQgaW4gdGhlIHRyZWUuXG4gKlxuICogVW5saWtlIGEgc3RhbmRhbG9uZSBidWlsZCB0aGVyZSBpcyBubyBzaW5nbGUgYG5vZGVfbW9kdWxlc2AgdG8gbG9vayBpbjogdGhlXG4gKiB0cmVlIG1pcnJvcnMgcmVwby1yb290LXJlbGF0aXZlIHBhdGhzLCBzbyB0aGUgc2VhcmNoIGlzIGJ5IGRpcmVjdG9yeSBuYW1lLlxuICpcbiAqIEFuIGFwcCBjYW4gaGF2ZSB0d28gYHNoYXJwYCBjb3BpZXMgYXQgZGlmZmVyZW50IHZlcnNpb25zIChpdHMgb3duLCBob2lzdGVkLFxuICogYW5kIG5leHQncywgbmVzdGVkIHVuZGVyIGBuZXh0L25vZGVfbW9kdWxlc2ApLCBhbmQgZXZlcnkgYmluYXJ5IGdvZXMgaW50byB0aGVcbiAqIG9uZSByb290IGBAaW1nYCwgc28gdGhlIGNvcHkgcGlubmluZyB0aGVtIGhhcyB0byBiZSB0aGUgb25lIGBuZXh0YCdzIGltYWdlXG4gKiBvcHRpbWl6ZXIgbG9hZHM6IGBuZXh0U2hhcnBgLCB3aGVuIHtAbGluayByZXNvbHZlTmV4dFNoYXJwfSBmb3VuZCBpdC4gT3RoZXJ3aXNlXG4gKiBzaG9ydGVzdCBwYXRoIHdpbnMgYXMgdGhlIGNsb3Nlc3QgdG8gYSBob2lzdGVkIGluc3RhbGwsIHNvcnRlZCBmb3JcbiAqIGRldGVybWluaXNtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGlja1N0YWdlZFNoYXJwUGFja2FnZShcbiAgY2FuZGlkYXRlczogc3RyaW5nW10sXG4gIG5leHRTaGFycD86IHN0cmluZyxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHVzZWQgPVxuICAgIG5leHRTaGFycCAmJlxuICAgIGNhbmRpZGF0ZXMuZmluZCgoY2FuZGlkYXRlKSA9PlxuICAgICAgbmV4dFNoYXJwLnN0YXJ0c1dpdGgocmVhbHBhdGhTeW5jKGNhbmRpZGF0ZSkgKyBzZXApLFxuICAgICk7XG4gIGlmICh1c2VkKSB7XG4gICAgcmV0dXJuIHVzZWQ7XG4gIH1cbiAgY2FuZGlkYXRlcy5zb3J0KChhLCBiKSA9PiBhLmxlbmd0aCAtIGIubGVuZ3RoIHx8IGEubG9jYWxlQ29tcGFyZShiKSk7XG4gIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA+IDEpIHtcbiAgICBkZWJ1ZyhcbiAgICAgIGAke0xPR19QUkVGSVh9IE11bHRpcGxlIHN0YWdlZCBcInNoYXJwXCIgY29waWVzOyB1c2luZyAke2NhbmRpZGF0ZXNbMF19YCxcbiAgICApO1xuICB9XG4gIHJldHVybiBjYW5kaWRhdGVzWzBdO1xufVxuXG4vKipcbiAqIFRoZSByZWFsIHBhdGggb2YgdGhlIGBzaGFycGAgZW50cnkgcG9pbnQgdGhlIHN0YWdlZCBgbmV4dGAgcmVzb2x2ZXMgZnJvbVxuICogYHByb2plY3REaXJgLCBgdW5kZWZpbmVkYCB3aGVuIGVpdGhlciBkb2VzIG5vdCByZXNvbHZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU5leHRTaGFycChwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIC8vIFRoZSBhbmNob3IgZmlsZSBuZWVkbid0IGV4aXN0OyBgY3JlYXRlUmVxdWlyZWAgb25seSByZWFkcyBpdHMgZGlyZWN0b3J5LlxuICAgIGNvbnN0IG5leHRQYWNrYWdlID0gY3JlYXRlUmVxdWlyZShcbiAgICAgIGpvaW4ocHJvamVjdERpciwgXCJjZGstbmV4dGpzLW5leHQtcmVzb2x2ZXIuY2pzXCIpLFxuICAgICkucmVzb2x2ZShcIm5leHQvcGFja2FnZS5qc29uXCIpO1xuICAgIHJldHVybiBjcmVhdGVSZXF1aXJlKG5leHRQYWNrYWdlKS5yZXNvbHZlKFwic2hhcnBcIik7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBlbnRyeSBgbmFtZWAgaW4gYHBhcmVudFBhdGhgIGlzIGFuIGBAaW1nL3NoYXJwLSpgIHBsYXRmb3JtIGJpbmFyeVxuICogcGFja2FnZSwgb3IgcG5wbSdzIHN0b3JlIGVudHJ5IGZvciBvbmUuXG4gKlxuICogVGhlIG5hbWUgYWxvbmUgaXMgbm90IGVub3VnaCB0byBkZWxldGUgYSBkaXJlY3RvcnkgYnkuIEEgcm91dGUgc2VnbWVudCBjYWxsZWRcbiAqIGBzaGFycC1lZGdlc2Agc3RhZ2VzIGAubmV4dC9zZXJ2ZXIvYXBwL3NoYXJwLWVkZ2VzL2AsIGFuZCByZW1vdmluZyBpdCBsZWZ0IHRoZVxuICogbWFuaWZlc3QgbGlzdGluZyBhbiBlbnRyeXBvaW50IHRoYXQgaXMgbm8gbG9uZ2VyIG9uIGRpc2sg4oCUIGV2ZXJ5IHJlcXVlc3QgdG9cbiAqIHRoYXQgcm91dGUgNTAwaW5nIHdpdGggXCJDb3VsZCBub3QgbG9hZCB0aGUgZW50cnlwb2ludFwiLiBOb3IgaXMgXCJhIGBzaGFycC1gXG4gKiBwYWNrYWdlXCI6IGBzaGFycC1pY29gIGFuZCBgc2hhcnAtcGhhc2hgIGFyZSB1bnJlbGF0ZWQgZGVwZW5kZW5jaWVzLCBhbmRcbiAqIHJlbW92aW5nIHRoZW0gZmFpbGVkIHRoZSBhcHAgYXQgcnVudGltZSB3aXRoIE1PRFVMRV9OT1RfRk9VTkQuIFNvIGJvdGggdGhlXG4gKiBzY29wZSBhbmQgdGhlIHBsYWNlIGhhdmUgdG8gbWF0Y2g6XG4gKlxuICogLSBgbm9kZV9tb2R1bGVzL0BpbWcvc2hhcnAt4oCmYCwgd2hlcmUgZXZlcnkgcGxhdGZvcm0gYmluYXJ5IGFjdHVhbGx5IGxpdmVzXG4gKiAtIGBub2RlX21vZHVsZXMvLnBucG0vQGltZytzaGFycC3igKZAMC4zNS40YCwgcG5wbSdzIHN0b3JlLCB3aG9zZSBlbnRyaWVzIGFyZVxuICogICBhbHNvIHdoYXQgdGhlIGBAaW1nYCBsaW5rcyBwb2ludCBhdCAoYHNoYXJwLWxpYnZpcHMt4oCmYCBtYXRjaGVzIHRoZSBzYW1lIHdheSlcbiAqXG4gKiBUaGUgYG5vZGVfbW9kdWxlc2Agc2VnbWVudCBpcyByZXF1aXJlZCBhcyB3ZWxsLCBzbyBhbiBhcHAgZGlyZWN0b3J5IHRoYXRcbiAqIGhhcHBlbnMgdG8gYmUgY2FsbGVkIGBAaW1nYCBvciBgLnBucG1gIGlzIHN0aWxsIGxlZnQgYWxvbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NoYXJwQmluYXJ5UGFja2FnZShcbiAgcGFyZW50UGF0aDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4pOiBib29sZWFuIHtcbiAgY29uc3Qgc2VnbWVudHMgPSBwYXJlbnRQYXRoLnNwbGl0KHNlcCk7XG4gIGNvbnN0IHBhcmVudCA9IHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdO1xuICBjb25zdCBzY29wZWQgPVxuICAgIChwYXJlbnQgPT09IFwiQGltZ1wiICYmIG5hbWUuc3RhcnRzV2l0aChcInNoYXJwLVwiKSkgfHxcbiAgICAocGFyZW50ID09PSBcIi5wbnBtXCIgJiYgbmFtZS5zdGFydHNXaXRoKFwiQGltZytzaGFycC1cIikpO1xuICByZXR1cm4gc2NvcGVkICYmIHNlZ21lbnRzLmluY2x1ZGVzKFwibm9kZV9tb2R1bGVzXCIpO1xufVxuXG4vKipcbiAqIFdoZXJlIHRoZSB0YXJnZXQncyBgQGltZy9zaGFycC0qYCBiaW5hcmllcyBnbzogYDxyb290Pi9ub2RlX21vZHVsZXMvQGltZ2AuXG4gKlxuICogTm90IG5leHQgdG8gdGhlIHN0YWdlZCBgc2hhcnBgIHBhY2thZ2UuIFVuZGVyIHBucG0gdGhhdCBpc1xuICogYG5vZGVfbW9kdWxlcy8ucG5wbS9zaGFycEB4L25vZGVfbW9kdWxlcy9AaW1nYCwgd2hpY2ggb25seSB0aGUgc3RvcmUgY29weSBvZlxuICogYHNoYXJwYCByZXNvbHZlcyBmcm9tOiBhIGRlcmVmZXJlbmNlZCBsaW5rIHRvIGBzaGFycGAgKGEgY29weSBhdFxuICogYGFwcC9ub2RlX21vZHVsZXMvc2hhcnBgLCBzYXkpIGxvb2tzIGZvciBgQGltZ2AgZnJvbSBpdHMgb3duIHBhdGggYW5kIHdhbGtzXG4gKiB1cCwgbmV2ZXIgaW50byB0aGUgc3RvcmUuIEJvdGggdGhlIEZ1bmN0aW9ucyB6aXAgKGB6aXBEaXJlY3RvcnlgKSBhbmQgdGhlXG4gKiBDb250YWluZXJzIGBDT1BZYCBrZWVwIHRoZSBsaW5rcywgc28gaXQgaXMgdGhlIHN0b3JlIGNvcHkgdGhhdCBsb2FkcywgYW5kIGl0c1xuICogd2FsayB1cCByZWFjaGVzIHRoZSByb290IGBub2RlX21vZHVsZXNgIHRvbywgc28gaXQgc2VydmVzIGVpdGhlciBsYXlvdXQuIEl0XG4gKiBpcyBhbHNvIHdoZXJlIG1haW4gaW5zdGFsbGVkIHRoZW0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGFycEJpbmFyeURpcihyb290OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gam9pbihyb290LCBcIm5vZGVfbW9kdWxlc1wiLCBcIkBpbWdcIik7XG59XG5cbi8qKlxuICogRXZlcnkgZW50cnkgdW5kZXIgYHJvb3RgLCBsaW5rcyBsaXN0ZWQgYnV0IG5vdCBmb2xsb3dlZC5cbiAqXG4gKiBBbiBleHBsaWNpdCB3YWxrIHJhdGhlciB0aGFuIGByZWFkZGlyU3luYyh7IHJlY3Vyc2l2ZTogdHJ1ZSB9KWAsIHdoaWNoIG9uXG4gKiBOb2RlIDI0IGRlc2NlbmRzIGludG8gc3ltbGlua2VkIGRpcmVjdG9yaWVzIGl0c2VsZiBhbmQgc28gbmV2ZXIgcmV0dXJucyBvbiBhXG4gKiBjeWNsZSDigJQgdHdvIHdvcmtzcGFjZSBwYWNrYWdlcyB0aGF0IGxpbmsgZWFjaCBvdGhlciwgd2hpY2ggaXMgaG93IHBucG0gd2lyZXMgYVxuICogbW9ub3JlcG8uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0VHJlZShyb290OiBzdHJpbmcpOiBEaXJlbnRbXSB7XG4gIGNvbnN0IGVudHJpZXM6IERpcmVudFtdID0gW107XG4gIGNvbnN0IHBlbmRpbmcgPSBbcm9vdF07XG4gIGZvciAobGV0IGRpciA9IHBlbmRpbmcucG9wKCk7IGRpciAhPT0gdW5kZWZpbmVkOyBkaXIgPSBwZW5kaW5nLnBvcCgpKSB7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiByZWFkZGlyU3luYyhkaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgICAgZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHBlbmRpbmcucHVzaChqb2luKGRpciwgZW50cnkubmFtZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZW50cmllcztcbn1cblxuY29uc3QgRUxGX01BQ0hJTkVTOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0geyA2MjogXCJ4NjRcIiwgMTgzOiBcImFybTY0XCIgfTtcbmNvbnN0IE1BQ0hfT19NQUdJQ1MgPSBbXG4gIDB4ZmVlZGZhY2UsIDB4ZmVlZGZhY2YsIDB4Y2VmYWVkZmUsIDB4Y2ZmYWVkZmUsIDB4Y2FmZWJhYmUsXG5dO1xuXG4vKipcbiAqIFRoZSBwbGF0Zm9ybSBhIG5hdGl2ZSBhZGRvbiB3YXMgY29tcGlsZWQgZm9yLCByZWFkIGZyb20gaXRzIGhlYWRlcjpcbiAqIGBsaW51eC08YXJjaD5gLCBgZGFyd2luYCBvciBgd2luMzJgLCBvciBgdW5kZWZpbmVkYCBmb3IgYSBmaWxlIHRoYXQgaXMgbm9uZVxuICogb2YgdGhvc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuYXRpdmVCaW5hcnlQbGF0Zm9ybShmaWxlOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBoZWFkZXIgPSBCdWZmZXIuYWxsb2MoMjApO1xuICBjb25zdCBmZCA9IG9wZW5TeW5jKGZpbGUsIFwiclwiKTtcbiAgdHJ5IHtcbiAgICByZWFkU3luYyhmZCwgaGVhZGVyLCAwLCBoZWFkZXIubGVuZ3RoLCAwKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjbG9zZVN5bmMoZmQpO1xuICB9XG4gIGNvbnN0IG1hZ2ljID0gaGVhZGVyLnJlYWRVSW50MzJCRSgwKTtcbiAgaWYgKG1hZ2ljID09PSAweDdmNDU0YzQ2KSB7XG4gICAgLy8gZV9tYWNoaW5lLCBpbiB0aGUgYnl0ZSBvcmRlciBFSV9EQVRBIG5hbWVzICgyIGlzIGJpZy1lbmRpYW4pLlxuICAgIGNvbnN0IG1hY2hpbmUgPVxuICAgICAgaGVhZGVyWzVdID09PSAyID8gaGVhZGVyLnJlYWRVSW50MTZCRSgxOCkgOiBoZWFkZXIucmVhZFVJbnQxNkxFKDE4KTtcbiAgICByZXR1cm4gYGxpbnV4LSR7RUxGX01BQ0hJTkVTW21hY2hpbmVdID8/IGBtYWNoaW5lLSR7bWFjaGluZX1gfWA7XG4gIH1cbiAgaWYgKE1BQ0hfT19NQUdJQ1MuaW5jbHVkZXMobWFnaWMpKSB7XG4gICAgcmV0dXJuIFwiZGFyd2luXCI7XG4gIH1cbiAgaWYgKGhlYWRlci50b1N0cmluZyhcImxhdGluMVwiLCAwLCAyKSA9PT0gXCJNWlwiKSB7XG4gICAgcmV0dXJuIFwid2luMzJcIjtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSBwYWNrYWdlcyB1bmRlciBgcm9vdGAgdGhhdCBoYXZlIGAubm9kZWAgYWRkb25zIGJ1dCBub25lIGJ1aWx0IGZvclxuICogYHRhcmdldGAsIHNvIHRoZXknZCBmYWlsIHRvIGxvYWQgdGhlcmUuIFJldHVybmVkIGFzIGByb290YC1yZWxhdGl2ZSBwYXRocy5cbiAqXG4gKiBBIHBhY2thZ2Ugd2l0aCBhZGRvbnMgZm9yIHNldmVyYWwgcGxhdGZvcm1zIGlzIGZpbmUgYXMgbG9uZyBhcyBvbmUgb2YgdGhlbVxuICogaXMgYHRhcmdldGA6IHBhY2thZ2VzIGxpa2UgYGJ1ZmZlcnV0aWxgIGJ1bmRsZSBhIGBkYXJ3aW5gIGFuZCBhXG4gKiBgbGludXgteDY0YCBhZGRvbiBhbmQgbG9hZCB3aGljaGV2ZXIgbWF0Y2hlcyB0aGUgbWFjaGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRGb3JlaWduTmF0aXZlUGFja2FnZXMoXG4gIHJvb3Q6IHN0cmluZyxcbiAgdGFyZ2V0OiBzdHJpbmcsXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBhY2thZ2VzID0gbmV3IE1hcDxzdHJpbmcsIHsgbWF0Y2hlczogYm9vbGVhbjsgZm9yZWlnbjogYm9vbGVhbiB9PigpO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGxpc3RUcmVlKHJvb3QpKSB7XG4gICAgaWYgKCFlbnRyeS5pc0ZpbGUoKSB8fCAhZW50cnkubmFtZS5lbmRzV2l0aChcIi5ub2RlXCIpKSBjb250aW51ZTtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IG5hdGl2ZUJpbmFyeVBsYXRmb3JtKGpvaW4oZW50cnkucGFyZW50UGF0aCwgZW50cnkubmFtZSkpO1xuICAgIGlmICghcGxhdGZvcm0pIGNvbnRpbnVlO1xuICAgIGNvbnN0IHBrZyA9IHBhY2thZ2VEaXJPZihyb290LCBlbnRyeS5wYXJlbnRQYXRoKTtcbiAgICBjb25zdCBzZWVuID0gcGFja2FnZXMuZ2V0KHBrZykgPz8geyBtYXRjaGVzOiBmYWxzZSwgZm9yZWlnbjogZmFsc2UgfTtcbiAgICBpZiAocGxhdGZvcm0gPT09IHRhcmdldCkge1xuICAgICAgc2Vlbi5tYXRjaGVzID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2Vlbi5mb3JlaWduID0gdHJ1ZTtcbiAgICB9XG4gICAgcGFja2FnZXMuc2V0KHBrZywgc2Vlbik7XG4gIH1cbiAgcmV0dXJuIFsuLi5wYWNrYWdlc11cbiAgICAuZmlsdGVyKChbLCBzZWVuXSkgPT4gc2Vlbi5mb3JlaWduICYmICFzZWVuLm1hdGNoZXMpXG4gICAgLm1hcCgoW3BrZ10pID0+IHJlbGF0aXZlKHJvb3QsIHBrZykpXG4gICAgLnNvcnQoKTtcbn1cblxuLyoqIFRoZSBuZWFyZXN0IGRpcmVjdG9yeSBmcm9tIGBkaXJgIHVwIHRvIGByb290YCB3aXRoIGEgYHBhY2thZ2UuanNvbmAuICovXG5mdW5jdGlvbiBwYWNrYWdlRGlyT2Yocm9vdDogc3RyaW5nLCBkaXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGZvciAoXG4gICAgbGV0IGN1cnJlbnQgPSBkaXI7XG4gICAgY3VycmVudC5zdGFydHNXaXRoKHJvb3QpO1xuICAgIGN1cnJlbnQgPSBkaXJuYW1lKGN1cnJlbnQpXG4gICkge1xuICAgIGlmIChleGlzdHNTeW5jKGpvaW4oY3VycmVudCwgXCJwYWNrYWdlLmpzb25cIikpKSB7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnQgPT09IHJvb3QpIGJyZWFrO1xuICB9XG4gIHJldHVybiBkaXI7XG59XG5cbi8qKlxuICogV3JpdGUge0BsaW5rIFBVQkxJQ19GSUxFU19GSUxFX05BTUV9IGludG8gYSBkZXBsb3ltZW50IHJvb3QncyBydW50aW1lXG4gKiBkaXJlY3Rvcnk6IGV2ZXJ5IGZpbGUgdW5kZXIgYHB1YmxpY0RpcmAsIGxpc3RlZCB0aGUgd2F5IHRoZSBydW50aW1lIHdvdWxkXG4gKiBsaXN0IGl0IG9mZiBkaXNrIChgcmVhZFB1YmxpY0ZpbGVzYDogc3ltbGlua3MgZm9sbG93ZWQsIGAvYC1zZXBhcmF0ZWQsXG4gKiBzb3J0ZWQpLiBBbiBhcHAgd2l0aG91dCBgcHVibGljL2AgZ2V0cyBgW11gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVQdWJsaWNGaWxlTGlzdChydW50aW1lRGlyOiBzdHJpbmcsIHB1YmxpY0Rpcjogc3RyaW5nKSB7XG4gIHdyaXRlRmlsZVN5bmMoXG4gICAgam9pbihydW50aW1lRGlyLCBQVUJMSUNfRklMRVNfRklMRV9OQU1FKSxcbiAgICBKU09OLnN0cmluZ2lmeShyZWFkUHVibGljRmlsZXMocHVibGljRGlyKSksXG4gICk7XG59XG5cbi8qKlxuICogVG90YWwgYnl0ZXMgb2YgYSB0cmVlIGFzIGl0cyBkZXBsb3ltZW50IHppcCBzdG9yZXMgaXQuIGB6aXBEaXJlY3RvcnlgIGtlZXBzXG4gKiBsaW5rcyBhcyBsaW5rcywgc28gZWFjaCBjb3VudHMgYXMgaXRzIHRhcmdldCBwYXRoLCBub3QgYXMgdGhlIHRhcmdldCwgd2hpY2hcbiAqIGlzIHdhbGtlZCBhdCBpdHMgb3duIHBhdGggYW55d2F5IChldmVyeSBsaW5rIGluIGEgc3RhZ2VkIHJvb3QgcG9pbnRzIGluc2lkZVxuICogaXQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RvcmVkU2l6ZShyb290OiBzdHJpbmcpOiBudW1iZXIge1xuICBsZXQgYnl0ZXMgPSAwO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGxpc3RUcmVlKHJvb3QpKSB7XG4gICAgaWYgKCFlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBieXRlcyArPSBsc3RhdFN5bmMoam9pbihlbnRyeS5wYXJlbnRQYXRoLCBlbnRyeS5uYW1lKSkuc2l6ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG4vKipcbiAqIGBjaHVua2Agd2l0aCBgcGF0Y2hgIHByZXBlbmRlZCBiZXR3ZWVuIGBQQVRDSF9GRVRDSF9NQVJLRVJgIGFuZFxuICogYFBBVENIX0ZFVENIX0VORF9NQVJLRVJgLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGFscmVhZHkgY2FycmllcyB0aGlzIGV4YWN0XG4gKiBwYXRjaC5cbiAqXG4gKiBUaGUgb3BlbmluZyBtYXJrZXIgY2FycmllcyBhIGhhc2ggb2YgdGhlIHBhdGNoLCBzbyBhIGNodW5rIHBhdGNoZWQgYnkgYVxuICogY2RrLW5leHRqcyB3aG9zZSBgcGF0Y2gtZmV0Y2guanNgIGRpZmZlcnMgKGFuIHVwZ3JhZGUsIG92ZXIgYSBgLm5leHRgIHJldXNlZFxuICogd2l0aCBgc2tpcEJ1aWxkOiB0cnVlYCkgaXMgbm90IG1pc3Rha2VuIGZvciBjdXJyZW50OiB0aGUgb2xkIHBhdGNoIGlzIGN1dCBvZmZcbiAqIGF0IGl0cyBlbmQgbWFya2VyIGFuZCB0aGlzIG9uZSBwdXQgaW4gaXRzIHBsYWNlLCByYXRoZXIgdGhhbiB0aGUgb2xkIG9uZVxuICogc2hpcHBpbmcgb3IgYm90aCBzdGFja2luZyB1cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdGNoQ2xpZW50Q2h1bmsoXG4gIGNodW5rOiBzdHJpbmcsXG4gIHBhdGNoOiBzdHJpbmcsXG4gIGNodW5rUGF0aDogc3RyaW5nLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKHBhdGNoKS5kaWdlc3QoXCJoZXhcIikuc2xpY2UoMCwgMTYpO1xuICBjb25zdCBvcGVuID0gYCR7UEFUQ0hfRkVUQ0hfTUFSS0VSfSAke2hhc2h9ICovYDtcbiAgaWYgKGNodW5rLnN0YXJ0c1dpdGgoYCR7b3Blbn1cXG5gKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgbGV0IG9yaWdpbmFsID0gY2h1bms7XG4gIGlmIChjaHVuay5zdGFydHNXaXRoKFBBVENIX0ZFVENIX01BUktFUikpIHtcbiAgICBjb25zdCBlbmQgPSBjaHVuay5pbmRleE9mKGBcXG4ke1BBVENIX0ZFVENIX0VORF9NQVJLRVJ9XFxuYCk7XG4gICAgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgIC8vIE9ubHkgYSBwcmUtcmVsZWFzZSBjZGstbmV4dGpzIHdyb3RlIHRoZSBtYXJrZXIgd2l0aG91dCBhbiBlbmQsIGFuZFxuICAgICAgLy8gd2hlcmUgaXRzIHBhdGNoIHN0b3BzIGNhbm5vdCBiZSB0b2xkIGZyb20gdGhlIGNodW5rJ3Mgb3duIGNvZGUuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke0xPR19QUkVGSVh9ICR7Y2h1bmtQYXRofSBjYXJyaWVzIGEgY2RrLW5leHRqcyBmZXRjaCBwYXRjaCB0aGlzIGAgK1xuICAgICAgICAgIGB2ZXJzaW9uIGNhbm5vdCByZXBsYWNlLiBSZS1ydW4gXFxgbmV4dCBidWlsZFxcYCB0byByZWdlbmVyYXRlIGl0LmAsXG4gICAgICApO1xuICAgIH1cbiAgICBvcmlnaW5hbCA9IGNodW5rLnNsaWNlKGVuZCArIFBBVENIX0ZFVENIX0VORF9NQVJLRVIubGVuZ3RoICsgMik7XG4gIH1cbiAgcmV0dXJuIGAke29wZW59XFxuJHtwYXRjaH1cXG4ke1BBVENIX0ZFVENIX0VORF9NQVJLRVJ9XFxuJHtvcmlnaW5hbH1gO1xufVxuIl19
|
|
972
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWJ1aWxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25leHRqcy1idWlsZC9uZXh0anMtYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBOEpBLHdEQUtDO0FBdzJCRCx3REFtQkM7QUFNRCw0Q0FVQztBQXFCRCxvREFVQztBQWNELHdDQUVDO0FBVUQsNEJBWUM7QUFZRCxvREFzQkM7QUFVRCw4REFzQkM7QUF1QkQsa0RBS0M7QUFRRCxnQ0FRQztBQWFELDRDQXdCQzs7QUF0d0NELDJEQUE0RDtBQUM1RCw2Q0FBc0Q7QUFDdEQscUNBaUJpQjtBQUNqQiw2Q0FBNEM7QUFDNUMscUNBQWlDO0FBQ2pDLHlDQUF5RDtBQUN6RCwyQ0FBb0Q7QUFDcEQsNkNBQTBDO0FBRTFDLDJDQUF1QztBQUN2Qyw2REFBNkQ7QUFDN0Qsa0RBQTZCO0FBQzdCLGdFQUtvQztBQUNwQyw0Q0FBc0Q7QUFFdEQsa0RBUTZCO0FBQzdCLDBEQUEwRDtBQUMxRCxrREFJNEI7QUFDNUIsc0VBQWlFO0FBQ2pFLGdFQUdtQztBQUVuQzs7Ozs7R0FLRztBQUNILE1BQU0sMkJBQTJCLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFdEQ7Ozs7R0FJRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsMkJBQTJCLENBQUM7QUFDdkQsMkVBQTJFO0FBQzNFLE1BQU0sc0JBQXNCLEdBQUcsa0NBQWtDLENBQUM7QUFFbEUsTUFBTSxLQUFLLEdBQUcsSUFBQSxlQUFRLEVBQUMseUJBQXlCLENBQUMsQ0FBQztBQThFbEQ7Ozs7R0FJRztBQUNILFNBQWdCLHNCQUFzQixDQUFDLEtBQXVCO0lBQzVELE1BQU0sV0FBVyxHQUNmLEtBQUssQ0FBQyxVQUFVLEtBQUssc0JBQVUsQ0FBQyxnQkFBZ0I7UUFDaEQsS0FBSyxDQUFDLFVBQVUsS0FBSyxzQkFBVSxDQUFDLGtCQUFrQixDQUFDO0lBQ3JELE9BQU8sQ0FBQyxXQUFXLElBQUksS0FB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aUUsQ0FDcEUsQ0FBQztRQUNKLENBQUM7UUFDRCxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFDRCxPQUFPLEdBQUcsSUFBSSxLQUFLLEtBQUssS0FBSyxzQkFBc0IsS0FBSyxRQUFRLEVBQUUsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhlY0ZpbGVTeW5jLCBleGVjU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IGNyZWF0ZUhhc2gsIHJhbmRvbUJ5dGVzIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQge1xuICBjbG9zZVN5bmMsXG4gIERpcmVudCxcbiAgZXhpc3RzU3luYyxcbiAgbHN0YXRTeW5jLFxuICByZWFkRmlsZVN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jLFxuICBybVN5bmMsXG4gIG1rZGlyU3luYyxcbiAgY3BTeW5jLFxuICBvcGVuU3luYyxcbiAgcmVhZFN5bmMsXG4gIHJlbmFtZVN5bmMsXG4gIHJlYWxwYXRoU3luYyxcbiAgc3RhdFN5bmMsXG4gIHVubGlua1N5bmMsXG59IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgcmVsYXRpdmUsIHNlcCB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGpvaW4gYXMgam9pblBvc2l4IH0gZnJvbSBcIm5vZGU6cGF0aC9wb3NpeFwiO1xuaW1wb3J0IHsgQW5ub3RhdGlvbnMgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IEFyY2hpdGVjdHVyZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llc1xuaW1wb3J0IGdldERlYnVnIGZyb20gXCJkZWJ1Z1wiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9GVU5DVElPTl9HUk9VUCxcbiAgRlVOQ1RJT05fR1JPVVBTX0VOVl9WQVIsXG4gIEZ1bmN0aW9uR3JvdXBTcGVjLFxuICB2YWxpZGF0ZUZ1bmN0aW9uR3JvdXBzLFxufSBmcm9tIFwiLi4vYWRhcHRlci9mdW5jdGlvbi1ncm91cHNcIjtcbmltcG9ydCB7IExPR19QUkVGSVgsIE5leHRqc1R5cGUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBOZXh0anNCYXNlUHJvcHMgfSBmcm9tIFwiLi4vcm9vdC1jb25zdHJ1Y3RzL25leHRqcy1iYXNlLWNvbnN0cnVjdFwiO1xuaW1wb3J0IHtcbiAgQURBUFRFUl9ESVJfTkFNRSxcbiAgQURBUFRFUl9NQU5JRkVTVF9WRVJTSU9OLFxuICBBZGFwdGVyTWFuaWZlc3QsXG4gIE1BTklGRVNUX0ZJTEVfTkFNRSxcbiAgUFVCTElDX0ZJTEVTX0ZJTEVfTkFNRSxcbiAgUlVOVElNRV9ESVJfTkFNRSxcbiAgZ3JvdXBTdGFnaW5nRGlyTmFtZSxcbn0gZnJvbSBcIi4uL3J1bnRpbWUvbWFuaWZlc3RcIjtcbmltcG9ydCB7IHJlYWRQdWJsaWNGaWxlcyB9IGZyb20gXCIuLi9ydW50aW1lL3B1YmxpYy1maWxlc1wiO1xuaW1wb3J0IHtcbiAgYXNzZXRQcmVmaXhQYXRoLFxuICBub3JtYWxpemVCYXNlUGF0aCxcbiAgcmVsYXRpdmVBc3NldFByZWZpeCxcbn0gZnJvbSBcIi4uL3V0aWxzL2Jhc2UtcGF0aFwiO1xuaW1wb3J0IHsgZGVwbG95bWVudEJ1aWxkSWQgfSBmcm9tIFwiLi4vdXRpbHMvZGVwbG95bWVudC1idWlsZC1pZFwiO1xuaW1wb3J0IHtcbiAgZ2V0TGFtYmRhQXJjaGl0ZWN0dXJlLFxuICB0b05vZGVBcmNoaXRlY3R1cmUsXG59IGZyb20gXCIuLi91dGlscy9nZXQtYXJjaGl0ZWN0dXJlXCI7XG5cbi8qKlxuICogTGFtYmRhJ3MgaGFyZCBsaW1pdCBvbiB0aGUgdW56aXBwZWQgc2l6ZSBvZiBhIGZ1bmN0aW9uJ3MgY29kZSwgd2hpY2hcbiAqIENsb3VkRm9ybWF0aW9uIG9ubHkgZW5mb3JjZXMgYXQgZGVwbG95IHRpbWUuIE1lYXN1cmVkIGF0IHN5bnRoIGluc3RlYWQsIHNvIHRoZVxuICogZXJyb3IgbmFtZXMgdGhlIGdyb3VwIGFuZCBhcnJpdmVzIGluIHNlY29uZHMgcmF0aGVyIHRoYW4gbWludXRlcy5cbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xhbWJkYS9sYXRlc3QvZGcvZ2V0dGluZ3N0YXJ0ZWQtbGltaXRzLmh0bWxcbiAqL1xuY29uc3QgTEFNQkRBX1VOWklQUEVEX0xJTUlUX0JZVEVTID0gMjUwICogMTAyNCAqIDEwMjQ7XG5cbi8qKlxuICogT3BlbnMgdGhlIHBhdGNoIGBwYXRjaEZldGNoSW5DbGllbnRKc2AgcHJlcGVuZHMgdG8gYSBjbGllbnQgY2h1bmssIGZvbGxvd2VkIGJ5XG4gKiBhIGhhc2ggb2YgdGhlIHBhdGNoIGl0c2VsZiwgc28gYSBzZWNvbmQgc3ludGggb3ZlciB0aGUgc2FtZSBgLm5leHRgIGlzIGEgbm8tb3BcbiAqIHdoaWxlIG9uZSBieSBhIGNkay1uZXh0anMgd2l0aCBhIGRpZmZlcmVudCBgcGF0Y2gtZmV0Y2guanNgIHJlcGxhY2VzIGl0LlxuICovXG5jb25zdCBQQVRDSF9GRVRDSF9NQVJLRVIgPSBcIi8qIGNkay1uZXh0anM6cGF0Y2gtZmV0Y2hcIjtcbi8qKiBDbG9zZXMgdGhlIHByZXBlbmRlZCBwYXRjaDsgdGhlIGNodW5rJ3Mgb3duIGNvbnRlbnQgc3RhcnRzIGFmdGVyIGl0LiAqL1xuY29uc3QgUEFUQ0hfRkVUQ0hfRU5EX01BUktFUiA9IFwiLyogY2RrLW5leHRqczpwYXRjaC1mZXRjaDplbmQgKi9cIjtcblxuY29uc3QgZGVidWcgPSBnZXREZWJ1ZyhcImNkay1uZXh0anM6bmV4dGpzLWJ1aWxkXCIpO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0J1aWxkUHJvcHMge1xuICAvKipcbiAgICogQHNlZSB7QGxpbmsgTmV4dGpzQmFzZVByb3BzW1wiYnVpbGRDb21tYW5kXCJdfVxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRDb21tYW5kOiBOZXh0anNCYXNlUHJvcHNbXCJidWlsZENvbW1hbmRcIl07XG4gIC8qKlxuICAgKiBEaXJlY3Rvcnkgd2hlcmUgdGhlIE5leHQuanMgYXBwbGljYXRpb24gaXMgbG9jYXRlZCBmb3IgbG9jYWwgYnVpbGRzLlxuICAgKiBUaGlzIHNob3VsZCBjb250YWluIHRoZSBwYWNrYWdlLmpzb24gYW5kIE5leHQuanMgYXBwbGljYXRpb24gZmlsZXMuXG4gICAqL1xuICByZWFkb25seSBidWlsZERpcmVjdG9yeTogc3RyaW5nO1xuICByZWFkb25seSBuZXh0anNUeXBlOiBOZXh0anNUeXBlO1xuICAvKipcbiAgICogQHNlZSB7QGxpbmsgTmV4dGpzQmFzZVByb3BzLnNraXBCdWlsZH1cbiAgICovXG4gIHJlYWRvbmx5IHNraXBCdWlsZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBSb3V0ZSBncm91cHMgdG8gcGFja2FnZSBpbnRvIHNlcGFyYXRlIExhbWJkYSBmdW5jdGlvbnMuIE9ubHkgdGhlIHR3b1xuICAgKiBGdW5jdGlvbnMgYE5leHRqc1R5cGVgcyBwYXNzIHRoaXM7IHNlZSBgTmV4dGpzRnVuY3Rpb25Hcm91cGAuXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbkdyb3Vwcz86IE5leHRqc0Z1bmN0aW9uR3JvdXBSb3V0ZXNbXTtcbiAgLyoqXG4gICAqIExhbWJkYSBhcmNoaXRlY3R1cmUgdGhlIEZ1bmN0aW9ucyB0eXBlcyBkZXBsb3ksIHdoaWNoIGRlY2lkZXMgdGhlIGBzaGFycGBcbiAgICogYmluYXJpZXMgc3RhZ2VkIGludG8gdGhlIGRlcGxveW1lbnQgcm9vdHMuIElnbm9yZWQgYnkgdGhlIENvbnRhaW5lcnNcbiAgICogdHlwZXMsIHdob3NlIGltYWdlIGlzIGJ1aWx0IGZvciB0aGUgc3ludGggbWFjaGluZS5cbiAgICogQGRlZmF1bHQgLSB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBtYWNoaW5lIHJ1bm5pbmcgc3ludGhcbiAgICovXG4gIHJlYWRvbmx5IGFyY2hpdGVjdHVyZT86IEFyY2hpdGVjdHVyZTtcbn1cblxuLyoqXG4gKiBUaGUgcGFydCBvZiBhIGZ1bmN0aW9uIGdyb3VwIGBOZXh0anNCdWlsZGAgbmVlZHM6IHdoaWNoIHJvdXRlcyBpdCBvd25zLiBUaGVcbiAqIHBlci1ncm91cCBMYW1iZGEgYG92ZXJyaWRlc2AgYXJlIGBOZXh0anNGdW5jdGlvbnNgJyBidXNpbmVzcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXh0anNGdW5jdGlvbkdyb3VwUm91dGVzIHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSByb3V0ZXM6IHN0cmluZ1tdO1xufVxuXG4vKiogT25lIHN0YWdlZCBkZXBsb3ltZW50IHJvb3QsIGFuZCB0aGUgZnVuY3Rpb24gZ3JvdXAgaXQgYmVsb25ncyB0by4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRGVwbG95bWVudFJvb3Qge1xuICAvKipcbiAgICogR3JvdXAgbmFtZSwgYGRlZmF1bHRgIGZvciB0aGUgaW1wbGljaXQgZ3JvdXAgdGhhdCBvd25zIGV2ZXJ5IHVuYXNzaWduZWRcbiAgICogcm91dGUuIFRoZSBvbmx5IGVudHJ5IGlzIGBkZWZhdWx0YCB3aGVuIGBmdW5jdGlvbkdyb3Vwc2AgaXMgbm90IHVzZWQuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBkZXBsb3ltZW50IHJvb3Q6IHRoZSBMYW1iZGEgemlwIGFzc2V0J3Mgc291cmNlLiAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBSb3V0ZSB0ZW1wbGF0ZXMgdGhpcyByb290J3MgcGFja2FnZSBob2xkcywgYXMgdGhlIGFkYXB0ZXIgYXNzaWduZWQgdGhlbS5cbiAgICogRW1wdHkgaXMgbGVnYWw6IHRoZSBkZWZhdWx0IGdyb3VwIHN0aWxsIHNlcnZlcyBgL19uZXh0L2ltYWdlYCwgdGhlIHN0YXRpY1xuICAgKiBmaWxlcyB0aGUgcnVudGltZSByZWFkcyBvZmYgZGlzaywgYW5kIGFueXRoaW5nIHRoZSBjYXRjaC1hbGwgcm91dGVzIHRvIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBPbmUgYmVoYXZpb3IgdGhhdCByb3V0ZXMgYSBmdW5jdGlvbiBncm91cCdzIFVSTHMgdG8gaXQsIGFzIHRoZSBhZGFwdGVyXG4gKiBjaGVja2VkIHRoZW0gYWdhaW5zdCB3aGF0IGVhY2ggZ3JvdXAgd2FzIHBhY2thZ2VkIHdpdGguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRnVuY3Rpb25Hcm91cEJlaGF2aW9yIHtcbiAgLyoqIFRoZSBmdW5jdGlvbiBncm91cCB0aGUgYmVoYXZpb3Igcm91dGVzIHRvLiAqL1xuICByZWFkb25seSBncm91cDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGdyb3VwIHBhdHRlcm4gaXQgY2FtZSBmcm9tIChgL2Jsb2cvKipgKSwgb3IgdGhlIHBhcmVudCBvZiBhbiBvcHRpb25hbFxuICAgKiBjYXRjaC1hbGwgYSBzdWJ0cmVlIHBhdHRlcm4gbW92ZWQgaW50byB0aGUgZ3JvdXAgKGAvYmxvZ2AgZm9yXG4gICAqIGAvYmxvZy9bWy4uLnNsdWddXWApLCB3aGljaCB0aGF0IHN1YnRyZWUncyBiZWhhdmlvciBkb2VzIG5vdCBtYXRjaC5cbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgQ2xvdWRGcm9udCBwYXRoIHBhdHRlcm4sIGJlZm9yZSBiYXNlUGF0aCBhbmQgd2l0aG91dCBhIGxlYWRpbmcgc2xhc2g6XG4gICAqIGBibG9nLypgLCBgcHJpY2luZ2AsIGBwcmljaW5nL2AgZm9yIGEgYHRyYWlsaW5nU2xhc2hgIGFwcCwgYW5kXG4gICAqIGBfbmV4dC9kYXRhLzxidWlsZElkPi9ibG9nLypgIGZvciBhIGdyb3VwIG93bmluZyBhIFBhZ2VzIFJvdXRlciBwYWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0dGVybjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoYXQgZXZlcnkgZGVwbG95bWVudCByb290IGlzIHN0YWdlZCBmb3I6IHRoZSBidWlsZCdzIGBhcmNoaXRlY3R1cmVgLCBlbHNlXG4gKiB0aGUgc3ludGggbWFjaGluZSdzLiBDb250YWluZXJzIGlnbm9yZSBpdDogRG9ja2VyIGJ1aWxkcyB0aGVpciBpbWFnZVxuICogbmF0aXZlbHksIHNvIGl0IGNhbiBvbmx5IG1hdGNoIHRoZSBzeW50aCBtYWNoaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVwbG95bWVudEFyY2hpdGVjdHVyZShwcm9wczogTmV4dGpzQnVpbGRQcm9wcyk6IEFyY2hpdGVjdHVyZSB7XG4gIGNvbnN0IGlzRnVuY3Rpb25zID1cbiAgICBwcm9wcy5uZXh0anNUeXBlID09PSBOZXh0anNUeXBlLkdMT0JBTF9GVU5DVElPTlMgfHxcbiAgICBwcm9wcy5uZXh0anNUeXBlID09PSBOZXh0anNUeXBlLlJFR0lPTkFMX0ZVTkNUSU9OUztcbiAgcmV0dXJuIChpc0Z1bmN0aW9ucyAmJiBwcm9wcy5hcmNoaXRlY3R1cmUpIHx8IGdldExhbWJkYUFyY2hpdGVjdHVyZSgpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFB1YmxpY0RpckVudHJ5IHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBpc0RpcmVjdG9yeTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBCdWlsZHMgTmV4dC5qcyBhc3NldHMuXG4gKiBAbGluayBodHRwczovL25leHRqcy5vcmcvZG9jcy9wYWdlcy9hcGktcmVmZXJlbmNlL25leHQtY29uZmlnLWpzL291dHB1dFxuICovXG5leHBvcnQgY2xhc3MgTmV4dGpzQnVpbGQgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogVW5pcXVlIGlkIGZvciB0aGlzIGRlcGxveW1lbnQuIFVzZWQgdG8gcGFydGl0aW9uIGNhY2hlIHN0b3JhZ2UgYW5kIGFzXG4gICAqIG1ldGFkYXRhIGZvciBzdGF0aWMgYXNzZXRzIGluIFMzIGJ1Y2tldC5cbiAgICpcbiAgICogTmV4dC5qcydzIGJ1aWxkIElELCBzdWZmaXhlZCB3aXRoIHRoZSBhcHAncyBgZGVwbG95bWVudElkYCB3aGVuIGl0IHNldHNcbiAgICogb25lLiBUaGUgYnVpbGQgSUQgYWxvbmUgaXMgbm90IHVuaXF1ZSBwZXIgZGVwbG95bWVudDogc2V0dGluZ1xuICAgKiBgZGVwbG95bWVudElkYCAob3IgYnVpbGRpbmcgd2l0aCBgTkVYVF9ERVBMT1lNRU5UX0lEYCkgdHVybnMgb24gc2tld1xuICAgKiBwcm90ZWN0aW9uLCBhbmQgbmV4dC5qcyB0aGVuICpwaW5zKiB0aGUgYnVpbGQgSUQgdG8gdGhlIGNvbnN0YW50XG4gICAqIGBidWlsZC1UZmN0c1dYcGZmMmZLU2Ag4oCUIHNlZSBgZ2V0QnVpbGRJZGAgaW4gYG5leHQvZGlzdC9idWlsZC9pbmRleC5qc2AsXG4gICAqIHdoaWNoIGRvZXMgdGhhdCBkZWxpYmVyYXRlbHkgc28gdGhhdCB0b29saW5nIGRvaW5nXG4gICAqIGAucmVwbGFjZShlc2NhcGVkQnVpbGRJZCwg4oCmKWAgc3RpbGwgaGFzIHNvbWV0aGluZyB0byByZXBsYWNlLiBUd29cbiAgICogc3VjY2Vzc2l2ZSBkZXBsb3ltZW50cyBvZiBzdWNoIGFuIGFwcCB3b3VsZCBzaGFyZSBvbmUgY2FjaGUgcHJlZml4IGFuZCBvbmVcbiAgICogcmV2YWxpZGF0aW9uLXRhYmxlIHBhcnRpdGlvbiwgYW5kIHRoZSBuZXcgb25lIHdvdWxkIHJlYWQgdGhlIHByZXZpb3VzXG4gICAqIG9uZSdzIHByZXJlbmRlcnMuIEFwcGVuZGluZyB0aGUgZGVwbG95bWVudCBJRCByZXN0b3JlcyB0aGUgXCJvbmVcbiAgICogZGVwbG95bWVudCwgb25lIHBhcnRpdGlvblwiIGludmFyaWFudCB0aGF0IElEIGV4aXN0cyB0byBjYXJyeS5cbiAgICpcbiAgICogTm90aGluZyByb3V0ZXMgb24gdGhpcyB2YWx1ZSDigJQgdGhlIGAvX25leHQvZGF0YS88YnVpbGRJZD4v4oCmYCBVUkwgc3BhY2UgaXNcbiAgICogcm91dGVkIG9uIE5leHQuanMncyBvd24gYnVpbGQgSUQsIHdoaWNoIGlzIHdoYXQgdGhlIGFwcCdzIGNsaWVudCBidW5kbGVzXG4gICAqIGNhcnJ5IOKAlCBzbyBpdCBpcyBmcmVlIHRvIGJlIGxvbmdlciB0aGFuIG5leHQuanMncyBvd24uXG4gICAqL1xuICBidWlsZElkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBpbml0IGNhY2hlIGRpcmVjdG9yeVxuICAgKiBAZXhhbXBsZSBcIi9Vc2Vycy9qb2huL215YXBwLy5uZXh0L2Nkay1uZXh0anMtaW5pdC1jYWNoZVwiXG4gICAqL1xuICBpbml0Q2FjaGVEaXI6IHN0cmluZztcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gcHVibGljLiBVc2UgYnkgQ2xvdWRGcm9udC9BTEIgdG8gY3JlYXRlIGJlaGF2aW9ycy9ydWxlc1xuICAgKiBAZXhhbXBsZSBcIi9Vc2Vycy9qb2huL215YXBwL3B1YmxpY1wiXG4gICAqL1xuICBwdWJsaWNEaXJFbnRyaWVzOiBQdWJsaWNEaXJFbnRyeVtdO1xuICAvKipcbiAgICogVGhlIEphdmFTY3JpcHQgZmlsZSBOb2RlLmpzIHJ1bnMgdG8gc2VydmUgcmVxdWVzdHMsIHJlbGF0aXZlIHRvIHRoZVxuICAgKiBkZXBsb3ltZW50IHJvb3QuIGNkay1uZXh0anMncyBvd24gY29udGFpbmVyIHNoZWxsLCBub3QgYG5leHQgYnVpbGRgIG91dHB1dCxcbiAgICogc28gaXQgaXMgdGhlIHNhbWUgcGF0aCBmb3IgZXZlcnkgYXBwLlxuICAgKiBAZXhhbXBsZSBcImNkay1uZXh0anMtcnVudGltZS9zZXJ2ZXIubWpzXCJcbiAgICovXG4gIHJlbGF0aXZlUGF0aFRvRW50cnlwb2ludDogc3RyaW5nO1xuICAvKipcbiAgICogQWJzb2x1dGUgcGF0aCB0byB0aGUgLm5leHQgZGlyZWN0b3J5IGNvbnRhaW5pbmcgTmV4dC5qcyBidWlsZCBhcnRpZmFjdHNcbiAgICovXG4gIGRvdE5leHRQYXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgTmV4dC5qcyBhcHAncyBvd24gYGJhc2VQYXRoYCDigJQgdGhlIFVSTCBwcmVmaXggaXQgZ2VuZXJhdGVzIGl0cyBsaW5rcyBhbmRcbiAgICogYXNzZXQgaHJlZnMgdW5kZXIg4oCUIGFzIHRoZSBhZGFwdGVyIG1hbmlmZXN0IHJlY29yZGVkIGl0LiBOb3JtYWxpemVkIHRvIGEgYmFyZSBwYXRoIHNlZ21lbnQsIGVtcHR5IHdoZW4gdGhlIGFwcCBzZXRzIG5vbmUuIEV4cG9zZWQgc29cbiAgICogcm9vdCBjb25zdHJ1Y3RzIGNhbiByZWNvbmNpbGUgaXQgd2l0aCB0aGUgQ0RLIGBiYXNlUGF0aGAgcHJvcCwgd2hpY2ggaXMgYVxuICAgKiBkaXN0aW5jdCB0aGluZzsgc2VlIGByZXNvbHZlQmFzZVBhdGhgLlxuICAgKi9cbiAgbmV4dENvbmZpZ0Jhc2VQYXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgTmV4dC5qcyBhcHAncyBvd24gYGFzc2V0UHJlZml4YCwgYXMgYSBwYXRoIHdpdGggYSBsZWFkaW5nIHNsYXNoIGFuZCBub1xuICAgKiB0cmFpbGluZyBvbmUsIGVtcHR5IHdoZW4gdGhlIGFwcCBzZXRzIG5vbmUgb3Igc2V0cyBhbiBhYnNvbHV0ZSBVUkwgKHdoaWNoXG4gICAqIG5hbWVzIGFuIG9yaWdpbiBjZGstbmV4dGpzIGRvZXMgbm90IHNlcnZlKS5cbiAgICpcbiAgICogRXhwb3NlZCBiZWNhdXNlIGl0IGlzIHRoZSBzaGFwZSBvZiBgYXNzZXRQcmVmaXhgIHRoZSByZWdpb25hbFxuICAgKiBgTmV4dGpzVHlwZWBzIGNhbm5vdCBzZXJ2ZSDigJQgc2VlIGB3YXJuVW5zZXJ2ZWRBc3NldFByZWZpeGAuIFdoYXQgdGhlXG4gICAqIGRpc3RyaWJ1dGlvbiBoYXMgdG8gYW5zd2VyIG9uIGlzIHtAbGluayBuZXh0Q29uZmlnQXNzZXRQcmVmaXhQYXRofSwgd2hpY2hcbiAgICogYWxzbyBjb3ZlcnMgdGhlIHBhdGggYW4gYWJzb2x1dGUgcHJlZml4IGNhcnJpZXMuXG4gICAqL1xuICBuZXh0Q29uZmlnQXNzZXRQcmVmaXg6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwYXRoIHBvcnRpb24gb2YgdGhlIGFwcCdzIGBhc3NldFByZWZpeGAsIHdoaWNoZXZlciBmb3JtIGl0IHRha2VzOiBcIi9jZG5cIlxuICAgKiBmb3IgYm90aCBgYXNzZXRQcmVmaXg6IFwiL2NkblwiYCBhbmQgYGFzc2V0UHJlZml4OlxuICAgKiBcImh0dHBzOi8vY2RuLmV4YW1wbGUuY29tL2NkblwiYCwgZW1wdHkgd2hlbiB0aGVyZSBpcyBubyBwYXRoIHRvIGFuc3dlciBvbi5cbiAgICpcbiAgICogRXhwb3NlZCBiZWNhdXNlIGl0IGlzIGEgVVJMIHByZWZpeCB0aGUgZGlzdHJpYnV0aW9uIGhhcyB0byBhbnN3ZXIgb246IE5leHQuanNcbiAgICogZW1pdHMgYDxhc3NldFByZWZpeD4vX25leHQvc3RhdGljLy4uLmAgZm9yIGV2ZXJ5IGJ1bmRsZSBhbmQgY29tcGlsZXMgYSByZXdyaXRlXG4gICAqIHRoYXQgc2VydmVzIHRob3NlIFVSTHMnIHBhdGhzIGl0c2VsZiwgd2hpbGUgdGhlIG9iamVjdHMgbGl2ZSBpbiBTMyB1bmRlclxuICAgKiBgPGJhc2VQYXRoPi9fbmV4dC9zdGF0aWMvLi4uYC5cbiAgICovXG4gIG5leHRDb25maWdBc3NldFByZWZpeFBhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIEV2ZXJ5IHN0YWdlZCBkZXBsb3ltZW50IHJvb3QsIG9uZSBwZXIgZnVuY3Rpb24gZ3JvdXAsIGBkZWZhdWx0YCBmaXJzdDogdGhlXG4gICAqIHN0YWdlZCB1bmlvbiBvZiBlYWNoIGdyb3VwJ3Mgc2hpcHBlZCBvdXRwdXRzIGFuZCB0aGVpciB0cmFjZWQgYXNzZXRzLFxuICAgKiB3cml0dGVuIGJ5IHRoZSBhZGFwdGVyJ3MgYG9uQnVpbGRDb21wbGV0ZWAuIEV4YWN0bHkgb25lIGVudHJ5IChuYW1lZFxuICAgKiBgZGVmYXVsdGAsIGF0IGAubmV4dC9jZGstbmV4dGpzLWFkYXB0ZXIvYXBwYCkgdW5sZXNzIGBmdW5jdGlvbkdyb3Vwc2BcbiAgICogc3BsaXRzIHRoZSBhcHAuIFRoZSBMYW1iZGEgemlwIGFzc2V0czsgQ29udGFpbmVycyBgQ09QWWAgdGhlIGBkZWZhdWx0YCBvbmUuXG4gICAqL1xuICBkZXBsb3ltZW50Um9vdHM6IE5leHRqc0RlcGxveW1lbnRSb290W107XG4gIC8qKlxuICAgKiBXaGF0IHJvdXRlcyBlYWNoIG5vbi1kZWZhdWx0IGZ1bmN0aW9uIGdyb3VwJ3MgVVJMcyB0byBpdCwgbW9zdCBzcGVjaWZpY1xuICAgKiBmaXJzdCDigJQgdGhlIG9yZGVyIENsb3VkRnJvbnQgaGFzIHRvIHNlZSB0aGVtIGluLCBzaW5jZSBpdCBzdG9wcyBhdCB0aGVcbiAgICogZmlyc3QgbWF0Y2guIEVtcHR5IHVubGVzcyBgZnVuY3Rpb25Hcm91cHNgIHNwbGl0cyB0aGUgYXBwLlxuICAgKi9cbiAgZnVuY3Rpb25Hcm91cEJlaGF2aW9yczogTmV4dGpzRnVuY3Rpb25Hcm91cEJlaGF2aW9yW107XG4gIC8qKlxuICAgKiBGcm9tIHRoZSBkZXBsb3ltZW50IHJvb3QgdG8gdGhlIE5leHQuanMgcHJvamVjdCBkaXIsIFBPU0lYLCBgXCJcImAgd2hlblxuICAgKiB0aGUgYXBwIGlzIGF0IHRoZSByZXBvIHJvb3QuIFRoZSBydW50aW1lIGBjaGRpcmBzIGhlcmU7IENvbnRhaW5lcnMgcGFzcyBpdCB0b1xuICAgKiB0aGVpciBEb2NrZXJmaWxlIHNvIGAubmV4dC9zdGF0aWNgIGFuZCBgcHVibGljYCBsYW5kIGluIHRoZSBzYW1lIHBsYWNlLlxuICAgKiBAc2VlIEFkYXB0ZXJNYW5pZmVzdC5yZWxhdGl2ZVByb2plY3REaXJcbiAgICovXG4gIHJlbGF0aXZlUHJvamVjdERpcjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGFyY2hpdGVjdHVyZSBldmVyeSBkZXBsb3ltZW50IHJvb3QncyBuYXRpdmUgZGVwZW5kZW5jaWVzIChgc2hhcnBgKVxuICAgKiB3ZXJlIHN0YWdlZCBmb3IuIFRoZSBMYW1iZGFzIGRlcGxveWluZyB0aGVtIG11c3QgdXNlIHRoZSBzYW1lIG9uZS5cbiAgICovXG4gIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlO1xuXG4gIHByaXZhdGUgcHJvcHM6IE5leHRqc0J1aWxkUHJvcHM7XG4gIHByaXZhdGUgYnVpbGRDb21tYW5kOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE5leHRqc0J1aWxkUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICB0aGlzLmRvdE5leHRQYXRoID0gam9pbihwcm9wcy5idWlsZERpcmVjdG9yeSwgXCIubmV4dFwiKTtcblxuICAgIHRoaXMuYnVpbGRDb21tYW5kID0gcHJvcHMuYnVpbGRDb21tYW5kIHx8IFwibnBtIHJ1biBidWlsZFwiO1xuXG4gICAgLy8gU2V0IGluaXQgY2FjaGUgZGlyZWN0b3J5IHBhdGhcbiAgICB0aGlzLmluaXRDYWNoZURpciA9IGpvaW4oXG4gICAgICBwcm9wcy5idWlsZERpcmVjdG9yeSxcbiAgICAgIFwiLm5leHRcIixcbiAgICAgIFwiY2RrLW5leHRqcy1pbml0LWNhY2hlXCIsXG4gICAgKTtcblxuICAgIC8vIEJlZm9yZSB0aGUgYnVpbGQsIG5vdCBhZnRlciBpdDogdGhlIGJ1aWxkIGlzIG1pbnV0ZXMgbG9uZywgYW5kIHRoZSBlbnYgdmFyXG4gICAgLy8gaXQgcGFzc2VzIGdyb3VwcyB0aHJvdWdoIGlzIG9ubHkgc2V0IGZvciBhIG5vbi1lbXB0eSBhcnJheSDigJQgc28gYW4gaW52YWxpZFxuICAgIC8vIGBmdW5jdGlvbkdyb3Vwc2AgKGFuIGVtcHR5IGFycmF5LCBhIHJlc2VydmVkIG5hbWUsIGEgZ3JvdXAgb3duaW5nIG5vXG4gICAgLy8gcm91dGVzKSB3b3VsZCBvdGhlcndpc2UgYmUgcmVwb3J0ZWQgYXMgXCJ0aGUgYnVpbGQgc3RhZ2VkIHRoZSB3cm9uZ1xuICAgIC8vIGdyb3Vwc1wiLCBhZnRlciBwYXlpbmcgZm9yIHRoZSBidWlsZCwgaW5zdGVhZCBvZiBhcyB0aGUgcHJvcCBlcnJvciBpdCBpcy5cbiAgICBpZiAocHJvcHMuZnVuY3Rpb25Hcm91cHMpIHtcbiAgICAgIHZhbGlkYXRlRnVuY3Rpb25Hcm91cHMocHJvcHMuZnVuY3Rpb25Hcm91cHMgYXMgRnVuY3Rpb25Hcm91cFNwZWNbXSk7XG4gICAgfVxuXG4gICAgLy8gRXhlY3V0ZSBsb2NhbCBidWlsZCBwcm9jZXNzXG4gICAgaWYgKHByb3BzLnNraXBCdWlsZCAhPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5ydW5OZXh0QnVpbGQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWcoYCR7TE9HX1BSRUZJWH0gU2tpcHBpbmc6ICR7dGhpcy5idWlsZENvbW1hbmR9YCk7XG4gICAgfVxuXG4gICAgLy8gRmlyc3QsIGJlZm9yZSBhbnl0aGluZyBlbHNlIHJlYWRzIGAubmV4dGA6IGEgbWlzc2luZyBtYW5pZmVzdCBpcyB0aGUgb25lXG4gICAgLy8gZXJyb3IgdGhhdCBuYW1lcyB0aGUgY2F1c2UgKG5vIGJ1aWxkLCBvciBvbmUgd2l0aG91dCB0aGUgYWRhcHRlciksIHdoZXJlXG4gICAgLy8gZXZlcnkgbGF0ZXIgcmVhZCBmYWlscyB3aXRoIGEgYmFyZSBFTk9FTlQuXG4gICAgY29uc3QgbWFuaWZlc3QgPSB0aGlzLnJlYWRBZGFwdGVyTWFuaWZlc3QoKTtcblxuICAgIC8vIERlbGliZXJhdGVseSBvdXRzaWRlIHRoZSBgc2tpcEJ1aWxkYCBnYXRlLiBUaGUgcGF0Y2ggaXMgYSBwcm9wZXJ0eSBvZlxuICAgIC8vICpzZXJ2aW5nKiB0aHJvdWdoIENsb3VkRnJvbnQsIG5vdCBvZiB3aG8gcmFuIGBuZXh0IGJ1aWxkYDogd2l0aG91dCBpdFxuICAgIC8vIGV2ZXJ5IFBPU1Qgd2l0aCBhIGJvZHkgaXMgcmVqZWN0ZWQgYnkgdGhlIExhbWJkYSBGdW5jdGlvbiBVUkwgYmVmb3JlIGl0XG4gICAgLy8gcmVhY2hlcyB0aGUgYXBwIChzZWUgYHBhdGNoRmV0Y2hJbkNsaWVudEpzYCkuIFJ1bm5pbmcgaXQgb25seSBpbnNpZGVcbiAgICAvLyBgcnVuTmV4dEJ1aWxkYCBtZWFudCBgc2tpcEJ1aWxkOiB0cnVlYCBzaWxlbnRseSBzaGlwcGVkIGFuIGFwcCB3aG9zZVxuICAgIC8vIHNlcnZlciBhY3Rpb25zIGFuZCBQT1NUIHJvdXRlIGhhbmRsZXJzIGFsbCByZXR1cm5lZCA0MDMuXG4gICAgaWYgKHByb3BzLm5leHRqc1R5cGUgPT09IE5leHRqc1R5cGUuR0xPQkFMX0ZVTkNUSU9OUykge1xuICAgICAgdGhpcy5wYXRjaEZldGNoSW5DbGllbnRKcygpO1xuICAgIH1cblxuICAgIHRoaXMuYnVpbGRJZCA9IGRlcGxveW1lbnRCdWlsZElkKG1hbmlmZXN0KTtcbiAgICB0aGlzLnB1YmxpY0RpckVudHJpZXMgPSB0aGlzLmdldExvY2FsUHVibGljRGlyRW50cmllcygpO1xuICAgIC8vIE5leHQuanMncyByZXNvbHZlZCBjb25maWcsIHRoZSBzYW1lIG9uZSBpdCB3cml0ZXMgaW50b1xuICAgIC8vIGByZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvbmAuXG4gICAgdGhpcy5uZXh0Q29uZmlnQmFzZVBhdGggPSBub3JtYWxpemVCYXNlUGF0aChtYW5pZmVzdC5jb25maWcuYmFzZVBhdGgpO1xuICAgIHRoaXMubmV4dENvbmZpZ0Fzc2V0UHJlZml4ID0gcmVsYXRpdmVBc3NldFByZWZpeChcbiAgICAgIG1hbmlmZXN0LmNvbmZpZy5hc3NldFByZWZpeCxcbiAgICApO1xuICAgIHRoaXMubmV4dENvbmZpZ0Fzc2V0UHJlZml4UGF0aCA9IGFzc2V0UHJlZml4UGF0aChcbiAgICAgIG1hbmlmZXN0LmNvbmZpZy5hc3NldFByZWZpeCxcbiAgICApO1xuXG4gICAgY29uc3QgaXNGdW5jdGlvbnMgPVxuICAgICAgcHJvcHMubmV4dGpzVHlwZSA9PT0gTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TIHx8XG4gICAgICBwcm9wcy5uZXh0anNUeXBlID09PSBOZXh0anNUeXBlLlJFR0lPTkFMX0ZVTkNUSU9OUztcblxuICAgIHRoaXMucmVsYXRpdmVQcm9qZWN0RGlyID0gbWFuaWZlc3QucmVsYXRpdmVQcm9qZWN0RGlyO1xuICAgIHRoaXMucmVsYXRpdmVQYXRoVG9FbnRyeXBvaW50ID0gam9pblBvc2l4KFJVTlRJTUVfRElSX05BTUUsIFwic2VydmVyLm1qc1wiKTtcbiAgICB0aGlzLmFyY2hpdGVjdHVyZSA9IGRlcGxveW1lbnRBcmNoaXRlY3R1cmUocHJvcHMpO1xuICAgIHRoaXMuZGVwbG95bWVudFJvb3RzID0gdGhpcy5yZXNvbHZlRGVwbG95bWVudFJvb3RzKG1hbmlmZXN0KTtcbiAgICB0aGlzLmZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMgPSBtYW5pZmVzdC5iZWhhdmlvcnMgPz8gW107XG5cbiAgICAvLyBPbmx5IHRoZSBSZWdpb25hbENvbnRhaW5lcnMgaW1hZ2UgY2FycmllcyBgcHVibGljL2A6IG5vdGhpbmcgaXMgaW4gZnJvbnRcbiAgICAvLyBvZiBpdCB0byBhbnN3ZXIgdGhvc2UgcGF0aHMgZnJvbSBTMy4gRXZlcnkgb3RoZXIgdHlwZSBsaXN0cyBpdCBoZXJlIGFuZFxuICAgIC8vIHJlYWRzIGEgZmlsZSB0aGUgZWRnZSBkaWRuJ3Qgcm91dGUgdG8gUzMgKGEgcmV3cml0ZSBvbnRvIGl0KSBmcm9tIHRoZXJlLlxuICAgIGNvbnN0IHB1YmxpY09uRGlzayA9IHByb3BzLm5leHRqc1R5cGUgPT09IE5leHRqc1R5cGUuUkVHSU9OQUxfQ09OVEFJTkVSUztcbiAgICBpZiAocHVibGljT25EaXNrKSB7XG4gICAgICAvLyBJdHMgZ2VuZXJhdGVkIERvY2tlcmZpbGUgYENPUFlgcyBgcHVibGljYCwgd2hpY2ggZmFpbHMgdGhlIGltYWdlIGJ1aWxkXG4gICAgICAvLyB3aGVuIHRoZSBhcHAgaGFzIG5vbmUuIEFuIGVtcHR5IGRpcmVjdG9yeSBpcyB3aGF0IGBuZXh0IHN0YXJ0YCBzZWVzXG4gICAgICAvLyBmb3IgYW4gYXBwIHdpdGhvdXQgb25lIGFueXdheSwgYW5kIGdpdCBkb2Vzbid0IHRyYWNrIGl0LlxuICAgICAgbWtkaXJTeW5jKGpvaW4ocHJvcHMuYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJvb3Qgb2YgdGhpcy5kZXBsb3ltZW50Um9vdHMpIHtcbiAgICAgIHRoaXMuc3RhZ2VSdW50aW1lKHJvb3QucGF0aCwgaXNGdW5jdGlvbnMsIHB1YmxpY09uRGlzayk7XG4gICAgICAvLyBGdW5jdGlvbnMgcnVuIG9uIHRoZSBMYW1iZGEgbWFuYWdlZCBydW50aW1lIChBbWF6b24gTGludXggMjAyMywgZ2xpYmMpLFxuICAgICAgLy8gZm9yIHRoZSBhcmNoaXRlY3R1cmUgdGhlaXIgTGFtYmRhIGRlcGxveXMsIHdoYXRldmVyIHRoaXMgbWFjaGluZSBpcztcbiAgICAgIC8vIENvbnRhaW5lcnMgcnVuIG9uIG5vZGU6MjQtYWxwaW5lIChtdXNsKS5cbiAgICAgIHRoaXMuc3RhZ2VTaGFycEZvclRhcmdldChcbiAgICAgICAgcm9vdCxcbiAgICAgICAgam9pbihyb290LnBhdGgsIHRoaXMucmVsYXRpdmVQcm9qZWN0RGlyKSxcbiAgICAgICAgYCR7aXNGdW5jdGlvbnMgPyBcImxpbnV4XCIgOiBcImxpbnV4bXVzbFwifS0ke3RvTm9kZUFyY2hpdGVjdHVyZSh0aGlzLmFyY2hpdGVjdHVyZSl9YCxcbiAgICAgICk7XG4gICAgICB0aGlzLndhcm5PbkZvcmVpZ25OYXRpdmVCaW5hcmllcyhcbiAgICAgICAgcm9vdCxcbiAgICAgICAgYGxpbnV4LSR7dG9Ob2RlQXJjaGl0ZWN0dXJlKHRoaXMuYXJjaGl0ZWN0dXJlKX1gLFxuICAgICAgKTtcblxuICAgICAgaWYgKGlzRnVuY3Rpb25zKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0VW5kZXJMYW1iZGFMaW1pdChyb290KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGluZSB1cCB0aGUgZ3JvdXBzIHRoZSBwcm9wcyBhc2tlZCBmb3Igd2l0aCB0aGUgcm9vdHMgdGhlIGJ1aWxkIGFjdHVhbGx5XG4gICAqIHN0YWdlZCwgYW5kIGZhaWwgbG91ZGx5IHdoZW4gdGhleSBkaXNhZ3JlZS5cbiAgICpcbiAgICogVGhleSBjYW4gZGlzYWdyZWUgaW4gYm90aCBkaXJlY3Rpb25zLCBhbmQgYm90aCBtZWFuIHRoZSBzYW1lIHRoaW5nIOKAlCB0aGVcbiAgICogYC5uZXh0YCBvbiBkaXNrIGNhbWUgZnJvbSBhIGJ1aWxkIHRoYXQgZGlkIG5vdCBzZWUgdGhpcyBgZnVuY3Rpb25Hcm91cHNgIOKAlFxuICAgKiBidXQgdGhlIGNhdXNlcyBkaWZmZXI6IGBza2lwQnVpbGQ6IHRydWVgIHdpdGggYSBidWlsZCBydW4gYnkgaGFuZCwgb3IgYVxuICAgKiBzdGFsZSBgLm5leHRgIGZyb20gYmVmb3JlIHRoZSBwcm9wIGNoYW5nZWQuIEVpdGhlciB3YXkgZXZlcnkgbGF0ZXIgc3ltcHRvbVxuICAgKiAoYSBMYW1iZGEgbWlzc2luZyBhbiBlbnRyeXBvaW50LCBhIENsb3VkRnJvbnQgYmVoYXZpb3IgcG9pbnRpbmcgYXQgYVxuICAgKiBmdW5jdGlvbiB0aGF0IGNhbm5vdCBzZXJ2ZSBpdCkgaXMgdGhpcywgc2V2ZXJhbCBzdGVwcyBkb3duc3RyZWFtLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlRGVwbG95bWVudFJvb3RzKFxuICAgIG1hbmlmZXN0OiBBZGFwdGVyTWFuaWZlc3QsXG4gICk6IE5leHRqc0RlcGxveW1lbnRSb290W10ge1xuICAgIGNvbnN0IHN0YWdlZCA9IG1hbmlmZXN0Lmdyb3VwcztcblxuICAgIC8vIE5hbWVzICphbmQqIHJvdXRlczogbW92aW5nIGAvcmVwb3J0cy8qKmAgaW50byBhbiBleGlzdGluZyBncm91cCBrZWVwcyB0aGVcbiAgICAvLyBuYW1lcyBhbmQgc3RpbGwgbGVhdmVzIHRoYXQgZ3JvdXAncyB6aXAgd2l0aG91dCB0aGUgcmVwb3J0cyBlbnRyeXBvaW50cy5cbiAgICAvLyBPcmRlciBpcyBub3Q6IGFzc2lnbm1lbnQgYW5kIENsb3VkRnJvbnQgYmVoYXZpb3JzIGJvdGggZ28gbW9zdCBzcGVjaWZpY1xuICAgIC8vIGZpcnN0LCBhbmQgbm8gdHdvIGRpc3RpbmN0IHBhdHRlcm5zIHRpZSBvbiBhIFVSTCAoYGZ1bmN0aW9uLWdyb3Vwcy50c2ApLFxuICAgIC8vIHNvIHJlb3JkZXJpbmcgZ3JvdXBzIG9yIHJvdXRlcyBpcyB0aGUgc2FtZSBzcGxpdC5cbiAgICAvLyBBbHJlYWR5IHZhbGlkYXRlZCBpbiB0aGUgY29uc3RydWN0b3IsIHNvIHRoaXMgaXMgYWJzZW50IG9yIG5vbi1lbXB0eS5cbiAgICBjb25zdCB3YW50ZWQgPSB0aGlzLnByb3BzLmZ1bmN0aW9uR3JvdXBzPy5sZW5ndGhcbiAgICAgID8gdG9GdW5jdGlvbkdyb3VwU3BlY3ModGhpcy5wcm9wcy5mdW5jdGlvbkdyb3VwcylcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGdvdCA9IG1hbmlmZXN0LmZ1bmN0aW9uR3JvdXBzO1xuXG4gICAgaWYgKFxuICAgICAgSlNPTi5zdHJpbmdpZnkoc29ydGVkR3JvdXBTcGVjcyh3YW50ZWQpKSAhPT1cbiAgICAgIEpTT04uc3RyaW5naWZ5KHNvcnRlZEdyb3VwU3BlY3MoZ290KSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7TE9HX1BSRUZJWH0gXFxgZnVuY3Rpb25Hcm91cHNcXGAgYXNrcyBmb3IgYCArXG4gICAgICAgICAgYCR7d2FudGVkID8gSlNPTi5zdHJpbmdpZnkod2FudGVkKSA6IFwibm8gc3BsaXR0aW5nXCJ9IGJ1dCB0aGUgYnVpbGQgYCArXG4gICAgICAgICAgYGluICR7dGhpcy5kb3ROZXh0UGF0aH0gd2FzIHNwbGl0IGludG8gYCArXG4gICAgICAgICAgYCR7Z290ID8gSlNPTi5zdHJpbmdpZnkoZ290KSA6IFwiYSBzaW5nbGUgZGVwbG95bWVudCByb290XCJ9LiBgICtcbiAgICAgICAgICBgR3JvdXBzIGFyZSByZXNvbHZlZCBkdXJpbmcgXFxgbmV4dCBidWlsZFxcYCAoY2RrLW5leHRqcyBwYXNzZXMgdGhlbSBpbiBgICtcbiAgICAgICAgICBgdmlhICR7RlVOQ1RJT05fR1JPVVBTX0VOVl9WQVJ9KSwgc28gdGhpcyBtZWFucyB0aGUgYnVpbGQgb3V0cHV0IGlzIGAgK1xuICAgICAgICAgIGBzdGFsZSwgb3IgXFxgc2tpcEJ1aWxkOiB0cnVlXFxgIGFuZCB0aGUgYnVpbGQgd2FzIHJ1biB3aXRob3V0IHRoYXQgYCArXG4gICAgICAgICAgYHZhcmlhYmxlIHNldC5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBuYW1lcyA9IHN0YWdlZCA/IE9iamVjdC5rZXlzKHN0YWdlZCkgOiBbREVGQVVMVF9GVU5DVElPTl9HUk9VUF07XG4gICAgY29uc3Qgcm9vdHMgPSBuYW1lcy5tYXAoKG5hbWUpID0+ICh7XG4gICAgICBuYW1lLFxuICAgICAgcGF0aDogam9pbihcbiAgICAgICAgdGhpcy5kb3ROZXh0UGF0aCxcbiAgICAgICAgQURBUFRFUl9ESVJfTkFNRSxcbiAgICAgICAgLi4uZ3JvdXBTdGFnaW5nRGlyTmFtZShzdGFnZWQgPyBuYW1lIDogdW5kZWZpbmVkKS5zcGxpdChcIi9cIiksXG4gICAgICApLFxuICAgICAgcm91dGVzOiBzdGFnZWQ/LltuYW1lXSA/PyBbXSxcbiAgICB9KSk7XG5cbiAgICAvLyBgZGVmYXVsdGAgZmlyc3QsIHNvIGFueSBcInRoZSByb290XCIgY2FsbGVyIGdldHMgdGhlIGdyb3VwIHRoYXQgb3duc1xuICAgIC8vIGV2ZXJ5dGhpbmcgdW5hc3NpZ25lZC5cbiAgICByb290cy5zb3J0KChhLCBiKSA9PlxuICAgICAgYS5uYW1lID09PSBERUZBVUxUX0ZVTkNUSU9OX0dST1VQXG4gICAgICAgID8gLTFcbiAgICAgICAgOiBiLm5hbWUgPT09IERFRkFVTFRfRlVOQ1RJT05fR1JPVVBcbiAgICAgICAgICA/IDFcbiAgICAgICAgICA6IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSksXG4gICAgKTtcblxuICAgIGZvciAoY29uc3Qgcm9vdCBvZiByb290cykge1xuICAgICAgaWYgKCFleGlzdHNTeW5jKHJvb3QucGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGAke0xPR19QUkVGSVh9IFRoZSBkZXBsb3ltZW50IHJvb3QgZm9yIGZ1bmN0aW9uIGdyb3VwIGAgK1xuICAgICAgICAgICAgYFwiJHtyb290Lm5hbWV9XCIgaXMgbWlzc2luZyBmcm9tICR7cm9vdC5wYXRofSwgdGhvdWdoIHRoZSBhZGFwdGVyIGAgK1xuICAgICAgICAgICAgYG1hbmlmZXN0IGxpc3RzIGl0LiBUaGUgXFxgLm5leHRcXGAgZGlyZWN0b3J5IGhhcyBiZWVuIG1vZGlmaWVkIHNpbmNlIGAgK1xuICAgICAgICAgICAgYFxcYG5leHQgYnVpbGRcXGAgcmFuLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb290cztcbiAgfVxuXG4gIC8qKlxuICAgKiBgbmV4dCBidWlsZGAgdHJhY2VzIG5hdGl2ZSBhZGRvbnMgZnJvbSB0aGUgbWFjaGluZSBpdCBydW5zIG9uLCBhbmQgb25seVxuICAgKiBgc2hhcnBgIGlzIHN3YXBwZWQgZm9yIHRoZSB0YXJnZXQuIEFueXRoaW5nIGVsc2UgYnVpbHQgZm9yIGFub3RoZXIgcGxhdGZvcm1cbiAgICogZmFpbHMgd2l0aCBNT0RVTEVfTk9UX0ZPVU5EIG9yIEVSUl9ETE9QRU5fRkFJTEVEIG9uIHRoZSBmaXJzdCByZXF1ZXN0IHRoYXRcbiAgICogbG9hZHMgaXQsIHNvIHNheSB3aGljaCBwYWNrYWdlIGF0IHN5bnRoLiBBIHdhcm5pbmcsIG5vdCBhbiBlcnJvcjogc29tZVxuICAgKiBhZGRvbnMgYXJlIG9wdGlvbmFsIChgd3NgJ3MgYGJ1ZmZlcnV0aWxgLCBgZnNldmVudHNgKSBhbmQgZmFsbCBiYWNrIHRvIEpTLlxuICAgKlxuICAgKiBPbmx5IHRoZSBPUyBhbmQgQ1BVIGFyZSBjaGVja2VkOiBnbGliYyBhbmQgbXVzbCBidWlsZHMgc2hhcmUgYSBoZWFkZXIuXG4gICAqL1xuICBwcml2YXRlIHdhcm5PbkZvcmVpZ25OYXRpdmVCaW5hcmllcyhcbiAgICByb290OiBOZXh0anNEZXBsb3ltZW50Um9vdCxcbiAgICB0YXJnZXQ6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZm9yZWlnbiA9IGZpbmRGb3JlaWduTmF0aXZlUGFja2FnZXMocm9vdC5wYXRoLCB0YXJnZXQpO1xuICAgIGlmICghZm9yZWlnbi5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKFxuICAgICAgXCJjZGstbmV4dGpzOmZvcmVpZ25OYXRpdmVCaW5hcmllc1wiLFxuICAgICAgYCR7TE9HX1BSRUZJWH0gRGVwbG95bWVudCByb290IFwiJHtyb290Lm5hbWV9XCIgaGFzIG5hdGl2ZSBiaW5hcmllcyBgICtcbiAgICAgICAgYGJ1aWx0IGZvciBhIHBsYXRmb3JtIG90aGVyIHRoYW4gJHt0YXJnZXR9LCB3aGljaCBpdCBydW5zIG9uOiBgICtcbiAgICAgICAgYCR7Zm9yZWlnbi5qb2luKFwiLCBcIil9LiBcXGBuZXh0IGJ1aWxkXFxgIHRyYWNlZCB0aGVtIGZyb20gdGhpcyBtYWNoaW5lLCBgICtcbiAgICAgICAgYHNvIHRoZXkgZmFpbCBvbiB0aGUgZmlyc3QgcmVxdWVzdCB0aGF0IGxvYWRzIHRoZW0gdW5sZXNzIHRoZSBwYWNrYWdlIGAgK1xuICAgICAgICBgZmFsbHMgYmFjayB3aXRob3V0IHRoZW0uIEJ1aWxkIG9uICR7dGFyZ2V0fSwgb3IgcmVwbGFjZSBlYWNoIHdpdGggYCArXG4gICAgICAgIGB0aGUgJHt0YXJnZXR9IHZhcmlhbnQgYWZ0ZXIgXFxgbmV4dCBidWlsZFxcYCAoZS5nLiBcXGBucG0gcGFja1xcYCBpdCBpbiBgICtcbiAgICAgICAgYHlvdXIgXFxgYnVpbGRDb21tYW5kXFxgKS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jZGtsYWJzL2Nkay1uZXh0anMvYCArXG4gICAgICAgIGBibG9iL21haW4vZG9jcy9uYXRpdmUtZGVwZW5kZW5jaWVzLWd1aWRlLm1kYCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIExhbWJkYSBlbmZvcmNlcyAyNTAgTUIgdW56aXBwZWQgYXQgQ2xvdWRGb3JtYXRpb24gdGltZSwgd2hpY2ggaXMgbWludXRlc1xuICAgKiBpbnRvIGEgZGVwbG95IGFuZCByZXBvcnRzIG9ubHkgYSBzaXplLiBTcGxpdHRpbmcgZXhpc3RzIHRvIHN0YXkgdW5kZXIgdGhhdFxuICAgKiBjYXAsIHNvIHRoZSBlcnJvciB0aGF0IHRlbGxzIHlvdSB0byBzcGxpdCBmdXJ0aGVyIGhhcyB0byBuYW1lIHRoZSBncm91cCwgaXRzXG4gICAqIHNpemUsIGFuZCB3aGF0IHRvIGRvIOKAlCBhbmQgYXJyaXZlIGF0IHN5bnRoLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3NlcnRVbmRlckxhbWJkYUxpbWl0KHJvb3Q6IE5leHRqc0RlcGxveW1lbnRSb290KTogdm9pZCB7XG4gICAgY29uc3QgYnl0ZXMgPSBzdG9yZWRTaXplKHJvb3QucGF0aCk7XG4gICAgZGVidWcoXG4gICAgICBgJHtMT0dfUFJFRklYfSBEZXBsb3ltZW50IHJvb3QgXCIke3Jvb3QubmFtZX1cIiBpcyAkeyhieXRlcyAvIDFlNikudG9GaXhlZCgxKX0gTUIgdW56aXBwZWRgLFxuICAgICk7XG4gICAgaWYgKGJ5dGVzIDw9IExBTUJEQV9VTlpJUFBFRF9MSU1JVF9CWVRFUykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtYiA9ICh2YWx1ZTogbnVtYmVyKSA9PiBgJHsodmFsdWUgLyAxMDI0IC8gMTAyNCkudG9GaXhlZCgwKX0gTUJgO1xuICAgIGNvbnN0IGlzU3BsaXQgPSB0aGlzLmRlcGxveW1lbnRSb290cy5sZW5ndGggPiAxO1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke0xPR19QUkVGSVh9IEZ1bmN0aW9uIGdyb3VwIFwiJHtyb290Lm5hbWV9XCIgaXMgJHttYihieXRlcyl9IHVuemlwcGVkLCBgICtcbiAgICAgICAgYG92ZXIgTGFtYmRhJ3MgJHttYihMQU1CREFfVU5aSVBQRURfTElNSVRfQllURVMpfSBsaW1pdC4gYCArXG4gICAgICAgIChpc1NwbGl0XG4gICAgICAgICAgPyBgU3BsaXQgaXRzIHJvdXRlcyBmdXJ0aGVyLCBvciBtb3ZlIHNvbWUgb2YgdGhlbSBpbnRvIGFub3RoZXIgZ3JvdXA6IGAgK1xuICAgICAgICAgICAgYHRoZSBjYXAgaXMgcGVyIGZ1bmN0aW9uLCBzbyB0aGUgc2hhcmVkIFxcYG5leHRcXGAgY2xvc3VyZSBldmVyeSBncm91cCBgICtcbiAgICAgICAgICAgIGBkdXBsaWNhdGVzIGNvc3RzIG5vdGhpbmcgYWdhaW5zdCBhbnkgc2luZ2xlIGJ1ZGdldC5gXG4gICAgICAgICAgOiBgVXNlIHRoZSBcXGBmdW5jdGlvbkdyb3Vwc1xcYCBwcm9wIHRvIHBhY2thZ2Ugcm91dGVzIGludG8gc2VwYXJhdGUgYCArXG4gICAgICAgICAgICBgZnVuY3Rpb25zLiBOb3RlIHRoYXQgc3BsaXR0aW5nIG9ubHkgcmVtb3ZlcyByb3V0ZS1sb2NhbCBjb2RlIOKAlCBgICtcbiAgICAgICAgICAgIGBhbnl0aGluZyByZWFjaGFibGUgZnJvbSBhIHNoYXJlZCBsYXlvdXQgb3IgdGhlIFxcYG5leHRcXGAgcnVudGltZSBpcyBgICtcbiAgICAgICAgICAgIGBpbiBldmVyeSBncm91cC5gKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgdGhlIG1hbmlmZXN0IHRoZSBhZGFwdGVyJ3MgYG9uQnVpbGRDb21wbGV0ZWAgd3JvdGUuXG4gICAqXG4gICAqIEl0cyBhYnNlbmNlIG1lYW5zIGBuZXh0IGJ1aWxkYCByYW4gd2l0aG91dCBjZGstbmV4dGpzJ3MgYWRhcHRlciByZWdpc3RlcmVkXG4gICAqIChvciB3aXRoIGEgc3RhbGUgYG5leHQuY29uZmlnYCksIHdoaWNoIGlzIHdvcnRoIHNheWluZyBwbGFpbmx5IGhlcmU6IGV2ZXJ5XG4gICAqIGxhdGVyIGZhaWx1cmUg4oCUIGEgTGFtYmRhIHRoYXQgY2Fubm90IGZpbmQgYG1hbmlmZXN0Lmpzb25gLCBhbiBlbXB0eSBhc3NldCDigJRcbiAgICogaXMgdGhlIHNhbWUgY2F1c2Ugc2V2ZXJhbCBzdGVwcyBkb3duc3RyZWFtLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkQWRhcHRlck1hbmlmZXN0KCk6IEFkYXB0ZXJNYW5pZmVzdCB7XG4gICAgY29uc3QgbWFuaWZlc3RQYXRoID0gam9pbihcbiAgICAgIHRoaXMuZG90TmV4dFBhdGgsXG4gICAgICBBREFQVEVSX0RJUl9OQU1FLFxuICAgICAgTUFOSUZFU1RfRklMRV9OQU1FLFxuICAgICk7XG4gICAgaWYgKCFleGlzdHNTeW5jKG1hbmlmZXN0UGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGNkay1uZXh0anMgYWRhcHRlciBtYW5pZmVzdCBub3QgZm91bmQgYXQgJHttYW5pZmVzdFBhdGh9LiBgICtcbiAgICAgICAgICBgXCIke3RoaXMuYnVpbGRDb21tYW5kfVwiIG11c3QgcnVuIGEgTmV4dC5qcyBidWlsZCB3aXRoIGNkay1uZXh0anMncyBgICtcbiAgICAgICAgICBgYWRhcHRlciByZWdpc3RlcmVkLiBjZGstbmV4dGpzIHNldHMgXFxgTkVYVF9BREFQVEVSX1BBVEhcXGAgb24gdGhlIGAgK1xuICAgICAgICAgIGBidWlsZCBpdCBydW5zIGl0c2VsZiwgc28gdGhpcyB1c3VhbGx5IG1lYW5zIGVpdGhlciB0aGUgYnVpbGQgY29tbWFuZCBgICtcbiAgICAgICAgICBgZG9lcyBub3QgcmVhY2ggXFxgbmV4dCBidWlsZFxcYCAoYSB3cmFwcGVyIHRoYXQgZHJvcHMgdGhlIGVudmlyb25tZW50LCBgICtcbiAgICAgICAgICBgb3IgYSBjYWNoZWQgYnVpbGQgdGhhdCBkaWQgbm90IHJlLXJ1biksIG9yIFxcYHNraXBCdWlsZDogdHJ1ZVxcYCBhbmQgYCArXG4gICAgICAgICAgYHRoZSBidWlsZCBoYXBwZW5lZCBvdXRzaWRlIENESy4gRm9yIHRoZSBsYXR0ZXIsIHNldCBgICtcbiAgICAgICAgICBgXFxgYWRhcHRlclBhdGg6IHJlcXVpcmUucmVzb2x2ZShcImNkay1uZXh0anMvYWRhcHRlclwiKVxcYCBpbiBgICtcbiAgICAgICAgICBgbmV4dC5jb25maWcuIEEgY3VzdG9tIFxcYGRpc3REaXJcXGAgaXMgbm90IHN1cHBvcnRlZCBlaXRoZXI6IGAgK1xuICAgICAgICAgIGBjZGstbmV4dGpzIHJlYWRzIHRoZSBidWlsZCBmcm9tIFxcYC5uZXh0XFxgLmAsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBtYW5pZmVzdDogQWRhcHRlck1hbmlmZXN0ID0gSlNPTi5wYXJzZShcbiAgICAgIHJlYWRGaWxlU3luYyhtYW5pZmVzdFBhdGgsIFwidXRmLThcIiksXG4gICAgKTtcbiAgICBpZiAobWFuaWZlc3QudmVyc2lvbiAhPT0gQURBUFRFUl9NQU5JRkVTVF9WRVJTSU9OKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgY2RrLW5leHRqcyBhZGFwdGVyIG1hbmlmZXN0IGF0ICR7bWFuaWZlc3RQYXRofSBpcyB2ZXJzaW9uIGAgK1xuICAgICAgICAgIGAke21hbmlmZXN0LnZlcnNpb259LCBidXQgdGhpcyB2ZXJzaW9uIG9mIGNkay1uZXh0anMgcmVhZHMgdmVyc2lvbiBgICtcbiAgICAgICAgICBgJHtBREFQVEVSX01BTklGRVNUX1ZFUlNJT059LiBUaGUgYWRhcHRlciB0aGF0IHdyb3RlIGl0IGFuZCB0aGUgYCArXG4gICAgICAgICAgYGNvbnN0cnVjdHMgcmVhZGluZyBpdCBjb21lIGZyb20gdGhlIHNhbWUgcGFja2FnZSwgc28gdGhpcyBtZWFucyB0d28gYCArXG4gICAgICAgICAgYGNkay1uZXh0anMgdmVyc2lvbnMgYXJlIGluc3RhbGxlZCwgb3IgdGhlIGJ1aWxkIG91dHB1dCBpcyBzdGFsZS5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hbmlmZXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgY2RrLW5leHRqcydzIG93biBidW5kbGVkIHJlcXVlc3QtaGFuZGxpbmcgc2hlbGwgYW5kIHRoZSBtYW5pZmVzdCBpbnRvXG4gICAqIGA8ZGVwbG95bWVudFJvb3Q+L2Nkay1uZXh0anMtcnVudGltZS9gLCB3aGljaCBpcyB3aGVyZVxuICAgKiBgZGVwbG95bWVudFJvb3RPZmAvYGRlcGxveWVkTWFuaWZlc3RQYXRoYCBleHBlY3QgdG8gZmluZCB0aGVtLlxuICAgKlxuICAgKiBPbmx5IHRoZSBzaGVsbCB0aGUgZGVwbG95bWVudCB0eXBlIGFjdHVhbGx5IHJ1bnMgaXMgY29waWVkIOKAlCB0aGUgTGFtYmRhXG4gICAqIGhhbmRsZXIgZm9yIEZ1bmN0aW9ucywgdGhlIGBub2RlOmh0dHBgIHNlcnZlciBmb3IgQ29udGFpbmVycyDigJQgc28gbm90aGluZ1xuICAgKiBzaGlwcyB+MS41IE1CIG9mIGRlYWQgY29kZSBhbmQgdGhlIHRyZWUgc2F5cyB3aGljaCB0eXBlIHByb2R1Y2VkIGl0LiBCb3RoXG4gICAqIGFyZSBjb3BpZWQgZnJvbSB0aGlzIHBhY2thZ2UncyBgbGliL2AsIG5leHQgdG8gdGhlIGNvbXBpbGVkIGNvbnN0cnVjdC5cbiAgICpcbiAgICogRXZlcnkgZ3JvdXAgZ2V0cyB0aGUgc2FtZSBzaGVsbCAqYW5kIHRoZSBzYW1lIG1hbmlmZXN0KjogYSBmdW5jdGlvbiBvbmx5XG4gICAqIGtub3dzIHdoaWNoIHJvdXRlcyBpdCBvd25zIHNvIGl0IGNhbiBzYXkgc28gd2hlbiBtaXNyb3V0ZWQsIGFuZCB0aGF0IGNvbWVzXG4gICAqIGZyb20ge0BsaW5rIEZVTkNUSU9OX0dST1VQX0VOVl9WQVJ9LCBub3QgZnJvbSBhIHBlci1ncm91cCBtYW5pZmVzdC5cbiAgICovXG4gIHByaXZhdGUgc3RhZ2VSdW50aW1lKFxuICAgIGRlcGxveW1lbnRSb290OiBzdHJpbmcsXG4gICAgaXNGdW5jdGlvbnM6IGJvb2xlYW4sXG4gICAgcHVibGljT25EaXNrOiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBzaGVsbCA9IGlzRnVuY3Rpb25zID8gXCJsYW1iZGEubWpzXCIgOiBcInNlcnZlci5tanNcIjtcbiAgICBjb25zdCBzb3VyY2UgPSBqb2luKF9fZGlybmFtZSwgXCIuLlwiLCBcInJ1bnRpbWVcIiwgc2hlbGwpO1xuXG4gICAgY29uc3QgcnVudGltZURpciA9IGpvaW4oZGVwbG95bWVudFJvb3QsIFJVTlRJTUVfRElSX05BTUUpO1xuICAgIC8vIFJlbW92ZWQgcmF0aGVyIHRoYW4gbWVyZ2VkOiBhIHN0YWxlIHNoZWxsIGZyb20gdGhlIG90aGVyIGRlcGxveW1lbnQgdHlwZVxuICAgIC8vIHdvdWxkIG90aGVyd2lzZSBzaXQgaW4gdGhlIGFzc2V0IGFuZCBjaGFuZ2UgaXRzIGhhc2ggZm9yIG5vIHJlYXNvbi5cbiAgICBybVN5bmMocnVudGltZURpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIG1rZGlyU3luYyhydW50aW1lRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBjcFN5bmMoc291cmNlLCBqb2luKHJ1bnRpbWVEaXIsIHNoZWxsKSk7XG4gICAgY3BTeW5jKFxuICAgICAgam9pbih0aGlzLmRvdE5leHRQYXRoLCBBREFQVEVSX0RJUl9OQU1FLCBNQU5JRkVTVF9GSUxFX05BTUUpLFxuICAgICAgam9pbihydW50aW1lRGlyLCBNQU5JRkVTVF9GSUxFX05BTUUpLFxuICAgICk7XG4gICAgaWYgKCFwdWJsaWNPbkRpc2spIHtcbiAgICAgIC8vIFRoZSBMYW1iZGEgemlwcyBhbmQgdGhlIEdsb2JhbENvbnRhaW5lcnMgaW1hZ2UgZG9uJ3QgY2FycnkgYHB1YmxpYy9gXG4gICAgICAvLyAoaXRzIGJ5dGVzIGFyZSBpbiBTMyksIHNvIHRoZSBydW50aW1lIGNhbid0IGxpc3QgaXQgYXQgc3RhcnQgdGhlIHdheVxuICAgICAgLy8gdGhlIFJlZ2lvbmFsQ29udGFpbmVycyBpbWFnZSBkb2VzLlxuICAgICAgLy8gTGlzdGVkIGhlcmUsIGFmdGVyIHRoZSBidWlsZCBjb21tYW5kLCBzbyBgcG9zdGJ1aWxkYCBvdXRwdXQgaXMgaW4gaXQ6XG4gICAgICAvLyBhIHJld3JpdGUgb250byBhIGxpc3RlZCBmaWxlIGlzIHRoZW4gc2VydmVkIGZyb20gUzMgcmF0aGVyIHRoYW4gNDA0aW5nLlxuICAgICAgd3JpdGVQdWJsaWNGaWxlTGlzdChcbiAgICAgICAgcnVudGltZURpcixcbiAgICAgICAgam9pbih0aGlzLnByb3BzLmJ1aWxkRGlyZWN0b3J5LCBcInB1YmxpY1wiKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGRlYnVnKFxuICAgICAgYCR7TE9HX1BSRUZJWH0gU3RhZ2VkICR7c2hlbGx9IGFuZCAke01BTklGRVNUX0ZJTEVfTkFNRX0gaW4gJHtydW50aW1lRGlyfWAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBgTkVYVF9BREFQVEVSX1BBVEhgIGZvciB0aGUgYnVpbGQsIHNvIGBhZGFwdGVyUGF0aGAgaW4gYG5leHQuY29uZmlnYCBpc1xuICAgKiBvcHRpb25hbC5cbiAgICpcbiAgICogTmV4dC5qcyByZWFkcyB0aGUgdmFyaWFibGUgYXMgdGhlICpkZWZhdWx0KiB2YWx1ZSBvZiBgYWRhcHRlclBhdGhgXG4gICAqIChgbmV4dC9kaXN0L3NlcnZlci9jb25maWctc2hhcmVkLmpzYCwgYGRlZmF1bHRDb25maWdgKSwgc28gYW4gYXBwIHRoYXQgZG9lc1xuICAgKiBzZXQgYGFkYXB0ZXJQYXRoYCBzdGlsbCB3aW5zIGFuZCBub3RoaW5nIGV4aXN0aW5nIGNoYW5nZXMuXG4gICAqXG4gICAqIFJlc29sdmVkIGZyb20gdGhlIE5leHQuanMgYXBwLCBub3QgZnJvbSBjZGstbmV4dGpzJ3Mgb3duIGBfX2Rpcm5hbWVgIGFuZCBub3RcbiAgICogbGVmdCBhcyBhIGJhcmUgc3BlY2lmaWVyLiBCb3RoIGFsdGVybmF0aXZlcyB3ZXJlIHRyaWVkIGFuZCBib3RoIGFyZSB3cm9uZzpcbiAgICpcbiAgICogLSBjZGstbmV4dGpzJ3Mgb3duIGxvY2F0aW9uIGxvc2VzIGJlY2F1c2UgdGhlIGFkYXB0ZXIgcmVzb2x2ZXMgaXRzIHNpYmxpbmdcbiAgICogICBjYWNoZSBoYW5kbGVyIHJlbGF0aXZlIHRvIHdoZXJldmVyICppdCogd2FzIGxvYWRlZCBmcm9tLiBBbiBhZGFwdGVyIGxvYWRlZFxuICAgKiAgIGZyb20gb3V0c2lkZSB0aGUgYXBwJ3MgdHJlZSBoYW5kcyBOZXh0LmpzIGEgYGNhY2hlSGFuZGxlcmAgb3V0c2lkZVxuICAgKiAgIGB0dXJib3BhY2sucm9vdGAsIHdoaWNoIFR1cmJvcGFjayByZWplY3RzIG91dHJpZ2h0IChcImxlYXZlcyB0aGUgZmlsZXN5c3RlbVxuICAgKiAgIHJvb3RcIikuXG4gICAqIC0gQSBiYXJlIHNwZWNpZmllciBsb3NlcyBiZWNhdXNlIE5leHQuanMgcmVzb2x2ZXMgYGFkYXB0ZXJQYXRoYCBmcm9tIGluc2lkZVxuICAgKiAgIGl0cyBvd24gY29uZmlnIGxvYWRlciwgaS5lLiBmcm9tIGBuZXh0YCdzIHJlYWxwYXRoLiBVbmRlciBwbnBtIHRoYXQgaXMgdGhlXG4gICAqICAgdmlydHVhbCBzdG9yZSAoYG5vZGVfbW9kdWxlcy8ucG5wbS9uZXh0QOKApi9ub2RlX21vZHVsZXMvbmV4dC9gKSwgYW5kIHRoZVxuICAgKiAgIHdhbGsgdXAgZnJvbSB0aGVyZSBuZXZlciByZWFjaGVzIHRoZSBhcHAncyBvd24gYG5vZGVfbW9kdWxlc2AuXG4gICAqXG4gICAqIFVuc2V0IHdoZW4gYGNkay1uZXh0anNgIGlzIG5vdCByZXNvbHZhYmxlIGZyb20gdGhlIGFwcCwgd2hpY2ggaXMgbGVnaXRpbWF0ZTpcbiAgICogdGhlIE5leHQuanMgYXBwIGFuZCB0aGUgQ0RLIGFwcCBjYW4gYmUgc2VwYXJhdGUgcGFja2FnZXMsIGFuZCBvbmx5IHRoZSBDREsgb25lXG4gICAqIG5lY2Vzc2FyaWx5IGRlcGVuZHMgb24gY2RrLW5leHRqcy4ge0BsaW5rIHJlYWRBZGFwdGVyTWFuaWZlc3R9IHJlcG9ydHMgdGhlXG4gICAqIHJlc3VsdGluZyBmYWlsdXJlIGFuZCBuYW1lcyB0aGlzIGNhc2UuXG4gICAqXG4gICAqIE9uZSBzZXR1cCB0aGlzIGNhbm5vdCBzZXJ2ZSwgYW5kIHRoZSByZWFzb24gdGhpcyByZXBvJ3Mgb3duIGV4YW1wbGVzIHN0aWxsIHNldFxuICAgKiBgYWRhcHRlclBhdGhgOiBhIGBsaW5rOmAvYGZpbGU6YCBkZXBlbmRlbmN5IG9uIGEgY2RrLW5leHRqcyBjaGVja291dCAqb3V0c2lkZSpcbiAgICogdGhlIGFwcCdzIHByb2plY3Qgcm9vdC4gVGhlIHN5bWxpbmsgcmVzb2x2ZXMgb3V0IG9mIHRoZSBwcm9qZWN0LCBzbyB0aGVcbiAgICogYGNhY2hlSGFuZGxlcmAgZXNjYXBlIGFib3ZlIGFwcGxpZXMuIFNldCBgYWRhcHRlclBhdGhgIGluIGBuZXh0LmNvbmZpZ2AgdGhlcmVcbiAgICog4oCUIGl0IGlzIHJlc29sdmVkIGJ5IHRoZSBidWlsZCwgYWZ0ZXIgd2hhdGV2ZXIgcHV0IHRoZSBhZGFwdGVyIGluIHBsYWNlLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGFwdGVyUGF0aEVudigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgTkVYVF9BREFQVEVSX1BBVEg6IHJlcXVpcmUucmVzb2x2ZShcImNkay1uZXh0anMvYWRhcHRlclwiLCB7XG4gICAgICAgICAgcGF0aHM6IFt0aGlzLnByb3BzLmJ1aWxkRGlyZWN0b3J5XSxcbiAgICAgICAgfSksXG4gICAgICB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgZGVidWcoXG4gICAgICAgIGAke0xPR19QUkVGSVh9IENvdWxkIG5vdCByZXNvbHZlIFwiY2RrLW5leHRqcy9hZGFwdGVyXCIgZnJvbSBgICtcbiAgICAgICAgICBgJHt0aGlzLnByb3BzLmJ1aWxkRGlyZWN0b3J5fTsgbGVhdmluZyBORVhUX0FEQVBURVJfUEFUSCB1bnNldCwgc28gYCArXG4gICAgICAgICAgYG5leHQuY29uZmlnIG11c3Qgc2V0IFxcYGFkYXB0ZXJQYXRoXFxgLmAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGxvY2FsIGJ1aWxkIGNvbW1hbmQgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnlcbiAgICovXG4gIHByaXZhdGUgcnVuTmV4dEJ1aWxkKCkge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYCR7TE9HX1BSRUZJWH0gUnVubmluZzogXCIke3RoaXMuYnVpbGRDb21tYW5kfVwiIGluIGRpcmVjdG9yeTogJHt0aGlzLnByb3BzLmJ1aWxkRGlyZWN0b3J5fWAsXG4gICAgKTtcblxuICAgIC8vIENsZWFuIGV4aXN0aW5nIGNhY2hlIGRpcmVjdG9yeSB0byBhdm9pZCBzdGFsZSBkYXRhIGZyb20gcHJldmlvdXMgYnVpbGRzXG4gICAgaWYgKGV4aXN0c1N5bmModGhpcy5pbml0Q2FjaGVEaXIpKSB7XG4gICAgICBybVN5bmModGhpcy5pbml0Q2FjaGVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIGRlYnVnKGBDbGVhbmVkIGV4aXN0aW5nIGNhY2hlIGRpcmVjdG9yeTogJHt0aGlzLmluaXRDYWNoZURpcn1gKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgZXhlY1N5bmModGhpcy5idWlsZENvbW1hbmQsIHtcbiAgICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgICAgICBjd2Q6IHRoaXMucHJvcHMuYnVpbGREaXJlY3RvcnksXG4gICAgICAgIGVudjoge1xuICAgICAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgICAgIENES19ORVhUSlNfSU5JVF9DQUNIRV9ESVI6IHRoaXMuaW5pdENhY2hlRGlyLFxuICAgICAgICAgIC4uLnRoaXMuYWRhcHRlclBhdGhFbnYoKSxcbiAgICAgICAgICAvLyBgb25CdWlsZENvbXBsZXRlYCBydW5zIGluc2lkZSB0aGlzIHByb2Nlc3MgYW5kIGNhbm5vdCByZWFkIENES1xuICAgICAgICAgIC8vIHByb3BzLCBzbyB0aGUgcmVzb2x2ZWQgZ3JvdXBzIHRyYXZlbCBhcyBKU09OLiBBYnNlbnQgd2hlbiBub3RcbiAgICAgICAgICAvLyBzcGxpdHRpbmcsIHdoaWNoIHRoZSBhZGFwdGVyIHJlYWRzIGFzIFwib25lIGRlcGxveW1lbnQgcm9vdFwiLlxuICAgICAgICAgIC4uLih0aGlzLnByb3BzLmZ1bmN0aW9uR3JvdXBzPy5sZW5ndGhcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIFtGVU5DVElPTl9HUk9VUFNfRU5WX1ZBUl06IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgICAgdG9GdW5jdGlvbkdyb3VwU3BlY3ModGhpcy5wcm9wcy5mdW5jdGlvbkdyb3VwcyksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMb2NhbCBidWlsZCBmYWlsZWQ6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZXBlbmQgYHBhdGNoLWZldGNoLmpzYCB0byB0aGUgY2xpZW50IGVudHJ5cG9pbnQgY2h1bmtzLCBmb3JcbiAgICogYE5leHRqc0dsb2JhbEZ1bmN0aW9uc2Agb25seS5cbiAgICpcbiAgICogVGhpcyBpcyB3aGF0IG1ha2VzIFBPU1Qgd29yayBhdCBhbGwgb24gdGhhdCB0eXBlLiBDbG91ZEZyb250IHJlYWNoZXMgdGhlXG4gICAqIHNlcnZlciB0aHJvdWdoIGEgTGFtYmRhIEZ1bmN0aW9uIFVSTCB3aXRoIGBBdXRoVHlwZTogQVdTX0lBTWAsIHNpZ25lZCBieSBhblxuICAgKiBvcmlnaW4gYWNjZXNzIGNvbnRyb2wsIGFuZCBBV1MgZG9jdW1lbnRzIHRoZSBjb25zZXF1ZW5jZTogXCJJZiB5b3UgdXNlIFBVVCBvclxuICAgKiBQT1NUIG1ldGhvZHMgd2l0aCB5b3VyIExhbWJkYSBmdW5jdGlvbiBVUkwsIHlvdXIgdXNlcnMgbXVzdCBjb21wdXRlIHRoZVxuICAgKiBTSEEyNTYgb2YgdGhlIGJvZHkgYW5kIGluY2x1ZGUgdGhlIHBheWxvYWQgaGFzaCB2YWx1ZSBvZiB0aGUgcmVxdWVzdCBib2R5IGluXG4gICAqIHRoZSBgeC1hbXotY29udGVudC1zaGEyNTZgIGhlYWRlciB3aGVuIHNlbmRpbmcgdGhlIHJlcXVlc3QgdG8gQ2xvdWRGcm9udC5cbiAgICogTGFtYmRhIGRvZXNuJ3Qgc3VwcG9ydCB1bnNpZ25lZCBwYXlsb2Fkcy5cIlxuICAgKlxuICAgKiBDbG91ZEZyb250IHNpZ25zIEdFVHMgaXRzZWxmIChlbXB0eS1ib2R5IGhhc2gpIGJ1dCB3aWxsIG5vdCBoYXNoIGEgYm9keSwgYW5kXG4gICAqIGEgYnJvd3NlciBoYXMgbm8gd2F5IHRvIGFkZCB0aGF0IGhlYWRlciBvbiBpdHMgb3duLCBzbyBhbiB1bnBhdGNoZWQgYXBwXG4gICAqIGFuc3dlcnMgZXZlcnkgc2VydmVyIGFjdGlvbiwgZm9ybSBzdWJtaXNzaW9uIGFuZCBQT1NUIHJvdXRlIGhhbmRsZXIgd2l0aFxuICAgKiBgNDAzIEludmFsaWRTaWduYXR1cmVFeGNlcHRpb25gIGJlZm9yZSB0aGUgcmVxdWVzdCByZWFjaGVzIE5leHQuanMuIFRoZVxuICAgKiBwYXRjaCBpbnN0YWxscyBgZmV0Y2hgL2BYTUxIdHRwUmVxdWVzdGAgd3JhcHBlcnMgdGhhdCBjb21wdXRlIHRoZSBoYXNoLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9wcml2YXRlLWNvbnRlbnQtcmVzdHJpY3RpbmctYWNjZXNzLXRvLWxhbWJkYS5odG1sXG4gICAqL1xuICBwcml2YXRlIHBhdGNoRmV0Y2hJbkNsaWVudEpzKCkge1xuICAgIGNvbnN0IHN0YXRpY0NodW5rc1BhdGggPSBqb2luKHRoaXMuZG90TmV4dFBhdGgsIFwic3RhdGljXCIsIFwiY2h1bmtzXCIpO1xuICAgIGNvbnN0IGNodW5rRmlsZXMgPSByZWFkZGlyU3luYyhzdGF0aWNDaHVua3NQYXRoKS5maWx0ZXIoXG4gICAgICAoZmlsZTogc3RyaW5nKSA9PlxuICAgICAgICAvLyBtYWluLWFwcC0gZm9yIHdlYnBhY2ssIHR1cmJvcGFjay0gZm9yIHR1cmJvXG4gICAgICAgIGZpbGUuc3RhcnRzV2l0aChcIm1haW4tYXBwLVwiKSB8fFxuICAgICAgICAoZmlsZS5zdGFydHNXaXRoKFwidHVyYm9wYWNrLVwiKSAmJiBmaWxlLmVuZHNXaXRoKFwiLmpzXCIpKSxcbiAgICApO1xuXG4gICAgaWYgKGNodW5rRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjbGllbnQgc2lkZSBqcyBlbnRyeXBvaW50IGZpbGVzIGZvdW5kXCIpO1xuICAgIH1cblxuICAgIC8vIFJlYWQgdGhlIHBhdGNoLWZldGNoLmpzIGNvbnRlbnRcbiAgICBjb25zdCBwYXRjaEZldGNoUGF0aCA9IGpvaW4oX19kaXJuYW1lLCBcInBhdGNoLWZldGNoLmpzXCIpO1xuICAgIGNvbnN0IHBhdGNoRmV0Y2hDb250ZW50ID0gcmVhZEZpbGVTeW5jKHBhdGNoRmV0Y2hQYXRoLCBcInV0Zi04XCIpO1xuXG4gICAgLy8gUHJlcGVuZCBwYXRjaC1mZXRjaCBsb2dpYyB0byBlYWNoIGVudHJ5cG9pbnQsIG9uY2UuIE5vdyB0aGF0IHRoaXMgcnVuc1xuICAgIC8vIG91dHNpZGUgYHJ1bk5leHRCdWlsZGAsIHRoZSBzYW1lIGAubmV4dGAgY2FuIGJlIHN5bnRoZXNpemVkIG1vcmUgdGhhblxuICAgIC8vIG9uY2UgKGBza2lwQnVpbGQ6IHRydWVgLCBgY2RrIHN5bnRoYCB0aGVuIGBjZGsgZGVwbG95YCwgYSByZXRyaWVkXG4gICAgLy8gZGVwbG95KSwgYW5kIHByZXBlbmRpbmcgdHdpY2Ugd291bGQgcmUtd3JhcCB0aGUgd3JhcHBlcnMuXG4gICAgZm9yIChjb25zdCBjaHVua0ZpbGUgb2YgY2h1bmtGaWxlcykge1xuICAgICAgY29uc3QgY2h1bmtGaWxlUGF0aCA9IGpvaW4oc3RhdGljQ2h1bmtzUGF0aCwgY2h1bmtGaWxlKTtcbiAgICAgIGNvbnN0IHBhdGNoZWRDb250ZW50ID0gcGF0Y2hDbGllbnRDaHVuayhcbiAgICAgICAgcmVhZEZpbGVTeW5jKGNodW5rRmlsZVBhdGgsIFwidXRmLThcIiksXG4gICAgICAgIHBhdGNoRmV0Y2hDb250ZW50LFxuICAgICAgICBjaHVua0ZpbGVQYXRoLFxuICAgICAgKTtcbiAgICAgIGlmIChwYXRjaGVkQ29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlYnVnKGAke0xPR19QUkVGSVh9IEFscmVhZHkgcGF0Y2hlZCwgc2tpcHBpbmc6ICR7Y2h1bmtGaWxlUGF0aH1gKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB3cml0ZUZpbGVTeW5jKGNodW5rRmlsZVBhdGgsIHBhdGNoZWRDb250ZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHB1YmxpYyBkaXJlY3RvcnkgZW50cmllcyBmcm9tIGxvY2FsIGZpbGVzeXN0ZW1cbiAgICovXG4gIHByaXZhdGUgZ2V0TG9jYWxQdWJsaWNEaXJFbnRyaWVzKCk6IFB1YmxpY0RpckVudHJ5W10ge1xuICAgIGNvbnN0IHB1YmxpY0RpclBhdGggPSBqb2luKHRoaXMucHJvcHMuYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIpO1xuICAgIGlmICghZXhpc3RzU3luYyhwdWJsaWNEaXJQYXRoKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiByZWFkZGlyU3luYyhwdWJsaWNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkubWFwKChlbnRyeSkgPT4gKHtcbiAgICAgIG5hbWU6IGVudHJ5Lm5hbWUsXG4gICAgICBpc0RpcmVjdG9yeTogZW50cnkuaXNEaXJlY3RvcnkoKSxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogU3RyaXAgd2hhdGV2ZXIgcGxhdGZvcm0tc3BlY2lmaWMgU2hhcnAgYmluYXJpZXMgYG5leHQgYnVpbGRgJ3Mgb3V0cHV0IGZpbGVcbiAgICogdHJhY2luZyBzdGFnZWQsIHNpbmNlIHRoZXkncmUgdGhlIGhvc3QncyAoZS5nLiBtYWNPUy9nbGliYykgcmF0aGVyIHRoYW4gdGhlXG4gICAqIGRlcGxveW1lbnQgdGFyZ2V0J3MsIHRoZW4gaW5zdGFsbCB0aGUgdGFyZ2V0J3MuIFNraXBwaW5nIHRoaXMgaXMgc2lsZW50OlxuICAgKiBgaW1hZ2VPcHRpbWl6ZXJgIGNhdGNoZXMgdGhlIGxvYWQgZmFpbHVyZSBpbnRlcm5hbGx5IGFuZCByZXR1cm5zIHRoZVxuICAgKiB1bm9wdGltaXplZCBvcmlnaW5hbCB3aXRoIGFuIEhUVFAgMjAwLlxuICAgKlxuICAgKiBPbmx5IGEgcm9vdCB3aXRoIGBzaGFycGAgc3RhZ2VkIGdldHMgdGhlIGJpbmFyaWVzOiB0aGUgaW1hZ2Ugb3B0aW1pemVyXG4gICAqIGJyaW5ncyBpdCBpbnRvIGBkZWZhdWx0YCwgd2hpY2ggc2VydmVzIGV2ZXJ5IGAvX25leHQvaW1hZ2VgLCBhbmQgYW5vdGhlclxuICAgKiBncm91cCBoYXMgaXQgb25seSBpZiBpdHMgb3duIHJvdXRlcyB1c2UgaXQuIFNvIG9ubHkgYGRlZmF1bHRgIHdhcm5zIHdoZW5cbiAgICogaXQncyBtaXNzaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGFnZVNoYXJwRm9yVGFyZ2V0KFxuICAgIHJvb3Q6IE5leHRqc0RlcGxveW1lbnRSb290LFxuICAgIHByb2plY3REaXI6IHN0cmluZyxcbiAgICBwbGF0Zm9ybTogc3RyaW5nLFxuICApIHtcbiAgICBjb25zdCBzaGFycFNvdXJjZSA9IHRoaXMucmVtb3ZlRXhpc3RpbmdTaGFycEJpbmFyaWVzKHJvb3QucGF0aCwgcHJvamVjdERpcik7XG4gICAgaWYgKCFzaGFycFNvdXJjZSkge1xuICAgICAgaWYgKHJvb3QubmFtZSA9PT0gREVGQVVMVF9GVU5DVElPTl9HUk9VUCkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYCR7TE9HX1BSRUZJWH0gXCJzaGFycFwiIG5vdCBmb3VuZCBpbiB0aGUgc3RhZ2VkIGJ1aWxkIG91dHB1dC4gQWRkIFwic2hhcnBcIiBhcyBhIGRlcGVuZGVuY3kgb2YgeW91ciBOZXh0LmpzIGFwcCB0byBlbmFibGUgaW1hZ2Ugb3B0aW1pemF0aW9uLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaW5zdGFsbFNoYXJwUGFja2FnZXMoXG4gICAgICBzaGFycEJpbmFyeURpcihyb290LnBhdGgpLFxuICAgICAgdGhpcy5nZXRTaGFycEJpbmFyeVBhY2thZ2VzKHNoYXJwU291cmNlLCBwbGF0Zm9ybSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWN1cnNpdmVseSBmaW5kIGFuZCByZW1vdmUgZXhpc3RpbmcgU2hhcnAgcGxhdGZvcm0gYmluYXJpZXMuXG4gICAqXG4gICAqIGByb290YCBpcyB3YWxrZWQgd2hvbGUgcmF0aGVyIHRoYW4ganVzdCBpdHMgYG5vZGVfbW9kdWxlc2A6IHRoZSBzdGFnZWQgdHJlZVxuICAgKiBpcyBrZXllZCBieSByZXBvLXJvb3QtcmVsYXRpdmUgcGF0aCwgc28gaW4gYSBtb25vcmVwbyB0aGUgYG5vZGVfbW9kdWxlc2BcbiAgICogaG9sZGluZyBgc2hhcnBgIGlzIHNldmVyYWwgZGlyZWN0b3JpZXMgZG93bi4ge0BsaW5rIGlzU2hhcnBCaW5hcnlQYWNrYWdlfSBpc1xuICAgKiB3aGF0IGtlZXBzIHRoYXQgZnJvbSByZWFjaGluZyB0aGUgYXBwJ3Mgb3duIG91dHB1dCDigJQgdGhlIHN0YWdlZCByb290IGhvbGRzXG4gICAqIHRoZSBjb21waWxlZCBgLm5leHRgIGFzIHdlbGwgYXMgdGhlIGRlcGVuZGVuY2llcy5cbiAgICpcbiAgICogQHBhcmFtIHByb2plY3REaXIgdGhlIGFwcCdzIGRpcmVjdG9yeSBpbnNpZGUgYHJvb3RgLCB3aGljaCBgbmV4dGAgaXNcbiAgICogcmVzb2x2ZWQgZnJvbS5cbiAgICogQHJldHVybnMgdGhlIHN0YWdlZCBgc2hhcnBgIEpTIHdyYXBwZXIgdG8gaW5zdGFsbCBuZXh0IHRvLCBmb3VuZCBpbiB0aGUgc2FtZVxuICAgKiB3YWxrOiBhIHJvb3QgY2FuIGJlIGh1bmRyZWRzIG9mIG1lZ2FieXRlcywgYW5kIGVhY2ggZ3JvdXAgaGFzIG9uZS5cbiAgICovXG4gIHByaXZhdGUgcmVtb3ZlRXhpc3RpbmdTaGFycEJpbmFyaWVzKFxuICAgIHJvb3Q6IHN0cmluZyxcbiAgICBwcm9qZWN0RGlyOiBzdHJpbmcsXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc2hhcnBDYW5kaWRhdGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gTGlua3MgYXJlIGxpc3RlZCwgbm90IGZvbGxvd2VkOiBldmVyeSBsaW5rIGluIGEgc3RhZ2VkIHJvb3QgcG9pbnRzXG4gICAgLy8gaW5zaWRlIGl0IChgc3RhZ2VGaWxlc2AgY29waWVzIHRoZSBvbmVzIHRoYXQgZG9uJ3QpLCBzbyBpdHMgdGFyZ2V0IGlzXG4gICAgLy8gd2Fsa2VkIGF0IGl0cyBvd24gcGF0aCBhbnl3YXksIGFuZCBmb2xsb3dpbmcgdGhlbSBpcyB3aGF0IGxldCBhXG4gICAgLy8gd29ya3NwYWNlIGN5Y2xlIGhhbmcgdGhlIHN5bnRoLlxuICAgIGNvbnN0IGFsbEVudHJpZXMgPSBsaXN0VHJlZShyb290KTtcblxuICAgIC8vIFN5bWxpbmtzIGFyZSB1bmxpbmtlZCwgbm90IGBybVN5bmNgZWQsIGFuZCB0aGV5IGdvIGZpcnN0LiBwbnBtIHBvaW50c1xuICAgIC8vIHNldmVyYWwgbGlua3MgYXQgb25lIHN0b3JlIGRpcmVjdG9yeSwgYW5kIGBybVN5bmMo4oCmLCB7IHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAvLyBmb3JjZTogdHJ1ZSB9KWAgKnNpbGVudGx5IG5vLW9wcyogb24gYSBzeW1saW5rIHdob3NlIHRhcmdldCBpcyBhbHJlYWR5XG4gICAgLy8gZ29uZSDigJQgYGZvcmNlYCBzd2FsbG93cyB0aGUgRU5PRU5UIGl0cyBgcm1kaXJgIGdldHMuIFJlbW92aW5nIGEgc3RvcmVcbiAgICAvLyBkaXJlY3RvcnkgYmVmb3JlIGl0cyBsaW5rcyB0aGVyZWZvcmUgbGVmdCBkYW5nbGluZ1xuICAgIC8vIGBAaW1nL3NoYXJwLWRhcndpbi1hcm02NGAgZW50cmllcyBpbiB0aGUgYXNzZXQsIHdoaWNoIGlzIGEgbGF0ZW50IEVOT0VOVFxuICAgIC8vIGluIHdoYXRldmVyIG5leHQgZm9sbG93cyB0aGVtIChgc2hhcnBgIGRvZXMsIHdoZW4gaXQgbG9va3MgZm9yIGJpbmFyaWVzKS5cbiAgICBjb25zdCBzeW1saW5rczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBkaXJlY3Rvcmllczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgYWxsRW50cmllcykge1xuICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkgJiYgZW50cnkubmFtZSA9PT0gXCJzaGFycFwiKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBqb2luKGVudHJ5LnBhcmVudFBhdGgsIGVudHJ5Lm5hbWUpO1xuICAgICAgICBpZiAoZXhpc3RzU3luYyhqb2luKHBhdGgsIFwicGFja2FnZS5qc29uXCIpKSkge1xuICAgICAgICAgIHNoYXJwQ2FuZGlkYXRlcy5wdXNoKHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFpc1NoYXJwQmluYXJ5UGFja2FnZShlbnRyeS5wYXJlbnRQYXRoLCBlbnRyeS5uYW1lKSkgY29udGludWU7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IGpvaW4oZW50cnkucGFyZW50UGF0aCwgZW50cnkubmFtZSk7XG4gICAgICBpZiAoZW50cnkuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgICBzeW1saW5rcy5wdXNoKGZ1bGxQYXRoKTtcbiAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBkaXJlY3Rvcmllcy5wdXNoKGZ1bGxQYXRoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkZWJ1ZyhcbiAgICAgIGAke0xPR19QUkVGSVh9IFJlbW92aW5nICR7c3ltbGlua3MubGVuZ3RofSBTaGFycCBiaW5hcnkgc3ltbGlua3MgYW5kICR7ZGlyZWN0b3JpZXMubGVuZ3RofSBkaXJlY3Rvcmllc2AsXG4gICAgKTtcblxuICAgIGZvciAoY29uc3QgcGF0aCBvZiBzeW1saW5rcykge1xuICAgICAgdW5saW5rU3luYyhwYXRoKTtcbiAgICAgIGRlYnVnKGAke0xPR19QUkVGSVh9IFVubGlua2VkOiAke3BhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcGF0aCBvZiBkaXJlY3Rvcmllcykge1xuICAgICAgcm1TeW5jKHBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIGRlYnVnKGAke0xPR19QUkVGSVh9IFJlbW92ZWQ6ICR7cGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBpY2tTdGFnZWRTaGFycFBhY2thZ2UoXG4gICAgICBzaGFycENhbmRpZGF0ZXMsXG4gICAgICByZXNvbHZlTmV4dFNoYXJwKHByb2plY3REaXIpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgYEBpbWcvc2hhcnAtPHBsYXRmb3JtPmAgYW5kIGBAaW1nL3NoYXJwLWxpYnZpcHMtPHBsYXRmb3JtPmBcbiAgICogdmVyc2lvbnMgdG8gaW5zdGFsbCBmb3IgYSBnaXZlbiBwbGF0Zm9ybS5cbiAgICpcbiAgICogVGhlc2UgbXVzdCBtYXRjaCB0aGUgYHNoYXJwYCBKUyB3cmFwcGVyIHRoYXQgb3V0cHV0IGZpbGUgdHJhY2luZyBzdGFnZWQ6XG4gICAqIGBzaGFycGAncyBgbGliL2xpYnZpcHMuanNgIGNvbXBhcmVzIHRoZSBiaW5hcnknc1xuICAgKiByZXBvcnRlZCBsaWJ2aXBzIHZlcnNpb24gYWdhaW5zdCBpdHMgb3duIGBtaW5pbXVtTGlidmlwc1ZlcnNpb25gIGFuZFxuICAgKiB0aHJvd3MgYXQgbG9hZCB3aGVuIHRoZXkgZGlzYWdyZWUuIGBzaGFycGAgcGlucyBib3RoIGluIGl0c1xuICAgKiBgb3B0aW9uYWxEZXBlbmRlbmNpZXNgLCBzbyB0aGF0IG1hbmlmZXN0IGlzIHRoZSBhdXRob3JpdGF0aXZlIHNvdXJjZS5cbiAgICovXG4gIHByaXZhdGUgZ2V0U2hhcnBCaW5hcnlQYWNrYWdlcyhcbiAgICBzaGFycFNvdXJjZTogc3RyaW5nLFxuICAgIHBsYXRmb3JtOiBzdHJpbmcsXG4gICk6IHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfVtdIHtcbiAgICAvLyBPbmx5IGZvciBhIGJpbmFyeSB0aGUgc3RhZ2VkIGBzaGFycGAgZG9lcyBub3QgcGluLlxuICAgIGNvbnN0IGZhbGxiYWNrID0gW1xuICAgICAgeyBuYW1lOiBgc2hhcnAtbGlidmlwcy0ke3BsYXRmb3JtfWAsIHZlcnNpb246IFwiMS4yLjRcIiB9LFxuICAgICAgeyBuYW1lOiBgc2hhcnAtJHtwbGF0Zm9ybX1gLCB2ZXJzaW9uOiBcIjAuMzQuNVwiIH0sXG4gICAgXTtcblxuICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShcbiAgICAgIHJlYWRGaWxlU3luYyhqb2luKHNoYXJwU291cmNlLCBcInBhY2thZ2UuanNvblwiKSwgXCJ1dGYtOFwiKSxcbiAgICApO1xuICAgIGNvbnN0IG9wdGlvbmFsRGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID1cbiAgICAgIG1hbmlmZXN0Lm9wdGlvbmFsRGVwZW5kZW5jaWVzID8/IHt9O1xuXG4gICAgcmV0dXJuIGZhbGxiYWNrLm1hcCgocGtnKSA9PiB7XG4gICAgICBjb25zdCB2ZXJzaW9uID0gb3B0aW9uYWxEZXBlbmRlbmNpZXNbYEBpbWcvJHtwa2cubmFtZX1gXTtcbiAgICAgIGlmICghdmVyc2lvbikge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYCR7TE9HX1BSRUZJWH0gc2hhcnBAJHttYW5pZmVzdC52ZXJzaW9ufSBkb2VzIG5vdCBwaW4gXCJAaW1nLyR7cGtnLm5hbWV9XCI7IGZhbGxpbmcgYmFjayB0byAke3BrZy52ZXJzaW9ufS5gLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcGtnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgbmFtZTogcGtnLm5hbWUsIHZlcnNpb24gfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEb3dubG9hZCAod2l0aCBjYWNoaW5nKSBhbmQgZXh0cmFjdCBTaGFycCdzIHBsYXRmb3JtLXNwZWNpZmljIGJpbmFyeVxuICAgKiBwYWNrYWdlcyBpbnRvIGBpbWdQYXRoYC5cbiAgICovXG4gIHByaXZhdGUgaW5zdGFsbFNoYXJwUGFja2FnZXMoXG4gICAgaW1nUGF0aDogc3RyaW5nLFxuICAgIHBhY2thZ2VzOiB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH1bXSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgY2FjaGVEaXIgPSBqb2luKHRtcGRpcigpLCBcImNkay1uZXh0anMtc2hhcnAtY2FjaGVcIik7XG4gICAgbWtkaXJTeW5jKGNhY2hlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGZvciAoY29uc3QgcGtnIG9mIHBhY2thZ2VzKSB7XG4gICAgICBjb25zdCB0YXJnZXREaXIgPSBqb2luKGltZ1BhdGgsIHBrZy5uYW1lKTtcbiAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AaW1nLyR7cGtnLm5hbWV9Ly0vJHtwa2cubmFtZX0tJHtwa2cudmVyc2lvbn0udGd6YDtcblxuICAgICAgLy8gQ3JlYXRlIGEgY29uc2lzdGVudCBmaWxlbmFtZSBiYXNlZCBvbiBwYWNrYWdlIG5hbWUgYW5kIHZlcnNpb25cbiAgICAgIGNvbnN0IGNhY2hlRmlsZU5hbWUgPSBgJHtwa2cubmFtZX0tJHtwa2cudmVyc2lvbn0udGd6YDtcbiAgICAgIGNvbnN0IGNhY2hlZEZpbGUgPSBqb2luKGNhY2hlRGlyLCBjYWNoZUZpbGVOYW1lKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGEgdmFsaWQgcGFja2FnZSBjYWNoZWQ7IHJlLWRvd25sb2FkIGlmXG4gICAgICAvLyBhIHByZXZpb3VzIHJ1biBsZWZ0IGJlaGluZCBhIHRydW5jYXRlZC9jb3JydXB0IGRvd25sb2FkXG4gICAgICBpZiAoZXhpc3RzU3luYyhjYWNoZWRGaWxlKSAmJiB0aGlzLmlzQ2FjaGVkRmlsZVZhbGlkKGNhY2hlZEZpbGUpKSB7XG4gICAgICAgIGRlYnVnKFxuICAgICAgICAgIGAke0xPR19QUkVGSVh9IFVzaW5nIGNhY2hlZCAke3BrZy5uYW1lfUAke3BrZy52ZXJzaW9ufSBmcm9tICR7Y2FjaGVkRmlsZX1gLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVidWcoYCR7TE9HX1BSRUZJWH0gRG93bmxvYWRpbmcgJHtwa2cubmFtZX1AJHtwa2cudmVyc2lvbn0uLi5gKTtcblxuICAgICAgICAvLyBEb3dubG9hZCB0byBhIHByb2Nlc3MtdW5pcXVlIHRlbXAgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnksXG4gICAgICAgIC8vIHRoZW4gYXRvbWljYWxseSByZW5hbWUgaXQgb250byB0aGUgc2hhcmVkIGNhY2hlIHBhdGguIENvbmN1cnJlbnRcbiAgICAgICAgLy8gc3ludGggcHJvY2Vzc2VzIChlLmcuIFR1cmJvcmVwbyBydW5uaW5nIG11bHRpcGxlIGBjZGtgIGNvbW1hbmRzKVxuICAgICAgICAvLyBzaGFyZSB0aGlzIGNhY2hlIGRpciwgc28gd3JpdGluZyBkaXJlY3RseSB0byBgY2FjaGVkRmlsZWAgcmlza3NcbiAgICAgICAgLy8gYW5vdGhlciBwcm9jZXNzIGV4dHJhY3RpbmcgYSBoYWxmLXdyaXR0ZW4gZmlsZS4gUmVuYW1pbmcgd2l0aGluXG4gICAgICAgIC8vIHRoZSBzYW1lIGZpbGVzeXN0ZW0gaXMgYXRvbWljLCBzbyByZWFkZXJzIG9ubHkgZXZlciBzZWUgYVxuICAgICAgICAvLyBjb21wbGV0ZSBmaWxlLCB3aGljaGV2ZXIgcHJvY2VzcyB3aW5zIHRoZSByYWNlLlxuICAgICAgICBjb25zdCB0ZW1wRmlsZSA9IGpvaW4oXG4gICAgICAgICAgY2FjaGVEaXIsXG4gICAgICAgICAgYCR7Y2FjaGVGaWxlTmFtZX0uJHtwcm9jZXNzLnBpZH0tJHtyYW5kb21CeXRlcyg2KS50b1N0cmluZyhcImhleFwiKX0udG1wYCxcbiAgICAgICAgKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyAtLWZhaWwgbWFrZXMgY3VybCBleGl0IG5vbi16ZXJvIG9uIEhUVFAgZXJyb3JzIGFuZCAtLXJldHJ5XG4gICAgICAgICAgLy8gaGFuZGxlcyB0cmFuc2llbnQgY29ubmVjdGlvbiBkcm9wcyBzbyBhIHBhcnRpYWwgdHJhbnNmZXJcbiAgICAgICAgICAvLyBpc24ndCBjYWNoZWQgYXMgdmFsaWQuXG4gICAgICAgICAgZXhlY0ZpbGVTeW5jKFxuICAgICAgICAgICAgXCJjdXJsXCIsXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIFwiLUxcIixcbiAgICAgICAgICAgICAgXCItLWZhaWxcIixcbiAgICAgICAgICAgICAgXCItLXJldHJ5XCIsXG4gICAgICAgICAgICAgIFwiM1wiLFxuICAgICAgICAgICAgICBcIi0tcmV0cnktZGVsYXlcIixcbiAgICAgICAgICAgICAgXCIxXCIsXG4gICAgICAgICAgICAgIFwiLW9cIixcbiAgICAgICAgICAgICAgdGVtcEZpbGUsXG4gICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IHN0ZGlvOiBcInBpcGVcIiB9LFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoIXRoaXMuaXNDYWNoZWRGaWxlVmFsaWQodGVtcEZpbGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBEb3dubG9hZGVkIGZpbGUgZm9yICR7cGtnLm5hbWV9QCR7cGtnLnZlcnNpb259IGlzIGVtcHR5IG9yIG1pc3Npbmc6ICR7dGVtcEZpbGV9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVuYW1lU3luYyh0ZW1wRmlsZSwgY2FjaGVkRmlsZSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgcm1TeW5jKHRlbXBGaWxlLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVidWcoXG4gICAgICAgICAgYCR7TE9HX1BSRUZJWH0gQ2FjaGVkICR7cGtnLm5hbWV9QCR7cGtnLnZlcnNpb259IHRvICR7Y2FjaGVkRmlsZX1gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBta2RpclN5bmModGFyZ2V0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGV4ZWNGaWxlU3luYyhcbiAgICAgICAgXCJ0YXJcIixcbiAgICAgICAgW1wiLXh6ZlwiLCBjYWNoZWRGaWxlLCBcIi1DXCIsIHRhcmdldERpciwgXCItLXN0cmlwLWNvbXBvbmVudHM9MVwiXSxcbiAgICAgICAgeyBzdGRpbzogXCJwaXBlXCIgfSxcbiAgICAgICk7XG5cbiAgICAgIGRlYnVnKGAke0xPR19QUkVGSVh9IEluc3RhbGxlZCAke3BrZy5uYW1lfUAke3BrZy52ZXJzaW9ufWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgdGhhdCBhIGNhY2hlZCBTaGFycCBiaW5hcnkgYXJjaGl2ZSBpcyBub24tZW1wdHkuIEd1YXJkcyBhZ2FpbnN0XG4gICAqIGEgdHJ1bmNhdGVkL2NvcnJ1cHQgZG93bmxvYWQgKGUuZy4gZnJvbSBhIGRyb3BwZWQgY29ubmVjdGlvbikgYmVpbmdcbiAgICogcmV1c2VkIGFjcm9zcyBzeW50aCBvcGVyYXRpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0NhY2hlZEZpbGVWYWxpZChmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBzdGF0U3luYyhmaWxlUGF0aCkuc2l6ZSA+IDA7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogV2hhdCB0cmF2ZWxzIHRvIHRoZSBhZGFwdGVyIGluIHtAbGluayBGVU5DVElPTl9HUk9VUFNfRU5WX1ZBUn0sIGFuZCB3aGF0IGl0XG4gKiByZWNvcmRzIGJhY2sgYXMgYEFkYXB0ZXJNYW5pZmVzdC5mdW5jdGlvbkdyb3Vwc2AuXG4gKi9cbmZ1bmN0aW9uIHRvRnVuY3Rpb25Hcm91cFNwZWNzKFxuICBncm91cHM6IE5leHRqc0Z1bmN0aW9uR3JvdXBSb3V0ZXNbXSxcbik6IEZ1bmN0aW9uR3JvdXBTcGVjW10ge1xuICByZXR1cm4gZ3JvdXBzLm1hcCgoeyBuYW1lLCByb3V0ZXMgfSkgPT4gKHsgbmFtZSwgcm91dGVzIH0pKTtcbn1cblxuLyoqIGBncm91cHNgIGluIGEgY2Fub25pY2FsIG9yZGVyLCBmb3IgY29tcGFyaW5nIHR3byBvZiB0aGVtLiAqL1xuZnVuY3Rpb24gc29ydGVkR3JvdXBTcGVjcyhcbiAgZ3JvdXBzOiByZWFkb25seSBGdW5jdGlvbkdyb3VwU3BlY1tdIHwgdW5kZWZpbmVkLFxuKTogRnVuY3Rpb25Hcm91cFNwZWNbXSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBncm91cHNcbiAgICA/Lm1hcCgoeyBuYW1lLCByb3V0ZXMgfSkgPT4gKHsgbmFtZSwgcm91dGVzOiBbLi4ucm91dGVzXS5zb3J0KCkgfSkpXG4gICAgLnNvcnQoKGEsIGIpID0+IChhLm5hbWUgPCBiLm5hbWUgPyAtMSA6IDEpKTtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSBzdGFnZWQgYHNoYXJwYCBKUyB3cmFwcGVyIG91dCBvZiBldmVyeSBjb3B5IGZvdW5kIGluIHRoZSB0cmVlLlxuICpcbiAqIFVubGlrZSBhIHN0YW5kYWxvbmUgYnVpbGQgdGhlcmUgaXMgbm8gc2luZ2xlIGBub2RlX21vZHVsZXNgIHRvIGxvb2sgaW46IHRoZVxuICogdHJlZSBtaXJyb3JzIHJlcG8tcm9vdC1yZWxhdGl2ZSBwYXRocywgc28gdGhlIHNlYXJjaCBpcyBieSBkaXJlY3RvcnkgbmFtZS5cbiAqXG4gKiBBbiBhcHAgY2FuIGhhdmUgdHdvIGBzaGFycGAgY29waWVzIGF0IGRpZmZlcmVudCB2ZXJzaW9ucyAoaXRzIG93biwgaG9pc3RlZCxcbiAqIGFuZCBuZXh0J3MsIG5lc3RlZCB1bmRlciBgbmV4dC9ub2RlX21vZHVsZXNgKSwgYW5kIGV2ZXJ5IGJpbmFyeSBnb2VzIGludG8gdGhlXG4gKiBvbmUgcm9vdCBgQGltZ2AsIHNvIHRoZSBjb3B5IHBpbm5pbmcgdGhlbSBoYXMgdG8gYmUgdGhlIG9uZSBgbmV4dGAncyBpbWFnZVxuICogb3B0aW1pemVyIGxvYWRzOiBgbmV4dFNoYXJwYCwgd2hlbiB7QGxpbmsgcmVzb2x2ZU5leHRTaGFycH0gZm91bmQgaXQuIE90aGVyd2lzZVxuICogc2hvcnRlc3QgcGF0aCB3aW5zIGFzIHRoZSBjbG9zZXN0IHRvIGEgaG9pc3RlZCBpbnN0YWxsLCBzb3J0ZWQgZm9yXG4gKiBkZXRlcm1pbmlzbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpY2tTdGFnZWRTaGFycFBhY2thZ2UoXG4gIGNhbmRpZGF0ZXM6IHN0cmluZ1tdLFxuICBuZXh0U2hhcnA/OiBzdHJpbmcsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB1c2VkID1cbiAgICBuZXh0U2hhcnAgJiZcbiAgICBjYW5kaWRhdGVzLmZpbmQoKGNhbmRpZGF0ZSkgPT5cbiAgICAgIG5leHRTaGFycC5zdGFydHNXaXRoKHJlYWxwYXRoU3luYyhjYW5kaWRhdGUpICsgc2VwKSxcbiAgICApO1xuICBpZiAodXNlZCkge1xuICAgIHJldHVybiB1c2VkO1xuICB9XG4gIGNhbmRpZGF0ZXMuc29ydCgoYSwgYikgPT4gYS5sZW5ndGggLSBiLmxlbmd0aCB8fCBhLmxvY2FsZUNvbXBhcmUoYikpO1xuICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggPiAxKSB7XG4gICAgZGVidWcoXG4gICAgICBgJHtMT0dfUFJFRklYfSBNdWx0aXBsZSBzdGFnZWQgXCJzaGFycFwiIGNvcGllczsgdXNpbmcgJHtjYW5kaWRhdGVzWzBdfWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gY2FuZGlkYXRlc1swXTtcbn1cblxuLyoqXG4gKiBUaGUgcmVhbCBwYXRoIG9mIHRoZSBgc2hhcnBgIGVudHJ5IHBvaW50IHRoZSBzdGFnZWQgYG5leHRgIHJlc29sdmVzIGZyb21cbiAqIGBwcm9qZWN0RGlyYCwgYHVuZGVmaW5lZGAgd2hlbiBlaXRoZXIgZG9lcyBub3QgcmVzb2x2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVOZXh0U2hhcnAocHJvamVjdERpcjogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICAvLyBUaGUgYW5jaG9yIGZpbGUgbmVlZG4ndCBleGlzdDsgYGNyZWF0ZVJlcXVpcmVgIG9ubHkgcmVhZHMgaXRzIGRpcmVjdG9yeS5cbiAgICBjb25zdCBuZXh0UGFja2FnZSA9IGNyZWF0ZVJlcXVpcmUoXG4gICAgICBqb2luKHByb2plY3REaXIsIFwiY2RrLW5leHRqcy1uZXh0LXJlc29sdmVyLmNqc1wiKSxcbiAgICApLnJlc29sdmUoXCJuZXh0L3BhY2thZ2UuanNvblwiKTtcbiAgICByZXR1cm4gY3JlYXRlUmVxdWlyZShuZXh0UGFja2FnZSkucmVzb2x2ZShcInNoYXJwXCIpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgZW50cnkgYG5hbWVgIGluIGBwYXJlbnRQYXRoYCBpcyBhbiBgQGltZy9zaGFycC0qYCBwbGF0Zm9ybSBiaW5hcnlcbiAqIHBhY2thZ2UsIG9yIHBucG0ncyBzdG9yZSBlbnRyeSBmb3Igb25lLlxuICpcbiAqIFRoZSBuYW1lIGFsb25lIGlzIG5vdCBlbm91Z2ggdG8gZGVsZXRlIGEgZGlyZWN0b3J5IGJ5LiBBIHJvdXRlIHNlZ21lbnQgY2FsbGVkXG4gKiBgc2hhcnAtZWRnZXNgIHN0YWdlcyBgLm5leHQvc2VydmVyL2FwcC9zaGFycC1lZGdlcy9gLCBhbmQgcmVtb3ZpbmcgaXQgbGVmdCB0aGVcbiAqIG1hbmlmZXN0IGxpc3RpbmcgYW4gZW50cnlwb2ludCB0aGF0IGlzIG5vIGxvbmdlciBvbiBkaXNrIOKAlCBldmVyeSByZXF1ZXN0IHRvXG4gKiB0aGF0IHJvdXRlIDUwMGluZyB3aXRoIFwiQ291bGQgbm90IGxvYWQgdGhlIGVudHJ5cG9pbnRcIi4gTm9yIGlzIFwiYSBgc2hhcnAtYFxuICogcGFja2FnZVwiOiBgc2hhcnAtaWNvYCBhbmQgYHNoYXJwLXBoYXNoYCBhcmUgdW5yZWxhdGVkIGRlcGVuZGVuY2llcywgYW5kXG4gKiByZW1vdmluZyB0aGVtIGZhaWxlZCB0aGUgYXBwIGF0IHJ1bnRpbWUgd2l0aCBNT0RVTEVfTk9UX0ZPVU5ELiBTbyBib3RoIHRoZVxuICogc2NvcGUgYW5kIHRoZSBwbGFjZSBoYXZlIHRvIG1hdGNoOlxuICpcbiAqIC0gYG5vZGVfbW9kdWxlcy9AaW1nL3NoYXJwLeKApmAsIHdoZXJlIGV2ZXJ5IHBsYXRmb3JtIGJpbmFyeSBhY3R1YWxseSBsaXZlc1xuICogLSBgbm9kZV9tb2R1bGVzLy5wbnBtL0BpbWcrc2hhcnAt4oCmQDAuMzUuNGAsIHBucG0ncyBzdG9yZSwgd2hvc2UgZW50cmllcyBhcmVcbiAqICAgYWxzbyB3aGF0IHRoZSBgQGltZ2AgbGlua3MgcG9pbnQgYXQgKGBzaGFycC1saWJ2aXBzLeKApmAgbWF0Y2hlcyB0aGUgc2FtZSB3YXkpXG4gKlxuICogVGhlIGBub2RlX21vZHVsZXNgIHNlZ21lbnQgaXMgcmVxdWlyZWQgYXMgd2VsbCwgc28gYW4gYXBwIGRpcmVjdG9yeSB0aGF0XG4gKiBoYXBwZW5zIHRvIGJlIGNhbGxlZCBgQGltZ2Agb3IgYC5wbnBtYCBpcyBzdGlsbCBsZWZ0IGFsb25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTaGFycEJpbmFyeVBhY2thZ2UoXG4gIHBhcmVudFBhdGg6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNlZ21lbnRzID0gcGFyZW50UGF0aC5zcGxpdChzZXApO1xuICBjb25zdCBwYXJlbnQgPSBzZWdtZW50c1tzZWdtZW50cy5sZW5ndGggLSAxXTtcbiAgY29uc3Qgc2NvcGVkID1cbiAgICAocGFyZW50ID09PSBcIkBpbWdcIiAmJiBuYW1lLnN0YXJ0c1dpdGgoXCJzaGFycC1cIikpIHx8XG4gICAgKHBhcmVudCA9PT0gXCIucG5wbVwiICYmIG5hbWUuc3RhcnRzV2l0aChcIkBpbWcrc2hhcnAtXCIpKTtcbiAgcmV0dXJuIHNjb3BlZCAmJiBzZWdtZW50cy5pbmNsdWRlcyhcIm5vZGVfbW9kdWxlc1wiKTtcbn1cblxuLyoqXG4gKiBXaGVyZSB0aGUgdGFyZ2V0J3MgYEBpbWcvc2hhcnAtKmAgYmluYXJpZXMgZ286IGA8cm9vdD4vbm9kZV9tb2R1bGVzL0BpbWdgLlxuICpcbiAqIE5vdCBuZXh0IHRvIHRoZSBzdGFnZWQgYHNoYXJwYCBwYWNrYWdlLiBVbmRlciBwbnBtIHRoYXQgaXNcbiAqIGBub2RlX21vZHVsZXMvLnBucG0vc2hhcnBAeC9ub2RlX21vZHVsZXMvQGltZ2AsIHdoaWNoIG9ubHkgdGhlIHN0b3JlIGNvcHkgb2ZcbiAqIGBzaGFycGAgcmVzb2x2ZXMgZnJvbTogYSBkZXJlZmVyZW5jZWQgbGluayB0byBgc2hhcnBgIChhIGNvcHkgYXRcbiAqIGBhcHAvbm9kZV9tb2R1bGVzL3NoYXJwYCwgc2F5KSBsb29rcyBmb3IgYEBpbWdgIGZyb20gaXRzIG93biBwYXRoIGFuZCB3YWxrc1xuICogdXAsIG5ldmVyIGludG8gdGhlIHN0b3JlLiBCb3RoIHRoZSBGdW5jdGlvbnMgemlwIChgemlwRGlyZWN0b3J5YCkgYW5kIHRoZVxuICogQ29udGFpbmVycyBgQ09QWWAga2VlcCB0aGUgbGlua3MsIHNvIGl0IGlzIHRoZSBzdG9yZSBjb3B5IHRoYXQgbG9hZHMsIGFuZCBpdHNcbiAqIHdhbGsgdXAgcmVhY2hlcyB0aGUgcm9vdCBgbm9kZV9tb2R1bGVzYCB0b28sIHNvIGl0IHNlcnZlcyBlaXRoZXIgbGF5b3V0LiBJdFxuICogaXMgYWxzbyB3aGVyZSBtYWluIGluc3RhbGxlZCB0aGVtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hhcnBCaW5hcnlEaXIocm9vdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGpvaW4ocm9vdCwgXCJub2RlX21vZHVsZXNcIiwgXCJAaW1nXCIpO1xufVxuXG4vKipcbiAqIEV2ZXJ5IGVudHJ5IHVuZGVyIGByb290YCwgbGlua3MgbGlzdGVkIGJ1dCBub3QgZm9sbG93ZWQuXG4gKlxuICogQW4gZXhwbGljaXQgd2FsayByYXRoZXIgdGhhbiBgcmVhZGRpclN5bmMoeyByZWN1cnNpdmU6IHRydWUgfSlgLCB3aGljaCBvblxuICogTm9kZSAyNCBkZXNjZW5kcyBpbnRvIHN5bWxpbmtlZCBkaXJlY3RvcmllcyBpdHNlbGYgYW5kIHNvIG5ldmVyIHJldHVybnMgb24gYVxuICogY3ljbGUg4oCUIHR3byB3b3Jrc3BhY2UgcGFja2FnZXMgdGhhdCBsaW5rIGVhY2ggb3RoZXIsIHdoaWNoIGlzIGhvdyBwbnBtIHdpcmVzIGFcbiAqIG1vbm9yZXBvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdFRyZWUocm9vdDogc3RyaW5nKTogRGlyZW50W10ge1xuICBjb25zdCBlbnRyaWVzOiBEaXJlbnRbXSA9IFtdO1xuICBjb25zdCBwZW5kaW5nID0gW3Jvb3RdO1xuICBmb3IgKGxldCBkaXIgPSBwZW5kaW5nLnBvcCgpOyBkaXIgIT09IHVuZGVmaW5lZDsgZGlyID0gcGVuZGluZy5wb3AoKSkge1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgcmVhZGRpclN5bmMoZGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBwZW5kaW5nLnB1c2goam9pbihkaXIsIGVudHJ5Lm5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudHJpZXM7XG59XG5cbmNvbnN0IEVMRl9NQUNISU5FUzogUmVjb3JkPG51bWJlciwgc3RyaW5nPiA9IHsgNjI6IFwieDY0XCIsIDE4MzogXCJhcm02NFwiIH07XG5jb25zdCBNQUNIX09fTUFHSUNTID0gW1xuICAweGZlZWRmYWNlLCAweGZlZWRmYWNmLCAweGNlZmFlZGZlLCAweGNmZmFlZGZlLCAweGNhZmViYWJlLFxuXTtcblxuLyoqXG4gKiBUaGUgcGxhdGZvcm0gYSBuYXRpdmUgYWRkb24gd2FzIGNvbXBpbGVkIGZvciwgcmVhZCBmcm9tIGl0cyBoZWFkZXI6XG4gKiBgbGludXgtPGFyY2g+YCwgYGRhcndpbmAgb3IgYHdpbjMyYCwgb3IgYHVuZGVmaW5lZGAgZm9yIGEgZmlsZSB0aGF0IGlzIG5vbmVcbiAqIG9mIHRob3NlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmF0aXZlQmluYXJ5UGxhdGZvcm0oZmlsZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaGVhZGVyID0gQnVmZmVyLmFsbG9jKDIwKTtcbiAgY29uc3QgZmQgPSBvcGVuU3luYyhmaWxlLCBcInJcIik7XG4gIHRyeSB7XG4gICAgcmVhZFN5bmMoZmQsIGhlYWRlciwgMCwgaGVhZGVyLmxlbmd0aCwgMCk7XG4gIH0gZmluYWxseSB7XG4gICAgY2xvc2VTeW5jKGZkKTtcbiAgfVxuICBjb25zdCBtYWdpYyA9IGhlYWRlci5yZWFkVUludDMyQkUoMCk7XG4gIGlmIChtYWdpYyA9PT0gMHg3ZjQ1NGM0Nikge1xuICAgIC8vIGVfbWFjaGluZSwgaW4gdGhlIGJ5dGUgb3JkZXIgRUlfREFUQSBuYW1lcyAoMiBpcyBiaWctZW5kaWFuKS5cbiAgICBjb25zdCBtYWNoaW5lID1cbiAgICAgIGhlYWRlcls1XSA9PT0gMiA/IGhlYWRlci5yZWFkVUludDE2QkUoMTgpIDogaGVhZGVyLnJlYWRVSW50MTZMRSgxOCk7XG4gICAgcmV0dXJuIGBsaW51eC0ke0VMRl9NQUNISU5FU1ttYWNoaW5lXSA/PyBgbWFjaGluZS0ke21hY2hpbmV9YH1gO1xuICB9XG4gIGlmIChNQUNIX09fTUFHSUNTLmluY2x1ZGVzKG1hZ2ljKSkge1xuICAgIHJldHVybiBcImRhcndpblwiO1xuICB9XG4gIGlmIChoZWFkZXIudG9TdHJpbmcoXCJsYXRpbjFcIiwgMCwgMikgPT09IFwiTVpcIikge1xuICAgIHJldHVybiBcIndpbjMyXCI7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUaGUgcGFja2FnZXMgdW5kZXIgYHJvb3RgIHRoYXQgaGF2ZSBgLm5vZGVgIGFkZG9ucyBidXQgbm9uZSBidWlsdCBmb3JcbiAqIGB0YXJnZXRgLCBzbyB0aGV5J2QgZmFpbCB0byBsb2FkIHRoZXJlLiBSZXR1cm5lZCBhcyBgcm9vdGAtcmVsYXRpdmUgcGF0aHMuXG4gKlxuICogQSBwYWNrYWdlIHdpdGggYWRkb25zIGZvciBzZXZlcmFsIHBsYXRmb3JtcyBpcyBmaW5lIGFzIGxvbmcgYXMgb25lIG9mIHRoZW1cbiAqIGlzIGB0YXJnZXRgOiBwYWNrYWdlcyBsaWtlIGBidWZmZXJ1dGlsYCBidW5kbGUgYSBgZGFyd2luYCBhbmQgYVxuICogYGxpbnV4LXg2NGAgYWRkb24gYW5kIGxvYWQgd2hpY2hldmVyIG1hdGNoZXMgdGhlIG1hY2hpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRm9yZWlnbk5hdGl2ZVBhY2thZ2VzKFxuICByb290OiBzdHJpbmcsXG4gIHRhcmdldDogc3RyaW5nLFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBwYWNrYWdlcyA9IG5ldyBNYXA8c3RyaW5nLCB7IG1hdGNoZXM6IGJvb2xlYW47IGZvcmVpZ246IGJvb2xlYW4gfT4oKTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBsaXN0VHJlZShyb290KSkge1xuICAgIGlmICghZW50cnkuaXNGaWxlKCkgfHwgIWVudHJ5Lm5hbWUuZW5kc1dpdGgoXCIubm9kZVwiKSkgY29udGludWU7XG4gICAgY29uc3QgcGxhdGZvcm0gPSBuYXRpdmVCaW5hcnlQbGF0Zm9ybShqb2luKGVudHJ5LnBhcmVudFBhdGgsIGVudHJ5Lm5hbWUpKTtcbiAgICBpZiAoIXBsYXRmb3JtKSBjb250aW51ZTtcbiAgICBjb25zdCBwa2cgPSBwYWNrYWdlRGlyT2Yocm9vdCwgZW50cnkucGFyZW50UGF0aCk7XG4gICAgY29uc3Qgc2VlbiA9IHBhY2thZ2VzLmdldChwa2cpID8/IHsgbWF0Y2hlczogZmFsc2UsIGZvcmVpZ246IGZhbHNlIH07XG4gICAgaWYgKHBsYXRmb3JtID09PSB0YXJnZXQpIHtcbiAgICAgIHNlZW4ubWF0Y2hlcyA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlZW4uZm9yZWlnbiA9IHRydWU7XG4gICAgfVxuICAgIHBhY2thZ2VzLnNldChwa2csIHNlZW4pO1xuICB9XG4gIHJldHVybiBbLi4ucGFja2FnZXNdXG4gICAgLmZpbHRlcigoWywgc2Vlbl0pID0+IHNlZW4uZm9yZWlnbiAmJiAhc2Vlbi5tYXRjaGVzKVxuICAgIC5tYXAoKFtwa2ddKSA9PiByZWxhdGl2ZShyb290LCBwa2cpKVxuICAgIC5zb3J0KCk7XG59XG5cbi8qKiBUaGUgbmVhcmVzdCBkaXJlY3RvcnkgZnJvbSBgZGlyYCB1cCB0byBgcm9vdGAgd2l0aCBhIGBwYWNrYWdlLmpzb25gLiAqL1xuZnVuY3Rpb24gcGFja2FnZURpck9mKHJvb3Q6IHN0cmluZywgZGlyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBmb3IgKFxuICAgIGxldCBjdXJyZW50ID0gZGlyO1xuICAgIGN1cnJlbnQuc3RhcnRzV2l0aChyb290KTtcbiAgICBjdXJyZW50ID0gZGlybmFtZShjdXJyZW50KVxuICApIHtcbiAgICBpZiAoZXhpc3RzU3luYyhqb2luKGN1cnJlbnQsIFwicGFja2FnZS5qc29uXCIpKSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICAgIGlmIChjdXJyZW50ID09PSByb290KSBicmVhaztcbiAgfVxuICByZXR1cm4gZGlyO1xufVxuXG4vKipcbiAqIFdyaXRlIHtAbGluayBQVUJMSUNfRklMRVNfRklMRV9OQU1FfSBpbnRvIGEgZGVwbG95bWVudCByb290J3MgcnVudGltZVxuICogZGlyZWN0b3J5OiBldmVyeSBmaWxlIHVuZGVyIGBwdWJsaWNEaXJgLCBsaXN0ZWQgdGhlIHdheSB0aGUgcnVudGltZSB3b3VsZFxuICogbGlzdCBpdCBvZmYgZGlzayAoYHJlYWRQdWJsaWNGaWxlc2A6IHN5bWxpbmtzIGZvbGxvd2VkLCBgL2Atc2VwYXJhdGVkLFxuICogc29ydGVkKS4gQW4gYXBwIHdpdGhvdXQgYHB1YmxpYy9gIGdldHMgYFtdYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlUHVibGljRmlsZUxpc3QocnVudGltZURpcjogc3RyaW5nLCBwdWJsaWNEaXI6IHN0cmluZykge1xuICB3cml0ZUZpbGVTeW5jKFxuICAgIGpvaW4ocnVudGltZURpciwgUFVCTElDX0ZJTEVTX0ZJTEVfTkFNRSksXG4gICAgSlNPTi5zdHJpbmdpZnkocmVhZFB1YmxpY0ZpbGVzKHB1YmxpY0RpcikpLFxuICApO1xufVxuXG4vKipcbiAqIFRvdGFsIGJ5dGVzIG9mIGEgdHJlZSBhcyBpdHMgZGVwbG95bWVudCB6aXAgc3RvcmVzIGl0LiBgemlwRGlyZWN0b3J5YCBrZWVwc1xuICogbGlua3MgYXMgbGlua3MsIHNvIGVhY2ggY291bnRzIGFzIGl0cyB0YXJnZXQgcGF0aCwgbm90IGFzIHRoZSB0YXJnZXQsIHdoaWNoXG4gKiBpcyB3YWxrZWQgYXQgaXRzIG93biBwYXRoIGFueXdheSAoZXZlcnkgbGluayBpbiBhIHN0YWdlZCByb290IHBvaW50cyBpbnNpZGVcbiAqIGl0KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0b3JlZFNpemUocm9vdDogc3RyaW5nKTogbnVtYmVyIHtcbiAgbGV0IGJ5dGVzID0gMDtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBsaXN0VHJlZShyb290KSkge1xuICAgIGlmICghZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgYnl0ZXMgKz0gbHN0YXRTeW5jKGpvaW4oZW50cnkucGFyZW50UGF0aCwgZW50cnkubmFtZSkpLnNpemU7XG4gICAgfVxuICB9XG4gIHJldHVybiBieXRlcztcbn1cblxuLyoqXG4gKiBgY2h1bmtgIHdpdGggYHBhdGNoYCBwcmVwZW5kZWQgYmV0d2VlbiBgUEFUQ0hfRkVUQ0hfTUFSS0VSYCBhbmRcbiAqIGBQQVRDSF9GRVRDSF9FTkRfTUFSS0VSYCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBhbHJlYWR5IGNhcnJpZXMgdGhpcyBleGFjdFxuICogcGF0Y2guXG4gKlxuICogVGhlIG9wZW5pbmcgbWFya2VyIGNhcnJpZXMgYSBoYXNoIG9mIHRoZSBwYXRjaCwgc28gYSBjaHVuayBwYXRjaGVkIGJ5IGFcbiAqIGNkay1uZXh0anMgd2hvc2UgYHBhdGNoLWZldGNoLmpzYCBkaWZmZXJzIChhbiB1cGdyYWRlLCBvdmVyIGEgYC5uZXh0YCByZXVzZWRcbiAqIHdpdGggYHNraXBCdWlsZDogdHJ1ZWApIGlzIG5vdCBtaXN0YWtlbiBmb3IgY3VycmVudDogdGhlIG9sZCBwYXRjaCBpcyBjdXQgb2ZmXG4gKiBhdCBpdHMgZW5kIG1hcmtlciBhbmQgdGhpcyBvbmUgcHV0IGluIGl0cyBwbGFjZSwgcmF0aGVyIHRoYW4gdGhlIG9sZCBvbmVcbiAqIHNoaXBwaW5nIG9yIGJvdGggc3RhY2tpbmcgdXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaENsaWVudENodW5rKFxuICBjaHVuazogc3RyaW5nLFxuICBwYXRjaDogc3RyaW5nLFxuICBjaHVua1BhdGg6IHN0cmluZyxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShwYXRjaCkuZGlnZXN0KFwiaGV4XCIpLnNsaWNlKDAsIDE2KTtcbiAgY29uc3Qgb3BlbiA9IGAke1BBVENIX0ZFVENIX01BUktFUn0gJHtoYXNofSAqL2A7XG4gIGlmIChjaHVuay5zdGFydHNXaXRoKGAke29wZW59XFxuYCkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGxldCBvcmlnaW5hbCA9IGNodW5rO1xuICBpZiAoY2h1bmsuc3RhcnRzV2l0aChQQVRDSF9GRVRDSF9NQVJLRVIpKSB7XG4gICAgY29uc3QgZW5kID0gY2h1bmsuaW5kZXhPZihgXFxuJHtQQVRDSF9GRVRDSF9FTkRfTUFSS0VSfVxcbmApO1xuICAgIGlmIChlbmQgPT09IC0xKSB7XG4gICAgICAvLyBPbmx5IGEgcHJlLXJlbGVhc2UgY2RrLW5leHRqcyB3cm90ZSB0aGUgbWFya2VyIHdpdGhvdXQgYW4gZW5kLCBhbmRcbiAgICAgIC8vIHdoZXJlIGl0cyBwYXRjaCBzdG9wcyBjYW5ub3QgYmUgdG9sZCBmcm9tIHRoZSBjaHVuaydzIG93biBjb2RlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSAke2NodW5rUGF0aH0gY2FycmllcyBhIGNkay1uZXh0anMgZmV0Y2ggcGF0Y2ggdGhpcyBgICtcbiAgICAgICAgICBgdmVyc2lvbiBjYW5ub3QgcmVwbGFjZS4gUmUtcnVuIFxcYG5leHQgYnVpbGRcXGAgdG8gcmVnZW5lcmF0ZSBpdC5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgb3JpZ2luYWwgPSBjaHVuay5zbGljZShlbmQgKyBQQVRDSF9GRVRDSF9FTkRfTUFSS0VSLmxlbmd0aCArIDIpO1xuICB9XG4gIHJldHVybiBgJHtvcGVufVxcbiR7cGF0Y2h9XFxuJHtQQVRDSF9GRVRDSF9FTkRfTUFSS0VSfVxcbiR7b3JpZ2luYWx9YDtcbn1cbiJdfQ==
|