cdk-nuxt 2.3.0-4 → 2.3.0-5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -3
- package/lib/cli/deploy-server.js +0 -11
- package/lib/stack/access-logs-analysis/AccessLogsAnalysis.js +31 -15
- package/lib/stack/access-logs-analysis/AccessLogsAnalysis.ts +32 -17
- package/lib/stack/server/NuxtServerAppStack.js +15 -8
- package/lib/stack/server/NuxtServerAppStack.ts +14 -9
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -177,8 +177,8 @@ See https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html for details.
|
|
|
177
177
|
|
|
178
178
|
### 2. Build and Deploy
|
|
179
179
|
|
|
180
|
-
By running the following script, the
|
|
181
|
-
|
|
180
|
+
By running the following script, the Nuxt app will be built automatically via `yarn build`
|
|
181
|
+
and the CDK stack will be deployed to AWS.
|
|
182
182
|
|
|
183
183
|
```bash
|
|
184
184
|
node_modules/.bin/cdk-nuxt-deploy-server
|
|
@@ -187,7 +187,6 @@ node_modules/.bin/cdk-nuxt-deploy-server
|
|
|
187
187
|
Alternatively, you can run the following commands separately to customize the deployment process:
|
|
188
188
|
|
|
189
189
|
```bash
|
|
190
|
-
yarn install
|
|
191
190
|
yarn build
|
|
192
191
|
yarn cdk deploy --require-approval never --all --app="yarn ts-node stack/index.ts"
|
|
193
192
|
```
|
|
@@ -256,6 +255,9 @@ jobs:
|
|
|
256
255
|
node-version: '20'
|
|
257
256
|
cache: 'yarn'
|
|
258
257
|
|
|
258
|
+
- name: Install dependencies
|
|
259
|
+
run: yarn install --frozen-lockfile # or `yarn install --immutable` for Yarn >= 2
|
|
260
|
+
|
|
259
261
|
- name: Build and deploy to AWS
|
|
260
262
|
run: node_modules/.bin/cdk-nuxt-deploy-server # Or run a customized deployment, see 'Build and Deploy' section
|
|
261
263
|
env:
|
package/lib/cli/deploy-server.js
CHANGED
|
@@ -7,21 +7,10 @@ shell.echo(`${logPrefix}: Starting deployment for dynamic Nuxt app...`);
|
|
|
7
7
|
|
|
8
8
|
const deploymentSourceFolder = '.output/server';
|
|
9
9
|
|
|
10
|
-
const yarnVersion = shell.exec('yarn -v', {silent:true}).stdout
|
|
11
|
-
const isYarn1 = yarnVersion && yarnVersion.startsWith('1.');
|
|
12
|
-
|
|
13
10
|
// Refresh the cdk output folder to have a clean state and prevent persisting outdated outputs
|
|
14
11
|
shell.echo(`${logPrefix}: Deleting outdated CDK files...`);
|
|
15
12
|
shell.rm('-rf', 'cdk.out');
|
|
16
13
|
|
|
17
|
-
// Install the Nuxt app dependencies
|
|
18
|
-
shell.echo(`${logPrefix}: Installing app dependencies...`);
|
|
19
|
-
const yarnInstallCommand = isYarn1 ? 'yarn install --frozen-lockfile' : 'yarn install --immutable';
|
|
20
|
-
if (shell.exec(yarnInstallCommand).code !== 0) {
|
|
21
|
-
shell.echo(`${logPrefix} Error: Installation of app dependencies failed.`);
|
|
22
|
-
shell.exit(1);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
14
|
// Build the Nuxt app
|
|
26
15
|
shell.echo(`${logPrefix}: Building app...`);
|
|
27
16
|
if (shell.exec('yarn build').code !== 0) {
|
|
@@ -93,24 +93,28 @@ class AccessLogsAnalysis extends constructs_1.Construct {
|
|
|
93
93
|
}
|
|
94
94
|
createGroupByDateLayer() {
|
|
95
95
|
const layerVersionName = `${this.resourceIdPrefix}-group-by-date-dependencies`;
|
|
96
|
+
const functionDirPath = path.join(__dirname, '../../functions/access-logs-analysis/group-by-date');
|
|
96
97
|
return new aws_lambda_1.LayerVersion(this, layerVersionName, {
|
|
97
98
|
layerVersionName,
|
|
98
99
|
compatibleArchitectures: [aws_lambda_1.Architecture.ARM_64, aws_lambda_1.Architecture.X86_64],
|
|
99
100
|
compatibleRuntimes: [aws_lambda_1.Runtime.NODEJS_18_X, aws_lambda_1.Runtime.NODEJS_20_X],
|
|
100
|
-
code: aws_lambda_1.Code.fromAsset(
|
|
101
|
+
code: aws_lambda_1.Code.fromAsset(functionDirPath, {
|
|
101
102
|
assetHashType: aws_cdk_lib_1.AssetHashType.OUTPUT,
|
|
102
103
|
bundling: {
|
|
104
|
+
command: ['sh', '-c', 'echo "Docker build not supported. Please install yarn."'],
|
|
103
105
|
image: aws_lambda_1.Runtime.NODEJS_20_X.bundlingImage,
|
|
104
106
|
local: {
|
|
105
107
|
tryBundle(outputDir) {
|
|
106
108
|
try {
|
|
107
|
-
(0, node_child_process_1.execSync)('
|
|
109
|
+
(0, node_child_process_1.execSync)('yarn install', {
|
|
110
|
+
cwd: functionDirPath
|
|
111
|
+
});
|
|
108
112
|
}
|
|
109
113
|
catch (_a) {
|
|
110
114
|
return false;
|
|
111
115
|
}
|
|
112
|
-
fs.cpSync(
|
|
113
|
-
recursive: true
|
|
116
|
+
fs.cpSync(`${functionDirPath}/node_modules`, `${outputDir}/nodejs/node_modules`, {
|
|
117
|
+
recursive: true,
|
|
114
118
|
});
|
|
115
119
|
return true;
|
|
116
120
|
},
|
|
@@ -122,24 +126,28 @@ class AccessLogsAnalysis extends constructs_1.Construct {
|
|
|
122
126
|
}
|
|
123
127
|
createPartitioningLayer() {
|
|
124
128
|
const layerVersionName = `${this.resourceIdPrefix}-partitioning-dependencies`;
|
|
129
|
+
const functionDirPath = path.join(__dirname, '../../functions/access-logs-analysis/partitioning');
|
|
125
130
|
return new aws_lambda_1.LayerVersion(this, layerVersionName, {
|
|
126
131
|
layerVersionName,
|
|
127
132
|
compatibleArchitectures: [aws_lambda_1.Architecture.ARM_64, aws_lambda_1.Architecture.X86_64],
|
|
128
133
|
compatibleRuntimes: [aws_lambda_1.Runtime.NODEJS_18_X, aws_lambda_1.Runtime.NODEJS_20_X],
|
|
129
|
-
code: aws_lambda_1.Code.fromAsset(
|
|
134
|
+
code: aws_lambda_1.Code.fromAsset(functionDirPath, {
|
|
130
135
|
assetHashType: aws_cdk_lib_1.AssetHashType.OUTPUT,
|
|
131
136
|
bundling: {
|
|
137
|
+
command: ['sh', '-c', 'echo "Docker build not supported. Please install yarn."'],
|
|
132
138
|
image: aws_lambda_1.Runtime.NODEJS_20_X.bundlingImage,
|
|
133
139
|
local: {
|
|
134
140
|
tryBundle(outputDir) {
|
|
135
141
|
try {
|
|
136
|
-
(0, node_child_process_1.execSync)('
|
|
142
|
+
(0, node_child_process_1.execSync)('yarn install', {
|
|
143
|
+
cwd: functionDirPath
|
|
144
|
+
});
|
|
137
145
|
}
|
|
138
146
|
catch (_a) {
|
|
139
147
|
return false;
|
|
140
148
|
}
|
|
141
|
-
fs.cpSync(
|
|
142
|
-
recursive: true
|
|
149
|
+
fs.cpSync(`${functionDirPath}/node_modules`, `${outputDir}/nodejs/node_modules`, {
|
|
150
|
+
recursive: true,
|
|
143
151
|
});
|
|
144
152
|
return true;
|
|
145
153
|
},
|
|
@@ -155,23 +163,27 @@ class AccessLogsAnalysis extends constructs_1.Construct {
|
|
|
155
163
|
*/
|
|
156
164
|
createGroupByDateLambda() {
|
|
157
165
|
const functionName = `${this.resourceIdPrefix}-group-by-date`;
|
|
166
|
+
const functionDirPath = path.join(__dirname, '../../functions/access-logs-analysis/group-by-date');
|
|
158
167
|
const lambda = new aws_lambda_1.Function(this, functionName, {
|
|
159
168
|
functionName,
|
|
160
169
|
architecture: aws_lambda_1.Architecture.ARM_64,
|
|
161
170
|
runtime: aws_lambda_1.Runtime.NODEJS_20_X,
|
|
162
|
-
code: aws_lambda_1.Code.fromAsset(
|
|
171
|
+
code: aws_lambda_1.Code.fromAsset(functionDirPath, {
|
|
163
172
|
assetHashType: aws_cdk_lib_1.AssetHashType.OUTPUT,
|
|
164
173
|
bundling: {
|
|
174
|
+
command: ['sh', '-c', 'echo "Docker build not supported. Please install yarn."'],
|
|
165
175
|
image: aws_lambda_1.Runtime.NODEJS_20_X.bundlingImage,
|
|
166
176
|
local: {
|
|
167
177
|
tryBundle(outputDir) {
|
|
168
178
|
try {
|
|
169
|
-
(0, node_child_process_1.execSync)('
|
|
179
|
+
(0, node_child_process_1.execSync)('yarn install && yarn build', {
|
|
180
|
+
cwd: functionDirPath
|
|
181
|
+
});
|
|
170
182
|
}
|
|
171
183
|
catch (_a) {
|
|
172
184
|
return false;
|
|
173
185
|
}
|
|
174
|
-
fs.cpSync(
|
|
186
|
+
fs.cpSync(`${functionDirPath}/build/app`, outputDir, {
|
|
175
187
|
recursive: true
|
|
176
188
|
});
|
|
177
189
|
return true;
|
|
@@ -206,24 +218,28 @@ class AccessLogsAnalysis extends constructs_1.Construct {
|
|
|
206
218
|
*/
|
|
207
219
|
createCreatePartitionLambda() {
|
|
208
220
|
const functionName = `${this.resourceIdPrefix}-create-part`;
|
|
221
|
+
const functionDirPath = path.join(__dirname, '../../functions/access-logs-analysis/partitioning');
|
|
209
222
|
const lambda = new aws_lambda_1.Function(this, functionName, {
|
|
210
223
|
functionName,
|
|
211
224
|
architecture: aws_lambda_1.Architecture.ARM_64,
|
|
212
225
|
runtime: aws_lambda_1.Runtime.NODEJS_20_X,
|
|
213
|
-
code: aws_lambda_1.Code.fromAsset(
|
|
226
|
+
code: aws_lambda_1.Code.fromAsset(functionDirPath, {
|
|
214
227
|
exclude: ['transform-partition*', '*.d.ts'],
|
|
215
228
|
assetHashType: aws_cdk_lib_1.AssetHashType.OUTPUT,
|
|
216
229
|
bundling: {
|
|
230
|
+
command: ['sh', '-c', 'echo "Docker build not supported. Please install yarn."'],
|
|
217
231
|
image: aws_lambda_1.Runtime.NODEJS_20_X.bundlingImage,
|
|
218
232
|
local: {
|
|
219
233
|
tryBundle(outputDir) {
|
|
220
234
|
try {
|
|
221
|
-
(0, node_child_process_1.execSync)('
|
|
235
|
+
(0, node_child_process_1.execSync)('yarn install && yarn build', {
|
|
236
|
+
cwd: functionDirPath
|
|
237
|
+
});
|
|
222
238
|
}
|
|
223
239
|
catch (_a) {
|
|
224
240
|
return false;
|
|
225
241
|
}
|
|
226
|
-
fs.cpSync(
|
|
242
|
+
fs.cpSync(`${functionDirPath}/build/app`, outputDir, {
|
|
227
243
|
recursive: true
|
|
228
244
|
});
|
|
229
245
|
return true;
|
|
@@ -363,4 +379,4 @@ AccessLogsAnalysis.ACCESS_LOGS_FOLDER_UNPROCESSED = 'unprocessed';
|
|
|
363
379
|
AccessLogsAnalysis.ACCESS_LOGS_FOLDER_GROUPED_BY_DATE = 'by-date';
|
|
364
380
|
AccessLogsAnalysis.ACCESS_LOGS_FOLDER_TRANSFORMED = 'transformed';
|
|
365
381
|
AccessLogsAnalysis.ACCESS_LOGS_FOLDER_ATHENA_RESULTS = 'athena-query-results';
|
|
366
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWNjZXNzTG9nc0FuYWx5c2lzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQWNjZXNzTG9nc0FuYWx5c2lzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtDQUE0RTtBQUM1RSwyQ0FBcUM7QUFDckMsdURBQW9EO0FBR3BELHVEQUEyRjtBQUMzRix1REFBdUU7QUFDdkUsNkNBQWtGO0FBQ2xGLDREQUF5RDtBQUN6RCxtRkFBbUU7QUFDbkUsbURBQW1EO0FBQ25ELGlEQUE0RDtBQUM1RCx1RUFBOEQ7QUFDOUQsNkJBQTZCO0FBRzdCLDJEQUE0QztBQUM1Qyx5QkFBeUI7QUFFekI7Ozs7R0FJRztBQUNILE1BQXNCLGtCQUFtQixTQUFRLHNCQUFTO0lBcUJ0RCxZQUFzQixLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE4QjtRQUM5RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO1FBQzdDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDaEUsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQ2xFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUN0RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDeEQsSUFBSSxD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QkFDdEMsR0FBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBMEI7YUFDN0QsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQzVCLHFCQUFxQixFQUFFLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLENBQUM7U0FDbEUsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7QUExWUwsZ0RBaVpDO0FBL1k2QixpREFBOEIsR0FBRyxhQUFhLENBQUM7QUFDL0MscURBQWtDLEdBQUcsU0FBUyxDQUFDO0FBQy9DLGlEQUE4QixHQUFHLGFBQWEsQ0FBQztBQUMvQyxvREFBaUMsR0FBRyxzQkFBc0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QnVja2V0LCBFdmVudFR5cGUsIE5vdGlmaWNhdGlvbktleUZpbHRlcn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7Q29uc3RydWN0fSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7Q2ZuV29ya0dyb3VwfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXRoZW5hJztcbmltcG9ydCB7Q2xvdWRGcm9udEFjY2Vzc0xvZ3NCeURhdGVUYWJsZX0gZnJvbSAnLi9DbG91ZEZyb250QWNjZXNzTG9nc0J5RGF0ZVRhYmxlJztcbmltcG9ydCB7QWNjZXNzTG9nc1BhcnF1ZXRUYWJsZX0gZnJvbSAnLi9BY2Nlc3NMb2dzUGFycXVldFRhYmxlJztcbmltcG9ydCB7QXJjaGl0ZWN0dXJlLCBDb2RlLCBGdW5jdGlvbiwgTGF5ZXJWZXJzaW9uLCBSdW50aW1lfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7UnVsZSwgUnVsZVRhcmdldElucHV0LCBTY2hlZHVsZX0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQge0Fzc2V0SGFzaFR5cGUsIENmblRhZywgRHVyYXRpb24sIFJlbW92YWxQb2xpY3ksIFN0YWNrfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQge0NvbHVtbiwgRGF0YWJhc2V9IGZyb20gJ0Bhd3MtY2RrL2F3cy1nbHVlLWFscGhhJztcbmltcG9ydCB7UzNFdmVudFNvdXJjZX0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ldmVudC1zb3VyY2VzJztcbmltcG9ydCB7UmV0ZW50aW9uRGF5c30gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0IHtFZmZlY3QsIFBvbGljeVN0YXRlbWVudH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQge0xhbWJkYUZ1bmN0aW9ufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZXZlbnRzLXRhcmdldHMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7QWNjZXNzTG9nc0FuYWx5c2lzUHJvcHN9IGZyb20gXCIuL0FjY2Vzc0xvZ3NBbmFseXNpc1Byb3BzXCI7XG5pbXBvcnQge0NvbHVtblRyYW5zZm9ybWF0aW9uUnVsZXN9IGZyb20gXCIuLi8uLi9mdW5jdGlvbnMvYWNjZXNzLWxvZ3MtYW5hbHlzaXMvcGFydGl0aW9uaW5nL3R5cGVzXCI7XG5pbXBvcnQge2V4ZWNTeW5jfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcblxuLyoqXG4gKiBQcm92aWRlcyB0aGUgQVdTIHJlc291cmNlcyB0byBhbmFseXplIGFjY2VzcyBsb2dzLiBUaGlzIGNvbnN0cnVjdCBpcyBkZXJpdmVkIGZyb20gdGhlIG9mZmljaWFsIEFXUyBzYW1wbGVcbiAqIENsb3VkRm9ybWF0aW9uIHN0YWNrOlxuICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3Mtc2FtcGxlcy9hbWF6b24tY2xvdWRmcm9udC1hY2Nlc3MtbG9ncy1xdWVyaWVzL2Jsb2IvbWFpbmxpbmUvdGVtcGxhdGUueWFtbH1cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFjY2Vzc0xvZ3NBbmFseXNpcyBleHRlbmRzIENvbnN0cnVjdCB7XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIHJlYWRvbmx5IEFDQ0VTU19MT0dTX0ZPTERFUl9VTlBST0NFU1NFRCA9ICd1bnByb2Nlc3NlZCc7XG4gICAgcHJvdGVjdGVkIHN0YXRpYyByZWFkb25seSBBQ0NFU1NfTE9HU19GT0xERVJfR1JPVVBFRF9CWV9EQVRFID0gJ2J5LWRhdGUnO1xuICAgIHByb3RlY3RlZCBzdGF0aWMgcmVhZG9ubHkgQUNDRVNTX0xPR1NfRk9MREVSX1RSQU5TRk9STUVEID0gJ3RyYW5zZm9ybWVkJztcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHJlYWRvbmx5IEFDQ0VTU19MT0dTX0ZPTERFUl9BVEhFTkFfUkVTVUxUUyA9ICdhdGhlbmEtcXVlcnktcmVzdWx0cyc7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb3VyY2VJZFByZWZpeDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBidWNrZXQ6IEJ1Y2tldDtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgd29ya2dyb3VwOiBDZm5Xb3JrR3JvdXA7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRhdGFiYXNlOiBEYXRhYmFzZTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWNjZXNzTG9nc0J5RGF0ZVRhYmxlOiBDbG91ZEZyb250QWNjZXNzTG9nc0J5RGF0ZVRhYmxlO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBhY2Nlc3NMb2dzUGFycXVldFRhYmxlOiBBY2Nlc3NMb2dzUGFycXVldFRhYmxlO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBncm91cEJ5RGF0ZUxheWVyOiBMYXllclZlcnNpb247XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGdyb3VwQnlEYXRlTGFtYmRhOiBGdW5jdGlvbjtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGFydGl0aW9uaW5nTGF5ZXI6IExheWVyVmVyc2lvbjtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3JlYXRlUGFydGl0aW9uTGFtYmRhOiBGdW5jdGlvbjtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdHJhbnNmb3JtUGFydGl0aW9uTGFtYmRhOiBGdW5jdGlvbjtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3JlYXRlUGFydGl0aW9uc1NjaGVkdWxlcjogUnVsZTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdHJhbnNmb3JtUGFydGl0aW9uc1NjaGVkdWxlcjogUnVsZTtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQWNjZXNzTG9nc0FuYWx5c2lzUHJvcHMpIHtcbiAgICAgICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICAgICAgdGhpcy5yZXNvdXJjZUlkUHJlZml4ID0gcHJvcHMucmVzb3VyY2VQcmVmaXg7XG4gICAgICAgIHRoaXMuYnVja2V0ID0gcHJvcHMuYnVja2V0O1xuICAgICAgICB0aGlzLnNldHVwTGlmZWN5Y2xlUnVsZXMocHJvcHMpO1xuICAgICAgICB0aGlzLndvcmtncm91cCA9IHRoaXMuY3JlYXRlV29ya2dyb3VwKCk7XG4gICAgICAgIHRoaXMuZGF0YWJhc2UgPSB0aGlzLmNyZWF0ZUdsdWVEYXRhYmFzZSgpO1xuICAgICAgICB0aGlzLmFjY2Vzc0xvZ3NCeURhdGVUYWJsZSA9IHRoaXMuY3JlYXRlQWNjZXNzTG9nc0J5RGF0ZVRhYmxlKCk7XG4gICAgICAgIHRoaXMuYWNjZXNzTG9nc1BhcnF1ZXRUYWJsZSA9IHRoaXMuY3JlYXRlQWNjZXNzTG9nc1BhcnF1ZXRUYWJsZSgpO1xuICAgICAgICB0aGlzLmdyb3VwQnlEYXRlTGF5ZXIgPSB0aGlzLmNyZWF0ZUdyb3VwQnlEYXRlTGF5ZXIoKTtcbiAgICAgICAgdGhpcy5ncm91cEJ5RGF0ZUxhbWJkYSA9IHRoaXMuY3JlYXRlR3JvdXBCeURhdGVMYW1iZGEoKTtcbiAgICAgICAgdGhpcy5wYXJ0aXRpb25pbmdMYXllciA9IHRoaXMuY3JlYXRlUGFydGl0aW9uaW5nTGF5ZXIoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVQYXJ0aXRpb25MYW1iZGEgPSB0aGlzLmNyZWF0ZUNyZWF0ZVBhcnRpdGlvbkxhbWJkYSgpO1xuICAgICAgICB0aGlzLnRyYW5zZm9ybVBhcnRpdGlvbkxhbWJkYSA9IHRoaXMuY3JlYXRlVHJhbnNmb3JtUGFydGl0aW9uTGFtYmRhKCk7XG4gICAgICAgIHRoaXMuY3JlYXRlUGFydGl0aW9uc1NjaGVkdWxlciA9IHRoaXMuY3JlYXRlQ3JlYXRlUGFydGl0aW9uc1NjaGVkdWxlcigpO1xuICAgICAgICB0aGlzLnRyYW5zZm9ybVBhcnRpdGlvbnNTY2hlZHVsZXIgPSB0aGlzLmNyZWF0ZVRyYW5zZm9ybVBhcnRpdGlvbnNTY2hlZHVsZXIocHJvcHMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBMaWZlY3ljbGVSdWxlcyhwcm9wczogQWNjZXNzTG9nc0FuYWx5c2lzUHJvcHMpOiB2b2lkIHtcbiAgICAgICAgLy8gY2xlYW51cCByYXcgYW5kIHBhcnRpdGlvbmVkIGFjY2VzcyBsb2dzIGFmdGVyIGEgY29uZmlndXJhYmxlIHRpbWUgcmFuZ2VcblxuICAgICAgICB0aGlzLmJ1Y2tldC5hZGRMaWZlY3ljbGVSdWxlKHtcbiAgICAgICAgICAgIGlkOiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNsZWFudXAtdW5wcm9jZXNzZWRgLFxuICAgICAgICAgICAgcHJlZml4OiBgJHtBY2Nlc3NMb2dzQW5hbHlzaXMuQUNDRVNTX0xPR1NfRk9MREVSX1VOUFJPQ0VTU0VEfS8qYCxcbiAgICAgICAgICAgIGV4cGlyYXRpb246IHByb3BzLmV4cGlyZVJhd0xvZ3NBZnRlciA/PyBEdXJhdGlvbi5kYXlzKDcpLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmJ1Y2tldC5hZGRMaWZlY3ljbGVSdWxlKHtcbiAgICAgICAgICAgIGlkOiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNsZWFudXAtZ3JvdXBlZGAsXG4gICAgICAgICAgICBwcmVmaXg6IGAke0FjY2Vzc0xvZ3NBbmFseXNpcy5BQ0NFU1NfTE9HU19GT0xERVJfR1JPVVBFRF9CWV9EQVRFfS8qYCxcbiAgICAgICAgICAgIGV4cGlyYXRpb246IHByb3BzLmV4cGlyZUludGVybWVkaWF0ZUxvZ3NBZnRlciA/PyBEdXJhdGlvbi5kYXlzKDcpLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmJ1Y2tldC5hZGRMaWZlY3ljbGVSdWxlKHtcbiAgICAgICAgICAgIGlkOiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNsZWFudXAtdHJhbnNmb3JtZWRgLFxuICAgICAgICAgICAgcHJlZml4OiBgJHtBY2Nlc3NMb2dzQW5hbHlzaXMuQUNDRVNTX0xPR1NfRk9MREVSX1RSQU5TRk9STUVEfS8qYCxcbiAgICAgICAgICAgIGV4cGlyYXRpb246IHByb3BzLmV4cGlyZVRyYW5zZm9ybWVkTG9nc0FmdGVyID8/IER1cmF0aW9uLmRheXMoMTgwKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyogQ0hFQ0tNRTogZGVsZXRlIHF1ZXJ5IHJlc3VsdHMgYWZ0ZXIgMSB3ZWVrXG4gICAgICAgIHRoaXMuYnVja2V0LmFkZExpZmVjeWNsZVJ1bGUoe1xuICAgICAgICAgIGlkOiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNsZWFudXAtcXVlcnktcmVzdWx0c2AsXG4gICAgICAgICAgcHJlZml4OiBgJHtBY2Nlc3NMb2dzQW5hbHlzaXMuQUNDRVNTX0xPR1NfRk9MREVSX0FUSEVOQV9SRVNVTFRTfS8qYCxcbiAgICAgICAgICBleHBpcmF0aW9uOiBEdXJhdGlvbi5kYXlzKDcpLFxuICAgICAgICB9KTtcbiAgICAgICAgKi9cbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVdvcmtncm91cCgpOiBDZm5Xb3JrR3JvdXAge1xuICAgICAgICBjb25zdCB3b3JrZ3JvdXBOYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS13b3JrZ3JvdXBgO1xuXG4gICAgICAgIC8vIGR1ZSB0byBhIGN1cnJlbnQgYnVnLCB0aGUgdGFncyBhcmUgbm90IGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgdG8gdGhlIHdvcmtncm91cFxuICAgICAgICAvLyBub3RlLCB0aGF0IHRoZSBrZXlzIG11c3QgYmUgY29udmVydGVkIHRvIGxvd2VyIGNhc2VcbiAgICAgICAgY29uc3QgdGFnczogQ2ZuVGFnW10gPSBTdGFjay5vZih0aGlzKVxuICAgICAgICAgICAgLnRhZ3MucmVuZGVyVGFncygpXG4gICAgICAgICAgICAubWFwKCh0YWc6IHsgS2V5OiBzdHJpbmc7IFZhbHVlOiBzdHJpbmcgfSkgPT4gKHtrZXk6IHRhZy5LZXksIHZhbHVlOiB0YWcuVmFsdWV9KSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBDZm5Xb3JrR3JvdXAodGhpcywgd29ya2dyb3VwTmFtZSwge1xuICAgICAgICAgICAgbmFtZTogd29ya2dyb3VwTmFtZSxcbiAgICAgICAgICAgIHJlY3Vyc2l2ZURlbGV0ZU9wdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgIHdvcmtHcm91cENvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgICAgICBwdWJsaXNoQ2xvdWRXYXRjaE1ldHJpY3NFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICByZXN1bHRDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dExvY2F0aW9uOiBgczM6Ly8ke3RoaXMuYnVja2V0LmJ1Y2tldE5hbWV9LyR7QWNjZXNzTG9nc0FuYWx5c2lzLkFDQ0VTU19MT0dTX0ZPTERFUl9BVEhFTkFfUkVTVUxUU31gLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZW5mb3JjZVdvcmtHcm91cENvbmZpZ3VyYXRpb246IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0YWdzLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUdsdWVEYXRhYmFzZSgpOiBEYXRhYmFzZSB7XG4gICAgICAgIGNvbnN0IGRhdGFiYXNlTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tZGF0YWJhc2VgO1xuICAgICAgICByZXR1cm4gbmV3IERhdGFiYXNlKHRoaXMsIGRhdGFiYXNlTmFtZSwge1xuICAgICAgICAgICAgLy8gQXRoZW5hIGRvZXNuJ3Qgc3VwcG9ydCBkYXNoZXMgaW4gZGF0YWJhc2UvdGFibGUgbmFtZXNcbiAgICAgICAgICAgIGRhdGFiYXNlTmFtZTogZGF0YWJhc2VOYW1lLnJlcGxhY2UoLy0vZywgJ18nKSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IGNyZWF0ZUFjY2Vzc0xvZ3NCeURhdGVUYWJsZSgpOiBDbG91ZEZyb250QWNjZXNzTG9nc0J5RGF0ZVRhYmxlO1xuXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IGNyZWF0ZUFjY2Vzc0xvZ3NQYXJxdWV0VGFibGUoKTogQ2xvdWRGcm9udEFjY2Vzc0xvZ3NCeURhdGVUYWJsZTtcblxuICAgIHByaXZhdGUgY3JlYXRlR3JvdXBCeURhdGVMYXllcigpOiBMYXllclZlcnNpb24ge1xuICAgICAgICBjb25zdCBsYXllclZlcnNpb25OYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1ncm91cC1ieS1kYXRlLWRlcGVuZGVuY2llc2A7XG4gICAgICAgIHJldHVybiBuZXcgTGF5ZXJWZXJzaW9uKHRoaXMsIGxheWVyVmVyc2lvbk5hbWUsIHtcbiAgICAgICAgICAgIGxheWVyVmVyc2lvbk5hbWUsXG4gICAgICAgICAgICBjb21wYXRpYmxlQXJjaGl0ZWN0dXJlczogW0FyY2hpdGVjdHVyZS5BUk1fNjQsIEFyY2hpdGVjdHVyZS5YODZfNjRdLFxuICAgICAgICAgICAgY29tcGF0aWJsZVJ1bnRpbWVzOiBbUnVudGltZS5OT0RFSlNfMThfWCwgUnVudGltZS5OT0RFSlNfMjBfWF0sXG4gICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vZnVuY3Rpb25zL2FjY2Vzcy1sb2dzLWFuYWx5c2lzL2dyb3VwLWJ5LWRhdGUvYnVpbGQvbGF5ZXInKSwge1xuICAgICAgICAgICAgICAgIGFzc2V0SGFzaFR5cGU6IEFzc2V0SGFzaFR5cGUuT1VUUFVULFxuICAgICAgICAgICAgICAgIGJ1bmRsaW5nOiB7XG4gICAgICAgICAgICAgICAgICAgIGltYWdlOiBSdW50aW1lLk5PREVKU18yMF9YLmJ1bmRsaW5nSW1hZ2UsXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnlCdW5kbGUob3V0cHV0RGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjU3luYygnY2QgJyArIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9mdW5jdGlvbnMvYWNjZXNzLWxvZ3MtYW5hbHlzaXMvZ3JvdXAtYnktZGF0ZScpICsgJyAmJiB5YXJuIGluc3RhbGwnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLmNwU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vZnVuY3Rpb25zL2FjY2Vzcy1sb2dzLWFuYWx5c2lzL2dyb3VwLWJ5LWRhdGUvbm9kZV9tb2R1bGVzJyksIGAke291dHB1dERpcn0vbm9kZWpzL25vZGVfbW9kdWxlc2AsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzaXZlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVQYXJ0aXRpb25pbmdMYXllcigpOiBMYXllclZlcnNpb24ge1xuICAgICAgICBjb25zdCBsYXllclZlcnNpb25OYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1wYXJ0aXRpb25pbmctZGVwZW5kZW5jaWVzYDtcbiAgICAgICAgcmV0dXJuIG5ldyBMYXllclZlcnNpb24odGhpcywgbGF5ZXJWZXJzaW9uTmFtZSwge1xuICAgICAgICAgICAgbGF5ZXJWZXJzaW9uTmFtZSxcbiAgICAgICAgICAgIGNvbXBhdGlibGVBcmNoaXRlY3R1cmVzOiBbQXJjaGl0ZWN0dXJlLkFSTV82NCwgQXJjaGl0ZWN0dXJlLlg4Nl82NF0sXG4gICAgICAgICAgICBjb21wYXRpYmxlUnVudGltZXM6IFtSdW50aW1lLk5PREVKU18xOF9YLCBSdW50aW1lLk5PREVKU18yMF9YXSxcbiAgICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9mdW5jdGlvbnMvYWNjZXNzLWxvZ3MtYW5hbHlzaXMvcGFydGl0aW9uaW5nL2J1aWxkL2xheWVyJyksIHtcbiAgICAgICAgICAgICAgICBhc3NldEhhc2hUeXBlOiBBc3NldEhhc2hUeXBlLk9VVFBVVCxcbiAgICAgICAgICAgICAgICBidW5kbGluZzoge1xuICAgICAgICAgICAgICAgICAgICBpbWFnZTogUnVudGltZS5OT0RFSlNfMjBfWC5idW5kbGluZ0ltYWdlLFxuICAgICAgICAgICAgICAgICAgICBsb2NhbDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5QnVuZGxlKG91dHB1dERpcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY1N5bmMoJ2NkICcgKyBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vZnVuY3Rpb25zL2FjY2Vzcy1sb2dzLWFuYWx5c2lzL3BhcnRpdGlvbmluZycpICsgJyAmJiB5YXJuIGluc3RhbGwnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLmNwU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vZnVuY3Rpb25zL2FjY2Vzcy1sb2dzLWFuYWx5c2lzL3BhcnRpdGlvbmluZy9ub2RlX21vZHVsZXMnKSwgYCR7b3V0cHV0RGlyfS9ub2RlanMvbm9kZV9tb2R1bGVzYCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNpdmU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIExhbWJkYSBmdW5jdGlvbiB0byBiZSB0cmlnZ2VyZWQgd2hlbmV2ZXIgYSBuZXcgYWNjZXNzIGxvZyBpcyBjcmVhdGVkLlxuICAgICAqIEl0IG1vdmVzIHRoZSByYXcgYWNjZXNzIGxvZ3MgaW50byBhIHN1YiBmb2xkZXIgaGllcmFyY2h5IGJ5IHllYXIsIG1vbnRoLCBkYXkgYW5kIGhvdXIuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVHcm91cEJ5RGF0ZUxhbWJkYSgpOiBGdW5jdGlvbiB7XG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tZ3JvdXAtYnktZGF0ZWA7XG5cbiAgICAgICAgY29uc3QgbGFtYmRhID0gbmV3IEZ1bmN0aW9uKHRoaXMsIGZ1bmN0aW9uTmFtZSwge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9mdW5jdGlvbnMvYWNjZXNzLWxvZ3MtYW5hbHlzaXMvZ3JvdXAtYnktZGF0ZS9idWlsZC9hcHAnKSwge1xuICAgICAgICAgICAgICAgIGFzc2V0SGFzaFR5cGU6IEFzc2V0SGFzaFR5cGUuT1VUUFVULFxuICAgICAgICAgICAgICAgIGJ1bmRsaW5nOiB7XG4gICAgICAgICAgICAgICAgICAgIGltYWdlOiBSdW50aW1lLk5PREVKU18yMF9YLmJ1bmRsaW5nSW1hZ2UsXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnlCdW5kbGUob3V0cHV0RGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjU3luYygnY2QgJyArIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9mdW5jdGlvbnMvYWNjZXNzLWxvZ3MtYW5hbHlzaXMvZ3JvdXAtYnktZGF0ZScpICsgJyAmJiB5YXJuIGluc3RhbGwgJiYgeWFybiBidWlsZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMuY3BTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9mdW5jdGlvbnMvYWNjZXNzLWxvZ3MtYW5hbHlzaXMvZ3JvdXAtYnktZGF0ZS9idWlsZC9hcHAnKSwgb3V0cHV0RGlyLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBtZW1vcnlTaXplOiA1MTIsXG4gICAgICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDIwKSxcbiAgICAgICAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgICAgICAgIGxheWVyczogW3RoaXMuZ3JvdXBCeURhdGVMYXllcl0sXG4gICAgICAgICAgICBldmVudHM6IFtcbiAgICAgICAgICAgICAgICBuZXcgUzNFdmVudFNvdXJjZSh0aGlzLmJ1Y2tldCwge1xuICAgICAgICAgICAgICAgICAgICBldmVudHM6IFtFdmVudFR5cGUuT0JKRUNUX0NSRUFURURdLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiBbdGhpcy5nZXRVbnByb2Nlc3NlZE9iamVjdHNGaWx0ZXIoKV0sXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgbG9nUmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLlRXT19XRUVLUyxcbiAgICAgICAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgICAgICAgICAgQVdTX05PREVKU19DT05ORUNUSU9OX1JFVVNFX0VOQUJMRUQ6ICcxJyxcbiAgICAgICAgICAgICAgICBOT0RFX09QVElPTlM6ICctLWVuYWJsZS1zb3VyY2UtbWFwcycsXG4gICAgICAgICAgICAgICAgVEFSR0VUX0ZPTERFUjogQWNjZXNzTG9nc0FuYWx5c2lzLkFDQ0VTU19MT0dTX0ZPTERFUl9HUk9VUEVEX0JZX0RBVEUsXG4gICAgICAgICAgICAgICAgUkFXX0FDQ0VTU19MT0dfRklMRV9QQVRURVJOOiB0aGlzLmdldFJhd0FjY2Vzc0xvZ0ZpbGVQYXR0ZXJuKCkuc291cmNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5idWNrZXQuZ3JhbnRSZWFkV3JpdGUobGFtYmRhKTtcbiAgICAgICAgdGhpcy5idWNrZXQuZ3JhbnREZWxldGUobGFtYmRhLCBgJHtBY2Nlc3NMb2dzQW5hbHlzaXMuQUNDRVNTX0xPR1NfRk9MREVSX1VOUFJPQ0VTU0VEfS8qYCk7XG5cbiAgICAgICAgcmV0dXJuIGxhbWJkYTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0VW5wcm9jZXNzZWRPYmplY3RzRmlsdGVyKCk6IE5vdGlmaWNhdGlvbktleUZpbHRlcjtcblxuICAgIC8qKiBUaGUgcGF0dGVybiB0byBpZGVudGlmeSB1bnByb2Nlc3NlZCBhY2Nlc3MgbG9ncyBkZXBlbmRzIG9uIHRoZSBwcm9kdWNpbmcgc291cmNlICovXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IGdldFJhd0FjY2Vzc0xvZ0ZpbGVQYXR0ZXJuKCk6IFJlZ0V4cDtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcGFydGl0aW9uIGZvciB0aGUgdXBjb21pbmcgaG91ciBpbiB0aGUgYWNjZXNzIGxvZyBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUNyZWF0ZVBhcnRpdGlvbkxhbWJkYSgpOiBGdW5jdGlvbiB7XG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY3JlYXRlLXBhcnRgO1xuXG4gICAgICAgIGNvbnN0IGxhbWJkYSA9IG5ldyBGdW5jdGlvbih0aGlzLCBmdW5jdGlvbk5hbWUsIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1gsXG4gICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vZnVuY3Rpb25zL2FjY2Vzcy1sb2dzLWFuYWx5c2lzL3BhcnRpdGlvbmluZy9idWlsZC9hcHAnKSwge1xuICAgICAgICAgICAgICAgIGV4Y2x1ZGU6IFsndHJhbnNmb3JtLXBhcnRpdGlvbionLCAnKi5kLnRzJ10sXG4gICAgICAgICAgICAgICAgYXNzZXRIYXNoVHlwZTogQXNzZXRIYXNoVHlwZS5PVVRQVVQsXG4gICAgICAgICAgICAgICAgYnVuZGxpbmc6IHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2U6IFJ1bnRpbWUuTk9ERUpTXzIwX1guYnVuZGxpbmdJbWFnZSxcbiAgICAgICAgICAgICAgICAgICAgbG9jYWw6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeUJ1bmRsZShvdXRwdXREaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNTeW5jKCdjZCAnICsgcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL2Z1bmN0aW9ucy9hY2Nlc3MtbG9ncy1hbmFseXNpcy9wYXJ0aXRpb25pbmcnKSArICcgJiYgeWFybiBpbnN0YWxsICYmIHlhcm4gYnVpbGQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLmNwU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vZnVuY3Rpb25zL2FjY2Vzcy1sb2dzLWFuYWx5c2lzL3BhcnRpdGlvbmluZy9idWlsZC9hcHAnKSwgb3V0cHV0RGlyLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBtZW1vcnlTaXplOiAxMjgsXG4gICAgICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDIwKSxcbiAgICAgICAgICAgIGhhbmRsZXI6ICdjcmVhdGUtcGFydGl0aW9uLmhhbmRsZXInLFxuICAgICAgICAgICAgbGF5ZXJzOiBbdGhpcy5wYXJ0aXRpb25pbmdMYXllcl0sXG4gICAgICAgICAgICBsb2dSZXRlbnRpb246IFJldGVudGlvbkRheXMuVFdPX1dFRUtTLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAgICAgICBBV1NfTk9ERUpTX0NPTk5FQ1RJT05fUkVVU0VfRU5BQkxFRDogJzEnLFxuICAgICAgICAgICAgICAgIE5PREVfT1BUSU9OUzogJy0tZW5hYmxlLXNvdXJjZS1tYXBzJyxcbiAgICAgICAgICAgICAgICBXT1JLR1JPVVA6IHRoaXMud29ya2dyb3VwLm5hbWUsXG4gICAgICAgICAgICAgICAgREFUQUJBU0U6IHRoaXMuZGF0YWJhc2UuZGF0YWJhc2VOYW1lLFxuICAgICAgICAgICAgICAgIFRBQkxFOiB0aGlzLmFjY2Vzc0xvZ3NCeURhdGVUYWJsZS50YWJsZU5hbWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBncmFudCBhY2Nlc3MgdG8gUzMgYnVja2V0IGFuZCB0byBleGVjdXRlIEF0aGVuYSBxdWVyaWVzIHdoaWNoIGNyZWF0ZSBuZXcgcGFydGl0aW9uc1xuICAgICAgICB0aGlzLmJ1Y2tldC5ncmFudFJlYWRXcml0ZShsYW1iZGEpO1xuICAgICAgICBsYW1iZGEuYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICAnYXRoZW5hOlN0YXJ0UXVlcnlFeGVjdXRpb24nLFxuICAgICAgICAgICAgICAgICAgICAnYXRoZW5hOkdldFF1ZXJ5RXhlY3V0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgJ2dsdWU6Q3JlYXRlRGF0YWJhc2UnLFxuICAgICAgICAgICAgICAgICAgICAnZ2x1ZTpDcmVhdGVQYXJ0aXRpb24nLFxuICAgICAgICAgICAgICAgICAgICAnZ2x1ZTpHZXREYXRhYmFzZScsXG4gICAgICAgICAgICAgICAgICAgICdnbHVlOkdldFRhYmxlJyxcbiAgICAgICAgICAgICAgICAgICAgJ2dsdWU6QmF0Y2hDcmVhdGVQYXJ0aXRpb24nLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIGxhbWJkYTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm1zIHBhcnRpdGlvbnMgZnJvbSB0aGUgSGl2ZSBmb3JtYXQgdG8gUGFycXVldC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVRyYW5zZm9ybVBhcnRpdGlvbkxhbWJkYSgpOiBGdW5jdGlvbiB7XG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tdHJhbnNmb3JtLXBhcnRgO1xuXG4gICAgICAgIGNvbnN0IGxhbWJkYSA9IG5ldyBGdW5jdGlvbih0aGlzLCBmdW5jdGlvbk5hbWUsIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1gsXG4gICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vZnVuY3Rpb25zL2FjY2Vzcy1sb2dzLWFuYWx5c2lzL3BhcnRpdGlvbmluZy9idWlsZC9hcHAnKSwge1xuICAgICAgICAgICAgICAgIGV4Y2x1ZGU6IFsnY3JlYXRlLXBhcnRpdGlvbionLCAnKi5kLnRzJ10sXG4gICAgICAgICAgICAgICAgYXNzZXRIYXNoVHlwZTogQXNzZXRIYXNoVHlwZS5PVVRQVVQsXG4gICAgICAgICAgICAgICAgYnVuZGxpbmc6IHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2U6IFJ1bnRpbWUuTk9ERUpTXzIwX1guYnVuZGxpbmdJbWFnZSxcbiAgICAgICAgICAgICAgICAgICAgbG9jYWw6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeUJ1bmRsZShvdXRwdXREaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNTeW5jKCdjZCAnICsgcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL2Z1bmN0aW9ucy9hY2Nlc3MtbG9ncy1hbmFseXNpcy9wYXJ0aXRpb25pbmcnKSArICcgJiYgeWFybiBpbnN0YWxsICYmIHlhcm4gYnVpbGQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLmNwU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vZnVuY3Rpb25zL2FjY2Vzcy1sb2dzLWFuYWx5c2lzL3BhcnRpdGlvbmluZy9idWlsZC9hcHAnKSwgb3V0cHV0RGlyLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBtZW1vcnlTaXplOiAxMjgsXG4gICAgICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDIwKSxcbiAgICAgICAgICAgIGhhbmRsZXI6ICd0cmFuc2Zvcm0tcGFydGl0aW9uLmhhbmRsZXInLFxuICAgICAgICAgICAgbGF5ZXJzOiBbdGhpcy5wYXJ0aXRpb25pbmdMYXllcl0sXG4gICAgICAgICAgICBsb2dSZXRlbnRpb246IFJldGVudGlvbkRheXMuVFdPX1dFRUtTLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAgICAgICBBV1NfTk9ERUpTX0NPTk5FQ1RJT05fUkVVU0VfRU5BQkxFRDogJzEnLFxuICAgICAgICAgICAgICAgIE5PREVfT1BUSU9OUzogJy0tZW5hYmxlLXNvdXJjZS1tYXBzJyxcbiAgICAgICAgICAgICAgICBXT1JLR1JPVVA6IHRoaXMud29ya2dyb3VwLm5hbWUsXG4gICAgICAgICAgICAgICAgREFUQUJBU0U6IHRoaXMuZGF0YWJhc2UuZGF0YWJhc2VOYW1lLFxuICAgICAgICAgICAgICAgIFNPVVJDRV9UQUJMRTogdGhpcy5hY2Nlc3NMb2dzQnlEYXRlVGFibGUudGFibGVOYW1lLFxuICAgICAgICAgICAgICAgIFRBUkdFVF9UQUJMRTogdGhpcy5hY2Nlc3NMb2dzUGFycXVldFRhYmxlLnRhYmxlTmFtZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGdyYW50IGFjY2VzcyB0byBTMyBidWNrZXQgYW5kIHRvIGV4ZWN1dGUgQXRoZW5hIHF1ZXJpZXMgd2hpY2ggY3JlYXRlIG5ldyBwYXJ0aXRpb25zXG4gICAgICAgIHRoaXMuYnVja2V0LmdyYW50UmVhZFdyaXRlKGxhbWJkYSk7XG4gICAgICAgIGxhbWJkYS5hZGRUb1JvbGVQb2xpY3koXG4gICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgICdhdGhlbmE6U3RhcnRRdWVyeUV4ZWN1dGlvbicsXG4gICAgICAgICAgICAgICAgICAgICdhdGhlbmE6R2V0UXVlcnlFeGVjdXRpb24nLFxuICAgICAgICAgICAgICAgICAgICAnZ2x1ZTpDcmVhdGVEYXRhYmFzZScsXG4gICAgICAgICAgICAgICAgICAgICdnbHVlOkNyZWF0ZVBhcnRpdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICdnbHVlOkdldERhdGFiYXNlJyxcbiAgICAgICAgICAgICAgICAgICAgJ2dsdWU6R2V0VGFibGUnLFxuICAgICAgICAgICAgICAgICAgICAnZ2x1ZTpCYXRjaENyZWF0ZVBhcnRpdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICdnbHVlOkdldFBhcnRpdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICdnbHVlOkdldFBhcnRpdGlvbnMnLFxuICAgICAgICAgICAgICAgICAgICAnZ2x1ZTpDcmVhdGVUYWJsZScsXG4gICAgICAgICAgICAgICAgICAgICdnbHVlOkRlbGV0ZVRhYmxlJyxcbiAgICAgICAgICAgICAgICAgICAgJ2dsdWU6RGVsZXRlUGFydGl0aW9uJyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBsYW1iZGE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVDcmVhdGVQYXJ0aXRpb25zU2NoZWR1bGVyKCk6IFJ1bGUge1xuICAgICAgICBjb25zdCBydWxlTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY3JlYXRlLXBhcnQtc2NoZWRgO1xuICAgICAgICByZXR1cm4gbmV3IFJ1bGUodGhpcywgcnVsZU5hbWUsIHtcbiAgICAgICAgICAgIHJ1bGVOYW1lLFxuICAgICAgICAgICAgc2NoZWR1bGU6IFNjaGVkdWxlLmNyb24oe21pbnV0ZTogJzU1J30pLFxuICAgICAgICAgICAgdGFyZ2V0czogW25ldyBMYW1iZGFGdW5jdGlvbih0aGlzLmNyZWF0ZVBhcnRpdGlvbkxhbWJkYSwge3JldHJ5QXR0ZW1wdHM6IDEwfSldLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVRyYW5zZm9ybVBhcnRpdGlvbnNTY2hlZHVsZXIocHJvcHM6IEFjY2Vzc0xvZ3NBbmFseXNpc1Byb3BzKTogUnVsZSB7XG4gICAgICAgIGNvbnN0IHJ1bGVOYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS10cmFuc2Zvcm0tcGFydC1zY2hlZGA7XG4gICAgICAgIHJldHVybiBuZXcgUnVsZSh0aGlzLCBydWxlTmFtZSwge1xuICAgICAgICAgICAgcnVsZU5hbWUsXG4gICAgICAgICAgICBzY2hlZHVsZTogU2NoZWR1bGUuY3Jvbih7bWludXRlOiAnMSd9KSxcbiAgICAgICAgICAgIHRhcmdldHM6IFtcbiAgICAgICAgICAgICAgICBuZXcgTGFtYmRhRnVuY3Rpb24odGhpcy50cmFuc2Zvcm1QYXJ0aXRpb25MYW1iZGEsIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IHRoaXMuZ2V0VHJhbnNmb3JtUGFydGl0aW9uSW52b2NhdGlvblByb3BzKHByb3BzKSxcbiAgICAgICAgICAgICAgICAgICAgcmV0cnlBdHRlbXB0czogMTAsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFRyYW5zZm9ybVBhcnRpdGlvbkludm9jYXRpb25Qcm9wcyhwcm9wczogQWNjZXNzTG9nc0FuYWx5c2lzUHJvcHMpOiBSdWxlVGFyZ2V0SW5wdXQge1xuICAgICAgICByZXR1cm4gUnVsZVRhcmdldElucHV0LmZyb21PYmplY3Qoe1xuICAgICAgICAgICAgY29sdW1uTmFtZXM6IFtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmFjY2Vzc0xvZ3NQYXJxdWV0VGFibGUuY29sdW1ucyxcbiAgICAgICAgICAgICAgICAuLi4odGhpcy5hY2Nlc3NMb2dzUGFycXVldFRhYmxlLnBhcnRpdGlvbktleXMgYXMgQ29sdW1uW10pLFxuICAgICAgICAgICAgXS5tYXAoY29sdW1uID0+IGNvbHVtbi5uYW1lKSxcbiAgICAgICAgICAgIGNvbHVtblRyYW5zZm9ybWF0aW9uczogdGhpcy5nZXRDb2x1bW5UcmFuc2Zvcm1hdGlvblJ1bGVzKHByb3BzKSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTmVlZHMgdG8gcmV0dXJuIHRoZSBsb2cgc291cmNlIHNwZWNpZmljIGNvbHVtbiB0cmFuc2Zvcm1hdGlvbiBydWxlc1xuICAgICAqIChlLmcuIHRvIGFub255bWl6ZSBJUCBhZGRyZXNzZXMpLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRDb2x1bW5UcmFuc2Zvcm1hdGlvblJ1bGVzKHByb3BzOiBBY2Nlc3NMb2dzQW5hbHlzaXNQcm9wcyk6IENvbHVtblRyYW5zZm9ybWF0aW9uUnVsZXM7XG59XG4iXX0=
|
|
382
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWNjZXNzTG9nc0FuYWx5c2lzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQWNjZXNzTG9nc0FuYWx5c2lzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtDQUE0RTtBQUM1RSwyQ0FBcUM7QUFDckMsdURBQW9EO0FBR3BELHVEQUEyRjtBQUMzRix1REFBdUU7QUFDdkUsNkNBQWtGO0FBQ2xGLDREQUF5RDtBQUN6RCxtRkFBbUU7QUFDbkUsbURBQW1EO0FBQ25ELGlEQUE0RDtBQUM1RCx1RUFBOEQ7QUFDOUQsNkJBQTZCO0FBRzdCLDJEQUE0QztBQUM1Qyx5QkFBeUI7QUFFekI7Ozs7R0FJRztBQUNILE1BQXNCLGtCQUFtQixTQUFRLHNCQUFTO0lBcUJ0RCxZQUFzQixLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE4QjtRQUM5RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO1FBQzdDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDaEUsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQ2xFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUN0RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDeEQsSUFBSSxD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SixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sb0NBQW9DLENBQUMsS0FBOEI7UUFDdkUsT0FBTyw0QkFBZSxDQUFDLFVBQVUsQ0FBQztZQUM5QixXQUFXLEVBQUU7Z0JBQ1QsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTztnQkFDdEMsR0FBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBMEI7YUFDN0QsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQzVCLHFCQUFxQixFQUFFLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLENBQUM7U0FDbEUsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7QUF6WkwsZ0RBZ2FDO0FBOVo2QixpREFBOEIsR0FBRyxhQUFhLENBQUM7QUFDL0MscURBQWtDLEdBQUcsU0FBUyxDQUFDO0FBQy9DLGlEQUE4QixHQUFHLGFBQWEsQ0FBQztBQUMvQyxvREFBaUMsR0FBRyxzQkFBc0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QnVja2V0LCBFdmVudFR5cGUsIE5vdGlmaWNhdGlvbktleUZpbHRlcn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7Q29uc3RydWN0fSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7Q2ZuV29ya0dyb3VwfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXRoZW5hJztcbmltcG9ydCB7Q2xvdWRGcm9udEFjY2Vzc0xvZ3NCeURhdGVUYWJsZX0gZnJvbSAnLi9DbG91ZEZyb250QWNjZXNzTG9nc0J5RGF0ZVRhYmxlJztcbmltcG9ydCB7QWNjZXNzTG9nc1BhcnF1ZXRUYWJsZX0gZnJvbSAnLi9BY2Nlc3NMb2dzUGFycXVldFRhYmxlJztcbmltcG9ydCB7QXJjaGl0ZWN0dXJlLCBDb2RlLCBGdW5jdGlvbiwgTGF5ZXJWZXJzaW9uLCBSdW50aW1lfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7UnVsZSwgUnVsZVRhcmdldElucHV0LCBTY2hlZHVsZX0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQge0Fzc2V0SGFzaFR5cGUsIENmblRhZywgRHVyYXRpb24sIFJlbW92YWxQb2xpY3ksIFN0YWNrfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQge0NvbHVtbiwgRGF0YWJhc2V9IGZyb20gJ0Bhd3MtY2RrL2F3cy1nbHVlLWFscGhhJztcbmltcG9ydCB7UzNFdmVudFNvdXJjZX0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ldmVudC1zb3VyY2VzJztcbmltcG9ydCB7UmV0ZW50aW9uRGF5c30gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0IHtFZmZlY3QsIFBvbGljeVN0YXRlbWVudH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQge0xhbWJkYUZ1bmN0aW9ufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZXZlbnRzLXRhcmdldHMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7QWNjZXNzTG9nc0FuYWx5c2lzUHJvcHN9IGZyb20gXCIuL0FjY2Vzc0xvZ3NBbmFseXNpc1Byb3BzXCI7XG5pbXBvcnQge0NvbHVtblRyYW5zZm9ybWF0aW9uUnVsZXN9IGZyb20gXCIuLi8uLi9mdW5jdGlvbnMvYWNjZXNzLWxvZ3MtYW5hbHlzaXMvcGFydGl0aW9uaW5nL3R5cGVzXCI7XG5pbXBvcnQge2V4ZWNTeW5jfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcblxuLyoqXG4gKiBQcm92aWRlcyB0aGUgQVdTIHJlc291cmNlcyB0byBhbmFseXplIGFjY2VzcyBsb2dzLiBUaGlzIGNvbnN0cnVjdCBpcyBkZXJpdmVkIGZyb20gdGhlIG9mZmljaWFsIEFXUyBzYW1wbGVcbiAqIENsb3VkRm9ybWF0aW9uIHN0YWNrOlxuICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3Mtc2FtcGxlcy9hbWF6b24tY2xvdWRmcm9udC1hY2Nlc3MtbG9ncy1xdWVyaWVzL2Jsb2IvbWFpbmxpbmUvdGVtcGxhdGUueWFtbH1cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFjY2Vzc0xvZ3NBbmFseXNpcyBleHRlbmRzIENvbnN0cnVjdCB7XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIHJlYWRvbmx5IEFDQ0VTU19MT0dTX0ZPTERFUl9VTlBST0NFU1NFRCA9ICd1bnByb2Nlc3NlZCc7XG4gICAgcHJvdGVjdGVkIHN0YXRpYyByZWFkb25seSBBQ0NFU1NfTE9HU19GT0xERVJfR1JPVVBFRF9CWV9EQVRFID0gJ2J5LWRhdGUnO1xuICAgIHByb3RlY3RlZCBzdGF0aWMgcmVhZG9ubHkgQUNDRVNTX0xPR1NfRk9MREVSX1RSQU5TRk9STUVEID0gJ3RyYW5zZm9ybWVkJztcbiAgICBwcm90ZWN0ZWQgc3RhdGljIHJlYWRvbmx5IEFDQ0VTU19MT0dTX0ZPTERFUl9BVEhFTkFfUkVTVUxUUyA9ICdhdGhlbmEtcXVlcnktcmVzdWx0cyc7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb3VyY2VJZFByZWZpeDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBidWNrZXQ6IEJ1Y2tldDtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgd29ya2dyb3VwOiBDZm5Xb3JrR3JvdXA7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRhdGFiYXNlOiBEYXRhYmFzZTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWNjZXNzTG9nc0J5RGF0ZVRhYmxlOiBDbG91ZEZyb250QWNjZXNzTG9nc0J5RGF0ZVRhYmxlO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBhY2Nlc3NMb2dzUGFycXVldFRhYmxlOiBBY2Nlc3NMb2dzUGFycXVldFRhYmxlO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBncm91cEJ5RGF0ZUxheWVyOiBMYXllclZlcnNpb247XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGdyb3VwQnlEYXRlTGFtYmRhOiBGdW5jdGlvbjtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGFydGl0aW9uaW5nTGF5ZXI6IExheWVyVmVyc2lvbjtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3JlYXRlUGFydGl0aW9uTGFtYmRhOiBGdW5jdGlvbjtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdHJhbnNmb3JtUGFydGl0aW9uTGFtYmRhOiBGdW5jdGlvbjtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3JlYXRlUGFydGl0aW9uc1NjaGVkdWxlcjogUnVsZTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdHJhbnNmb3JtUGFydGl0aW9uc1NjaGVkdWxlcjogUnVsZTtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQWNjZXNzTG9nc0FuYWx5c2lzUHJvcHMpIHtcbiAgICAgICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICAgICAgdGhpcy5yZXNvdXJjZUlkUHJlZml4ID0gcHJvcHMucmVzb3VyY2VQcmVmaXg7XG4gICAgICAgIHRoaXMuYnVja2V0ID0gcHJvcHMuYnVja2V0O1xuICAgICAgICB0aGlzLnNldHVwTGlmZWN5Y2xlUnVsZXMocHJvcHMpO1xuICAgICAgICB0aGlzLndvcmtncm91cCA9IHRoaXMuY3JlYXRlV29ya2dyb3VwKCk7XG4gICAgICAgIHRoaXMuZGF0YWJhc2UgPSB0aGlzLmNyZWF0ZUdsdWVEYXRhYmFzZSgpO1xuICAgICAgICB0aGlzLmFjY2Vzc0xvZ3NCeURhdGVUYWJsZSA9IHRoaXMuY3JlYXRlQWNjZXNzTG9nc0J5RGF0ZVRhYmxlKCk7XG4gICAgICAgIHRoaXMuYWNjZXNzTG9nc1BhcnF1ZXRUYWJsZSA9IHRoaXMuY3JlYXRlQWNjZXNzTG9nc1BhcnF1ZXRUYWJsZSgpO1xuICAgICAgICB0aGlzLmdyb3VwQnlEYXRlTGF5ZXIgPSB0aGlzLmNyZWF0ZUdyb3VwQnlEYXRlTGF5ZXIoKTtcbiAgICAgICAgdGhpcy5ncm91cEJ5RGF0ZUxhbWJkYSA9IHRoaXMuY3JlYXRlR3JvdXBCeURhdGVMYW1iZGEoKTtcbiAgICAgICAgdGhpcy5wYXJ0aXRpb25pbmdMYXllciA9IHRoaXMuY3JlYXRlUGFydGl0aW9uaW5nTGF5ZXIoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVQYXJ0aXRpb25MYW1iZGEgPSB0aGlzLmNyZWF0ZUNyZWF0ZVBhcnRpdGlvbkxhbWJkYSgpO1xuICAgICAgICB0aGlzLnRyYW5zZm9ybVBhcnRpdGlvbkxhbWJkYSA9IHRoaXMuY3JlYXRlVHJhbnNmb3JtUGFydGl0aW9uTGFtYmRhKCk7XG4gICAgICAgIHRoaXMuY3JlYXRlUGFydGl0aW9uc1NjaGVkdWxlciA9IHRoaXMuY3JlYXRlQ3JlYXRlUGFydGl0aW9uc1NjaGVkdWxlcigpO1xuICAgICAgICB0aGlzLnRyYW5zZm9ybVBhcnRpdGlvbnNTY2hlZHVsZXIgPSB0aGlzLmNyZWF0ZVRyYW5zZm9ybVBhcnRpdGlvbnNTY2hlZHVsZXIocHJvcHMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBMaWZlY3ljbGVSdWxlcyhwcm9wczogQWNjZXNzTG9nc0FuYWx5c2lzUHJvcHMpOiB2b2lkIHtcbiAgICAgICAgLy8gY2xlYW51cCByYXcgYW5kIHBhcnRpdGlvbmVkIGFjY2VzcyBsb2dzIGFmdGVyIGEgY29uZmlndXJhYmxlIHRpbWUgcmFuZ2VcblxuICAgICAgICB0aGlzLmJ1Y2tldC5hZGRMaWZlY3ljbGVSdWxlKHtcbiAgICAgICAgICAgIGlkOiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNsZWFudXAtdW5wcm9jZXNzZWRgLFxuICAgICAgICAgICAgcHJlZml4OiBgJHtBY2Nlc3NMb2dzQW5hbHlzaXMuQUNDRVNTX0xPR1NfRk9MREVSX1VOUFJPQ0VTU0VEfS8qYCxcbiAgICAgICAgICAgIGV4cGlyYXRpb246IHByb3BzLmV4cGlyZVJhd0xvZ3NBZnRlciA/PyBEdXJhdGlvbi5kYXlzKDcpLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmJ1Y2tldC5hZGRMaWZlY3ljbGVSdWxlKHtcbiAgICAgICAgICAgIGlkOiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNsZWFudXAtZ3JvdXBlZGAsXG4gICAgICAgICAgICBwcmVmaXg6IGAke0FjY2Vzc0xvZ3NBbmFseXNpcy5BQ0NFU1NfTE9HU19GT0xERVJfR1JPVVBFRF9CWV9EQVRFfS8qYCxcbiAgICAgICAgICAgIGV4cGlyYXRpb246IHByb3BzLmV4cGlyZUludGVybWVkaWF0ZUxvZ3NBZnRlciA/PyBEdXJhdGlvbi5kYXlzKDcpLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmJ1Y2tldC5hZGRMaWZlY3ljbGVSdWxlKHtcbiAgICAgICAgICAgIGlkOiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNsZWFudXAtdHJhbnNmb3JtZWRgLFxuICAgICAgICAgICAgcHJlZml4OiBgJHtBY2Nlc3NMb2dzQW5hbHlzaXMuQUNDRVNTX0xPR1NfRk9MREVSX1RSQU5TRk9STUVEfS8qYCxcbiAgICAgICAgICAgIGV4cGlyYXRpb246IHByb3BzLmV4cGlyZVRyYW5zZm9ybWVkTG9nc0FmdGVyID8/IER1cmF0aW9uLmRheXMoMTgwKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyogQ0hFQ0tNRTogZGVsZXRlIHF1ZXJ5IHJlc3VsdHMgYWZ0ZXIgMSB3ZWVrXG4gICAgICAgIHRoaXMuYnVja2V0LmFkZExpZmVjeWNsZVJ1bGUoe1xuICAgICAgICAgIGlkOiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNsZWFudXAtcXVlcnktcmVzdWx0c2AsXG4gICAgICAgICAgcHJlZml4OiBgJHtBY2Nlc3NMb2dzQW5hbHlzaXMuQUNDRVNTX0xPR1NfRk9MREVSX0FUSEVOQV9SRVNVTFRTfS8qYCxcbiAgICAgICAgICBleHBpcmF0aW9uOiBEdXJhdGlvbi5kYXlzKDcpLFxuICAgICAgICB9KTtcbiAgICAgICAgKi9cbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVdvcmtncm91cCgpOiBDZm5Xb3JrR3JvdXAge1xuICAgICAgICBjb25zdCB3b3JrZ3JvdXBOYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS13b3JrZ3JvdXBgO1xuXG4gICAgICAgIC8vIGR1ZSB0byBhIGN1cnJlbnQgYnVnLCB0aGUgdGFncyBhcmUgbm90IGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgdG8gdGhlIHdvcmtncm91cFxuICAgICAgICAvLyBub3RlLCB0aGF0IHRoZSBrZXlzIG11c3QgYmUgY29udmVydGVkIHRvIGxvd2VyIGNhc2VcbiAgICAgICAgY29uc3QgdGFnczogQ2ZuVGFnW10gPSBTdGFjay5vZih0aGlzKVxuICAgICAgICAgICAgLnRhZ3MucmVuZGVyVGFncygpXG4gICAgICAgICAgICAubWFwKCh0YWc6IHsgS2V5OiBzdHJpbmc7IFZhbHVlOiBzdHJpbmcgfSkgPT4gKHtrZXk6IHRhZy5LZXksIHZhbHVlOiB0YWcuVmFsdWV9KSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBDZm5Xb3JrR3JvdXAodGhpcywgd29ya2dyb3VwTmFtZSwge1xuICAgICAgICAgICAgbmFtZTogd29ya2dyb3VwTmFtZSxcbiAgICAgICAgICAgIHJlY3Vyc2l2ZURlbGV0ZU9wdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgIHdvcmtHcm91cENvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgICAgICBwdWJsaXNoQ2xvdWRXYXRjaE1ldHJpY3NFbmFibGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICByZXN1bHRDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dExvY2F0aW9uOiBgczM6Ly8ke3RoaXMuYnVja2V0LmJ1Y2tldE5hbWV9LyR7QWNjZXNzTG9nc0FuYWx5c2lzLkFDQ0VTU19MT0dTX0ZPTERFUl9BVEhFTkFfUkVTVUxUU31gLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZW5mb3JjZVdvcmtHcm91cENvbmZpZ3VyYXRpb246IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0YWdzLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUdsdWVEYXRhYmFzZSgpOiBEYXRhYmFzZSB7XG4gICAgICAgIGNvbnN0IGRhdGFiYXNlTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tZGF0YWJhc2VgO1xuICAgICAgICByZXR1cm4gbmV3IERhdGFiYXNlKHRoaXMsIGRhdGFiYXNlTmFtZSwge1xuICAgICAgICAgICAgLy8gQXRoZW5hIGRvZXNuJ3Qgc3VwcG9ydCBkYXNoZXMgaW4gZGF0YWJhc2UvdGFibGUgbmFtZXNcbiAgICAgICAgICAgIGRhdGFiYXNlTmFtZTogZGF0YWJhc2VOYW1lLnJlcGxhY2UoLy0vZywgJ18nKSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IGNyZWF0ZUFjY2Vzc0xvZ3NCeURhdGVUYWJsZSgpOiBDbG91ZEZyb250QWNjZXNzTG9nc0J5RGF0ZVRhYmxlO1xuXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IGNyZWF0ZUFjY2Vzc0xvZ3NQYXJxdWV0VGFibGUoKTogQ2xvdWRGcm9udEFjY2Vzc0xvZ3NCeURhdGVUYWJsZTtcblxuICAgIHByaXZhdGUgY3JlYXRlR3JvdXBCeURhdGVMYXllcigpOiBMYXllclZlcnNpb24ge1xuICAgICAgICBjb25zdCBsYXllclZlcnNpb25OYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1ncm91cC1ieS1kYXRlLWRlcGVuZGVuY2llc2A7XG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uRGlyUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9mdW5jdGlvbnMvYWNjZXNzLWxvZ3MtYW5hbHlzaXMvZ3JvdXAtYnktZGF0ZScpO1xuXG4gICAgICAgIHJldHVybiBuZXcgTGF5ZXJWZXJzaW9uKHRoaXMsIGxheWVyVmVyc2lvbk5hbWUsIHtcbiAgICAgICAgICAgIGxheWVyVmVyc2lvbk5hbWUsXG4gICAgICAgICAgICBjb21wYXRpYmxlQXJjaGl0ZWN0dXJlczogW0FyY2hpdGVjdHVyZS5BUk1fNjQsIEFyY2hpdGVjdHVyZS5YODZfNjRdLFxuICAgICAgICAgICAgY29tcGF0aWJsZVJ1bnRpbWVzOiBbUnVudGltZS5OT0RFSlNfMThfWCwgUnVudGltZS5OT0RFSlNfMjBfWF0sXG4gICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChmdW5jdGlvbkRpclBhdGgsIHtcbiAgICAgICAgICAgICAgICBhc3NldEhhc2hUeXBlOiBBc3NldEhhc2hUeXBlLk9VVFBVVCxcbiAgICAgICAgICAgICAgICBidW5kbGluZzoge1xuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBbJ3NoJywgJy1jJywgJ2VjaG8gXCJEb2NrZXIgYnVpbGQgbm90IHN1cHBvcnRlZC4gUGxlYXNlIGluc3RhbGwgeWFybi5cIiddLFxuICAgICAgICAgICAgICAgICAgICBpbWFnZTogUnVudGltZS5OT0RFSlNfMjBfWC5idW5kbGluZ0ltYWdlLFxuICAgICAgICAgICAgICAgICAgICBsb2NhbDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5QnVuZGxlKG91dHB1dERpcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY1N5bmMoJ3lhcm4gaW5zdGFsbCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZDogZnVuY3Rpb25EaXJQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMuY3BTeW5jKGAke2Z1bmN0aW9uRGlyUGF0aH0vbm9kZV9tb2R1bGVzYCwgYCR7b3V0cHV0RGlyfS9ub2RlanMvbm9kZV9tb2R1bGVzYCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVQYXJ0aXRpb25pbmdMYXllcigpOiBMYXllclZlcnNpb24ge1xuICAgICAgICBjb25zdCBsYXllclZlcnNpb25OYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1wYXJ0aXRpb25pbmctZGVwZW5kZW5jaWVzYDtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25EaXJQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL2Z1bmN0aW9ucy9hY2Nlc3MtbG9ncy1hbmFseXNpcy9wYXJ0aXRpb25pbmcnKTtcblxuICAgICAgICByZXR1cm4gbmV3IExheWVyVmVyc2lvbih0aGlzLCBsYXllclZlcnNpb25OYW1lLCB7XG4gICAgICAgICAgICBsYXllclZlcnNpb25OYW1lLFxuICAgICAgICAgICAgY29tcGF0aWJsZUFyY2hpdGVjdHVyZXM6IFtBcmNoaXRlY3R1cmUuQVJNXzY0LCBBcmNoaXRlY3R1cmUuWDg2XzY0XSxcbiAgICAgICAgICAgIGNvbXBhdGlibGVSdW50aW1lczogW1J1bnRpbWUuTk9ERUpTXzE4X1gsIFJ1bnRpbWUuTk9ERUpTXzIwX1hdLFxuICAgICAgICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQoZnVuY3Rpb25EaXJQYXRoLCB7XG4gICAgICAgICAgICAgICAgYXNzZXRIYXNoVHlwZTogQXNzZXRIYXNoVHlwZS5PVVRQVVQsXG4gICAgICAgICAgICAgICAgYnVuZGxpbmc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogWydzaCcsICctYycsICdlY2hvIFwiRG9ja2VyIGJ1aWxkIG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSBpbnN0YWxsIHlhcm4uXCInXSxcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2U6IFJ1bnRpbWUuTk9ERUpTXzIwX1guYnVuZGxpbmdJbWFnZSxcbiAgICAgICAgICAgICAgICAgICAgbG9jYWw6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeUJ1bmRsZShvdXRwdXREaXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNTeW5jKCd5YXJuIGluc3RhbGwnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2Q6IGZ1bmN0aW9uRGlyUGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy5jcFN5bmMoYCR7ZnVuY3Rpb25EaXJQYXRofS9ub2RlX21vZHVsZXNgLCBgJHtvdXRwdXREaXJ9L25vZGVqcy9ub2RlX21vZHVsZXNgLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIExhbWJkYSBmdW5jdGlvbiB0byBiZSB0cmlnZ2VyZWQgd2hlbmV2ZXIgYSBuZXcgYWNjZXNzIGxvZyBpcyBjcmVhdGVkLlxuICAgICAqIEl0IG1vdmVzIHRoZSByYXcgYWNjZXNzIGxvZ3MgaW50byBhIHN1YiBmb2xkZXIgaGllcmFyY2h5IGJ5IHllYXIsIG1vbnRoLCBkYXkgYW5kIGhvdXIuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVHcm91cEJ5RGF0ZUxhbWJkYSgpOiBGdW5jdGlvbiB7XG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tZ3JvdXAtYnktZGF0ZWA7XG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uRGlyUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9mdW5jdGlvbnMvYWNjZXNzLWxvZ3MtYW5hbHlzaXMvZ3JvdXAtYnktZGF0ZScpO1xuXG4gICAgICAgIGNvbnN0IGxhbWJkYSA9IG5ldyBGdW5jdGlvbih0aGlzLCBmdW5jdGlvbk5hbWUsIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1gsXG4gICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChmdW5jdGlvbkRpclBhdGgsIHtcbiAgICAgICAgICAgICAgICBhc3NldEhhc2hUeXBlOiBBc3NldEhhc2hUeXBlLk9VVFBVVCxcbiAgICAgICAgICAgICAgICBidW5kbGluZzoge1xuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBbJ3NoJywgJy1jJywgJ2VjaG8gXCJEb2NrZXIgYnVpbGQgbm90IHN1cHBvcnRlZC4gUGxlYXNlIGluc3RhbGwgeWFybi5cIiddLFxuICAgICAgICAgICAgICAgICAgICBpbWFnZTogUnVudGltZS5OT0RFSlNfMjBfWC5idW5kbGluZ0ltYWdlLFxuICAgICAgICAgICAgICAgICAgICBsb2NhbDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5QnVuZGxlKG91dHB1dERpcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY1N5bmMoJ3lhcm4gaW5zdGFsbCAmJiB5YXJuIGJ1aWxkJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3dkOiBmdW5jdGlvbkRpclBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMuY3BTeW5jKGAke2Z1bmN0aW9uRGlyUGF0aH0vYnVpbGQvYXBwYCwgb3V0cHV0RGlyLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBtZW1vcnlTaXplOiA1MTIsXG4gICAgICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDIwKSxcbiAgICAgICAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgICAgICAgIGxheWVyczogW3RoaXMuZ3JvdXBCeURhdGVMYXllcl0sXG4gICAgICAgICAgICBldmVudHM6IFtcbiAgICAgICAgICAgICAgICBuZXcgUzNFdmVudFNvdXJjZSh0aGlzLmJ1Y2tldCwge1xuICAgICAgICAgICAgICAgICAgICBldmVudHM6IFtFdmVudFR5cGUuT0JKRUNUX0NSRUFURURdLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiBbdGhpcy5nZXRVbnByb2Nlc3NlZE9iamVjdHNGaWx0ZXIoKV0sXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgbG9nUmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLlRXT19XRUVLUyxcbiAgICAgICAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgICAgICAgICAgQVdTX05PREVKU19DT05ORUNUSU9OX1JFVVNFX0VOQUJMRUQ6ICcxJyxcbiAgICAgICAgICAgICAgICBOT0RFX09QVElPTlM6ICctLWVuYWJsZS1zb3VyY2UtbWFwcycsXG4gICAgICAgICAgICAgICAgVEFSR0VUX0ZPTERFUjogQWNjZXNzTG9nc0FuYWx5c2lzLkFDQ0VTU19MT0dTX0ZPTERFUl9HUk9VUEVEX0JZX0RBVEUsXG4gICAgICAgICAgICAgICAgUkFXX0FDQ0VTU19MT0dfRklMRV9QQVRURVJOOiB0aGlzLmdldFJhd0FjY2Vzc0xvZ0ZpbGVQYXR0ZXJuKCkuc291cmNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5idWNrZXQuZ3JhbnRSZWFkV3JpdGUobGFtYmRhKTtcbiAgICAgICAgdGhpcy5idWNrZXQuZ3JhbnREZWxldGUobGFtYmRhLCBgJHtBY2Nlc3NMb2dzQW5hbHlzaXMuQUNDRVNTX0xPR1NfRk9MREVSX1VOUFJPQ0VTU0VEfS8qYCk7XG5cbiAgICAgICAgcmV0dXJuIGxhbWJkYTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0VW5wcm9jZXNzZWRPYmplY3RzRmlsdGVyKCk6IE5vdGlmaWNhdGlvbktleUZpbHRlcjtcblxuICAgIC8qKiBUaGUgcGF0dGVybiB0byBpZGVudGlmeSB1bnByb2Nlc3NlZCBhY2Nlc3MgbG9ncyBkZXBlbmRzIG9uIHRoZSBwcm9kdWNpbmcgc291cmNlICovXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IGdldFJhd0FjY2Vzc0xvZ0ZpbGVQYXR0ZXJuKCk6IFJlZ0V4cDtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcGFydGl0aW9uIGZvciB0aGUgdXBjb21pbmcgaG91ciBpbiB0aGUgYWNjZXNzIGxvZyBkYXRhYmFzZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUNyZWF0ZVBhcnRpdGlvbkxhbWJkYSgpOiBGdW5jdGlvbiB7XG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY3JlYXRlLXBhcnRgO1xuICAgICAgICBjb25zdCBmdW5jdGlvbkRpclBhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vZnVuY3Rpb25zL2FjY2Vzcy1sb2dzLWFuYWx5c2lzL3BhcnRpdGlvbmluZycpO1xuXG4gICAgICAgIGNvbnN0IGxhbWJkYSA9IG5ldyBGdW5jdGlvbih0aGlzLCBmdW5jdGlvbk5hbWUsIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1gsXG4gICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChmdW5jdGlvbkRpclBhdGgsIHtcbiAgICAgICAgICAgICAgICBleGNsdWRlOiBbJ3RyYW5zZm9ybS1wYXJ0aXRpb24qJywgJyouZC50cyddLFxuICAgICAgICAgICAgICAgIGFzc2V0SGFzaFR5cGU6IEFzc2V0SGFzaFR5cGUuT1VUUFVULFxuICAgICAgICAgICAgICAgIGJ1bmRsaW5nOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IFsnc2gnLCAnLWMnLCAnZWNobyBcIkRvY2tlciBidWlsZCBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgaW5zdGFsbCB5YXJuLlwiJ10sXG4gICAgICAgICAgICAgICAgICAgIGltYWdlOiBSdW50aW1lLk5PREVKU18yMF9YLmJ1bmRsaW5nSW1hZ2UsXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnlCdW5kbGUob3V0cHV0RGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjU3luYygneWFybiBpbnN0YWxsICYmIHlhcm4gYnVpbGQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2Q6IGZ1bmN0aW9uRGlyUGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy5jcFN5bmMoYCR7ZnVuY3Rpb25EaXJQYXRofS9idWlsZC9hcHBgLCBvdXRwdXREaXIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzaXZlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG1lbW9yeVNpemU6IDEyOCxcbiAgICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMjApLFxuICAgICAgICAgICAgaGFuZGxlcjogJ2NyZWF0ZS1wYXJ0aXRpb24uaGFuZGxlcicsXG4gICAgICAgICAgICBsYXllcnM6IFt0aGlzLnBhcnRpdGlvbmluZ0xheWVyXSxcbiAgICAgICAgICAgIGxvZ1JldGVudGlvbjogUmV0ZW50aW9uRGF5cy5UV09fV0VFS1MsXG4gICAgICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgICAgICAgIEFXU19OT0RFSlNfQ09OTkVDVElPTl9SRVVTRV9FTkFCTEVEOiAnMScsXG4gICAgICAgICAgICAgICAgTk9ERV9PUFRJT05TOiAnLS1lbmFibGUtc291cmNlLW1hcHMnLFxuICAgICAgICAgICAgICAgIFdPUktHUk9VUDogdGhpcy53b3JrZ3JvdXAubmFtZSxcbiAgICAgICAgICAgICAgICBEQVRBQkFTRTogdGhpcy5kYXRhYmFzZS5kYXRhYmFzZU5hbWUsXG4gICAgICAgICAgICAgICAgVEFCTEU6IHRoaXMuYWNjZXNzTG9nc0J5RGF0ZVRhYmxlLnRhYmxlTmFtZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGdyYW50IGFjY2VzcyB0byBTMyBidWNrZXQgYW5kIHRvIGV4ZWN1dGUgQXRoZW5hIHF1ZXJpZXMgd2hpY2ggY3JlYXRlIG5ldyBwYXJ0aXRpb25zXG4gICAgICAgIHRoaXMuYnVja2V0LmdyYW50UmVhZFdyaXRlKGxhbWJkYSk7XG4gICAgICAgIGxhbWJkYS5hZGRUb1JvbGVQb2xpY3koXG4gICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgICdhdGhlbmE6U3RhcnRRdWVyeUV4ZWN1dGlvbicsXG4gICAgICAgICAgICAgICAgICAgICdhdGhlbmE6R2V0UXVlcnlFeGVjdXRpb24nLFxuICAgICAgICAgICAgICAgICAgICAnZ2x1ZTpDcmVhdGVEYXRhYmFzZScsXG4gICAgICAgICAgICAgICAgICAgICdnbHVlOkNyZWF0ZVBhcnRpdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICdnbHVlOkdldERhdGFiYXNlJyxcbiAgICAgICAgICAgICAgICAgICAgJ2dsdWU6R2V0VGFibGUnLFxuICAgICAgICAgICAgICAgICAgICAnZ2x1ZTpCYXRjaENyZWF0ZVBhcnRpdGlvbicsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gbGFtYmRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybXMgcGFydGl0aW9ucyBmcm9tIHRoZSBIaXZlIGZvcm1hdCB0byBQYXJxdWV0LlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlVHJhbnNmb3JtUGFydGl0aW9uTGFtYmRhKCk6IEZ1bmN0aW9uIHtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS10cmFuc2Zvcm0tcGFydGA7XG5cbiAgICAgICAgY29uc3QgbGFtYmRhID0gbmV3IEZ1bmN0aW9uKHRoaXMsIGZ1bmN0aW9uTmFtZSwge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9mdW5jdGlvbnMvYWNjZXNzLWxvZ3MtYW5hbHlzaXMvcGFydGl0aW9uaW5nL2J1aWxkL2FwcCcpLCB7XG4gICAgICAgICAgICAgICAgZXhjbHVkZTogWydjcmVhdGUtcGFydGl0aW9uKicsICcqLmQudHMnXSxcbiAgICAgICAgICAgICAgICBhc3NldEhhc2hUeXBlOiBBc3NldEhhc2hUeXBlLk9VVFBVVCxcbiAgICAgICAgICAgICAgICBidW5kbGluZzoge1xuICAgICAgICAgICAgICAgICAgICBpbWFnZTogUnVudGltZS5OT0RFSlNfMjBfWC5idW5kbGluZ0ltYWdlLFxuICAgICAgICAgICAgICAgICAgICBsb2NhbDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5QnVuZGxlKG91dHB1dERpcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY1N5bmMoJ2NkICcgKyBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vZnVuY3Rpb25zL2FjY2Vzcy1sb2dzLWFuYWx5c2lzL3BhcnRpdGlvbmluZycpICsgJyAmJiB5YXJuIGluc3RhbGwgJiYgeWFybiBidWlsZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMuY3BTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9mdW5jdGlvbnMvYWNjZXNzLWxvZ3MtYW5hbHlzaXMvcGFydGl0aW9uaW5nL2J1aWxkL2FwcCcpLCBvdXRwdXREaXIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzaXZlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG1lbW9yeVNpemU6IDEyOCxcbiAgICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMjApLFxuICAgICAgICAgICAgaGFuZGxlcjogJ3RyYW5zZm9ybS1wYXJ0aXRpb24uaGFuZGxlcicsXG4gICAgICAgICAgICBsYXllcnM6IFt0aGlzLnBhcnRpdGlvbmluZ0xheWVyXSxcbiAgICAgICAgICAgIGxvZ1JldGVudGlvbjogUmV0ZW50aW9uRGF5cy5UV09fV0VFS1MsXG4gICAgICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgICAgICAgIEFXU19OT0RFSlNfQ09OTkVDVElPTl9SRVVTRV9FTkFCTEVEOiAnMScsXG4gICAgICAgICAgICAgICAgTk9ERV9PUFRJT05TOiAnLS1lbmFibGUtc291cmNlLW1hcHMnLFxuICAgICAgICAgICAgICAgIFdPUktHUk9VUDogdGhpcy53b3JrZ3JvdXAubmFtZSxcbiAgICAgICAgICAgICAgICBEQVRBQkFTRTogdGhpcy5kYXRhYmFzZS5kYXRhYmFzZU5hbWUsXG4gICAgICAgICAgICAgICAgU09VUkNFX1RBQkxFOiB0aGlzLmFjY2Vzc0xvZ3NCeURhdGVUYWJsZS50YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgVEFSR0VUX1RBQkxFOiB0aGlzLmFjY2Vzc0xvZ3NQYXJxdWV0VGFibGUudGFibGVOYW1lLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gZ3JhbnQgYWNjZXNzIHRvIFMzIGJ1Y2tldCBhbmQgdG8gZXhlY3V0ZSBBdGhlbmEgcXVlcmllcyB3aGljaCBjcmVhdGUgbmV3IHBhcnRpdGlvbnNcbiAgICAgICAgdGhpcy5idWNrZXQuZ3JhbnRSZWFkV3JpdGUobGFtYmRhKTtcbiAgICAgICAgbGFtYmRhLmFkZFRvUm9sZVBvbGljeShcbiAgICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgJ2F0aGVuYTpTdGFydFF1ZXJ5RXhlY3V0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgJ2F0aGVuYTpHZXRRdWVyeUV4ZWN1dGlvbicsXG4gICAgICAgICAgICAgICAgICAgICdnbHVlOkNyZWF0ZURhdGFiYXNlJyxcbiAgICAgICAgICAgICAgICAgICAgJ2dsdWU6Q3JlYXRlUGFydGl0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgJ2dsdWU6R2V0RGF0YWJhc2UnLFxuICAgICAgICAgICAgICAgICAgICAnZ2x1ZTpHZXRUYWJsZScsXG4gICAgICAgICAgICAgICAgICAgICdnbHVlOkJhdGNoQ3JlYXRlUGFydGl0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgJ2dsdWU6R2V0UGFydGl0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgJ2dsdWU6R2V0UGFydGl0aW9ucycsXG4gICAgICAgICAgICAgICAgICAgICdnbHVlOkNyZWF0ZVRhYmxlJyxcbiAgICAgICAgICAgICAgICAgICAgJ2dsdWU6RGVsZXRlVGFibGUnLFxuICAgICAgICAgICAgICAgICAgICAnZ2x1ZTpEZWxldGVQYXJ0aXRpb24nLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIGxhbWJkYTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUNyZWF0ZVBhcnRpdGlvbnNTY2hlZHVsZXIoKTogUnVsZSB7XG4gICAgICAgIGNvbnN0IHJ1bGVOYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1jcmVhdGUtcGFydC1zY2hlZGA7XG4gICAgICAgIHJldHVybiBuZXcgUnVsZSh0aGlzLCBydWxlTmFtZSwge1xuICAgICAgICAgICAgcnVsZU5hbWUsXG4gICAgICAgICAgICBzY2hlZHVsZTogU2NoZWR1bGUuY3Jvbih7bWludXRlOiAnNTUnfSksXG4gICAgICAgICAgICB0YXJnZXRzOiBbbmV3IExhbWJkYUZ1bmN0aW9uKHRoaXMuY3JlYXRlUGFydGl0aW9uTGFtYmRhLCB7cmV0cnlBdHRlbXB0czogMTB9KV0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlVHJhbnNmb3JtUGFydGl0aW9uc1NjaGVkdWxlcihwcm9wczogQWNjZXNzTG9nc0FuYWx5c2lzUHJvcHMpOiBSdWxlIHtcbiAgICAgICAgY29uc3QgcnVsZU5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXRyYW5zZm9ybS1wYXJ0LXNjaGVkYDtcbiAgICAgICAgcmV0dXJuIG5ldyBSdWxlKHRoaXMsIHJ1bGVOYW1lLCB7XG4gICAgICAgICAgICBydWxlTmFtZSxcbiAgICAgICAgICAgIHNjaGVkdWxlOiBTY2hlZHVsZS5jcm9uKHttaW51dGU6ICcxJ30pLFxuICAgICAgICAgICAgdGFyZ2V0czogW1xuICAgICAgICAgICAgICAgIG5ldyBMYW1iZGFGdW5jdGlvbih0aGlzLnRyYW5zZm9ybVBhcnRpdGlvbkxhbWJkYSwge1xuICAgICAgICAgICAgICAgICAgICBldmVudDogdGhpcy5nZXRUcmFuc2Zvcm1QYXJ0aXRpb25JbnZvY2F0aW9uUHJvcHMocHJvcHMpLFxuICAgICAgICAgICAgICAgICAgICByZXRyeUF0dGVtcHRzOiAxMCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VHJhbnNmb3JtUGFydGl0aW9uSW52b2NhdGlvblByb3BzKHByb3BzOiBBY2Nlc3NMb2dzQW5hbHlzaXNQcm9wcyk6IFJ1bGVUYXJnZXRJbnB1dCB7XG4gICAgICAgIHJldHVybiBSdWxlVGFyZ2V0SW5wdXQuZnJvbU9iamVjdCh7XG4gICAgICAgICAgICBjb2x1bW5OYW1lczogW1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuYWNjZXNzTG9nc1BhcnF1ZXRUYWJsZS5jb2x1bW5zLFxuICAgICAgICAgICAgICAgIC4uLih0aGlzLmFjY2Vzc0xvZ3NQYXJxdWV0VGFibGUucGFydGl0aW9uS2V5cyBhcyBDb2x1bW5bXSksXG4gICAgICAgICAgICBdLm1hcChjb2x1bW4gPT4gY29sdW1uLm5hbWUpLFxuICAgICAgICAgICAgY29sdW1uVHJhbnNmb3JtYXRpb25zOiB0aGlzLmdldENvbHVtblRyYW5zZm9ybWF0aW9uUnVsZXMocHJvcHMpLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOZWVkcyB0byByZXR1cm4gdGhlIGxvZyBzb3VyY2Ugc3BlY2lmaWMgY29sdW1uIHRyYW5zZm9ybWF0aW9uIHJ1bGVzXG4gICAgICogKGUuZy4gdG8gYW5vbnltaXplIElQIGFkZHJlc3NlcykuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IGdldENvbHVtblRyYW5zZm9ybWF0aW9uUnVsZXMocHJvcHM6IEFjY2Vzc0xvZ3NBbmFseXNpc1Byb3BzKTogQ29sdW1uVHJhbnNmb3JtYXRpb25SdWxlcztcbn1cbiJdfQ==
|
|
@@ -128,24 +128,29 @@ export abstract class AccessLogsAnalysis extends Construct {
|
|
|
128
128
|
|
|
129
129
|
private createGroupByDateLayer(): LayerVersion {
|
|
130
130
|
const layerVersionName = `${this.resourceIdPrefix}-group-by-date-dependencies`;
|
|
131
|
+
const functionDirPath = path.join(__dirname, '../../functions/access-logs-analysis/group-by-date');
|
|
132
|
+
|
|
131
133
|
return new LayerVersion(this, layerVersionName, {
|
|
132
134
|
layerVersionName,
|
|
133
135
|
compatibleArchitectures: [Architecture.ARM_64, Architecture.X86_64],
|
|
134
136
|
compatibleRuntimes: [Runtime.NODEJS_18_X, Runtime.NODEJS_20_X],
|
|
135
|
-
code: Code.fromAsset(
|
|
137
|
+
code: Code.fromAsset(functionDirPath, {
|
|
136
138
|
assetHashType: AssetHashType.OUTPUT,
|
|
137
139
|
bundling: {
|
|
140
|
+
command: ['sh', '-c', 'echo "Docker build not supported. Please install yarn."'],
|
|
138
141
|
image: Runtime.NODEJS_20_X.bundlingImage,
|
|
139
142
|
local: {
|
|
140
143
|
tryBundle(outputDir: string): boolean {
|
|
141
144
|
try {
|
|
142
|
-
execSync('
|
|
145
|
+
execSync('yarn install', {
|
|
146
|
+
cwd: functionDirPath
|
|
147
|
+
});
|
|
143
148
|
} catch {
|
|
144
149
|
return false;
|
|
145
150
|
}
|
|
146
151
|
|
|
147
|
-
fs.cpSync(
|
|
148
|
-
recursive: true
|
|
152
|
+
fs.cpSync(`${functionDirPath}/node_modules`, `${outputDir}/nodejs/node_modules`, {
|
|
153
|
+
recursive: true,
|
|
149
154
|
});
|
|
150
155
|
return true
|
|
151
156
|
},
|
|
@@ -158,24 +163,28 @@ export abstract class AccessLogsAnalysis extends Construct {
|
|
|
158
163
|
|
|
159
164
|
private createPartitioningLayer(): LayerVersion {
|
|
160
165
|
const layerVersionName = `${this.resourceIdPrefix}-partitioning-dependencies`;
|
|
166
|
+
const functionDirPath = path.join(__dirname, '../../functions/access-logs-analysis/partitioning');
|
|
167
|
+
|
|
161
168
|
return new LayerVersion(this, layerVersionName, {
|
|
162
169
|
layerVersionName,
|
|
163
170
|
compatibleArchitectures: [Architecture.ARM_64, Architecture.X86_64],
|
|
164
171
|
compatibleRuntimes: [Runtime.NODEJS_18_X, Runtime.NODEJS_20_X],
|
|
165
|
-
code: Code.fromAsset(
|
|
172
|
+
code: Code.fromAsset(functionDirPath, {
|
|
166
173
|
assetHashType: AssetHashType.OUTPUT,
|
|
167
174
|
bundling: {
|
|
175
|
+
command: ['sh', '-c', 'echo "Docker build not supported. Please install yarn."'],
|
|
168
176
|
image: Runtime.NODEJS_20_X.bundlingImage,
|
|
169
177
|
local: {
|
|
170
178
|
tryBundle(outputDir: string): boolean {
|
|
171
179
|
try {
|
|
172
|
-
execSync('
|
|
180
|
+
execSync('yarn install', {
|
|
181
|
+
cwd: functionDirPath
|
|
182
|
+
});
|
|
173
183
|
} catch {
|
|
174
184
|
return false;
|
|
175
185
|
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
recursive: true
|
|
186
|
+
fs.cpSync(`${functionDirPath}/node_modules`, `${outputDir}/nodejs/node_modules`, {
|
|
187
|
+
recursive: true,
|
|
179
188
|
});
|
|
180
189
|
return true
|
|
181
190
|
},
|
|
@@ -192,24 +201,27 @@ export abstract class AccessLogsAnalysis extends Construct {
|
|
|
192
201
|
*/
|
|
193
202
|
private createGroupByDateLambda(): Function {
|
|
194
203
|
const functionName = `${this.resourceIdPrefix}-group-by-date`;
|
|
204
|
+
const functionDirPath = path.join(__dirname, '../../functions/access-logs-analysis/group-by-date');
|
|
195
205
|
|
|
196
206
|
const lambda = new Function(this, functionName, {
|
|
197
207
|
functionName,
|
|
198
208
|
architecture: Architecture.ARM_64,
|
|
199
209
|
runtime: Runtime.NODEJS_20_X,
|
|
200
|
-
code: Code.fromAsset(
|
|
210
|
+
code: Code.fromAsset(functionDirPath, {
|
|
201
211
|
assetHashType: AssetHashType.OUTPUT,
|
|
202
212
|
bundling: {
|
|
213
|
+
command: ['sh', '-c', 'echo "Docker build not supported. Please install yarn."'],
|
|
203
214
|
image: Runtime.NODEJS_20_X.bundlingImage,
|
|
204
215
|
local: {
|
|
205
216
|
tryBundle(outputDir: string): boolean {
|
|
206
217
|
try {
|
|
207
|
-
execSync('
|
|
218
|
+
execSync('yarn install && yarn build', {
|
|
219
|
+
cwd: functionDirPath
|
|
220
|
+
});
|
|
208
221
|
} catch {
|
|
209
222
|
return false;
|
|
210
223
|
}
|
|
211
|
-
|
|
212
|
-
fs.cpSync(path.join(__dirname, '../../functions/access-logs-analysis/group-by-date/build/app'), outputDir, {
|
|
224
|
+
fs.cpSync(`${functionDirPath}/build/app`, outputDir, {
|
|
213
225
|
recursive: true
|
|
214
226
|
});
|
|
215
227
|
return true
|
|
@@ -252,25 +264,28 @@ export abstract class AccessLogsAnalysis extends Construct {
|
|
|
252
264
|
*/
|
|
253
265
|
private createCreatePartitionLambda(): Function {
|
|
254
266
|
const functionName = `${this.resourceIdPrefix}-create-part`;
|
|
267
|
+
const functionDirPath = path.join(__dirname, '../../functions/access-logs-analysis/partitioning');
|
|
255
268
|
|
|
256
269
|
const lambda = new Function(this, functionName, {
|
|
257
270
|
functionName,
|
|
258
271
|
architecture: Architecture.ARM_64,
|
|
259
272
|
runtime: Runtime.NODEJS_20_X,
|
|
260
|
-
code: Code.fromAsset(
|
|
273
|
+
code: Code.fromAsset(functionDirPath, {
|
|
261
274
|
exclude: ['transform-partition*', '*.d.ts'],
|
|
262
275
|
assetHashType: AssetHashType.OUTPUT,
|
|
263
276
|
bundling: {
|
|
277
|
+
command: ['sh', '-c', 'echo "Docker build not supported. Please install yarn."'],
|
|
264
278
|
image: Runtime.NODEJS_20_X.bundlingImage,
|
|
265
279
|
local: {
|
|
266
280
|
tryBundle(outputDir: string): boolean {
|
|
267
281
|
try {
|
|
268
|
-
execSync('
|
|
282
|
+
execSync('yarn install && yarn build', {
|
|
283
|
+
cwd: functionDirPath
|
|
284
|
+
});
|
|
269
285
|
} catch {
|
|
270
286
|
return false;
|
|
271
287
|
}
|
|
272
|
-
|
|
273
|
-
fs.cpSync(path.join(__dirname, '../../functions/access-logs-analysis/partitioning/build/app'), outputDir, {
|
|
288
|
+
fs.cpSync(`${functionDirPath}/build/app`, outputDir, {
|
|
274
289
|
recursive: true
|
|
275
290
|
});
|
|
276
291
|
return true
|
|
@@ -149,6 +149,7 @@ class NuxtServerAppStack extends aws_cdk_lib_1.Stack {
|
|
|
149
149
|
createCleanupLambdaFunction(props) {
|
|
150
150
|
var _a;
|
|
151
151
|
const functionName = `${this.resourceIdPrefix}-cleanup-function`;
|
|
152
|
+
const functionDirPath = path.join(__dirname, '../../functions/assets-cleanup');
|
|
152
153
|
const result = new aws_lambda_1.Function(this, functionName, {
|
|
153
154
|
functionName: functionName,
|
|
154
155
|
description: `Auto-deletes the outdated static assets in the ${this.staticAssetsBucket.bucketName} S3 bucket.`,
|
|
@@ -156,20 +157,23 @@ class NuxtServerAppStack extends aws_cdk_lib_1.Stack {
|
|
|
156
157
|
architecture: aws_lambda_1.Architecture.ARM_64,
|
|
157
158
|
layers: [new aws_lambda_1.LayerVersion(this, `${functionName}-layer`, {
|
|
158
159
|
layerVersionName: `${functionName}-layer`,
|
|
159
|
-
code: aws_lambda_1.Code.fromAsset(
|
|
160
|
+
code: aws_lambda_1.Code.fromAsset(functionDirPath, {
|
|
160
161
|
assetHashType: aws_cdk_lib_1.AssetHashType.OUTPUT,
|
|
161
162
|
bundling: {
|
|
163
|
+
command: ['sh', '-c', 'echo "Docker build not supported. Please install yarn."'],
|
|
162
164
|
image: aws_lambda_1.Runtime.NODEJS_20_X.bundlingImage,
|
|
163
165
|
local: {
|
|
164
166
|
tryBundle(outputDir) {
|
|
165
167
|
try {
|
|
166
|
-
(0, node_child_process_1.execSync)('
|
|
168
|
+
(0, node_child_process_1.execSync)('yarn install', {
|
|
169
|
+
cwd: functionDirPath
|
|
170
|
+
});
|
|
167
171
|
}
|
|
168
172
|
catch (_a) {
|
|
169
173
|
return false;
|
|
170
174
|
}
|
|
171
|
-
fs.cpSync(
|
|
172
|
-
recursive: true
|
|
175
|
+
fs.cpSync(`${functionDirPath}/node_modules`, `${outputDir}/nodejs/node_modules`, {
|
|
176
|
+
recursive: true,
|
|
173
177
|
});
|
|
174
178
|
return true;
|
|
175
179
|
},
|
|
@@ -180,19 +184,22 @@ class NuxtServerAppStack extends aws_cdk_lib_1.Stack {
|
|
|
180
184
|
description: `Provides the node_modules required for the ${this.resourceIdPrefix} lambda function.`
|
|
181
185
|
})],
|
|
182
186
|
handler: 'index.handler',
|
|
183
|
-
code: aws_lambda_1.Code.fromAsset(
|
|
187
|
+
code: aws_lambda_1.Code.fromAsset(functionDirPath, {
|
|
184
188
|
assetHashType: aws_cdk_lib_1.AssetHashType.OUTPUT,
|
|
185
189
|
bundling: {
|
|
190
|
+
command: ['sh', '-c', 'echo "Docker build not supported. Please install yarn."'],
|
|
186
191
|
image: aws_lambda_1.Runtime.NODEJS_20_X.bundlingImage,
|
|
187
192
|
local: {
|
|
188
193
|
tryBundle(outputDir) {
|
|
189
194
|
try {
|
|
190
|
-
(0, node_child_process_1.execSync)('
|
|
195
|
+
(0, node_child_process_1.execSync)('yarn install && yarn build', {
|
|
196
|
+
cwd: functionDirPath
|
|
197
|
+
});
|
|
191
198
|
}
|
|
192
199
|
catch (_a) {
|
|
193
200
|
return false;
|
|
194
201
|
}
|
|
195
|
-
fs.cpSync(
|
|
202
|
+
fs.cpSync(`${functionDirPath}/build/app`, outputDir, {
|
|
196
203
|
recursive: true
|
|
197
204
|
});
|
|
198
205
|
return true;
|
|
@@ -543,4 +550,4 @@ class NuxtServerAppStack extends aws_cdk_lib_1.Stack {
|
|
|
543
550
|
}
|
|
544
551
|
}
|
|
545
552
|
exports.NuxtServerAppStack = NuxtServerAppStack;
|
|
546
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTnV4dFNlcnZlckFwcFN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiTnV4dFNlcnZlckFwcFN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUEwRTtBQUUxRSwrRUFBK0Q7QUFDL0QsK0RBZW9DO0FBQ3BDLHVEQUFvRztBQUNwRywrQ0FNNEI7QUFDNUIseURBQW1HO0FBQ25HLHFFQUFxRjtBQUNyRiwrRUFBd0U7QUFDeEUseUVBQWlFO0FBQ2pFLGlGQUErRDtBQUMvRCxtREFBbUQ7QUFDbkQsZ0VBQXVGO0FBQ3ZGLHlCQUF5QjtBQUN6Qix1REFBdUU7QUFDdkUsdUVBQThEO0FBQzlELDZCQUE2QjtBQUM3QiwyQkFBaUM7QUFFakMsdUdBQWtHO0FBQ2xHLDZGQUFnRjtBQUNoRixtRUFBK0Y7QUFDL0YsMkRBQTRDO0FBRTVDOztHQUVHO0FBQ0gsTUFBYSxrQkFBbUIsU0FBUSxtQkFBSztJQXFGekMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE4Qjs7UUFDcEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVqRixxQkFBcUI7UUFDckIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBQSxrREFBNEIsRUFBQyxNQUFBLEtBQUssQ0FBQyxPQUFPLG1DQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUN4RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFF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Q2xFLGFBQWEsRUFBRSwyQkFBYSxDQUFDLE9BQU87WUFDcEMsaUJBQWlCLEVBQUUsSUFBSTtTQUMxQixDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRTlDLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxLQUE4QjtRQUMzRCxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxPQUFPLElBQUksMkRBQTRCLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQix1QkFBdUIsRUFBRTtZQUMzRixNQUFNLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtZQUM3QixjQUFjLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLGNBQWM7WUFDdEQsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtTQUMzQyxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0o7QUFqcEJELGdEQWlwQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Fzc2V0SGFzaFR5cGUsIER1cmF0aW9uLCBSZW1vdmFsUG9saWN5LCBTdGFja30gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHtDb25zdHJ1Y3R9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHtDZXJ0aWZpY2F0ZX0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gICAgQWxsb3dlZE1ldGhvZHMsXG4gICAgQmVoYXZpb3JPcHRpb25zLFxuICAgIENhY2hlQ29va2llQmVoYXZpb3IsXG4gICAgQ2FjaGVkTWV0aG9kcyxcbiAgICBDYWNoZUhlYWRlckJlaGF2aW9yLFxuICAgIENhY2hlUG9saWN5LFxuICAgIENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvcixcbiAgICBEaXN0cmlidXRpb24sIEh0dHBWZXJzaW9uLFxuICAgIElPcmlnaW5BY2Nlc3NJZGVudGl0eSxcbiAgICBPcmlnaW5BY2Nlc3NJZGVudGl0eSxcbiAgICBPcmlnaW5Qcm90b2NvbFBvbGljeSxcbiAgICBQcmljZUNsYXNzLFxuICAgIFNlY3VyaXR5UG9saWN5UHJvdG9jb2wsXG4gICAgVmlld2VyUHJvdG9jb2xQb2xpY3lcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250XCI7XG5pbXBvcnQge0FyY2hpdGVjdHVyZSwgQ29kZSwgRnVuY3Rpb24sIExheWVyVmVyc2lvbiwgUnVudGltZSwgVHJhY2luZ30gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCB7XG4gICAgQmxvY2tQdWJsaWNBY2Nlc3MsXG4gICAgQnVja2V0LFxuICAgIEJ1Y2tldEFjY2Vzc0NvbnRyb2wsXG4gICAgQnVja2V0RW5jcnlwdGlvbixcbiAgICBPYmplY3RPd25lcnNoaXBcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHtBYWFhUmVjb3JkLCBBUmVjb3JkLCBIb3N0ZWRab25lLCBJSG9zdGVkWm9uZSwgUmVjb3JkVGFyZ2V0fSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIjtcbmltcG9ydCB7QnVja2V0RGVwbG95bWVudCwgU291cmNlLCBTdG9yYWdlQ2xhc3N9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczMtZGVwbG95bWVudFwiO1xuaW1wb3J0IHtIdHRwT3JpZ2luLCBTM09yaWdpbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250LW9yaWdpbnNcIjtcbmltcG9ydCB7Q2xvdWRGcm9udFRhcmdldH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHNcIjtcbmltcG9ydCB7SHR0cE1ldGhvZH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zdGVwZnVuY3Rpb25zLXRhc2tzXCI7XG5pbXBvcnQge1JldGVudGlvbkRheXN9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbG9nc1wiO1xuaW1wb3J0IHtnZXROdXh0QXBwU3RhdGljQXNzZXRDb25maWdzLCBTdGF0aWNBc3NldENvbmZpZ30gZnJvbSBcIi4uL051eHRBcHBTdGF0aWNBc3NldHNcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHtSdWxlLCBSdWxlVGFyZ2V0SW5wdXQsIFNjaGVkdWxlfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50c1wiO1xuaW1wb3J0IHtMYW1iZGFGdW5jdGlvbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0c1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHt3cml0ZUZpbGVTeW5jfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7TnV4dFNlcnZlckFwcFN0YWNrUHJvcHN9IGZyb20gXCIuL051eHRTZXJ2ZXJBcHBTdGFja1Byb3BzXCI7XG5pbXBvcnQge0Nsb3VkRnJvbnRBY2Nlc3NMb2dzQW5hbHlzaXN9IGZyb20gXCIuLi9hY2Nlc3MtbG9ncy1hbmFseXNpcy9DbG91ZEZyb250QWNjZXNzTG9nc0FuYWx5c2lzXCI7XG5pbXBvcnQge0h0dHBMYW1iZGFJbnRlZ3JhdGlvbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5djItaW50ZWdyYXRpb25zXCI7XG5pbXBvcnQge0RvbWFpbk5hbWUsIEVuZHBvaW50VHlwZSwgSHR0cEFwaSwgU2VjdXJpdHlQb2xpY3l9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyXCI7XG5pbXBvcnQge2V4ZWNTeW5jfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5cbi8qKlxuICogQ0RLIHN0YWNrIHRvIGRlcGxveSBhIGR5bmFtaWMgTnV4dCBhcHAgKHRhcmdldD1zZXJ2ZXIpIG9uIEFXUyB3aXRoIExhbWJkYSwgQXBpR2F0ZXdheSwgUzMgYW5kIENsb3VkRnJvbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBOdXh0U2VydmVyQXBwU3RhY2sgZXh0ZW5kcyBTdGFjayB7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBwcmVmaXggb2YgdGhlIHJlc291cmNlcyBjcmVhdGVkIGJ5IHRoZSBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXNvdXJjZUlkUHJlZml4OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgZGVwbG95bWVudCB0aGF0IGlzIHVzZWQgdG8gdGFnIHRoZSBzdGF0aWMgYXNzZXRzIG9mIHRoZSBkZXBsb3ltZW50XG4gICAgICogdG8gbGF0ZXIgYmUgYWJsZSB0byBjbGVhbiB1cCBvdXRkYXRlZCBhc3NldHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVwbG95bWVudFJldmlzaW9uOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpdHkgdG8gdXNlIGZvciBhY2Nlc3NpbmcgdGhlIGRlcGxveW1lbnQgYXNzZXRzIG9uIFMzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkbkFjY2Vzc0lkZW50aXR5OiBJT3JpZ2luQWNjZXNzSWRlbnRpdHk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUzMgYnVja2V0IHdoZXJlIHRoZSBkZXBsb3ltZW50IGFzc2V0cyBnZXRzIHN0b3JlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljQXNzZXRzQnVja2V0OiBCdWNrZXQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUzMgYnVja2V0IHdoZXJlIHRoZSBhY2Nlc3MgbG9ncyBvZiB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gZ2V0cyBzdG9yZWQuXG4gICAgICovXG4gICAgcHVibGljIGFjY2Vzc0xvZ3NCdWNrZXQ6IEJ1Y2tldHx1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUzMgYnVja2V0IHdoZXJlIHRoZSBzaXRlbWFwIGFzc2V0cyBnZXRzIHN0b3JlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2l0ZW1hcEJ1Y2tldDogQnVja2V0fHVuZGVmaW5lZDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBMYW1iZGEgZnVuY3Rpb24gdG8gcmVuZGVyIHRoZSBOdXh0IGFwcCBvbiB0aGUgc2VydmVyIHNpZGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBwTGFtYmRhRnVuY3Rpb246IEZ1bmN0aW9uO1xuXG4gICAgLyoqXG4gICAgICogVGhlIExhbWJkYSBmdW5jdGlvbiB0aGF0IGNsZWFudXBzIHRoZSBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzIG9mIHRoZSBOdXh0IGFwcC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGVhbnVwTGFtYmRhRnVuY3Rpb246IEZ1bmN0aW9uO1xuXG4gICAgLyoqXG4gICAgICogVGhlIEFQSSBnYXRld2F5IHRvIG1ha2UgdGhlIExhbWJkYSBmdW5jdGlvbiB0byByZW5kZXIgdGhlIE51eHQgYXBwIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBhcGlHYXRld2F5OiBIdHRwQXBpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGNvbmZpZ3MgZm9yIHRoZSBzdGF0aWMgYXNzZXRzIG9mIHRoZSBOdXh0IGFwcCB0aGF0IHNoYWxsIGJlIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBzdGF0aWNBc3NldENvbmZpZ3M6IFN0YXRpY0Fzc2V0Q29uZmlnW107XG5cbiAgICAvKipcbiAgICAgKiBUaGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gb3JpZ2luIGZvciB0aGUgQVBJIGdhdGV3YXkgdG8gcm91dGUgaW5jb21pbmcgcmVxdWVzdHMgdG8gdGhlIE51eHQgTGFtYmRhIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgaHR0cE9yaWdpbjogSHR0cE9yaWdpbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjYWNoZSBwb2xpY3kgZm9yIHRoZSBOdXh0IGFwcCByb3V0ZSBiZWhhdmlvcnMgb2YgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXBwQ2FjaGVQb2xpY3k6IENhY2hlUG9saWN5O1xuXG4gICAgLyoqXG4gICAgICogVGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRvIHJvdXRlIGluY29taW5nIHJlcXVlc3RzIHRvIHRoZSBOdXh0IExhbWJkYSBmdW5jdGlvbiAodmlhIHRoZSBBUEkgZ2F0ZXdheSlcbiAgICAgKiBvciB0aGUgUzMgYXNzZXRzIGZvbGRlciAod2l0aCBjYWNoaW5nKS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjZG46IERpc3RyaWJ1dGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcykge1xuICAgICAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgICAgICB0aGlzLnJlc291cmNlSWRQcmVmaXggPSBgJHtwcm9wcy5wcm9qZWN0fS0ke3Byb3BzLnNlcnZpY2V9LSR7cHJvcHMuZW52aXJvbm1lbnR9YDtcblxuICAgICAgICAvLyBOdXh0IGFwcCByZXNvdXJjZXNcbiAgICAgICAgdGhpcy5kZXBsb3ltZW50UmV2aXNpb24gPSB0aGlzLmNyZWF0ZURlcGxveW1lbnRSZXZpc2lvbihwcm9wcyk7XG4gICAgICAgIHRoaXMuc3RhdGljQXNzZXRDb25maWdzID0gZ2V0TnV4dEFwcFN0YXRpY0Fzc2V0Q29uZmlncyhwcm9wcy5yb290RGlyID8/ICcuJyk7XG4gICAgICAgIHRoaXMuY2RuQWNjZXNzSWRlbnRpdHkgPSB0aGlzLmNyZWF0ZUNkbkFjY2Vzc0lkZW50aXR5KCk7XG4gICAgICAgIHRoaXMuc3RhdGljQXNzZXRzQnVja2V0ID0gdGhpcy5jcmVhdGVTdGF0aWNBc3NldHNCdWNrZXQoKTtcblxuICAgICAgICBpZiAocHJvcHMuZW5hYmxlQWNjZXNzTG9nc0FuYWx5c2lzKSB7XG4gICAgICAgICAgICB0aGlzLmFjY2Vzc0xvZ3NCdWNrZXQgPSB0aGlzLmNyZWF0ZUFjY2Vzc0xvZ3NCdWNrZXQoKTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQWNjZXNzTG9nc0FuYWx5c2lzKHByb3BzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wcy5lbmFibGVTaXRlbWFwKSB7XG4gICAgICAgICAgICB0aGlzLnNpdGVtYXBCdWNrZXQgPSB0aGlzLmNyZWF0ZVNpdGVtYXBCdWNrZXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXBwTGFtYmRhRnVuY3Rpb24gPSB0aGlzLmNyZWF0ZUFwcExhbWJkYUZ1bmN0aW9uKHByb3BzKTtcbiAgICAgICAgdGhpcy5hcGlHYXRld2F5ID0gdGhpcy5jcmVhdGVBcGlHYXRld2F5KHByb3BzKTtcbiAgICAgICAgdGhpcy5odHRwT3JpZ2luID0gdGhpcy5jcmVhdGVOdXh0QXBwSHR0cE9yaWdpbigpO1xuICAgICAgICB0aGlzLmFwcENhY2hlUG9saWN5ID0gdGhpcy5jcmVhdGVOdXh0QXBwQ2FjaGVQb2xpY3kocHJvcHMpXG4gICAgICAgIHRoaXMuY2RuID0gdGhpcy5jcmVhdGVDbG91ZEZyb250RGlzdHJpYnV0aW9uKHByb3BzKTtcbiAgICAgICAgdGhpcy5jb25maWd1cmVEZXBsb3ltZW50cygpO1xuICAgICAgICB0aGlzLmNyZWF0ZURuc1JlY29yZHMocHJvcHMpO1xuICAgICAgICB0aGlzLmNyZWF0ZUFwcFBpbmdSdWxlKHByb3BzKTtcblxuICAgICAgICAvLyBTdGF0aWMgYXNzZXRzIGNsZWFudXAgcmVzb3VyY2VzXG4gICAgICAgIHRoaXMuY2xlYW51cExhbWJkYUZ1bmN0aW9uID0gdGhpcy5jcmVhdGVDbGVhbnVwTGFtYmRhRnVuY3Rpb24ocHJvcHMpO1xuICAgICAgICB0aGlzLmNyZWF0ZUNsZWFudXBUcmlnZ2VyUnVsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIGN1cnJlbnQgZGVwbG95bWVudCByZXZpc2lvbiBmaWxlIGluIHRoZSBwdWJsaWMgZm9sZGVyIG9mIHRoZSBOdXh0IGFwcCB0byBiZSBhY2Nlc3NpYmxlXG4gICAgICogYW5kIHJldHVybnMgdGhlIGN1cnJlbnQgcmV2aXNpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVEZXBsb3ltZW50UmV2aXNpb24ocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcmV2aXNpb25GaWxlUGF0aCA9IGAke3Byb3BzLnJvb3REaXIgPz8gJy4nfS8ub3V0cHV0L3B1YmxpYy9hcHAtcmV2aXNpb25gO1xuICAgICAgICBjb25zdCBhcHBSZXZpc2lvbiA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcblxuICAgICAgICB3cml0ZUZpbGVTeW5jKHJldmlzaW9uRmlsZVBhdGgsIGFwcFJldmlzaW9uLCB7ZW5jb2Rpbmc6ICd1dGYtOCd9KTtcblxuICAgICAgICByZXR1cm4gYXBwUmV2aXNpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgaWRlbnRpdHkgdG8gYWNjZXNzIHRoZSBTMyBkZXBsb3ltZW50IGFzc2V0IGZpbGVzIHZpYSB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQ2RuQWNjZXNzSWRlbnRpdHkoKTogSU9yaWdpbkFjY2Vzc0lkZW50aXR5IHtcbiAgICAgICAgY29uc3Qgb3JpZ2luQWNjZXNzSWRlbnRpdHlOYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1jZG4tczMtYWNjZXNzYDtcbiAgICAgICAgcmV0dXJuIG5ldyBPcmlnaW5BY2Nlc3NJZGVudGl0eSh0aGlzLCBvcmlnaW5BY2Nlc3NJZGVudGl0eU5hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIGJ1Y2tldCB0byBzdG9yZSB0aGUgc3RhdGljIGRlcGxveW1lbnQgYXNzZXQgZmlsZXMgb2YgdGhlIE51eHQgYXBwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVN0YXRpY0Fzc2V0c0J1Y2tldCgpOiBCdWNrZXQge1xuICAgICAgICBjb25zdCBidWNrZXROYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hc3NldHNgO1xuICAgICAgICBjb25zdCBidWNrZXQgPSBuZXcgQnVja2V0KHRoaXMsIGJ1Y2tldE5hbWUsIHtcbiAgICAgICAgICAgIGJsb2NrUHVibGljQWNjZXNzOiBCbG9ja1B1YmxpY0FjY2Vzcy5CTE9DS19BTEwsXG4gICAgICAgICAgICBidWNrZXROYW1lLFxuICAgICAgICAgICAgLy8gVGhlIGJ1Y2tldCBhbmQgYWxsIG9mIGl0cyBvYmplY3RzIGNhbiBiZSBkZWxldGVkLCBiZWNhdXNlIGFsbCB0aGUgY29udGVudCBpcyBtYW5hZ2VkIGluIHRoaXMgcHJvamVjdFxuICAgICAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUsXG4gICAgICAgICAgICBvYmplY3RPd25lcnNoaXA6IE9iamVjdE93bmVyc2hpcC5CVUNLRVRfT1dORVJfRU5GT1JDRUQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJ1Y2tldC5ncmFudFJlYWRXcml0ZSh0aGlzLmNkbkFjY2Vzc0lkZW50aXR5KTtcblxuICAgICAgICByZXR1cm4gYnVja2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIGJ1Y2tldCB0byBzdG9yZSB0aGUgc2l0ZW1hcCBhc3NldHMgb2YgdGhlIE51eHQgYXBwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVNpdGVtYXBCdWNrZXQoKTogQnVja2V0IHtcbiAgICAgICAgY29uc3QgYnVja2V0TmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tc2l0ZW1hcGA7XG4gICAgICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBCdWNrZXQodGhpcywgYnVja2V0TmFtZSwge1xuICAgICAgICAgICAgYnVja2V0TmFtZSxcbiAgICAgICAgICAgIGFjY2Vzc0NvbnRyb2w6IEJ1Y2tldEFjY2Vzc0NvbnRyb2wuUFJJVkFURSxcbiAgICAgICAgICAgIGJsb2NrUHVibGljQWNjZXNzOiBCbG9ja1B1YmxpY0FjY2Vzcy5CTE9DS19BTEwsXG4gICAgICAgICAgICBlbmNyeXB0aW9uOiBCdWNrZXRFbmNyeXB0aW9uLlMzX01BTkFHRUQsXG4gICAgICAgICAgICBlbmZvcmNlU1NMOiB0cnVlLFxuICAgICAgICAgICAgLy8gVGhlIGJ1Y2tldCBhbmQgYWxsIG9mIGl0cyBvYmplY3RzIGNhbiBiZSBkZWxldGVkLCBiZWNhdXNlIGFsbCB0aGUgY29udGVudCBpcyBtYW5hZ2VkIGluIHRoaXMgcHJvamVjdFxuICAgICAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJ1Y2tldC5ncmFudFJlYWRXcml0ZSh0aGlzLmNkbkFjY2Vzc0lkZW50aXR5KTtcblxuICAgICAgICByZXR1cm4gYnVja2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIExhbWJkYSBmdW5jdGlvbiB0byByZW5kZXIgdGhlIE51eHQgYXBwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUFwcExhbWJkYUZ1bmN0aW9uKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IEZ1bmN0aW9uIHtcbiAgICAgICAgY29uc3QgZnVuY05hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFwcC1mdW5jdGlvbmA7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbih0aGlzLCBmdW5jTmFtZSwge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBmdW5jTmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgUmVuZGVycyB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IE51eHQgYXBwLmAsXG4gICAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgICAgICAgaGFuZGxlcjogYCR7cHJvcHMuZW50cnlwb2ludCA/PyAnaW5kZXgnfS5oYW5kbGVyYCxcbiAgICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KGAke3Byb3BzLnJvb3REaXIgPz8gJy4nIH0vLm91dHB1dC9zZXJ2ZXJgLCB7XG4gICAgICAgICAgICAgICAgZXhjbHVkZTogWycqKi5zdmcnLCAnKiouaWNvJywgJyoqLnBuZycsICcqKi5qcGcnLCAnKiouanMubWFwJ10sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMTApLFxuICAgICAgICAgICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5U2l6ZSA/PyAxNzkyLFxuICAgICAgICAgICAgbG9nUmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLk9ORV9NT05USCxcbiAgICAgICAgICAgIGFsbG93UHVibGljU3VibmV0OiBmYWxzZSxcbiAgICAgICAgICAgIHRyYWNpbmc6IHByb3BzLmVuYWJsZVRyYWNpbmcgPyBUcmFjaW5nLkFDVElWRSA6IFRyYWNpbmcuRElTQUJMRUQsXG4gICAgICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgICAgICAgIE5PREVfT1BUSU9OUzogJy0tZW5hYmxlLXNvdXJjZS1tYXBzJyxcbiAgICAgICAgICAgICAgICAuLi5KU09OLnBhcnNlKHByb3BzLmVudHJ5cG9pbnRFbnYgPz8gJ3t9JyksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBMYW1iZGEgZnVuY3Rpb24gdGhhdCBjbGVhbnVwcyB0aGUgb3V0ZGF0ZWQgc3RhdGljIGFzc2V0cyBvZiB0aGUgTnV4dCBhcHAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcHNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQ2xlYW51cExhbWJkYUZ1bmN0aW9uKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IEZ1bmN0aW9uIHtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lOiBzdHJpbmcgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNsZWFudXAtZnVuY3Rpb25gO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdDogRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24odGhpcywgZnVuY3Rpb25OYW1lLCB7XG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgQXV0by1kZWxldGVzIHRoZSBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzIGluIHRoZSAke3RoaXMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWV9IFMzIGJ1Y2tldC5gLFxuICAgICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgICAgICAgIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgICAgICAgIGxheWVyczogW25ldyBMYXllclZlcnNpb24odGhpcywgYCR7ZnVuY3Rpb25OYW1lfS1sYXllcmAsIHtcbiAgICAgICAgICAgICAgICBsYXllclZlcnNpb25OYW1lOiBgJHtmdW5jdGlvbk5hbWV9LWxheWVyYCxcbiAgICAgICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vZnVuY3Rpb25zL2Fzc2V0cy1jbGVhbnVwL2J1aWxkL2xheWVyJyksIHtcbiAgICAgICAgICAgICAgICAgICAgYXNzZXRIYXNoVHlwZTogQXNzZXRIYXNoVHlwZS5PVVRQVVQsXG4gICAgICAgICAgICAgICAgICAgIGJ1bmRsaW5nOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbWFnZTogUnVudGltZS5OT0RFSlNfMjBfWC5idW5kbGluZ0ltYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWw6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnlCdW5kbGUob3V0cHV0RGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNTeW5jKCdjZCAnICsgcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL2Z1bmN0aW9ucy9hc3NldHMtY2xlYW51cCcpICsgJyAmJiB5YXJuIGluc3RhbGwnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy5jcFN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL2Z1bmN0aW9ucy9hc3NldHMtY2xlYW51cC9ub2RlX21vZHVsZXMnKSwgYCR7b3V0cHV0RGlyfS9ub2RlanMvbm9kZV9tb2R1bGVzYCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzaXZlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBjb21wYXRpYmxlUnVudGltZXM6IFtSdW50aW1lLk5PREVKU18yMF9YXSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogYFByb3ZpZGVzIHRoZSBub2RlX21vZHVsZXMgcmVxdWlyZWQgZm9yIHRoZSAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0gbGFtYmRhIGZ1bmN0aW9uLmBcbiAgICAgICAgICAgIH0pXSxcbiAgICAgICAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9mdW5jdGlvbnMvYXNzZXRzLWNsZWFudXAvYnVpbGQvYXBwJyksIHtcbiAgICAgICAgICAgICAgICBhc3NldEhhc2hUeXBlOiBBc3NldEhhc2hUeXBlLk9VVFBVVCxcbiAgICAgICAgICAgICAgICBidW5kbGluZzoge1xuICAgICAgICAgICAgICAgICAgICBpbWFnZTogUnVudGltZS5OT0RFSlNfMjBfWC5idW5kbGluZ0ltYWdlLFxuICAgICAgICAgICAgICAgICAgICBsb2NhbDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5QnVuZGxlKG91dHB1dERpcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY1N5bmMoJ2NkICcgKyBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vZnVuY3Rpb25zL2Fzc2V0cy1jbGVhbnVwJykgKyAnICYmIHlhcm4gaW5zdGFsbCAmJiB5YXJuIGJ1aWxkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy5jcFN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL2Z1bmN0aW9ucy9hc3NldHMtY2xlYW51cC9idWlsZC9hcHAnKSwgb3V0cHV0RGlyLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgICAgICAgbWVtb3J5U2l6ZTogMTI4LFxuICAgICAgICAgICAgbG9nUmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLlRXT19XRUVLUyxcbiAgICAgICAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgICAgICAgICAgU1RBVElDX0FTU0VUU19CVUNLRVQ6IHRoaXMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgT1VUREFURURfQVNTRVRTX1JFVEVOVElPTl9EQVlTOiBgJHtwcm9wcy5vdXRkYXRlZEFzc2V0c1JldGVudGlvbkRheXMgPz8gMzB9YCxcbiAgICAgICAgICAgICAgICBFTlZJUk9OTUVOVDogcHJvcHMuZW52aXJvbm1lbnQsXG4gICAgICAgICAgICAgICAgQVdTX05PREVKU19DT05ORUNUSU9OX1JFVVNFX0VOQUJMRUQ6ICcxJyxcbiAgICAgICAgICAgICAgICBOT0RFX09QVElPTlM6ICctLWVuYWJsZS1zb3VyY2UtbWFwcycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBncmFudCBmdW5jdGlvbiBhY2Nlc3MgdG8gUzMgYnVja2V0XG4gICAgICAgIHRoaXMuc3RhdGljQXNzZXRzQnVja2V0LmdyYW50UmVhZChyZXN1bHQpO1xuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldC5ncmFudERlbGV0ZShyZXN1bHQpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgQVBJIGdhdGV3YXkgdG8gbWFrZSB0aGUgTnV4dCBhcHAgcmVuZGVyIExhbWJkYSBmdW5jdGlvbiBwdWJsaWNseSBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQXBpR2F0ZXdheShwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBIdHRwQXBpIHtcbiAgICAgICAgY29uc3QgYXBpTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYXBpYDtcbiAgICAgICAgY29uc3QgbGFtYmRhSW50ZWdyYXRpb24gPSBuZXcgSHR0cExhbWJkYUludGVncmF0aW9uKGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tbGFtYmRhLWludGVncmF0aW9uYCwgdGhpcy5hcHBMYW1iZGFGdW5jdGlvbik7XG5cbiAgICAgICAgLy8gV2Ugd2FudCB0aGUgQVBJIGdhdGV3YXkgdG8gYmUgYWNjZXNzaWJsZSBieSB0aGUgY3VzdG9tIGRvbWFpbiBuYW1lLlxuICAgICAgICAvLyBFdmVuIHRob3VnaCB3ZSBhY2Nlc3MgdGhlIGdhdGV3YXkgdmlhIENsb3VkRnJvbnQgKGZvciBhdXRvIGh0dHAgdG8gaHR0cHMgcmVkaXJlY3RzKSwgdGhpcyBpcyByZXF1aXJlZFxuICAgICAgICAvLyB0byBiZSBhYmxlIHRvIHJlZGlyZWN0IHRoZSBvcmlnaW5hbCAnSG9zdCcgaGVhZGVyIHRvIHRoZSBOdXh0IGFwcGxpY2F0aW9uLCBpZiByZXF1ZXN0ZWQuXG4gICAgICAgIGNvbnN0IGRvbWFpbk5hbWUgPSBuZXcgRG9tYWluTmFtZSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFwaS1kb21haW5gLCB7XG4gICAgICAgICAgICBkb21haW5OYW1lOiBwcm9wcy5kb21haW4sXG4gICAgICAgICAgICBjZXJ0aWZpY2F0ZTogQ2VydGlmaWNhdGUuZnJvbUNlcnRpZmljYXRlQXJuKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tcmVnaW9uYWwtY2VydGlmaWNhdGVgLCBwcm9wcy5yZWdpb25hbFRsc0NlcnRpZmljYXRlQXJuKSxcbiAgICAgICAgICAgIGVuZHBvaW50VHlwZTogRW5kcG9pbnRUeXBlLlJFR0lPTkFMLFxuICAgICAgICAgICAgc2VjdXJpdHlQb2xpY3k6IFNlY3VyaXR5UG9saWN5LlRMU18xXzJcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgYXBpR2F0ZXdheSA9IG5ldyBIdHRwQXBpKHRoaXMsIGFwaU5hbWUsIHtcbiAgICAgICAgICAgIGFwaU5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYENvbm5lY3RzIHRoZSAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0gQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gd2l0aCB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IExhbWJkYSBmdW5jdGlvbiB0byBtYWtlIGl0IHB1YmxpY2x5IGF2YWlsYWJsZS5gLFxuICAgICAgICAgICAgLy8gVGhlIGFwcCBkb2VzIG5vdCBhbGxvdyBhbnkgY3Jvc3Mtb3JpZ2luIGFjY2VzcyBieSBwdXJwb3NlOiB0aGUgYXBwIHNob3VsZCBub3QgYmUgZW1iZWRkYWJsZSBhbnl3aGVyZVxuICAgICAgICAgICAgY29yc1ByZWZsaWdodDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGVmYXVsdEludGVncmF0aW9uOiBsYW1iZGFJbnRlZ3JhdGlvbixcbiAgICAgICAgICAgIGRlZmF1bHREb21haW5NYXBwaW5nOiB7XG4gICAgICAgICAgICAgICAgZG9tYWluTmFtZTogZG9tYWluTmFtZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBhcGlHYXRld2F5LmFkZFJvdXRlcyh7XG4gICAgICAgICAgICBpbnRlZ3JhdGlvbjogbGFtYmRhSW50ZWdyYXRpb24sXG4gICAgICAgICAgICBwYXRoOiAnL3twcm94eSt9JyxcbiAgICAgICAgICAgIG1ldGhvZHM6IFtIdHRwTWV0aG9kLkdFVCwgSHR0cE1ldGhvZC5IRUFEXSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGFwaUdhdGV3YXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdGhhdCByb3V0ZXMgaW5jb21pbmcgcmVxdWVzdHMgdG8gdGhlIE51eHQgTGFtYmRhIGZ1bmN0aW9uICh2aWEgdGhlIEFQSSBnYXRld2F5KVxuICAgICAqIG9yIHRoZSBTMyBhc3NldHMgZm9sZGVyICh3aXRoIGNhY2hpbmcpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUNsb3VkRnJvbnREaXN0cmlidXRpb24ocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogRGlzdHJpYnV0aW9uIHtcbiAgICAgICAgY29uc3QgY2RuTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY2RuYDtcblxuICAgICAgICByZXR1cm4gbmV3IERpc3RyaWJ1dGlvbih0aGlzLCBjZG5OYW1lLCB7XG4gICAgICAgICAgICBkb21haW5OYW1lczogW3Byb3BzLmRvbWFpbl0sXG4gICAgICAgICAgICBjb21tZW50OiBjZG5OYW1lLFxuICAgICAgICAgICAgbWluaW11bVByb3RvY29sVmVyc2lvbjogU2VjdXJpdHlQb2xpY3lQcm90b2NvbC5UTFNfVjFfMl8yMDE4LFxuICAgICAgICAgICAgY2VydGlmaWNhdGU6IENlcnRpZmljYXRlLmZyb21DZXJ0aWZpY2F0ZUFybih0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWdsb2JhbC1jZXJ0aWZpY2F0ZWAsIHByb3BzLmdsb2JhbFRsc0NlcnRpZmljYXRlQXJuKSxcbiAgICAgICAgICAgIGh0dHBWZXJzaW9uOiBIdHRwVmVyc2lvbi5IVFRQMl9BTkRfMyxcbiAgICAgICAgICAgIGRlZmF1bHRCZWhhdmlvcjogdGhpcy5jcmVhdGVOdXh0QXBwUm91dGVCZWhhdmlvcigpLFxuICAgICAgICAgICAgYWRkaXRpb25hbEJlaGF2aW9yczogdGhpcy5zZXR1cENsb3VkRnJvbnRSb3V0aW5nKHByb3BzKSxcbiAgICAgICAgICAgIHByaWNlQ2xhc3M6IFByaWNlQ2xhc3MuUFJJQ0VfQ0xBU1NfMTAwLCAvLyBVc2Ugb25seSBOb3J0aCBBbWVyaWNhIGFuZCBFdXJvcGVcbiAgICAgICAgICAgIGxvZ0J1Y2tldDogdGhpcy5hY2Nlc3NMb2dzQnVja2V0LFxuICAgICAgICAgICAgbG9nRmlsZVByZWZpeDogcHJvcHMuZW5hYmxlQWNjZXNzTG9nc0FuYWx5c2lzID8gQ2xvdWRGcm9udEFjY2Vzc0xvZ3NBbmFseXNpcy5nZXRMb2dGaWxlUHJlZml4KCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBsb2dJbmNsdWRlc0Nvb2tpZXM6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIGJlaGF2aW9yIG9yaWdpbiB0byByb3V0ZSBpbmNvbWluZyByZXF1ZXN0cyB0byB0aGUgTnV4dCByZW5kZXIgTGFtYmRhIGZ1bmN0aW9uICh2aWEgQVBJIGdhdGV3YXkpLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlTnV4dEFwcEh0dHBPcmlnaW4oKTogSHR0cE9yaWdpbiB7XG4gICAgICAgIHJldHVybiBuZXcgSHR0cE9yaWdpbihgJHt0aGlzLmFwaUdhdGV3YXkuaHR0cEFwaUlkfS5leGVjdXRlLWFwaS4ke3RoaXMucmVnaW9ufS5hbWF6b25hd3MuY29tYCwge1xuICAgICAgICAgICAgY29ubmVjdGlvbkF0dGVtcHRzOiAyLFxuICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMiksXG4gICAgICAgICAgICByZWFkVGltZW91dDogRHVyYXRpb24uc2Vjb25kcygxMCksXG4gICAgICAgICAgICBwcm90b2NvbFBvbGljeTogT3JpZ2luUHJvdG9jb2xQb2xpY3kuSFRUUFNfT05MWSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJlaGF2aW9yIGZvciB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcm91dGUgaW5jb21pbmcgd2ViIHJlcXVlc3RzXG4gICAgICogdG8gdGhlIE51eHQgcmVuZGVyIExhbWJkYSBmdW5jdGlvbiAodmlhIEFQSSBnYXRld2F5KS5cbiAgICAgKiBBZGRpdGlvbmFsbHksIHRoaXMgYXV0b21hdGljYWxseSByZWRpcmVjdHMgSFRUUCByZXF1ZXN0cyB0byBIVFRQUy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZU51eHRBcHBSb3V0ZUJlaGF2aW9yKCk6IEJlaGF2aW9yT3B0aW9ucyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvcmlnaW46IHRoaXMuaHR0cE9yaWdpbixcbiAgICAgICAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19HRVRfSEVBRCxcbiAgICAgICAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IFZpZXdlclByb3RvY29sUG9saWN5LlJFRElSRUNUX1RPX0hUVFBTLFxuICAgICAgICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY2FjaGVQb2xpY3k6IHRoaXMuYXBwQ2FjaGVQb2xpY3lcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwQ2xvdWRGcm9udFJvdXRpbmcocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiB7XG4gICAgICAgIGxldCByb3V0aW5nQmVoYXZpb3VyczogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiA9IHt9O1xuXG4gICAgICAgIC8vIFNwZWNpZmljIG9uZXMgZmlyc3RcbiAgICAgICAgaWYgKHByb3BzLmVuYWJsZUFwaSkge1xuICAgICAgICAgICAgcm91dGluZ0JlaGF2aW91cnMgPSB7Li4ucm91dGluZ0JlaGF2aW91cnMsIC4uLnRoaXMuY3JlYXRlQXBpUm91dGVCZWhhdmlvcigpfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcHMuZW5hYmxlU2l0ZW1hcCkge1xuICAgICAgICAgICAgcm91dGluZ0JlaGF2aW91cnMgPSB7Li4ucm91dGluZ0JlaGF2aW91cnMsIC4uLnRoaXMuY3JlYXRlU2l0ZW1hcFJvdXRlQmVoYXZpb3IoKX07XG4gICAgICAgIH1cblxuICAgICAgICByb3V0aW5nQmVoYXZpb3VycyA9IHsuLi5yb3V0aW5nQmVoYXZpb3VycywgLi4udGhpcy5jcmVhdGVTdGF0aWNBc3NldHNSb3V0ZUJlaGF2aW9yKCl9O1xuXG4gICAgICAgIHJldHVybiByb3V0aW5nQmVoYXZpb3VycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2FjaGUgcG9saWN5IGZvciB0aGUgTnV4dCBhcHAgcm91dGUgYmVoYXZpb3Igb2YgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlTnV4dEFwcENhY2hlUG9saWN5KHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IENhY2hlUG9saWN5IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYWNoZVBvbGljeSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNhY2hlLXBvbGljeWAsIHtcbiAgICAgICAgICAgIGNhY2hlUG9saWN5TmFtZTogYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1jZG4tY2FjaGUtcG9saWN5YCxcbiAgICAgICAgICAgIGNvbW1lbnQ6IGBEZWZpbmVzIHdoaWNoIHJlcXVlc3QgZGF0YSB0byBwYXNzIHRvIHRoZSAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0gb3JpZ2luIGFuZCBob3cgdGhlIGNhY2hlIGtleSBpcyBjYWxjdWxhdGVkLmAsXG4gICAgICAgICAgICBkZWZhdWx0VHRsOiBEdXJhdGlvbi5zZWNvbmRzKDApLFxuICAgICAgICAgICAgbWluVHRsOiBEdXJhdGlvbi5zZWNvbmRzKDApLFxuICAgICAgICAgICAgbWF4VHRsOiBEdXJhdGlvbi5kYXlzKDM2NSksXG4gICAgICAgICAgICBxdWVyeVN0cmluZ0JlaGF2aW9yOiBwcm9wcy5hbGxvd1F1ZXJ5UGFyYW1zPy5sZW5ndGggPyBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmFsbG93UXVlcnlQYXJhbXMpIDogKHByb3BzLmRlbnlRdWVyeVBhcmFtcz8ubGVuZ3RoID8gQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmRlbnlMaXN0KC4uLnByb3BzLmRlbnlRdWVyeVBhcmFtcykgOiBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IuYWxsKCkpLFxuICAgICAgICAgICAgaGVhZGVyQmVoYXZpb3I6IHByb3BzLmFsbG93SGVhZGVycz8ubGVuZ3RoID8gQ2FjaGVIZWFkZXJCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuYWxsb3dIZWFkZXJzKSA6IENhY2hlSGVhZGVyQmVoYXZpb3Iubm9uZSgpLFxuICAgICAgICAgICAgY29va2llQmVoYXZpb3I6IHByb3BzLmFsbG93Q29va2llcz8ubGVuZ3RoID8gQ2FjaGVDb29raWVCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuYWxsb3dDb29raWVzKSA6IENhY2hlQ29va2llQmVoYXZpb3Iubm9uZSgpLFxuICAgICAgICAgICAgZW5hYmxlQWNjZXB0RW5jb2RpbmdCcm90bGk6IHRydWUsXG4gICAgICAgICAgICBlbmFibGVBY2NlcHRFbmNvZGluZ0d6aXA6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBiZWhhdmlvciBmb3IgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRvIHJvdXRlIG1hdGNoaW5nIE51eHQgYXBwIEFQSSByZXF1ZXN0cyB0byB0aGUgQVBJIGdhdGV3YXkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVBcGlSb3V0ZUJlaGF2aW9yKCk6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4ge1xuICAgICAgICBjb25zdCBhcGlCZWhhdmlvcjogQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgICAgICAgb3JpZ2luOiB0aGlzLmh0dHBPcmlnaW4sXG4gICAgICAgICAgICBjb21wcmVzczogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19BTEwsXG4gICAgICAgICAgICBjYWNoZWRNZXRob2RzOiBDYWNoZWRNZXRob2RzLkNBQ0hFX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICAgICAgICBjYWNoZVBvbGljeTogdGhpcy5hcHBDYWNoZVBvbGljeSxcbiAgICAgICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5IVFRQU19PTkxZXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcnVsZXM6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4gPSB7fTtcbiAgICAgICAgcnVsZXNbJy9hcGkvKiddID0gYXBpQmVoYXZpb3I7XG5cbiAgICAgICAgcmV0dXJuIHJ1bGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBiZWhhdmlvciBmb3IgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRvIHJvdXRlIG1hdGNoaW5nIGluY29taW5nIHJlcXVlc3RzIGZvciB0aGUgc3RhdGljIGFzc2V0c1xuICAgICAqIHRvIHRoZSBTMyBidWNrZXQgdGhhdCBob2xkcyB0aGVzZSBzdGF0aWMgYXNzZXRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVN0YXRpY0Fzc2V0c1JvdXRlQmVoYXZpb3IoKTogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiB7XG4gICAgICAgIGNvbnN0IHN0YXRpY0Fzc2V0c0NhY2hlQ29uZmlnOiBCZWhhdmlvck9wdGlvbnMgPSB7XG4gICAgICAgICAgICBvcmlnaW46IG5ldyBTM09yaWdpbih0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldCwge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25BdHRlbXB0czogMixcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dDogRHVyYXRpb24uc2Vjb25kcygzKSxcbiAgICAgICAgICAgICAgICBvcmlnaW5BY2Nlc3NJZGVudGl0eTogdGhpcy5jZG5BY2Nlc3NJZGVudGl0eSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY29tcHJlc3M6IHRydWUsXG4gICAgICAgICAgICBhbGxvd2VkTWV0aG9kczogQWxsb3dlZE1ldGhvZHMuQUxMT1dfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgICAgICAgIGNhY2hlZE1ldGhvZHM6IENhY2hlZE1ldGhvZHMuQ0FDSEVfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgICAgICAgIGNhY2hlUG9saWN5OiBDYWNoZVBvbGljeS5DQUNISU5HX09QVElNSVpFRCxcbiAgICAgICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBydWxlczogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiA9IHt9O1xuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0Q29uZmlncy5mb3JFYWNoKGFzc2V0ID0+IHtcbiAgICAgICAgICAgIHJ1bGVzW2Ake2Fzc2V0LnRhcmdldH0ke2Fzc2V0LnBhdHRlcm59YF0gPSBzdGF0aWNBc3NldHNDYWNoZUNvbmZpZ1xuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBydWxlc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBiZWhhdmlvciBmb3IgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRvIHJvdXRlIG1hdGNoaW5nIGluY29taW5nIHJlcXVlc3RzIGZvciB0aGUgc2l0ZW1hcCBhc3NldHNcbiAgICAgKiB0byB0aGUgUzMgYnVja2V0IHRoYXQgaG9sZHMgdGhlc2Ugc2l0ZW1hcCBhc3NldHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlU2l0ZW1hcFJvdXRlQmVoYXZpb3IoKTogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiB7XG4gICAgICAgIGlmICghdGhpcy5zaXRlbWFwQnVja2V0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTaXRlbWFwIGJ1Y2tldCBtdXN0IGV4aXN0IGJlZm9yZSBjcmVhdGluZyBzaXRlbWFwIHJvdXRlIGJlaGF2aW9yLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNpdGVtYXBDYWNoZUNvbmZpZzogQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgICAgICAgb3JpZ2luOiBuZXcgUzNPcmlnaW4odGhpcy5zaXRlbWFwQnVja2V0LCB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbkF0dGVtcHRzOiAyLFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDMpLFxuICAgICAgICAgICAgICAgIG9yaWdpbkFjY2Vzc0lkZW50aXR5OiB0aGlzLmNkbkFjY2Vzc0lkZW50aXR5LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBjb21wcmVzczogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICAgICAgY2FjaGVkTWV0aG9kczogQ2FjaGVkTWV0aG9kcy5DQUNIRV9HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICAgICAgY2FjaGVQb2xpY3k6IENhY2hlUG9saWN5LkNBQ0hJTkdfT1BUSU1JWkVELFxuICAgICAgICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IFZpZXdlclByb3RvY29sUG9saWN5LlJFRElSRUNUX1RPX0hUVFBTXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcnVsZXM6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4gPSB7fTtcbiAgICAgICAgcnVsZXNbJypzaXRlbWFwLnhtbCddID0gc2l0ZW1hcENhY2hlQ29uZmlnO1xuICAgICAgICBydWxlc1snKnNpdGVtYXAtZ29uZS54bWwnXSA9IHNpdGVtYXBDYWNoZUNvbmZpZztcbiAgICAgICAgcnVsZXNbJy9zaXRlbWFwcy8qJ10gPSBzaXRlbWFwQ2FjaGVDb25maWc7XG5cbiAgICAgICAgcmV0dXJuIHJ1bGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwbG9hZHMgdGhlIHN0YXRpYyBhc3NldHMgb2YgdGhlIE51eHQgYXBwIGFzIGRlZmluZWQgaW4ge0BzZWUgZ2V0TnV4dEFwcFN0YXRpY0Fzc2V0Q29uZmlnc30gdG8gdGhlIHN0YXRpYyBhc3NldHMgUzMgYnVja2V0LlxuICAgICAqIEluIG9yZGVyIHRvIGVuYWJsZSBhIHplcm8tZG93bnRpbWUgZGVwbG95bWVudCB3aXRoIG1pbmltYWwgc3RvcmFnZSBsb2FkLFxuICAgICAqIHdlIGRlcGxveSB0aGUgc3RhdGljIGFzc2V0cyBvZiBldmVyeSBkZXBsb3ltZW50IGludG8gdGhlIHNhbWUgZm9sZGVyIGJ1dCBtYXJrIHRoZW0gd2l0aCBhIGRlcGxveW1lbnQgcmV2aXNpb24uXG4gICAgICogQnkgZG9pbmcgc28sIHRoZSBmaWxlcyBvZiBwcmV2aW91cyBkZXBsb3ltZW50cyBhcmUgcmV0YWluZWQgdG8gYWxsb3cgY2xpZW50cyB0byBjb250aW51ZSB0byB3b3JrIHdpdGggYW4gb2xkZXIgcmV2aXNpb25cbiAgICAgKiBidXQgZ2V0cyBjbGVhbmVkIHVwIGFmdGVyIGEgc3BlY2lmaWVkIHBlcmlvZCBvZiB0aW1lIHZpYSB0aGUgY2xlYW51cCBMYW1iZGEgZnVuY3Rpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBjb25maWd1cmVEZXBsb3ltZW50cygpOiBCdWNrZXREZXBsb3ltZW50W10ge1xuICAgICAgICAvLyBSZXR1cm5zIGEgZGVwbG95bWVudCBmb3IgZXZlcnkgY29uZmlndXJlZCBzdGF0aWMgYXNzZXQgdHlwZSB0byByZXNwZWN0IHRoZSBkaWZmZXJlbnQgY2FjaGUgc2V0dGluZ3NcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGljQXNzZXRDb25maWdzLmZpbHRlcihhc3NldCA9PiBmcy5leGlzdHNTeW5jKGFzc2V0LnNvdXJjZSkpLm1hcCgoYXNzZXQsIGFzc2V0SW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQnVja2V0RGVwbG95bWVudCh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFzc2V0cy1kZXBsb3ltZW50LSR7YXNzZXRJbmRleH1gLCB7XG4gICAgICAgICAgICAgICAgc291cmNlczogW1NvdXJjZS5hc3NldChhc3NldC5zb3VyY2UsIHtcbiAgICAgICAgICAgICAgICAgICAgZXhjbHVkZTogYXNzZXQuZXhjbHVkZSxcbiAgICAgICAgICAgICAgICB9KV0sXG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb25CdWNrZXQ6IHRoaXMuc3RhdGljQXNzZXRzQnVja2V0LFxuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiBhc3NldC50YXJnZXQucmVwbGFjZSgvXlxcLysvZywgJycpLCAvLyBSZW1vdmUgbGVhZGluZyBzbGFzaFxuICAgICAgICAgICAgICAgIHBydW5lOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzdG9yYWdlQ2xhc3M6IFN0b3JhZ2VDbGFzcy5TVEFOREFSRCxcbiAgICAgICAgICAgICAgICBleGNsdWRlOiBbJyonXSxcbiAgICAgICAgICAgICAgICBpbmNsdWRlOiBbYXNzZXQucGF0dGVybl0sXG4gICAgICAgICAgICAgICAgY2FjaGVDb250cm9sOiBhc3NldC5jYWNoZUNvbnRyb2wsXG4gICAgICAgICAgICAgICAgY29udGVudFR5cGU6IGFzc2V0LmNvbnRlbnRUeXBlLFxuICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbjogYXNzZXQuaW52YWxpZGF0ZU9uQ2hhbmdlID8gdGhpcy5jZG4gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uUGF0aHM6IGFzc2V0LmludmFsaWRhdGVPbkNoYW5nZSA/IFtgLyR7YXNzZXQucGF0dGVybn1gXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBsb2dSZXRlbnRpb246IFJldGVudGlvbkRheXMuT05FX0RBWSxcblxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN0b3JlIGJ1aWxkIHJldmlzaW9uIG9uIGV2ZXJ5IGFzc2V0IHRvIGFsbG93IGNsZWFudXAgb2Ygb3V0ZGF0ZWQgYXNzZXRzXG4gICAgICAgICAgICAgICAgICAgIHJldmlzaW9uOiB0aGlzLmRlcGxveW1lbnRSZXZpc2lvbixcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgLy8gU29tZSBOdXh0IGFwcGxpY2F0aW9ucyBoYXZlIGEgbG90IG9mIGFzc2V0cyB0byBkZXBsb3kgd2hlcmVieSB0aGUgZnVuY3Rpb24gbWlnaHQgcnVuIG91dCBvZiBtZW1vcnkuXG4gICAgICAgICAgICAgICAgLy8gQWRkaXRpb25hbGx5LCBhIGhpZ2ggbWVtb3J5IGxpbWl0IG1pZ2h0IHNwZWVkIHVwIGRlcGxveW1lbnRzLlxuICAgICAgICAgICAgICAgIG1lbW9yeUxpbWl0OiAxNzkyXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyB0aGUgaG9zdGVkIHpvbmUgYXQgd2hpY2ggdGhlIEROUyByZWNvcmRzIHNoYWxsIGJlIGNyZWF0ZWQgdG8gYWNjZXNzIHRoZSBOdXh0IGFwcCBvbiB0aGUgaW50ZXJuZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcHNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZmluZEhvc3RlZFpvbmUocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogSUhvc3RlZFpvbmUge1xuICAgICAgICBjb25zdCBkb21haW5QYXJ0cyA9IHByb3BzLmRvbWFpbi5zcGxpdCgnLicpO1xuXG4gICAgICAgIHJldHVybiBIb3N0ZWRab25lLmZyb21Ib3N0ZWRab25lQXR0cmlidXRlcyh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWhvc3RlZC16b25lYCwge1xuICAgICAgICAgICAgaG9zdGVkWm9uZUlkOiBwcm9wcy5ob3N0ZWRab25lSWQsXG4gICAgICAgICAgICB6b25lTmFtZTogZG9tYWluUGFydHNbZG9tYWluUGFydHMubGVuZ3RoIC0gMV0sIC8vIFN1cHBvcnQgc3ViZG9tYWluc1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBETlMgcmVjb3JkcyB0byBhY2Nlc3MgdGhlIE51eHQgYXBwIG9uIHRoZSBpbnRlcm5ldCB2aWEgdGhlIGN1c3RvbSBkb21haW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcHNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlRG5zUmVjb3Jkcyhwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaG9zdGVkWm9uZSA9IHRoaXMuZmluZEhvc3RlZFpvbmUocHJvcHMpO1xuICAgICAgICBjb25zdCBkbnNUYXJnZXQgPSBSZWNvcmRUYXJnZXQuZnJvbUFsaWFzKG5ldyBDbG91ZEZyb250VGFyZ2V0KHRoaXMuY2RuKSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgcmVjb3JkIGZvciBJUHY0XG4gICAgICAgIG5ldyBBUmVjb3JkKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0taXB2NC1yZWNvcmRgLCB7XG4gICAgICAgICAgICByZWNvcmROYW1lOiBwcm9wcy5kb21haW4sXG4gICAgICAgICAgICB6b25lOiBob3N0ZWRab25lLFxuICAgICAgICAgICAgdGFyZ2V0OiBkbnNUYXJnZXQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIHJlY29yZCBmb3IgSVB2NlxuICAgICAgICBuZXcgQWFhYVJlY29yZCh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWlwdjYtcmVjb3JkYCwge1xuICAgICAgICAgICAgcmVjb3JkTmFtZTogcHJvcHMuZG9tYWluLFxuICAgICAgICAgICAgem9uZTogaG9zdGVkWm9uZSxcbiAgICAgICAgICAgIHRhcmdldDogZG5zVGFyZ2V0LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2NoZWR1bGVkIHJ1bGUgdG8gcGluZyB0aGUgTnV4dCBhcHAgTGFtYmRhIGZ1bmN0aW9uIGV2ZXJ5IDUgbWludXRlcyBpbiBvcmRlciB0byBrZWVwIGl0IHdhcm1cbiAgICAgKiBhbmQgc3BlZWQgdXAgaW5pdGlhbCBTU1IgcmVxdWVzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQXBwUGluZ1J1bGUocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZha2VBcGlHYXRld2F5RXZlbnREYXRhID0ge1xuICAgICAgICAgICAgXCJ2ZXJzaW9uXCI6IFwiMi4wXCIsXG4gICAgICAgICAgICBcInJvdXRlS2V5XCI6IFwiR0VUIC97cHJveHkrfVwiLFxuICAgICAgICAgICAgXCJyYXdQYXRoXCI6IFwiL1wiLFxuICAgICAgICAgICAgXCJyYXdRdWVyeVN0cmluZ1wiOiBcIlwiLFxuICAgICAgICAgICAgXCJoZWFkZXJzXCI6IHt9LFxuICAgICAgICAgICAgXCJyZXF1ZXN0Q29udGV4dFwiOiB7XG4gICAgICAgICAgICAgICAgXCJkb21haW5OYW1lXCI6IHByb3BzLmRvbWFpbixcbiAgICAgICAgICAgICAgICBcImh0dHBcIjoge1xuICAgICAgICAgICAgICAgICAgICBcIm1ldGhvZFwiOiBcIkdFVFwiLFxuICAgICAgICAgICAgICAgICAgICBcInBhdGhcIjogXCIvXCIsXG4gICAgICAgICAgICAgICAgICAgIFwicHJvdG9jb2xcIjogXCJIVFRQLzEuMVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIG5ldyBSdWxlKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tcGluZ2VyLXJ1bGVgLCB7XG4gICAgICAgICAgICBydWxlTmFtZTogYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1waW5nZXJgLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBQaW5ncyB0aGUgTGFtYmRhIGZ1bmN0aW9uIG9mIHRoZSAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0gYXBwIGV2ZXJ5IDUgbWludXRlcyB0byBrZWVwIGl0IHdhcm0uYCxcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICBzY2hlZHVsZTogU2NoZWR1bGUucmF0ZShEdXJhdGlvbi5taW51dGVzKDUpKSxcbiAgICAgICAgICAgIHRhcmdldHM6IFtuZXcgTGFtYmRhRnVuY3Rpb24odGhpcy5hcHBMYW1iZGFGdW5jdGlvbiwge1xuICAgICAgICAgICAgICAgIGV2ZW50OiBSdWxlVGFyZ2V0SW5wdXQuZnJvbU9iamVjdChmYWtlQXBpR2F0ZXdheUV2ZW50RGF0YSlcbiAgICAgICAgICAgIH0pXSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2NoZWR1bGVkIHJ1bGUgdGhhdCBydW5zIGV2ZXJ5IHR1ZXNkYXkgYXQgMDM6MzAgQU0gR01UIHRvIHRyaWdnZXJcbiAgICAgKiBvdXIgY2xlYW51cCBMYW1iZGEgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQ2xlYW51cFRyaWdnZXJSdWxlKCk6IHZvaWQge1xuICAgICAgICBuZXcgUnVsZSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXNjaGVkdWxlci1ydWxlYCwge1xuICAgICAgICAgICAgcnVsZU5hbWU6IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tc2NoZWR1bGVyYCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgVHJpZ2dlcnMgYSBjbGVhbnVwIG9mIHRoZSBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzIGF0IHRoZSAke3RoaXMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWV9IFMzIGJ1Y2tldC5gLFxuICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIHNjaGVkdWxlOiBTY2hlZHVsZS5jcm9uKHt3ZWVrRGF5OiAnMycsIGhvdXI6ICczJywgbWludXRlOiAnMzAnfSksXG4gICAgICAgICAgICB0YXJnZXRzOiBbbmV3IExhbWJkYUZ1bmN0aW9uKHRoaXMuY2xlYW51cExhbWJkYUZ1bmN0aW9uKV0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBTMyBidWNrZXQgdG8gc3RvcmUgdGhlIGFjY2VzcyBsb2dzIG9mIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUFjY2Vzc0xvZ3NCdWNrZXQoKTogQnVja2V0IHtcbiAgICAgICAgY29uc3QgYnVja2V0TmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYWNjZXNzLWxvZ3NgO1xuICAgICAgICBjb25zdCBidWNrZXQgPSBuZXcgQnVja2V0KHRoaXMsIGJ1Y2tldE5hbWUsIHtcbiAgICAgICAgICAgIGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICBibG9ja1B1YmxpY0FjY2VzczogQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgICAgICAgICAgb2JqZWN0T3duZXJzaGlwOiBPYmplY3RPd25lcnNoaXAuQlVDS0VUX09XTkVSX1BSRUZFUlJFRCxcbiAgICAgICAgICAgIC8vIFdoZW4gdGhlIHN0YWNrIGlzIGRlc3Ryb3llZCwgd2UgZXhwZWN0IGV2ZXJ5dGhpbmcgdG8gYmUgZGVsZXRlZFxuICAgICAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJ1Y2tldC5ncmFudFJlYWRXcml0ZSh0aGlzLmNkbkFjY2Vzc0lkZW50aXR5KTtcblxuICAgICAgICByZXR1cm4gYnVja2V0O1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlQWNjZXNzTG9nc0FuYWx5c2lzKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IENsb3VkRnJvbnRBY2Nlc3NMb2dzQW5hbHlzaXMge1xuICAgICAgICBpZiAoIXRoaXMuYWNjZXNzTG9nc0J1Y2tldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY2Nlc3MgYnVja2V0IG5vdCBzZXQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENsb3VkRnJvbnRBY2Nlc3NMb2dzQW5hbHlzaXModGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hY2Nlc3MtbG9ncy1hbmFseXNpc2AsIHtcbiAgICAgICAgICAgIGJ1Y2tldDogdGhpcy5hY2Nlc3NMb2dzQnVja2V0LFxuICAgICAgICAgICAgcmVzb3VyY2VQcmVmaXg6IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYWNjZXNzLWxvZ3NgLFxuICAgICAgICAgICAgYWNjZXNzTG9nQ29va2llczogcHJvcHMuYWNjZXNzTG9nQ29va2llcyxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
|
|
553
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTnV4dFNlcnZlckFwcFN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiTnV4dFNlcnZlckFwcFN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUEwRTtBQUUxRSwrRUFBK0Q7QUFDL0QsK0RBZW9DO0FBQ3BDLHVEQUFvRztBQUNwRywrQ0FNNEI7QUFDNUIseURBQW1HO0FBQ25HLHFFQUFxRjtBQUNyRiwrRUFBd0U7QUFDeEUseUVBQWlFO0FBQ2pFLGlGQUErRDtBQUMvRCxtREFBbUQ7QUFDbkQsZ0VBQXVGO0FBQ3ZGLHlCQUF5QjtBQUN6Qix1REFBdUU7QUFDdkUsdUVBQThEO0FBQzlELDZCQUE2QjtBQUM3QiwyQkFBaUM7QUFFakMsdUdBQWtHO0FBQ2xHLDZGQUFnRjtBQUNoRixtRUFBK0Y7QUFDL0YsMkRBQTRDO0FBRTVDOztHQUVHO0FBQ0gsTUFBYSxrQkFBbUIsU0FBUSxtQkFBSztJQXFGekMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE4Qjs7UUFDcEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVqRixxQkFBcUI7UUFDckIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBQSxrREFBNEIsRUFBQyxNQUFBLEtBQUssQ0FBQyxPQUFPLG1DQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUN4RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFF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RSxhQUFhLEVBQUUsMkJBQWEsQ0FBQyxPQUFPO1lBQ3BDLGlCQUFpQixFQUFFLElBQUk7U0FDMUIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUU5QyxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRU8sd0JBQXdCLENBQUMsS0FBOEI7UUFDM0QsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLDJEQUE0QixDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsdUJBQXVCLEVBQUU7WUFDM0YsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7WUFDN0IsY0FBYyxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixjQUFjO1lBQ3RELGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7U0FDM0MsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNKO0FBdHBCRCxnREFzcEJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBc3NldEhhc2hUeXBlLCBEdXJhdGlvbiwgUmVtb3ZhbFBvbGljeSwgU3RhY2t9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7Q29uc3RydWN0fSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7Q2VydGlmaWNhdGV9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyXCI7XG5pbXBvcnQge1xuICAgIEFsbG93ZWRNZXRob2RzLFxuICAgIEJlaGF2aW9yT3B0aW9ucyxcbiAgICBDYWNoZUNvb2tpZUJlaGF2aW9yLFxuICAgIENhY2hlZE1ldGhvZHMsXG4gICAgQ2FjaGVIZWFkZXJCZWhhdmlvcixcbiAgICBDYWNoZVBvbGljeSxcbiAgICBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IsXG4gICAgRGlzdHJpYnV0aW9uLCBIdHRwVmVyc2lvbixcbiAgICBJT3JpZ2luQWNjZXNzSWRlbnRpdHksXG4gICAgT3JpZ2luQWNjZXNzSWRlbnRpdHksXG4gICAgT3JpZ2luUHJvdG9jb2xQb2xpY3ksXG4gICAgUHJpY2VDbGFzcyxcbiAgICBTZWN1cml0eVBvbGljeVByb3RvY29sLFxuICAgIFZpZXdlclByb3RvY29sUG9saWN5XG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udFwiO1xuaW1wb3J0IHtBcmNoaXRlY3R1cmUsIENvZGUsIEZ1bmN0aW9uLCBMYXllclZlcnNpb24sIFJ1bnRpbWUsIFRyYWNpbmd9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQge1xuICAgIEJsb2NrUHVibGljQWNjZXNzLFxuICAgIEJ1Y2tldCxcbiAgICBCdWNrZXRBY2Nlc3NDb250cm9sLFxuICAgIEJ1Y2tldEVuY3J5cHRpb24sXG4gICAgT2JqZWN0T3duZXJzaGlwXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7QWFhYVJlY29yZCwgQVJlY29yZCwgSG9zdGVkWm9uZSwgSUhvc3RlZFpvbmUsIFJlY29yZFRhcmdldH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzXCI7XG5pbXBvcnQge0J1Y2tldERlcGxveW1lbnQsIFNvdXJjZSwgU3RvcmFnZUNsYXNzfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzLWRlcGxveW1lbnRcIjtcbmltcG9ydCB7SHR0cE9yaWdpbiwgUzNPcmlnaW59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC1vcmlnaW5zXCI7XG5pbXBvcnQge0Nsb3VkRnJvbnRUYXJnZXR9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1My10YXJnZXRzXCI7XG5pbXBvcnQge0h0dHBNZXRob2R9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9ucy10YXNrc1wiO1xuaW1wb3J0IHtSZXRlbnRpb25EYXlzfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIjtcbmltcG9ydCB7Z2V0TnV4dEFwcFN0YXRpY0Fzc2V0Q29uZmlncywgU3RhdGljQXNzZXRDb25maWd9IGZyb20gXCIuLi9OdXh0QXBwU3RhdGljQXNzZXRzXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7UnVsZSwgUnVsZVRhcmdldElucHV0LCBTY2hlZHVsZX0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHNcIjtcbmltcG9ydCB7TGFtYmRhRnVuY3Rpb259IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzLXRhcmdldHNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7d3JpdGVGaWxlU3luY30gZnJvbSBcImZzXCI7XG5pbXBvcnQge051eHRTZXJ2ZXJBcHBTdGFja1Byb3BzfSBmcm9tIFwiLi9OdXh0U2VydmVyQXBwU3RhY2tQcm9wc1wiO1xuaW1wb3J0IHtDbG91ZEZyb250QWNjZXNzTG9nc0FuYWx5c2lzfSBmcm9tIFwiLi4vYWNjZXNzLWxvZ3MtYW5hbHlzaXMvQ2xvdWRGcm9udEFjY2Vzc0xvZ3NBbmFseXNpc1wiO1xuaW1wb3J0IHtIdHRwTGFtYmRhSW50ZWdyYXRpb259IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyLWludGVncmF0aW9uc1wiO1xuaW1wb3J0IHtEb21haW5OYW1lLCBFbmRwb2ludFR5cGUsIEh0dHBBcGksIFNlY3VyaXR5UG9saWN5fSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXl2MlwiO1xuaW1wb3J0IHtleGVjU3luY30gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuXG4vKipcbiAqIENESyBzdGFjayB0byBkZXBsb3kgYSBkeW5hbWljIE51eHQgYXBwICh0YXJnZXQ9c2VydmVyKSBvbiBBV1Mgd2l0aCBMYW1iZGEsIEFwaUdhdGV3YXksIFMzIGFuZCBDbG91ZEZyb250LlxuICovXG5leHBvcnQgY2xhc3MgTnV4dFNlcnZlckFwcFN0YWNrIGV4dGVuZHMgU3RhY2sge1xuXG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgcHJlZml4IG9mIHRoZSByZXNvdXJjZXMgY3JlYXRlZCBieSB0aGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2VJZFByZWZpeDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IGRlcGxveW1lbnQgdGhhdCBpcyB1c2VkIHRvIHRhZyB0aGUgc3RhdGljIGFzc2V0cyBvZiB0aGUgZGVwbG95bWVudFxuICAgICAqIHRvIGxhdGVyIGJlIGFibGUgdG8gY2xlYW4gdXAgb3V0ZGF0ZWQgYXNzZXRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlcGxveW1lbnRSZXZpc2lvbjogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aXR5IHRvIHVzZSBmb3IgYWNjZXNzaW5nIHRoZSBkZXBsb3ltZW50IGFzc2V0cyBvbiBTMy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjZG5BY2Nlc3NJZGVudGl0eTogSU9yaWdpbkFjY2Vzc0lkZW50aXR5O1xuXG4gICAgLyoqXG4gICAgICogVGhlIFMzIGJ1Y2tldCB3aGVyZSB0aGUgZGVwbG95bWVudCBhc3NldHMgZ2V0cyBzdG9yZWQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpY0Fzc2V0c0J1Y2tldDogQnVja2V0O1xuXG4gICAgLyoqXG4gICAgICogVGhlIFMzIGJ1Y2tldCB3aGVyZSB0aGUgYWNjZXNzIGxvZ3Mgb2YgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIGdldHMgc3RvcmVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBhY2Nlc3NMb2dzQnVja2V0OiBCdWNrZXR8dW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogVGhlIFMzIGJ1Y2tldCB3aGVyZSB0aGUgc2l0ZW1hcCBhc3NldHMgZ2V0cyBzdG9yZWQuXG4gICAgICovXG4gICAgcHVibGljIHNpdGVtYXBCdWNrZXQ6IEJ1Y2tldHx1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgTGFtYmRhIGZ1bmN0aW9uIHRvIHJlbmRlciB0aGUgTnV4dCBhcHAgb24gdGhlIHNlcnZlciBzaWRlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwcExhbWJkYUZ1bmN0aW9uOiBGdW5jdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBMYW1iZGEgZnVuY3Rpb24gdGhhdCBjbGVhbnVwcyB0aGUgb3V0ZGF0ZWQgc3RhdGljIGFzc2V0cyBvZiB0aGUgTnV4dCBhcHAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xlYW51cExhbWJkYUZ1bmN0aW9uOiBGdW5jdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBBUEkgZ2F0ZXdheSB0byBtYWtlIHRoZSBMYW1iZGEgZnVuY3Rpb24gdG8gcmVuZGVyIHRoZSBOdXh0IGFwcCBwdWJsaWNseSBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgYXBpR2F0ZXdheTogSHR0cEFwaTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjb25maWdzIGZvciB0aGUgc3RhdGljIGFzc2V0cyBvZiB0aGUgTnV4dCBhcHAgdGhhdCBzaGFsbCBiZSBwdWJsaWNseSBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljQXNzZXRDb25maWdzOiBTdGF0aWNBc3NldENvbmZpZ1tdO1xuXG4gICAgLyoqXG4gICAgICogVGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIG9yaWdpbiBmb3IgdGhlIEFQSSBnYXRld2F5IHRvIHJvdXRlIGluY29taW5nIHJlcXVlc3RzIHRvIHRoZSBOdXh0IExhbWJkYSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGh0dHBPcmlnaW46IEh0dHBPcmlnaW47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY2FjaGUgcG9saWN5IGZvciB0aGUgTnV4dCBhcHAgcm91dGUgYmVoYXZpb3JzIG9mIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFwcENhY2hlUG9saWN5OiBDYWNoZVBvbGljeTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0byByb3V0ZSBpbmNvbWluZyByZXF1ZXN0cyB0byB0aGUgTnV4dCBMYW1iZGEgZnVuY3Rpb24gKHZpYSB0aGUgQVBJIGdhdGV3YXkpXG4gICAgICogb3IgdGhlIFMzIGFzc2V0cyBmb2xkZXIgKHdpdGggY2FjaGluZykuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RuOiBEaXN0cmlidXRpb247XG5cbiAgICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpIHtcbiAgICAgICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICAgICAgdGhpcy5yZXNvdXJjZUlkUHJlZml4ID0gYCR7cHJvcHMucHJvamVjdH0tJHtwcm9wcy5zZXJ2aWNlfS0ke3Byb3BzLmVudmlyb25tZW50fWA7XG5cbiAgICAgICAgLy8gTnV4dCBhcHAgcmVzb3VyY2VzXG4gICAgICAgIHRoaXMuZGVwbG95bWVudFJldmlzaW9uID0gdGhpcy5jcmVhdGVEZXBsb3ltZW50UmV2aXNpb24ocHJvcHMpO1xuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0Q29uZmlncyA9IGdldE51eHRBcHBTdGF0aWNBc3NldENvbmZpZ3MocHJvcHMucm9vdERpciA/PyAnLicpO1xuICAgICAgICB0aGlzLmNkbkFjY2Vzc0lkZW50aXR5ID0gdGhpcy5jcmVhdGVDZG5BY2Nlc3NJZGVudGl0eSgpO1xuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldCA9IHRoaXMuY3JlYXRlU3RhdGljQXNzZXRzQnVja2V0KCk7XG5cbiAgICAgICAgaWYgKHByb3BzLmVuYWJsZUFjY2Vzc0xvZ3NBbmFseXNpcykge1xuICAgICAgICAgICAgdGhpcy5hY2Nlc3NMb2dzQnVja2V0ID0gdGhpcy5jcmVhdGVBY2Nlc3NMb2dzQnVja2V0KCk7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUFjY2Vzc0xvZ3NBbmFseXNpcyhwcm9wcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcHMuZW5hYmxlU2l0ZW1hcCkge1xuICAgICAgICAgICAgdGhpcy5zaXRlbWFwQnVja2V0ID0gdGhpcy5jcmVhdGVTaXRlbWFwQnVja2V0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFwcExhbWJkYUZ1bmN0aW9uID0gdGhpcy5jcmVhdGVBcHBMYW1iZGFGdW5jdGlvbihwcm9wcyk7XG4gICAgICAgIHRoaXMuYXBpR2F0ZXdheSA9IHRoaXMuY3JlYXRlQXBpR2F0ZXdheShwcm9wcyk7XG4gICAgICAgIHRoaXMuaHR0cE9yaWdpbiA9IHRoaXMuY3JlYXRlTnV4dEFwcEh0dHBPcmlnaW4oKTtcbiAgICAgICAgdGhpcy5hcHBDYWNoZVBvbGljeSA9IHRoaXMuY3JlYXRlTnV4dEFwcENhY2hlUG9saWN5KHByb3BzKVxuICAgICAgICB0aGlzLmNkbiA9IHRoaXMuY3JlYXRlQ2xvdWRGcm9udERpc3RyaWJ1dGlvbihwcm9wcyk7XG4gICAgICAgIHRoaXMuY29uZmlndXJlRGVwbG95bWVudHMoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVEbnNSZWNvcmRzKHByb3BzKTtcbiAgICAgICAgdGhpcy5jcmVhdGVBcHBQaW5nUnVsZShwcm9wcyk7XG5cbiAgICAgICAgLy8gU3RhdGljIGFzc2V0cyBjbGVhbnVwIHJlc291cmNlc1xuICAgICAgICB0aGlzLmNsZWFudXBMYW1iZGFGdW5jdGlvbiA9IHRoaXMuY3JlYXRlQ2xlYW51cExhbWJkYUZ1bmN0aW9uKHByb3BzKTtcbiAgICAgICAgdGhpcy5jcmVhdGVDbGVhbnVwVHJpZ2dlclJ1bGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBjdXJyZW50IGRlcGxveW1lbnQgcmV2aXNpb24gZmlsZSBpbiB0aGUgcHVibGljIGZvbGRlciBvZiB0aGUgTnV4dCBhcHAgdG8gYmUgYWNjZXNzaWJsZVxuICAgICAqIGFuZCByZXR1cm5zIHRoZSBjdXJyZW50IHJldmlzaW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlRGVwbG95bWVudFJldmlzaW9uKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHJldmlzaW9uRmlsZVBhdGggPSBgJHtwcm9wcy5yb290RGlyID8/ICcuJ30vLm91dHB1dC9wdWJsaWMvYXBwLXJldmlzaW9uYDtcbiAgICAgICAgY29uc3QgYXBwUmV2aXNpb24gPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG5cbiAgICAgICAgd3JpdGVGaWxlU3luYyhyZXZpc2lvbkZpbGVQYXRoLCBhcHBSZXZpc2lvbiwge2VuY29kaW5nOiAndXRmLTgnfSk7XG5cbiAgICAgICAgcmV0dXJuIGFwcFJldmlzaW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIGlkZW50aXR5IHRvIGFjY2VzcyB0aGUgUzMgZGVwbG95bWVudCBhc3NldCBmaWxlcyB2aWEgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUNkbkFjY2Vzc0lkZW50aXR5KCk6IElPcmlnaW5BY2Nlc3NJZGVudGl0eSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbkFjY2Vzc0lkZW50aXR5TmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY2RuLXMzLWFjY2Vzc2A7XG4gICAgICAgIHJldHVybiBuZXcgT3JpZ2luQWNjZXNzSWRlbnRpdHkodGhpcywgb3JpZ2luQWNjZXNzSWRlbnRpdHlOYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBidWNrZXQgdG8gc3RvcmUgdGhlIHN0YXRpYyBkZXBsb3ltZW50IGFzc2V0IGZpbGVzIG9mIHRoZSBOdXh0IGFwcC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVTdGF0aWNBc3NldHNCdWNrZXQoKTogQnVja2V0IHtcbiAgICAgICAgY29uc3QgYnVja2V0TmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYXNzZXRzYDtcbiAgICAgICAgY29uc3QgYnVja2V0ID0gbmV3IEJ1Y2tldCh0aGlzLCBidWNrZXROYW1lLCB7XG4gICAgICAgICAgICBibG9ja1B1YmxpY0FjY2VzczogQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgICAgICAgICAgYnVja2V0TmFtZSxcbiAgICAgICAgICAgIC8vIFRoZSBidWNrZXQgYW5kIGFsbCBvZiBpdHMgb2JqZWN0cyBjYW4gYmUgZGVsZXRlZCwgYmVjYXVzZSBhbGwgdGhlIGNvbnRlbnQgaXMgbWFuYWdlZCBpbiB0aGlzIHByb2plY3RcbiAgICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgICAgICAgICAgb2JqZWN0T3duZXJzaGlwOiBPYmplY3RPd25lcnNoaXAuQlVDS0VUX09XTkVSX0VORk9SQ0VELFxuICAgICAgICB9KTtcblxuICAgICAgICBidWNrZXQuZ3JhbnRSZWFkV3JpdGUodGhpcy5jZG5BY2Nlc3NJZGVudGl0eSk7XG5cbiAgICAgICAgcmV0dXJuIGJ1Y2tldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBidWNrZXQgdG8gc3RvcmUgdGhlIHNpdGVtYXAgYXNzZXRzIG9mIHRoZSBOdXh0IGFwcC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVTaXRlbWFwQnVja2V0KCk6IEJ1Y2tldCB7XG4gICAgICAgIGNvbnN0IGJ1Y2tldE5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXNpdGVtYXBgO1xuICAgICAgICBjb25zdCBidWNrZXQgPSBuZXcgQnVja2V0KHRoaXMsIGJ1Y2tldE5hbWUsIHtcbiAgICAgICAgICAgIGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICBhY2Nlc3NDb250cm9sOiBCdWNrZXRBY2Nlc3NDb250cm9sLlBSSVZBVEUsXG4gICAgICAgICAgICBibG9ja1B1YmxpY0FjY2VzczogQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgICAgICAgICAgZW5jcnlwdGlvbjogQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VELFxuICAgICAgICAgICAgZW5mb3JjZVNTTDogdHJ1ZSxcbiAgICAgICAgICAgIC8vIFRoZSBidWNrZXQgYW5kIGFsbCBvZiBpdHMgb2JqZWN0cyBjYW4gYmUgZGVsZXRlZCwgYmVjYXVzZSBhbGwgdGhlIGNvbnRlbnQgaXMgbWFuYWdlZCBpbiB0aGlzIHByb2plY3RcbiAgICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICBidWNrZXQuZ3JhbnRSZWFkV3JpdGUodGhpcy5jZG5BY2Nlc3NJZGVudGl0eSk7XG5cbiAgICAgICAgcmV0dXJuIGJ1Y2tldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBMYW1iZGEgZnVuY3Rpb24gdG8gcmVuZGVyIHRoZSBOdXh0IGFwcC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVBcHBMYW1iZGFGdW5jdGlvbihwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBGdW5jdGlvbiB7XG4gICAgICAgIGNvbnN0IGZ1bmNOYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hcHAtZnVuY3Rpb25gO1xuXG4gICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb24odGhpcywgZnVuY05hbWUsIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogZnVuY05hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYFJlbmRlcnMgdGhlICR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fSBOdXh0IGFwcC5gLFxuICAgICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgICAgICAgIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgICAgICAgIGhhbmRsZXI6IGAke3Byb3BzLmVudHJ5cG9pbnQgPz8gJ2luZGV4J30uaGFuZGxlcmAsXG4gICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChgJHtwcm9wcy5yb290RGlyID8/ICcuJyB9Ly5vdXRwdXQvc2VydmVyYCwge1xuICAgICAgICAgICAgICAgIGV4Y2x1ZGU6IFsnKiouc3ZnJywgJyoqLmljbycsICcqKi5wbmcnLCAnKiouanBnJywgJyoqLmpzLm1hcCddLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDEwKSxcbiAgICAgICAgICAgIG1lbW9yeVNpemU6IHByb3BzLm1lbW9yeVNpemUgPz8gMTc5MixcbiAgICAgICAgICAgIGxvZ1JldGVudGlvbjogUmV0ZW50aW9uRGF5cy5PTkVfTU9OVEgsXG4gICAgICAgICAgICBhbGxvd1B1YmxpY1N1Ym5ldDogZmFsc2UsXG4gICAgICAgICAgICB0cmFjaW5nOiBwcm9wcy5lbmFibGVUcmFjaW5nID8gVHJhY2luZy5BQ1RJVkUgOiBUcmFjaW5nLkRJU0FCTEVELFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAgICAgICBOT0RFX09QVElPTlM6ICctLWVuYWJsZS1zb3VyY2UtbWFwcycsXG4gICAgICAgICAgICAgICAgLi4uSlNPTi5wYXJzZShwcm9wcy5lbnRyeXBvaW50RW52ID8/ICd7fScpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgY2xlYW51cHMgdGhlIG91dGRhdGVkIHN0YXRpYyBhc3NldHMgb2YgdGhlIE51eHQgYXBwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUNsZWFudXBMYW1iZGFGdW5jdGlvbihwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBGdW5jdGlvbiB7XG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uTmFtZTogc3RyaW5nID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1jbGVhbnVwLWZ1bmN0aW9uYDtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25EaXJQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL2Z1bmN0aW9ucy9hc3NldHMtY2xlYW51cCcpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdDogRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24odGhpcywgZnVuY3Rpb25OYW1lLCB7XG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgQXV0by1kZWxldGVzIHRoZSBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzIGluIHRoZSAke3RoaXMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWV9IFMzIGJ1Y2tldC5gLFxuICAgICAgICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgICAgICAgIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgICAgICAgIGxheWVyczogW25ldyBMYXllclZlcnNpb24odGhpcywgYCR7ZnVuY3Rpb25OYW1lfS1sYXllcmAsIHtcbiAgICAgICAgICAgICAgICBsYXllclZlcnNpb25OYW1lOiBgJHtmdW5jdGlvbk5hbWV9LWxheWVyYCxcbiAgICAgICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChmdW5jdGlvbkRpclBhdGgsIHtcbiAgICAgICAgICAgICAgICAgICAgYXNzZXRIYXNoVHlwZTogQXNzZXRIYXNoVHlwZS5PVVRQVVQsXG4gICAgICAgICAgICAgICAgICAgIGJ1bmRsaW5nOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBbJ3NoJywgJy1jJywgJ2VjaG8gXCJEb2NrZXIgYnVpbGQgbm90IHN1cHBvcnRlZC4gUGxlYXNlIGluc3RhbGwgeWFybi5cIiddLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2U6IFJ1bnRpbWUuTk9ERUpTXzIwX1guYnVuZGxpbmdJbWFnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5QnVuZGxlKG91dHB1dERpcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjU3luYygneWFybiBpbnN0YWxsJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZDogZnVuY3Rpb25EaXJQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMuY3BTeW5jKGAke2Z1bmN0aW9uRGlyUGF0aH0vbm9kZV9tb2R1bGVzYCwgYCR7b3V0cHV0RGlyfS9ub2RlanMvbm9kZV9tb2R1bGVzYCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgY29tcGF0aWJsZVJ1bnRpbWVzOiBbUnVudGltZS5OT0RFSlNfMjBfWF0sXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGBQcm92aWRlcyB0aGUgbm9kZV9tb2R1bGVzIHJlcXVpcmVkIGZvciB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IGxhbWJkYSBmdW5jdGlvbi5gXG4gICAgICAgICAgICB9KV0sXG4gICAgICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChmdW5jdGlvbkRpclBhdGgsIHtcbiAgICAgICAgICAgICAgICBhc3NldEhhc2hUeXBlOiBBc3NldEhhc2hUeXBlLk9VVFBVVCxcbiAgICAgICAgICAgICAgICBidW5kbGluZzoge1xuICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBbJ3NoJywgJy1jJywgJ2VjaG8gXCJEb2NrZXIgYnVpbGQgbm90IHN1cHBvcnRlZC4gUGxlYXNlIGluc3RhbGwgeWFybi5cIiddLFxuICAgICAgICAgICAgICAgICAgICBpbWFnZTogUnVudGltZS5OT0RFSlNfMjBfWC5idW5kbGluZ0ltYWdlLFxuICAgICAgICAgICAgICAgICAgICBsb2NhbDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5QnVuZGxlKG91dHB1dERpcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY1N5bmMoJ3lhcm4gaW5zdGFsbCAmJiB5YXJuIGJ1aWxkJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3dkOiBmdW5jdGlvbkRpclBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMuY3BTeW5jKGAke2Z1bmN0aW9uRGlyUGF0aH0vYnVpbGQvYXBwYCwgb3V0cHV0RGlyLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgICAgICAgbWVtb3J5U2l6ZTogMTI4LFxuICAgICAgICAgICAgbG9nUmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLlRXT19XRUVLUyxcbiAgICAgICAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgICAgICAgICAgU1RBVElDX0FTU0VUU19CVUNLRVQ6IHRoaXMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgICAgT1VUREFURURfQVNTRVRTX1JFVEVOVElPTl9EQVlTOiBgJHtwcm9wcy5vdXRkYXRlZEFzc2V0c1JldGVudGlvbkRheXMgPz8gMzB9YCxcbiAgICAgICAgICAgICAgICBFTlZJUk9OTUVOVDogcHJvcHMuZW52aXJvbm1lbnQsXG4gICAgICAgICAgICAgICAgQVdTX05PREVKU19DT05ORUNUSU9OX1JFVVNFX0VOQUJMRUQ6ICcxJyxcbiAgICAgICAgICAgICAgICBOT0RFX09QVElPTlM6ICctLWVuYWJsZS1zb3VyY2UtbWFwcycsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBncmFudCBmdW5jdGlvbiBhY2Nlc3MgdG8gUzMgYnVja2V0XG4gICAgICAgIHRoaXMuc3RhdGljQXNzZXRzQnVja2V0LmdyYW50UmVhZChyZXN1bHQpO1xuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldC5ncmFudERlbGV0ZShyZXN1bHQpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgQVBJIGdhdGV3YXkgdG8gbWFrZSB0aGUgTnV4dCBhcHAgcmVuZGVyIExhbWJkYSBmdW5jdGlvbiBwdWJsaWNseSBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQXBpR2F0ZXdheShwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBIdHRwQXBpIHtcbiAgICAgICAgY29uc3QgYXBpTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYXBpYDtcbiAgICAgICAgY29uc3QgbGFtYmRhSW50ZWdyYXRpb24gPSBuZXcgSHR0cExhbWJkYUludGVncmF0aW9uKGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tbGFtYmRhLWludGVncmF0aW9uYCwgdGhpcy5hcHBMYW1iZGFGdW5jdGlvbik7XG5cbiAgICAgICAgLy8gV2Ugd2FudCB0aGUgQVBJIGdhdGV3YXkgdG8gYmUgYWNjZXNzaWJsZSBieSB0aGUgY3VzdG9tIGRvbWFpbiBuYW1lLlxuICAgICAgICAvLyBFdmVuIHRob3VnaCB3ZSBhY2Nlc3MgdGhlIGdhdGV3YXkgdmlhIENsb3VkRnJvbnQgKGZvciBhdXRvIGh0dHAgdG8gaHR0cHMgcmVkaXJlY3RzKSwgdGhpcyBpcyByZXF1aXJlZFxuICAgICAgICAvLyB0byBiZSBhYmxlIHRvIHJlZGlyZWN0IHRoZSBvcmlnaW5hbCAnSG9zdCcgaGVhZGVyIHRvIHRoZSBOdXh0IGFwcGxpY2F0aW9uLCBpZiByZXF1ZXN0ZWQuXG4gICAgICAgIGNvbnN0IGRvbWFpbk5hbWUgPSBuZXcgRG9tYWluTmFtZSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFwaS1kb21haW5gLCB7XG4gICAgICAgICAgICBkb21haW5OYW1lOiBwcm9wcy5kb21haW4sXG4gICAgICAgICAgICBjZXJ0aWZpY2F0ZTogQ2VydGlmaWNhdGUuZnJvbUNlcnRpZmljYXRlQXJuKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tcmVnaW9uYWwtY2VydGlmaWNhdGVgLCBwcm9wcy5yZWdpb25hbFRsc0NlcnRpZmljYXRlQXJuKSxcbiAgICAgICAgICAgIGVuZHBvaW50VHlwZTogRW5kcG9pbnRUeXBlLlJFR0lPTkFMLFxuICAgICAgICAgICAgc2VjdXJpdHlQb2xpY3k6IFNlY3VyaXR5UG9saWN5LlRMU18xXzJcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgYXBpR2F0ZXdheSA9IG5ldyBIdHRwQXBpKHRoaXMsIGFwaU5hbWUsIHtcbiAgICAgICAgICAgIGFwaU5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYENvbm5lY3RzIHRoZSAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0gQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gd2l0aCB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IExhbWJkYSBmdW5jdGlvbiB0byBtYWtlIGl0IHB1YmxpY2x5IGF2YWlsYWJsZS5gLFxuICAgICAgICAgICAgLy8gVGhlIGFwcCBkb2VzIG5vdCBhbGxvdyBhbnkgY3Jvc3Mtb3JpZ2luIGFjY2VzcyBieSBwdXJwb3NlOiB0aGUgYXBwIHNob3VsZCBub3QgYmUgZW1iZWRkYWJsZSBhbnl3aGVyZVxuICAgICAgICAgICAgY29yc1ByZWZsaWdodDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGVmYXVsdEludGVncmF0aW9uOiBsYW1iZGFJbnRlZ3JhdGlvbixcbiAgICAgICAgICAgIGRlZmF1bHREb21haW5NYXBwaW5nOiB7XG4gICAgICAgICAgICAgICAgZG9tYWluTmFtZTogZG9tYWluTmFtZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBhcGlHYXRld2F5LmFkZFJvdXRlcyh7XG4gICAgICAgICAgICBpbnRlZ3JhdGlvbjogbGFtYmRhSW50ZWdyYXRpb24sXG4gICAgICAgICAgICBwYXRoOiAnL3twcm94eSt9JyxcbiAgICAgICAgICAgIG1ldGhvZHM6IFtIdHRwTWV0aG9kLkdFVCwgSHR0cE1ldGhvZC5IRUFEXSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGFwaUdhdGV3YXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdGhhdCByb3V0ZXMgaW5jb21pbmcgcmVxdWVzdHMgdG8gdGhlIE51eHQgTGFtYmRhIGZ1bmN0aW9uICh2aWEgdGhlIEFQSSBnYXRld2F5KVxuICAgICAqIG9yIHRoZSBTMyBhc3NldHMgZm9sZGVyICh3aXRoIGNhY2hpbmcpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUNsb3VkRnJvbnREaXN0cmlidXRpb24ocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogRGlzdHJpYnV0aW9uIHtcbiAgICAgICAgY29uc3QgY2RuTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY2RuYDtcblxuICAgICAgICByZXR1cm4gbmV3IERpc3RyaWJ1dGlvbih0aGlzLCBjZG5OYW1lLCB7XG4gICAgICAgICAgICBkb21haW5OYW1lczogW3Byb3BzLmRvbWFpbl0sXG4gICAgICAgICAgICBjb21tZW50OiBjZG5OYW1lLFxuICAgICAgICAgICAgbWluaW11bVByb3RvY29sVmVyc2lvbjogU2VjdXJpdHlQb2xpY3lQcm90b2NvbC5UTFNfVjFfMl8yMDE4LFxuICAgICAgICAgICAgY2VydGlmaWNhdGU6IENlcnRpZmljYXRlLmZyb21DZXJ0aWZpY2F0ZUFybih0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWdsb2JhbC1jZXJ0aWZpY2F0ZWAsIHByb3BzLmdsb2JhbFRsc0NlcnRpZmljYXRlQXJuKSxcbiAgICAgICAgICAgIGh0dHBWZXJzaW9uOiBIdHRwVmVyc2lvbi5IVFRQMl9BTkRfMyxcbiAgICAgICAgICAgIGRlZmF1bHRCZWhhdmlvcjogdGhpcy5jcmVhdGVOdXh0QXBwUm91dGVCZWhhdmlvcigpLFxuICAgICAgICAgICAgYWRkaXRpb25hbEJlaGF2aW9yczogdGhpcy5zZXR1cENsb3VkRnJvbnRSb3V0aW5nKHByb3BzKSxcbiAgICAgICAgICAgIHByaWNlQ2xhc3M6IFByaWNlQ2xhc3MuUFJJQ0VfQ0xBU1NfMTAwLCAvLyBVc2Ugb25seSBOb3J0aCBBbWVyaWNhIGFuZCBFdXJvcGVcbiAgICAgICAgICAgIGxvZ0J1Y2tldDogdGhpcy5hY2Nlc3NMb2dzQnVja2V0LFxuICAgICAgICAgICAgbG9nRmlsZVByZWZpeDogcHJvcHMuZW5hYmxlQWNjZXNzTG9nc0FuYWx5c2lzID8gQ2xvdWRGcm9udEFjY2Vzc0xvZ3NBbmFseXNpcy5nZXRMb2dGaWxlUHJlZml4KCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBsb2dJbmNsdWRlc0Nvb2tpZXM6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIGJlaGF2aW9yIG9yaWdpbiB0byByb3V0ZSBpbmNvbWluZyByZXF1ZXN0cyB0byB0aGUgTnV4dCByZW5kZXIgTGFtYmRhIGZ1bmN0aW9uICh2aWEgQVBJIGdhdGV3YXkpLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlTnV4dEFwcEh0dHBPcmlnaW4oKTogSHR0cE9yaWdpbiB7XG4gICAgICAgIHJldHVybiBuZXcgSHR0cE9yaWdpbihgJHt0aGlzLmFwaUdhdGV3YXkuaHR0cEFwaUlkfS5leGVjdXRlLWFwaS4ke3RoaXMucmVnaW9ufS5hbWF6b25hd3MuY29tYCwge1xuICAgICAgICAgICAgY29ubmVjdGlvbkF0dGVtcHRzOiAyLFxuICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMiksXG4gICAgICAgICAgICByZWFkVGltZW91dDogRHVyYXRpb24uc2Vjb25kcygxMCksXG4gICAgICAgICAgICBwcm90b2NvbFBvbGljeTogT3JpZ2luUHJvdG9jb2xQb2xpY3kuSFRUUFNfT05MWSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJlaGF2aW9yIGZvciB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcm91dGUgaW5jb21pbmcgd2ViIHJlcXVlc3RzXG4gICAgICogdG8gdGhlIE51eHQgcmVuZGVyIExhbWJkYSBmdW5jdGlvbiAodmlhIEFQSSBnYXRld2F5KS5cbiAgICAgKiBBZGRpdGlvbmFsbHksIHRoaXMgYXV0b21hdGljYWxseSByZWRpcmVjdHMgSFRUUCByZXF1ZXN0cyB0byBIVFRQUy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZU51eHRBcHBSb3V0ZUJlaGF2aW9yKCk6IEJlaGF2aW9yT3B0aW9ucyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvcmlnaW46IHRoaXMuaHR0cE9yaWdpbixcbiAgICAgICAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19HRVRfSEVBRCxcbiAgICAgICAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IFZpZXdlclByb3RvY29sUG9saWN5LlJFRElSRUNUX1RPX0hUVFBTLFxuICAgICAgICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgY2FjaGVQb2xpY3k6IHRoaXMuYXBwQ2FjaGVQb2xpY3lcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwQ2xvdWRGcm9udFJvdXRpbmcocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiB7XG4gICAgICAgIGxldCByb3V0aW5nQmVoYXZpb3VyczogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiA9IHt9O1xuXG4gICAgICAgIC8vIFNwZWNpZmljIG9uZXMgZmlyc3RcbiAgICAgICAgaWYgKHByb3BzLmVuYWJsZUFwaSkge1xuICAgICAgICAgICAgcm91dGluZ0JlaGF2aW91cnMgPSB7Li4ucm91dGluZ0JlaGF2aW91cnMsIC4uLnRoaXMuY3JlYXRlQXBpUm91dGVCZWhhdmlvcigpfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcHMuZW5hYmxlU2l0ZW1hcCkge1xuICAgICAgICAgICAgcm91dGluZ0JlaGF2aW91cnMgPSB7Li4ucm91dGluZ0JlaGF2aW91cnMsIC4uLnRoaXMuY3JlYXRlU2l0ZW1hcFJvdXRlQmVoYXZpb3IoKX07XG4gICAgICAgIH1cblxuICAgICAgICByb3V0aW5nQmVoYXZpb3VycyA9IHsuLi5yb3V0aW5nQmVoYXZpb3VycywgLi4udGhpcy5jcmVhdGVTdGF0aWNBc3NldHNSb3V0ZUJlaGF2aW9yKCl9O1xuXG4gICAgICAgIHJldHVybiByb3V0aW5nQmVoYXZpb3VycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2FjaGUgcG9saWN5IGZvciB0aGUgTnV4dCBhcHAgcm91dGUgYmVoYXZpb3Igb2YgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlTnV4dEFwcENhY2hlUG9saWN5KHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IENhY2hlUG9saWN5IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYWNoZVBvbGljeSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNhY2hlLXBvbGljeWAsIHtcbiAgICAgICAgICAgIGNhY2hlUG9saWN5TmFtZTogYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1jZG4tY2FjaGUtcG9saWN5YCxcbiAgICAgICAgICAgIGNvbW1lbnQ6IGBEZWZpbmVzIHdoaWNoIHJlcXVlc3QgZGF0YSB0byBwYXNzIHRvIHRoZSAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0gb3JpZ2luIGFuZCBob3cgdGhlIGNhY2hlIGtleSBpcyBjYWxjdWxhdGVkLmAsXG4gICAgICAgICAgICBkZWZhdWx0VHRsOiBEdXJhdGlvbi5zZWNvbmRzKDApLFxuICAgICAgICAgICAgbWluVHRsOiBEdXJhdGlvbi5zZWNvbmRzKDApLFxuICAgICAgICAgICAgbWF4VHRsOiBEdXJhdGlvbi5kYXlzKDM2NSksXG4gICAgICAgICAgICBxdWVyeVN0cmluZ0JlaGF2aW9yOiBwcm9wcy5hbGxvd1F1ZXJ5UGFyYW1zPy5sZW5ndGggPyBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmFsbG93UXVlcnlQYXJhbXMpIDogKHByb3BzLmRlbnlRdWVyeVBhcmFtcz8ubGVuZ3RoID8gQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmRlbnlMaXN0KC4uLnByb3BzLmRlbnlRdWVyeVBhcmFtcykgOiBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IuYWxsKCkpLFxuICAgICAgICAgICAgaGVhZGVyQmVoYXZpb3I6IHByb3BzLmFsbG93SGVhZGVycz8ubGVuZ3RoID8gQ2FjaGVIZWFkZXJCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuYWxsb3dIZWFkZXJzKSA6IENhY2hlSGVhZGVyQmVoYXZpb3Iubm9uZSgpLFxuICAgICAgICAgICAgY29va2llQmVoYXZpb3I6IHByb3BzLmFsbG93Q29va2llcz8ubGVuZ3RoID8gQ2FjaGVDb29raWVCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuYWxsb3dDb29raWVzKSA6IENhY2hlQ29va2llQmVoYXZpb3Iubm9uZSgpLFxuICAgICAgICAgICAgZW5hYmxlQWNjZXB0RW5jb2RpbmdCcm90bGk6IHRydWUsXG4gICAgICAgICAgICBlbmFibGVBY2NlcHRFbmNvZGluZ0d6aXA6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBiZWhhdmlvciBmb3IgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRvIHJvdXRlIG1hdGNoaW5nIE51eHQgYXBwIEFQSSByZXF1ZXN0cyB0byB0aGUgQVBJIGdhdGV3YXkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVBcGlSb3V0ZUJlaGF2aW9yKCk6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4ge1xuICAgICAgICBjb25zdCBhcGlCZWhhdmlvcjogQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgICAgICAgb3JpZ2luOiB0aGlzLmh0dHBPcmlnaW4sXG4gICAgICAgICAgICBjb21wcmVzczogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19BTEwsXG4gICAgICAgICAgICBjYWNoZWRNZXRob2RzOiBDYWNoZWRNZXRob2RzLkNBQ0hFX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICAgICAgICBjYWNoZVBvbGljeTogdGhpcy5hcHBDYWNoZVBvbGljeSxcbiAgICAgICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5IVFRQU19PTkxZXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcnVsZXM6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4gPSB7fTtcbiAgICAgICAgcnVsZXNbJy9hcGkvKiddID0gYXBpQmVoYXZpb3I7XG5cbiAgICAgICAgcmV0dXJuIHJ1bGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBiZWhhdmlvciBmb3IgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRvIHJvdXRlIG1hdGNoaW5nIGluY29taW5nIHJlcXVlc3RzIGZvciB0aGUgc3RhdGljIGFzc2V0c1xuICAgICAqIHRvIHRoZSBTMyBidWNrZXQgdGhhdCBob2xkcyB0aGVzZSBzdGF0aWMgYXNzZXRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVN0YXRpY0Fzc2V0c1JvdXRlQmVoYXZpb3IoKTogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiB7XG4gICAgICAgIGNvbnN0IHN0YXRpY0Fzc2V0c0NhY2hlQ29uZmlnOiBCZWhhdmlvck9wdGlvbnMgPSB7XG4gICAgICAgICAgICBvcmlnaW46IG5ldyBTM09yaWdpbih0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldCwge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25BdHRlbXB0czogMixcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dDogRHVyYXRpb24uc2Vjb25kcygzKSxcbiAgICAgICAgICAgICAgICBvcmlnaW5BY2Nlc3NJZGVudGl0eTogdGhpcy5jZG5BY2Nlc3NJZGVudGl0eSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY29tcHJlc3M6IHRydWUsXG4gICAgICAgICAgICBhbGxvd2VkTWV0aG9kczogQWxsb3dlZE1ldGhvZHMuQUxMT1dfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgICAgICAgIGNhY2hlZE1ldGhvZHM6IENhY2hlZE1ldGhvZHMuQ0FDSEVfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgICAgICAgIGNhY2hlUG9saWN5OiBDYWNoZVBvbGljeS5DQUNISU5HX09QVElNSVpFRCxcbiAgICAgICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBydWxlczogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiA9IHt9O1xuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0Q29uZmlncy5mb3JFYWNoKGFzc2V0ID0+IHtcbiAgICAgICAgICAgIHJ1bGVzW2Ake2Fzc2V0LnRhcmdldH0ke2Fzc2V0LnBhdHRlcm59YF0gPSBzdGF0aWNBc3NldHNDYWNoZUNvbmZpZ1xuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBydWxlc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBiZWhhdmlvciBmb3IgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRvIHJvdXRlIG1hdGNoaW5nIGluY29taW5nIHJlcXVlc3RzIGZvciB0aGUgc2l0ZW1hcCBhc3NldHNcbiAgICAgKiB0byB0aGUgUzMgYnVja2V0IHRoYXQgaG9sZHMgdGhlc2Ugc2l0ZW1hcCBhc3NldHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlU2l0ZW1hcFJvdXRlQmVoYXZpb3IoKTogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiB7XG4gICAgICAgIGlmICghdGhpcy5zaXRlbWFwQnVja2V0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTaXRlbWFwIGJ1Y2tldCBtdXN0IGV4aXN0IGJlZm9yZSBjcmVhdGluZyBzaXRlbWFwIHJvdXRlIGJlaGF2aW9yLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNpdGVtYXBDYWNoZUNvbmZpZzogQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgICAgICAgb3JpZ2luOiBuZXcgUzNPcmlnaW4odGhpcy5zaXRlbWFwQnVja2V0LCB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbkF0dGVtcHRzOiAyLFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDMpLFxuICAgICAgICAgICAgICAgIG9yaWdpbkFjY2Vzc0lkZW50aXR5OiB0aGlzLmNkbkFjY2Vzc0lkZW50aXR5LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBjb21wcmVzczogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICAgICAgY2FjaGVkTWV0aG9kczogQ2FjaGVkTWV0aG9kcy5DQUNIRV9HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICAgICAgY2FjaGVQb2xpY3k6IENhY2hlUG9saWN5LkNBQ0hJTkdfT1BUSU1JWkVELFxuICAgICAgICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IFZpZXdlclByb3RvY29sUG9saWN5LlJFRElSRUNUX1RPX0hUVFBTXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcnVsZXM6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4gPSB7fTtcbiAgICAgICAgcnVsZXNbJypzaXRlbWFwLnhtbCddID0gc2l0ZW1hcENhY2hlQ29uZmlnO1xuICAgICAgICBydWxlc1snKnNpdGVtYXAtZ29uZS54bWwnXSA9IHNpdGVtYXBDYWNoZUNvbmZpZztcbiAgICAgICAgcnVsZXNbJy9zaXRlbWFwcy8qJ10gPSBzaXRlbWFwQ2FjaGVDb25maWc7XG5cbiAgICAgICAgcmV0dXJuIHJ1bGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwbG9hZHMgdGhlIHN0YXRpYyBhc3NldHMgb2YgdGhlIE51eHQgYXBwIGFzIGRlZmluZWQgaW4ge0BzZWUgZ2V0TnV4dEFwcFN0YXRpY0Fzc2V0Q29uZmlnc30gdG8gdGhlIHN0YXRpYyBhc3NldHMgUzMgYnVja2V0LlxuICAgICAqIEluIG9yZGVyIHRvIGVuYWJsZSBhIHplcm8tZG93bnRpbWUgZGVwbG95bWVudCB3aXRoIG1pbmltYWwgc3RvcmFnZSBsb2FkLFxuICAgICAqIHdlIGRlcGxveSB0aGUgc3RhdGljIGFzc2V0cyBvZiBldmVyeSBkZXBsb3ltZW50IGludG8gdGhlIHNhbWUgZm9sZGVyIGJ1dCBtYXJrIHRoZW0gd2l0aCBhIGRlcGxveW1lbnQgcmV2aXNpb24uXG4gICAgICogQnkgZG9pbmcgc28sIHRoZSBmaWxlcyBvZiBwcmV2aW91cyBkZXBsb3ltZW50cyBhcmUgcmV0YWluZWQgdG8gYWxsb3cgY2xpZW50cyB0byBjb250aW51ZSB0byB3b3JrIHdpdGggYW4gb2xkZXIgcmV2aXNpb25cbiAgICAgKiBidXQgZ2V0cyBjbGVhbmVkIHVwIGFmdGVyIGEgc3BlY2lmaWVkIHBlcmlvZCBvZiB0aW1lIHZpYSB0aGUgY2xlYW51cCBMYW1iZGEgZnVuY3Rpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBjb25maWd1cmVEZXBsb3ltZW50cygpOiBCdWNrZXREZXBsb3ltZW50W10ge1xuICAgICAgICAvLyBSZXR1cm5zIGEgZGVwbG95bWVudCBmb3IgZXZlcnkgY29uZmlndXJlZCBzdGF0aWMgYXNzZXQgdHlwZSB0byByZXNwZWN0IHRoZSBkaWZmZXJlbnQgY2FjaGUgc2V0dGluZ3NcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGljQXNzZXRDb25maWdzLmZpbHRlcihhc3NldCA9PiBmcy5leGlzdHNTeW5jKGFzc2V0LnNvdXJjZSkpLm1hcCgoYXNzZXQsIGFzc2V0SW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQnVja2V0RGVwbG95bWVudCh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFzc2V0cy1kZXBsb3ltZW50LSR7YXNzZXRJbmRleH1gLCB7XG4gICAgICAgICAgICAgICAgc291cmNlczogW1NvdXJjZS5hc3NldChhc3NldC5zb3VyY2UsIHtcbiAgICAgICAgICAgICAgICAgICAgZXhjbHVkZTogYXNzZXQuZXhjbHVkZSxcbiAgICAgICAgICAgICAgICB9KV0sXG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb25CdWNrZXQ6IHRoaXMuc3RhdGljQXNzZXRzQnVja2V0LFxuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiBhc3NldC50YXJnZXQucmVwbGFjZSgvXlxcLysvZywgJycpLCAvLyBSZW1vdmUgbGVhZGluZyBzbGFzaFxuICAgICAgICAgICAgICAgIHBydW5lOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzdG9yYWdlQ2xhc3M6IFN0b3JhZ2VDbGFzcy5TVEFOREFSRCxcbiAgICAgICAgICAgICAgICBleGNsdWRlOiBbJyonXSxcbiAgICAgICAgICAgICAgICBpbmNsdWRlOiBbYXNzZXQucGF0dGVybl0sXG4gICAgICAgICAgICAgICAgY2FjaGVDb250cm9sOiBhc3NldC5jYWNoZUNvbnRyb2wsXG4gICAgICAgICAgICAgICAgY29udGVudFR5cGU6IGFzc2V0LmNvbnRlbnRUeXBlLFxuICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbjogYXNzZXQuaW52YWxpZGF0ZU9uQ2hhbmdlID8gdGhpcy5jZG4gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uUGF0aHM6IGFzc2V0LmludmFsaWRhdGVPbkNoYW5nZSA/IFtgLyR7YXNzZXQucGF0dGVybn1gXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBsb2dSZXRlbnRpb246IFJldGVudGlvbkRheXMuT05FX0RBWSxcblxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN0b3JlIGJ1aWxkIHJldmlzaW9uIG9uIGV2ZXJ5IGFzc2V0IHRvIGFsbG93IGNsZWFudXAgb2Ygb3V0ZGF0ZWQgYXNzZXRzXG4gICAgICAgICAgICAgICAgICAgIHJldmlzaW9uOiB0aGlzLmRlcGxveW1lbnRSZXZpc2lvbixcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgLy8gU29tZSBOdXh0IGFwcGxpY2F0aW9ucyBoYXZlIGEgbG90IG9mIGFzc2V0cyB0byBkZXBsb3kgd2hlcmVieSB0aGUgZnVuY3Rpb24gbWlnaHQgcnVuIG91dCBvZiBtZW1vcnkuXG4gICAgICAgICAgICAgICAgLy8gQWRkaXRpb25hbGx5LCBhIGhpZ2ggbWVtb3J5IGxpbWl0IG1pZ2h0IHNwZWVkIHVwIGRlcGxveW1lbnRzLlxuICAgICAgICAgICAgICAgIG1lbW9yeUxpbWl0OiAxNzkyXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyB0aGUgaG9zdGVkIHpvbmUgYXQgd2hpY2ggdGhlIEROUyByZWNvcmRzIHNoYWxsIGJlIGNyZWF0ZWQgdG8gYWNjZXNzIHRoZSBOdXh0IGFwcCBvbiB0aGUgaW50ZXJuZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcHNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZmluZEhvc3RlZFpvbmUocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogSUhvc3RlZFpvbmUge1xuICAgICAgICBjb25zdCBkb21haW5QYXJ0cyA9IHByb3BzLmRvbWFpbi5zcGxpdCgnLicpO1xuXG4gICAgICAgIHJldHVybiBIb3N0ZWRab25lLmZyb21Ib3N0ZWRab25lQXR0cmlidXRlcyh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWhvc3RlZC16b25lYCwge1xuICAgICAgICAgICAgaG9zdGVkWm9uZUlkOiBwcm9wcy5ob3N0ZWRab25lSWQsXG4gICAgICAgICAgICB6b25lTmFtZTogZG9tYWluUGFydHNbZG9tYWluUGFydHMubGVuZ3RoIC0gMV0sIC8vIFN1cHBvcnQgc3ViZG9tYWluc1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBETlMgcmVjb3JkcyB0byBhY2Nlc3MgdGhlIE51eHQgYXBwIG9uIHRoZSBpbnRlcm5ldCB2aWEgdGhlIGN1c3RvbSBkb21haW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcHNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlRG5zUmVjb3Jkcyhwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaG9zdGVkWm9uZSA9IHRoaXMuZmluZEhvc3RlZFpvbmUocHJvcHMpO1xuICAgICAgICBjb25zdCBkbnNUYXJnZXQgPSBSZWNvcmRUYXJnZXQuZnJvbUFsaWFzKG5ldyBDbG91ZEZyb250VGFyZ2V0KHRoaXMuY2RuKSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgcmVjb3JkIGZvciBJUHY0XG4gICAgICAgIG5ldyBBUmVjb3JkKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0taXB2NC1yZWNvcmRgLCB7XG4gICAgICAgICAgICByZWNvcmROYW1lOiBwcm9wcy5kb21haW4sXG4gICAgICAgICAgICB6b25lOiBob3N0ZWRab25lLFxuICAgICAgICAgICAgdGFyZ2V0OiBkbnNUYXJnZXQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIHJlY29yZCBmb3IgSVB2NlxuICAgICAgICBuZXcgQWFhYVJlY29yZCh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWlwdjYtcmVjb3JkYCwge1xuICAgICAgICAgICAgcmVjb3JkTmFtZTogcHJvcHMuZG9tYWluLFxuICAgICAgICAgICAgem9uZTogaG9zdGVkWm9uZSxcbiAgICAgICAgICAgIHRhcmdldDogZG5zVGFyZ2V0LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2NoZWR1bGVkIHJ1bGUgdG8gcGluZyB0aGUgTnV4dCBhcHAgTGFtYmRhIGZ1bmN0aW9uIGV2ZXJ5IDUgbWludXRlcyBpbiBvcmRlciB0byBrZWVwIGl0IHdhcm1cbiAgICAgKiBhbmQgc3BlZWQgdXAgaW5pdGlhbCBTU1IgcmVxdWVzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQXBwUGluZ1J1bGUocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZha2VBcGlHYXRld2F5RXZlbnREYXRhID0ge1xuICAgICAgICAgICAgXCJ2ZXJzaW9uXCI6IFwiMi4wXCIsXG4gICAgICAgICAgICBcInJvdXRlS2V5XCI6IFwiR0VUIC97cHJveHkrfVwiLFxuICAgICAgICAgICAgXCJyYXdQYXRoXCI6IFwiL1wiLFxuICAgICAgICAgICAgXCJyYXdRdWVyeVN0cmluZ1wiOiBcIlwiLFxuICAgICAgICAgICAgXCJoZWFkZXJzXCI6IHt9LFxuICAgICAgICAgICAgXCJyZXF1ZXN0Q29udGV4dFwiOiB7XG4gICAgICAgICAgICAgICAgXCJkb21haW5OYW1lXCI6IHByb3BzLmRvbWFpbixcbiAgICAgICAgICAgICAgICBcImh0dHBcIjoge1xuICAgICAgICAgICAgICAgICAgICBcIm1ldGhvZFwiOiBcIkdFVFwiLFxuICAgICAgICAgICAgICAgICAgICBcInBhdGhcIjogXCIvXCIsXG4gICAgICAgICAgICAgICAgICAgIFwicHJvdG9jb2xcIjogXCJIVFRQLzEuMVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIG5ldyBSdWxlKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tcGluZ2VyLXJ1bGVgLCB7XG4gICAgICAgICAgICBydWxlTmFtZTogYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1waW5nZXJgLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBQaW5ncyB0aGUgTGFtYmRhIGZ1bmN0aW9uIG9mIHRoZSAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0gYXBwIGV2ZXJ5IDUgbWludXRlcyB0byBrZWVwIGl0IHdhcm0uYCxcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICBzY2hlZHVsZTogU2NoZWR1bGUucmF0ZShEdXJhdGlvbi5taW51dGVzKDUpKSxcbiAgICAgICAgICAgIHRhcmdldHM6IFtuZXcgTGFtYmRhRnVuY3Rpb24odGhpcy5hcHBMYW1iZGFGdW5jdGlvbiwge1xuICAgICAgICAgICAgICAgIGV2ZW50OiBSdWxlVGFyZ2V0SW5wdXQuZnJvbU9iamVjdChmYWtlQXBpR2F0ZXdheUV2ZW50RGF0YSlcbiAgICAgICAgICAgIH0pXSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2NoZWR1bGVkIHJ1bGUgdGhhdCBydW5zIGV2ZXJ5IHR1ZXNkYXkgYXQgMDM6MzAgQU0gR01UIHRvIHRyaWdnZXJcbiAgICAgKiBvdXIgY2xlYW51cCBMYW1iZGEgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQ2xlYW51cFRyaWdnZXJSdWxlKCk6IHZvaWQge1xuICAgICAgICBuZXcgUnVsZSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXNjaGVkdWxlci1ydWxlYCwge1xuICAgICAgICAgICAgcnVsZU5hbWU6IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tc2NoZWR1bGVyYCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgVHJpZ2dlcnMgYSBjbGVhbnVwIG9mIHRoZSBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzIGF0IHRoZSAke3RoaXMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWV9IFMzIGJ1Y2tldC5gLFxuICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIHNjaGVkdWxlOiBTY2hlZHVsZS5jcm9uKHt3ZWVrRGF5OiAnMycsIGhvdXI6ICczJywgbWludXRlOiAnMzAnfSksXG4gICAgICAgICAgICB0YXJnZXRzOiBbbmV3IExhbWJkYUZ1bmN0aW9uKHRoaXMuY2xlYW51cExhbWJkYUZ1bmN0aW9uKV0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBTMyBidWNrZXQgdG8gc3RvcmUgdGhlIGFjY2VzcyBsb2dzIG9mIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUFjY2Vzc0xvZ3NCdWNrZXQoKTogQnVja2V0IHtcbiAgICAgICAgY29uc3QgYnVja2V0TmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYWNjZXNzLWxvZ3NgO1xuICAgICAgICBjb25zdCBidWNrZXQgPSBuZXcgQnVja2V0KHRoaXMsIGJ1Y2tldE5hbWUsIHtcbiAgICAgICAgICAgIGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICBibG9ja1B1YmxpY0FjY2VzczogQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgICAgICAgICAgb2JqZWN0T3duZXJzaGlwOiBPYmplY3RPd25lcnNoaXAuQlVDS0VUX09XTkVSX1BSRUZFUlJFRCxcbiAgICAgICAgICAgIC8vIFdoZW4gdGhlIHN0YWNrIGlzIGRlc3Ryb3llZCwgd2UgZXhwZWN0IGV2ZXJ5dGhpbmcgdG8gYmUgZGVsZXRlZFxuICAgICAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJ1Y2tldC5ncmFudFJlYWRXcml0ZSh0aGlzLmNkbkFjY2Vzc0lkZW50aXR5KTtcblxuICAgICAgICByZXR1cm4gYnVja2V0O1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlQWNjZXNzTG9nc0FuYWx5c2lzKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IENsb3VkRnJvbnRBY2Nlc3NMb2dzQW5hbHlzaXMge1xuICAgICAgICBpZiAoIXRoaXMuYWNjZXNzTG9nc0J1Y2tldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY2Nlc3MgYnVja2V0IG5vdCBzZXQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENsb3VkRnJvbnRBY2Nlc3NMb2dzQW5hbHlzaXModGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hY2Nlc3MtbG9ncy1hbmFseXNpc2AsIHtcbiAgICAgICAgICAgIGJ1Y2tldDogdGhpcy5hY2Nlc3NMb2dzQnVja2V0LFxuICAgICAgICAgICAgcmVzb3VyY2VQcmVmaXg6IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYWNjZXNzLWxvZ3NgLFxuICAgICAgICAgICAgYWNjZXNzTG9nQ29va2llczogcHJvcHMuYWNjZXNzTG9nQ29va2llcyxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
|
|
@@ -269,6 +269,7 @@ export class NuxtServerAppStack extends Stack {
|
|
|
269
269
|
*/
|
|
270
270
|
private createCleanupLambdaFunction(props: NuxtServerAppStackProps): Function {
|
|
271
271
|
const functionName: string = `${this.resourceIdPrefix}-cleanup-function`;
|
|
272
|
+
const functionDirPath = path.join(__dirname, '../../functions/assets-cleanup');
|
|
272
273
|
|
|
273
274
|
const result: Function = new Function(this, functionName, {
|
|
274
275
|
functionName: functionName,
|
|
@@ -277,20 +278,22 @@ export class NuxtServerAppStack extends Stack {
|
|
|
277
278
|
architecture: Architecture.ARM_64,
|
|
278
279
|
layers: [new LayerVersion(this, `${functionName}-layer`, {
|
|
279
280
|
layerVersionName: `${functionName}-layer`,
|
|
280
|
-
code: Code.fromAsset(
|
|
281
|
+
code: Code.fromAsset(functionDirPath, {
|
|
281
282
|
assetHashType: AssetHashType.OUTPUT,
|
|
282
283
|
bundling: {
|
|
284
|
+
command: ['sh', '-c', 'echo "Docker build not supported. Please install yarn."'],
|
|
283
285
|
image: Runtime.NODEJS_20_X.bundlingImage,
|
|
284
286
|
local: {
|
|
285
287
|
tryBundle(outputDir: string): boolean {
|
|
286
288
|
try {
|
|
287
|
-
execSync('
|
|
289
|
+
execSync('yarn install', {
|
|
290
|
+
cwd: functionDirPath
|
|
291
|
+
});
|
|
288
292
|
} catch {
|
|
289
293
|
return false;
|
|
290
294
|
}
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
recursive: true
|
|
295
|
+
fs.cpSync(`${functionDirPath}/node_modules`, `${outputDir}/nodejs/node_modules`, {
|
|
296
|
+
recursive: true,
|
|
294
297
|
});
|
|
295
298
|
return true
|
|
296
299
|
},
|
|
@@ -301,19 +304,21 @@ export class NuxtServerAppStack extends Stack {
|
|
|
301
304
|
description: `Provides the node_modules required for the ${this.resourceIdPrefix} lambda function.`
|
|
302
305
|
})],
|
|
303
306
|
handler: 'index.handler',
|
|
304
|
-
code: Code.fromAsset(
|
|
307
|
+
code: Code.fromAsset(functionDirPath, {
|
|
305
308
|
assetHashType: AssetHashType.OUTPUT,
|
|
306
309
|
bundling: {
|
|
310
|
+
command: ['sh', '-c', 'echo "Docker build not supported. Please install yarn."'],
|
|
307
311
|
image: Runtime.NODEJS_20_X.bundlingImage,
|
|
308
312
|
local: {
|
|
309
313
|
tryBundle(outputDir: string): boolean {
|
|
310
314
|
try {
|
|
311
|
-
execSync('
|
|
315
|
+
execSync('yarn install && yarn build', {
|
|
316
|
+
cwd: functionDirPath
|
|
317
|
+
});
|
|
312
318
|
} catch {
|
|
313
319
|
return false;
|
|
314
320
|
}
|
|
315
|
-
|
|
316
|
-
fs.cpSync(path.join(__dirname, '../../functions/assets-cleanup/build/app'), outputDir, {
|
|
321
|
+
fs.cpSync(`${functionDirPath}/build/app`, outputDir, {
|
|
317
322
|
recursive: true
|
|
318
323
|
});
|
|
319
324
|
return true
|