@aws-cdk/aws-ec2-alpha 2.176.0-alpha.0 → 2.178.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.
- package/.jsii +4266 -1645
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +167 -1
- package/README.md +274 -33
- package/awslint.json +5 -1
- package/lib/index.d.ts +8 -0
- package/lib/index.js +9 -1
- package/lib/ipam.d.ts +16 -16
- package/lib/ipam.js +24 -5
- package/lib/route.js +40 -18
- package/lib/subnet-v2.d.ts +3 -3
- package/lib/subnet-v2.js +40 -29
- package/lib/transit-gateway-association.d.ts +18 -0
- package/lib/transit-gateway-association.js +12 -0
- package/lib/transit-gateway-attachment.d.ts +18 -0
- package/lib/transit-gateway-attachment.js +12 -0
- package/lib/transit-gateway-route-table-association.d.ts +40 -0
- package/lib/transit-gateway-route-table-association.js +40 -0
- package/lib/transit-gateway-route-table-propagation.d.ts +45 -0
- package/lib/transit-gateway-route-table-propagation.js +40 -0
- package/lib/transit-gateway-route-table.d.ts +78 -0
- package/lib/transit-gateway-route-table.js +74 -0
- package/lib/transit-gateway-route.d.ts +90 -0
- package/lib/transit-gateway-route.js +81 -0
- package/lib/transit-gateway-vpc-attachment.d.ts +122 -0
- package/lib/transit-gateway-vpc-attachment.js +96 -0
- package/lib/transit-gateway.d.ts +166 -0
- package/lib/transit-gateway.js +113 -0
- package/lib/util.d.ts +16 -8
- package/lib/util.js +77 -23
- package/lib/vpc-v2-base.d.ts +71 -56
- package/lib/vpc-v2-base.js +82 -65
- package/lib/vpc-v2.d.ts +60 -4
- package/lib/vpc-v2.js +58 -14
- package/package.json +8 -8
- package/rosetta/default.ts-fixture +1 -1
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { RouterType } from 'aws-cdk-lib/aws-ec2';
|
|
2
|
+
import * as cdk from 'aws-cdk-lib/core';
|
|
3
|
+
import { Construct } from 'constructs';
|
|
4
|
+
import { ITransitGatewayRouteTable } from './transit-gateway-route-table';
|
|
5
|
+
import { AttachVpcOptions, ITransitGatewayVpcAttachment } from './transit-gateway-vpc-attachment';
|
|
6
|
+
import { IRouteTarget } from './route';
|
|
7
|
+
/**
|
|
8
|
+
* Represents a Transit Gateway.
|
|
9
|
+
*/
|
|
10
|
+
export interface ITransitGateway extends cdk.IResource, IRouteTarget {
|
|
11
|
+
/**
|
|
12
|
+
* The unique identifier of the Transit Gateway.
|
|
13
|
+
*
|
|
14
|
+
* This ID is automatically assigned by AWS upon creation of the Transit Gateway
|
|
15
|
+
* and is used to reference it in various configurations and operations.
|
|
16
|
+
* @attribute
|
|
17
|
+
*/
|
|
18
|
+
readonly transitGatewayId: string;
|
|
19
|
+
/**
|
|
20
|
+
* The Amazon Resource Name (ARN) of the Transit Gateway.
|
|
21
|
+
*
|
|
22
|
+
* The ARN uniquely identifies the Transit Gateway across AWS and is commonly
|
|
23
|
+
* used for permissions and resource tracking.
|
|
24
|
+
* @attribute
|
|
25
|
+
*/
|
|
26
|
+
readonly transitGatewayArn: string;
|
|
27
|
+
/**
|
|
28
|
+
* The default route table associated with the Transit Gateway.
|
|
29
|
+
*
|
|
30
|
+
* This route table is created by the CDK and is used to manage the routes
|
|
31
|
+
* for attachments that do not have an explicitly defined route table association.
|
|
32
|
+
*/
|
|
33
|
+
readonly defaultRouteTable: ITransitGatewayRouteTable;
|
|
34
|
+
/**
|
|
35
|
+
* Indicates whether new attachments are automatically associated with the default route table.
|
|
36
|
+
*
|
|
37
|
+
* If set to `true`, any VPC or VPN attachment will be automatically associated with
|
|
38
|
+
* the default route table unless otherwise specified.
|
|
39
|
+
*/
|
|
40
|
+
readonly defaultRouteTableAssociation: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Indicates whether route propagation to the default route table is enabled.
|
|
43
|
+
*
|
|
44
|
+
* When set to `true`, routes from attachments will be automatically propagated
|
|
45
|
+
* to the default route table unless propagation is explicitly disabled.
|
|
46
|
+
*/
|
|
47
|
+
readonly defaultRouteTablePropagation: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Whether or not DNS support is enabled on the Transit Gateway.
|
|
50
|
+
*/
|
|
51
|
+
readonly dnsSupport: boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Whether or not security group referencing support is enabled on the Transit Gateway.
|
|
54
|
+
*/
|
|
55
|
+
readonly securityGroupReferencingSupport: boolean;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Common properties for creating a Transit Gateway resource.
|
|
59
|
+
*/
|
|
60
|
+
export interface TransitGatewayProps {
|
|
61
|
+
/**
|
|
62
|
+
* Physical name of this Transit Gateway.
|
|
63
|
+
*
|
|
64
|
+
* @default - Assigned by CloudFormation.
|
|
65
|
+
*/
|
|
66
|
+
readonly transitGatewayName?: string;
|
|
67
|
+
/**
|
|
68
|
+
* A private Autonomous System Number (ASN) for the Amazon side of a BGP session. The range is 64512 to 65534 for 16-bit ASNs.
|
|
69
|
+
*
|
|
70
|
+
* @default - undefined, 64512 is assigned by CloudFormation.
|
|
71
|
+
*/
|
|
72
|
+
readonly amazonSideAsn?: number;
|
|
73
|
+
/**
|
|
74
|
+
* Enable or disable automatic acceptance of cross-account attachment requests.
|
|
75
|
+
*
|
|
76
|
+
* @default - disable (false)
|
|
77
|
+
*/
|
|
78
|
+
readonly autoAcceptSharedAttachments?: boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Enable or disable automatic association with the default association route table.
|
|
81
|
+
*
|
|
82
|
+
* @default - enable (true)
|
|
83
|
+
*/
|
|
84
|
+
readonly defaultRouteTableAssociation?: boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Enable or disable automatic propagation of routes to the default propagation route table.
|
|
87
|
+
*
|
|
88
|
+
* @default - enable (true)
|
|
89
|
+
*/
|
|
90
|
+
readonly defaultRouteTablePropagation?: boolean;
|
|
91
|
+
/**
|
|
92
|
+
* The description of the transit gateway.
|
|
93
|
+
*
|
|
94
|
+
* @default - no description
|
|
95
|
+
*/
|
|
96
|
+
readonly description?: string;
|
|
97
|
+
/**
|
|
98
|
+
* Enable or disable DNS support.
|
|
99
|
+
*
|
|
100
|
+
* If dnsSupport is enabled on a VPC Attachment, this also needs to be enabled for the feature to work.
|
|
101
|
+
* Otherwise the resources will still deploy but the feature will not work.
|
|
102
|
+
*
|
|
103
|
+
* @default - enable (true)
|
|
104
|
+
*/
|
|
105
|
+
readonly dnsSupport?: boolean;
|
|
106
|
+
/**
|
|
107
|
+
* Enable or disable security group referencing support
|
|
108
|
+
*
|
|
109
|
+
* If securityGroupReferencingSupport is enabled on a VPC Attachment, this also needs to be enabled for the feature to work.
|
|
110
|
+
* Otherwise the resources will still deploy but the feature will not work.
|
|
111
|
+
*
|
|
112
|
+
* @default - disable (false)
|
|
113
|
+
*/
|
|
114
|
+
readonly securityGroupReferencingSupport?: boolean;
|
|
115
|
+
/**
|
|
116
|
+
* The transit gateway CIDR blocks.
|
|
117
|
+
*
|
|
118
|
+
* @default - none
|
|
119
|
+
*/
|
|
120
|
+
readonly transitGatewayCidrBlocks?: string[];
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* A Transit Gateway.
|
|
124
|
+
* @internal
|
|
125
|
+
*/
|
|
126
|
+
declare abstract class TransitGatewayBase extends cdk.Resource implements ITransitGateway, IRouteTarget {
|
|
127
|
+
abstract readonly routerType: RouterType;
|
|
128
|
+
abstract readonly routerTargetId: string;
|
|
129
|
+
abstract readonly transitGatewayId: string;
|
|
130
|
+
abstract readonly transitGatewayArn: string;
|
|
131
|
+
abstract readonly defaultRouteTable: ITransitGatewayRouteTable;
|
|
132
|
+
abstract readonly defaultRouteTableAssociation: boolean;
|
|
133
|
+
abstract readonly defaultRouteTablePropagation: boolean;
|
|
134
|
+
abstract readonly dnsSupport: boolean;
|
|
135
|
+
abstract readonly securityGroupReferencingSupport: boolean;
|
|
136
|
+
/**
|
|
137
|
+
* Adds a new route table to the Transit Gateway.
|
|
138
|
+
*
|
|
139
|
+
* @returns The created Transit Gateway route table.
|
|
140
|
+
*/
|
|
141
|
+
addRouteTable(id: string): ITransitGatewayRouteTable;
|
|
142
|
+
/**
|
|
143
|
+
* Attaches a VPC to the Transit Gateway.
|
|
144
|
+
*
|
|
145
|
+
* @returns The created Transit Gateway VPC attachment.
|
|
146
|
+
*/
|
|
147
|
+
attachVpc(id: string, options: AttachVpcOptions): ITransitGatewayVpcAttachment;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Creates a Transit Gateway.
|
|
151
|
+
*
|
|
152
|
+
* @resource AWS::EC2::TransitGateway
|
|
153
|
+
*/
|
|
154
|
+
export declare class TransitGateway extends TransitGatewayBase {
|
|
155
|
+
readonly routerType: RouterType;
|
|
156
|
+
readonly routerTargetId: string;
|
|
157
|
+
readonly transitGatewayId: string;
|
|
158
|
+
readonly transitGatewayArn: string;
|
|
159
|
+
readonly defaultRouteTable: ITransitGatewayRouteTable;
|
|
160
|
+
readonly defaultRouteTableAssociation: boolean;
|
|
161
|
+
readonly defaultRouteTablePropagation: boolean;
|
|
162
|
+
readonly dnsSupport: boolean;
|
|
163
|
+
readonly securityGroupReferencingSupport: boolean;
|
|
164
|
+
constructor(scope: Construct, id: string, props?: TransitGatewayProps);
|
|
165
|
+
}
|
|
166
|
+
export {};
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.TransitGateway = void 0;
|
|
5
|
+
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
|
|
6
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
7
|
+
const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
|
|
8
|
+
const cdk = require("aws-cdk-lib/core");
|
|
9
|
+
const transit_gateway_route_table_1 = require("./transit-gateway-route-table");
|
|
10
|
+
const transit_gateway_vpc_attachment_1 = require("./transit-gateway-vpc-attachment");
|
|
11
|
+
const transit_gateway_route_table_association_1 = require("./transit-gateway-route-table-association");
|
|
12
|
+
const transit_gateway_route_table_propagation_1 = require("./transit-gateway-route-table-propagation");
|
|
13
|
+
const util_1 = require("./util");
|
|
14
|
+
const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
|
|
15
|
+
/**
|
|
16
|
+
* A Transit Gateway.
|
|
17
|
+
* @internal
|
|
18
|
+
*/
|
|
19
|
+
class TransitGatewayBase extends cdk.Resource {
|
|
20
|
+
/**
|
|
21
|
+
* Adds a new route table to the Transit Gateway.
|
|
22
|
+
*
|
|
23
|
+
* @returns The created Transit Gateway route table.
|
|
24
|
+
*/
|
|
25
|
+
addRouteTable(id) {
|
|
26
|
+
return new transit_gateway_route_table_1.TransitGatewayRouteTable(this, id, {
|
|
27
|
+
transitGateway: this,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Attaches a VPC to the Transit Gateway.
|
|
32
|
+
*
|
|
33
|
+
* @returns The created Transit Gateway VPC attachment.
|
|
34
|
+
*/
|
|
35
|
+
attachVpc(id, options) {
|
|
36
|
+
const attachment = new transit_gateway_vpc_attachment_1.TransitGatewayVpcAttachment(this, id, {
|
|
37
|
+
transitGateway: this,
|
|
38
|
+
vpc: options.vpc,
|
|
39
|
+
subnets: options.subnets,
|
|
40
|
+
vpcAttachmentOptions: options.vpcAttachmentOptions ?? undefined,
|
|
41
|
+
});
|
|
42
|
+
// If `associationRouteTable` is provided, skip creating the Association only if `associationRouteTable` is the default route table and
|
|
43
|
+
// automatic association (`defaultRouteTableAssociation`) is enabled, as the TransitGatewayRouteTableAttachment's constructor will handle it in that case.
|
|
44
|
+
if (options.associationRouteTable && !(this.defaultRouteTable === options.associationRouteTable && this.defaultRouteTableAssociation)) {
|
|
45
|
+
new transit_gateway_route_table_association_1.TransitGatewayRouteTableAssociation(this, `${id}-Association-${this.node.addr}`, {
|
|
46
|
+
transitGatewayVpcAttachment: attachment,
|
|
47
|
+
transitGatewayRouteTable: options.associationRouteTable,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
if (options.propagationRouteTables) {
|
|
51
|
+
options.propagationRouteTables.forEach((propagationRouteTable, index) => {
|
|
52
|
+
// If `propagationRouteTable` is provided, skip creating the Propagation only if `propagationRouteTable` is the default route table and
|
|
53
|
+
// automatic propagation (`defaultRouteTablePropagation`) is enabled, as the TransitGatewayRouteTableAttachment's constructor will handle it in that case.
|
|
54
|
+
if (!(this.defaultRouteTable === propagationRouteTable && this.defaultRouteTablePropagation)) {
|
|
55
|
+
new transit_gateway_route_table_propagation_1.TransitGatewayRouteTablePropagation(this, `${id}-Propagation-${index}`, {
|
|
56
|
+
transitGatewayVpcAttachment: attachment,
|
|
57
|
+
transitGatewayRouteTable: propagationRouteTable,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return attachment;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Creates a Transit Gateway.
|
|
67
|
+
*
|
|
68
|
+
* @resource AWS::EC2::TransitGateway
|
|
69
|
+
*/
|
|
70
|
+
class TransitGateway extends TransitGatewayBase {
|
|
71
|
+
constructor(scope, id, props = {}) {
|
|
72
|
+
super(scope, id);
|
|
73
|
+
try {
|
|
74
|
+
jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_TransitGatewayProps(props);
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
78
|
+
Error.captureStackTrace(error, TransitGateway);
|
|
79
|
+
}
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
// Enhanced CDK Analytics Telemetry
|
|
83
|
+
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
84
|
+
const resource = new aws_ec2_1.CfnTransitGateway(this, id, {
|
|
85
|
+
amazonSideAsn: props.amazonSideAsn ?? undefined,
|
|
86
|
+
autoAcceptSharedAttachments: (0, util_1.getFeatureStatus)(props.autoAcceptSharedAttachments),
|
|
87
|
+
// Default Association/Propagation will always be false when creating the L1 to prevent EC2 from creating the default route table.
|
|
88
|
+
// Instead, CDK will create a custom default route table and use the properties to mimic the automatic assocation/propagation behaviour.
|
|
89
|
+
defaultRouteTableAssociation: util_1.TransitGatewayFeatureStatus.DISABLE,
|
|
90
|
+
defaultRouteTablePropagation: util_1.TransitGatewayFeatureStatus.DISABLE,
|
|
91
|
+
transitGatewayCidrBlocks: props.transitGatewayCidrBlocks,
|
|
92
|
+
description: props.description,
|
|
93
|
+
dnsSupport: (0, util_1.getFeatureStatus)(props.dnsSupport),
|
|
94
|
+
securityGroupReferencingSupport: (0, util_1.getFeatureStatus)(props.securityGroupReferencingSupport),
|
|
95
|
+
});
|
|
96
|
+
this.node.defaultChild = resource;
|
|
97
|
+
this.transitGatewayId = resource.attrId;
|
|
98
|
+
this.routerTargetId = resource.attrId;
|
|
99
|
+
this.routerType = aws_ec2_1.RouterType.TRANSIT_GATEWAY;
|
|
100
|
+
this.transitGatewayArn = resource.attrTransitGatewayArn;
|
|
101
|
+
this.dnsSupport = props.dnsSupport ?? true;
|
|
102
|
+
this.securityGroupReferencingSupport = props.securityGroupReferencingSupport ?? false;
|
|
103
|
+
this.defaultRouteTable = new transit_gateway_route_table_1.TransitGatewayRouteTable(this, 'DefaultRouteTable', {
|
|
104
|
+
transitGateway: this,
|
|
105
|
+
});
|
|
106
|
+
this.defaultRouteTableAssociation = props.defaultRouteTableAssociation ?? true;
|
|
107
|
+
this.defaultRouteTablePropagation = props.defaultRouteTablePropagation ?? true;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
exports.TransitGateway = TransitGateway;
|
|
111
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
112
|
+
TransitGateway[_a] = { fqn: "@aws-cdk/aws-ec2-alpha.TransitGateway", version: "2.178.0-alpha.0" };
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNpdC1nYXRld2F5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidHJhbnNpdC1nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGlEQUFvRTtBQUNwRSx3Q0FBd0M7QUFFeEMsK0VBQW9HO0FBQ3BHLHFGQUErSDtBQUUvSCx1R0FBZ0c7QUFDaEcsdUdBQWdHO0FBQ2hHLGlDQUF1RTtBQUN2RSw4RUFBOEU7QUFxSTlFOzs7R0FHRztBQUNILE1BQWUsa0JBQW1CLFNBQVEsR0FBRyxDQUFDLFFBQVE7SUFXcEQ7Ozs7T0FJRztJQUNJLGFBQWEsQ0FBQyxFQUFVO1FBQzdCLE9BQU8sSUFBSSxzREFBd0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFO1lBQzVDLGNBQWMsRUFBRSxJQUFJO1NBQ3JCLENBQUMsQ0FBQztLQUNKO0lBRUQ7Ozs7T0FJRztJQUNJLFNBQVMsQ0FBQyxFQUFVLEVBQUUsT0FBeUI7UUFDcEQsTUFBTSxVQUFVLEdBQUcsSUFBSSw0REFBMkIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFO1lBQzNELGNBQWMsRUFBRSxJQUFJO1lBQ3BCLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRztZQUNoQixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87WUFDeEIsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLG9CQUFvQixJQUFJLFNBQVM7U0FDaEUsQ0FBQyxDQUFDO1FBRUgsdUlBQXVJO1FBQ3ZJLDBKQUEwSjtRQUMxSixJQUFJLE9BQU8sQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixLQUFLLE9BQU8sQ0FBQyxxQkFBcUIsSUFBSSxJQUFJLENBQUMsNEJBQTRCLENBQUMsRUFBRSxDQUFDO1lBQ3RJLElBQUksNkVBQW1DLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDbkYsMkJBQTJCLEVBQUUsVUFBVTtnQkFDdkMsd0JBQXdCLEVBQUUsT0FBTyxDQUFDLHFCQUFxQjthQUN4RCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNuQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUMscUJBQXFCLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ3RFLHVJQUF1STtnQkFDdkksMEpBQTBKO2dCQUMxSixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEtBQUsscUJBQXFCLElBQUksSUFBSSxDQUFDLDRCQUE0QixDQUFDLEVBQUUsQ0FBQztvQkFDN0YsSUFBSSw2RUFBbUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixLQUFLLEVBQUUsRUFBRTt3QkFDMUUsMkJBQTJCLEVBQUUsVUFBVTt3QkFDdkMsd0JBQXdCLEVBQUUscUJBQXFCO3FCQUNoRCxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDO0tBQ25CO0NBQ0Y7QUFFRDs7OztHQUlHO0FBQ0gsTUFBYSxjQUFlLFNBQVEsa0JBQWtCO0lBV3BELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsUUFBNkIsRUFBRTtRQUN2RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDOzs7Ozs7K0NBWlIsY0FBYzs7OztRQWF2QixtQ0FBbUM7UUFDbkMsSUFBQSx3Q0FBb0IsRUFBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFbEMsTUFBTSxRQUFRLEdBQUcsSUFBSSwyQkFBaUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFO1lBQy9DLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYSxJQUFJLFNBQVM7WUFDL0MsMkJBQTJCLEVBQUUsSUFBQSx1QkFBZ0IsRUFBQyxLQUFLLENBQUMsMkJBQTJCLENBQUM7WUFDaEYsa0lBQWtJO1lBQ2xJLHdJQUF3STtZQUN4SSw0QkFBNEIsRUFBRSxrQ0FBMkIsQ0FBQyxPQUFPO1lBQ2pFLDRCQUE0QixFQUFFLGtDQUEyQixDQUFDLE9BQU87WUFDakUsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLHdCQUF3QjtZQUN4RCxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDOUIsVUFBVSxFQUFFLElBQUEsdUJBQWdCLEVBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUM5QywrQkFBK0IsRUFBRSxJQUFBLHVCQUFnQixFQUFDLEtBQUssQ0FBQywrQkFBK0IsQ0FBQztTQUN6RixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUM7UUFDbEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDeEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxVQUFVLEdBQUcsb0JBQVUsQ0FBQyxlQUFlLENBQUM7UUFDN0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQztRQUN4RCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDO1FBQzNDLElBQUksQ0FBQywrQkFBK0IsR0FBRyxLQUFLLENBQUMsK0JBQStCLElBQUksS0FBSyxDQUFDO1FBRXRGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLHNEQUF3QixDQUFDLElBQUksRUFBRSxtQkFBbUIsRUFBRTtZQUMvRSxjQUFjLEVBQUUsSUFBSTtTQUNyQixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsNEJBQTRCLEdBQUcsS0FBSyxDQUFDLDRCQUE0QixJQUFJLElBQUksQ0FBQztRQUMvRSxJQUFJLENBQUMsNEJBQTRCLEdBQUcsS0FBSyxDQUFDLDRCQUE0QixJQUFJLElBQUksQ0FBQztLQUNoRjs7QUEzQ0gsd0NBNENDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuVHJhbnNpdEdhdGV3YXksIFJvdXRlclR5cGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgSVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZSwgVHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlIH0gZnJvbSAnLi90cmFuc2l0LWdhdGV3YXktcm91dGUtdGFibGUnO1xuaW1wb3J0IHsgVHJhbnNpdEdhdGV3YXlWcGNBdHRhY2htZW50LCBBdHRhY2hWcGNPcHRpb25zLCBJVHJhbnNpdEdhdGV3YXlWcGNBdHRhY2htZW50IH0gZnJvbSAnLi90cmFuc2l0LWdhdGV3YXktdnBjLWF0dGFjaG1lbnQnO1xuaW1wb3J0IHsgSVJvdXRlVGFyZ2V0IH0gZnJvbSAnLi9yb3V0ZSc7XG5pbXBvcnQgeyBUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGVBc3NvY2lhdGlvbiB9IGZyb20gJy4vdHJhbnNpdC1nYXRld2F5LXJvdXRlLXRhYmxlLWFzc29jaWF0aW9uJztcbmltcG9ydCB7IFRyYW5zaXRHYXRld2F5Um91dGVUYWJsZVByb3BhZ2F0aW9uIH0gZnJvbSAnLi90cmFuc2l0LWdhdGV3YXktcm91dGUtdGFibGUtcHJvcGFnYXRpb24nO1xuaW1wb3J0IHsgZ2V0RmVhdHVyZVN0YXR1cywgVHJhbnNpdEdhdGV3YXlGZWF0dXJlU3RhdHVzIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBUcmFuc2l0IEdhdGV3YXkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVRyYW5zaXRHYXRld2F5IGV4dGVuZHMgY2RrLklSZXNvdXJjZSwgSVJvdXRlVGFyZ2V0IHtcbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgVHJhbnNpdCBHYXRld2F5LlxuICAgKlxuICAgKiBUaGlzIElEIGlzIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgYnkgQVdTIHVwb24gY3JlYXRpb24gb2YgdGhlIFRyYW5zaXQgR2F0ZXdheVxuICAgKiBhbmQgaXMgdXNlZCB0byByZWZlcmVuY2UgaXQgaW4gdmFyaW91cyBjb25maWd1cmF0aW9ucyBhbmQgb3BlcmF0aW9ucy5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNpdEdhdGV3YXlJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIFRyYW5zaXQgR2F0ZXdheS5cbiAgICpcbiAgICogVGhlIEFSTiB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBUcmFuc2l0IEdhdGV3YXkgYWNyb3NzIEFXUyBhbmQgaXMgY29tbW9ubHlcbiAgICogdXNlZCBmb3IgcGVybWlzc2lvbnMgYW5kIHJlc291cmNlIHRyYWNraW5nLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSB0cmFuc2l0R2F0ZXdheUFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCByb3V0ZSB0YWJsZSBhc3NvY2lhdGVkIHdpdGggdGhlIFRyYW5zaXQgR2F0ZXdheS5cbiAgICpcbiAgICogVGhpcyByb3V0ZSB0YWJsZSBpcyBjcmVhdGVkIGJ5IHRoZSBDREsgYW5kIGlzIHVzZWQgdG8gbWFuYWdlIHRoZSByb3V0ZXNcbiAgICogZm9yIGF0dGFjaG1lbnRzIHRoYXQgZG8gbm90IGhhdmUgYW4gZXhwbGljaXRseSBkZWZpbmVkIHJvdXRlIHRhYmxlIGFzc29jaWF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdFJvdXRlVGFibGU6IElUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGU7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIG5ldyBhdHRhY2htZW50cyBhcmUgYXV0b21hdGljYWxseSBhc3NvY2lhdGVkIHdpdGggdGhlIGRlZmF1bHQgcm91dGUgdGFibGUuXG4gICAqXG4gICAqIElmIHNldCB0byBgdHJ1ZWAsIGFueSBWUEMgb3IgVlBOIGF0dGFjaG1lbnQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFzc29jaWF0ZWQgd2l0aFxuICAgKiB0aGUgZGVmYXVsdCByb3V0ZSB0YWJsZSB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC5cbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRSb3V0ZVRhYmxlQXNzb2NpYXRpb246IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHJvdXRlIHByb3BhZ2F0aW9uIHRvIHRoZSBkZWZhdWx0IHJvdXRlIHRhYmxlIGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIFdoZW4gc2V0IHRvIGB0cnVlYCwgcm91dGVzIGZyb20gYXR0YWNobWVudHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHByb3BhZ2F0ZWRcbiAgICogdG8gdGhlIGRlZmF1bHQgcm91dGUgdGFibGUgdW5sZXNzIHByb3BhZ2F0aW9uIGlzIGV4cGxpY2l0bHkgZGlzYWJsZWQuXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0Um91dGVUYWJsZVByb3BhZ2F0aW9uOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCBETlMgc3VwcG9ydCBpcyBlbmFibGVkIG9uIHRoZSBUcmFuc2l0IEdhdGV3YXkuXG4gICAqL1xuICByZWFkb25seSBkbnNTdXBwb3J0OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCBzZWN1cml0eSBncm91cCByZWZlcmVuY2luZyBzdXBwb3J0IGlzIGVuYWJsZWQgb24gdGhlIFRyYW5zaXQgR2F0ZXdheS5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXBSZWZlcmVuY2luZ1N1cHBvcnQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29tbW9uIHByb3BlcnRpZXMgZm9yIGNyZWF0aW5nIGEgVHJhbnNpdCBHYXRld2F5IHJlc291cmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zaXRHYXRld2F5UHJvcHMge1xuICAvKipcbiAgICogUGh5c2ljYWwgbmFtZSBvZiB0aGlzIFRyYW5zaXQgR2F0ZXdheS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBBc3NpZ25lZCBieSBDbG91ZEZvcm1hdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHRyYW5zaXRHYXRld2F5TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogQSBwcml2YXRlIEF1dG9ub21vdXMgU3lzdGVtIE51bWJlciAoQVNOKSBmb3IgdGhlIEFtYXpvbiBzaWRlIG9mIGEgQkdQIHNlc3Npb24uIFRoZSByYW5nZSBpcyA2NDUxMiB0byA2NTUzNCBmb3IgMTYtYml0IEFTTnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdW5kZWZpbmVkLCA2NDUxMiBpcyBhc3NpZ25lZCBieSBDbG91ZEZvcm1hdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFtYXpvblNpZGVBc24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBvciBkaXNhYmxlIGF1dG9tYXRpYyBhY2NlcHRhbmNlIG9mIGNyb3NzLWFjY291bnQgYXR0YWNobWVudCByZXF1ZXN0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkaXNhYmxlIChmYWxzZSlcbiAgICovXG4gIHJlYWRvbmx5IGF1dG9BY2NlcHRTaGFyZWRBdHRhY2htZW50cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBvciBkaXNhYmxlIGF1dG9tYXRpYyBhc3NvY2lhdGlvbiB3aXRoIHRoZSBkZWZhdWx0IGFzc29jaWF0aW9uIHJvdXRlIHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGVuYWJsZSAodHJ1ZSlcbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRSb3V0ZVRhYmxlQXNzb2NpYXRpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgb3IgZGlzYWJsZSBhdXRvbWF0aWMgcHJvcGFnYXRpb24gb2Ygcm91dGVzIHRvIHRoZSBkZWZhdWx0IHByb3BhZ2F0aW9uIHJvdXRlIHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGVuYWJsZSAodHJ1ZSlcbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRSb3V0ZVRhYmxlUHJvcGFnYXRpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zaXQgZ2F0ZXdheS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBkZXNjcmlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBvciBkaXNhYmxlIEROUyBzdXBwb3J0LlxuICAgKlxuICAgKiBJZiBkbnNTdXBwb3J0IGlzIGVuYWJsZWQgb24gYSBWUEMgQXR0YWNobWVudCwgdGhpcyBhbHNvIG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIHRoZSBmZWF0dXJlIHRvIHdvcmsuXG4gICAqIE90aGVyd2lzZSB0aGUgcmVzb3VyY2VzIHdpbGwgc3RpbGwgZGVwbG95IGJ1dCB0aGUgZmVhdHVyZSB3aWxsIG5vdCB3b3JrLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGVuYWJsZSAodHJ1ZSlcbiAgICovXG4gIHJlYWRvbmx5IGRuc1N1cHBvcnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgb3IgZGlzYWJsZSBzZWN1cml0eSBncm91cCByZWZlcmVuY2luZyBzdXBwb3J0XG4gICAqXG4gICAqIElmIHNlY3VyaXR5R3JvdXBSZWZlcmVuY2luZ1N1cHBvcnQgaXMgZW5hYmxlZCBvbiBhIFZQQyBBdHRhY2htZW50LCB0aGlzIGFsc28gbmVlZHMgdG8gYmUgZW5hYmxlZCBmb3IgdGhlIGZlYXR1cmUgdG8gd29yay5cbiAgICogT3RoZXJ3aXNlIHRoZSByZXNvdXJjZXMgd2lsbCBzdGlsbCBkZXBsb3kgYnV0IHRoZSBmZWF0dXJlIHdpbGwgbm90IHdvcmsuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGlzYWJsZSAoZmFsc2UpXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3VwUmVmZXJlbmNpbmdTdXBwb3J0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHRyYW5zaXQgZ2F0ZXdheSBDSURSIGJsb2Nrcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICByZWFkb25seSB0cmFuc2l0R2F0ZXdheUNpZHJCbG9ja3M/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIFRyYW5zaXQgR2F0ZXdheS5cbiAqIEBpbnRlcm5hbFxuICovXG5hYnN0cmFjdCBjbGFzcyBUcmFuc2l0R2F0ZXdheUJhc2UgZXh0ZW5kcyBjZGsuUmVzb3VyY2UgaW1wbGVtZW50cyBJVHJhbnNpdEdhdGV3YXksIElSb3V0ZVRhcmdldCB7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSByb3V0ZXJUeXBlOiBSb3V0ZXJUeXBlO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgcm91dGVyVGFyZ2V0SWQ6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHRyYW5zaXRHYXRld2F5SWQ6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHRyYW5zaXRHYXRld2F5QXJuOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBkZWZhdWx0Um91dGVUYWJsZTogSVRyYW5zaXRHYXRld2F5Um91dGVUYWJsZTtcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGRlZmF1bHRSb3V0ZVRhYmxlQXNzb2NpYXRpb246IGJvb2xlYW47XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBkZWZhdWx0Um91dGVUYWJsZVByb3BhZ2F0aW9uOiBib29sZWFuO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgZG5zU3VwcG9ydDogYm9vbGVhbjtcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHNlY3VyaXR5R3JvdXBSZWZlcmVuY2luZ1N1cHBvcnQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBuZXcgcm91dGUgdGFibGUgdG8gdGhlIFRyYW5zaXQgR2F0ZXdheS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgVHJhbnNpdCBHYXRld2F5IHJvdXRlIHRhYmxlLlxuICAgKi9cbiAgcHVibGljIGFkZFJvdXRlVGFibGUoaWQ6IHN0cmluZyk6IElUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGUge1xuICAgIHJldHVybiBuZXcgVHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlKHRoaXMsIGlkLCB7XG4gICAgICB0cmFuc2l0R2F0ZXdheTogdGhpcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2hlcyBhIFZQQyB0byB0aGUgVHJhbnNpdCBHYXRld2F5LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBUcmFuc2l0IEdhdGV3YXkgVlBDIGF0dGFjaG1lbnQuXG4gICAqL1xuICBwdWJsaWMgYXR0YWNoVnBjKGlkOiBzdHJpbmcsIG9wdGlvbnM6IEF0dGFjaFZwY09wdGlvbnMpOiBJVHJhbnNpdEdhdGV3YXlWcGNBdHRhY2htZW50IHtcbiAgICBjb25zdCBhdHRhY2htZW50ID0gbmV3IFRyYW5zaXRHYXRld2F5VnBjQXR0YWNobWVudCh0aGlzLCBpZCwge1xuICAgICAgdHJhbnNpdEdhdGV3YXk6IHRoaXMsXG4gICAgICB2cGM6IG9wdGlvbnMudnBjLFxuICAgICAgc3VibmV0czogb3B0aW9ucy5zdWJuZXRzLFxuICAgICAgdnBjQXR0YWNobWVudE9wdGlvbnM6IG9wdGlvbnMudnBjQXR0YWNobWVudE9wdGlvbnMgPz8gdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgLy8gSWYgYGFzc29jaWF0aW9uUm91dGVUYWJsZWAgaXMgcHJvdmlkZWQsIHNraXAgY3JlYXRpbmcgdGhlIEFzc29jaWF0aW9uIG9ubHkgaWYgYGFzc29jaWF0aW9uUm91dGVUYWJsZWAgaXMgdGhlIGRlZmF1bHQgcm91dGUgdGFibGUgYW5kXG4gICAgLy8gYXV0b21hdGljIGFzc29jaWF0aW9uIChgZGVmYXVsdFJvdXRlVGFibGVBc3NvY2lhdGlvbmApIGlzIGVuYWJsZWQsIGFzIHRoZSBUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGVBdHRhY2htZW50J3MgY29uc3RydWN0b3Igd2lsbCBoYW5kbGUgaXQgaW4gdGhhdCBjYXNlLlxuICAgIGlmIChvcHRpb25zLmFzc29jaWF0aW9uUm91dGVUYWJsZSAmJiAhKHRoaXMuZGVmYXVsdFJvdXRlVGFibGUgPT09IG9wdGlvbnMuYXNzb2NpYXRpb25Sb3V0ZVRhYmxlICYmIHRoaXMuZGVmYXVsdFJvdXRlVGFibGVBc3NvY2lhdGlvbikpIHtcbiAgICAgIG5ldyBUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGVBc3NvY2lhdGlvbih0aGlzLCBgJHtpZH0tQXNzb2NpYXRpb24tJHt0aGlzLm5vZGUuYWRkcn1gLCB7XG4gICAgICAgIHRyYW5zaXRHYXRld2F5VnBjQXR0YWNobWVudDogYXR0YWNobWVudCxcbiAgICAgICAgdHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlOiBvcHRpb25zLmFzc29jaWF0aW9uUm91dGVUYWJsZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnByb3BhZ2F0aW9uUm91dGVUYWJsZXMpIHtcbiAgICAgIG9wdGlvbnMucHJvcGFnYXRpb25Sb3V0ZVRhYmxlcy5mb3JFYWNoKChwcm9wYWdhdGlvblJvdXRlVGFibGUsIGluZGV4KSA9PiB7XG4gICAgICAgIC8vIElmIGBwcm9wYWdhdGlvblJvdXRlVGFibGVgIGlzIHByb3ZpZGVkLCBza2lwIGNyZWF0aW5nIHRoZSBQcm9wYWdhdGlvbiBvbmx5IGlmIGBwcm9wYWdhdGlvblJvdXRlVGFibGVgIGlzIHRoZSBkZWZhdWx0IHJvdXRlIHRhYmxlIGFuZFxuICAgICAgICAvLyBhdXRvbWF0aWMgcHJvcGFnYXRpb24gKGBkZWZhdWx0Um91dGVUYWJsZVByb3BhZ2F0aW9uYCkgaXMgZW5hYmxlZCwgYXMgdGhlIFRyYW5zaXRHYXRld2F5Um91dGVUYWJsZUF0dGFjaG1lbnQncyBjb25zdHJ1Y3RvciB3aWxsIGhhbmRsZSBpdCBpbiB0aGF0IGNhc2UuXG4gICAgICAgIGlmICghKHRoaXMuZGVmYXVsdFJvdXRlVGFibGUgPT09IHByb3BhZ2F0aW9uUm91dGVUYWJsZSAmJiB0aGlzLmRlZmF1bHRSb3V0ZVRhYmxlUHJvcGFnYXRpb24pKSB7XG4gICAgICAgICAgbmV3IFRyYW5zaXRHYXRld2F5Um91dGVUYWJsZVByb3BhZ2F0aW9uKHRoaXMsIGAke2lkfS1Qcm9wYWdhdGlvbi0ke2luZGV4fWAsIHtcbiAgICAgICAgICAgIHRyYW5zaXRHYXRld2F5VnBjQXR0YWNobWVudDogYXR0YWNobWVudCxcbiAgICAgICAgICAgIHRyYW5zaXRHYXRld2F5Um91dGVUYWJsZTogcHJvcGFnYXRpb25Sb3V0ZVRhYmxlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0YWNobWVudDtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBUcmFuc2l0IEdhdGV3YXkuXG4gKlxuICogQHJlc291cmNlIEFXUzo6RUMyOjpUcmFuc2l0R2F0ZXdheVxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNpdEdhdGV3YXkgZXh0ZW5kcyBUcmFuc2l0R2F0ZXdheUJhc2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgcm91dGVyVHlwZTogUm91dGVyVHlwZTtcbiAgcHVibGljIHJlYWRvbmx5IHJvdXRlclRhcmdldElkOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB0cmFuc2l0R2F0ZXdheUlkOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB0cmFuc2l0R2F0ZXdheUFybjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgZGVmYXVsdFJvdXRlVGFibGU6IElUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGU7XG4gIHB1YmxpYyByZWFkb25seSBkZWZhdWx0Um91dGVUYWJsZUFzc29jaWF0aW9uOiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgZGVmYXVsdFJvdXRlVGFibGVQcm9wYWdhdGlvbjogYm9vbGVhbjtcbiAgcHVibGljIHJlYWRvbmx5IGRuc1N1cHBvcnQ6IGJvb2xlYW47XG4gIHB1YmxpYyByZWFkb25seSBzZWN1cml0eUdyb3VwUmVmZXJlbmNpbmdTdXBwb3J0OiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBUcmFuc2l0R2F0ZXdheVByb3BzID0ge30pIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgY29uc3QgcmVzb3VyY2UgPSBuZXcgQ2ZuVHJhbnNpdEdhdGV3YXkodGhpcywgaWQsIHtcbiAgICAgIGFtYXpvblNpZGVBc246IHByb3BzLmFtYXpvblNpZGVBc24gPz8gdW5kZWZpbmVkLFxuICAgICAgYXV0b0FjY2VwdFNoYXJlZEF0dGFjaG1lbnRzOiBnZXRGZWF0dXJlU3RhdHVzKHByb3BzLmF1dG9BY2NlcHRTaGFyZWRBdHRhY2htZW50cyksXG4gICAgICAvLyBEZWZhdWx0IEFzc29jaWF0aW9uL1Byb3BhZ2F0aW9uIHdpbGwgYWx3YXlzIGJlIGZhbHNlIHdoZW4gY3JlYXRpbmcgdGhlIEwxIHRvIHByZXZlbnQgRUMyIGZyb20gY3JlYXRpbmcgdGhlIGRlZmF1bHQgcm91dGUgdGFibGUuXG4gICAgICAvLyBJbnN0ZWFkLCBDREsgd2lsbCBjcmVhdGUgYSBjdXN0b20gZGVmYXVsdCByb3V0ZSB0YWJsZSBhbmQgdXNlIHRoZSBwcm9wZXJ0aWVzIHRvIG1pbWljIHRoZSBhdXRvbWF0aWMgYXNzb2NhdGlvbi9wcm9wYWdhdGlvbiBiZWhhdmlvdXIuXG4gICAgICBkZWZhdWx0Um91dGVUYWJsZUFzc29jaWF0aW9uOiBUcmFuc2l0R2F0ZXdheUZlYXR1cmVTdGF0dXMuRElTQUJMRSxcbiAgICAgIGRlZmF1bHRSb3V0ZVRhYmxlUHJvcGFnYXRpb246IFRyYW5zaXRHYXRld2F5RmVhdHVyZVN0YXR1cy5ESVNBQkxFLFxuICAgICAgdHJhbnNpdEdhdGV3YXlDaWRyQmxvY2tzOiBwcm9wcy50cmFuc2l0R2F0ZXdheUNpZHJCbG9ja3MsXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICBkbnNTdXBwb3J0OiBnZXRGZWF0dXJlU3RhdHVzKHByb3BzLmRuc1N1cHBvcnQpLFxuICAgICAgc2VjdXJpdHlHcm91cFJlZmVyZW5jaW5nU3VwcG9ydDogZ2V0RmVhdHVyZVN0YXR1cyhwcm9wcy5zZWN1cml0eUdyb3VwUmVmZXJlbmNpbmdTdXBwb3J0KSxcbiAgICB9KTtcblxuICAgIHRoaXMubm9kZS5kZWZhdWx0Q2hpbGQgPSByZXNvdXJjZTtcbiAgICB0aGlzLnRyYW5zaXRHYXRld2F5SWQgPSByZXNvdXJjZS5hdHRySWQ7XG4gICAgdGhpcy5yb3V0ZXJUYXJnZXRJZCA9IHJlc291cmNlLmF0dHJJZDtcbiAgICB0aGlzLnJvdXRlclR5cGUgPSBSb3V0ZXJUeXBlLlRSQU5TSVRfR0FURVdBWTtcbiAgICB0aGlzLnRyYW5zaXRHYXRld2F5QXJuID0gcmVzb3VyY2UuYXR0clRyYW5zaXRHYXRld2F5QXJuO1xuICAgIHRoaXMuZG5zU3VwcG9ydCA9IHByb3BzLmRuc1N1cHBvcnQgPz8gdHJ1ZTtcbiAgICB0aGlzLnNlY3VyaXR5R3JvdXBSZWZlcmVuY2luZ1N1cHBvcnQgPSBwcm9wcy5zZWN1cml0eUdyb3VwUmVmZXJlbmNpbmdTdXBwb3J0ID8/IGZhbHNlO1xuXG4gICAgdGhpcy5kZWZhdWx0Um91dGVUYWJsZSA9IG5ldyBUcmFuc2l0R2F0ZXdheVJvdXRlVGFibGUodGhpcywgJ0RlZmF1bHRSb3V0ZVRhYmxlJywge1xuICAgICAgdHJhbnNpdEdhdGV3YXk6IHRoaXMsXG4gICAgfSk7XG5cbiAgICB0aGlzLmRlZmF1bHRSb3V0ZVRhYmxlQXNzb2NpYXRpb24gPSBwcm9wcy5kZWZhdWx0Um91dGVUYWJsZUFzc29jaWF0aW9uID8/IHRydWU7XG4gICAgdGhpcy5kZWZhdWx0Um91dGVUYWJsZVByb3BhZ2F0aW9uID0gcHJvcHMuZGVmYXVsdFJvdXRlVGFibGVQcm9wYWdhdGlvbiA/PyB0cnVlO1xuICB9XG59XG4iXX0=
|
package/lib/util.d.ts
CHANGED
|
@@ -9,6 +9,20 @@ export declare function subnetGroupNameFromConstructId(subnet: ISubnet): string;
|
|
|
9
9
|
* Make the subnet construct ID from a name and number
|
|
10
10
|
*/
|
|
11
11
|
export declare function subnetId(name: string, i: number): string;
|
|
12
|
+
/**
|
|
13
|
+
* The status of a Transit Gateway feature.
|
|
14
|
+
*/
|
|
15
|
+
export declare enum TransitGatewayFeatureStatus {
|
|
16
|
+
/**
|
|
17
|
+
* The feature is enabled.
|
|
18
|
+
*/
|
|
19
|
+
ENABLE = "enable",
|
|
20
|
+
/**
|
|
21
|
+
* The feature is disabled.
|
|
22
|
+
*/
|
|
23
|
+
DISABLE = "disable"
|
|
24
|
+
}
|
|
25
|
+
export declare function getFeatureStatus(status?: boolean): TransitGatewayFeatureStatus | undefined;
|
|
12
26
|
/**
|
|
13
27
|
* Return the union of table IDs from all selected subnets
|
|
14
28
|
*/
|
|
@@ -132,7 +146,8 @@ export declare class CidrBlockIpv6 {
|
|
|
132
146
|
*/
|
|
133
147
|
minIp(): string;
|
|
134
148
|
/**
|
|
135
|
-
*
|
|
149
|
+
* Calculates the maximum IPv6 address in the CIDR block
|
|
150
|
+
* @returns The maximum IPv6 address as a string
|
|
136
151
|
*/
|
|
137
152
|
maxIp(): string;
|
|
138
153
|
private formatIPv6Part;
|
|
@@ -144,13 +159,6 @@ export declare class CidrBlockIpv6 {
|
|
|
144
159
|
*/
|
|
145
160
|
rangesOverlap(range1: string, range2: string): boolean;
|
|
146
161
|
/**
|
|
147
|
-
*
|
|
148
|
-
* @param cidr
|
|
149
|
-
* @returns Range in the from of big int number [start, end]
|
|
150
|
-
*/
|
|
151
|
-
private getIPv6Range;
|
|
152
|
-
/**
|
|
153
|
-
* @param ipv6Address
|
|
154
162
|
* @returns Converts given ipv6 address range to big int number
|
|
155
163
|
*/
|
|
156
164
|
private ipv6ToNumber;
|
package/lib/util.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
/*eslint no-bitwise: ["error", { "allow": ["~", "|", "<<", "&"] }] */
|
|
2
|
+
/* eslint no-bitwise: ["error", { "allow": ["~", "|", "<<", "&"] }] */
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.CidrBlockIpv6 = exports.CidrBlock = exports.NetworkUtils = void 0;
|
|
4
|
+
exports.CidrBlockIpv6 = exports.CidrBlock = exports.NetworkUtils = exports.TransitGatewayFeatureStatus = void 0;
|
|
5
5
|
exports.subnetGroupNameFromConstructId = subnetGroupNameFromConstructId;
|
|
6
6
|
exports.subnetId = subnetId;
|
|
7
|
+
exports.getFeatureStatus = getFeatureStatus;
|
|
7
8
|
exports.allRouteTableIds = allRouteTableIds;
|
|
8
9
|
exports.flatten = flatten;
|
|
9
10
|
/**
|
|
@@ -20,6 +21,28 @@ function subnetGroupNameFromConstructId(subnet) {
|
|
|
20
21
|
function subnetId(name, i) {
|
|
21
22
|
return `${name}Subnet${i + 1}`;
|
|
22
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* The status of a Transit Gateway feature.
|
|
26
|
+
*/
|
|
27
|
+
var TransitGatewayFeatureStatus;
|
|
28
|
+
(function (TransitGatewayFeatureStatus) {
|
|
29
|
+
/**
|
|
30
|
+
* The feature is enabled.
|
|
31
|
+
*/
|
|
32
|
+
TransitGatewayFeatureStatus["ENABLE"] = "enable";
|
|
33
|
+
/**
|
|
34
|
+
* The feature is disabled.
|
|
35
|
+
*/
|
|
36
|
+
TransitGatewayFeatureStatus["DISABLE"] = "disable";
|
|
37
|
+
})(TransitGatewayFeatureStatus || (exports.TransitGatewayFeatureStatus = TransitGatewayFeatureStatus = {}));
|
|
38
|
+
function getFeatureStatus(status) {
|
|
39
|
+
if (status === undefined) {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
return status ? TransitGatewayFeatureStatus.ENABLE : TransitGatewayFeatureStatus.DISABLE;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
23
46
|
/**
|
|
24
47
|
* Return the union of table IDs from all selected subnets
|
|
25
48
|
*/
|
|
@@ -259,12 +282,51 @@ class CidrBlockIpv6 {
|
|
|
259
282
|
return startIP.map(this.formatIPv6Part).join(':');
|
|
260
283
|
}
|
|
261
284
|
/**
|
|
262
|
-
*
|
|
285
|
+
* Calculates the maximum IPv6 address in the CIDR block
|
|
286
|
+
* @returns The maximum IPv6 address as a string
|
|
263
287
|
*/
|
|
264
288
|
maxIp() {
|
|
289
|
+
/**
|
|
290
|
+
* Calculate how many 16-bit blocks are needed for the network portion
|
|
291
|
+
* e.g. for /56, networkPartLength = ceil(56/16) = 4 blocks
|
|
292
|
+
*/
|
|
293
|
+
const networkPartLength = Math.ceil(this.cidrPrefix / 16);
|
|
294
|
+
/**
|
|
295
|
+
* Calculate remaining bits in last network block
|
|
296
|
+
* e.g. for /56, remainingBits = 56 % 16 = 8 bits
|
|
297
|
+
*/
|
|
298
|
+
const remainingBits = this.cidrPrefix % 16;
|
|
299
|
+
/**
|
|
300
|
+
* Create copy of network portion of address
|
|
301
|
+
* e.g. [2001, db8, 0, 0] for 2001:db8::/56
|
|
302
|
+
*/
|
|
265
303
|
const endIP = [...this.networkPart];
|
|
266
|
-
|
|
267
|
-
|
|
304
|
+
/**
|
|
305
|
+
* If there are remaining bits in last network block,
|
|
306
|
+
* create appropriate bitmask and apply to last network block
|
|
307
|
+
* e.g. for /56: mask = (1 << (16-8)) - 1 = 0x00FF
|
|
308
|
+
*/
|
|
309
|
+
if (remainingBits > 0) {
|
|
310
|
+
const lastNetworkIndex = networkPartLength - 1;
|
|
311
|
+
const mask = (BigInt(1) << BigInt(16 - remainingBits)) - BigInt(1);
|
|
312
|
+
/**
|
|
313
|
+
* Apply bitmask to last network block using bitwise OR
|
|
314
|
+
* e.g. if lastNetworkIndex=3 and mask=0x00FF:
|
|
315
|
+
* networkPart[3]=0x0000 | 0x00FF = 0x00FF
|
|
316
|
+
*/
|
|
317
|
+
endIP[lastNetworkIndex] = this.networkPart[lastNetworkIndex] | mask;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Fill remaining blocks with maximum value 0xFFFF
|
|
321
|
+
* e.g. [2001, db8, 0, ff, ffff, ffff, ffff, ffff]
|
|
322
|
+
*/
|
|
323
|
+
for (let i = networkPartLength; i < 8; i++) {
|
|
324
|
+
endIP.push(BigInt('0xffff'));
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Convert blocks to hex strings and join with colons
|
|
328
|
+
* e.g. 2001:db8:0:ff:ffff:ffff:ffff:ffff
|
|
329
|
+
*/
|
|
268
330
|
return endIP.map(this.formatIPv6Part).join(':');
|
|
269
331
|
}
|
|
270
332
|
/**
|
|
@@ -274,26 +336,18 @@ class CidrBlockIpv6 {
|
|
|
274
336
|
* @returns true if two ranges overlap, false otherwise
|
|
275
337
|
*/
|
|
276
338
|
rangesOverlap(range1, range2) {
|
|
277
|
-
|
|
278
|
-
const
|
|
339
|
+
// Create new CidrBlockIpv6 instances for both ranges
|
|
340
|
+
const cidr1 = new CidrBlockIpv6(range1);
|
|
341
|
+
const cidr2 = new CidrBlockIpv6(range2);
|
|
342
|
+
// Convert min and max IPs to numeric values for comparison
|
|
343
|
+
const start1 = this.ipv6ToNumber(cidr1.minIp());
|
|
344
|
+
const end1 = this.ipv6ToNumber(cidr1.maxIp());
|
|
345
|
+
const start2 = this.ipv6ToNumber(cidr2.minIp());
|
|
346
|
+
const end2 = this.ipv6ToNumber(cidr2.maxIp());
|
|
347
|
+
// Check for overlap
|
|
279
348
|
return (start1 <= end2) && (start2 <= end1);
|
|
280
349
|
}
|
|
281
350
|
/**
|
|
282
|
-
*
|
|
283
|
-
* @param cidr
|
|
284
|
-
* @returns Range in the from of big int number [start, end]
|
|
285
|
-
*/
|
|
286
|
-
getIPv6Range(cidr) {
|
|
287
|
-
const [ipv6Address, prefixLength] = cidr.split('/');
|
|
288
|
-
const ipv6Number = this.ipv6ToNumber(ipv6Address);
|
|
289
|
-
const mask = (BigInt(1) << BigInt(128 - Number(prefixLength))) - BigInt(1);
|
|
290
|
-
const networkPrefix = ipv6Number & ~mask;
|
|
291
|
-
const start = networkPrefix;
|
|
292
|
-
const end = networkPrefix | mask;
|
|
293
|
-
return [start, end];
|
|
294
|
-
}
|
|
295
|
-
/**
|
|
296
|
-
* @param ipv6Address
|
|
297
351
|
* @returns Converts given ipv6 address range to big int number
|
|
298
352
|
*/
|
|
299
353
|
ipv6ToNumber(ipv6Address) {
|
|
@@ -307,4 +361,4 @@ class CidrBlockIpv6 {
|
|
|
307
361
|
}
|
|
308
362
|
}
|
|
309
363
|
exports.CidrBlockIpv6 = CidrBlockIpv6;
|
|
310
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHFFQUFxRTs7O0FBU3JFLHdFQUVDO0FBS0QsNEJBRUM7QUFLRCw0Q0FRQztBQUVELDBCQUVDO0FBL0JEOzs7O0dBSUc7QUFDSCxTQUFnQiw4QkFBOEIsQ0FBQyxNQUFlO0lBQzVELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixRQUFRLENBQUMsSUFBWSxFQUFFLENBQVM7SUFDOUMsT0FBTyxHQUFHLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFDakMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQUMsT0FBa0I7SUFDakQsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUM5QixLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzdCLElBQUksTUFBTSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hELEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxQyxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6QixDQUFDO0FBRUQsU0FBZ0IsT0FBTyxDQUFJLEVBQVM7SUFDbEMsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQWEsWUFBWTtJQUV2Qjs7Ozs7Ozs7O09BU0c7SUFDSSxNQUFNLENBQUMsT0FBTyxDQUFDLFNB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LEVBQUUsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0UsTUFBTSxhQUFhLEdBQUcsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQztRQUM1QixNQUFNLEdBQUcsR0FBRyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBRWpDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7S0FDckI7SUFFRDs7O09BR0c7SUFDSyxZQUFZLENBQUMsV0FBbUI7UUFDdEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2xELElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLCtCQUErQjtZQUMvQixVQUFVLEdBQUcsQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xELENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQztLQUNuQjtDQUNGO0FBN0ZELHNDQTZGQyIsInNvdXJjZXNDb250ZW50IjpbIi8qZXNsaW50IG5vLWJpdHdpc2U6IFtcImVycm9yXCIsIHsgXCJhbGxvd1wiOiBbXCJ+XCIsIFwifFwiLCBcIjw8XCIsIFwiJlwiXSB9XSAqL1xuXG5pbXBvcnQgeyBJU3VibmV0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5cbi8qKlxuICogUmV0dXJuIGEgc3VibmV0IG5hbWUgZnJvbSBpdHMgY29uc3RydWN0IElEXG4gKlxuICogQWxsIHN1Ym5ldCBuYW1lcyBsb29rIGxpa2UgTkFNRSA8PiBcIlN1Ym5ldFwiIDw+IElOREVYXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJuZXRHcm91cE5hbWVGcm9tQ29uc3RydWN0SWQoc3VibmV0OiBJU3VibmV0KSB7XG4gIHJldHVybiBzdWJuZXQubm9kZS5pZC5yZXBsYWNlKC9TdWJuZXRcXGQrJC8sICcnKTtcbn1cblxuLyoqXG4gKiBNYWtlIHRoZSBzdWJuZXQgY29uc3RydWN0IElEIGZyb20gYSBuYW1lIGFuZCBudW1iZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1Ym5ldElkKG5hbWU6IHN0cmluZywgaTogbnVtYmVyKSB7XG4gIHJldHVybiBgJHtuYW1lfVN1Ym5ldCR7aSArIDF9YDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIHVuaW9uIG9mIHRhYmxlIElEcyBmcm9tIGFsbCBzZWxlY3RlZCBzdWJuZXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbGxSb3V0ZVRhYmxlSWRzKHN1Ym5ldHM6IElTdWJuZXRbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcmV0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3Qgc3VibmV0IG9mIHN1Ym5ldHMpIHtcbiAgICBpZiAoc3VibmV0LnJvdXRlVGFibGUgJiYgc3VibmV0LnJvdXRlVGFibGUucm91dGVUYWJsZUlkKSB7XG4gICAgICByZXQuYWRkKHN1Ym5ldC5yb3V0ZVRhYmxlLnJvdXRlVGFibGVJZCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBBcnJheS5mcm9tKHJldCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuPEE+KHhzOiBBW11bXSk6IEFbXSB7XG4gIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCB4cyk7XG59XG5cbi8qKlxuICogTmV0d29ya1V0aWxzIGNvbnRhaW5zIGhlbHBlcnMgdG8gd29yayB3aXRoIG5ldHdvcmsgY29uc3RydWN0cyAoc3VibmV0cy9yYW5nZXMpXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXR3b3JrVXRpbHMge1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW4gSVB2NCBhZGRyZXNzIHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIGlwQWRkcmVzcyBUaGUgSVB2NCBhZGRyZXNzIHN0cmluZyB0byBiZSB2YWxpZGF0ZWQuXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHN0cmluZyBpcyBhIHZhbGlkIElQdjQgYWRkcmVzcywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBWYWxpZGF0ZXMgYW4gSVB2NCBzdHJpbmdcbiAgICpcbiAgICogcmV0dXJucyB0cnVlIG9mIHRoZSBzdHJpbmcgY29udGFpbnMgNCBudW1iZXJzIGJldHdlZW4gMC0yNTUgZGVsaW1pdGVkIGJ5XG4gICAqIGEgYC5gIGNoYXJhY3RlclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2YWxpZElwKGlwQWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgb2N0ZXRzID0gaXBBZGRyZXNzLnNwbGl0KCcuJyk7XG4gICAgaWYgKG9jdGV0cy5sZW5ndGggIT09IDQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG9jdGV0cy5tYXAoKG9jdGV0OiBzdHJpbmcpID0+IHBhcnNlSW50KG9jdGV0LCAxMCkpLlxuICAgICAgZXZlcnkoKG9jdGV0OiBudW1iZXIpID0+IG9jdGV0ID49IDAgJiYgb2N0ZXQgPD0gMjU1KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBJUHY0IGFkZHJlc3MgdG8gaXRzIGNvcnJlc3BvbmRpbmcgbnVtZXJpY2FsIHZhbHVlLlxuICAgKlxuICAgKiBVc2VzIHRoZSBmb3JtdWxhOlxuICAgKiAoZmlyc3Qgb2N0ZXQgKiAyNTbCsykgKyAoc2Vjb25kIG9jdGV0ICogMjU2wrIpICsgKHRoaXJkIG9jdGV0ICogMjU2KSArXG4gICAqIChmb3VydGggb2N0ZXQpXG4gICAqXG4gICAqIEBwYXJhbSAgaXBBZGRyZXNzIHRoZSBJUCBhZGRyZXNzIChlLmcuIDE3NC42Ni4xNzMuMTY4KVxuICAgKiBAcmV0dXJucyB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGUgSVAgYWRkcmVzcyAoZS5nIDI5MjM2MDU0MTYpXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlwVG9OdW0oaXBBZGRyZXNzOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy52YWxpZElwKGlwQWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtpcEFkZHJlc3N9IGlzIG5vdCB2YWxpZGApO1xuICAgIH1cblxuICAgIHJldHVybiBpcEFkZHJlc3NcbiAgICAgIC5zcGxpdCgnLicpXG4gICAgICAucmVkdWNlKFxuICAgICAgICAocDogbnVtYmVyLCBjOiBzdHJpbmcsIGk6IG51bWJlcikgPT4gcCArIHBhcnNlSW50KGMsIDEwKSAqIDI1NiAqKiAoMyAtIGkpLFxuICAgICAgICAwLFxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBudW1iZXIgYW5kIGNvbnZlcnRzIGl0IHRvIElQdjQgYWRkcmVzcyBzdHJpbmdcbiAgICpcbiAgICogVGFrZXMgYSBudW1iZXIgKGUuZyAyOTIzNjA1NDE2KSBhbmQgY29udmVydHMgaXQgdG8gYW4gSVB2NCBhZGRyZXNzIHN0cmluZ1xuICAgKiBjdXJyZW50bHkgb25seSBzdXBwb3J0cyBJUHY0XG4gICAqXG4gICAqIEBwYXJhbSBpcE51bSBpbnRlZ2VyIHZhbHVlIG9mIHRoZSBJUCBhZGRyZXNzIChlLmcgMjkyMzYwNTQxNilcbiAgICogQHJldHVybnMgSVB2NCBhZGRyZXNzIChlLmcuIDE3NC42Ni4xNzMuMTY4KVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBudW1Ub0lwKGlwTnVtOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIC8vIHRoaXMgYWxsIGJlY2F1c2UgYml0d2lzZSBtYXRoIGlzIHNpZ25lZFxuICAgIGxldCByZW1haW5pbmcgPSBpcE51bTtcbiAgICBjb25zdCBhZGRyZXNzID0gbmV3IEFycmF5PG51bWJlcj4oKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgaWYgKHJlbWFpbmluZyAhPT0gMCkge1xuICAgICAgICBhZGRyZXNzLnB1c2goTWF0aC5mbG9vcihyZW1haW5pbmcgLyAyNTYgKiogKDMgLSBpKSkpO1xuICAgICAgICByZW1haW5pbmcgPSByZW1haW5pbmcgJSAyNTYgKiogKDMgLSBpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFkZHJlc3MucHVzaCgwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaXBBZGRyZXNzOiBzdHJpbmcgPSBhZGRyZXNzLmpvaW4oJy4nKTtcbiAgICBpZiAoICF0aGlzLnZhbGlkSXAoaXBBZGRyZXNzKSApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtpcEFkZHJlc3N9IGlzIG5vdCBhIHZhbGlkIElQIEFkZHJlc3NgKTtcbiAgICB9XG4gICAgcmV0dXJuIGlwQWRkcmVzcztcbiAgfVxufVxuXG4vKipcbiAqIEV4cG9ydGVkIGNsYXNzIGZyb20gVlBDIHRvIHN1cHBvcnQgc3VibmV0IGZpbHRlcmluZ1xuICogYW5kIENJRFIgdmFsaWRhdGlvblxuICovXG5leHBvcnQgY2xhc3MgQ2lkckJsb2NrIHtcblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgbmV0bWFzayBmb3IgYSBnaXZlbiBDSURSIG1hc2tcbiAgICpcbiAgICogVGhlIG5ldG1hc2sgaXMgYSAzMi1iaXQgYmluYXJ5IHZhbHVlIHVzZWQgdG8gc2VwYXJhdGUgdGhlIG5ldHdvcmsgcG9ydGlvbiBmcm9tIHRoZSBob3N0IHBvcnRpb24gb2YgYW4gSVB2NCBhZGRyZXNzLlxuICAgKiBJdCBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSBDSURSIHByZWZpeCBsZW5ndGggKHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgbmV0d29yayBwb3J0aW9uKS5cbiAgICpcbiAgICogRm9yIGV4YW1wbGU6XG4gICAqIENpZHJCbG9jay5jYWxjdWxhdGVOZXRtYXNrKDI0KSByZXR1cm5zICcyNTUuMjU1LjI1NS4wJ1xuICAgKlxuICAgKiBAcGFyYW0gbWFzayBUaGUgQ0lEUiBwcmVmaXggbGVuZ3RoIChiZXR3ZWVuIDAgYW5kIDMyKSBmb3Igd2hpY2ggdG8gY2FsY3VsYXRlIHRoZSBuZXRtYXNrLlxuICAgIC8vIENhbGN1bGF0ZSB0aGUgbmV0bWFzayBieSBwZXJmb3JtaW5nIGEgYml0d2lzZSBOT1Qgb24gdGhlIHJlc3VsdCBvZiAoMl4zMiAtIDJeKDMyIC0gbWFzaykpXG4gICAqIEByZXR1cm5zIFRoZSBuZXRtYXNrIHN0cmluZyBpbiBJUHY0IGFkZHJlc3MgZm9ybWF0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjYWxjdWxhdGVOZXRtYXNrKG1hc2s6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIE5ldHdvcmtVdGlscy5udW1Ub0lwKDIgKiogMzIgLSAyICoqICgzMiAtIG1hc2spKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBudW1iZXIgSVAgYWRkcmVzc2VzIGluIGEgQ0lEUiBNYXNrXG4gICAqXG4gICAqIEZvciBleGFtcGxlOlxuICAgKiBDaWRyQmxvY2suY2FsY3VsYXRlTmV0c2l6ZSgxNikgcmV0dXJucyA2NTUzNlxuICAgKlxuICAgKiBAcGFyYW0gbWFzayBUaGUgQ0lEUiBwcmVmaXggbGVuZ3RoIChiZXR3ZWVuIDAgYW5kIDMyKSBmb3Igd2hpY2ggdG8gY2FsY3VsYXRlIHRoZSBuZXR3b3JrIHNpemUuXG4gICAqIENpZHJCbG9jay5jYWxjdWxhdGVOZXRzaXplKDI0KSByZXR1cm5zIDI1NlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjYWxjdWxhdGVOZXRzaXplKG1hc2s6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIDIgKiogKDMyIC0gbWFzayk7XG4gIH1cblxuICAvKipcbiAgICogSVAgYWRkcmVzcyBpbiB0aGUgQ0lEUiBibG9jay5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjaWRyOiBzdHJpbmc7XG5cbiAgLypcbiAgICogVGhlIENJRFIgbWFzayBlLmcuIGZvciBDSURSICcxMC4wLjAuMC8yMScgcmV0dXJucyAyMVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1hc2s6IG51bWJlcjtcblxuICAvKlxuICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIElQIGFkZHJlc3NlcyBpbiB0aGUgQ0lEUlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5ldHdvcmtTaXplOiBudW1iZXI7XG5cbiAgLypcbiAgICogVGhlIG5ldHdvcmsgYWRkcmVzcyBwcm92aWRlZCBpbiBDSURSIGNyZWF0aW9uIG9mZnNldCBieSB0aGUgTmV0c2l6ZSAtMVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBuZXR3b3JrQWRkcmVzczogbnVtYmVyO1xuXG4gIC8qXG4gICAqIFBhcnNlcyBlaXRoZXIgQ0lEUiBub3RhdGlvbiBTdHJpbmcgb3IgdHdvIG51bWJlcnMgcmVwcmVzZW50aW5nIHRoZSBJUFxuICAgKiBzcGFjZVxuICAgKlxuICAgKiBjaWRyIGV4cGVjdHMgYSBzdHJpbmcgJzEwLjAuMC4wLzE2J1xuICAgKiBpcEFkZHJlc3MgZXhwZWN0cyBhIG51bWJlclxuICAgKiBtYXNrIGV4cGVjdHMgYSBudW1iZXJcbiAgICpcbiAgICogSWYgdGhlIGdpdmVuIGBjaWRyYCBvciBgaXBBZGRyZXNzYCBpcyBub3QgdGhlIGJlZ2lubmluZyBvZiB0aGUgYmxvY2ssXG4gICAqIHRoZW4gdGhlIG5leHQgYXZhaWxhYmxlIGJsb2NrIHdpbGwgYmUgcmV0dXJuZWQuIEZvciBleGFtcGxlLCBpZlxuICAgKiBgMTAuMC4zLjEvMjhgIGlzIGdpdmVuIHRoZSByZXR1cm5lZCBibG9jayB3aWxsIHJlcHJlc2VudCBgMTAuMC4zLjE2LzI4YC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGNpZHI6IHN0cmluZylcbiAgY29uc3RydWN0b3IoaXBBZGRyZXNzOiBudW1iZXIsIG1hc2s6IG51bWJlcilcbiAgY29uc3RydWN0b3IoaXBBZGRyZXNzT3JDaWRyOiBzdHJpbmcgfCBudW1iZXIsIG1hc2s/OiBudW1iZXIpIHtcbiAgICBpZiAodHlwZW9mIGlwQWRkcmVzc09yQ2lkciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMubWFzayA9IHBhcnNlSW50KGlwQWRkcmVzc09yQ2lkci5zcGxpdCgnLycpWzFdLCAxMCk7XG4gICAgICB0aGlzLm5ldHdvcmtBZGRyZXNzID0gTmV0d29ya1V0aWxzLmlwVG9OdW0oaXBBZGRyZXNzT3JDaWRyLnNwbGl0KCcvJylbMF0pICtcbiAgICAgICAgQ2lkckJsb2NrLmNhbGN1bGF0ZU5ldHNpemUodGhpcy5tYXNrKSAtIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgbWFzayA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhpcy5tYXNrID0gbWFzaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRoaXMgc2hvdWxkIGJlIGltcG9zc2libGVcbiAgICAgICAgdGhpcy5tYXNrID0gMTY7XG4gICAgICB9XG4gICAgICB0aGlzLm5ldHdvcmtBZGRyZXNzID0gaXBBZGRyZXNzT3JDaWRyICsgQ2lkckJsb2NrLmNhbGN1bGF0ZU5ldHNpemUodGhpcy5tYXNrKSAtIDE7XG4gICAgICB0aGlzLm5ldHdvcmtTaXplID0gMiAqKiAoMzIgLSB0aGlzLm1hc2spO1xuICAgIH1cbiAgICB0aGlzLm5ldHdvcmtTaXplID0gMiAqKiAoMzIgLSB0aGlzLm1hc2spO1xuICAgIHRoaXMuY2lkciA9IGAke3RoaXMubWluSXAoKX0vJHt0aGlzLm1hc2t9YDtcbiAgfVxuXG4gIC8qXG4gICAqIFRoZSBtYXhpbXVtIElQIGluIHRoZSBDSURSIEJsb2NrIGUuZy4gJzEwLjAuOC4yNTUnXG4gICAqL1xuICBwdWJsaWMgbWF4SXAoKTogc3RyaW5nIHtcbiAgICAvLyBtaW4gKyAoMl4oMzItbWFzaykpIC0gMSBbemVybyBuZWVkcyB0byBjb3VudF1cbiAgICByZXR1cm4gTmV0d29ya1V0aWxzLm51bVRvSXAodGhpcy5tYXhBZGRyZXNzKCkpO1xuICB9XG5cbiAgLypcbiAgICogQ2hlY2tzIGlmIHRoaXMgQ0lEUiBibG9jayBmdWxseSBjb250YWlucyB0aGUgcHJvdmlkZWQgQ0lEUiBibG9jay5cbiAgICpcbiAgICogQHBhcmFtIG90aGVyIFRoZSBDSURSIGJsb2NrIHRvIGNoZWNrIGZvciBjb250YWlubWVudC5cbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGlzIENJRFIgYmxvY2sgZnVsbHkgY29udGFpbnMgdGhlIHByb3ZpZGVkIENJRFIgYmxvY2ssIGZhbHNlIG90aGVyd2lzZS5cbiAgICpcbiAgICogVGhlIG1pbmltdW0gSVAgaW4gdGhlIENJRFIgQmxvY2sgZS5nLiAnMTAuMC4wLjAnXG4gICAqL1xuICBwdWJsaWMgbWluSXAoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gTmV0d29ya1V0aWxzLm51bVRvSXAodGhpcy5taW5BZGRyZXNzKCkpO1xuICB9XG5cbiAgLypcbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgbWluaW11bSBJUHY0IGFkZHJlc3NcbiAgICovXG4gIHB1YmxpYyBtaW5BZGRyZXNzKCk6IG51bWJlciB7XG4gICAgY29uc3QgZGl2ID0gdGhpcy5uZXR3b3JrQWRkcmVzcyAlIHRoaXMubmV0d29ya1NpemU7XG4gICAgcmV0dXJuIHRoaXMubmV0d29ya0FkZHJlc3MgLSBkaXY7XG4gIH1cblxuICAvKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBtYXhpbXVtIElQdjQgYWRkcmVzc1xuICAgKi9cbiAgcHVibGljIG1heEFkZHJlc3MoKTogbnVtYmVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBJUCBhZGRyZXNzIGluIHRoZSBDSURSIGJsb2NrIGlzIGNhbGN1bGF0ZWQgYXMgdGhlIG1pbmltdW0gYWRkcmVzcyArICgyXigzMi1tYXNrKSkgLSAxLlxuICAgICAqIFRoaXMgaXMgYmVjYXVzZSB0aGUgbWluaW11bSBhZGRyZXNzIHJlcHJlc2VudHMgdGhlIG5ldHdvcmsgYWRkcmVzcywgYW5kIHRoZSBtYXhpbXVtIGFkZHJlc3MgaXMgdGhlIGJyb2FkY2FzdCBhZGRyZXNzLlxuICAgICAqL1xuICAgIC8vIG1pbiArICgyXigzMi1tYXNrKSkgLSAxIFt6ZXJvIG5lZWRzIHRvIGNvdW50XVxuICAgIHJldHVybiB0aGlzLm1pbkFkZHJlc3MoKSArIHRoaXMubmV0d29ya1NpemUgLSAxO1xuICB9XG5cbiAgLypcbiAgICogUmV0dXJucyB0aGUgbmV4dCBjb25zZWN1dGl2ZSBDSURSIGJsb2NrIG9mIHRoZSBzYW1lIG1hc2sgc2l6ZSBmb2xsb3dpbmcgdGhpcyBDSURSIGJsb2NrLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhpcyBDSURSIGJsb2NrIGlzICcxMC4wLjAuMC8yNCcsIHRoZSBuZXh0IGJsb2NrIHdvdWxkIGJlICcxMC4wLjEuMC8yNCcuXG4gICAqXG4gICAqIFJldHVybnMgdGhlIG5leHQgQ0lEUiBCbG9jayBvZiB0aGUgc2FtZSBtYXNrIHNpemVcbiAgICovXG4gIHB1YmxpYyBuZXh0QmxvY2soKTogQ2lkckJsb2NrIHtcbiAgICByZXR1cm4gbmV3IENpZHJCbG9jayh0aGlzLm1heEFkZHJlc3MoKSArIDEsIHRoaXMubWFzayk7XG4gIH1cblxuICAvKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBDaWRyQmxvY2sgZnVsbHkgY29udGFpbnMgdGhlIHByb3ZpZGVkIENpZHJCbG9ja1xuICAgKi9cbiAgcHVibGljIGNvbnRhaW5zQ2lkcihvdGhlcjogQ2lkckJsb2NrKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLm1heEFkZHJlc3MoKSA+PSBvdGhlci5tYXhBZGRyZXNzKCkpICYmXG4gICAgICAodGhpcy5taW5BZGRyZXNzKCkgPD0gb3RoZXIubWluQWRkcmVzcygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdHdvIElQdjQgYWRkcmVzcyByYW5nZXMgb3ZlcmxhcC5cbiAgICpcbiAgICogQHBhcmFtIHJhbmdlMSBUaGUgZmlyc3QgSVAgYWRkcmVzcyByYW5nZSByZXByZXNlbnRlZCBhcyBhbiBhcnJheSBbc3RhcnQsIGVuZF0uXG4gICAqIEBwYXJhbSByYW5nZTIgVGhlIHNlY29uZCBJUCBhZGRyZXNzIHJhbmdlIHJlcHJlc2VudGVkIGFzIGFuIGFycmF5IFtzdGFydCwgZW5kXS5cbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdHdvIElQIGFkZHJlc3MgcmFuZ2VzIG92ZXJsYXAsIGZhbHNlIG90aGVyd2lzZS5cbiAgICpcbiAgICogTm90ZTogVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IHRoZSBzdGFydCBhbmQgZW5kIGFkZHJlc3NlcyBhcmUgdmFsaWQgSVB2NCBhZGRyZXNzZXMuXG4gICAqL1xuICBwdWJsaWMgcmFuZ2VzT3ZlcmxhcChyYW5nZTE6IFtzdHJpbmcsIHN0cmluZ10sIHJhbmdlMjogW3N0cmluZywgc3RyaW5nXSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IFtzdGFydDEsIGVuZDFdID0gcmFuZ2UxLm1hcChpcCA9PiBOZXR3b3JrVXRpbHMuaXBUb051bShpcCkpO1xuICAgIGNvbnN0IFtzdGFydDIsIGVuZDJdID0gcmFuZ2UyLm1hcChpcCA9PiBOZXR3b3JrVXRpbHMuaXBUb051bShpcCkpO1xuICAgIC8vIENoZWNrIGlmIHJhbmdlcyBvdmVybGFwXG4gICAgcmV0dXJuIHN0YXJ0MSA8PSBlbmQyICYmIHN0YXJ0MiA8PSBlbmQxO1xuICB9XG5cbn1cblxuLyoqXG4gKiBDbGFzcyB3aXRoIGhlbHBlciBmdW5jdGlvbnMgdG8gc3VwcG9ydFxuICogU3VibmV0IElwdjYgQWRkcmVzcyBWYWxpZGF0aW9uXG4gKlxuICogVGhpcyBjbGFzcyBwcm92aWRlcyBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggSVB2NiBDSURSIGJsb2NrcywgaW5jbHVkaW5nIGNhbGN1bGF0aW5nIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtXG4gKiBJUCBhZGRyZXNzZXMgaW4gYSBDSURSIGJsb2NrLCBhbmQgY2hlY2tpbmcgaWYgdHdvIENJRFIgYmxvY2tzIG92ZXJsYXAuXG4gKi9cbmV4cG9ydCBjbGFzcyBDaWRyQmxvY2tJcHY2IHtcblxuICAvKipcbiAgICogSXB2NiBDSURSIHJhbmdlXG4gICAqL1xuICBwdWJsaWMgY2lkcjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIENJRFIgcHJlZml4IGxlbmd0aCAobnVtYmVyIG9mIGJpdHMgdXNlZCBmb3IgdGhlIG5ldHdvcmsgcG9ydGlvbiBvZiB0aGUgYWRkcmVzcykuXG4gICAqL1xuICBwdWJsaWMgY2lkclByZWZpeDogbnVtYmVyO1xuICBwcml2YXRlIGlwUGFydHM6IGJpZ2ludFtdO1xuICBwcml2YXRlIG5ldHdvcmtCaXRzOiBudW1iZXI7XG4gIHByaXZhdGUgbmV0d29ya1BhcnQ6IGJpZ2ludFtdO1xuXG4gIGNvbnN0cnVjdG9yKGNpZHI6IHN0cmluZykge1xuICAgIHRoaXMuY2lkciA9IGNpZHI7XG4gICAgY29uc3QgW2lwQWRkcmVzcywgcHJlZml4XSA9IGNpZHIuc3BsaXQoJy8nKTtcbiAgICB0aGlzLmNpZHJQcmVmaXggPSBwYXJzZUludChwcmVmaXgsIDEwKTtcbiAgICB0aGlzLmlwUGFydHMgPSB0aGlzLnBhcnNlQmlnSW50UGFydHMoaXBBZGRyZXNzKTtcbiAgICB0aGlzLm5ldHdvcmtCaXRzID0gdGhpcy5jaWRyUHJlZml4O1xuICAgIHRoaXMubmV0d29ya1BhcnQgPSB0aGlzLmlwUGFydHMuc2xpY2UoMCwgTWF0aC5jZWlsKHRoaXMubmV0d29ya0JpdHMgLyAxNikpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUJpZ0ludFBhcnRzKGlwQWRkcmVzczogc3RyaW5nKTogYmlnaW50W10ge1xuICAgIHJldHVybiBpcEFkZHJlc3Muc3BsaXQoJzonKS5tYXAoKHBhcnQpID0+IEJpZ0ludChgMHgke3BhcnQucGFkU3RhcnQoNCwgJzAnKX1gIHx8ICcwJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIE1pbmltdW0gSVB2NiBhZGRyZXNzIGZvciBhIHByb3ZpZGVkIENJRFJcbiAgICovXG4gIHB1YmxpYyBtaW5JcCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0YXJ0SVAgPSBbLi4udGhpcy5uZXR3b3JrUGFydF07XG4gICAgZm9yIChsZXQgaSA9IHRoaXMubmV0d29ya1BhcnQubGVuZ3RoOyBpIDwgODsgaSsrKSB7XG4gICAgICBzdGFydElQLnB1c2goQmlnSW50KDApKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXJ0SVAubWFwKHRoaXMuZm9ybWF0SVB2NlBhcnQpLmpvaW4oJzonKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBNYXhpbXVtIElQdjYgYWRkcmVzcyBmb3IgYSBwcm92aWRlZCBDSURSXG4gICAqL1xuICBwdWJsaWMgbWF4SXAoKTogc3RyaW5nIHtcbiAgICBjb25zdCBlbmRJUCA9IFsuLi50aGlzLm5ldHdvcmtQYXJ0XTtcbiAgICBjb25zdCBob3N0UGFydCA9IEFycmF5KDggLSB0aGlzLm5ldHdvcmtQYXJ0Lmxlbmd0aCkuZmlsbChCaWdJbnQoMHhmZmZmKSk7XG4gICAgZW5kSVAucHVzaCguLi5ob3N0UGFydCk7XG5cbiAgICByZXR1cm4gZW5kSVAubWFwKHRoaXMuZm9ybWF0SVB2NlBhcnQpLmpvaW4oJzonKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0SVB2NlBhcnQgPSAocGFydDogYmlnaW50KSA9PiBwYXJ0LnRvU3RyaW5nKDE2KS5wYWRTdGFydCg0LCAnMCcpO1xuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcmFuZ2UxIElwdjYgQ0lEUiByYW5nZSB0byBjb21wYXJlXG4gICAqIEBwYXJhbSByYW5nZTIgSXB2NiBDSURSIHJhbmdlIHRvIGNvbXBhcmVcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0d28gcmFuZ2VzIG92ZXJsYXAsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgcHVibGljIHJhbmdlc092ZXJsYXAocmFuZ2UxOiBzdHJpbmcsIHJhbmdlMjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgW3N0YXJ0MSwgZW5kMV0gPSB0aGlzLmdldElQdjZSYW5nZShyYW5nZTEpO1xuICAgIGNvbnN0IFtzdGFydDIsIGVuZDJdID0gdGhpcy5nZXRJUHY2UmFuZ2UocmFuZ2UyKTtcblxuICAgIHJldHVybiAoc3RhcnQxIDw9IGVuZDIpICYmIChzdGFydDIgPD0gZW5kMSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGNpZHJcbiAgICogQHJldHVybnMgUmFuZ2UgaW4gdGhlIGZyb20gb2YgYmlnIGludCBudW1iZXIgW3N0YXJ0LCBlbmRdXG4gICAqL1xuICBwcml2YXRlIGdldElQdjZSYW5nZShjaWRyOiBzdHJpbmcpOiBbYmlnaW50LCBiaWdpbnRdIHtcbiAgICBjb25zdCBbaXB2NkFkZHJlc3MsIHByZWZpeExlbmd0aF0gPSBjaWRyLnNwbGl0KCcvJyk7XG4gICAgY29uc3QgaXB2Nk51bWJlciA9IHRoaXMuaXB2NlRvTnVtYmVyKGlwdjZBZGRyZXNzKTtcbiAgICBjb25zdCBtYXNrID0gKEJpZ0ludCgxKSA8PCBCaWdJbnQoMTI4IC0gTnVtYmVyKHByZWZpeExlbmd0aCkpKSAtIEJpZ0ludCgxKTtcbiAgICBjb25zdCBuZXR3b3JrUHJlZml4ID0gaXB2Nk51bWJlciAmIH5tYXNrO1xuICAgIGNvbnN0IHN0YXJ0ID0gbmV0d29ya1ByZWZpeDtcbiAgICBjb25zdCBlbmQgPSBuZXR3b3JrUHJlZml4IHwgbWFzaztcblxuICAgIHJldHVybiBbc3RhcnQsIGVuZF07XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGlwdjZBZGRyZXNzXG4gICAqIEByZXR1cm5zIENvbnZlcnRzIGdpdmVuIGlwdjYgYWRkcmVzcyByYW5nZSB0byBiaWcgaW50IG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBpcHY2VG9OdW1iZXIoaXB2NkFkZHJlc3M6IHN0cmluZyk6IGJpZ2ludCB7XG4gICAgY29uc3QgYmxvY2tzID0gdGhpcy5wYXJzZUJpZ0ludFBhcnRzKGlwdjZBZGRyZXNzKTtcbiAgICBsZXQgaXB2Nk51bWJlciA9IEJpZ0ludCgwKTtcbiAgICBmb3IgKGNvbnN0IGJsb2NrIG9mIGJsb2Nrcykge1xuICAgICAgLyogdHNsaW50OmRpc2FibGU6bm8tYml0d2lzZSAqL1xuICAgICAgaXB2Nk51bWJlciA9IChpcHY2TnVtYmVyIDw8IEJpZ0ludCgxNikpICsgYmxvY2s7XG4gICAgfVxuICAgIHJldHVybiBpcHY2TnVtYmVyO1xuICB9XG59XG4iXX0=
|
|
364
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHNFQUFzRTs7O0FBU3RFLHdFQUVDO0FBS0QsNEJBRUM7QUFpQkQsNENBTUM7QUFLRCw0Q0FRQztBQUVELDBCQUVDO0FBdEREOzs7O0dBSUc7QUFDSCxTQUFnQiw4QkFBOEIsQ0FBQyxNQUFlO0lBQzVELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixRQUFRLENBQUMsSUFBWSxFQUFFLENBQVM7SUFDOUMsT0FBTyxHQUFHLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFDakMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsSUFBWSwyQkFVWDtBQVZELFdBQVksMkJBQTJCO0lBQ3JDOztPQUVHO0lBQ0gsZ0RBQWlCLENBQUE7SUFFakI7O09BRUc7SUFDSCxrREFBbUIsQ0FBQTtBQUNyQixDQUFDLEVBVlcsMkJBQTJCLDJDQUEzQiwyQkFBMkIsUUFVdEM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxNQUFnQjtJQUMvQyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN6QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLE9BQU8sQ0FBQztJQUMzRixDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQUMsT0FBa0I7SUFDakQsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUM5QixLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzdCLElBQUksTUFBTSxDQUFD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QUUsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFFOUMsb0JBQW9CO1FBQ3BCLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUM7S0FDN0M7SUFFRDs7T0FFRztJQUNLLFlBQVksQ0FBQyxXQUFtQjtRQUN0QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbEQsSUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNCLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7WUFDM0IsK0JBQStCO1lBQy9CLFVBQVUsR0FBRyxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDbEQsQ0FBQztRQUNELE9BQU8sVUFBVSxDQUFDO0tBQ25CO0NBQ0Y7QUE1SEQsc0NBNEhDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IG5vLWJpdHdpc2U6IFtcImVycm9yXCIsIHsgXCJhbGxvd1wiOiBbXCJ+XCIsIFwifFwiLCBcIjw8XCIsIFwiJlwiXSB9XSAqL1xuXG5pbXBvcnQgeyBJU3VibmV0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5cbi8qKlxuICogUmV0dXJuIGEgc3VibmV0IG5hbWUgZnJvbSBpdHMgY29uc3RydWN0IElEXG4gKlxuICogQWxsIHN1Ym5ldCBuYW1lcyBsb29rIGxpa2UgTkFNRSA8PiBcIlN1Ym5ldFwiIDw+IElOREVYXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJuZXRHcm91cE5hbWVGcm9tQ29uc3RydWN0SWQoc3VibmV0OiBJU3VibmV0KSB7XG4gIHJldHVybiBzdWJuZXQubm9kZS5pZC5yZXBsYWNlKC9TdWJuZXRcXGQrJC8sICcnKTtcbn1cblxuLyoqXG4gKiBNYWtlIHRoZSBzdWJuZXQgY29uc3RydWN0IElEIGZyb20gYSBuYW1lIGFuZCBudW1iZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1Ym5ldElkKG5hbWU6IHN0cmluZywgaTogbnVtYmVyKSB7XG4gIHJldHVybiBgJHtuYW1lfVN1Ym5ldCR7aSArIDF9YDtcbn1cblxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIGEgVHJhbnNpdCBHYXRld2F5IGZlYXR1cmUuXG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zaXRHYXRld2F5RmVhdHVyZVN0YXR1cyB7XG4gIC8qKlxuICAgKiBUaGUgZmVhdHVyZSBpcyBlbmFibGVkLlxuICAgKi9cbiAgRU5BQkxFID0gJ2VuYWJsZScsXG5cbiAgLyoqXG4gICAqIFRoZSBmZWF0dXJlIGlzIGRpc2FibGVkLlxuICAgKi9cbiAgRElTQUJMRSA9ICdkaXNhYmxlJyxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZlYXR1cmVTdGF0dXMoc3RhdHVzPzogYm9vbGVhbik6IFRyYW5zaXRHYXRld2F5RmVhdHVyZVN0YXR1cyB8IHVuZGVmaW5lZCB7XG4gIGlmIChzdGF0dXMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0YXR1cyA/IFRyYW5zaXRHYXRld2F5RmVhdHVyZVN0YXR1cy5FTkFCTEUgOiBUcmFuc2l0R2F0ZXdheUZlYXR1cmVTdGF0dXMuRElTQUJMRTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybiB0aGUgdW5pb24gb2YgdGFibGUgSURzIGZyb20gYWxsIHNlbGVjdGVkIHN1Ym5ldHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFsbFJvdXRlVGFibGVJZHMoc3VibmV0czogSVN1Ym5ldFtdKTogc3RyaW5nW10ge1xuICBjb25zdCByZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBzdWJuZXQgb2Ygc3VibmV0cykge1xuICAgIGlmIChzdWJuZXQucm91dGVUYWJsZSAmJiBzdWJuZXQucm91dGVUYWJsZS5yb3V0ZVRhYmxlSWQpIHtcbiAgICAgIHJldC5hZGQoc3VibmV0LnJvdXRlVGFibGUucm91dGVUYWJsZUlkKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIEFycmF5LmZyb20ocmV0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW48QT4oeHM6IEFbXVtdKTogQVtdIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sIHhzKTtcbn1cblxuLyoqXG4gKiBOZXR3b3JrVXRpbHMgY29udGFpbnMgaGVscGVycyB0byB3b3JrIHdpdGggbmV0d29yayBjb25zdHJ1Y3RzIChzdWJuZXRzL3JhbmdlcylcbiAqL1xuZXhwb3J0IGNsYXNzIE5ldHdvcmtVdGlscyB7XG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW4gSVB2NCBhZGRyZXNzIHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIGlwQWRkcmVzcyBUaGUgSVB2NCBhZGRyZXNzIHN0cmluZyB0byBiZSB2YWxpZGF0ZWQuXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHN0cmluZyBpcyBhIHZhbGlkIElQdjQgYWRkcmVzcywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBWYWxpZGF0ZXMgYW4gSVB2NCBzdHJpbmdcbiAgICpcbiAgICogcmV0dXJucyB0cnVlIG9mIHRoZSBzdHJpbmcgY29udGFpbnMgNCBudW1iZXJzIGJldHdlZW4gMC0yNTUgZGVsaW1pdGVkIGJ5XG4gICAqIGEgYC5gIGNoYXJhY3RlclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2YWxpZElwKGlwQWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgb2N0ZXRzID0gaXBBZGRyZXNzLnNwbGl0KCcuJyk7XG4gICAgaWYgKG9jdGV0cy5sZW5ndGggIT09IDQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG9jdGV0cy5tYXAoKG9jdGV0OiBzdHJpbmcpID0+IHBhcnNlSW50KG9jdGV0LCAxMCkpLlxuICAgICAgZXZlcnkoKG9jdGV0OiBudW1iZXIpID0+IG9jdGV0ID49IDAgJiYgb2N0ZXQgPD0gMjU1KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBJUHY0IGFkZHJlc3MgdG8gaXRzIGNvcnJlc3BvbmRpbmcgbnVtZXJpY2FsIHZhbHVlLlxuICAgKlxuICAgKiBVc2VzIHRoZSBmb3JtdWxhOlxuICAgKiAoZmlyc3Qgb2N0ZXQgKiAyNTbCsykgKyAoc2Vjb25kIG9jdGV0ICogMjU2wrIpICsgKHRoaXJkIG9jdGV0ICogMjU2KSArXG4gICAqIChmb3VydGggb2N0ZXQpXG4gICAqXG4gICAqIEBwYXJhbSAgaXBBZGRyZXNzIHRoZSBJUCBhZGRyZXNzIChlLmcuIDE3NC42Ni4xNzMuMTY4KVxuICAgKiBAcmV0dXJucyB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGUgSVAgYWRkcmVzcyAoZS5nIDI5MjM2MDU0MTYpXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlwVG9OdW0oaXBBZGRyZXNzOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy52YWxpZElwKGlwQWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtpcEFkZHJlc3N9IGlzIG5vdCB2YWxpZGApO1xuICAgIH1cblxuICAgIHJldHVybiBpcEFkZHJlc3NcbiAgICAgIC5zcGxpdCgnLicpXG4gICAgICAucmVkdWNlKFxuICAgICAgICAocDogbnVtYmVyLCBjOiBzdHJpbmcsIGk6IG51bWJlcikgPT4gcCArIHBhcnNlSW50KGMsIDEwKSAqIDI1NiAqKiAoMyAtIGkpLFxuICAgICAgICAwLFxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBudW1iZXIgYW5kIGNvbnZlcnRzIGl0IHRvIElQdjQgYWRkcmVzcyBzdHJpbmdcbiAgICpcbiAgICogVGFrZXMgYSBudW1iZXIgKGUuZyAyOTIzNjA1NDE2KSBhbmQgY29udmVydHMgaXQgdG8gYW4gSVB2NCBhZGRyZXNzIHN0cmluZ1xuICAgKiBjdXJyZW50bHkgb25seSBzdXBwb3J0cyBJUHY0XG4gICAqXG4gICAqIEBwYXJhbSBpcE51bSBpbnRlZ2VyIHZhbHVlIG9mIHRoZSBJUCBhZGRyZXNzIChlLmcgMjkyMzYwNTQxNilcbiAgICogQHJldHVybnMgSVB2NCBhZGRyZXNzIChlLmcuIDE3NC42Ni4xNzMuMTY4KVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBudW1Ub0lwKGlwTnVtOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIC8vIHRoaXMgYWxsIGJlY2F1c2UgYml0d2lzZSBtYXRoIGlzIHNpZ25lZFxuICAgIGxldCByZW1haW5pbmcgPSBpcE51bTtcbiAgICBjb25zdCBhZGRyZXNzID0gbmV3IEFycmF5PG51bWJlcj4oKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgaWYgKHJlbWFpbmluZyAhPT0gMCkge1xuICAgICAgICBhZGRyZXNzLnB1c2goTWF0aC5mbG9vcihyZW1haW5pbmcgLyAyNTYgKiogKDMgLSBpKSkpO1xuICAgICAgICByZW1haW5pbmcgPSByZW1haW5pbmcgJSAyNTYgKiogKDMgLSBpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFkZHJlc3MucHVzaCgwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaXBBZGRyZXNzOiBzdHJpbmcgPSBhZGRyZXNzLmpvaW4oJy4nKTtcbiAgICBpZiAoICF0aGlzLnZhbGlkSXAoaXBBZGRyZXNzKSApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtpcEFkZHJlc3N9IGlzIG5vdCBhIHZhbGlkIElQIEFkZHJlc3NgKTtcbiAgICB9XG4gICAgcmV0dXJuIGlwQWRkcmVzcztcbiAgfVxufVxuXG4vKipcbiAqIEV4cG9ydGVkIGNsYXNzIGZyb20gVlBDIHRvIHN1cHBvcnQgc3VibmV0IGZpbHRlcmluZ1xuICogYW5kIENJRFIgdmFsaWRhdGlvblxuICovXG5leHBvcnQgY2xhc3MgQ2lkckJsb2NrIHtcbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIG5ldG1hc2sgZm9yIGEgZ2l2ZW4gQ0lEUiBtYXNrXG4gICAqXG4gICAqIFRoZSBuZXRtYXNrIGlzIGEgMzItYml0IGJpbmFyeSB2YWx1ZSB1c2VkIHRvIHNlcGFyYXRlIHRoZSBuZXR3b3JrIHBvcnRpb24gZnJvbSB0aGUgaG9zdCBwb3J0aW9uIG9mIGFuIElQdjQgYWRkcmVzcy5cbiAgICogSXQgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgQ0lEUiBwcmVmaXggbGVuZ3RoICh0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCB0byByZXByZXNlbnQgdGhlIG5ldHdvcmsgcG9ydGlvbikuXG4gICAqXG4gICAqIEZvciBleGFtcGxlOlxuICAgKiBDaWRyQmxvY2suY2FsY3VsYXRlTmV0bWFzaygyNCkgcmV0dXJucyAnMjU1LjI1NS4yNTUuMCdcbiAgICpcbiAgICogQHBhcmFtIG1hc2sgVGhlIENJRFIgcHJlZml4IGxlbmd0aCAoYmV0d2VlbiAwIGFuZCAzMikgZm9yIHdoaWNoIHRvIGNhbGN1bGF0ZSB0aGUgbmV0bWFzay5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIG5ldG1hc2sgYnkgcGVyZm9ybWluZyBhIGJpdHdpc2UgTk9UIG9uIHRoZSByZXN1bHQgb2YgKDJeMzIgLSAyXigzMiAtIG1hc2spKVxuICAgKiBAcmV0dXJucyBUaGUgbmV0bWFzayBzdHJpbmcgaW4gSVB2NCBhZGRyZXNzIGZvcm1hdC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY2FsY3VsYXRlTmV0bWFzayhtYXNrOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBOZXR3b3JrVXRpbHMubnVtVG9JcCgyICoqIDMyIC0gMiAqKiAoMzIgLSBtYXNrKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgbnVtYmVyIElQIGFkZHJlc3NlcyBpbiBhIENJRFIgTWFza1xuICAgKlxuICAgKiBGb3IgZXhhbXBsZTpcbiAgICogQ2lkckJsb2NrLmNhbGN1bGF0ZU5ldHNpemUoMTYpIHJldHVybnMgNjU1MzZcbiAgICpcbiAgICogQHBhcmFtIG1hc2sgVGhlIENJRFIgcHJlZml4IGxlbmd0aCAoYmV0d2VlbiAwIGFuZCAzMikgZm9yIHdoaWNoIHRvIGNhbGN1bGF0ZSB0aGUgbmV0d29yayBzaXplLlxuICAgKiBDaWRyQmxvY2suY2FsY3VsYXRlTmV0c2l6ZSgyNCkgcmV0dXJucyAyNTZcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY2FsY3VsYXRlTmV0c2l6ZShtYXNrOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiAyICoqICgzMiAtIG1hc2spO1xuICB9XG5cbiAgLyoqXG4gICAqIElQIGFkZHJlc3MgaW4gdGhlIENJRFIgYmxvY2suXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2lkcjogc3RyaW5nO1xuXG4gIC8qXG4gICAqIFRoZSBDSURSIG1hc2sgZS5nLiBmb3IgQ0lEUiAnMTAuMC4wLjAvMjEnIHJldHVybnMgMjFcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtYXNrOiBudW1iZXI7XG5cbiAgLypcbiAgICogVGhlIHRvdGFsIG51bWJlciBvZiBJUCBhZGRyZXNzZXMgaW4gdGhlIENJRFJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuZXR3b3JrU2l6ZTogbnVtYmVyO1xuXG4gIC8qXG4gICAqIFRoZSBuZXR3b3JrIGFkZHJlc3MgcHJvdmlkZWQgaW4gQ0lEUiBjcmVhdGlvbiBvZmZzZXQgYnkgdGhlIE5ldHNpemUgLTFcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbmV0d29ya0FkZHJlc3M6IG51bWJlcjtcblxuICAvKlxuICAgKiBQYXJzZXMgZWl0aGVyIENJRFIgbm90YXRpb24gU3RyaW5nIG9yIHR3byBudW1iZXJzIHJlcHJlc2VudGluZyB0aGUgSVBcbiAgICogc3BhY2VcbiAgICpcbiAgICogY2lkciBleHBlY3RzIGEgc3RyaW5nICcxMC4wLjAuMC8xNidcbiAgICogaXBBZGRyZXNzIGV4cGVjdHMgYSBudW1iZXJcbiAgICogbWFzayBleHBlY3RzIGEgbnVtYmVyXG4gICAqXG4gICAqIElmIHRoZSBnaXZlbiBgY2lkcmAgb3IgYGlwQWRkcmVzc2AgaXMgbm90IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJsb2NrLFxuICAgKiB0aGVuIHRoZSBuZXh0IGF2YWlsYWJsZSBibG9jayB3aWxsIGJlIHJldHVybmVkLiBGb3IgZXhhbXBsZSwgaWZcbiAgICogYDEwLjAuMy4xLzI4YCBpcyBnaXZlbiB0aGUgcmV0dXJuZWQgYmxvY2sgd2lsbCByZXByZXNlbnQgYDEwLjAuMy4xNi8yOGAuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjaWRyOiBzdHJpbmcpXG4gIGNvbnN0cnVjdG9yKGlwQWRkcmVzczogbnVtYmVyLCBtYXNrOiBudW1iZXIpXG4gIGNvbnN0cnVjdG9yKGlwQWRkcmVzc09yQ2lkcjogc3RyaW5nIHwgbnVtYmVyLCBtYXNrPzogbnVtYmVyKSB7XG4gICAgaWYgKHR5cGVvZiBpcEFkZHJlc3NPckNpZHIgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLm1hc2sgPSBwYXJzZUludChpcEFkZHJlc3NPckNpZHIuc3BsaXQoJy8nKVsxXSwgMTApO1xuICAgICAgdGhpcy5uZXR3b3JrQWRkcmVzcyA9IE5ldHdvcmtVdGlscy5pcFRvTnVtKGlwQWRkcmVzc09yQ2lkci5zcGxpdCgnLycpWzBdKSArXG4gICAgICAgIENpZHJCbG9jay5jYWxjdWxhdGVOZXRzaXplKHRoaXMubWFzaykgLSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIG1hc2sgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHRoaXMubWFzayA9IG1hc2s7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0aGlzIHNob3VsZCBiZSBpbXBvc3NpYmxlXG4gICAgICAgIHRoaXMubWFzayA9IDE2O1xuICAgICAgfVxuICAgICAgdGhpcy5uZXR3b3JrQWRkcmVzcyA9IGlwQWRkcmVzc09yQ2lkciArIENpZHJCbG9jay5jYWxjdWxhdGVOZXRzaXplKHRoaXMubWFzaykgLSAxO1xuICAgICAgdGhpcy5uZXR3b3JrU2l6ZSA9IDIgKiogKDMyIC0gdGhpcy5tYXNrKTtcbiAgICB9XG4gICAgdGhpcy5uZXR3b3JrU2l6ZSA9IDIgKiogKDMyIC0gdGhpcy5tYXNrKTtcbiAgICB0aGlzLmNpZHIgPSBgJHt0aGlzLm1pbklwKCl9LyR7dGhpcy5tYXNrfWA7XG4gIH1cblxuICAvKlxuICAgKiBUaGUgbWF4aW11bSBJUCBpbiB0aGUgQ0lEUiBCbG9jayBlLmcuICcxMC4wLjguMjU1J1xuICAgKi9cbiAgcHVibGljIG1heElwKCk6IHN0cmluZyB7XG4gICAgLy8gbWluICsgKDJeKDMyLW1hc2spKSAtIDEgW3plcm8gbmVlZHMgdG8gY291bnRdXG4gICAgcmV0dXJuIE5ldHdvcmtVdGlscy5udW1Ub0lwKHRoaXMubWF4QWRkcmVzcygpKTtcbiAgfVxuXG4gIC8qXG4gICAqIENoZWNrcyBpZiB0aGlzIENJRFIgYmxvY2sgZnVsbHkgY29udGFpbnMgdGhlIHByb3ZpZGVkIENJRFIgYmxvY2suXG4gICAqXG4gICAqIEBwYXJhbSBvdGhlciBUaGUgQ0lEUiBibG9jayB0byBjaGVjayBmb3IgY29udGFpbm1lbnQuXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhpcyBDSURSIGJsb2NrIGZ1bGx5IGNvbnRhaW5zIHRoZSBwcm92aWRlZCBDSURSIGJsb2NrLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqXG4gICAqIFRoZSBtaW5pbXVtIElQIGluIHRoZSBDSURSIEJsb2NrIGUuZy4gJzEwLjAuMC4wJ1xuICAgKi9cbiAgcHVibGljIG1pbklwKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIE5ldHdvcmtVdGlscy5udW1Ub0lwKHRoaXMubWluQWRkcmVzcygpKTtcbiAgfVxuXG4gIC8qXG4gICAqIFJldHVybnMgdGhlIG51bWJlciByZXByZXNlbnRhdGlvbiBmb3IgdGhlIG1pbmltdW0gSVB2NCBhZGRyZXNzXG4gICAqL1xuICBwdWJsaWMgbWluQWRkcmVzcygpOiBudW1iZXIge1xuICAgIGNvbnN0IGRpdiA9IHRoaXMubmV0d29ya0FkZHJlc3MgJSB0aGlzLm5ldHdvcmtTaXplO1xuICAgIHJldHVybiB0aGlzLm5ldHdvcmtBZGRyZXNzIC0gZGl2O1xuICB9XG5cbiAgLypcbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgbWF4aW11bSBJUHY0IGFkZHJlc3NcbiAgICovXG4gIHB1YmxpYyBtYXhBZGRyZXNzKCk6IG51bWJlciB7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gSVAgYWRkcmVzcyBpbiB0aGUgQ0lEUiBibG9jayBpcyBjYWxjdWxhdGVkIGFzIHRoZSBtaW5pbXVtIGFkZHJlc3MgKyAoMl4oMzItbWFzaykpIC0gMS5cbiAgICAgKiBUaGlzIGlzIGJlY2F1c2UgdGhlIG1pbmltdW0gYWRkcmVzcyByZXByZXNlbnRzIHRoZSBuZXR3b3JrIGFkZHJlc3MsIGFuZCB0aGUgbWF4aW11bSBhZGRyZXNzIGlzIHRoZSBicm9hZGNhc3QgYWRkcmVzcy5cbiAgICAgKi9cbiAgICAvLyBtaW4gKyAoMl4oMzItbWFzaykpIC0gMSBbemVybyBuZWVkcyB0byBjb3VudF1cbiAgICByZXR1cm4gdGhpcy5taW5BZGRyZXNzKCkgKyB0aGlzLm5ldHdvcmtTaXplIC0gMTtcbiAgfVxuXG4gIC8qXG4gICAqIFJldHVybnMgdGhlIG5leHQgY29uc2VjdXRpdmUgQ0lEUiBibG9jayBvZiB0aGUgc2FtZSBtYXNrIHNpemUgZm9sbG93aW5nIHRoaXMgQ0lEUiBibG9jay5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIGlmIHRoaXMgQ0lEUiBibG9jayBpcyAnMTAuMC4wLjAvMjQnLCB0aGUgbmV4dCBibG9jayB3b3VsZCBiZSAnMTAuMC4xLjAvMjQnLlxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSBuZXh0IENJRFIgQmxvY2sgb2YgdGhlIHNhbWUgbWFzayBzaXplXG4gICAqL1xuICBwdWJsaWMgbmV4dEJsb2NrKCk6IENpZHJCbG9jayB7XG4gICAgcmV0dXJuIG5ldyBDaWRyQmxvY2sodGhpcy5tYXhBZGRyZXNzKCkgKyAxLCB0aGlzLm1hc2spO1xuICB9XG5cbiAgLypcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgQ2lkckJsb2NrIGZ1bGx5IGNvbnRhaW5zIHRoZSBwcm92aWRlZCBDaWRyQmxvY2tcbiAgICovXG4gIHB1YmxpYyBjb250YWluc0NpZHIob3RoZXI6IENpZHJCbG9jayk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5tYXhBZGRyZXNzKCkgPj0gb3RoZXIubWF4QWRkcmVzcygpKSAmJlxuICAgICAgKHRoaXMubWluQWRkcmVzcygpIDw9IG90aGVyLm1pbkFkZHJlc3MoKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHR3byBJUHY0IGFkZHJlc3MgcmFuZ2VzIG92ZXJsYXAuXG4gICAqXG4gICAqIEBwYXJhbSByYW5nZTEgVGhlIGZpcnN0IElQIGFkZHJlc3MgcmFuZ2UgcmVwcmVzZW50ZWQgYXMgYW4gYXJyYXkgW3N0YXJ0LCBlbmRdLlxuICAgKiBAcGFyYW0gcmFuZ2UyIFRoZSBzZWNvbmQgSVAgYWRkcmVzcyByYW5nZSByZXByZXNlbnRlZCBhcyBhbiBhcnJheSBbc3RhcnQsIGVuZF0uXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHR3byBJUCBhZGRyZXNzIHJhbmdlcyBvdmVybGFwLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqXG4gICAqIE5vdGU6IFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCB0aGUgc3RhcnQgYW5kIGVuZCBhZGRyZXNzZXMgYXJlIHZhbGlkIElQdjQgYWRkcmVzc2VzLlxuICAgKi9cbiAgcHVibGljIHJhbmdlc092ZXJsYXAocmFuZ2UxOiBbc3RyaW5nLCBzdHJpbmddLCByYW5nZTI6IFtzdHJpbmcsIHN0cmluZ10pOiBib29sZWFuIHtcbiAgICBjb25zdCBbc3RhcnQxLCBlbmQxXSA9IHJhbmdlMS5tYXAoaXAgPT4gTmV0d29ya1V0aWxzLmlwVG9OdW0oaXApKTtcbiAgICBjb25zdCBbc3RhcnQyLCBlbmQyXSA9IHJhbmdlMi5tYXAoaXAgPT4gTmV0d29ya1V0aWxzLmlwVG9OdW0oaXApKTtcbiAgICAvLyBDaGVjayBpZiByYW5nZXMgb3ZlcmxhcFxuICAgIHJldHVybiBzdGFydDEgPD0gZW5kMiAmJiBzdGFydDIgPD0gZW5kMTtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHdpdGggaGVscGVyIGZ1bmN0aW9ucyB0byBzdXBwb3J0XG4gKiBTdWJuZXQgSXB2NiBBZGRyZXNzIFZhbGlkYXRpb25cbiAqXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCBJUHY2IENJRFIgYmxvY2tzLCBpbmNsdWRpbmcgY2FsY3VsYXRpbmcgdGhlIG1pbmltdW0gYW5kIG1heGltdW1cbiAqIElQIGFkZHJlc3NlcyBpbiBhIENJRFIgYmxvY2ssIGFuZCBjaGVja2luZyBpZiB0d28gQ0lEUiBibG9ja3Mgb3ZlcmxhcC5cbiAqL1xuZXhwb3J0IGNsYXNzIENpZHJCbG9ja0lwdjYge1xuICAvKipcbiAgICogSXB2NiBDSURSIHJhbmdlXG4gICAqL1xuICBwdWJsaWMgY2lkcjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIENJRFIgcHJlZml4IGxlbmd0aCAobnVtYmVyIG9mIGJpdHMgdXNlZCBmb3IgdGhlIG5ldHdvcmsgcG9ydGlvbiBvZiB0aGUgYWRkcmVzcykuXG4gICAqL1xuICBwdWJsaWMgY2lkclByZWZpeDogbnVtYmVyO1xuICBwcml2YXRlIGlwUGFydHM6IGJpZ2ludFtdO1xuICBwcml2YXRlIG5ldHdvcmtCaXRzOiBudW1iZXI7XG4gIHByaXZhdGUgbmV0d29ya1BhcnQ6IGJpZ2ludFtdO1xuXG4gIGNvbnN0cnVjdG9yKGNpZHI6IHN0cmluZykge1xuICAgIHRoaXMuY2lkciA9IGNpZHI7XG4gICAgY29uc3QgW2lwQWRkcmVzcywgcHJlZml4XSA9IGNpZHIuc3BsaXQoJy8nKTtcbiAgICB0aGlzLmNpZHJQcmVmaXggPSBwYXJzZUludChwcmVmaXgsIDEwKTtcbiAgICB0aGlzLmlwUGFydHMgPSB0aGlzLnBhcnNlQmlnSW50UGFydHMoaXBBZGRyZXNzKTtcbiAgICB0aGlzLm5ldHdvcmtCaXRzID0gdGhpcy5jaWRyUHJlZml4O1xuICAgIHRoaXMubmV0d29ya1BhcnQgPSB0aGlzLmlwUGFydHMuc2xpY2UoMCwgTWF0aC5jZWlsKHRoaXMubmV0d29ya0JpdHMgLyAxNikpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUJpZ0ludFBhcnRzKGlwQWRkcmVzczogc3RyaW5nKTogYmlnaW50W10ge1xuICAgIHJldHVybiBpcEFkZHJlc3Muc3BsaXQoJzonKS5tYXAoKHBhcnQpID0+IEJpZ0ludChgMHgke3BhcnQucGFkU3RhcnQoNCwgJzAnKX1gIHx8ICcwJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIE1pbmltdW0gSVB2NiBhZGRyZXNzIGZvciBhIHByb3ZpZGVkIENJRFJcbiAgICovXG4gIHB1YmxpYyBtaW5JcCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0YXJ0SVAgPSBbLi4udGhpcy5uZXR3b3JrUGFydF07XG4gICAgZm9yIChsZXQgaSA9IHRoaXMubmV0d29ya1BhcnQubGVuZ3RoOyBpIDwgODsgaSsrKSB7XG4gICAgICBzdGFydElQLnB1c2goQmlnSW50KDApKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXJ0SVAubWFwKHRoaXMuZm9ybWF0SVB2NlBhcnQpLmpvaW4oJzonKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBtYXhpbXVtIElQdjYgYWRkcmVzcyBpbiB0aGUgQ0lEUiBibG9ja1xuICAgKiBAcmV0dXJucyBUaGUgbWF4aW11bSBJUHY2IGFkZHJlc3MgYXMgYSBzdHJpbmdcbiAgICovXG4gIHB1YmxpYyBtYXhJcCgpOiBzdHJpbmcge1xuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSBob3cgbWFueSAxNi1iaXQgYmxvY2tzIGFyZSBuZWVkZWQgZm9yIHRoZSBuZXR3b3JrIHBvcnRpb25cbiAgICAgKiBlLmcuIGZvciAvNTYsIG5ldHdvcmtQYXJ0TGVuZ3RoID0gY2VpbCg1Ni8xNikgPSA0IGJsb2Nrc1xuICAgICAqL1xuICAgIGNvbnN0IG5ldHdvcmtQYXJ0TGVuZ3RoID0gTWF0aC5jZWlsKHRoaXMuY2lkclByZWZpeCAvIDE2KTtcbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgcmVtYWluaW5nIGJpdHMgaW4gbGFzdCBuZXR3b3JrIGJsb2NrXG4gICAgICogZS5nLiBmb3IgLzU2LCByZW1haW5pbmdCaXRzID0gNTYgJSAxNiA9IDggYml0c1xuICAgICAqL1xuICAgIGNvbnN0IHJlbWFpbmluZ0JpdHMgPSB0aGlzLmNpZHJQcmVmaXggJSAxNjtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgY29weSBvZiBuZXR3b3JrIHBvcnRpb24gb2YgYWRkcmVzc1xuICAgICAqIGUuZy4gWzIwMDEsIGRiOCwgMCwgMF0gZm9yIDIwMDE6ZGI4OjovNTZcbiAgICAgKi9cbiAgICBjb25zdCBlbmRJUCA9IFsuLi50aGlzLm5ldHdvcmtQYXJ0XTtcblxuICAgIC8qKlxuICAgICAqIElmIHRoZXJlIGFyZSByZW1haW5pbmcgYml0cyBpbiBsYXN0IG5ldHdvcmsgYmxvY2ssXG4gICAgICogY3JlYXRlIGFwcHJvcHJpYXRlIGJpdG1hc2sgYW5kIGFwcGx5IHRvIGxhc3QgbmV0d29yayBibG9ja1xuICAgICAqIGUuZy4gZm9yIC81NjogbWFzayA9ICgxIDw8ICgxNi04KSkgLSAxID0gMHgwMEZGXG4gICAgICovXG4gICAgaWYgKHJlbWFpbmluZ0JpdHMgPiAwKSB7XG4gICAgICBjb25zdCBsYXN0TmV0d29ya0luZGV4ID0gbmV0d29ya1BhcnRMZW5ndGggLSAxO1xuICAgICAgY29uc3QgbWFzayA9IChCaWdJbnQoMSkgPDwgQmlnSW50KDE2IC0gcmVtYWluaW5nQml0cykpIC0gQmlnSW50KDEpO1xuICAgICAgLyoqXG4gICAgICAgKiBBcHBseSBiaXRtYXNrIHRvIGxhc3QgbmV0d29yayBibG9jayB1c2luZyBiaXR3aXNlIE9SXG4gICAgICAgKiBlLmcuIGlmIGxhc3ROZXR3b3JrSW5kZXg9MyBhbmQgbWFzaz0weDAwRkY6XG4gICAgICAgKiBuZXR3b3JrUGFydFszXT0weDAwMDAgfCAweDAwRkYgPSAweDAwRkZcbiAgICAgICAqL1xuICAgICAgZW5kSVBbbGFzdE5ldHdvcmtJbmRleF0gPSB0aGlzLm5ldHdvcmtQYXJ0W2xhc3ROZXR3b3JrSW5kZXhdIHwgbWFzaztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWxsIHJlbWFpbmluZyBibG9ja3Mgd2l0aCBtYXhpbXVtIHZhbHVlIDB4RkZGRlxuICAgICAqIGUuZy4gWzIwMDEsIGRiOCwgMCwgZmYsIGZmZmYsIGZmZmYsIGZmZmYsIGZmZmZdXG4gICAgICovXG4gICAgZm9yIChsZXQgaSA9IG5ldHdvcmtQYXJ0TGVuZ3RoOyBpIDwgODsgaSsrKSB7XG4gICAgICBlbmRJUC5wdXNoKEJpZ0ludCgnMHhmZmZmJykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgYmxvY2tzIHRvIGhleCBzdHJpbmdzIGFuZCBqb2luIHdpdGggY29sb25zXG4gICAgICogZS5nLiAyMDAxOmRiODowOmZmOmZmZmY6ZmZmZjpmZmZmOmZmZmZcbiAgICAgKi9cbiAgICByZXR1cm4gZW5kSVAubWFwKHRoaXMuZm9ybWF0SVB2NlBhcnQpLmpvaW4oJzonKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0SVB2NlBhcnQgPSAocGFydDogYmlnaW50KSA9PiBwYXJ0LnRvU3RyaW5nKDE2KS5wYWRTdGFydCg0LCAnMCcpO1xuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcmFuZ2UxIElwdjYgQ0lEUiByYW5nZSB0byBjb21wYXJlXG4gICAqIEBwYXJhbSByYW5nZTIgSXB2NiBDSURSIHJhbmdlIHRvIGNvbXBhcmVcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0d28gcmFuZ2VzIG92ZXJsYXAsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgcHVibGljIHJhbmdlc092ZXJsYXAocmFuZ2UxOiBzdHJpbmcsIHJhbmdlMjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gQ3JlYXRlIG5ldyBDaWRyQmxvY2tJcHY2IGluc3RhbmNlcyBmb3IgYm90aCByYW5nZXNcbiAgICBjb25zdCBjaWRyMSA9IG5ldyBDaWRyQmxvY2tJcHY2KHJhbmdlMSk7XG4gICAgY29uc3QgY2lkcjIgPSBuZXcgQ2lkckJsb2NrSXB2NihyYW5nZTIpO1xuXG4gICAgLy8gQ29udmVydCBtaW4gYW5kIG1heCBJUHMgdG8gbnVtZXJpYyB2YWx1ZXMgZm9yIGNvbXBhcmlzb25cbiAgICBjb25zdCBzdGFydDEgPSB0aGlzLmlwdjZUb051bWJlcihjaWRyMS5taW5JcCgpKTtcbiAgICBjb25zdCBlbmQxID0gdGhpcy5pcHY2VG9OdW1iZXIoY2lkcjEubWF4SXAoKSk7XG4gICAgY29uc3Qgc3RhcnQyID0gdGhpcy5pcHY2VG9OdW1iZXIoY2lkcjIubWluSXAoKSk7XG4gICAgY29uc3QgZW5kMiA9IHRoaXMuaXB2NlRvTnVtYmVyKGNpZHIyLm1heElwKCkpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIG92ZXJsYXBcbiAgICByZXR1cm4gKHN0YXJ0MSA8PSBlbmQyKSAmJiAoc3RhcnQyIDw9IGVuZDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIENvbnZlcnRzIGdpdmVuIGlwdjYgYWRkcmVzcyByYW5nZSB0byBiaWcgaW50IG51bWJlclxuICAgKi9cbiAgcHJpdmF0ZSBpcHY2VG9OdW1iZXIoaXB2NkFkZHJlc3M6IHN0cmluZyk6IGJpZ2ludCB7XG4gICAgY29uc3QgYmxvY2tzID0gdGhpcy5wYXJzZUJpZ0ludFBhcnRzKGlwdjZBZGRyZXNzKTtcbiAgICBsZXQgaXB2Nk51bWJlciA9IEJpZ0ludCgwKTtcbiAgICBmb3IgKGNvbnN0IGJsb2NrIG9mIGJsb2Nrcykge1xuICAgICAgLyogdHNsaW50OmRpc2FibGU6bm8tYml0d2lzZSAqL1xuICAgICAgaXB2Nk51bWJlciA9IChpcHY2TnVtYmVyIDw8IEJpZ0ludCgxNikpICsgYmxvY2s7XG4gICAgfVxuICAgIHJldHVybiBpcHY2TnVtYmVyO1xuICB9XG59XG4iXX0=
|