@pwrdrvr/microapps-cdk 0.0.16 → 0.0.20
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 +3 -3
- package/README.md +5 -5
- package/lib/MicroApps.js +1 -1
- package/lib/MicroAppsSvcs.js +128 -123
- package/lib/microapps-deployer/index.js +68 -68
- package/lib/microapps-deployer/index.js.map +3 -3
- package/lib/microapps-router/index.js +37 -37
- package/lib/microapps-router/index.js.map +3 -3
- package/package.json +1 -1
package/.jsii
CHANGED
|
@@ -1239,7 +1239,7 @@
|
|
|
1239
1239
|
},
|
|
1240
1240
|
"name": "@pwrdrvr/microapps-cdk",
|
|
1241
1241
|
"readme": {
|
|
1242
|
-
"markdown": "# Overview\n\nThe MicroApps project
|
|
1242
|
+
"markdown": "# Overview\n\nThe MicroApps project....\n\n# Project Layout\n\n- [packages/cdk]() - CDK Stacks\n - MicroAppsS3\n - Creates S3 buckets\n - MicroAppsRepos\n - Creates the ECR repos for components to be published into;\n - Deployer\n - Router\n - MicroAppsSvcs\n - Create DynamoDB table\n - Create Deployer Lambda function\n - Create Router Lambda function\n - Create APIGateway HTTP API\n - MicroAppsCF\n - Creates Cloudfront distribution\n - MicroAppsR53\n - Creates domain names to point to the edge (Cloudfront) and origin (API Gateway)\n- [packages/microapps-deployer]()\n - Lambda service invoked by `microapps-publish` to record new app/version in the DynamoDB table, create API Gateway integrations, copy S3 assets from staging to prod bucket, etc.\n- [packages/microapps-publish]()\n - Node executable that updates versions in config files, deploys static assets to the S3 staging bucket, optionally compiles and deploys a new Lambda function version, and invokes `microapps-deployer`\n - Permissions required:\n - Lambda invoke\n - S3 publish to the staging bucket\n - ECR write\n - Lambda version publish\n- [packages/microapps-router]()\n - Lambda function that determines which version of an app to point a user to on a particular invocation\n\n# Useful Commands\n\n- `npm run build` compiles TypeSript to JavaScript\n- `npm run lint` checks TypeScript for compliance with Lint rules\n- `cdk list` list the stack names\n- `cdk deploy` deploy this stack to your default AWS account/region\n- `cdk diff` compare deployed stack with current state\n- `cdk synth` emits the synthesized CloudFormation template\n\n# Running CDK\n\nAlways run CDK from the root of the git repo, which is the directory containing `cdk.json`.\n\n## Set AWS Profile\n\n`export AWS_PROFILE=pwrdrvr`\n\n## Set NVM Version\n\n`nvm use`\n\n# Deployer Service\n\nCopies static assets from staging to deployed directory, creates record of application / version in DynamoDB Table.\n\n## Build and Deploy Update\n\n```\nmake aws-ecr-login\nmake aws-ecr-publish-deployer\nmake aws-lambda-update-deployer\n```\n\n# Notes on Selection of Docker Image Lambdas\n\nThe Router and Deployer services are very small (0.5 MB) after tree shaking, minification, and uglification performed by `rollup`. The router has the tightest performance requirement and performed just as well as a docker image vs a zip file. However, docker image start up is up to 2x longer vs the zip file for the router; this should not be a problem for any live system with continuous usage and for demos the router can be initialized or pre-provisioned beforehand. The development benefits of docker images for Lambda outweigh the small init time impact on cold starts.\n\n# Notes on Performance\n\n## Router\n\nFor best demo performance (and real user performance), the memory for the Router Lambda should be set to 1024 MB as this gives the fastest cold start at the lowest cost. The cost per warm request is actually lower at 1024 MB than at 128 MB, so 1024 MB is just the ideal size.\n\nFor supremely optimum demo performance the Router Lambda should be deployed as a .zip file as that saves about 50% of the cold start time, or about 200 ms, but once it's the cold start has happened they are equally as fast as each other.\n\n- Lambda Memory (which linearly scales CPU) Speeds\n - Docker Image Lambda\n - Note: All times captured with Rollup ~400 KB Docker Layer\n - 128 MB\n - Duration Warm: 118 ms\n - Duration Cold: 763 ms\n - Init Duration: 518 ms\n - Billed Duration Warm: 119 ms\n - Billed Duration Init: 1,282 ms\n - Warm Cost: 0.025 millicents\n - Init Cost: 0.26 millicents\n - 256 MB\n - Duration Warm: 30 ms\n - Duration Cold: 363 ms\n - Init Duration: 488 ms\n - Billed Duration Warm: 30 ms\n - Billed Duration Init: 853 ms\n - Warm Cost: 0.013 millicents\n - Init Cost: 0.36 millicents\n - 512 MB\n - Duration Warm: 10 ms\n - Duration Cold: 176 ms\n - Init Duration: 572 ms\n - Billed Duration Warm: 10 ms\n - Billed Duration Init: 749 ms\n - Warm Cost: 0.0083 millicents\n - Init Cost: 0.62 millicents\n - 1024 MB\n - Duration Warm: 9 ms\n - Duration Cold: 84.5 ms\n - Init Duration: 497 ms\n - Billed Duration Warm: 9 ms\n - Billed Duration Init: 585 ms\n - Warm Cost: 0.015 millicents\n - Init Cost: 0.97 millicents\n - _Init performance scales linearly up to and including 1024 MB_\n - 1769 MB\n - This is the point at which a Lambda has 100% of 1 CPU\n - https://docs.aws.amazon.com/lambda/latest/dg/configuration-memory.html\n - Duration Warm: 8.31 ms\n - Duration Cold: 73 ms\n - Init Duration: 514 ms\n - Billed Duration Warm: 10 ms\n - Billed Duration Cold: 587 ms\n - Warm Cost: 0.029 millicents\n - Init Cost: 1.7 millicents\n - 2048 MB\n - Duration Warm: 10 ms\n - Duration Cold: 67 ms\n - Init Duration: 497 ms\n - Billed Duration Warm: 11 ms\n - Billed Duration Init: 566 ms\n - Warm Cost: 0.037 millicents\n - Init Cost: 1.89 millicents\n - Zip File Lambda\n - 128 MB\n - Duration Warm: 110 ms\n - Duration Cold: 761 ms\n - Init Duration: 210 ms\n - Billed Duration Warm: 120 ms\n - Billed Duration Init: 762 ms\n - Warm Cost: 0.025 millicents\n - Init Cost: 0.16 millicents\n - 512 MB\n - Duration Warm: 10 ms\n - Duration Cold: 179 ms\n - Init Duration: 201 ms\n - Billed Duration Warm: 12 ms\n - Billed Duration Init: 185 ms\n - Warm Cost: 0.01 millicents\n - Init Cost: 0.15 millicents\n - 1024 MB\n - Duration Warm: 10 ms\n - Duration Cold: 85 ms\n - Init Duration: 185 ms\n - Billed Duration Warm: 12 ms\n - Billed Duration Init: 85 ms\n - Warm Cost: 0.02 millicents\n - Init Cost: 0.14 millicents\n"
|
|
1243
1243
|
},
|
|
1244
1244
|
"repository": {
|
|
1245
1245
|
"type": "git",
|
|
@@ -1585,6 +1585,6 @@
|
|
|
1585
1585
|
]
|
|
1586
1586
|
}
|
|
1587
1587
|
},
|
|
1588
|
-
"version": "0.0.
|
|
1589
|
-
"fingerprint": "
|
|
1588
|
+
"version": "0.0.20",
|
|
1589
|
+
"fingerprint": "8TK7wJYAaN0cg+Odh7zAY79AfDFjJCsNCQoCD2dCFIg="
|
|
1590
1590
|
}
|
package/README.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# Overview
|
|
2
2
|
|
|
3
|
-
The MicroApps project
|
|
3
|
+
The MicroApps project....
|
|
4
4
|
|
|
5
5
|
# Project Layout
|
|
6
6
|
|
|
7
|
-
- [
|
|
7
|
+
- [packages/cdk]() - CDK Stacks
|
|
8
8
|
- MicroAppsS3
|
|
9
9
|
- Creates S3 buckets
|
|
10
10
|
- MicroAppsRepos
|
|
@@ -20,16 +20,16 @@ The MicroApps project...
|
|
|
20
20
|
- Creates Cloudfront distribution
|
|
21
21
|
- MicroAppsR53
|
|
22
22
|
- Creates domain names to point to the edge (Cloudfront) and origin (API Gateway)
|
|
23
|
-
- [
|
|
23
|
+
- [packages/microapps-deployer]()
|
|
24
24
|
- Lambda service invoked by `microapps-publish` to record new app/version in the DynamoDB table, create API Gateway integrations, copy S3 assets from staging to prod bucket, etc.
|
|
25
|
-
- [
|
|
25
|
+
- [packages/microapps-publish]()
|
|
26
26
|
- Node executable that updates versions in config files, deploys static assets to the S3 staging bucket, optionally compiles and deploys a new Lambda function version, and invokes `microapps-deployer`
|
|
27
27
|
- Permissions required:
|
|
28
28
|
- Lambda invoke
|
|
29
29
|
- S3 publish to the staging bucket
|
|
30
30
|
- ECR write
|
|
31
31
|
- Lambda version publish
|
|
32
|
-
- [
|
|
32
|
+
- [packages/microapps-router]()
|
|
33
33
|
- Lambda function that determines which version of an app to point a user to on a particular invocation
|
|
34
34
|
|
|
35
35
|
# Useful Commands
|
package/lib/MicroApps.js
CHANGED
|
@@ -73,5 +73,5 @@ class MicroApps extends cdk.Construct {
|
|
|
73
73
|
}
|
|
74
74
|
exports.MicroApps = MicroApps;
|
|
75
75
|
_a = JSII_RTTI_SYMBOL_1;
|
|
76
|
-
MicroApps[_a] = { fqn: "@pwrdrvr/microapps-cdk.MicroApps", version: "0.0.
|
|
76
|
+
MicroApps[_a] = { fqn: "@pwrdrvr/microapps-cdk.MicroApps", version: "0.0.20" };
|
|
77
77
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWljcm9BcHBzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL01pY3JvQXBwcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLHFDQUFxQztBQUNyQywrQ0FBNEM7QUFDNUMsK0NBQTRDO0FBQzVDLG1EQUFnRDs7Ozs7O0FBbURoRCxNQUFhLFNBQVUsU0FBUSxHQUFHLENBQUMsU0FBUzs7OztJQVUxQyxZQUFZLEtBQW9CLEVBQUUsRUFBVSxFQUFFLEtBQXNCO1FBQ2xFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztTQUN0QztRQUVELE1BQU0sRUFDSixVQUFVLEVBQ1YsY0FBYyxFQUNkLGdCQUFnQixFQUNoQixhQUFhLEdBQUcsV0FBVyxFQUMzQixlQUFlLEdBQUcsRUFBRSxFQUNwQixvQkFBb0IsR0FBRyxLQUFLLEVBQzVCLFNBQVMsRUFDVCxXQUFXLEVBQ1gsUUFBUSxFQUNSLE9BQU8sRUFDUCxNQUFNLEVBQ04sTUFBTSxHQUFHLEtBQUssRUFDZCxVQUFVLEVBQ1Ysa0JBQWtCLEVBQ2xCLHNCQUFzQixHQUFHLGFBQWEsR0FDdkMsR0FBRyxLQUFLLENBQUM7UUFDVixNQUFNLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFOUQsTUFBTSxFQUFFLEdBQUcsSUFBSSx5QkFBVyxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUU7WUFDL0Msb0JBQW9CO1lBQ3BCLGlCQUFpQjtZQUNqQixhQUFhO1lBQ2IsZUFBZTtTQUNoQixDQUFDLENBQUM7UUFDSCxNQUFNLEVBQUUsR0FBRyxJQUFJLHlCQUFXLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFO1lBQ3ZELFNBQVMsRUFBRSxFQUFFO1lBQ2IsYUFBYTtZQUNiLGVBQWU7WUFDZixVQUFVO1lBQ1YsaUJBQWlCO1lBQ2pCLGNBQWM7WUFDZCxnQkFBZ0I7WUFDaEIsb0JBQW9CO1lBQ3BCLFNBQVM7WUFDVCxXQUFXO1lBQ1gsUUFBUTtTQUNULENBQUMsQ0FBQztRQUNILElBQUksNkJBQWEsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7WUFDeEMsY0FBYyxFQUFFLEVBQUU7WUFDbEIsU0FBUyxFQUFFLEVBQUU7WUFDYixhQUFhO1lBQ2IsZUFBZTtZQUNmLFVBQVU7WUFDVixpQkFBaUI7WUFDakIsY0FBYztZQUNkLGdCQUFnQjtZQUNoQixvQkFBb0I7WUFDcEIsU0FBUztZQUNULFdBQVc7WUFDWCxPQUFPO1lBQ1AsTUFBTTtZQUNOLE1BQU07WUFDTixVQUFVO1lBQ1Ysa0JBQWtCO1lBQ2xCLHNCQUFzQjtTQUN2QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBekVELHlEQUF5RDtJQUNqRCxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQWM7UUFDekMsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN4QyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbkIsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDeEI7UUFDRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQzs7QUFSSCw4QkEyRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhY20gZnJvbSAnQGF3cy1jZGsvYXdzLWNlcnRpZmljYXRlbWFuYWdlcic7XG5pbXBvcnQgKiBhcyBjZGsgZnJvbSAnQGF3cy1jZGsvY29yZSc7XG5pbXBvcnQgeyBNaWNyb0FwcHNDRiB9IGZyb20gJy4vTWljcm9BcHBzQ0YnO1xuaW1wb3J0IHsgTWljcm9BcHBzUzMgfSBmcm9tICcuL01pY3JvQXBwc1MzJztcbmltcG9ydCB7IE1pY3JvQXBwc1N2Y3MgfSBmcm9tICcuL01pY3JvQXBwc1N2Y3MnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbmV4cG9ydCBpbnRlcmZhY2UgTWljcm9BcHBzUHJvcHMge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGF1dG9EZWxldGVFdmVyeXRoaW5nPzogYm9vbGVhbjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGFwcEVudjogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGFzc2V0TmFtZVJvb3Q6IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgYXNzZXROYW1lU3VmZml4Pzogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBkb21haW5OYW1lOiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSByNTNab25lTmFtZTogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSByNTNab25lSUQ6IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBjZXJ0RWRnZTogYWNtLklDZXJ0aWZpY2F0ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBjZXJ0T3JpZ2luOiBhY20uSUNlcnRpZmljYXRlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgczNQb2xpY3lCeXBhc3NSb2xlTmFtZTogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgczNQb2xpY3lCeXBhc3NBUk9BOiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGRvbWFpbk5hbWVFZGdlOiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgcmVhZG9ubHkgZG9tYWluTmFtZU9yaWdpbjogc3RyaW5nO1xufVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5leHBvcnQgY2xhc3MgTWljcm9BcHBzIGV4dGVuZHMgY2RrLkNvbnN0cnVjdCB7XG4gIC8vIGlucHV0IGxpa2UgJ2V4YW1wbGUuY29tLicgd2lsbCByZXR1cm4gYXMgJ2NvbS5leGFtcGxlJ1xuICBwcml2YXRlIHN0YXRpYyByZXZlcnNlRG9tYWluKGRvbWFpbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcGFydHMgPSBkb21haW4uc3BsaXQoJy4nKS5yZXZlcnNlKCk7XG4gICAgaWYgKHBhcnRzWzBdID09PSAnJykge1xuICAgICAgcGFydHMgPSBwYXJ0cy5zbGljZSgxKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJy4nKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBjZGsuQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IE1pY3JvQXBwc1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGlmIChwcm9wcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb3BzIG11c3QgYmUgc2V0Jyk7XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgZG9tYWluTmFtZSxcbiAgICAgIGRvbWFpbk5hbWVFZGdlLFxuICAgICAgZG9tYWluTmFtZU9yaWdpbixcbiAgICAgIGFzc2V0TmFtZVJvb3QgPSAnbWljcm9hcHBzJyxcbiAgICAgIGFzc2V0TmFtZVN1ZmZpeCA9ICcnLFxuICAgICAgYXV0b0RlbGV0ZUV2ZXJ5dGhpbmcgPSBmYWxzZSxcbiAgICAgIHI1M1pvbmVJRCxcbiAgICAgIHI1M1pvbmVOYW1lLFxuICAgICAgY2VydEVkZ2UsXG4gICAgICBhY2NvdW50LFxuICAgICAgcmVnaW9uLFxuICAgICAgYXBwRW52ID0gJ2RldicsXG4gICAgICBjZXJ0T3JpZ2luLFxuICAgICAgczNQb2xpY3lCeXBhc3NBUk9BLFxuICAgICAgczNQb2xpY3lCeXBhc3NSb2xlTmFtZSA9ICdBZG1pbkFjY2VzcycsXG4gICAgfSA9IHByb3BzO1xuICAgIGNvbnN0IHJldmVyc2VEb21haW5OYW1lID0gTWljcm9BcHBzLnJldmVyc2VEb21haW4oZG9tYWluTmFtZSk7XG5cbiAgICBjb25zdCBzMyA9IG5ldyBNaWNyb0FwcHNTMyh0aGlzLCAnbWljcm9hcHBzLXMzJywge1xuICAgICAgYXV0b0RlbGV0ZUV2ZXJ5dGhpbmcsXG4gICAgICByZXZlcnNlRG9tYWluTmFtZSxcbiAgICAgIGFzc2V0TmFtZVJvb3QsXG4gICAgICBhc3NldE5hbWVTdWZmaXgsXG4gICAgfSk7XG4gICAgY29uc3QgY2YgPSBuZXcgTWljcm9BcHBzQ0YodGhpcywgJ21pY3JvYXBwcy1jbG91ZGZyb250Jywge1xuICAgICAgczNFeHBvcnRzOiBzMyxcbiAgICAgIGFzc2V0TmFtZVJvb3QsXG4gICAgICBhc3NldE5hbWVTdWZmaXgsXG4gICAgICBkb21haW5OYW1lLFxuICAgICAgcmV2ZXJzZURvbWFpbk5hbWUsXG4gICAgICBkb21haW5OYW1lRWRnZSxcbiAgICAgIGRvbWFpbk5hbWVPcmlnaW4sXG4gICAgICBhdXRvRGVsZXRlRXZlcnl0aGluZyxcbiAgICAgIHI1M1pvbmVJRCxcbiAgICAgIHI1M1pvbmVOYW1lLFxuICAgICAgY2VydEVkZ2UsXG4gICAgfSk7XG4gICAgbmV3IE1pY3JvQXBwc1N2Y3ModGhpcywgJ21pY3JvYXBwcy1zdmNzJywge1xuICAgICAgY2ZTdGFja0V4cG9ydHM6IGNmLFxuICAgICAgczNFeHBvcnRzOiBzMyxcbiAgICAgIGFzc2V0TmFtZVJvb3QsXG4gICAgICBhc3NldE5hbWVTdWZmaXgsXG4gICAgICBkb21haW5OYW1lLFxuICAgICAgcmV2ZXJzZURvbWFpbk5hbWUsXG4gICAgICBkb21haW5OYW1lRWRnZSxcbiAgICAgIGRvbWFpbk5hbWVPcmlnaW4sXG4gICAgICBhdXRvRGVsZXRlRXZlcnl0aGluZyxcbiAgICAgIHI1M1pvbmVJRCxcbiAgICAgIHI1M1pvbmVOYW1lLFxuICAgICAgYWNjb3VudCxcbiAgICAgIHJlZ2lvbixcbiAgICAgIGFwcEVudixcbiAgICAgIGNlcnRPcmlnaW4sXG4gICAgICBzM1BvbGljeUJ5cGFzc0FST0EsXG4gICAgICBzM1BvbGljeUJ5cGFzc1JvbGVOYW1lLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
package/lib/MicroAppsSvcs.js
CHANGED
|
@@ -23,7 +23,7 @@ class MicroAppsSvcs extends cdk.Construct {
|
|
|
23
23
|
}
|
|
24
24
|
const { bucketApps, bucketAppsName, bucketAppsOAI, bucketAppsStaging, bucketAppsStagingName } = props.s3Exports;
|
|
25
25
|
const { r53ZoneID, r53ZoneName, s3PolicyBypassAROA, s3PolicyBypassRoleName, autoDeleteEverything, appEnv, domainNameEdge, domainNameOrigin, certOrigin, account, region, assetNameRoot, assetNameSuffix, } = props;
|
|
26
|
-
const apigatewayName = assetNameRoot
|
|
26
|
+
const apigatewayName = `${assetNameRoot}${assetNameSuffix}`;
|
|
27
27
|
//
|
|
28
28
|
// DynamoDB Table
|
|
29
29
|
//
|
|
@@ -43,6 +43,130 @@ class MicroAppsSvcs extends cdk.Construct {
|
|
|
43
43
|
table.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
|
|
44
44
|
}
|
|
45
45
|
//
|
|
46
|
+
// Router Lambda Function
|
|
47
|
+
//
|
|
48
|
+
// Create Router Lambda Function
|
|
49
|
+
let routerFunc;
|
|
50
|
+
const routerFuncProps = {
|
|
51
|
+
functionName: `${assetNameRoot}-router${assetNameSuffix}`,
|
|
52
|
+
memorySize: 1024,
|
|
53
|
+
logRetention: logs.RetentionDays.ONE_MONTH,
|
|
54
|
+
runtime: lambda.Runtime.NODEJS_14_X,
|
|
55
|
+
timeout: cdk.Duration.seconds(15),
|
|
56
|
+
environment: {
|
|
57
|
+
NODE_ENV: appEnv,
|
|
58
|
+
DATABASE_TABLE_NAME: table.tableName,
|
|
59
|
+
AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1',
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
if (fs_1.existsSync(`${path.resolve(__dirname)}/../dist/microapps-router/index.js`)) {
|
|
63
|
+
// This is for local dev
|
|
64
|
+
routerFunc = new lambda.Function(this, 'microapps-router-func', {
|
|
65
|
+
code: lambda.Code.fromAsset(`${path.resolve(__dirname)}/../dist/microapps-router/`),
|
|
66
|
+
handler: 'index.handler',
|
|
67
|
+
...routerFuncProps,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
else if (fs_1.existsSync(`${path.resolve(__dirname)}/microapps-router/index.js`)) {
|
|
71
|
+
// This is for built apps packaged with the CDK construct
|
|
72
|
+
routerFunc = new lambda.Function(this, 'microapps-router-func', {
|
|
73
|
+
code: lambda.Code.fromAsset(`${path.resolve(__dirname)}/microapps-router/`),
|
|
74
|
+
handler: 'index.handler',
|
|
75
|
+
...routerFuncProps,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
// Create Router Lambda Layer
|
|
80
|
+
const routerDataFiles = new lambda.LayerVersion(this, 'microapps-router-layer', {
|
|
81
|
+
code: lambda.Code.fromAsset('./packages/microapps-router/templates/'),
|
|
82
|
+
});
|
|
83
|
+
if (autoDeleteEverything) {
|
|
84
|
+
routerDataFiles.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
|
|
85
|
+
}
|
|
86
|
+
routerFunc = new lambdaNodejs.NodejsFunction(this, 'microapps-router-func', {
|
|
87
|
+
entry: './packages/microapps-router/src/index.ts',
|
|
88
|
+
handler: 'handler',
|
|
89
|
+
bundling: {
|
|
90
|
+
minify: true,
|
|
91
|
+
sourceMap: true,
|
|
92
|
+
},
|
|
93
|
+
layers: [routerDataFiles],
|
|
94
|
+
...routerFuncProps,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
if (autoDeleteEverything) {
|
|
98
|
+
routerFunc.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
|
|
99
|
+
}
|
|
100
|
+
const policyReadTarget = new iam.PolicyStatement({
|
|
101
|
+
effect: iam.Effect.ALLOW,
|
|
102
|
+
actions: ['s3:GetObject'],
|
|
103
|
+
resources: [`${bucketApps.bucketArn}/*`],
|
|
104
|
+
});
|
|
105
|
+
for (const router of [routerFunc]) {
|
|
106
|
+
router.addToRolePolicy(policyReadTarget);
|
|
107
|
+
// Give the Router access to DynamoDB table
|
|
108
|
+
table.grantReadData(router);
|
|
109
|
+
table.grant(router, 'dynamodb:DescribeTable');
|
|
110
|
+
}
|
|
111
|
+
// TODO: Add Last Route for /*/{proxy+}
|
|
112
|
+
// Note: That might not work, may need a Behavior in CloudFront
|
|
113
|
+
// or a Lambda @ Edge function that detects these and routes
|
|
114
|
+
// to origin Lambda Router function.
|
|
115
|
+
//
|
|
116
|
+
// APIGateway domain names for CloudFront and origin
|
|
117
|
+
//
|
|
118
|
+
// Create Custom Domains for API Gateway
|
|
119
|
+
const dnAppsEdge = new apigwy.DomainName(this, 'microapps-apps-edge-dn', {
|
|
120
|
+
domainName: domainNameEdge,
|
|
121
|
+
certificate: certOrigin,
|
|
122
|
+
});
|
|
123
|
+
if (autoDeleteEverything) {
|
|
124
|
+
dnAppsEdge.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
|
|
125
|
+
}
|
|
126
|
+
this._dnAppsOrigin = new apigwy.DomainName(this, 'microapps-apps-origin-dn', {
|
|
127
|
+
domainName: domainNameOrigin,
|
|
128
|
+
certificate: certOrigin,
|
|
129
|
+
});
|
|
130
|
+
if (autoDeleteEverything) {
|
|
131
|
+
this._dnAppsOrigin.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
|
|
132
|
+
}
|
|
133
|
+
// Create an integration for the Router
|
|
134
|
+
// Do this here since it's the default route
|
|
135
|
+
const intRouter = new apigwyint.LambdaProxyIntegration({
|
|
136
|
+
handler: routerFunc,
|
|
137
|
+
});
|
|
138
|
+
// Create APIGateway for the Edge name
|
|
139
|
+
const httpApiDomainMapping = {
|
|
140
|
+
domainName: dnAppsEdge,
|
|
141
|
+
};
|
|
142
|
+
const httpApi = new apigwy.HttpApi(this, 'microapps-api', {
|
|
143
|
+
defaultDomainMapping: httpApiDomainMapping,
|
|
144
|
+
defaultIntegration: intRouter,
|
|
145
|
+
apiName: apigatewayName,
|
|
146
|
+
});
|
|
147
|
+
if (autoDeleteEverything) {
|
|
148
|
+
httpApi.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
|
|
149
|
+
}
|
|
150
|
+
// Add default route on API Gateway to point to the router
|
|
151
|
+
// httpApi.addRoutes({
|
|
152
|
+
// path: '$default',
|
|
153
|
+
// integration: intRouter,
|
|
154
|
+
// });
|
|
155
|
+
//
|
|
156
|
+
// Let API Gateway accept requests using domainNameOrigin
|
|
157
|
+
// That is the origin URI that CloudFront uses for this gateway.
|
|
158
|
+
// The gateway will refuse the traffic if it doesn't have the
|
|
159
|
+
// domain name registered.
|
|
160
|
+
//
|
|
161
|
+
const mappingAppsApis = new apigwy.ApiMapping(this, 'microapps-api-mapping-origin', {
|
|
162
|
+
api: httpApi,
|
|
163
|
+
domainName: this.dnAppsOrigin,
|
|
164
|
+
});
|
|
165
|
+
mappingAppsApis.node.addDependency(this.dnAppsOrigin);
|
|
166
|
+
if (autoDeleteEverything) {
|
|
167
|
+
mappingAppsApis.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
|
|
168
|
+
}
|
|
169
|
+
//
|
|
46
170
|
// Deployer Lambda Function
|
|
47
171
|
//
|
|
48
172
|
// Create Deployer Lambda Function
|
|
@@ -57,7 +181,7 @@ class MicroAppsSvcs extends cdk.Construct {
|
|
|
57
181
|
timeout: cdk.Duration.seconds(15),
|
|
58
182
|
environment: {
|
|
59
183
|
NODE_ENV: appEnv,
|
|
60
|
-
|
|
184
|
+
APIGWY_ID: httpApi.httpApiId,
|
|
61
185
|
DATABASE_TABLE_NAME: table.tableName,
|
|
62
186
|
FILESTORE_STAGING_BUCKET: bucketAppsStagingName,
|
|
63
187
|
FILESTORE_DEST_BUCKET: bucketAppsName,
|
|
@@ -83,7 +207,7 @@ class MicroAppsSvcs extends cdk.Construct {
|
|
|
83
207
|
}
|
|
84
208
|
else {
|
|
85
209
|
deployerFunc = new lambdaNodejs.NodejsFunction(this, 'microapps-deployer-func', {
|
|
86
|
-
entry: './
|
|
210
|
+
entry: './packages/microapps-deployer/src/index.ts',
|
|
87
211
|
handler: 'handler',
|
|
88
212
|
bundling: {
|
|
89
213
|
minify: true,
|
|
@@ -243,125 +367,6 @@ class MicroAppsSvcs extends cdk.Construct {
|
|
|
243
367
|
});
|
|
244
368
|
deployerFunc.addToRolePolicy(policyAssumeUpload);
|
|
245
369
|
//
|
|
246
|
-
// Router Lambda Function
|
|
247
|
-
//
|
|
248
|
-
// Create Router Lambda Function
|
|
249
|
-
let routerFunc;
|
|
250
|
-
const routerFuncProps = {
|
|
251
|
-
functionName: `${assetNameRoot}-router${assetNameSuffix}`,
|
|
252
|
-
memorySize: 1024,
|
|
253
|
-
logRetention: logs.RetentionDays.ONE_MONTH,
|
|
254
|
-
runtime: lambda.Runtime.NODEJS_14_X,
|
|
255
|
-
timeout: cdk.Duration.seconds(15),
|
|
256
|
-
environment: {
|
|
257
|
-
NODE_ENV: appEnv,
|
|
258
|
-
DATABASE_TABLE_NAME: table.tableName,
|
|
259
|
-
AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1',
|
|
260
|
-
},
|
|
261
|
-
};
|
|
262
|
-
if (fs_1.existsSync(`${path.resolve(__dirname)}/../dist/microapps-router/index.js`)) {
|
|
263
|
-
// This is for local dev
|
|
264
|
-
routerFunc = new lambda.Function(this, 'microapps-router-func', {
|
|
265
|
-
code: lambda.Code.fromAsset(`${path.resolve(__dirname)}/../dist/microapps-router/`),
|
|
266
|
-
handler: 'index.handler',
|
|
267
|
-
...routerFuncProps,
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
else if (fs_1.existsSync(`${path.resolve(__dirname)}/microapps-router/index.js`)) {
|
|
271
|
-
// This is for built apps packaged with the CDK construct
|
|
272
|
-
routerFunc = new lambda.Function(this, 'microapps-router-func', {
|
|
273
|
-
code: lambda.Code.fromAsset(`${path.resolve(__dirname)}/microapps-router/`),
|
|
274
|
-
handler: 'index.handler',
|
|
275
|
-
...routerFuncProps,
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
else {
|
|
279
|
-
// Create Router Lambda Layer
|
|
280
|
-
const routerDataFiles = new lambda.LayerVersion(this, 'microapps-router-layer', {
|
|
281
|
-
code: lambda.Code.fromAsset('./src/microapps-router/templates/'),
|
|
282
|
-
});
|
|
283
|
-
if (autoDeleteEverything) {
|
|
284
|
-
routerDataFiles.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
|
|
285
|
-
}
|
|
286
|
-
routerFunc = new lambdaNodejs.NodejsFunction(this, 'microapps-router-func', {
|
|
287
|
-
entry: './src/microapps-router/src/index.ts',
|
|
288
|
-
handler: 'handler',
|
|
289
|
-
bundling: {
|
|
290
|
-
minify: true,
|
|
291
|
-
sourceMap: true,
|
|
292
|
-
},
|
|
293
|
-
layers: [routerDataFiles],
|
|
294
|
-
...routerFuncProps,
|
|
295
|
-
});
|
|
296
|
-
}
|
|
297
|
-
if (autoDeleteEverything) {
|
|
298
|
-
routerFunc.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
|
|
299
|
-
}
|
|
300
|
-
const policyReadTarget = new iam.PolicyStatement({
|
|
301
|
-
effect: iam.Effect.ALLOW,
|
|
302
|
-
actions: ['s3:GetObject'],
|
|
303
|
-
resources: [`${bucketApps.bucketArn}/*`],
|
|
304
|
-
});
|
|
305
|
-
for (const router of [routerFunc]) {
|
|
306
|
-
router.addToRolePolicy(policyReadTarget);
|
|
307
|
-
// Give the Router access to DynamoDB table
|
|
308
|
-
table.grantReadData(router);
|
|
309
|
-
table.grant(router, 'dynamodb:DescribeTable');
|
|
310
|
-
}
|
|
311
|
-
// TODO: Add Last Route for /*/{proxy+}
|
|
312
|
-
// Note: That might not work, may need a Behavior in CloudFront
|
|
313
|
-
// or a Lambda @ Edge function that detects these and routes
|
|
314
|
-
// to origin Lambda Router function.
|
|
315
|
-
//
|
|
316
|
-
// APIGateway domain names for CloudFront and origin
|
|
317
|
-
//
|
|
318
|
-
// Create Custom Domains for API Gateway
|
|
319
|
-
const dnAppsEdge = new apigwy.DomainName(this, 'microapps-apps-edge-dn', {
|
|
320
|
-
domainName: domainNameEdge,
|
|
321
|
-
certificate: certOrigin,
|
|
322
|
-
});
|
|
323
|
-
if (autoDeleteEverything) {
|
|
324
|
-
dnAppsEdge.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
|
|
325
|
-
}
|
|
326
|
-
this._dnAppsOrigin = new apigwy.DomainName(this, 'microapps-apps-origin-dn', {
|
|
327
|
-
domainName: domainNameOrigin,
|
|
328
|
-
certificate: certOrigin,
|
|
329
|
-
});
|
|
330
|
-
if (autoDeleteEverything) {
|
|
331
|
-
this._dnAppsOrigin.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
|
|
332
|
-
}
|
|
333
|
-
// Create an integration for the Router
|
|
334
|
-
// Do this here since it's the default route
|
|
335
|
-
const intRouter = new apigwyint.LambdaProxyIntegration({
|
|
336
|
-
handler: routerFunc,
|
|
337
|
-
});
|
|
338
|
-
// Create APIGateway for the Edge name
|
|
339
|
-
const httpApiDomainMapping = {
|
|
340
|
-
domainName: dnAppsEdge,
|
|
341
|
-
};
|
|
342
|
-
const httpApi = new apigwy.HttpApi(this, 'microapps-api', {
|
|
343
|
-
defaultDomainMapping: httpApiDomainMapping,
|
|
344
|
-
defaultIntegration: intRouter,
|
|
345
|
-
apiName: apigatewayName,
|
|
346
|
-
});
|
|
347
|
-
if (autoDeleteEverything) {
|
|
348
|
-
httpApi.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
|
|
349
|
-
}
|
|
350
|
-
//
|
|
351
|
-
// Let API Gateway accept requests using domainNameOrigin
|
|
352
|
-
// That is the origin URI that CloudFront uses for this gateway.
|
|
353
|
-
// The gateway will refuse the traffic if it doesn't have the
|
|
354
|
-
// domain name registered.
|
|
355
|
-
//
|
|
356
|
-
const mappingAppsApis = new apigwy.ApiMapping(this, 'microapps-api-mapping-origin', {
|
|
357
|
-
api: httpApi,
|
|
358
|
-
domainName: this.dnAppsOrigin,
|
|
359
|
-
});
|
|
360
|
-
mappingAppsApis.node.addDependency(this.dnAppsOrigin);
|
|
361
|
-
if (autoDeleteEverything) {
|
|
362
|
-
mappingAppsApis.applyRemovalPolicy(cdk.RemovalPolicy.DESTROY);
|
|
363
|
-
}
|
|
364
|
-
//
|
|
365
370
|
// Give Deployer permissions to create routes and integrations
|
|
366
371
|
// on the API Gateway API.
|
|
367
372
|
//
|
|
@@ -417,4 +422,4 @@ class MicroAppsSvcs extends cdk.Construct {
|
|
|
417
422
|
}
|
|
418
423
|
}
|
|
419
424
|
exports.MicroAppsSvcs = MicroAppsSvcs;
|
|
420
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWljcm9BcHBzU3Zjcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9NaWNyb0FwcHNTdmNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJCQUFnQztBQUNoQyw2QkFBNkI7QUFDN0Isb0RBQW9EO0FBQ3BELG9FQUFvRTtBQUVwRSxrREFBa0Q7QUFDbEQsd0NBQXdDO0FBQ3hDLDhDQUE4QztBQUM5QywyREFBMkQ7QUFDM0QsMENBQTBDO0FBQzFDLDRDQUE0QztBQUM1QywyREFBMkQ7QUFDM0Qsc0NBQXNDO0FBQ3RDLHFDQUFxQztBQWtDckMsTUFBYSxhQUFjLFNBQVEsR0FBRyxDQUFDLFNBQVM7SUFNOUMsWUFBWSxLQUFvQixFQUFFLEVBQVUsRUFBRSxLQUErQjs7UUFDM0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1NBQzlDO1FBRUQsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLHFCQUFxQixFQUFFLEdBQzNGLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDbEIsTUFBTSxFQUNKLFNBQVMsRUFDVCxXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLHNCQUFzQixFQUN0QixvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLE9BQU8sRUFDUCxNQUFNLEVBQ04sYUFBYSxFQUNiLGVBQWUsR0FDaEIsR0FBRyxLQUFLLENBQUM7UUFFVixNQUFNLGNBQWMsR0FBRyxhQUFhLENBQUM7UUFFckMsRUFBRTtRQUNGLGlCQUFpQjtRQUNqQixFQUFFO1FBQ0YsTUFBTSxLQUFLLEdBQUcsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSx3QkFBd0IsRUFBRTtZQUMvRCxTQUFTLEVBQUUs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NUIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUNoQyxJQUFJLFVBQVUsQ0FBQyw0QkFBNEIsQ0FDekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsRUFDckMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FDeEMsQ0FDRjtTQUNGLENBQUMsQ0FBQztRQUNILElBQUksb0JBQW9CLEVBQUU7WUFDeEIsWUFBWSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDNUQ7SUFDSCxDQUFDO0lBemNELElBQVcsWUFBWTtRQUNyQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztDQXdjRjtBQTVjRCxzQ0E0Y0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGFwaWd3eSBmcm9tICdAYXdzLWNkay9hd3MtYXBpZ2F0ZXdheXYyJztcbmltcG9ydCAqIGFzIGFwaWd3eWludCBmcm9tICdAYXdzLWNkay9hd3MtYXBpZ2F0ZXdheXYyLWludGVncmF0aW9ucyc7XG5pbXBvcnQgKiBhcyBhY20gZnJvbSAnQGF3cy1jZGsvYXdzLWNlcnRpZmljYXRlbWFuYWdlcic7XG5pbXBvcnQgKiBhcyBkeW5hbW9kYiBmcm9tICdAYXdzLWNkay9hd3MtZHluYW1vZGInO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ0Bhd3MtY2RrL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ0Bhd3MtY2RrL2F3cy1sYW1iZGEnO1xuaW1wb3J0ICogYXMgbGFtYmRhTm9kZWpzIGZyb20gJ0Bhd3MtY2RrL2F3cy1sYW1iZGEtbm9kZWpzJztcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSAnQGF3cy1jZGsvYXdzLWxvZ3MnO1xuaW1wb3J0ICogYXMgcjUzIGZyb20gJ0Bhd3MtY2RrL2F3cy1yb3V0ZTUzJztcbmltcG9ydCAqIGFzIHI1M3RhcmdldHMgZnJvbSAnQGF3cy1jZGsvYXdzLXJvdXRlNTMtdGFyZ2V0cyc7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdAYXdzLWNkay9hd3MtczMnO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ0Bhd3MtY2RrL2NvcmUnO1xuaW1wb3J0IHsgSU1pY3JvQXBwc0NGRXhwb3J0cyB9IGZyb20gJy4vTWljcm9BcHBzQ0YnO1xuaW1wb3J0IHsgSU1pY3JvQXBwc1MzRXhwb3J0cyB9IGZyb20gJy4vTWljcm9BcHBzUzMnO1xuXG5pbnRlcmZhY2UgTWljcm9BcHBzU3Zjc1N0YWNrUHJvcHMgZXh0ZW5kcyBjZGsuUmVzb3VyY2VQcm9wcyB7XG4gIHJlYWRvbmx5IGNmU3RhY2tFeHBvcnRzOiBJTWljcm9BcHBzQ0ZFeHBvcnRzO1xuICByZWFkb25seSBzM0V4cG9ydHM6IElNaWNyb0FwcHNTM0V4cG9ydHM7XG5cbiAgcmVhZG9ubHkgYXBwRW52OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGF1dG9EZWxldGVFdmVyeXRoaW5nOiBib29sZWFuO1xuICByZWFkb25seSByZXZlcnNlRG9tYWluTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBkb21haW5OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRvbWFpbk5hbWVFZGdlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRvbWFpbk5hbWVPcmlnaW46IHN0cmluZztcblxuICByZWFkb25seSBhc3NldE5hbWVSb290OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFzc2V0TmFtZVN1ZmZpeDogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IGNlcnRPcmlnaW46IGFjbS5JQ2VydGlmaWNhdGU7XG5cbiAgcmVhZG9ubHkgcjUzWm9uZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgcjUzWm9uZUlEOiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgczNQb2xpY3lCeXBhc3NBUk9BOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHMzUG9saWN5QnlwYXNzUm9sZU5hbWU6IHN0cmluZztcblxuICByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNaWNyb0FwcHNTdmNzRXhwb3J0cyB7XG4gIHJlYWRvbmx5IGRuQXBwc09yaWdpbjogYXBpZ3d5LkRvbWFpbk5hbWU7XG59XG5cbmV4cG9ydCBjbGFzcyBNaWNyb0FwcHNTdmNzIGV4dGVuZHMgY2RrLkNvbnN0cnVjdCBpbXBsZW1lbnRzIElNaWNyb0FwcHNTdmNzRXhwb3J0cyB7XG4gIHByaXZhdGUgX2RuQXBwc09yaWdpbjogYXBpZ3d5LkRvbWFpbk5hbWU7XG4gIHB1YmxpYyBnZXQgZG5BcHBzT3JpZ2luKCk6IGFwaWd3eS5Eb21haW5OYW1lIHtcbiAgICByZXR1cm4gdGhpcy5fZG5BcHBzT3JpZ2luO1xuICB9XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IGNkay5Db25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogTWljcm9BcHBzU3Zjc1N0YWNrUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgaWYgKHByb3BzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJvcHMgY2Fubm90IGJlIHVuZGVmaW5lZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgYnVja2V0QXBwcywgYnVja2V0QXBwc05hbWUsIGJ1Y2tldEFwcHNPQUksIGJ1Y2tldEFwcHNTdGFnaW5nLCBidWNrZXRBcHBzU3RhZ2luZ05hbWUgfSA9XG4gICAgICBwcm9wcy5zM0V4cG9ydHM7XG4gICAgY29uc3Qge1xuICAgICAgcjUzWm9uZUlELFxuICAgICAgcjUzWm9uZU5hbWUsXG4gICAgICBzM1BvbGljeUJ5cGFzc0FST0EsXG4gICAgICBzM1BvbGljeUJ5cGFzc1JvbGVOYW1lLFxuICAgICAgYXV0b0RlbGV0ZUV2ZXJ5dGhpbmcsXG4gICAgICBhcHBFbnYsXG4gICAgICBkb21haW5OYW1lRWRnZSxcbiAgICAgIGRvbWFpbk5hbWVPcmlnaW4sXG4gICAgICBjZXJ0T3JpZ2luLFxuICAgICAgYWNjb3VudCxcbiAgICAgIHJlZ2lvbixcbiAgICAgIGFzc2V0TmFtZVJvb3QsXG4gICAgICBhc3NldE5hbWVTdWZmaXgsXG4gICAgfSA9IHByb3BzO1xuXG4gICAgY29uc3QgYXBpZ2F0ZXdheU5hbWUgPSBhc3NldE5hbWVSb290O1xuXG4gICAgLy9cbiAgICAvLyBEeW5hbW9EQiBUYWJsZVxuICAgIC8vXG4gICAgY29uc3QgdGFibGUgPSBuZXcgZHluYW1vZGIuVGFibGUodGhpcywgJ21pY3JvYXBwcy1yb3V0ZXItdGFibGUnLCB7XG4gICAgICB0YWJsZU5hbWU6IGAke2Fzc2V0TmFtZVJvb3R9JHthc3NldE5hbWVTdWZmaXh9YCxcbiAgICAgIGJpbGxpbmdNb2RlOiBkeW5hbW9kYi5CaWxsaW5nTW9kZS5QQVlfUEVSX1JFUVVFU1QsXG4gICAgICBwYXJ0aXRpb25LZXk6IHtcbiAgICAgICAgbmFtZTogJ1BLJyxcbiAgICAgICAgdHlwZTogZHluYW1vZGIuQXR0cmlidXRlVHlwZS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAgc29ydEtleToge1xuICAgICAgICBuYW1lOiAnU0snLFxuICAgICAgICB0eXBlOiBkeW5hbW9kYi5BdHRyaWJ1dGVUeXBlLlNUUklORyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICB0YWJsZS5hcHBseVJlbW92YWxQb2xpY3koY2RrLlJlbW92YWxQb2xpY3kuREVTVFJPWSk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBEZXBsb3llciBMYW1iZGEgRnVuY3Rpb25cbiAgICAvL1xuXG4gICAgLy8gQ3JlYXRlIERlcGxveWVyIExhbWJkYSBGdW5jdGlvblxuICAgIGNvbnN0IGlhbVJvbGVVcGxvYWROYW1lID0gYCR7YXNzZXROYW1lUm9vdH0tZGVwbG95ZXItdXBsb2FkJHthc3NldE5hbWVTdWZmaXh9YDtcbiAgICBjb25zdCBkZXBsb3llckZ1bmNOYW1lID0gYCR7YXNzZXROYW1lUm9vdH0tZGVwbG95ZXIke2Fzc2V0TmFtZVN1ZmZpeH1gO1xuICAgIGxldCBkZXBsb3llckZ1bmM6IGxhbWJkYS5GdW5jdGlvbjtcbiAgICBjb25zdCBkZXBsb3llckZ1bmNQcm9wczogT21pdDxsYW1iZGEuRnVuY3Rpb25Qcm9wcywgJ2hhbmRsZXInIHwgJ2NvZGUnPiA9IHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogZGVwbG95ZXJGdW5jTmFtZSxcbiAgICAgIG1lbW9yeVNpemU6IDEwMjQsXG4gICAgICBsb2dSZXRlbnRpb246IGxvZ3MuUmV0ZW50aW9uRGF5cy5PTkVfTU9OVEgsXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTRfWCxcbiAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDE1KSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIE5PREVfRU5WOiBhcHBFbnYsXG4gICAgICAgIEFQSUdXWV9OQU1FOiBhcGlnYXRld2F5TmFtZSxcbiAgICAgICAgREFUQUJBU0VfVEFCTEVfTkFNRTogdGFibGUudGFibGVOYW1lLFxuICAgICAgICBGSUxFU1RPUkVfU1RBR0lOR19CVUNLRVQ6IGJ1Y2tldEFwcHNTdGFnaW5nTmFtZSxcbiAgICAgICAgRklMRVNUT1JFX0RFU1RfQlVDS0VUOiBidWNrZXRBcHBzTmFtZSxcbiAgICAgICAgVVBMT0FEX1JPTEVfTkFNRTogaWFtUm9sZVVwbG9hZE5hbWUsXG4gICAgICAgIEFXU19OT0RFSlNfQ09OTkVDVElPTl9SRVVTRV9FTkFCTEVEOiAnMScsXG4gICAgICB9LFxuICAgIH07XG4gICAgaWYgKGV4aXN0c1N5bmMoYCR7cGF0aC5yZXNvbHZlKF9fZGlybmFtZSl9Ly4uL2Rpc3QvbWljcm9hcHBzLWRlcGxveWVyL2luZGV4LmpzYCkpIHtcbiAgICAgIC8vIFRoaXMgaXMgZm9yIGxvY2FsIGRldlxuICAgICAgZGVwbG95ZXJGdW5jID0gbmV3IGxhbWJkYS5GdW5jdGlvbih0aGlzLCAnbWljcm9hcHBzLWRlcGxveWVyLWZ1bmMnLCB7XG4gICAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChgJHtwYXRoLnJlc29sdmUoX19kaXJuYW1lKX0vLi4vZGlzdC9taWNyb2FwcHMtZGVwbG95ZXIvYCksXG4gICAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgICAgLi4uZGVwbG95ZXJGdW5jUHJvcHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGV4aXN0c1N5bmMoYCR7cGF0aC5yZXNvbHZlKF9fZGlybmFtZSl9L21pY3JvYXBwcy1kZXBsb3llci9pbmRleC5qc2ApKSB7XG4gICAgICAvLyBUaGlzIGlzIGZvciBidWlsdCBhcHBzIHBhY2thZ2VkIHdpdGggdGhlIENESyBjb25zdHJ1Y3RcbiAgICAgIGRlcGxveWVyRnVuYyA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgJ21pY3JvYXBwcy1kZXBsb3llci1mdW5jJywge1xuICAgICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQoYCR7cGF0aC5yZXNvbHZlKF9fZGlybmFtZSl9L21pY3JvYXBwcy1kZXBsb3llci9gKSxcbiAgICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgICAuLi5kZXBsb3llckZ1bmNQcm9wcyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXBsb3llckZ1bmMgPSBuZXcgbGFtYmRhTm9kZWpzLk5vZGVqc0Z1bmN0aW9uKHRoaXMsICdtaWNyb2FwcHMtZGVwbG95ZXItZnVuYycsIHtcbiAgICAgICAgZW50cnk6ICcuL3NyYy9taWNyb2FwcHMtZGVwbG95ZXIvc3JjL2luZGV4LnRzJyxcbiAgICAgICAgaGFuZGxlcjogJ2hhbmRsZXInLFxuICAgICAgICBidW5kbGluZzoge1xuICAgICAgICAgIG1pbmlmeTogdHJ1ZSxcbiAgICAgICAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmRlcGxveWVyRnVuY1Byb3BzLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChhdXRvRGVsZXRlRXZlcnl0aGluZykge1xuICAgICAgZGVwbG95ZXJGdW5jLmFwcGx5UmVtb3ZhbFBvbGljeShjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcbiAgICB9XG4gICAgLy8gR2l2ZSB0aGUgRGVwbG95ZXIgYWNjZXNzIHRvIER5bmFtb0RCIHRhYmxlXG4gICAgdGFibGUuZ3JhbnRSZWFkV3JpdGVEYXRhKGRlcGxveWVyRnVuYyk7XG4gICAgdGFibGUuZ3JhbnQoZGVwbG95ZXJGdW5jLCAnZHluYW1vZGI6RGVzY3JpYmVUYWJsZScpO1xuXG4gICAgLy9cbiAgICAvLyBEZWxveWVyIHVwbG9hZCB0ZW1wIHJvbGVcbiAgICAvLyBEZXBsb3llciBhc3N1bWVzIHRoaXMgcm9sZSB3aXRoIGEgbGltaXRlZCBwb2xpY3kgdG8gZ2VuZXJhdGVcbiAgICAvLyBhbiBTVFMgdGVtcCB0b2tlbiB0byByZXR1cm4gdG8gbWljcm9hcHBzLXB1Ymxpc2ggZm9yIHRoZSB1cGxvYWQuXG4gICAgLy9cbiAgICBjb25zdCBpYW1Sb2xlVXBsb2FkID0gbmV3IGlhbS5Sb2xlKHRoaXMsICdtaWNyb2FwcHMtZGVwbG95ZXItdXBsb2FkLXJvbGUnLCB7XG4gICAgICByb2xlTmFtZTogaWFtUm9sZVVwbG9hZE5hbWUsXG4gICAgICBpbmxpbmVQb2xpY2llczoge1xuICAgICAgICB1cGxvYWRQb2xpY3k6IG5ldyBpYW0uUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgYWN0aW9uczogWydzMzpMaXN0QnVja2V0J10sXG4gICAgICAgICAgICAgIHJlc291cmNlczogW2J1Y2tldEFwcHNTdGFnaW5nLmJ1Y2tldEFybl0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgYWN0aW9uczogWydzMzpQdXRPYmplY3QnLCAnczM6R2V0T2JqZWN0JywgJ3MzOkFib3J0TXVsdGlwYXJ0VXBsb2FkJ10sXG4gICAgICAgICAgICAgIHJlc291cmNlczogW2Ake2J1Y2tldEFwcHNTdGFnaW5nLmJ1Y2tldEFybn0vKmBdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgICAgYXNzdW1lZEJ5OiBkZXBsb3llckZ1bmMuZ3JhbnRQcmluY2lwYWwsXG4gICAgfSk7XG5cbiAgICAvL1xuICAgIC8vIFVwZGF0ZSBTMyBwZXJtaXNzaW9uc1xuICAgIC8vXG4gICAgLy8gRGVueSBhcHBzIGZyb20gcmVhZGluZzpcbiAgICAvLyAtIElmIHRoZXkgYXJlIG1pc3NpbmcgdGhlIG1pY3JvYXBwLW5hbWUgdGFnXG4gICAgLy8gLSBBbnl0aGluZyBvdXRzaWRlIG9mIHRoZSBmb2xkZXIgdGhhdCBtYXRjaGVzIHRoZWlyIG1pY3JvYXBwLW5hbWUgdGFnXG4gICAgY29uc3QgcG9saWN5RGVueVByZWZpeE91dHNpZGVUYWcgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBzaWQ6ICdkZW55LXByZWZpeC1vdXRzaWRlLW1pY3JvYXBwLW5hbWUtdGFnJyxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5ERU5ZLFxuICAgICAgYWN0aW9uczogWydzMzoqJ10sXG4gICAgICBub3RQcmluY2lwYWxzOiBbXG4gICAgICAgIG5ldyBpYW0uQ2Fub25pY2FsVXNlclByaW5jaXBhbChcbiAgICAgICAgICBidWNrZXRBcHBzT0FJLmNsb3VkRnJvbnRPcmlnaW5BY2Nlc3NJZGVudGl0eVMzQ2Fub25pY2FsVXNlcklkLFxuICAgICAgICApLFxuICAgICAgICBuZXcgaWFtLkFjY291bnRSb290UHJpbmNpcGFsKCksXG4gICAgICAgIG5ldyBpYW0uQXJuUHJpbmNpcGFsKGBhcm46YXdzOmlhbTo6JHthY2NvdW50fTpyb2xlLyR7czNQb2xpY3lCeXBhc3NSb2xlTmFtZX1gKSxcbiAgICAgICAgZGVwbG95ZXJGdW5jLmdyYW50UHJpbmNpcGFsLFxuICAgICAgICAvLyBBbGxvdyB0aGUgYnVpbGRlciB1c2VyIHRvIHVwZGF0ZSB0aGUgYnVja2V0c1xuICAgICAgICBuZXcgaWFtLkFyblByaW5jaXBhbChcbiAgICAgICAgICBgYXJuOmF3czppYW06OiR7YWNjb3VudH06dXNlci8ke2Fzc2V0TmFtZVJvb3R9LWJ1aWxkZXItJHtwcm9wcy5hcHBFbnZ9YCxcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICBub3RSZXNvdXJjZXM6IFtcbiAgICAgICAgYCR7YnVja2V0QXBwcy5idWNrZXRBcm59L1xcJHthd3M6UHJpbmNpcGFsVGFnL21pY3JvYXBwLW5hbWV9LypgLFxuICAgICAgICBidWNrZXRBcHBzLmJ1Y2tldEFybixcbiAgICAgIF0sXG4gICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgIE51bGw6IHsgJ2F3czpQcmluY2lwYWxUYWcvbWljcm9hcHAtbmFtZSc6ICdmYWxzZScgfSxcbiAgICAgICAgLy8gU3RyaW5nTm90TGlrZTogeydhd3M6J31cbiAgICAgIH0sXG4gICAgfSk7XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICBwb2xpY3lEZW55UHJlZml4T3V0c2lkZVRhZy5hZGRDb25kaXRpb24oXG4gICAgICAgIC8vIEFsbG93cyB0aGUgRGVsZXRhYmxlQnVja2V0IExhbWJkYSB0byBkZWxldGUgaXRlbXMgaW4gdGhlIGJ1Y2tldHNcbiAgICAgICAgJ1N0cmluZ05vdExpa2UnLFxuICAgICAgICB7ICdhd3M6UHJpbmNpcGFsVGFnL2FwcGxpY2F0aW9uJzogYCR7YXNzZXROYW1lUm9vdH0tY29yZSpgIH0sXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBwb2xpY3lEZW55TWlzc2luZ1RhZyA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIHNpZDogJ2RlbnktbWlzc2luZy1taWNyb2FwcC1uYW1lLXRhZycsXG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuREVOWSxcbiAgICAgIGFjdGlvbnM6IFsnczM6KiddLFxuICAgICAgbm90UHJpbmNpcGFsczogW1xuICAgICAgICBuZXcgaWFtLkNhbm9uaWNhbFVzZXJQcmluY2lwYWwoXG4gICAgICAgICAgYnVja2V0QXBwc09BSS5jbG91ZEZyb250T3JpZ2luQWNjZXNzSWRlbnRpdHlTM0Nhbm9uaWNhbFVzZXJJZCxcbiAgICAgICAgKSxcbiAgICAgICAgbmV3IGlhbS5BY2NvdW50Um9vdFByaW5jaXBhbCgpLFxuICAgICAgICBuZXcgaWFtLkFyblByaW5jaXBhbChgYXJuOmF3czppYW06OiR7YWNjb3VudH06cm9sZS8ke3MzUG9saWN5QnlwYXNzUm9sZU5hbWV9YCksXG4gICAgICAgIGRlcGxveWVyRnVuYy5ncmFudFByaW5jaXBhbCxcbiAgICAgICAgbmV3IGlhbS5Bcm5QcmluY2lwYWwoXG4gICAgICAgICAgYGFybjphd3M6c3RzOjoke2FjY291bnR9OmFzc3VtZWQtcm9sZS8ke2RlcGxveWVyRnVuYz8ucm9sZT8ucm9sZU5hbWV9LyR7ZGVwbG95ZXJGdW5jLmZ1bmN0aW9uTmFtZX1gLFxuICAgICAgICApLFxuICAgICAgICAvLyBBbGxvdyB0aGUgYnVpbGRlciB1c2VyIHRvIHVwZGF0ZSB0aGUgYnVja2V0c1xuICAgICAgICBuZXcgaWFtLkFyblByaW5jaXBhbChcbiAgICAgICAgICBgYXJuOmF3czppYW06OiR7YWNjb3VudH06dXNlci8ke2Fzc2V0TmFtZVJvb3R9LWJ1aWxkZXItJHtwcm9wcy5hcHBFbnZ9YCxcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICByZXNvdXJjZXM6IFtgJHtidWNrZXRBcHBzLmJ1Y2tldEFybn0vKmAsIGJ1Y2tldEFwcHMuYnVja2V0QXJuXSxcbiAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgTnVsbDogeyAnYXdzOlByaW5jaXBhbFRhZy9taWNyb2FwcC1uYW1lJzogJ3RydWUnIH0sXG4gICAgICAgIC8vIE5vdGU6IFRoaXMgQVJPQSBtdXN0IGJlIHNwZWNpZmllZCB0byBwcmV2ZW50IHRoaXMgcG9saWN5IGZyb20gbG9ja2luZ1xuICAgICAgICAvLyBvdXQgbm9uLXJvb3Qgc2Vzc2lvbnMgdGhhdCBoYXZlIGFzc3VtZWQgdGhlIGFkbWluIHJvbGUuXG4gICAgICAgIC8vIFRoZSBub3RQcmluY2lwYWxzIHdpbGwgb25seSBtYXRjaCB0aGUgcm9sZSBuYW1lIGV4YWN0bHkgYW5kIHdpbGwgbm90IG1hdGNoXG4gICAgICAgIC8vIGFueSBzZXNzaW9uIHRoYXQgaGFzIGFzc3VtZWQgdGhlIHJvbGUgc2luY2Ugbm90UHJpbmNpcGFscyBkb2VzIG5vdCBhbGxvd1xuICAgICAgICAvLyB3aWxkY2FyZCBtYXRjaGVzIGFuZCBkb2VzIG5vdCBkbyB0aGVtIGltcGxpY2l0bHkgZWl0aGVyLlxuICAgICAgICAvLyBUaGUgQVJPQSBtdXN0IGJlIHVhc2VkIGJlY2F1c2UgdGhlcmUgYXJlIG9ubHkgMyBQcmluY2lwYWwgdmFyaWFibGVzOlxuICAgICAgICAvLyAgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc192YXJpYWJsZXMuaHRtbCNwcmluY2lwYWx0YWJsZVxuICAgICAgICAvLyAgYXdzOnVzZXJuYW1lLCBhd3M6dXNlcmlkLCBhd3M6UHJpbmNpcGFsVGFnXG4gICAgICAgIC8vIEZvciBhbiBhc3N1bWVkIHJvbGUsIGF3czp1c2VybmFtZSBpcyBibGFuaywgYXdzOnVzZXJpZCBpczpcbiAgICAgICAgLy8gIFt1bmlxdWUgaWQgQUtBIEFST0EgZm9yIFJvbGVdOltzZXNzaW9uIG5hbWVdXG4gICAgICAgIC8vIFRhYmxlIG9mIHVuaXF1ZSBJRCBwcmVmaXhlcyBzdWNoIGFzIEFST0E6XG4gICAgICAgIC8vICBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX2lkZW50aWZpZXJzLmh0bWwjaWRlbnRpZmllcnMtcHJlZml4ZXNcbiAgICAgICAgLy8gVGhlIG5hbWUgb2YgdGhlIHJvbGUgaXMgc2ltcGx5IG5vdCBhdmFpbGFibGUgYW5kIGlmIGl0IHdhc1xuICAgICAgICAvLyB3ZSdkIG5lZWQgdG8gd3JpdGUgYSBjb21wbGljYXRlZCBjb21wYXJpc29uIHRvIG1ha2Ugc3VyZVxuICAgICAgICAvLyB0aGF0IHdlIGRpZG4ndCBleGNsdWRlIHRoZSBEZW55IHRhZyBmcm9tIHJvbGVzIGluIG90aGVyIGFjY291bnRzLlxuICAgICAgICBTdHJpbmdOb3RMaWtlOiB7ICdhd3M6dXNlcmlkJzogW2Ake3MzUG9saWN5QnlwYXNzQVJPQX06KmAsIGFjY291bnRdIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGlmIChhdXRvRGVsZXRlRXZlcnl0aGluZykge1xuICAgICAgcG9saWN5RGVueU1pc3NpbmdUYWcuYWRkQ29uZGl0aW9uKFxuICAgICAgICAvLyBBbGxvd3MgdGhlIERlbGV0YWJsZUJ1Y2tldCBMYW1iZGEgdG8gZGVsZXRlIGl0ZW1zIGluIHRoZSBidWNrZXRzXG4gICAgICAgICdTdHJpbmdOb3RMaWtlJyxcbiAgICAgICAgeyAnYXdzOlByaW5jaXBhbFRhZy9hcHBsaWNhdGlvbic6IGAke2Fzc2V0TmFtZVJvb3R9LWNvcmUqYCB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgcG9saWN5Q2xvdWRGcm9udEFjY2VzcyA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIHNpZDogJ2Nsb3VkZnJvbnQtb2FpLWFjY2VzcycsXG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ3MzOkdldE9iamVjdCddLFxuICAgICAgcHJpbmNpcGFsczogW1xuICAgICAgICBuZXcgaWFtLkNhbm9uaWNhbFVzZXJQcmluY2lwYWwoXG4gICAgICAgICAgYnVja2V0QXBwc09BSS5jbG91ZEZyb250T3JpZ2luQWNjZXNzSWRlbnRpdHlTM0Nhbm9uaWNhbFVzZXJJZCxcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICByZXNvdXJjZXM6IFtgJHtidWNrZXRBcHBzLmJ1Y2tldEFybn0vKmBdLFxuICAgIH0pO1xuICAgIGlmIChidWNrZXRBcHBzLnBvbGljeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBkb2N1bWVudCA9IG5ldyBzMy5CdWNrZXRQb2xpY3kodGhpcywgJ0NGUG9saWN5Jywge1xuICAgICAgICBidWNrZXQ6IGJ1Y2tldEFwcHMsXG4gICAgICB9KS5kb2N1bWVudDtcbiAgICAgIGRvY3VtZW50LmFkZFN0YXRlbWVudHMocG9saWN5Q2xvdWRGcm9udEFjY2Vzcyk7XG4gICAgICBkb2N1bWVudC5hZGRTdGF0ZW1lbnRzKHBvbGljeURlbnlQcmVmaXhPdXRzaWRlVGFnKTtcbiAgICAgIGRvY3VtZW50LmFkZFN0YXRlbWVudHMocG9saWN5RGVueU1pc3NpbmdUYWcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBidWNrZXRBcHBzLnBvbGljeS5kb2N1bWVudC5hZGRTdGF0ZW1lbnRzKHBvbGljeUNsb3VkRnJvbnRBY2Nlc3MpO1xuICAgICAgYnVja2V0QXBwcy5wb2xpY3kuZG9jdW1lbnQuYWRkU3RhdGVtZW50cyhwb2xpY3lEZW55UHJlZml4T3V0c2lkZVRhZyk7XG4gICAgICBidWNrZXRBcHBzLnBvbGljeS5kb2N1bWVudC5hZGRTdGF0ZW1lbnRzKHBvbGljeURlbnlNaXNzaW5nVGFnKTtcbiAgICB9XG5cbiAgICAvLyBBbGxvdyB0aGUgTGFtYmRhIHRvIHJlYWQgZnJvbSB0aGUgc3RhZ2luZyBidWNrZXRcbiAgICBjb25zdCBwb2xpY3lSZWFkTGlzdFN0YWdpbmcgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAvLyBGSVhNRTogQWxsb3cgRGVwbG95ZXIgdG8gZGVsZXRlIGZyb20gU3RhZ2luZyBidWNrZXRcbiAgICAgIGFjdGlvbnM6IFsnczM6R2V0T2JqZWN0JywgJ3MzOkxpc3RCdWNrZXQnXSxcbiAgICAgIHJlc291cmNlczogW2Ake2J1Y2tldEFwcHNTdGFnaW5nLmJ1Y2tldEFybn0vKmAsIGJ1Y2tldEFwcHNTdGFnaW5nLmJ1Y2tldEFybl0sXG4gICAgfSk7XG4gICAgZGVwbG95ZXJGdW5jLmFkZFRvUm9sZVBvbGljeShwb2xpY3lSZWFkTGlzdFN0YWdpbmcpO1xuXG4gICAgLy8gQWxsb3cgdGhlIExhbWJkYSB0byB3cml0ZSB0byB0aGUgdGFyZ2V0IGJ1Y2tldFxuICAgIGNvbnN0IHBvbGljeVJlYWRXcml0ZUxpc3RUYXJnZXQgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ3MzOkdldE9iamVjdCcsICdzMzpQdXRPYmplY3QnLCAnczM6TGlzdEJ1Y2tldCddLFxuICAgICAgcmVzb3VyY2VzOiBbYCR7YnVja2V0QXBwcy5idWNrZXRBcm59LypgLCBidWNrZXRBcHBzLmJ1Y2tldEFybl0sXG4gICAgfSk7XG4gICAgZGVwbG95ZXJGdW5jLmFkZFRvUm9sZVBvbGljeShwb2xpY3lSZWFkV3JpdGVMaXN0VGFyZ2V0KTtcblxuICAgIC8vIEFsbG93IHRoZSBkZXBsb3llciB0byBnZXQgYSB0ZW1wb3JhcnkgU1RTIHRva2VuXG4gICAgY29uc3QgcG9saWN5R2V0U1RTVG9rZW4gPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ3N0czpHZXRGZWRlcmF0aW9uVG9rZW4nXSxcbiAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgfSk7XG4gICAgZGVwbG95ZXJGdW5jLmFkZFRvUm9sZVBvbGljeShwb2xpY3lHZXRTVFNUb2tlbik7XG5cbiAgICAvLyBBbGxvdyB0aGUgZGVwbG95ZXIgdG8gYXNzdW1lIHRoZSB1cGxvYWQgcm9sZVxuICAgIGNvbnN0IHBvbGljeUFzc3VtZVVwbG9hZCA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnc3RzOkFzc3VtZVJvbGUnXSxcbiAgICAgIHJlc291cmNlczogW2lhbVJvbGVVcGxvYWQucm9sZUFybl0sXG4gICAgfSk7XG4gICAgZGVwbG95ZXJGdW5jLmFkZFRvUm9sZVBvbGljeShwb2xpY3lBc3N1bWVVcGxvYWQpO1xuXG4gICAgLy9cbiAgICAvLyBSb3V0ZXIgTGFtYmRhIEZ1bmN0aW9uXG4gICAgLy9cblxuICAgIC8vIENyZWF0ZSBSb3V0ZXIgTGFtYmRhIEZ1bmN0aW9uXG4gICAgbGV0IHJvdXRlckZ1bmM6IGxhbWJkYS5GdW5jdGlvbjtcbiAgICBjb25zdCByb3V0ZXJGdW5jUHJvcHM6IE9taXQ8bGFtYmRhLkZ1bmN0aW9uUHJvcHMsICdoYW5kbGVyJyB8ICdjb2RlJz4gPSB7XG4gICAgICBmdW5jdGlvbk5hbWU6IGAke2Fzc2V0TmFtZVJvb3R9LXJvdXRlciR7YXNzZXROYW1lU3VmZml4fWAsXG4gICAgICBtZW1vcnlTaXplOiAxMDI0LFxuICAgICAgbG9nUmV0ZW50aW9uOiBsb2dzLlJldGVudGlvbkRheXMuT05FX01PTlRILFxuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE0X1gsXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24uc2Vjb25kcygxNSksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBOT0RFX0VOVjogYXBwRW52LFxuICAgICAgICBEQVRBQkFTRV9UQUJMRV9OQU1FOiB0YWJsZS50YWJsZU5hbWUsXG4gICAgICAgIEFXU19OT0RFSlNfQ09OTkVDVElPTl9SRVVTRV9FTkFCTEVEOiAnMScsXG4gICAgICB9LFxuICAgIH07XG4gICAgaWYgKGV4aXN0c1N5bmMoYCR7cGF0aC5yZXNvbHZlKF9fZGlybmFtZSl9Ly4uL2Rpc3QvbWljcm9hcHBzLXJvdXRlci9pbmRleC5qc2ApKSB7XG4gICAgICAvLyBUaGlzIGlzIGZvciBsb2NhbCBkZXZcbiAgICAgIHJvdXRlckZ1bmMgPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsICdtaWNyb2FwcHMtcm91dGVyLWZ1bmMnLCB7XG4gICAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChgJHtwYXRoLnJlc29sdmUoX19kaXJuYW1lKX0vLi4vZGlzdC9taWNyb2FwcHMtcm91dGVyL2ApLFxuICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgIC4uLnJvdXRlckZ1bmNQcm9wcyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZXhpc3RzU3luYyhgJHtwYXRoLnJlc29sdmUoX19kaXJuYW1lKX0vbWljcm9hcHBzLXJvdXRlci9pbmRleC5qc2ApKSB7XG4gICAgICAvLyBUaGlzIGlzIGZvciBidWlsdCBhcHBzIHBhY2thZ2VkIHdpdGggdGhlIENESyBjb25zdHJ1Y3RcbiAgICAgIHJvdXRlckZ1bmMgPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsICdtaWNyb2FwcHMtcm91dGVyLWZ1bmMnLCB7XG4gICAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChgJHtwYXRoLnJlc29sdmUoX19kaXJuYW1lKX0vbWljcm9hcHBzLXJvdXRlci9gKSxcbiAgICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgICAuLi5yb3V0ZXJGdW5jUHJvcHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIFJvdXRlciBMYW1iZGEgTGF5ZXJcbiAgICAgIGNvbnN0IHJvdXRlckRhdGFGaWxlcyA9IG5ldyBsYW1iZGEuTGF5ZXJWZXJzaW9uKHRoaXMsICdtaWNyb2FwcHMtcm91dGVyLWxheWVyJywge1xuICAgICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQoJy4vc3JjL21pY3JvYXBwcy1yb3V0ZXIvdGVtcGxhdGVzLycpLFxuICAgICAgfSk7XG4gICAgICBpZiAoYXV0b0RlbGV0ZUV2ZXJ5dGhpbmcpIHtcbiAgICAgICAgcm91dGVyRGF0YUZpbGVzLmFwcGx5UmVtb3ZhbFBvbGljeShjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcbiAgICAgIH1cblxuICAgICAgcm91dGVyRnVuYyA9IG5ldyBsYW1iZGFOb2RlanMuTm9kZWpzRnVuY3Rpb24odGhpcywgJ21pY3JvYXBwcy1yb3V0ZXItZnVuYycsIHtcbiAgICAgICAgZW50cnk6ICcuL3NyYy9taWNyb2FwcHMtcm91dGVyL3NyYy9pbmRleC50cycsXG4gICAgICAgIGhhbmRsZXI6ICdoYW5kbGVyJyxcbiAgICAgICAgYnVuZGxpbmc6IHtcbiAgICAgICAgICBtaW5pZnk6IHRydWUsXG4gICAgICAgICAgc291cmNlTWFwOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBsYXllcnM6IFtyb3V0ZXJEYXRhRmlsZXNdLFxuICAgICAgICAuLi5yb3V0ZXJGdW5jUHJvcHMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICByb3V0ZXJGdW5jLmFwcGx5UmVtb3ZhbFBvbGljeShjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcbiAgICB9XG4gICAgY29uc3QgcG9saWN5UmVhZFRhcmdldCA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnczM6R2V0T2JqZWN0J10sXG4gICAgICByZXNvdXJjZXM6IFtgJHtidWNrZXRBcHBzLmJ1Y2tldEFybn0vKmBdLFxuICAgIH0pO1xuICAgIGZvciAoY29uc3Qgcm91dGVyIG9mIFtyb3V0ZXJGdW5jXSkge1xuICAgICAgcm91dGVyLmFkZFRvUm9sZVBvbGljeShwb2xpY3lSZWFkVGFyZ2V0KTtcbiAgICAgIC8vIEdpdmUgdGhlIFJvdXRlciBhY2Nlc3MgdG8gRHluYW1vREIgdGFibGVcbiAgICAgIHRhYmxlLmdyYW50UmVhZERhdGEocm91dGVyKTtcbiAgICAgIHRhYmxlLmdyYW50KHJvdXRlciwgJ2R5bmFtb2RiOkRlc2NyaWJlVGFibGUnKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBBZGQgTGFzdCBSb3V0ZSBmb3IgLyove3Byb3h5K31cbiAgICAvLyBOb3RlOiBUaGF0IG1pZ2h0IG5vdCB3b3JrLCBtYXkgbmVlZCBhIEJlaGF2aW9yIGluIENsb3VkRnJvbnRcbiAgICAvLyAgICAgICBvciBhIExhbWJkYSBAIEVkZ2UgZnVuY3Rpb24gdGhhdCBkZXRlY3RzIHRoZXNlIGFuZCByb3V0ZXNcbiAgICAvLyAgICAgICB0byBvcmlnaW4gTGFtYmRhIFJvdXRlciBmdW5jdGlvbi5cblxuICAgIC8vXG4gICAgLy8gQVBJR2F0ZXdheSBkb21haW4gbmFtZXMgZm9yIENsb3VkRnJvbnQgYW5kIG9yaWdpblxuICAgIC8vXG5cbiAgICAvLyBDcmVhdGUgQ3VzdG9tIERvbWFpbnMgZm9yIEFQSSBHYXRld2F5XG4gICAgY29uc3QgZG5BcHBzRWRnZSA9IG5ldyBhcGlnd3kuRG9tYWluTmFtZSh0aGlzLCAnbWljcm9hcHBzLWFwcHMtZWRnZS1kbicsIHtcbiAgICAgIGRvbWFpbk5hbWU6IGRvbWFpbk5hbWVFZGdlLFxuICAgICAgY2VydGlmaWNhdGU6IGNlcnRPcmlnaW4sXG4gICAgfSk7XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICBkbkFwcHNFZGdlLmFwcGx5UmVtb3ZhbFBvbGljeShjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcbiAgICB9XG4gICAgdGhpcy5fZG5BcHBzT3JpZ2luID0gbmV3IGFwaWd3eS5Eb21haW5OYW1lKHRoaXMsICdtaWNyb2FwcHMtYXBwcy1vcmlnaW4tZG4nLCB7XG4gICAgICBkb21haW5OYW1lOiBkb21haW5OYW1lT3JpZ2luLFxuICAgICAgY2VydGlmaWNhdGU6IGNlcnRPcmlnaW4sXG4gICAgfSk7XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICB0aGlzLl9kbkFwcHNPcmlnaW4uYXBwbHlSZW1vdmFsUG9saWN5KGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1kpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhbiBpbnRlZ3JhdGlvbiBmb3IgdGhlIFJvdXRlclxuICAgIC8vIERvIHRoaXMgaGVyZSBzaW5jZSBpdCdzIHRoZSBkZWZhdWx0IHJvdXRlXG4gICAgY29uc3QgaW50Um91dGVyID0gbmV3IGFwaWd3eWludC5MYW1iZGFQcm94eUludGVncmF0aW9uKHtcbiAgICAgIGhhbmRsZXI6IHJvdXRlckZ1bmMsXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgQVBJR2F0ZXdheSBmb3IgdGhlIEVkZ2UgbmFtZVxuICAgIGNvbnN0IGh0dHBBcGlEb21haW5NYXBwaW5nOiBhcGlnd3kuRG9tYWluTWFwcGluZ09wdGlvbnMgPSB7XG4gICAgICBkb21haW5OYW1lOiBkbkFwcHNFZGdlLFxuICAgIH07XG4gICAgY29uc3QgaHR0cEFwaSA9IG5ldyBhcGlnd3kuSHR0cEFwaSh0aGlzLCAnbWljcm9hcHBzLWFwaScsIHtcbiAgICAgIGRlZmF1bHREb21haW5NYXBwaW5nOiBodHRwQXBpRG9tYWluTWFwcGluZyxcbiAgICAgIGRlZmF1bHRJbnRlZ3JhdGlvbjogaW50Um91dGVyLFxuICAgICAgYXBpTmFtZTogYXBpZ2F0ZXdheU5hbWUsXG4gICAgfSk7XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICBodHRwQXBpLmFwcGx5UmVtb3ZhbFBvbGljeShjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIExldCBBUEkgR2F0ZXdheSBhY2NlcHQgcmVxdWVzdHMgdXNpbmcgZG9tYWluTmFtZU9yaWdpblxuICAgIC8vIFRoYXQgaXMgdGhlIG9yaWdpbiBVUkkgdGhhdCBDbG91ZEZyb250IHVzZXMgZm9yIHRoaXMgZ2F0ZXdheS5cbiAgICAvLyBUaGUgZ2F0ZXdheSB3aWxsIHJlZnVzZSB0aGUgdHJhZmZpYyBpZiBpdCBkb2Vzbid0IGhhdmUgdGhlXG4gICAgLy8gZG9tYWluIG5hbWUgcmVnaXN0ZXJlZC5cbiAgICAvL1xuICAgIGNvbnN0IG1hcHBpbmdBcHBzQXBpcyA9IG5ldyBhcGlnd3kuQXBpTWFwcGluZyh0aGlzLCAnbWljcm9hcHBzLWFwaS1tYXBwaW5nLW9yaWdpbicsIHtcbiAgICAgIGFwaTogaHR0cEFwaSxcbiAgICAgIGRvbWFpbk5hbWU6IHRoaXMuZG5BcHBzT3JpZ2luLFxuICAgIH0pO1xuICAgIG1hcHBpbmdBcHBzQXBpcy5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5kbkFwcHNPcmlnaW4pO1xuICAgIGlmIChhdXRvRGVsZXRlRXZlcnl0aGluZykge1xuICAgICAgbWFwcGluZ0FwcHNBcGlzLmFwcGx5UmVtb3ZhbFBvbGljeShjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIEdpdmUgRGVwbG95ZXIgcGVybWlzc2lvbnMgdG8gY3JlYXRlIHJvdXRlcyBhbmQgaW50ZWdyYXRpb25zXG4gICAgLy8gb24gdGhlIEFQSSBHYXRld2F5IEFQSS5cbiAgICAvL1xuXG4gICAgLy8gR3JhbnQgdGhlIGFiaWxpdHkgdG8gTGlzdCBhbGwgQVBJcyAod2UgaGF2ZSB0byBmaW5kIGl0KVxuICAgIGNvbnN0IHBvbGljeUFQSUxpc3QgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ2FwaWdhdGV3YXk6R0VUJ10sXG4gICAgICByZXNvdXJjZXM6IFtgYXJuOmF3czphcGlnYXRld2F5OiR7cmVnaW9ufTo6L2FwaXNgXSxcbiAgICB9KTtcbiAgICBkZXBsb3llckZ1bmMuYWRkVG9Sb2xlUG9saWN5KHBvbGljeUFQSUxpc3QpO1xuICAgIC8vIEdyYW50IGZ1bGwgY29udHJvbCBvdmVyIHRoZSBBUEkgd2UgY3JlYXRlZFxuICAgIGNvbnN0IHBvbGljeUFQSU1hbmFnZSA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnYXBpZ2F0ZXdheToqJ10sXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgYGFybjphd3M6YXBpZ2F0ZXdheToke3JlZ2lvbn06JHthY2NvdW50fToke2h0dHBBcGkuaHR0cEFwaUlkfS8qYCxcbiAgICAgICAgYGFybjphd3M6YXBpZ2F0ZXdheToke3JlZ2lvbn06Oi9hcGlzLyR7aHR0cEFwaS5odHRwQXBpSWR9L2ludGVncmF0aW9uc2AsXG4gICAgICAgIGBhcm46YXdzOmFwaWdhdGV3YXk6JHtyZWdpb259OjovYXBpcy8ke2h0dHBBcGkuaHR0cEFwaUlkfS9yb3V0ZXNgLFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBkZXBsb3llckZ1bmMuYWRkVG9Sb2xlUG9saWN5KHBvbGljeUFQSU1hbmFnZSk7XG4gICAgLy8gR3JhbnQgZnVsbCBjb250cm9sIG92ZXIgbGFtYmRhcyB0aGF0IGluZGljYXRlIHRoZXkgYXJlIG1pY3JvYXBwc1xuICAgIGNvbnN0IHBvbGljeUFQSU1hbmFnZUxhbWJkYXMgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ2xhbWJkYToqJ10sXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgYGFybjphd3M6bGFtYmRhOiR7cmVnaW9ufToke2FjY291bnR9OmZ1bmN0aW9uOipgLFxuICAgICAgICBgYXJuOmF3czpsYW1iZGE6JHtyZWdpb259OiR7YWNjb3VudH06ZnVuY3Rpb246KjoqYCxcbiAgICAgIF0sXG4gICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgIFN0cmluZ0VxdWFsc0lmRXhpc3RzOiB7ICdhd3M6UmVzb3VyY2VUYWcvbWljcm9hcHAtbWFuYWdlZCc6ICd0cnVlJyB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBkZXBsb3llckZ1bmMuYWRkVG9Sb2xlUG9saWN5KHBvbGljeUFQSU1hbmFnZUxhbWJkYXMpO1xuXG4gICAgLy9cbiAgICAvLyBDcmVhdGUgdGhlIG9yaWdpbiBuYW1lIGZvciBBUEkgR2F0ZXdheVxuICAgIC8vXG5cbiAgICBjb25zdCB6b25lID0gcjUzLkhvc3RlZFpvbmUuZnJvbUhvc3RlZFpvbmVBdHRyaWJ1dGVzKHRoaXMsICdtaWNyb2FwcHMtem9uZScsIHtcbiAgICAgIHpvbmVOYW1lOiByNTNab25lTmFtZSxcbiAgICAgIGhvc3RlZFpvbmVJZDogcjUzWm9uZUlELFxuICAgIH0pO1xuXG4gICAgY29uc3QgcnJBcHBzT3JpZ2luID0gbmV3IHI1My5BUmVjb3JkKHRoaXMsICdtaWNyb2FwcHMtb3JpZ2luLWFyZWNvcmQnLCB7XG4gICAgICB6b25lOiB6b25lLFxuICAgICAgcmVjb3JkTmFtZTogZG9tYWluTmFtZU9yaWdpbixcbiAgICAgIHRhcmdldDogcjUzLlJlY29yZFRhcmdldC5mcm9tQWxpYXMoXG4gICAgICAgIG5ldyByNTN0YXJnZXRzLkFwaUdhdGV3YXl2MkRvbWFpblByb3BlcnRpZXMoXG4gICAgICAgICAgdGhpcy5fZG5BcHBzT3JpZ2luLnJlZ2lvbmFsRG9tYWluTmFtZSxcbiAgICAgICAgICB0aGlzLl9kbkFwcHNPcmlnaW4ucmVnaW9uYWxIb3N0ZWRab25lSWQsXG4gICAgICAgICksXG4gICAgICApLFxuICAgIH0pO1xuICAgIGlmIChhdXRvRGVsZXRlRXZlcnl0aGluZykge1xuICAgICAgcnJBcHBzT3JpZ2luLmFwcGx5UmVtb3ZhbFBvbGljeShjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
425
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWljcm9BcHBzU3Zjcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9NaWNyb0FwcHNTdmNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJCQUFnQztBQUNoQyw2QkFBNkI7QUFDN0Isb0RBQW9EO0FBQ3BELG9FQUFvRTtBQUVwRSxrREFBa0Q7QUFDbEQsd0NBQXdDO0FBQ3hDLDhDQUE4QztBQUM5QywyREFBMkQ7QUFDM0QsMENBQTBDO0FBQzFDLDRDQUE0QztBQUM1QywyREFBMkQ7QUFDM0Qsc0NBQXNDO0FBQ3RDLHFDQUFxQztBQWtDckMsTUFBYSxhQUFjLFNBQVEsR0FBRyxDQUFDLFNBQVM7SUFNOUMsWUFBWSxLQUFvQixFQUFFLEVBQVUsRUFBRSxLQUErQjs7UUFDM0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1NBQzlDO1FBRUQsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLHFCQUFxQixFQUFFLEdBQzNGLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDbEIsTUFBTSxFQUNKLFNBQVMsRUFDVCxXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLHNCQUFzQixFQUN0QixvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLE9BQU8sRUFDUCxNQUFNLEVBQ04sYUFBYSxFQUNiLGVBQWUsR0FDaEIsR0FBRyxLQUFLLENBQUM7UUFFVixNQUFNLGNBQWMsR0FBRyxHQUFHLGFBQWEsR0FBRyxlQUFlLEVBQUUsQ0FBQztRQUU1RCxFQUFFO1FBQ0YsaUJBQWlCO1FBQ2pCLEVBQUU7UUFDRixNQUFNLEtBQUssR0FBRyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLHdCQUF3QixF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QUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLDBCQUEwQixFQUFFO1lBQ3JFLElBQUksRUFBRSxJQUFJO1lBQ1YsVUFBVSxFQUFFLGdCQUFnQjtZQUM1QixNQUFNLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQ2hDLElBQUksVUFBVSxDQUFDLDRCQUE0QixDQUN6QyxJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixFQUNyQyxJQUFJLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUN4QyxDQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxvQkFBb0IsRUFBRTtZQUN4QixZQUFZLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM1RDtJQUNILENBQUM7SUEvY0QsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0NBOGNGO0FBbGRELHNDQWtkQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgYXBpZ3d5IGZyb20gJ0Bhd3MtY2RrL2F3cy1hcGlnYXRld2F5djInO1xuaW1wb3J0ICogYXMgYXBpZ3d5aW50IGZyb20gJ0Bhd3MtY2RrL2F3cy1hcGlnYXRld2F5djItaW50ZWdyYXRpb25zJztcbmltcG9ydCAqIGFzIGFjbSBmcm9tICdAYXdzLWNkay9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyJztcbmltcG9ydCAqIGFzIGR5bmFtb2RiIGZyb20gJ0Bhd3MtY2RrL2F3cy1keW5hbW9kYic7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnQGF3cy1jZGsvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnQGF3cy1jZGsvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBsYW1iZGFOb2RlanMgZnJvbSAnQGF3cy1jZGsvYXdzLWxhbWJkYS1ub2RlanMnO1xuaW1wb3J0ICogYXMgbG9ncyBmcm9tICdAYXdzLWNkay9hd3MtbG9ncyc7XG5pbXBvcnQgKiBhcyByNTMgZnJvbSAnQGF3cy1jZGsvYXdzLXJvdXRlNTMnO1xuaW1wb3J0ICogYXMgcjUzdGFyZ2V0cyBmcm9tICdAYXdzLWNkay9hd3Mtcm91dGU1My10YXJnZXRzJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ0Bhd3MtY2RrL2F3cy1zMyc7XG5pbXBvcnQgKiBhcyBjZGsgZnJvbSAnQGF3cy1jZGsvY29yZSc7XG5pbXBvcnQgeyBJTWljcm9BcHBzQ0ZFeHBvcnRzIH0gZnJvbSAnLi9NaWNyb0FwcHNDRic7XG5pbXBvcnQgeyBJTWljcm9BcHBzUzNFeHBvcnRzIH0gZnJvbSAnLi9NaWNyb0FwcHNTMyc7XG5cbmludGVyZmFjZSBNaWNyb0FwcHNTdmNzU3RhY2tQcm9wcyBleHRlbmRzIGNkay5SZXNvdXJjZVByb3BzIHtcbiAgcmVhZG9ubHkgY2ZTdGFja0V4cG9ydHM6IElNaWNyb0FwcHNDRkV4cG9ydHM7XG4gIHJlYWRvbmx5IHMzRXhwb3J0czogSU1pY3JvQXBwc1MzRXhwb3J0cztcblxuICByZWFkb25seSBhcHBFbnY6IHN0cmluZztcbiAgcmVhZG9ubHkgYXV0b0RlbGV0ZUV2ZXJ5dGhpbmc6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJldmVyc2VEb21haW5OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRvbWFpbk5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZG9tYWluTmFtZUVkZ2U6IHN0cmluZztcbiAgcmVhZG9ubHkgZG9tYWluTmFtZU9yaWdpbjogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IGFzc2V0TmFtZVJvb3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgYXNzZXROYW1lU3VmZml4OiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgY2VydE9yaWdpbjogYWNtLklDZXJ0aWZpY2F0ZTtcblxuICByZWFkb25seSByNTNab25lTmFtZTogc3RyaW5nO1xuICByZWFkb25seSByNTNab25lSUQ6IHN0cmluZztcblxuICByZWFkb25seSBzM1BvbGljeUJ5cGFzc0FST0E6IHN0cmluZztcbiAgcmVhZG9ubHkgczNQb2xpY3lCeXBhc3NSb2xlTmFtZTogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IGFjY291bnQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1pY3JvQXBwc1N2Y3NFeHBvcnRzIHtcbiAgcmVhZG9ubHkgZG5BcHBzT3JpZ2luOiBhcGlnd3kuRG9tYWluTmFtZTtcbn1cblxuZXhwb3J0IGNsYXNzIE1pY3JvQXBwc1N2Y3MgZXh0ZW5kcyBjZGsuQ29uc3RydWN0IGltcGxlbWVudHMgSU1pY3JvQXBwc1N2Y3NFeHBvcnRzIHtcbiAgcHJpdmF0ZSBfZG5BcHBzT3JpZ2luOiBhcGlnd3kuRG9tYWluTmFtZTtcbiAgcHVibGljIGdldCBkbkFwcHNPcmlnaW4oKTogYXBpZ3d5LkRvbWFpbk5hbWUge1xuICAgIHJldHVybiB0aGlzLl9kbkFwcHNPcmlnaW47XG4gIH1cblxuICBjb25zdHJ1Y3RvcihzY29wZTogY2RrLkNvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBNaWNyb0FwcHNTdmNzU3RhY2tQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBpZiAocHJvcHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcm9wcyBjYW5ub3QgYmUgdW5kZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBidWNrZXRBcHBzLCBidWNrZXRBcHBzTmFtZSwgYnVja2V0QXBwc09BSSwgYnVja2V0QXBwc1N0YWdpbmcsIGJ1Y2tldEFwcHNTdGFnaW5nTmFtZSB9ID1cbiAgICAgIHByb3BzLnMzRXhwb3J0cztcbiAgICBjb25zdCB7XG4gICAgICByNTNab25lSUQsXG4gICAgICByNTNab25lTmFtZSxcbiAgICAgIHMzUG9saWN5QnlwYXNzQVJPQSxcbiAgICAgIHMzUG9saWN5QnlwYXNzUm9sZU5hbWUsXG4gICAgICBhdXRvRGVsZXRlRXZlcnl0aGluZyxcbiAgICAgIGFwcEVudixcbiAgICAgIGRvbWFpbk5hbWVFZGdlLFxuICAgICAgZG9tYWluTmFtZU9yaWdpbixcbiAgICAgIGNlcnRPcmlnaW4sXG4gICAgICBhY2NvdW50LFxuICAgICAgcmVnaW9uLFxuICAgICAgYXNzZXROYW1lUm9vdCxcbiAgICAgIGFzc2V0TmFtZVN1ZmZpeCxcbiAgICB9ID0gcHJvcHM7XG5cbiAgICBjb25zdCBhcGlnYXRld2F5TmFtZSA9IGAke2Fzc2V0TmFtZVJvb3R9JHthc3NldE5hbWVTdWZmaXh9YDtcblxuICAgIC8vXG4gICAgLy8gRHluYW1vREIgVGFibGVcbiAgICAvL1xuICAgIGNvbnN0IHRhYmxlID0gbmV3IGR5bmFtb2RiLlRhYmxlKHRoaXMsICdtaWNyb2FwcHMtcm91dGVyLXRhYmxlJywge1xuICAgICAgdGFibGVOYW1lOiBgJHthc3NldE5hbWVSb290fSR7YXNzZXROYW1lU3VmZml4fWAsXG4gICAgICBiaWxsaW5nTW9kZTogZHluYW1vZGIuQmlsbGluZ01vZGUuUEFZX1BFUl9SRVFVRVNULFxuICAgICAgcGFydGl0aW9uS2V5OiB7XG4gICAgICAgIG5hbWU6ICdQSycsXG4gICAgICAgIHR5cGU6IGR5bmFtb2RiLkF0dHJpYnV0ZVR5cGUuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHNvcnRLZXk6IHtcbiAgICAgICAgbmFtZTogJ1NLJyxcbiAgICAgICAgdHlwZTogZHluYW1vZGIuQXR0cmlidXRlVHlwZS5TVFJJTkcsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGlmIChhdXRvRGVsZXRlRXZlcnl0aGluZykge1xuICAgICAgdGFibGUuYXBwbHlSZW1vdmFsUG9saWN5KGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1kpO1xuICAgIH1cblxuICAgIC8vXG4gICAgLy8gUm91dGVyIExhbWJkYSBGdW5jdGlvblxuICAgIC8vXG5cbiAgICAvLyBDcmVhdGUgUm91dGVyIExhbWJkYSBGdW5jdGlvblxuICAgIGxldCByb3V0ZXJGdW5jOiBsYW1iZGEuRnVuY3Rpb247XG4gICAgY29uc3Qgcm91dGVyRnVuY1Byb3BzOiBPbWl0PGxhbWJkYS5GdW5jdGlvblByb3BzLCAnaGFuZGxlcicgfCAnY29kZSc+ID0ge1xuICAgICAgZnVuY3Rpb25OYW1lOiBgJHthc3NldE5hbWVSb290fS1yb3V0ZXIke2Fzc2V0TmFtZVN1ZmZpeH1gLFxuICAgICAgbWVtb3J5U2l6ZTogMTAyNCxcbiAgICAgIGxvZ1JldGVudGlvbjogbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9NT05USCxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18xNF9YLFxuICAgICAgdGltZW91dDogY2RrLkR1cmF0aW9uLnNlY29uZHMoMTUpLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgTk9ERV9FTlY6IGFwcEVudixcbiAgICAgICAgREFUQUJBU0VfVEFCTEVfTkFNRTogdGFibGUudGFibGVOYW1lLFxuICAgICAgICBBV1NfTk9ERUpTX0NPTk5FQ1RJT05fUkVVU0VfRU5BQkxFRDogJzEnLFxuICAgICAgfSxcbiAgICB9O1xuICAgIGlmIChleGlzdHNTeW5jKGAke3BhdGgucmVzb2x2ZShfX2Rpcm5hbWUpfS8uLi9kaXN0L21pY3JvYXBwcy1yb3V0ZXIvaW5kZXguanNgKSkge1xuICAgICAgLy8gVGhpcyBpcyBmb3IgbG9jYWwgZGV2XG4gICAgICByb3V0ZXJGdW5jID0gbmV3IGxhbWJkYS5GdW5jdGlvbih0aGlzLCAnbWljcm9hcHBzLXJvdXRlci1mdW5jJywge1xuICAgICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQoYCR7cGF0aC5yZXNvbHZlKF9fZGlybmFtZSl9Ly4uL2Rpc3QvbWljcm9hcHBzLXJvdXRlci9gKSxcbiAgICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgICAuLi5yb3V0ZXJGdW5jUHJvcHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGV4aXN0c1N5bmMoYCR7cGF0aC5yZXNvbHZlKF9fZGlybmFtZSl9L21pY3JvYXBwcy1yb3V0ZXIvaW5kZXguanNgKSkge1xuICAgICAgLy8gVGhpcyBpcyBmb3IgYnVpbHQgYXBwcyBwYWNrYWdlZCB3aXRoIHRoZSBDREsgY29uc3RydWN0XG4gICAgICByb3V0ZXJGdW5jID0gbmV3IGxhbWJkYS5GdW5jdGlvbih0aGlzLCAnbWljcm9hcHBzLXJvdXRlci1mdW5jJywge1xuICAgICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQoYCR7cGF0aC5yZXNvbHZlKF9fZGlybmFtZSl9L21pY3JvYXBwcy1yb3V0ZXIvYCksXG4gICAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgICAgLi4ucm91dGVyRnVuY1Byb3BzLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSBSb3V0ZXIgTGFtYmRhIExheWVyXG4gICAgICBjb25zdCByb3V0ZXJEYXRhRmlsZXMgPSBuZXcgbGFtYmRhLkxheWVyVmVyc2lvbih0aGlzLCAnbWljcm9hcHBzLXJvdXRlci1sYXllcicsIHtcbiAgICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KCcuL3BhY2thZ2VzL21pY3JvYXBwcy1yb3V0ZXIvdGVtcGxhdGVzLycpLFxuICAgICAgfSk7XG4gICAgICBpZiAoYXV0b0RlbGV0ZUV2ZXJ5dGhpbmcpIHtcbiAgICAgICAgcm91dGVyRGF0YUZpbGVzLmFwcGx5UmVtb3ZhbFBvbGljeShjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcbiAgICAgIH1cblxuICAgICAgcm91dGVyRnVuYyA9IG5ldyBsYW1iZGFOb2RlanMuTm9kZWpzRnVuY3Rpb24odGhpcywgJ21pY3JvYXBwcy1yb3V0ZXItZnVuYycsIHtcbiAgICAgICAgZW50cnk6ICcuL3BhY2thZ2VzL21pY3JvYXBwcy1yb3V0ZXIvc3JjL2luZGV4LnRzJyxcbiAgICAgICAgaGFuZGxlcjogJ2hhbmRsZXInLFxuICAgICAgICBidW5kbGluZzoge1xuICAgICAgICAgIG1pbmlmeTogdHJ1ZSxcbiAgICAgICAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIGxheWVyczogW3JvdXRlckRhdGFGaWxlc10sXG4gICAgICAgIC4uLnJvdXRlckZ1bmNQcm9wcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoYXV0b0RlbGV0ZUV2ZXJ5dGhpbmcpIHtcbiAgICAgIHJvdXRlckZ1bmMuYXBwbHlSZW1vdmFsUG9saWN5KGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1kpO1xuICAgIH1cbiAgICBjb25zdCBwb2xpY3lSZWFkVGFyZ2V0ID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogWydzMzpHZXRPYmplY3QnXSxcbiAgICAgIHJlc291cmNlczogW2Ake2J1Y2tldEFwcHMuYnVja2V0QXJufS8qYF0sXG4gICAgfSk7XG4gICAgZm9yIChjb25zdCByb3V0ZXIgb2YgW3JvdXRlckZ1bmNdKSB7XG4gICAgICByb3V0ZXIuYWRkVG9Sb2xlUG9saWN5KHBvbGljeVJlYWRUYXJnZXQpO1xuICAgICAgLy8gR2l2ZSB0aGUgUm91dGVyIGFjY2VzcyB0byBEeW5hbW9EQiB0YWJsZVxuICAgICAgdGFibGUuZ3JhbnRSZWFkRGF0YShyb3V0ZXIpO1xuICAgICAgdGFibGUuZ3JhbnQocm91dGVyLCAnZHluYW1vZGI6RGVzY3JpYmVUYWJsZScpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IEFkZCBMYXN0IFJvdXRlIGZvciAvKi97cHJveHkrfVxuICAgIC8vIE5vdGU6IFRoYXQgbWlnaHQgbm90IHdvcmssIG1heSBuZWVkIGEgQmVoYXZpb3IgaW4gQ2xvdWRGcm9udFxuICAgIC8vICAgICAgIG9yIGEgTGFtYmRhIEAgRWRnZSBmdW5jdGlvbiB0aGF0IGRldGVjdHMgdGhlc2UgYW5kIHJvdXRlc1xuICAgIC8vICAgICAgIHRvIG9yaWdpbiBMYW1iZGEgUm91dGVyIGZ1bmN0aW9uLlxuXG4gICAgLy9cbiAgICAvLyBBUElHYXRld2F5IGRvbWFpbiBuYW1lcyBmb3IgQ2xvdWRGcm9udCBhbmQgb3JpZ2luXG4gICAgLy9cblxuICAgIC8vIENyZWF0ZSBDdXN0b20gRG9tYWlucyBmb3IgQVBJIEdhdGV3YXlcbiAgICBjb25zdCBkbkFwcHNFZGdlID0gbmV3IGFwaWd3eS5Eb21haW5OYW1lKHRoaXMsICdtaWNyb2FwcHMtYXBwcy1lZGdlLWRuJywge1xuICAgICAgZG9tYWluTmFtZTogZG9tYWluTmFtZUVkZ2UsXG4gICAgICBjZXJ0aWZpY2F0ZTogY2VydE9yaWdpbixcbiAgICB9KTtcbiAgICBpZiAoYXV0b0RlbGV0ZUV2ZXJ5dGhpbmcpIHtcbiAgICAgIGRuQXBwc0VkZ2UuYXBwbHlSZW1vdmFsUG9saWN5KGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1kpO1xuICAgIH1cbiAgICB0aGlzLl9kbkFwcHNPcmlnaW4gPSBuZXcgYXBpZ3d5LkRvbWFpbk5hbWUodGhpcywgJ21pY3JvYXBwcy1hcHBzLW9yaWdpbi1kbicsIHtcbiAgICAgIGRvbWFpbk5hbWU6IGRvbWFpbk5hbWVPcmlnaW4sXG4gICAgICBjZXJ0aWZpY2F0ZTogY2VydE9yaWdpbixcbiAgICB9KTtcbiAgICBpZiAoYXV0b0RlbGV0ZUV2ZXJ5dGhpbmcpIHtcbiAgICAgIHRoaXMuX2RuQXBwc09yaWdpbi5hcHBseVJlbW92YWxQb2xpY3koY2RrLlJlbW92YWxQb2xpY3kuREVTVFJPWSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGFuIGludGVncmF0aW9uIGZvciB0aGUgUm91dGVyXG4gICAgLy8gRG8gdGhpcyBoZXJlIHNpbmNlIGl0J3MgdGhlIGRlZmF1bHQgcm91dGVcbiAgICBjb25zdCBpbnRSb3V0ZXIgPSBuZXcgYXBpZ3d5aW50LkxhbWJkYVByb3h5SW50ZWdyYXRpb24oe1xuICAgICAgaGFuZGxlcjogcm91dGVyRnVuYyxcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBBUElHYXRld2F5IGZvciB0aGUgRWRnZSBuYW1lXG4gICAgY29uc3QgaHR0cEFwaURvbWFpbk1hcHBpbmc6IGFwaWd3eS5Eb21haW5NYXBwaW5nT3B0aW9ucyA9IHtcbiAgICAgIGRvbWFpbk5hbWU6IGRuQXBwc0VkZ2UsXG4gICAgfTtcbiAgICBjb25zdCBodHRwQXBpID0gbmV3IGFwaWd3eS5IdHRwQXBpKHRoaXMsICdtaWNyb2FwcHMtYXBpJywge1xuICAgICAgZGVmYXVsdERvbWFpbk1hcHBpbmc6IGh0dHBBcGlEb21haW5NYXBwaW5nLFxuICAgICAgZGVmYXVsdEludGVncmF0aW9uOiBpbnRSb3V0ZXIsXG4gICAgICBhcGlOYW1lOiBhcGlnYXRld2F5TmFtZSxcbiAgICB9KTtcbiAgICBpZiAoYXV0b0RlbGV0ZUV2ZXJ5dGhpbmcpIHtcbiAgICAgIGh0dHBBcGkuYXBwbHlSZW1vdmFsUG9saWN5KGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1kpO1xuICAgIH1cblxuICAgIC8vIEFkZCBkZWZhdWx0IHJvdXRlIG9uIEFQSSBHYXRld2F5IHRvIHBvaW50IHRvIHRoZSByb3V0ZXJcbiAgICAvLyBodHRwQXBpLmFkZFJvdXRlcyh7XG4gICAgLy8gICBwYXRoOiAnJGRlZmF1bHQnLFxuICAgIC8vICAgaW50ZWdyYXRpb246IGludFJvdXRlcixcbiAgICAvLyB9KTtcblxuICAgIC8vXG4gICAgLy8gTGV0IEFQSSBHYXRld2F5IGFjY2VwdCByZXF1ZXN0cyB1c2luZyBkb21haW5OYW1lT3JpZ2luXG4gICAgLy8gVGhhdCBpcyB0aGUgb3JpZ2luIFVSSSB0aGF0IENsb3VkRnJvbnQgdXNlcyBmb3IgdGhpcyBnYXRld2F5LlxuICAgIC8vIFRoZSBnYXRld2F5IHdpbGwgcmVmdXNlIHRoZSB0cmFmZmljIGlmIGl0IGRvZXNuJ3QgaGF2ZSB0aGVcbiAgICAvLyBkb21haW4gbmFtZSByZWdpc3RlcmVkLlxuICAgIC8vXG4gICAgY29uc3QgbWFwcGluZ0FwcHNBcGlzID0gbmV3IGFwaWd3eS5BcGlNYXBwaW5nKHRoaXMsICdtaWNyb2FwcHMtYXBpLW1hcHBpbmctb3JpZ2luJywge1xuICAgICAgYXBpOiBodHRwQXBpLFxuICAgICAgZG9tYWluTmFtZTogdGhpcy5kbkFwcHNPcmlnaW4sXG4gICAgfSk7XG4gICAgbWFwcGluZ0FwcHNBcGlzLm5vZGUuYWRkRGVwZW5kZW5jeSh0aGlzLmRuQXBwc09yaWdpbik7XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICBtYXBwaW5nQXBwc0FwaXMuYXBwbHlSZW1vdmFsUG9saWN5KGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1kpO1xuICAgIH1cblxuICAgIC8vXG4gICAgLy8gRGVwbG95ZXIgTGFtYmRhIEZ1bmN0aW9uXG4gICAgLy9cblxuICAgIC8vIENyZWF0ZSBEZXBsb3llciBMYW1iZGEgRnVuY3Rpb25cbiAgICBjb25zdCBpYW1Sb2xlVXBsb2FkTmFtZSA9IGAke2Fzc2V0TmFtZVJvb3R9LWRlcGxveWVyLXVwbG9hZCR7YXNzZXROYW1lU3VmZml4fWA7XG4gICAgY29uc3QgZGVwbG95ZXJGdW5jTmFtZSA9IGAke2Fzc2V0TmFtZVJvb3R9LWRlcGxveWVyJHthc3NldE5hbWVTdWZmaXh9YDtcbiAgICBsZXQgZGVwbG95ZXJGdW5jOiBsYW1iZGEuRnVuY3Rpb247XG4gICAgY29uc3QgZGVwbG95ZXJGdW5jUHJvcHM6IE9taXQ8bGFtYmRhLkZ1bmN0aW9uUHJvcHMsICdoYW5kbGVyJyB8ICdjb2RlJz4gPSB7XG4gICAgICBmdW5jdGlvbk5hbWU6IGRlcGxveWVyRnVuY05hbWUsXG4gICAgICBtZW1vcnlTaXplOiAxMDI0LFxuICAgICAgbG9nUmV0ZW50aW9uOiBsb2dzLlJldGVudGlvbkRheXMuT05FX01PTlRILFxuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE0X1gsXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24uc2Vjb25kcygxNSksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBOT0RFX0VOVjogYXBwRW52LFxuICAgICAgICBBUElHV1lfSUQ6IGh0dHBBcGkuaHR0cEFwaUlkLFxuICAgICAgICBEQVRBQkFTRV9UQUJMRV9OQU1FOiB0YWJsZS50YWJsZU5hbWUsXG4gICAgICAgIEZJTEVTVE9SRV9TVEFHSU5HX0JVQ0tFVDogYnVja2V0QXBwc1N0YWdpbmdOYW1lLFxuICAgICAgICBGSUxFU1RPUkVfREVTVF9CVUNLRVQ6IGJ1Y2tldEFwcHNOYW1lLFxuICAgICAgICBVUExPQURfUk9MRV9OQU1FOiBpYW1Sb2xlVXBsb2FkTmFtZSxcbiAgICAgICAgQVdTX05PREVKU19DT05ORUNUSU9OX1JFVVNFX0VOQUJMRUQ6ICcxJyxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBpZiAoZXhpc3RzU3luYyhgJHtwYXRoLnJlc29sdmUoX19kaXJuYW1lKX0vLi4vZGlzdC9taWNyb2FwcHMtZGVwbG95ZXIvaW5kZXguanNgKSkge1xuICAgICAgLy8gVGhpcyBpcyBmb3IgbG9jYWwgZGV2XG4gICAgICBkZXBsb3llckZ1bmMgPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsICdtaWNyb2FwcHMtZGVwbG95ZXItZnVuYycsIHtcbiAgICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KGAke3BhdGgucmVzb2x2ZShfX2Rpcm5hbWUpfS8uLi9kaXN0L21pY3JvYXBwcy1kZXBsb3llci9gKSxcbiAgICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgICAuLi5kZXBsb3llckZ1bmNQcm9wcyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZXhpc3RzU3luYyhgJHtwYXRoLnJlc29sdmUoX19kaXJuYW1lKX0vbWljcm9hcHBzLWRlcGxveWVyL2luZGV4LmpzYCkpIHtcbiAgICAgIC8vIFRoaXMgaXMgZm9yIGJ1aWx0IGFwcHMgcGFja2FnZWQgd2l0aCB0aGUgQ0RLIGNvbnN0cnVjdFxuICAgICAgZGVwbG95ZXJGdW5jID0gbmV3IGxhbWJkYS5GdW5jdGlvbih0aGlzLCAnbWljcm9hcHBzLWRlcGxveWVyLWZ1bmMnLCB7XG4gICAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChgJHtwYXRoLnJlc29sdmUoX19kaXJuYW1lKX0vbWljcm9hcHBzLWRlcGxveWVyL2ApLFxuICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgIC4uLmRlcGxveWVyRnVuY1Byb3BzLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlcGxveWVyRnVuYyA9IG5ldyBsYW1iZGFOb2RlanMuTm9kZWpzRnVuY3Rpb24odGhpcywgJ21pY3JvYXBwcy1kZXBsb3llci1mdW5jJywge1xuICAgICAgICBlbnRyeTogJy4vcGFja2FnZXMvbWljcm9hcHBzLWRlcGxveWVyL3NyYy9pbmRleC50cycsXG4gICAgICAgIGhhbmRsZXI6ICdoYW5kbGVyJyxcbiAgICAgICAgYnVuZGxpbmc6IHtcbiAgICAgICAgICBtaW5pZnk6IHRydWUsXG4gICAgICAgICAgc291cmNlTWFwOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICAuLi5kZXBsb3llckZ1bmNQcm9wcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoYXV0b0RlbGV0ZUV2ZXJ5dGhpbmcpIHtcbiAgICAgIGRlcGxveWVyRnVuYy5hcHBseVJlbW92YWxQb2xpY3koY2RrLlJlbW92YWxQb2xpY3kuREVTVFJPWSk7XG4gICAgfVxuICAgIC8vIEdpdmUgdGhlIERlcGxveWVyIGFjY2VzcyB0byBEeW5hbW9EQiB0YWJsZVxuICAgIHRhYmxlLmdyYW50UmVhZFdyaXRlRGF0YShkZXBsb3llckZ1bmMpO1xuICAgIHRhYmxlLmdyYW50KGRlcGxveWVyRnVuYywgJ2R5bmFtb2RiOkRlc2NyaWJlVGFibGUnKTtcblxuICAgIC8vXG4gICAgLy8gRGVsb3llciB1cGxvYWQgdGVtcCByb2xlXG4gICAgLy8gRGVwbG95ZXIgYXNzdW1lcyB0aGlzIHJvbGUgd2l0aCBhIGxpbWl0ZWQgcG9saWN5IHRvIGdlbmVyYXRlXG4gICAgLy8gYW4gU1RTIHRlbXAgdG9rZW4gdG8gcmV0dXJuIHRvIG1pY3JvYXBwcy1wdWJsaXNoIGZvciB0aGUgdXBsb2FkLlxuICAgIC8vXG4gICAgY29uc3QgaWFtUm9sZVVwbG9hZCA9IG5ldyBpYW0uUm9sZSh0aGlzLCAnbWljcm9hcHBzLWRlcGxveWVyLXVwbG9hZC1yb2xlJywge1xuICAgICAgcm9sZU5hbWU6IGlhbVJvbGVVcGxvYWROYW1lLFxuICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgdXBsb2FkUG9saWN5OiBuZXcgaWFtLlBvbGljeURvY3VtZW50KHtcbiAgICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIGFjdGlvbnM6IFsnczM6TGlzdEJ1Y2tldCddLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtidWNrZXRBcHBzU3RhZ2luZy5idWNrZXRBcm5dLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIGFjdGlvbnM6IFsnczM6UHV0T2JqZWN0JywgJ3MzOkdldE9iamVjdCcsICdzMzpBYm9ydE11bHRpcGFydFVwbG9hZCddLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtgJHtidWNrZXRBcHBzU3RhZ2luZy5idWNrZXRBcm59LypgXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICAgIGFzc3VtZWRCeTogZGVwbG95ZXJGdW5jLmdyYW50UHJpbmNpcGFsLFxuICAgIH0pO1xuXG4gICAgLy9cbiAgICAvLyBVcGRhdGUgUzMgcGVybWlzc2lvbnNcbiAgICAvL1xuICAgIC8vIERlbnkgYXBwcyBmcm9tIHJlYWRpbmc6XG4gICAgLy8gLSBJZiB0aGV5IGFyZSBtaXNzaW5nIHRoZSBtaWNyb2FwcC1uYW1lIHRhZ1xuICAgIC8vIC0gQW55dGhpbmcgb3V0c2lkZSBvZiB0aGUgZm9sZGVyIHRoYXQgbWF0Y2hlcyB0aGVpciBtaWNyb2FwcC1uYW1lIHRhZ1xuICAgIGNvbnN0IHBvbGljeURlbnlQcmVmaXhPdXRzaWRlVGFnID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgc2lkOiAnZGVueS1wcmVmaXgtb3V0c2lkZS1taWNyb2FwcC1uYW1lLXRhZycsXG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuREVOWSxcbiAgICAgIGFjdGlvbnM6IFsnczM6KiddLFxuICAgICAgbm90UHJpbmNpcGFsczogW1xuICAgICAgICBuZXcgaWFtLkNhbm9uaWNhbFVzZXJQcmluY2lwYWwoXG4gICAgICAgICAgYnVja2V0QXBwc09BSS5jbG91ZEZyb250T3JpZ2luQWNjZXNzSWRlbnRpdHlTM0Nhbm9uaWNhbFVzZXJJZCxcbiAgICAgICAgKSxcbiAgICAgICAgbmV3IGlhbS5BY2NvdW50Um9vdFByaW5jaXBhbCgpLFxuICAgICAgICBuZXcgaWFtLkFyblByaW5jaXBhbChgYXJuOmF3czppYW06OiR7YWNjb3VudH06cm9sZS8ke3MzUG9saWN5QnlwYXNzUm9sZU5hbWV9YCksXG4gICAgICAgIGRlcGxveWVyRnVuYy5ncmFudFByaW5jaXBhbCxcbiAgICAgICAgLy8gQWxsb3cgdGhlIGJ1aWxkZXIgdXNlciB0byB1cGRhdGUgdGhlIGJ1Y2tldHNcbiAgICAgICAgbmV3IGlhbS5Bcm5QcmluY2lwYWwoXG4gICAgICAgICAgYGFybjphd3M6aWFtOjoke2FjY291bnR9OnVzZXIvJHthc3NldE5hbWVSb290fS1idWlsZGVyLSR7cHJvcHMuYXBwRW52fWAsXG4gICAgICAgICksXG4gICAgICBdLFxuICAgICAgbm90UmVzb3VyY2VzOiBbXG4gICAgICAgIGAke2J1Y2tldEFwcHMuYnVja2V0QXJufS9cXCR7YXdzOlByaW5jaXBhbFRhZy9taWNyb2FwcC1uYW1lfS8qYCxcbiAgICAgICAgYnVja2V0QXBwcy5idWNrZXRBcm4sXG4gICAgICBdLFxuICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICBOdWxsOiB7ICdhd3M6UHJpbmNpcGFsVGFnL21pY3JvYXBwLW5hbWUnOiAnZmFsc2UnIH0sXG4gICAgICAgIC8vIFN0cmluZ05vdExpa2U6IHsnYXdzOid9XG4gICAgICB9LFxuICAgIH0pO1xuICAgIGlmIChhdXRvRGVsZXRlRXZlcnl0aGluZykge1xuICAgICAgcG9saWN5RGVueVByZWZpeE91dHNpZGVUYWcuYWRkQ29uZGl0aW9uKFxuICAgICAgICAvLyBBbGxvd3MgdGhlIERlbGV0YWJsZUJ1Y2tldCBMYW1iZGEgdG8gZGVsZXRlIGl0ZW1zIGluIHRoZSBidWNrZXRzXG4gICAgICAgICdTdHJpbmdOb3RMaWtlJyxcbiAgICAgICAgeyAnYXdzOlByaW5jaXBhbFRhZy9hcHBsaWNhdGlvbic6IGAke2Fzc2V0TmFtZVJvb3R9LWNvcmUqYCB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgcG9saWN5RGVueU1pc3NpbmdUYWcgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBzaWQ6ICdkZW55LW1pc3NpbmctbWljcm9hcHAtbmFtZS10YWcnLFxuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkRFTlksXG4gICAgICBhY3Rpb25zOiBbJ3MzOionXSxcbiAgICAgIG5vdFByaW5jaXBhbHM6IFtcbiAgICAgICAgbmV3IGlhbS5DYW5vbmljYWxVc2VyUHJpbmNpcGFsKFxuICAgICAgICAgIGJ1Y2tldEFwcHNPQUkuY2xvdWRGcm9udE9yaWdpbkFjY2Vzc0lkZW50aXR5UzNDYW5vbmljYWxVc2VySWQsXG4gICAgICAgICksXG4gICAgICAgIG5ldyBpYW0uQWNjb3VudFJvb3RQcmluY2lwYWwoKSxcbiAgICAgICAgbmV3IGlhbS5Bcm5QcmluY2lwYWwoYGFybjphd3M6aWFtOjoke2FjY291bnR9OnJvbGUvJHtzM1BvbGljeUJ5cGFzc1JvbGVOYW1lfWApLFxuICAgICAgICBkZXBsb3llckZ1bmMuZ3JhbnRQcmluY2lwYWwsXG4gICAgICAgIG5ldyBpYW0uQXJuUHJpbmNpcGFsKFxuICAgICAgICAgIGBhcm46YXdzOnN0czo6JHthY2NvdW50fTphc3N1bWVkLXJvbGUvJHtkZXBsb3llckZ1bmM/LnJvbGU/LnJvbGVOYW1lfS8ke2RlcGxveWVyRnVuYy5mdW5jdGlvbk5hbWV9YCxcbiAgICAgICAgKSxcbiAgICAgICAgLy8gQWxsb3cgdGhlIGJ1aWxkZXIgdXNlciB0byB1cGRhdGUgdGhlIGJ1Y2tldHNcbiAgICAgICAgbmV3IGlhbS5Bcm5QcmluY2lwYWwoXG4gICAgICAgICAgYGFybjphd3M6aWFtOjoke2FjY291bnR9OnVzZXIvJHthc3NldE5hbWVSb290fS1idWlsZGVyLSR7cHJvcHMuYXBwRW52fWAsXG4gICAgICAgICksXG4gICAgICBdLFxuICAgICAgcmVzb3VyY2VzOiBbYCR7YnVja2V0QXBwcy5idWNrZXRBcm59LypgLCBidWNrZXRBcHBzLmJ1Y2tldEFybl0sXG4gICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgIE51bGw6IHsgJ2F3czpQcmluY2lwYWxUYWcvbWljcm9hcHAtbmFtZSc6ICd0cnVlJyB9LFxuICAgICAgICAvLyBOb3RlOiBUaGlzIEFST0EgbXVzdCBiZSBzcGVjaWZpZWQgdG8gcHJldmVudCB0aGlzIHBvbGljeSBmcm9tIGxvY2tpbmdcbiAgICAgICAgLy8gb3V0IG5vbi1yb290IHNlc3Npb25zIHRoYXQgaGF2ZSBhc3N1bWVkIHRoZSBhZG1pbiByb2xlLlxuICAgICAgICAvLyBUaGUgbm90UHJpbmNpcGFscyB3aWxsIG9ubHkgbWF0Y2ggdGhlIHJvbGUgbmFtZSBleGFjdGx5IGFuZCB3aWxsIG5vdCBtYXRjaFxuICAgICAgICAvLyBhbnkgc2Vzc2lvbiB0aGF0IGhhcyBhc3N1bWVkIHRoZSByb2xlIHNpbmNlIG5vdFByaW5jaXBhbHMgZG9lcyBub3QgYWxsb3dcbiAgICAgICAgLy8gd2lsZGNhcmQgbWF0Y2hlcyBhbmQgZG9lcyBub3QgZG8gdGhlbSBpbXBsaWNpdGx5IGVpdGhlci5cbiAgICAgICAgLy8gVGhlIEFST0EgbXVzdCBiZSB1YXNlZCBiZWNhdXNlIHRoZXJlIGFyZSBvbmx5IDMgUHJpbmNpcGFsIHZhcmlhYmxlczpcbiAgICAgICAgLy8gIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfdmFyaWFibGVzLmh0bWwjcHJpbmNpcGFsdGFibGVcbiAgICAgICAgLy8gIGF3czp1c2VybmFtZSwgYXdzOnVzZXJpZCwgYXdzOlByaW5jaXBhbFRhZ1xuICAgICAgICAvLyBGb3IgYW4gYXNzdW1lZCByb2xlLCBhd3M6dXNlcm5hbWUgaXMgYmxhbmssIGF3czp1c2VyaWQgaXM6XG4gICAgICAgIC8vICBbdW5pcXVlIGlkIEFLQSBBUk9BIGZvciBSb2xlXTpbc2Vzc2lvbiBuYW1lXVxuICAgICAgICAvLyBUYWJsZSBvZiB1bmlxdWUgSUQgcHJlZml4ZXMgc3VjaCBhcyBBUk9BOlxuICAgICAgICAvLyAgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9pZGVudGlmaWVycy5odG1sI2lkZW50aWZpZXJzLXByZWZpeGVzXG4gICAgICAgIC8vIFRoZSBuYW1lIG9mIHRoZSByb2xlIGlzIHNpbXBseSBub3QgYXZhaWxhYmxlIGFuZCBpZiBpdCB3YXNcbiAgICAgICAgLy8gd2UnZCBuZWVkIHRvIHdyaXRlIGEgY29tcGxpY2F0ZWQgY29tcGFyaXNvbiB0byBtYWtlIHN1cmVcbiAgICAgICAgLy8gdGhhdCB3ZSBkaWRuJ3QgZXhjbHVkZSB0aGUgRGVueSB0YWcgZnJvbSByb2xlcyBpbiBvdGhlciBhY2NvdW50cy5cbiAgICAgICAgU3RyaW5nTm90TGlrZTogeyAnYXdzOnVzZXJpZCc6IFtgJHtzM1BvbGljeUJ5cGFzc0FST0F9OipgLCBhY2NvdW50XSB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBpZiAoYXV0b0RlbGV0ZUV2ZXJ5dGhpbmcpIHtcbiAgICAgIHBvbGljeURlbnlNaXNzaW5nVGFnLmFkZENvbmRpdGlvbihcbiAgICAgICAgLy8gQWxsb3dzIHRoZSBEZWxldGFibGVCdWNrZXQgTGFtYmRhIHRvIGRlbGV0ZSBpdGVtcyBpbiB0aGUgYnVja2V0c1xuICAgICAgICAnU3RyaW5nTm90TGlrZScsXG4gICAgICAgIHsgJ2F3czpQcmluY2lwYWxUYWcvYXBwbGljYXRpb24nOiBgJHthc3NldE5hbWVSb290fS1jb3JlKmAgfSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHBvbGljeUNsb3VkRnJvbnRBY2Nlc3MgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBzaWQ6ICdjbG91ZGZyb250LW9haS1hY2Nlc3MnLFxuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogWydzMzpHZXRPYmplY3QnXSxcbiAgICAgIHByaW5jaXBhbHM6IFtcbiAgICAgICAgbmV3IGlhbS5DYW5vbmljYWxVc2VyUHJpbmNpcGFsKFxuICAgICAgICAgIGJ1Y2tldEFwcHNPQUkuY2xvdWRGcm9udE9yaWdpbkFjY2Vzc0lkZW50aXR5UzNDYW5vbmljYWxVc2VySWQsXG4gICAgICAgICksXG4gICAgICBdLFxuICAgICAgcmVzb3VyY2VzOiBbYCR7YnVja2V0QXBwcy5idWNrZXRBcm59LypgXSxcbiAgICB9KTtcbiAgICBpZiAoYnVja2V0QXBwcy5wb2xpY3kgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZG9jdW1lbnQgPSBuZXcgczMuQnVja2V0UG9saWN5KHRoaXMsICdDRlBvbGljeScsIHtcbiAgICAgICAgYnVja2V0OiBidWNrZXRBcHBzLFxuICAgICAgfSkuZG9jdW1lbnQ7XG4gICAgICBkb2N1bWVudC5hZGRTdGF0ZW1lbnRzKHBvbGljeUNsb3VkRnJvbnRBY2Nlc3MpO1xuICAgICAgZG9jdW1lbnQuYWRkU3RhdGVtZW50cyhwb2xpY3lEZW55UHJlZml4T3V0c2lkZVRhZyk7XG4gICAgICBkb2N1bWVudC5hZGRTdGF0ZW1lbnRzKHBvbGljeURlbnlNaXNzaW5nVGFnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnVja2V0QXBwcy5wb2xpY3kuZG9jdW1lbnQuYWRkU3RhdGVtZW50cyhwb2xpY3lDbG91ZEZyb250QWNjZXNzKTtcbiAgICAgIGJ1Y2tldEFwcHMucG9saWN5LmRvY3VtZW50LmFkZFN0YXRlbWVudHMocG9saWN5RGVueVByZWZpeE91dHNpZGVUYWcpO1xuICAgICAgYnVja2V0QXBwcy5wb2xpY3kuZG9jdW1lbnQuYWRkU3RhdGVtZW50cyhwb2xpY3lEZW55TWlzc2luZ1RhZyk7XG4gICAgfVxuXG4gICAgLy8gQWxsb3cgdGhlIExhbWJkYSB0byByZWFkIGZyb20gdGhlIHN0YWdpbmcgYnVja2V0XG4gICAgY29uc3QgcG9saWN5UmVhZExpc3RTdGFnaW5nID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgLy8gRklYTUU6IEFsbG93IERlcGxveWVyIHRvIGRlbGV0ZSBmcm9tIFN0YWdpbmcgYnVja2V0XG4gICAgICBhY3Rpb25zOiBbJ3MzOkdldE9iamVjdCcsICdzMzpMaXN0QnVja2V0J10sXG4gICAgICByZXNvdXJjZXM6IFtgJHtidWNrZXRBcHBzU3RhZ2luZy5idWNrZXRBcm59LypgLCBidWNrZXRBcHBzU3RhZ2luZy5idWNrZXRBcm5dLFxuICAgIH0pO1xuICAgIGRlcGxveWVyRnVuYy5hZGRUb1JvbGVQb2xpY3kocG9saWN5UmVhZExpc3RTdGFnaW5nKTtcblxuICAgIC8vIEFsbG93IHRoZSBMYW1iZGEgdG8gd3JpdGUgdG8gdGhlIHRhcmdldCBidWNrZXRcbiAgICBjb25zdCBwb2xpY3lSZWFkV3JpdGVMaXN0VGFyZ2V0ID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogWydzMzpHZXRPYmplY3QnLCAnczM6UHV0T2JqZWN0JywgJ3MzOkxpc3RCdWNrZXQnXSxcbiAgICAgIHJlc291cmNlczogW2Ake2J1Y2tldEFwcHMuYnVja2V0QXJufS8qYCwgYnVja2V0QXBwcy5idWNrZXRBcm5dLFxuICAgIH0pO1xuICAgIGRlcGxveWVyRnVuYy5hZGRUb1JvbGVQb2xpY3kocG9saWN5UmVhZFdyaXRlTGlzdFRhcmdldCk7XG5cbiAgICAvLyBBbGxvdyB0aGUgZGVwbG95ZXIgdG8gZ2V0IGEgdGVtcG9yYXJ5IFNUUyB0b2tlblxuICAgIGNvbnN0IHBvbGljeUdldFNUU1Rva2VuID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogWydzdHM6R2V0RmVkZXJhdGlvblRva2VuJ10sXG4gICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgIH0pO1xuICAgIGRlcGxveWVyRnVuYy5hZGRUb1JvbGVQb2xpY3kocG9saWN5R2V0U1RTVG9rZW4pO1xuXG4gICAgLy8gQWxsb3cgdGhlIGRlcGxveWVyIHRvIGFzc3VtZSB0aGUgdXBsb2FkIHJvbGVcbiAgICBjb25zdCBwb2xpY3lBc3N1bWVVcGxvYWQgPSBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICBhY3Rpb25zOiBbJ3N0czpBc3N1bWVSb2xlJ10sXG4gICAgICByZXNvdXJjZXM6IFtpYW1Sb2xlVXBsb2FkLnJvbGVBcm5dLFxuICAgIH0pO1xuICAgIGRlcGxveWVyRnVuYy5hZGRUb1JvbGVQb2xpY3kocG9saWN5QXNzdW1lVXBsb2FkKTtcblxuICAgIC8vXG4gICAgLy8gR2l2ZSBEZXBsb3llciBwZXJtaXNzaW9ucyB0byBjcmVhdGUgcm91dGVzIGFuZCBpbnRlZ3JhdGlvbnNcbiAgICAvLyBvbiB0aGUgQVBJIEdhdGV3YXkgQVBJLlxuICAgIC8vXG5cbiAgICAvLyBHcmFudCB0aGUgYWJpbGl0eSB0byBMaXN0IGFsbCBBUElzICh3ZSBoYXZlIHRvIGZpbmQgaXQpXG4gICAgY29uc3QgcG9saWN5QVBJTGlzdCA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnYXBpZ2F0ZXdheTpHRVQnXSxcbiAgICAgIHJlc291cmNlczogW2Bhcm46YXdzOmFwaWdhdGV3YXk6JHtyZWdpb259OjovYXBpc2BdLFxuICAgIH0pO1xuICAgIGRlcGxveWVyRnVuYy5hZGRUb1JvbGVQb2xpY3kocG9saWN5QVBJTGlzdCk7XG4gICAgLy8gR3JhbnQgZnVsbCBjb250cm9sIG92ZXIgdGhlIEFQSSB3ZSBjcmVhdGVkXG4gICAgY29uc3QgcG9saWN5QVBJTWFuYWdlID0gbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgYWN0aW9uczogWydhcGlnYXRld2F5OionXSxcbiAgICAgIHJlc291cmNlczogW1xuICAgICAgICBgYXJuOmF3czphcGlnYXRld2F5OiR7cmVnaW9ufToke2FjY291bnR9OiR7aHR0cEFwaS5odHRwQXBpSWR9LypgLFxuICAgICAgICBgYXJuOmF3czphcGlnYXRld2F5OiR7cmVnaW9ufTo6L2FwaXMvJHtodHRwQXBpLmh0dHBBcGlJZH0vaW50ZWdyYXRpb25zYCxcbiAgICAgICAgYGFybjphd3M6YXBpZ2F0ZXdheToke3JlZ2lvbn06Oi9hcGlzLyR7aHR0cEFwaS5odHRwQXBpSWR9L3JvdXRlc2AsXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGRlcGxveWVyRnVuYy5hZGRUb1JvbGVQb2xpY3kocG9saWN5QVBJTWFuYWdlKTtcbiAgICAvLyBHcmFudCBmdWxsIGNvbnRyb2wgb3ZlciBsYW1iZGFzIHRoYXQgaW5kaWNhdGUgdGhleSBhcmUgbWljcm9hcHBzXG4gICAgY29uc3QgcG9saWN5QVBJTWFuYWdlTGFtYmRhcyA9IG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFsnbGFtYmRhOionXSxcbiAgICAgIHJlc291cmNlczogW1xuICAgICAgICBgYXJuOmF3czpsYW1iZGE6JHtyZWdpb259OiR7YWNjb3VudH06ZnVuY3Rpb246KmAsXG4gICAgICAgIGBhcm46YXdzOmxhbWJkYToke3JlZ2lvbn06JHthY2NvdW50fTpmdW5jdGlvbjoqOipgLFxuICAgICAgXSxcbiAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgU3RyaW5nRXF1YWxzSWZFeGlzdHM6IHsgJ2F3czpSZXNvdXJjZVRhZy9taWNyb2FwcC1tYW5hZ2VkJzogJ3RydWUnIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGRlcGxveWVyRnVuYy5hZGRUb1JvbGVQb2xpY3kocG9saWN5QVBJTWFuYWdlTGFtYmRhcyk7XG5cbiAgICAvL1xuICAgIC8vIENyZWF0ZSB0aGUgb3JpZ2luIG5hbWUgZm9yIEFQSSBHYXRld2F5XG4gICAgLy9cblxuICAgIGNvbnN0IHpvbmUgPSByNTMuSG9zdGVkWm9uZS5mcm9tSG9zdGVkWm9uZUF0dHJpYnV0ZXModGhpcywgJ21pY3JvYXBwcy16b25lJywge1xuICAgICAgem9uZU5hbWU6IHI1M1pvbmVOYW1lLFxuICAgICAgaG9zdGVkWm9uZUlkOiByNTNab25lSUQsXG4gICAgfSk7XG5cbiAgICBjb25zdCByckFwcHNPcmlnaW4gPSBuZXcgcjUzLkFSZWNvcmQodGhpcywgJ21pY3JvYXBwcy1vcmlnaW4tYXJlY29yZCcsIHtcbiAgICAgIHpvbmU6IHpvbmUsXG4gICAgICByZWNvcmROYW1lOiBkb21haW5OYW1lT3JpZ2luLFxuICAgICAgdGFyZ2V0OiByNTMuUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhcbiAgICAgICAgbmV3IHI1M3RhcmdldHMuQXBpR2F0ZXdheXYyRG9tYWluUHJvcGVydGllcyhcbiAgICAgICAgICB0aGlzLl9kbkFwcHNPcmlnaW4ucmVnaW9uYWxEb21haW5OYW1lLFxuICAgICAgICAgIHRoaXMuX2RuQXBwc09yaWdpbi5yZWdpb25hbEhvc3RlZFpvbmVJZCxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgfSk7XG4gICAgaWYgKGF1dG9EZWxldGVFdmVyeXRoaW5nKSB7XG4gICAgICByckFwcHNPcmlnaW4uYXBwbHlSZW1vdmFsUG9saWN5KGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1kpO1xuICAgIH1cbiAgfVxufVxuIl19
|