@mavogel/cdk-vscode-server 0.0.16 → 0.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +62 -30
- package/.prettierrc +0 -0
- package/API.md +39 -7
- package/CONTRIBUTING.md +3 -1
- package/assets/installer/installer.lambda/index.js +28 -9
- package/integ-tests/integ.al2023.ts +4 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/installer/installer.d.ts +1 -1
- package/lib/installer/installer.js +220 -230
- package/lib/installer/installer.lambda.d.ts +2 -2
- package/lib/installer/installer.lambda.js +16 -16
- package/lib/mappings.d.ts +1 -1
- package/lib/mappings.js +25 -7
- package/lib/prefixlist-retriever/prefixlist-retriever.d.ts +2 -2
- package/lib/prefixlist-retriever/prefixlist-retriever.js +17 -16
- package/lib/secret-retriever/secret-retriever.d.ts +2 -2
- package/lib/secret-retriever/secret-retriever.js +30 -24
- package/lib/secret-retriever/secret-retriever.lambda.d.ts +1 -1
- package/lib/secret-retriever/secret-retriever.lambda.js +6 -6
- package/lib/suppress-nags.d.ts +1 -1
- package/lib/suppress-nags.js +3 -3
- package/lib/vscode-server.d.ts +38 -3
- package/lib/vscode-server.js +190 -150
- package/mavogelcdkvscodeserver/LinuxArchitectureType.go +2 -0
- package/mavogelcdkvscodeserver/LinuxFlavorType.go +3 -0
- package/mavogelcdkvscodeserver/VSCodeServer.go +3 -0
- package/mavogelcdkvscodeserver/VSCodeServerProps.go +1 -0
- package/mavogelcdkvscodeserver/jsii/jsii.go +2 -2
- package/mavogelcdkvscodeserver/version +1 -1
- package/package.json +6 -2
|
@@ -8,15 +8,14 @@ const custom_resources_1 = require("aws-cdk-lib/custom-resources");
|
|
|
8
8
|
const cdk_nag_1 = require("cdk-nag");
|
|
9
9
|
const installer_function_1 = require("./installer-function");
|
|
10
10
|
const vscode_server_1 = require("../vscode-server");
|
|
11
|
-
;
|
|
12
11
|
class Installer {
|
|
13
12
|
static ubuntu(options) {
|
|
14
13
|
return new (class extends Installer {
|
|
15
14
|
_bind(scope) {
|
|
16
15
|
let documentName;
|
|
17
|
-
const devServerBasePath = options.devServerBasePath ??
|
|
16
|
+
const devServerBasePath = options.devServerBasePath ?? "app";
|
|
18
17
|
const devServerPort = options.devServerPort ?? 8081;
|
|
19
|
-
if (options.documentName && options.documentName !=
|
|
18
|
+
if (options.documentName && options.documentName != "") {
|
|
20
19
|
documentName = options.documentName;
|
|
21
20
|
}
|
|
22
21
|
else {
|
|
@@ -40,9 +39,9 @@ class Installer {
|
|
|
40
39
|
return new (class extends Installer {
|
|
41
40
|
_bind(scope) {
|
|
42
41
|
let documentName;
|
|
43
|
-
const devServerBasePath = options.devServerBasePath ??
|
|
42
|
+
const devServerBasePath = options.devServerBasePath ?? "app";
|
|
44
43
|
const devServerPort = options.devServerPort ?? 8081;
|
|
45
|
-
if (options.documentName && options.documentName !=
|
|
44
|
+
if (options.documentName && options.documentName != "") {
|
|
46
45
|
documentName = options.documentName;
|
|
47
46
|
}
|
|
48
47
|
else {
|
|
@@ -72,92 +71,85 @@ class Installer {
|
|
|
72
71
|
case vscode_server_1.LinuxFlavorType.UBUNTU_22:
|
|
73
72
|
case vscode_server_1.LinuxFlavorType.UBUNTU_24:
|
|
74
73
|
// Create an SSM document with multiple actions to install the software
|
|
75
|
-
ssmDocument = new ssm.CfnDocument(scope,
|
|
74
|
+
ssmDocument = new ssm.CfnDocument(scope, "ssm-document-ubuntu", {
|
|
76
75
|
name: `vscode-server-ubuntu-${core_1.Stack.of(scope).stackName}`,
|
|
77
|
-
documentType:
|
|
76
|
+
documentType: "Command",
|
|
78
77
|
content: {
|
|
79
|
-
schemaVersion:
|
|
80
|
-
description:
|
|
78
|
+
schemaVersion: "2.2",
|
|
79
|
+
description: "Bootstrap VSCode code-server instance",
|
|
81
80
|
parameters: {
|
|
82
81
|
VSCodePassword: {
|
|
83
|
-
type:
|
|
82
|
+
type: "String",
|
|
84
83
|
default: core_1.Stack.of(scope).stackId,
|
|
85
84
|
},
|
|
86
85
|
NodeVersion: {
|
|
87
|
-
type:
|
|
88
|
-
default:
|
|
89
|
-
allowedValues: [
|
|
90
|
-
'22',
|
|
91
|
-
'20',
|
|
92
|
-
'18',
|
|
93
|
-
],
|
|
86
|
+
type: "String",
|
|
87
|
+
default: "20",
|
|
88
|
+
allowedValues: ["22", "20", "18"],
|
|
94
89
|
},
|
|
95
90
|
DotNetVersion: {
|
|
96
|
-
type:
|
|
97
|
-
default:
|
|
98
|
-
allowedValues: [
|
|
99
|
-
'8.0',
|
|
100
|
-
'7.0',
|
|
101
|
-
],
|
|
91
|
+
type: "String",
|
|
92
|
+
default: "8.0",
|
|
93
|
+
allowedValues: ["8.0", "7.0"],
|
|
102
94
|
},
|
|
103
95
|
},
|
|
104
96
|
// all mainSteps scripts are in in /var/lib/amazon/ssm/<instanceid>/document/orchestration/<uuid>/<StepName>/_script.sh
|
|
105
97
|
mainSteps: [
|
|
106
98
|
{
|
|
107
|
-
action:
|
|
108
|
-
name:
|
|
99
|
+
action: "aws:configurePackage",
|
|
100
|
+
name: "InstallCloudWatchAgent",
|
|
109
101
|
inputs: {
|
|
110
|
-
name:
|
|
111
|
-
action:
|
|
102
|
+
name: "AmazonCloudWatchAgent",
|
|
103
|
+
action: "Install",
|
|
112
104
|
},
|
|
113
105
|
},
|
|
114
106
|
{
|
|
115
|
-
action:
|
|
116
|
-
name:
|
|
107
|
+
action: "aws:runDocument",
|
|
108
|
+
name: "ConfigureCloudWatchAgent",
|
|
117
109
|
inputs: {
|
|
118
|
-
documentType:
|
|
119
|
-
documentPath:
|
|
110
|
+
documentType: "SSMDocument",
|
|
111
|
+
documentPath: "AmazonCloudWatch-ManageAgent",
|
|
120
112
|
documentParameters: {
|
|
121
|
-
action:
|
|
122
|
-
mode:
|
|
123
|
-
optionalConfigurationSource:
|
|
124
|
-
optionalRestart:
|
|
113
|
+
action: "configure",
|
|
114
|
+
mode: "ec2",
|
|
115
|
+
optionalConfigurationSource: "default",
|
|
116
|
+
optionalRestart: "yes",
|
|
125
117
|
},
|
|
126
118
|
},
|
|
127
119
|
},
|
|
128
120
|
{
|
|
129
|
-
action:
|
|
130
|
-
name:
|
|
121
|
+
action: "aws:runShellScript",
|
|
122
|
+
name: "InstallAptPackagesApt",
|
|
131
123
|
inputs: {
|
|
132
124
|
runCommand: [
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
125
|
+
"#!/bin/bash",
|
|
126
|
+
"apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q apt-utils",
|
|
127
|
+
"apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q needrestart unattended-upgrades",
|
|
128
|
+
"sed -i 's/#$nrconf{kernelhints} = -1;/$nrconf{kernelhints} = 0;/' /etc/needrestart/needrestart.conf",
|
|
129
|
+
"sed -i 's/#$nrconf{verbosity} = 2;/$nrconf{verbosity} = 0;/' /etc/needrestart/needrestart.conf",
|
|
130
|
+
"sed -i \"s/#\$nrconf{restart} = 'i';/\$nrconf{restart} = 'a';/\" /etc/needrestart/needrestart.conf",
|
|
139
131
|
'echo "Apt helper packages added. Checking configuration"',
|
|
140
|
-
|
|
132
|
+
"cat /etc/needrestart/needrestart.conf",
|
|
141
133
|
],
|
|
142
134
|
},
|
|
143
135
|
},
|
|
144
136
|
{
|
|
145
|
-
action:
|
|
146
|
-
name:
|
|
137
|
+
action: "aws:runShellScript",
|
|
138
|
+
name: "InstallBasePackagesApt",
|
|
147
139
|
inputs: {
|
|
148
140
|
runCommand: [
|
|
149
|
-
|
|
150
|
-
|
|
141
|
+
"#!/bin/bash",
|
|
142
|
+
"apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q curl gnupg whois argon2 openssl locales locales-all unzip apt-transport-https ca-certificates software-properties-common nginx",
|
|
151
143
|
],
|
|
152
144
|
},
|
|
153
145
|
},
|
|
154
146
|
{
|
|
155
|
-
action:
|
|
156
|
-
name:
|
|
147
|
+
action: "aws:runShellScript",
|
|
148
|
+
name: "AddUserApt",
|
|
157
149
|
inputs: {
|
|
158
150
|
runCommand: [
|
|
159
|
-
|
|
160
|
-
|
|
151
|
+
"#!/bin/bash",
|
|
152
|
+
"echo 'Adding user: ${VSCodeUser}'",
|
|
161
153
|
`adduser --disabled-password --gecos '' ${vsCodeUser}`,
|
|
162
154
|
`echo "${vsCodeUser}:{{ VSCodePassword }}" | chpasswd`,
|
|
163
155
|
`usermod -aG sudo ${vsCodeUser}`,
|
|
@@ -171,97 +163,97 @@ EOF`,
|
|
|
171
163
|
},
|
|
172
164
|
},
|
|
173
165
|
{
|
|
174
|
-
action:
|
|
175
|
-
name:
|
|
166
|
+
action: "aws:runShellScript",
|
|
167
|
+
name: "InstallNodeApt",
|
|
176
168
|
inputs: {
|
|
177
169
|
runCommand: [
|
|
178
|
-
|
|
179
|
-
|
|
170
|
+
"#!/bin/bash",
|
|
171
|
+
"curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /usr/share/keyrings/nodesource.gpg",
|
|
180
172
|
'echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_{{ NodeVersion }}.x nodistro main" > /etc/apt/sources.list.d/nodesource.list',
|
|
181
|
-
|
|
182
|
-
|
|
173
|
+
"apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q nodejs",
|
|
174
|
+
"npm install -g npm@latest",
|
|
183
175
|
'echo "Node and npm installed. Checking configuration"',
|
|
184
|
-
|
|
185
|
-
|
|
176
|
+
"node -v",
|
|
177
|
+
"npm -v",
|
|
186
178
|
],
|
|
187
179
|
},
|
|
188
180
|
},
|
|
189
181
|
{
|
|
190
|
-
action:
|
|
191
|
-
name:
|
|
182
|
+
action: "aws:runShellScript",
|
|
183
|
+
name: "InstallDockerApt",
|
|
192
184
|
inputs: {
|
|
193
185
|
runCommand: [
|
|
194
|
-
|
|
195
|
-
|
|
186
|
+
"#!/bin/bash",
|
|
187
|
+
"curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg",
|
|
196
188
|
'echo "deb [signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release --codename --short) stable" > /etc/apt/sources.list.d/docker.list',
|
|
197
|
-
|
|
189
|
+
"apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q docker-ce docker-ce-cli containerd.io",
|
|
198
190
|
`systemctl restart code-server@${vsCodeUser}.service`,
|
|
199
|
-
|
|
191
|
+
"systemctl start docker.service",
|
|
200
192
|
'echo "Docker installed. Checking configuration"',
|
|
201
|
-
|
|
202
|
-
|
|
193
|
+
"docker --version",
|
|
194
|
+
"systemctl status docker.service",
|
|
203
195
|
],
|
|
204
196
|
},
|
|
205
197
|
},
|
|
206
198
|
{
|
|
207
|
-
action:
|
|
208
|
-
name:
|
|
199
|
+
action: "aws:runShellScript",
|
|
200
|
+
name: "InstallGitApt",
|
|
209
201
|
inputs: {
|
|
210
202
|
runCommand: [
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
203
|
+
"#!/bin/bash",
|
|
204
|
+
"add-apt-repository ppa:git-core/ppa",
|
|
205
|
+
"apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q git",
|
|
214
206
|
`sudo -u ${vsCodeUser} git config --global user.email "${vsCodeUser}@example.com"`,
|
|
215
207
|
`sudo -u ${vsCodeUser} git config --global user.name "Workshop ${vsCodeUser}"`,
|
|
216
208
|
`sudo -u ${vsCodeUser} git config --global init.defaultBranch "main"`,
|
|
217
209
|
'echo "Git installed. Checking configuration"',
|
|
218
|
-
|
|
210
|
+
"git --version",
|
|
219
211
|
],
|
|
220
212
|
},
|
|
221
213
|
},
|
|
222
214
|
{
|
|
223
|
-
action:
|
|
224
|
-
name:
|
|
215
|
+
action: "aws:runShellScript",
|
|
216
|
+
name: "InstallPythonApt",
|
|
225
217
|
inputs: {
|
|
226
218
|
runCommand: [
|
|
227
219
|
// Ubuntu 22 default is Python 3.10
|
|
228
220
|
// Ubuntu 24 default is Python 3.12
|
|
229
221
|
// The default installed Python version will map to Python3
|
|
230
|
-
|
|
231
|
-
|
|
222
|
+
"#!/bin/bash",
|
|
223
|
+
"apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q python3-pip python3-venv python3-boto3 python3-pytest",
|
|
232
224
|
`echo 'alias pytest=pytest-3' >> /home/${vsCodeUser}/.bashrc`,
|
|
233
225
|
`systemctl restart code-server@${vsCodeUser}.service`,
|
|
234
|
-
|
|
235
|
-
|
|
226
|
+
"systemctl start multipathd.service packagekit.service",
|
|
227
|
+
"systemctl restart unattended-upgrades.service",
|
|
236
228
|
'echo "Python and Pip installed. Checking configuration"',
|
|
237
|
-
|
|
238
|
-
|
|
229
|
+
"python3 --version",
|
|
230
|
+
"pip3 --version",
|
|
239
231
|
],
|
|
240
232
|
},
|
|
241
233
|
},
|
|
242
234
|
{
|
|
243
|
-
action:
|
|
244
|
-
name:
|
|
235
|
+
action: "aws:runShellScript",
|
|
236
|
+
name: "InstallAWSCLI",
|
|
245
237
|
inputs: {
|
|
246
238
|
runCommand: [
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
239
|
+
"#!/bin/bash",
|
|
240
|
+
"curl -fsSL https://awscli.amazonaws.com/awscli-exe-linux-$(uname -m).zip -o /tmp/aws-cli.zip",
|
|
241
|
+
"unzip -q -d /tmp /tmp/aws-cli.zip",
|
|
242
|
+
"sudo /tmp/aws/install",
|
|
243
|
+
"rm -rf /tmp/aws",
|
|
252
244
|
'echo "AWS CLI installed. Checking configuration"',
|
|
253
|
-
|
|
245
|
+
"aws --version",
|
|
254
246
|
],
|
|
255
247
|
},
|
|
256
248
|
},
|
|
257
249
|
{
|
|
258
|
-
action:
|
|
259
|
-
name:
|
|
250
|
+
action: "aws:runShellScript",
|
|
251
|
+
name: "ConfigureCodeServer",
|
|
260
252
|
inputs: {
|
|
261
253
|
runCommand: [
|
|
262
|
-
|
|
254
|
+
"#!/bin/bash",
|
|
263
255
|
`export HOME=/home/${vsCodeUser}`,
|
|
264
|
-
|
|
256
|
+
"curl -fsSL https://code-server.dev/install.sh | bash -s -- 2>&1",
|
|
265
257
|
`systemctl enable --now code-server@${vsCodeUser} 2>&1`,
|
|
266
258
|
`tee /etc/nginx/conf.d/code-server.conf <<EOF
|
|
267
259
|
server {
|
|
@@ -313,7 +305,7 @@ EOF`,
|
|
|
313
305
|
EOF`,
|
|
314
306
|
`chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
|
|
315
307
|
`systemctl restart code-server@${vsCodeUser}`,
|
|
316
|
-
|
|
308
|
+
"systemctl restart nginx",
|
|
317
309
|
`sudo -u ${vsCodeUser} --login code-server --install-extension AmazonWebServices.aws-toolkit-vscode --force`,
|
|
318
310
|
`sudo -u ${vsCodeUser} --login code-server --install-extension AmazonWebServices.amazon-q-vscode --force`,
|
|
319
311
|
`sudo -u ${vsCodeUser} --login code-server --install-extension synedra.auto-run-command --force`,
|
|
@@ -321,22 +313,22 @@ EOF`,
|
|
|
321
313
|
`sudo -u ${vsCodeUser} --login code-server --install-extension ms-vscode.live-server --force`,
|
|
322
314
|
`chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
|
|
323
315
|
'echo "Nginx installed. Checking configuration"',
|
|
324
|
-
|
|
325
|
-
|
|
316
|
+
"nginx -t 2>&1",
|
|
317
|
+
"systemctl status nginx",
|
|
326
318
|
'echo "CodeServer installed. Checking configuration"',
|
|
327
|
-
|
|
319
|
+
"code-server -v",
|
|
328
320
|
`systemctl status code-server@${vsCodeUser}`,
|
|
329
321
|
],
|
|
330
322
|
},
|
|
331
323
|
},
|
|
332
324
|
{
|
|
333
|
-
action:
|
|
334
|
-
name:
|
|
325
|
+
action: "aws:runShellScript",
|
|
326
|
+
name: "UpdateProfile",
|
|
335
327
|
inputs: {
|
|
336
328
|
runCommand: [
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
329
|
+
"#!/bin/bash",
|
|
330
|
+
"echo LANG=en_US.utf-8 >> /etc/environment",
|
|
331
|
+
"echo LC_ALL=en_US.UTF-8 >> /etc/environment",
|
|
340
332
|
`echo 'PATH=$PATH:/home/${vsCodeUser}/.local/bin' >> /home/${vsCodeUser}/.bashrc`,
|
|
341
333
|
`echo 'export PATH' >> /home/${vsCodeUser}/.bashrc`,
|
|
342
334
|
`echo 'export AWS_REGION=${core_1.Stack.of(scope).region}' >> /home/${vsCodeUser}/.bashrc`,
|
|
@@ -348,14 +340,14 @@ EOF`,
|
|
|
348
340
|
},
|
|
349
341
|
},
|
|
350
342
|
{
|
|
351
|
-
action:
|
|
352
|
-
name:
|
|
343
|
+
action: "aws:runShellScript",
|
|
344
|
+
name: "InstallCDK",
|
|
353
345
|
inputs: {
|
|
354
346
|
runCommand: [
|
|
355
|
-
|
|
356
|
-
|
|
347
|
+
"#!/bin/bash",
|
|
348
|
+
"npm install -g aws-cdk",
|
|
357
349
|
'echo "AWS CDK installed. Checking configuration"',
|
|
358
|
-
|
|
350
|
+
"cdk --version",
|
|
359
351
|
],
|
|
360
352
|
},
|
|
361
353
|
},
|
|
@@ -364,75 +356,68 @@ EOF`,
|
|
|
364
356
|
});
|
|
365
357
|
break;
|
|
366
358
|
case vscode_server_1.LinuxFlavorType.AMAZON_LINUX_2023:
|
|
367
|
-
ssmDocument = new ssm.CfnDocument(scope,
|
|
359
|
+
ssmDocument = new ssm.CfnDocument(scope, "ssm-document-al2023", {
|
|
368
360
|
name: `vscode-server-al2023-${core_1.Stack.of(scope).stackName}`,
|
|
369
|
-
documentType:
|
|
361
|
+
documentType: "Command",
|
|
370
362
|
content: {
|
|
371
|
-
schemaVersion:
|
|
372
|
-
description:
|
|
363
|
+
schemaVersion: "2.2",
|
|
364
|
+
description: "Bootstrap VSCode code-server instance",
|
|
373
365
|
parameters: {
|
|
374
366
|
VSCodePassword: {
|
|
375
|
-
type:
|
|
367
|
+
type: "String",
|
|
376
368
|
default: core_1.Stack.of(scope).stackId,
|
|
377
369
|
},
|
|
378
370
|
NodeVersion: {
|
|
379
|
-
type:
|
|
380
|
-
default:
|
|
381
|
-
allowedValues: [
|
|
382
|
-
'22',
|
|
383
|
-
'20',
|
|
384
|
-
'18',
|
|
385
|
-
],
|
|
371
|
+
type: "String",
|
|
372
|
+
default: "20",
|
|
373
|
+
allowedValues: ["22", "20", "18"],
|
|
386
374
|
},
|
|
387
375
|
DotNetVersion: {
|
|
388
|
-
type:
|
|
389
|
-
default:
|
|
390
|
-
allowedValues: [
|
|
391
|
-
'8.0',
|
|
392
|
-
'7.0',
|
|
393
|
-
],
|
|
376
|
+
type: "String",
|
|
377
|
+
default: "8.0",
|
|
378
|
+
allowedValues: ["8.0", "7.0"],
|
|
394
379
|
},
|
|
395
380
|
},
|
|
396
381
|
// all mainSteps scripts are in in /var/lib/amazon/ssm/<instanceid>/document/orchestration/<uuid>/<StepName>/_script.sh
|
|
397
382
|
mainSteps: [
|
|
398
383
|
{
|
|
399
|
-
action:
|
|
400
|
-
name:
|
|
384
|
+
action: "aws:configurePackage",
|
|
385
|
+
name: "InstallCloudWatchAgent",
|
|
401
386
|
inputs: {
|
|
402
|
-
name:
|
|
403
|
-
action:
|
|
387
|
+
name: "AmazonCloudWatchAgent",
|
|
388
|
+
action: "Install",
|
|
404
389
|
},
|
|
405
390
|
},
|
|
406
391
|
{
|
|
407
|
-
action:
|
|
408
|
-
name:
|
|
392
|
+
action: "aws:runDocument",
|
|
393
|
+
name: "ConfigureCloudWatchAgent",
|
|
409
394
|
inputs: {
|
|
410
|
-
documentType:
|
|
411
|
-
documentPath:
|
|
395
|
+
documentType: "SSMDocument",
|
|
396
|
+
documentPath: "AmazonCloudWatch-ManageAgent",
|
|
412
397
|
documentParameters: {
|
|
413
|
-
action:
|
|
414
|
-
mode:
|
|
415
|
-
optionalConfigurationSource:
|
|
416
|
-
optionalRestart:
|
|
398
|
+
action: "configure",
|
|
399
|
+
mode: "ec2",
|
|
400
|
+
optionalConfigurationSource: "default",
|
|
401
|
+
optionalRestart: "yes",
|
|
417
402
|
},
|
|
418
403
|
},
|
|
419
404
|
},
|
|
420
405
|
{
|
|
421
|
-
action:
|
|
422
|
-
name:
|
|
406
|
+
action: "aws:runShellScript",
|
|
407
|
+
name: "InstallBasePackagesDnf",
|
|
423
408
|
inputs: {
|
|
424
409
|
runCommand: [
|
|
425
|
-
|
|
426
|
-
|
|
410
|
+
"#!/bin/bash",
|
|
411
|
+
"dnf install -y --allowerasing whois argon2 unzip nginx curl gnupg openssl",
|
|
427
412
|
],
|
|
428
413
|
},
|
|
429
414
|
},
|
|
430
415
|
{
|
|
431
|
-
action:
|
|
432
|
-
name:
|
|
416
|
+
action: "aws:runShellScript",
|
|
417
|
+
name: "AddUserDnf",
|
|
433
418
|
inputs: {
|
|
434
419
|
runCommand: [
|
|
435
|
-
|
|
420
|
+
"#!/bin/bash",
|
|
436
421
|
`echo 'Adding user: ${vsCodeUser}'`,
|
|
437
422
|
`adduser -c '' ${vsCodeUser}`,
|
|
438
423
|
`passwd -l ${vsCodeUser}`,
|
|
@@ -444,97 +429,97 @@ EOF`,
|
|
|
444
429
|
},
|
|
445
430
|
},
|
|
446
431
|
{
|
|
447
|
-
action:
|
|
448
|
-
name:
|
|
432
|
+
action: "aws:runShellScript",
|
|
433
|
+
name: "InstallNodeDnf",
|
|
449
434
|
inputs: {
|
|
450
435
|
runCommand: [
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
436
|
+
"#!/bin/bash",
|
|
437
|
+
"dnf install -y nodejs20 npm",
|
|
438
|
+
"ln -s -f /usr/bin/node-20 /usr/bin/node",
|
|
439
|
+
"npm install -g npm@latest",
|
|
455
440
|
'echo "Node and npm installed. Checking configuration"',
|
|
456
|
-
|
|
457
|
-
|
|
441
|
+
"node -v",
|
|
442
|
+
"npm -v",
|
|
458
443
|
],
|
|
459
444
|
},
|
|
460
445
|
},
|
|
461
446
|
{
|
|
462
|
-
action:
|
|
463
|
-
name:
|
|
447
|
+
action: "aws:runShellScript",
|
|
448
|
+
name: "InstallDockerDnf",
|
|
464
449
|
inputs: {
|
|
465
450
|
runCommand: [
|
|
466
|
-
|
|
467
|
-
|
|
451
|
+
"#!/bin/bash",
|
|
452
|
+
"dnf install -y docker",
|
|
468
453
|
`usermod -aG docker ${vsCodeUser}`,
|
|
469
454
|
`systemctl restart code-server@${vsCodeUser}.service`,
|
|
470
|
-
|
|
455
|
+
"systemctl start docker.service",
|
|
471
456
|
'echo "Docker installed. Checking configuration"',
|
|
472
|
-
|
|
473
|
-
|
|
457
|
+
"docker --version",
|
|
458
|
+
"systemctl status docker.service",
|
|
474
459
|
],
|
|
475
460
|
},
|
|
476
461
|
},
|
|
477
462
|
{
|
|
478
|
-
action:
|
|
479
|
-
name:
|
|
463
|
+
action: "aws:runShellScript",
|
|
464
|
+
name: "InstallGitDnf",
|
|
480
465
|
inputs: {
|
|
481
466
|
runCommand: [
|
|
482
|
-
|
|
483
|
-
|
|
467
|
+
"#!/bin/bash",
|
|
468
|
+
"dnf install -y git",
|
|
484
469
|
`sudo -u ${vsCodeUser} git config --global user.email "${vsCodeUser}@example.com"`,
|
|
485
470
|
`sudo -u ${vsCodeUser} git config --global user.name "Workshop ${vsCodeUser}"`,
|
|
486
471
|
`sudo -u ${vsCodeUser} git config --global init.defaultBranch "main"`,
|
|
487
472
|
'echo "Git installed. Checking configuration"',
|
|
488
|
-
|
|
473
|
+
"git --version",
|
|
489
474
|
],
|
|
490
475
|
},
|
|
491
476
|
},
|
|
492
477
|
{
|
|
493
|
-
action:
|
|
494
|
-
name:
|
|
478
|
+
action: "aws:runShellScript",
|
|
479
|
+
name: "InstallPythonDnf",
|
|
495
480
|
inputs: {
|
|
496
481
|
runCommand: [
|
|
497
482
|
// AL2023 currently ships with Python 3.9 preinstalled, but 3.11 is available in the repository
|
|
498
483
|
// Install 3.11 alongside 3.9 and setup some alias so that 3.11 is loaded when participant runs Python3
|
|
499
484
|
// If Python 3.12 become available, update below
|
|
500
|
-
|
|
501
|
-
|
|
485
|
+
"#!/bin/bash",
|
|
486
|
+
"dnf install -y python3.11 python3.11-pip python3-virtualenv python3-pytest python3-boto3",
|
|
502
487
|
`echo 'alias pytest=pytest-3' >> /home/${vsCodeUser}/.bashrc`,
|
|
503
488
|
`echo 'alias python3=python3.11' >> /home/${vsCodeUser}/.bashrc`,
|
|
504
489
|
`echo 'alias pip3=pip3.11' >> /home/${vsCodeUser}/.bashrc`,
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
490
|
+
"echo 'alias=python3=python3.11' >> ~/.bashrc",
|
|
491
|
+
"echo 'alias pip3=pip3.11' >> ~/.bashrc",
|
|
492
|
+
"python3.11 -m pip install --upgrade pip 2>&1",
|
|
508
493
|
'echo "Python and Pip installed. Checking configuration"',
|
|
509
|
-
|
|
510
|
-
|
|
494
|
+
"python3.11 --version",
|
|
495
|
+
"python3.11 -m pip --version 2>&1",
|
|
511
496
|
],
|
|
512
497
|
},
|
|
513
498
|
},
|
|
514
499
|
// add go, dotnet
|
|
515
500
|
{
|
|
516
|
-
action:
|
|
517
|
-
name:
|
|
501
|
+
action: "aws:runShellScript",
|
|
502
|
+
name: "InstallAWSCLI",
|
|
518
503
|
inputs: {
|
|
519
504
|
runCommand: [
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
505
|
+
"#!/bin/bash",
|
|
506
|
+
"curl -fsSL https://awscli.amazonaws.com/awscli-exe-linux-$(uname -m).zip -o /tmp/aws-cli.zip",
|
|
507
|
+
"unzip -q -d /tmp /tmp/aws-cli.zip",
|
|
508
|
+
"sudo /tmp/aws/install",
|
|
509
|
+
"rm -rf /tmp/aws",
|
|
525
510
|
'echo "AWS CLI installed. Checking configuration"',
|
|
526
|
-
|
|
511
|
+
"aws --version",
|
|
527
512
|
],
|
|
528
513
|
},
|
|
529
514
|
},
|
|
530
515
|
{
|
|
531
|
-
action:
|
|
532
|
-
name:
|
|
516
|
+
action: "aws:runShellScript",
|
|
517
|
+
name: "ConfigureCodeServer",
|
|
533
518
|
inputs: {
|
|
534
519
|
runCommand: [
|
|
535
|
-
|
|
520
|
+
"#!/bin/bash",
|
|
536
521
|
`export HOME=/home/${vsCodeUser}`,
|
|
537
|
-
|
|
522
|
+
"curl -fsSL https://code-server.dev/install.sh | bash -s -- 2>&1",
|
|
538
523
|
`systemctl enable --now code-server@${vsCodeUser} 2>&1`,
|
|
539
524
|
`tee /etc/nginx/conf.d/code-server.conf <<EOF
|
|
540
525
|
server {
|
|
@@ -586,7 +571,7 @@ EOF`,
|
|
|
586
571
|
EOF`,
|
|
587
572
|
`chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
|
|
588
573
|
`systemctl restart code-server@${vsCodeUser}`,
|
|
589
|
-
|
|
574
|
+
"systemctl restart nginx",
|
|
590
575
|
`sudo -u ${vsCodeUser} --login code-server --install-extension AmazonWebServices.aws-toolkit-vscode --force`,
|
|
591
576
|
`sudo -u ${vsCodeUser} --login code-server --install-extension AmazonWebServices.amazon-q-vscode --force`,
|
|
592
577
|
`sudo -u ${vsCodeUser} --login code-server --install-extension synedra.auto-run-command --force`,
|
|
@@ -594,22 +579,22 @@ EOF`,
|
|
|
594
579
|
`sudo -u ${vsCodeUser} --login code-server --install-extension ms-vscode.live-server --force`,
|
|
595
580
|
`chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
|
|
596
581
|
'echo "Nginx installed. Checking configuration"',
|
|
597
|
-
|
|
598
|
-
|
|
582
|
+
"nginx -t 2>&1",
|
|
583
|
+
"systemctl status nginx",
|
|
599
584
|
'echo "CodeServer installed. Checking configuration"',
|
|
600
|
-
|
|
585
|
+
"code-server -v",
|
|
601
586
|
`systemctl status code-server@${vsCodeUser}`,
|
|
602
587
|
],
|
|
603
588
|
},
|
|
604
589
|
},
|
|
605
590
|
{
|
|
606
|
-
action:
|
|
607
|
-
name:
|
|
591
|
+
action: "aws:runShellScript",
|
|
592
|
+
name: "UpdateProfile",
|
|
608
593
|
inputs: {
|
|
609
594
|
runCommand: [
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
595
|
+
"#!/bin/bash",
|
|
596
|
+
"echo LANG=en_US.utf-8 >> /etc/environment",
|
|
597
|
+
"echo LC_ALL=en_US.UTF-8 >> /etc/environment",
|
|
613
598
|
`echo 'PATH=$PATH:/home/${vsCodeUser}/.local/bin' >> /home/${vsCodeUser}/.bashrc`,
|
|
614
599
|
`echo 'export PATH' >> /home/${vsCodeUser}/.bashrc`,
|
|
615
600
|
`echo 'export AWS_REGION=${core_1.Stack.of(scope).region}' >> /home/${vsCodeUser}/.bashrc`,
|
|
@@ -621,14 +606,14 @@ EOF`,
|
|
|
621
606
|
},
|
|
622
607
|
},
|
|
623
608
|
{
|
|
624
|
-
action:
|
|
625
|
-
name:
|
|
609
|
+
action: "aws:runShellScript",
|
|
610
|
+
name: "InstallCDK",
|
|
626
611
|
inputs: {
|
|
627
612
|
runCommand: [
|
|
628
|
-
|
|
629
|
-
|
|
613
|
+
"#!/bin/bash",
|
|
614
|
+
"npm install -g aws-cdk",
|
|
630
615
|
'echo "AWS CDK installed. Checking configuration"',
|
|
631
|
-
|
|
616
|
+
"cdk --version",
|
|
632
617
|
],
|
|
633
618
|
},
|
|
634
619
|
},
|
|
@@ -646,52 +631,57 @@ exports.Installer = Installer;
|
|
|
646
631
|
class CustomResourceInstaller extends Installer {
|
|
647
632
|
constructor(scope, options) {
|
|
648
633
|
super();
|
|
649
|
-
const onEvent = new installer_function_1.InstallerFunction(scope,
|
|
634
|
+
const onEvent = new installer_function_1.InstallerFunction(scope, "InstallerOnEventHandler", {
|
|
650
635
|
timeout: core_1.Duration.seconds(300), // TODO configurable
|
|
651
636
|
memorySize: 512, // TODO configurable
|
|
652
637
|
});
|
|
653
|
-
cdk_nag_1.NagSuppressions.addResourceSuppressions([
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
638
|
+
cdk_nag_1.NagSuppressions.addResourceSuppressions([onEvent], [
|
|
639
|
+
{
|
|
640
|
+
id: "AwsSolutions-IAM4",
|
|
641
|
+
reason: "For this event handler we do not need to restrict managed policies",
|
|
642
|
+
},
|
|
643
|
+
{
|
|
644
|
+
id: "AwsSolutions-L1",
|
|
645
|
+
reason: "For this lambda the latest runtime is not needed",
|
|
646
|
+
},
|
|
658
647
|
], true);
|
|
659
648
|
const documentArn = core_1.Arn.format({
|
|
660
|
-
service:
|
|
661
|
-
resource:
|
|
649
|
+
service: "ssm",
|
|
650
|
+
resource: "document",
|
|
662
651
|
resourceName: options.documentName,
|
|
663
652
|
}, core_1.Stack.of(scope));
|
|
664
653
|
const cwManageAgentArn = core_1.Arn.format({
|
|
665
|
-
service:
|
|
666
|
-
resource:
|
|
667
|
-
resourceName:
|
|
654
|
+
service: "ssm",
|
|
655
|
+
resource: "document",
|
|
656
|
+
resourceName: "AmazonCloudWatch-ManageAgent",
|
|
668
657
|
}, core_1.Stack.of(scope));
|
|
669
658
|
const targetEc2InstanceArn = core_1.Arn.format({
|
|
670
|
-
service:
|
|
671
|
-
resource:
|
|
659
|
+
service: "ec2",
|
|
660
|
+
resource: "instance",
|
|
672
661
|
resourceName: options.instanceId,
|
|
673
662
|
}, core_1.Stack.of(scope));
|
|
674
663
|
onEvent.addToRolePolicy(new aws_iam_1.PolicyStatement({
|
|
675
|
-
actions: [
|
|
676
|
-
|
|
677
|
-
],
|
|
678
|
-
resources: [
|
|
679
|
-
documentArn,
|
|
680
|
-
cwManageAgentArn,
|
|
681
|
-
targetEc2InstanceArn,
|
|
682
|
-
],
|
|
664
|
+
actions: ["ssm:SendCommand"],
|
|
665
|
+
resources: [documentArn, cwManageAgentArn, targetEc2InstanceArn],
|
|
683
666
|
}));
|
|
684
|
-
const provider = new custom_resources_1.Provider(scope,
|
|
667
|
+
const provider = new custom_resources_1.Provider(scope, "InstallerProvider", {
|
|
685
668
|
onEventHandler: onEvent,
|
|
686
669
|
});
|
|
687
|
-
cdk_nag_1.NagSuppressions.addResourceSuppressions([
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
{
|
|
670
|
+
cdk_nag_1.NagSuppressions.addResourceSuppressions([provider], [
|
|
671
|
+
{
|
|
672
|
+
id: "AwsSolutions-IAM4",
|
|
673
|
+
reason: "For this provider we do not need to restrict managed policies",
|
|
674
|
+
},
|
|
675
|
+
{
|
|
676
|
+
id: "AwsSolutions-IAM5",
|
|
677
|
+
reason: "For this provider wildcards are fine",
|
|
678
|
+
},
|
|
679
|
+
{
|
|
680
|
+
id: "AwsSolutions-L1",
|
|
681
|
+
reason: "For this provider the latest runtime is not needed",
|
|
682
|
+
},
|
|
693
683
|
], true);
|
|
694
|
-
new core_1.CustomResource(scope,
|
|
684
|
+
new core_1.CustomResource(scope, "SSMInstallerCustomResource", {
|
|
695
685
|
serviceToken: provider.serviceToken,
|
|
696
686
|
properties: {
|
|
697
687
|
ServiceTimeout: 305, // TODO configurable
|
|
@@ -704,4 +694,4 @@ class CustomResourceInstaller extends Installer {
|
|
|
704
694
|
}
|
|
705
695
|
_bind() { }
|
|
706
696
|
}
|
|
707
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2luc3RhbGxlci9pbnN0YWxsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBQXNEO0FBRXRELDJDQUEyQztBQUMzQywyQ0FBd0U7QUFDeEUsbUVBQXdEO0FBQ3hELHFDQUEwQztBQUUxQyw2REFBeUQ7QUFDekQsb0RBQW1EO0FBa0RsRCxDQUFDO0FBSUYsTUFBc0IsU0FBUztJQUN0QixNQUFNLENBQUMsTUFBTSxDQUFDLE9BQXlCO1FBQzVDLE9BQU8sSUFBSSxDQUFDLEtBQU0sU0FBUSxTQUFTO1lBQzFCLEtBQUssQ0FBQyxLQUFnQjtnQkFDM0IsSUFBSSxZQUFZLENBQUM7Z0JBQ2pCLE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixJQUFJLEtBQUssQ0FBQztnQkFDN0QsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUM7Z0JBQ3BELElBQUksT0FBTyxDQUFDLFlBQVksSUFBSSxPQUFPLENBQUMsWUFBWSxJQUFJLEVBQUUsRUFBRSxDQUFDO29CQUN2RCxZQUFZLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQztnQkFDdEMsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FDckMsS0FBSyxFQUNMLGlCQUFpQixFQUNqQixhQUFhLEVBQ2IsT0FBTyxDQUFDLFVBQVUsRUFDbEIsT0FBTyxDQUFDLFVBQVUsRUFDbEIsK0JBQWUsQ0FBQyxTQUFTLENBQzFCLENBQUM7b0JBQ0YsWUFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFLLENBQUM7Z0JBQ2hDLENBQUM7Z0JBRUQsTUFBTSxzQkFBc0IsR0FBRyxPQUFPLENBQUMsc0JBQXNCLElBQUksWUFBWSxZQUFZLEVBQUUsQ0FBQztnQkFFNUYsTUFBTSxTQUFTLEdBQUcsSUFBSSx1QkFBdUIsQ0FBQyxLQUFLLEVBQUU7b0JB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LElBQUksMkJBQVEsQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLEVBQUU7WUFDeEQsY0FBYyxFQUFFLE9BQU87U0FDeEIsQ0FBQyxDQUFDO1FBQ0gseUJBQWUsQ0FBQyx1QkFBdUIsQ0FBQztZQUN0QyxRQUFRO1NBQ1QsRUFBRTtZQUNELEVBQUUsRUFBRSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sRUFBRSwrREFBK0QsRUFBRTtZQUNwRyxFQUFFLEVBQUUsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLEVBQUUsc0NBQXNDLEVBQUU7WUFDM0UsRUFBRSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLG9EQUFvRCxFQUFFO1NBQ3hGLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFVCxJQUFJLHFCQUFjLENBQUMsS0FBSyxFQUFFLDRCQUE0QixFQUFFO1lBQ3RELFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWTtZQUNuQyxVQUFVLEVBQUU7Z0JBQ1YsY0FBYyxFQUFFLEdBQUcsRUFBRSxvQkFBb0I7Z0JBQ3pDLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtnQkFDOUIsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO2dCQUNsQyxzQkFBc0IsRUFBRSxPQUFPLENBQUMsc0JBQXNCO2dCQUN0RCxjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWM7YUFDdkM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBR00sS0FBSyxLQUFLLENBQUM7Q0FDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IEZ1bmN0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBzc20gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XG5pbXBvcnQgeyBBcm4sIEN1c3RvbVJlc291cmNlLCBEdXJhdGlvbiwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSAnYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlcyc7XG5pbXBvcnQgeyBOYWdTdXBwcmVzc2lvbnMgfSBmcm9tICdjZGstbmFnJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgSW5zdGFsbGVyRnVuY3Rpb24gfSBmcm9tICcuL2luc3RhbGxlci1mdW5jdGlvbic7XG5pbXBvcnQgeyBMaW51eEZsYXZvclR5cGUgfSBmcm9tICcuLi92c2NvZGUtc2VydmVyJztcblxuaW50ZXJmYWNlIEluc3RhbGxlck9wdGlvbnNCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBlYzIgaW5zdGFuY2UgaWQgdG8gaW5zdGFsbCB0aGUgc3NtIGRvY3VtZW50IG9uXG4gICAqL1xuICByZWFkb25seSBpbnN0YW5jZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjdXN0b20gc3NtIGRvY3VtZW50IHRvIGluc3RhbGwuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBzc20gZG9jdW1lbnQgb2YgdGhlIGNvbnN0cnVjdFxuICAgKi9cbiAgcmVhZG9ubHkgZG9jdW1lbnROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY2xvdWR3YXRjaCBsb2cgZ3JvdXAgZm9yIHRoZSBpbnN0YWxsIGxvZ3NcbiAgICpcbiAgICogQGRlZmF1bHQgL2F3cy9zc20vJHtkb2N1bWVudE5hbWV9XG4gICAqL1xuICByZWFkb25seSBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgdXNlciB1bmRlciB3aGljaCB0aGUgdnNjb2RlIHNlcnZlciBydW5zXG4gICAqL1xuICByZWFkb25seSB2c0NvZGVVc2VyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXNzd29yZCBvZiB0aGUgdXNlciB1bmRlciB3aGljaCB0aGUgdnNjb2RlIHNlcnZlciBydW5zXG4gICAqL1xuICByZWFkb25seSB2c0NvZGVQYXNzd29yZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaG9tZSBmb2xkZXIgb2YgdGhlIHVzZXIgdW5kZXIgd2hpY2ggdGhlIHZzY29kZSBzZXJ2ZXIgcnVuc1xuICAgKi9cbiAgcmVhZG9ubHkgaG9tZUZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSByZXN0IHBhdGggdnMgY29kZSBzZXJ2ZXIgd2lsbCBydW5cbiAgICpcbiAgICogQGRlZmF1bHQgYXBwXG4gICAqL1xuICByZWFkb25seSBkZXZTZXJ2ZXJCYXNlUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBvcnQgdnNjb2RlciBzZXJ2ZXIgd2lsbCBiZSBzZXJ2ZWQgaW4gdGhlIGluc3RhbmNlXG4gICAqXG4gICAqIEBkZWZhdWx0IDgwODFcbiAgICovXG4gIHJlYWRvbmx5IGRldlNlcnZlclBvcnQ/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEluc3RhbGxlck9wdGlvbnMgZXh0ZW5kcyBJbnN0YWxsZXJPcHRpb25zQmFzZSB7fVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSW5zdGFsbGVyIHtcbiAgcHVibGljIHN0YXRpYyB1YnVudHUob3B0aW9uczogSW5zdGFsbGVyT3B0aW9ucyk6IEluc3RhbGxlciB7XG4gICAgcmV0dXJuIG5ldyAoY2xhc3MgZXh0ZW5kcyBJbnN0YWxsZXIge1xuICAgICAgcHVibGljIF9iaW5kKHNjb3BlOiBDb25zdHJ1Y3QpOiBJbnN0YWxsZXIge1xuICAgICAgICBsZXQgZG9jdW1lbnROYW1lO1xuICAgICAgICBjb25zdCBkZXZTZXJ2ZXJCYXNlUGF0aCA9IG9wdGlvbnMuZGV2U2VydmVyQmFzZVBhdGggPz8gJ2FwcCc7XG4gICAgICAgIGNvbnN0IGRldlNlcnZlclBvcnQgPSBvcHRpb25zLmRldlNlcnZlclBvcnQgPz8gODA4MTtcbiAgICAgICAgaWYgKG9wdGlvbnMuZG9jdW1lbnROYW1lICYmIG9wdGlvbnMuZG9jdW1lbnROYW1lICE9ICcnKSB7XG4gICAgICAgICAgZG9jdW1lbnROYW1lID0gb3B0aW9ucy5kb2N1bWVudE5hbWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZG9jdW1lbnQgPSB0aGlzLmNyZWF0ZVNTTURvY3VtZW50KFxuICAgICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgICBkZXZTZXJ2ZXJCYXNlUGF0aCxcbiAgICAgICAgICAgIGRldlNlcnZlclBvcnQsXG4gICAgICAgICAgICBvcHRpb25zLnZzQ29kZVVzZXIsXG4gICAgICAgICAgICBvcHRpb25zLmhvbWVGb2xkZXIsXG4gICAgICAgICAgICBMaW51eEZsYXZvclR5cGUuVUJVTlRVXzIyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZG9jdW1lbnROYW1lID0gZG9jdW1lbnQubmFtZSE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lID0gb3B0aW9ucy5jbG91ZFdhdGNoTG9nR3JvdXBOYW1lID8/IGAvYXdzL3NzbS8ke2RvY3VtZW50TmFtZX1gO1xuXG4gICAgICAgIGNvbnN0IGluc3RhbGxlciA9IG5ldyBDdXN0b21SZXNvdXJjZUluc3RhbGxlcihzY29wZSwge1xuICAgICAgICAgIGluc3RhbmNlSWQ6IG9wdGlvbnMuaW5zdGFuY2VJZCxcbiAgICAgICAgICBkb2N1bWVudE5hbWU6IGRvY3VtZW50TmFtZSxcbiAgICAgICAgICBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lOiBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lLFxuICAgICAgICAgIHZzQ29kZVVzZXI6IG9wdGlvbnMudnNDb2RlVXNlcixcbiAgICAgICAgICB2c0NvZGVQYXNzd29yZDogb3B0aW9ucy52c0NvZGVQYXNzd29yZCxcbiAgICAgICAgICBob21lRm9sZGVyOiBvcHRpb25zLmhvbWVGb2xkZXIsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBpbnN0YWxsZXI7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgYW1hem9uTGludXgyMDIzKG9wdGlvbnM6IEluc3RhbGxlck9wdGlvbnMpOiBJbnN0YWxsZXIge1xuICAgIHJldHVybiBuZXcgKGNsYXNzIGV4dGVuZHMgSW5zdGFsbGVyIHtcbiAgICAgIHB1YmxpYyBfYmluZChzY29wZTogQ29uc3RydWN0KTogSW5zdGFsbGVyIHtcbiAgICAgICAgbGV0IGRvY3VtZW50TmFtZTtcbiAgICAgICAgY29uc3QgZGV2U2VydmVyQmFzZVBhdGggPSBvcHRpb25zLmRldlNlcnZlckJhc2VQYXRoID8/ICdhcHAnO1xuICAgICAgICBjb25zdCBkZXZTZXJ2ZXJQb3J0ID0gb3B0aW9ucy5kZXZTZXJ2ZXJQb3J0ID8/IDgwODE7XG4gICAgICAgIGlmIChvcHRpb25zLmRvY3VtZW50TmFtZSAmJiBvcHRpb25zLmRvY3VtZW50TmFtZSAhPSAnJykge1xuICAgICAgICAgIGRvY3VtZW50TmFtZSA9IG9wdGlvbnMuZG9jdW1lbnROYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gdGhpcy5jcmVhdGVTU01Eb2N1bWVudChcbiAgICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgICAgZGV2U2VydmVyQmFzZVBhdGgsXG4gICAgICAgICAgICBkZXZTZXJ2ZXJQb3J0LFxuICAgICAgICAgICAgb3B0aW9ucy52c0NvZGVVc2VyLFxuICAgICAgICAgICAgb3B0aW9ucy5ob21lRm9sZGVyLFxuICAgICAgICAgICAgTGludXhGbGF2b3JUeXBlLkFNQVpPTl9MSU5VWF8yMDIzLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZG9jdW1lbnROYW1lID0gZG9jdW1lbnQubmFtZSE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lID0gb3B0aW9ucy5jbG91ZFdhdGNoTG9nR3JvdXBOYW1lID8/IGAvYXdzL3NzbS8ke2RvY3VtZW50TmFtZX1gO1xuXG4gICAgICAgIGNvbnN0IGluc3RhbGxlciA9IG5ldyBDdXN0b21SZXNvdXJjZUluc3RhbGxlcihzY29wZSwge1xuICAgICAgICAgIGluc3RhbmNlSWQ6IG9wdGlvbnMuaW5zdGFuY2VJZCxcbiAgICAgICAgICBkb2N1bWVudE5hbWU6IGRvY3VtZW50TmFtZSxcbiAgICAgICAgICBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lOiBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lLFxuICAgICAgICAgIHZzQ29kZVVzZXI6IG9wdGlvbnMudnNDb2RlVXNlcixcbiAgICAgICAgICB2c0NvZGVQYXNzd29yZDogb3B0aW9ucy52c0NvZGVQYXNzd29yZCxcbiAgICAgICAgICBob21lRm9sZGVyOiBvcHRpb25zLmhvbWVGb2xkZXIsXG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgcmV0dXJuIGluc3RhbGxlcjtcbiAgICAgIH1cbiAgICB9KSgpO1xuICB9XG5cbiAgcHVibGljIGluc3RhbmNlSWQhOiBzdHJpbmc7XG4gIHB1YmxpYyBkb2N1bWVudE5hbWUhOiBzdHJpbmc7XG4gIHB1YmxpYyBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lITogc3RyaW5nO1xuICBwdWJsaWMgdnNDb2RlUGFzc3dvcmQhOiBzdHJpbmc7XG4gIHB1YmxpYyB2c0NvZGVQYXNzd29yZFRlc3QhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IF9iaW5kKHNjb3BlOiBDb25zdHJ1Y3QpOiBhbnk7XG5cbiAgcHJpdmF0ZSBjcmVhdGVTU01Eb2N1bWVudChcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGRldlNlcnZlckJhc2VQYXRoOiBzdHJpbmcsXG4gICAgZGV2U2VydmVyUG9ydDogbnVtYmVyLFxuICAgIHZzQ29kZVVzZXI6IHN0cmluZyxcbiAgICBob21lRm9sZGVyOiBzdHJpbmcsXG4gICAgbGludXhGbGF2b3I6IExpbnV4Rmxhdm9yVHlwZSxcbiAgKTogc3NtLkNmbkRvY3VtZW50IHtcbiAgICBsZXQgc3NtRG9jdW1lbnQ6IHNzbS5DZm5Eb2N1bWVudDtcbiAgICBzd2l0Y2ggKGxpbnV4Rmxhdm9yKSB7XG4gICAgICBjYXNlIExpbnV4Rmxhdm9yVHlwZS5VQlVOVFVfMjI6XG4gICAgICBjYXNlIExpbnV4Rmxhdm9yVHlwZS5VQlVOVFVfMjQ6XG4gICAgICAgIC8vIENyZWF0ZSBhbiBTU00gZG9jdW1lbnQgd2l0aCBtdWx0aXBsZSBhY3Rpb25zIHRvIGluc3RhbGwgdGhlIHNvZnR3YXJlXG4gICAgICAgIHNzbURvY3VtZW50ID0gbmV3IHNzbS5DZm5Eb2N1bWVudChzY29wZSwgJ3NzbS1kb2N1bWVudC11YnVudHUnLCB7XG4gICAgICAgICAgbmFtZTogYHZzY29kZS1zZXJ2ZXItdWJ1bnR1LSR7U3RhY2sub2Yoc2NvcGUpLnN0YWNrTmFtZX1gLFxuICAgICAgICAgIGRvY3VtZW50VHlwZTogJ0NvbW1hbmQnLFxuICAgICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICAgIHNjaGVtYVZlcnNpb246ICcyLjInLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdCb290c3RyYXAgVlNDb2RlIGNvZGUtc2VydmVyIGluc3RhbmNlJyxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgVlNDb2RlUGFzc3dvcmQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU3RyaW5nJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBTdGFjay5vZihzY29wZSkuc3RhY2tJZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgTm9kZVZlcnNpb246IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU3RyaW5nJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiAnMjAnLFxuICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcbiAgICAgICAgICAgICAgICAgICcyMicsXG4gICAgICAgICAgICAgICAgICAnMjAnLFxuICAgICAgICAgICAgICAgICAgJzE4JyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBEb3ROZXRWZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogJzguMCcsXG4gICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1xuICAgICAgICAgICAgICAgICAgJzguMCcsXG4gICAgICAgICAgICAgICAgICAnNy4wJyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIGFsbCBtYWluU3RlcHMgc2NyaXB0cyBhcmUgaW4gaW4gL3Zhci9saWIvYW1hem9uL3NzbS88aW5zdGFuY2VpZD4vZG9jdW1lbnQvb3JjaGVzdHJhdGlvbi88dXVpZD4vPFN0ZXBOYW1lPi9fc2NyaXB0LnNoXG4gICAgICAgICAgICBtYWluU3RlcHM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpjb25maWd1cmVQYWNrYWdlJyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbENsb3VkV2F0Y2hBZ2VudCcsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiAnQW1hem9uQ2xvdWRXYXRjaEFnZW50JyxcbiAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ0luc3RhbGwnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuRG9jdW1lbnQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdDb25maWd1cmVDbG91ZFdhdGNoQWdlbnQnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgZG9jdW1lbnRUeXBlOiAnU1NNRG9jdW1lbnQnLFxuICAgICAgICAgICAgICAgICAgZG9jdW1lbnRQYXRoOiAnQW1hem9uQ2xvdWRXYXRjaC1NYW5hZ2VBZ2VudCcsXG4gICAgICAgICAgICAgICAgICBkb2N1bWVudFBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnY29uZmlndXJlJyxcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogJ2VjMicsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsQ29uZmlndXJhdGlvblNvdXJjZTogJ2RlZmF1bHQnLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25hbFJlc3RhcnQ6ICd5ZXMnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbEFwdFBhY2thZ2VzQXB0JyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2FwdC1nZXQgLXEgdXBkYXRlICYmIERFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSBhcHQtZ2V0IGluc3RhbGwgLXkgLXEgYXB0LXV0aWxzJyxcbiAgICAgICAgICAgICAgICAgICAgJ2FwdC1nZXQgLXEgdXBkYXRlICYmIERFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSBhcHQtZ2V0IGluc3RhbGwgLXkgLXEgbmVlZHJlc3RhcnQgdW5hdHRlbmRlZC11cGdyYWRlcycsXG4gICAgICAgICAgICAgICAgICAgICdzZWQgLWkgXFwncy8jJG5yY29uZntrZXJuZWxoaW50c30gPSAtMTsvJG5yY29uZntrZXJuZWxoaW50c30gPSAwOy9cXCcgL2V0Yy9uZWVkcmVzdGFydC9uZWVkcmVzdGFydC5jb25mJyxcbiAgICAgICAgICAgICAgICAgICAgJ3NlZCAtaSBcXCdzLyMkbnJjb25me3ZlcmJvc2l0eX0gPSAyOy8kbnJjb25me3ZlcmJvc2l0eX0gPSAwOy9cXCcgL2V0Yy9uZWVkcmVzdGFydC9uZWVkcmVzdGFydC5jb25mJyxcbiAgICAgICAgICAgICAgICAgICAgJ3NlZCAtaSBcInMvI1xcJG5yY29uZntyZXN0YXJ0fSA9IFxcJ2lcXCc7L1xcJG5yY29uZntyZXN0YXJ0fSA9IFxcJ2FcXCc7L1wiIC9ldGMvbmVlZHJlc3RhcnQvbmVlZHJlc3RhcnQuY29uZicsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiQXB0IGhlbHBlciBwYWNrYWdlcyBhZGRlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ2NhdCAvZXRjL25lZWRyZXN0YXJ0L25lZWRyZXN0YXJ0LmNvbmYnLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbEJhc2VQYWNrYWdlc0FwdCcsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdhcHQtZ2V0IC1xIHVwZGF0ZSAmJiBERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUgYXB0LWdldCBpbnN0YWxsIC15IC1xIGN1cmwgZ251cGcgd2hvaXMgYXJnb24yIG9wZW5zc2wgbG9jYWxlcyBsb2NhbGVzLWFsbCB1bnppcCBhcHQtdHJhbnNwb3J0LWh0dHBzIGNhLWNlcnRpZmljYXRlcyBzb2Z0d2FyZS1wcm9wZXJ0aWVzLWNvbW1vbiBuZ2lueCcsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdBZGRVc2VyQXB0JyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXFwnQWRkaW5nIHVzZXI6ICR7VlNDb2RlVXNlcn1cXCcnLFxuICAgICAgICAgICAgICAgICAgICBgYWRkdXNlciAtLWRpc2FibGVkLXBhc3N3b3JkIC0tZ2Vjb3MgJycgJHt2c0NvZGVVc2VyfWAsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvIFwiJHt2c0NvZGVVc2VyfTp7eyBWU0NvZGVQYXNzd29yZCB9fVwiIHwgY2hwYXNzd2RgLFxuICAgICAgICAgICAgICAgICAgICBgdXNlcm1vZCAtYUcgc3VkbyAke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgYHRlZSAvZXRjL3N1ZG9lcnMuZC85MS12c2NvZGUtdXNlciA8PEVPRlxuJHt2c0NvZGVVc2VyfSBBTEw9KEFMTCkgTk9QQVNTV0Q6QUxMXG5FT0ZgLFxuICAgICAgICAgICAgICAgICAgICBgbWtkaXIgLXAgL2hvbWUvJHt2c0NvZGVVc2VyfSAmJiBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gL2hvbWUvJHt2c0NvZGVVc2VyfWAsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiVXNlciBhZGRlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgYGdldGVudCBwYXNzd2QgJHt2c0NvZGVVc2VyfWAsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsTm9kZUFwdCcsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdjdXJsIC1mc1NMIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL2dwZ2tleS9ub2Rlc291cmNlLXJlcG8uZ3BnLmtleSB8IGdwZyAtLWRlYXJtb3IgLW8gL3Vzci9zaGFyZS9rZXlyaW5ncy9ub2Rlc291cmNlLmdwZycsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiZGViIFthcmNoPSQoZHBrZyAtLXByaW50LWFyY2hpdGVjdHVyZSkgc2lnbmVkLWJ5PS91c3Ivc2hhcmUva2V5cmluZ3Mvbm9kZXNvdXJjZS5ncGddIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL25vZGVfe3sgTm9kZVZlcnNpb24gfX0ueCBub2Rpc3RybyBtYWluXCIgPiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9ub2Rlc291cmNlLmxpc3QnLFxuICAgICAgICAgICAgICAgICAgICAnYXB0LWdldCAtcSB1cGRhdGUgJiYgREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgaW5zdGFsbCAteSAtcSBub2RlanMnLFxuICAgICAgICAgICAgICAgICAgICAnbnBtIGluc3RhbGwgLWcgbnBtQGxhdGVzdCcsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiTm9kZSBhbmQgbnBtIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ25vZGUgLXYnLFxuICAgICAgICAgICAgICAgICAgICAnbnBtIC12JyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxEb2NrZXJBcHQnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnY3VybCAtZnNTTCBodHRwczovL2Rvd25sb2FkLmRvY2tlci5jb20vbGludXgvdWJ1bnR1L2dwZyB8IGdwZyAtLWRlYXJtb3IgLW8gL3Vzci9zaGFyZS9rZXlyaW5ncy9kb2NrZXItYXJjaGl2ZS1rZXlyaW5nLmdwZycsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiZGViIFtzaWduZWQtYnk9L3Vzci9zaGFyZS9rZXlyaW5ncy9kb2NrZXItYXJjaGl2ZS1rZXlyaW5nLmdwZ10gaHR0cHM6Ly9kb3dubG9hZC5kb2NrZXIuY29tL2xpbnV4L3VidW50dSAkKGxzYl9yZWxlYXNlIC0tY29kZW5hbWUgLS1zaG9ydCkgc3RhYmxlXCIgPiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kb2NrZXIubGlzdCcsXG4gICAgICAgICAgICAgICAgICAgICdhcHQtZ2V0IC1xIHVwZGF0ZSAmJiBERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUgYXB0LWdldCBpbnN0YWxsIC15IC1xIGRvY2tlci1jZSBkb2NrZXItY2UtY2xpIGNvbnRhaW5lcmQuaW8nLFxuICAgICAgICAgICAgICAgICAgICBgc3lzdGVtY3RsIHJlc3RhcnQgY29kZS1zZXJ2ZXJAJHt2c0NvZGVVc2VyfS5zZXJ2aWNlYCxcbiAgICAgICAgICAgICAgICAgICAgJ3N5c3RlbWN0bCBzdGFydCBkb2NrZXIuc2VydmljZScsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiRG9ja2VyIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ2RvY2tlciAtLXZlcnNpb24nLFxuICAgICAgICAgICAgICAgICAgICAnc3lzdGVtY3RsIHN0YXR1cyBkb2NrZXIuc2VydmljZScsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsR2l0QXB0JyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2FkZC1hcHQtcmVwb3NpdG9yeSBwcGE6Z2l0LWNvcmUvcHBhJyxcbiAgICAgICAgICAgICAgICAgICAgJ2FwdC1nZXQgLXEgdXBkYXRlICYmIERFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSBhcHQtZ2V0IGluc3RhbGwgLXkgLXEgZ2l0JyxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIuZW1haWwgXCIke3ZzQ29kZVVzZXJ9QGV4YW1wbGUuY29tXCJgLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IGdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5uYW1lIFwiV29ya3Nob3AgJHt2c0NvZGVVc2VyfVwiYCxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgY29uZmlnIC0tZ2xvYmFsIGluaXQuZGVmYXVsdEJyYW5jaCBcIm1haW5cImAsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiR2l0IGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ2dpdCAtLXZlcnNpb24nLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbFB5dGhvbkFwdCcsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgIC8vIFVidW50dSAyMiBkZWZhdWx0IGlzIFB5dGhvbiAzLjEwXG4gICAgICAgICAgICAgICAgICAgIC8vIFVidW50dSAyNCBkZWZhdWx0IGlzIFB5dGhvbiAzLjEyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IGluc3RhbGxlZCBQeXRob24gdmVyc2lvbiB3aWxsIG1hcCB0byBQeXRob24zXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdhcHQtZ2V0IC1xIHVwZGF0ZSAmJiBERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUgYXB0LWdldCBpbnN0YWxsIC15IC1xIHB5dGhvbjMtcGlwIHB5dGhvbjMtdmVudiBweXRob24zLWJvdG8zIHB5dGhvbjMtcHl0ZXN0JyxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2FsaWFzIHB5dGVzdD1weXRlc3QtMycgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYHN5c3RlbWN0bCByZXN0YXJ0IGNvZGUtc2VydmVyQCR7dnNDb2RlVXNlcn0uc2VydmljZWAsXG4gICAgICAgICAgICAgICAgICAgICdzeXN0ZW1jdGwgc3RhcnQgbXVsdGlwYXRoZC5zZXJ2aWNlIHBhY2thZ2VraXQuc2VydmljZScsXG4gICAgICAgICAgICAgICAgICAgICdzeXN0ZW1jdGwgcmVzdGFydCB1bmF0dGVuZGVkLXVwZ3JhZGVzLnNlcnZpY2UnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIlB5dGhvbiBhbmQgUGlwIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ3B5dGhvbjMgLS12ZXJzaW9uJyxcbiAgICAgICAgICAgICAgICAgICAgJ3BpcDMgLS12ZXJzaW9uJyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxBV1NDTEknLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnY3VybCAtZnNTTCBodHRwczovL2F3c2NsaS5hbWF6b25hd3MuY29tL2F3c2NsaS1leGUtbGludXgtJCh1bmFtZSAtbSkuemlwIC1vIC90bXAvYXdzLWNsaS56aXAnLFxuICAgICAgICAgICAgICAgICAgICAndW56aXAgLXEgLWQgL3RtcCAvdG1wL2F3cy1jbGkuemlwJyxcbiAgICAgICAgICAgICAgICAgICAgJ3N1ZG8gL3RtcC9hd3MvaW5zdGFsbCcsXG4gICAgICAgICAgICAgICAgICAgICdybSAtcmYgL3RtcC9hd3MnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIkFXUyBDTEkgaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICAnYXdzIC0tdmVyc2lvbicsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdDb25maWd1cmVDb2RlU2VydmVyJyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgYGV4cG9ydCBIT01FPS9ob21lLyR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICAnY3VybCAtZnNTTCBodHRwczovL2NvZGUtc2VydmVyLmRldi9pbnN0YWxsLnNoIHwgYmFzaCAtcyAtLSAyPiYxJyxcbiAgICAgICAgICAgICAgICAgICAgYHN5c3RlbWN0bCBlbmFibGUgLS1ub3cgY29kZS1zZXJ2ZXJAJHt2c0NvZGVVc2VyfSAyPiYxYCxcbiAgICAgICAgICAgICAgICAgICAgYHRlZSAvZXRjL25naW54L2NvbmYuZC9jb2RlLXNlcnZlci5jb25mIDw8RU9GXG5zZXJ2ZXIge1xuICAgIGxpc3RlbiA4MDtcbiAgICBsaXN0ZW4gWzo6XTo4MDtcbiAgICAjIHNlcnZlcl9uYW1lIGRpc3RyaWJ1dGlvbi5kaXN0cmlidXRpb25Eb21haW5OYW1lO1xuICAgIHNlcnZlcl9uYW1lICouY2xvdWRmcm9udC5uZXQ7XG4gICAgbG9jYXRpb24gLyB7XG4gICAgICBwcm94eV9wYXNzIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC87XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIEhvc3QgXFxcXCRob3N0O1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBVcGdyYWRlIFxcXFwkaHR0cF91cGdyYWRlO1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBDb25uZWN0aW9uIHVwZ3JhZGU7XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIEFjY2VwdC1FbmNvZGluZyBnemlwO1xuICAgIH1cbiAgICBsb2NhdGlvbiAvJHtkZXZTZXJ2ZXJCYXNlUGF0aH0ge1xuICAgICAgcHJveHlfcGFzcyBodHRwOi8vbG9jYWxob3N0OiR7ZGV2U2VydmVyUG9ydH0vJHtkZXZTZXJ2ZXJCYXNlUGF0aH07XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIEhvc3QgXFxcXCRob3N0O1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBVcGdyYWRlIFxcXFwkaHR0cF91cGdyYWRlO1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBDb25uZWN0aW9uIHVwZ3JhZGU7XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIEFjY2VwdC1FbmNvZGluZyBnemlwO1xuICAgIH1cbn1cbkVPRmAsXG4gICAgICAgICAgICAgICAgICAgIGBta2RpciAtcCAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5jb25maWcvY29kZS1zZXJ2ZXJgLFxuICAgICAgICAgICAgICAgICAgICBgdGVlIC9ob21lLyR7dnNDb2RlVXNlcn0vLmNvbmZpZy9jb2RlLXNlcnZlci9jb25maWcueWFtbCA8PEVPRlxuY2VydDogZmFsc2VcbmF1dGg6IHBhc3N3b3JkXG5oYXNoZWQtcGFzc3dvcmQ6IFwiJChlY2hvIC1uIHt7IFZTQ29kZVBhc3N3b3JkIH19IHwgYXJnb24yICQob3BlbnNzbCByYW5kIC1iYXNlNjQgMTIpIC1lKVwiXG5FT0ZgLFxuICAgICAgICAgICAgICAgICAgICBgbWtkaXIgLXAgL2hvbWUvJHt2c0NvZGVVc2VyfS8ubG9jYWwvc2hhcmUvY29kZS1zZXJ2ZXIvVXNlci9gLFxuICAgICAgICAgICAgICAgICAgICBgdG91Y2ggL2hvbWUvJHt2c0NvZGVVc2VyfS8uaHVzaGxvZ2luYCxcbiAgICAgICAgICAgICAgICAgICAgYG1rZGlyIC1wICR7aG9tZUZvbGRlcn0gJiYgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9ICR7aG9tZUZvbGRlcn1gLFxuICAgICAgICAgICAgICAgICAgICBgdGVlIC9ob21lLyR7dnNDb2RlVXNlcn0vLmxvY2FsL3NoYXJlL2NvZGUtc2VydmVyL1VzZXIvc2V0dGluZ3MuanNvbiA8PEVPRlxue1xuICBcImV4dGVuc2lvbnMuYXV0b1VwZGF0ZVwiOiBmYWxzZSxcbiAgXCJleHRlbnNpb25zLmF1dG9DaGVja1VwZGF0ZXNcIjogZmFsc2UsXG4gIFwidGVsZW1ldHJ5LnRlbGVtZXRyeUxldmVsXCI6IFwib2ZmXCIsXG4gIFwic2VjdXJpdHkud29ya3NwYWNlLnRydXN0LnN0YXJ0dXBQcm9tcHRcIjogXCJuZXZlclwiLFxuICBcInNlY3VyaXR5LndvcmtzcGFjZS50cnVzdC5lbmFibGVkXCI6IGZhbHNlLFxuICBcInNlY3VyaXR5LndvcmtzcGFjZS50cnVzdC5iYW5uZXJcIjogXCJuZXZlclwiLFxuICBcInNlY3VyaXR5LndvcmtzcGFjZS50cnVzdC5lbXB0eVdpbmRvd1wiOiBmYWxzZSxcbiAgXCJweXRob24udGVzdGluZy5weXRlc3RFbmFibGVkXCI6IHRydWUsXG4gIFwiYXV0by1ydW4tY29tbWFuZC5ydWxlc1wiOiBbXG4gICAge1xuICAgICAgXCJjb21tYW5kXCI6IFwid29ya2JlbmNoLmFjdGlvbi50ZXJtaW5hbC5uZXdcIlxuICAgIH1cbiAgXVxufVxuRU9GYCxcbiAgICAgICAgICAgICAgICAgICAgYGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgYHN5c3RlbWN0bCByZXN0YXJ0IGNvZGUtc2VydmVyQCR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICAnc3lzdGVtY3RsIHJlc3RhcnQgbmdpbngnLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IC0tbG9naW4gY29kZS1zZXJ2ZXIgLS1pbnN0YWxsLWV4dGVuc2lvbiBBbWF6b25XZWJTZXJ2aWNlcy5hd3MtdG9vbGtpdC12c2NvZGUgLS1mb3JjZWAsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gLS1sb2dpbiBjb2RlLXNlcnZlciAtLWluc3RhbGwtZXh0ZW5zaW9uIEFtYXpvbldlYlNlcnZpY2VzLmFtYXpvbi1xLXZzY29kZSAtLWZvcmNlYCxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSAtLWxvZ2luIGNvZGUtc2VydmVyIC0taW5zdGFsbC1leHRlbnNpb24gc3luZWRyYS5hdXRvLXJ1bi1jb21tYW5kIC0tZm9yY2VgLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IC0tbG9naW4gY29kZS1zZXJ2ZXIgLS1pbnN0YWxsLWV4dGVuc2lvbiB2c2NqYXZhLnZzY29kZS1qYXZhLXBhY2sgLS1mb3JjZWAsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gLS1sb2dpbiBjb2RlLXNlcnZlciAtLWluc3RhbGwtZXh0ZW5zaW9uIG1zLXZzY29kZS5saXZlLXNlcnZlciAtLWZvcmNlYCxcbiAgICAgICAgICAgICAgICAgICAgYGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJOZ2lueCBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICduZ2lueCAtdCAyPiYxJyxcbiAgICAgICAgICAgICAgICAgICAgJ3N5c3RlbWN0bCBzdGF0dXMgbmdpbngnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIkNvZGVTZXJ2ZXIgaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICAnY29kZS1zZXJ2ZXIgLXYnLFxuICAgICAgICAgICAgICAgICAgICBgc3lzdGVtY3RsIHN0YXR1cyBjb2RlLXNlcnZlckAke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ1VwZGF0ZVByb2ZpbGUnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBMQU5HPWVuX1VTLnV0Zi04ID4+IC9ldGMvZW52aXJvbm1lbnQnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBMQ19BTEw9ZW5fVVMuVVRGLTggPj4gL2V0Yy9lbnZpcm9ubWVudCcsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdQQVRIPSRQQVRIOi9ob21lLyR7dnNDb2RlVXNlcn0vLmxvY2FsL2JpbicgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2V4cG9ydCBQQVRIJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IEFXU19SRUdJT049JHtTdGFjay5vZihzY29wZSkucmVnaW9ufScgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2V4cG9ydCBBV1NfQUNDT1VOVElEPSR7U3RhY2sub2Yoc2NvcGUpLmFjY291bnR9JyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IE5FWFRfVEVMRU1FVFJZX0RJU0FCTEVEPTEnID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvIFwiZXhwb3J0IFBTMT0nXFxcXFtcXFxcMDMzWzAxOzMybVxcXFxdXFxcXHU6XFxcXFtcXFxcMDMzWzAxOzM0bVxcXFxdXFxcXHdcXFxcW1xcXFwwMzNbMDBtXFxcXF1cXFxcJCAnXCIgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxDREsnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnbnBtIGluc3RhbGwgLWcgYXdzLWNkaycsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiQVdTIENESyBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICdjZGsgLS12ZXJzaW9uJyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMaW51eEZsYXZvclR5cGUuQU1BWk9OX0xJTlVYXzIwMjM6XG4gICAgICAgIHNzbURvY3VtZW50ID0gbmV3IHNzbS5DZm5Eb2N1bWVudChzY29wZSwgJ3NzbS1kb2N1bWVudC1hbDIwMjMnLCB7XG4gICAgICAgICAgbmFtZTogYHZzY29kZS1zZXJ2ZXItYWwyMDIzLSR7U3RhY2sub2Yoc2NvcGUpLnN0YWNrTmFtZX1gLFxuICAgICAgICAgIGRvY3VtZW50VHlwZTogJ0NvbW1hbmQnLFxuICAgICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICAgIHNjaGVtYVZlcnNpb246ICcyLjInLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdCb290c3RyYXAgVlNDb2RlIGNvZGUtc2VydmVyIGluc3RhbmNlJyxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgVlNDb2RlUGFzc3dvcmQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU3RyaW5nJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBTdGFjay5vZihzY29wZSkuc3RhY2tJZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgTm9kZVZlcnNpb246IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU3RyaW5nJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiAnMjAnLFxuICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcbiAgICAgICAgICAgICAgICAgICcyMicsXG4gICAgICAgICAgICAgICAgICAnMjAnLFxuICAgICAgICAgICAgICAgICAgJzE4JyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBEb3ROZXRWZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogJzguMCcsXG4gICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1xuICAgICAgICAgICAgICAgICAgJzguMCcsXG4gICAgICAgICAgICAgICAgICAnNy4wJyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIGFsbCBtYWluU3RlcHMgc2NyaXB0cyBhcmUgaW4gaW4gL3Zhci9saWIvYW1hem9uL3NzbS88aW5zdGFuY2VpZD4vZG9jdW1lbnQvb3JjaGVzdHJhdGlvbi88dXVpZD4vPFN0ZXBOYW1lPi9fc2NyaXB0LnNoXG4gICAgICAgICAgICBtYWluU3RlcHM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpjb25maWd1cmVQYWNrYWdlJyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbENsb3VkV2F0Y2hBZ2VudCcsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiAnQW1hem9uQ2xvdWRXYXRjaEFnZW50JyxcbiAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ0luc3RhbGwnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuRG9jdW1lbnQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdDb25maWd1cmVDbG91ZFdhdGNoQWdlbnQnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgZG9jdW1lbnRUeXBlOiAnU1NNRG9jdW1lbnQnLFxuICAgICAgICAgICAgICAgICAgZG9jdW1lbnRQYXRoOiAnQW1hem9uQ2xvdWRXYXRjaC1NYW5hZ2VBZ2VudCcsXG4gICAgICAgICAgICAgICAgICBkb2N1bWVudFBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnY29uZmlndXJlJyxcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogJ2VjMicsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsQ29uZmlndXJhdGlvblNvdXJjZTogJ2RlZmF1bHQnLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25hbFJlc3RhcnQ6ICd5ZXMnLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbEJhc2VQYWNrYWdlc0RuZicsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdkbmYgaW5zdGFsbCAteSAtLWFsbG93ZXJhc2luZyB3aG9pcyBhcmdvbjIgdW56aXAgbmdpbnggY3VybCBnbnVwZyBvcGVuc3NsJyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0FkZFVzZXJEbmYnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnQWRkaW5nIHVzZXI6ICR7dnNDb2RlVXNlcn0nYCxcbiAgICAgICAgICAgICAgICAgICAgYGFkZHVzZXIgLWMgJycgJHt2c0NvZGVVc2VyfWAsXG4gICAgICAgICAgICAgICAgICAgIGBwYXNzd2QgLWwgJHt2c0NvZGVVc2VyfWAsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvIFwiJHt2c0NvZGVVc2VyfTp7eyBWU0NvZGVQYXNzd29yZCB9fVwiIHwgY2hwYXNzd2RgLFxuICAgICAgICAgICAgICAgICAgICBgdXNlcm1vZCAtYUcgd2hlZWwgJHt2c0NvZGVVc2VyfWAsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiVXNlciBhZGRlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgYGdldGVudCBwYXNzd2QgJHt2c0NvZGVVc2VyfWAsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsTm9kZURuZicsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdkbmYgaW5zdGFsbCAteSBub2RlanMyMCBucG0nLFxuICAgICAgICAgICAgICAgICAgICAnbG4gLXMgLWYgL3Vzci9iaW4vbm9kZS0yMCAvdXNyL2Jpbi9ub2RlJyxcbiAgICAgICAgICAgICAgICAgICAgJ25wbSBpbnN0YWxsIC1nIG5wbUBsYXRlc3QnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIk5vZGUgYW5kIG5wbSBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICdub2RlIC12JyxcbiAgICAgICAgICAgICAgICAgICAgJ25wbSAtdicsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsRG9ja2VyRG5mJyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2RuZiBpbnN0YWxsIC15IGRvY2tlcicsXG4gICAgICAgICAgICAgICAgICAgIGB1c2VybW9kIC1hRyBkb2NrZXIgJHt2c0NvZGVVc2VyfWAsXG4gICAgICAgICAgICAgICAgICAgIGBzeXN0ZW1jdGwgcmVzdGFydCBjb2RlLXNlcnZlckAke3ZzQ29kZVVzZXJ9LnNlcnZpY2VgLFxuICAgICAgICAgICAgICAgICAgICAnc3lzdGVtY3RsIHN0YXJ0IGRvY2tlci5zZXJ2aWNlJyxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJEb2NrZXIgaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICAnZG9ja2VyIC0tdmVyc2lvbicsXG4gICAgICAgICAgICAgICAgICAgICdzeXN0ZW1jdGwgc3RhdHVzIGRvY2tlci5zZXJ2aWNlJyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxHaXREbmYnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnZG5mIGluc3RhbGwgLXkgZ2l0JyxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIuZW1haWwgXCIke3ZzQ29kZVVzZXJ9QGV4YW1wbGUuY29tXCJgLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IGdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5uYW1lIFwiV29ya3Nob3AgJHt2c0NvZGVVc2VyfVwiYCxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgY29uZmlnIC0tZ2xvYmFsIGluaXQuZGVmYXVsdEJyYW5jaCBcIm1haW5cImAsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiR2l0IGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ2dpdCAtLXZlcnNpb24nLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbFB5dGhvbkRuZicsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgIC8vIEFMMjAyMyBjdXJyZW50bHkgc2hpcHMgd2l0aCBQeXRob24gMy45IHByZWluc3RhbGxlZCwgYnV0IDMuMTEgaXMgYXZhaWxhYmxlIGluIHRoZSByZXBvc2l0b3J5XG4gICAgICAgICAgICAgICAgICAgIC8vIEluc3RhbGwgMy4xMSBhbG9uZ3NpZGUgMy45IGFuZCBzZXR1cCBzb21lIGFsaWFzIHNvIHRoYXQgMy4xMSBpcyBsb2FkZWQgd2hlbiBwYXJ0aWNpcGFudCBydW5zIFB5dGhvbjNcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgUHl0aG9uIDMuMTIgYmVjb21lIGF2YWlsYWJsZSwgdXBkYXRlIGJlbG93XG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdkbmYgaW5zdGFsbCAteSBweXRob24zLjExIHB5dGhvbjMuMTEtcGlwIHB5dGhvbjMtdmlydHVhbGVudiBweXRob24zLXB5dGVzdCBweXRob24zLWJvdG8zJyxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2FsaWFzIHB5dGVzdD1weXRlc3QtMycgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2FsaWFzIHB5dGhvbjM9cHl0aG9uMy4xMScgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2FsaWFzIHBpcDM9cGlwMy4xMScgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXFwnYWxpYXM9cHl0aG9uMz1weXRob24zLjExXFwnID4+IH4vLmJhc2hyYycsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFxcJ2FsaWFzIHBpcDM9cGlwMy4xMVxcJyA+PiB+Ly5iYXNocmMnLFxuICAgICAgICAgICAgICAgICAgICAncHl0aG9uMy4xMSAtbSBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwIDI+JjEnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIlB5dGhvbiBhbmQgUGlwIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ3B5dGhvbjMuMTEgLS12ZXJzaW9uJyxcbiAgICAgICAgICAgICAgICAgICAgJ3B5dGhvbjMuMTEgLW0gcGlwIC0tdmVyc2lvbiAyPiYxJyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgLy8gYWRkIGdvLCBkb3RuZXRcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxBV1NDTEknLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnY3VybCAtZnNTTCBodHRwczovL2F3c2NsaS5hbWF6b25hd3MuY29tL2F3c2NsaS1leGUtbGludXgtJCh1bmFtZSAtbSkuemlwIC1vIC90bXAvYXdzLWNsaS56aXAnLFxuICAgICAgICAgICAgICAgICAgICAndW56aXAgLXEgLWQgL3RtcCAvdG1wL2F3cy1jbGkuemlwJyxcbiAgICAgICAgICAgICAgICAgICAgJ3N1ZG8gL3RtcC9hd3MvaW5zdGFsbCcsXG4gICAgICAgICAgICAgICAgICAgICdybSAtcmYgL3RtcC9hd3MnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIkFXUyBDTEkgaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICAnYXdzIC0tdmVyc2lvbicsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdDb25maWd1cmVDb2RlU2VydmVyJyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgYGV4cG9ydCBIT01FPS9ob21lLyR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICAnY3VybCAtZnNTTCBodHRwczovL2NvZGUtc2VydmVyLmRldi9pbnN0YWxsLnNoIHwgYmFzaCAtcyAtLSAyPiYxJyxcbiAgICAgICAgICAgICAgICAgICAgYHN5c3RlbWN0bCBlbmFibGUgLS1ub3cgY29kZS1zZXJ2ZXJAJHt2c0NvZGVVc2VyfSAyPiYxYCxcbiAgICAgICAgICAgICAgICAgICAgYHRlZSAvZXRjL25naW54L2NvbmYuZC9jb2RlLXNlcnZlci5jb25mIDw8RU9GXG5zZXJ2ZXIge1xuICAgIGxpc3RlbiA4MDtcbiAgICBsaXN0ZW4gWzo6XTo4MDtcbiAgICAjIHNlcnZlcl9uYW1lIGRpc3RyaWJ1dGlvbi5kaXN0cmlidXRpb25Eb21haW5OYW1lO1xuICAgIHNlcnZlcl9uYW1lICouY2xvdWRmcm9udC5uZXQ7XG4gICAgbG9jYXRpb24gLyB7XG4gICAgICBwcm94eV9wYXNzIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC87XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIEhvc3QgXFxcXCRob3N0O1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBVcGdyYWRlIFxcXFwkaHR0cF91cGdyYWRlO1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBDb25uZWN0aW9uIHVwZ3JhZGU7XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIEFjY2VwdC1FbmNvZGluZyBnemlwO1xuICAgIH1cbiAgICBsb2NhdGlvbiAvJHtkZXZTZXJ2ZXJCYXNlUGF0aH0ge1xuICAgICAgcHJveHlfcGFzcyBodHRwOi8vbG9jYWxob3N0OiR7ZGV2U2VydmVyUG9ydH0vJHtkZXZTZXJ2ZXJCYXNlUGF0aH07XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIEhvc3QgXFxcXCRob3N0O1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBVcGdyYWRlIFxcXFwkaHR0cF91cGdyYWRlO1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBDb25uZWN0aW9uIHVwZ3JhZGU7XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIEFjY2VwdC1FbmNvZGluZyBnemlwO1xuICAgIH1cbn1cbkVPRmAsXG4gICAgICAgICAgICAgICAgICAgIGBta2RpciAtcCAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5jb25maWcvY29kZS1zZXJ2ZXJgLFxuICAgICAgICAgICAgICAgICAgICBgdGVlIC9ob21lLyR7dnNDb2RlVXNlcn0vLmNvbmZpZy9jb2RlLXNlcnZlci9jb25maWcueWFtbCA8PEVPRlxuY2VydDogZmFsc2VcbmF1dGg6IHBhc3N3b3JkXG5oYXNoZWQtcGFzc3dvcmQ6IFwiJChlY2hvIC1uIHt7IFZTQ29kZVBhc3N3b3JkIH19IHwgYXJnb24yICQob3BlbnNzbCByYW5kIC1iYXNlNjQgMTIpIC1lKVwiXG5FT0ZgLFxuICAgICAgICAgICAgICAgICAgICBgbWtkaXIgLXAgL2hvbWUvJHt2c0NvZGVVc2VyfS8ubG9jYWwvc2hhcmUvY29kZS1zZXJ2ZXIvVXNlci9gLFxuICAgICAgICAgICAgICAgICAgICBgdG91Y2ggL2hvbWUvJHt2c0NvZGVVc2VyfS8uaHVzaGxvZ2luYCxcbiAgICAgICAgICAgICAgICAgICAgYG1rZGlyIC1wICR7aG9tZUZvbGRlcn0gJiYgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9ICR7aG9tZUZvbGRlcn1gLFxuICAgICAgICAgICAgICAgICAgICBgdGVlIC9ob21lLyR7dnNDb2RlVXNlcn0vLmxvY2FsL3NoYXJlL2NvZGUtc2VydmVyL1VzZXIvc2V0dGluZ3MuanNvbiA8PEVPRlxue1xuICBcImV4dGVuc2lvbnMuYXV0b1VwZGF0ZVwiOiBmYWxzZSxcbiAgXCJleHRlbnNpb25zLmF1dG9DaGVja1VwZGF0ZXNcIjogZmFsc2UsXG4gIFwidGVsZW1ldHJ5LnRlbGVtZXRyeUxldmVsXCI6IFwib2ZmXCIsXG4gIFwic2VjdXJpdHkud29ya3NwYWNlLnRydXN0LnN0YXJ0dXBQcm9tcHRcIjogXCJuZXZlclwiLFxuICBcInNlY3VyaXR5LndvcmtzcGFjZS50cnVzdC5lbmFibGVkXCI6IGZhbHNlLFxuICBcInNlY3VyaXR5LndvcmtzcGFjZS50cnVzdC5iYW5uZXJcIjogXCJuZXZlclwiLFxuICBcInNlY3VyaXR5LndvcmtzcGFjZS50cnVzdC5lbXB0eVdpbmRvd1wiOiBmYWxzZSxcbiAgXCJweXRob24udGVzdGluZy5weXRlc3RFbmFibGVkXCI6IHRydWUsXG4gIFwiYXV0by1ydW4tY29tbWFuZC5ydWxlc1wiOiBbXG4gICAge1xuICAgICAgXCJjb21tYW5kXCI6IFwid29ya2JlbmNoLmFjdGlvbi50ZXJtaW5hbC5uZXdcIlxuICAgIH1cbiAgXVxufVxuRU9GYCxcbiAgICAgICAgICAgICAgICAgICAgYGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgYHN5c3RlbWN0bCByZXN0YXJ0IGNvZGUtc2VydmVyQCR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICAnc3lzdGVtY3RsIHJlc3RhcnQgbmdpbngnLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IC0tbG9naW4gY29kZS1zZXJ2ZXIgLS1pbnN0YWxsLWV4dGVuc2lvbiBBbWF6b25XZWJTZXJ2aWNlcy5hd3MtdG9vbGtpdC12c2NvZGUgLS1mb3JjZWAsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gLS1sb2dpbiBjb2RlLXNlcnZlciAtLWluc3RhbGwtZXh0ZW5zaW9uIEFtYXpvbldlYlNlcnZpY2VzLmFtYXpvbi1xLXZzY29kZSAtLWZvcmNlYCxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSAtLWxvZ2luIGNvZGUtc2VydmVyIC0taW5zdGFsbC1leHRlbnNpb24gc3luZWRyYS5hdXRvLXJ1bi1jb21tYW5kIC0tZm9yY2VgLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IC0tbG9naW4gY29kZS1zZXJ2ZXIgLS1pbnN0YWxsLWV4dGVuc2lvbiB2c2NqYXZhLnZzY29kZS1qYXZhLXBhY2sgLS1mb3JjZWAsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gLS1sb2dpbiBjb2RlLXNlcnZlciAtLWluc3RhbGwtZXh0ZW5zaW9uIG1zLXZzY29kZS5saXZlLXNlcnZlciAtLWZvcmNlYCxcbiAgICAgICAgICAgICAgICAgICAgYGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJOZ2lueCBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICduZ2lueCAtdCAyPiYxJyxcbiAgICAgICAgICAgICAgICAgICAgJ3N5c3RlbWN0bCBzdGF0dXMgbmdpbngnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIkNvZGVTZXJ2ZXIgaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICAnY29kZS1zZXJ2ZXIgLXYnLFxuICAgICAgICAgICAgICAgICAgICBgc3lzdGVtY3RsIHN0YXR1cyBjb2RlLXNlcnZlckAke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ1VwZGF0ZVByb2ZpbGUnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBMQU5HPWVuX1VTLnV0Zi04ID4+IC9ldGMvZW52aXJvbm1lbnQnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBMQ19BTEw9ZW5fVVMuVVRGLTggPj4gL2V0Yy9lbnZpcm9ubWVudCcsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdQQVRIPSRQQVRIOi9ob21lLyR7dnNDb2RlVXNlcn0vLmxvY2FsL2JpbicgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2V4cG9ydCBQQVRIJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IEFXU19SRUdJT049JHtTdGFjay5vZihzY29wZSkucmVnaW9ufScgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2V4cG9ydCBBV1NfQUNDT1VOVElEPSR7U3RhY2sub2Yoc2NvcGUpLmFjY291bnR9JyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IE5FWFRfVEVMRU1FVFJZX0RJU0FCTEVEPTEnID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvIFwiZXhwb3J0IFBTMT0nXFxcXFtcXFxcMDMzWzAxOzMybVxcXFxdXFxcXHU6XFxcXFtcXFxcMDMzWzAxOzM0bVxcXFxdXFxcXHdcXFxcW1xcXFwwMzNbMDBtXFxcXF1cXFxcJCAnXCIgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxDREsnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnbnBtIGluc3RhbGwgLWcgYXdzLWNkaycsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiQVdTIENESyBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICdjZGsgLS12ZXJzaW9uJyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBMaW51eCBmbGF2b3I6ICR7bGludXhGbGF2b3J9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNzbURvY3VtZW50O1xuICB9XG59XG5cbmludGVyZmFjZSBDdXN0b21SZXNvdXJjZUluc3RhbGxlck9wdGlvbnMgZXh0ZW5kcyBJbnN0YWxsZXJPcHRpb25zIHt9XG5cbmNsYXNzIEN1c3RvbVJlc291cmNlSW5zdGFsbGVyIGV4dGVuZHMgSW5zdGFsbGVyIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgb3B0aW9uczogQ3VzdG9tUmVzb3VyY2VJbnN0YWxsZXJPcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGNvbnN0IG9uRXZlbnQ6IEZ1bmN0aW9uID0gbmV3IEluc3RhbGxlckZ1bmN0aW9uKHNjb3BlLCAnSW5zdGFsbGVyT25FdmVudEhhbmRsZXInLCB7XG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDMwMCksIC8vIFRPRE8gY29uZmlndXJhYmxlXG4gICAgICBtZW1vcnlTaXplOiA1MTIsIC8vIFRPRE8gY29uZmlndXJhYmxlXG4gICAgfSk7XG4gICAgTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFtcbiAgICAgIG9uRXZlbnQsXG4gICAgXSwgW1xuICAgICAgeyBpZDogJ0F3c1NvbHV0aW9ucy1JQU00JywgcmVhc29uOiAnRm9yIHRoaXMgZXZlbnQgaGFuZGxlciB3ZSBkbyBub3QgbmVlZCB0byByZXN0cmljdCBtYW5hZ2VkIHBvbGljaWVzJyB9LFxuICAgICAgeyBpZDogJ0F3c1NvbHV0aW9ucy1MMScsIHJlYXNvbjogJ0ZvciB0aGlzIGxhbWJkYSB0aGUgbGF0ZXN0IHJ1bnRpbWUgaXMgbm90IG5lZWRlZCcgfSxcbiAgICBdLCB0cnVlKTtcblxuICAgIGNvbnN0IGRvY3VtZW50QXJuID0gQXJuLmZvcm1hdCh7XG4gICAgICBzZXJ2aWNlOiAnc3NtJyxcbiAgICAgIHJlc291cmNlOiAnZG9jdW1lbnQnLFxuICAgICAgcmVzb3VyY2VOYW1lOiBvcHRpb25zLmRvY3VtZW50TmFtZSxcbiAgICB9LCBTdGFjay5vZihzY29wZSkpO1xuXG4gICAgY29uc3QgY3dNYW5hZ2VBZ2VudEFybiA9IEFybi5mb3JtYXQoe1xuICAgICAgc2VydmljZTogJ3NzbScsXG4gICAgICByZXNvdXJjZTogJ2RvY3VtZW50JyxcbiAgICAgIHJlc291cmNlTmFtZTogJ0FtYXpvbkNsb3VkV2F0Y2gtTWFuYWdlQWdlbnQnLFxuICAgIH0sIFN0YWNrLm9mKHNjb3BlKSk7XG5cbiAgICBjb25zdCB0YXJnZXRFYzJJbnN0YW5jZUFybiA9IEFybi5mb3JtYXQoe1xuICAgICAgc2VydmljZTogJ2VjMicsXG4gICAgICByZXNvdXJjZTogJ2luc3RhbmNlJyxcbiAgICAgIHJlc291cmNlTmFtZTogb3B0aW9ucy5pbnN0YW5jZUlkLFxuICAgIH0sIFN0YWNrLm9mKHNjb3BlKSk7XG5cbiAgICBvbkV2ZW50LmFkZFRvUm9sZVBvbGljeShuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgJ3NzbTpTZW5kQ29tbWFuZCcsXG4gICAgICBdLFxuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIGRvY3VtZW50QXJuLFxuICAgICAgICBjd01hbmFnZUFnZW50QXJuLFxuICAgICAgICB0YXJnZXRFYzJJbnN0YW5jZUFybixcbiAgICAgIF0sXG4gICAgfSkpO1xuXG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgUHJvdmlkZXIoc2NvcGUsICdJbnN0YWxsZXJQcm92aWRlcicsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyOiBvbkV2ZW50LFxuICAgIH0pO1xuICAgIE5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhbXG4gICAgICBwcm92aWRlcixcbiAgICBdLCBbXG4gICAgICB7IGlkOiAnQXdzU29sdXRpb25zLUlBTTQnLCByZWFzb246ICdGb3IgdGhpcyBwcm92aWRlciB3ZSBkbyBub3QgbmVlZCB0byByZXN0cmljdCBtYW5hZ2VkIHBvbGljaWVzJyB9LFxuICAgICAgeyBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JywgcmVhc29uOiAnRm9yIHRoaXMgcHJvdmlkZXIgd2lsZGNhcmRzIGFyZSBmaW5lJyB9LFxuICAgICAgeyBpZDogJ0F3c1NvbHV0aW9ucy1MMScsIHJlYXNvbjogJ0ZvciB0aGlzIHByb3ZpZGVyIHRoZSBsYXRlc3QgcnVudGltZSBpcyBub3QgbmVlZGVkJyB9LFxuICAgIF0sIHRydWUpO1xuXG4gICAgbmV3IEN1c3RvbVJlc291cmNlKHNjb3BlLCAnU1NNSW5zdGFsbGVyQ3VzdG9tUmVzb3VyY2UnLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgU2VydmljZVRpbWVvdXQ6IDMwNSwgLy8gVE9ETyBjb25maWd1cmFibGVcbiAgICAgICAgSW5zdGFuY2VJZDogb3B0aW9ucy5pbnN0YW5jZUlkLFxuICAgICAgICBEb2N1bWVudE5hbWU6IG9wdGlvbnMuZG9jdW1lbnROYW1lLFxuICAgICAgICBDbG91ZFdhdGNoTG9nR3JvdXBOYW1lOiBvcHRpb25zLmNsb3VkV2F0Y2hMb2dHcm91cE5hbWUsXG4gICAgICAgIFZTQ29kZVBhc3N3b3JkOiBvcHRpb25zLnZzQ29kZVBhc3N3b3JkLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG5cbiAgcHVibGljIF9iaW5kKCkgeyB9XG59Il19
|
|
697
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2luc3RhbGxlci9pbnN0YWxsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBQXNEO0FBRXRELDJDQUEyQztBQUMzQywyQ0FBd0U7QUFDeEUsbUVBQXdEO0FBQ3hELHFDQUEwQztBQUUxQyw2REFBeUQ7QUFDekQsb0RBQW1EO0FBc0RuRCxNQUFzQixTQUFTO0lBQ3RCLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBeUI7UUFDNUMsT0FBTyxJQUFJLENBQUMsS0FBTSxTQUFRLFNBQVM7WUFDMUIsS0FBSyxDQUFDLEtBQWdCO2dCQUMzQixJQUFJLFlBQVksQ0FBQztnQkFDakIsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsaUJBQWlCLElBQUksS0FBSyxDQUFDO2dCQUM3RCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQztnQkFDcEQsSUFBSSxPQUFPLENBQUMsWUFBWSxJQUFJLE9BQU8sQ0FBQyxZQUFZLElBQUksRUFBRSxFQUFFLENBQUM7b0JBQ3ZELFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO2dCQUN0QyxDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUNyQyxLQUFLLEVBQ0wsaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixPQUFPLENBQUMsVUFBVSxFQUNsQixPQUFPLENBQUMsVUFBVSxFQUNsQiwrQkFBZSxDQUFDLFNBQVMsQ0FDMUIsQ0FBQztvQkFDRixZQUFZLEdBQUcsUUFBUSxDQUFDLElBQUssQ0FBQztnQkFDaEMsQ0FBQztnQkFFRCxNQUFNLHNCQUFzQixHQUMxQixPQUFPLENBQUMsc0JBQXNCLElBQUksWUFBWSxZQUFZLEVBQUUsQ0FBQztnQkFFL0QsTUFBTSxTQUFTLEdBQUcsSUFBSSx1QkFBdUIsQ0FBQyxLQUFLLEVBQUU7b0JBQ25ELFVBQVUs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QyxLQUFLLEVBQUUsbUJBQW1CLEVBQUU7WUFDeEQsY0FBYyxFQUFFLE9BQU87U0FDeEIsQ0FBQyxDQUFDO1FBQ0gseUJBQWUsQ0FBQyx1QkFBdUIsQ0FDckMsQ0FBQyxRQUFRLENBQUMsRUFDVjtZQUNFO2dCQUNFLEVBQUUsRUFBRSxtQkFBbUI7Z0JBQ3ZCLE1BQU0sRUFDSiwrREFBK0Q7YUFDbEU7WUFDRDtnQkFDRSxFQUFFLEVBQUUsbUJBQW1CO2dCQUN2QixNQUFNLEVBQUUsc0NBQXNDO2FBQy9DO1lBQ0Q7Z0JBQ0UsRUFBRSxFQUFFLGlCQUFpQjtnQkFDckIsTUFBTSxFQUFFLG9EQUFvRDthQUM3RDtTQUNGLEVBQ0QsSUFBSSxDQUNMLENBQUM7UUFFRixJQUFJLHFCQUFjLENBQUMsS0FBSyxFQUFFLDRCQUE0QixFQUFFO1lBQ3RELFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWTtZQUNuQyxVQUFVLEVBQUU7Z0JBQ1YsY0FBYyxFQUFFLEdBQUcsRUFBRSxvQkFBb0I7Z0JBQ3pDLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtnQkFDOUIsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO2dCQUNsQyxzQkFBc0IsRUFBRSxPQUFPLENBQUMsc0JBQXNCO2dCQUN0RCxjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWM7YUFDdkM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSyxLQUFJLENBQUM7Q0FDbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHsgRnVuY3Rpb24gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0ICogYXMgc3NtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc3NtXCI7XG5pbXBvcnQgeyBBcm4sIEN1c3RvbVJlc291cmNlLCBEdXJhdGlvbiwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWIvY29yZVwiO1xuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tIFwiYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlc1wiO1xuaW1wb3J0IHsgTmFnU3VwcHJlc3Npb25zIH0gZnJvbSBcImNkay1uYWdcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBJbnN0YWxsZXJGdW5jdGlvbiB9IGZyb20gXCIuL2luc3RhbGxlci1mdW5jdGlvblwiO1xuaW1wb3J0IHsgTGludXhGbGF2b3JUeXBlIH0gZnJvbSBcIi4uL3ZzY29kZS1zZXJ2ZXJcIjtcblxuaW50ZXJmYWNlIEluc3RhbGxlck9wdGlvbnNCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBlYzIgaW5zdGFuY2UgaWQgdG8gaW5zdGFsbCB0aGUgc3NtIGRvY3VtZW50IG9uXG4gICAqL1xuICByZWFkb25seSBpbnN0YW5jZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjdXN0b20gc3NtIGRvY3VtZW50IHRvIGluc3RhbGwuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBzc20gZG9jdW1lbnQgb2YgdGhlIGNvbnN0cnVjdFxuICAgKi9cbiAgcmVhZG9ubHkgZG9jdW1lbnROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY2xvdWR3YXRjaCBsb2cgZ3JvdXAgZm9yIHRoZSBpbnN0YWxsIGxvZ3NcbiAgICpcbiAgICogQGRlZmF1bHQgL2F3cy9zc20vJHtkb2N1bWVudE5hbWV9XG4gICAqL1xuICByZWFkb25seSBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgdXNlciB1bmRlciB3aGljaCB0aGUgdnNjb2RlIHNlcnZlciBydW5zXG4gICAqL1xuICByZWFkb25seSB2c0NvZGVVc2VyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXNzd29yZCBvZiB0aGUgdXNlciB1bmRlciB3aGljaCB0aGUgdnNjb2RlIHNlcnZlciBydW5zXG4gICAqL1xuICByZWFkb25seSB2c0NvZGVQYXNzd29yZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaG9tZSBmb2xkZXIgb2YgdGhlIHVzZXIgdW5kZXIgd2hpY2ggdGhlIHZzY29kZSBzZXJ2ZXIgcnVuc1xuICAgKi9cbiAgcmVhZG9ubHkgaG9tZUZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSByZXN0IHBhdGggdnMgY29kZSBzZXJ2ZXIgd2lsbCBydW5cbiAgICpcbiAgICogQGRlZmF1bHQgYXBwXG4gICAqL1xuICByZWFkb25seSBkZXZTZXJ2ZXJCYXNlUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBvcnQgdnNjb2RlciBzZXJ2ZXIgd2lsbCBiZSBzZXJ2ZWQgaW4gdGhlIGluc3RhbmNlXG4gICAqXG4gICAqIEBkZWZhdWx0IDgwODFcbiAgICovXG4gIHJlYWRvbmx5IGRldlNlcnZlclBvcnQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGFsbGVyT3B0aW9ucyBleHRlbmRzIEluc3RhbGxlck9wdGlvbnNCYXNlIHt9XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBJbnN0YWxsZXIge1xuICBwdWJsaWMgc3RhdGljIHVidW50dShvcHRpb25zOiBJbnN0YWxsZXJPcHRpb25zKTogSW5zdGFsbGVyIHtcbiAgICByZXR1cm4gbmV3IChjbGFzcyBleHRlbmRzIEluc3RhbGxlciB7XG4gICAgICBwdWJsaWMgX2JpbmQoc2NvcGU6IENvbnN0cnVjdCk6IEluc3RhbGxlciB7XG4gICAgICAgIGxldCBkb2N1bWVudE5hbWU7XG4gICAgICAgIGNvbnN0IGRldlNlcnZlckJhc2VQYXRoID0gb3B0aW9ucy5kZXZTZXJ2ZXJCYXNlUGF0aCA/PyBcImFwcFwiO1xuICAgICAgICBjb25zdCBkZXZTZXJ2ZXJQb3J0ID0gb3B0aW9ucy5kZXZTZXJ2ZXJQb3J0ID8/IDgwODE7XG4gICAgICAgIGlmIChvcHRpb25zLmRvY3VtZW50TmFtZSAmJiBvcHRpb25zLmRvY3VtZW50TmFtZSAhPSBcIlwiKSB7XG4gICAgICAgICAgZG9jdW1lbnROYW1lID0gb3B0aW9ucy5kb2N1bWVudE5hbWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZG9jdW1lbnQgPSB0aGlzLmNyZWF0ZVNTTURvY3VtZW50KFxuICAgICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgICBkZXZTZXJ2ZXJCYXNlUGF0aCxcbiAgICAgICAgICAgIGRldlNlcnZlclBvcnQsXG4gICAgICAgICAgICBvcHRpb25zLnZzQ29kZVVzZXIsXG4gICAgICAgICAgICBvcHRpb25zLmhvbWVGb2xkZXIsXG4gICAgICAgICAgICBMaW51eEZsYXZvclR5cGUuVUJVTlRVXzIyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZG9jdW1lbnROYW1lID0gZG9jdW1lbnQubmFtZSE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lID1cbiAgICAgICAgICBvcHRpb25zLmNsb3VkV2F0Y2hMb2dHcm91cE5hbWUgPz8gYC9hd3Mvc3NtLyR7ZG9jdW1lbnROYW1lfWA7XG5cbiAgICAgICAgY29uc3QgaW5zdGFsbGVyID0gbmV3IEN1c3RvbVJlc291cmNlSW5zdGFsbGVyKHNjb3BlLCB7XG4gICAgICAgICAgaW5zdGFuY2VJZDogb3B0aW9ucy5pbnN0YW5jZUlkLFxuICAgICAgICAgIGRvY3VtZW50TmFtZTogZG9jdW1lbnROYW1lLFxuICAgICAgICAgIGNsb3VkV2F0Y2hMb2dHcm91cE5hbWU6IGNsb3VkV2F0Y2hMb2dHcm91cE5hbWUsXG4gICAgICAgICAgdnNDb2RlVXNlcjogb3B0aW9ucy52c0NvZGVVc2VyLFxuICAgICAgICAgIHZzQ29kZVBhc3N3b3JkOiBvcHRpb25zLnZzQ29kZVBhc3N3b3JkLFxuICAgICAgICAgIGhvbWVGb2xkZXI6IG9wdGlvbnMuaG9tZUZvbGRlcixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGluc3RhbGxlcjtcbiAgICAgIH1cbiAgICB9KSgpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBhbWF6b25MaW51eDIwMjMob3B0aW9uczogSW5zdGFsbGVyT3B0aW9ucyk6IEluc3RhbGxlciB7XG4gICAgcmV0dXJuIG5ldyAoY2xhc3MgZXh0ZW5kcyBJbnN0YWxsZXIge1xuICAgICAgcHVibGljIF9iaW5kKHNjb3BlOiBDb25zdHJ1Y3QpOiBJbnN0YWxsZXIge1xuICAgICAgICBsZXQgZG9jdW1lbnROYW1lO1xuICAgICAgICBjb25zdCBkZXZTZXJ2ZXJCYXNlUGF0aCA9IG9wdGlvbnMuZGV2U2VydmVyQmFzZVBhdGggPz8gXCJhcHBcIjtcbiAgICAgICAgY29uc3QgZGV2U2VydmVyUG9ydCA9IG9wdGlvbnMuZGV2U2VydmVyUG9ydCA/PyA4MDgxO1xuICAgICAgICBpZiAob3B0aW9ucy5kb2N1bWVudE5hbWUgJiYgb3B0aW9ucy5kb2N1bWVudE5hbWUgIT0gXCJcIikge1xuICAgICAgICAgIGRvY3VtZW50TmFtZSA9IG9wdGlvbnMuZG9jdW1lbnROYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gdGhpcy5jcmVhdGVTU01Eb2N1bWVudChcbiAgICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgICAgZGV2U2VydmVyQmFzZVBhdGgsXG4gICAgICAgICAgICBkZXZTZXJ2ZXJQb3J0LFxuICAgICAgICAgICAgb3B0aW9ucy52c0NvZGVVc2VyLFxuICAgICAgICAgICAgb3B0aW9ucy5ob21lRm9sZGVyLFxuICAgICAgICAgICAgTGludXhGbGF2b3JUeXBlLkFNQVpPTl9MSU5VWF8yMDIzLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZG9jdW1lbnROYW1lID0gZG9jdW1lbnQubmFtZSE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lID1cbiAgICAgICAgICBvcHRpb25zLmNsb3VkV2F0Y2hMb2dHcm91cE5hbWUgPz8gYC9hd3Mvc3NtLyR7ZG9jdW1lbnROYW1lfWA7XG5cbiAgICAgICAgY29uc3QgaW5zdGFsbGVyID0gbmV3IEN1c3RvbVJlc291cmNlSW5zdGFsbGVyKHNjb3BlLCB7XG4gICAgICAgICAgaW5zdGFuY2VJZDogb3B0aW9ucy5pbnN0YW5jZUlkLFxuICAgICAgICAgIGRvY3VtZW50TmFtZTogZG9jdW1lbnROYW1lLFxuICAgICAgICAgIGNsb3VkV2F0Y2hMb2dHcm91cE5hbWU6IGNsb3VkV2F0Y2hMb2dHcm91cE5hbWUsXG4gICAgICAgICAgdnNDb2RlVXNlcjogb3B0aW9ucy52c0NvZGVVc2VyLFxuICAgICAgICAgIHZzQ29kZVBhc3N3b3JkOiBvcHRpb25zLnZzQ29kZVBhc3N3b3JkLFxuICAgICAgICAgIGhvbWVGb2xkZXI6IG9wdGlvbnMuaG9tZUZvbGRlcixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGluc3RhbGxlcjtcbiAgICAgIH1cbiAgICB9KSgpO1xuICB9XG5cbiAgcHVibGljIGluc3RhbmNlSWQhOiBzdHJpbmc7XG4gIHB1YmxpYyBkb2N1bWVudE5hbWUhOiBzdHJpbmc7XG4gIHB1YmxpYyBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lITogc3RyaW5nO1xuICBwdWJsaWMgdnNDb2RlUGFzc3dvcmQhOiBzdHJpbmc7XG4gIHB1YmxpYyB2c0NvZGVQYXNzd29yZFRlc3QhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgX2JpbmQoc2NvcGU6IENvbnN0cnVjdCk6IGFueTtcblxuICBwcml2YXRlIGNyZWF0ZVNTTURvY3VtZW50KFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgZGV2U2VydmVyQmFzZVBhdGg6IHN0cmluZyxcbiAgICBkZXZTZXJ2ZXJQb3J0OiBudW1iZXIsXG4gICAgdnNDb2RlVXNlcjogc3RyaW5nLFxuICAgIGhvbWVGb2xkZXI6IHN0cmluZyxcbiAgICBsaW51eEZsYXZvcjogTGludXhGbGF2b3JUeXBlLFxuICApOiBzc20uQ2ZuRG9jdW1lbnQge1xuICAgIGxldCBzc21Eb2N1bWVudDogc3NtLkNmbkRvY3VtZW50O1xuICAgIHN3aXRjaCAobGludXhGbGF2b3IpIHtcbiAgICAgIGNhc2UgTGludXhGbGF2b3JUeXBlLlVCVU5UVV8yMjpcbiAgICAgIGNhc2UgTGludXhGbGF2b3JUeXBlLlVCVU5UVV8yNDpcbiAgICAgICAgLy8gQ3JlYXRlIGFuIFNTTSBkb2N1bWVudCB3aXRoIG11bHRpcGxlIGFjdGlvbnMgdG8gaW5zdGFsbCB0aGUgc29mdHdhcmVcbiAgICAgICAgc3NtRG9jdW1lbnQgPSBuZXcgc3NtLkNmbkRvY3VtZW50KHNjb3BlLCBcInNzbS1kb2N1bWVudC11YnVudHVcIiwge1xuICAgICAgICAgIG5hbWU6IGB2c2NvZGUtc2VydmVyLXVidW50dS0ke1N0YWNrLm9mKHNjb3BlKS5zdGFja05hbWV9YCxcbiAgICAgICAgICBkb2N1bWVudFR5cGU6IFwiQ29tbWFuZFwiLFxuICAgICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICAgIHNjaGVtYVZlcnNpb246IFwiMi4yXCIsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJCb290c3RyYXAgVlNDb2RlIGNvZGUtc2VydmVyIGluc3RhbmNlXCIsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgIFZTQ29kZVBhc3N3b3JkOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBTdGFjay5vZihzY29wZSkuc3RhY2tJZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgTm9kZVZlcnNpb246IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFwiMjBcIixcbiAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCIyMlwiLCBcIjIwXCIsIFwiMThcIl0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIERvdE5ldFZlcnNpb246IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFwiOC4wXCIsXG4gICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiOC4wXCIsIFwiNy4wXCJdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIGFsbCBtYWluU3RlcHMgc2NyaXB0cyBhcmUgaW4gaW4gL3Zhci9saWIvYW1hem9uL3NzbS88aW5zdGFuY2VpZD4vZG9jdW1lbnQvb3JjaGVzdHJhdGlvbi88dXVpZD4vPFN0ZXBOYW1lPi9fc2NyaXB0LnNoXG4gICAgICAgICAgICBtYWluU3RlcHM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogXCJhd3M6Y29uZmlndXJlUGFja2FnZVwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwiSW5zdGFsbENsb3VkV2F0Y2hBZ2VudFwiLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgbmFtZTogXCJBbWF6b25DbG91ZFdhdGNoQWdlbnRcIixcbiAgICAgICAgICAgICAgICAgIGFjdGlvbjogXCJJbnN0YWxsXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogXCJhd3M6cnVuRG9jdW1lbnRcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbmZpZ3VyZUNsb3VkV2F0Y2hBZ2VudFwiLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgZG9jdW1lbnRUeXBlOiBcIlNTTURvY3VtZW50XCIsXG4gICAgICAgICAgICAgICAgICBkb2N1bWVudFBhdGg6IFwiQW1hem9uQ2xvdWRXYXRjaC1NYW5hZ2VBZ2VudFwiLFxuICAgICAgICAgICAgICAgICAgZG9jdW1lbnRQYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogXCJjb25maWd1cmVcIixcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogXCJlYzJcIixcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxDb25maWd1cmF0aW9uU291cmNlOiBcImRlZmF1bHRcIixcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxSZXN0YXJ0OiBcInllc1wiLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBcImF3czpydW5TaGVsbFNjcmlwdFwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwiSW5zdGFsbEFwdFBhY2thZ2VzQXB0XCIsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgIFwiIyEvYmluL2Jhc2hcIixcbiAgICAgICAgICAgICAgICAgICAgXCJhcHQtZ2V0IC1xIHVwZGF0ZSAmJiBERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUgYXB0LWdldCBpbnN0YWxsIC15IC1xIGFwdC11dGlsc1wiLFxuICAgICAgICAgICAgICAgICAgICBcImFwdC1nZXQgLXEgdXBkYXRlICYmIERFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSBhcHQtZ2V0IGluc3RhbGwgLXkgLXEgbmVlZHJlc3RhcnQgdW5hdHRlbmRlZC11cGdyYWRlc1wiLFxuICAgICAgICAgICAgICAgICAgICBcInNlZCAtaSAncy8jJG5yY29uZntrZXJuZWxoaW50c30gPSAtMTsvJG5yY29uZntrZXJuZWxoaW50c30gPSAwOy8nIC9ldGMvbmVlZHJlc3RhcnQvbmVlZHJlc3RhcnQuY29uZlwiLFxuICAgICAgICAgICAgICAgICAgICBcInNlZCAtaSAncy8jJG5yY29uZnt2ZXJib3NpdHl9ID0gMjsvJG5yY29uZnt2ZXJib3NpdHl9ID0gMDsvJyAvZXRjL25lZWRyZXN0YXJ0L25lZWRyZXN0YXJ0LmNvbmZcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzZWQgLWkgXFxcInMvI1xcJG5yY29uZntyZXN0YXJ0fSA9ICdpJzsvXFwkbnJjb25me3Jlc3RhcnR9ID0gJ2EnOy9cXFwiIC9ldGMvbmVlZHJlc3RhcnQvbmVlZHJlc3RhcnQuY29uZlwiLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIkFwdCBoZWxwZXIgcGFja2FnZXMgYWRkZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgIFwiY2F0IC9ldGMvbmVlZHJlc3RhcnQvbmVlZHJlc3RhcnQuY29uZlwiLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBcImF3czpydW5TaGVsbFNjcmlwdFwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwiSW5zdGFsbEJhc2VQYWNrYWdlc0FwdFwiLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICBcIiMhL2Jpbi9iYXNoXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiYXB0LWdldCAtcSB1cGRhdGUgJiYgREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgaW5zdGFsbCAteSAtcSBjdXJsIGdudXBnIHdob2lzIGFyZ29uMiBvcGVuc3NsIGxvY2FsZXMgbG9jYWxlcy1hbGwgdW56aXAgYXB0LXRyYW5zcG9ydC1odHRwcyBjYS1jZXJ0aWZpY2F0ZXMgc29mdHdhcmUtcHJvcGVydGllcy1jb21tb24gbmdpbnhcIixcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogXCJhd3M6cnVuU2hlbGxTY3JpcHRcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcIkFkZFVzZXJBcHRcIixcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgXCIjIS9iaW4vYmFzaFwiLFxuICAgICAgICAgICAgICAgICAgICBcImVjaG8gJ0FkZGluZyB1c2VyOiAke1ZTQ29kZVVzZXJ9J1wiLFxuICAgICAgICAgICAgICAgICAgICBgYWRkdXNlciAtLWRpc2FibGVkLXBhc3N3b3JkIC0tZ2Vjb3MgJycgJHt2c0NvZGVVc2VyfWAsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvIFwiJHt2c0NvZGVVc2VyfTp7eyBWU0NvZGVQYXNzd29yZCB9fVwiIHwgY2hwYXNzd2RgLFxuICAgICAgICAgICAgICAgICAgICBgdXNlcm1vZCAtYUcgc3VkbyAke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgYHRlZSAvZXRjL3N1ZG9lcnMuZC85MS12c2NvZGUtdXNlciA8PEVPRlxuJHt2c0NvZGVVc2VyfSBBTEw9KEFMTCkgTk9QQVNTV0Q6QUxMXG5FT0ZgLFxuICAgICAgICAgICAgICAgICAgICBgbWtkaXIgLXAgL2hvbWUvJHt2c0NvZGVVc2VyfSAmJiBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gL2hvbWUvJHt2c0NvZGVVc2VyfWAsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiVXNlciBhZGRlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgYGdldGVudCBwYXNzd2QgJHt2c0NvZGVVc2VyfWAsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IFwiYXdzOnJ1blNoZWxsU2NyaXB0XCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJJbnN0YWxsTm9kZUFwdFwiLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICBcIiMhL2Jpbi9iYXNoXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiY3VybCAtZnNTTCBodHRwczovL2RlYi5ub2Rlc291cmNlLmNvbS9ncGdrZXkvbm9kZXNvdXJjZS1yZXBvLmdwZy5rZXkgfCBncGcgLS1kZWFybW9yIC1vIC91c3Ivc2hhcmUva2V5cmluZ3Mvbm9kZXNvdXJjZS5ncGdcIixcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJkZWIgW2FyY2g9JChkcGtnIC0tcHJpbnQtYXJjaGl0ZWN0dXJlKSBzaWduZWQtYnk9L3Vzci9zaGFyZS9rZXlyaW5ncy9ub2Rlc291cmNlLmdwZ10gaHR0cHM6Ly9kZWIubm9kZXNvdXJjZS5jb20vbm9kZV97eyBOb2RlVmVyc2lvbiB9fS54IG5vZGlzdHJvIG1haW5cIiA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL25vZGVzb3VyY2UubGlzdCcsXG4gICAgICAgICAgICAgICAgICAgIFwiYXB0LWdldCAtcSB1cGRhdGUgJiYgREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgaW5zdGFsbCAteSAtcSBub2RlanNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJucG0gaW5zdGFsbCAtZyBucG1AbGF0ZXN0XCIsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiTm9kZSBhbmQgbnBtIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgXCJub2RlIC12XCIsXG4gICAgICAgICAgICAgICAgICAgIFwibnBtIC12XCIsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IFwiYXdzOnJ1blNoZWxsU2NyaXB0XCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJJbnN0YWxsRG9ja2VyQXB0XCIsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgIFwiIyEvYmluL2Jhc2hcIixcbiAgICAgICAgICAgICAgICAgICAgXCJjdXJsIC1mc1NMIGh0dHBzOi8vZG93bmxvYWQuZG9ja2VyLmNvbS9saW51eC91YnVudHUvZ3BnIHwgZ3BnIC0tZGVhcm1vciAtbyAvdXNyL3NoYXJlL2tleXJpbmdzL2RvY2tlci1hcmNoaXZlLWtleXJpbmcuZ3BnXCIsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiZGViIFtzaWduZWQtYnk9L3Vzci9zaGFyZS9rZXlyaW5ncy9kb2NrZXItYXJjaGl2ZS1rZXlyaW5nLmdwZ10gaHR0cHM6Ly9kb3dubG9hZC5kb2NrZXIuY29tL2xpbnV4L3VidW50dSAkKGxzYl9yZWxlYXNlIC0tY29kZW5hbWUgLS1zaG9ydCkgc3RhYmxlXCIgPiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kb2NrZXIubGlzdCcsXG4gICAgICAgICAgICAgICAgICAgIFwiYXB0LWdldCAtcSB1cGRhdGUgJiYgREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgaW5zdGFsbCAteSAtcSBkb2NrZXItY2UgZG9ja2VyLWNlLWNsaSBjb250YWluZXJkLmlvXCIsXG4gICAgICAgICAgICAgICAgICAgIGBzeXN0ZW1jdGwgcmVzdGFydCBjb2RlLXNlcnZlckAke3ZzQ29kZVVzZXJ9LnNlcnZpY2VgLFxuICAgICAgICAgICAgICAgICAgICBcInN5c3RlbWN0bCBzdGFydCBkb2NrZXIuc2VydmljZVwiLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIkRvY2tlciBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgIFwiZG9ja2VyIC0tdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgICAgICBcInN5c3RlbWN0bCBzdGF0dXMgZG9ja2VyLnNlcnZpY2VcIixcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogXCJhd3M6cnVuU2hlbGxTY3JpcHRcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcIkluc3RhbGxHaXRBcHRcIixcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgXCIjIS9iaW4vYmFzaFwiLFxuICAgICAgICAgICAgICAgICAgICBcImFkZC1hcHQtcmVwb3NpdG9yeSBwcGE6Z2l0LWNvcmUvcHBhXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiYXB0LWdldCAtcSB1cGRhdGUgJiYgREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgaW5zdGFsbCAteSAtcSBnaXRcIixcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIuZW1haWwgXCIke3ZzQ29kZVVzZXJ9QGV4YW1wbGUuY29tXCJgLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IGdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5uYW1lIFwiV29ya3Nob3AgJHt2c0NvZGVVc2VyfVwiYCxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgY29uZmlnIC0tZ2xvYmFsIGluaXQuZGVmYXVsdEJyYW5jaCBcIm1haW5cImAsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiR2l0IGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgXCJnaXQgLS12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IFwiYXdzOnJ1blNoZWxsU2NyaXB0XCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJJbnN0YWxsUHl0aG9uQXB0XCIsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgIC8vIFVidW50dSAyMiBkZWZhdWx0IGlzIFB5dGhvbiAzLjEwXG4gICAgICAgICAgICAgICAgICAgIC8vIFVidW50dSAyNCBkZWZhdWx0IGlzIFB5dGhvbiAzLjEyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IGluc3RhbGxlZCBQeXRob24gdmVyc2lvbiB3aWxsIG1hcCB0byBQeXRob24zXG4gICAgICAgICAgICAgICAgICAgIFwiIyEvYmluL2Jhc2hcIixcbiAgICAgICAgICAgICAgICAgICAgXCJhcHQtZ2V0IC1xIHVwZGF0ZSAmJiBERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUgYXB0LWdldCBpbnN0YWxsIC15IC1xIHB5dGhvbjMtcGlwIHB5dGhvbjMtdmVudiBweXRob24zLWJvdG8zIHB5dGhvbjMtcHl0ZXN0XCIsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdhbGlhcyBweXRlc3Q9cHl0ZXN0LTMnID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBzeXN0ZW1jdGwgcmVzdGFydCBjb2RlLXNlcnZlckAke3ZzQ29kZVVzZXJ9LnNlcnZpY2VgLFxuICAgICAgICAgICAgICAgICAgICBcInN5c3RlbWN0bCBzdGFydCBtdWx0aXBhdGhkLnNlcnZpY2UgcGFja2FnZWtpdC5zZXJ2aWNlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3lzdGVtY3RsIHJlc3RhcnQgdW5hdHRlbmRlZC11cGdyYWRlcy5zZXJ2aWNlXCIsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiUHl0aG9uIGFuZCBQaXAgaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICBcInB5dGhvbjMgLS12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwicGlwMyAtLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogXCJhd3M6cnVuU2hlbGxTY3JpcHRcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcIkluc3RhbGxBV1NDTElcIixcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgXCIjIS9iaW4vYmFzaFwiLFxuICAgICAgICAgICAgICAgICAgICBcImN1cmwgLWZzU0wgaHR0cHM6Ly9hd3NjbGkuYW1hem9uYXdzLmNvbS9hd3NjbGktZXhlLWxpbnV4LSQodW5hbWUgLW0pLnppcCAtbyAvdG1wL2F3cy1jbGkuemlwXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidW56aXAgLXEgLWQgL3RtcCAvdG1wL2F3cy1jbGkuemlwXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3VkbyAvdG1wL2F3cy9pbnN0YWxsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwicm0gLXJmIC90bXAvYXdzXCIsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiQVdTIENMSSBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgIFwiYXdzIC0tdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBcImF3czpydW5TaGVsbFNjcmlwdFwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29uZmlndXJlQ29kZVNlcnZlclwiLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICBcIiMhL2Jpbi9iYXNoXCIsXG4gICAgICAgICAgICAgICAgICAgIGBleHBvcnQgSE9NRT0vaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgXCJjdXJsIC1mc1NMIGh0dHBzOi8vY29kZS1zZXJ2ZXIuZGV2L2luc3RhbGwuc2ggfCBiYXNoIC1zIC0tIDI+JjFcIixcbiAgICAgICAgICAgICAgICAgICAgYHN5c3RlbWN0bCBlbmFibGUgLS1ub3cgY29kZS1zZXJ2ZXJAJHt2c0NvZGVVc2VyfSAyPiYxYCxcbiAgICAgICAgICAgICAgICAgICAgYHRlZSAvZXRjL25naW54L2NvbmYuZC9jb2RlLXNlcnZlci5jb25mIDw8RU9GXG5zZXJ2ZXIge1xuICAgIGxpc3RlbiA4MDtcbiAgICBsaXN0ZW4gWzo6XTo4MDtcbiAgICAjIHNlcnZlcl9uYW1lIGRpc3RyaWJ1dGlvbi5kaXN0cmlidXRpb25Eb21haW5OYW1lO1xuICAgIHNlcnZlcl9uYW1lICouY2xvdWRmcm9udC5uZXQ7XG4gICAgbG9jYXRpb24gLyB7XG4gICAgICBwcm94eV9wYXNzIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC87XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIEhvc3QgXFxcXCRob3N0O1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBVcGdyYWRlIFxcXFwkaHR0cF91cGdyYWRlO1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBDb25uZWN0aW9uIHVwZ3JhZGU7XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIEFjY2VwdC1FbmNvZGluZyBnemlwO1xuICAgIH1cbiAgICBsb2NhdGlvbiAvJHtkZXZTZXJ2ZXJCYXNlUGF0aH0ge1xuICAgICAgcHJveHlfcGFzcyBodHRwOi8vbG9jYWxob3N0OiR7ZGV2U2VydmVyUG9ydH0vJHtkZXZTZXJ2ZXJCYXNlUGF0aH07XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIEhvc3QgXFxcXCRob3N0O1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBVcGdyYWRlIFxcXFwkaHR0cF91cGdyYWRlO1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBDb25uZWN0aW9uIHVwZ3JhZGU7XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIEFjY2VwdC1FbmNvZGluZyBnemlwO1xuICAgIH1cbn1cbkVPRmAsXG4gICAgICAgICAgICAgICAgICAgIGBta2RpciAtcCAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5jb25maWcvY29kZS1zZXJ2ZXJgLFxuICAgICAgICAgICAgICAgICAgICBgdGVlIC9ob21lLyR7dnNDb2RlVXNlcn0vLmNvbmZpZy9jb2RlLXNlcnZlci9jb25maWcueWFtbCA8PEVPRlxuY2VydDogZmFsc2VcbmF1dGg6IHBhc3N3b3JkXG5oYXNoZWQtcGFzc3dvcmQ6IFwiJChlY2hvIC1uIHt7IFZTQ29kZVBhc3N3b3JkIH19IHwgYXJnb24yICQob3BlbnNzbCByYW5kIC1iYXNlNjQgMTIpIC1lKVwiXG5FT0ZgLFxuICAgICAgICAgICAgICAgICAgICBgbWtkaXIgLXAgL2hvbWUvJHt2c0NvZGVVc2VyfS8ubG9jYWwvc2hhcmUvY29kZS1zZXJ2ZXIvVXNlci9gLFxuICAgICAgICAgICAgICAgICAgICBgdG91Y2ggL2hvbWUvJHt2c0NvZGVVc2VyfS8uaHVzaGxvZ2luYCxcbiAgICAgICAgICAgICAgICAgICAgYG1rZGlyIC1wICR7aG9tZUZvbGRlcn0gJiYgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9ICR7aG9tZUZvbGRlcn1gLFxuICAgICAgICAgICAgICAgICAgICBgdGVlIC9ob21lLyR7dnNDb2RlVXNlcn0vLmxvY2FsL3NoYXJlL2NvZGUtc2VydmVyL1VzZXIvc2V0dGluZ3MuanNvbiA8PEVPRlxue1xuICBcImV4dGVuc2lvbnMuYXV0b1VwZGF0ZVwiOiBmYWxzZSxcbiAgXCJleHRlbnNpb25zLmF1dG9DaGVja1VwZGF0ZXNcIjogZmFsc2UsXG4gIFwidGVsZW1ldHJ5LnRlbGVtZXRyeUxldmVsXCI6IFwib2ZmXCIsXG4gIFwic2VjdXJpdHkud29ya3NwYWNlLnRydXN0LnN0YXJ0dXBQcm9tcHRcIjogXCJuZXZlclwiLFxuICBcInNlY3VyaXR5LndvcmtzcGFjZS50cnVzdC5lbmFibGVkXCI6IGZhbHNlLFxuICBcInNlY3VyaXR5LndvcmtzcGFjZS50cnVzdC5iYW5uZXJcIjogXCJuZXZlclwiLFxuICBcInNlY3VyaXR5LndvcmtzcGFjZS50cnVzdC5lbXB0eVdpbmRvd1wiOiBmYWxzZSxcbiAgXCJweXRob24udGVzdGluZy5weXRlc3RFbmFibGVkXCI6IHRydWUsXG4gIFwiYXV0by1ydW4tY29tbWFuZC5ydWxlc1wiOiBbXG4gICAge1xuICAgICAgXCJjb21tYW5kXCI6IFwid29ya2JlbmNoLmFjdGlvbi50ZXJtaW5hbC5uZXdcIlxuICAgIH1cbiAgXVxufVxuRU9GYCxcbiAgICAgICAgICAgICAgICAgICAgYGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgYHN5c3RlbWN0bCByZXN0YXJ0IGNvZGUtc2VydmVyQCR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICBcInN5c3RlbWN0bCByZXN0YXJ0IG5naW54XCIsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gLS1sb2dpbiBjb2RlLXNlcnZlciAtLWluc3RhbGwtZXh0ZW5zaW9uIEFtYXpvbldlYlNlcnZpY2VzLmF3cy10b29sa2l0LXZzY29kZSAtLWZvcmNlYCxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSAtLWxvZ2luIGNvZGUtc2VydmVyIC0taW5zdGFsbC1leHRlbnNpb24gQW1hem9uV2ViU2VydmljZXMuYW1hem9uLXEtdnNjb2RlIC0tZm9yY2VgLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IC0tbG9naW4gY29kZS1zZXJ2ZXIgLS1pbnN0YWxsLWV4dGVuc2lvbiBzeW5lZHJhLmF1dG8tcnVuLWNvbW1hbmQgLS1mb3JjZWAsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gLS1sb2dpbiBjb2RlLXNlcnZlciAtLWluc3RhbGwtZXh0ZW5zaW9uIHZzY2phdmEudnNjb2RlLWphdmEtcGFjayAtLWZvcmNlYCxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSAtLWxvZ2luIGNvZGUtc2VydmVyIC0taW5zdGFsbC1leHRlbnNpb24gbXMtdnNjb2RlLmxpdmUtc2VydmVyIC0tZm9yY2VgLFxuICAgICAgICAgICAgICAgICAgICBgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9IC9ob21lLyR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIk5naW54IGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgXCJuZ2lueCAtdCAyPiYxXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3lzdGVtY3RsIHN0YXR1cyBuZ2lueFwiLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIkNvZGVTZXJ2ZXIgaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICBcImNvZGUtc2VydmVyIC12XCIsXG4gICAgICAgICAgICAgICAgICAgIGBzeXN0ZW1jdGwgc3RhdHVzIGNvZGUtc2VydmVyQCR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBcImF3czpydW5TaGVsbFNjcmlwdFwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwiVXBkYXRlUHJvZmlsZVwiLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICBcIiMhL2Jpbi9iYXNoXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWNobyBMQU5HPWVuX1VTLnV0Zi04ID4+IC9ldGMvZW52aXJvbm1lbnRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlY2hvIExDX0FMTD1lbl9VUy5VVEYtOCA+PiAvZXRjL2Vudmlyb25tZW50XCIsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdQQVRIPSRQQVRIOi9ob21lLyR7dnNDb2RlVXNlcn0vLmxvY2FsL2JpbicgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2V4cG9ydCBQQVRIJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IEFXU19SRUdJT049JHtTdGFjay5vZihzY29wZSkucmVnaW9ufScgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2V4cG9ydCBBV1NfQUNDT1VOVElEPSR7U3RhY2sub2Yoc2NvcGUpLmFjY291bnR9JyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IE5FWFRfVEVMRU1FVFJZX0RJU0FCTEVEPTEnID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvIFwiZXhwb3J0IFBTMT0nXFxcXFtcXFxcMDMzWzAxOzMybVxcXFxdXFxcXHU6XFxcXFtcXFxcMDMzWzAxOzM0bVxcXFxdXFxcXHdcXFxcW1xcXFwwMzNbMDBtXFxcXF1cXFxcJCAnXCIgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogXCJhd3M6cnVuU2hlbGxTY3JpcHRcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcIkluc3RhbGxDREtcIixcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgXCIjIS9iaW4vYmFzaFwiLFxuICAgICAgICAgICAgICAgICAgICBcIm5wbSBpbnN0YWxsIC1nIGF3cy1jZGtcIixcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJBV1MgQ0RLIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgXCJjZGsgLS12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTGludXhGbGF2b3JUeXBlLkFNQVpPTl9MSU5VWF8yMDIzOlxuICAgICAgICBzc21Eb2N1bWVudCA9IG5ldyBzc20uQ2ZuRG9jdW1lbnQoc2NvcGUsIFwic3NtLWRvY3VtZW50LWFsMjAyM1wiLCB7XG4gICAgICAgICAgbmFtZTogYHZzY29kZS1zZXJ2ZXItYWwyMDIzLSR7U3RhY2sub2Yoc2NvcGUpLnN0YWNrTmFtZX1gLFxuICAgICAgICAgIGRvY3VtZW50VHlwZTogXCJDb21tYW5kXCIsXG4gICAgICAgICAgY29udGVudDoge1xuICAgICAgICAgICAgc2NoZW1hVmVyc2lvbjogXCIyLjJcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkJvb3RzdHJhcCBWU0NvZGUgY29kZS1zZXJ2ZXIgaW5zdGFuY2VcIixcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgVlNDb2RlUGFzc3dvcmQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFN0YWNrLm9mKHNjb3BlKS5zdGFja0lkLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBOb2RlVmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogXCIyMFwiLFxuICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcIjIyXCIsIFwiMjBcIiwgXCIxOFwiXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgRG90TmV0VmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogXCI4LjBcIixcbiAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCI4LjBcIiwgXCI3LjBcIl0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gYWxsIG1haW5TdGVwcyBzY3JpcHRzIGFyZSBpbiBpbiAvdmFyL2xpYi9hbWF6b24vc3NtLzxpbnN0YW5jZWlkPi9kb2N1bWVudC9vcmNoZXN0cmF0aW9uLzx1dWlkPi88U3RlcE5hbWU+L19zY3JpcHQuc2hcbiAgICAgICAgICAgIG1haW5TdGVwczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBcImF3czpjb25maWd1cmVQYWNrYWdlXCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJJbnN0YWxsQ2xvdWRXYXRjaEFnZW50XCIsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBcIkFtYXpvbkNsb3VkV2F0Y2hBZ2VudFwiLFxuICAgICAgICAgICAgICAgICAgYWN0aW9uOiBcIkluc3RhbGxcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBcImF3czpydW5Eb2N1bWVudFwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29uZmlndXJlQ2xvdWRXYXRjaEFnZW50XCIsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBkb2N1bWVudFR5cGU6IFwiU1NNRG9jdW1lbnRcIixcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50UGF0aDogXCJBbWF6b25DbG91ZFdhdGNoLU1hbmFnZUFnZW50XCIsXG4gICAgICAgICAgICAgICAgICBkb2N1bWVudFBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBcImNvbmZpZ3VyZVwiLFxuICAgICAgICAgICAgICAgICAgICBtb2RlOiBcImVjMlwiLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25hbENvbmZpZ3VyYXRpb25Tb3VyY2U6IFwiZGVmYXVsdFwiLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25hbFJlc3RhcnQ6IFwieWVzXCIsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IFwiYXdzOnJ1blNoZWxsU2NyaXB0XCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJJbnN0YWxsQmFzZVBhY2thZ2VzRG5mXCIsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgIFwiIyEvYmluL2Jhc2hcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkbmYgaW5zdGFsbCAteSAtLWFsbG93ZXJhc2luZyB3aG9pcyBhcmdvbjIgdW56aXAgbmdpbnggY3VybCBnbnVwZyBvcGVuc3NsXCIsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IFwiYXdzOnJ1blNoZWxsU2NyaXB0XCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJBZGRVc2VyRG5mXCIsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgIFwiIyEvYmluL2Jhc2hcIixcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ0FkZGluZyB1c2VyOiAke3ZzQ29kZVVzZXJ9J2AsXG4gICAgICAgICAgICAgICAgICAgIGBhZGR1c2VyIC1jICcnICR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICBgcGFzc3dkIC1sICR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyBcIiR7dnNDb2RlVXNlcn06e3sgVlNDb2RlUGFzc3dvcmQgfX1cIiB8IGNocGFzc3dkYCxcbiAgICAgICAgICAgICAgICAgICAgYHVzZXJtb2QgLWFHIHdoZWVsICR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIlVzZXIgYWRkZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgIGBnZXRlbnQgcGFzc3dkICR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBcImF3czpydW5TaGVsbFNjcmlwdFwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwiSW5zdGFsbE5vZGVEbmZcIixcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgXCIjIS9iaW4vYmFzaFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRuZiBpbnN0YWxsIC15IG5vZGVqczIwIG5wbVwiLFxuICAgICAgICAgICAgICAgICAgICBcImxuIC1zIC1mIC91c3IvYmluL25vZGUtMjAgL3Vzci9iaW4vbm9kZVwiLFxuICAgICAgICAgICAgICAgICAgICBcIm5wbSBpbnN0YWxsIC1nIG5wbUBsYXRlc3RcIixcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJOb2RlIGFuZCBucG0gaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICBcIm5vZGUgLXZcIixcbiAgICAgICAgICAgICAgICAgICAgXCJucG0gLXZcIixcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogXCJhd3M6cnVuU2hlbGxTY3JpcHRcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcIkluc3RhbGxEb2NrZXJEbmZcIixcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgXCIjIS9iaW4vYmFzaFwiLFxuICAgICAgICAgICAgICAgICAgICBcImRuZiBpbnN0YWxsIC15IGRvY2tlclwiLFxuICAgICAgICAgICAgICAgICAgICBgdXNlcm1vZCAtYUcgZG9ja2VyICR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICBgc3lzdGVtY3RsIHJlc3RhcnQgY29kZS1zZXJ2ZXJAJHt2c0NvZGVVc2VyfS5zZXJ2aWNlYCxcbiAgICAgICAgICAgICAgICAgICAgXCJzeXN0ZW1jdGwgc3RhcnQgZG9ja2VyLnNlcnZpY2VcIixcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJEb2NrZXIgaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICBcImRvY2tlciAtLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICAgICAgXCJzeXN0ZW1jdGwgc3RhdHVzIGRvY2tlci5zZXJ2aWNlXCIsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IFwiYXdzOnJ1blNoZWxsU2NyaXB0XCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJJbnN0YWxsR2l0RG5mXCIsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgIFwiIyEvYmluL2Jhc2hcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkbmYgaW5zdGFsbCAteSBnaXRcIixcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIuZW1haWwgXCIke3ZzQ29kZVVzZXJ9QGV4YW1wbGUuY29tXCJgLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IGdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5uYW1lIFwiV29ya3Nob3AgJHt2c0NvZGVVc2VyfVwiYCxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgY29uZmlnIC0tZ2xvYmFsIGluaXQuZGVmYXVsdEJyYW5jaCBcIm1haW5cImAsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiR2l0IGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgXCJnaXQgLS12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IFwiYXdzOnJ1blNoZWxsU2NyaXB0XCIsXG4gICAgICAgICAgICAgICAgbmFtZTogXCJJbnN0YWxsUHl0aG9uRG5mXCIsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgIC8vIEFMMjAyMyBjdXJyZW50bHkgc2hpcHMgd2l0aCBQeXRob24gMy45IHByZWluc3RhbGxlZCwgYnV0IDMuMTEgaXMgYXZhaWxhYmxlIGluIHRoZSByZXBvc2l0b3J5XG4gICAgICAgICAgICAgICAgICAgIC8vIEluc3RhbGwgMy4xMSBhbG9uZ3NpZGUgMy45IGFuZCBzZXR1cCBzb21lIGFsaWFzIHNvIHRoYXQgMy4xMSBpcyBsb2FkZWQgd2hlbiBwYXJ0aWNpcGFudCBydW5zIFB5dGhvbjNcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgUHl0aG9uIDMuMTIgYmVjb21lIGF2YWlsYWJsZSwgdXBkYXRlIGJlbG93XG4gICAgICAgICAgICAgICAgICAgIFwiIyEvYmluL2Jhc2hcIixcbiAgICAgICAgICAgICAgICAgICAgXCJkbmYgaW5zdGFsbCAteSBweXRob24zLjExIHB5dGhvbjMuMTEtcGlwIHB5dGhvbjMtdmlydHVhbGVudiBweXRob24zLXB5dGVzdCBweXRob24zLWJvdG8zXCIsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdhbGlhcyBweXRlc3Q9cHl0ZXN0LTMnID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdhbGlhcyBweXRob24zPXB5dGhvbjMuMTEnID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdhbGlhcyBwaXAzPXBpcDMuMTEnID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIFwiZWNobyAnYWxpYXM9cHl0aG9uMz1weXRob24zLjExJyA+PiB+Ly5iYXNocmNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlY2hvICdhbGlhcyBwaXAzPXBpcDMuMTEnID4+IH4vLmJhc2hyY1wiLFxuICAgICAgICAgICAgICAgICAgICBcInB5dGhvbjMuMTEgLW0gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCAyPiYxXCIsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiUHl0aG9uIGFuZCBQaXAgaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICBcInB5dGhvbjMuMTEgLS12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgICAgIFwicHl0aG9uMy4xMSAtbSBwaXAgLS12ZXJzaW9uIDI+JjFcIixcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgLy8gYWRkIGdvLCBkb3RuZXRcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogXCJhd3M6cnVuU2hlbGxTY3JpcHRcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcIkluc3RhbGxBV1NDTElcIixcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgXCIjIS9iaW4vYmFzaFwiLFxuICAgICAgICAgICAgICAgICAgICBcImN1cmwgLWZzU0wgaHR0cHM6Ly9hd3NjbGkuYW1hem9uYXdzLmNvbS9hd3NjbGktZXhlLWxpbnV4LSQodW5hbWUgLW0pLnppcCAtbyAvdG1wL2F3cy1jbGkuemlwXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidW56aXAgLXEgLWQgL3RtcCAvdG1wL2F3cy1jbGkuemlwXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3VkbyAvdG1wL2F3cy9pbnN0YWxsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwicm0gLXJmIC90bXAvYXdzXCIsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiQVdTIENMSSBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgIFwiYXdzIC0tdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBcImF3czpydW5TaGVsbFNjcmlwdFwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29uZmlndXJlQ29kZVNlcnZlclwiLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICBcIiMhL2Jpbi9iYXNoXCIsXG4gICAgICAgICAgICAgICAgICAgIGBleHBvcnQgSE9NRT0vaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgXCJjdXJsIC1mc1NMIGh0dHBzOi8vY29kZS1zZXJ2ZXIuZGV2L2luc3RhbGwuc2ggfCBiYXNoIC1zIC0tIDI+JjFcIixcbiAgICAgICAgICAgICAgICAgICAgYHN5c3RlbWN0bCBlbmFibGUgLS1ub3cgY29kZS1zZXJ2ZXJAJHt2c0NvZGVVc2VyfSAyPiYxYCxcbiAgICAgICAgICAgICAgICAgICAgYHRlZSAvZXRjL25naW54L2NvbmYuZC9jb2RlLXNlcnZlci5jb25mIDw8RU9GXG5zZXJ2ZXIge1xuICAgIGxpc3RlbiA4MDtcbiAgICBsaXN0ZW4gWzo6XTo4MDtcbiAgICAjIHNlcnZlcl9uYW1lIGRpc3RyaWJ1dGlvbi5kaXN0cmlidXRpb25Eb21haW5OYW1lO1xuICAgIHNlcnZlcl9uYW1lICouY2xvdWRmcm9udC5uZXQ7XG4gICAgbG9jYXRpb24gLyB7XG4gICAgICBwcm94eV9wYXNzIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC87XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIEhvc3QgXFxcXCRob3N0O1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBVcGdyYWRlIFxcXFwkaHR0cF91cGdyYWRlO1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBDb25uZWN0aW9uIHVwZ3JhZGU7XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIEFjY2VwdC1FbmNvZGluZyBnemlwO1xuICAgIH1cbiAgICBsb2NhdGlvbiAvJHtkZXZTZXJ2ZXJCYXNlUGF0aH0ge1xuICAgICAgcHJveHlfcGFzcyBodHRwOi8vbG9jYWxob3N0OiR7ZGV2U2VydmVyUG9ydH0vJHtkZXZTZXJ2ZXJCYXNlUGF0aH07XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIEhvc3QgXFxcXCRob3N0O1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBVcGdyYWRlIFxcXFwkaHR0cF91cGdyYWRlO1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBDb25uZWN0aW9uIHVwZ3JhZGU7XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIEFjY2VwdC1FbmNvZGluZyBnemlwO1xuICAgIH1cbn1cbkVPRmAsXG4gICAgICAgICAgICAgICAgICAgIGBta2RpciAtcCAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5jb25maWcvY29kZS1zZXJ2ZXJgLFxuICAgICAgICAgICAgICAgICAgICBgdGVlIC9ob21lLyR7dnNDb2RlVXNlcn0vLmNvbmZpZy9jb2RlLXNlcnZlci9jb25maWcueWFtbCA8PEVPRlxuY2VydDogZmFsc2VcbmF1dGg6IHBhc3N3b3JkXG5oYXNoZWQtcGFzc3dvcmQ6IFwiJChlY2hvIC1uIHt7IFZTQ29kZVBhc3N3b3JkIH19IHwgYXJnb24yICQob3BlbnNzbCByYW5kIC1iYXNlNjQgMTIpIC1lKVwiXG5FT0ZgLFxuICAgICAgICAgICAgICAgICAgICBgbWtkaXIgLXAgL2hvbWUvJHt2c0NvZGVVc2VyfS8ubG9jYWwvc2hhcmUvY29kZS1zZXJ2ZXIvVXNlci9gLFxuICAgICAgICAgICAgICAgICAgICBgdG91Y2ggL2hvbWUvJHt2c0NvZGVVc2VyfS8uaHVzaGxvZ2luYCxcbiAgICAgICAgICAgICAgICAgICAgYG1rZGlyIC1wICR7aG9tZUZvbGRlcn0gJiYgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9ICR7aG9tZUZvbGRlcn1gLFxuICAgICAgICAgICAgICAgICAgICBgdGVlIC9ob21lLyR7dnNDb2RlVXNlcn0vLmxvY2FsL3NoYXJlL2NvZGUtc2VydmVyL1VzZXIvc2V0dGluZ3MuanNvbiA8PEVPRlxue1xuICBcImV4dGVuc2lvbnMuYXV0b1VwZGF0ZVwiOiBmYWxzZSxcbiAgXCJleHRlbnNpb25zLmF1dG9DaGVja1VwZGF0ZXNcIjogZmFsc2UsXG4gIFwidGVsZW1ldHJ5LnRlbGVtZXRyeUxldmVsXCI6IFwib2ZmXCIsXG4gIFwic2VjdXJpdHkud29ya3NwYWNlLnRydXN0LnN0YXJ0dXBQcm9tcHRcIjogXCJuZXZlclwiLFxuICBcInNlY3VyaXR5LndvcmtzcGFjZS50cnVzdC5lbmFibGVkXCI6IGZhbHNlLFxuICBcInNlY3VyaXR5LndvcmtzcGFjZS50cnVzdC5iYW5uZXJcIjogXCJuZXZlclwiLFxuICBcInNlY3VyaXR5LndvcmtzcGFjZS50cnVzdC5lbXB0eVdpbmRvd1wiOiBmYWxzZSxcbiAgXCJweXRob24udGVzdGluZy5weXRlc3RFbmFibGVkXCI6IHRydWUsXG4gIFwiYXV0by1ydW4tY29tbWFuZC5ydWxlc1wiOiBbXG4gICAge1xuICAgICAgXCJjb21tYW5kXCI6IFwid29ya2JlbmNoLmFjdGlvbi50ZXJtaW5hbC5uZXdcIlxuICAgIH1cbiAgXVxufVxuRU9GYCxcbiAgICAgICAgICAgICAgICAgICAgYGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgYHN5c3RlbWN0bCByZXN0YXJ0IGNvZGUtc2VydmVyQCR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICBcInN5c3RlbWN0bCByZXN0YXJ0IG5naW54XCIsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gLS1sb2dpbiBjb2RlLXNlcnZlciAtLWluc3RhbGwtZXh0ZW5zaW9uIEFtYXpvbldlYlNlcnZpY2VzLmF3cy10b29sa2l0LXZzY29kZSAtLWZvcmNlYCxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSAtLWxvZ2luIGNvZGUtc2VydmVyIC0taW5zdGFsbC1leHRlbnNpb24gQW1hem9uV2ViU2VydmljZXMuYW1hem9uLXEtdnNjb2RlIC0tZm9yY2VgLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IC0tbG9naW4gY29kZS1zZXJ2ZXIgLS1pbnN0YWxsLWV4dGVuc2lvbiBzeW5lZHJhLmF1dG8tcnVuLWNvbW1hbmQgLS1mb3JjZWAsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gLS1sb2dpbiBjb2RlLXNlcnZlciAtLWluc3RhbGwtZXh0ZW5zaW9uIHZzY2phdmEudnNjb2RlLWphdmEtcGFjayAtLWZvcmNlYCxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSAtLWxvZ2luIGNvZGUtc2VydmVyIC0taW5zdGFsbC1leHRlbnNpb24gbXMtdnNjb2RlLmxpdmUtc2VydmVyIC0tZm9yY2VgLFxuICAgICAgICAgICAgICAgICAgICBgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9IC9ob21lLyR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIk5naW54IGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgXCJuZ2lueCAtdCAyPiYxXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic3lzdGVtY3RsIHN0YXR1cyBuZ2lueFwiLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIkNvZGVTZXJ2ZXIgaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICBcImNvZGUtc2VydmVyIC12XCIsXG4gICAgICAgICAgICAgICAgICAgIGBzeXN0ZW1jdGwgc3RhdHVzIGNvZGUtc2VydmVyQCR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBcImF3czpydW5TaGVsbFNjcmlwdFwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IFwiVXBkYXRlUHJvZmlsZVwiLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICBcIiMhL2Jpbi9iYXNoXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWNobyBMQU5HPWVuX1VTLnV0Zi04ID4+IC9ldGMvZW52aXJvbm1lbnRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlY2hvIExDX0FMTD1lbl9VUy5VVEYtOCA+PiAvZXRjL2Vudmlyb25tZW50XCIsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdQQVRIPSRQQVRIOi9ob21lLyR7dnNDb2RlVXNlcn0vLmxvY2FsL2JpbicgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2V4cG9ydCBQQVRIJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IEFXU19SRUdJT049JHtTdGFjay5vZihzY29wZSkucmVnaW9ufScgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2V4cG9ydCBBV1NfQUNDT1VOVElEPSR7U3RhY2sub2Yoc2NvcGUpLmFjY291bnR9JyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IE5FWFRfVEVMRU1FVFJZX0RJU0FCTEVEPTEnID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvIFwiZXhwb3J0IFBTMT0nXFxcXFtcXFxcMDMzWzAxOzMybVxcXFxdXFxcXHU6XFxcXFtcXFxcMDMzWzAxOzM0bVxcXFxdXFxcXHdcXFxcW1xcXFwwMzNbMDBtXFxcXF1cXFxcJCAnXCIgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogXCJhd3M6cnVuU2hlbGxTY3JpcHRcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBcIkluc3RhbGxDREtcIixcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgXCIjIS9iaW4vYmFzaFwiLFxuICAgICAgICAgICAgICAgICAgICBcIm5wbSBpbnN0YWxsIC1nIGF3cy1jZGtcIixcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJBV1MgQ0RLIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgXCJjZGsgLS12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgTGludXggZmxhdm9yOiAke2xpbnV4Rmxhdm9yfWApO1xuICAgIH1cblxuICAgIHJldHVybiBzc21Eb2N1bWVudDtcbiAgfVxufVxuXG5pbnRlcmZhY2UgQ3VzdG9tUmVzb3VyY2VJbnN0YWxsZXJPcHRpb25zIGV4dGVuZHMgSW5zdGFsbGVyT3B0aW9ucyB7fVxuXG5jbGFzcyBDdXN0b21SZXNvdXJjZUluc3RhbGxlciBleHRlbmRzIEluc3RhbGxlciB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIG9wdGlvbnM6IEN1c3RvbVJlc291cmNlSW5zdGFsbGVyT3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb25zdCBvbkV2ZW50OiBGdW5jdGlvbiA9IG5ldyBJbnN0YWxsZXJGdW5jdGlvbihcbiAgICAgIHNjb3BlLFxuICAgICAgXCJJbnN0YWxsZXJPbkV2ZW50SGFuZGxlclwiLFxuICAgICAge1xuICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDMwMCksIC8vIFRPRE8gY29uZmlndXJhYmxlXG4gICAgICAgIG1lbW9yeVNpemU6IDUxMiwgLy8gVE9ETyBjb25maWd1cmFibGVcbiAgICAgIH0sXG4gICAgKTtcbiAgICBOYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gICAgICBbb25FdmVudF0sXG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogXCJBd3NTb2x1dGlvbnMtSUFNNFwiLFxuICAgICAgICAgIHJlYXNvbjpcbiAgICAgICAgICAgIFwiRm9yIHRoaXMgZXZlbnQgaGFuZGxlciB3ZSBkbyBub3QgbmVlZCB0byByZXN0cmljdCBtYW5hZ2VkIHBvbGljaWVzXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogXCJBd3NTb2x1dGlvbnMtTDFcIixcbiAgICAgICAgICByZWFzb246IFwiRm9yIHRoaXMgbGFtYmRhIHRoZSBsYXRlc3QgcnVudGltZSBpcyBub3QgbmVlZGVkXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuXG4gICAgY29uc3QgZG9jdW1lbnRBcm4gPSBBcm4uZm9ybWF0KFxuICAgICAge1xuICAgICAgICBzZXJ2aWNlOiBcInNzbVwiLFxuICAgICAgICByZXNvdXJjZTogXCJkb2N1bWVudFwiLFxuICAgICAgICByZXNvdXJjZU5hbWU6IG9wdGlvbnMuZG9jdW1lbnROYW1lLFxuICAgICAgfSxcbiAgICAgIFN0YWNrLm9mKHNjb3BlKSxcbiAgICApO1xuXG4gICAgY29uc3QgY3dNYW5hZ2VBZ2VudEFybiA9IEFybi5mb3JtYXQoXG4gICAgICB7XG4gICAgICAgIHNlcnZpY2U6IFwic3NtXCIsXG4gICAgICAgIHJlc291cmNlOiBcImRvY3VtZW50XCIsXG4gICAgICAgIHJlc291cmNlTmFtZTogXCJBbWF6b25DbG91ZFdhdGNoLU1hbmFnZUFnZW50XCIsXG4gICAgICB9LFxuICAgICAgU3RhY2sub2Yoc2NvcGUpLFxuICAgICk7XG5cbiAgICBjb25zdCB0YXJnZXRFYzJJbnN0YW5jZUFybiA9IEFybi5mb3JtYXQoXG4gICAgICB7XG4gICAgICAgIHNlcnZpY2U6IFwiZWMyXCIsXG4gICAgICAgIHJlc291cmNlOiBcImluc3RhbmNlXCIsXG4gICAgICAgIHJlc291cmNlTmFtZTogb3B0aW9ucy5pbnN0YW5jZUlkLFxuICAgICAgfSxcbiAgICAgIFN0YWNrLm9mKHNjb3BlKSxcbiAgICApO1xuXG4gICAgb25FdmVudC5hZGRUb1JvbGVQb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogW1wic3NtOlNlbmRDb21tYW5kXCJdLFxuICAgICAgICByZXNvdXJjZXM6IFtkb2N1bWVudEFybiwgY3dNYW5hZ2VBZ2VudEFybiwgdGFyZ2V0RWMySW5zdGFuY2VBcm5dLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IFByb3ZpZGVyKHNjb3BlLCBcIkluc3RhbGxlclByb3ZpZGVyXCIsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyOiBvbkV2ZW50LFxuICAgIH0pO1xuICAgIE5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgICAgIFtwcm92aWRlcl0sXG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogXCJBd3NTb2x1dGlvbnMtSUFNNFwiLFxuICAgICAgICAgIHJlYXNvbjpcbiAgICAgICAgICAgIFwiRm9yIHRoaXMgcHJvdmlkZXIgd2UgZG8gbm90IG5lZWQgdG8gcmVzdHJpY3QgbWFuYWdlZCBwb2xpY2llc1wiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IFwiQXdzU29sdXRpb25zLUlBTTVcIixcbiAgICAgICAgICByZWFzb246IFwiRm9yIHRoaXMgcHJvdmlkZXIgd2lsZGNhcmRzIGFyZSBmaW5lXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogXCJBd3NTb2x1dGlvbnMtTDFcIixcbiAgICAgICAgICByZWFzb246IFwiRm9yIHRoaXMgcHJvdmlkZXIgdGhlIGxhdGVzdCBydW50aW1lIGlzIG5vdCBuZWVkZWRcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICB0cnVlLFxuICAgICk7XG5cbiAgICBuZXcgQ3VzdG9tUmVzb3VyY2Uoc2NvcGUsIFwiU1NNSW5zdGFsbGVyQ3VzdG9tUmVzb3VyY2VcIiwge1xuICAgICAgc2VydmljZVRva2VuOiBwcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIFNlcnZpY2VUaW1lb3V0OiAzMDUsIC8vIFRPRE8gY29uZmlndXJhYmxlXG4gICAgICAgIEluc3RhbmNlSWQ6IG9wdGlvbnMuaW5zdGFuY2VJZCxcbiAgICAgICAgRG9jdW1lbnROYW1lOiBvcHRpb25zLmRvY3VtZW50TmFtZSxcbiAgICAgICAgQ2xvdWRXYXRjaExvZ0dyb3VwTmFtZTogb3B0aW9ucy5jbG91ZFdhdGNoTG9nR3JvdXBOYW1lLFxuICAgICAgICBWU0NvZGVQYXNzd29yZDogb3B0aW9ucy52c0NvZGVQYXNzd29yZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgX2JpbmQoKSB7fVxufVxuIl19
|