@aws-cdk/aws-ec2-alpha 2.218.0-alpha.0 → 2.220.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 +3 -3
- package/.jsii.tabl.json.gz +0 -0
- package/lib/ipam.js +291 -155
- package/lib/route.js +647 -371
- package/lib/subnet-v2.js +249 -177
- package/lib/transit-gateway-route-table-association.js +78 -33
- package/lib/transit-gateway-route-table-propagation.js +78 -33
- package/lib/transit-gateway-route-table.js +79 -33
- package/lib/transit-gateway-route.js +127 -64
- package/lib/transit-gateway-vpc-attachment.js +126 -80
- package/lib/transit-gateway.js +135 -52
- package/lib/util.js +29 -2
- package/lib/vpc-v2-base.js +40 -30
- package/lib/vpc-v2.js +370 -220
- package/package.json +9 -8
package/lib/subnet-v2.js
CHANGED
|
@@ -1,11 +1,38 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
3
|
+
var useValue = arguments.length > 2;
|
|
4
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
5
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
6
|
+
}
|
|
7
|
+
return useValue ? value : void 0;
|
|
8
|
+
};
|
|
9
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
10
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
11
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
12
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
13
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
14
|
+
var _, done = false;
|
|
15
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
16
|
+
var context = {};
|
|
17
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
18
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
19
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
20
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
21
|
+
if (kind === "accessor") {
|
|
22
|
+
if (result === void 0) continue;
|
|
23
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
24
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
25
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
26
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
27
|
+
}
|
|
28
|
+
else if (_ = accept(result)) {
|
|
29
|
+
if (kind === "field") initializers.unshift(_);
|
|
30
|
+
else descriptor[key] = _;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
34
|
+
done = true;
|
|
7
35
|
};
|
|
8
|
-
var _a, _b;
|
|
9
36
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
37
|
exports.SubnetV2 = exports.IpCidr = void 0;
|
|
11
38
|
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
|
|
@@ -21,13 +48,17 @@ const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
|
|
|
21
48
|
* IPv4 or IPv6 CIDR range for the subnet
|
|
22
49
|
*/
|
|
23
50
|
class IpCidr {
|
|
51
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-ec2-alpha.IpCidr", version: "2.220.0-alpha.0" };
|
|
52
|
+
/**
|
|
53
|
+
* IPv6 CIDR range for the subnet
|
|
54
|
+
* Allowed only if IPv6 is enabled on VPc
|
|
55
|
+
*/
|
|
56
|
+
cidr;
|
|
24
57
|
constructor(props) {
|
|
25
58
|
this.cidr = props;
|
|
26
59
|
}
|
|
27
60
|
}
|
|
28
61
|
exports.IpCidr = IpCidr;
|
|
29
|
-
_a = JSII_RTTI_SYMBOL_1;
|
|
30
|
-
IpCidr[_a] = { fqn: "@aws-cdk/aws-ec2-alpha.IpCidr", version: "2.218.0-alpha.0" };
|
|
31
62
|
/**
|
|
32
63
|
* VPC Name tag constant
|
|
33
64
|
*/
|
|
@@ -47,215 +78,256 @@ const SUBNETNAME_TAG = 'aws-cdk:subnet-name';
|
|
|
47
78
|
* @resource AWS::EC2::Subnet
|
|
48
79
|
*
|
|
49
80
|
*/
|
|
50
|
-
let SubnetV2 =
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
81
|
+
let SubnetV2 = (() => {
|
|
82
|
+
let _classDecorators = [prop_injectable_1.propertyInjectable];
|
|
83
|
+
let _classDescriptor;
|
|
84
|
+
let _classExtraInitializers = [];
|
|
85
|
+
let _classThis;
|
|
86
|
+
let _classSuper = aws_cdk_lib_1.Resource;
|
|
87
|
+
let _instanceExtraInitializers = [];
|
|
88
|
+
let _associateNetworkAcl_decorators;
|
|
89
|
+
var SubnetV2 = class extends _classSuper {
|
|
90
|
+
static { _classThis = this; }
|
|
91
|
+
static {
|
|
92
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
93
|
+
_associateNetworkAcl_decorators = [(0, metadata_resource_1.MethodMetadata)()];
|
|
94
|
+
__esDecorate(this, null, _associateNetworkAcl_decorators, { kind: "method", name: "associateNetworkAcl", static: false, private: false, access: { has: obj => "associateNetworkAcl" in obj, get: obj => obj.associateNetworkAcl }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
95
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
96
|
+
SubnetV2 = _classThis = _classDescriptor.value;
|
|
97
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
63
98
|
}
|
|
99
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-ec2-alpha.SubnetV2", version: "2.220.0-alpha.0" };
|
|
100
|
+
/** Uniquely identifies this class. */
|
|
101
|
+
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-ec2-alpha.SubnetV2';
|
|
64
102
|
/**
|
|
65
|
-
*
|
|
66
|
-
* @resource AWS::EC2::Subnet
|
|
103
|
+
* Import an existing subnet to the VPC
|
|
67
104
|
*/
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
105
|
+
static fromSubnetV2Attributes(scope, id, attrs) {
|
|
106
|
+
try {
|
|
107
|
+
jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_SubnetV2Attributes(attrs);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
111
|
+
Error.captureStackTrace(error, this.fromSubnetV2Attributes);
|
|
112
|
+
}
|
|
113
|
+
throw error;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Class to define an import for an existing subnet
|
|
117
|
+
* @resource AWS::EC2::Subnet
|
|
118
|
+
*/
|
|
119
|
+
class ImportedSubnetV2 extends aws_cdk_lib_1.Resource {
|
|
71
120
|
/**
|
|
72
121
|
* The IPv6 CIDR Block assigned to this subnet
|
|
73
122
|
*/
|
|
74
|
-
|
|
123
|
+
ipv6CidrBlock = attrs.ipv6CidrBlock;
|
|
75
124
|
/**
|
|
76
125
|
* The type of subnet (eg. public or private) that this subnet represents.
|
|
77
126
|
*/
|
|
78
|
-
|
|
127
|
+
subnetType = attrs.subnetType;
|
|
79
128
|
/**
|
|
80
129
|
* The Availability Zone in which subnet is located
|
|
81
130
|
*/
|
|
82
|
-
|
|
131
|
+
availabilityZone = attrs.availabilityZone;
|
|
83
132
|
/**
|
|
84
133
|
* The subnetId for this particular subnet
|
|
85
134
|
* Refers to the physical ID created
|
|
86
135
|
*/
|
|
87
|
-
|
|
136
|
+
subnetId = attrs.subnetId;
|
|
88
137
|
/**
|
|
89
138
|
* Dependable that can be depended upon to force internet connectivity established on the VPC
|
|
90
139
|
*/
|
|
91
|
-
|
|
140
|
+
internetConnectivityEstablished = new constructs_1.DependencyGroup();
|
|
92
141
|
/**
|
|
93
142
|
* The IPv4 CIDR block assigned to this subnet
|
|
94
143
|
*/
|
|
95
|
-
|
|
144
|
+
ipv4CidrBlock = attrs.ipv4CidrBlock;
|
|
96
145
|
/**
|
|
97
146
|
* Current route table associated with this subnet
|
|
98
147
|
*/
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
}
|
|
148
|
+
routeTable = { routeTableId: attrs.routeTableId };
|
|
149
|
+
get subnetRef() {
|
|
150
|
+
return {
|
|
151
|
+
subnetId: this.subnetId,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Associate a Network ACL with this subnet
|
|
156
|
+
* Required here since it is implemented in the ISubnetV2
|
|
157
|
+
*/
|
|
158
|
+
associateNetworkAcl(aclId, networkAcl) {
|
|
159
|
+
const aclScope = networkAcl instanceof constructs_1.Construct ? networkAcl : this;
|
|
160
|
+
const other = networkAcl instanceof constructs_1.Construct ? this : networkAcl;
|
|
161
|
+
new aws_ec2_1.SubnetNetworkAclAssociation(aclScope, aclId + aws_cdk_lib_1.Names.nodeUniqueId(other.node), {
|
|
162
|
+
networkAcl,
|
|
163
|
+
subnet: this,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
117
166
|
}
|
|
167
|
+
return new ImportedSubnetV2(scope, id);
|
|
118
168
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
super(scope, id, {
|
|
134
|
-
physicalName: props.subnetName ?? aws_cdk_lib_1.Lazy.string({
|
|
135
|
-
produce: () => aws_cdk_lib_1.Names.uniqueResourceName(this, { maxLength: 128, allowedSpecialCharacters: '_' }),
|
|
136
|
-
}),
|
|
137
|
-
});
|
|
169
|
+
/**
|
|
170
|
+
* The Availability Zone the subnet is located in
|
|
171
|
+
*/
|
|
172
|
+
availabilityZone = __runInitializers(this, _instanceExtraInitializers);
|
|
173
|
+
/**
|
|
174
|
+
* The subnetId for this particular subnet
|
|
175
|
+
* @attribute
|
|
176
|
+
*/
|
|
177
|
+
subnetId;
|
|
178
|
+
/**
|
|
179
|
+
* Dependencies for internet connectivity
|
|
180
|
+
* This Property exposes the RouteTable-Subnet association so that other resources can depend on it.
|
|
181
|
+
*/
|
|
182
|
+
internetConnectivityEstablished;
|
|
138
183
|
/**
|
|
139
184
|
* The variable name `internetConnectivityEstablished` does not reflect what it actually is.
|
|
140
185
|
* The naming is enforced by ISubnet. We need to keep it to maintain compatibility.
|
|
141
186
|
* It exposes the RouteTable-Subnet association so that other resources can depend on it.
|
|
142
187
|
* E.g. Resources in a subnet, when being deleted, may need the RouteTable to exist in order to delete properly
|
|
143
188
|
*/
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
189
|
+
_internetConnectivityEstablished = new constructs_1.DependencyGroup();
|
|
190
|
+
/**
|
|
191
|
+
* The IPv4 CIDR block for this subnet
|
|
192
|
+
*/
|
|
193
|
+
ipv4CidrBlock;
|
|
194
|
+
/**
|
|
195
|
+
* The IPv6 CIDR Block for this subnet
|
|
196
|
+
*/
|
|
197
|
+
ipv6CidrBlock;
|
|
198
|
+
get subnetRef() {
|
|
199
|
+
return {
|
|
200
|
+
subnetId: this.subnetId,
|
|
201
|
+
};
|
|
147
202
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
203
|
+
/**
|
|
204
|
+
* The type of subnet (public or private) that this subnet represents.
|
|
205
|
+
* @attribute SubnetType
|
|
206
|
+
*/
|
|
207
|
+
subnetType;
|
|
208
|
+
_networkAcl;
|
|
209
|
+
_routeTable;
|
|
210
|
+
/**
|
|
211
|
+
* Constructs a new SubnetV2 instance.
|
|
212
|
+
* @param scope The parent Construct that this resource will be part of.
|
|
213
|
+
* @param id The unique identifier for this resource.
|
|
214
|
+
* @param props The configuration properties for the subnet.
|
|
215
|
+
*/
|
|
216
|
+
constructor(scope, id, props) {
|
|
217
|
+
super(scope, id, {
|
|
218
|
+
physicalName: props.subnetName ?? aws_cdk_lib_1.Lazy.string({
|
|
219
|
+
produce: () => aws_cdk_lib_1.Names.uniqueResourceName(this, { maxLength: 128, allowedSpecialCharacters: '_' }),
|
|
220
|
+
}),
|
|
221
|
+
});
|
|
222
|
+
try {
|
|
223
|
+
jsiiDeprecationWarnings._aws_cdk_aws_ec2_alpha_SubnetV2Props(props);
|
|
151
224
|
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
225
|
+
catch (error) {
|
|
226
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
227
|
+
Error.captureStackTrace(error, SubnetV2);
|
|
228
|
+
}
|
|
229
|
+
throw error;
|
|
230
|
+
}
|
|
231
|
+
// Enhanced CDK Analytics Telemetry
|
|
232
|
+
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
233
|
+
const ipv4CidrBlock = props.ipv4CidrBlock.cidr;
|
|
234
|
+
const ipv6CidrBlock = props.ipv6CidrBlock?.cidr;
|
|
235
|
+
if (!checkCidrRanges(props.vpc, props.ipv4CidrBlock.cidr)) {
|
|
236
|
+
throw new aws_cdk_lib_1.ValidationError('CIDR block should be within the range of VPC', this);
|
|
237
|
+
}
|
|
238
|
+
let overlap = false;
|
|
239
|
+
let overlapIpv6 = false;
|
|
240
|
+
if (!aws_cdk_lib_1.Token.isUnresolved(props.ipv4CidrBlock)) {
|
|
241
|
+
overlap = validateOverlappingCidrRanges(props.vpc, props.ipv4CidrBlock.cidr);
|
|
242
|
+
}
|
|
243
|
+
// check whether VPC supports ipv6
|
|
244
|
+
if (props.ipv6CidrBlock?.cidr && !aws_cdk_lib_1.Token.isUnresolved(props.ipv6CidrBlock?.cidr)) {
|
|
245
|
+
validateSupportIpv6(props.vpc);
|
|
246
|
+
overlapIpv6 = validateOverlappingCidrRangesipv6(props.vpc, props.ipv6CidrBlock?.cidr);
|
|
247
|
+
}
|
|
248
|
+
if (overlap || overlapIpv6) {
|
|
249
|
+
throw new aws_cdk_lib_1.ValidationError('CIDR block should not overlap with existing subnet blocks', this);
|
|
250
|
+
}
|
|
251
|
+
if (props.assignIpv6AddressOnCreation && !props.ipv6CidrBlock) {
|
|
252
|
+
throw new aws_cdk_lib_1.ValidationError('IPv6 CIDR block is required when assigning IPv6 address on creation', this);
|
|
253
|
+
}
|
|
254
|
+
if (props.mapPublicIpOnLaunch === true && props.subnetType !== aws_ec2_1.SubnetType.PUBLIC) {
|
|
255
|
+
throw new aws_cdk_lib_1.ValidationError('mapPublicIpOnLaunch can only be set to true for public subnets', this);
|
|
256
|
+
}
|
|
257
|
+
const subnet = new aws_ec2_1.CfnSubnet(this, 'Subnet', {
|
|
258
|
+
vpcId: props.vpc.vpcId,
|
|
259
|
+
cidrBlock: ipv4CidrBlock,
|
|
260
|
+
ipv6CidrBlock: ipv6CidrBlock,
|
|
261
|
+
availabilityZone: props.availabilityZone,
|
|
262
|
+
assignIpv6AddressOnCreation: props.assignIpv6AddressOnCreation,
|
|
263
|
+
mapPublicIpOnLaunch: props.mapPublicIpOnLaunch,
|
|
264
|
+
});
|
|
265
|
+
this.node.defaultChild = subnet;
|
|
266
|
+
this.ipv4CidrBlock = props.ipv4CidrBlock.cidr;
|
|
267
|
+
this.ipv6CidrBlock = props.ipv6CidrBlock?.cidr;
|
|
268
|
+
this.subnetId = subnet.ref;
|
|
269
|
+
this.availabilityZone = props.availabilityZone;
|
|
270
|
+
this._networkAcl = aws_ec2_1.NetworkAcl.fromNetworkAclId(this, 'Acl', subnet.attrNetworkAclAssociationId);
|
|
271
|
+
const includeResourceTypes = [aws_ec2_1.CfnSubnet.CFN_RESOURCE_TYPE_NAME];
|
|
272
|
+
if (props.subnetName) {
|
|
273
|
+
aws_cdk_lib_1.Tags.of(subnet).add(SUBNETNAME_TAG, props.subnetName);
|
|
274
|
+
}
|
|
275
|
+
const subnetTypeName = (0, util_1.defaultSubnetName)(props.subnetType) ?? 'undefined';
|
|
276
|
+
aws_cdk_lib_1.Tags.of(subnet).add(SUBNETTYPE_TAG, subnetTypeName, { includeResourceTypes });
|
|
277
|
+
if (props.routeTable) {
|
|
278
|
+
this._routeTable = props.routeTable;
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
// Assigning a default route table
|
|
282
|
+
this._routeTable = new route_1.RouteTable(this, 'RouteTable', {
|
|
283
|
+
vpc: props.vpc,
|
|
284
|
+
routeTableName: props.defaultRouteTableName ?? 'DefaultCDKRouteTable',
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
const routeAssoc = new aws_ec2_1.CfnSubnetRouteTableAssociation(this, 'RouteTableAssociation', {
|
|
288
|
+
subnetId: this.subnetId,
|
|
289
|
+
routeTableId: this.routeTable.routeTableId,
|
|
290
|
+
});
|
|
291
|
+
this._internetConnectivityEstablished.add(routeAssoc);
|
|
292
|
+
this.internetConnectivityEstablished = this._internetConnectivityEstablished;
|
|
293
|
+
this.subnetType = props.subnetType;
|
|
294
|
+
storeSubnetToVpcByType(props.vpc, this, props.subnetType);
|
|
176
295
|
}
|
|
177
|
-
|
|
178
|
-
|
|
296
|
+
/**
|
|
297
|
+
* Associate a Network ACL with this subnet
|
|
298
|
+
*
|
|
299
|
+
* @param id The unique identifier for this association.
|
|
300
|
+
* @param networkAcl The Network ACL to associate with this subnet.
|
|
301
|
+
* This allows controlling inbound and outbound traffic for instances in this subnet.
|
|
302
|
+
*/
|
|
303
|
+
associateNetworkAcl(id, networkAcl) {
|
|
304
|
+
this._networkAcl = networkAcl;
|
|
305
|
+
const scope = networkAcl instanceof constructs_1.Construct ? networkAcl : this;
|
|
306
|
+
const other = networkAcl instanceof constructs_1.Construct ? this : networkAcl;
|
|
307
|
+
new aws_ec2_1.SubnetNetworkAclAssociation(scope, id + aws_cdk_lib_1.Names.nodeUniqueId(other.node), {
|
|
308
|
+
networkAcl,
|
|
309
|
+
subnet: this,
|
|
310
|
+
});
|
|
179
311
|
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
assignIpv6AddressOnCreation: props.assignIpv6AddressOnCreation,
|
|
186
|
-
mapPublicIpOnLaunch: props.mapPublicIpOnLaunch,
|
|
187
|
-
});
|
|
188
|
-
this.node.defaultChild = subnet;
|
|
189
|
-
this.ipv4CidrBlock = props.ipv4CidrBlock.cidr;
|
|
190
|
-
this.ipv6CidrBlock = props.ipv6CidrBlock?.cidr;
|
|
191
|
-
this.subnetId = subnet.ref;
|
|
192
|
-
this.availabilityZone = props.availabilityZone;
|
|
193
|
-
this._networkAcl = aws_ec2_1.NetworkAcl.fromNetworkAclId(this, 'Acl', subnet.attrNetworkAclAssociationId);
|
|
194
|
-
const includeResourceTypes = [aws_ec2_1.CfnSubnet.CFN_RESOURCE_TYPE_NAME];
|
|
195
|
-
if (props.subnetName) {
|
|
196
|
-
aws_cdk_lib_1.Tags.of(subnet).add(SUBNETNAME_TAG, props.subnetName);
|
|
312
|
+
/**
|
|
313
|
+
* Return the Route Table associated with this subnet
|
|
314
|
+
*/
|
|
315
|
+
get routeTable() {
|
|
316
|
+
return this._routeTable;
|
|
197
317
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
318
|
+
/**
|
|
319
|
+
* Returns the Network ACL associated with this subnet.
|
|
320
|
+
*/
|
|
321
|
+
get networkAcl() {
|
|
322
|
+
return this._networkAcl;
|
|
202
323
|
}
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
this._routeTable = new route_1.RouteTable(this, 'RouteTable', {
|
|
206
|
-
vpc: props.vpc,
|
|
207
|
-
routeTableName: props.defaultRouteTableName ?? 'DefaultCDKRouteTable',
|
|
208
|
-
});
|
|
324
|
+
static {
|
|
325
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
209
326
|
}
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
});
|
|
214
|
-
this._internetConnectivityEstablished.add(routeAssoc);
|
|
215
|
-
this.internetConnectivityEstablished = this._internetConnectivityEstablished;
|
|
216
|
-
this.subnetType = props.subnetType;
|
|
217
|
-
storeSubnetToVpcByType(props.vpc, this, props.subnetType);
|
|
218
|
-
}
|
|
219
|
-
/**
|
|
220
|
-
* Associate a Network ACL with this subnet
|
|
221
|
-
*
|
|
222
|
-
* @param id The unique identifier for this association.
|
|
223
|
-
* @param networkAcl The Network ACL to associate with this subnet.
|
|
224
|
-
* This allows controlling inbound and outbound traffic for instances in this subnet.
|
|
225
|
-
*/
|
|
226
|
-
associateNetworkAcl(id, networkAcl) {
|
|
227
|
-
this._networkAcl = networkAcl;
|
|
228
|
-
const scope = networkAcl instanceof constructs_1.Construct ? networkAcl : this;
|
|
229
|
-
const other = networkAcl instanceof constructs_1.Construct ? this : networkAcl;
|
|
230
|
-
new aws_ec2_1.SubnetNetworkAclAssociation(scope, id + aws_cdk_lib_1.Names.nodeUniqueId(other.node), {
|
|
231
|
-
networkAcl,
|
|
232
|
-
subnet: this,
|
|
233
|
-
});
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* Return the Route Table associated with this subnet
|
|
237
|
-
*/
|
|
238
|
-
get routeTable() {
|
|
239
|
-
return this._routeTable;
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Returns the Network ACL associated with this subnet.
|
|
243
|
-
*/
|
|
244
|
-
get networkAcl() {
|
|
245
|
-
return this._networkAcl;
|
|
246
|
-
}
|
|
247
|
-
};
|
|
327
|
+
};
|
|
328
|
+
return SubnetV2 = _classThis;
|
|
329
|
+
})();
|
|
248
330
|
exports.SubnetV2 = SubnetV2;
|
|
249
|
-
_b = JSII_RTTI_SYMBOL_1;
|
|
250
|
-
SubnetV2[_b] = { fqn: "@aws-cdk/aws-ec2-alpha.SubnetV2", version: "2.218.0-alpha.0" };
|
|
251
|
-
/** Uniquely identifies this class. */
|
|
252
|
-
SubnetV2.PROPERTY_INJECTION_ID = '@aws-cdk.aws-ec2-alpha.SubnetV2';
|
|
253
|
-
__decorate([
|
|
254
|
-
(0, metadata_resource_1.MethodMetadata)()
|
|
255
|
-
], SubnetV2.prototype, "associateNetworkAcl", null);
|
|
256
|
-
exports.SubnetV2 = SubnetV2 = __decorate([
|
|
257
|
-
prop_injectable_1.propertyInjectable
|
|
258
|
-
], SubnetV2);
|
|
259
331
|
const subnetTypeMap = {
|
|
260
332
|
[aws_ec2_1.SubnetType.PRIVATE_ISOLATED]: (vpc, subnet) => vpc.isolatedSubnets.push(subnet),
|
|
261
333
|
[aws_ec2_1.SubnetType.PUBLIC]: (vpc, subnet) => vpc.publicSubnets.push(subnet),
|
|
@@ -410,4 +482,4 @@ function validateOverlappingCidrRangesipv6(vpc, ipv6CidrBlock) {
|
|
|
410
482
|
}
|
|
411
483
|
return result;
|
|
412
484
|
}
|
|
413
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VibmV0LXYyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3VibmV0LXYyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLDZDQUEyRztBQUMzRyxpREFTNkI7QUFDN0IsMkNBQXFFO0FBRXJFLGlDQUFxRTtBQUNyRSxtQ0FBcUM7QUFDckMsOEVBQThGO0FBQzlGLDBFQUEwRTtBQVUxRTs7R0FFRztBQUNILE1BQWEsTUFBTTtJQU1qQixZQUFZLEtBQWE7UUFDdkIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7S0FDbkI7O0FBUkgsd0JBU0M7OztBQUVEOztHQUVHO0FBQ0gsTUFBTSxjQUFjLEdBQUcscUJBQXFCLENBQUM7QUFFN0M7O0dBRUc7QUFDSCxNQUFNLGNBQWMsR0FBRyxxQkFBcUIsQ0FBQztBQWlHN0M7Ozs7Ozs7Ozs7R0FVRztBQUVJLElBQU0sUUFBUSxHQUFkLE1BQU0sUUFBUyxTQUFRLHNCQUFRO0lBSXBDOztPQUVHO0lBQ0ksTUFBTSxDQUFDLHNCQUFzQixDQUFDLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXlCOzs7Ozs7Ozs7O1FBQzFGOzs7V0FHRztRQUNILE1BQU0sZ0JBQWlCLFNBQVEsc0JBQVE7WUFBdkM7O2dCQUNFOzttQkFFRztnQkFDYSxrQkFBYSxHQUFZLEtBQUssQ0FBQyxhQUFhLENBQUM7Z0JBRTdEOzttQkFFRztnQkFDYSxlQUFVLEdBQWdCLEtBQUssQ0FBQyxVQUFVLENBQUM7Z0JBRTNEOzttQkFFRztnQkFDYSxxQkFBZ0IsR0FBVyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7Z0JBRWxFOzs7bUJBR0c7Z0JBQ2EsYUFBUSxHQUFXLEtBQUssQ0FBQyxRQUFRLENBQUM7Z0JBRWxEOzttQkFFRztnQkFDYSxvQ0FBK0IsR0FBZ0IsSUFBSSw0QkFBZSxFQUFFLENBQUM7Z0JBRXJGOzttQkFFRztnQkFDYSxrQkFBYSxHQUFXLEtBQUssQ0FBQyxhQUFhLENBQUM7Z0JBRTVEOzttQkFFRztn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RXBELElBQUksTUFBTSxHQUFhLEtBQUssQ0FBQztJQUU3QixLQUFLLE1BQU0sTUFBTSxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLElBQUksTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sU0FBUyxHQUFHLElBQUksb0JBQWEsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDMUQsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzVCLElBQUksVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDckQsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMYXp5LCBOYW1lcywgUmVzb3VyY2UsIFRhZ3MsIFRva2VuLCBVbnNjb3BlZFZhbGlkYXRpb25FcnJvciwgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHtcbiAgQ2ZuU3VibmV0LFxuICBDZm5TdWJuZXRSb3V0ZVRhYmxlQXNzb2NpYXRpb24sXG4gIElOZXR3b3JrQWNsLFxuICBJUm91dGVUYWJsZSxcbiAgSVN1Ym5ldCxcbiAgTmV0d29ya0FjbCxcbiAgU3VibmV0TmV0d29ya0FjbEFzc29jaWF0aW9uLFxuICBTdWJuZXRUeXBlLFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCB7IENvbnN0cnVjdCwgRGVwZW5kZW5jeUdyb3VwLCBJRGVwZW5kYWJsZSB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgSVZwY1YyIH0gZnJvbSAnLi92cGMtdjItYmFzZSc7XG5pbXBvcnQgeyBDaWRyQmxvY2ssIENpZHJCbG9ja0lwdjYsIGRlZmF1bHRTdWJuZXROYW1lIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IFJvdXRlVGFibGUgfSBmcm9tICcuL3JvdXRlJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhLCBNZXRob2RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcbmltcG9ydCB7IHByb3BlcnR5SW5qZWN0YWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL3Byb3AtaW5qZWN0YWJsZSc7XG5pbXBvcnQgeyBTdWJuZXRSZWZlcmVuY2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyL2xpYi9lYzIuZ2VuZXJhdGVkJztcblxuLyoqXG4gKiBJbnRlcmZhY2UgdG8gZGVmaW5lIHN1Ym5ldCBDSURSXG4gKi9cbmludGVyZmFjZSBJQ2lkciB7XG4gIHJlYWRvbmx5IGNpZHI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBJUHY0IG9yIElQdjYgQ0lEUiByYW5nZSBmb3IgdGhlIHN1Ym5ldFxuICovXG5leHBvcnQgY2xhc3MgSXBDaWRyIGltcGxlbWVudHMgSUNpZHIge1xuICAvKipcbiAgICogSVB2NiBDSURSIHJhbmdlIGZvciB0aGUgc3VibmV0XG4gICAqIEFsbG93ZWQgb25seSBpZiBJUHY2IGlzIGVuYWJsZWQgb24gVlBjXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2lkcjogc3RyaW5nO1xuICBjb25zdHJ1Y3Rvcihwcm9wczogc3RyaW5nICkge1xuICAgIHRoaXMuY2lkciA9IHByb3BzO1xuICB9XG59XG5cbi8qKlxuICogVlBDIE5hbWUgdGFnIGNvbnN0YW50XG4gKi9cbmNvbnN0IFNVQk5FVFRZUEVfVEFHID0gJ2F3cy1jZGs6c3VibmV0LXR5cGUnO1xuXG4vKipcbiAqIFN1Ym5ldCBOYW1lIHRhZyBjb25zdGFudFxuICovXG5jb25zdCBTVUJORVROQU1FX1RBRyA9ICdhd3MtY2RrOnN1Ym5ldC1uYW1lJztcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIHRvIGRlZmluZSBzdWJuZXQgZm9yIFZQQy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdWJuZXRWMlByb3BzIHtcbi8qKlxuICogVlBDIFByb3BcbiAqL1xuICByZWFkb25seSB2cGM6IElWcGNWMjtcblxuICAvKipcbiAgICogaXB2NCBjaWRyIHRvIGFzc2lnbiB0byB0aGlzIHN1Ym5ldC5cbiAgICogU2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1lYzItc3VibmV0Lmh0bWwjY2ZuLWVjMi1zdWJuZXQtY2lkcmJsb2NrXG4gICAqL1xuICByZWFkb25seSBpcHY0Q2lkckJsb2NrOiBJcENpZHI7XG5cbiAgLyoqXG4gICAqIElwdjYgQ0lEUiBSYW5nZSBmb3Igc3VibmV0XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gSXB2NiBhZGRyZXNzXG4gICAqL1xuICByZWFkb25seSBpcHY2Q2lkckJsb2NrPzogSXBDaWRyO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gQVogZm9yIHRoZSBzdWJuZXRcbiAgICovXG4gIHJlYWRvbmx5IGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZztcblxuICAvKipcbiAgICogQ3VzdG9tIFJvdXRlIGZvciBzdWJuZXRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIGRlZmF1bHQgcm91dGUgdGFibGUgY3JlYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVUYWJsZT86IElSb3V0ZVRhYmxlO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBkZWZhdWx0IFJvdXRlVGFibGUgY3JlYXRlZCBieSBDREsgdG8gYmUgdXNlZCBmb3IgdGFnZ2luZ1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRlZmF1bHQgcm91dGUgdGFibGUgbmFtZSBjcmVhdGVkIGJ5IENESyBhcyAnRGVmYXVsdENES1JvdXRlVGFibGUnXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0Um91dGVUYWJsZU5hbWUgPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBTdWJuZXQgdG8gY29uZmlndXJlLlxuICAgKlxuICAgKiBUaGUgU3VibmV0IHR5cGUgd2lsbCBjb250cm9sIHRoZSBhYmlsaXR5IHRvIHJvdXRlIGFuZCBjb25uZWN0IHRvIHRoZVxuICAgKiBJbnRlcm5ldC5cbiAgICpcbiAgICogVE9ETzogQWRkIHZhbGlkYXRpb24gY2hlY2sgYHN1Ym5ldFR5cGVgIHdoZW4gYWRkaW5nIHJlc291cmNlcyAoZS5nLiBjYW5ub3QgYWRkIE5hdEdhdGV3YXkgdG8gcHJpdmF0ZSlcbiAgICovXG4gIHJlYWRvbmx5IHN1Ym5ldFR5cGU6IFN1Ym5ldFR5cGU7XG5cbiAgLyoqXG4gICAqIFN1Ym5ldCBuYW1lXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcHJvdmlzaW9uZWQgd2l0aCBhbiBhdXRvZ2VuZXJhdGVkIG5hbWUgYnkgQ0RLXG4gICAqL1xuICByZWFkb25seSBzdWJuZXROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBhIG5ldHdvcmsgaW50ZXJmYWNlIGNyZWF0ZWQgaW4gdGhpcyBzdWJuZXQgcmVjZWl2ZXMgYW4gSVB2NiBhZGRyZXNzLlxuICAgKiBJZiB5b3Ugc3BlY2lmeSBBc3NpZ25JcHY2QWRkcmVzc09uQ3JlYXRpb24sIHlvdSBtdXN0IGFsc28gc3BlY2lmeSBJcHY2Q2lkckJsb2NrLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZCBpbiBjYXNlIG5vdCBwcm92aWRlZCBhcyBhbiBpbnB1dFxuICAgKi9cbiAgcmVhZG9ubHkgYXNzaWduSXB2NkFkZHJlc3NPbkNyZWF0aW9uPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29udHJvbHMgaWYgaW5zdGFuY2VzIGxhdW5jaGVkIGludG8gdGhlIHN1Ym5ldCBzaG91bGQgYmUgYXNzaWduZWQgYSBwdWJsaWMgSVAgYWRkcmVzcy5cbiAgICogVGhpcyBwcm9wZXJ0eSBjYW4gb25seSBiZSBzZXQgZm9yIHB1YmxpYyBzdWJuZXRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZCBpbiBjYXNlIG5vdCBwcm92aWRlZCBhcyBhbiBpbnB1dFxuICAgKi9cbiAgcmVhZG9ubHkgbWFwUHVibGljSXBPbkxhdW5jaD86IGJvb2xlYW47XG5cbn1cblxuLyoqXG4gKiBJbnRlcmZhY2Ugd2l0aCBhZGRpdGlvbmFsIHByb3BlcnRpZXMgZm9yIFN1Ym5ldFYyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVN1Ym5ldFYyIGV4dGVuZHMgSVN1Ym5ldCB7XG5cbiAgLyoqXG4gICAqIFRoZSBJUHY2IENJRFIgYmxvY2sgZm9yIHRoaXMgc3VibmV0XG4gICAqL1xuICByZWFkb25seSBpcHY2Q2lkckJsb2NrPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBzdWJuZXQgKHB1YmxpYyBvciBwcml2YXRlKSB0aGF0IHRoaXMgc3VibmV0IHJlcHJlc2VudHMuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGUgU3VibmV0VHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgc3VibmV0VHlwZT86IFN1Ym5ldFR5cGU7XG5cbn1cblxuLyoqXG4gKiBUaGUgU3VibmV0VjIgY2xhc3MgcmVwcmVzZW50cyBhIHN1Ym5ldCB3aXRoaW4gYSBWUEMgKFZpcnR1YWwgUHJpdmF0ZSBDbG91ZCkgaW4gQVdTLlxuICogSXQgZXh0ZW5kcyB0aGUgUmVzb3VyY2UgY2xhc3MgYW5kIGltcGxlbWVudHMgdGhlIElTdWJuZXQgaW50ZXJmYWNlLlxuICpcbiAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhbmQgbWFuYWdlIHN1Ym5ldHMgd2l0aGluIGEgVnBjVjIgaW5zdGFuY2UuXG4gKiBTdWJuZXRzIGNhbiBiZSBjb25maWd1cmVkIHdpdGggc3BlY2lmaWMgSVAgYWRkcmVzcyByYW5nZXMgKElQdjQgYW5kIElQdjYpLCBhdmFpbGFiaWxpdHkgem9uZXMsXG4gKiBhbmQgc3VibmV0IHR5cGVzIChlLmcuLCBwdWJsaWMsIHByaXZhdGUsIGlzb2xhdGVkKS5cbiAqXG4gKiBAcmVzb3VyY2UgQVdTOjpFQzI6OlN1Ym5ldFxuICpcbiAqL1xuQHByb3BlcnR5SW5qZWN0YWJsZVxuZXhwb3J0IGNsYXNzIFN1Ym5ldFYyIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJU3VibmV0VjIge1xuICAvKiogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGNsYXNzLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1BFUlRZX0lOSkVDVElPTl9JRDogc3RyaW5nID0gJ0Bhd3MtY2RrLmF3cy1lYzItYWxwaGEuU3VibmV0VjInO1xuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZXhpc3Rpbmcgc3VibmV0IHRvIHRoZSBWUENcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVN1Ym5ldFYyQXR0cmlidXRlcyhzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhdHRyczogU3VibmV0VjJBdHRyaWJ1dGVzKSA6IElTdWJuZXRWMiB7XG4gICAgLyoqXG4gICAgICogQ2xhc3MgdG8gZGVmaW5lIGFuIGltcG9ydCBmb3IgYW4gZXhpc3Rpbmcgc3VibmV0XG4gICAgICogQHJlc291cmNlIEFXUzo6RUMyOjpTdWJuZXRcbiAgICAgKi9cbiAgICBjbGFzcyBJbXBvcnRlZFN1Ym5ldFYyIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJU3VibmV0VjIge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgSVB2NiBDSURSIEJsb2NrIGFzc2lnbmVkIHRvIHRoaXMgc3VibmV0XG4gICAgICAgKi9cbiAgICAgIHB1YmxpYyByZWFkb25seSBpcHY2Q2lkckJsb2NrPzogc3RyaW5nID0gYXR0cnMuaXB2NkNpZHJCbG9jaztcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdHlwZSBvZiBzdWJuZXQgKGVnLiBwdWJsaWMgb3IgcHJpdmF0ZSkgdGhhdCB0aGlzIHN1Ym5ldCByZXByZXNlbnRzLlxuICAgICAgICovXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgc3VibmV0VHlwZT86IFN1Ym5ldFR5cGUgPSBhdHRycy5zdWJuZXRUeXBlO1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBBdmFpbGFiaWxpdHkgWm9uZSBpbiB3aGljaCBzdWJuZXQgaXMgbG9jYXRlZFxuICAgICAgICovXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nID0gYXR0cnMuYXZhaWxhYmlsaXR5Wm9uZTtcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgc3VibmV0SWQgZm9yIHRoaXMgcGFydGljdWxhciBzdWJuZXRcbiAgICAgICAqIFJlZmVycyB0byB0aGUgcGh5c2ljYWwgSUQgY3JlYXRlZFxuICAgICAgICovXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgc3VibmV0SWQ6IHN0cmluZyA9IGF0dHJzLnN1Ym5ldElkO1xuXG4gICAgICAvKipcbiAgICAgICAqIERlcGVuZGFibGUgdGhhdCBjYW4gYmUgZGVwZW5kZWQgdXBvbiB0byBmb3JjZSBpbnRlcm5ldCBjb25uZWN0aXZpdHkgZXN0YWJsaXNoZWQgb24gdGhlIFZQQ1xuICAgICAgICovXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgaW50ZXJuZXRDb25uZWN0aXZpdHlFc3RhYmxpc2hlZDogSURlcGVuZGFibGUgPSBuZXcgRGVwZW5kZW5jeUdyb3VwKCk7XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIElQdjQgQ0lEUiBibG9jayBhc3NpZ25lZCB0byB0aGlzIHN1Ym5ldFxuICAgICAgICovXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgaXB2NENpZHJCbG9jazogc3RyaW5nID0gYXR0cnMuaXB2NENpZHJCbG9jaztcblxuICAgICAgLyoqXG4gICAgICAgKiAgQ3VycmVudCByb3V0ZSB0YWJsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdWJuZXRcbiAgICAgICAqL1xuICAgICAgcHVibGljIHJlYWRvbmx5IHJvdXRlVGFibGU6IElSb3V0ZVRhYmxlID0geyByb3V0ZVRhYmxlSWQ6IGF0dHJzLnJvdXRlVGFibGVJZCEgfTtcblxuICAgICAgcHVibGljIGdldCBzdWJuZXRSZWYoKTogU3VibmV0UmVmZXJlbmNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWJuZXRJZDogdGhpcy5zdWJuZXRJZCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBBc3NvY2lhdGUgYSBOZXR3b3JrIEFDTCB3aXRoIHRoaXMgc3VibmV0XG4gICAgICAgKiBSZXF1aXJlZCBoZXJlIHNpbmNlIGl0IGlzIGltcGxlbWVudGVkIGluIHRoZSBJU3VibmV0VjJcbiAgICAgICAqL1xuICAgICAgcHVibGljIGFzc29jaWF0ZU5ldHdvcmtBY2woYWNsSWQ6IHN0cmluZywgbmV0d29ya0FjbDogSU5ldHdvcmtBY2wpIHtcbiAgICAgICAgY29uc3QgYWNsU2NvcGUgPSBuZXR3b3JrQWNsIGluc3RhbmNlb2YgQ29uc3RydWN0ID8gbmV0d29ya0FjbCA6IHRoaXM7XG4gICAgICAgIGNvbnN0IG90aGVyID0gbmV0d29ya0FjbCBpbnN0YW5jZW9mIENvbnN0cnVjdCA/IHRoaXMgOiBuZXR3b3JrQWNsO1xuICAgICAgICBuZXcgU3VibmV0TmV0d29ya0FjbEFzc29jaWF0aW9uKGFjbFNjb3BlLCBhY2xJZCArIE5hbWVzLm5vZGVVbmlxdWVJZChvdGhlci5ub2RlKSwge1xuICAgICAgICAgIG5ldHdvcmtBY2wsXG4gICAgICAgICAgc3VibmV0OiB0aGlzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBJbXBvcnRlZFN1Ym5ldFYyKHNjb3BlLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIEF2YWlsYWJpbGl0eSBab25lIHRoZSBzdWJuZXQgaXMgbG9jYXRlZCBpblxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGF2YWlsYWJpbGl0eVpvbmU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHN1Ym5ldElkIGZvciB0aGlzIHBhcnRpY3VsYXIgc3VibmV0XG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzdWJuZXRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiAgRGVwZW5kZW5jaWVzIGZvciBpbnRlcm5ldCBjb25uZWN0aXZpdHlcbiAgICogVGhpcyBQcm9wZXJ0eSBleHBvc2VzIHRoZSBSb3V0ZVRhYmxlLVN1Ym5ldCBhc3NvY2lhdGlvbiBzbyB0aGF0IG90aGVyIHJlc291cmNlcyBjYW4gZGVwZW5kIG9uIGl0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGludGVybmV0Q29ubmVjdGl2aXR5RXN0YWJsaXNoZWQ6IElEZXBlbmRhYmxlO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFyaWFibGUgbmFtZSBgaW50ZXJuZXRDb25uZWN0aXZpdHlFc3RhYmxpc2hlZGAgZG9lcyBub3QgcmVmbGVjdCB3aGF0IGl0IGFjdHVhbGx5IGlzLlxuICAgKiBUaGUgbmFtaW5nIGlzIGVuZm9yY2VkIGJ5IElTdWJuZXQuIFdlIG5lZWQgdG8ga2VlcCBpdCB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5LlxuICAgKiBJdCBleHBvc2VzIHRoZSBSb3V0ZVRhYmxlLVN1Ym5ldCBhc3NvY2lhdGlvbiBzbyB0aGF0IG90aGVyIHJlc291cmNlcyBjYW4gZGVwZW5kIG9uIGl0LlxuICAgKiBFLmcuIFJlc291cmNlcyBpbiBhIHN1Ym5ldCwgd2hlbiBiZWluZyBkZWxldGVkLCBtYXkgbmVlZCB0aGUgUm91dGVUYWJsZSB0byBleGlzdCBpbiBvcmRlciB0byBkZWxldGUgcHJvcGVybHlcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2ludGVybmV0Q29ubmVjdGl2aXR5RXN0YWJsaXNoZWQgPSBuZXcgRGVwZW5kZW5jeUdyb3VwKCk7XG5cbiAgLyoqXG4gICAqIFRoZSBJUHY0IENJRFIgYmxvY2sgZm9yIHRoaXMgc3VibmV0XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXB2NENpZHJCbG9jazogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSVB2NiBDSURSIEJsb2NrIGZvciB0aGlzIHN1Ym5ldFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlwdjZDaWRyQmxvY2s/OiBzdHJpbmc7XG5cbiAgcHVibGljIGdldCBzdWJuZXRSZWYoKTogU3VibmV0UmVmZXJlbmNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3VibmV0SWQ6IHRoaXMuc3VibmV0SWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBzdWJuZXQgKHB1YmxpYyBvciBwcml2YXRlKSB0aGF0IHRoaXMgc3VibmV0IHJlcHJlc2VudHMuXG4gICAqIEBhdHRyaWJ1dGUgU3VibmV0VHlwZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN1Ym5ldFR5cGU/OiBTdWJuZXRUeXBlO1xuXG4gIHByaXZhdGUgX25ldHdvcmtBY2w6IElOZXR3b3JrQWNsO1xuXG4gIHByaXZhdGUgX3JvdXRlVGFibGU6IElSb3V0ZVRhYmxlO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFN1Ym5ldFYyIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIHBhcmVudCBDb25zdHJ1Y3QgdGhhdCB0aGlzIHJlc291cmNlIHdpbGwgYmUgcGFydCBvZi5cbiAgICogQHBhcmFtIGlkIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyByZXNvdXJjZS5cbiAgICogQHBhcmFtIHByb3BzIFRoZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIHRoZSBzdWJuZXQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU3VibmV0VjJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgcGh5c2ljYWxOYW1lOiBwcm9wcy5zdWJuZXROYW1lID8/IExhenkuc3RyaW5nKHtcbiAgICAgICAgcHJvZHVjZTogKCkgPT4gTmFtZXMudW5pcXVlUmVzb3VyY2VOYW1lKHRoaXMsIHsgbWF4TGVuZ3RoOiAxMjgsIGFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVyczogJ18nIH0pLFxuICAgICAgfSksXG4gICAgfSk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICBjb25zdCBpcHY0Q2lkckJsb2NrID0gcHJvcHMuaXB2NENpZHJCbG9jay5jaWRyO1xuICAgIGNvbnN0IGlwdjZDaWRyQmxvY2sgPSBwcm9wcy5pcHY2Q2lkckJsb2NrPy5jaWRyO1xuXG4gICAgaWYgKCFjaGVja0NpZHJSYW5nZXMocHJvcHMudnBjLCBwcm9wcy5pcHY0Q2lkckJsb2NrLmNpZHIpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdDSURSIGJsb2NrIHNob3VsZCBiZSB3aXRoaW4gdGhlIHJhbmdlIG9mIFZQQycsIHRoaXMpO1xuICAgIH1cblxuICAgIGxldCBvdmVybGFwOiBib29sZWFuID0gZmFsc2U7XG4gICAgbGV0IG92ZXJsYXBJcHY2OiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5pcHY0Q2lkckJsb2NrKSkge1xuICAgICAgb3ZlcmxhcCA9IHZhbGlkYXRlT3ZlcmxhcHBpbmdDaWRyUmFuZ2VzKHByb3BzLnZwYywgcHJvcHMuaXB2NENpZHJCbG9jay5jaWRyKTtcbiAgICB9XG5cbiAgICAvLyBjaGVjayB3aGV0aGVyIFZQQyBzdXBwb3J0cyBpcHY2XG4gICAgaWYgKHByb3BzLmlwdjZDaWRyQmxvY2s/LmNpZHIgJiYgIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5pcHY2Q2lkckJsb2NrPy5jaWRyKSkge1xuICAgICAgdmFsaWRhdGVTdXBwb3J0SXB2Nihwcm9wcy52cGMpO1xuICAgICAgb3ZlcmxhcElwdjYgPSB2YWxpZGF0ZU92ZXJsYXBwaW5nQ2lkclJhbmdlc2lwdjYocHJvcHMudnBjLCBwcm9wcy5pcHY2Q2lkckJsb2NrPy5jaWRyKTtcbiAgICB9XG5cbiAgICBpZiAob3ZlcmxhcCB8fCBvdmVybGFwSXB2Nikge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcignQ0lEUiBibG9jayBzaG91bGQgbm90IG92ZXJsYXAgd2l0aCBleGlzdGluZyBzdWJuZXQgYmxvY2tzJywgdGhpcyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmFzc2lnbklwdjZBZGRyZXNzT25DcmVhdGlvbiAmJiAhcHJvcHMuaXB2NkNpZHJCbG9jaykge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcignSVB2NiBDSURSIGJsb2NrIGlzIHJlcXVpcmVkIHdoZW4gYXNzaWduaW5nIElQdjYgYWRkcmVzcyBvbiBjcmVhdGlvbicsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5tYXBQdWJsaWNJcE9uTGF1bmNoID09PSB0cnVlICYmIHByb3BzLnN1Ym5ldFR5cGUgIT09IFN1Ym5ldFR5cGUuUFVCTElDKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdtYXBQdWJsaWNJcE9uTGF1bmNoIGNhbiBvbmx5IGJlIHNldCB0byB0cnVlIGZvciBwdWJsaWMgc3VibmV0cycsIHRoaXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHN1Ym5ldCA9IG5ldyBDZm5TdWJuZXQodGhpcywgJ1N1Ym5ldCcsIHtcbiAgICAgIHZwY0lkOiBwcm9wcy52cGMudnBjSWQsXG4gICAgICBjaWRyQmxvY2s6IGlwdjRDaWRyQmxvY2ssXG4gICAgICBpcHY2Q2lkckJsb2NrOiBpcHY2Q2lkckJsb2NrLFxuICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogcHJvcHMuYXZhaWxhYmlsaXR5Wm9uZSxcbiAgICAgIGFzc2lnbklwdjZBZGRyZXNzT25DcmVhdGlvbjogcHJvcHMuYXNzaWduSXB2NkFkZHJlc3NPbkNyZWF0aW9uLFxuICAgICAgbWFwUHVibGljSXBPbkxhdW5jaDogcHJvcHMubWFwUHVibGljSXBPbkxhdW5jaCxcbiAgICB9KTtcblxuICAgIHRoaXMubm9kZS5kZWZhdWx0Q2hpbGQgPSBzdWJuZXQ7XG4gICAgdGhpcy5pcHY0Q2lkckJsb2NrID0gcHJvcHMuaXB2NENpZHJCbG9jay5jaWRyO1xuICAgIHRoaXMuaXB2NkNpZHJCbG9jayA9IHByb3BzLmlwdjZDaWRyQmxvY2s/LmNpZHI7XG4gICAgdGhpcy5zdWJuZXRJZCA9IHN1Ym5ldC5yZWY7XG4gICAgdGhpcy5hdmFpbGFiaWxpdHlab25lID0gcHJvcHMuYXZhaWxhYmlsaXR5Wm9uZTtcblxuICAgIHRoaXMuX25ldHdvcmtBY2wgPSBOZXR3b3JrQWNsLmZyb21OZXR3b3JrQWNsSWQodGhpcywgJ0FjbCcsIHN1Ym5ldC5hdHRyTmV0d29ya0FjbEFzc29jaWF0aW9uSWQpO1xuXG4gICAgY29uc3QgaW5jbHVkZVJlc291cmNlVHlwZXMgPSBbQ2ZuU3VibmV0LkNGTl9SRVNPVVJDRV9UWVBFX05BTUVdO1xuICAgIGlmIChwcm9wcy5zdWJuZXROYW1lKSB7XG4gICAgICBUYWdzLm9mKHN1Ym5ldCkuYWRkKFNVQk5FVE5BTUVfVEFHLCBwcm9wcy5zdWJuZXROYW1lKTtcbiAgICB9XG4gICAgY29uc3Qgc3VibmV0VHlwZU5hbWUgPSBkZWZhdWx0U3VibmV0TmFtZShwcm9wcy5zdWJuZXRUeXBlKSA/PyAndW5kZWZpbmVkJztcbiAgICBUYWdzLm9mKHN1Ym5ldCkuYWRkKFNVQk5FVFRZUEVfVEFHLCBzdWJuZXRUeXBlTmFtZSwgeyBpbmNsdWRlUmVzb3VyY2VUeXBlcyB9KTtcblxuICAgIGlmIChwcm9wcy5yb3V0ZVRhYmxlKSB7XG4gICAgICB0aGlzLl9yb3V0ZVRhYmxlID0gcHJvcHMucm91dGVUYWJsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQXNzaWduaW5nIGEgZGVmYXVsdCByb3V0ZSB0YWJsZVxuICAgICAgdGhpcy5fcm91dGVUYWJsZSA9IG5ldyBSb3V0ZVRhYmxlKHRoaXMsICdSb3V0ZVRhYmxlJywge1xuICAgICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgICAgcm91dGVUYWJsZU5hbWU6IHByb3BzLmRlZmF1bHRSb3V0ZVRhYmxlTmFtZSA/PyAnRGVmYXVsdENES1JvdXRlVGFibGUnLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgcm91dGVBc3NvYyA9IG5ldyBDZm5TdWJuZXRSb3V0ZVRhYmxlQXNzb2NpYXRpb24odGhpcywgJ1JvdXRlVGFibGVBc3NvY2lhdGlvbicsIHtcbiAgICAgIHN1Ym5ldElkOiB0aGlzLnN1Ym5ldElkLFxuICAgICAgcm91dGVUYWJsZUlkOiB0aGlzLnJvdXRlVGFibGUucm91dGVUYWJsZUlkLFxuICAgIH0pO1xuXG4gICAgdGhpcy5faW50ZXJuZXRDb25uZWN0aXZpdHlFc3RhYmxpc2hlZC5hZGQocm91dGVBc3NvYyk7XG5cbiAgICB0aGlzLmludGVybmV0Q29ubmVjdGl2aXR5RXN0YWJsaXNoZWQgPSB0aGlzLl9pbnRlcm5ldENvbm5lY3Rpdml0eUVzdGFibGlzaGVkO1xuXG4gICAgdGhpcy5zdWJuZXRUeXBlID0gcHJvcHMuc3VibmV0VHlwZTtcbiAgICBzdG9yZVN1Ym5ldFRvVnBjQnlUeXBlKHByb3BzLnZwYywgdGhpcywgcHJvcHMuc3VibmV0VHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogQXNzb2NpYXRlIGEgTmV0d29yayBBQ0wgd2l0aCB0aGlzIHN1Ym5ldFxuICAgKlxuICAgKiBAcGFyYW0gaWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGFzc29jaWF0aW9uLlxuICAgKiBAcGFyYW0gbmV0d29ya0FjbCBUaGUgTmV0d29yayBBQ0wgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBzdWJuZXQuXG4gICAqIFRoaXMgYWxsb3dzIGNvbnRyb2xsaW5nIGluYm91bmQgYW5kIG91dGJvdW5kIHRyYWZmaWMgZm9yIGluc3RhbmNlcyBpbiB0aGlzIHN1Ym5ldC5cbiAgICovXG4gIEBNZXRob2RNZXRhZGF0YSgpXG4gIHB1YmxpYyBhc3NvY2lhdGVOZXR3b3JrQWNsKGlkOiBzdHJpbmcsIG5ldHdvcmtBY2w6IElOZXR3b3JrQWNsKSB7XG4gICAgdGhpcy5fbmV0d29ya0FjbCA9IG5ldHdvcmtBY2w7XG5cbiAgICBjb25zdCBzY29wZSA9IG5ldHdvcmtBY2wgaW5zdGFuY2VvZiBDb25zdHJ1Y3QgPyBuZXR3b3JrQWNsIDogdGhpcztcbiAgICBjb25zdCBvdGhlciA9IG5ldHdvcmtBY2wgaW5zdGFuY2VvZiBDb25zdHJ1Y3QgPyB0aGlzIDogbmV0d29ya0FjbDtcbiAgICBuZXcgU3VibmV0TmV0d29ya0FjbEFzc29jaWF0aW9uKHNjb3BlLCBpZCArIE5hbWVzLm5vZGVVbmlxdWVJZChvdGhlci5ub2RlKSwge1xuICAgICAgbmV0d29ya0FjbCxcbiAgICAgIHN1Ym5ldDogdGhpcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIFJvdXRlIFRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1Ym5ldFxuICAgKi9cbiAgcHVibGljIGdldCByb3V0ZVRhYmxlKCk6IElSb3V0ZVRhYmxlIHtcbiAgICByZXR1cm4gdGhpcy5fcm91dGVUYWJsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBOZXR3b3JrIEFDTCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdWJuZXQuXG4gICAqL1xuXG4gIHB1YmxpYyBnZXQgbmV0d29ya0FjbCgpOiBJTmV0d29ya0FjbCB7XG4gICAgcmV0dXJuIHRoaXMuX25ldHdvcmtBY2w7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIHJlcXVpcmVkIHRvIGltcG9ydCBhIHN1Ym5ldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN1Ym5ldFYyQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgQXZhaWxhYmlsaXR5IFpvbmUgdGhpcyBzdWJuZXQgaXMgbG9jYXRlZCBpblxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIEFaIGluZm9ybWF0aW9uLCBjYW5ub3QgdXNlIEFaIHNlbGVjdGlvbiBmZWF0dXJlc1xuICAgKi9cbiAgcmVhZG9ubHkgYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSVB2NCBDSURSIGJsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3VibmV0XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gQ0lEUiBpbmZvcm1hdGlvbiwgY2Fubm90IHVzZSBDSURSIGZpbHRlciBmZWF0dXJlc1xuICAgKi9cbiAgcmVhZG9ubHkgaXB2NENpZHJCbG9jazogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSVB2NCBDSURSIGJsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3VibmV0XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gQ0lEUiBpbmZvcm1hdGlvbiwgY2Fubm90IHVzZSBDSURSIGZpbHRlciBmZWF0dXJlc1xuICAgKi9cbiAgcmVhZG9ubHkgaXB2NkNpZHJCbG9jaz86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSByb3V0ZSB0YWJsZSBmb3IgdGhpcyBwYXJ0aWN1bGFyIHN1Ym5ldFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHJvdXRlIHRhYmxlIGluZm9ybWF0aW9uLCBjYW5ub3QgY3JlYXRlIFZQQyBlbmRwb2ludHNcbiAgICovXG4gIHJlYWRvbmx5IHJvdXRlVGFibGVJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHN1Ym5ldElkIGZvciB0aGlzIHBhcnRpY3VsYXIgc3VibmV0XG4gICAqL1xuICByZWFkb25seSBzdWJuZXRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBzdWJuZXQgKHB1YmxpYyBvciBwcml2YXRlKSB0aGF0IHRoaXMgc3VibmV0IHJlcHJlc2VudHMuXG4gICAqL1xuICByZWFkb25seSBzdWJuZXRUeXBlOiBTdWJuZXRUeXBlO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBnaXZlbiBzdWJuZXRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBzdWJuZXQgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgc3VibmV0TmFtZT86IHN0cmluZztcblxufVxuXG50eXBlIERlcHJlY2F0ZWRTdWJuZXRUeXBlID0gJ0RlcHJlY2F0ZWRfSXNvbGF0ZWQnIHwgJ0RlcHJlY2F0ZWRfUHJpdmF0ZSc7XG5jb25zdCBzdWJuZXRUeXBlTWFwOiB7IFtrZXkgaW4gU3VibmV0VHlwZSB8IERlcHJlY2F0ZWRTdWJuZXRUeXBlXTogKHZwYzogSVZwY1YyLCBzdWJuZXQ6IFN1Ym5ldFYyKSA9PiB2b2lkIH0gPSB7XG4gIFtTdWJuZXRUeXBlLlBSSVZBVEVfSVNPTEFURURdOiAodnBjOiBJVnBjVjIsIHN1Ym5ldDogU3VibmV0VjIpID0+IHZwYy5pc29sYXRlZFN1Ym5ldHMucHVzaChzdWJuZXQpLFxuICBbU3VibmV0VHlwZS5QVUJMSUNdOiAodnBjOiBJVnBjVjIsIHN1Ym5ldDogU3VibmV0VjIpID0+IHZwYy5wdWJsaWNTdWJuZXRzLnB1c2goc3VibmV0KSxcbiAgW1N1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTU106ICh2cGM6IElWcGNWMiwgc3VibmV0OiBTdWJuZXRWMikgPT4gdnBjLnByaXZhdGVTdWJuZXRzLnB1c2goc3VibmV0KSxcbiAgWydEZXByZWNhdGVkX0lzb2xhdGVkJ106ICh2cGM6IElWcGNWMiwgc3VibmV0OiBTdWJuZXRWMikgPT4gdnBjLmlzb2xhdGVkU3VibmV0cy5wdXNoKHN1Ym5ldCksXG4gIFsnRGVwcmVjYXRlZF9Qcml2YXRlJ106ICh2cGM6IElWcGNWMiwgc3VibmV0OiBTdWJuZXRWMikgPT4gdnBjLnByaXZhdGVTdWJuZXRzLnB1c2goc3VibmV0KSxcbiAgW1N1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX05BVF06ICh2cGM6IElWcGNWMiwgc3VibmV0OiBTdWJuZXRWMikgPT4gdnBjLnByaXZhdGVTdWJuZXRzLnB1c2goc3VibmV0KSxcbn07XG5cbi8qKlxuICogU3RvcmVzIHRoZSBwcm92aWRlZCBzdWJuZXQgaW4gdGhlIFZQQydzIGNvbGxlY3Rpb24gb2Ygc3VibmV0cyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHN1Ym5ldCB0eXBlLlxuICpcbiAqIEBwYXJhbSB2cGMgVGhlIFZQQyBpbnN0YW5jZSB0byB3aGljaCB0aGUgc3VibmV0IGJlbG9uZ3MuXG4gKiBAcGFyYW0gc3VibmV0IFRoZSBzdWJuZXQgaW5zdGFuY2UgdG8gYmUgc3RvcmVkLlxuICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIHN1Ym5ldCAoZS5nLiwgcHVibGljLCBwcml2YXRlLCBpc29sYXRlZCkuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gc3RvcmVTdWJuZXRUb1ZwY0J5VHlwZSh2cGM6IElWcGNWMiwgc3VibmV0OiBTdWJuZXRWMiwgdHlwZTogU3VibmV0VHlwZSkge1xuICBjb25zdCBmaW5kRnVuY3Rpb25UeXBlID0gc3VibmV0VHlwZU1hcFt0eXBlXTtcbiAgaWYgKGZpbmRGdW5jdGlvblR5cGUpIHtcbiAgICBmaW5kRnVuY3Rpb25UeXBlKHZwYywgc3VibmV0KTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoYFVuc3VwcG9ydGVkIHN1Ym5ldCB0eXBlOiAke3R5cGV9YCk7XG4gIH1cblxuICAvKipcbiAgICogTmVlZCB0byBzZXQgZXhwbGljaXQgZGVwZW5kZW5jeSBhcyBkdXJpbmcgc3RhY2sgZGVsZXRpb24sXG4gICAqIHRoZSBjaWRyIGJsb2NrcyBtYXkgZ2V0IGRlbGV0ZWQgZmlyc3QgYW5kIHdpbGwgZmFpbCBhcyB0aGUgc3VibmV0cyBhcmUgc3RpbGwgdXNpbmcgdGhlIGNpZHIgYmxvY2tzXG4gICAqL1xuICBpZiAodnBjLnNlY29uZGFyeUNpZHJCbG9jaykge1xuICAgIGZvciAoY29uc3QgY2lkciBvZiB2cGMuc2Vjb25kYXJ5Q2lkckJsb2NrKSB7XG4gICAgICBzdWJuZXQubm9kZS5hZGREZXBlbmRlbmN5KGNpZHIpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB3aGV0aGVyIHRoZSBwcm92aWRlZCBWUEMgc3VwcG9ydHMgSVB2NiBhZGRyZXNzZXMuXG4gKlxuICogQHBhcmFtIHZwYyBUaGUgVlBDIGluc3RhbmNlIHRvIGJlIHZhbGlkYXRlZC5cbiAqIEB0aHJvd3MgVmFsaWRhdGlvbkVycm9yIGlmIHRoZSBWUEMgZG9lcyBub3Qgc3VwcG9ydCBJUHY2IGFkZHJlc3Nlcy5cbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIFZQQyBzdXBwb3J0cyBJUHY2IGFkZHJlc3NlcywgZmFsc2Ugb3RoZXJ3aXNlLlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlU3VwcG9ydElwdjYodnBjOiBJVnBjVjIpIHtcbiAgaWYgKHZwYy5zZWNvbmRhcnlDaWRyQmxvY2spIHtcbiAgICBpZiAodnBjLnNlY29uZGFyeUNpZHJCbG9jay5zb21lKChzZWNvbmRhcnlBZGRyZXNzKSA9PiBzZWNvbmRhcnlBZGRyZXNzLmFtYXpvblByb3ZpZGVkSXB2NkNpZHJCbG9jayA9PT0gdHJ1ZSB8fFxuICBzZWNvbmRhcnlBZGRyZXNzLmlwdjZJcGFtUG9vbElkICE9PSB1bmRlZmluZWQgfHwgc2Vjb25kYXJ5QWRkcmVzcy5pcHY2UG9vbCAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcignVG8gdXNlIElQdjYsIHRoZSBWUEMgbXVzdCBlbmFibGUgSVB2NiBzdXBwb3J0LicpO1xuICAgIH1cbiAgfSBlbHNlIHtyZXR1cm4gZmFsc2U7fVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgcHJvdmlkZWQgQ0lEUiByYW5nZSBmYWxscyB3aXRoaW4gdGhlIElQIGFkZHJlc3MgcmFuZ2VzIG9mIHRoZSBnaXZlbiBWUEMuXG4gKlxuICogQHBhcmFtIHZwYyBUaGUgVlBDIGluc3RhbmNlIHRvIGNoZWNrIGFnYWluc3QuXG4gKiBAcGFyYW0gY2lkclJhbmdlIFRoZSBDSURSIHJhbmdlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBDSURSIHJhbmdlIGZhbGxzIHdpdGhpbiB0aGUgVlBDJ3MgSVAgYWRkcmVzcyByYW5nZXMsIGZhbHNlIG90aGVyd2lzZS5cbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiBjaGVja0NpZHJSYW5nZXModnBjOiBJVnBjVjIsIGNpZHJSYW5nZTogc3RyaW5nKSB7XG4gIGNvbnN0IHZwY0NpZHJCbG9jayA9IFt2cGMuaXB2NENpZHJCbG9ja107XG4gIGNvbnN0IHN1Ym5ldENpZHJCbG9jayA9IG5ldyBDaWRyQmxvY2soY2lkclJhbmdlKTtcbiAgY29uc3QgYWxsQ2lkcnM6IENpZHJCbG9ja1tdID0gW107XG5cbiAgLy8gU2Vjb25kYXJ5IElQIGFkZHJlc3NlcyBhc3NvaWNhdGVkIHVzaW5nIHVzZXIgZGVmaW5lZCBJUHY0IHJhbmdlXG4gIGlmICh2cGMuc2Vjb25kYXJ5Q2lkckJsb2NrKSB7XG4gICAgZm9yIChjb25zdCBpcEFkZHJlc3Mgb2YgdnBjLnNlY29uZGFyeUNpZHJCbG9jaykge1xuICAgICAgaWYgKGlwQWRkcmVzcy5jaWRyQmxvY2spIHtcbiAgICAgICAgdnBjQ2lkckJsb2NrLnB1c2goaXBBZGRyZXNzLmNpZHJCbG9jayk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGNpZHJzID0gdnBjQ2lkckJsb2NrLm1hcChjaWRyID0+IG5ldyBDaWRyQmxvY2soY2lkcikpO1xuICAgIGFsbENpZHJzLnB1c2goLi4uY2lkcnMpO1xuICB9XG5cbiAgLy8gU2Vjb25kYXJ5IElQIGFkZHJlc3NlcyBhc3NvaWNhdGVkIHVzaW5nIElQQU0gSVB2NCByYW5nZVxuICBpZiAodnBjLmlwdjRJcGFtUHJvdmlzaW9uZWRDaWRycykge1xuICAgIGNvbnN0IGNpZHJzID0gdnBjLmlwdjRJcGFtUHJvdmlzaW9uZWRDaWRycy5tYXAoY2lkciA9PiBuZXcgQ2lkckJsb2NrKGNpZHIpKTtcbiAgICBhbGxDaWRycy5wdXNoKC4uLmNpZHJzKTtcbiAgfVxuXG4gIC8vIElmIG5vIElQdjQgaXMgYXNzaWduZWQgYXMgc2Vjb25kYXJ5IGFkZHJlc3NcbiAgaWYgKGFsbENpZHJzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcignTm8gc2Vjb25kYXJ5IElQIGFkZHJlc3MgYXR0YWNoZWQgdG8gVlBDJyk7XG4gIH1cblxuICByZXR1cm4gYWxsQ2lkcnMuc29tZShjID0+IGMuY29udGFpbnNDaWRyKHN1Ym5ldENpZHJCbG9jaykpO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBpZiB0aGUgcHJvdmlkZWQgSVB2NCBDSURSIGJsb2NrIG92ZXJsYXBzIHdpdGggZXhpc3Rpbmcgc3VibmV0IENJRFIgYmxvY2tzIHdpdGhpbiB0aGUgZ2l2ZW4gVlBDLlxuICpcbiAqIEBwYXJhbSB2cGMgVGhlIFZQQyBpbnN0YW5jZSB0byBjaGVjayBhZ2FpbnN0LlxuICogQHBhcmFtIGlwdjRDaWRyQmxvY2sgVGhlIElQdjQgQ0lEUiBibG9jayB0byBiZSB2YWxpZGF0ZWQuXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBJUHY0IENJRFIgYmxvY2sgb3ZlcmxhcHMgd2l0aCBleGlzdGluZyBzdWJuZXQgQ0lEUiBibG9ja3MsIGZhbHNlIG90aGVyd2lzZS5cbiAqIEBpbnRlcm5hbFxuICovXG5cbmZ1bmN0aW9uIHZhbGlkYXRlT3ZlcmxhcHBpbmdDaWRyUmFuZ2VzKHZwYzogSVZwY1YyLCBpcHY0Q2lkckJsb2NrOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IGFsbFN1Ym5ldHM6IElTdWJuZXRWMltdO1xuICB0cnkge1xuICAgIGFsbFN1Ym5ldHMgPSB2cGMuc2VsZWN0U3VibmV0cygpLnN1Ym5ldHM7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAnTm8gc3VibmV0cyBpbiBWUEMnO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGlwTWFwOiBbc3RyaW5nLCBzdHJpbmddW10gPSBuZXcgQXJyYXkoKTtcblxuICBjb25zdCBpbnB1dFJhbmdlID0gbmV3IENpZHJCbG9jayhpcHY0Q2lkckJsb2NrKTtcblxuICBjb25zdCBpbnB1dElwTWFwOiBbc3RyaW5nLCBzdHJpbmddID0gW2lucHV0UmFuZ2UubWluSXAoKSwgaW5wdXRSYW5nZS5tYXhJcCgpXTtcblxuICBmb3IgKGNvbnN0IHN1Ym5ldCBvZiBhbGxTdWJuZXRzKSB7XG4gICAgY29uc3QgY2lkckJsb2NrID0gbmV3IENpZHJCbG9jayhzdWJuZXQuaXB2NENpZHJCbG9jayk7XG4gICAgaXBNYXAucHVzaChbY2lkckJsb2NrLm1pbklwKCksIGNpZHJCbG9jay5tYXhJcCgpXSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHJhbmdlIG9mIGlwTWFwKSB7XG4gICAgaWYgKGlucHV0UmFuZ2UucmFuZ2VzT3ZlcmxhcChyYW5nZSwgaW5wdXRJcE1hcCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgaWYgdGhlIHByb3ZpZGVkIElQdjYgQ0lEUiBibG9jayBvdmVybGFwcyB3aXRoIGV4aXN0aW5nIHN1Ym5ldCBDSURSIGJsb2NrcyB3aXRoaW4gdGhlIGdpdmVuIFZQQy5cbiAqXG4gKiBAcGFyYW0gdnBjIFRoZSBWUEMgaW5zdGFuY2UgdG8gY2hlY2sgYWdhaW5zdC5cbiAqIEBwYXJhbSBpcHY2Q2lkckJsb2NrIFRoZSBJUHY2IENJRFIgYmxvY2sgdG8gYmUgdmFsaWRhdGVkLlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgSVB2NiBDSURSIGJsb2NrIG92ZXJsYXBzIHdpdGggZXhpc3Rpbmcgc3VibmV0IENJRFIgYmxvY2tzLCBmYWxzZSBvdGhlcndpc2UuXG4gKiBAdGhyb3dzIFZhbGlkYXRpb25FcnJvciBpZiBubyBzdWJuZXRzIGFyZSBmb3VuZCBpbiB0aGUgVlBDLlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlT3ZlcmxhcHBpbmdDaWRyUmFuZ2VzaXB2Nih2cGM6IElWcGNWMiwgaXB2NkNpZHJCbG9jazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGxldCBhbGxTdWJuZXRzOiBJU3VibmV0VjJbXTtcbiAgdHJ5IHtcbiAgICBhbGxTdWJuZXRzID0gdnBjLnNlbGVjdFN1Ym5ldHMoKS5zdWJuZXRzO1xuICB9IGNhdGNoIChlKSB7XG4gICAgJ05vIHN1Ym5ldHMgaW4gVlBDJztcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBpcHY2TWFwOiBzdHJpbmdbXT0gW107XG5cbiAgY29uc3QgaW5wdXRSYW5nZSA9IG5ldyBDaWRyQmxvY2tJcHY2KGlwdjZDaWRyQmxvY2spO1xuXG4gIGxldCByZXN1bHQgOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBzdWJuZXQgb2YgYWxsU3VibmV0cykge1xuICAgIGlmIChzdWJuZXQuaXB2NkNpZHJCbG9jaykge1xuICAgICAgY29uc3QgY2lkckJsb2NrID0gbmV3IENpZHJCbG9ja0lwdjYoc3VibmV0LmlwdjZDaWRyQmxvY2spO1xuICAgICAgaXB2Nk1hcC5wdXNoKGNpZHJCbG9jay5jaWRyKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHJhbmdlIG9mIGlwdjZNYXApIHtcbiAgICBpZiAoaW5wdXRSYW5nZS5yYW5nZXNPdmVybGFwKHJhbmdlLCBpbnB1dFJhbmdlLmNpZHIpKSB7XG4gICAgICByZXN1bHQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iXX0=
|
|
485
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VibmV0LXYyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3VibmV0LXYyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUEyRztBQUMzRyxpREFTNkI7QUFDN0IsMkNBQXFFO0FBRXJFLGlDQUFxRTtBQUNyRSxtQ0FBcUM7QUFDckMsOEVBQThGO0FBQzlGLDBFQUEwRTtBQVUxRTs7R0FFRztBQUNILE1BQWEsTUFBTTs7SUFDakI7OztPQUdHO0lBQ2EsSUFBSSxDQUFTO0lBQzdCLFlBQVksS0FBYTtRQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztLQUNuQjs7QUFSSCx3QkFTQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxjQUFjLEdBQUcscUJBQXFCLENBQUM7QUFFN0M7O0dBRUc7QUFDSCxNQUFNLGNBQWMsR0FBRyxxQkFBcUIsQ0FBQztBQWlHN0M7Ozs7Ozs7Ozs7R0FVRztJQUVVLFFBQVE7NEJBRHBCLG9DQUFrQjs7OztzQkFDVyxzQkFBUTs7O3dCQUFoQixTQUFRLFdBQVE7Ozs7K0NBK05uQyxJQUFBLGtDQUFjLEdBQUU7WUFDakIsNE1BQU8sbUJBQW1CLDZEQVN6QjtZQXpPSCw2S0F5UEM7Ozs7O1FBeFBDLHNDQUFzQztRQUMvQixNQUFNLENBQVUscUJBQXFCLEdBQVcsaUNBQWlDLENBQUM7UUFFekY7O1dBRUc7UUFDSSxNQUFNLENBQUMsc0JBQXNCLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBeUI7Ozs7Ozs7Ozs7WUFDMUY7OztlQUdHO1lBQ0gsTUFBTSxnQkFBaUIsU0FBUSxzQkFBUTtnQkFDckM7O21CQUVHO2dCQUNhLGFBQWEsR0FBWSxLQUFLLENBQUMsYUFBYSxDQUFDO2dCQUU3RDs7bUJBRUc7Z0JBQ2EsVUFBVSxHQUFnQixLQUFLLENBQUMsVUFBVSxDQUFDO2dCQUUzRDs7bUJBRUc7Z0JBQ2EsZ0JBQWdCLEdBQVcsS0FBSyxD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RDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsaUNBQWlDLENBQUMsR0FBVyxFQUFFLGFBQXFCO0lBQzNFLElBQUksVUFBdUIsQ0FBQztJQUM1QixJQUFJLENBQUM7UUFDSCxVQUFVLEdBQUcsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDLE9BQU8sQ0FBQztJQUMzQyxDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLG1CQUFtQixDQUFDO1FBQ3BCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFZLEVBQUUsQ0FBQztJQUU1QixNQUFNLFVBQVUsR0FBRyxJQUFJLG9CQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7SUFFcEQsSUFBSSxNQUFNLEdBQWEsS0FBSyxDQUFDO0lBRTdCLEtBQUssTUFBTSxNQUFNLElBQUksVUFBVSxFQUFFLENBQUM7UUFDaEMsSUFBSSxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDekIsTUFBTSxTQUFTLEdBQUcsSUFBSSxvQkFBYSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMxRCxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssTUFBTSxLQUFLLElBQUksT0FBTyxFQUFFLENBQUM7UUFDNUIsSUFBSSxVQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNyRCxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExhenksIE5hbWVzLCBSZXNvdXJjZSwgVGFncywgVG9rZW4sIFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQge1xuICBDZm5TdWJuZXQsXG4gIENmblN1Ym5ldFJvdXRlVGFibGVBc3NvY2lhdGlvbixcbiAgSU5ldHdvcmtBY2wsXG4gIElSb3V0ZVRhYmxlLFxuICBJU3VibmV0LFxuICBOZXR3b3JrQWNsLFxuICBTdWJuZXROZXR3b3JrQWNsQXNzb2NpYXRpb24sXG4gIFN1Ym5ldFR5cGUsXG59IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBEZXBlbmRlbmN5R3JvdXAsIElEZXBlbmRhYmxlIH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBJVnBjVjIgfSBmcm9tICcuL3ZwYy12Mi1iYXNlJztcbmltcG9ydCB7IENpZHJCbG9jaywgQ2lkckJsb2NrSXB2NiwgZGVmYXVsdFN1Ym5ldE5hbWUgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHsgUm91dGVUYWJsZSB9IGZyb20gJy4vcm91dGUnO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEsIE1ldGhvZE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuaW1wb3J0IHsgcHJvcGVydHlJbmplY3RhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvcHJvcC1pbmplY3RhYmxlJztcbmltcG9ydCB7IFN1Ym5ldFJlZmVyZW5jZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzIvbGliL2VjMi5nZW5lcmF0ZWQnO1xuXG4vKipcbiAqIEludGVyZmFjZSB0byBkZWZpbmUgc3VibmV0IENJRFJcbiAqL1xuaW50ZXJmYWNlIElDaWRyIHtcbiAgcmVhZG9ubHkgY2lkcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIElQdjQgb3IgSVB2NiBDSURSIHJhbmdlIGZvciB0aGUgc3VibmV0XG4gKi9cbmV4cG9ydCBjbGFzcyBJcENpZHIgaW1wbGVtZW50cyBJQ2lkciB7XG4gIC8qKlxuICAgKiBJUHY2IENJRFIgcmFuZ2UgZm9yIHRoZSBzdWJuZXRcbiAgICogQWxsb3dlZCBvbmx5IGlmIElQdjYgaXMgZW5hYmxlZCBvbiBWUGNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjaWRyOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBzdHJpbmcgKSB7XG4gICAgdGhpcy5jaWRyID0gcHJvcHM7XG4gIH1cbn1cblxuLyoqXG4gKiBWUEMgTmFtZSB0YWcgY29uc3RhbnRcbiAqL1xuY29uc3QgU1VCTkVUVFlQRV9UQUcgPSAnYXdzLWNkazpzdWJuZXQtdHlwZSc7XG5cbi8qKlxuICogU3VibmV0IE5hbWUgdGFnIGNvbnN0YW50XG4gKi9cbmNvbnN0IFNVQk5FVE5BTUVfVEFHID0gJ2F3cy1jZGs6c3VibmV0LW5hbWUnO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgdG8gZGVmaW5lIHN1Ym5ldCBmb3IgVlBDLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN1Ym5ldFYyUHJvcHMge1xuLyoqXG4gKiBWUEMgUHJvcFxuICovXG4gIHJlYWRvbmx5IHZwYzogSVZwY1YyO1xuXG4gIC8qKlxuICAgKiBpcHY0IGNpZHIgdG8gYXNzaWduIHRvIHRoaXMgc3VibmV0LlxuICAgKiBTZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWVjMi1zdWJuZXQuaHRtbCNjZm4tZWMyLXN1Ym5ldC1jaWRyYmxvY2tcbiAgICovXG4gIHJlYWRvbmx5IGlwdjRDaWRyQmxvY2s6IElwQ2lkcjtcblxuICAvKipcbiAgICogSXB2NiBDSURSIFJhbmdlIGZvciBzdWJuZXRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBJcHY2IGFkZHJlc3NcbiAgICovXG4gIHJlYWRvbmx5IGlwdjZDaWRyQmxvY2s/OiBJcENpZHI7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBBWiBmb3IgdGhlIHN1Ym5ldFxuICAgKi9cbiAgcmVhZG9ubHkgYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gUm91dGUgZm9yIHN1Ym5ldFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgZGVmYXVsdCByb3V0ZSB0YWJsZSBjcmVhdGVkXG4gICAqL1xuICByZWFkb25seSByb3V0ZVRhYmxlPzogSVJvdXRlVGFibGU7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIGRlZmF1bHQgUm91dGVUYWJsZSBjcmVhdGVkIGJ5IENESyB0byBiZSB1c2VkIGZvciB0YWdnaW5nXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGVmYXVsdCByb3V0ZSB0YWJsZSBuYW1lIGNyZWF0ZWQgYnkgQ0RLIGFzICdEZWZhdWx0Q0RLUm91dGVUYWJsZSdcbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRSb3V0ZVRhYmxlTmFtZSA/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIFN1Ym5ldCB0byBjb25maWd1cmUuXG4gICAqXG4gICAqIFRoZSBTdWJuZXQgdHlwZSB3aWxsIGNvbnRyb2wgdGhlIGFiaWxpdHkgdG8gcm91dGUgYW5kIGNvbm5lY3QgdG8gdGhlXG4gICAqIEludGVybmV0LlxuICAgKlxuICAgKiBUT0RPOiBBZGQgdmFsaWRhdGlvbiBjaGVjayBgc3VibmV0VHlwZWAgd2hlbiBhZGRpbmcgcmVzb3VyY2VzIChlLmcuIGNhbm5vdCBhZGQgTmF0R2F0ZXdheSB0byBwcml2YXRlKVxuICAgKi9cbiAgcmVhZG9ubHkgc3VibmV0VHlwZTogU3VibmV0VHlwZTtcblxuICAvKipcbiAgICogU3VibmV0IG5hbWVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBwcm92aXNpb25lZCB3aXRoIGFuIGF1dG9nZW5lcmF0ZWQgbmFtZSBieSBDREtcbiAgICovXG4gIHJlYWRvbmx5IHN1Ym5ldE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIGEgbmV0d29yayBpbnRlcmZhY2UgY3JlYXRlZCBpbiB0aGlzIHN1Ym5ldCByZWNlaXZlcyBhbiBJUHY2IGFkZHJlc3MuXG4gICAqIElmIHlvdSBzcGVjaWZ5IEFzc2lnbklwdjZBZGRyZXNzT25DcmVhdGlvbiwgeW91IG11c3QgYWxzbyBzcGVjaWZ5IElwdjZDaWRyQmxvY2suXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdW5kZWZpbmVkIGluIGNhc2Ugbm90IHByb3ZpZGVkIGFzIGFuIGlucHV0XG4gICAqL1xuICByZWFkb25seSBhc3NpZ25JcHY2QWRkcmVzc09uQ3JlYXRpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyBpZiBpbnN0YW5jZXMgbGF1bmNoZWQgaW50byB0aGUgc3VibmV0IHNob3VsZCBiZSBhc3NpZ25lZCBhIHB1YmxpYyBJUCBhZGRyZXNzLlxuICAgKiBUaGlzIHByb3BlcnR5IGNhbiBvbmx5IGJlIHNldCBmb3IgcHVibGljIHN1Ym5ldHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdW5kZWZpbmVkIGluIGNhc2Ugbm90IHByb3ZpZGVkIGFzIGFuIGlucHV0XG4gICAqL1xuICByZWFkb25seSBtYXBQdWJsaWNJcE9uTGF1bmNoPzogYm9vbGVhbjtcblxufVxuXG4vKipcbiAqIEludGVyZmFjZSB3aXRoIGFkZGl0aW9uYWwgcHJvcGVydGllcyBmb3IgU3VibmV0VjJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU3VibmV0VjIgZXh0ZW5kcyBJU3VibmV0IHtcblxuICAvKipcbiAgICogVGhlIElQdjYgQ0lEUiBibG9jayBmb3IgdGhpcyBzdWJuZXRcbiAgICovXG4gIHJlYWRvbmx5IGlwdjZDaWRyQmxvY2s/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHN1Ym5ldCAocHVibGljIG9yIHByaXZhdGUpIHRoYXQgdGhpcyBzdWJuZXQgcmVwcmVzZW50cy5cbiAgICpcbiAgICogQGF0dHJpYnV0ZSBTdWJuZXRUeXBlXG4gICAqL1xuICByZWFkb25seSBzdWJuZXRUeXBlPzogU3VibmV0VHlwZTtcblxufVxuXG4vKipcbiAqIFRoZSBTdWJuZXRWMiBjbGFzcyByZXByZXNlbnRzIGEgc3VibmV0IHdpdGhpbiBhIFZQQyAoVmlydHVhbCBQcml2YXRlIENsb3VkKSBpbiBBV1MuXG4gKiBJdCBleHRlbmRzIHRoZSBSZXNvdXJjZSBjbGFzcyBhbmQgaW1wbGVtZW50cyB0aGUgSVN1Ym5ldCBpbnRlcmZhY2UuXG4gKlxuICogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuZCBtYW5hZ2Ugc3VibmV0cyB3aXRoaW4gYSBWcGNWMiBpbnN0YW5jZS5cbiAqIFN1Ym5ldHMgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCBzcGVjaWZpYyBJUCBhZGRyZXNzIHJhbmdlcyAoSVB2NCBhbmQgSVB2NiksIGF2YWlsYWJpbGl0eSB6b25lcyxcbiAqIGFuZCBzdWJuZXQgdHlwZXMgKGUuZy4sIHB1YmxpYywgcHJpdmF0ZSwgaXNvbGF0ZWQpLlxuICpcbiAqIEByZXNvdXJjZSBBV1M6OkVDMjo6U3VibmV0XG4gKlxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgU3VibmV0VjIgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElTdWJuZXRWMiB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLWVjMi1hbHBoYS5TdWJuZXRWMic7XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyBzdWJuZXQgdG8gdGhlIFZQQ1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tU3VibmV0VjJBdHRyaWJ1dGVzKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGF0dHJzOiBTdWJuZXRWMkF0dHJpYnV0ZXMpIDogSVN1Ym5ldFYyIHtcbiAgICAvKipcbiAgICAgKiBDbGFzcyB0byBkZWZpbmUgYW4gaW1wb3J0IGZvciBhbiBleGlzdGluZyBzdWJuZXRcbiAgICAgKiBAcmVzb3VyY2UgQVdTOjpFQzI6OlN1Ym5ldFxuICAgICAqL1xuICAgIGNsYXNzIEltcG9ydGVkU3VibmV0VjIgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElTdWJuZXRWMiB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBJUHY2IENJRFIgQmxvY2sgYXNzaWduZWQgdG8gdGhpcyBzdWJuZXRcbiAgICAgICAqL1xuICAgICAgcHVibGljIHJlYWRvbmx5IGlwdjZDaWRyQmxvY2s/OiBzdHJpbmcgPSBhdHRycy5pcHY2Q2lkckJsb2NrO1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSB0eXBlIG9mIHN1Ym5ldCAoZWcuIHB1YmxpYyBvciBwcml2YXRlKSB0aGF0IHRoaXMgc3VibmV0IHJlcHJlc2VudHMuXG4gICAgICAgKi9cbiAgICAgIHB1YmxpYyByZWFkb25seSBzdWJuZXRUeXBlPzogU3VibmV0VHlwZSA9IGF0dHJzLnN1Ym5ldFR5cGU7XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIEF2YWlsYWJpbGl0eSBab25lIGluIHdoaWNoIHN1Ym5ldCBpcyBsb2NhdGVkXG4gICAgICAgKi9cbiAgICAgIHB1YmxpYyByZWFkb25seSBhdmFpbGFiaWxpdHlab25lOiBzdHJpbmcgPSBhdHRycy5hdmFpbGFiaWxpdHlab25lO1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBzdWJuZXRJZCBmb3IgdGhpcyBwYXJ0aWN1bGFyIHN1Ym5ldFxuICAgICAgICogUmVmZXJzIHRvIHRoZSBwaHlzaWNhbCBJRCBjcmVhdGVkXG4gICAgICAgKi9cbiAgICAgIHB1YmxpYyByZWFkb25seSBzdWJuZXRJZDogc3RyaW5nID0gYXR0cnMuc3VibmV0SWQ7XG5cbiAgICAgIC8qKlxuICAgICAgICogRGVwZW5kYWJsZSB0aGF0IGNhbiBiZSBkZXBlbmRlZCB1cG9uIHRvIGZvcmNlIGludGVybmV0IGNvbm5lY3Rpdml0eSBlc3RhYmxpc2hlZCBvbiB0aGUgVlBDXG4gICAgICAgKi9cbiAgICAgIHB1YmxpYyByZWFkb25seSBpbnRlcm5ldENvbm5lY3Rpdml0eUVzdGFibGlzaGVkOiBJRGVwZW5kYWJsZSA9IG5ldyBEZXBlbmRlbmN5R3JvdXAoKTtcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgSVB2NCBDSURSIGJsb2NrIGFzc2lnbmVkIHRvIHRoaXMgc3VibmV0XG4gICAgICAgKi9cbiAgICAgIHB1YmxpYyByZWFkb25seSBpcHY0Q2lkckJsb2NrOiBzdHJpbmcgPSBhdHRycy5pcHY0Q2lkckJsb2NrO1xuXG4gICAgICAvKipcbiAgICAgICAqICBDdXJyZW50IHJvdXRlIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1Ym5ldFxuICAgICAgICovXG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcm91dGVUYWJsZTogSVJvdXRlVGFibGUgPSB7IHJvdXRlVGFibGVJZDogYXR0cnMucm91dGVUYWJsZUlkISB9O1xuXG4gICAgICBwdWJsaWMgZ2V0IHN1Ym5ldFJlZigpOiBTdWJuZXRSZWZlcmVuY2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Ym5ldElkOiB0aGlzLnN1Ym5ldElkLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIEFzc29jaWF0ZSBhIE5ldHdvcmsgQUNMIHdpdGggdGhpcyBzdWJuZXRcbiAgICAgICAqIFJlcXVpcmVkIGhlcmUgc2luY2UgaXQgaXMgaW1wbGVtZW50ZWQgaW4gdGhlIElTdWJuZXRWMlxuICAgICAgICovXG4gICAgICBwdWJsaWMgYXNzb2NpYXRlTmV0d29ya0FjbChhY2xJZDogc3RyaW5nLCBuZXR3b3JrQWNsOiBJTmV0d29ya0FjbCkge1xuICAgICAgICBjb25zdCBhY2xTY29wZSA9IG5ldHdvcmtBY2wgaW5zdGFuY2VvZiBDb25zdHJ1Y3QgPyBuZXR3b3JrQWNsIDogdGhpcztcbiAgICAgICAgY29uc3Qgb3RoZXIgPSBuZXR3b3JrQWNsIGluc3RhbmNlb2YgQ29uc3RydWN0ID8gdGhpcyA6IG5ldHdvcmtBY2w7XG4gICAgICAgIG5ldyBTdWJuZXROZXR3b3JrQWNsQXNzb2NpYXRpb24oYWNsU2NvcGUsIGFjbElkICsgTmFtZXMubm9kZVVuaXF1ZUlkKG90aGVyLm5vZGUpLCB7XG4gICAgICAgICAgbmV0d29ya0FjbCxcbiAgICAgICAgICBzdWJuZXQ6IHRoaXMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IEltcG9ydGVkU3VibmV0VjIoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgQXZhaWxhYmlsaXR5IFpvbmUgdGhlIHN1Ym5ldCBpcyBsb2NhdGVkIGluXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXZhaWxhYmlsaXR5Wm9uZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3VibmV0SWQgZm9yIHRoaXMgcGFydGljdWxhciBzdWJuZXRcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN1Ym5ldElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqICBEZXBlbmRlbmNpZXMgZm9yIGludGVybmV0IGNvbm5lY3Rpdml0eVxuICAgKiBUaGlzIFByb3BlcnR5IGV4cG9zZXMgdGhlIFJvdXRlVGFibGUtU3VibmV0IGFzc29jaWF0aW9uIHNvIHRoYXQgb3RoZXIgcmVzb3VyY2VzIGNhbiBkZXBlbmQgb24gaXQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaW50ZXJuZXRDb25uZWN0aXZpdHlFc3RhYmxpc2hlZDogSURlcGVuZGFibGU7XG5cbiAgLyoqXG4gICAqIFRoZSB2YXJpYWJsZSBuYW1lIGBpbnRlcm5ldENvbm5lY3Rpdml0eUVzdGFibGlzaGVkYCBkb2VzIG5vdCByZWZsZWN0IHdoYXQgaXQgYWN0dWFsbHkgaXMuXG4gICAqIFRoZSBuYW1pbmcgaXMgZW5mb3JjZWQgYnkgSVN1Ym5ldC4gV2UgbmVlZCB0byBrZWVwIGl0IHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkuXG4gICAqIEl0IGV4cG9zZXMgdGhlIFJvdXRlVGFibGUtU3VibmV0IGFzc29jaWF0aW9uIHNvIHRoYXQgb3RoZXIgcmVzb3VyY2VzIGNhbiBkZXBlbmQgb24gaXQuXG4gICAqIEUuZy4gUmVzb3VyY2VzIGluIGEgc3VibmV0LCB3aGVuIGJlaW5nIGRlbGV0ZWQsIG1heSBuZWVkIHRoZSBSb3V0ZVRhYmxlIHRvIGV4aXN0IGluIG9yZGVyIHRvIGRlbGV0ZSBwcm9wZXJseVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfaW50ZXJuZXRDb25uZWN0aXZpdHlFc3RhYmxpc2hlZCA9IG5ldyBEZXBlbmRlbmN5R3JvdXAoKTtcblxuICAvKipcbiAgICogVGhlIElQdjQgQ0lEUiBibG9jayBmb3IgdGhpcyBzdWJuZXRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpcHY0Q2lkckJsb2NrOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJUHY2IENJRFIgQmxvY2sgZm9yIHRoaXMgc3VibmV0XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXB2NkNpZHJCbG9jaz86IHN0cmluZztcblxuICBwdWJsaWMgZ2V0IHN1Ym5ldFJlZigpOiBTdWJuZXRSZWZlcmVuY2Uge1xuICAgIHJldHVybiB7XG4gICAgICBzdWJuZXRJZDogdGhpcy5zdWJuZXRJZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHN1Ym5ldCAocHVibGljIG9yIHByaXZhdGUpIHRoYXQgdGhpcyBzdWJuZXQgcmVwcmVzZW50cy5cbiAgICogQGF0dHJpYnV0ZSBTdWJuZXRUeXBlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3VibmV0VHlwZT86IFN1Ym5ldFR5cGU7XG5cbiAgcHJpdmF0ZSBfbmV0d29ya0FjbDogSU5ldHdvcmtBY2w7XG5cbiAgcHJpdmF0ZSBfcm91dGVUYWJsZTogSVJvdXRlVGFibGU7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgU3VibmV0VjIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgcGFyZW50IENvbnN0cnVjdCB0aGF0IHRoaXMgcmVzb3VyY2Ugd2lsbCBiZSBwYXJ0IG9mLlxuICAgKiBAcGFyYW0gaWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHJlc291cmNlLlxuICAgKiBAcGFyYW0gcHJvcHMgVGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgdGhlIHN1Ym5ldC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTdWJuZXRWMlByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBwaHlzaWNhbE5hbWU6IHByb3BzLnN1Ym5ldE5hbWUgPz8gTGF6eS5zdHJpbmcoe1xuICAgICAgICBwcm9kdWNlOiAoKSA9PiBOYW1lcy51bmlxdWVSZXNvdXJjZU5hbWUodGhpcywgeyBtYXhMZW5ndGg6IDEyOCwgYWxsb3dlZFNwZWNpYWxDaGFyYWN0ZXJzOiAnXycgfSksXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICAvLyBFbmhhbmNlZCBDREsgQW5hbHl0aWNzIFRlbGVtZXRyeVxuICAgIGFkZENvbnN0cnVjdE1ldGFkYXRhKHRoaXMsIHByb3BzKTtcblxuICAgIGNvbnN0IGlwdjRDaWRyQmxvY2sgPSBwcm9wcy5pcHY0Q2lkckJsb2NrLmNpZHI7XG4gICAgY29uc3QgaXB2NkNpZHJCbG9jayA9IHByb3BzLmlwdjZDaWRyQmxvY2s/LmNpZHI7XG5cbiAgICBpZiAoIWNoZWNrQ2lkclJhbmdlcyhwcm9wcy52cGMsIHByb3BzLmlwdjRDaWRyQmxvY2suY2lkcikpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoJ0NJRFIgYmxvY2sgc2hvdWxkIGJlIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgVlBDJywgdGhpcyk7XG4gICAgfVxuXG4gICAgbGV0IG92ZXJsYXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBsZXQgb3ZlcmxhcElwdjY6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLmlwdjRDaWRyQmxvY2spKSB7XG4gICAgICBvdmVybGFwID0gdmFsaWRhdGVPdmVybGFwcGluZ0NpZHJSYW5nZXMocHJvcHMudnBjLCBwcm9wcy5pcHY0Q2lkckJsb2NrLmNpZHIpO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIHdoZXRoZXIgVlBDIHN1cHBvcnRzIGlwdjZcbiAgICBpZiAocHJvcHMuaXB2NkNpZHJCbG9jaz8uY2lkciAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLmlwdjZDaWRyQmxvY2s/LmNpZHIpKSB7XG4gICAgICB2YWxpZGF0ZVN1cHBvcnRJcHY2KHByb3BzLnZwYyk7XG4gICAgICBvdmVybGFwSXB2NiA9IHZhbGlkYXRlT3ZlcmxhcHBpbmdDaWRyUmFuZ2VzaXB2Nihwcm9wcy52cGMsIHByb3BzLmlwdjZDaWRyQmxvY2s/LmNpZHIpO1xuICAgIH1cblxuICAgIGlmIChvdmVybGFwIHx8IG92ZXJsYXBJcHY2KSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdDSURSIGJsb2NrIHNob3VsZCBub3Qgb3ZlcmxhcCB3aXRoIGV4aXN0aW5nIHN1Ym5ldCBibG9ja3MnLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuYXNzaWduSXB2NkFkZHJlc3NPbkNyZWF0aW9uICYmICFwcm9wcy5pcHY2Q2lkckJsb2NrKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdJUHY2IENJRFIgYmxvY2sgaXMgcmVxdWlyZWQgd2hlbiBhc3NpZ25pbmcgSVB2NiBhZGRyZXNzIG9uIGNyZWF0aW9uJywgdGhpcyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLm1hcFB1YmxpY0lwT25MYXVuY2ggPT09IHRydWUgJiYgcHJvcHMuc3VibmV0VHlwZSAhPT0gU3VibmV0VHlwZS5QVUJMSUMpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoJ21hcFB1YmxpY0lwT25MYXVuY2ggY2FuIG9ubHkgYmUgc2V0IHRvIHRydWUgZm9yIHB1YmxpYyBzdWJuZXRzJywgdGhpcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3VibmV0ID0gbmV3IENmblN1Ym5ldCh0aGlzLCAnU3VibmV0Jywge1xuICAgICAgdnBjSWQ6IHByb3BzLnZwYy52cGNJZCxcbiAgICAgIGNpZHJCbG9jazogaXB2NENpZHJCbG9jayxcbiAgICAgIGlwdjZDaWRyQmxvY2s6IGlwdjZDaWRyQmxvY2ssXG4gICAgICBhdmFpbGFiaWxpdHlab25lOiBwcm9wcy5hdmFpbGFiaWxpdHlab25lLFxuICAgICAgYXNzaWduSXB2NkFkZHJlc3NPbkNyZWF0aW9uOiBwcm9wcy5hc3NpZ25JcHY2QWRkcmVzc09uQ3JlYXRpb24sXG4gICAgICBtYXBQdWJsaWNJcE9uTGF1bmNoOiBwcm9wcy5tYXBQdWJsaWNJcE9uTGF1bmNoLFxuICAgIH0pO1xuXG4gICAgdGhpcy5ub2RlLmRlZmF1bHRDaGlsZCA9IHN1Ym5ldDtcbiAgICB0aGlzLmlwdjRDaWRyQmxvY2sgPSBwcm9wcy5pcHY0Q2lkckJsb2NrLmNpZHI7XG4gICAgdGhpcy5pcHY2Q2lkckJsb2NrID0gcHJvcHMuaXB2NkNpZHJCbG9jaz8uY2lkcjtcbiAgICB0aGlzLnN1Ym5ldElkID0gc3VibmV0LnJlZjtcbiAgICB0aGlzLmF2YWlsYWJpbGl0eVpvbmUgPSBwcm9wcy5hdmFpbGFiaWxpdHlab25lO1xuXG4gICAgdGhpcy5fbmV0d29ya0FjbCA9IE5ldHdvcmtBY2wuZnJvbU5ldHdvcmtBY2xJZCh0aGlzLCAnQWNsJywgc3VibmV0LmF0dHJOZXR3b3JrQWNsQXNzb2NpYXRpb25JZCk7XG5cbiAgICBjb25zdCBpbmNsdWRlUmVzb3VyY2VUeXBlcyA9IFtDZm5TdWJuZXQuQ0ZOX1JFU09VUkNFX1RZUEVfTkFNRV07XG4gICAgaWYgKHByb3BzLnN1Ym5ldE5hbWUpIHtcbiAgICAgIFRhZ3Mub2Yoc3VibmV0KS5hZGQoU1VCTkVUTkFNRV9UQUcsIHByb3BzLnN1Ym5ldE5hbWUpO1xuICAgIH1cbiAgICBjb25zdCBzdWJuZXRUeXBlTmFtZSA9IGRlZmF1bHRTdWJuZXROYW1lKHByb3BzLnN1Ym5ldFR5cGUpID8/ICd1bmRlZmluZWQnO1xuICAgIFRhZ3Mub2Yoc3VibmV0KS5hZGQoU1VCTkVUVFlQRV9UQUcsIHN1Ym5ldFR5cGVOYW1lLCB7IGluY2x1ZGVSZXNvdXJjZVR5cGVzIH0pO1xuXG4gICAgaWYgKHByb3BzLnJvdXRlVGFibGUpIHtcbiAgICAgIHRoaXMuX3JvdXRlVGFibGUgPSBwcm9wcy5yb3V0ZVRhYmxlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBc3NpZ25pbmcgYSBkZWZhdWx0IHJvdXRlIHRhYmxlXG4gICAgICB0aGlzLl9yb3V0ZVRhYmxlID0gbmV3IFJvdXRlVGFibGUodGhpcywgJ1JvdXRlVGFibGUnLCB7XG4gICAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgICByb3V0ZVRhYmxlTmFtZTogcHJvcHMuZGVmYXVsdFJvdXRlVGFibGVOYW1lID8/ICdEZWZhdWx0Q0RLUm91dGVUYWJsZScsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByb3V0ZUFzc29jID0gbmV3IENmblN1Ym5ldFJvdXRlVGFibGVBc3NvY2lhdGlvbih0aGlzLCAnUm91dGVUYWJsZUFzc29jaWF0aW9uJywge1xuICAgICAgc3VibmV0SWQ6IHRoaXMuc3VibmV0SWQsXG4gICAgICByb3V0ZVRhYmxlSWQ6IHRoaXMucm91dGVUYWJsZS5yb3V0ZVRhYmxlSWQsXG4gICAgfSk7XG5cbiAgICB0aGlzLl9pbnRlcm5ldENvbm5lY3Rpdml0eUVzdGFibGlzaGVkLmFkZChyb3V0ZUFzc29jKTtcblxuICAgIHRoaXMuaW50ZXJuZXRDb25uZWN0aXZpdHlFc3RhYmxpc2hlZCA9IHRoaXMuX2ludGVybmV0Q29ubmVjdGl2aXR5RXN0YWJsaXNoZWQ7XG5cbiAgICB0aGlzLnN1Ym5ldFR5cGUgPSBwcm9wcy5zdWJuZXRUeXBlO1xuICAgIHN0b3JlU3VibmV0VG9WcGNCeVR5cGUocHJvcHMudnBjLCB0aGlzLCBwcm9wcy5zdWJuZXRUeXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NvY2lhdGUgYSBOZXR3b3JrIEFDTCB3aXRoIHRoaXMgc3VibmV0XG4gICAqXG4gICAqIEBwYXJhbSBpZCBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgYXNzb2NpYXRpb24uXG4gICAqIEBwYXJhbSBuZXR3b3JrQWNsIFRoZSBOZXR3b3JrIEFDTCB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIHN1Ym5ldC5cbiAgICogVGhpcyBhbGxvd3MgY29udHJvbGxpbmcgaW5ib3VuZCBhbmQgb3V0Ym91bmQgdHJhZmZpYyBmb3IgaW5zdGFuY2VzIGluIHRoaXMgc3VibmV0LlxuICAgKi9cbiAgQE1ldGhvZE1ldGFkYXRhKClcbiAgcHVibGljIGFzc29jaWF0ZU5ldHdvcmtBY2woaWQ6IHN0cmluZywgbmV0d29ya0FjbDogSU5ldHdvcmtBY2wpIHtcbiAgICB0aGlzLl9uZXR3b3JrQWNsID0gbmV0d29ya0FjbDtcblxuICAgIGNvbnN0IHNjb3BlID0gbmV0d29ya0FjbCBpbnN0YW5jZW9mIENvbnN0cnVjdCA/IG5ldHdvcmtBY2wgOiB0aGlzO1xuICAgIGNvbnN0IG90aGVyID0gbmV0d29ya0FjbCBpbnN0YW5jZW9mIENvbnN0cnVjdCA/IHRoaXMgOiBuZXR3b3JrQWNsO1xuICAgIG5ldyBTdWJuZXROZXR3b3JrQWNsQXNzb2NpYXRpb24oc2NvcGUsIGlkICsgTmFtZXMubm9kZVVuaXF1ZUlkKG90aGVyLm5vZGUpLCB7XG4gICAgICBuZXR3b3JrQWNsLFxuICAgICAgc3VibmV0OiB0aGlzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgUm91dGUgVGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3VibmV0XG4gICAqL1xuICBwdWJsaWMgZ2V0IHJvdXRlVGFibGUoKTogSVJvdXRlVGFibGUge1xuICAgIHJldHVybiB0aGlzLl9yb3V0ZVRhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIE5ldHdvcmsgQUNMIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1Ym5ldC5cbiAgICovXG5cbiAgcHVibGljIGdldCBuZXR3b3JrQWNsKCk6IElOZXR3b3JrQWNsIHtcbiAgICByZXR1cm4gdGhpcy5fbmV0d29ya0FjbDtcbiAgfVxufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgcmVxdWlyZWQgdG8gaW1wb3J0IGEgc3VibmV0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3VibmV0VjJBdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIFRoZSBBdmFpbGFiaWxpdHkgWm9uZSB0aGlzIHN1Ym5ldCBpcyBsb2NhdGVkIGluXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gQVogaW5mb3JtYXRpb24sIGNhbm5vdCB1c2UgQVogc2VsZWN0aW9uIGZlYXR1cmVzXG4gICAqL1xuICByZWFkb25seSBhdmFpbGFiaWxpdHlab25lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJUHY0IENJRFIgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdWJuZXRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBDSURSIGluZm9ybWF0aW9uLCBjYW5ub3QgdXNlIENJRFIgZmlsdGVyIGZlYXR1cmVzXG4gICAqL1xuICByZWFkb25seSBpcHY0Q2lkckJsb2NrOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJUHY0IENJRFIgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdWJuZXRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBDSURSIGluZm9ybWF0aW9uLCBjYW5ub3QgdXNlIENJRFIgZmlsdGVyIGZlYXR1cmVzXG4gICAqL1xuICByZWFkb25seSBpcHY2Q2lkckJsb2NrPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIHJvdXRlIHRhYmxlIGZvciB0aGlzIHBhcnRpY3VsYXIgc3VibmV0XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gcm91dGUgdGFibGUgaW5mb3JtYXRpb24sIGNhbm5vdCBjcmVhdGUgVlBDIGVuZHBvaW50c1xuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVUYWJsZUlkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3VibmV0SWQgZm9yIHRoaXMgcGFydGljdWxhciBzdWJuZXRcbiAgICovXG4gIHJlYWRvbmx5IHN1Ym5ldElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHN1Ym5ldCAocHVibGljIG9yIHByaXZhdGUpIHRoYXQgdGhpcyBzdWJuZXQgcmVwcmVzZW50cy5cbiAgICovXG4gIHJlYWRvbmx5IHN1Ym5ldFR5cGU6IFN1Ym5ldFR5cGU7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIGdpdmVuIHN1Ym5ldFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHN1Ym5ldCBuYW1lXG4gICAqL1xuICByZWFkb25seSBzdWJuZXROYW1lPzogc3RyaW5nO1xuXG59XG5cbnR5cGUgRGVwcmVjYXRlZFN1Ym5ldFR5cGUgPSAnRGVwcmVjYXRlZF9Jc29sYXRlZCcgfCAnRGVwcmVjYXRlZF9Qcml2YXRlJztcbmNvbnN0IHN1Ym5ldFR5cGVNYXA6IHsgW2tleSBpbiBTdWJuZXRUeXBlIHwgRGVwcmVjYXRlZFN1Ym5ldFR5cGVdOiAodnBjOiBJVnBjVjIsIHN1Ym5ldDogU3VibmV0VjIpID0+IHZvaWQgfSA9IHtcbiAgW1N1Ym5ldFR5cGUuUFJJVkFURV9JU09MQVRFRF06ICh2cGM6IElWcGNWMiwgc3VibmV0OiBTdWJuZXRWMikgPT4gdnBjLmlzb2xhdGVkU3VibmV0cy5wdXNoKHN1Ym5ldCksXG4gIFtTdWJuZXRUeXBlLlBVQkxJQ106ICh2cGM6IElWcGNWMiwgc3VibmV0OiBTdWJuZXRWMikgPT4gdnBjLnB1YmxpY1N1Ym5ldHMucHVzaChzdWJuZXQpLFxuICBbU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTXTogKHZwYzogSVZwY1YyLCBzdWJuZXQ6IFN1Ym5ldFYyKSA9PiB2cGMucHJpdmF0ZVN1Ym5ldHMucHVzaChzdWJuZXQpLFxuICBbJ0RlcHJlY2F0ZWRfSXNvbGF0ZWQnXTogKHZwYzogSVZwY1YyLCBzdWJuZXQ6IFN1Ym5ldFYyKSA9PiB2cGMuaXNvbGF0ZWRTdWJuZXRzLnB1c2goc3VibmV0KSxcbiAgWydEZXByZWNhdGVkX1ByaXZhdGUnXTogKHZwYzogSVZwY1YyLCBzdWJuZXQ6IFN1Ym5ldFYyKSA9PiB2cGMucHJpdmF0ZVN1Ym5ldHMucHVzaChzdWJuZXQpLFxuICBbU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfTkFUXTogKHZwYzogSVZwY1YyLCBzdWJuZXQ6IFN1Ym5ldFYyKSA9PiB2cGMucHJpdmF0ZVN1Ym5ldHMucHVzaChzdWJuZXQpLFxufTtcblxuLyoqXG4gKiBTdG9yZXMgdGhlIHByb3ZpZGVkIHN1Ym5ldCBpbiB0aGUgVlBDJ3MgY29sbGVjdGlvbiBvZiBzdWJuZXRzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgc3VibmV0IHR5cGUuXG4gKlxuICogQHBhcmFtIHZwYyBUaGUgVlBDIGluc3RhbmNlIHRvIHdoaWNoIHRoZSBzdWJuZXQgYmVsb25ncy5cbiAqIEBwYXJhbSBzdWJuZXQgVGhlIHN1Ym5ldCBpbnN0YW5jZSB0byBiZSBzdG9yZWQuXG4gKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgc3VibmV0IChlLmcuLCBwdWJsaWMsIHByaXZhdGUsIGlzb2xhdGVkKS5cbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiBzdG9yZVN1Ym5ldFRvVnBjQnlUeXBlKHZwYzogSVZwY1YyLCBzdWJuZXQ6IFN1Ym5ldFYyLCB0eXBlOiBTdWJuZXRUeXBlKSB7XG4gIGNvbnN0IGZpbmRGdW5jdGlvblR5cGUgPSBzdWJuZXRUeXBlTWFwW3R5cGVdO1xuICBpZiAoZmluZEZ1bmN0aW9uVHlwZSkge1xuICAgIGZpbmRGdW5jdGlvblR5cGUodnBjLCBzdWJuZXQpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihgVW5zdXBwb3J0ZWQgc3VibmV0IHR5cGU6ICR7dHlwZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOZWVkIHRvIHNldCBleHBsaWNpdCBkZXBlbmRlbmN5IGFzIGR1cmluZyBzdGFjayBkZWxldGlvbixcbiAgICogdGhlIGNpZHIgYmxvY2tzIG1heSBnZXQgZGVsZXRlZCBmaXJzdCBhbmQgd2lsbCBmYWlsIGFzIHRoZSBzdWJuZXRzIGFyZSBzdGlsbCB1c2luZyB0aGUgY2lkciBibG9ja3NcbiAgICovXG4gIGlmICh2cGMuc2Vjb25kYXJ5Q2lkckJsb2NrKSB7XG4gICAgZm9yIChjb25zdCBjaWRyIG9mIHZwYy5zZWNvbmRhcnlDaWRyQmxvY2spIHtcbiAgICAgIHN1Ym5ldC5ub2RlLmFkZERlcGVuZGVuY3koY2lkcik7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIFZQQyBzdXBwb3J0cyBJUHY2IGFkZHJlc3Nlcy5cbiAqXG4gKiBAcGFyYW0gdnBjIFRoZSBWUEMgaW5zdGFuY2UgdG8gYmUgdmFsaWRhdGVkLlxuICogQHRocm93cyBWYWxpZGF0aW9uRXJyb3IgaWYgdGhlIFZQQyBkb2VzIG5vdCBzdXBwb3J0IElQdjYgYWRkcmVzc2VzLlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgVlBDIHN1cHBvcnRzIElQdjYgYWRkcmVzc2VzLCBmYWxzZSBvdGhlcndpc2UuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVTdXBwb3J0SXB2Nih2cGM6IElWcGNWMikge1xuICBpZiAodnBjLnNlY29uZGFyeUNpZHJCbG9jaykge1xuICAgIGlmICh2cGMuc2Vjb25kYXJ5Q2lkckJsb2NrLnNvbWUoKHNlY29uZGFyeUFkZHJlc3MpID0+IHNlY29uZGFyeUFkZHJlc3MuYW1hem9uUHJvdmlkZWRJcHY2Q2lkckJsb2NrID09PSB0cnVlIHx8XG4gIHNlY29uZGFyeUFkZHJlc3MuaXB2NklwYW1Qb29sSWQgIT09IHVuZGVmaW5lZCB8fCBzZWNvbmRhcnlBZGRyZXNzLmlwdjZQb29sICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKCdUbyB1c2UgSVB2NiwgdGhlIFZQQyBtdXN0IGVuYWJsZSBJUHY2IHN1cHBvcnQuJyk7XG4gICAgfVxuICB9IGVsc2Uge3JldHVybiBmYWxzZTt9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBwcm92aWRlZCBDSURSIHJhbmdlIGZhbGxzIHdpdGhpbiB0aGUgSVAgYWRkcmVzcyByYW5nZXMgb2YgdGhlIGdpdmVuIFZQQy5cbiAqXG4gKiBAcGFyYW0gdnBjIFRoZSBWUEMgaW5zdGFuY2UgdG8gY2hlY2sgYWdhaW5zdC5cbiAqIEBwYXJhbSBjaWRyUmFuZ2UgVGhlIENJRFIgcmFuZ2UgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIENJRFIgcmFuZ2UgZmFsbHMgd2l0aGluIHRoZSBWUEMncyBJUCBhZGRyZXNzIHJhbmdlcywgZmFsc2Ugb3RoZXJ3aXNlLlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGNoZWNrQ2lkclJhbmdlcyh2cGM6IElWcGNWMiwgY2lkclJhbmdlOiBzdHJpbmcpIHtcbiAgY29uc3QgdnBjQ2lkckJsb2NrID0gW3ZwYy5pcHY0Q2lkckJsb2NrXTtcbiAgY29uc3Qgc3VibmV0Q2lkckJsb2NrID0gbmV3IENpZHJCbG9jayhjaWRyUmFuZ2UpO1xuICBjb25zdCBhbGxDaWRyczogQ2lkckJsb2NrW10gPSBbXTtcblxuICAvLyBTZWNvbmRhcnkgSVAgYWRkcmVzc2VzIGFzc29pY2F0ZWQgdXNpbmcgdXNlciBkZWZpbmVkIElQdjQgcmFuZ2VcbiAgaWYgKHZwYy5zZWNvbmRhcnlDaWRyQmxvY2spIHtcbiAgICBmb3IgKGNvbnN0IGlwQWRkcmVzcyBvZiB2cGMuc2Vjb25kYXJ5Q2lkckJsb2NrKSB7XG4gICAgICBpZiAoaXBBZGRyZXNzLmNpZHJCbG9jaykge1xuICAgICAgICB2cGNDaWRyQmxvY2sucHVzaChpcEFkZHJlc3MuY2lkckJsb2NrKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2lkcnMgPSB2cGNDaWRyQmxvY2subWFwKGNpZHIgPT4gbmV3IENpZHJCbG9jayhjaWRyKSk7XG4gICAgYWxsQ2lkcnMucHVzaCguLi5jaWRycyk7XG4gIH1cblxuICAvLyBTZWNvbmRhcnkgSVAgYWRkcmVzc2VzIGFzc29pY2F0ZWQgdXNpbmcgSVBBTSBJUHY0IHJhbmdlXG4gIGlmICh2cGMuaXB2NElwYW1Qcm92aXNpb25lZENpZHJzKSB7XG4gICAgY29uc3QgY2lkcnMgPSB2cGMuaXB2NElwYW1Qcm92aXNpb25lZENpZHJzLm1hcChjaWRyID0+IG5ldyBDaWRyQmxvY2soY2lkcikpO1xuICAgIGFsbENpZHJzLnB1c2goLi4uY2lkcnMpO1xuICB9XG5cbiAgLy8gSWYgbm8gSVB2NCBpcyBhc3NpZ25lZCBhcyBzZWNvbmRhcnkgYWRkcmVzc1xuICBpZiAoYWxsQ2lkcnMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKCdObyBzZWNvbmRhcnkgSVAgYWRkcmVzcyBhdHRhY2hlZCB0byBWUEMnKTtcbiAgfVxuXG4gIHJldHVybiBhbGxDaWRycy5zb21lKGMgPT4gYy5jb250YWluc0NpZHIoc3VibmV0Q2lkckJsb2NrKSk7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGlmIHRoZSBwcm92aWRlZCBJUHY0IENJRFIgYmxvY2sgb3ZlcmxhcHMgd2l0aCBleGlzdGluZyBzdWJuZXQgQ0lEUiBibG9ja3Mgd2l0aGluIHRoZSBnaXZlbiBWUEMuXG4gKlxuICogQHBhcmFtIHZwYyBUaGUgVlBDIGluc3RhbmNlIHRvIGNoZWNrIGFnYWluc3QuXG4gKiBAcGFyYW0gaXB2NENpZHJCbG9jayBUaGUgSVB2NCBDSURSIGJsb2NrIHRvIGJlIHZhbGlkYXRlZC5cbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIElQdjQgQ0lEUiBibG9jayBvdmVybGFwcyB3aXRoIGV4aXN0aW5nIHN1Ym5ldCBDSURSIGJsb2NrcywgZmFsc2Ugb3RoZXJ3aXNlLlxuICogQGludGVybmFsXG4gKi9cblxuZnVuY3Rpb24gdmFsaWRhdGVPdmVybGFwcGluZ0NpZHJSYW5nZXModnBjOiBJVnBjVjIsIGlwdjRDaWRyQmxvY2s6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgYWxsU3VibmV0czogSVN1Ym5ldFYyW107XG4gIHRyeSB7XG4gICAgYWxsU3VibmV0cyA9IHZwYy5zZWxlY3RTdWJuZXRzKCkuc3VibmV0cztcbiAgfSBjYXRjaCAoZSkge1xuICAgICdObyBzdWJuZXRzIGluIFZQQyc7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgaXBNYXA6IFtzdHJpbmcsIHN0cmluZ11bXSA9IG5ldyBBcnJheSgpO1xuXG4gIGNvbnN0IGlucHV0UmFuZ2UgPSBuZXcgQ2lkckJsb2NrKGlwdjRDaWRyQmxvY2spO1xuXG4gIGNvbnN0IGlucHV0SXBNYXA6IFtzdHJpbmcsIHN0cmluZ10gPSBbaW5wdXRSYW5nZS5taW5JcCgpLCBpbnB1dFJhbmdlLm1heElwKCldO1xuXG4gIGZvciAoY29uc3Qgc3VibmV0IG9mIGFsbFN1Ym5ldHMpIHtcbiAgICBjb25zdCBjaWRyQmxvY2sgPSBuZXcgQ2lkckJsb2NrKHN1Ym5ldC5pcHY0Q2lkckJsb2NrKTtcbiAgICBpcE1hcC5wdXNoKFtjaWRyQmxvY2subWluSXAoKSwgY2lkckJsb2NrLm1heElwKCldKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcmFuZ2Ugb2YgaXBNYXApIHtcbiAgICBpZiAoaW5wdXRSYW5nZS5yYW5nZXNPdmVybGFwKHJhbmdlLCBpbnB1dElwTWFwKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBpZiB0aGUgcHJvdmlkZWQgSVB2NiBDSURSIGJsb2NrIG92ZXJsYXBzIHdpdGggZXhpc3Rpbmcgc3VibmV0IENJRFIgYmxvY2tzIHdpdGhpbiB0aGUgZ2l2ZW4gVlBDLlxuICpcbiAqIEBwYXJhbSB2cGMgVGhlIFZQQyBpbnN0YW5jZSB0byBjaGVjayBhZ2FpbnN0LlxuICogQHBhcmFtIGlwdjZDaWRyQmxvY2sgVGhlIElQdjYgQ0lEUiBibG9jayB0byBiZSB2YWxpZGF0ZWQuXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBJUHY2IENJRFIgYmxvY2sgb3ZlcmxhcHMgd2l0aCBleGlzdGluZyBzdWJuZXQgQ0lEUiBibG9ja3MsIGZhbHNlIG90aGVyd2lzZS5cbiAqIEB0aHJvd3MgVmFsaWRhdGlvbkVycm9yIGlmIG5vIHN1Ym5ldHMgYXJlIGZvdW5kIGluIHRoZSBWUEMuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVPdmVybGFwcGluZ0NpZHJSYW5nZXNpcHY2KHZwYzogSVZwY1YyLCBpcHY2Q2lkckJsb2NrOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IGFsbFN1Ym5ldHM6IElTdWJuZXRWMltdO1xuICB0cnkge1xuICAgIGFsbFN1Ym5ldHMgPSB2cGMuc2VsZWN0U3VibmV0cygpLnN1Ym5ldHM7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAnTm8gc3VibmV0cyBpbiBWUEMnO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGlwdjZNYXA6IHN0cmluZ1tdPSBbXTtcblxuICBjb25zdCBpbnB1dFJhbmdlID0gbmV3IENpZHJCbG9ja0lwdjYoaXB2NkNpZHJCbG9jayk7XG5cbiAgbGV0IHJlc3VsdCA6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBmb3IgKGNvbnN0IHN1Ym5ldCBvZiBhbGxTdWJuZXRzKSB7XG4gICAgaWYgKHN1Ym5ldC5pcHY2Q2lkckJsb2NrKSB7XG4gICAgICBjb25zdCBjaWRyQmxvY2sgPSBuZXcgQ2lkckJsb2NrSXB2NihzdWJuZXQuaXB2NkNpZHJCbG9jayk7XG4gICAgICBpcHY2TWFwLnB1c2goY2lkckJsb2NrLmNpZHIpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgcmFuZ2Ugb2YgaXB2Nk1hcCkge1xuICAgIGlmIChpbnB1dFJhbmdlLnJhbmdlc092ZXJsYXAocmFuZ2UsIGlucHV0UmFuZ2UuY2lkcikpIHtcbiAgICAgIHJlc3VsdCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==
|