@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.
@@ -20,8 +20,17 @@ const secret_retriever_1 = require("./secret-retriever/secret-retriever");
20
20
  */
21
21
  var LinuxFlavorType;
22
22
  (function (LinuxFlavorType) {
23
+ /**
24
+ * Ubuntu 22
25
+ */
23
26
  LinuxFlavorType["UBUNTU_22"] = "ubuntu22";
27
+ /**
28
+ * Ubuntu 24
29
+ */
24
30
  LinuxFlavorType["UBUNTU_24"] = "ubuntu24";
31
+ /**
32
+ * Amazon Linux 2023
33
+ */
25
34
  LinuxFlavorType["AMAZON_LINUX_2023"] = "al2023";
26
35
  })(LinuxFlavorType || (exports.LinuxFlavorType = LinuxFlavorType = {}));
27
36
  /**
@@ -29,17 +38,26 @@ var LinuxFlavorType;
29
38
  */
30
39
  var LinuxArchitectureType;
31
40
  (function (LinuxArchitectureType) {
41
+ /**
42
+ * ARM architecture
43
+ */
32
44
  LinuxArchitectureType["ARM"] = "arm";
45
+ /**
46
+ * AMD64 architecture
47
+ */
33
48
  LinuxArchitectureType["AMD64"] = "amd64";
34
49
  })(LinuxArchitectureType || (exports.LinuxArchitectureType = LinuxArchitectureType = {}));
50
+ /**
51
+ * VSCodeServer - spin it up in under 10 minutes
52
+ */
35
53
  class VSCodeServer extends constructs_1.Construct {
36
54
  constructor(scope, id, props) {
37
55
  super(scope, id);
38
56
  // defaults
39
- const vsCodeUser = props?.vscodeUser ?? 'participant';
40
- const instanceName = props?.instanceName ?? 'VSCodeServer';
57
+ const vsCodeUser = props?.vscodeUser ?? "participant";
58
+ const instanceName = props?.instanceName ?? "VSCodeServer";
41
59
  const instanceVolumeSize = props?.instanceVolumeSize ?? 40;
42
- const homeFolder = props?.homeFolder ?? '/Workshop';
60
+ const homeFolder = props?.homeFolder ?? "/Workshop";
43
61
  const instanceClass = props?.instanceClass ?? ec2.InstanceClass.M7G;
44
62
  const instanceSize = props?.instanceSize ?? ec2.InstanceSize.XLARGE;
45
63
  const instanceType = ec2.InstanceType.of(instanceClass, instanceSize);
@@ -47,10 +65,14 @@ class VSCodeServer extends constructs_1.Construct {
47
65
  const instanceCpuArchitecture = props?.instanceCpuArchitecture ?? LinuxArchitectureType.ARM;
48
66
  const machineImageFromSsmParameter = (0, mappings_1.getAmiSSMParameterForLinuxArchitectureAndFlavor)(instanceCpuArchitecture, instanceOperatingSystem);
49
67
  const additionalInstanceRolePolicies = props?.additionalInstanceRolePolicies ?? [];
50
- let vscodePassword = props?.vscodePassword ?? '';
51
- if ((vscodePassword == '')) {
68
+ const additionalTags = props?.additionalTags ?? {};
69
+ const defaultTags = { app: "vscode-server" };
70
+ const mergedTags = { ...defaultTags, ...additionalTags };
71
+ aws_cdk_lib_1.Aspects.of(this).add(new NodeTagger(mergedTags));
72
+ let vscodePassword = props?.vscodePassword ?? "";
73
+ if (vscodePassword == "") {
52
74
  // Create a secret which is then inject in the SSM document to install vscode server
53
- const secret = new secretsmanager.Secret(this, 'password-secret', {
75
+ const secret = new secretsmanager.Secret(this, "password-secret", {
54
76
  generateSecretString: {
55
77
  passwordLength: 16,
56
78
  secretStringTemplate: JSON.stringify({
@@ -58,13 +80,14 @@ class VSCodeServer extends constructs_1.Construct {
58
80
  }),
59
81
  excludePunctuation: true,
60
82
  includeSpace: false,
61
- generateStringKey: 'password',
83
+ generateStringKey: "password",
62
84
  },
63
85
  });
64
- cdk_nag_1.NagSuppressions.addResourceSuppressions([
65
- secret,
66
- ], [
67
- { id: 'AwsSolutions-SMG4', reason: 'For this tmp vc code server we do not need password rotation' },
86
+ cdk_nag_1.NagSuppressions.addResourceSuppressions([secret], [
87
+ {
88
+ id: "AwsSolutions-SMG4",
89
+ reason: "For this tmp vc code server we do not need password rotation",
90
+ },
68
91
  ], true);
69
92
  // Have a custom resource to pass the secret data on? -> yes because not resolvable on compile time
70
93
  const secretRetriever = secret_retriever_1.SecretRetriever.new({
@@ -73,98 +96,92 @@ class VSCodeServer extends constructs_1.Construct {
73
96
  vscodePassword = secretRetriever.secretPasswordPlaintext;
74
97
  }
75
98
  // Create default vpc
76
- const vpc = new ec2.Vpc(this, 'vpc', {
99
+ const vpc = new ec2.Vpc(this, "vpc", {
77
100
  maxAzs: 2,
78
101
  createInternetGateway: true,
79
102
  subnetConfiguration: [
80
103
  {
81
- name: 'public',
104
+ name: "public",
82
105
  subnetType: ec2.SubnetType.PUBLIC,
83
106
  },
84
107
  ],
85
108
  enableDnsHostnames: true,
86
109
  enableDnsSupport: true,
87
110
  });
88
- cdk_nag_1.NagSuppressions.addResourceSuppressions([
89
- vpc,
90
- ], [
91
- { id: 'AwsSolutions-VPC7', reason: 'For this tmp vpc we do not need flow logs' },
111
+ cdk_nag_1.NagSuppressions.addResourceSuppressions([vpc], [
112
+ {
113
+ id: "AwsSolutions-VPC7",
114
+ reason: "For this tmp vpc we do not need flow logs",
115
+ },
92
116
  ], true);
93
117
  // Create a SecGroup associated withe the CF dist pList
94
- const secGroup = new ec2.SecurityGroup(this, 'cf-to-server-sg', {
118
+ const secGroup = new ec2.SecurityGroup(this, "cf-to-server-sg", {
95
119
  vpc,
96
- description: 'SG for VSCodeServer - only allow CloudFront ingress',
97
- securityGroupName: 'cloudfront-to-vscode-server',
120
+ description: "SG for VSCodeServer - only allow CloudFront ingress",
121
+ securityGroupName: "cloudfront-to-vscode-server",
98
122
  });
99
- const awsManagedPrefixList = new prefixlist_retriever_1.AwsManagedPrefixList(this, 'cf-prefixlistId', {
100
- name: 'com.amazonaws.global.cloudfront.origin-facing',
123
+ const awsManagedPrefixList = new prefixlist_retriever_1.AwsManagedPrefixList(this, "cf-prefixlistId", {
124
+ name: "com.amazonaws.global.cloudfront.origin-facing",
101
125
  });
102
- cdk_nag_1.NagSuppressions.addResourceSuppressions([
103
- awsManagedPrefixList,
104
- ], [
105
- { id: 'AwsSolutions-IAM5', reason: 'For this provider wildcards are fine' },
126
+ cdk_nag_1.NagSuppressions.addResourceSuppressions([awsManagedPrefixList], [
127
+ {
128
+ id: "AwsSolutions-IAM5",
129
+ reason: "For this provider wildcards are fine",
130
+ },
106
131
  ], true);
107
- secGroup.addIngressRule(ec2.Peer.prefixList(awsManagedPrefixList.prefixList.prefixListId), ec2.Port.tcp(80), 'Allow HTTP from com.amazonaws.global.cloudfront.origin-facing');
132
+ secGroup.addIngressRule(ec2.Peer.prefixList(awsManagedPrefixList.prefixList.prefixListId), ec2.Port.tcp(80), "Allow HTTP from com.amazonaws.global.cloudfront.origin-facing");
108
133
  // Create an EC2 instance associated with the sec group + instance profile and role
109
- const instanceRole = new iam.Role(this, 'server-instance-role', {
110
- assumedBy: new iam.CompositePrincipal(new iam.ServicePrincipal('ec2.amazonaws.com'), new iam.ServicePrincipal('ssm.amazonaws.com')),
134
+ const instanceRole = new iam.Role(this, "server-instance-role", {
135
+ assumedBy: new iam.CompositePrincipal(new iam.ServicePrincipal("ec2.amazonaws.com"), new iam.ServicePrincipal("ssm.amazonaws.com")),
111
136
  inlinePolicies: {
112
137
  VSCodeInstanceInlinePolicy: new iam.PolicyDocument({
113
138
  statements: [
114
139
  new iam.PolicyStatement({
115
- sid: 'StsAccess',
140
+ sid: "StsAccess",
116
141
  effect: iam.Effect.ALLOW,
117
142
  actions: [
118
- 'sts:AssumeRole',
119
- 'iam:AddRoleToInstanceProfile',
120
- 'iam:AttachRolePolicy',
121
- 'iam:CreateRole',
122
- 'iam:CreateServiceLinkedRole',
123
- 'iam:DeleteRole',
124
- 'iam:DeleteRolePermissionsBoundary',
125
- 'iam:DeleteRolePolicy',
126
- 'iam:DeleteServiceLinkedRole',
127
- 'iam:DetachRolePolicy',
128
- 'iam:GetRole',
129
- 'iam:GetRolePolicy',
130
- 'iam:GetServiceLinkedRoleDeletionStatus',
131
- 'iam:ListAttachedRolePolicies',
132
- 'iam:ListInstanceProfilesForRole',
133
- 'iam:ListRolePolicies',
134
- 'iam:ListRoles',
135
- 'iam:ListRoleTags',
136
- 'iam:PutRolePermissionsBoundary',
137
- 'iam:PutRolePolicy',
138
- 'iam:RemoveRoleFromInstanceProfile',
139
- 'iam:TagRole',
140
- 'iam:UntagRole',
141
- 'iam:UpdateAssumeRolePolicy',
142
- 'iam:UpdateRole',
143
- 'iam:UpdateRoleDescription',
144
- ],
145
- resources: [
146
- `arn:aws:iam::${aws_cdk_lib_1.Stack.of(this).account}:role/cdk-*`,
143
+ "sts:AssumeRole",
144
+ "iam:AddRoleToInstanceProfile",
145
+ "iam:AttachRolePolicy",
146
+ "iam:CreateRole",
147
+ "iam:CreateServiceLinkedRole",
148
+ "iam:DeleteRole",
149
+ "iam:DeleteRolePermissionsBoundary",
150
+ "iam:DeleteRolePolicy",
151
+ "iam:DeleteServiceLinkedRole",
152
+ "iam:DetachRolePolicy",
153
+ "iam:GetRole",
154
+ "iam:GetRolePolicy",
155
+ "iam:GetServiceLinkedRoleDeletionStatus",
156
+ "iam:ListAttachedRolePolicies",
157
+ "iam:ListInstanceProfilesForRole",
158
+ "iam:ListRolePolicies",
159
+ "iam:ListRoles",
160
+ "iam:ListRoleTags",
161
+ "iam:PutRolePermissionsBoundary",
162
+ "iam:PutRolePolicy",
163
+ "iam:RemoveRoleFromInstanceProfile",
164
+ "iam:TagRole",
165
+ "iam:UntagRole",
166
+ "iam:UpdateAssumeRolePolicy",
167
+ "iam:UpdateRole",
168
+ "iam:UpdateRoleDescription",
147
169
  ],
170
+ resources: [`arn:aws:iam::${aws_cdk_lib_1.Stack.of(this).account}:role/cdk-*`],
148
171
  }),
149
172
  new iam.PolicyStatement({
150
173
  effect: iam.Effect.ALLOW,
151
- actions: [
152
- 'iam:PassRole',
153
- ],
154
- resources: [
155
- `arn:aws:iam::${aws_cdk_lib_1.Stack.of(this).account}:role/cdk-*`,
156
- ],
174
+ actions: ["iam:PassRole"],
175
+ resources: [`arn:aws:iam::${aws_cdk_lib_1.Stack.of(this).account}:role/cdk-*`],
157
176
  conditions: {
158
177
  StringLike: {
159
- 'iam:PassedToService': 'cloudformation.amazonaws.com',
178
+ "iam:PassedToService": "cloudformation.amazonaws.com",
160
179
  },
161
180
  },
162
181
  }),
163
182
  new iam.PolicyStatement({
164
183
  effect: iam.Effect.ALLOW,
165
- actions: [
166
- 'cloudformation:*',
167
- ],
184
+ actions: ["cloudformation:*"],
168
185
  resources: [
169
186
  `arn:aws:cloudformation:*:${aws_cdk_lib_1.Stack.of(this).account}:stack/CDKToolkit/*`,
170
187
  ],
@@ -172,30 +189,28 @@ class VSCodeServer extends constructs_1.Construct {
172
189
  new iam.PolicyStatement({
173
190
  effect: iam.Effect.ALLOW,
174
191
  actions: [
175
- 'cloudformation:CreateChangeSet',
176
- 'cloudformation:ExecuteChangeSet',
177
- 'cloudformation:DeleteChangeSet',
192
+ "cloudformation:CreateChangeSet",
193
+ "cloudformation:ExecuteChangeSet",
194
+ "cloudformation:DeleteChangeSet",
178
195
  ],
179
- resources: ['*'],
196
+ resources: ["*"],
180
197
  }),
181
198
  new iam.PolicyStatement({
182
- sid: 'S3Access',
183
- actions: [
184
- 's3:*',
185
- ],
186
- resources: ['*'],
199
+ sid: "S3Access",
200
+ actions: ["s3:*"],
201
+ resources: ["*"],
187
202
  }),
188
203
  new iam.PolicyStatement({
189
- sid: 'ECRAccess',
204
+ sid: "ECRAccess",
190
205
  effect: iam.Effect.ALLOW,
191
206
  actions: [
192
- 'ecr:SetRepositoryPolicy',
193
- 'ecr:GetLifecyclePolicy',
194
- 'ecr:PutLifecyclePolicy',
195
- 'ecr:PutImageScanningConfiguration',
196
- 'ecr:DescribeRepositories',
197
- 'ecr:CreateRepository',
198
- 'ecr:DeleteRepository',
207
+ "ecr:SetRepositoryPolicy",
208
+ "ecr:GetLifecyclePolicy",
209
+ "ecr:PutLifecyclePolicy",
210
+ "ecr:PutImageScanningConfiguration",
211
+ "ecr:DescribeRepositories",
212
+ "ecr:CreateRepository",
213
+ "ecr:DeleteRepository",
199
214
  ],
200
215
  resources: [
201
216
  `arn:aws:ecr:*:${aws_cdk_lib_1.Stack.of(this).account}:repository/cdk-*`,
@@ -204,9 +219,9 @@ class VSCodeServer extends constructs_1.Construct {
204
219
  new iam.PolicyStatement({
205
220
  effect: iam.Effect.ALLOW,
206
221
  actions: [
207
- 'ssm:GetParameter*',
208
- 'ssm:PutParameter*',
209
- 'ssm:DeleteParameter*',
222
+ "ssm:GetParameter*",
223
+ "ssm:PutParameter*",
224
+ "ssm:DeleteParameter*",
210
225
  ],
211
226
  resources: [
212
227
  `arn:aws:ssm:*:${aws_cdk_lib_1.Stack.of(this).account}:parameter/cdk-bootstrap/*`,
@@ -215,20 +230,20 @@ class VSCodeServer extends constructs_1.Construct {
215
230
  new iam.PolicyStatement({
216
231
  effect: iam.Effect.ALLOW,
217
232
  actions: [
218
- 'ec2:DescribeInstances',
219
- 'ec2:ModifyVolume',
220
- 'ec2:DescribeVolumesModifications*',
233
+ "ec2:DescribeInstances",
234
+ "ec2:ModifyVolume",
235
+ "ec2:DescribeVolumesModifications*",
221
236
  ],
222
- resources: ['*'],
237
+ resources: ["*"],
223
238
  }),
224
239
  new iam.PolicyStatement({
225
240
  effect: iam.Effect.ALLOW,
226
241
  actions: [
227
- 'codepipeline:EnableStageTransition',
228
- 'codepipeline:DisableStageTransition',
229
- 'codepipeline:StartPipelineExecution',
230
- 'codepipeline:StopPipelineExecution',
231
- 'codepipeline:UpdatePipeline',
242
+ "codepipeline:EnableStageTransition",
243
+ "codepipeline:DisableStageTransition",
244
+ "codepipeline:StartPipelineExecution",
245
+ "codepipeline:StopPipelineExecution",
246
+ "codepipeline:UpdatePipeline",
232
247
  ],
233
248
  resources: [
234
249
  `arn:aws:codepipeline:*:${aws_cdk_lib_1.Stack.of(this).account}:*/*`,
@@ -236,31 +251,31 @@ class VSCodeServer extends constructs_1.Construct {
236
251
  }),
237
252
  new iam.PolicyStatement({
238
253
  effect: iam.Effect.ALLOW,
239
- actions: [
240
- 'kms:Decrypt',
241
- ],
242
- resources: [
243
- `arn:aws:kms:*:${aws_cdk_lib_1.Stack.of(this).account}:key/*`,
244
- ],
254
+ actions: ["kms:Decrypt"],
255
+ resources: [`arn:aws:kms:*:${aws_cdk_lib_1.Stack.of(this).account}:key/*`],
245
256
  }),
246
257
  ...additionalInstanceRolePolicies,
247
258
  ],
248
259
  }),
249
260
  },
250
261
  managedPolicies: [
251
- iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonSSMManagedInstanceCore'),
252
- iam.ManagedPolicy.fromAwsManagedPolicyName('CloudWatchAgentServerPolicy'),
253
- iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonQDeveloperAccess'),
254
- iam.ManagedPolicy.fromAwsManagedPolicyName('ReadOnlyAccess'),
262
+ iam.ManagedPolicy.fromAwsManagedPolicyName("AmazonSSMManagedInstanceCore"),
263
+ iam.ManagedPolicy.fromAwsManagedPolicyName("CloudWatchAgentServerPolicy"),
264
+ iam.ManagedPolicy.fromAwsManagedPolicyName("AmazonQDeveloperAccess"),
265
+ iam.ManagedPolicy.fromAwsManagedPolicyName("ReadOnlyAccess"),
255
266
  ],
256
267
  });
257
- cdk_nag_1.NagSuppressions.addResourceSuppressions([
258
- instanceRole,
259
- ], [
260
- { id: 'AwsSolutions-IAM4', reason: 'For this tmp role we do not need to restrict managed policies' },
261
- { id: 'AwsSolutions-IAM5', reason: 'For this tmp role the wildcards are fine' },
268
+ cdk_nag_1.NagSuppressions.addResourceSuppressions([instanceRole], [
269
+ {
270
+ id: "AwsSolutions-IAM4",
271
+ reason: "For this tmp role we do not need to restrict managed policies",
272
+ },
273
+ {
274
+ id: "AwsSolutions-IAM5",
275
+ reason: "For this tmp role the wildcards are fine",
276
+ },
262
277
  ], true);
263
- const instance = new ec2.Instance(this, 'server-instance', {
278
+ const instance = new ec2.Instance(this, "server-instance", {
264
279
  vpc,
265
280
  instanceName,
266
281
  instanceType,
@@ -275,7 +290,7 @@ class VSCodeServer extends constructs_1.Construct {
275
290
  detailedMonitoring: true,
276
291
  blockDevices: [
277
292
  {
278
- deviceName: '/dev/sda1',
293
+ deviceName: "/dev/sda1",
279
294
  volume: ec2.BlockDeviceVolume.ebs(instanceVolumeSize, {
280
295
  volumeType: ec2.EbsDeviceVolumeType.GP3,
281
296
  encrypted: true,
@@ -292,32 +307,33 @@ class VSCodeServer extends constructs_1.Construct {
292
307
  - mkdir -p ${homeFolder} && chown -R ${vsCodeUser}:${vsCodeUser} ${homeFolder}
293
308
  `),
294
309
  });
295
- cdk_nag_1.NagSuppressions.addResourceSuppressions([
296
- instance,
297
- ], [
298
- { id: 'AwsSolutions-EC29', reason: 'For this tmp instance we do not need an asg' },
310
+ cdk_nag_1.NagSuppressions.addResourceSuppressions([instance], [
311
+ {
312
+ id: "AwsSolutions-EC29",
313
+ reason: "For this tmp instance we do not need an asg",
314
+ },
299
315
  ], true);
300
316
  // Create a CF distribution (special id) and special CachePolicy to instance
301
- const cfCachePolicy = new cf.CachePolicy(this, 'cf-cache-policy', {
317
+ const cfCachePolicy = new cf.CachePolicy(this, "cf-cache-policy", {
302
318
  cachePolicyName: `cf-cache-policy-vscodeserver-${aws_cdk_lib_1.Stack.of(this).stackName}`,
303
- comment: 'Cache policy for VSCodeServer',
319
+ comment: "Cache policy for VSCodeServer",
304
320
  minTtl: aws_cdk_lib_1.Duration.seconds(1),
305
321
  maxTtl: aws_cdk_lib_1.Duration.seconds(31536000),
306
322
  defaultTtl: aws_cdk_lib_1.Duration.seconds(86400),
307
323
  cookieBehavior: cf.CacheCookieBehavior.all(),
308
324
  enableAcceptEncodingGzip: false,
309
325
  headerBehavior: {
310
- behavior: 'whitelist',
326
+ behavior: "whitelist",
311
327
  headers: [
312
- 'Accept-Charset',
313
- 'Authorization',
314
- 'Origin',
315
- 'Accept',
316
- 'Referer',
317
- 'Host',
318
- 'Accept-Language',
319
- 'Accept-Encoding',
320
- 'Accept-Datetime',
328
+ "Accept-Charset",
329
+ "Authorization",
330
+ "Origin",
331
+ "Accept",
332
+ "Referer",
333
+ "Host",
334
+ "Accept-Language",
335
+ "Accept-Encoding",
336
+ "Accept-Datetime",
321
337
  ],
322
338
  },
323
339
  queryStringBehavior: cf.CacheQueryStringBehavior.all(),
@@ -326,48 +342,61 @@ class VSCodeServer extends constructs_1.Construct {
326
342
  protocolPolicy: cf.OriginProtocolPolicy.HTTP_ONLY,
327
343
  originId: `Cloudfront-${aws_cdk_lib_1.Stack.of(this).stackName}-${aws_cdk_lib_1.Stack.of(this).stackName}`,
328
344
  });
329
- const distribution = new cf.Distribution(this, 'cf-distribution', {
345
+ const distribution = new cf.Distribution(this, "cf-distribution", {
330
346
  enabled: true,
331
347
  httpVersion: cf.HttpVersion.HTTP2_AND_3,
332
348
  // NOTE: 'Distributions that use the default CloudFront viewer certificate or use 'vip' for the 'SslSupportMethod'
333
349
  // are non-compliant with this rule, as the minimum security policy is set to TLSv1 regardless
334
350
  // of the specified 'MinimumProtocolVersion'
335
351
  // minimumProtocolVersion: cf.SecurityPolicyProtocol.TLS_V1_2_2021,
336
- comment: 'Distribution for VSCodeServer',
352
+ comment: "Distribution for VSCodeServer",
337
353
  priceClass: cf.PriceClass.PRICE_CLASS_ALL,
338
354
  defaultBehavior: {
339
355
  allowedMethods: cf.AllowedMethods.ALLOW_ALL,
340
356
  cachePolicy: cfCachePolicy,
341
357
  originRequestPolicy: {
342
358
  // Managed-AllViewer - see https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-origin-request-policies.html#:~:text=When%20using%20AWS,47e4%2Db989%2D5492eafa07d3
343
- originRequestPolicyId: '216adef6-5c7f-47e4-b989-5492eafa07d3',
359
+ originRequestPolicyId: "216adef6-5c7f-47e4-b989-5492eafa07d3",
344
360
  },
345
361
  viewerProtocolPolicy: cf.ViewerProtocolPolicy.ALLOW_ALL,
346
362
  origin,
347
363
  },
348
364
  additionalBehaviors: {
349
- '/proxy/*': {
365
+ "/proxy/*": {
350
366
  allowedMethods: cf.AllowedMethods.ALLOW_ALL,
351
367
  compress: false,
352
368
  // see https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-cache-policies.html#managed-cache-policy-caching-disabled
353
369
  cachePolicy: cf.CachePolicy.CACHING_DISABLED,
354
370
  originRequestPolicy: {
355
371
  // Managed-AllViewer - see https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-origin-request-policies.html#:~:text=When%20using%20AWS,47e4%2Db989%2D5492eafa07d3
356
- originRequestPolicyId: '216adef6-5c7f-47e4-b989-5492eafa07d3',
372
+ originRequestPolicyId: "216adef6-5c7f-47e4-b989-5492eafa07d3",
357
373
  },
358
374
  viewerProtocolPolicy: cf.ViewerProtocolPolicy.ALLOW_ALL,
359
375
  origin,
360
376
  },
361
377
  },
362
378
  });
363
- cdk_nag_1.NagSuppressions.addResourceSuppressions([
364
- distribution,
365
- ], [
366
- { id: 'AwsSolutions-CFR1', reason: 'For this tmp distribution we do not need geo restrictions' },
367
- { id: 'AwsSolutions-CFR2', reason: 'For this tmp distribution we do not need waf integration' },
368
- { id: 'AwsSolutions-CFR3', reason: 'For this tmp distribution we do not need access logging enabled' },
369
- { id: 'AwsSolutions-CFR4', reason: 'For this tmp distribution we do not need limit SSL protocols as we use the default viewer cert' },
370
- { id: 'AwsSolutions-CFR5', reason: 'For this tmp distribution we do not need limit SSL protocols as we use the default viewer cert' },
379
+ cdk_nag_1.NagSuppressions.addResourceSuppressions([distribution], [
380
+ {
381
+ id: "AwsSolutions-CFR1",
382
+ reason: "For this tmp distribution we do not need geo restrictions",
383
+ },
384
+ {
385
+ id: "AwsSolutions-CFR2",
386
+ reason: "For this tmp distribution we do not need waf integration",
387
+ },
388
+ {
389
+ id: "AwsSolutions-CFR3",
390
+ reason: "For this tmp distribution we do not need access logging enabled",
391
+ },
392
+ {
393
+ id: "AwsSolutions-CFR4",
394
+ reason: "For this tmp distribution we do not need limit SSL protocols as we use the default viewer cert",
395
+ },
396
+ {
397
+ id: "AwsSolutions-CFR5",
398
+ reason: "For this tmp distribution we do not need limit SSL protocols as we use the default viewer cert",
399
+ },
371
400
  ], true);
372
401
  // Use a custom resource lambda to run the SSM document on the instance
373
402
  switch (instanceOperatingSystem) {
@@ -400,18 +429,29 @@ class VSCodeServer extends constructs_1.Construct {
400
429
  // atm this is achieved by the integ tests
401
430
  // Outputs
402
431
  this.domainName = `https://${distribution.domainName}/?folder=${homeFolder}`;
403
- new aws_cdk_lib_1.CfnOutput(this, 'domainName', {
404
- description: 'The domain name of the distribution',
432
+ new aws_cdk_lib_1.CfnOutput(this, "domainName", {
433
+ description: "The domain name of the distribution",
405
434
  value: this.domainName,
406
435
  });
407
436
  this.password = vscodePassword;
408
- new aws_cdk_lib_1.CfnOutput(this, 'password', {
409
- description: 'The password for the VSCode server',
437
+ new aws_cdk_lib_1.CfnOutput(this, "password", {
438
+ description: "The password for the VSCode server",
410
439
  value: vscodePassword,
411
440
  });
412
441
  }
413
442
  }
414
443
  exports.VSCodeServer = VSCodeServer;
415
444
  _a = JSII_RTTI_SYMBOL_1;
416
- VSCodeServer[_a] = { fqn: "@mavogel/cdk-vscode-server.VSCodeServer", version: "0.0.16" };
417
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidnNjb2RlLXNlcnZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92c2NvZGUtc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQXlEO0FBQ3pELGlEQUFpRDtBQUNqRCwwREFBMEQ7QUFDMUQsMkNBQTJDO0FBQzNDLDJDQUEyQztBQUMzQyxpRUFBaUU7QUFDakUscUNBQTBDO0FBQzFDLDJDQUF1QztBQUN2QyxxREFBa0Q7QUFDbEQseUNBQTZFO0FBQzdFLHNGQUFtRjtBQUNuRiwwRUFBc0U7QUF3RnRFOztHQUVHO0FBQ0gsSUFBWSxlQUlYO0FBSkQsV0FBWSxlQUFlO0lBQ3pCLHlDQUFzQixDQUFBO0lBQ3RCLHlDQUFzQixDQUFBO0lBQ3RCLCtDQUE0QixDQUFBO0FBQzlCLENBQUMsRUFKVyxlQUFlLCtCQUFmLGVBQWUsUUFJMUI7QUFFRDs7R0FFRztBQUNILElBQVkscUJBR1g7QUFIRCxXQUFZLHFCQUFxQjtJQUMvQixvQ0FBVyxDQUFBO0lBQ1gsd0NBQWUsQ0FBQTtBQUNqQixDQUFDLEVBSFcscUJBQXFCLHFDQUFyQixxQkFBcUIsUUFHaEM7QUFFRCxNQUFhLFlBQWEsU0FBUSxzQkFBUztJQUl6QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXlCO1FBQ2pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsV0FBVztRQUNYLE1BQU0sVUFBVSxHQUFHLEtBQUssRUFBRSxVQUFVLElBQUksYUFBYSxDQUFDO1FBQ3RELE1BQU0sWUFBWSxHQUFHLEtBQUssRUFBRSxZQUFZLElBQUksY0FBYyxDQUFDO1FBQzNELE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxFQUFFLGtCQUFrQixJQUFJLEVBQUUsQ0FBQztRQUMzRCxNQUFNLFVBQVUsR0FBRyxLQUFLLEVBQUUsVUFBVSxJQUFJLFdBQVcsQ0FBQztRQUNwRCxNQUFNLGFBQWEsR0FBRyxLQUFLLEVBQUUsYUFBYSxJQUFJLEdBQUcs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QyxJQUFJLEVBQUUsWUFBWSxFQUFFO1lBQ2hDLFdBQVcsRUFBRSxxQ0FBcUM7WUFDbEQsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVO1NBQ3ZCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxRQUFRLEdBQUcsY0FBYyxDQUFDO1FBQy9CLElBQUksdUJBQVMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQzlCLFdBQVcsRUFBRSxvQ0FBb0M7WUFDakQsS0FBSyxFQUFFLGNBQWM7U0FDdEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUF4Wkgsb0NBeVpDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuT3V0cHV0LCBEdXJhdGlvbiwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBjZiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udCc7XG5pbXBvcnQgKiBhcyBjZm8gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnQtb3JpZ2lucyc7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBzZWNyZXRzbWFuYWdlciBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXInO1xuaW1wb3J0IHsgTmFnU3VwcHJlc3Npb25zIH0gZnJvbSAnY2RrLW5hZyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEluc3RhbGxlciB9IGZyb20gJy4vaW5zdGFsbGVyL2luc3RhbGxlcic7XG5pbXBvcnQgeyBnZXRBbWlTU01QYXJhbWV0ZXJGb3JMaW51eEFyY2hpdGVjdHVyZUFuZEZsYXZvciB9IGZyb20gJy4vbWFwcGluZ3MnO1xuaW1wb3J0IHsgQXdzTWFuYWdlZFByZWZpeExpc3QgfSBmcm9tICcuL3ByZWZpeGxpc3QtcmV0cmlldmVyL3ByZWZpeGxpc3QtcmV0cmlldmVyJztcbmltcG9ydCB7IFNlY3JldFJldHJpZXZlciB9IGZyb20gJy4vc2VjcmV0LXJldHJpZXZlci9zZWNyZXQtcmV0cmlldmVyJztcblxuZXhwb3J0IGludGVyZmFjZSBWU0NvZGVTZXJ2ZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBVc2VyTmFtZSBmb3IgVlNDb2RlIFNlcnZlclxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHBhcnRpY2lwYW50XG4gICAqL1xuICByZWFkb25seSB2c2NvZGVVc2VyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYXNzd29yZCBmb3IgVlNDb2RlIFNlcnZlclxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGVtcHR5IGFuZCB3aWxsIHRoZW4gYmUgZ2VuZXJhdGVkXG4gICAqL1xuICByZWFkb25seSB2c2NvZGVQYXNzd29yZD86IHN0cmluZztcblxuICAvKipcbiAgICogVlNDb2RlIFNlcnZlciBFQzIgaW5zdGFuY2UgbmFtZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFZTQ29kZVNlcnZlclxuICAgKi9cbiAgcmVhZG9ubHkgaW5zdGFuY2VOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBWU0NvZGUgU2VydmVyIEVDMiBpbnN0YW5jZSB2b2x1bWUgc2l6ZSBpbiBHQlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIDQwXG4gICAqL1xuICByZWFkb25seSBpbnN0YW5jZVZvbHVtZVNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFZTQ29kZSBTZXJ2ZXIgRUMyIGluc3RhbmNlIGNsYXNzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbTdnXG4gICAqL1xuICByZWFkb25seSBpbnN0YW5jZUNsYXNzPzogZWMyLkluc3RhbmNlQ2xhc3M7XG5cbiAgLyoqXG4gICAqIFZTQ29kZSBTZXJ2ZXIgRUMyIGluc3RhbmNlIHNpemVcbiAgICpcbiAgICogQGRlZmF1bHQgLSB4bGFyZ2VcbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbmNlU2l6ZT86IGVjMi5JbnN0YW5jZVNpemU7XG5cbiAgLyoqXG4gICAqIFZTQ29kZSBTZXJ2ZXIgRUMyIG9wZXJhdGluZyBzeXN0ZW1cbiAgICpcbiAgICogQGRlZmF1bHQgLSBVYnVudHUtMjJcbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbmNlT3BlcmF0aW5nU3lzdGVtPzogTGludXhGbGF2b3JUeXBlO1xuXG4gIC8qKlxuICAgKiBWU0NvZGUgU2VydmVyIEVDMiBjcHUgYXJjaGl0ZWN0dXJlIGZvciB0aGUgb3BlcmF0aW5nIHN5c3RlbVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFybVxuICAgKi9cbiAgcmVhZG9ubHkgaW5zdGFuY2VDcHVBcmNoaXRlY3R1cmU/OiBMaW51eEFyY2hpdGVjdHVyZVR5cGU7XG5cbiAgLyoqXG4gICAqIEZvbGRlciB0byBvcGVuIGluIFZTIENvZGUgc2VydmVyXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gL1dvcmtzaG9wXG4gICAqL1xuICByZWFkb25seSBob21lRm9sZGVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBCYXNlIHBhdGggZm9yIHRoZSBhcHBsaWNhdGlvbiB0byBiZSBhZGRlZCB0byBOZ2lueCBzaXRlcy1hdmFpbGFibGUgbGlzdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFwcFxuICAgKi9cbiAgcmVhZG9ubHkgZGV2U2VydmVyQmFzZVBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBvcnQgZm9yIHRoZSBEZXZTZXJ2ZXJcbiAgICpcbiAgICogQGRlZmF1bHQgLSA4MDgxXG4gICAqL1xuICByZWFkb25seSBkZXZTZXJ2ZXJQb3J0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGluc3RhbmNlIHJvbGUgcG9saWNpZXNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBbXVxuICAgKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbEluc3RhbmNlUm9sZVBvbGljaWVzPzogaWFtLlBvbGljeVN0YXRlbWVudFtdO1xufVxuXG4vKipcbiAqIFRoZSBmbGF2b3Igb2YgbGludXggeW91IHdhbnQgdG8gcnVuIHZzY29kZSBzZXJ2ZXIgb25cbiAqL1xuZXhwb3J0IGVudW0gTGludXhGbGF2b3JUeXBlIHtcbiAgVUJVTlRVXzIyID0gJ3VidW50dTIyJyxcbiAgVUJVTlRVXzI0ID0gJ3VidW50dTI0JyxcbiAgQU1BWk9OX0xJTlVYXzIwMjMgPSAnYWwyMDIzJyxcbn1cblxuLyoqXG4gKiBUaGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBjcHUgeW91IHdhbnQgdG8gcnVuIHZzY29kZSBzZXJ2ZXIgb25cbiAqL1xuZXhwb3J0IGVudW0gTGludXhBcmNoaXRlY3R1cmVUeXBlIHtcbiAgQVJNID0gJ2FybScsXG4gIEFNRDY0ID0gJ2FtZDY0Jyxcbn1cblxuZXhwb3J0IGNsYXNzIFZTQ29kZVNlcnZlciBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBkb21haW5OYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBwYXNzd29yZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogVlNDb2RlU2VydmVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgLy8gZGVmYXVsdHNcbiAgICBjb25zdCB2c0NvZGVVc2VyID0gcHJvcHM/LnZzY29kZVVzZXIgPz8gJ3BhcnRpY2lwYW50JztcbiAgICBjb25zdCBpbnN0YW5jZU5hbWUgPSBwcm9wcz8uaW5zdGFuY2VOYW1lID8/ICdWU0NvZGVTZXJ2ZXInO1xuICAgIGNvbnN0IGluc3RhbmNlVm9sdW1lU2l6ZSA9IHByb3BzPy5pbnN0YW5jZVZvbHVtZVNpemUgPz8gNDA7XG4gICAgY29uc3QgaG9tZUZvbGRlciA9IHByb3BzPy5ob21lRm9sZGVyID8/ICcvV29ya3Nob3AnO1xuICAgIGNvbnN0IGluc3RhbmNlQ2xhc3MgPSBwcm9wcz8uaW5zdGFuY2VDbGFzcyA/PyBlYzIuSW5zdGFuY2VDbGFzcy5NN0c7XG4gICAgY29uc3QgaW5zdGFuY2VTaXplID0gcHJvcHM/Lmluc3RhbmNlU2l6ZSA/PyBlYzIuSW5zdGFuY2VTaXplLlhMQVJHRTtcbiAgICBjb25zdCBpbnN0YW5jZVR5cGUgPSBlYzIuSW5zdGFuY2VUeXBlLm9mKGluc3RhbmNlQ2xhc3MsIGluc3RhbmNlU2l6ZSk7XG4gICAgY29uc3QgaW5zdGFuY2VPcGVyYXRpbmdTeXN0ZW0gPSBwcm9wcz8uaW5zdGFuY2VPcGVyYXRpbmdTeXN0ZW0gPz8gTGludXhGbGF2b3JUeXBlLlVCVU5UVV8yMjtcbiAgICBjb25zdCBpbnN0YW5jZUNwdUFyY2hpdGVjdHVyZSA9IHByb3BzPy5pbnN0YW5jZUNwdUFyY2hpdGVjdHVyZSA/PyBMaW51eEFyY2hpdGVjdHVyZVR5cGUuQVJNO1xuICAgIGNvbnN0IG1hY2hpbmVJbWFnZUZyb21Tc21QYXJhbWV0ZXIgPSBnZXRBbWlTU01QYXJhbWV0ZXJGb3JMaW51eEFyY2hpdGVjdHVyZUFuZEZsYXZvcihpbnN0YW5jZUNwdUFyY2hpdGVjdHVyZSwgaW5zdGFuY2VPcGVyYXRpbmdTeXN0ZW0pO1xuICAgIGNvbnN0IGFkZGl0aW9uYWxJbnN0YW5jZVJvbGVQb2xpY2llcyA9IHByb3BzPy5hZGRpdGlvbmFsSW5zdGFuY2VSb2xlUG9saWNpZXMgPz8gW107XG5cbiAgICBsZXQgdnNjb2RlUGFzc3dvcmQgPSBwcm9wcz8udnNjb2RlUGFzc3dvcmQgPz8gJyc7XG4gICAgaWYgKCh2c2NvZGVQYXNzd29yZCA9PSAnJykpIHtcbiAgICAgIC8vIENyZWF0ZSBhIHNlY3JldCB3aGljaCBpcyB0aGVuIGluamVjdCBpbiB0aGUgU1NNIGRvY3VtZW50IHRvIGluc3RhbGwgdnNjb2RlIHNlcnZlclxuICAgICAgY29uc3Qgc2VjcmV0ID0gbmV3IHNlY3JldHNtYW5hZ2VyLlNlY3JldCh0aGlzLCAncGFzc3dvcmQtc2VjcmV0Jywge1xuICAgICAgICBnZW5lcmF0ZVNlY3JldFN0cmluZzoge1xuICAgICAgICAgIHBhc3N3b3JkTGVuZ3RoOiAxNixcbiAgICAgICAgICBzZWNyZXRTdHJpbmdUZW1wbGF0ZTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgdXNlcm5hbWU6IHZzQ29kZVVzZXIsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgZXhjbHVkZVB1bmN0dWF0aW9uOiB0cnVlLFxuICAgICAgICAgIGluY2x1ZGVTcGFjZTogZmFsc2UsXG4gICAgICAgICAgZ2VuZXJhdGVTdHJpbmdLZXk6ICdwYXNzd29yZCcsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIE5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhbXG4gICAgICAgIHNlY3JldCxcbiAgICAgIF0sIFtcbiAgICAgICAgeyBpZDogJ0F3c1NvbHV0aW9ucy1TTUc0JywgcmVhc29uOiAnRm9yIHRoaXMgdG1wIHZjIGNvZGUgc2VydmVyIHdlIGRvIG5vdCBuZWVkIHBhc3N3b3JkIHJvdGF0aW9uJyB9LFxuICAgICAgXSwgdHJ1ZSk7XG5cbiAgICAgIC8vIEhhdmUgYSBjdXN0b20gcmVzb3VyY2UgdG8gcGFzcyB0aGUgc2VjcmV0IGRhdGEgb24/IC0+IHllcyBiZWNhdXNlIG5vdCByZXNvbHZhYmxlIG9uIGNvbXBpbGUgdGltZVxuICAgICAgY29uc3Qgc2VjcmV0UmV0cmlldmVyID0gU2VjcmV0UmV0cmlldmVyLm5ldyh7XG4gICAgICAgIHNlY3JldEFybjogc2VjcmV0LnNlY3JldEFybixcbiAgICAgIH0pLl9iaW5kKHRoaXMpO1xuXG4gICAgICB2c2NvZGVQYXNzd29yZCA9IHNlY3JldFJldHJpZXZlci5zZWNyZXRQYXNzd29yZFBsYWludGV4dDtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZGVmYXVsdCB2cGNcbiAgICBjb25zdCB2cGMgPSBuZXcgZWMyLlZwYyh0aGlzLCAndnBjJywge1xuICAgICAgbWF4QXpzOiAyLFxuICAgICAgY3JlYXRlSW50ZXJuZXRHYXRld2F5OiB0cnVlLFxuICAgICAgc3VibmV0Q29uZmlndXJhdGlvbjogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ3B1YmxpYycsXG4gICAgICAgICAgc3VibmV0VHlwZTogZWMyLlN1Ym5ldFR5cGUuUFVCTElDLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGVuYWJsZURuc0hvc3RuYW1lczogdHJ1ZSxcbiAgICAgIGVuYWJsZURuc1N1cHBvcnQ6IHRydWUsXG4gICAgfSk7XG4gICAgTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFtcbiAgICAgIHZwYyxcbiAgICBdLCBbXG4gICAgICB7IGlkOiAnQXdzU29sdXRpb25zLVZQQzcnLCByZWFzb246ICdGb3IgdGhpcyB0bXAgdnBjIHdlIGRvIG5vdCBuZWVkIGZsb3cgbG9ncycgfSxcbiAgICBdLCB0cnVlKTtcblxuXG4gICAgLy8gQ3JlYXRlIGEgU2VjR3JvdXAgYXNzb2NpYXRlZCB3aXRoZSB0aGUgQ0YgZGlzdCBwTGlzdFxuICAgIGNvbnN0IHNlY0dyb3VwID0gbmV3IGVjMi5TZWN1cml0eUdyb3VwKHRoaXMsICdjZi10by1zZXJ2ZXItc2cnLCB7XG4gICAgICB2cGMsXG4gICAgICBkZXNjcmlwdGlvbjogJ1NHIGZvciBWU0NvZGVTZXJ2ZXIgLSBvbmx5IGFsbG93IENsb3VkRnJvbnQgaW5ncmVzcycsXG4gICAgICBzZWN1cml0eUdyb3VwTmFtZTogJ2Nsb3VkZnJvbnQtdG8tdnNjb2RlLXNlcnZlcicsXG4gICAgfSk7XG5cbiAgICBjb25zdCBhd3NNYW5hZ2VkUHJlZml4TGlzdCA9IG5ldyBBd3NNYW5hZ2VkUHJlZml4TGlzdCh0aGlzLCAnY2YtcHJlZml4bGlzdElkJywge1xuICAgICAgbmFtZTogJ2NvbS5hbWF6b25hd3MuZ2xvYmFsLmNsb3VkZnJvbnQub3JpZ2luLWZhY2luZycsXG4gICAgfSk7XG4gICAgTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFtcbiAgICAgIGF3c01hbmFnZWRQcmVmaXhMaXN0LFxuICAgIF0sIFtcbiAgICAgIHsgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsIHJlYXNvbjogJ0ZvciB0aGlzIHByb3ZpZGVyIHdpbGRjYXJkcyBhcmUgZmluZScgfSxcbiAgICBdLCB0cnVlKTtcblxuICAgIHNlY0dyb3VwLmFkZEluZ3Jlc3NSdWxlKFxuICAgICAgZWMyLlBlZXIucHJlZml4TGlzdChhd3NNYW5hZ2VkUHJlZml4TGlzdC5wcmVmaXhMaXN0LnByZWZpeExpc3RJZCksXG4gICAgICBlYzIuUG9ydC50Y3AoODApLFxuICAgICAgJ0FsbG93IEhUVFAgZnJvbSBjb20uYW1hem9uYXdzLmdsb2JhbC5jbG91ZGZyb250Lm9yaWdpbi1mYWNpbmcnLFxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgYW4gRUMyIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VjIGdyb3VwICsgaW5zdGFuY2UgcHJvZmlsZSBhbmQgcm9sZVxuICAgIGNvbnN0IGluc3RhbmNlUm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCAnc2VydmVyLWluc3RhbmNlLXJvbGUnLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uQ29tcG9zaXRlUHJpbmNpcGFsKFxuICAgICAgICBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2VjMi5hbWF6b25hd3MuY29tJyksXG4gICAgICAgIG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnc3NtLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgICksXG4gICAgICBpbmxpbmVQb2xpY2llczoge1xuICAgICAgICBWU0NvZGVJbnN0YW5jZUlubGluZVBvbGljeTogbmV3IGlhbS5Qb2xpY3lEb2N1bWVudCh7XG4gICAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBzaWQ6ICdTdHNBY2Nlc3MnLFxuICAgICAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAnc3RzOkFzc3VtZVJvbGUnLFxuICAgICAgICAgICAgICAgICdpYW06QWRkUm9sZVRvSW5zdGFuY2VQcm9maWxlJyxcbiAgICAgICAgICAgICAgICAnaWFtOkF0dGFjaFJvbGVQb2xpY3knLFxuICAgICAgICAgICAgICAgICdpYW06Q3JlYXRlUm9sZScsXG4gICAgICAgICAgICAgICAgJ2lhbTpDcmVhdGVTZXJ2aWNlTGlua2VkUm9sZScsXG4gICAgICAgICAgICAgICAgJ2lhbTpEZWxldGVSb2xlJyxcbiAgICAgICAgICAgICAgICAnaWFtOkRlbGV0ZVJvbGVQZXJtaXNzaW9uc0JvdW5kYXJ5JyxcbiAgICAgICAgICAgICAgICAnaWFtOkRlbGV0ZVJvbGVQb2xpY3knLFxuICAgICAgICAgICAgICAgICdpYW06RGVsZXRlU2VydmljZUxpbmtlZFJvbGUnLFxuICAgICAgICAgICAgICAgICdpYW06RGV0YWNoUm9sZVBvbGljeScsXG4gICAgICAgICAgICAgICAgJ2lhbTpHZXRSb2xlJyxcbiAgICAgICAgICAgICAgICAnaWFtOkdldFJvbGVQb2xpY3knLFxuICAgICAgICAgICAgICAgICdpYW06R2V0U2VydmljZUxpbmtlZFJvbGVEZWxldGlvblN0YXR1cycsXG4gICAgICAgICAgICAgICAgJ2lhbTpMaXN0QXR0YWNoZWRSb2xlUG9saWNpZXMnLFxuICAgICAgICAgICAgICAgICdpYW06TGlzdEluc3RhbmNlUHJvZmlsZXNGb3JSb2xlJyxcbiAgICAgICAgICAgICAgICAnaWFtOkxpc3RSb2xlUG9saWNpZXMnLFxuICAgICAgICAgICAgICAgICdpYW06TGlzdFJvbGVzJyxcbiAgICAgICAgICAgICAgICAnaWFtOkxpc3RSb2xlVGFncycsXG4gICAgICAgICAgICAgICAgJ2lhbTpQdXRSb2xlUGVybWlzc2lvbnNCb3VuZGFyeScsXG4gICAgICAgICAgICAgICAgJ2lhbTpQdXRSb2xlUG9saWN5JyxcbiAgICAgICAgICAgICAgICAnaWFtOlJlbW92ZVJvbGVGcm9tSW5zdGFuY2VQcm9maWxlJyxcbiAgICAgICAgICAgICAgICAnaWFtOlRhZ1JvbGUnLFxuICAgICAgICAgICAgICAgICdpYW06VW50YWdSb2xlJyxcbiAgICAgICAgICAgICAgICAnaWFtOlVwZGF0ZUFzc3VtZVJvbGVQb2xpY3knLFxuICAgICAgICAgICAgICAgICdpYW06VXBkYXRlUm9sZScsXG4gICAgICAgICAgICAgICAgJ2lhbTpVcGRhdGVSb2xlRGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICAgICAgICBgYXJuOmF3czppYW06OiR7U3RhY2sub2YodGhpcykuYWNjb3VudH06cm9sZS9jZGstKmAsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgJ2lhbTpQYXNzUm9sZScsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgICAgICAgIGBhcm46YXdzOmlhbTo6JHtTdGFjay5vZih0aGlzKS5hY2NvdW50fTpyb2xlL2Nkay0qYCxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICAgICAgICAgIFN0cmluZ0xpa2U6IHtcbiAgICAgICAgICAgICAgICAgICdpYW06UGFzc2VkVG9TZXJ2aWNlJzogJ2Nsb3VkZm9ybWF0aW9uLmFtYXpvbmF3cy5jb20nLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgJ2Nsb3VkZm9ybWF0aW9uOionLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICAgICAgICBgYXJuOmF3czpjbG91ZGZvcm1hdGlvbjoqOiR7U3RhY2sub2YodGhpcykuYWNjb3VudH06c3RhY2svQ0RLVG9vbGtpdC8qYCxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAnY2xvdWRmb3JtYXRpb246Q3JlYXRlQ2hhbmdlU2V0JyxcbiAgICAgICAgICAgICAgICAnY2xvdWRmb3JtYXRpb246RXhlY3V0ZUNoYW5nZVNldCcsXG4gICAgICAgICAgICAgICAgJ2Nsb3VkZm9ybWF0aW9uOkRlbGV0ZUNoYW5nZVNldCcsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgc2lkOiAnUzNBY2Nlc3MnLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgJ3MzOionLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIHNpZDogJ0VDUkFjY2VzcycsXG4gICAgICAgICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICdlY3I6U2V0UmVwb3NpdG9yeVBvbGljeScsXG4gICAgICAgICAgICAgICAgJ2VjcjpHZXRMaWZlY3ljbGVQb2xpY3knLFxuICAgICAgICAgICAgICAgICdlY3I6UHV0TGlmZWN5Y2xlUG9saWN5JyxcbiAgICAgICAgICAgICAgICAnZWNyOlB1dEltYWdlU2Nhbm5pbmdDb25maWd1cmF0aW9uJyxcbiAgICAgICAgICAgICAgICAnZWNyOkRlc2NyaWJlUmVwb3NpdG9yaWVzJyxcbiAgICAgICAgICAgICAgICAnZWNyOkNyZWF0ZVJlcG9zaXRvcnknLFxuICAgICAgICAgICAgICAgICdlY3I6RGVsZXRlUmVwb3NpdG9yeScsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgICAgICAgIGBhcm46YXdzOmVjcjoqOiR7U3RhY2sub2YodGhpcykuYWNjb3VudH06cmVwb3NpdG9yeS9jZGstKmAsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgJ3NzbTpHZXRQYXJhbWV0ZXIqJyxcbiAgICAgICAgICAgICAgICAnc3NtOlB1dFBhcmFtZXRlcionLFxuICAgICAgICAgICAgICAgICdzc206RGVsZXRlUGFyYW1ldGVyKicsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgICAgICAgIGBhcm46YXdzOnNzbToqOiR7U3RhY2sub2YodGhpcykuYWNjb3VudH06cGFyYW1ldGVyL2Nkay1ib290c3RyYXAvKmAsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgJ2VjMjpEZXNjcmliZUluc3RhbmNlcycsXG4gICAgICAgICAgICAgICAgJ2VjMjpNb2RpZnlWb2x1bWUnLFxuICAgICAgICAgICAgICAgICdlYzI6RGVzY3JpYmVWb2x1bWVzTW9kaWZpY2F0aW9ucyonLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICdjb2RlcGlwZWxpbmU6RW5hYmxlU3RhZ2VUcmFuc2l0aW9uJyxcbiAgICAgICAgICAgICAgICAnY29kZXBpcGVsaW5lOkRpc2FibGVTdGFnZVRyYW5zaXRpb24nLFxuICAgICAgICAgICAgICAgICdjb2RlcGlwZWxpbmU6U3RhcnRQaXBlbGluZUV4ZWN1dGlvbicsXG4gICAgICAgICAgICAgICAgJ2NvZGVwaXBlbGluZTpTdG9wUGlwZWxpbmVFeGVjdXRpb24nLFxuICAgICAgICAgICAgICAgICdjb2RlcGlwZWxpbmU6VXBkYXRlUGlwZWxpbmUnLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICAgICAgICBgYXJuOmF3czpjb2RlcGlwZWxpbmU6Kjoke1N0YWNrLm9mKHRoaXMpLmFjY291bnR9OiovKmAsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgJ2ttczpEZWNyeXB0JyxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgICAgICAgYGFybjphd3M6a21zOio6JHtTdGFjay5vZih0aGlzKS5hY2NvdW50fTprZXkvKmAsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIC4uLmFkZGl0aW9uYWxJbnN0YW5jZVJvbGVQb2xpY2llcyxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgICBtYW5hZ2VkUG9saWNpZXM6IFtcbiAgICAgICAgaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKCdBbWF6b25TU01NYW5hZ2VkSW5zdGFuY2VDb3JlJyksXG4gICAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnQ2xvdWRXYXRjaEFnZW50U2VydmVyUG9saWN5JyksXG4gICAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnQW1hem9uUURldmVsb3BlckFjY2VzcycpLFxuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoJ1JlYWRPbmx5QWNjZXNzJyksXG4gICAgICBdLFxuICAgIH0pO1xuICAgIE5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhbXG4gICAgICBpbnN0YW5jZVJvbGUsXG4gICAgXSwgW1xuICAgICAgeyBpZDogJ0F3c1NvbHV0aW9ucy1JQU00JywgcmVhc29uOiAnRm9yIHRoaXMgdG1wIHJvbGUgd2UgZG8gbm90IG5lZWQgdG8gcmVzdHJpY3QgbWFuYWdlZCBwb2xpY2llcycgfSxcbiAgICAgIHsgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsIHJlYXNvbjogJ0ZvciB0aGlzIHRtcCByb2xlIHRoZSB3aWxkY2FyZHMgYXJlIGZpbmUnIH0sXG4gICAgXSwgdHJ1ZSk7XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBlYzIuSW5zdGFuY2UodGhpcywgJ3NlcnZlci1pbnN0YW5jZScsIHtcbiAgICAgIHZwYyxcbiAgICAgIGluc3RhbmNlTmFtZSxcbiAgICAgIGluc3RhbmNlVHlwZSxcbiAgICAgIG1hY2hpbmVJbWFnZTogZWMyLk1hY2hpbmVJbWFnZS5mcm9tU3NtUGFyYW1ldGVyKFxuICAgICAgICBtYWNoaW5lSW1hZ2VGcm9tU3NtUGFyYW1ldGVyLFxuICAgICAgICB7XG4gICAgICAgICAgb3M6IGVjMi5PcGVyYXRpbmdTeXN0ZW1UeXBlLkxJTlVYLFxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICAgIHJlcXVpcmVJbWRzdjI6IHRydWUsXG4gICAgICB2cGNTdWJuZXRzOiB7XG4gICAgICAgIHN1Ym5ldFR5cGU6IGVjMi5TdWJuZXRUeXBlLlBVQkxJQyxcbiAgICAgIH0sXG4gICAgICBhc3NvY2lhdGVQdWJsaWNJcEFkZHJlc3M6IHRydWUsXG4gICAgICBkZXRhaWxlZE1vbml0b3Jpbmc6IHRydWUsXG4gICAgICBibG9ja0RldmljZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGRldmljZU5hbWU6ICcvZGV2L3NkYTEnLFxuICAgICAgICAgIHZvbHVtZTogZWMyLkJsb2NrRGV2aWNlVm9sdW1lLmVicyhpbnN0YW5jZVZvbHVtZVNpemUsIHtcbiAgICAgICAgICAgIHZvbHVtZVR5cGU6IGVjMi5FYnNEZXZpY2VWb2x1bWVUeXBlLkdQMyxcbiAgICAgICAgICAgIGVuY3J5cHRlZDogdHJ1ZSxcbiAgICAgICAgICAgIGRlbGV0ZU9uVGVybWluYXRpb246IHRydWUsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgcm9sZTogaW5zdGFuY2VSb2xlLFxuICAgICAgc2VjdXJpdHlHcm91cDogc2VjR3JvdXAsXG4gICAgICB1c2VyRGF0YTogZWMyLlVzZXJEYXRhLmN1c3RvbShgXG4gICAgICAgICNjbG91ZC1jb25maWdcbiAgICAgICAgICBob3N0bmFtZTogJHtpbnN0YW5jZU5hbWV9XG4gICAgICAgICAgcnVuY21kOlxuICAgICAgICAgICAgLSBta2RpciAtcCAke2hvbWVGb2xkZXJ9ICYmIGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAke2hvbWVGb2xkZXJ9XG4gICAgICBgKSxcbiAgICB9KTtcbiAgICBOYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoW1xuICAgICAgaW5zdGFuY2UsXG4gICAgXSwgW1xuICAgICAgeyBpZDogJ0F3c1NvbHV0aW9ucy1FQzI5JywgcmVhc29uOiAnRm9yIHRoaXMgdG1wIGluc3RhbmNlIHdlIGRvIG5vdCBuZWVkIGFuIGFzZycgfSxcbiAgICBdLCB0cnVlKTtcblxuICAgIC8vIENyZWF0ZSBhIENGIGRpc3RyaWJ1dGlvbiAoc3BlY2lhbCBpZCkgYW5kIHNwZWNpYWwgQ2FjaGVQb2xpY3kgdG8gaW5zdGFuY2VcbiAgICBjb25zdCBjZkNhY2hlUG9saWN5ID0gbmV3IGNmLkNhY2hlUG9saWN5KHRoaXMsICdjZi1jYWNoZS1wb2xpY3knLCB7XG4gICAgICBjYWNoZVBvbGljeU5hbWU6IGBjZi1jYWNoZS1wb2xpY3ktdnNjb2Rlc2VydmVyLSR7U3RhY2sub2YodGhpcykuc3RhY2tOYW1lfWAsXG4gICAgICBjb21tZW50OiAnQ2FjaGUgcG9saWN5IGZvciBWU0NvZGVTZXJ2ZXInLFxuICAgICAgbWluVHRsOiBEdXJhdGlvbi5zZWNvbmRzKDEpLFxuICAgICAgbWF4VHRsOiBEdXJhdGlvbi5zZWNvbmRzKDMxNTM2MDAwKSxcbiAgICAgIGRlZmF1bHRUdGw6IER1cmF0aW9uLnNlY29uZHMoODY0MDApLFxuICAgICAgY29va2llQmVoYXZpb3I6IGNmLkNhY2hlQ29va2llQmVoYXZpb3IuYWxsKCksXG4gICAgICBlbmFibGVBY2NlcHRFbmNvZGluZ0d6aXA6IGZhbHNlLFxuICAgICAgaGVhZGVyQmVoYXZpb3I6IHtcbiAgICAgICAgYmVoYXZpb3I6ICd3aGl0ZWxpc3QnLFxuICAgICAgICBoZWFkZXJzOiBbXG4gICAgICAgICAgJ0FjY2VwdC1DaGFyc2V0JyxcbiAgICAgICAgICAnQXV0aG9yaXphdGlvbicsXG4gICAgICAgICAgJ09yaWdpbicsXG4gICAgICAgICAgJ0FjY2VwdCcsXG4gICAgICAgICAgJ1JlZmVyZXInLFxuICAgICAgICAgICdIb3N0JyxcbiAgICAgICAgICAnQWNjZXB0LUxhbmd1YWdlJyxcbiAgICAgICAgICAnQWNjZXB0LUVuY29kaW5nJyxcbiAgICAgICAgICAnQWNjZXB0LURhdGV0aW1lJyxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICBxdWVyeVN0cmluZ0JlaGF2aW9yOiBjZi5DYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IuYWxsKCksXG4gICAgfSk7XG5cbiAgICBjb25zdCBvcmlnaW4gPSBuZXcgY2ZvLkh0dHBPcmlnaW4oaW5zdGFuY2UuaW5zdGFuY2VQdWJsaWNEbnNOYW1lLCB7XG4gICAgICBwcm90b2NvbFBvbGljeTogY2YuT3JpZ2luUHJvdG9jb2xQb2xpY3kuSFRUUF9PTkxZLFxuICAgICAgb3JpZ2luSWQ6IGBDbG91ZGZyb250LSR7U3RhY2sub2YodGhpcykuc3RhY2tOYW1lfS0ke1N0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZX1gLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZGlzdHJpYnV0aW9uID0gbmV3IGNmLkRpc3RyaWJ1dGlvbih0aGlzLCAnY2YtZGlzdHJpYnV0aW9uJywge1xuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIGh0dHBWZXJzaW9uOiBjZi5IdHRwVmVyc2lvbi5IVFRQMl9BTkRfMyxcbiAgICAgIC8vIE5PVEU6ICdEaXN0cmlidXRpb25zIHRoYXQgdXNlIHRoZSBkZWZhdWx0IENsb3VkRnJvbnQgdmlld2VyIGNlcnRpZmljYXRlIG9yIHVzZSAndmlwJyBmb3IgdGhlICdTc2xTdXBwb3J0TWV0aG9kJ1xuICAgICAgLy8gYXJlIG5vbi1jb21wbGlhbnQgd2l0aCB0aGlzIHJ1bGUsIGFzIHRoZSBtaW5pbXVtIHNlY3VyaXR5IHBvbGljeSBpcyBzZXQgdG8gVExTdjEgcmVnYXJkbGVzc1xuICAgICAgLy8gb2YgdGhlIHNwZWNpZmllZCAnTWluaW11bVByb3RvY29sVmVyc2lvbidcbiAgICAgIC8vIG1pbmltdW1Qcm90b2NvbFZlcnNpb246IGNmLlNlY3VyaXR5UG9saWN5UHJvdG9jb2wuVExTX1YxXzJfMjAyMSxcbiAgICAgIGNvbW1lbnQ6ICdEaXN0cmlidXRpb24gZm9yIFZTQ29kZVNlcnZlcicsXG4gICAgICBwcmljZUNsYXNzOiBjZi5QcmljZUNsYXNzLlBSSUNFX0NMQVNTX0FMTCxcbiAgICAgIGRlZmF1bHRCZWhhdmlvcjoge1xuICAgICAgICBhbGxvd2VkTWV0aG9kczogY2YuQWxsb3dlZE1ldGhvZHMuQUxMT1dfQUxMLFxuICAgICAgICBjYWNoZVBvbGljeTogY2ZDYWNoZVBvbGljeSxcbiAgICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeToge1xuICAgICAgICAgIC8vIE1hbmFnZWQtQWxsVmlld2VyIC0gc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS91c2luZy1tYW5hZ2VkLW9yaWdpbi1yZXF1ZXN0LXBvbGljaWVzLmh0bWwjOn46dGV4dD1XaGVuJTIwdXNpbmclMjBBV1MsNDdlNCUyRGI5ODklMkQ1NDkyZWFmYTA3ZDNcbiAgICAgICAgICBvcmlnaW5SZXF1ZXN0UG9saWN5SWQ6ICcyMTZhZGVmNi01YzdmLTQ3ZTQtYjk4OS01NDkyZWFmYTA3ZDMnLFxuICAgICAgICB9LFxuICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogY2YuVmlld2VyUHJvdG9jb2xQb2xpY3kuQUxMT1dfQUxMLFxuICAgICAgICBvcmlnaW4sXG4gICAgICB9LFxuICAgICAgYWRkaXRpb25hbEJlaGF2aW9yczoge1xuICAgICAgICAnL3Byb3h5LyonOiB7XG4gICAgICAgICAgYWxsb3dlZE1ldGhvZHM6IGNmLkFsbG93ZWRNZXRob2RzLkFMTE9XX0FMTCxcbiAgICAgICAgICBjb21wcmVzczogZmFsc2UsXG4gICAgICAgICAgLy8gc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS91c2luZy1tYW5hZ2VkLWNhY2hlLXBvbGljaWVzLmh0bWwjbWFuYWdlZC1jYWNoZS1wb2xpY3ktY2FjaGluZy1kaXNhYmxlZFxuICAgICAgICAgIGNhY2hlUG9saWN5OiBjZi5DYWNoZVBvbGljeS5DQUNISU5HX0RJU0FCTEVELFxuICAgICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3k6IHtcbiAgICAgICAgICAgIC8vIE1hbmFnZWQtQWxsVmlld2VyIC0gc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS91c2luZy1tYW5hZ2VkLW9yaWdpbi1yZXF1ZXN0LXBvbGljaWVzLmh0bWwjOn46dGV4dD1XaGVuJTIwdXNpbmclMjBBV1MsNDdlNCUyRGI5ODklMkQ1NDkyZWFmYTA3ZDNcbiAgICAgICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3lJZDogJzIxNmFkZWY2LTVjN2YtNDdlNC1iOTg5LTU0OTJlYWZhMDdkMycsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogY2YuVmlld2VyUHJvdG9jb2xQb2xpY3kuQUxMT1dfQUxMLFxuICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFtcbiAgICAgIGRpc3RyaWJ1dGlvbixcbiAgICBdLCBbXG4gICAgICB7IGlkOiAnQXdzU29sdXRpb25zLUNGUjEnLCByZWFzb246ICdGb3IgdGhpcyB0bXAgZGlzdHJpYnV0aW9uIHdlIGRvIG5vdCBuZWVkIGdlbyByZXN0cmljdGlvbnMnIH0sXG4gICAgICB7IGlkOiAnQXdzU29sdXRpb25zLUNGUjInLCByZWFzb246ICdGb3IgdGhpcyB0bXAgZGlzdHJpYnV0aW9uIHdlIGRvIG5vdCBuZWVkIHdhZiBpbnRlZ3JhdGlvbicgfSxcbiAgICAgIHsgaWQ6ICdBd3NTb2x1dGlvbnMtQ0ZSMycsIHJlYXNvbjogJ0ZvciB0aGlzIHRtcCBkaXN0cmlidXRpb24gd2UgZG8gbm90IG5lZWQgYWNjZXNzIGxvZ2dpbmcgZW5hYmxlZCcgfSxcbiAgICAgIHsgaWQ6ICdBd3NTb2x1dGlvbnMtQ0ZSNCcsIHJlYXNvbjogJ0ZvciB0aGlzIHRtcCBkaXN0cmlidXRpb24gd2UgZG8gbm90IG5lZWQgbGltaXQgU1NMIHByb3RvY29scyBhcyB3ZSB1c2UgdGhlIGRlZmF1bHQgdmlld2VyIGNlcnQnIH0sXG4gICAgICB7IGlkOiAnQXdzU29sdXRpb25zLUNGUjUnLCByZWFzb246ICdGb3IgdGhpcyB0bXAgZGlzdHJpYnV0aW9uIHdlIGRvIG5vdCBuZWVkIGxpbWl0IFNTTCBwcm90b2NvbHMgYXMgd2UgdXNlIHRoZSBkZWZhdWx0IHZpZXdlciBjZXJ0JyB9LFxuICAgIF0sIHRydWUpO1xuXG4gICAgLy8gVXNlIGEgY3VzdG9tIHJlc291cmNlIGxhbWJkYSB0byBydW4gdGhlIFNTTSBkb2N1bWVudCBvbiB0aGUgaW5zdGFuY2VcbiAgICBzd2l0Y2ggKGluc3RhbmNlT3BlcmF0aW5nU3lzdGVtKSB7XG4gICAgICBjYXNlIExpbnV4Rmxhdm9yVHlwZS5VQlVOVFVfMjI6XG4gICAgICBjYXNlIExpbnV4Rmxhdm9yVHlwZS5VQlVOVFVfMjQ6XG4gICAgICAgIEluc3RhbGxlci51YnVudHUoe1xuICAgICAgICAgIGluc3RhbmNlSWQ6IGluc3RhbmNlLmluc3RhbmNlSWQsXG4gICAgICAgICAgdnNDb2RlVXNlcjogdnNDb2RlVXNlcixcbiAgICAgICAgICB2c0NvZGVQYXNzd29yZDogdnNjb2RlUGFzc3dvcmQsXG4gICAgICAgICAgZGV2U2VydmVyQmFzZVBhdGg6IHByb3BzPy5kZXZTZXJ2ZXJCYXNlUGF0aCxcbiAgICAgICAgICBkZXZTZXJ2ZXJQb3J0OiBwcm9wcz8uZGV2U2VydmVyUG9ydCxcbiAgICAgICAgICBob21lRm9sZGVyOiBob21lRm9sZGVyLFxuICAgICAgICB9KS5fYmluZCh0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExpbnV4Rmxhdm9yVHlwZS5BTUFaT05fTElOVVhfMjAyMzpcbiAgICAgICAgSW5zdGFsbGVyLmFtYXpvbkxpbnV4MjAyMyh7XG4gICAgICAgICAgaW5zdGFuY2VJZDogaW5zdGFuY2UuaW5zdGFuY2VJZCxcbiAgICAgICAgICB2c0NvZGVVc2VyOiB2c0NvZGVVc2VyLFxuICAgICAgICAgIHZzQ29kZVBhc3N3b3JkOiB2c2NvZGVQYXNzd29yZCxcbiAgICAgICAgICBkZXZTZXJ2ZXJCYXNlUGF0aDogcHJvcHM/LmRldlNlcnZlckJhc2VQYXRoLFxuICAgICAgICAgIGRldlNlcnZlclBvcnQ6IHByb3BzPy5kZXZTZXJ2ZXJQb3J0LFxuICAgICAgICAgIGhvbWVGb2xkZXI6IGhvbWVGb2xkZXIsXG4gICAgICAgIH0pLl9iaW5kKHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgTGludXggZmxhdm9yOiAke2luc3RhbmNlT3BlcmF0aW5nU3lzdGVtfWApO1xuICAgIH1cbiAgICAvLyBzbyB3ZSBwYXNzIHRoZSBvdXRlciBzY29wZSBvZiB0aGlzIGNvbnN0cnVjdCB0aHJvdWdoIHRoZSBpbnN0YWxsZXJcblxuICAgIC8vIE5PVEU6IG1heWJlIGhhdmUgYSBoZWFsaGNoZWNrIENGTiBjdXN0b20gcmVzb3VyY2UgdG8gc2VlIGlmIHRoZSB2c2NvZGUgc2VydmVyIGlzIGhlYWx0aHlcbiAgICAvLyBhdG0gdGhpcyBpcyBhY2hpZXZlZCBieSB0aGUgaW50ZWcgdGVzdHNcblxuICAgIC8vIE91dHB1dHNcbiAgICB0aGlzLmRvbWFpbk5hbWUgPSBgaHR0cHM6Ly8ke2Rpc3RyaWJ1dGlvbi5kb21haW5OYW1lfS8/Zm9sZGVyPSR7aG9tZUZvbGRlcn1gO1xuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgJ2RvbWFpbk5hbWUnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSBkb21haW4gbmFtZSBvZiB0aGUgZGlzdHJpYnV0aW9uJyxcbiAgICAgIHZhbHVlOiB0aGlzLmRvbWFpbk5hbWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnBhc3N3b3JkID0gdnNjb2RlUGFzc3dvcmQ7XG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCAncGFzc3dvcmQnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSBwYXNzd29yZCBmb3IgdGhlIFZTQ29kZSBzZXJ2ZXInLFxuICAgICAgdmFsdWU6IHZzY29kZVBhc3N3b3JkLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
445
+ VSCodeServer[_a] = { fqn: "@mavogel/cdk-vscode-server.VSCodeServer", version: "0.0.18" };
446
+ /**
447
+ * Tags all the resources in the construct
448
+ */
449
+ class NodeTagger {
450
+ constructor(tags) {
451
+ this.tags = tags;
452
+ }
453
+ visit(node) {
454
+ Object.entries(this.tags).forEach(([key, value]) => aws_cdk_lib_1.Tags.of(node).add(key, value));
455
+ }
456
+ }
457
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidnNjb2RlLXNlcnZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92c2NvZGUtc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBT3FCO0FBQ3JCLGlEQUFpRDtBQUNqRCwwREFBMEQ7QUFDMUQsMkNBQTJDO0FBQzNDLDJDQUEyQztBQUMzQyxpRUFBaUU7QUFDakUscUNBQTBDO0FBQzFDLDJDQUFtRDtBQUNuRCxxREFBa0Q7QUFDbEQseUNBQTZFO0FBQzdFLHNGQUFtRjtBQUNuRiwwRUFBc0U7QUFrR3RFOztHQUVHO0FBQ0gsSUFBWSxlQWVYO0FBZkQsV0FBWSxlQUFlO0lBQ3pCOztPQUVHO0lBQ0gseUNBQXNCLENBQUE7SUFFdEI7O09BRUc7SUFDSCx5Q0FBc0IsQ0FBQTtJQUV0Qjs7T0FFRztJQUNILCtDQUE0QixDQUFBO0FBQzlCLENBQUMsRUFmVyxlQUFlLCtCQUFmLGVBQWUsUUFlMUI7QUFFRDs7R0FFRztBQUNILElBQVkscUJBVVg7QUFWRCxXQUFZLHFCQUFxQjtJQUMvQjs7T0FFRztJQUNILG9DQUFXLENBQUE7SUFFWDs7T0FFRztJQUNILHdDQUFlLENBQUE7QUFDakIsQ0FBQyxFQVZXLHFCQUFxQixxQ0FBckIscUJBQXFCLFFBVWhDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLFlBQWEsU0FBUSxzQkFBUztJQVd6QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXlCO1FBQ2pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsV0FBVztRQUNYLE1BQU0sVUFBVSxHQUFHLEtBQUssRUFBRSxVQUFVLElBQUksYUFBYSxDQUFDO1FBQ3RELE1BQU0sWUFBWSxHQUFHLEtBQUssRUFBRSxZQUFZLElBQUksY0FBYyxDQUFDO1FBQzNELE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxFQUFFLGtCQUFrQixJQUFJLEVBQUUsQ0FBQztRQUMzRCxNQUFNLFVBQVUsR0FBRyxLQUFLLEVBQUUs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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXNwZWN0cyxcbiAgQ2ZuT3V0cHV0LFxuICBEdXJhdGlvbixcbiAgSUFzcGVjdCxcbiAgU3RhY2ssXG4gIFRhZ3MsXG59IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0ICogYXMgY2YgZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250XCI7XG5pbXBvcnQgKiBhcyBjZm8gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250LW9yaWdpbnNcIjtcbmltcG9ydCAqIGFzIGVjMiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgKiBhcyBzZWNyZXRzbWFuYWdlciBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXCI7XG5pbXBvcnQgeyBOYWdTdXBwcmVzc2lvbnMgfSBmcm9tIFwiY2RrLW5hZ1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IEluc3RhbGxlciB9IGZyb20gXCIuL2luc3RhbGxlci9pbnN0YWxsZXJcIjtcbmltcG9ydCB7IGdldEFtaVNTTVBhcmFtZXRlckZvckxpbnV4QXJjaGl0ZWN0dXJlQW5kRmxhdm9yIH0gZnJvbSBcIi4vbWFwcGluZ3NcIjtcbmltcG9ydCB7IEF3c01hbmFnZWRQcmVmaXhMaXN0IH0gZnJvbSBcIi4vcHJlZml4bGlzdC1yZXRyaWV2ZXIvcHJlZml4bGlzdC1yZXRyaWV2ZXJcIjtcbmltcG9ydCB7IFNlY3JldFJldHJpZXZlciB9IGZyb20gXCIuL3NlY3JldC1yZXRyaWV2ZXIvc2VjcmV0LXJldHJpZXZlclwiO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIHRoZSBWU0NvZGVTZXJ2ZXIgY29uc3RydWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVlNDb2RlU2VydmVyUHJvcHMge1xuICAvKipcbiAgICogVXNlck5hbWUgZm9yIFZTQ29kZSBTZXJ2ZXJcbiAgICpcbiAgICogQGRlZmF1bHQgLSBwYXJ0aWNpcGFudFxuICAgKi9cbiAgcmVhZG9ubHkgdnNjb2RlVXNlcj86IHN0cmluZztcblxuICAvKipcbiAgICogUGFzc3dvcmQgZm9yIFZTQ29kZSBTZXJ2ZXJcbiAgICpcbiAgICogQGRlZmF1bHQgLSBlbXB0eSBhbmQgd2lsbCB0aGVuIGJlIGdlbmVyYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgdnNjb2RlUGFzc3dvcmQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZTQ29kZSBTZXJ2ZXIgRUMyIGluc3RhbmNlIG5hbWVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBWU0NvZGVTZXJ2ZXJcbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbmNlTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVlNDb2RlIFNlcnZlciBFQzIgaW5zdGFuY2Ugdm9sdW1lIHNpemUgaW4gR0JcbiAgICpcbiAgICogQGRlZmF1bHQgLSA0MFxuICAgKi9cbiAgcmVhZG9ubHkgaW5zdGFuY2VWb2x1bWVTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBWU0NvZGUgU2VydmVyIEVDMiBpbnN0YW5jZSBjbGFzc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIG03Z1xuICAgKi9cbiAgcmVhZG9ubHkgaW5zdGFuY2VDbGFzcz86IGVjMi5JbnN0YW5jZUNsYXNzO1xuXG4gIC8qKlxuICAgKiBWU0NvZGUgU2VydmVyIEVDMiBpbnN0YW5jZSBzaXplXG4gICAqXG4gICAqIEBkZWZhdWx0IC0geGxhcmdlXG4gICAqL1xuICByZWFkb25seSBpbnN0YW5jZVNpemU/OiBlYzIuSW5zdGFuY2VTaXplO1xuXG4gIC8qKlxuICAgKiBWU0NvZGUgU2VydmVyIEVDMiBvcGVyYXRpbmcgc3lzdGVtXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVWJ1bnR1LTIyXG4gICAqL1xuICByZWFkb25seSBpbnN0YW5jZU9wZXJhdGluZ1N5c3RlbT86IExpbnV4Rmxhdm9yVHlwZTtcblxuICAvKipcbiAgICogVlNDb2RlIFNlcnZlciBFQzIgY3B1IGFyY2hpdGVjdHVyZSBmb3IgdGhlIG9wZXJhdGluZyBzeXN0ZW1cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhcm1cbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbmNlQ3B1QXJjaGl0ZWN0dXJlPzogTGludXhBcmNoaXRlY3R1cmVUeXBlO1xuXG4gIC8qKlxuICAgKiBGb2xkZXIgdG8gb3BlbiBpbiBWUyBDb2RlIHNlcnZlclxuICAgKlxuICAgKiBAZGVmYXVsdCAtIC9Xb3Jrc2hvcFxuICAgKi9cbiAgcmVhZG9ubHkgaG9tZUZvbGRlcj86IHN0cmluZztcblxuICAvKipcbiAgICogQmFzZSBwYXRoIGZvciB0aGUgYXBwbGljYXRpb24gdG8gYmUgYWRkZWQgdG8gTmdpbnggc2l0ZXMtYXZhaWxhYmxlIGxpc3RcbiAgICpcbiAgICogQGRlZmF1bHQgLSBhcHBcbiAgICovXG4gIHJlYWRvbmx5IGRldlNlcnZlckJhc2VQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQb3J0IGZvciB0aGUgRGV2U2VydmVyXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gODA4MVxuICAgKi9cbiAgcmVhZG9ubHkgZGV2U2VydmVyUG9ydD86IG51bWJlcjtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBpbnN0YW5jZSByb2xlIHBvbGljaWVzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gW11cbiAgICovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxJbnN0YW5jZVJvbGVQb2xpY2llcz86IGlhbS5Qb2xpY3lTdGF0ZW1lbnRbXTtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCB0YWdzIHRvIGFkZCB0byB0aGUgaW5zdGFuY2VcbiAgICpcbiAgICogQGRlZmF1bHQgLSB7fVxuICAgKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbFRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIFRoZSBmbGF2b3Igb2YgbGludXggeW91IHdhbnQgdG8gcnVuIHZzY29kZSBzZXJ2ZXIgb25cbiAqL1xuZXhwb3J0IGVudW0gTGludXhGbGF2b3JUeXBlIHtcbiAgLyoqXG4gICAqIFVidW50dSAyMlxuICAgKi9cbiAgVUJVTlRVXzIyID0gXCJ1YnVudHUyMlwiLFxuXG4gIC8qKlxuICAgKiBVYnVudHUgMjRcbiAgICovXG4gIFVCVU5UVV8yNCA9IFwidWJ1bnR1MjRcIixcblxuICAvKipcbiAgICogQW1hem9uIExpbnV4IDIwMjNcbiAgICovXG4gIEFNQVpPTl9MSU5VWF8yMDIzID0gXCJhbDIwMjNcIixcbn1cblxuLyoqXG4gKiBUaGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBjcHUgeW91IHdhbnQgdG8gcnVuIHZzY29kZSBzZXJ2ZXIgb25cbiAqL1xuZXhwb3J0IGVudW0gTGludXhBcmNoaXRlY3R1cmVUeXBlIHtcbiAgLyoqXG4gICAqIEFSTSBhcmNoaXRlY3R1cmVcbiAgICovXG4gIEFSTSA9IFwiYXJtXCIsXG5cbiAgLyoqXG4gICAqIEFNRDY0IGFyY2hpdGVjdHVyZVxuICAgKi9cbiAgQU1ENjQgPSBcImFtZDY0XCIsXG59XG5cbi8qKlxuICogVlNDb2RlU2VydmVyIC0gc3BpbiBpdCB1cCBpbiB1bmRlciAxMCBtaW51dGVzXG4gKi9cbmV4cG9ydCBjbGFzcyBWU0NvZGVTZXJ2ZXIgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGRvbWFpbiB0aGUgc2VydmVyIGlzIHJlYWNoYWJsZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRvbWFpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhc3N3b3JkIHRvIGxvZ2luIHRvIHRoZSBzZXJ2ZXJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwYXNzd29yZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogVlNDb2RlU2VydmVyUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgLy8gZGVmYXVsdHNcbiAgICBjb25zdCB2c0NvZGVVc2VyID0gcHJvcHM/LnZzY29kZVVzZXIgPz8gXCJwYXJ0aWNpcGFudFwiO1xuICAgIGNvbnN0IGluc3RhbmNlTmFtZSA9IHByb3BzPy5pbnN0YW5jZU5hbWUgPz8gXCJWU0NvZGVTZXJ2ZXJcIjtcbiAgICBjb25zdCBpbnN0YW5jZVZvbHVtZVNpemUgPSBwcm9wcz8uaW5zdGFuY2VWb2x1bWVTaXplID8/IDQwO1xuICAgIGNvbnN0IGhvbWVGb2xkZXIgPSBwcm9wcz8uaG9tZUZvbGRlciA/PyBcIi9Xb3Jrc2hvcFwiO1xuICAgIGNvbnN0IGluc3RhbmNlQ2xhc3MgPSBwcm9wcz8uaW5zdGFuY2VDbGFzcyA/PyBlYzIuSW5zdGFuY2VDbGFzcy5NN0c7XG4gICAgY29uc3QgaW5zdGFuY2VTaXplID0gcHJvcHM/Lmluc3RhbmNlU2l6ZSA/PyBlYzIuSW5zdGFuY2VTaXplLlhMQVJHRTtcbiAgICBjb25zdCBpbnN0YW5jZVR5cGUgPSBlYzIuSW5zdGFuY2VUeXBlLm9mKGluc3RhbmNlQ2xhc3MsIGluc3RhbmNlU2l6ZSk7XG4gICAgY29uc3QgaW5zdGFuY2VPcGVyYXRpbmdTeXN0ZW0gPVxuICAgICAgcHJvcHM/Lmluc3RhbmNlT3BlcmF0aW5nU3lzdGVtID8/IExpbnV4Rmxhdm9yVHlwZS5VQlVOVFVfMjI7XG4gICAgY29uc3QgaW5zdGFuY2VDcHVBcmNoaXRlY3R1cmUgPVxuICAgICAgcHJvcHM/Lmluc3RhbmNlQ3B1QXJjaGl0ZWN0dXJlID8/IExpbnV4QXJjaGl0ZWN0dXJlVHlwZS5BUk07XG4gICAgY29uc3QgbWFjaGluZUltYWdlRnJvbVNzbVBhcmFtZXRlciA9XG4gICAgICBnZXRBbWlTU01QYXJhbWV0ZXJGb3JMaW51eEFyY2hpdGVjdHVyZUFuZEZsYXZvcihcbiAgICAgICAgaW5zdGFuY2VDcHVBcmNoaXRlY3R1cmUsXG4gICAgICAgIGluc3RhbmNlT3BlcmF0aW5nU3lzdGVtLFxuICAgICAgKTtcbiAgICBjb25zdCBhZGRpdGlvbmFsSW5zdGFuY2VSb2xlUG9saWNpZXMgPVxuICAgICAgcHJvcHM/LmFkZGl0aW9uYWxJbnN0YW5jZVJvbGVQb2xpY2llcyA/PyBbXTtcbiAgICBjb25zdCBhZGRpdGlvbmFsVGFncyA9IHByb3BzPy5hZGRpdGlvbmFsVGFncyA/PyB7fTtcbiAgICBjb25zdCBkZWZhdWx0VGFncyA9IHsgYXBwOiBcInZzY29kZS1zZXJ2ZXJcIiB9O1xuXG4gICAgY29uc3QgbWVyZ2VkVGFncyA9IHsgLi4uZGVmYXVsdFRhZ3MsIC4uLmFkZGl0aW9uYWxUYWdzIH07XG4gICAgQXNwZWN0cy5vZih0aGlzKS5hZGQobmV3IE5vZGVUYWdnZXIobWVyZ2VkVGFncykpO1xuXG4gICAgbGV0IHZzY29kZVBhc3N3b3JkID0gcHJvcHM/LnZzY29kZVBhc3N3b3JkID8/IFwiXCI7XG4gICAgaWYgKHZzY29kZVBhc3N3b3JkID09IFwiXCIpIHtcbiAgICAgIC8vIENyZWF0ZSBhIHNlY3JldCB3aGljaCBpcyB0aGVuIGluamVjdCBpbiB0aGUgU1NNIGRvY3VtZW50IHRvIGluc3RhbGwgdnNjb2RlIHNlcnZlclxuICAgICAgY29uc3Qgc2VjcmV0ID0gbmV3IHNlY3JldHNtYW5hZ2VyLlNlY3JldCh0aGlzLCBcInBhc3N3b3JkLXNlY3JldFwiLCB7XG4gICAgICAgIGdlbmVyYXRlU2VjcmV0U3RyaW5nOiB7XG4gICAgICAgICAgcGFzc3dvcmRMZW5ndGg6IDE2LFxuICAgICAgICAgIHNlY3JldFN0cmluZ1RlbXBsYXRlOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICB1c2VybmFtZTogdnNDb2RlVXNlcixcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBleGNsdWRlUHVuY3R1YXRpb246IHRydWUsXG4gICAgICAgICAgaW5jbHVkZVNwYWNlOiBmYWxzZSxcbiAgICAgICAgICBnZW5lcmF0ZVN0cmluZ0tleTogXCJwYXNzd29yZFwiLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBOYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gICAgICAgIFtzZWNyZXRdLFxuICAgICAgICBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6IFwiQXdzU29sdXRpb25zLVNNRzRcIixcbiAgICAgICAgICAgIHJlYXNvbjpcbiAgICAgICAgICAgICAgXCJGb3IgdGhpcyB0bXAgdmMgY29kZSBzZXJ2ZXIgd2UgZG8gbm90IG5lZWQgcGFzc3dvcmQgcm90YXRpb25cIixcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICB0cnVlLFxuICAgICAgKTtcblxuICAgICAgLy8gSGF2ZSBhIGN1c3RvbSByZXNvdXJjZSB0byBwYXNzIHRoZSBzZWNyZXQgZGF0YSBvbj8gLT4geWVzIGJlY2F1c2Ugbm90IHJlc29sdmFibGUgb24gY29tcGlsZSB0aW1lXG4gICAgICBjb25zdCBzZWNyZXRSZXRyaWV2ZXIgPSBTZWNyZXRSZXRyaWV2ZXIubmV3KHtcbiAgICAgICAgc2VjcmV0QXJuOiBzZWNyZXQuc2VjcmV0QXJuLFxuICAgICAgfSkuX2JpbmQodGhpcyk7XG5cbiAgICAgIHZzY29kZVBhc3N3b3JkID0gc2VjcmV0UmV0cmlldmVyLnNlY3JldFBhc3N3b3JkUGxhaW50ZXh0O1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBkZWZhdWx0IHZwY1xuICAgIGNvbnN0IHZwYyA9IG5ldyBlYzIuVnBjKHRoaXMsIFwidnBjXCIsIHtcbiAgICAgIG1heEF6czogMixcbiAgICAgIGNyZWF0ZUludGVybmV0R2F0ZXdheTogdHJ1ZSxcbiAgICAgIHN1Ym5ldENvbmZpZ3VyYXRpb246IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwicHVibGljXCIsXG4gICAgICAgICAgc3VibmV0VHlwZTogZWMyLlN1Ym5ldFR5cGUuUFVCTElDLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGVuYWJsZURuc0hvc3RuYW1lczogdHJ1ZSxcbiAgICAgIGVuYWJsZURuc1N1cHBvcnQ6IHRydWUsXG4gICAgfSk7XG4gICAgTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICAgICAgW3ZwY10sXG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogXCJBd3NTb2x1dGlvbnMtVlBDN1wiLFxuICAgICAgICAgIHJlYXNvbjogXCJGb3IgdGhpcyB0bXAgdnBjIHdlIGRvIG5vdCBuZWVkIGZsb3cgbG9nc1wiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHRydWUsXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSBhIFNlY0dyb3VwIGFzc29jaWF0ZWQgd2l0aGUgdGhlIENGIGRpc3QgcExpc3RcbiAgICBjb25zdCBzZWNHcm91cCA9IG5ldyBlYzIuU2VjdXJpdHlHcm91cCh0aGlzLCBcImNmLXRvLXNlcnZlci1zZ1wiLCB7XG4gICAgICB2cGMsXG4gICAgICBkZXNjcmlwdGlvbjogXCJTRyBmb3IgVlNDb2RlU2VydmVyIC0gb25seSBhbGxvdyBDbG91ZEZyb250IGluZ3Jlc3NcIixcbiAgICAgIHNlY3VyaXR5R3JvdXBOYW1lOiBcImNsb3VkZnJvbnQtdG8tdnNjb2RlLXNlcnZlclwiLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYXdzTWFuYWdlZFByZWZpeExpc3QgPSBuZXcgQXdzTWFuYWdlZFByZWZpeExpc3QoXG4gICAgICB0aGlzLFxuICAgICAgXCJjZi1wcmVmaXhsaXN0SWRcIixcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJjb20uYW1hem9uYXdzLmdsb2JhbC5jbG91ZGZyb250Lm9yaWdpbi1mYWNpbmdcIixcbiAgICAgIH0sXG4gICAgKTtcbiAgICBOYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gICAgICBbYXdzTWFuYWdlZFByZWZpeExpc3RdLFxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6IFwiQXdzU29sdXRpb25zLUlBTTVcIixcbiAgICAgICAgICByZWFzb246IFwiRm9yIHRoaXMgcHJvdmlkZXIgd2lsZGNhcmRzIGFyZSBmaW5lXCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuXG4gICAgc2VjR3JvdXAuYWRkSW5ncmVzc1J1bGUoXG4gICAgICBlYzIuUGVlci5wcmVmaXhMaXN0KGF3c01hbmFnZWRQcmVmaXhMaXN0LnByZWZpeExpc3QucHJlZml4TGlzdElkKSxcbiAgICAgIGVjMi5Qb3J0LnRjcCg4MCksXG4gICAgICBcIkFsbG93IEhUVFAgZnJvbSBjb20uYW1hem9uYXdzLmdsb2JhbC5jbG91ZGZyb250Lm9yaWdpbi1mYWNpbmdcIixcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIGFuIEVDMiBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlYyBncm91cCArIGluc3RhbmNlIHByb2ZpbGUgYW5kIHJvbGVcbiAgICBjb25zdCBpbnN0YW5jZVJvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgXCJzZXJ2ZXItaW5zdGFuY2Utcm9sZVwiLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uQ29tcG9zaXRlUHJpbmNpcGFsKFxuICAgICAgICBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoXCJlYzIuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgICAgbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKFwic3NtLmFtYXpvbmF3cy5jb21cIiksXG4gICAgICApLFxuICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgVlNDb2RlSW5zdGFuY2VJbmxpbmVQb2xpY3k6IG5ldyBpYW0uUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgc2lkOiBcIlN0c0FjY2Vzc1wiLFxuICAgICAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICBcInN0czpBc3N1bWVSb2xlXCIsXG4gICAgICAgICAgICAgICAgXCJpYW06QWRkUm9sZVRvSW5zdGFuY2VQcm9maWxlXCIsXG4gICAgICAgICAgICAgICAgXCJpYW06QXR0YWNoUm9sZVBvbGljeVwiLFxuICAgICAgICAgICAgICAgIFwiaWFtOkNyZWF0ZVJvbGVcIixcbiAgICAgICAgICAgICAgICBcImlhbTpDcmVhdGVTZXJ2aWNlTGlua2VkUm9sZVwiLFxuICAgICAgICAgICAgICAgIFwiaWFtOkRlbGV0ZVJvbGVcIixcbiAgICAgICAgICAgICAgICBcImlhbTpEZWxldGVSb2xlUGVybWlzc2lvbnNCb3VuZGFyeVwiLFxuICAgICAgICAgICAgICAgIFwiaWFtOkRlbGV0ZVJvbGVQb2xpY3lcIixcbiAgICAgICAgICAgICAgICBcImlhbTpEZWxldGVTZXJ2aWNlTGlua2VkUm9sZVwiLFxuICAgICAgICAgICAgICAgIFwiaWFtOkRldGFjaFJvbGVQb2xpY3lcIixcbiAgICAgICAgICAgICAgICBcImlhbTpHZXRSb2xlXCIsXG4gICAgICAgICAgICAgICAgXCJpYW06R2V0Um9sZVBvbGljeVwiLFxuICAgICAgICAgICAgICAgIFwiaWFtOkdldFNlcnZpY2VMaW5rZWRSb2xlRGVsZXRpb25TdGF0dXNcIixcbiAgICAgICAgICAgICAgICBcImlhbTpMaXN0QXR0YWNoZWRSb2xlUG9saWNpZXNcIixcbiAgICAgICAgICAgICAgICBcImlhbTpMaXN0SW5zdGFuY2VQcm9maWxlc0ZvclJvbGVcIixcbiAgICAgICAgICAgICAgICBcImlhbTpMaXN0Um9sZVBvbGljaWVzXCIsXG4gICAgICAgICAgICAgICAgXCJpYW06TGlzdFJvbGVzXCIsXG4gICAgICAgICAgICAgICAgXCJpYW06TGlzdFJvbGVUYWdzXCIsXG4gICAgICAgICAgICAgICAgXCJpYW06UHV0Um9sZVBlcm1pc3Npb25zQm91bmRhcnlcIixcbiAgICAgICAgICAgICAgICBcImlhbTpQdXRSb2xlUG9saWN5XCIsXG4gICAgICAgICAgICAgICAgXCJpYW06UmVtb3ZlUm9sZUZyb21JbnN0YW5jZVByb2ZpbGVcIixcbiAgICAgICAgICAgICAgICBcImlhbTpUYWdSb2xlXCIsXG4gICAgICAgICAgICAgICAgXCJpYW06VW50YWdSb2xlXCIsXG4gICAgICAgICAgICAgICAgXCJpYW06VXBkYXRlQXNzdW1lUm9sZVBvbGljeVwiLFxuICAgICAgICAgICAgICAgIFwiaWFtOlVwZGF0ZVJvbGVcIixcbiAgICAgICAgICAgICAgICBcImlhbTpVcGRhdGVSb2xlRGVzY3JpcHRpb25cIixcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbYGFybjphd3M6aWFtOjoke1N0YWNrLm9mKHRoaXMpLmFjY291bnR9OnJvbGUvY2RrLSpgXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcImlhbTpQYXNzUm9sZVwiXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbYGFybjphd3M6aWFtOjoke1N0YWNrLm9mKHRoaXMpLmFjY291bnR9OnJvbGUvY2RrLSpgXSxcbiAgICAgICAgICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICAgICAgICAgIFN0cmluZ0xpa2U6IHtcbiAgICAgICAgICAgICAgICAgIFwiaWFtOlBhc3NlZFRvU2VydmljZVwiOiBcImNsb3VkZm9ybWF0aW9uLmFtYXpvbmF3cy5jb21cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgYWN0aW9uczogW1wiY2xvdWRmb3JtYXRpb246KlwiXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgICAgICAgYGFybjphd3M6Y2xvdWRmb3JtYXRpb246Kjoke1N0YWNrLm9mKHRoaXMpLmFjY291bnR9OnN0YWNrL0NES1Rvb2xraXQvKmAsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgXCJjbG91ZGZvcm1hdGlvbjpDcmVhdGVDaGFuZ2VTZXRcIixcbiAgICAgICAgICAgICAgICBcImNsb3VkZm9ybWF0aW9uOkV4ZWN1dGVDaGFuZ2VTZXRcIixcbiAgICAgICAgICAgICAgICBcImNsb3VkZm9ybWF0aW9uOkRlbGV0ZUNoYW5nZVNldFwiLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcIipcIl0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgc2lkOiBcIlMzQWNjZXNzXCIsXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcInMzOipcIl0sXG4gICAgICAgICAgICAgIHJlc291cmNlczogW1wiKlwiXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBzaWQ6IFwiRUNSQWNjZXNzXCIsXG4gICAgICAgICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgIFwiZWNyOlNldFJlcG9zaXRvcnlQb2xpY3lcIixcbiAgICAgICAgICAgICAgICBcImVjcjpHZXRMaWZlY3ljbGVQb2xpY3lcIixcbiAgICAgICAgICAgICAgICBcImVjcjpQdXRMaWZlY3ljbGVQb2xpY3lcIixcbiAgICAgICAgICAgICAgICBcImVjcjpQdXRJbWFnZVNjYW5uaW5nQ29uZmlndXJhdGlvblwiLFxuICAgICAgICAgICAgICAgIFwiZWNyOkRlc2NyaWJlUmVwb3NpdG9yaWVzXCIsXG4gICAgICAgICAgICAgICAgXCJlY3I6Q3JlYXRlUmVwb3NpdG9yeVwiLFxuICAgICAgICAgICAgICAgIFwiZWNyOkRlbGV0ZVJlcG9zaXRvcnlcIixcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgICAgICAgYGFybjphd3M6ZWNyOio6JHtTdGFjay5vZih0aGlzKS5hY2NvdW50fTpyZXBvc2l0b3J5L2Nkay0qYCxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICBcInNzbTpHZXRQYXJhbWV0ZXIqXCIsXG4gICAgICAgICAgICAgICAgXCJzc206UHV0UGFyYW1ldGVyKlwiLFxuICAgICAgICAgICAgICAgIFwic3NtOkRlbGV0ZVBhcmFtZXRlcipcIixcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgICAgICAgYGFybjphd3M6c3NtOio6JHtTdGFjay5vZih0aGlzKS5hY2NvdW50fTpwYXJhbWV0ZXIvY2RrLWJvb3RzdHJhcC8qYCxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICBcImVjMjpEZXNjcmliZUluc3RhbmNlc1wiLFxuICAgICAgICAgICAgICAgIFwiZWMyOk1vZGlmeVZvbHVtZVwiLFxuICAgICAgICAgICAgICAgIFwiZWMyOkRlc2NyaWJlVm9sdW1lc01vZGlmaWNhdGlvbnMqXCIsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHJlc291cmNlczogW1wiKlwiXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICBcImNvZGVwaXBlbGluZTpFbmFibGVTdGFnZVRyYW5zaXRpb25cIixcbiAgICAgICAgICAgICAgICBcImNvZGVwaXBlbGluZTpEaXNhYmxlU3RhZ2VUcmFuc2l0aW9uXCIsXG4gICAgICAgICAgICAgICAgXCJjb2RlcGlwZWxpbmU6U3RhcnRQaXBlbGluZUV4ZWN1dGlvblwiLFxuICAgICAgICAgICAgICAgIFwiY29kZXBpcGVsaW5lOlN0b3BQaXBlbGluZUV4ZWN1dGlvblwiLFxuICAgICAgICAgICAgICAgIFwiY29kZXBpcGVsaW5lOlVwZGF0ZVBpcGVsaW5lXCIsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgICAgICAgIGBhcm46YXdzOmNvZGVwaXBlbGluZToqOiR7U3RhY2sub2YodGhpcykuYWNjb3VudH06Ki8qYCxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcImttczpEZWNyeXB0XCJdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtgYXJuOmF3czprbXM6Kjoke1N0YWNrLm9mKHRoaXMpLmFjY291bnR9OmtleS8qYF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIC4uLmFkZGl0aW9uYWxJbnN0YW5jZVJvbGVQb2xpY2llcyxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgICBtYW5hZ2VkUG9saWNpZXM6IFtcbiAgICAgICAgaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKFxuICAgICAgICAgIFwiQW1hem9uU1NNTWFuYWdlZEluc3RhbmNlQ29yZVwiLFxuICAgICAgICApLFxuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXG4gICAgICAgICAgXCJDbG91ZFdhdGNoQWdlbnRTZXJ2ZXJQb2xpY3lcIixcbiAgICAgICAgKSxcbiAgICAgICAgaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKFwiQW1hem9uUURldmVsb3BlckFjY2Vzc1wiKSxcbiAgICAgICAgaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKFwiUmVhZE9ubHlBY2Nlc3NcIiksXG4gICAgICBdLFxuICAgIH0pO1xuICAgIE5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgICAgIFtpbnN0YW5jZVJvbGVdLFxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6IFwiQXdzU29sdXRpb25zLUlBTTRcIixcbiAgICAgICAgICByZWFzb246XG4gICAgICAgICAgICBcIkZvciB0aGlzIHRtcCByb2xlIHdlIGRvIG5vdCBuZWVkIHRvIHJlc3RyaWN0IG1hbmFnZWQgcG9saWNpZXNcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBcIkF3c1NvbHV0aW9ucy1JQU01XCIsXG4gICAgICAgICAgcmVhc29uOiBcIkZvciB0aGlzIHRtcCByb2xlIHRoZSB3aWxkY2FyZHMgYXJlIGZpbmVcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICB0cnVlLFxuICAgICk7XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBlYzIuSW5zdGFuY2UodGhpcywgXCJzZXJ2ZXItaW5zdGFuY2VcIiwge1xuICAgICAgdnBjLFxuICAgICAgaW5zdGFuY2VOYW1lLFxuICAgICAgaW5zdGFuY2VUeXBlLFxuICAgICAgbWFjaGluZUltYWdlOiBlYzIuTWFjaGluZUltYWdlLmZyb21Tc21QYXJhbWV0ZXIoXG4gICAgICAgIG1hY2hpbmVJbWFnZUZyb21Tc21QYXJhbWV0ZXIsXG4gICAgICAgIHtcbiAgICAgICAgICBvczogZWMyLk9wZXJhdGluZ1N5c3RlbVR5cGUuTElOVVgsXG4gICAgICAgIH0sXG4gICAgICApLFxuICAgICAgcmVxdWlyZUltZHN2MjogdHJ1ZSxcbiAgICAgIHZwY1N1Ym5ldHM6IHtcbiAgICAgICAgc3VibmV0VHlwZTogZWMyLlN1Ym5ldFR5cGUuUFVCTElDLFxuICAgICAgfSxcbiAgICAgIGFzc29jaWF0ZVB1YmxpY0lwQWRkcmVzczogdHJ1ZSxcbiAgICAgIGRldGFpbGVkTW9uaXRvcmluZzogdHJ1ZSxcbiAgICAgIGJsb2NrRGV2aWNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgZGV2aWNlTmFtZTogXCIvZGV2L3NkYTFcIixcbiAgICAgICAgICB2b2x1bWU6IGVjMi5CbG9ja0RldmljZVZvbHVtZS5lYnMoaW5zdGFuY2VWb2x1bWVTaXplLCB7XG4gICAgICAgICAgICB2b2x1bWVUeXBlOiBlYzIuRWJzRGV2aWNlVm9sdW1lVHlwZS5HUDMsXG4gICAgICAgICAgICBlbmNyeXB0ZWQ6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVPblRlcm1pbmF0aW9uOiB0cnVlLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHJvbGU6IGluc3RhbmNlUm9sZSxcbiAgICAgIHNlY3VyaXR5R3JvdXA6IHNlY0dyb3VwLFxuICAgICAgdXNlckRhdGE6IGVjMi5Vc2VyRGF0YS5jdXN0b20oYFxuICAgICAgICAjY2xvdWQtY29uZmlnXG4gICAgICAgICAgaG9zdG5hbWU6ICR7aW5zdGFuY2VOYW1lfVxuICAgICAgICAgIHJ1bmNtZDpcbiAgICAgICAgICAgIC0gbWtkaXIgLXAgJHtob21lRm9sZGVyfSAmJiBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gJHtob21lRm9sZGVyfVxuICAgICAgYCksXG4gICAgfSk7XG4gICAgTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICAgICAgW2luc3RhbmNlXSxcbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBcIkF3c1NvbHV0aW9ucy1FQzI5XCIsXG4gICAgICAgICAgcmVhc29uOiBcIkZvciB0aGlzIHRtcCBpbnN0YW5jZSB3ZSBkbyBub3QgbmVlZCBhbiBhc2dcIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICB0cnVlLFxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgYSBDRiBkaXN0cmlidXRpb24gKHNwZWNpYWwgaWQpIGFuZCBzcGVjaWFsIENhY2hlUG9saWN5IHRvIGluc3RhbmNlXG4gICAgY29uc3QgY2ZDYWNoZVBvbGljeSA9IG5ldyBjZi5DYWNoZVBvbGljeSh0aGlzLCBcImNmLWNhY2hlLXBvbGljeVwiLCB7XG4gICAgICBjYWNoZVBvbGljeU5hbWU6IGBjZi1jYWNoZS1wb2xpY3ktdnNjb2Rlc2VydmVyLSR7U3RhY2sub2YodGhpcykuc3RhY2tOYW1lfWAsXG4gICAgICBjb21tZW50OiBcIkNhY2hlIHBvbGljeSBmb3IgVlNDb2RlU2VydmVyXCIsXG4gICAgICBtaW5UdGw6IER1cmF0aW9uLnNlY29uZHMoMSksXG4gICAgICBtYXhUdGw6IER1cmF0aW9uLnNlY29uZHMoMzE1MzYwMDApLFxuICAgICAgZGVmYXVsdFR0bDogRHVyYXRpb24uc2Vjb25kcyg4NjQwMCksXG4gICAgICBjb29raWVCZWhhdmlvcjogY2YuQ2FjaGVDb29raWVCZWhhdmlvci5hbGwoKSxcbiAgICAgIGVuYWJsZUFjY2VwdEVuY29kaW5nR3ppcDogZmFsc2UsXG4gICAgICBoZWFkZXJCZWhhdmlvcjoge1xuICAgICAgICBiZWhhdmlvcjogXCJ3aGl0ZWxpc3RcIixcbiAgICAgICAgaGVhZGVyczogW1xuICAgICAgICAgIFwiQWNjZXB0LUNoYXJzZXRcIixcbiAgICAgICAgICBcIkF1dGhvcml6YXRpb25cIixcbiAgICAgICAgICBcIk9yaWdpblwiLFxuICAgICAgICAgIFwiQWNjZXB0XCIsXG4gICAgICAgICAgXCJSZWZlcmVyXCIsXG4gICAgICAgICAgXCJIb3N0XCIsXG4gICAgICAgICAgXCJBY2NlcHQtTGFuZ3VhZ2VcIixcbiAgICAgICAgICBcIkFjY2VwdC1FbmNvZGluZ1wiLFxuICAgICAgICAgIFwiQWNjZXB0LURhdGV0aW1lXCIsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgcXVlcnlTdHJpbmdCZWhhdmlvcjogY2YuQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmFsbCgpLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgb3JpZ2luID0gbmV3IGNmby5IdHRwT3JpZ2luKGluc3RhbmNlLmluc3RhbmNlUHVibGljRG5zTmFtZSwge1xuICAgICAgcHJvdG9jb2xQb2xpY3k6IGNmLk9yaWdpblByb3RvY29sUG9saWN5LkhUVFBfT05MWSxcbiAgICAgIG9yaWdpbklkOiBgQ2xvdWRmcm9udC0ke1N0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZX0tJHtTdGFjay5vZih0aGlzKS5zdGFja05hbWV9YCxcbiAgICB9KTtcblxuICAgIGNvbnN0IGRpc3RyaWJ1dGlvbiA9IG5ldyBjZi5EaXN0cmlidXRpb24odGhpcywgXCJjZi1kaXN0cmlidXRpb25cIiwge1xuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIGh0dHBWZXJzaW9uOiBjZi5IdHRwVmVyc2lvbi5IVFRQMl9BTkRfMyxcbiAgICAgIC8vIE5PVEU6ICdEaXN0cmlidXRpb25zIHRoYXQgdXNlIHRoZSBkZWZhdWx0IENsb3VkRnJvbnQgdmlld2VyIGNlcnRpZmljYXRlIG9yIHVzZSAndmlwJyBmb3IgdGhlICdTc2xTdXBwb3J0TWV0aG9kJ1xuICAgICAgLy8gYXJlIG5vbi1jb21wbGlhbnQgd2l0aCB0aGlzIHJ1bGUsIGFzIHRoZSBtaW5pbXVtIHNlY3VyaXR5IHBvbGljeSBpcyBzZXQgdG8gVExTdjEgcmVnYXJkbGVzc1xuICAgICAgLy8gb2YgdGhlIHNwZWNpZmllZCAnTWluaW11bVByb3RvY29sVmVyc2lvbidcbiAgICAgIC8vIG1pbmltdW1Qcm90b2NvbFZlcnNpb246IGNmLlNlY3VyaXR5UG9saWN5UHJvdG9jb2wuVExTX1YxXzJfMjAyMSxcbiAgICAgIGNvbW1lbnQ6IFwiRGlzdHJpYnV0aW9uIGZvciBWU0NvZGVTZXJ2ZXJcIixcbiAgICAgIHByaWNlQ2xhc3M6IGNmLlByaWNlQ2xhc3MuUFJJQ0VfQ0xBU1NfQUxMLFxuICAgICAgZGVmYXVsdEJlaGF2aW9yOiB7XG4gICAgICAgIGFsbG93ZWRNZXRob2RzOiBjZi5BbGxvd2VkTWV0aG9kcy5BTExPV19BTEwsXG4gICAgICAgIGNhY2hlUG9saWN5OiBjZkNhY2hlUG9saWN5LFxuICAgICAgICBvcmlnaW5SZXF1ZXN0UG9saWN5OiB7XG4gICAgICAgICAgLy8gTWFuYWdlZC1BbGxWaWV3ZXIgLSBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL3VzaW5nLW1hbmFnZWQtb3JpZ2luLXJlcXVlc3QtcG9saWNpZXMuaHRtbCM6fjp0ZXh0PVdoZW4lMjB1c2luZyUyMEFXUyw0N2U0JTJEYjk4OSUyRDU0OTJlYWZhMDdkM1xuICAgICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3lJZDogXCIyMTZhZGVmNi01YzdmLTQ3ZTQtYjk4OS01NDkyZWFmYTA3ZDNcIixcbiAgICAgICAgfSxcbiAgICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IGNmLlZpZXdlclByb3RvY29sUG9saWN5LkFMTE9XX0FMTCxcbiAgICAgICAgb3JpZ2luLFxuICAgICAgfSxcbiAgICAgIGFkZGl0aW9uYWxCZWhhdmlvcnM6IHtcbiAgICAgICAgXCIvcHJveHkvKlwiOiB7XG4gICAgICAgICAgYWxsb3dlZE1ldGhvZHM6IGNmLkFsbG93ZWRNZXRob2RzLkFMTE9XX0FMTCxcbiAgICAgICAgICBjb21wcmVzczogZmFsc2UsXG4gICAgICAgICAgLy8gc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS91c2luZy1tYW5hZ2VkLWNhY2hlLXBvbGljaWVzLmh0bWwjbWFuYWdlZC1jYWNoZS1wb2xpY3ktY2FjaGluZy1kaXNhYmxlZFxuICAgICAgICAgIGNhY2hlUG9saWN5OiBjZi5DYWNoZVBvbGljeS5DQUNISU5HX0RJU0FCTEVELFxuICAgICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3k6IHtcbiAgICAgICAgICAgIC8vIE1hbmFnZWQtQWxsVmlld2VyIC0gc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS91c2luZy1tYW5hZ2VkLW9yaWdpbi1yZXF1ZXN0LXBvbGljaWVzLmh0bWwjOn46dGV4dD1XaGVuJTIwdXNpbmclMjBBV1MsNDdlNCUyRGI5ODklMkQ1NDkyZWFmYTA3ZDNcbiAgICAgICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3lJZDogXCIyMTZhZGVmNi01YzdmLTQ3ZTQtYjk4OS01NDkyZWFmYTA3ZDNcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBjZi5WaWV3ZXJQcm90b2NvbFBvbGljeS5BTExPV19BTEwsXG4gICAgICAgICAgb3JpZ2luLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBOYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gICAgICBbZGlzdHJpYnV0aW9uXSxcbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBcIkF3c1NvbHV0aW9ucy1DRlIxXCIsXG4gICAgICAgICAgcmVhc29uOiBcIkZvciB0aGlzIHRtcCBkaXN0cmlidXRpb24gd2UgZG8gbm90IG5lZWQgZ2VvIHJlc3RyaWN0aW9uc1wiLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IFwiQXdzU29sdXRpb25zLUNGUjJcIixcbiAgICAgICAgICByZWFzb246IFwiRm9yIHRoaXMgdG1wIGRpc3RyaWJ1dGlvbiB3ZSBkbyBub3QgbmVlZCB3YWYgaW50ZWdyYXRpb25cIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBcIkF3c1NvbHV0aW9ucy1DRlIzXCIsXG4gICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgXCJGb3IgdGhpcyB0bXAgZGlzdHJpYnV0aW9uIHdlIGRvIG5vdCBuZWVkIGFjY2VzcyBsb2dnaW5nIGVuYWJsZWRcIixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBcIkF3c1NvbHV0aW9ucy1DRlI0XCIsXG4gICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgXCJGb3IgdGhpcyB0bXAgZGlzdHJpYnV0aW9uIHdlIGRvIG5vdCBuZWVkIGxpbWl0IFNTTCBwcm90b2NvbHMgYXMgd2UgdXNlIHRoZSBkZWZhdWx0IHZpZXdlciBjZXJ0XCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogXCJBd3NTb2x1dGlvbnMtQ0ZSNVwiLFxuICAgICAgICAgIHJlYXNvbjpcbiAgICAgICAgICAgIFwiRm9yIHRoaXMgdG1wIGRpc3RyaWJ1dGlvbiB3ZSBkbyBub3QgbmVlZCBsaW1pdCBTU0wgcHJvdG9jb2xzIGFzIHdlIHVzZSB0aGUgZGVmYXVsdCB2aWV3ZXIgY2VydFwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHRydWUsXG4gICAgKTtcblxuICAgIC8vIFVzZSBhIGN1c3RvbSByZXNvdXJjZSBsYW1iZGEgdG8gcnVuIHRoZSBTU00gZG9jdW1lbnQgb24gdGhlIGluc3RhbmNlXG4gICAgc3dpdGNoIChpbnN0YW5jZU9wZXJhdGluZ1N5c3RlbSkge1xuICAgICAgY2FzZSBMaW51eEZsYXZvclR5cGUuVUJVTlRVXzIyOlxuICAgICAgY2FzZSBMaW51eEZsYXZvclR5cGUuVUJVTlRVXzI0OlxuICAgICAgICBJbnN0YWxsZXIudWJ1bnR1KHtcbiAgICAgICAgICBpbnN0YW5jZUlkOiBpbnN0YW5jZS5pbnN0YW5jZUlkLFxuICAgICAgICAgIHZzQ29kZVVzZXI6IHZzQ29kZVVzZXIsXG4gICAgICAgICAgdnNDb2RlUGFzc3dvcmQ6IHZzY29kZVBhc3N3b3JkLFxuICAgICAgICAgIGRldlNlcnZlckJhc2VQYXRoOiBwcm9wcz8uZGV2U2VydmVyQmFzZVBhdGgsXG4gICAgICAgICAgZGV2U2VydmVyUG9ydDogcHJvcHM/LmRldlNlcnZlclBvcnQsXG4gICAgICAgICAgaG9tZUZvbGRlcjogaG9tZUZvbGRlcixcbiAgICAgICAgfSkuX2JpbmQodGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMaW51eEZsYXZvclR5cGUuQU1BWk9OX0xJTlVYXzIwMjM6XG4gICAgICAgIEluc3RhbGxlci5hbWF6b25MaW51eDIwMjMoe1xuICAgICAgICAgIGluc3RhbmNlSWQ6IGluc3RhbmNlLmluc3RhbmNlSWQsXG4gICAgICAgICAgdnNDb2RlVXNlcjogdnNDb2RlVXNlcixcbiAgICAgICAgICB2c0NvZGVQYXNzd29yZDogdnNjb2RlUGFzc3dvcmQsXG4gICAgICAgICAgZGV2U2VydmVyQmFzZVBhdGg6IHByb3BzPy5kZXZTZXJ2ZXJCYXNlUGF0aCxcbiAgICAgICAgICBkZXZTZXJ2ZXJQb3J0OiBwcm9wcz8uZGV2U2VydmVyUG9ydCxcbiAgICAgICAgICBob21lRm9sZGVyOiBob21lRm9sZGVyLFxuICAgICAgICB9KS5fYmluZCh0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIExpbnV4IGZsYXZvcjogJHtpbnN0YW5jZU9wZXJhdGluZ1N5c3RlbX1gKTtcbiAgICB9XG4gICAgLy8gc28gd2UgcGFzcyB0aGUgb3V0ZXIgc2NvcGUgb2YgdGhpcyBjb25zdHJ1Y3QgdGhyb3VnaCB0aGUgaW5zdGFsbGVyXG5cbiAgICAvLyBOT1RFOiBtYXliZSBoYXZlIGEgaGVhbGhjaGVjayBDRk4gY3VzdG9tIHJlc291cmNlIHRvIHNlZSBpZiB0aGUgdnNjb2RlIHNlcnZlciBpcyBoZWFsdGh5XG4gICAgLy8gYXRtIHRoaXMgaXMgYWNoaWV2ZWQgYnkgdGhlIGludGVnIHRlc3RzXG5cbiAgICAvLyBPdXRwdXRzXG4gICAgdGhpcy5kb21haW5OYW1lID0gYGh0dHBzOi8vJHtkaXN0cmlidXRpb24uZG9tYWluTmFtZX0vP2ZvbGRlcj0ke2hvbWVGb2xkZXJ9YDtcbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIFwiZG9tYWluTmFtZVwiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJUaGUgZG9tYWluIG5hbWUgb2YgdGhlIGRpc3RyaWJ1dGlvblwiLFxuICAgICAgdmFsdWU6IHRoaXMuZG9tYWluTmFtZSxcbiAgICB9KTtcblxuICAgIHRoaXMucGFzc3dvcmQgPSB2c2NvZGVQYXNzd29yZDtcbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIFwicGFzc3dvcmRcIiwge1xuICAgICAgZGVzY3JpcHRpb246IFwiVGhlIHBhc3N3b3JkIGZvciB0aGUgVlNDb2RlIHNlcnZlclwiLFxuICAgICAgdmFsdWU6IHZzY29kZVBhc3N3b3JkLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogVGFncyBhbGwgdGhlIHJlc291cmNlcyBpbiB0aGUgY29uc3RydWN0XG4gKi9cbmNsYXNzIE5vZGVUYWdnZXIgaW1wbGVtZW50cyBJQXNwZWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSB0YWdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIGNvbnN0cnVjdG9yKHRhZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICB0aGlzLnRhZ3MgPSB0YWdzO1xuICB9XG5cbiAgdmlzaXQobm9kZTogSUNvbnN0cnVjdCkge1xuICAgIE9iamVjdC5lbnRyaWVzKHRoaXMudGFncykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PlxuICAgICAgVGFncy5vZihub2RlKS5hZGQoa2V5LCB2YWx1ZSksXG4gICAgKTtcbiAgfVxufVxuIl19