@aws-cdk/aws-mediaconnect-alpha 2.263.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 +28415 -0
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +592 -0
- package/LICENSE +201 -0
- package/NOTICE +2 -0
- package/README.md +1280 -0
- package/awslint.json +50 -0
- package/grants.json +42 -0
- package/lib/bridge-output.d.ts +54 -0
- package/lib/bridge-output.js +122 -0
- package/lib/bridge-source.d.ts +79 -0
- package/lib/bridge-source.js +217 -0
- package/lib/bridge.d.ts +419 -0
- package/lib/bridge.js +490 -0
- package/lib/flow-entitlement.d.ts +86 -0
- package/lib/flow-entitlement.js +152 -0
- package/lib/flow-output.d.ts +329 -0
- package/lib/flow-output.js +415 -0
- package/lib/flow-source-configuration.d.ts +558 -0
- package/lib/flow-source-configuration.js +595 -0
- package/lib/flow-source.d.ts +116 -0
- package/lib/flow-source.js +190 -0
- package/lib/flow.d.ts +975 -0
- package/lib/flow.js +1065 -0
- package/lib/gateway.d.ts +142 -0
- package/lib/gateway.js +236 -0
- package/lib/index.d.ts +14 -0
- package/lib/index.js +31 -0
- package/lib/mediaconnect-grants.generated.d.ts +53 -0
- package/lib/mediaconnect-grants.generated.js +136 -0
- package/lib/router-input.d.ts +686 -0
- package/lib/router-input.js +1095 -0
- package/lib/router-network-interface.d.ts +153 -0
- package/lib/router-network-interface.js +245 -0
- package/lib/router-output.d.ts +557 -0
- package/lib/router-output.js +789 -0
- package/lib/shared.d.ts +548 -0
- package/lib/shared.js +668 -0
- package/package.json +118 -0
- package/rosetta/_generated.ts-fixture +6 -0
- package/rosetta/default.ts-fixture +68 -0
package/lib/bridge.js
ADDED
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
3
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
4
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
5
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
6
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
7
|
+
var _, done = false;
|
|
8
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
9
|
+
var context = {};
|
|
10
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
11
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
12
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
13
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
14
|
+
if (kind === "accessor") {
|
|
15
|
+
if (result === void 0) continue;
|
|
16
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
17
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
18
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
19
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
20
|
+
}
|
|
21
|
+
else if (_ = accept(result)) {
|
|
22
|
+
if (kind === "field") initializers.unshift(_);
|
|
23
|
+
else descriptor[key] = _;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
27
|
+
done = true;
|
|
28
|
+
};
|
|
29
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
30
|
+
var useValue = arguments.length > 2;
|
|
31
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
32
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
33
|
+
}
|
|
34
|
+
return useValue ? value : void 0;
|
|
35
|
+
};
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.Bridge = exports.BridgeConfiguration = exports.BridgeFailoverConfig = exports.BridgeOutputConfiguration = exports.BridgeType = void 0;
|
|
38
|
+
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
|
|
39
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
40
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
41
|
+
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
|
|
42
|
+
const aws_mediaconnect_1 = require("aws-cdk-lib/aws-mediaconnect");
|
|
43
|
+
const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
|
|
44
|
+
const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
|
|
45
|
+
const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
|
|
46
|
+
const bridge_output_1 = require("./bridge-output");
|
|
47
|
+
const shared_1 = require("./shared");
|
|
48
|
+
/**
|
|
49
|
+
* Configuration of bridge type
|
|
50
|
+
*/
|
|
51
|
+
class BridgeType {
|
|
52
|
+
value;
|
|
53
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.BridgeType", version: "2.263.0-alpha.0" };
|
|
54
|
+
/**
|
|
55
|
+
* Ingress Bridge
|
|
56
|
+
*/
|
|
57
|
+
static INGRESS_BRIDGE = new BridgeType('ingress_bridge');
|
|
58
|
+
/**
|
|
59
|
+
* Egress Bridge
|
|
60
|
+
*/
|
|
61
|
+
static EGRESS_BRIDGE = new BridgeType('egress_bridge');
|
|
62
|
+
/**
|
|
63
|
+
* Use a custom bridge type value
|
|
64
|
+
* @param value The bridge type string value
|
|
65
|
+
*/
|
|
66
|
+
static of(value) {
|
|
67
|
+
return new BridgeType(value);
|
|
68
|
+
}
|
|
69
|
+
/** @param value The bridge type string value */
|
|
70
|
+
constructor(value) {
|
|
71
|
+
this.value = value;
|
|
72
|
+
}
|
|
73
|
+
/** Returns the string value */
|
|
74
|
+
toString() {
|
|
75
|
+
return this.value;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.BridgeType = BridgeType;
|
|
79
|
+
/**
|
|
80
|
+
* Configuration for a bridge output.
|
|
81
|
+
*/
|
|
82
|
+
class BridgeOutputConfiguration {
|
|
83
|
+
_network;
|
|
84
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.BridgeOutputConfiguration", version: "2.263.0-alpha.0" };
|
|
85
|
+
/**
|
|
86
|
+
* Create a network output configuration for a bridge.
|
|
87
|
+
*/
|
|
88
|
+
static network(props) {
|
|
89
|
+
try {
|
|
90
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_BridgeNetworkOutputProps(props);
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
94
|
+
Error.captureStackTrace(error, this.network);
|
|
95
|
+
}
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
if (!aws_cdk_lib_1.Token.isUnresolved(props.ttl) && (props.ttl < 1 || props.ttl > 255)) {
|
|
99
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `BridgeOutputTtlRange`, `TTL must be between 1 and 255 hops, got ${props.ttl}`);
|
|
100
|
+
}
|
|
101
|
+
return new BridgeOutputConfiguration(props);
|
|
102
|
+
}
|
|
103
|
+
constructor(_network) {
|
|
104
|
+
this._network = _network;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* @internal
|
|
108
|
+
*/
|
|
109
|
+
_bind() {
|
|
110
|
+
return {
|
|
111
|
+
ipAddress: this._network.ipAddress,
|
|
112
|
+
networkName: this._network.network.name,
|
|
113
|
+
port: this._network.port,
|
|
114
|
+
protocol: this._network.protocol.value,
|
|
115
|
+
ttl: this._network.ttl,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
exports.BridgeOutputConfiguration = BridgeOutputConfiguration;
|
|
120
|
+
/**
|
|
121
|
+
* Source failover configuration for a bridge.
|
|
122
|
+
*
|
|
123
|
+
* Bridges only support `FAILOVER` (switchover) mode — the `MERGE` mode available on
|
|
124
|
+
* `Flow.sourceFailoverConfig` is not allowed on bridges by the service. Use
|
|
125
|
+
* {@link BridgeFailoverConfig.failover} to construct the configuration.
|
|
126
|
+
*/
|
|
127
|
+
class BridgeFailoverConfig {
|
|
128
|
+
_state;
|
|
129
|
+
_primarySource;
|
|
130
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.BridgeFailoverConfig", version: "2.263.0-alpha.0" };
|
|
131
|
+
/**
|
|
132
|
+
* Configure switchover-mode failover. The bridge swaps to the backup source when
|
|
133
|
+
* the primary source stops receiving data.
|
|
134
|
+
*/
|
|
135
|
+
static failover(options = {}) {
|
|
136
|
+
try {
|
|
137
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_BridgeFailoverOptions(options);
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
141
|
+
Error.captureStackTrace(error, this.failover);
|
|
142
|
+
}
|
|
143
|
+
throw error;
|
|
144
|
+
}
|
|
145
|
+
return new BridgeFailoverConfig(options.state ?? shared_1.State.ENABLED, options.primarySource);
|
|
146
|
+
}
|
|
147
|
+
constructor(_state, _primarySource) {
|
|
148
|
+
this._state = _state;
|
|
149
|
+
this._primarySource = _primarySource;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Whether this configuration has failover enabled.
|
|
153
|
+
* @internal
|
|
154
|
+
*/
|
|
155
|
+
get _isEnabled() {
|
|
156
|
+
return this._state === shared_1.State.ENABLED;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Called when the configuration is bound to a Bridge.
|
|
160
|
+
* @internal
|
|
161
|
+
*/
|
|
162
|
+
_bind() {
|
|
163
|
+
return {
|
|
164
|
+
failoverMode: shared_1.FailoverMode.FAILOVER.value,
|
|
165
|
+
state: this._state,
|
|
166
|
+
sourcePriority: this._primarySource ? { primarySource: this._primarySource } : undefined,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
exports.BridgeFailoverConfig = BridgeFailoverConfig;
|
|
171
|
+
/**
|
|
172
|
+
* Bridge configuration to set ingress and egress options on the bridge
|
|
173
|
+
*/
|
|
174
|
+
class BridgeConfiguration {
|
|
175
|
+
_bridgeType;
|
|
176
|
+
_ingressConfig;
|
|
177
|
+
_egressConfig;
|
|
178
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.BridgeConfiguration", version: "2.263.0-alpha.0" };
|
|
179
|
+
/**
|
|
180
|
+
* An ingress bridge is a ground-to-cloud bridge. The content originates at your premises and is delivered to the cloud.
|
|
181
|
+
*/
|
|
182
|
+
static ingress(config) {
|
|
183
|
+
try {
|
|
184
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_IngressBridgeConfiguration(config);
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
188
|
+
Error.captureStackTrace(error, this.ingress);
|
|
189
|
+
}
|
|
190
|
+
throw error;
|
|
191
|
+
}
|
|
192
|
+
if (!config.maxBitrate.isUnresolved()) {
|
|
193
|
+
const bitrateBps = config.maxBitrate.toBps();
|
|
194
|
+
if (bitrateBps < 1000000 || bitrateBps > 100000000) {
|
|
195
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `BridgeIngressBitrateRange`, `Bridge ingress max bitrate must be between 1,000,000 and 100,000,000 bps, got ${bitrateBps}`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (!aws_cdk_lib_1.Token.isUnresolved(config.networkSources) && config.networkSources.length > 2) {
|
|
199
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `BridgeMaxNetworkSources`, `A bridge supports a maximum of 2 network sources, got ${config.networkSources.length}`);
|
|
200
|
+
}
|
|
201
|
+
return new BridgeConfiguration(BridgeType.INGRESS_BRIDGE, config, undefined);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* An egress bridge is a cloud-to-ground bridge. The content comes from an existing MediaConnect flow and is delivered to your premises.
|
|
205
|
+
*/
|
|
206
|
+
static egress(config) {
|
|
207
|
+
try {
|
|
208
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_EgressBridgeConfiguration(config);
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
212
|
+
Error.captureStackTrace(error, this.egress);
|
|
213
|
+
}
|
|
214
|
+
throw error;
|
|
215
|
+
}
|
|
216
|
+
if (!config.maxBitrate.isUnresolved()) {
|
|
217
|
+
const bitrateBps = config.maxBitrate.toBps();
|
|
218
|
+
if (bitrateBps < 1000000 || bitrateBps > 100000000) {
|
|
219
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `BridgeEgressBitrateRange`, `Bridge egress max bitrate must be between 1,000,000 and 100,000,000 bps, got ${bitrateBps}`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if (!aws_cdk_lib_1.Token.isUnresolved(config.flowSources) && config.flowSources.length > 2) {
|
|
223
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `BridgeMaxFlowSources`, `A bridge supports a maximum of 2 flow sources, got ${config.flowSources.length}`);
|
|
224
|
+
}
|
|
225
|
+
if (!aws_cdk_lib_1.Token.isUnresolved(config.networkOutputs) && config.networkOutputs.length > 2) {
|
|
226
|
+
throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `BridgeMaxNetworkOutputs`, `A bridge supports a maximum of 2 network outputs, got ${config.networkOutputs.length}`);
|
|
227
|
+
}
|
|
228
|
+
return new BridgeConfiguration(BridgeType.EGRESS_BRIDGE, undefined, config);
|
|
229
|
+
}
|
|
230
|
+
constructor(_bridgeType, _ingressConfig, _egressConfig) {
|
|
231
|
+
this._bridgeType = _bridgeType;
|
|
232
|
+
this._ingressConfig = _ingressConfig;
|
|
233
|
+
this._egressConfig = _egressConfig;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Called when the bridge configuration is bound to a Bridge.
|
|
237
|
+
* @internal
|
|
238
|
+
*/
|
|
239
|
+
_bind() {
|
|
240
|
+
return {
|
|
241
|
+
bridgeType: this._bridgeType,
|
|
242
|
+
ingressConfig: this._ingressConfig,
|
|
243
|
+
egressConfig: this._egressConfig,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
exports.BridgeConfiguration = BridgeConfiguration;
|
|
248
|
+
class BridgeBase extends aws_cdk_lib_1.Resource {
|
|
249
|
+
/**
|
|
250
|
+
* Creates a Bridge construct that represents an external (imported) Bridge.
|
|
251
|
+
*/
|
|
252
|
+
static fromBridgeAttributes(scope, id, attrs) {
|
|
253
|
+
class Import extends BridgeBase {
|
|
254
|
+
bridgeArn = attrs.bridgeArn;
|
|
255
|
+
bridgeState = undefined;
|
|
256
|
+
get bridgeName() {
|
|
257
|
+
if (attrs.bridgeName)
|
|
258
|
+
return attrs.bridgeName;
|
|
259
|
+
throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `BridgeNameNotProvided`, `'bridgeName' was not provided when importing Bridge ${this.node.path}; provide it in fromBridgeAttributes()`, this);
|
|
260
|
+
}
|
|
261
|
+
get bridgeType() {
|
|
262
|
+
if (attrs.bridgeType)
|
|
263
|
+
return attrs.bridgeType;
|
|
264
|
+
throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `BridgeTypeNotProvided`, `'bridgeType' was not provided when importing Bridge ${this.node.path}; provide it in fromBridgeAttributes()`, this);
|
|
265
|
+
}
|
|
266
|
+
// Imported bridges default to `false`. Pass `isFailoverEnabled: true` in the
|
|
267
|
+
// attributes when the real service-side bridge has failover enabled and you
|
|
268
|
+
// need to add a BridgeSource.
|
|
269
|
+
isFailoverEnabled = attrs.isFailoverEnabled ?? false;
|
|
270
|
+
}
|
|
271
|
+
return new Import(scope, id);
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Import an existing Bridge from its ARN.
|
|
275
|
+
*
|
|
276
|
+
* Use `fromBridgeAttributes()` instead if you need access to `bridgeName`, `bridgeType`
|
|
277
|
+
* (required for `addOutput()`), or `isFailoverEnabled`.
|
|
278
|
+
*/
|
|
279
|
+
static fromBridgeArn(scope, id, bridgeArn) {
|
|
280
|
+
return Bridge.fromBridgeAttributes(scope, id, { bridgeArn });
|
|
281
|
+
}
|
|
282
|
+
/** A reference to this Bridge resource. */
|
|
283
|
+
get bridgeRef() {
|
|
284
|
+
return { bridgeArn: this.bridgeArn };
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Create a CloudWatch metric for this bridge.
|
|
288
|
+
*/
|
|
289
|
+
metric(metricName, props) {
|
|
290
|
+
return new aws_cloudwatch_1.Metric({
|
|
291
|
+
metricName,
|
|
292
|
+
namespace: 'AWS/MediaConnect',
|
|
293
|
+
...props,
|
|
294
|
+
dimensionsMap: {
|
|
295
|
+
BridgeARN: this.bridgeArn,
|
|
296
|
+
...props?.dimensionsMap,
|
|
297
|
+
},
|
|
298
|
+
}).attachTo(this);
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Metric for the bitrate of a specific bridge source.
|
|
302
|
+
*/
|
|
303
|
+
metricSourceBitrate(bridgeSourceName, props) {
|
|
304
|
+
const metricName = this.bridgeType.value === BridgeType.EGRESS_BRIDGE.value
|
|
305
|
+
? 'EgressBridgeSourceBitRate'
|
|
306
|
+
: 'IngressBridgeSourceBitRate';
|
|
307
|
+
return new aws_cloudwatch_1.Metric({
|
|
308
|
+
metricName,
|
|
309
|
+
namespace: 'AWS/MediaConnect',
|
|
310
|
+
statistic: 'avg',
|
|
311
|
+
period: aws_cdk_lib_1.Duration.seconds(60),
|
|
312
|
+
unit: aws_cloudwatch_1.Unit.BITS_PER_SECOND,
|
|
313
|
+
...props,
|
|
314
|
+
dimensionsMap: {
|
|
315
|
+
BridgeARN: this.bridgeArn,
|
|
316
|
+
BridgeSourceName: bridgeSourceName,
|
|
317
|
+
...props?.dimensionsMap,
|
|
318
|
+
},
|
|
319
|
+
}).attachTo(this);
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Metric for the percentage of packets lost on a specific bridge source.
|
|
323
|
+
*/
|
|
324
|
+
metricSourcePacketLossPercent(bridgeSourceName, props) {
|
|
325
|
+
const metricName = this.bridgeType.value === BridgeType.EGRESS_BRIDGE.value
|
|
326
|
+
? 'EgressBridgeSourcePacketLossPercent'
|
|
327
|
+
: 'IngressBridgeSourcePacketLossPercent';
|
|
328
|
+
return new aws_cloudwatch_1.Metric({
|
|
329
|
+
metricName,
|
|
330
|
+
namespace: 'AWS/MediaConnect',
|
|
331
|
+
statistic: 'avg',
|
|
332
|
+
period: aws_cdk_lib_1.Duration.seconds(60),
|
|
333
|
+
unit: aws_cloudwatch_1.Unit.PERCENT,
|
|
334
|
+
...props,
|
|
335
|
+
dimensionsMap: {
|
|
336
|
+
BridgeARN: this.bridgeArn,
|
|
337
|
+
BridgeSourceName: bridgeSourceName,
|
|
338
|
+
...props?.dimensionsMap,
|
|
339
|
+
},
|
|
340
|
+
}).attachTo(this);
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Metric for the total number of times the bridge switches between sources
|
|
344
|
+
* when using the `FAILOVER` failover mode.
|
|
345
|
+
*/
|
|
346
|
+
metricFailoverSwitches(props) {
|
|
347
|
+
const metricName = this.bridgeType.value === BridgeType.EGRESS_BRIDGE.value
|
|
348
|
+
? 'EgressBridgeFailoverSwitches'
|
|
349
|
+
: 'IngressBridgeFailoverSwitches';
|
|
350
|
+
return this.metric(metricName, {
|
|
351
|
+
statistic: 'sum',
|
|
352
|
+
period: aws_cdk_lib_1.Duration.seconds(60),
|
|
353
|
+
unit: aws_cloudwatch_1.Unit.COUNT,
|
|
354
|
+
...props,
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Add a network output to this bridge (for egress bridges only).
|
|
359
|
+
*
|
|
360
|
+
* @param id Construct id for the new BridgeOutput
|
|
361
|
+
* @param networkOutput The named output to add. The `name` is the output's identity on the bridge and must be unique among outputs.
|
|
362
|
+
*/
|
|
363
|
+
addOutput(id, networkOutput) {
|
|
364
|
+
if (this.bridgeType.value !== BridgeType.EGRESS_BRIDGE.value) {
|
|
365
|
+
throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `BridgeEgressOnly`, `addOutput can only be called on egress bridges, got '${this.bridgeType.value}'`, this);
|
|
366
|
+
}
|
|
367
|
+
return new bridge_output_1.BridgeOutput(this, id, {
|
|
368
|
+
bridgeOutputName: networkOutput.name,
|
|
369
|
+
bridge: this,
|
|
370
|
+
output: networkOutput.output,
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Defines a AWS Elemental MediaConnect Bridge
|
|
376
|
+
*/
|
|
377
|
+
let Bridge = (() => {
|
|
378
|
+
let _classDecorators = [prop_injectable_1.propertyInjectable];
|
|
379
|
+
let _classDescriptor;
|
|
380
|
+
let _classExtraInitializers = [];
|
|
381
|
+
let _classThis;
|
|
382
|
+
let _classSuper = BridgeBase;
|
|
383
|
+
var Bridge = class extends _classSuper {
|
|
384
|
+
static { _classThis = this; }
|
|
385
|
+
static {
|
|
386
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
387
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
388
|
+
Bridge = _classThis = _classDescriptor.value;
|
|
389
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
390
|
+
}
|
|
391
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.Bridge", version: "2.263.0-alpha.0" };
|
|
392
|
+
/** Uniquely identifies this class. */
|
|
393
|
+
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-mediaconnect-alpha.Bridge';
|
|
394
|
+
bridgeArn;
|
|
395
|
+
bridgeName;
|
|
396
|
+
bridgeType;
|
|
397
|
+
bridgeState;
|
|
398
|
+
isFailoverEnabled = false;
|
|
399
|
+
constructor(scope, id, props) {
|
|
400
|
+
super(scope, id, {
|
|
401
|
+
physicalName: props?.bridgeName ?? aws_cdk_lib_1.Lazy.string({ produce: () => aws_cdk_lib_1.Names.uniqueResourceName(this, { maxLength: 64 }) }),
|
|
402
|
+
});
|
|
403
|
+
try {
|
|
404
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_BridgeProps(props);
|
|
405
|
+
}
|
|
406
|
+
catch (error) {
|
|
407
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
408
|
+
Error.captureStackTrace(error, Bridge);
|
|
409
|
+
}
|
|
410
|
+
throw error;
|
|
411
|
+
}
|
|
412
|
+
// Validate bridge name if provided
|
|
413
|
+
if (props.bridgeName != null && props.bridgeName !== '' && !aws_cdk_lib_1.Token.isUnresolved(props.bridgeName)) {
|
|
414
|
+
if (props.bridgeName.length > 64) {
|
|
415
|
+
throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `BridgeNameLength`, `Bridge name must be between 1 and 64 characters, got ${props.bridgeName.length}`, this);
|
|
416
|
+
}
|
|
417
|
+
if (!/^[a-zA-Z0-9-]+$/.test(props.bridgeName)) {
|
|
418
|
+
throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `BridgeNameFormat`, `Bridge name must contain only alphanumeric characters and hyphens, got '${props.bridgeName}'`, this);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
// Enhanced CDK Analytics Telemetry
|
|
422
|
+
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
423
|
+
this.isFailoverEnabled = props.sourceFailoverConfig?._isEnabled ?? false;
|
|
424
|
+
const config = props.config;
|
|
425
|
+
const configBind = config._bind();
|
|
426
|
+
const ingress = configBind.ingressConfig ? {
|
|
427
|
+
ingressGatewayBridge: {
|
|
428
|
+
maxBitrate: configBind.ingressConfig.maxBitrate.toBps(),
|
|
429
|
+
maxOutputs: configBind.ingressConfig.maxOutputs,
|
|
430
|
+
},
|
|
431
|
+
sources: configBind.ingressConfig.networkSources.map(input => {
|
|
432
|
+
return {
|
|
433
|
+
networkSource: {
|
|
434
|
+
name: input.name,
|
|
435
|
+
multicastIp: input.source.multicastIp,
|
|
436
|
+
networkName: input.source.network.name,
|
|
437
|
+
port: input.source.port,
|
|
438
|
+
protocol: input.source.protocol.value,
|
|
439
|
+
multicastSourceSettings: {
|
|
440
|
+
multicastSourceIp: input.source.multicastSourceIp,
|
|
441
|
+
},
|
|
442
|
+
},
|
|
443
|
+
};
|
|
444
|
+
}),
|
|
445
|
+
} : undefined;
|
|
446
|
+
const egress = configBind.egressConfig ? {
|
|
447
|
+
egressGatewayBridge: {
|
|
448
|
+
maxBitrate: configBind.egressConfig.maxBitrate.toBps(),
|
|
449
|
+
},
|
|
450
|
+
sources: configBind.egressConfig.flowSources.map(input => this.formatBridgeFlowSource(input)),
|
|
451
|
+
outputs: configBind.egressConfig.networkOutputs.map(no => ({
|
|
452
|
+
networkOutput: { name: no.name, ...no.output._bind() },
|
|
453
|
+
})),
|
|
454
|
+
} : undefined;
|
|
455
|
+
const bridge = new aws_mediaconnect_1.CfnBridge(this, 'Resource', {
|
|
456
|
+
name: this.physicalName,
|
|
457
|
+
placementArn: props.gateway.gatewayArn,
|
|
458
|
+
ingressGatewayBridge: ingress?.ingressGatewayBridge,
|
|
459
|
+
egressGatewayBridge: egress?.egressGatewayBridge,
|
|
460
|
+
sources: ingress?.sources ?? egress?.sources ?? [],
|
|
461
|
+
outputs: egress?.outputs,
|
|
462
|
+
sourceFailoverConfig: props.sourceFailoverConfig?._bind(),
|
|
463
|
+
});
|
|
464
|
+
this.bridgeArn = bridge.attrBridgeArn;
|
|
465
|
+
this.bridgeName = this.physicalName;
|
|
466
|
+
this.bridgeState = bridge.attrBridgeState;
|
|
467
|
+
this.bridgeType = configBind.bridgeType;
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Format bridge flow source into BridgeSourceProperty format
|
|
471
|
+
*/
|
|
472
|
+
formatBridgeFlowSource(input) {
|
|
473
|
+
return {
|
|
474
|
+
flowSource: {
|
|
475
|
+
flowArn: input.source.flow.flowArn,
|
|
476
|
+
name: input.name,
|
|
477
|
+
flowVpcInterfaceAttachment: input.source.vpcInterface ? {
|
|
478
|
+
vpcInterfaceName: input.source.vpcInterface.name,
|
|
479
|
+
} : undefined,
|
|
480
|
+
},
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
static {
|
|
484
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
485
|
+
}
|
|
486
|
+
};
|
|
487
|
+
return Bridge = _classThis;
|
|
488
|
+
})();
|
|
489
|
+
exports.Bridge = Bridge;
|
|
490
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJpZGdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYnJpZGdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLDZDQUErRztBQUUvRywrREFBMEQ7QUFDMUQsbUVBQXlEO0FBRXpELDRFQUE0RDtBQUM1RCw4RUFBOEU7QUFDOUUsMEVBQTBFO0FBRzFFLG1EQUErQztBQUkvQyxxQ0FBK0M7QUFnRC9DOztHQUVHO0FBQ0gsTUFBYSxVQUFVO0lBbUJlOztJQWxCcEM7O09BRUc7SUFDSSxNQUFNLENBQVUsY0FBYyxHQUFHLElBQUksVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDekU7O09BRUc7SUFDSSxNQUFNLENBQVUsYUFBYSxHQUFHLElBQUksVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBRXZFOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBYTtRQUM1QixPQUFPLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzlCO0lBRUQsZ0RBQWdEO0lBQ2hELFlBQW9DLEtBQWE7UUFBYixVQUFLLEdBQUwsS0FBSyxDQUFRO0tBQUk7SUFFckQsK0JBQStCO0lBQ3hCLFFBQVE7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7S0FDbkI7O0FBeEJILGdDQXlCQztBQWtMRDs7R0FFRztBQUNILE1BQWEseUJBQXlCO0lBV0M7O0lBVnJDOztPQUVHO0lBQ0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUErQjs7Ozs7Ozs7OztRQUNuRCxJQUFJLENBQUMsbUJBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pFLE1BQU0sSUFBSSxxQ0FBdUIsQ0FBQyxJQUFBLHNCQUFHLEVBQUEs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Ozs7O0FBQU4sd0JBQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEJpdHJhdGUsIElSZXNvdXJjZSB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IER1cmF0aW9uLCBSZXNvdXJjZSwgTGF6eSwgTmFtZXMsIFRva2VuLCBWYWxpZGF0aW9uRXJyb3IsIFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHR5cGUgeyBNZXRyaWNPcHRpb25zIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0IHsgTWV0cmljLCBVbml0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0IHsgQ2ZuQnJpZGdlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLW1lZGlhY29ubmVjdCc7XG5pbXBvcnQgdHlwZSB7IElCcmlkZ2VSZWYsIEJyaWRnZVJlZmVyZW5jZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1tZWRpYWNvbm5lY3QnO1xuaW1wb3J0IHsgbGl0IH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvaGVscGVycy1pbnRlcm5hbCc7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcbmltcG9ydCB7IHByb3BlcnR5SW5qZWN0YWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL3Byb3AtaW5qZWN0YWJsZSc7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHR5cGUgeyBJQnJpZGdlT3V0cHV0IH0gZnJvbSAnLi9icmlkZ2Utb3V0cHV0JztcbmltcG9ydCB7IEJyaWRnZU91dHB1dCB9IGZyb20gJy4vYnJpZGdlLW91dHB1dCc7XG5pbXBvcnQgdHlwZSB7IElGbG93IH0gZnJvbSAnLi9mbG93JztcbmltcG9ydCB0eXBlIHsgSUdhdGV3YXkgfSBmcm9tICcuL2dhdGV3YXknO1xuaW1wb3J0IHR5cGUgeyBCcmlkZ2VQcm90b2NvbCwgQnJpZGdlTmV0d29ya1NvdXJjZSwgR2F0ZXdheU5ldHdvcmssIFZwY0ludGVyZmFjZUNvbmZpZyB9IGZyb20gJy4vc2hhcmVkJztcbmltcG9ydCB7IEZhaWxvdmVyTW9kZSwgU3RhdGUgfSBmcm9tICcuL3NoYXJlZCc7XG5cbi8qKlxuICogVGhlIHNvdXJjZSBvZiB0aGUgYnJpZGdlLiBBIGZsb3cgc291cmNlIG9yaWdpbmF0ZXMgaW4gTWVkaWFDb25uZWN0IGFzIGFuIGV4aXN0aW5nIGNsb3VkIGZsb3cuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJpZGdlRmxvd1NvdXJjZSB7XG4gIC8qKlxuICAgKiBUaGUgY2xvdWQgZmxvdyB1c2VkIGFzIGEgc291cmNlIG9mIHRoaXMgYnJpZGdlLlxuICAgKi9cbiAgcmVhZG9ubHkgZmxvdzogSUZsb3c7XG4gIC8qKlxuICAgKiBUaGUgVlBDIGludGVyZmFjZSBhdHRhY2htZW50IHRvIHVzZSBmb3IgdGhpcyBzb3VyY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gVlBDIGludGVyZmFjZVxuICAgKi9cbiAgcmVhZG9ubHkgdnBjSW50ZXJmYWNlPzogVnBjSW50ZXJmYWNlQ29uZmlnO1xufVxuXG4vKipcbiAqIEEgbmFtZWQgZmxvdyBzb3VyY2UgZm9yIGFuIGVncmVzcyBicmlkZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJpZGdlRmxvd0lucHV0IHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmbG93IHNvdXJjZS4gTXVzdCBiZSB1bmlxdWUgYW1vbmcgc291cmNlcyBvbiB0aGUgYnJpZGdlLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZmxvdyBzb3VyY2UgY29uZmlndXJhdGlvbiBkZXNjcmliaW5nIHdoZXJlIHRoZSBicmlkZ2UgY29uc3VtZXMgY29udGVudCBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlOiBCcmlkZ2VGbG93U291cmNlO1xufVxuXG4vKipcbiAqIEEgbmFtZWQgbmV0d29yayBzb3VyY2UgZm9yIGFuIGluZ3Jlc3MgYnJpZGdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJyaWRnZU5ldHdvcmtJbnB1dCB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbmV0d29yayBzb3VyY2UuIE11c3QgYmUgdW5pcXVlIGFtb25nIHNvdXJjZXMgb24gdGhlIGJyaWRnZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5ldHdvcmsgc291cmNlIGNvbmZpZ3VyYXRpb24gZGVzY3JpYmluZyB0aGUgbXVsdGljYXN0IGVuZHBvaW50IHRoZSBicmlkZ2UgbGlzdGVucyB0by5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZTogQnJpZGdlTmV0d29ya1NvdXJjZTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9mIGJyaWRnZSB0eXBlXG4gKi9cbmV4cG9ydCBjbGFzcyBCcmlkZ2VUeXBlIHtcbiAgLyoqXG4gICAqIEluZ3Jlc3MgQnJpZGdlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IElOR1JFU1NfQlJJREdFID0gbmV3IEJyaWRnZVR5cGUoJ2luZ3Jlc3NfYnJpZGdlJyk7XG4gIC8qKlxuICAgKiBFZ3Jlc3MgQnJpZGdlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEVHUkVTU19CUklER0UgPSBuZXcgQnJpZGdlVHlwZSgnZWdyZXNzX2JyaWRnZScpO1xuXG4gIC8qKlxuICAgKiBVc2UgYSBjdXN0b20gYnJpZGdlIHR5cGUgdmFsdWVcbiAgICogQHBhcmFtIHZhbHVlIFRoZSBicmlkZ2UgdHlwZSBzdHJpbmcgdmFsdWVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb2YodmFsdWU6IHN0cmluZyk6IEJyaWRnZVR5cGUge1xuICAgIHJldHVybiBuZXcgQnJpZGdlVHlwZSh2YWx1ZSk7XG4gIH1cblxuICAvKiogQHBhcmFtIHZhbHVlIFRoZSBicmlkZ2UgdHlwZSBzdHJpbmcgdmFsdWUgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IHN0cmluZykge31cblxuICAvKiogUmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBicmlkZ2UgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzXG4gKi9cbmludGVyZmFjZSBCcmlkZ2VDb25maWd1cmF0aW9uQmFzZSB7XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBleHBlY3RlZCBiaXRyYXRlIChpbiBicHMpIG9mIHRoZSBicmlkZ2UuXG4gICAqL1xuICByZWFkb25seSBtYXhCaXRyYXRlOiBCaXRyYXRlO1xufVxuXG4vKipcbiAqIEluZ3Jlc3MgYnJpZGdlIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdyZXNzQnJpZGdlQ29uZmlndXJhdGlvbiBleHRlbmRzIEJyaWRnZUNvbmZpZ3VyYXRpb25CYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBvdXRwdXRzIG9uIHRoZSBpbmdyZXNzIGJyaWRnZS5cbiAgICovXG4gIHJlYWRvbmx5IG1heE91dHB1dHM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBuZXR3b3JrIHNvdXJjZXMgZm9yIHRoZSBpbmdyZXNzIGJyaWRnZS5cbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcmtTb3VyY2VzOiBCcmlkZ2VOZXR3b3JrSW5wdXRbXTtcbn1cblxuLyoqXG4gKiBFZ3Jlc3MgYnJpZGdlIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFZ3Jlc3NCcmlkZ2VDb25maWd1cmF0aW9uIGV4dGVuZHMgQnJpZGdlQ29uZmlndXJhdGlvbkJhc2Uge1xuICAvKipcbiAgICogVGhlIGZsb3cgc291cmNlcyBmb3IgdGhlIGVncmVzcyBicmlkZ2UuXG4gICAqL1xuICByZWFkb25seSBmbG93U291cmNlczogQnJpZGdlRmxvd0lucHV0W107XG4gIC8qKlxuICAgKiBUaGUgbmV0d29yayBvdXRwdXRzIGZvciB0aGUgZWdyZXNzIGJyaWRnZS5cbiAgICovXG4gIHJlYWRvbmx5IG5ldHdvcmtPdXRwdXRzOiBCcmlkZ2VOZXR3b3JrT3V0cHV0W107XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBCcmlkZ2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQnJpZGdlIGV4dGVuZHMgSVJlc291cmNlLCBJQnJpZGdlUmVmIHtcblxuICAvKipcbiAgICogVGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSBicmlkZ2UuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGJyaWRnZUFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYnJpZGdlLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBicmlkZ2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIGJyaWRnZSAoaW5ncmVzcyBvciBlZ3Jlc3MpLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBicmlkZ2VUeXBlOiBCcmlkZ2VUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYnJpZGdlLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBicmlkZ2VTdGF0ZT86IHN0cmluZztcblxuICAvKipcbiAgICogRmFpbG92ZXIgQ29uZmlndXJhdGlvbiBmb3IgQnJpZGdlXG4gICAqL1xuICByZWFkb25seSBpc0ZhaWxvdmVyRW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldHdvcmsgb3V0cHV0IHRvIHRoaXMgYnJpZGdlIChmb3IgZWdyZXNzIGJyaWRnZXMgb25seSkuXG4gICAqXG4gICAqIEBwYXJhbSBpZCBDb25zdHJ1Y3QgaWQgZm9yIHRoZSBuZXcgQnJpZGdlT3V0cHV0XG4gICAqIEBwYXJhbSBuZXR3b3JrT3V0cHV0IFRoZSBuYW1lZCBvdXRwdXQgdG8gYWRkLiBUaGUgYG5hbWVgIGlzIHRoZSBvdXRwdXQncyBpZGVudGl0eSBvbiB0aGUgYnJpZGdlIGFuZCBtdXN0IGJlIHVuaXF1ZSBhbW9uZyBvdXRwdXRzLlxuICAgKi9cbiAgYWRkT3V0cHV0KGlkOiBzdHJpbmcsIG5ldHdvcmtPdXRwdXQ6IEJyaWRnZU5ldHdvcmtPdXRwdXQpOiBJQnJpZGdlT3V0cHV0O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBDbG91ZFdhdGNoIG1ldHJpYyBmb3IgdGhpcyBicmlkZ2UuXG4gICAqXG4gICAqIEJyaWRnZSBtZXRyaWNzIGFyZSBkaW1lbnNpb25lZCBieSBgQnJpZGdlQVJOYC4gU2VlIHRoZSBNZWRpYUNvbm5lY3RcbiAgICogZG9jdW1lbnRhdGlvbiBmb3IgYXZhaWxhYmxlIG1ldHJpYyBuYW1lcyAoZS5nLiBgSW5ncmVzc0JyaWRnZUJpdFJhdGVgLFxuICAgKiBgRWdyZXNzQnJpZGdlQml0UmF0ZWAsIGBJbmdyZXNzQnJpZGdlUGFja2V0TG9zc1BlcmNlbnRgKS5cbiAgICovXG4gIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgYml0cmF0ZSBvZiBhIHNwZWNpZmljIGJyaWRnZSBzb3VyY2UuXG4gICAqXG4gICAqIFVzZXMgYEluZ3Jlc3NCcmlkZ2VTb3VyY2VCaXRSYXRlYCBmb3IgaW5ncmVzcyBicmlkZ2VzIGFuZFxuICAgKiBgRWdyZXNzQnJpZGdlU291cmNlQml0UmF0ZWAgZm9yIGVncmVzcyBicmlkZ2VzLlxuICAgKlxuICAgKiBAcGFyYW0gYnJpZGdlU291cmNlTmFtZSBUaGUgbmFtZSBvZiB0aGUgYnJpZGdlIHNvdXJjZVxuICAgKiBAZGVmYXVsdCAtIGF2ZXJhZ2Ugb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBtZXRyaWNTb3VyY2VCaXRyYXRlKGJyaWRnZVNvdXJjZU5hbWU6IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIHRoZSBwZXJjZW50YWdlIG9mIHBhY2tldHMgbG9zdCBvbiBhIHNwZWNpZmljIGJyaWRnZSBzb3VyY2UuXG4gICAqXG4gICAqIFVzZXMgYEluZ3Jlc3NCcmlkZ2VTb3VyY2VQYWNrZXRMb3NzUGVyY2VudGAgZm9yIGluZ3Jlc3MgYnJpZGdlcyBhbmRcbiAgICogYEVncmVzc0JyaWRnZVNvdXJjZVBhY2tldExvc3NQZXJjZW50YCBmb3IgZWdyZXNzIGJyaWRnZXMuXG4gICAqXG4gICAqIEBwYXJhbSBicmlkZ2VTb3VyY2VOYW1lIFRoZSBuYW1lIG9mIHRoZSBicmlkZ2Ugc291cmNlXG4gICAqIEBkZWZhdWx0IC0gYXZlcmFnZSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIG1ldHJpY1NvdXJjZVBhY2tldExvc3NQZXJjZW50KGJyaWRnZVNvdXJjZU5hbWU6IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIHRoZSB0b3RhbCBudW1iZXIgb2YgdGltZXMgdGhlIGJyaWRnZSBzd2l0Y2hlcyBiZXR3ZWVuIHNvdXJjZXNcbiAgICogd2hlbiB1c2luZyB0aGUgYEZBSUxPVkVSYCBmYWlsb3ZlciBtb2RlLlxuICAgKlxuICAgKiBVc2VzIGBJbmdyZXNzQnJpZGdlRmFpbG92ZXJTd2l0Y2hlc2AgZm9yIGluZ3Jlc3MgYnJpZGdlcyBhbmRcbiAgICogYEVncmVzc0JyaWRnZUZhaWxvdmVyU3dpdGNoZXNgIGZvciBlZ3Jlc3MgYnJpZGdlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBtZXRyaWNGYWlsb3ZlclN3aXRjaGVzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIGJyaWRnZSBuZXR3b3JrIG91dHB1dC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcmlkZ2VOZXR3b3JrT3V0cHV0UHJvcHMge1xuICAvKipcbiAgICogVGhlIElQIGFkZHJlc3Mgd2hlcmUgdGhlIG91dHB1dCB3aWxsIHNlbmQgY29udGVudC5cbiAgICovXG4gIHJlYWRvbmx5IGlwQWRkcmVzczogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBvcnQgdG8gdXNlIGZvciB0aGUgb3V0cHV0LlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGdhdGV3YXkgbmV0d29yayB0aGlzIG91dHB1dCBzZW5kcyBjb250ZW50IG91dCBvZi5cbiAgICpcbiAgICogVXNlIHtAbGluayBHYXRld2F5TmV0d29yay5kZWZpbmV9IHRvIGNyZWF0ZSB0aGUgbmV0d29yayBhbmQgcGFzcyB0aGUgc2FtZVxuICAgKiBpbnN0YW5jZSB0byB0aGUgZ2F0ZXdheSBhbmQgdG8gZWFjaCBvdXRwdXQgdGhhdCB1c2VzIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgbmV0d29yazogR2F0ZXdheU5ldHdvcms7XG4gIC8qKlxuICAgKiBUaGUgcHJvdG9jb2wgdG8gdXNlIGZvciB0aGUgb3V0cHV0LlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdG9jb2w6IEJyaWRnZVByb3RvY29sO1xuICAvKipcbiAgICogVGltZSB0byBsaXZlIChUVEwpIGZvciB0aGUgb3V0cHV0IHBhY2tldHMgaW4gaG9wcyAoMS0yNTUpLlxuICAgKlxuICAgKiBUVEwgcmVwcmVzZW50cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbmV0d29yayBob3BzIGEgcGFja2V0IGNhbiB0cmF2ZXJzZVxuICAgKiBiZWZvcmUgYmVpbmcgZGlzY2FyZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgdHRsOiBudW1iZXI7XG59XG5cbi8qKlxuICogQSBuYW1lZCBuZXR3b3JrIG91dHB1dCBmb3IgYW4gZWdyZXNzIGJyaWRnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcmlkZ2VOZXR3b3JrT3V0cHV0IHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBuZXR3b3JrIG91dHB1dC4gTXVzdCBiZSB1bmlxdWUgYW1vbmcgb3V0cHV0cyBvbiB0aGUgYnJpZGdlLlxuICAgKlxuICAgKiBVc2VkIGFzIHRoZSBwaHlzaWNhbCBuYW1lIG9mIHRoZSB1bmRlcmx5aW5nIENGTiByZXNvdXJjZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5ldHdvcmsgY29uZmlndXJhdGlvbiBkZXNjcmliaW5nIHdoZXJlIHRoaXMgb3V0cHV0IHNlbmRzIGNvbnRlbnQuXG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ6IEJyaWRnZU91dHB1dENvbmZpZ3VyYXRpb247XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYSBicmlkZ2Ugb3V0cHV0LlxuICovXG5leHBvcnQgY2xhc3MgQnJpZGdlT3V0cHV0Q29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXR3b3JrIG91dHB1dCBjb25maWd1cmF0aW9uIGZvciBhIGJyaWRnZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbmV0d29yayhwcm9wczogQnJpZGdlTmV0d29ya091dHB1dFByb3BzKTogQnJpZGdlT3V0cHV0Q29uZmlndXJhdGlvbiB7XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMudHRsKSAmJiAocHJvcHMudHRsIDwgMSB8fCBwcm9wcy50dGwgPiAyNTUpKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YEJyaWRnZU91dHB1dFR0bFJhbmdlYCwgYFRUTCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMjU1IGhvcHMsIGdvdCAke3Byb3BzLnR0bH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBCcmlkZ2VPdXRwdXRDb25maWd1cmF0aW9uKHByb3BzKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBfbmV0d29yazogQnJpZGdlTmV0d29ya091dHB1dFByb3BzKSB7fVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfYmluZCgpOiB7IGlwQWRkcmVzczogc3RyaW5nOyBuZXR3b3JrTmFtZTogc3RyaW5nOyBwb3J0OiBudW1iZXI7IHByb3RvY29sOiBzdHJpbmc7IHR0bDogbnVtYmVyIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBpcEFkZHJlc3M6IHRoaXMuX25ldHdvcmsuaXBBZGRyZXNzLFxuICAgICAgbmV0d29ya05hbWU6IHRoaXMuX25ldHdvcmsubmV0d29yay5uYW1lLFxuICAgICAgcG9ydDogdGhpcy5fbmV0d29yay5wb3J0LFxuICAgICAgcHJvdG9jb2w6IHRoaXMuX25ldHdvcmsucHJvdG9jb2wudmFsdWUsXG4gICAgICB0dGw6IHRoaXMuX25ldHdvcmsudHRsLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBicmlkZ2Ugc291cmNlIGZhaWxvdmVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJyaWRnZUZhaWxvdmVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGZhaWxvdmVyIGlzIGVuYWJsZWQuIFNldCB0byBgU3RhdGUuRElTQUJMRURgIHRvIGtlZXAgdGhlIGNvbmZpZ3VyYXRpb25cbiAgICogb24gdGhlIGJyaWRnZSB3aXRob3V0IHN3aXRjaGluZyBmYWlsb3ZlciBvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgU3RhdGUuRU5BQkxFRFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGU/OiBTdGF0ZTtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgeW91IHdhbnQgdG8gdHJlYXQgYXMgcHJpbWFyeS4gSWYgc2V0LCBNZWRpYUNvbm5lY3QgYWx3YXlzXG4gICAqIHVzZXMgdGhpcyBzb3VyY2Ugd2hlbiBpdCBpcyBhdmFpbGFibGUuIFdoZW4gdW5zZXQsIGJvdGggc291cmNlcyBhcmUgdHJlYXRlZCB3aXRoXG4gICAqIGVxdWFsIHByaW9yaXR5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGJvdGggc291cmNlcyBhcmUgZXF1YWwgcHJpb3JpdHlcbiAgICovXG4gIHJlYWRvbmx5IHByaW1hcnlTb3VyY2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogU291cmNlIGZhaWxvdmVyIGNvbmZpZ3VyYXRpb24gZm9yIGEgYnJpZGdlLlxuICpcbiAqIEJyaWRnZXMgb25seSBzdXBwb3J0IGBGQUlMT1ZFUmAgKHN3aXRjaG92ZXIpIG1vZGUg4oCUIHRoZSBgTUVSR0VgIG1vZGUgYXZhaWxhYmxlIG9uXG4gKiBgRmxvdy5zb3VyY2VGYWlsb3ZlckNvbmZpZ2AgaXMgbm90IGFsbG93ZWQgb24gYnJpZGdlcyBieSB0aGUgc2VydmljZS4gVXNlXG4gKiB7QGxpbmsgQnJpZGdlRmFpbG92ZXJDb25maWcuZmFpbG92ZXJ9IHRvIGNvbnN0cnVjdCB0aGUgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIEJyaWRnZUZhaWxvdmVyQ29uZmlnIHtcbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBzd2l0Y2hvdmVyLW1vZGUgZmFpbG92ZXIuIFRoZSBicmlkZ2Ugc3dhcHMgdG8gdGhlIGJhY2t1cCBzb3VyY2Ugd2hlblxuICAgKiB0aGUgcHJpbWFyeSBzb3VyY2Ugc3RvcHMgcmVjZWl2aW5nIGRhdGEuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZhaWxvdmVyKG9wdGlvbnM6IEJyaWRnZUZhaWxvdmVyT3B0aW9ucyA9IHt9KTogQnJpZGdlRmFpbG92ZXJDb25maWcge1xuICAgIHJldHVybiBuZXcgQnJpZGdlRmFpbG92ZXJDb25maWcob3B0aW9ucy5zdGF0ZSA/PyBTdGF0ZS5FTkFCTEVELCBvcHRpb25zLnByaW1hcnlTb3VyY2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zdGF0ZTogU3RhdGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcHJpbWFyeVNvdXJjZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBjb25maWd1cmF0aW9uIGhhcyBmYWlsb3ZlciBlbmFibGVkLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBnZXQgX2lzRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGUgPT09IFN0YXRlLkVOQUJMRUQ7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gaXMgYm91bmQgdG8gYSBCcmlkZ2UuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9iaW5kKCk6IENmbkJyaWRnZS5GYWlsb3ZlckNvbmZpZ1Byb3BlcnR5IHtcbiAgICByZXR1cm4ge1xuICAgICAgZmFpbG92ZXJNb2RlOiBGYWlsb3Zlck1vZGUuRkFJTE9WRVIudmFsdWUsXG4gICAgICBzdGF0ZTogdGhpcy5fc3RhdGUsXG4gICAgICBzb3VyY2VQcmlvcml0eTogdGhpcy5fcHJpbWFyeVNvdXJjZSA/IHsgcHJpbWFyeVNvdXJjZTogdGhpcy5fcHJpbWFyeVNvdXJjZSB9IDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBCcmlkZ2UgY29uZmlndXJhdGlvbiB0byBzZXQgaW5ncmVzcyBhbmQgZWdyZXNzIG9wdGlvbnMgb24gdGhlIGJyaWRnZVxuICovXG5leHBvcnQgY2xhc3MgQnJpZGdlQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBBbiBpbmdyZXNzIGJyaWRnZSBpcyBhIGdyb3VuZC10by1jbG91ZCBicmlkZ2UuIFRoZSBjb250ZW50IG9yaWdpbmF0ZXMgYXQgeW91ciBwcmVtaXNlcyBhbmQgaXMgZGVsaXZlcmVkIHRvIHRoZSBjbG91ZC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaW5ncmVzcyhjb25maWc6IEluZ3Jlc3NCcmlkZ2VDb25maWd1cmF0aW9uKTogQnJpZGdlQ29uZmlndXJhdGlvbiB7XG4gICAgaWYgKCFjb25maWcubWF4Qml0cmF0ZS5pc1VucmVzb2x2ZWQoKSkge1xuICAgICAgY29uc3QgYml0cmF0ZUJwcyA9IGNvbmZpZy5tYXhCaXRyYXRlLnRvQnBzKCk7XG4gICAgICBpZiAoYml0cmF0ZUJwcyA8IDEwMDAwMDAgfHwgYml0cmF0ZUJwcyA+IDEwMDAwMDAwMCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YEJyaWRnZUluZ3Jlc3NCaXRyYXRlUmFuZ2VgLCBgQnJpZGdlIGluZ3Jlc3MgbWF4IGJpdHJhdGUgbXVzdCBiZSBiZXR3ZWVuIDEsMDAwLDAwMCBhbmQgMTAwLDAwMCwwMDAgYnBzLCBnb3QgJHtiaXRyYXRlQnBzfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKGNvbmZpZy5uZXR3b3JrU291cmNlcykgJiYgY29uZmlnLm5ldHdvcmtTb3VyY2VzLmxlbmd0aCA+IDIpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YEJyaWRnZU1heE5ldHdvcmtTb3VyY2VzYCxcbiAgICAgICAgYEEgYnJpZGdlIHN1cHBvcnRzIGEgbWF4aW11bSBvZiAyIG5ldHdvcmsgc291cmNlcywgZ290ICR7Y29uZmlnLm5ldHdvcmtTb3VyY2VzLmxlbmd0aH1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEJyaWRnZUNvbmZpZ3VyYXRpb24oQnJpZGdlVHlwZS5JTkdSRVNTX0JSSURHRSwgY29uZmlnLCB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGVncmVzcyBicmlkZ2UgaXMgYSBjbG91ZC10by1ncm91bmQgYnJpZGdlLiBUaGUgY29udGVudCBjb21lcyBmcm9tIGFuIGV4aXN0aW5nIE1lZGlhQ29ubmVjdCBmbG93IGFuZCBpcyBkZWxpdmVyZWQgdG8geW91ciBwcmVtaXNlcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZWdyZXNzKGNvbmZpZzogRWdyZXNzQnJpZGdlQ29uZmlndXJhdGlvbik6IEJyaWRnZUNvbmZpZ3VyYXRpb24ge1xuICAgIGlmICghY29uZmlnLm1heEJpdHJhdGUuaXNVbnJlc29sdmVkKCkpIHtcbiAgICAgIGNvbnN0IGJpdHJhdGVCcHMgPSBjb25maWcubWF4Qml0cmF0ZS50b0JwcygpO1xuICAgICAgaWYgKGJpdHJhdGVCcHMgPCAxMDAwMDAwIHx8IGJpdHJhdGVCcHMgPiAxMDAwMDAwMDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBCcmlkZ2VFZ3Jlc3NCaXRyYXRlUmFuZ2VgLCBgQnJpZGdlIGVncmVzcyBtYXggYml0cmF0ZSBtdXN0IGJlIGJldHdlZW4gMSwwMDAsMDAwIGFuZCAxMDAsMDAwLDAwMCBicHMsIGdvdCAke2JpdHJhdGVCcHN9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQoY29uZmlnLmZsb3dTb3VyY2VzKSAmJiBjb25maWcuZmxvd1NvdXJjZXMubGVuZ3RoID4gMikge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgQnJpZGdlTWF4Rmxvd1NvdXJjZXNgLFxuICAgICAgICBgQSBicmlkZ2Ugc3VwcG9ydHMgYSBtYXhpbXVtIG9mIDIgZmxvdyBzb3VyY2VzLCBnb3QgJHtjb25maWcuZmxvd1NvdXJjZXMubGVuZ3RofWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKGNvbmZpZy5uZXR3b3JrT3V0cHV0cykgJiYgY29uZmlnLm5ldHdvcmtPdXRwdXRzLmxlbmd0aCA+IDIpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YEJyaWRnZU1heE5ldHdvcmtPdXRwdXRzYCxcbiAgICAgICAgYEEgYnJpZGdlIHN1cHBvcnRzIGEgbWF4aW11bSBvZiAyIG5ldHdvcmsgb3V0cHV0cywgZ290ICR7Y29uZmlnLm5ldHdvcmtPdXRwdXRzLmxlbmd0aH1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEJyaWRnZUNvbmZpZ3VyYXRpb24oQnJpZGdlVHlwZS5FR1JFU1NfQlJJREdFLCB1bmRlZmluZWQsIGNvbmZpZyk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2JyaWRnZVR5cGU6IEJyaWRnZVR5cGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaW5ncmVzc0NvbmZpZz86IEluZ3Jlc3NCcmlkZ2VDb25maWd1cmF0aW9uLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VncmVzc0NvbmZpZz86IEVncmVzc0JyaWRnZUNvbmZpZ3VyYXRpb24sXG4gICkge31cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGJyaWRnZSBjb25maWd1cmF0aW9uIGlzIGJvdW5kIHRvIGEgQnJpZGdlLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfYmluZCgpOiB7IGJyaWRnZVR5cGU6IEJyaWRnZVR5cGU7IGluZ3Jlc3NDb25maWc/OiBJbmdyZXNzQnJpZGdlQ29uZmlndXJhdGlvbjsgZWdyZXNzQ29uZmlnPzogRWdyZXNzQnJpZGdlQ29uZmlndXJhdGlvbiB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgYnJpZGdlVHlwZTogdGhpcy5fYnJpZGdlVHlwZSxcbiAgICAgIGluZ3Jlc3NDb25maWc6IHRoaXMuX2luZ3Jlc3NDb25maWcsXG4gICAgICBlZ3Jlc3NDb25maWc6IHRoaXMuX2VncmVzc0NvbmZpZyxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgdGhlIEJyaWRnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJyaWRnZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBicmlkZ2UuIENhbm5vdCBiZSBtb2RpZmllZCBhZnRlciB0aGUgYnJpZGdlIGlzIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXV0b2dlbmVyYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgYnJpZGdlTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBicmlkZ2UgY29uZmlndXJhdGlvbiBzcGVjaWZ5aW5nIGluZ3Jlc3Mgb3IgZWdyZXNzIHNldHRpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnOiBCcmlkZ2VDb25maWd1cmF0aW9uO1xuICAvKipcbiAgICogVGhlIGdhdGV3YXkgdGhhdCB0aGUgYnJpZGdlIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICovXG4gIHJlYWRvbmx5IGdhdGV3YXk6IElHYXRld2F5O1xuICAvKipcbiAgICogVGhlIHNvdXJjZSBmYWlsb3ZlciBjb25maWd1cmF0aW9uIGZvciB0aGUgYnJpZGdlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGZhaWxvdmVyIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUZhaWxvdmVyQ29uZmlnPzogQnJpZGdlRmFpbG92ZXJDb25maWc7XG5cbn1cblxuLyoqXG4gKiBBdHRyaWJ1dGVzIGZvciBpbXBvcnRpbmcgYW4gZXhpc3RpbmcgQnJpZGdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJyaWRnZUF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgYnJpZGdlLlxuICAgKi9cbiAgcmVhZG9ubHkgYnJpZGdlQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBicmlkZ2UuXG4gICAqXG4gICAqIE5vdCBlbmNvZGVkIGluIHRoZSBicmlkZ2UgQVJOLCBzbyBtdXN0IGJlIHByb3ZpZGVkIGV4cGxpY2l0bHkgaWYgdGhlIGltcG9ydGVkXG4gICAqIGJyaWRnZSBuZWVkcyB0byBleHBvc2UgYGJyaWRnZU5hbWVgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGJyaWRnZU5hbWUgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgaW1wb3J0ZWQgY29uc3RydWN0XG4gICAqL1xuICByZWFkb25seSBicmlkZ2VOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hhdCB0eXBlIG9mIGJyaWRnZSBpcyBpbXBvcnRlZC5cbiAgICpcbiAgICogTm90IGVuY29kZWQgaW4gdGhlIGJyaWRnZSBBUk4sIHNvIG11c3QgYmUgcHJvdmlkZWQgZXhwbGljaXRseSBpZiB0aGUgaW1wb3J0ZWRcbiAgICogYnJpZGdlIGlzIHVzZWQgd2l0aCBgYWRkT3V0cHV0KClgIG9yIG90aGVyIG1ldGhvZHMgdGhhdCBuZWVkIHRoZSBicmlkZ2UgdHlwZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBicmlkZ2VUeXBlIGlzIG5vdCBhdmFpbGFibGUgb24gdGhlIGltcG9ydGVkIGNvbnN0cnVjdFxuICAgKi9cbiAgcmVhZG9ubHkgYnJpZGdlVHlwZT86IEJyaWRnZVR5cGU7XG5cbiAgLyoqXG4gICAqIEZhaWxvdmVyIENvbmZpZ3VyYXRpb24gZm9yIEJyaWRnZVxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgaXNGYWlsb3ZlckVuYWJsZWQ/OiBib29sZWFuO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBCcmlkZ2VCYXNlIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJQnJpZGdlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBCcmlkZ2UgY29uc3RydWN0IHRoYXQgcmVwcmVzZW50cyBhbiBleHRlcm5hbCAoaW1wb3J0ZWQpIEJyaWRnZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUJyaWRnZUF0dHJpYnV0ZXMoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IEJyaWRnZUF0dHJpYnV0ZXMpOiBJQnJpZGdlIHtcbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBCcmlkZ2VCYXNlIGltcGxlbWVudHMgSUJyaWRnZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYnJpZGdlQXJuID0gYXR0cnMuYnJpZGdlQXJuO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGJyaWRnZVN0YXRlID0gdW5kZWZpbmVkO1xuXG4gICAgICBwdWJsaWMgZ2V0IGJyaWRnZU5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGF0dHJzLmJyaWRnZU5hbWUpIHJldHVybiBhdHRycy5icmlkZ2VOYW1lO1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBCcmlkZ2VOYW1lTm90UHJvdmlkZWRgLFxuICAgICAgICAgIGAnYnJpZGdlTmFtZScgd2FzIG5vdCBwcm92aWRlZCB3aGVuIGltcG9ydGluZyBCcmlkZ2UgJHt0aGlzLm5vZGUucGF0aH07IHByb3ZpZGUgaXQgaW4gZnJvbUJyaWRnZUF0dHJpYnV0ZXMoKWAsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIGdldCBicmlkZ2VUeXBlKCk6IEJyaWRnZVR5cGUge1xuICAgICAgICBpZiAoYXR0cnMuYnJpZGdlVHlwZSkgcmV0dXJuIGF0dHJzLmJyaWRnZVR5cGU7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YEJyaWRnZVR5cGVOb3RQcm92aWRlZGAsXG4gICAgICAgICAgYCdicmlkZ2VUeXBlJyB3YXMgbm90IHByb3ZpZGVkIHdoZW4gaW1wb3J0aW5nIEJyaWRnZSAke3RoaXMubm9kZS5wYXRofTsgcHJvdmlkZSBpdCBpbiBmcm9tQnJpZGdlQXR0cmlidXRlcygpYCxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBJbXBvcnRlZCBicmlkZ2VzIGRlZmF1bHQgdG8gYGZhbHNlYC4gUGFzcyBgaXNGYWlsb3ZlckVuYWJsZWQ6IHRydWVgIGluIHRoZVxuICAgICAgLy8gYXR0cmlidXRlcyB3aGVuIHRoZSByZWFsIHNlcnZpY2Utc2lkZSBicmlkZ2UgaGFzIGZhaWxvdmVyIGVuYWJsZWQgYW5kIHlvdVxuICAgICAgLy8gbmVlZCB0byBhZGQgYSBCcmlkZ2VTb3VyY2UuXG4gICAgICBwdWJsaWMgaXNGYWlsb3ZlckVuYWJsZWQ/OiBib29sZWFuID0gYXR0cnMuaXNGYWlsb3ZlckVuYWJsZWQgPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZXhpc3RpbmcgQnJpZGdlIGZyb20gaXRzIEFSTi5cbiAgICpcbiAgICogVXNlIGBmcm9tQnJpZGdlQXR0cmlidXRlcygpYCBpbnN0ZWFkIGlmIHlvdSBuZWVkIGFjY2VzcyB0byBgYnJpZGdlTmFtZWAsIGBicmlkZ2VUeXBlYFxuICAgKiAocmVxdWlyZWQgZm9yIGBhZGRPdXRwdXQoKWApLCBvciBgaXNGYWlsb3ZlckVuYWJsZWRgLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQnJpZGdlQXJuKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGJyaWRnZUFybjogc3RyaW5nKTogSUJyaWRnZSB7XG4gICAgcmV0dXJuIEJyaWRnZS5mcm9tQnJpZGdlQXR0cmlidXRlcyhzY29wZSwgaWQsIHsgYnJpZGdlQXJuIH0pO1xuICB9XG5cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGJyaWRnZUFybjogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgYnJpZGdlTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgYnJpZGdlVHlwZTogQnJpZGdlVHlwZTtcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGJyaWRnZVN0YXRlPzogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgaXNGYWlsb3ZlckVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKiBBIHJlZmVyZW5jZSB0byB0aGlzIEJyaWRnZSByZXNvdXJjZS4gKi9cbiAgcHVibGljIGdldCBicmlkZ2VSZWYoKTogQnJpZGdlUmVmZXJlbmNlIHtcbiAgICByZXR1cm4geyBicmlkZ2VBcm46IHRoaXMuYnJpZGdlQXJuIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBtZXRyaWMgZm9yIHRoaXMgYnJpZGdlLlxuICAgKi9cbiAgcHVibGljIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWMoe1xuICAgICAgbWV0cmljTmFtZSxcbiAgICAgIG5hbWVzcGFjZTogJ0FXUy9NZWRpYUNvbm5lY3QnLFxuICAgICAgLi4ucHJvcHMsXG4gICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgIEJyaWRnZUFSTjogdGhpcy5icmlkZ2VBcm4sXG4gICAgICAgIC4uLnByb3BzPy5kaW1lbnNpb25zTWFwLFxuICAgICAgfSxcbiAgICB9KS5hdHRhY2hUbyh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIHRoZSBiaXRyYXRlIG9mIGEgc3BlY2lmaWMgYnJpZGdlIHNvdXJjZS5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNTb3VyY2VCaXRyYXRlKGJyaWRnZVNvdXJjZU5hbWU6IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICBjb25zdCBtZXRyaWNOYW1lID0gdGhpcy5icmlkZ2VUeXBlLnZhbHVlID09PSBCcmlkZ2VUeXBlLkVHUkVTU19CUklER0UudmFsdWVcbiAgICAgID8gJ0VncmVzc0JyaWRnZVNvdXJjZUJpdFJhdGUnXG4gICAgICA6ICdJbmdyZXNzQnJpZGdlU291cmNlQml0UmF0ZSc7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWMoe1xuICAgICAgbWV0cmljTmFtZSxcbiAgICAgIG5hbWVzcGFjZTogJ0FXUy9NZWRpYUNvbm5lY3QnLFxuICAgICAgc3RhdGlzdGljOiAnYXZnJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICB1bml0OiBVbml0LkJJVFNfUEVSX1NFQ09ORCxcbiAgICAgIC4uLnByb3BzLFxuICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICBCcmlkZ2VBUk46IHRoaXMuYnJpZGdlQXJuLFxuICAgICAgICBCcmlkZ2VTb3VyY2VOYW1lOiBicmlkZ2VTb3VyY2VOYW1lLFxuICAgICAgICAuLi5wcm9wcz8uZGltZW5zaW9uc01hcCxcbiAgICAgIH0sXG4gICAgfSkuYXR0YWNoVG8odGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgcGVyY2VudGFnZSBvZiBwYWNrZXRzIGxvc3Qgb24gYSBzcGVjaWZpYyBicmlkZ2Ugc291cmNlLlxuICAgKi9cbiAgcHVibGljIG1ldHJpY1NvdXJjZVBhY2tldExvc3NQZXJjZW50KGJyaWRnZVNvdXJjZU5hbWU6IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICBjb25zdCBtZXRyaWNOYW1lID0gdGhpcy5icmlkZ2VUeXBlLnZhbHVlID09PSBCcmlkZ2VUeXBlLkVHUkVTU19CUklER0UudmFsdWVcbiAgICAgID8gJ0VncmVzc0JyaWRnZVNvdXJjZVBhY2tldExvc3NQZXJjZW50J1xuICAgICAgOiAnSW5ncmVzc0JyaWRnZVNvdXJjZVBhY2tldExvc3NQZXJjZW50JztcbiAgICByZXR1cm4gbmV3IE1ldHJpYyh7XG4gICAgICBtZXRyaWNOYW1lLFxuICAgICAgbmFtZXNwYWNlOiAnQVdTL01lZGlhQ29ubmVjdCcsXG4gICAgICBzdGF0aXN0aWM6ICdhdmcnLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgIHVuaXQ6IFVuaXQuUEVSQ0VOVCxcbiAgICAgIC4uLnByb3BzLFxuICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICBCcmlkZ2VBUk46IHRoaXMuYnJpZGdlQXJuLFxuICAgICAgICBCcmlkZ2VTb3VyY2VOYW1lOiBicmlkZ2VTb3VyY2VOYW1lLFxuICAgICAgICAuLi5wcm9wcz8uZGltZW5zaW9uc01hcCxcbiAgICAgIH0sXG4gICAgfSkuYXR0YWNoVG8odGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRoZSBicmlkZ2Ugc3dpdGNoZXMgYmV0d2VlbiBzb3VyY2VzXG4gICAqIHdoZW4gdXNpbmcgdGhlIGBGQUlMT1ZFUmAgZmFpbG92ZXIgbW9kZS5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNGYWlsb3ZlclN3aXRjaGVzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgY29uc3QgbWV0cmljTmFtZSA9IHRoaXMuYnJpZGdlVHlwZS52YWx1ZSA9PT0gQnJpZGdlVHlwZS5FR1JFU1NfQlJJREdFLnZhbHVlXG4gICAgICA/ICdFZ3Jlc3NCcmlkZ2VGYWlsb3ZlclN3aXRjaGVzJ1xuICAgICAgOiAnSW5ncmVzc0JyaWRnZUZhaWxvdmVyU3dpdGNoZXMnO1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhtZXRyaWNOYW1lLCB7XG4gICAgICBzdGF0aXN0aWM6ICdzdW0nLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgIHVuaXQ6IFVuaXQuQ09VTlQsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBuZXR3b3JrIG91dHB1dCB0byB0aGlzIGJyaWRnZSAoZm9yIGVncmVzcyBicmlkZ2VzIG9ubHkpLlxuICAgKlxuICAgKiBAcGFyYW0gaWQgQ29uc3RydWN0IGlkIGZvciB0aGUgbmV3IEJyaWRnZU91dHB1dFxuICAgKiBAcGFyYW0gbmV0d29ya091dHB1dCBUaGUgbmFtZWQgb3V0cHV0IHRvIGFkZC4gVGhlIGBuYW1lYCBpcyB0aGUgb3V0cHV0J3MgaWRlbnRpdHkgb24gdGhlIGJyaWRnZSBhbmQgbXVzdCBiZSB1bmlxdWUgYW1vbmcgb3V0cHV0cy5cbiAgICovXG4gIHB1YmxpYyBhZGRPdXRwdXQoaWQ6IHN0cmluZywgbmV0d29ya091dHB1dDogQnJpZGdlTmV0d29ya091dHB1dCk6IElCcmlkZ2VPdXRwdXQge1xuICAgIGlmICh0aGlzLmJyaWRnZVR5cGUudmFsdWUgIT09IEJyaWRnZVR5cGUuRUdSRVNTX0JSSURHRS52YWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YEJyaWRnZUVncmVzc09ubHlgLFxuICAgICAgICBgYWRkT3V0cHV0IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBlZ3Jlc3MgYnJpZGdlcywgZ290ICcke3RoaXMuYnJpZGdlVHlwZS52YWx1ZX0nYCxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBCcmlkZ2VPdXRwdXQodGhpcywgaWQsIHtcbiAgICAgIGJyaWRnZU91dHB1dE5hbWU6IG5ldHdvcmtPdXRwdXQubmFtZSxcbiAgICAgIGJyaWRnZTogdGhpcyxcbiAgICAgIG91dHB1dDogbmV0d29ya091dHB1dC5vdXRwdXQsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWZpbmVzIGEgQVdTIEVsZW1lbnRhbCBNZWRpYUNvbm5lY3QgQnJpZGdlXG4gKi9cbkBwcm9wZXJ0eUluamVjdGFibGVcbmV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBCcmlkZ2VCYXNlIGltcGxlbWVudHMgSUJyaWRnZSB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLW1lZGlhY29ubmVjdC1hbHBoYS5CcmlkZ2UnO1xuXG4gIHB1YmxpYyByZWFkb25seSBicmlkZ2VBcm46IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGJyaWRnZU5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGJyaWRnZVR5cGU6IEJyaWRnZVR5cGU7XG4gIHB1YmxpYyByZWFkb25seSBicmlkZ2VTdGF0ZT86IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGlzRmFpbG92ZXJFbmFibGVkPzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBCcmlkZ2VQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgcGh5c2ljYWxOYW1lOiBwcm9wcz8uYnJpZGdlTmFtZSA/PyBMYXp5LnN0cmluZyh7IHByb2R1Y2U6ICgpID0+IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7IG1heExlbmd0aDogNjQgfSkgfSksXG4gICAgfSk7XG5cbiAgICAvLyBWYWxpZGF0ZSBicmlkZ2UgbmFtZSBpZiBwcm92aWRlZFxuICAgIGlmIChwcm9wcy5icmlkZ2VOYW1lICE9IG51bGwgJiYgcHJvcHMuYnJpZGdlTmFtZSAhPT0gJycgJiYgIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5icmlkZ2VOYW1lKSkge1xuICAgICAgaWYgKHByb3BzLmJyaWRnZU5hbWUubGVuZ3RoID4gNjQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgQnJpZGdlTmFtZUxlbmd0aGAsIGBCcmlkZ2UgbmFtZSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNjQgY2hhcmFjdGVycywgZ290ICR7cHJvcHMuYnJpZGdlTmFtZS5sZW5ndGh9YCwgdGhpcyk7XG4gICAgICB9XG4gICAgICBpZiAoIS9eW2EtekEtWjAtOS1dKyQvLnRlc3QocHJvcHMuYnJpZGdlTmFtZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgQnJpZGdlTmFtZUZvcm1hdGAsIGBCcmlkZ2UgbmFtZSBtdXN0IGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgaHlwaGVucywgZ290ICcke3Byb3BzLmJyaWRnZU5hbWV9J2AsIHRoaXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgdGhpcy5pc0ZhaWxvdmVyRW5hYmxlZCA9IHByb3BzLnNvdXJjZUZhaWxvdmVyQ29uZmlnPy5faXNFbmFibGVkID8/IGZhbHNlO1xuXG4gICAgY29uc3QgY29uZmlnID0gcHJvcHMuY29uZmlnO1xuICAgIGNvbnN0IGNvbmZpZ0JpbmQgPSBjb25maWcuX2JpbmQoKTtcbiAgICBjb25zdCBpbmdyZXNzID0gY29uZmlnQmluZC5pbmdyZXNzQ29uZmlnID8ge1xuICAgICAgaW5ncmVzc0dhdGV3YXlCcmlkZ2U6IHtcbiAgICAgICAgbWF4Qml0cmF0ZTogY29uZmlnQmluZC5pbmdyZXNzQ29uZmlnLm1heEJpdHJhdGUudG9CcHMoKSxcbiAgICAgICAgbWF4T3V0cHV0czogY29uZmlnQmluZC5pbmdyZXNzQ29uZmlnLm1heE91dHB1dHMsXG4gICAgICB9LFxuICAgICAgc291cmNlczogY29uZmlnQmluZC5pbmdyZXNzQ29uZmlnLm5ldHdvcmtTb3VyY2VzLm1hcChpbnB1dCA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmV0d29ya1NvdXJjZToge1xuICAgICAgICAgICAgbmFtZTogaW5wdXQubmFtZSxcbiAgICAgICAgICAgIG11bHRpY2FzdElwOiBpbnB1dC5zb3VyY2UubXVsdGljYXN0SXAsXG4gICAgICAgICAgICBuZXR3b3JrTmFtZTogaW5wdXQuc291cmNlLm5ldHdvcmsubmFtZSxcbiAgICAgICAgICAgIHBvcnQ6IGlucHV0LnNvdXJjZS5wb3J0LFxuICAgICAgICAgICAgcHJvdG9jb2w6IGlucHV0LnNvdXJjZS5wcm90b2NvbC52YWx1ZSxcbiAgICAgICAgICAgIG11bHRpY2FzdFNvdXJjZVNldHRpbmdzOiB7XG4gICAgICAgICAgICAgIG11bHRpY2FzdFNvdXJjZUlwOiBpbnB1dC5zb3VyY2UubXVsdGljYXN0U291cmNlSXAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICB9IDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGVncmVzcyA9IGNvbmZpZ0JpbmQuZWdyZXNzQ29uZmlnID8ge1xuICAgICAgZWdyZXNzR2F0ZXdheUJyaWRnZToge1xuICAgICAgICBtYXhCaXRyYXRlOiBjb25maWdCaW5kLmVncmVzc0NvbmZpZy5tYXhCaXRyYXRlLnRvQnBzKCksXG4gICAgICB9LFxuICAgICAgc291cmNlczogY29uZmlnQmluZC5lZ3Jlc3NDb25maWcuZmxvd1NvdXJjZXMubWFwKGlucHV0ID0+IHRoaXMuZm9ybWF0QnJpZGdlRmxvd1NvdXJjZShpbnB1dCkpLFxuICAgICAgb3V0cHV0czogY29uZmlnQmluZC5lZ3Jlc3NDb25maWcubmV0d29ya091dHB1dHMubWFwKG5vID0+ICh7XG4gICAgICAgIG5ldHdvcmtPdXRwdXQ6IHsgbmFtZTogbm8ubmFtZSwgLi4ubm8ub3V0cHV0Ll9iaW5kKCkgfSxcbiAgICAgIH0pKSxcbiAgICB9IDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgYnJpZGdlID0gbmV3IENmbkJyaWRnZSh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBuYW1lOiB0aGlzLnBoeXNpY2FsTmFtZSxcbiAgICAgIHBsYWNlbWVudEFybjogcHJvcHMuZ2F0ZXdheS5nYXRld2F5QXJuLFxuICAgICAgaW5ncmVzc0dhdGV3YXlCcmlkZ2U6IGluZ3Jlc3M/LmluZ3Jlc3NHYXRld2F5QnJpZGdlLFxuICAgICAgZWdyZXNzR2F0ZXdheUJyaWRnZTogZWdyZXNzPy5lZ3Jlc3NHYXRld2F5QnJpZGdlLFxuICAgICAgc291cmNlczogaW5ncmVzcz8uc291cmNlcyA/PyBlZ3Jlc3M/LnNvdXJjZXMgPz8gW10sXG4gICAgICBvdXRwdXRzOiBlZ3Jlc3M/Lm91dHB1dHMsXG4gICAgICBzb3VyY2VGYWlsb3ZlckNvbmZpZzogcHJvcHMuc291cmNlRmFpbG92ZXJDb25maWc/Ll9iaW5kKCksXG4gICAgfSk7XG5cbiAgICB0aGlzLmJyaWRnZUFybiA9IGJyaWRnZS5hdHRyQnJpZGdlQXJuO1xuICAgIHRoaXMuYnJpZGdlTmFtZSA9IHRoaXMucGh5c2ljYWxOYW1lO1xuICAgIHRoaXMuYnJpZGdlU3RhdGUgPSBicmlkZ2UuYXR0ckJyaWRnZVN0YXRlO1xuICAgIHRoaXMuYnJpZGdlVHlwZSA9IGNvbmZpZ0JpbmQuYnJpZGdlVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgYnJpZGdlIGZsb3cgc291cmNlIGludG8gQnJpZGdlU291cmNlUHJvcGVydHkgZm9ybWF0XG4gICAqL1xuICBwcml2YXRlIGZvcm1hdEJyaWRnZUZsb3dTb3VyY2UoaW5wdXQ6IEJyaWRnZUZsb3dJbnB1dCk6IENmbkJyaWRnZS5CcmlkZ2VTb3VyY2VQcm9wZXJ0eSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZsb3dTb3VyY2U6IHtcbiAgICAgICAgZmxvd0FybjogaW5wdXQuc291cmNlLmZsb3cuZmxvd0FybixcbiAgICAgICAgbmFtZTogaW5wdXQubmFtZSxcbiAgICAgICAgZmxvd1ZwY0ludGVyZmFjZUF0dGFjaG1lbnQ6IGlucHV0LnNvdXJjZS52cGNJbnRlcmZhY2UgPyB7XG4gICAgICAgICAgdnBjSW50ZXJmYWNlTmFtZTogaW5wdXQuc291cmNlLnZwY0ludGVyZmFjZS5uYW1lLFxuICAgICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iXX0=
|