@mavogel/cdk-vscode-server 0.0.21 → 0.0.23

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.
Files changed (37) hide show
  1. package/.jsii +84 -29
  2. package/API.md +15 -1
  3. package/integ-tests/integ.al2023.ts.snapshot/IntegSetupVSCodeOnAl2023DefaultTestDeployAssert74D8F645.assets.json +2 -2
  4. package/integ-tests/integ.al2023.ts.snapshot/IntegSetupVSCodeOnAl2023DefaultTestDeployAssert74D8F645.template.json +1 -1
  5. package/integ-tests/integ.al2023.ts.snapshot/IntegTestStackAl2023.assets.json +2 -2
  6. package/integ-tests/integ.al2023.ts.snapshot/IntegTestStackAl2023.template.json +2 -2
  7. package/integ-tests/integ.al2023.ts.snapshot/integ.json +1 -1
  8. package/integ-tests/integ.al2023.ts.snapshot/manifest.json +2 -2
  9. package/integ-tests/integ.al2023.ts.snapshot/tree.json +11 -11
  10. package/integ-tests/integ.ubuntu.ts.snapshot/IntegSetupVSCodeOnUbuntuDefaultTestDeployAssertFF8DF2C5.assets.json +2 -2
  11. package/integ-tests/integ.ubuntu.ts.snapshot/IntegSetupVSCodeOnUbuntuDefaultTestDeployAssertFF8DF2C5.template.json +1 -1
  12. package/integ-tests/integ.ubuntu.ts.snapshot/IntegTestStackUbuntu22.assets.json +2 -2
  13. package/integ-tests/integ.ubuntu.ts.snapshot/IntegTestStackUbuntu22.template.json +2 -2
  14. package/integ-tests/integ.ubuntu.ts.snapshot/integ.json +1 -1
  15. package/integ-tests/integ.ubuntu.ts.snapshot/manifest.json +2 -2
  16. package/integ-tests/integ.ubuntu.ts.snapshot/tree.json +11 -11
  17. package/lib/index.d.ts +1 -1
  18. package/lib/index.js +1 -1
  19. package/lib/installer/installer-function.js +2 -2
  20. package/lib/installer/installer.d.ts +1 -1
  21. package/lib/installer/installer.js +201 -201
  22. package/lib/installer/installer.lambda.d.ts +2 -2
  23. package/lib/installer/installer.lambda.js +15 -15
  24. package/lib/mappings.d.ts +1 -1
  25. package/lib/mappings.js +13 -13
  26. package/lib/prefixlist-retriever/prefixlist-retriever.d.ts +2 -2
  27. package/lib/prefixlist-retriever/prefixlist-retriever.js +14 -14
  28. package/lib/secret-retriever/secret-retriever-function.js +2 -2
  29. package/lib/secret-retriever/secret-retriever.d.ts +2 -2
  30. package/lib/secret-retriever/secret-retriever.js +17 -17
  31. package/lib/secret-retriever/secret-retriever.lambda.d.ts +1 -1
  32. package/lib/secret-retriever/secret-retriever.lambda.js +6 -6
  33. package/lib/suppress-nags.d.ts +1 -1
  34. package/lib/suppress-nags.js +3 -3
  35. package/lib/vscode-server.d.ts +3 -3
  36. package/lib/vscode-server.js +127 -127
  37. package/package.json +13 -11
@@ -54,10 +54,10 @@ class VSCodeServer extends constructs_1.Construct {
54
54
  constructor(scope, id, props) {
55
55
  super(scope, id);
56
56
  // defaults
57
- const vsCodeUser = props?.vscodeUser ?? "participant";
58
- const instanceName = props?.instanceName ?? "VSCodeServer";
57
+ const vsCodeUser = props?.vscodeUser ?? 'participant';
58
+ const instanceName = props?.instanceName ?? 'VSCodeServer';
59
59
  const instanceVolumeSize = props?.instanceVolumeSize ?? 40;
60
- const homeFolder = props?.homeFolder ?? "/Workshop";
60
+ const homeFolder = props?.homeFolder ?? '/Workshop';
61
61
  const instanceClass = props?.instanceClass ?? ec2.InstanceClass.M7G;
62
62
  const instanceSize = props?.instanceSize ?? ec2.InstanceSize.XLARGE;
63
63
  const instanceType = ec2.InstanceType.of(instanceClass, instanceSize);
@@ -66,13 +66,13 @@ class VSCodeServer extends constructs_1.Construct {
66
66
  const machineImageFromSsmParameter = (0, mappings_1.getAmiSSMParameterForLinuxArchitectureAndFlavor)(instanceCpuArchitecture, instanceOperatingSystem);
67
67
  const additionalInstanceRolePolicies = props?.additionalInstanceRolePolicies ?? [];
68
68
  const additionalTags = props?.additionalTags ?? {};
69
- const defaultTags = { app: "vscode-server" };
69
+ const defaultTags = { app: 'vscode-server' };
70
70
  const mergedTags = { ...defaultTags, ...additionalTags };
71
71
  aws_cdk_lib_1.Aspects.of(this).add(new NodeTagger(mergedTags));
72
- let vscodePassword = props?.vscodePassword ?? "";
73
- if (vscodePassword == "") {
72
+ let vscodePassword = props?.vscodePassword ?? '';
73
+ if (vscodePassword == '') {
74
74
  // Create a secret which is then inject in the SSM document to install vscode server
75
- const secret = new secretsmanager.Secret(this, "password-secret", {
75
+ const secret = new secretsmanager.Secret(this, 'password-secret', {
76
76
  generateSecretString: {
77
77
  passwordLength: 16,
78
78
  secretStringTemplate: JSON.stringify({
@@ -80,13 +80,13 @@ class VSCodeServer extends constructs_1.Construct {
80
80
  }),
81
81
  excludePunctuation: true,
82
82
  includeSpace: false,
83
- generateStringKey: "password",
83
+ generateStringKey: 'password',
84
84
  },
85
85
  });
86
86
  cdk_nag_1.NagSuppressions.addResourceSuppressions([secret], [
87
87
  {
88
- id: "AwsSolutions-SMG4",
89
- reason: "For this tmp vc code server we do not need password rotation",
88
+ id: 'AwsSolutions-SMG4',
89
+ reason: 'For this tmp vc code server we do not need password rotation',
90
90
  },
91
91
  ], true);
92
92
  // Have a custom resource to pass the secret data on? -> yes because not resolvable on compile time
@@ -96,12 +96,12 @@ class VSCodeServer extends constructs_1.Construct {
96
96
  vscodePassword = secretRetriever.secretPasswordPlaintext;
97
97
  }
98
98
  // Create default vpc
99
- const vpc = new ec2.Vpc(this, "vpc", {
99
+ const vpc = new ec2.Vpc(this, 'vpc', {
100
100
  maxAzs: 2,
101
101
  createInternetGateway: true,
102
102
  subnetConfiguration: [
103
103
  {
104
- name: "public",
104
+ name: 'public',
105
105
  subnetType: ec2.SubnetType.PUBLIC,
106
106
  },
107
107
  ],
@@ -110,78 +110,78 @@ class VSCodeServer extends constructs_1.Construct {
110
110
  });
111
111
  cdk_nag_1.NagSuppressions.addResourceSuppressions([vpc], [
112
112
  {
113
- id: "AwsSolutions-VPC7",
114
- reason: "For this tmp vpc we do not need flow logs",
113
+ id: 'AwsSolutions-VPC7',
114
+ reason: 'For this tmp vpc we do not need flow logs',
115
115
  },
116
116
  ], true);
117
117
  // Create a SecGroup associated withe the CF dist pList
118
- const secGroup = new ec2.SecurityGroup(this, "cf-to-server-sg", {
118
+ const secGroup = new ec2.SecurityGroup(this, 'cf-to-server-sg', {
119
119
  vpc,
120
- description: "SG for VSCodeServer - only allow CloudFront ingress",
121
- securityGroupName: "cloudfront-to-vscode-server",
120
+ description: 'SG for VSCodeServer - only allow CloudFront ingress',
121
+ securityGroupName: 'cloudfront-to-vscode-server',
122
122
  });
123
- const awsManagedPrefixList = new prefixlist_retriever_1.AwsManagedPrefixList(this, "cf-prefixlistId", {
124
- 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',
125
125
  });
126
126
  cdk_nag_1.NagSuppressions.addResourceSuppressions([awsManagedPrefixList], [
127
127
  {
128
- id: "AwsSolutions-IAM5",
129
- reason: "For this provider wildcards are fine",
128
+ id: 'AwsSolutions-IAM5',
129
+ reason: 'For this provider wildcards are fine',
130
130
  },
131
131
  ], true);
132
- 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');
133
133
  // Create an EC2 instance associated with the sec group + instance profile and role
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")),
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')),
136
136
  inlinePolicies: {
137
137
  VSCodeInstanceInlinePolicy: new iam.PolicyDocument({
138
138
  statements: [
139
139
  new iam.PolicyStatement({
140
- sid: "StsAccess",
140
+ sid: 'StsAccess',
141
141
  effect: iam.Effect.ALLOW,
142
142
  actions: [
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",
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',
169
169
  ],
170
170
  resources: [`arn:aws:iam::${aws_cdk_lib_1.Stack.of(this).account}:role/cdk-*`],
171
171
  }),
172
172
  new iam.PolicyStatement({
173
173
  effect: iam.Effect.ALLOW,
174
- actions: ["iam:PassRole"],
174
+ actions: ['iam:PassRole'],
175
175
  resources: [`arn:aws:iam::${aws_cdk_lib_1.Stack.of(this).account}:role/cdk-*`],
176
176
  conditions: {
177
177
  StringLike: {
178
- "iam:PassedToService": "cloudformation.amazonaws.com",
178
+ 'iam:PassedToService': 'cloudformation.amazonaws.com',
179
179
  },
180
180
  },
181
181
  }),
182
182
  new iam.PolicyStatement({
183
183
  effect: iam.Effect.ALLOW,
184
- actions: ["cloudformation:*"],
184
+ actions: ['cloudformation:*'],
185
185
  resources: [
186
186
  `arn:aws:cloudformation:*:${aws_cdk_lib_1.Stack.of(this).account}:stack/CDKToolkit/*`,
187
187
  ],
@@ -189,28 +189,28 @@ class VSCodeServer extends constructs_1.Construct {
189
189
  new iam.PolicyStatement({
190
190
  effect: iam.Effect.ALLOW,
191
191
  actions: [
192
- "cloudformation:CreateChangeSet",
193
- "cloudformation:ExecuteChangeSet",
194
- "cloudformation:DeleteChangeSet",
192
+ 'cloudformation:CreateChangeSet',
193
+ 'cloudformation:ExecuteChangeSet',
194
+ 'cloudformation:DeleteChangeSet',
195
195
  ],
196
- resources: ["*"],
196
+ resources: ['*'],
197
197
  }),
198
198
  new iam.PolicyStatement({
199
- sid: "S3Access",
200
- actions: ["s3:*"],
201
- resources: ["*"],
199
+ sid: 'S3Access',
200
+ actions: ['s3:*'],
201
+ resources: ['*'],
202
202
  }),
203
203
  new iam.PolicyStatement({
204
- sid: "ECRAccess",
204
+ sid: 'ECRAccess',
205
205
  effect: iam.Effect.ALLOW,
206
206
  actions: [
207
- "ecr:SetRepositoryPolicy",
208
- "ecr:GetLifecyclePolicy",
209
- "ecr:PutLifecyclePolicy",
210
- "ecr:PutImageScanningConfiguration",
211
- "ecr:DescribeRepositories",
212
- "ecr:CreateRepository",
213
- "ecr:DeleteRepository",
207
+ 'ecr:SetRepositoryPolicy',
208
+ 'ecr:GetLifecyclePolicy',
209
+ 'ecr:PutLifecyclePolicy',
210
+ 'ecr:PutImageScanningConfiguration',
211
+ 'ecr:DescribeRepositories',
212
+ 'ecr:CreateRepository',
213
+ 'ecr:DeleteRepository',
214
214
  ],
215
215
  resources: [
216
216
  `arn:aws:ecr:*:${aws_cdk_lib_1.Stack.of(this).account}:repository/cdk-*`,
@@ -219,9 +219,9 @@ class VSCodeServer extends constructs_1.Construct {
219
219
  new iam.PolicyStatement({
220
220
  effect: iam.Effect.ALLOW,
221
221
  actions: [
222
- "ssm:GetParameter*",
223
- "ssm:PutParameter*",
224
- "ssm:DeleteParameter*",
222
+ 'ssm:GetParameter*',
223
+ 'ssm:PutParameter*',
224
+ 'ssm:DeleteParameter*',
225
225
  ],
226
226
  resources: [
227
227
  `arn:aws:ssm:*:${aws_cdk_lib_1.Stack.of(this).account}:parameter/cdk-bootstrap/*`,
@@ -230,20 +230,20 @@ class VSCodeServer extends constructs_1.Construct {
230
230
  new iam.PolicyStatement({
231
231
  effect: iam.Effect.ALLOW,
232
232
  actions: [
233
- "ec2:DescribeInstances",
234
- "ec2:ModifyVolume",
235
- "ec2:DescribeVolumesModifications*",
233
+ 'ec2:DescribeInstances',
234
+ 'ec2:ModifyVolume',
235
+ 'ec2:DescribeVolumesModifications*',
236
236
  ],
237
- resources: ["*"],
237
+ resources: ['*'],
238
238
  }),
239
239
  new iam.PolicyStatement({
240
240
  effect: iam.Effect.ALLOW,
241
241
  actions: [
242
- "codepipeline:EnableStageTransition",
243
- "codepipeline:DisableStageTransition",
244
- "codepipeline:StartPipelineExecution",
245
- "codepipeline:StopPipelineExecution",
246
- "codepipeline:UpdatePipeline",
242
+ 'codepipeline:EnableStageTransition',
243
+ 'codepipeline:DisableStageTransition',
244
+ 'codepipeline:StartPipelineExecution',
245
+ 'codepipeline:StopPipelineExecution',
246
+ 'codepipeline:UpdatePipeline',
247
247
  ],
248
248
  resources: [
249
249
  `arn:aws:codepipeline:*:${aws_cdk_lib_1.Stack.of(this).account}:*/*`,
@@ -251,7 +251,7 @@ class VSCodeServer extends constructs_1.Construct {
251
251
  }),
252
252
  new iam.PolicyStatement({
253
253
  effect: iam.Effect.ALLOW,
254
- actions: ["kms:Decrypt"],
254
+ actions: ['kms:Decrypt'],
255
255
  resources: [`arn:aws:kms:*:${aws_cdk_lib_1.Stack.of(this).account}:key/*`],
256
256
  }),
257
257
  ...additionalInstanceRolePolicies,
@@ -259,23 +259,23 @@ class VSCodeServer extends constructs_1.Construct {
259
259
  }),
260
260
  },
261
261
  managedPolicies: [
262
- iam.ManagedPolicy.fromAwsManagedPolicyName("AmazonSSMManagedInstanceCore"),
263
- iam.ManagedPolicy.fromAwsManagedPolicyName("CloudWatchAgentServerPolicy"),
264
- iam.ManagedPolicy.fromAwsManagedPolicyName("AmazonQDeveloperAccess"),
265
- iam.ManagedPolicy.fromAwsManagedPolicyName("ReadOnlyAccess"),
262
+ iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonSSMManagedInstanceCore'),
263
+ iam.ManagedPolicy.fromAwsManagedPolicyName('CloudWatchAgentServerPolicy'),
264
+ iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonQDeveloperAccess'),
265
+ iam.ManagedPolicy.fromAwsManagedPolicyName('ReadOnlyAccess'),
266
266
  ],
267
267
  });
268
268
  cdk_nag_1.NagSuppressions.addResourceSuppressions([instanceRole], [
269
269
  {
270
- id: "AwsSolutions-IAM4",
271
- reason: "For this tmp role we do not need to restrict managed policies",
270
+ id: 'AwsSolutions-IAM4',
271
+ reason: 'For this tmp role we do not need to restrict managed policies',
272
272
  },
273
273
  {
274
- id: "AwsSolutions-IAM5",
275
- reason: "For this tmp role the wildcards are fine",
274
+ id: 'AwsSolutions-IAM5',
275
+ reason: 'For this tmp role the wildcards are fine',
276
276
  },
277
277
  ], true);
278
- const instance = new ec2.Instance(this, "server-instance", {
278
+ const instance = new ec2.Instance(this, 'server-instance', {
279
279
  vpc,
280
280
  instanceName,
281
281
  instanceType,
@@ -290,7 +290,7 @@ class VSCodeServer extends constructs_1.Construct {
290
290
  detailedMonitoring: true,
291
291
  blockDevices: [
292
292
  {
293
- deviceName: "/dev/sda1",
293
+ deviceName: '/dev/sda1',
294
294
  volume: ec2.BlockDeviceVolume.ebs(instanceVolumeSize, {
295
295
  volumeType: ec2.EbsDeviceVolumeType.GP3,
296
296
  encrypted: true,
@@ -309,31 +309,31 @@ class VSCodeServer extends constructs_1.Construct {
309
309
  });
310
310
  cdk_nag_1.NagSuppressions.addResourceSuppressions([instance], [
311
311
  {
312
- id: "AwsSolutions-EC29",
313
- reason: "For this tmp instance we do not need an asg",
312
+ id: 'AwsSolutions-EC29',
313
+ reason: 'For this tmp instance we do not need an asg',
314
314
  },
315
315
  ], true);
316
316
  // Create a CF distribution (special id) and special CachePolicy to instance
317
- const cfCachePolicy = new cf.CachePolicy(this, "cf-cache-policy", {
317
+ const cfCachePolicy = new cf.CachePolicy(this, 'cf-cache-policy', {
318
318
  cachePolicyName: `cf-cache-policy-vscodeserver-${aws_cdk_lib_1.Stack.of(this).stackName}`,
319
- comment: "Cache policy for VSCodeServer",
319
+ comment: 'Cache policy for VSCodeServer',
320
320
  minTtl: aws_cdk_lib_1.Duration.seconds(1),
321
321
  maxTtl: aws_cdk_lib_1.Duration.seconds(31536000),
322
322
  defaultTtl: aws_cdk_lib_1.Duration.seconds(86400),
323
323
  cookieBehavior: cf.CacheCookieBehavior.all(),
324
324
  enableAcceptEncodingGzip: false,
325
325
  headerBehavior: {
326
- behavior: "whitelist",
326
+ behavior: 'whitelist',
327
327
  headers: [
328
- "Accept-Charset",
329
- "Authorization",
330
- "Origin",
331
- "Accept",
332
- "Referer",
333
- "Host",
334
- "Accept-Language",
335
- "Accept-Encoding",
336
- "Accept-Datetime",
328
+ 'Accept-Charset',
329
+ 'Authorization',
330
+ 'Origin',
331
+ 'Accept',
332
+ 'Referer',
333
+ 'Host',
334
+ 'Accept-Language',
335
+ 'Accept-Encoding',
336
+ 'Accept-Datetime',
337
337
  ],
338
338
  },
339
339
  queryStringBehavior: cf.CacheQueryStringBehavior.all(),
@@ -342,34 +342,34 @@ class VSCodeServer extends constructs_1.Construct {
342
342
  protocolPolicy: cf.OriginProtocolPolicy.HTTP_ONLY,
343
343
  originId: `Cloudfront-${aws_cdk_lib_1.Stack.of(this).stackName}-${aws_cdk_lib_1.Stack.of(this).stackName}`,
344
344
  });
345
- const distribution = new cf.Distribution(this, "cf-distribution", {
345
+ const distribution = new cf.Distribution(this, 'cf-distribution', {
346
346
  enabled: true,
347
347
  httpVersion: cf.HttpVersion.HTTP2_AND_3,
348
348
  // NOTE: 'Distributions that use the default CloudFront viewer certificate or use 'vip' for the 'SslSupportMethod'
349
349
  // are non-compliant with this rule, as the minimum security policy is set to TLSv1 regardless
350
350
  // of the specified 'MinimumProtocolVersion'
351
351
  // minimumProtocolVersion: cf.SecurityPolicyProtocol.TLS_V1_2_2021,
352
- comment: "Distribution for VSCodeServer",
352
+ comment: 'Distribution for VSCodeServer',
353
353
  priceClass: cf.PriceClass.PRICE_CLASS_ALL,
354
354
  defaultBehavior: {
355
355
  allowedMethods: cf.AllowedMethods.ALLOW_ALL,
356
356
  cachePolicy: cfCachePolicy,
357
357
  originRequestPolicy: {
358
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
359
- originRequestPolicyId: "216adef6-5c7f-47e4-b989-5492eafa07d3",
359
+ originRequestPolicyId: '216adef6-5c7f-47e4-b989-5492eafa07d3',
360
360
  },
361
361
  viewerProtocolPolicy: cf.ViewerProtocolPolicy.ALLOW_ALL,
362
362
  origin,
363
363
  },
364
364
  additionalBehaviors: {
365
- "/proxy/*": {
365
+ '/proxy/*': {
366
366
  allowedMethods: cf.AllowedMethods.ALLOW_ALL,
367
367
  compress: false,
368
368
  // see https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-cache-policies.html#managed-cache-policy-caching-disabled
369
369
  cachePolicy: cf.CachePolicy.CACHING_DISABLED,
370
370
  originRequestPolicy: {
371
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
372
- originRequestPolicyId: "216adef6-5c7f-47e4-b989-5492eafa07d3",
372
+ originRequestPolicyId: '216adef6-5c7f-47e4-b989-5492eafa07d3',
373
373
  },
374
374
  viewerProtocolPolicy: cf.ViewerProtocolPolicy.ALLOW_ALL,
375
375
  origin,
@@ -378,24 +378,24 @@ class VSCodeServer extends constructs_1.Construct {
378
378
  });
379
379
  cdk_nag_1.NagSuppressions.addResourceSuppressions([distribution], [
380
380
  {
381
- id: "AwsSolutions-CFR1",
382
- reason: "For this tmp distribution we do not need geo restrictions",
381
+ id: 'AwsSolutions-CFR1',
382
+ reason: 'For this tmp distribution we do not need geo restrictions',
383
383
  },
384
384
  {
385
- id: "AwsSolutions-CFR2",
386
- reason: "For this tmp distribution we do not need waf integration",
385
+ id: 'AwsSolutions-CFR2',
386
+ reason: 'For this tmp distribution we do not need waf integration',
387
387
  },
388
388
  {
389
- id: "AwsSolutions-CFR3",
390
- reason: "For this tmp distribution we do not need access logging enabled",
389
+ id: 'AwsSolutions-CFR3',
390
+ reason: 'For this tmp distribution we do not need access logging enabled',
391
391
  },
392
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",
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
395
  },
396
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",
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
399
  },
400
400
  ], true);
401
401
  // Use a custom resource lambda to run the SSM document on the instance
@@ -429,20 +429,20 @@ class VSCodeServer extends constructs_1.Construct {
429
429
  // atm this is achieved by the integ tests
430
430
  // Outputs
431
431
  this.domainName = `https://${distribution.domainName}/?folder=${homeFolder}`;
432
- new aws_cdk_lib_1.CfnOutput(this, "domainName", {
433
- description: "The domain name of the distribution",
432
+ new aws_cdk_lib_1.CfnOutput(this, 'domainName', {
433
+ description: 'The domain name of the distribution',
434
434
  value: this.domainName,
435
435
  });
436
436
  this.password = vscodePassword;
437
- new aws_cdk_lib_1.CfnOutput(this, "password", {
438
- description: "The password for the VSCode server",
437
+ new aws_cdk_lib_1.CfnOutput(this, 'password', {
438
+ description: 'The password for the VSCode server',
439
439
  value: vscodePassword,
440
440
  });
441
441
  }
442
442
  }
443
443
  exports.VSCodeServer = VSCodeServer;
444
444
  _a = JSII_RTTI_SYMBOL_1;
445
- VSCodeServer[_a] = { fqn: "@mavogel/cdk-vscode-server.VSCodeServer", version: "0.0.21" };
445
+ VSCodeServer[_a] = { fqn: "@mavogel/cdk-vscode-server.VSCodeServer", version: "0.0.23" };
446
446
  /**
447
447
  * Tags all the resources in the construct
448
448
  */
@@ -454,4 +454,4 @@ class NodeTagger {
454
454
  Object.entries(this.tags).forEach(([key, value]) => aws_cdk_lib_1.Tags.of(node).add(key, value));
455
455
  }
456
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
457
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidnNjb2RlLXNlcnZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92c2NvZGUtc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBT3FCO0FBQ3JCLGlEQUFpRDtBQUNqRCwwREFBMEQ7QUFDMUQsMkNBQTJDO0FBQzNDLDJDQUEyQztBQUMzQyxpRUFBaUU7QUFDakUscUNBQTBDO0FBQzFDLDJDQUFtRDtBQUNuRCxxREFBa0Q7QUFDbEQseUNBQTZFO0FBQzdFLHNGQUFtRjtBQUNuRiwwRUFBc0U7QUFrR3RFOztHQUVHO0FBQ0gsSUFBWSxlQWVYO0FBZkQsV0FBWSxlQUFlO0lBQ3pCOztPQUVHO0lBQ0gseUNBQXNCLENBQUE7SUFFdEI7O09BRUc7SUFDSCx5Q0FBc0IsQ0FBQTtJQUV0Qjs7T0FFRztJQUNILCtDQUE0QixDQUFBO0FBQzlCLENBQUMsRUFmVyxlQUFlLCtCQUFmLGVBQWUsUUFlMUI7QUFFRDs7R0FFRztBQUNILElBQVkscUJBVVg7QUFWRCxXQUFZLHFCQUFxQjtJQUMvQjs7T0FFRztJQUNILG9DQUFXLENBQUE7SUFFWDs7T0FFRztJQUNILHdDQUFlLENBQUE7QUFDakIsQ0FBQyxFQVZXLHFCQUFxQixxQ0FBckIscUJBQXFCLFFBVWhDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLFlBQWEsU0FBUSxzQkFBUztJQVd6QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXlCO1FBQ2pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsV0FBVztRQUNYLE1BQU0sVUFBVSxHQUFHLEtBQUssRUFBRSxVQUFVLElBQUksYUFBYSxDQUFDO1FBQ3RELE1BQU0sWUFBWSxHQUFHLEtBQUssRUFBRSxZQUFZLElBQUksY0FBYyxDQUFDO1FBQzNELE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxFQUFFLGtCQUFrQixJQUFJLEVBQUUsQ0FBQztRQUMzRCxNQUFNLFVBQVUsR0FBRyxLQUFLLEVBQUUs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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXNwZWN0cyxcbiAgQ2ZuT3V0cHV0LFxuICBEdXJhdGlvbixcbiAgSUFzcGVjdCxcbiAgU3RhY2ssXG4gIFRhZ3MsXG59IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGNmIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZGZyb250JztcbmltcG9ydCAqIGFzIGNmbyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC1vcmlnaW5zJztcbmltcG9ydCAqIGFzIGVjMiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIHNlY3JldHNtYW5hZ2VyIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlcic7XG5pbXBvcnQgeyBOYWdTdXBwcmVzc2lvbnMgfSBmcm9tICdjZGstbmFnJztcbmltcG9ydCB7IENvbnN0cnVjdCwgSUNvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgSW5zdGFsbGVyIH0gZnJvbSAnLi9pbnN0YWxsZXIvaW5zdGFsbGVyJztcbmltcG9ydCB7IGdldEFtaVNTTVBhcmFtZXRlckZvckxpbnV4QXJjaGl0ZWN0dXJlQW5kRmxhdm9yIH0gZnJvbSAnLi9tYXBwaW5ncyc7XG5pbXBvcnQgeyBBd3NNYW5hZ2VkUHJlZml4TGlzdCB9IGZyb20gJy4vcHJlZml4bGlzdC1yZXRyaWV2ZXIvcHJlZml4bGlzdC1yZXRyaWV2ZXInO1xuaW1wb3J0IHsgU2VjcmV0UmV0cmlldmVyIH0gZnJvbSAnLi9zZWNyZXQtcmV0cmlldmVyL3NlY3JldC1yZXRyaWV2ZXInO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIHRoZSBWU0NvZGVTZXJ2ZXIgY29uc3RydWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVlNDb2RlU2VydmVyUHJvcHMge1xuICAvKipcbiAgICogVXNlck5hbWUgZm9yIFZTQ29kZSBTZXJ2ZXJcbiAgICpcbiAgICogQGRlZmF1bHQgLSBwYXJ0aWNpcGFudFxuICAgKi9cbiAgcmVhZG9ubHkgdnNjb2RlVXNlcj86IHN0cmluZztcblxuICAvKipcbiAgICogUGFzc3dvcmQgZm9yIFZTQ29kZSBTZXJ2ZXJcbiAgICpcbiAgICogQGRlZmF1bHQgLSBlbXB0eSBhbmQgd2lsbCB0aGVuIGJlIGdlbmVyYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgdnNjb2RlUGFzc3dvcmQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZTQ29kZSBTZXJ2ZXIgRUMyIGluc3RhbmNlIG5hbWVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBWU0NvZGVTZXJ2ZXJcbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbmNlTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVlNDb2RlIFNlcnZlciBFQzIgaW5zdGFuY2Ugdm9sdW1lIHNpemUgaW4gR0JcbiAgICpcbiAgICogQGRlZmF1bHQgLSA0MFxuICAgKi9cbiAgcmVhZG9ubHkgaW5zdGFuY2VWb2x1bWVTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBWU0NvZGUgU2VydmVyIEVDMiBpbnN0YW5jZSBjbGFzc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIG03Z1xuICAgKi9cbiAgcmVhZG9ubHkgaW5zdGFuY2VDbGFzcz86IGVjMi5JbnN0YW5jZUNsYXNzO1xuXG4gIC8qKlxuICAgKiBWU0NvZGUgU2VydmVyIEVDMiBpbnN0YW5jZSBzaXplXG4gICAqXG4gICAqIEBkZWZhdWx0IC0geGxhcmdlXG4gICAqL1xuICByZWFkb25seSBpbnN0YW5jZVNpemU/OiBlYzIuSW5zdGFuY2VTaXplO1xuXG4gIC8qKlxuICAgKiBWU0NvZGUgU2VydmVyIEVDMiBvcGVyYXRpbmcgc3lzdGVtXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVWJ1bnR1LTIyXG4gICAqL1xuICByZWFkb25seSBpbnN0YW5jZU9wZXJhdGluZ1N5c3RlbT86IExpbnV4Rmxhdm9yVHlwZTtcblxuICAvKipcbiAgICogVlNDb2RlIFNlcnZlciBFQzIgY3B1IGFyY2hpdGVjdHVyZSBmb3IgdGhlIG9wZXJhdGluZyBzeXN0ZW1cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhcm1cbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbmNlQ3B1QXJjaGl0ZWN0dXJlPzogTGludXhBcmNoaXRlY3R1cmVUeXBlO1xuXG4gIC8qKlxuICAgKiBGb2xkZXIgdG8gb3BlbiBpbiBWUyBDb2RlIHNlcnZlclxuICAgKlxuICAgKiBAZGVmYXVsdCAtIC9Xb3Jrc2hvcFxuICAgKi9cbiAgcmVhZG9ubHkgaG9tZUZvbGRlcj86IHN0cmluZztcblxuICAvKipcbiAgICogQmFzZSBwYXRoIGZvciB0aGUgYXBwbGljYXRpb24gdG8gYmUgYWRkZWQgdG8gTmdpbnggc2l0ZXMtYXZhaWxhYmxlIGxpc3RcbiAgICpcbiAgICogQGRlZmF1bHQgLSBhcHBcbiAgICovXG4gIHJlYWRvbmx5IGRldlNlcnZlckJhc2VQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQb3J0IGZvciB0aGUgRGV2U2VydmVyXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gODA4MVxuICAgKi9cbiAgcmVhZG9ubHkgZGV2U2VydmVyUG9ydD86IG51bWJlcjtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBpbnN0YW5jZSByb2xlIHBvbGljaWVzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gW11cbiAgICovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxJbnN0YW5jZVJvbGVQb2xpY2llcz86IGlhbS5Qb2xpY3lTdGF0ZW1lbnRbXTtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCB0YWdzIHRvIGFkZCB0byB0aGUgaW5zdGFuY2VcbiAgICpcbiAgICogQGRlZmF1bHQgLSB7fVxuICAgKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbFRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIFRoZSBmbGF2b3Igb2YgbGludXggeW91IHdhbnQgdG8gcnVuIHZzY29kZSBzZXJ2ZXIgb25cbiAqL1xuZXhwb3J0IGVudW0gTGludXhGbGF2b3JUeXBlIHtcbiAgLyoqXG4gICAqIFVidW50dSAyMlxuICAgKi9cbiAgVUJVTlRVXzIyID0gJ3VidW50dTIyJyxcblxuICAvKipcbiAgICogVWJ1bnR1IDI0XG4gICAqL1xuICBVQlVOVFVfMjQgPSAndWJ1bnR1MjQnLFxuXG4gIC8qKlxuICAgKiBBbWF6b24gTGludXggMjAyM1xuICAgKi9cbiAgQU1BWk9OX0xJTlVYXzIwMjMgPSAnYWwyMDIzJyxcbn1cblxuLyoqXG4gKiBUaGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBjcHUgeW91IHdhbnQgdG8gcnVuIHZzY29kZSBzZXJ2ZXIgb25cbiAqL1xuZXhwb3J0IGVudW0gTGludXhBcmNoaXRlY3R1cmVUeXBlIHtcbiAgLyoqXG4gICAqIEFSTSBhcmNoaXRlY3R1cmVcbiAgICovXG4gIEFSTSA9ICdhcm0nLFxuXG4gIC8qKlxuICAgKiBBTUQ2NCBhcmNoaXRlY3R1cmVcbiAgICovXG4gIEFNRDY0ID0gJ2FtZDY0Jyxcbn1cblxuLyoqXG4gKiBWU0NvZGVTZXJ2ZXIgLSBzcGluIGl0IHVwIGluIHVuZGVyIDEwIG1pbnV0ZXNcbiAqL1xuZXhwb3J0IGNsYXNzIFZTQ29kZVNlcnZlciBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZG9tYWluIHRoZSBzZXJ2ZXIgaXMgcmVhY2hhYmxlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZG9tYWluTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFzc3dvcmQgdG8gbG9naW4gdG8gdGhlIHNlcnZlclxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhc3N3b3JkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBWU0NvZGVTZXJ2ZXJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICAvLyBkZWZhdWx0c1xuICAgIGNvbnN0IHZzQ29kZVVzZXIgPSBwcm9wcz8udnNjb2RlVXNlciA/PyAncGFydGljaXBhbnQnO1xuICAgIGNvbnN0IGluc3RhbmNlTmFtZSA9IHByb3BzPy5pbnN0YW5jZU5hbWUgPz8gJ1ZTQ29kZVNlcnZlcic7XG4gICAgY29uc3QgaW5zdGFuY2VWb2x1bWVTaXplID0gcHJvcHM/Lmluc3RhbmNlVm9sdW1lU2l6ZSA/PyA0MDtcbiAgICBjb25zdCBob21lRm9sZGVyID0gcHJvcHM/LmhvbWVGb2xkZXIgPz8gJy9Xb3Jrc2hvcCc7XG4gICAgY29uc3QgaW5zdGFuY2VDbGFzcyA9IHByb3BzPy5pbnN0YW5jZUNsYXNzID8/IGVjMi5JbnN0YW5jZUNsYXNzLk03RztcbiAgICBjb25zdCBpbnN0YW5jZVNpemUgPSBwcm9wcz8uaW5zdGFuY2VTaXplID8/IGVjMi5JbnN0YW5jZVNpemUuWExBUkdFO1xuICAgIGNvbnN0IGluc3RhbmNlVHlwZSA9IGVjMi5JbnN0YW5jZVR5cGUub2YoaW5zdGFuY2VDbGFzcywgaW5zdGFuY2VTaXplKTtcbiAgICBjb25zdCBpbnN0YW5jZU9wZXJhdGluZ1N5c3RlbSA9XG4gICAgICBwcm9wcz8uaW5zdGFuY2VPcGVyYXRpbmdTeXN0ZW0gPz8gTGludXhGbGF2b3JUeXBlLlVCVU5UVV8yMjtcbiAgICBjb25zdCBpbnN0YW5jZUNwdUFyY2hpdGVjdHVyZSA9XG4gICAgICBwcm9wcz8uaW5zdGFuY2VDcHVBcmNoaXRlY3R1cmUgPz8gTGludXhBcmNoaXRlY3R1cmVUeXBlLkFSTTtcbiAgICBjb25zdCBtYWNoaW5lSW1hZ2VGcm9tU3NtUGFyYW1ldGVyID1cbiAgICAgIGdldEFtaVNTTVBhcmFtZXRlckZvckxpbnV4QXJjaGl0ZWN0dXJlQW5kRmxhdm9yKFxuICAgICAgICBpbnN0YW5jZUNwdUFyY2hpdGVjdHVyZSxcbiAgICAgICAgaW5zdGFuY2VPcGVyYXRpbmdTeXN0ZW0sXG4gICAgICApO1xuICAgIGNvbnN0IGFkZGl0aW9uYWxJbnN0YW5jZVJvbGVQb2xpY2llcyA9XG4gICAgICBwcm9wcz8uYWRkaXRpb25hbEluc3RhbmNlUm9sZVBvbGljaWVzID8/IFtdO1xuICAgIGNvbnN0IGFkZGl0aW9uYWxUYWdzID0gcHJvcHM/LmFkZGl0aW9uYWxUYWdzID8/IHt9O1xuICAgIGNvbnN0IGRlZmF1bHRUYWdzID0geyBhcHA6ICd2c2NvZGUtc2VydmVyJyB9O1xuXG4gICAgY29uc3QgbWVyZ2VkVGFncyA9IHsgLi4uZGVmYXVsdFRhZ3MsIC4uLmFkZGl0aW9uYWxUYWdzIH07XG4gICAgQXNwZWN0cy5vZih0aGlzKS5hZGQobmV3IE5vZGVUYWdnZXIobWVyZ2VkVGFncykpO1xuXG4gICAgbGV0IHZzY29kZVBhc3N3b3JkID0gcHJvcHM/LnZzY29kZVBhc3N3b3JkID8/ICcnO1xuICAgIGlmICh2c2NvZGVQYXNzd29yZCA9PSAnJykge1xuICAgICAgLy8gQ3JlYXRlIGEgc2VjcmV0IHdoaWNoIGlzIHRoZW4gaW5qZWN0IGluIHRoZSBTU00gZG9jdW1lbnQgdG8gaW5zdGFsbCB2c2NvZGUgc2VydmVyXG4gICAgICBjb25zdCBzZWNyZXQgPSBuZXcgc2VjcmV0c21hbmFnZXIuU2VjcmV0KHRoaXMsICdwYXNzd29yZC1zZWNyZXQnLCB7XG4gICAgICAgIGdlbmVyYXRlU2VjcmV0U3RyaW5nOiB7XG4gICAgICAgICAgcGFzc3dvcmRMZW5ndGg6IDE2LFxuICAgICAgICAgIHNlY3JldFN0cmluZ1RlbXBsYXRlOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICB1c2VybmFtZTogdnNDb2RlVXNlcixcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBleGNsdWRlUHVuY3R1YXRpb246IHRydWUsXG4gICAgICAgICAgaW5jbHVkZVNwYWNlOiBmYWxzZSxcbiAgICAgICAgICBnZW5lcmF0ZVN0cmluZ0tleTogJ3Bhc3N3b3JkJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICAgICAgICBbc2VjcmV0XSxcbiAgICAgICAgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnQXdzU29sdXRpb25zLVNNRzQnLFxuICAgICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgICAnRm9yIHRoaXMgdG1wIHZjIGNvZGUgc2VydmVyIHdlIGRvIG5vdCBuZWVkIHBhc3N3b3JkIHJvdGF0aW9uJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICB0cnVlLFxuICAgICAgKTtcblxuICAgICAgLy8gSGF2ZSBhIGN1c3RvbSByZXNvdXJjZSB0byBwYXNzIHRoZSBzZWNyZXQgZGF0YSBvbj8gLT4geWVzIGJlY2F1c2Ugbm90IHJlc29sdmFibGUgb24gY29tcGlsZSB0aW1lXG4gICAgICBjb25zdCBzZWNyZXRSZXRyaWV2ZXIgPSBTZWNyZXRSZXRyaWV2ZXIubmV3KHtcbiAgICAgICAgc2VjcmV0QXJuOiBzZWNyZXQuc2VjcmV0QXJuLFxuICAgICAgfSkuX2JpbmQodGhpcyk7XG5cbiAgICAgIHZzY29kZVBhc3N3b3JkID0gc2VjcmV0UmV0cmlldmVyLnNlY3JldFBhc3N3b3JkUGxhaW50ZXh0O1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBkZWZhdWx0IHZwY1xuICAgIGNvbnN0IHZwYyA9IG5ldyBlYzIuVnBjKHRoaXMsICd2cGMnLCB7XG4gICAgICBtYXhBenM6IDIsXG4gICAgICBjcmVhdGVJbnRlcm5ldEdhdGV3YXk6IHRydWUsXG4gICAgICBzdWJuZXRDb25maWd1cmF0aW9uOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAncHVibGljJyxcbiAgICAgICAgICBzdWJuZXRUeXBlOiBlYzIuU3VibmV0VHlwZS5QVUJMSUMsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgZW5hYmxlRG5zSG9zdG5hbWVzOiB0cnVlLFxuICAgICAgZW5hYmxlRG5zU3VwcG9ydDogdHJ1ZSxcbiAgICB9KTtcbiAgICBOYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gICAgICBbdnBjXSxcbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnQXdzU29sdXRpb25zLVZQQzcnLFxuICAgICAgICAgIHJlYXNvbjogJ0ZvciB0aGlzIHRtcCB2cGMgd2UgZG8gbm90IG5lZWQgZmxvdyBsb2dzJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICB0cnVlLFxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgYSBTZWNHcm91cCBhc3NvY2lhdGVkIHdpdGhlIHRoZSBDRiBkaXN0IHBMaXN0XG4gICAgY29uc3Qgc2VjR3JvdXAgPSBuZXcgZWMyLlNlY3VyaXR5R3JvdXAodGhpcywgJ2NmLXRvLXNlcnZlci1zZycsIHtcbiAgICAgIHZwYyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnU0cgZm9yIFZTQ29kZVNlcnZlciAtIG9ubHkgYWxsb3cgQ2xvdWRGcm9udCBpbmdyZXNzJyxcbiAgICAgIHNlY3VyaXR5R3JvdXBOYW1lOiAnY2xvdWRmcm9udC10by12c2NvZGUtc2VydmVyJyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGF3c01hbmFnZWRQcmVmaXhMaXN0ID0gbmV3IEF3c01hbmFnZWRQcmVmaXhMaXN0KFxuICAgICAgdGhpcyxcbiAgICAgICdjZi1wcmVmaXhsaXN0SWQnLFxuICAgICAge1xuICAgICAgICBuYW1lOiAnY29tLmFtYXpvbmF3cy5nbG9iYWwuY2xvdWRmcm9udC5vcmlnaW4tZmFjaW5nJyxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBOYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gICAgICBbYXdzTWFuYWdlZFByZWZpeExpc3RdLFxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsXG4gICAgICAgICAgcmVhc29uOiAnRm9yIHRoaXMgcHJvdmlkZXIgd2lsZGNhcmRzIGFyZSBmaW5lJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICB0cnVlLFxuICAgICk7XG5cbiAgICBzZWNHcm91cC5hZGRJbmdyZXNzUnVsZShcbiAgICAgIGVjMi5QZWVyLnByZWZpeExpc3QoYXdzTWFuYWdlZFByZWZpeExpc3QucHJlZml4TGlzdC5wcmVmaXhMaXN0SWQpLFxuICAgICAgZWMyLlBvcnQudGNwKDgwKSxcbiAgICAgICdBbGxvdyBIVFRQIGZyb20gY29tLmFtYXpvbmF3cy5nbG9iYWwuY2xvdWRmcm9udC5vcmlnaW4tZmFjaW5nJyxcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIGFuIEVDMiBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlYyBncm91cCArIGluc3RhbmNlIHByb2ZpbGUgYW5kIHJvbGVcbiAgICBjb25zdCBpbnN0YW5jZVJvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgJ3NlcnZlci1pbnN0YW5jZS1yb2xlJywge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLkNvbXBvc2l0ZVByaW5jaXBhbChcbiAgICAgICAgbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdlYzIuYW1hem9uYXdzLmNvbScpLFxuICAgICAgICBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ3NzbS5hbWF6b25hd3MuY29tJyksXG4gICAgICApLFxuICAgICAgaW5saW5lUG9saWNpZXM6IHtcbiAgICAgICAgVlNDb2RlSW5zdGFuY2VJbmxpbmVQb2xpY3k6IG5ldyBpYW0uUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgc2lkOiAnU3RzQWNjZXNzJyxcbiAgICAgICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgJ3N0czpBc3N1bWVSb2xlJyxcbiAgICAgICAgICAgICAgICAnaWFtOkFkZFJvbGVUb0luc3RhbmNlUHJvZmlsZScsXG4gICAgICAgICAgICAgICAgJ2lhbTpBdHRhY2hSb2xlUG9saWN5JyxcbiAgICAgICAgICAgICAgICAnaWFtOkNyZWF0ZVJvbGUnLFxuICAgICAgICAgICAgICAgICdpYW06Q3JlYXRlU2VydmljZUxpbmtlZFJvbGUnLFxuICAgICAgICAgICAgICAgICdpYW06RGVsZXRlUm9sZScsXG4gICAgICAgICAgICAgICAgJ2lhbTpEZWxldGVSb2xlUGVybWlzc2lvbnNCb3VuZGFyeScsXG4gICAgICAgICAgICAgICAgJ2lhbTpEZWxldGVSb2xlUG9saWN5JyxcbiAgICAgICAgICAgICAgICAnaWFtOkRlbGV0ZVNlcnZpY2VMaW5rZWRSb2xlJyxcbiAgICAgICAgICAgICAgICAnaWFtOkRldGFjaFJvbGVQb2xpY3knLFxuICAgICAgICAgICAgICAgICdpYW06R2V0Um9sZScsXG4gICAgICAgICAgICAgICAgJ2lhbTpHZXRSb2xlUG9saWN5JyxcbiAgICAgICAgICAgICAgICAnaWFtOkdldFNlcnZpY2VMaW5rZWRSb2xlRGVsZXRpb25TdGF0dXMnLFxuICAgICAgICAgICAgICAgICdpYW06TGlzdEF0dGFjaGVkUm9sZVBvbGljaWVzJyxcbiAgICAgICAgICAgICAgICAnaWFtOkxpc3RJbnN0YW5jZVByb2ZpbGVzRm9yUm9sZScsXG4gICAgICAgICAgICAgICAgJ2lhbTpMaXN0Um9sZVBvbGljaWVzJyxcbiAgICAgICAgICAgICAgICAnaWFtOkxpc3RSb2xlcycsXG4gICAgICAgICAgICAgICAgJ2lhbTpMaXN0Um9sZVRhZ3MnLFxuICAgICAgICAgICAgICAgICdpYW06UHV0Um9sZVBlcm1pc3Npb25zQm91bmRhcnknLFxuICAgICAgICAgICAgICAgICdpYW06UHV0Um9sZVBvbGljeScsXG4gICAgICAgICAgICAgICAgJ2lhbTpSZW1vdmVSb2xlRnJvbUluc3RhbmNlUHJvZmlsZScsXG4gICAgICAgICAgICAgICAgJ2lhbTpUYWdSb2xlJyxcbiAgICAgICAgICAgICAgICAnaWFtOlVudGFnUm9sZScsXG4gICAgICAgICAgICAgICAgJ2lhbTpVcGRhdGVBc3N1bWVSb2xlUG9saWN5JyxcbiAgICAgICAgICAgICAgICAnaWFtOlVwZGF0ZVJvbGUnLFxuICAgICAgICAgICAgICAgICdpYW06VXBkYXRlUm9sZURlc2NyaXB0aW9uJyxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbYGFybjphd3M6aWFtOjoke1N0YWNrLm9mKHRoaXMpLmFjY291bnR9OnJvbGUvY2RrLSpgXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFsnaWFtOlBhc3NSb2xlJ10sXG4gICAgICAgICAgICAgIHJlc291cmNlczogW2Bhcm46YXdzOmlhbTo6JHtTdGFjay5vZih0aGlzKS5hY2NvdW50fTpyb2xlL2Nkay0qYF0sXG4gICAgICAgICAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBTdHJpbmdMaWtlOiB7XG4gICAgICAgICAgICAgICAgICAnaWFtOlBhc3NlZFRvU2VydmljZSc6ICdjbG91ZGZvcm1hdGlvbi5hbWF6b25hd3MuY29tJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgYWN0aW9uczogWydjbG91ZGZvcm1hdGlvbjoqJ10sXG4gICAgICAgICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgICAgICAgIGBhcm46YXdzOmNsb3VkZm9ybWF0aW9uOio6JHtTdGFjay5vZih0aGlzKS5hY2NvdW50fTpzdGFjay9DREtUb29sa2l0LypgLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICdjbG91ZGZvcm1hdGlvbjpDcmVhdGVDaGFuZ2VTZXQnLFxuICAgICAgICAgICAgICAgICdjbG91ZGZvcm1hdGlvbjpFeGVjdXRlQ2hhbmdlU2V0JyxcbiAgICAgICAgICAgICAgICAnY2xvdWRmb3JtYXRpb246RGVsZXRlQ2hhbmdlU2V0JyxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgICBzaWQ6ICdTM0FjY2VzcycsXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFsnczM6KiddLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIHNpZDogJ0VDUkFjY2VzcycsXG4gICAgICAgICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICdlY3I6U2V0UmVwb3NpdG9yeVBvbGljeScsXG4gICAgICAgICAgICAgICAgJ2VjcjpHZXRMaWZlY3ljbGVQb2xpY3knLFxuICAgICAgICAgICAgICAgICdlY3I6UHV0TGlmZWN5Y2xlUG9saWN5JyxcbiAgICAgICAgICAgICAgICAnZWNyOlB1dEltYWdlU2Nhbm5pbmdDb25maWd1cmF0aW9uJyxcbiAgICAgICAgICAgICAgICAnZWNyOkRlc2NyaWJlUmVwb3NpdG9yaWVzJyxcbiAgICAgICAgICAgICAgICAnZWNyOkNyZWF0ZVJlcG9zaXRvcnknLFxuICAgICAgICAgICAgICAgICdlY3I6RGVsZXRlUmVwb3NpdG9yeScsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgICAgICAgIGBhcm46YXdzOmVjcjoqOiR7U3RhY2sub2YodGhpcykuYWNjb3VudH06cmVwb3NpdG9yeS9jZGstKmAsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgJ3NzbTpHZXRQYXJhbWV0ZXIqJyxcbiAgICAgICAgICAgICAgICAnc3NtOlB1dFBhcmFtZXRlcionLFxuICAgICAgICAgICAgICAgICdzc206RGVsZXRlUGFyYW1ldGVyKicsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgICAgICAgIGBhcm46YXdzOnNzbToqOiR7U3RhY2sub2YodGhpcykuYWNjb3VudH06cGFyYW1ldGVyL2Nkay1ib290c3RyYXAvKmAsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgJ2VjMjpEZXNjcmliZUluc3RhbmNlcycsXG4gICAgICAgICAgICAgICAgJ2VjMjpNb2RpZnlWb2x1bWUnLFxuICAgICAgICAgICAgICAgICdlYzI6RGVzY3JpYmVWb2x1bWVzTW9kaWZpY2F0aW9ucyonLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICdjb2RlcGlwZWxpbmU6RW5hYmxlU3RhZ2VUcmFuc2l0aW9uJyxcbiAgICAgICAgICAgICAgICAnY29kZXBpcGVsaW5lOkRpc2FibGVTdGFnZVRyYW5zaXRpb24nLFxuICAgICAgICAgICAgICAgICdjb2RlcGlwZWxpbmU6U3RhcnRQaXBlbGluZUV4ZWN1dGlvbicsXG4gICAgICAgICAgICAgICAgJ2NvZGVwaXBlbGluZTpTdG9wUGlwZWxpbmVFeGVjdXRpb24nLFxuICAgICAgICAgICAgICAgICdjb2RlcGlwZWxpbmU6VXBkYXRlUGlwZWxpbmUnLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICAgICAgICBgYXJuOmF3czpjb2RlcGlwZWxpbmU6Kjoke1N0YWNrLm9mKHRoaXMpLmFjY291bnR9OiovKmAsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbJ2ttczpEZWNyeXB0J10sXG4gICAgICAgICAgICAgIHJlc291cmNlczogW2Bhcm46YXdzOmttczoqOiR7U3RhY2sub2YodGhpcykuYWNjb3VudH06a2V5LypgXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgLi4uYWRkaXRpb25hbEluc3RhbmNlUm9sZVBvbGljaWVzLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICAgIG1hbmFnZWRQb2xpY2llczogW1xuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXG4gICAgICAgICAgJ0FtYXpvblNTTU1hbmFnZWRJbnN0YW5jZUNvcmUnLFxuICAgICAgICApLFxuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXG4gICAgICAgICAgJ0Nsb3VkV2F0Y2hBZ2VudFNlcnZlclBvbGljeScsXG4gICAgICAgICksXG4gICAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnQW1hem9uUURldmVsb3BlckFjY2VzcycpLFxuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoJ1JlYWRPbmx5QWNjZXNzJyksXG4gICAgICBdLFxuICAgIH0pO1xuICAgIE5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgICAgIFtpbnN0YW5jZVJvbGVdLFxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNCcsXG4gICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgJ0ZvciB0aGlzIHRtcCByb2xlIHdlIGRvIG5vdCBuZWVkIHRvIHJlc3RyaWN0IG1hbmFnZWQgcG9saWNpZXMnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsXG4gICAgICAgICAgcmVhc29uOiAnRm9yIHRoaXMgdG1wIHJvbGUgdGhlIHdpbGRjYXJkcyBhcmUgZmluZScsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuXG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgZWMyLkluc3RhbmNlKHRoaXMsICdzZXJ2ZXItaW5zdGFuY2UnLCB7XG4gICAgICB2cGMsXG4gICAgICBpbnN0YW5jZU5hbWUsXG4gICAgICBpbnN0YW5jZVR5cGUsXG4gICAgICBtYWNoaW5lSW1hZ2U6IGVjMi5NYWNoaW5lSW1hZ2UuZnJvbVNzbVBhcmFtZXRlcihcbiAgICAgICAgbWFjaGluZUltYWdlRnJvbVNzbVBhcmFtZXRlcixcbiAgICAgICAge1xuICAgICAgICAgIG9zOiBlYzIuT3BlcmF0aW5nU3lzdGVtVHlwZS5MSU5VWCxcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgICByZXF1aXJlSW1kc3YyOiB0cnVlLFxuICAgICAgdnBjU3VibmV0czoge1xuICAgICAgICBzdWJuZXRUeXBlOiBlYzIuU3VibmV0VHlwZS5QVUJMSUMsXG4gICAgICB9LFxuICAgICAgYXNzb2NpYXRlUHVibGljSXBBZGRyZXNzOiB0cnVlLFxuICAgICAgZGV0YWlsZWRNb25pdG9yaW5nOiB0cnVlLFxuICAgICAgYmxvY2tEZXZpY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBkZXZpY2VOYW1lOiAnL2Rldi9zZGExJyxcbiAgICAgICAgICB2b2x1bWU6IGVjMi5CbG9ja0RldmljZVZvbHVtZS5lYnMoaW5zdGFuY2VWb2x1bWVTaXplLCB7XG4gICAgICAgICAgICB2b2x1bWVUeXBlOiBlYzIuRWJzRGV2aWNlVm9sdW1lVHlwZS5HUDMsXG4gICAgICAgICAgICBlbmNyeXB0ZWQ6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVPblRlcm1pbmF0aW9uOiB0cnVlLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHJvbGU6IGluc3RhbmNlUm9sZSxcbiAgICAgIHNlY3VyaXR5R3JvdXA6IHNlY0dyb3VwLFxuICAgICAgdXNlckRhdGE6IGVjMi5Vc2VyRGF0YS5jdXN0b20oYFxuICAgICAgICAjY2xvdWQtY29uZmlnXG4gICAgICAgICAgaG9zdG5hbWU6ICR7aW5zdGFuY2VOYW1lfVxuICAgICAgICAgIHJ1bmNtZDpcbiAgICAgICAgICAgIC0gbWtkaXIgLXAgJHtob21lRm9sZGVyfSAmJiBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gJHtob21lRm9sZGVyfVxuICAgICAgYCksXG4gICAgfSk7XG4gICAgTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICAgICAgW2luc3RhbmNlXSxcbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnQXdzU29sdXRpb25zLUVDMjknLFxuICAgICAgICAgIHJlYXNvbjogJ0ZvciB0aGlzIHRtcCBpbnN0YW5jZSB3ZSBkbyBub3QgbmVlZCBhbiBhc2cnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHRydWUsXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSBhIENGIGRpc3RyaWJ1dGlvbiAoc3BlY2lhbCBpZCkgYW5kIHNwZWNpYWwgQ2FjaGVQb2xpY3kgdG8gaW5zdGFuY2VcbiAgICBjb25zdCBjZkNhY2hlUG9saWN5ID0gbmV3IGNmLkNhY2hlUG9saWN5KHRoaXMsICdjZi1jYWNoZS1wb2xpY3knLCB7XG4gICAgICBjYWNoZVBvbGljeU5hbWU6IGBjZi1jYWNoZS1wb2xpY3ktdnNjb2Rlc2VydmVyLSR7U3RhY2sub2YodGhpcykuc3RhY2tOYW1lfWAsXG4gICAgICBjb21tZW50OiAnQ2FjaGUgcG9saWN5IGZvciBWU0NvZGVTZXJ2ZXInLFxuICAgICAgbWluVHRsOiBEdXJhdGlvbi5zZWNvbmRzKDEpLFxuICAgICAgbWF4VHRsOiBEdXJhdGlvbi5zZWNvbmRzKDMxNTM2MDAwKSxcbiAgICAgIGRlZmF1bHRUdGw6IER1cmF0aW9uLnNlY29uZHMoODY0MDApLFxuICAgICAgY29va2llQmVoYXZpb3I6IGNmLkNhY2hlQ29va2llQmVoYXZpb3IuYWxsKCksXG4gICAgICBlbmFibGVBY2NlcHRFbmNvZGluZ0d6aXA6IGZhbHNlLFxuICAgICAgaGVhZGVyQmVoYXZpb3I6IHtcbiAgICAgICAgYmVoYXZpb3I6ICd3aGl0ZWxpc3QnLFxuICAgICAgICBoZWFkZXJzOiBbXG4gICAgICAgICAgJ0FjY2VwdC1DaGFyc2V0JyxcbiAgICAgICAgICAnQXV0aG9yaXphdGlvbicsXG4gICAgICAgICAgJ09yaWdpbicsXG4gICAgICAgICAgJ0FjY2VwdCcsXG4gICAgICAgICAgJ1JlZmVyZXInLFxuICAgICAgICAgICdIb3N0JyxcbiAgICAgICAgICAnQWNjZXB0LUxhbmd1YWdlJyxcbiAgICAgICAgICAnQWNjZXB0LUVuY29kaW5nJyxcbiAgICAgICAgICAnQWNjZXB0LURhdGV0aW1lJyxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICBxdWVyeVN0cmluZ0JlaGF2aW9yOiBjZi5DYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IuYWxsKCksXG4gICAgfSk7XG5cbiAgICBjb25zdCBvcmlnaW4gPSBuZXcgY2ZvLkh0dHBPcmlnaW4oaW5zdGFuY2UuaW5zdGFuY2VQdWJsaWNEbnNOYW1lLCB7XG4gICAgICBwcm90b2NvbFBvbGljeTogY2YuT3JpZ2luUHJvdG9jb2xQb2xpY3kuSFRUUF9PTkxZLFxuICAgICAgb3JpZ2luSWQ6IGBDbG91ZGZyb250LSR7U3RhY2sub2YodGhpcykuc3RhY2tOYW1lfS0ke1N0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZX1gLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZGlzdHJpYnV0aW9uID0gbmV3IGNmLkRpc3RyaWJ1dGlvbih0aGlzLCAnY2YtZGlzdHJpYnV0aW9uJywge1xuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIGh0dHBWZXJzaW9uOiBjZi5IdHRwVmVyc2lvbi5IVFRQMl9BTkRfMyxcbiAgICAgIC8vIE5PVEU6ICdEaXN0cmlidXRpb25zIHRoYXQgdXNlIHRoZSBkZWZhdWx0IENsb3VkRnJvbnQgdmlld2VyIGNlcnRpZmljYXRlIG9yIHVzZSAndmlwJyBmb3IgdGhlICdTc2xTdXBwb3J0TWV0aG9kJ1xuICAgICAgLy8gYXJlIG5vbi1jb21wbGlhbnQgd2l0aCB0aGlzIHJ1bGUsIGFzIHRoZSBtaW5pbXVtIHNlY3VyaXR5IHBvbGljeSBpcyBzZXQgdG8gVExTdjEgcmVnYXJkbGVzc1xuICAgICAgLy8gb2YgdGhlIHNwZWNpZmllZCAnTWluaW11bVByb3RvY29sVmVyc2lvbidcbiAgICAgIC8vIG1pbmltdW1Qcm90b2NvbFZlcnNpb246IGNmLlNlY3VyaXR5UG9saWN5UHJvdG9jb2wuVExTX1YxXzJfMjAyMSxcbiAgICAgIGNvbW1lbnQ6ICdEaXN0cmlidXRpb24gZm9yIFZTQ29kZVNlcnZlcicsXG4gICAgICBwcmljZUNsYXNzOiBjZi5QcmljZUNsYXNzLlBSSUNFX0NMQVNTX0FMTCxcbiAgICAgIGRlZmF1bHRCZWhhdmlvcjoge1xuICAgICAgICBhbGxvd2VkTWV0aG9kczogY2YuQWxsb3dlZE1ldGhvZHMuQUxMT1dfQUxMLFxuICAgICAgICBjYWNoZVBvbGljeTogY2ZDYWNoZVBvbGljeSxcbiAgICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeToge1xuICAgICAgICAgIC8vIE1hbmFnZWQtQWxsVmlld2VyIC0gc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS91c2luZy1tYW5hZ2VkLW9yaWdpbi1yZXF1ZXN0LXBvbGljaWVzLmh0bWwjOn46dGV4dD1XaGVuJTIwdXNpbmclMjBBV1MsNDdlNCUyRGI5ODklMkQ1NDkyZWFmYTA3ZDNcbiAgICAgICAgICBvcmlnaW5SZXF1ZXN0UG9saWN5SWQ6ICcyMTZhZGVmNi01YzdmLTQ3ZTQtYjk4OS01NDkyZWFmYTA3ZDMnLFxuICAgICAgICB9LFxuICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogY2YuVmlld2VyUHJvdG9jb2xQb2xpY3kuQUxMT1dfQUxMLFxuICAgICAgICBvcmlnaW4sXG4gICAgICB9LFxuICAgICAgYWRkaXRpb25hbEJlaGF2aW9yczoge1xuICAgICAgICAnL3Byb3h5LyonOiB7XG4gICAgICAgICAgYWxsb3dlZE1ldGhvZHM6IGNmLkFsbG93ZWRNZXRob2RzLkFMTE9XX0FMTCxcbiAgICAgICAgICBjb21wcmVzczogZmFsc2UsXG4gICAgICAgICAgLy8gc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS91c2luZy1tYW5hZ2VkLWNhY2hlLXBvbGljaWVzLmh0bWwjbWFuYWdlZC1jYWNoZS1wb2xpY3ktY2FjaGluZy1kaXNhYmxlZFxuICAgICAgICAgIGNhY2hlUG9saWN5OiBjZi5DYWNoZVBvbGljeS5DQUNISU5HX0RJU0FCTEVELFxuICAgICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3k6IHtcbiAgICAgICAgICAgIC8vIE1hbmFnZWQtQWxsVmlld2VyIC0gc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS91c2luZy1tYW5hZ2VkLW9yaWdpbi1yZXF1ZXN0LXBvbGljaWVzLmh0bWwjOn46dGV4dD1XaGVuJTIwdXNpbmclMjBBV1MsNDdlNCUyRGI5ODklMkQ1NDkyZWFmYTA3ZDNcbiAgICAgICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3lJZDogJzIxNmFkZWY2LTVjN2YtNDdlNC1iOTg5LTU0OTJlYWZhMDdkMycsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogY2YuVmlld2VyUHJvdG9jb2xQb2xpY3kuQUxMT1dfQUxMLFxuICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICAgICAgW2Rpc3RyaWJ1dGlvbl0sXG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0F3c1NvbHV0aW9ucy1DRlIxJyxcbiAgICAgICAgICByZWFzb246ICdGb3IgdGhpcyB0bXAgZGlzdHJpYnV0aW9uIHdlIGRvIG5vdCBuZWVkIGdlbyByZXN0cmljdGlvbnMnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtQ0ZSMicsXG4gICAgICAgICAgcmVhc29uOiAnRm9yIHRoaXMgdG1wIGRpc3RyaWJ1dGlvbiB3ZSBkbyBub3QgbmVlZCB3YWYgaW50ZWdyYXRpb24nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtQ0ZSMycsXG4gICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgJ0ZvciB0aGlzIHRtcCBkaXN0cmlidXRpb24gd2UgZG8gbm90IG5lZWQgYWNjZXNzIGxvZ2dpbmcgZW5hYmxlZCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0F3c1NvbHV0aW9ucy1DRlI0JyxcbiAgICAgICAgICByZWFzb246XG4gICAgICAgICAgICAnRm9yIHRoaXMgdG1wIGRpc3RyaWJ1dGlvbiB3ZSBkbyBub3QgbmVlZCBsaW1pdCBTU0wgcHJvdG9jb2xzIGFzIHdlIHVzZSB0aGUgZGVmYXVsdCB2aWV3ZXIgY2VydCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0F3c1NvbHV0aW9ucy1DRlI1JyxcbiAgICAgICAgICByZWFzb246XG4gICAgICAgICAgICAnRm9yIHRoaXMgdG1wIGRpc3RyaWJ1dGlvbiB3ZSBkbyBub3QgbmVlZCBsaW1pdCBTU0wgcHJvdG9jb2xzIGFzIHdlIHVzZSB0aGUgZGVmYXVsdCB2aWV3ZXIgY2VydCcsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuXG4gICAgLy8gVXNlIGEgY3VzdG9tIHJlc291cmNlIGxhbWJkYSB0byBydW4gdGhlIFNTTSBkb2N1bWVudCBvbiB0aGUgaW5zdGFuY2VcbiAgICBzd2l0Y2ggKGluc3RhbmNlT3BlcmF0aW5nU3lzdGVtKSB7XG4gICAgICBjYXNlIExpbnV4Rmxhdm9yVHlwZS5VQlVOVFVfMjI6XG4gICAgICBjYXNlIExpbnV4Rmxhdm9yVHlwZS5VQlVOVFVfMjQ6XG4gICAgICAgIEluc3RhbGxlci51YnVudHUoe1xuICAgICAgICAgIGluc3RhbmNlSWQ6IGluc3RhbmNlLmluc3RhbmNlSWQsXG4gICAgICAgICAgdnNDb2RlVXNlcjogdnNDb2RlVXNlcixcbiAgICAgICAgICB2c0NvZGVQYXNzd29yZDogdnNjb2RlUGFzc3dvcmQsXG4gICAgICAgICAgZGV2U2VydmVyQmFzZVBhdGg6IHByb3BzPy5kZXZTZXJ2ZXJCYXNlUGF0aCxcbiAgICAgICAgICBkZXZTZXJ2ZXJQb3J0OiBwcm9wcz8uZGV2U2VydmVyUG9ydCxcbiAgICAgICAgICBob21lRm9sZGVyOiBob21lRm9sZGVyLFxuICAgICAgICB9KS5fYmluZCh0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExpbnV4Rmxhdm9yVHlwZS5BTUFaT05fTElOVVhfMjAyMzpcbiAgICAgICAgSW5zdGFsbGVyLmFtYXpvbkxpbnV4MjAyMyh7XG4gICAgICAgICAgaW5zdGFuY2VJZDogaW5zdGFuY2UuaW5zdGFuY2VJZCxcbiAgICAgICAgICB2c0NvZGVVc2VyOiB2c0NvZGVVc2VyLFxuICAgICAgICAgIHZzQ29kZVBhc3N3b3JkOiB2c2NvZGVQYXNzd29yZCxcbiAgICAgICAgICBkZXZTZXJ2ZXJCYXNlUGF0aDogcHJvcHM/LmRldlNlcnZlckJhc2VQYXRoLFxuICAgICAgICAgIGRldlNlcnZlclBvcnQ6IHByb3BzPy5kZXZTZXJ2ZXJQb3J0LFxuICAgICAgICAgIGhvbWVGb2xkZXI6IGhvbWVGb2xkZXIsXG4gICAgICAgIH0pLl9iaW5kKHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgTGludXggZmxhdm9yOiAke2luc3RhbmNlT3BlcmF0aW5nU3lzdGVtfWApO1xuICAgIH1cbiAgICAvLyBzbyB3ZSBwYXNzIHRoZSBvdXRlciBzY29wZSBvZiB0aGlzIGNvbnN0cnVjdCB0aHJvdWdoIHRoZSBpbnN0YWxsZXJcblxuICAgIC8vIE5PVEU6IG1heWJlIGhhdmUgYSBoZWFsaGNoZWNrIENGTiBjdXN0b20gcmVzb3VyY2UgdG8gc2VlIGlmIHRoZSB2c2NvZGUgc2VydmVyIGlzIGhlYWx0aHlcbiAgICAvLyBhdG0gdGhpcyBpcyBhY2hpZXZlZCBieSB0aGUgaW50ZWcgdGVzdHNcblxuICAgIC8vIE91dHB1dHNcbiAgICB0aGlzLmRvbWFpbk5hbWUgPSBgaHR0cHM6Ly8ke2Rpc3RyaWJ1dGlvbi5kb21haW5OYW1lfS8/Zm9sZGVyPSR7aG9tZUZvbGRlcn1gO1xuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgJ2RvbWFpbk5hbWUnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSBkb21haW4gbmFtZSBvZiB0aGUgZGlzdHJpYnV0aW9uJyxcbiAgICAgIHZhbHVlOiB0aGlzLmRvbWFpbk5hbWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnBhc3N3b3JkID0gdnNjb2RlUGFzc3dvcmQ7XG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCAncGFzc3dvcmQnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSBwYXNzd29yZCBmb3IgdGhlIFZTQ29kZSBzZXJ2ZXInLFxuICAgICAgdmFsdWU6IHZzY29kZVBhc3N3b3JkLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogVGFncyBhbGwgdGhlIHJlc291cmNlcyBpbiB0aGUgY29uc3RydWN0XG4gKi9cbmNsYXNzIE5vZGVUYWdnZXIgaW1wbGVtZW50cyBJQXNwZWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSB0YWdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIGNvbnN0cnVjdG9yKHRhZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICB0aGlzLnRhZ3MgPSB0YWdzO1xuICB9XG5cbiAgdmlzaXQobm9kZTogSUNvbnN0cnVjdCkge1xuICAgIE9iamVjdC5lbnRyaWVzKHRoaXMudGFncykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PlxuICAgICAgVGFncy5vZihub2RlKS5hZGQoa2V5LCB2YWx1ZSksXG4gICAgKTtcbiAgfVxufVxuIl19