@aws-cdk/aws-ec2-alpha 2.164.1-alpha.0 → 2.166.0-alpha.0

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.
Binary file
package/.warnings.jsii.js CHANGED
@@ -38,8 +38,30 @@ function _aws_cdk_aws_ec2_alpha_VpcV2Props(p) {
38
38
  visitedObjects.delete(p);
39
39
  }
40
40
  }
41
+ function _aws_cdk_aws_ec2_alpha_VpcV2Attributes(p) {
42
+ if (p == null)
43
+ return;
44
+ visitedObjects.add(p);
45
+ try {
46
+ if (p.secondaryCidrBlocks != null)
47
+ for (const o of p.secondaryCidrBlocks)
48
+ if (!visitedObjects.has(o))
49
+ _aws_cdk_aws_ec2_alpha_VPCCidrBlockattributes(o);
50
+ if (p.subnets != null)
51
+ for (const o of p.subnets)
52
+ if (!visitedObjects.has(o))
53
+ _aws_cdk_aws_ec2_alpha_SubnetV2Attributes(o);
54
+ }
55
+ finally {
56
+ visitedObjects.delete(p);
57
+ }
58
+ }
41
59
  function _aws_cdk_aws_ec2_alpha_VpcV2(p) {
42
60
  }
61
+ function _aws_cdk_aws_ec2_alpha_IVPCCidrBlock(p) {
62
+ }
63
+ function _aws_cdk_aws_ec2_alpha_VPCCidrBlockattributes(p) {
64
+ }
43
65
  function _aws_cdk_aws_ec2_alpha_AddressFamily(p) {
44
66
  }
45
67
  function _aws_cdk_aws_ec2_alpha_IpamPoolPublicIpSource(p) {
@@ -144,6 +166,8 @@ function _aws_cdk_aws_ec2_alpha_ISubnetV2(p) {
144
166
  }
145
167
  function _aws_cdk_aws_ec2_alpha_SubnetV2(p) {
146
168
  }
169
+ function _aws_cdk_aws_ec2_alpha_SubnetV2Attributes(p) {
170
+ }
147
171
  function _aws_cdk_aws_ec2_alpha_NatConnectivityType(p) {
148
172
  }
149
173
  function _aws_cdk_aws_ec2_alpha_IRouteTarget(p) {
@@ -306,4 +330,4 @@ class DeprecationError extends Error {
306
330
  });
307
331
  }
308
332
  }
309
- module.exports = { print, getPropertyDescriptor, DeprecationError, _aws_cdk_aws_ec2_alpha_SecondaryAddressProps, _aws_cdk_aws_ec2_alpha_IpAddresses, _aws_cdk_aws_ec2_alpha_VpcCidrOptions, _aws_cdk_aws_ec2_alpha_IIpAddresses, _aws_cdk_aws_ec2_alpha_VpcV2Props, _aws_cdk_aws_ec2_alpha_VpcV2, _aws_cdk_aws_ec2_alpha_AddressFamily, _aws_cdk_aws_ec2_alpha_IpamPoolPublicIpSource, _aws_cdk_aws_ec2_alpha_AwsServiceName, _aws_cdk_aws_ec2_alpha_IpamProps, _aws_cdk_aws_ec2_alpha_IpamScopeType, _aws_cdk_aws_ec2_alpha_PoolOptions, _aws_cdk_aws_ec2_alpha_IpamPoolCidrProvisioningOptions, _aws_cdk_aws_ec2_alpha_IIpamPool, _aws_cdk_aws_ec2_alpha_IpamScopeOptions, _aws_cdk_aws_ec2_alpha_IpamOptions, _aws_cdk_aws_ec2_alpha_IIpamScopeBase, _aws_cdk_aws_ec2_alpha_Ipam, _aws_cdk_aws_ec2_alpha_EgressOnlyInternetGatewayOptions, _aws_cdk_aws_ec2_alpha_InternetGatewayOptions, _aws_cdk_aws_ec2_alpha_VPNGatewayV2Options, _aws_cdk_aws_ec2_alpha_IVpcV2, _aws_cdk_aws_ec2_alpha_VpcV2Base, _aws_cdk_aws_ec2_alpha_IpCidr, _aws_cdk_aws_ec2_alpha_SubnetV2Props, _aws_cdk_aws_ec2_alpha_ISubnetV2, _aws_cdk_aws_ec2_alpha_SubnetV2, _aws_cdk_aws_ec2_alpha_NatConnectivityType, _aws_cdk_aws_ec2_alpha_IRouteTarget, _aws_cdk_aws_ec2_alpha_EgressOnlyInternetGatewayProps, _aws_cdk_aws_ec2_alpha_InternetGatewayProps, _aws_cdk_aws_ec2_alpha_VPNGatewayV2Props, _aws_cdk_aws_ec2_alpha_NatGatewayOptions, _aws_cdk_aws_ec2_alpha_NatGatewayProps, _aws_cdk_aws_ec2_alpha_EgressOnlyInternetGateway, _aws_cdk_aws_ec2_alpha_InternetGateway, _aws_cdk_aws_ec2_alpha_VPNGatewayV2, _aws_cdk_aws_ec2_alpha_NatGateway, _aws_cdk_aws_ec2_alpha_RouteTargetProps, _aws_cdk_aws_ec2_alpha_RouteTargetType, _aws_cdk_aws_ec2_alpha_IRouteV2, _aws_cdk_aws_ec2_alpha_RouteProps, _aws_cdk_aws_ec2_alpha_Route, _aws_cdk_aws_ec2_alpha_RouteTableProps, _aws_cdk_aws_ec2_alpha_RouteTable };
333
+ module.exports = { print, getPropertyDescriptor, DeprecationError, _aws_cdk_aws_ec2_alpha_SecondaryAddressProps, _aws_cdk_aws_ec2_alpha_IpAddresses, _aws_cdk_aws_ec2_alpha_VpcCidrOptions, _aws_cdk_aws_ec2_alpha_IIpAddresses, _aws_cdk_aws_ec2_alpha_VpcV2Props, _aws_cdk_aws_ec2_alpha_VpcV2Attributes, _aws_cdk_aws_ec2_alpha_VpcV2, _aws_cdk_aws_ec2_alpha_IVPCCidrBlock, _aws_cdk_aws_ec2_alpha_VPCCidrBlockattributes, _aws_cdk_aws_ec2_alpha_AddressFamily, _aws_cdk_aws_ec2_alpha_IpamPoolPublicIpSource, _aws_cdk_aws_ec2_alpha_AwsServiceName, _aws_cdk_aws_ec2_alpha_IpamProps, _aws_cdk_aws_ec2_alpha_IpamScopeType, _aws_cdk_aws_ec2_alpha_PoolOptions, _aws_cdk_aws_ec2_alpha_IpamPoolCidrProvisioningOptions, _aws_cdk_aws_ec2_alpha_IIpamPool, _aws_cdk_aws_ec2_alpha_IpamScopeOptions, _aws_cdk_aws_ec2_alpha_IpamOptions, _aws_cdk_aws_ec2_alpha_IIpamScopeBase, _aws_cdk_aws_ec2_alpha_Ipam, _aws_cdk_aws_ec2_alpha_EgressOnlyInternetGatewayOptions, _aws_cdk_aws_ec2_alpha_InternetGatewayOptions, _aws_cdk_aws_ec2_alpha_VPNGatewayV2Options, _aws_cdk_aws_ec2_alpha_IVpcV2, _aws_cdk_aws_ec2_alpha_VpcV2Base, _aws_cdk_aws_ec2_alpha_IpCidr, _aws_cdk_aws_ec2_alpha_SubnetV2Props, _aws_cdk_aws_ec2_alpha_ISubnetV2, _aws_cdk_aws_ec2_alpha_SubnetV2, _aws_cdk_aws_ec2_alpha_SubnetV2Attributes, _aws_cdk_aws_ec2_alpha_NatConnectivityType, _aws_cdk_aws_ec2_alpha_IRouteTarget, _aws_cdk_aws_ec2_alpha_EgressOnlyInternetGatewayProps, _aws_cdk_aws_ec2_alpha_InternetGatewayProps, _aws_cdk_aws_ec2_alpha_VPNGatewayV2Props, _aws_cdk_aws_ec2_alpha_NatGatewayOptions, _aws_cdk_aws_ec2_alpha_NatGatewayProps, _aws_cdk_aws_ec2_alpha_EgressOnlyInternetGateway, _aws_cdk_aws_ec2_alpha_InternetGateway, _aws_cdk_aws_ec2_alpha_VPNGatewayV2, _aws_cdk_aws_ec2_alpha_NatGateway, _aws_cdk_aws_ec2_alpha_RouteTargetProps, _aws_cdk_aws_ec2_alpha_RouteTargetType, _aws_cdk_aws_ec2_alpha_IRouteV2, _aws_cdk_aws_ec2_alpha_RouteProps, _aws_cdk_aws_ec2_alpha_Route, _aws_cdk_aws_ec2_alpha_RouteTableProps, _aws_cdk_aws_ec2_alpha_RouteTable };
package/README.md CHANGED
@@ -37,8 +37,6 @@ new VpcV2(this, 'Vpc', {
37
37
 
38
38
  `VpcV2` does not automatically create subnets or allocate IP addresses, which is different from the `Vpc` construct.
39
39
 
40
- Importing existing VPC in an account into CDK as a `VpcV2` is not yet supported.
41
-
42
40
  ## SubnetV2
43
41
 
44
42
  `SubnetV2` is a re-write of the [`ec2.Subnet`](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_ec2.Subnet.html) construct.
@@ -62,8 +60,6 @@ new SubnetV2(this, 'subnetA', {
62
60
  })
63
61
  ```
64
62
 
65
- Same as `VpcV2`, importing existing subnets is not yet supported.
66
-
67
63
  ## IP Addresses Management
68
64
 
69
65
  By default `VpcV2` uses `10.0.0.0/16` as the primary CIDR if none is defined.
@@ -366,3 +362,135 @@ myVpc.addInternetGateway({
366
362
  ipv4Destination: '192.168.0.0/16',
367
363
  });
368
364
  ```
365
+
366
+ ## Importing an existing VPC
367
+
368
+ You can import an existing VPC and its subnets using the `VpcV2.fromVpcV2Attributes()` method or an individual subnet using `SubnetV2.fromSubnetV2Attributes()` method.
369
+
370
+ ### Importing a VPC
371
+
372
+ To import an existing VPC, use the `VpcV2.fromVpcV2Attributes()` method. You'll need to provide the VPC ID, primary CIDR block, and information about the subnets. You can import secondary address as well created through IPAM, BYOIP(IPv4) or enabled through Amazon Provided IPv6. You must provide VPC Id and its primary CIDR block for importing it.
373
+
374
+ If you wish to add a new subnet to imported VPC, new subnet's IP range(IPv4) will be validated against provided secondary and primary address block to confirm that it is within the the range of VPC.
375
+
376
+ Here's an example of importing a VPC with only the required parameters
377
+
378
+ ``` ts
379
+
380
+ const stack = new Stack();
381
+
382
+ const importedVpc = VpcV2.fromVpcV2Attributes(stack, 'ImportedVpc', {
383
+ vpcId: 'mockVpcID',
384
+ vpcCidrBlock: '10.0.0.0/16',
385
+ });
386
+
387
+ ```
388
+
389
+ In case of cross account or cross region VPC, its recommended to provide region and ownerAccountId so that these values for the VPC can be used to populate correct arn value for the VPC. If a VPC region and account ID is not provided, then region and account configured in the stack will be used. Furthermore, these fields will be referenced later while setting up VPC peering connection, so its necessary to set these fields to a correct value.
390
+
391
+ Below is an example of importing a cross region and cross acount VPC, VPC arn for this case would be 'arn:aws:ec2:us-west-2:123456789012:vpc/mockVpcID'
392
+
393
+ ``` ts
394
+
395
+ const stack = new Stack();
396
+
397
+ //Importing a cross acount or cross region VPC
398
+ const importedVpc = VpcV2.fromVpcV2Attributes(stack, 'ImportedVpc', {
399
+ vpcId: 'mockVpcID',
400
+ vpcCidrBlock: '10.0.0.0/16',
401
+ ownerAccountId: '123456789012',
402
+ region: 'us-west-2',
403
+ });
404
+
405
+ ```
406
+
407
+ Here's an example of how to import a VPC with multiple CIDR blocks, IPv6 support, and different subnet types:
408
+
409
+ In this example, we're importing a VPC with:
410
+
411
+ - A primary CIDR block (10.1.0.0/16)
412
+ - One secondary IPv4 CIDR block (10.2.0.0/16)
413
+ - Two secondary address using IPAM pool (IPv4 and IPv6)
414
+ - VPC has Amazon-provided IPv6 CIDR enabled
415
+ - An isolated subnet in us-west-2a
416
+ - A public subnet in us-west-2b
417
+
418
+ ```ts
419
+
420
+ const stack = new Stack();
421
+
422
+ const importedVpc = VpcV2.fromVpcV2Attributes(this, 'ImportedVPC', {
423
+ vpcId: 'vpc-XXX',
424
+ vpcCidrBlock: '10.1.0.0/16',
425
+ secondaryCidrBlocks: [
426
+ {
427
+ cidrBlock: '10.2.0.0/16',
428
+ cidrBlockName: 'ImportedBlock1',
429
+ },
430
+ {
431
+ ipv6IpamPoolId: 'ipam-pool-XXX',
432
+ ipv6NetmaskLength: 52,
433
+ cidrBlockName: 'ImportedIpamIpv6',
434
+ },
435
+ {
436
+ ipv4IpamPoolId: 'ipam-pool-XXX',
437
+ ipv4IpamProvisionedCidrs: ['10.2.0.0/16'],
438
+ cidrBlockName: 'ImportedIpamIpv4',
439
+ },
440
+ {
441
+ amazonProvidedIpv6CidrBlock: true,
442
+ }
443
+ ],
444
+ subnets: [{
445
+ subnetName: 'IsolatedSubnet2',
446
+ subnetId: 'subnet-03cd773c0fe08ed26',
447
+ subnetType: SubnetType.PRIVATE_ISOLATED,
448
+ availabilityZone: 'us-west-2a',
449
+ ipv4CidrBlock: '10.2.0.0/24',
450
+ routeTableId: 'rtb-0871c310f98da2cbb',
451
+ },
452
+ {
453
+ subnetId: 'subnet-0fa477e01db27d820',
454
+ subnetType: SubnetType.PUBLIC,
455
+ availabilityZone: 'us-west-2b',
456
+ ipv4CidrBlock: '10.3.0.0/24',
457
+ routeTableId: 'rtb-014f3043098fe4b96',
458
+ }],
459
+ });
460
+
461
+ // You can now use the imported VPC in your stack
462
+
463
+ // Adding a new subnet to the imported VPC
464
+ const importedSubnet = new SubnetV2(this, 'NewSubnet', {
465
+ availabilityZone: 'us-west-2a',
466
+ ipv4CidrBlock: new IpCidr('10.2.2.0/24'),
467
+ vpc: importedVpc,
468
+ subnetType: SubnetType.PUBLIC,
469
+ });
470
+
471
+ // Adding gateways to the imported VPC
472
+ importedVpc.addInternetGateway();
473
+ importedVpc.addNatGateway({ subnet: importedSubnet });
474
+ importedVpc.addEgressOnlyInternetGateway();
475
+ ```
476
+
477
+ You can add more subnets as needed by including additional entries in the `isolatedSubnets`, `publicSubnets`, or other subnet type arrays (e.g., `privateSubnets`).
478
+
479
+ ### Importing Subnets
480
+
481
+ You can also import individual subnets using the `SubnetV2.fromSubnetV2Attributes()` method. This is useful when you need to work with specific subnets independently of a VPC.
482
+
483
+ Here's an example of how to import a subnet:
484
+
485
+ ```ts
486
+
487
+ SubnetV2.fromSubnetV2Attributes(this, 'ImportedSubnet', {
488
+ subnetId: 'subnet-0123456789abcdef0',
489
+ availabilityZone: 'us-west-2a',
490
+ ipv4CidrBlock: '10.2.0.0/24',
491
+ routeTableId: 'rtb-0871c310f98da2cbb',
492
+ subnetType: SubnetType.PRIVATE_ISOLATED,
493
+ });
494
+ ```
495
+
496
+ By importing existing VPCs and subnets, you can easily integrate your existing AWS infrastructure with new resources created through CDK. This is particularly useful when you need to work with pre-existing network configurations or when you're migrating existing infrastructure to CDK.
package/awslint.json CHANGED
@@ -1,8 +1,6 @@
1
1
  {
2
2
  "exclude": [
3
- "from-method:@aws-cdk/aws-ec2-alpha.VpcV2",
4
3
  "attribute-tag:@aws-cdk/aws-ec2-alpha.RouteTable.routeTableId",
5
- "from-method:@aws-cdk/aws-ec2-alpha.SubnetV2",
6
4
  "from-method:@aws-cdk/aws-ec2-alpha.Route"
7
5
  ]
8
6
  }
package/lib/ipam.d.ts CHANGED
@@ -153,6 +153,11 @@ export interface IIpamPool {
153
153
  * Pool CIDR for IPv6 to be provisioned with Public IP source set to 'Amazon'
154
154
  */
155
155
  readonly ipamCidrs: CfnIPAMPoolCidr[];
156
+ /**
157
+ * Pool CIDR for IPv4 to be provisioned using IPAM
158
+ * Required to check for subnet IP range is within the VPC range
159
+ */
160
+ readonly ipamIpv4Cidrs?: string[];
156
161
  /**
157
162
  * Function to associate a IPv6 address with IPAM pool
158
163
  */
package/lib/ipam.js CHANGED
@@ -83,6 +83,11 @@ class IpamPool extends aws_cdk_lib_1.Resource {
83
83
  * Pool CIDR for IPv6 to be provisioned with Public IP source set to 'Amazon'
84
84
  */
85
85
  this.ipamCidrs = [];
86
+ /**
87
+ * Pool CIDR for IPv4 to be provisioned using IPAM
88
+ * Required to check for subnet IP range is within the VPC range
89
+ */
90
+ this.ipamIpv4Cidrs = [];
86
91
  if (props.addressFamily === AddressFamily.IP_V6 && !props.awsService) {
87
92
  throw new Error('awsService is required when addressFamily is set to ipv6');
88
93
  }
@@ -95,6 +100,8 @@ class IpamPool extends aws_cdk_lib_1.Resource {
95
100
  awsService: props.awsService,
96
101
  });
97
102
  this.ipamPoolId = this._ipamPool.attrIpamPoolId;
103
+ // Populating to check for subnet range against all IPv4 ranges assigned to VPC including IPAM
104
+ props.ipv4ProvisionedCidrs?.map(cidr => (this.ipamIpv4Cidrs.push(cidr)));
98
105
  this.node.defaultChild = this._ipamPool;
99
106
  }
100
107
  /**
@@ -229,7 +236,7 @@ class Ipam extends aws_cdk_lib_1.Resource {
229
236
  }
230
237
  exports.Ipam = Ipam;
231
238
  _a = JSII_RTTI_SYMBOL_1;
232
- Ipam[_a] = { fqn: "@aws-cdk/aws-ec2-alpha.Ipam", version: "2.164.1-alpha.0" };
239
+ Ipam[_a] = { fqn: "@aws-cdk/aws-ec2-alpha.Ipam", version: "2.166.0-alpha.0" };
233
240
  /**
234
241
  * Function to create IpamPool under scope
235
242
  * @internal
@@ -252,4 +259,4 @@ function createIpamPool(scope, id, scopeOptions, poolOptions, scopeId) {
252
259
  awsService: poolOptions.awsService,
253
260
  });
254
261
  }
255
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXBhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImlwYW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsaURBQTBGO0FBRTFGLDZDQUEyRDtBQUUzRDs7Ozs7R0FLRztBQUNILElBQVksYUFZWDtBQVpELFdBQVksYUFBYTtJQUN2Qjs7O09BR0c7SUFDSCwrQkFBYyxDQUFBO0lBRWQ7OztPQUdHO0lBQ0gsK0JBQWMsQ0FBQTtBQUNoQixDQUFDLEVBWlcsYUFBYSw2QkFBYixhQUFhLFFBWXhCO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksc0JBVVg7QUFWRCxXQUFZLHNCQUFzQjtJQUNoQzs7T0FFRztJQUNILHlDQUFlLENBQUE7SUFFZjs7T0FFRztJQUNILDJDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFWVyxzQkFBc0Isc0NBQXRCLHNCQUFzQixRQVVqQztBQUVEOztHQUVHO0FBQ0gsSUFBWSxjQUtYO0FBTEQsV0FBWSxjQUFjO0lBQ3hCOztPQUVHO0lBQ0gsNkJBQVcsQ0FBQTtBQUNiLENBQUMsRUFMVyxjQUFjLDhCQUFkLGNBQWMsUUFLekI7QUF5QkQ7O0dBRUc7QUFDSCxJQUFZLGFBVVg7QUFWRCxXQUFZLGFBQWE7SUFDdkI7O09BRUc7SUFDSCxvQ0FBbUIsQ0FBQTtJQUVuQjs7T0FFRztJQUNILGtDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFWVyxhQUFhLDZCQUFiLGFBQWEsUUFVeEI7QUFrTkQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxRQUFTLFNBQVEsc0JBQVE7SUFrQjdCLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBb0I7UUFDNUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVksSUFBSSxrQkFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDOUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLG1CQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEVBQUUsU0FBUyxF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O0tBQ2xCOztBQTNFSCxvQkE0RUM7OztBQUVEOzs7R0FHRztBQUNILFNBQVMsY0FBYyxDQUNyQixLQUFnQixFQUNoQixFQUFVLEVBQ1YsWUFBNEIsRUFDNUIsV0FBd0IsRUFDeEIsT0FBZTtJQUVmLE1BQU0sMEJBQTBCLEdBQUcsWUFBWSxDQUFDLG9CQUFvQjtRQUNsRSxDQUFDLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQzthQUN4RSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxLQUFLLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDM0QsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUVWLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLFdBQVcsQ0FBQyxNQUFNLG9DQUFvQyxDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUVELE9BQU8sSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtRQUM3QixZQUFZLEVBQUUsRUFBRTtRQUNoQixhQUFhLEVBQUUsV0FBVyxDQUFDLGFBQWE7UUFDeEMsb0JBQW9CLEVBQUUsV0FBVyxDQUFDLG9CQUFvQjtRQUN0RCxXQUFXLEVBQUUsT0FBTztRQUNwQixNQUFNLEVBQUUsV0FBVyxDQUFDLE1BQU07UUFDMUIsY0FBYyxFQUFFLFdBQVcsQ0FBQyxjQUFjO1FBQzFDLFVBQVUsRUFBRSxXQUFXLENBQUMsVUFBVTtLQUNuQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuSVBBTSwgQ2ZuSVBBTVBvb2wsIENmbklQQU1Qb29sQ2lkciwgQ2ZuSVBBTVNjb3BlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IExhenksIE5hbWVzLCBSZXNvdXJjZSwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgYWRkcmVzcyBmYW1pbHkgZm9yIElQIGFkZHJlc3NlcyBpbiBhbiBJUEFNIHBvb2wuXG4gKiBJUF9WNCAtIFJlcHJlc2VudHMgdGhlIElQdjQgYWRkcmVzcyBmYW1pbHkuXG4gKiBJUF9WNiAtIFJlcHJlc2VudHMgdGhlIElQdjYgYWRkcmVzcyBmYW1pbHkuXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItaXBhbXBvb2wuaHRtbCNjZm4tZWMyLWlwYW1wb29sLWFkZHJlc3NmYW1pbHlcbiAqL1xuZXhwb3J0IGVudW0gQWRkcmVzc0ZhbWlseSB7XG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIHRoZSBJUHY0IGFkZHJlc3MgZmFtaWx5LlxuICAgKiBBbGxvd2VkIHVuZGVyIHB1YmxpYyBhbmQgcHJpdmF0ZSBwb29sLlxuICAgKi9cbiAgSVBfVjQgPSAnaXB2NCcsXG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgdGhlIElQdjYgYWRkcmVzcyBmYW1pbHkuXG4gICAqIE9ubHkgYWxsb3dlZCB1bmRlciBwdWJsaWMgcG9vbC5cbiAgICovXG4gIElQX1Y2ID0gJ2lwdjYnLFxufVxuXG4vKipcbiAqIFRoZSBJUCBhZGRyZXNzIHNvdXJjZSBmb3IgcG9vbHMgaW4gdGhlIHB1YmxpYyBzY29wZS5cbiAqIE9ubHkgdXNlZCBmb3IgcHJvdmlzaW9uaW5nIElQIGFkZHJlc3MgQ0lEUnMgdG8gcG9vbHMgaW4gdGhlIHB1YmxpYyBzY29wZS5cbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWVjMi1pcGFtcG9vbC5odG1sI2Nmbi1lYzItaXBhbXBvb2wtcHVibGljaXBzb3VyY2VcbiAqL1xuZXhwb3J0IGVudW0gSXBhbVBvb2xQdWJsaWNJcFNvdXJjZSB7XG4gIC8qKlxuICAgKiBCWU9JUCBJcHY2IHRvIGJlIHJlZ2lzdGVyZWQgdW5kZXIgSVBBTVxuICAgKi9cbiAgQllPSVAgPSAnYnlvaXAnLFxuXG4gIC8qKlxuICAgKiBBbWF6b24gUHJvdmlkZWQgSXB2NiByYW5nZVxuICAgKi9cbiAgQU1BWk9OID0gJ2FtYXpvbicsXG59XG5cbi8qKlxuICogTGltaXRzIHdoaWNoIHNlcnZpY2UgaW4gQVdTIHRoYXQgdGhlIHBvb2wgY2FuIGJlIHVzZWQgaW5cbiAqL1xuZXhwb3J0IGVudW0gQXdzU2VydmljZU5hbWUge1xuICAvKipcbiAgICogIEFsbG93cyB1c2VycyB0byB1c2Ugc3BhY2UgZm9yIEVsYXN0aWMgSVAgYWRkcmVzc2VzIGFuZCBWUENzXG4gICAqL1xuICBFQzIgPSAnZWMyJyxcbn1cblxuLyoqXG4gKiBPcHRpb25zIHRvIGNyZWF0ZSBhIG5ldyBJcGFtIGluIHRoZSBhY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXBhbVByb3BzIHtcblxuICAvKipcbiAgICogVGhlIG9wZXJhdGluZyBSZWdpb25zIGZvciBhbiBJUEFNLlxuICAgKiBPcGVyYXRpbmcgUmVnaW9ucyBhcmUgQVdTIFJlZ2lvbnMgd2hlcmUgdGhlIElQQU0gaXMgYWxsb3dlZCB0byBtYW5hZ2UgSVAgYWRkcmVzcyBDSURSc1xuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvcGVyYXRpbmcgUmVnaW9ucywgc2VlIFtDcmVhdGUgYW4gSVBBTV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tLy92cGMvbGF0ZXN0L2lwYW0vY3JlYXRlLWlwYW0uaHRtbCkgaW4gdGhlICpBbWF6b24gVlBDIElQQU0gVXNlciBHdWlkZSogLlxuICAgKiBAc2VlIGh0dHA6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWVjMi1pcGFtLmh0bWwjY2ZuLWVjMi1pcGFtLW9wZXJhdGluZ3JlZ2lvbnNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBTdGFjay5yZWdpb24gaWYgZGVmaW5lZCBpbiB0aGUgc3RhY2tcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGluZ1JlZ2lvbj86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIElQQU0gdGhhdCBjYW4gYmUgdXNlZCBmb3IgdGFnZ2luZyByZXNvdXJjZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIElmIG5vIG5hbWUgcHJvdmlkZWQsIG5vIHRhZ3Mgd2lsbCBiZSBhZGRlZCB0byB0aGUgSVBBTVxuICAgKi9cbiAgcmVhZG9ubHkgaXBhbU5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVmZXJzIHRvIHR3byBwb3NzaWJsZSBzY29wZSB0eXBlcyB1bmRlciBJUEFNXG4gKi9cbmV4cG9ydCBlbnVtIElwYW1TY29wZVR5cGUge1xuICAvKipcbiAgICogRGVmYXVsdCBzY29wZXMgY3JlYXRlZCBieSBJUEFNXG4gICAqL1xuICBERUZBVUxUID0gJ2RlZmF1bHQnLFxuXG4gIC8qKlxuICAgKiBDdXN0b20gc2NvcGUgY3JlYXRlZCB1c2luZyBtZXRob2RcbiAgICovXG4gIENVU1RPTSA9ICdjdXN0b20nLFxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIGFuIElQQU0gcG9vbC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItaXBhbXBvb2wuaHRtbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvb2xPcHRpb25ze1xuXG4gIC8qKlxuICAgKiBhZGRyZXNzRmFtaWx5IC0gVGhlIGFkZHJlc3MgZmFtaWx5IG9mIHRoZSBwb29sIChpcHY0IG9yIGlwdjYpLlxuICAgKi9cbiAgcmVhZG9ubHkgYWRkcmVzc0ZhbWlseTogQWRkcmVzc0ZhbWlseTtcblxuICAvKipcbiAgICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIENJRFJzIHByb3Zpc2lvbmVkIHRvIHRoZSBwb29sLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIENJRFJzIGFyZSBwcm92aXNpb25lZFxuICAgKi9cbiAgcmVhZG9ubHkgaXB2NFByb3Zpc2lvbmVkQ2lkcnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGxvY2FsZSAoQVdTIFJlZ2lvbikgb2YgdGhlIHBvb2wuIFNob3VsZCBiZSBvbmUgb2YgdGhlIElQQU0gb3BlcmF0aW5nIHJlZ2lvbi5cbiAgICogIE9ubHkgcmVzb3VyY2VzIGluIHRoZSBzYW1lIFJlZ2lvbiBhcyB0aGUgbG9jYWxlIG9mIHRoZSBwb29sIGNhbiBnZXQgSVAgYWRkcmVzcyBhbGxvY2F0aW9ucyBmcm9tIHRoZSBwb29sLlxuICAgKiBZb3UgY2FuIG9ubHkgYWxsb2NhdGUgYSBDSURSIGZvciBhIFZQQywgZm9yIGV4YW1wbGUsIGZyb20gYW4gSVBBTSBwb29sIHRoYXQgc2hhcmVzIGEgbG9jYWxlIHdpdGggdGhlIFZQQ+KAmXMgUmVnaW9uLlxuICAgKiBOb3RlIHRoYXQgb25jZSB5b3UgY2hvb3NlIGEgTG9jYWxlIGZvciBhIHBvb2wsIHlvdSBjYW5ub3QgbW9kaWZ5IGl0LiBJZiB5b3UgY2hvb3NlIGFuIEFXUyBSZWdpb24gZm9yIGxvY2FsZSB0aGF0IGhhcyBub3QgYmVlbiBjb25maWd1cmVkIGFzIGFuIG9wZXJhdGluZyBSZWdpb24gZm9yIHRoZSBJUEFNLCB5b3UnbGwgZ2V0IGFuIGVycm9yLlxuICAgKiBAc2VlIGh0dHA6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWVjMi1pcGFtcG9vbC5odG1sI2Nmbi1lYzItaXBhbXBvb2wtbG9jYWxlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQ3VycmVudCBvcGVyYXRpbmcgcmVnaW9uIG9mIElQQU1cbiAgICovXG4gIHJlYWRvbmx5IGxvY2FsZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElQIGFkZHJlc3Mgc291cmNlIGZvciBwb29scyBpbiB0aGUgcHVibGljIHNjb3BlLlxuICAgKiBPbmx5IHVzZWQgZm9yIElQdjYgYWRkcmVzc1xuICAgKiBPbmx5IGFsbG93ZWQgdmFsdWVzIHRvIHRoaXMgYXJlICdieW9pcCcgb3IgJ2FtYXpvbidcbiAgICpcbiAgICogQGRlZmF1bHQgYW1hem9uXG4gICAqL1xuICByZWFkb25seSBwdWJsaWNJcFNvdXJjZT86IElwYW1Qb29sUHVibGljSXBTb3VyY2U7XG5cbiAgLyoqXG4gICogTGltaXRzIHdoaWNoIHNlcnZpY2UgaW4gQVdTIHRoYXQgdGhlIHBvb2wgY2FuIGJlIHVzZWQgaW4uXG4gICpcbiAgKiBcImVjMlwiLCBmb3IgZXhhbXBsZSwgYWxsb3dzIHVzZXJzIHRvIHVzZSBzcGFjZSBmb3IgRWxhc3RpYyBJUCBhZGRyZXNzZXMgYW5kIFZQQ3MuXG4gICpcbiAgKiBAc2VlIGh0dHA6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWVjMi1pcGFtcG9vbC5odG1sI2Nmbi1lYzItaXBhbXBvb2wtYXdzc2VydmljZVxuICAqXG4gICogQGRlZmF1bHQgLSByZXF1aXJlZCBpbiBjYXNlIG9mIGFuIElQdjYsIHRocm93cyBhbiBlcnJvciBpZiBub3QgcHJvdmlkZWQuXG4gICovXG4gIHJlYWRvbmx5IGF3c1NlcnZpY2U/OiBBd3NTZXJ2aWNlTmFtZTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjcmVhdGluZyBhbiBJUEFNIHBvb2wuXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItaXBhbXBvb2wuaHRtbFxuICovXG5pbnRlcmZhY2UgSXBhbVBvb2xQcm9wcyBleHRlbmRzIFBvb2xPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNjb3BlIGlkIHdoZXJlIHBvb2wgbmVlZHMgdG8gYmUgY3JlYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgaXBhbVNjb3BlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogSVBBTSByZXNvdXJjZSBuYW1lXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXV0b2dlbmVyYXRlZCBieSBDREsgaWYgbm90IHByb3ZpZGVkXG4gICAqL1xuICByZWFkb25seSBpcGFtUG9vbE5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyB0byBwcm92aXNpb24gQ0lEUnMgdG8gYW4gSVBBTSBwb29sLlxuICogVXNlZCB0byBjcmVhdGUgYSBuZXcgSXBhbVBvb2xDaWRyXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItaXBhbXBvb2xjaWRyLmh0bWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJcGFtUG9vbENpZHJQcm92aXNpb25pbmdPcHRpb25zIHtcbiAgLyoqXG4gICAqIElwdjYgTmV0bWFzayBsZW5ndGggZm9yIHRoZSBDSURSXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcG9vbCBwcm92aXNpb25lZCB3aXRob3V0IG5ldG1hc2sgbGVuZ3RoLCBuZWVkIGNpZHIgcmFuZ2UgaW4gdGhpcyBjYXNlXG4gICAqL1xuICByZWFkb25seSBuZXRtYXNrTGVuZ3RoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJcHY2IENJRFIgYmxvY2sgZm9yIHRoZSBJUEFNIHBvb2xcbiAgICpcbiAgICogQGRlZmF1bHQgLSBwb29sIHByb3Zpc2lvbmVkIHdpdGhvdXQgbmV0bWFzayBsZW5ndGgsIG5lZWQgbmV0bWFzayBsZW5ndGggaW4gdGhpcyBjYXNlXG4gICAqL1xuICByZWFkb25seSBjaWRyPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIERlZmluaXRpb24gdXNlZCB0byBhZGQgb3IgY3JlYXRlIGEgbmV3IElQQU0gcG9vbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElJcGFtUG9vbHtcbiAgLyoqXG4gKiBQb29sIElEIHRvIGJlIHBhc3NlZCB0byB0aGUgVlBDIGNvbnN0cnVjdFxuICogQGF0dHJpYnV0ZSBJcGFtUG9vbElkXG4gKi9cbiAgcmVhZG9ubHkgaXBhbVBvb2xJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQb29sIENJRFIgZm9yIElQdjYgdG8gYmUgcHJvdmlzaW9uZWQgd2l0aCBQdWJsaWMgSVAgc291cmNlIHNldCB0byAnQW1hem9uJ1xuICAgKi9cbiAgcmVhZG9ubHkgaXBhbUNpZHJzOiBDZm5JUEFNUG9vbENpZHJbXTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gdG8gYXNzb2NpYXRlIGEgSVB2NiBhZGRyZXNzIHdpdGggSVBBTSBwb29sXG4gICAqL1xuICBwcm92aXNpb25DaWRyKGlkOiBzdHJpbmcsIG9wdGlvbnM6IElwYW1Qb29sQ2lkclByb3Zpc2lvbmluZ09wdGlvbnMpOiBDZm5JUEFNUG9vbENpZHI7XG5cbn1cblxuLyoqXG4gKiBJUEFNIHNjb3BlIGlzIHRoZSBoaWdoZXN0LWxldmVsIGNvbnRhaW5lciB3aXRoaW4gSVBBTS4gQW4gSVBBTSBjb250YWlucyB0d28gZGVmYXVsdCBzY29wZXMuXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItaXBhbXNjb3BlLmh0bWxcbiAqL1xuaW50ZXJmYWNlIElwYW1TY29wZVByb3BzIGV4dGVuZHMgSXBhbVNjb3BlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJUEFNIGlkIHRvIHdoaWNoIHNjb3BlIG5lZWRzIHRvIGJlIGFkZGVkXG4gICAqL1xuICByZWFkb25seSBpcGFtSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogT3BlcmF0aW5nIHJlZ2lvbnMgZm9yIHRoZSBJcGFtXG4gICAqIFJlcXVpcmVkIGluIG9yZGVyIHRvIHZhbGlkYXRlIHRoZSBsb2NhbGUgYmVpbmcgc2V0IG9uIHBvb2xcbiAgICovXG4gIHJlYWRvbmx5IGlwYW1PcGVyYXRpbmdSZWdpb25zOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQ3VzdG9tIGlwYW0gc2NvcGUgaWQgdG8gYWRkIGEgcG9vbCBpbiBvcmRlciB0byBzdXBwb3J0IGRlZmF1bHQgc2NvcGVzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhyb3dzIGFuIGVycm9yIGlmIG5vIHNjb3BlIGlkIGlzIHByb3ZpZGVkXG4gICAqL1xuICByZWFkb25seSBpcGFtU2NvcGVJZD86IHN0cmluZztcblxufVxuXG4vKipcbiAqIEJlaW5nIHVzZWQgaW4gSVBBTSBjbGFzcyB0byBhZGQgcG9vbHMgdG8gZGVmYXVsdCBzY29wZSBjcmVhdGVkIGJ5IElQQU0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXBhbVNjb3BlT3B0aW9ucyB7XG5cbiAgLyoqXG4gICAqIElQQU0gc2NvcGUgbmFtZSB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdGFnZ2luZ1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHRhZ3Mgd2lsbCBiZSBhZGRlZCB0byB0aGUgc2NvcGVcbiAgICovXG4gIHJlYWRvbmx5IGlwYW1TY29wZU5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY29uZmlndXJpbmcgYW4gSVAgQWRkcmVzcyBNYW5hZ2VyIChJUEFNKS5cbiAqXG4gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWVjMi1pcGFtLmh0bWx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElwYW1PcHRpb25zIHtcblxuICAvKipcbiAgICogQ0lEUiBNYXNrIGZvciBWcGNcbiAgICogT25seSByZXF1aXJlZCB3aGVuIHVzaW5nIEFXUyBJcGFtXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gbmV0bWFzayBsZW5ndGggZm9yIElQQU0gYXR0YWNoZWQgdG8gVlBDIHNlY29uZGFyeSBhZGRyZXNzXG4gICAqL1xuICByZWFkb25seSBuZXRtYXNrTGVuZ3RoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJcHY0IG9yIGFuIElwdjYgSVBBTSBwb29sXG4gICAqIE9ubHkgcmVxdWlyZWQgd2hlbiB1c2luZyBBV1MgSXBhbVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHBvb2wgYXR0YWNoZWQgdG8gVlBDIHNlY29uZGFyeSBhZGRyZXNzXG4gICAqL1xuICByZWFkb25seSBpcGFtUG9vbD86IElJcGFtUG9vbDtcblxuICAvKipcbiAgICogUmVxdWlyZWQgdG8gc2V0IFNlY29uZGFyeSBjaWRyIGJsb2NrIHJlc291cmNlIG5hbWVcbiAgICogaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdW5pcXVlIGxvZ2ljYWwgaWQgZm9yIHRoZSByZXNvdXJjZS5cbiAgICovXG4gIHJlYWRvbmx5IGNpZHJCbG9ja05hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIElwYW1TY29wZSBDbGFzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElJcGFtU2NvcGVCYXNlIHtcblxuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IHNjb3BlIG9mIHN0YWNrIHRvIGJlIHBhc3NlZCBpbiBvcmRlciB0byBjcmVhdGVcbiAgICogYSBuZXcgSVBBTSBwb29sXG4gICAqL1xuICByZWFkb25seSBzY29wZTogQ29uc3RydWN0O1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IFNjb3BlIGlkcyBjcmVhdGVkIGJ5IHRoZSBJUEFNIG9yIGEgbmV3IFJlc291cmNlIGlkXG4gICAqL1xuICByZWFkb25seSBzY29wZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlZmluZXMgc2NvcGUgdHlwZSBjYW4gYmUgZWl0aGVyIGRlZmF1bHQgb3IgY3VzdG9tXG4gICAqL1xuICByZWFkb25seSBzY29wZVR5cGU/OiBJcGFtU2NvcGVUeXBlO1xuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiB0byBhZGQgYSBuZXcgcG9vbCB0byBhbiBJUEFNIHNjb3BlXG4gICAqL1xuICBhZGRQb29sKGlkOiBzdHJpbmcsIG9wdGlvbnM6IFBvb2xPcHRpb25zKTogSUlwYW1Qb29sO1xuXG59XG5cbi8qKlxuICogQ3JlYXRlcyBuZXcgSVBBTSBQb29sXG4gKiBQb29scyBlbmFibGUgeW91IHRvIG9yZ2FuaXplIHlvdXIgSVAgYWRkcmVzc2VzIGFjY29yZGluZyB0byB5b3VyIHJvdXRpbmcgYW5kIHNlY3VyaXR5IG5lZWRzXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItaXBhbXBvb2wuaHRtbFxuICogQHJlc291cmNlIEFXUzo6RUMyOjpJUEFNUG9vbFxuICogQGludGVybmFsXG4gKi9cbmNsYXNzIElwYW1Qb29sIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJSXBhbVBvb2wge1xuXG4gIC8qKlxuICAgKiBQb29sIElEIHRvIGJlIHBhc3NlZCB0byB0aGUgVlBDIGNvbnN0cnVjdFxuICAgKiBAYXR0cmlidXRlIElwYW1Qb29sSWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpcGFtUG9vbElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBvb2wgQ0lEUiBmb3IgSVB2NiB0byBiZSBwcm92aXNpb25lZCB3aXRoIFB1YmxpYyBJUCBzb3VyY2Ugc2V0IHRvICdBbWF6b24nXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXBhbUNpZHJzOiBDZm5JUEFNUG9vbENpZHJbXSA9IFtdXG5cbiAgLyoqXG4gICAqIFJlZmVyZW5jZSB0byBpcGFtUG9vbCByZXNvdXJjZSBjcmVhdGVkIGluIHRoaXMgY2xhc3NcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2lwYW1Qb29sOiBDZm5JUEFNUG9vbDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSXBhbVBvb2xQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgcGh5c2ljYWxOYW1lOiBwcm9wcy5pcGFtUG9vbE5hbWUgPz8gTGF6eS5zdHJpbmcoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PiBOYW1lcy51bmlxdWVSZXNvdXJjZU5hbWUodGhpcywgeyBtYXhMZW5ndGg6IDEyOCwgYWxsb3dlZFNwZWNpYWxDaGFyYWN0ZXJzOiAnXycgfSksXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGlmIChwcm9wcy5hZGRyZXNzRmFtaWx5ID09PSBBZGRyZXNzRmFtaWx5LklQX1Y2ICYmICFwcm9wcy5hd3NTZXJ2aWNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2F3c1NlcnZpY2UgaXMgcmVxdWlyZWQgd2hlbiBhZGRyZXNzRmFtaWx5IGlzIHNldCB0byBpcHY2Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5faXBhbVBvb2wgPSBuZXcgQ2ZuSVBBTVBvb2wodGhpcywgaWQsIHtcbiAgICAgIGFkZHJlc3NGYW1pbHk6IHByb3BzLmFkZHJlc3NGYW1pbHksXG4gICAgICBwcm92aXNpb25lZENpZHJzOiBwcm9wcy5pcHY0UHJvdmlzaW9uZWRDaWRycz8ubWFwKGNpZHIgPT4gKHsgY2lkciB9KSksXG4gICAgICBsb2NhbGU6IHByb3BzLmxvY2FsZSxcbiAgICAgIGlwYW1TY29wZUlkOiBwcm9wcy5pcGFtU2NvcGVJZCxcbiAgICAgIHB1YmxpY0lwU291cmNlOiBwcm9wcy5wdWJsaWNJcFNvdXJjZSxcbiAgICAgIGF3c1NlcnZpY2U6IHByb3BzLmF3c1NlcnZpY2UsXG4gICAgfSk7XG4gICAgdGhpcy5pcGFtUG9vbElkID0gdGhpcy5faXBhbVBvb2wuYXR0cklwYW1Qb29sSWQ7XG4gICAgdGhpcy5ub2RlLmRlZmF1bHRDaGlsZCA9IHRoaXMuX2lwYW1Qb29sO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgQ0lEUiBwcm92aXNpb25lZCB0byBhbiBJUEFNIHBvb2wuXG4gICAqIEBwYXJhbSBpZCBOYW1lIG9mIFJlc291cmNlXG4gICAqIEBwYXJhbSBvcHRpb25zIEVpdGhlciBhIENJRFIgb3IgbmV0bWFzayBsZW5ndGggbXVzdCBiZSBwcm92aWRlZFxuICAgKiBAcmV0dXJucyBBV1M6OkVDMjo6SVBBTVBvb2xDaWRyXG4gICAqL1xuICBwdWJsaWMgcHJvdmlzaW9uQ2lkcihpZDogc3RyaW5nLCBvcHRpb25zOiBJcGFtUG9vbENpZHJQcm92aXNpb25pbmdPcHRpb25zKTogQ2ZuSVBBTVBvb2xDaWRyIHtcbiAgICBjb25zdCBjaWRyID0gbmV3IENmbklQQU1Qb29sQ2lkcih0aGlzLCBpZCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGlwYW1Qb29sSWQ6IHRoaXMuaXBhbVBvb2xJZCxcbiAgICB9KTtcbiAgICB0aGlzLmlwYW1DaWRycy5wdXNoKGNpZHIpO1xuICAgIHJldHVybiBjaWRyO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBjdXN0b20gSXBhbSBTY29wZSwgY3VzdG9tIElQQU0gc2NvcGVzIGNhbiBvbmx5IGJlIHByaXZhdGVcbiAqIChjYW4gYmUgdXNlZCBmb3IgYWRkaW5nIGN1c3RvbSBzY29wZXMgdG8gYW4gZXhpc3RpbmcgSVBBTSlcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWVjMi1pcGFtc2NvcGUuaHRtbFxuICogQHJlc291cmNlIEFXUzo6RUMyOjpJUEFNU2NvcGVcbiAqL1xuY2xhc3MgSXBhbVNjb3BlIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJSXBhbVNjb3BlQmFzZSB7XG5cbiAgLyoqXG4gICAqIFN0b3JlcyB0aGUgcmVmZXJlbmNlIHRvIG5ld2x5IGNyZWF0ZWQgUmVzb3VyY2VcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2lwYW1TY29wZTogQ2ZuSVBBTVNjb3BlO1xuXG4gIC8qKlxuICAgKiBJRCBmb3IgUmVzb3VyY2UgSXBhbVNjb3BlXG4gICAqIEBhdHRyaWJ1dGUgSXBhbVNjb3BlSWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzY29wZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByb3BlcnRpZXMgdG8gY29uZmlndXJlIGlwYW0gc2NvcGVcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IElwYW1TY29wZVByb3BzO1xuXG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgdG8gc3RhY2sgc2NvcGUgdG8gYmUgcGFzc2VkIHRocm91Z2ggYWRkUG9vbCBtZXRob2QgaW5vcmRlciB0byBjcmVhdGUgYSBuZXcgSXBhbVBvb2xcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzY29wZTogQ29uc3RydWN0O1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHNjb3BlIHR5cGUgY2FuIGJlIGVpdGhlciBkZWZhdWx0IG9yIGN1c3RvbVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNjb3BlVHlwZTogSXBhbVNjb3BlVHlwZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSXBhbVNjb3BlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMuX2lwYW1TY29wZSA9IG5ldyBDZm5JUEFNU2NvcGUoc2NvcGUsICdJcGFtU2NvcGUnLCB7XG4gICAgICBpcGFtSWQ6IHByb3BzLmlwYW1JZCxcbiAgICB9KTtcbiAgICB0aGlzLnNjb3BlSWQgPSB0aGlzLl9pcGFtU2NvcGUuYXR0cklwYW1TY29wZUlkO1xuICAgIHRoaXMuc2NvcGVUeXBlID0gSXBhbVNjb3BlVHlwZS5DVVNUT007XG4gICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcG9vbCB0byB0aGUgSVBBTSBzY29wZS5cbiAgICogQGV4dGVybmFsXG4gICAqL1xuICBhZGRQb29sKGlkOiBzdHJpbmcsIG9wdGlvbnM6IFBvb2xPcHRpb25zKTogSUlwYW1Qb29sIHtcbiAgICByZXR1cm4gY3JlYXRlSXBhbVBvb2wodGhpcy5zY29wZSwgaWQsIHRoaXMucHJvcHMsIG9wdGlvbnMsIHRoaXMuc2NvcGVJZCk7XG4gIH1cblxufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIElQQU0gZGVmYXVsdCBzY29wZXMuXG4gKi9cbmNsYXNzIElwYW1TY29wZUJhc2UgaW1wbGVtZW50cyBJSXBhbVNjb3BlQmFzZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgcmVhZG9ubHkgc2NvcGVJZDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IElwYW1TY29wZVByb3BzLFxuICAgIHJlYWRvbmx5IHNjb3BlVHlwZT86IElwYW1TY29wZVR5cGUsXG4gICkge1xuICAgIHRoaXMuc2NvcGVUeXBlID0gSXBhbVNjb3BlVHlwZS5ERUZBVUxUO1xuICAgIGlmICghcHJvcHMuaXBhbVNjb3BlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaXBhbVNjb3BlSWQgaXMgcmVxdWlyZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zY29wZUlkID0gcHJvcHMuaXBhbVNjb3BlSWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBwb29sIHRvIHRoZSBJUEFNIHNjb3BlLlxuICAgKiBAZXh0ZXJuYWxcbiAgICovXG4gIGFkZFBvb2woaWQ6IHN0cmluZywgb3B0aW9uczogUG9vbE9wdGlvbnMpOiBJSXBhbVBvb2wge1xuICAgIHJldHVybiBjcmVhdGVJcGFtUG9vbCh0aGlzLnNjb3BlLCBpZCwgdGhpcy5wcm9wcywgb3B0aW9ucywgdGhpcy5zY29wZUlkKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgbmV3IElQQU0gd2l0aCBkZWZhdWx0IHB1YmxpYyBhbmQgcHJpdmF0ZSBzY29wZVxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2UtZWMyLWlwYW1zY29wZS5odG1sXG4gKiBAcmVzb3VyY2UgQVdTOjpFQzI6OklQQU1cbiAqL1xuZXhwb3J0IGNsYXNzIElwYW0gZXh0ZW5kcyBSZXNvdXJjZSB7XG4gIC8qKlxuICogUHJvdmlkZXMgYWNjZXNzIHRvIGRlZmF1bHQgcHVibGljIElQQU0gc2NvcGUgdGhyb3VnaCBhZGQgcG9vbCBtZXRob2QuXG4gKiBVc2FnZTogVG8gYWRkIGFuIElwYW0gUG9vbCB0byBhIGRlZmF1bHQgcHVibGljIHNjb3BlXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItaXBhbXNjb3BlLmh0bWxcbiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHVibGljU2NvcGU6IElJcGFtU2NvcGVCYXNlO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhY2Nlc3MgdG8gZGVmYXVsdCBwcml2YXRlIElQQU0gc2NvcGUgdGhyb3VnaCBhZGQgcG9vbCBtZXRob2QuXG4gICAqIFVzYWdlOiBUbyBhZGQgYW4gSXBhbSBQb29sIHRvIGEgZGVmYXVsdCBwcml2YXRlIHNjb3BlXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWVjMi1pcGFtc2NvcGUuaHRtbFxuICAgKiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJpdmF0ZVNjb3BlOiBJSXBhbVNjb3BlQmFzZTtcblxuICAvLyBSZXNvdXJjZSBJUEFNXG4gIHByaXZhdGUgcmVhZG9ubHkgX2lwYW06IENmbklQQU07XG4gIC8qKlxuICAgKiBBY2Nlc3MgdG8gSXBhbSByZXNvdXJjZSBpZCB0aGF0IGNhbiBiZSB1c2VkIGxhdGVyIHRvIGFkZCBhIGN1c3RvbSBwcml2YXRlIHNjb3BlIHRvIHRoaXMgSVBBTVxuICAgKiBAYXR0cmlidXRlIElwYW1JZFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlwYW1JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIG9wZXJhdGluZyByZWdpb25zIGZvciBJUEFNXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgb3BlcmF0aW5nUmVnaW9uczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIExpc3Qgb2Ygc2NvcGVzIGNyZWF0ZWQgdW5kZXIgdGhpcyBJUEFNXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2NvcGVzOiBJSXBhbVNjb3BlQmFzZVtdID0gW107XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBJcGFtUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgaWYgKCFwcm9wcz8ub3BlcmF0aW5nUmVnaW9uICYmICFTdGFjay5vZih0aGlzKS5yZWdpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHByb3ZpZGUgYXQgbGVhc3Qgb25lIG9wZXJhdGluZyByZWdpb24nKTtcbiAgICB9XG5cbiAgICB0aGlzLm9wZXJhdGluZ1JlZ2lvbnMgPSBwcm9wcz8ub3BlcmF0aW5nUmVnaW9uID8/IFtTdGFjay5vZih0aGlzKS5yZWdpb25dO1xuXG4gICAgdGhpcy5faXBhbSA9IG5ldyBDZm5JUEFNKHRoaXMsICdJcGFtJywge1xuICAgICAgb3BlcmF0aW5nUmVnaW9uczogdGhpcy5vcGVyYXRpbmdSZWdpb25zID8gdGhpcy5vcGVyYXRpbmdSZWdpb25zLm1hcChyZWdpb24gPT4gKHsgcmVnaW9uTmFtZTogcmVnaW9uIH0pKSA6IFtdLFxuICAgIH0pO1xuICAgIHRoaXMubm9kZS5kZWZhdWx0Q2hpbGQgPSB0aGlzLl9pcGFtO1xuXG4gICAgdGhpcy5pcGFtSWQgPSB0aGlzLl9pcGFtLmF0dHJJcGFtSWQ7XG4gICAgdGhpcy5wdWJsaWNTY29wZSA9IG5ldyBJcGFtU2NvcGVCYXNlKHRoaXMsICdEZWZhdWx0UHVibGljU2NvcGUnLCB7XG4gICAgICBpcGFtT3BlcmF0aW5nUmVnaW9uczogdGhpcy5vcGVyYXRpbmdSZWdpb25zLFxuICAgICAgaXBhbUlkOiB0aGlzLl9pcGFtLmF0dHJJcGFtSWQsXG4gICAgICBpcGFtU2NvcGVJZDogdGhpcy5faXBhbS5hdHRyUHVibGljRGVmYXVsdFNjb3BlSWQsXG4gICAgfSk7XG4gICAgdGhpcy5wcml2YXRlU2NvcGUgPSBuZXcgSXBhbVNjb3BlQmFzZSh0aGlzLCAnRGVmYXVsdFByaXZhdGVTY29wZScsIHtcbiAgICAgIGlwYW1PcGVyYXRpbmdSZWdpb25zOiB0aGlzLm9wZXJhdGluZ1JlZ2lvbnMsXG4gICAgICBpcGFtSWQ6IHRoaXMuX2lwYW0uYXR0cklwYW1JZCxcbiAgICAgIGlwYW1TY29wZUlkOiB0aGlzLl9pcGFtLmF0dHJQcml2YXRlRGVmYXVsdFNjb3BlSWQsXG4gICAgfSk7XG5cbiAgICB0aGlzLnNjb3Blcy5wdXNoKHRoaXMucHVibGljU2NvcGUsIHRoaXMucHJpdmF0ZVNjb3BlKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHRvIGFkZCBjdXN0b20gc2NvcGUgdG8gYW4gZXhpc3RpbmcgSVBBTVxuICAgKiBDdXN0b20gc2NvcGVzIGNhbiBvbmx5IGJlIHByaXZhdGVcbiAgICovXG4gIHB1YmxpYyBhZGRTY29wZShzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBvcHRpb25zOiBJcGFtU2NvcGVPcHRpb25zKTogSUlwYW1TY29wZUJhc2Uge1xuICAgIGNvbnN0IGlwYW1TY29wZSA9IG5ldyBJcGFtU2NvcGUoc2NvcGUsIGlkLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaXBhbUlkOiB0aGlzLmlwYW1JZCxcbiAgICAgIGlwYW1PcGVyYXRpbmdSZWdpb25zOiB0aGlzLm9wZXJhdGluZ1JlZ2lvbnMsXG4gICAgfSk7XG4gICAgdGhpcy5zY29wZXMucHVzaChpcGFtU2NvcGUpO1xuICAgIHJldHVybiBpcGFtU2NvcGU7XG4gIH1cbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB0byBjcmVhdGUgSXBhbVBvb2wgdW5kZXIgc2NvcGVcbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiBjcmVhdGVJcGFtUG9vbChcbiAgc2NvcGU6IENvbnN0cnVjdCxcbiAgaWQ6IHN0cmluZyxcbiAgc2NvcGVPcHRpb25zOiBJcGFtU2NvcGVQcm9wcyxcbiAgcG9vbE9wdGlvbnM6IFBvb2xPcHRpb25zLFxuICBzY29wZUlkOiBzdHJpbmcsXG4pOiBJcGFtUG9vbCB7XG4gIGNvbnN0IGlzTG9jYWxlSW5PcGVyYXRpbmdSZWdpb25zID0gc2NvcGVPcHRpb25zLmlwYW1PcGVyYXRpbmdSZWdpb25zXG4gICAgPyBzY29wZU9wdGlvbnMuaXBhbU9wZXJhdGluZ1JlZ2lvbnMubWFwKHJlZ2lvbiA9PiAoeyByZWdpb25OYW1lOiByZWdpb24gfSkpXG4gICAgICAuc29tZShyZWdpb24gPT4gcmVnaW9uLnJlZ2lvbk5hbWUgPT09IHBvb2xPcHRpb25zLmxvY2FsZSlcbiAgICA6IGZhbHNlO1xuXG4gIGlmICghaXNMb2NhbGVJbk9wZXJhdGluZ1JlZ2lvbnMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwcm92aWRlZCBsb2NhbGUgJyR7cG9vbE9wdGlvbnMubG9jYWxlfScgaXMgbm90IGluIHRoZSBvcGVyYXRpbmcgcmVnaW9ucy5gKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgSXBhbVBvb2woc2NvcGUsIGlkLCB7XG4gICAgaXBhbVBvb2xOYW1lOiBpZCxcbiAgICBhZGRyZXNzRmFtaWx5OiBwb29sT3B0aW9ucy5hZGRyZXNzRmFtaWx5LFxuICAgIGlwdjRQcm92aXNpb25lZENpZHJzOiBwb29sT3B0aW9ucy5pcHY0UHJvdmlzaW9uZWRDaWRycyxcbiAgICBpcGFtU2NvcGVJZDogc2NvcGVJZCxcbiAgICBsb2NhbGU6IHBvb2xPcHRpb25zLmxvY2FsZSxcbiAgICBwdWJsaWNJcFNvdXJjZTogcG9vbE9wdGlvbnMucHVibGljSXBTb3VyY2UsXG4gICAgYXdzU2VydmljZTogcG9vbE9wdGlvbnMuYXdzU2VydmljZSxcbiAgfSk7XG59XG5cbiJdfQ==
262
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXBhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImlwYW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsaURBQTBGO0FBRTFGLDZDQUEyRDtBQUUzRDs7Ozs7R0FLRztBQUNILElBQVksYUFZWDtBQVpELFdBQVksYUFBYTtJQUN2Qjs7O09BR0c7SUFDSCwrQkFBYyxDQUFBO0lBRWQ7OztPQUdHO0lBQ0gsK0JBQWMsQ0FBQTtBQUNoQixDQUFDLEVBWlcsYUFBYSw2QkFBYixhQUFhLFFBWXhCO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksc0JBVVg7QUFWRCxXQUFZLHNCQUFzQjtJQUNoQzs7T0FFRztJQUNILHlDQUFlLENBQUE7SUFFZjs7T0FFRztJQUNILDJDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFWVyxzQkFBc0Isc0NBQXRCLHNCQUFzQixRQVVqQztBQUVEOztHQUVHO0FBQ0gsSUFBWSxjQUtYO0FBTEQsV0FBWSxjQUFjO0lBQ3hCOztPQUVHO0lBQ0gsNkJBQVcsQ0FBQTtBQUNiLENBQUMsRUFMVyxjQUFjLDhCQUFkLGNBQWMsUUFLekI7QUF5QkQ7O0dBRUc7QUFDSCxJQUFZLGFBVVg7QUFWRCxXQUFZLGFBQWE7SUFDdkI7O09BRUc7SUFDSCxvQ0FBbUIsQ0FBQTtJQUVuQjs7T0FFRztJQUNILGtDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFWVyxhQUFhLDZCQUFiLGFBQWEsUUFVeEI7QUF3TkQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxRQUFTLFNBQVEsc0JBQVE7SUF3QjdCLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBb0I7UUFDNUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVksSUFBSSxrQkFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDOUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLG1CQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEVBQUUsU0FBUyxF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TCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuSVBBTSwgQ2ZuSVBBTVBvb2wsIENmbklQQU1Qb29sQ2lkciwgQ2ZuSVBBTVNjb3BlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IExhenksIE5hbWVzLCBSZXNvdXJjZSwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgYWRkcmVzcyBmYW1pbHkgZm9yIElQIGFkZHJlc3NlcyBpbiBhbiBJUEFNIHBvb2wuXG4gKiBJUF9WNCAtIFJlcHJlc2VudHMgdGhlIElQdjQgYWRkcmVzcyBmYW1pbHkuXG4gKiBJUF9WNiAtIFJlcHJlc2VudHMgdGhlIElQdjYgYWRkcmVzcyBmYW1pbHkuXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItaXBhbXBvb2wuaHRtbCNjZm4tZWMyLWlwYW1wb29sLWFkZHJlc3NmYW1pbHlcbiAqL1xuZXhwb3J0IGVudW0gQWRkcmVzc0ZhbWlseSB7XG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIHRoZSBJUHY0IGFkZHJlc3MgZmFtaWx5LlxuICAgKiBBbGxvd2VkIHVuZGVyIHB1YmxpYyBhbmQgcHJpdmF0ZSBwb29sLlxuICAgKi9cbiAgSVBfVjQgPSAnaXB2NCcsXG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgdGhlIElQdjYgYWRkcmVzcyBmYW1pbHkuXG4gICAqIE9ubHkgYWxsb3dlZCB1bmRlciBwdWJsaWMgcG9vbC5cbiAgICovXG4gIElQX1Y2ID0gJ2lwdjYnLFxufVxuXG4vKipcbiAqIFRoZSBJUCBhZGRyZXNzIHNvdXJjZSBmb3IgcG9vbHMgaW4gdGhlIHB1YmxpYyBzY29wZS5cbiAqIE9ubHkgdXNlZCBmb3IgcHJvdmlzaW9uaW5nIElQIGFkZHJlc3MgQ0lEUnMgdG8gcG9vbHMgaW4gdGhlIHB1YmxpYyBzY29wZS5cbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWVjMi1pcGFtcG9vbC5odG1sI2Nmbi1lYzItaXBhbXBvb2wtcHVibGljaXBzb3VyY2VcbiAqL1xuZXhwb3J0IGVudW0gSXBhbVBvb2xQdWJsaWNJcFNvdXJjZSB7XG4gIC8qKlxuICAgKiBCWU9JUCBJcHY2IHRvIGJlIHJlZ2lzdGVyZWQgdW5kZXIgSVBBTVxuICAgKi9cbiAgQllPSVAgPSAnYnlvaXAnLFxuXG4gIC8qKlxuICAgKiBBbWF6b24gUHJvdmlkZWQgSXB2NiByYW5nZVxuICAgKi9cbiAgQU1BWk9OID0gJ2FtYXpvbicsXG59XG5cbi8qKlxuICogTGltaXRzIHdoaWNoIHNlcnZpY2UgaW4gQVdTIHRoYXQgdGhlIHBvb2wgY2FuIGJlIHVzZWQgaW5cbiAqL1xuZXhwb3J0IGVudW0gQXdzU2VydmljZU5hbWUge1xuICAvKipcbiAgICogIEFsbG93cyB1c2VycyB0byB1c2Ugc3BhY2UgZm9yIEVsYXN0aWMgSVAgYWRkcmVzc2VzIGFuZCBWUENzXG4gICAqL1xuICBFQzIgPSAnZWMyJyxcbn1cblxuLyoqXG4gKiBPcHRpb25zIHRvIGNyZWF0ZSBhIG5ldyBJcGFtIGluIHRoZSBhY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXBhbVByb3BzIHtcblxuICAvKipcbiAgICogVGhlIG9wZXJhdGluZyBSZWdpb25zIGZvciBhbiBJUEFNLlxuICAgKiBPcGVyYXRpbmcgUmVnaW9ucyBhcmUgQVdTIFJlZ2lvbnMgd2hlcmUgdGhlIElQQU0gaXMgYWxsb3dlZCB0byBtYW5hZ2UgSVAgYWRkcmVzcyBDSURSc1xuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvcGVyYXRpbmcgUmVnaW9ucywgc2VlIFtDcmVhdGUgYW4gSVBBTV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tLy92cGMvbGF0ZXN0L2lwYW0vY3JlYXRlLWlwYW0uaHRtbCkgaW4gdGhlICpBbWF6b24gVlBDIElQQU0gVXNlciBHdWlkZSogLlxuICAgKiBAc2VlIGh0dHA6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWVjMi1pcGFtLmh0bWwjY2ZuLWVjMi1pcGFtLW9wZXJhdGluZ3JlZ2lvbnNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBTdGFjay5yZWdpb24gaWYgZGVmaW5lZCBpbiB0aGUgc3RhY2tcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGluZ1JlZ2lvbj86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIElQQU0gdGhhdCBjYW4gYmUgdXNlZCBmb3IgdGFnZ2luZyByZXNvdXJjZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIElmIG5vIG5hbWUgcHJvdmlkZWQsIG5vIHRhZ3Mgd2lsbCBiZSBhZGRlZCB0byB0aGUgSVBBTVxuICAgKi9cbiAgcmVhZG9ubHkgaXBhbU5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVmZXJzIHRvIHR3byBwb3NzaWJsZSBzY29wZSB0eXBlcyB1bmRlciBJUEFNXG4gKi9cbmV4cG9ydCBlbnVtIElwYW1TY29wZVR5cGUge1xuICAvKipcbiAgICogRGVmYXVsdCBzY29wZXMgY3JlYXRlZCBieSBJUEFNXG4gICAqL1xuICBERUZBVUxUID0gJ2RlZmF1bHQnLFxuXG4gIC8qKlxuICAgKiBDdXN0b20gc2NvcGUgY3JlYXRlZCB1c2luZyBtZXRob2RcbiAgICovXG4gIENVU1RPTSA9ICdjdXN0b20nLFxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIGFuIElQQU0gcG9vbC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItaXBhbXBvb2wuaHRtbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvb2xPcHRpb25zIHtcblxuICAvKipcbiAgICogYWRkcmVzc0ZhbWlseSAtIFRoZSBhZGRyZXNzIGZhbWlseSBvZiB0aGUgcG9vbCAoaXB2NCBvciBpcHY2KS5cbiAgICovXG4gIHJlYWRvbmx5IGFkZHJlc3NGYW1pbHk6IEFkZHJlc3NGYW1pbHk7XG5cbiAgLyoqXG4gICAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBDSURScyBwcm92aXNpb25lZCB0byB0aGUgcG9vbC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBDSURScyBhcmUgcHJvdmlzaW9uZWRcbiAgICovXG4gIHJlYWRvbmx5IGlwdjRQcm92aXNpb25lZENpZHJzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBsb2NhbGUgKEFXUyBSZWdpb24pIG9mIHRoZSBwb29sLiBTaG91bGQgYmUgb25lIG9mIHRoZSBJUEFNIG9wZXJhdGluZyByZWdpb24uXG4gICAqICBPbmx5IHJlc291cmNlcyBpbiB0aGUgc2FtZSBSZWdpb24gYXMgdGhlIGxvY2FsZSBvZiB0aGUgcG9vbCBjYW4gZ2V0IElQIGFkZHJlc3MgYWxsb2NhdGlvbnMgZnJvbSB0aGUgcG9vbC5cbiAgICogWW91IGNhbiBvbmx5IGFsbG9jYXRlIGEgQ0lEUiBmb3IgYSBWUEMsIGZvciBleGFtcGxlLCBmcm9tIGFuIElQQU0gcG9vbCB0aGF0IHNoYXJlcyBhIGxvY2FsZSB3aXRoIHRoZSBWUEPigJlzIFJlZ2lvbi5cbiAgICogTm90ZSB0aGF0IG9uY2UgeW91IGNob29zZSBhIExvY2FsZSBmb3IgYSBwb29sLCB5b3UgY2Fubm90IG1vZGlmeSBpdC4gSWYgeW91IGNob29zZSBhbiBBV1MgUmVnaW9uIGZvciBsb2NhbGUgdGhhdCBoYXMgbm90IGJlZW4gY29uZmlndXJlZCBhcyBhbiBvcGVyYXRpbmcgUmVnaW9uIGZvciB0aGUgSVBBTSwgeW91J2xsIGdldCBhbiBlcnJvci5cbiAgICogQHNlZSBodHRwOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItaXBhbXBvb2wuaHRtbCNjZm4tZWMyLWlwYW1wb29sLWxvY2FsZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEN1cnJlbnQgb3BlcmF0aW5nIHJlZ2lvbiBvZiBJUEFNXG4gICAqL1xuICByZWFkb25seSBsb2NhbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJUCBhZGRyZXNzIHNvdXJjZSBmb3IgcG9vbHMgaW4gdGhlIHB1YmxpYyBzY29wZS5cbiAgICogT25seSB1c2VkIGZvciBJUHY2IGFkZHJlc3NcbiAgICogT25seSBhbGxvd2VkIHZhbHVlcyB0byB0aGlzIGFyZSAnYnlvaXAnIG9yICdhbWF6b24nXG4gICAqXG4gICAqIEBkZWZhdWx0IGFtYXpvblxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGljSXBTb3VyY2U/OiBJcGFtUG9vbFB1YmxpY0lwU291cmNlO1xuXG4gIC8qKlxuICAqIExpbWl0cyB3aGljaCBzZXJ2aWNlIGluIEFXUyB0aGF0IHRoZSBwb29sIGNhbiBiZSB1c2VkIGluLlxuICAqXG4gICogXCJlYzJcIiwgZm9yIGV4YW1wbGUsIGFsbG93cyB1c2VycyB0byB1c2Ugc3BhY2UgZm9yIEVsYXN0aWMgSVAgYWRkcmVzc2VzIGFuZCBWUENzLlxuICAqXG4gICogQHNlZSBodHRwOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItaXBhbXBvb2wuaHRtbCNjZm4tZWMyLWlwYW1wb29sLWF3c3NlcnZpY2VcbiAgKlxuICAqIEBkZWZhdWx0IC0gcmVxdWlyZWQgaW4gY2FzZSBvZiBhbiBJUHY2LCB0aHJvd3MgYW4gZXJyb3IgaWYgbm90IHByb3ZpZGVkLlxuICAqL1xuICByZWFkb25seSBhd3NTZXJ2aWNlPzogQXdzU2VydmljZU5hbWU7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgY3JlYXRpbmcgYW4gSVBBTSBwb29sLlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2UtZWMyLWlwYW1wb29sLmh0bWxcbiAqL1xuaW50ZXJmYWNlIElwYW1Qb29sUHJvcHMgZXh0ZW5kcyBQb29sT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTY29wZSBpZCB3aGVyZSBwb29sIG5lZWRzIHRvIGJlIGNyZWF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IGlwYW1TY29wZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElQQU0gcmVzb3VyY2UgbmFtZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGF1dG9nZW5lcmF0ZWQgYnkgQ0RLIGlmIG5vdCBwcm92aWRlZFxuICAgKi9cbiAgcmVhZG9ubHkgaXBhbVBvb2xOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgdG8gcHJvdmlzaW9uIENJRFJzIHRvIGFuIElQQU0gcG9vbC5cbiAqIFVzZWQgdG8gY3JlYXRlIGEgbmV3IElwYW1Qb29sQ2lkclxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2UtZWMyLWlwYW1wb29sY2lkci5odG1sXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXBhbVBvb2xDaWRyUHJvdmlzaW9uaW5nT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJcHY2IE5ldG1hc2sgbGVuZ3RoIGZvciB0aGUgQ0lEUlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHBvb2wgcHJvdmlzaW9uZWQgd2l0aG91dCBuZXRtYXNrIGxlbmd0aCwgbmVlZCBjaWRyIHJhbmdlIGluIHRoaXMgY2FzZVxuICAgKi9cbiAgcmVhZG9ubHkgbmV0bWFza0xlbmd0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogSXB2NiBDSURSIGJsb2NrIGZvciB0aGUgSVBBTSBwb29sXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcG9vbCBwcm92aXNpb25lZCB3aXRob3V0IG5ldG1hc2sgbGVuZ3RoLCBuZWVkIG5ldG1hc2sgbGVuZ3RoIGluIHRoaXMgY2FzZVxuICAgKi9cbiAgcmVhZG9ubHkgY2lkcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZWZpbml0aW9uIHVzZWQgdG8gYWRkIG9yIGNyZWF0ZSBhIG5ldyBJUEFNIHBvb2xcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSXBhbVBvb2wge1xuICAvKipcbiAqIFBvb2wgSUQgdG8gYmUgcGFzc2VkIHRvIHRoZSBWUEMgY29uc3RydWN0XG4gKiBAYXR0cmlidXRlIElwYW1Qb29sSWRcbiAqL1xuICByZWFkb25seSBpcGFtUG9vbElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBvb2wgQ0lEUiBmb3IgSVB2NiB0byBiZSBwcm92aXNpb25lZCB3aXRoIFB1YmxpYyBJUCBzb3VyY2Ugc2V0IHRvICdBbWF6b24nXG4gICAqL1xuICByZWFkb25seSBpcGFtQ2lkcnM6IENmbklQQU1Qb29sQ2lkcltdO1xuXG4gIC8qKlxuICAgKiBQb29sIENJRFIgZm9yIElQdjQgdG8gYmUgcHJvdmlzaW9uZWQgdXNpbmcgSVBBTVxuICAgKiBSZXF1aXJlZCB0byBjaGVjayBmb3Igc3VibmV0IElQIHJhbmdlIGlzIHdpdGhpbiB0aGUgVlBDIHJhbmdlXG4gICAqL1xuICByZWFkb25seSBpcGFtSXB2NENpZHJzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHRvIGFzc29jaWF0ZSBhIElQdjYgYWRkcmVzcyB3aXRoIElQQU0gcG9vbFxuICAgKi9cbiAgcHJvdmlzaW9uQ2lkcihpZDogc3RyaW5nLCBvcHRpb25zOiBJcGFtUG9vbENpZHJQcm92aXNpb25pbmdPcHRpb25zKTogQ2ZuSVBBTVBvb2xDaWRyO1xuXG59XG5cbi8qKlxuICogSVBBTSBzY29wZSBpcyB0aGUgaGlnaGVzdC1sZXZlbCBjb250YWluZXIgd2l0aGluIElQQU0uIEFuIElQQU0gY29udGFpbnMgdHdvIGRlZmF1bHQgc2NvcGVzLlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2UtZWMyLWlwYW1zY29wZS5odG1sXG4gKi9cbmludGVyZmFjZSBJcGFtU2NvcGVQcm9wcyBleHRlbmRzIElwYW1TY29wZU9wdGlvbnMge1xuICAvKipcbiAgICogSVBBTSBpZCB0byB3aGljaCBzY29wZSBuZWVkcyB0byBiZSBhZGRlZFxuICAgKi9cbiAgcmVhZG9ubHkgaXBhbUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9wZXJhdGluZyByZWdpb25zIGZvciB0aGUgSXBhbVxuICAgKiBSZXF1aXJlZCBpbiBvcmRlciB0byB2YWxpZGF0ZSB0aGUgbG9jYWxlIGJlaW5nIHNldCBvbiBwb29sXG4gICAqL1xuICByZWFkb25seSBpcGFtT3BlcmF0aW5nUmVnaW9uczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBpcGFtIHNjb3BlIGlkIHRvIGFkZCBhIHBvb2wgaW4gb3JkZXIgdG8gc3VwcG9ydCBkZWZhdWx0IHNjb3Blc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRocm93cyBhbiBlcnJvciBpZiBubyBzY29wZSBpZCBpcyBwcm92aWRlZFxuICAgKi9cbiAgcmVhZG9ubHkgaXBhbVNjb3BlSWQ/OiBzdHJpbmc7XG5cbn1cblxuLyoqXG4gKiBCZWluZyB1c2VkIGluIElQQU0gY2xhc3MgdG8gYWRkIHBvb2xzIHRvIGRlZmF1bHQgc2NvcGUgY3JlYXRlZCBieSBJUEFNLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElwYW1TY29wZU9wdGlvbnMge1xuXG4gIC8qKlxuICAgKiBJUEFNIHNjb3BlIG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRhZ2dpbmdcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyB0YWdzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHNjb3BlXG4gICAqL1xuICByZWFkb25seSBpcGFtU2NvcGVOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIGFuIElQIEFkZHJlc3MgTWFuYWdlciAoSVBBTSkuXG4gKlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItaXBhbS5odG1sfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJcGFtT3B0aW9ucyB7XG5cbiAgLyoqXG4gICAqIENJRFIgTWFzayBmb3IgVnBjXG4gICAqIE9ubHkgcmVxdWlyZWQgd2hlbiB1c2luZyBBV1MgSXBhbVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIG5ldG1hc2sgbGVuZ3RoIGZvciBJUEFNIGF0dGFjaGVkIHRvIFZQQyBzZWNvbmRhcnkgYWRkcmVzc1xuICAgKi9cbiAgcmVhZG9ubHkgbmV0bWFza0xlbmd0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogSXB2NCBvciBhbiBJcHY2IElQQU0gcG9vbFxuICAgKiBPbmx5IHJlcXVpcmVkIHdoZW4gdXNpbmcgQVdTIElwYW1cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBwb29sIGF0dGFjaGVkIHRvIFZQQyBzZWNvbmRhcnkgYWRkcmVzc1xuICAgKi9cbiAgcmVhZG9ubHkgaXBhbVBvb2w/OiBJSXBhbVBvb2w7XG5cbiAgLyoqXG4gICAqIFJlcXVpcmVkIHRvIHNldCBTZWNvbmRhcnkgY2lkciBibG9jayByZXNvdXJjZSBuYW1lXG4gICAqIGluIG9yZGVyIHRvIGdlbmVyYXRlIHVuaXF1ZSBsb2dpY2FsIGlkIGZvciB0aGUgcmVzb3VyY2UuXG4gICAqL1xuICByZWFkb25seSBjaWRyQmxvY2tOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBJcGFtU2NvcGUgQ2xhc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJSXBhbVNjb3BlQmFzZSB7XG5cbiAgLyoqXG4gICAqIFJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBzY29wZSBvZiBzdGFjayB0byBiZSBwYXNzZWQgaW4gb3JkZXIgdG8gY3JlYXRlXG4gICAqIGEgbmV3IElQQU0gcG9vbFxuICAgKi9cbiAgcmVhZG9ubHkgc2NvcGU6IENvbnN0cnVjdDtcblxuICAvKipcbiAgICogRGVmYXVsdCBTY29wZSBpZHMgY3JlYXRlZCBieSB0aGUgSVBBTSBvciBhIG5ldyBSZXNvdXJjZSBpZFxuICAgKi9cbiAgcmVhZG9ubHkgc2NvcGVJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHNjb3BlIHR5cGUgY2FuIGJlIGVpdGhlciBkZWZhdWx0IG9yIGN1c3RvbVxuICAgKi9cbiAgcmVhZG9ubHkgc2NvcGVUeXBlPzogSXBhbVNjb3BlVHlwZTtcblxuICAvKipcbiAgICogRnVuY3Rpb24gdG8gYWRkIGEgbmV3IHBvb2wgdG8gYW4gSVBBTSBzY29wZVxuICAgKi9cbiAgYWRkUG9vbChpZDogc3RyaW5nLCBvcHRpb25zOiBQb29sT3B0aW9ucyk6IElJcGFtUG9vbDtcblxufVxuXG4vKipcbiAqIENyZWF0ZXMgbmV3IElQQU0gUG9vbFxuICogUG9vbHMgZW5hYmxlIHlvdSB0byBvcmdhbml6ZSB5b3VyIElQIGFkZHJlc3NlcyBhY2NvcmRpbmcgdG8geW91ciByb3V0aW5nIGFuZCBzZWN1cml0eSBuZWVkc1xuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2UtZWMyLWlwYW1wb29sLmh0bWxcbiAqIEByZXNvdXJjZSBBV1M6OkVDMjo6SVBBTVBvb2xcbiAqIEBpbnRlcm5hbFxuICovXG5jbGFzcyBJcGFtUG9vbCBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSUlwYW1Qb29sIHtcblxuICAvKipcbiAgICogUG9vbCBJRCB0byBiZSBwYXNzZWQgdG8gdGhlIFZQQyBjb25zdHJ1Y3RcbiAgICogQGF0dHJpYnV0ZSBJcGFtUG9vbElkXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXBhbVBvb2xJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQb29sIENJRFIgZm9yIElQdjYgdG8gYmUgcHJvdmlzaW9uZWQgd2l0aCBQdWJsaWMgSVAgc291cmNlIHNldCB0byAnQW1hem9uJ1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlwYW1DaWRyczogQ2ZuSVBBTVBvb2xDaWRyW10gPSBbXVxuXG4gIC8qKlxuICAgKiBQb29sIENJRFIgZm9yIElQdjQgdG8gYmUgcHJvdmlzaW9uZWQgdXNpbmcgSVBBTVxuICAgKiBSZXF1aXJlZCB0byBjaGVjayBmb3Igc3VibmV0IElQIHJhbmdlIGlzIHdpdGhpbiB0aGUgVlBDIHJhbmdlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXBhbUlwdjRDaWRyczogc3RyaW5nW10gPSBbXVxuXG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgdG8gaXBhbVBvb2wgcmVzb3VyY2UgY3JlYXRlZCBpbiB0aGlzIGNsYXNzXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9pcGFtUG9vbDogQ2ZuSVBBTVBvb2w7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IElwYW1Qb29sUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcHJvcHMuaXBhbVBvb2xOYW1lID8/IExhenkuc3RyaW5nKHtcbiAgICAgICAgcHJvZHVjZTogKCkgPT4gTmFtZXMudW5pcXVlUmVzb3VyY2VOYW1lKHRoaXMsIHsgbWF4TGVuZ3RoOiAxMjgsIGFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVyczogJ18nIH0pLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBpZiAocHJvcHMuYWRkcmVzc0ZhbWlseSA9PT0gQWRkcmVzc0ZhbWlseS5JUF9WNiAmJiAhcHJvcHMuYXdzU2VydmljZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhd3NTZXJ2aWNlIGlzIHJlcXVpcmVkIHdoZW4gYWRkcmVzc0ZhbWlseSBpcyBzZXQgdG8gaXB2NicpO1xuICAgIH1cblxuICAgIHRoaXMuX2lwYW1Qb29sID0gbmV3IENmbklQQU1Qb29sKHRoaXMsIGlkLCB7XG4gICAgICBhZGRyZXNzRmFtaWx5OiBwcm9wcy5hZGRyZXNzRmFtaWx5LFxuICAgICAgcHJvdmlzaW9uZWRDaWRyczogcHJvcHMuaXB2NFByb3Zpc2lvbmVkQ2lkcnM/Lm1hcChjaWRyID0+ICh7IGNpZHIgfSkpLFxuICAgICAgbG9jYWxlOiBwcm9wcy5sb2NhbGUsXG4gICAgICBpcGFtU2NvcGVJZDogcHJvcHMuaXBhbVNjb3BlSWQsXG4gICAgICBwdWJsaWNJcFNvdXJjZTogcHJvcHMucHVibGljSXBTb3VyY2UsXG4gICAgICBhd3NTZXJ2aWNlOiBwcm9wcy5hd3NTZXJ2aWNlLFxuICAgIH0pO1xuICAgIHRoaXMuaXBhbVBvb2xJZCA9IHRoaXMuX2lwYW1Qb29sLmF0dHJJcGFtUG9vbElkO1xuXG4gICAgLy8gUG9wdWxhdGluZyB0byBjaGVjayBmb3Igc3VibmV0IHJhbmdlIGFnYWluc3QgYWxsIElQdjQgcmFuZ2VzIGFzc2lnbmVkIHRvIFZQQyBpbmNsdWRpbmcgSVBBTVxuICAgIHByb3BzLmlwdjRQcm92aXNpb25lZENpZHJzPy5tYXAoY2lkciA9PiAodGhpcy5pcGFtSXB2NENpZHJzLnB1c2goY2lkcikpKTtcbiAgICB0aGlzLm5vZGUuZGVmYXVsdENoaWxkID0gdGhpcy5faXBhbVBvb2w7XG4gIH1cblxuICAvKipcbiAgICogQSBDSURSIHByb3Zpc2lvbmVkIHRvIGFuIElQQU0gcG9vbC5cbiAgICogQHBhcmFtIGlkIE5hbWUgb2YgUmVzb3VyY2VcbiAgICogQHBhcmFtIG9wdGlvbnMgRWl0aGVyIGEgQ0lEUiBvciBuZXRtYXNrIGxlbmd0aCBtdXN0IGJlIHByb3ZpZGVkXG4gICAqIEByZXR1cm5zIEFXUzo6RUMyOjpJUEFNUG9vbENpZHJcbiAgICovXG4gIHB1YmxpYyBwcm92aXNpb25DaWRyKGlkOiBzdHJpbmcsIG9wdGlvbnM6IElwYW1Qb29sQ2lkclByb3Zpc2lvbmluZ09wdGlvbnMpOiBDZm5JUEFNUG9vbENpZHIge1xuICAgIGNvbnN0IGNpZHIgPSBuZXcgQ2ZuSVBBTVBvb2xDaWRyKHRoaXMsIGlkLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgaXBhbVBvb2xJZDogdGhpcy5pcGFtUG9vbElkLFxuICAgIH0pO1xuICAgIHRoaXMuaXBhbUNpZHJzLnB1c2goY2lkcik7XG4gICAgcmV0dXJuIGNpZHI7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGN1c3RvbSBJcGFtIFNjb3BlLCBjdXN0b20gSVBBTSBzY29wZXMgY2FuIG9ubHkgYmUgcHJpdmF0ZVxuICogKGNhbiBiZSB1c2VkIGZvciBhZGRpbmcgY3VzdG9tIHNjb3BlcyB0byBhbiBleGlzdGluZyBJUEFNKVxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2UtZWMyLWlwYW1zY29wZS5odG1sXG4gKiBAcmVzb3VyY2UgQVdTOjpFQzI6OklQQU1TY29wZVxuICovXG5jbGFzcyBJcGFtU2NvcGUgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElJcGFtU2NvcGVCYXNlIHtcblxuICAvKipcbiAgICogU3RvcmVzIHRoZSByZWZlcmVuY2UgdG8gbmV3bHkgY3JlYXRlZCBSZXNvdXJjZVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfaXBhbVNjb3BlOiBDZm5JUEFNU2NvcGU7XG5cbiAgLyoqXG4gICAqIElEIGZvciBSZXNvdXJjZSBJcGFtU2NvcGVcbiAgICogQGF0dHJpYnV0ZSBJcGFtU2NvcGVJZFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNjb3BlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogUHJvcGVydGllcyB0byBjb25maWd1cmUgaXBhbSBzY29wZVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwcm9wczogSXBhbVNjb3BlUHJvcHM7XG5cbiAgLyoqXG4gICAqIFJlZmVyZW5jZSB0byBzdGFjayBzY29wZSB0byBiZSBwYXNzZWQgdGhyb3VnaCBhZGRQb29sIG1ldGhvZCBpbm9yZGVyIHRvIGNyZWF0ZSBhIG5ldyBJcGFtUG9vbFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNjb3BlOiBDb25zdHJ1Y3Q7XG5cbiAgLyoqXG4gICAqIERlZmluZXMgc2NvcGUgdHlwZSBjYW4gYmUgZWl0aGVyIGRlZmF1bHQgb3IgY3VzdG9tXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2NvcGVUeXBlOiBJcGFtU2NvcGVUeXBlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJcGFtU2NvcGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5faXBhbVNjb3BlID0gbmV3IENmbklQQU1TY29wZShzY29wZSwgJ0lwYW1TY29wZScsIHtcbiAgICAgIGlwYW1JZDogcHJvcHMuaXBhbUlkLFxuICAgIH0pO1xuICAgIHRoaXMuc2NvcGVJZCA9IHRoaXMuX2lwYW1TY29wZS5hdHRySXBhbVNjb3BlSWQ7XG4gICAgdGhpcy5zY29wZVR5cGUgPSBJcGFtU2NvcGVUeXBlLkNVU1RPTTtcbiAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBwb29sIHRvIHRoZSBJUEFNIHNjb3BlLlxuICAgKiBAZXh0ZXJuYWxcbiAgICovXG4gIGFkZFBvb2woaWQ6IHN0cmluZywgb3B0aW9uczogUG9vbE9wdGlvbnMpOiBJSXBhbVBvb2wge1xuICAgIHJldHVybiBjcmVhdGVJcGFtUG9vbCh0aGlzLnNjb3BlLCBpZCwgdGhpcy5wcm9wcywgb3B0aW9ucywgdGhpcy5zY29wZUlkKTtcbiAgfVxuXG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgSVBBTSBkZWZhdWx0IHNjb3Blcy5cbiAqL1xuY2xhc3MgSXBhbVNjb3BlQmFzZSBpbXBsZW1lbnRzIElJcGFtU2NvcGVCYXNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgc2NvcGU6IENvbnN0cnVjdCxcbiAgICByZWFkb25seSBzY29wZUlkOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9wczogSXBhbVNjb3BlUHJvcHMsXG4gICAgcmVhZG9ubHkgc2NvcGVUeXBlPzogSXBhbVNjb3BlVHlwZSxcbiAgKSB7XG4gICAgdGhpcy5zY29wZVR5cGUgPSBJcGFtU2NvcGVUeXBlLkRFRkFVTFQ7XG4gICAgaWYgKCFwcm9wcy5pcGFtU2NvcGVJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpcGFtU2NvcGVJZCBpcyByZXF1aXJlZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNjb3BlSWQgPSBwcm9wcy5pcGFtU2NvcGVJZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHBvb2wgdG8gdGhlIElQQU0gc2NvcGUuXG4gICAqIEBleHRlcm5hbFxuICAgKi9cbiAgYWRkUG9vbChpZDogc3RyaW5nLCBvcHRpb25zOiBQb29sT3B0aW9ucyk6IElJcGFtUG9vbCB7XG4gICAgcmV0dXJuIGNyZWF0ZUlwYW1Qb29sKHRoaXMuc2NvcGUsIGlkLCB0aGlzLnByb3BzLCBvcHRpb25zLCB0aGlzLnNjb3BlSWQpO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBuZXcgSVBBTSB3aXRoIGRlZmF1bHQgcHVibGljIGFuZCBwcml2YXRlIHNjb3BlXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItaXBhbXNjb3BlLmh0bWxcbiAqIEByZXNvdXJjZSBBV1M6OkVDMjo6SVBBTVxuICovXG5leHBvcnQgY2xhc3MgSXBhbSBleHRlbmRzIFJlc291cmNlIHtcbiAgLyoqXG4gKiBQcm92aWRlcyBhY2Nlc3MgdG8gZGVmYXVsdCBwdWJsaWMgSVBBTSBzY29wZSB0aHJvdWdoIGFkZCBwb29sIG1ldGhvZC5cbiAqIFVzYWdlOiBUbyBhZGQgYW4gSXBhbSBQb29sIHRvIGEgZGVmYXVsdCBwdWJsaWMgc2NvcGVcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWVjMi1pcGFtc2NvcGUuaHRtbFxuICovXG4gIHB1YmxpYyByZWFkb25seSBwdWJsaWNTY29wZTogSUlwYW1TY29wZUJhc2U7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGFjY2VzcyB0byBkZWZhdWx0IHByaXZhdGUgSVBBTSBzY29wZSB0aHJvdWdoIGFkZCBwb29sIG1ldGhvZC5cbiAgICogVXNhZ2U6IFRvIGFkZCBhbiBJcGFtIFBvb2wgdG8gYSBkZWZhdWx0IHByaXZhdGUgc2NvcGVcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2UtZWMyLWlwYW1zY29wZS5odG1sXG4gICAqICovXG4gIHB1YmxpYyByZWFkb25seSBwcml2YXRlU2NvcGU6IElJcGFtU2NvcGVCYXNlO1xuXG4gIC8vIFJlc291cmNlIElQQU1cbiAgcHJpdmF0ZSByZWFkb25seSBfaXBhbTogQ2ZuSVBBTTtcbiAgLyoqXG4gICAqIEFjY2VzcyB0byBJcGFtIHJlc291cmNlIGlkIHRoYXQgY2FuIGJlIHVzZWQgbGF0ZXIgdG8gYWRkIGEgY3VzdG9tIHByaXZhdGUgc2NvcGUgdG8gdGhpcyBJUEFNXG4gICAqIEBhdHRyaWJ1dGUgSXBhbUlkXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXBhbUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2Ygb3BlcmF0aW5nIHJlZ2lvbnMgZm9yIElQQU1cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBvcGVyYXRpbmdSZWdpb25zOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTGlzdCBvZiBzY29wZXMgY3JlYXRlZCB1bmRlciB0aGlzIElQQU1cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzY29wZXM6IElJcGFtU2NvcGVCYXNlW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IElwYW1Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBpZiAoIXByb3BzPy5vcGVyYXRpbmdSZWdpb24gJiYgIVN0YWNrLm9mKHRoaXMpLnJlZ2lvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcHJvdmlkZSBhdCBsZWFzdCBvbmUgb3BlcmF0aW5nIHJlZ2lvbicpO1xuICAgIH1cblxuICAgIHRoaXMub3BlcmF0aW5nUmVnaW9ucyA9IHByb3BzPy5vcGVyYXRpbmdSZWdpb24gPz8gW1N0YWNrLm9mKHRoaXMpLnJlZ2lvbl07XG5cbiAgICB0aGlzLl9pcGFtID0gbmV3IENmbklQQU0odGhpcywgJ0lwYW0nLCB7XG4gICAgICBvcGVyYXRpbmdSZWdpb25zOiB0aGlzLm9wZXJhdGluZ1JlZ2lvbnMgPyB0aGlzLm9wZXJhdGluZ1JlZ2lvbnMubWFwKHJlZ2lvbiA9PiAoeyByZWdpb25OYW1lOiByZWdpb24gfSkpIDogW10sXG4gICAgfSk7XG4gICAgdGhpcy5ub2RlLmRlZmF1bHRDaGlsZCA9IHRoaXMuX2lwYW07XG5cbiAgICB0aGlzLmlwYW1JZCA9IHRoaXMuX2lwYW0uYXR0cklwYW1JZDtcbiAgICB0aGlzLnB1YmxpY1Njb3BlID0gbmV3IElwYW1TY29wZUJhc2UodGhpcywgJ0RlZmF1bHRQdWJsaWNTY29wZScsIHtcbiAgICAgIGlwYW1PcGVyYXRpbmdSZWdpb25zOiB0aGlzLm9wZXJhdGluZ1JlZ2lvbnMsXG4gICAgICBpcGFtSWQ6IHRoaXMuX2lwYW0uYXR0cklwYW1JZCxcbiAgICAgIGlwYW1TY29wZUlkOiB0aGlzLl9pcGFtLmF0dHJQdWJsaWNEZWZhdWx0U2NvcGVJZCxcbiAgICB9KTtcbiAgICB0aGlzLnByaXZhdGVTY29wZSA9IG5ldyBJcGFtU2NvcGVCYXNlKHRoaXMsICdEZWZhdWx0UHJpdmF0ZVNjb3BlJywge1xuICAgICAgaXBhbU9wZXJhdGluZ1JlZ2lvbnM6IHRoaXMub3BlcmF0aW5nUmVnaW9ucyxcbiAgICAgIGlwYW1JZDogdGhpcy5faXBhbS5hdHRySXBhbUlkLFxuICAgICAgaXBhbVNjb3BlSWQ6IHRoaXMuX2lwYW0uYXR0clByaXZhdGVEZWZhdWx0U2NvcGVJZCxcbiAgICB9KTtcblxuICAgIHRoaXMuc2NvcGVzLnB1c2godGhpcy5wdWJsaWNTY29wZSwgdGhpcy5wcml2YXRlU2NvcGUpO1xuXG4gIH1cblxuICAvKipcbiAgICogRnVuY3Rpb24gdG8gYWRkIGN1c3RvbSBzY29wZSB0byBhbiBleGlzdGluZyBJUEFNXG4gICAqIEN1c3RvbSBzY29wZXMgY2FuIG9ubHkgYmUgcHJpdmF0ZVxuICAgKi9cbiAgcHVibGljIGFkZFNjb3BlKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIG9wdGlvbnM6IElwYW1TY29wZU9wdGlvbnMpOiBJSXBhbVNjb3BlQmFzZSB7XG4gICAgY29uc3QgaXBhbVNjb3BlID0gbmV3IElwYW1TY29wZShzY29wZSwgaWQsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBpcGFtSWQ6IHRoaXMuaXBhbUlkLFxuICAgICAgaXBhbU9wZXJhdGluZ1JlZ2lvbnM6IHRoaXMub3BlcmF0aW5nUmVnaW9ucyxcbiAgICB9KTtcbiAgICB0aGlzLnNjb3Blcy5wdXNoKGlwYW1TY29wZSk7XG4gICAgcmV0dXJuIGlwYW1TY29wZTtcbiAgfVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGNyZWF0ZSBJcGFtUG9vbCB1bmRlciBzY29wZVxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUlwYW1Qb29sKFxuICBzY29wZTogQ29uc3RydWN0LFxuICBpZDogc3RyaW5nLFxuICBzY29wZU9wdGlvbnM6IElwYW1TY29wZVByb3BzLFxuICBwb29sT3B0aW9uczogUG9vbE9wdGlvbnMsXG4gIHNjb3BlSWQ6IHN0cmluZyxcbik6IElwYW1Qb29sIHtcbiAgY29uc3QgaXNMb2NhbGVJbk9wZXJhdGluZ1JlZ2lvbnMgPSBzY29wZU9wdGlvbnMuaXBhbU9wZXJhdGluZ1JlZ2lvbnNcbiAgICA/IHNjb3BlT3B0aW9ucy5pcGFtT3BlcmF0aW5nUmVnaW9ucy5tYXAocmVnaW9uID0+ICh7IHJlZ2lvbk5hbWU6IHJlZ2lvbiB9KSlcbiAgICAgIC5zb21lKHJlZ2lvbiA9PiByZWdpb24ucmVnaW9uTmFtZSA9PT0gcG9vbE9wdGlvbnMubG9jYWxlKVxuICAgIDogZmFsc2U7XG5cbiAgaWYgKCFpc0xvY2FsZUluT3BlcmF0aW5nUmVnaW9ucykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHByb3ZpZGVkIGxvY2FsZSAnJHtwb29sT3B0aW9ucy5sb2NhbGV9JyBpcyBub3QgaW4gdGhlIG9wZXJhdGluZyByZWdpb25zLmApO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBJcGFtUG9vbChzY29wZSwgaWQsIHtcbiAgICBpcGFtUG9vbE5hbWU6IGlkLFxuICAgIGFkZHJlc3NGYW1pbHk6IHBvb2xPcHRpb25zLmFkZHJlc3NGYW1pbHksXG4gICAgaXB2NFByb3Zpc2lvbmVkQ2lkcnM6IHBvb2xPcHRpb25zLmlwdjRQcm92aXNpb25lZENpZHJzLFxuICAgIGlwYW1TY29wZUlkOiBzY29wZUlkLFxuICAgIGxvY2FsZTogcG9vbE9wdGlvbnMubG9jYWxlLFxuICAgIHB1YmxpY0lwU291cmNlOiBwb29sT3B0aW9ucy5wdWJsaWNJcFNvdXJjZSxcbiAgICBhd3NTZXJ2aWNlOiBwb29sT3B0aW9ucy5hd3NTZXJ2aWNlLFxuICB9KTtcbn1cblxuIl19
package/lib/route.js CHANGED
@@ -49,7 +49,7 @@ class EgressOnlyInternetGateway extends core_1.Resource {
49
49
  }
50
50
  exports.EgressOnlyInternetGateway = EgressOnlyInternetGateway;
51
51
  _a = JSII_RTTI_SYMBOL_1;
52
- EgressOnlyInternetGateway[_a] = { fqn: "@aws-cdk/aws-ec2-alpha.EgressOnlyInternetGateway", version: "2.164.1-alpha.0" };
52
+ EgressOnlyInternetGateway[_a] = { fqn: "@aws-cdk/aws-ec2-alpha.EgressOnlyInternetGateway", version: "2.166.0-alpha.0" };
53
53
  /**
54
54
  * Creates an internet gateway
55
55
  * @resource AWS::EC2::InternetGateway
@@ -79,7 +79,7 @@ class InternetGateway extends core_1.Resource {
79
79
  }
80
80
  exports.InternetGateway = InternetGateway;
81
81
  _b = JSII_RTTI_SYMBOL_1;
82
- InternetGateway[_b] = { fqn: "@aws-cdk/aws-ec2-alpha.InternetGateway", version: "2.164.1-alpha.0" };
82
+ InternetGateway[_b] = { fqn: "@aws-cdk/aws-ec2-alpha.InternetGateway", version: "2.166.0-alpha.0" };
83
83
  /**
84
84
  * Creates a virtual private gateway
85
85
  * @resource AWS::EC2::VPNGateway
@@ -127,7 +127,7 @@ class VPNGatewayV2 extends core_1.Resource {
127
127
  }
128
128
  exports.VPNGatewayV2 = VPNGatewayV2;
129
129
  _c = JSII_RTTI_SYMBOL_1;
130
- VPNGatewayV2[_c] = { fqn: "@aws-cdk/aws-ec2-alpha.VPNGatewayV2", version: "2.164.1-alpha.0" };
130
+ VPNGatewayV2[_c] = { fqn: "@aws-cdk/aws-ec2-alpha.VPNGatewayV2", version: "2.166.0-alpha.0" };
131
131
  /**
132
132
  * Creates a network address translation (NAT) gateway
133
133
  * @resource AWS::EC2::NatGateway
@@ -179,7 +179,7 @@ class NatGateway extends core_1.Resource {
179
179
  }
180
180
  exports.NatGateway = NatGateway;
181
181
  _d = JSII_RTTI_SYMBOL_1;
182
- NatGateway[_d] = { fqn: "@aws-cdk/aws-ec2-alpha.NatGateway", version: "2.164.1-alpha.0" };
182
+ NatGateway[_d] = { fqn: "@aws-cdk/aws-ec2-alpha.NatGateway", version: "2.166.0-alpha.0" };
183
183
  /**
184
184
  * The gateway or endpoint targeted by the route.
185
185
  */
@@ -205,7 +205,7 @@ class RouteTargetType {
205
205
  }
206
206
  exports.RouteTargetType = RouteTargetType;
207
207
  _e = JSII_RTTI_SYMBOL_1;
208
- RouteTargetType[_e] = { fqn: "@aws-cdk/aws-ec2-alpha.RouteTargetType", version: "2.164.1-alpha.0" };
208
+ RouteTargetType[_e] = { fqn: "@aws-cdk/aws-ec2-alpha.RouteTargetType", version: "2.166.0-alpha.0" };
209
209
  /**
210
210
  * Creates a new route with added functionality.
211
211
  * @resource AWS::EC2::Route
@@ -259,7 +259,7 @@ class Route extends core_1.Resource {
259
259
  }
260
260
  exports.Route = Route;
261
261
  _f = JSII_RTTI_SYMBOL_1;
262
- Route[_f] = { fqn: "@aws-cdk/aws-ec2-alpha.Route", version: "2.164.1-alpha.0" };
262
+ Route[_f] = { fqn: "@aws-cdk/aws-ec2-alpha.Route", version: "2.166.0-alpha.0" };
263
263
  /**
264
264
  * Creates a route table for the specified VPC
265
265
  * @resource AWS::EC2::RouteTable
@@ -307,7 +307,7 @@ class RouteTable extends core_1.Resource {
307
307
  }
308
308
  exports.RouteTable = RouteTable;
309
309
  _g = JSII_RTTI_SYMBOL_1;
310
- RouteTable[_g] = { fqn: "@aws-cdk/aws-ec2-alpha.RouteTable", version: "2.164.1-alpha.0" };
310
+ RouteTable[_g] = { fqn: "@aws-cdk/aws-ec2-alpha.RouteTable", version: "2.166.0-alpha.0" };
311
311
  function routerTypeToPropName(routerType) {
312
312
  return ({
313
313
  [aws_ec2_1.RouterType.CARRIER_GATEWAY]: 'carrierGatewayId',
@@ -98,6 +98,10 @@ export interface ISubnetV2 extends ISubnet {
98
98
  *
99
99
  */
100
100
  export declare class SubnetV2 extends Resource implements ISubnetV2 {
101
+ /**
102
+ * Import an existing subnet to the VPC
103
+ */
104
+ static fromSubnetV2Attributes(scope: Construct, id: string, attrs: SubnetV2Attributes): ISubnetV2;
101
105
  /**
102
106
  * The Availability Zone the subnet is located in
103
107
  */
@@ -158,4 +162,47 @@ export declare class SubnetV2 extends Resource implements ISubnetV2 {
158
162
  */
159
163
  get networkAcl(): INetworkAcl;
160
164
  }
165
+ /**
166
+ * Properties required to import a subnet
167
+ */
168
+ export interface SubnetV2Attributes {
169
+ /**
170
+ * The Availability Zone this subnet is located in
171
+ *
172
+ * @default - No AZ information, cannot use AZ selection features
173
+ */
174
+ readonly availabilityZone: string;
175
+ /**
176
+ * The IPv4 CIDR block associated with the subnet
177
+ *
178
+ * @default - No CIDR information, cannot use CIDR filter features
179
+ */
180
+ readonly ipv4CidrBlock: string;
181
+ /**
182
+ * The IPv4 CIDR block associated with the subnet
183
+ *
184
+ * @default - No CIDR information, cannot use CIDR filter features
185
+ */
186
+ readonly ipv6CidrBlock?: string;
187
+ /**
188
+ * The ID of the route table for this particular subnet
189
+ *
190
+ * @default - No route table information, cannot create VPC endpoints
191
+ */
192
+ readonly routeTableId?: string;
193
+ /**
194
+ * The subnetId for this particular subnet
195
+ */
196
+ readonly subnetId: string;
197
+ /**
198
+ * The type of subnet (public or private) that this subnet represents.
199
+ */
200
+ readonly subnetType: SubnetType;
201
+ /**
202
+ * Name of the given subnet
203
+ *
204
+ * @default - no subnet name
205
+ */
206
+ readonly subnetName?: string;
207
+ }
161
208
  export {};