@aws-cdk/aws-mediapackagev2-alpha 2.247.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.
@@ -0,0 +1,2010 @@
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.OriginEndpoint = exports.Segment = exports.IsmEncryption = exports.TsEncryption = exports.CmafEncryption = exports.EncryptionConfiguration = exports.IsmDrmSystem = exports.TsDrmSystem = exports.CmafDrmSystem = exports.MssManifestLayout = exports.TtmlProfile = exports.DashManifestCompactness = exports.DrmSignalling = exports.DashPeriodTriggers = exports.DashUtcTimingMode = exports.SegmentTemplateFormat = exports.AdMarkerHls = exports.AdMarkerDash = exports.StartTag = exports.DrmSettingsKey = exports.ScteInSegments = exports.ScteMessageType = exports.EndpointErrorConfiguration = exports.PresetSpeke20Video = exports.PresetSpeke20Audio = exports.TsEncryptionMethod = exports.CmafEncryptionMethod = exports.ContainerType = exports.Manifest = exports.ManifestFilter = exports.BitrateExpression = exports.NumericExpression = exports.BitrateFilterKey = exports.TextFilterKey = exports.NumericFilterKey = exports.TrickplayType = exports.VideoDynamicRange = exports.VideoCodec = exports.AudioCodec = 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_mediapackagev2_1 = require("aws-cdk-lib/aws-mediapackagev2");
43
+ const core_1 = require("aws-cdk-lib/core");
44
+ const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
45
+ const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
46
+ const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
47
+ const origin_endpoint_policy_1 = require("./origin-endpoint-policy");
48
+ const shared_helpers_1 = require("./shared-helpers");
49
+ /**
50
+ * Accepted audio codec values for manifest filtering.
51
+ *
52
+ * @see https://docs.aws.amazon.com/mediapackage/latest/userguide/manifest-filter-query-parameters.html
53
+ */
54
+ var AudioCodec;
55
+ (function (AudioCodec) {
56
+ /** AAC-LC audio codec */
57
+ AudioCodec["AACL"] = "AACL";
58
+ /** HE-AAC audio codec */
59
+ AudioCodec["AACH"] = "AACH";
60
+ /** Dolby Digital audio codec (include the hyphen) */
61
+ AudioCodec["AC_3"] = "AC-3";
62
+ /** Dolby Digital Plus audio codec (include the hyphen) */
63
+ AudioCodec["EC_3"] = "EC-3";
64
+ })(AudioCodec || (exports.AudioCodec = AudioCodec = {}));
65
+ /**
66
+ * Accepted video codec values for manifest filtering.
67
+ *
68
+ * @see https://docs.aws.amazon.com/mediapackage/latest/userguide/manifest-filter-query-parameters.html
69
+ */
70
+ var VideoCodec;
71
+ (function (VideoCodec) {
72
+ /** H.264/AVC */
73
+ VideoCodec["H264"] = "H264";
74
+ /** H.265/HEVC */
75
+ VideoCodec["H265"] = "H265";
76
+ /** AV1 */
77
+ VideoCodec["AV1"] = "AV1";
78
+ })(VideoCodec || (exports.VideoCodec = VideoCodec = {}));
79
+ /**
80
+ * Accepted video dynamic range values for manifest filtering.
81
+ *
82
+ * @see https://docs.aws.amazon.com/mediapackage/latest/userguide/manifest-filter-query-parameters.html
83
+ */
84
+ var VideoDynamicRange;
85
+ (function (VideoDynamicRange) {
86
+ /** Dolby Vision */
87
+ VideoDynamicRange["DV"] = "dv";
88
+ /** HDR10 */
89
+ VideoDynamicRange["HDR10"] = "hdr10";
90
+ /** Hybrid Log-Gamma */
91
+ VideoDynamicRange["HLG"] = "hlg";
92
+ /** Standard Dynamic Range */
93
+ VideoDynamicRange["SDR"] = "sdr";
94
+ })(VideoDynamicRange || (exports.VideoDynamicRange = VideoDynamicRange = {}));
95
+ /**
96
+ * Accepted trickplay type values for manifest filtering.
97
+ *
98
+ * @see https://docs.aws.amazon.com/mediapackage/latest/userguide/manifest-filter-query-parameters.html
99
+ */
100
+ var TrickplayType;
101
+ (function (TrickplayType) {
102
+ /** I-frame only trick-play */
103
+ TrickplayType["IFRAME"] = "iframe";
104
+ /** Image-based trick-play */
105
+ TrickplayType["IMAGE"] = "image";
106
+ /** No trick-play */
107
+ TrickplayType["NONE"] = "none";
108
+ })(TrickplayType || (exports.TrickplayType = TrickplayType = {}));
109
+ /**
110
+ * Numeric manifest filter keys.
111
+ *
112
+ * Use with `ManifestFilter.numeric()`, `ManifestFilter.numericList()`, and `ManifestFilter.numericRange()`.
113
+ *
114
+ * Audio and video bitrate filters are not included here because they use the
115
+ * `Bitrate` class directly via dedicated methods on `ManifestFilter`.
116
+ *
117
+ * @see https://docs.aws.amazon.com/mediapackage/latest/userguide/manifest-filter-query-parameters.html
118
+ */
119
+ var NumericFilterKey;
120
+ (function (NumericFilterKey) {
121
+ /**
122
+ * The number of audio channels.
123
+ *
124
+ * Accepted values: range 1–32767, or individual integers.
125
+ */
126
+ NumericFilterKey["AUDIO_CHANNELS"] = "audio_channels";
127
+ /**
128
+ * The audio sample rate in Hz.
129
+ *
130
+ * Accepted values: range 0–2147483647, or individual integers.
131
+ */
132
+ NumericFilterKey["AUDIO_SAMPLE_RATE"] = "audio_sample_rate";
133
+ /**
134
+ * The height of the trick-play image in pixels (I-frame and image-based trick-play).
135
+ *
136
+ * If using with I-frame only trick-play, `TRICKPLAY_HEIGHT` and `VIDEO_HEIGHT`
137
+ * should have similar values. If they differ, I-frame only tracks might be
138
+ * removed from the manifest.
139
+ *
140
+ * Accepted values: range 1–2147483647, or individual integers.
141
+ */
142
+ NumericFilterKey["TRICKPLAY_HEIGHT"] = "trickplay_height";
143
+ /**
144
+ * The video frame rate range in NTSC format.
145
+ *
146
+ * When filtering for a single value, MediaPackage uses an approximate equals
147
+ * comparison with an epsilon tolerance of 0.0005.
148
+ *
149
+ * Accepted values: range 1–999.999 (up to three decimal places), or individual values.
150
+ */
151
+ NumericFilterKey["VIDEO_FRAMERATE"] = "video_framerate";
152
+ /**
153
+ * The height of the video in pixels.
154
+ *
155
+ * If using with I-frame only trick-play, `TRICKPLAY_HEIGHT` and `VIDEO_HEIGHT`
156
+ * should have similar values. If they differ, I-frame only tracks might be
157
+ * removed from the manifest.
158
+ *
159
+ * Accepted values: range 1–32767, or individual integers.
160
+ */
161
+ NumericFilterKey["VIDEO_HEIGHT"] = "video_height";
162
+ })(NumericFilterKey || (exports.NumericFilterKey = NumericFilterKey = {}));
163
+ /**
164
+ * Text manifest filter keys for free-form string values.
165
+ *
166
+ * Use with `ManifestFilter.text()` and `ManifestFilter.textList()`.
167
+ *
168
+ * For keys with fixed accepted values, use the dedicated methods on `ManifestFilter` instead:
169
+ * - Audio codec: `ManifestFilter.audioCodec()` / `ManifestFilter.audioCodecList()`
170
+ * - Video codec: `ManifestFilter.videoCodec()` / `ManifestFilter.videoCodecList()`
171
+ * - Video dynamic range: `ManifestFilter.videoDynamicRange()` / `ManifestFilter.videoDynamicRangeList()`
172
+ * - Trickplay type: `ManifestFilter.trickplayType()` / `ManifestFilter.trickplayTypeList()`
173
+ *
174
+ * @see https://docs.aws.amazon.com/mediapackage/latest/userguide/manifest-filter-query-parameters.html
175
+ */
176
+ var TextFilterKey;
177
+ (function (TextFilterKey) {
178
+ /**
179
+ * Audio languages or functional codes derived from encoder passthrough.
180
+ *
181
+ * Accepted values: arbitrary strings such as ISO-639-1 language codes (not case-sensitive).
182
+ */
183
+ TextFilterKey["AUDIO_LANGUAGE"] = "audio_language";
184
+ /**
185
+ * The subtitle language or functional codes derived from encoder passthrough.
186
+ *
187
+ * Accepted values: arbitrary strings such as ISO-639-1 language codes (not case-sensitive).
188
+ */
189
+ TextFilterKey["SUBTITLE_LANGUAGE"] = "subtitle_language";
190
+ })(TextFilterKey || (exports.TextFilterKey = TextFilterKey = {}));
191
+ /**
192
+ * Bitrate manifest filter keys.
193
+ *
194
+ * Use with `ManifestFilter.bitrate()` and `ManifestFilter.bitrateRange()`.
195
+ *
196
+ * @see https://docs.aws.amazon.com/mediapackage/latest/userguide/manifest-filter-query-parameters.html
197
+ */
198
+ var BitrateFilterKey;
199
+ (function (BitrateFilterKey) {
200
+ /**
201
+ * The audio bitrate in bits per second.
202
+ *
203
+ * Accepted values: range 0–2147483647, or individual integers.
204
+ */
205
+ BitrateFilterKey["AUDIO_BITRATE"] = "audio_bitrate";
206
+ /**
207
+ * The video bitrate in bits per second.
208
+ *
209
+ * We recommend using only this filter parameter to set the video bitrate.
210
+ * Do not also set the minimum and maximum video bitrate via the MediaPackage
211
+ * console or AWS CLI, as your output might be skewed.
212
+ *
213
+ * This parameter cannot be used with trick-play streams.
214
+ *
215
+ * Accepted values: range 0–2147483647, or individual integers.
216
+ */
217
+ BitrateFilterKey["VIDEO_BITRATE"] = "video_bitrate";
218
+ })(BitrateFilterKey || (exports.BitrateFilterKey = BitrateFilterKey = {}));
219
+ /**
220
+ * Represents a numeric filter expression segment — either a single value or a range.
221
+ *
222
+ * Use with `ManifestFilter.numericCombo()` to build filters that combine
223
+ * ranges and individual values (e.g. `video_height:240-360,720-1080,1440`).
224
+ */
225
+ class NumericExpression {
226
+ _expression;
227
+ _values;
228
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.NumericExpression", version: "2.247.0-alpha.0" };
229
+ /**
230
+ * A single numeric value.
231
+ */
232
+ static value(v) {
233
+ return new NumericExpression(`${v}`, [v]);
234
+ }
235
+ /**
236
+ * An inclusive numeric range.
237
+ */
238
+ static range(start, end) {
239
+ return new NumericExpression(`${start}-${end}`, [start, end]);
240
+ }
241
+ constructor(
242
+ /** @internal */
243
+ _expression,
244
+ /** @internal */
245
+ _values) {
246
+ this._expression = _expression;
247
+ this._values = _values;
248
+ }
249
+ }
250
+ exports.NumericExpression = NumericExpression;
251
+ /**
252
+ * Represents a bitrate filter expression segment — either a single value or a range.
253
+ *
254
+ * Use with `ManifestFilter.bitrateCombo()` to build filters that combine
255
+ * ranges and individual bitrate values.
256
+ */
257
+ class BitrateExpression {
258
+ _expression;
259
+ _values;
260
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.BitrateExpression", version: "2.247.0-alpha.0" };
261
+ /**
262
+ * A single bitrate value.
263
+ */
264
+ static value(v) {
265
+ return new BitrateExpression(`${v.toBps()}`, [v.toBps()]);
266
+ }
267
+ /**
268
+ * An inclusive bitrate range.
269
+ */
270
+ static range(start, end) {
271
+ return new BitrateExpression(`${start.toBps()}-${end.toBps()}`, [start.toBps(), end.toBps()]);
272
+ }
273
+ constructor(
274
+ /** @internal */
275
+ _expression,
276
+ /** @internal */
277
+ _values) {
278
+ this._expression = _expression;
279
+ this._values = _values;
280
+ }
281
+ }
282
+ exports.BitrateExpression = BitrateExpression;
283
+ /**
284
+ * Enables you to create filters for your Origin Endpoint.
285
+ *
286
+ * @see https://docs.aws.amazon.com/mediapackage/latest/userguide/manifest-filtering.html
287
+ */
288
+ class ManifestFilter {
289
+ filterString;
290
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.ManifestFilter", version: "2.247.0-alpha.0" };
291
+ /**
292
+ * Filter by a single bitrate value.
293
+ */
294
+ static bitrate(key, value) {
295
+ try {
296
+ jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_BitrateFilterKey(key);
297
+ }
298
+ catch (error) {
299
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
300
+ Error.captureStackTrace(error, this.bitrate);
301
+ }
302
+ throw error;
303
+ }
304
+ const bps = value.toBps();
305
+ validateBitrateFilterValue(bps, key);
306
+ return new ManifestFilter(`${key}:${bps}`);
307
+ }
308
+ /**
309
+ * Filter by a bitrate range (inclusive).
310
+ */
311
+ static bitrateRange(key, start, end) {
312
+ try {
313
+ jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_BitrateFilterKey(key);
314
+ }
315
+ catch (error) {
316
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
317
+ Error.captureStackTrace(error, this.bitrateRange);
318
+ }
319
+ throw error;
320
+ }
321
+ const startBps = start.toBps();
322
+ const endBps = end.toBps();
323
+ validateBitrateFilterValue(startBps, key);
324
+ validateBitrateFilterValue(endBps, key);
325
+ return new ManifestFilter(`${key}:${startBps}-${endBps}`);
326
+ }
327
+ /**
328
+ * Specify a single numeric filter value.
329
+ */
330
+ static numeric(key, value) {
331
+ try {
332
+ jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_NumericFilterKey(key);
333
+ }
334
+ catch (error) {
335
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
336
+ Error.captureStackTrace(error, this.numeric);
337
+ }
338
+ throw error;
339
+ }
340
+ validateNumericFilterValue(value, key);
341
+ return new ManifestFilter(`${key}:${value}`);
342
+ }
343
+ /**
344
+ * Specify multiple numeric filter values.
345
+ */
346
+ static numericList(key, values) {
347
+ try {
348
+ jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_NumericFilterKey(key);
349
+ }
350
+ catch (error) {
351
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
352
+ Error.captureStackTrace(error, this.numericList);
353
+ }
354
+ throw error;
355
+ }
356
+ values.forEach(v => validateNumericFilterValue(v, key));
357
+ return new ManifestFilter(`${key}:${values.join(',')}`);
358
+ }
359
+ /**
360
+ * Specify a numeric filter range (inclusive).
361
+ */
362
+ static numericRange(key, start, end) {
363
+ try {
364
+ jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_NumericFilterKey(key);
365
+ }
366
+ catch (error) {
367
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
368
+ Error.captureStackTrace(error, this.numericRange);
369
+ }
370
+ throw error;
371
+ }
372
+ validateNumericFilterValue(start, key);
373
+ validateNumericFilterValue(end, key);
374
+ return new ManifestFilter(`${key}:${start}-${end}`);
375
+ }
376
+ /**
377
+ * Specify a free-form text filter value (for language keys).
378
+ */
379
+ static text(key, value) {
380
+ try {
381
+ jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_TextFilterKey(key);
382
+ }
383
+ catch (error) {
384
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
385
+ Error.captureStackTrace(error, this.text);
386
+ }
387
+ throw error;
388
+ }
389
+ return new ManifestFilter(`${key}:${value}`);
390
+ }
391
+ /**
392
+ * Specify multiple free-form text filter values (for language keys).
393
+ */
394
+ static textList(key, values) {
395
+ try {
396
+ jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_TextFilterKey(key);
397
+ }
398
+ catch (error) {
399
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
400
+ Error.captureStackTrace(error, this.textList);
401
+ }
402
+ throw error;
403
+ }
404
+ return new ManifestFilter(`${key}:${values.join(',')}`);
405
+ }
406
+ /**
407
+ * Filter by a single audio codec.
408
+ */
409
+ static audioCodec(value) {
410
+ try {
411
+ jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_AudioCodec(value);
412
+ }
413
+ catch (error) {
414
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
415
+ Error.captureStackTrace(error, this.audioCodec);
416
+ }
417
+ throw error;
418
+ }
419
+ return new ManifestFilter(`audio_codec:${value}`);
420
+ }
421
+ /**
422
+ * Filter by multiple audio codecs.
423
+ */
424
+ static audioCodecList(values) {
425
+ return new ManifestFilter(`audio_codec:${values.join(',')}`);
426
+ }
427
+ /**
428
+ * Filter by a single video codec.
429
+ */
430
+ static videoCodec(value) {
431
+ try {
432
+ jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_VideoCodec(value);
433
+ }
434
+ catch (error) {
435
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
436
+ Error.captureStackTrace(error, this.videoCodec);
437
+ }
438
+ throw error;
439
+ }
440
+ return new ManifestFilter(`video_codec:${value}`);
441
+ }
442
+ /**
443
+ * Filter by multiple video codecs.
444
+ */
445
+ static videoCodecList(values) {
446
+ return new ManifestFilter(`video_codec:${values.join(',')}`);
447
+ }
448
+ /**
449
+ * Filter by a single video dynamic range.
450
+ */
451
+ static videoDynamicRange(value) {
452
+ try {
453
+ jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_VideoDynamicRange(value);
454
+ }
455
+ catch (error) {
456
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
457
+ Error.captureStackTrace(error, this.videoDynamicRange);
458
+ }
459
+ throw error;
460
+ }
461
+ return new ManifestFilter(`video_dynamic_range:${value}`);
462
+ }
463
+ /**
464
+ * Filter by multiple video dynamic ranges.
465
+ */
466
+ static videoDynamicRangeList(values) {
467
+ return new ManifestFilter(`video_dynamic_range:${values.join(',')}`);
468
+ }
469
+ /**
470
+ * Filter by a single trickplay type.
471
+ */
472
+ static trickplayType(value) {
473
+ try {
474
+ jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_TrickplayType(value);
475
+ }
476
+ catch (error) {
477
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
478
+ Error.captureStackTrace(error, this.trickplayType);
479
+ }
480
+ throw error;
481
+ }
482
+ return new ManifestFilter(`trickplay_type:${value}`);
483
+ }
484
+ /**
485
+ * Filter by multiple trickplay types.
486
+ */
487
+ static trickplayTypeList(values) {
488
+ return new ManifestFilter(`trickplay_type:${values.join(',')}`);
489
+ }
490
+ /**
491
+ * Filter by a combination of numeric ranges and individual values.
492
+ *
493
+ * Use this for advanced patterns like `video_height:240-360,720-1080,1440`.
494
+ *
495
+ * @example
496
+ * ManifestFilter.numericCombo(NumericFilterKey.VIDEO_HEIGHT, [
497
+ * NumericExpression.range(240, 360),
498
+ * NumericExpression.range(720, 1080),
499
+ * NumericExpression.value(1440),
500
+ * ])
501
+ */
502
+ static numericCombo(key, expressions) {
503
+ try {
504
+ jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_NumericFilterKey(key);
505
+ }
506
+ catch (error) {
507
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
508
+ Error.captureStackTrace(error, this.numericCombo);
509
+ }
510
+ throw error;
511
+ }
512
+ expressions.forEach(expr => expr._values.forEach(v => validateNumericFilterValue(v, key)));
513
+ return new ManifestFilter(`${key}:${expressions.map(e => e._expression).join(',')}`);
514
+ }
515
+ /**
516
+ * Filter by a combination of bitrate ranges and individual values.
517
+ *
518
+ * @example
519
+ * ManifestFilter.bitrateCombo(BitrateFilterKey.VIDEO_BITRATE, [
520
+ * BitrateExpression.range(Bitrate.mbps(1), Bitrate.mbps(3)),
521
+ * BitrateExpression.value(Bitrate.mbps(5)),
522
+ * ])
523
+ */
524
+ static bitrateCombo(key, expressions) {
525
+ try {
526
+ jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_BitrateFilterKey(key);
527
+ }
528
+ catch (error) {
529
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
530
+ Error.captureStackTrace(error, this.bitrateCombo);
531
+ }
532
+ throw error;
533
+ }
534
+ expressions.forEach(expr => expr._values.forEach(v => validateBitrateFilterValue(v, key)));
535
+ return new ManifestFilter(`${key}:${expressions.map(e => e._expression).join(',')}`);
536
+ }
537
+ /**
538
+ * Specify a custom manifest filter string.
539
+ */
540
+ static custom(custom) {
541
+ return new ManifestFilter(custom);
542
+ }
543
+ /**
544
+ * @param filterString Normalised manifest filter string
545
+ */
546
+ constructor(filterString) {
547
+ this.filterString = filterString;
548
+ }
549
+ }
550
+ exports.ManifestFilter = ManifestFilter;
551
+ /**
552
+ * Manifest to add to Origin Endpoint
553
+ */
554
+ class Manifest {
555
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.Manifest", version: "2.247.0-alpha.0" };
556
+ /**
557
+ * Specify a manifest configuration for Low Latency HLS.
558
+ *
559
+ * **Note:** Low Latency HLS manifests require TS or CMAF container type.
560
+ * Use with `Segment.ts()` or `Segment.cmaf()`.
561
+ */
562
+ static lowLatencyHLS(manifest) {
563
+ try {
564
+ jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_LowLatencyHlsManifestConfiguration(manifest);
565
+ }
566
+ catch (error) {
567
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
568
+ Error.captureStackTrace(error, this.lowLatencyHLS);
569
+ }
570
+ throw error;
571
+ }
572
+ return new LowLatencyHlsManifest(manifest);
573
+ }
574
+ /**
575
+ * Specify a manifest configuration for HLS.
576
+ *
577
+ * **Note:** HLS manifests require TS or CMAF container type.
578
+ * Use with `Segment.ts()` or `Segment.cmaf()`.
579
+ */
580
+ static hls(manifest) {
581
+ try {
582
+ jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_HlsManifestConfiguration(manifest);
583
+ }
584
+ catch (error) {
585
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
586
+ Error.captureStackTrace(error, this.hls);
587
+ }
588
+ throw error;
589
+ }
590
+ return new HlsManifest(manifest);
591
+ }
592
+ /**
593
+ * Specify a manifest configuration for DASH.
594
+ *
595
+ * **Note:** DASH manifests require CMAF container type.
596
+ * Use with `Segment.cmaf()`.
597
+ */
598
+ static dash(manifest) {
599
+ try {
600
+ jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_DashManifestConfiguration(manifest);
601
+ }
602
+ catch (error) {
603
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
604
+ Error.captureStackTrace(error, this.dash);
605
+ }
606
+ throw error;
607
+ }
608
+ return new DashManifest(manifest);
609
+ }
610
+ /**
611
+ * Specify a manifest configuration for MSS.
612
+ *
613
+ * **Note:** MSS manifests require ISM container type.
614
+ * Use with `Segment.ism()`.
615
+ */
616
+ static mss(manifest) {
617
+ try {
618
+ jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_MssManifestConfiguration(manifest);
619
+ }
620
+ catch (error) {
621
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
622
+ Error.captureStackTrace(error, this.mss);
623
+ }
624
+ throw error;
625
+ }
626
+ return new MssManifest(manifest);
627
+ }
628
+ }
629
+ exports.Manifest = Manifest;
630
+ /**
631
+ * Validate a numeric filter value is an integer within the accepted range for its key.
632
+ * VIDEO_FRAMERATE is excluded — it uses `validateFramerateValue` instead.
633
+ * @internal
634
+ */
635
+ function validateIntegerFilterValue(value, key, min, max) {
636
+ if (!Number.isInteger(value)) {
637
+ throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `NumericFilterMustBeInteger`, `Numeric filter value for '${key}' must be an integer, got ${value}`);
638
+ }
639
+ if (value < min || value > max) {
640
+ throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `NumericFilterOutOfRange`, `Numeric filter value for '${key}' must be between ${min} and ${max}, got ${value}`);
641
+ }
642
+ }
643
+ /**
644
+ * Validate a video framerate filter value (1–999.999, up to 3 decimal places).
645
+ * @internal
646
+ */
647
+ function validateFramerateValue(value) {
648
+ if (value < 1 || value > 999.999) {
649
+ throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `NumericFilterOutOfRange`, `Numeric filter value for 'video_framerate' must be between 1 and 999.999, got ${value}`);
650
+ }
651
+ const decimalPart = value.toString().split('.')[1];
652
+ if (decimalPart && decimalPart.length > 3) {
653
+ throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `NumericFilterMaxDecimalPlaces`, `Numeric filter value for 'video_framerate' allows up to 3 decimal places, got ${value}`);
654
+ }
655
+ }
656
+ /**
657
+ * Route numeric validation to the correct helper based on key.
658
+ * @internal
659
+ */
660
+ function validateNumericFilterValue(value, key) {
661
+ switch (key) {
662
+ case NumericFilterKey.AUDIO_CHANNELS:
663
+ return validateIntegerFilterValue(value, key, 1, 32_767);
664
+ case NumericFilterKey.AUDIO_SAMPLE_RATE:
665
+ return validateIntegerFilterValue(value, key, 0, 2_147_483_647);
666
+ case NumericFilterKey.TRICKPLAY_HEIGHT:
667
+ return validateIntegerFilterValue(value, key, 1, 2_147_483_647);
668
+ case NumericFilterKey.VIDEO_FRAMERATE:
669
+ return validateFramerateValue(value);
670
+ case NumericFilterKey.VIDEO_HEIGHT:
671
+ return validateIntegerFilterValue(value, key, 1, 32_767);
672
+ }
673
+ }
674
+ /**
675
+ * Validate a bitrate filter value is an integer within the accepted range.
676
+ * @internal
677
+ */
678
+ function validateBitrateFilterValue(bps, key) {
679
+ if (!Number.isInteger(bps)) {
680
+ throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `BitrateFilterMustBeInteger`, `Bitrate filter value for '${key}' must resolve to a whole number of bits per second, got ${bps}`);
681
+ }
682
+ if (bps < 0 || bps > 2_147_483_647) {
683
+ throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `BitrateFilterOutOfRange`, `Bitrate filter value for '${key}' must be between 0 and 2147483647, got ${bps}`);
684
+ }
685
+ }
686
+ /**
687
+ * Validates common manifest configuration properties
688
+ */
689
+ function validateManifestConfiguration(config) {
690
+ if (config.manifestWindow && config.manifestWindow.toSeconds() < 30) {
691
+ throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `ManifestWindowMinimum`, 'Manifest Window has a minimum value of 30 seconds');
692
+ }
693
+ }
694
+ /**
695
+ * Validate and modify filter configuration
696
+ * @internal
697
+ */
698
+ function validateFilterConfiguration(filterConfig) {
699
+ if (!filterConfig)
700
+ return undefined;
701
+ if (filterConfig.clipStartTime && (filterConfig.start || filterConfig.end)) {
702
+ throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `ClipStartTimeConflict`, 'You cannot specify both ClipStartTime with Start or End in a FilterConfiguration.');
703
+ }
704
+ if (filterConfig.timeDelay && (filterConfig.timeDelay.toSeconds() < 0 || filterConfig.timeDelay.toSeconds() > 1209600)) {
705
+ throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `TimeDelayRange`, 'Time Delay setting should be defined between 0-1209600 seconds.');
706
+ }
707
+ if (filterConfig.start && filterConfig.end && (filterConfig.end <= filterConfig.start)) {
708
+ throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `EndBeforeStart`, 'The End parameter needs to be after the Start parameter in a FilterConfiguration.');
709
+ }
710
+ const manifestFilter = filterConfig.manifestFilter ? filterConfig.manifestFilter.map(filter => filter.filterString).join(';') : undefined;
711
+ if (manifestFilter != undefined && (manifestFilter.length < 1 || manifestFilter.length > 1024)) {
712
+ throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `ManifestFilterLength`, 'Manifest filter needs to be between 1-1024 characters in length.');
713
+ }
714
+ if (filterConfig.manifestFilter && filterConfig.manifestFilter.length > 1) {
715
+ const keys = filterConfig.manifestFilter.map(f => f.filterString.split(':')[0]);
716
+ keys.forEach((key, i) => {
717
+ if (keys.indexOf(key) !== i) {
718
+ throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `DuplicateManifestFilterKey`, `Duplicate manifest filter key '${key}'. Use a single filter with comma-separated values instead (e.g. ManifestFilter.numericList() or ManifestFilter.custom()).`);
719
+ }
720
+ });
721
+ }
722
+ return {
723
+ manifestFilter,
724
+ drmSettings: filterConfig.drmSettings ? filterConfig.drmSettings.filter((v, i, a) => a.indexOf(v) === i).join(';') : undefined,
725
+ clipStartTime: filterConfig.clipStartTime ? (0, shared_helpers_1.convertDateToString)(filterConfig.clipStartTime) : undefined,
726
+ start: filterConfig.start ? (0, shared_helpers_1.convertDateToString)(filterConfig.start) : undefined,
727
+ end: filterConfig.end ? (0, shared_helpers_1.convertDateToString)(filterConfig.end) : undefined,
728
+ timeDelaySeconds: filterConfig.timeDelay?.toSeconds(),
729
+ };
730
+ }
731
+ /**
732
+ * Validate startTag configuration
733
+ * @internal
734
+ */
735
+ function validateStartTag(startTag, manifestWindow, segmentDuration) {
736
+ const timeOffset = startTag.timeOffset;
737
+ // Get segment duration (default is 6 seconds if not specified)
738
+ const segmentDurationSec = segmentDuration?.toSeconds() ?? 6;
739
+ // Get manifest duration (default is 60 seconds if not specified)
740
+ const manifestDurationSec = manifestWindow?.toSeconds() ?? 60;
741
+ // Validate positive offset (from start)
742
+ if (timeOffset > 0) {
743
+ const maxPositiveOffset = manifestDurationSec - (3 * segmentDurationSec);
744
+ if (timeOffset >= maxPositiveOffset) {
745
+ throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `StartTagPositiveOffsetExceeded`, `StartTag timeOffset (${timeOffset}s) must be less than manifest duration (${manifestDurationSec}s) minus 3 times segment duration (${segmentDurationSec}s). Maximum allowed: ${maxPositiveOffset}s`);
746
+ }
747
+ }
748
+ // Validate negative offset (from live edge)
749
+ if (timeOffset < 0) {
750
+ const absOffset = Math.abs(timeOffset);
751
+ const minNegativeOffset = 3 * segmentDurationSec;
752
+ if (absOffset <= minNegativeOffset) {
753
+ throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `StartTagNegativeOffsetTooSmall`, `StartTag timeOffset (${timeOffset}s) absolute value must be greater than 3 times segment duration (${segmentDurationSec}s). Minimum allowed: -${minNegativeOffset + 0.01}s`);
754
+ }
755
+ if (absOffset >= manifestDurationSec) {
756
+ throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `StartTagNegativeOffsetExceedsManifest`, `StartTag timeOffset (${timeOffset}s) absolute value must be less than manifest duration (${manifestDurationSec}s)`);
757
+ }
758
+ }
759
+ }
760
+ /**
761
+ * Build HLS manifest configuration
762
+ * @internal
763
+ */
764
+ function buildHlsManifestConfiguration(config, segmentDuration) {
765
+ if (config.startTag) {
766
+ validateStartTag(config.startTag, config.manifestWindow, segmentDuration);
767
+ }
768
+ return {
769
+ manifestName: config.manifestName,
770
+ childManifestName: config.childManifestName,
771
+ manifestWindowSeconds: config.manifestWindow?.toSeconds(),
772
+ programDateTimeIntervalSeconds: config.programDateTimeInterval?.toSeconds(),
773
+ scteHls: config.scteAdMarkerHls ? { adMarkerHls: config.scteAdMarkerHls } : undefined,
774
+ startTag: config.startTag,
775
+ urlEncodeChildManifest: config.urlEncodeChildManifest,
776
+ filterConfiguration: validateFilterConfiguration(config.filterConfiguration),
777
+ };
778
+ }
779
+ /**
780
+ * Build DASH manifest configuration
781
+ * @internal
782
+ */
783
+ function buildDashManifestConfiguration(config, segment) {
784
+ if (config.minBufferTime && (config.minBufferTime.toSeconds() < 1 || config.minBufferTime.toSeconds() > 3600)) {
785
+ throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `MinBufferTimeRange`, 'Min buffer time has a range from 1 sec. to 3600 sec.');
786
+ }
787
+ if (config.minUpdatePeriod && (config.minUpdatePeriod.toSeconds() < 1 || config.minUpdatePeriod.toSeconds() > 3600)) {
788
+ throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `MinUpdatePeriodRange`, 'Min update period option has a range from 1 sec. to 3600 sec.');
789
+ }
790
+ if (config.scteDashAdMarker && (!segment?.scteFilter || segment.scteFilter?.length === 0)) {
791
+ throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `ScteFilterRequired`, 'SCTE Filter must be configured with DashAdMarker Configuration');
792
+ }
793
+ return {
794
+ manifestName: config.manifestName,
795
+ baseUrls: config.baseUrls,
796
+ compactness: config.compactness,
797
+ drmSignaling: config.drmSignalling,
798
+ dvbSettings: config.dvbSettings,
799
+ profiles: config.profiles,
800
+ programInformation: config.programInformation,
801
+ subtitleConfiguration: config.subtitleConfiguration,
802
+ manifestWindowSeconds: config.manifestWindow?.toSeconds(),
803
+ minBufferTimeSeconds: config.minBufferTime?.toSeconds(),
804
+ minUpdatePeriodSeconds: config.minUpdatePeriod?.toSeconds(),
805
+ suggestedPresentationDelaySeconds: config.suggestedPresentationDelay?.toSeconds(),
806
+ segmentTemplateFormat: config.segmentTemplateFormat,
807
+ periodTriggers: config.periodTriggers,
808
+ scteDash: segment?.scteFilter ? {
809
+ adMarkerDash: config.scteDashAdMarker,
810
+ } : undefined,
811
+ utcTiming: config.utcTimingMode || config.utcTimingSource ? {
812
+ timingMode: config.utcTimingMode,
813
+ timingSource: config.utcTimingSource,
814
+ } : undefined,
815
+ filterConfiguration: validateFilterConfiguration(config.filterConfiguration),
816
+ };
817
+ }
818
+ /**
819
+ * Build MSS manifest configuration
820
+ * @internal
821
+ */
822
+ function buildMssManifestConfiguration(config) {
823
+ return {
824
+ manifestName: config.manifestName,
825
+ manifestLayout: config.manifestLayout,
826
+ manifestWindowSeconds: config.manifestWindow?.toSeconds(),
827
+ filterConfiguration: validateFilterConfiguration(config.filterConfiguration),
828
+ };
829
+ }
830
+ /**
831
+ * HLS Manifest implementation
832
+ */
833
+ class HlsManifest extends Manifest {
834
+ config;
835
+ constructor(config) {
836
+ super();
837
+ this.config = config;
838
+ }
839
+ _bind(context) {
840
+ validateManifestConfiguration(this.config);
841
+ context.hlsManifests.push(buildHlsManifestConfiguration(this.config, context.segment?.segmentDuration));
842
+ }
843
+ }
844
+ /**
845
+ * Low Latency HLS Manifest implementation
846
+ */
847
+ class LowLatencyHlsManifest extends Manifest {
848
+ config;
849
+ constructor(config) {
850
+ super();
851
+ this.config = config;
852
+ }
853
+ _bind(context) {
854
+ validateManifestConfiguration(this.config);
855
+ context.llHlsManifests.push(buildHlsManifestConfiguration(this.config, context.segment?.segmentDuration));
856
+ }
857
+ }
858
+ /**
859
+ * DASH Manifest implementation
860
+ */
861
+ class DashManifest extends Manifest {
862
+ config;
863
+ constructor(config) {
864
+ super();
865
+ this.config = config;
866
+ }
867
+ _bind(context) {
868
+ validateManifestConfiguration(this.config);
869
+ if (this.config.utcTimingMode === DashUtcTimingMode.UTC_DIRECT && this.config.utcTimingSource) {
870
+ throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `UtcDirectTimingSource`, 'UTC Direct configured with a timing source, ensure timing source is undefined to use UTC Direct.');
871
+ }
872
+ context.dashManifests.push(buildDashManifestConfiguration(this.config, context.segment));
873
+ }
874
+ }
875
+ /**
876
+ * MSS Manifest implementation
877
+ */
878
+ class MssManifest extends Manifest {
879
+ config;
880
+ constructor(config) {
881
+ super();
882
+ this.config = config;
883
+ }
884
+ _bind(context) {
885
+ validateManifestConfiguration(this.config);
886
+ context.mssManifests.push(buildMssManifestConfiguration(this.config));
887
+ }
888
+ }
889
+ /**
890
+ * The type of container to attach to this origin endpoint.
891
+ * A container type is a file format that encapsulates one or more media streams, such as audio and video, into a single file. You can't change the container type after you create the endpoint.
892
+ */
893
+ var ContainerType;
894
+ (function (ContainerType) {
895
+ /**
896
+ * TS Container Type
897
+ */
898
+ ContainerType["TS"] = "TS";
899
+ /**
900
+ * CMAF Container Type
901
+ */
902
+ ContainerType["CMAF"] = "CMAF";
903
+ /**
904
+ * ISM Container Type (Microsoft Smooth Streaming)
905
+ */
906
+ ContainerType["ISM"] = "ISM";
907
+ })(ContainerType || (exports.ContainerType = ContainerType = {}));
908
+ /**
909
+ * Encryption methods for CMAF container type.
910
+ */
911
+ var CmafEncryptionMethod;
912
+ (function (CmafEncryptionMethod) {
913
+ /**
914
+ * Common Encryption Scheme (CENC) - compatible with PlayReady, Widevine, and Irdeto DRM systems.
915
+ */
916
+ CmafEncryptionMethod["CENC"] = "CENC";
917
+ /**
918
+ * Common Encryption Scheme with CBCS mode - compatible with PlayReady, Widevine, and FairPlay DRM systems.
919
+ */
920
+ CmafEncryptionMethod["CBCS"] = "CBCS";
921
+ })(CmafEncryptionMethod || (exports.CmafEncryptionMethod = CmafEncryptionMethod = {}));
922
+ /**
923
+ * Encryption methods for TS container type.
924
+ */
925
+ var TsEncryptionMethod;
926
+ (function (TsEncryptionMethod) {
927
+ /**
928
+ * AES-128 encryption - requires Clear Key AES 128 DRM system.
929
+ */
930
+ TsEncryptionMethod["AES_128"] = "AES_128";
931
+ /**
932
+ * Sample-level AES encryption - requires FairPlay DRM system.
933
+ */
934
+ TsEncryptionMethod["SAMPLE_AES"] = "SAMPLE_AES";
935
+ })(TsEncryptionMethod || (exports.TsEncryptionMethod = TsEncryptionMethod = {}));
936
+ /**
937
+ * A collection of audio encryption presets.
938
+ */
939
+ var PresetSpeke20Audio;
940
+ (function (PresetSpeke20Audio) {
941
+ /**
942
+ * Use one content key to encrypt all of the audio tracks in your stream.
943
+ */
944
+ PresetSpeke20Audio["PRESET_AUDIO_1"] = "PRESET_AUDIO_1";
945
+ /**
946
+ * Use one content key to encrypt all of the stereo audio tracks and one content key to encrypt all of the multichannel audio tracks.
947
+ */
948
+ PresetSpeke20Audio["PRESET_AUDIO_2"] = "PRESET_AUDIO_2";
949
+ /**
950
+ * Use one content key to encrypt all of the stereo audio tracks, one content key to encrypt all of the multichannel audio tracks with 3 to 6 channels,
951
+ * and one content key to encrypt all of the multichannel audio tracks with more than 6 channels.
952
+ */
953
+ PresetSpeke20Audio["PRESET_AUDIO_3"] = "PRESET_AUDIO_3";
954
+ /**
955
+ * Use the same content key for all of the audio and video tracks in your stream.
956
+ */
957
+ PresetSpeke20Audio["SHARED"] = "SHARED";
958
+ /**
959
+ * Don't encrypt any of the audio tracks in your stream.
960
+ */
961
+ PresetSpeke20Audio["UNENCRYPTED"] = "UNENCRYPTED";
962
+ })(PresetSpeke20Audio || (exports.PresetSpeke20Audio = PresetSpeke20Audio = {}));
963
+ /**
964
+ * The SPEKE Version 2.0 preset video associated with the encryption contract configuration of the origin endpoint.
965
+ *
966
+ * A collection of video encryption presets.
967
+ */
968
+ var PresetSpeke20Video;
969
+ (function (PresetSpeke20Video) {
970
+ /**
971
+ * Use one content key to encrypt all of the video tracks in your stream.
972
+ */
973
+ PresetSpeke20Video["PRESET_VIDEO_1"] = "PRESET_VIDEO_1";
974
+ /**
975
+ * Use one content key to encrypt all of the SD video tracks and one content key for all HD and higher resolutions video tracks.
976
+ */
977
+ PresetSpeke20Video["PRESET_VIDEO_2"] = "PRESET_VIDEO_2";
978
+ /**
979
+ * Use one content key to encrypt all of the SD video tracks, one content key for HD video tracks and one content key for all UHD video tracks.
980
+ */
981
+ PresetSpeke20Video["PRESET_VIDEO_3"] = "PRESET_VIDEO_3";
982
+ /**
983
+ * Use one content key to encrypt all of the SD video tracks, one content key for HD video tracks,
984
+ * one content key for all UHD1 video tracks and one content key for all UHD2 video tracks.
985
+ */
986
+ PresetSpeke20Video["PRESET_VIDEO_4"] = "PRESET_VIDEO_4";
987
+ /**
988
+ * Use one content key to encrypt all of the SD video tracks, one content key for HD1 video tracks, one content key for HD2 video tracks,
989
+ * one content key for all UHD1 video tracks and one content key for all UHD2 video tracks.
990
+ */
991
+ PresetSpeke20Video["PRESET_VIDEO_5"] = "PRESET_VIDEO_5";
992
+ /**
993
+ * Use one content key to encrypt all of the SD video tracks, one content key for HD1 video tracks, one content key for HD2 video tracks
994
+ * and one content key for all UHD video tracks.
995
+ */
996
+ PresetSpeke20Video["PRESET_VIDEO_6"] = "PRESET_VIDEO_6";
997
+ /**
998
+ * Use one content key to encrypt all of the SD+HD1 video tracks, one content key for HD2 video tracks and one content key for all UHD video tracks.
999
+ */
1000
+ PresetSpeke20Video["PRESET_VIDEO_7"] = "PRESET_VIDEO_7";
1001
+ /**
1002
+ * Use one content key to encrypt all of the SD+HD1 video tracks, one content key for HD2 video tracks, one content key for all UHD1
1003
+ * video tracks and one content key for all UHD2 video tracks.
1004
+ */
1005
+ PresetSpeke20Video["PRESET_VIDEO_8"] = "PRESET_VIDEO_8";
1006
+ /**
1007
+ * Use the same content key for all of the video and audio tracks in your stream.
1008
+ */
1009
+ PresetSpeke20Video["SHARED"] = "SHARED";
1010
+ /**
1011
+ * Don't encrypt any of the video tracks in your stream.
1012
+ */
1013
+ PresetSpeke20Video["UNENCRYPTED"] = "UNENCRYPTED";
1014
+ })(PresetSpeke20Video || (exports.PresetSpeke20Video = PresetSpeke20Video = {}));
1015
+ /**
1016
+ * Endpoint error configuration options.
1017
+ */
1018
+ var EndpointErrorConfiguration;
1019
+ (function (EndpointErrorConfiguration) {
1020
+ /**
1021
+ * The manifest stalled and there are no new segments or parts.
1022
+ */
1023
+ EndpointErrorConfiguration["STALE_MANIFEST"] = "STALE_MANIFEST";
1024
+ /**
1025
+ * There is a gap in the manifest.
1026
+ */
1027
+ EndpointErrorConfiguration["INCOMPLETE_MANIFEST"] = "INCOMPLETE_MANIFEST";
1028
+ /**
1029
+ * Key rotation is enabled but we're unable to fetch the key for the current key period.
1030
+ */
1031
+ EndpointErrorConfiguration["MISSING_DRM_KEY"] = "MISSING_DRM_KEY";
1032
+ /**
1033
+ * The segments which contain slate content are considered to be missing content.
1034
+ */
1035
+ EndpointErrorConfiguration["SLATE_INPUT"] = "SLATE_INPUT";
1036
+ })(EndpointErrorConfiguration || (exports.EndpointErrorConfiguration = EndpointErrorConfiguration = {}));
1037
+ /**
1038
+ * SCTE-35 message type options available.
1039
+ */
1040
+ var ScteMessageType;
1041
+ (function (ScteMessageType) {
1042
+ /**
1043
+ * Option for SPLICE_INSERT.
1044
+ */
1045
+ ScteMessageType["SPLICE_INSERT"] = "SPLICE_INSERT";
1046
+ /**
1047
+ * Option for BREAK.
1048
+ */
1049
+ ScteMessageType["BREAK"] = "BREAK";
1050
+ /**
1051
+ * Option for PROVIDER_ADVERTISEMENT.
1052
+ */
1053
+ ScteMessageType["PROVIDER_ADVERTISEMENT"] = "PROVIDER_ADVERTISEMENT";
1054
+ /**
1055
+ * Option for DISTRIBUTOR_ADVERTISEMENT.
1056
+ */
1057
+ ScteMessageType["DISTRIBUTOR_ADVERTISEMENT"] = "DISTRIBUTOR_ADVERTISEMENT";
1058
+ /**
1059
+ * Option for PROVIDER_PLACEMENT_OPPORTUNITY.
1060
+ */
1061
+ ScteMessageType["PROVIDER_PLACEMENT_OPPORTUNITY"] = "PROVIDER_PLACEMENT_OPPORTUNITY";
1062
+ /**
1063
+ * Option for DISTRIBUTOR_PLACEMENT_OPPORTUNITY.
1064
+ */
1065
+ ScteMessageType["DISTRIBUTOR_PLACEMENT_OPPORTUNITY"] = "DISTRIBUTOR_PLACEMENT_OPPORTUNITY";
1066
+ /**
1067
+ * Option for PROVIDER_OVERLAY_PLACEMENT_OPPORTUNITY.
1068
+ */
1069
+ ScteMessageType["PROVIDER_OVERLAY_PLACEMENT_OPPORTUNITY"] = "PROVIDER_OVERLAY_PLACEMENT_OPPORTUNITY";
1070
+ /**
1071
+ * Option for DISTRIBUTOR_OVERLAY_PLACEMENT_OPPORTUNITY.
1072
+ */
1073
+ ScteMessageType["DISTRIBUTOR_OVERLAY_PLACEMENT_OPPORTUNITY"] = "DISTRIBUTOR_OVERLAY_PLACEMENT_OPPORTUNITY";
1074
+ /**
1075
+ * Option for PROGRAM.
1076
+ */
1077
+ ScteMessageType["PROGRAM"] = "PROGRAM";
1078
+ })(ScteMessageType || (exports.ScteMessageType = ScteMessageType = {}));
1079
+ /**
1080
+ * Controls whether SCTE-35 messages are included in segment files.
1081
+ */
1082
+ var ScteInSegments;
1083
+ (function (ScteInSegments) {
1084
+ /**
1085
+ * SCTE-35 messages are not included in segments.
1086
+ */
1087
+ ScteInSegments["NONE"] = "NONE";
1088
+ /**
1089
+ * SCTE-35 messages are embedded in segment data.
1090
+ *
1091
+ * For DASH manifests, when set to ALL, an InbandEventStream tag signals
1092
+ * that SCTE messages are present in segments.
1093
+ */
1094
+ ScteInSegments["ALL"] = "ALL";
1095
+ })(ScteInSegments || (exports.ScteInSegments = ScteInSegments = {}));
1096
+ /**
1097
+ * DRM settings keys for manifest filter configuration.
1098
+ */
1099
+ var DrmSettingsKey;
1100
+ (function (DrmSettingsKey) {
1101
+ /**
1102
+ * Exclude EXT-X-SESSION-KEY tags from HLS and LL-HLS multivariant playlists.
1103
+ *
1104
+ * This can improve compatibility with legacy HLS clients that have issues
1105
+ * processing session keys, or provide more granular access control when
1106
+ * using manifest filtering.
1107
+ */
1108
+ DrmSettingsKey["EXCLUDE_SESSION_KEYS"] = "exclude_session_keys";
1109
+ })(DrmSettingsKey || (exports.DrmSettingsKey = DrmSettingsKey = {}));
1110
+ /**
1111
+ * Helper class for creating EXT-X-START tags in HLS playlists.
1112
+ *
1113
+ * The EXT-X-START tag indicates a preferred point at which to start playing a playlist.
1114
+ */
1115
+ class StartTag {
1116
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.StartTag", version: "2.247.0-alpha.0" };
1117
+ /**
1118
+ * Create a start tag with a time offset.
1119
+ *
1120
+ * @param timeOffset The time offset in seconds. Can be positive (forward from start) or negative (back from live edge).
1121
+ * - If positive: must be less than (manifest duration - 3 × segment duration)
1122
+ * - If negative: absolute value must be greater than (3 × segment duration) and less than manifest duration
1123
+ * @param options Additional options
1124
+ */
1125
+ static of(timeOffset, options) {
1126
+ try {
1127
+ jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_StartTagOptions(options);
1128
+ }
1129
+ catch (error) {
1130
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
1131
+ Error.captureStackTrace(error, this.of);
1132
+ }
1133
+ throw error;
1134
+ }
1135
+ return {
1136
+ timeOffset,
1137
+ precise: options && options.precise !== undefined ? options.precise : undefined,
1138
+ };
1139
+ }
1140
+ /**
1141
+ * Create a start tag with precise positioning enabled (PRECISE=YES).
1142
+ *
1143
+ * @param timeOffset The time offset in seconds (positive or negative)
1144
+ */
1145
+ static withPrecise(timeOffset) {
1146
+ return {
1147
+ timeOffset,
1148
+ precise: true,
1149
+ };
1150
+ }
1151
+ }
1152
+ exports.StartTag = StartTag;
1153
+ /**
1154
+ * Choose how ad markers are included in the packaged content.
1155
+ */
1156
+ var AdMarkerDash;
1157
+ (function (AdMarkerDash) {
1158
+ /**
1159
+ * Option for BINARY - The SCTE-35 marker is expressed as a hex-string (Base64 string) rather than full XML.
1160
+ */
1161
+ AdMarkerDash["BINARY"] = "BINARY";
1162
+ /**
1163
+ * Option for XML - The SCTE marker is expressed fully in XML.
1164
+ */
1165
+ AdMarkerDash["XML"] = "XML";
1166
+ })(AdMarkerDash || (exports.AdMarkerDash = AdMarkerDash = {}));
1167
+ /**
1168
+ * Choose how SCTE-35 ad markers are included in HLS and LL-HLS manifests.
1169
+ */
1170
+ var AdMarkerHls;
1171
+ (function (AdMarkerHls) {
1172
+ /**
1173
+ * Insert EXT-X-DATERANGE tags to signal ad content.
1174
+ */
1175
+ AdMarkerHls["DATERANGE"] = "DATERANGE";
1176
+ /**
1177
+ * Insert enhanced SCTE-35 tags for ad content.
1178
+ */
1179
+ AdMarkerHls["SCTE35_ENHANCED"] = "SCTE35_ENHANCED";
1180
+ })(AdMarkerHls || (exports.AdMarkerHls = AdMarkerHls = {}));
1181
+ /**
1182
+ * The type of variable that MediaPackage uses in the media attribute of the SegmentTemplate tag.
1183
+ */
1184
+ var SegmentTemplateFormat;
1185
+ (function (SegmentTemplateFormat) {
1186
+ /**
1187
+ * Option for number with timeline.
1188
+ */
1189
+ SegmentTemplateFormat["NUMBER_WITH_TIMELINE"] = "NUMBER_WITH_TIMELINE";
1190
+ })(SegmentTemplateFormat || (exports.SegmentTemplateFormat = SegmentTemplateFormat = {}));
1191
+ /**
1192
+ * The UTC timing mode for DASH.
1193
+ */
1194
+ var DashUtcTimingMode;
1195
+ (function (DashUtcTimingMode) {
1196
+ /**
1197
+ * Option for HTTP_HEAD.
1198
+ */
1199
+ DashUtcTimingMode["HTTP_HEAD"] = "HTTP_HEAD";
1200
+ /**
1201
+ * Option for HTTP_ISO.
1202
+ */
1203
+ DashUtcTimingMode["HTTP_ISO"] = "HTTP_ISO";
1204
+ /**
1205
+ * Option for HTTP_XSDATE.
1206
+ */
1207
+ DashUtcTimingMode["HTTP_XSDATE"] = "HTTP_XSDATE";
1208
+ /**
1209
+ * Option for UTC_DIRECT.
1210
+ */
1211
+ DashUtcTimingMode["UTC_DIRECT"] = "UTC_DIRECT";
1212
+ })(DashUtcTimingMode || (exports.DashUtcTimingMode = DashUtcTimingMode = {}));
1213
+ /**
1214
+ * Options for triggers which cause AWS Elemental MediaPackage to create media presentation description (MPD) periods in the output manifest.
1215
+ */
1216
+ var DashPeriodTriggers;
1217
+ (function (DashPeriodTriggers) {
1218
+ /**
1219
+ * Option for AVAILS.
1220
+ */
1221
+ DashPeriodTriggers["AVAILS"] = "AVAILS";
1222
+ /**
1223
+ * Option for DRM_KEY_ROTATION.
1224
+ */
1225
+ DashPeriodTriggers["DRM_KEY_ROTATION"] = "DRM_KEY_ROTATION";
1226
+ /**
1227
+ * Option for SOURCE_CHANGES.
1228
+ */
1229
+ DashPeriodTriggers["SOURCE_CHANGES"] = "SOURCE_CHANGES";
1230
+ /**
1231
+ * Option for SOURCE_DISRUPTIONS.
1232
+ */
1233
+ DashPeriodTriggers["SOURCE_DISRUPTIONS"] = "SOURCE_DISRUPTIONS";
1234
+ /**
1235
+ * Option for NONE.
1236
+ */
1237
+ DashPeriodTriggers["NONE"] = "NONE";
1238
+ })(DashPeriodTriggers || (exports.DashPeriodTriggers = DashPeriodTriggers = {}));
1239
+ /**
1240
+ * DRM signaling determines the way DASH manifest signals the DRM content.
1241
+ */
1242
+ var DrmSignalling;
1243
+ (function (DrmSignalling) {
1244
+ /**
1245
+ * Option for INDIVIDUAL.
1246
+ */
1247
+ DrmSignalling["INDIVIDUAL"] = "INDIVIDUAL";
1248
+ /**
1249
+ * Option for REFERENCED.
1250
+ */
1251
+ DrmSignalling["REFERENCED"] = "REFERENCED";
1252
+ })(DrmSignalling || (exports.DrmSignalling = DrmSignalling = {}));
1253
+ /**
1254
+ * STANDARD indicates a default manifest, which is compacted. NONE indicates a full manifest.
1255
+ */
1256
+ var DashManifestCompactness;
1257
+ (function (DashManifestCompactness) {
1258
+ /**
1259
+ * STANDARD
1260
+ */
1261
+ DashManifestCompactness["STANDARD"] = "STANDARD";
1262
+ /**
1263
+ * NONE
1264
+ */
1265
+ DashManifestCompactness["NONE"] = "NONE";
1266
+ })(DashManifestCompactness || (exports.DashManifestCompactness = DashManifestCompactness = {}));
1267
+ /**
1268
+ * Options for TTML Profile
1269
+ */
1270
+ var TtmlProfile;
1271
+ (function (TtmlProfile) {
1272
+ /**
1273
+ * IMSC_1
1274
+ */
1275
+ TtmlProfile["IMSC_1"] = "IMSC_1";
1276
+ /**
1277
+ * EBU_TT_D_101
1278
+ */
1279
+ TtmlProfile["EBU_TT_D_101"] = "EBU_TT_D_101";
1280
+ })(TtmlProfile || (exports.TtmlProfile = TtmlProfile = {}));
1281
+ /**
1282
+ * The layout of the MSS manifest.
1283
+ */
1284
+ var MssManifestLayout;
1285
+ (function (MssManifestLayout) {
1286
+ /**
1287
+ * Full manifest layout.
1288
+ */
1289
+ MssManifestLayout["FULL"] = "FULL";
1290
+ /**
1291
+ * Compact manifest layout.
1292
+ */
1293
+ MssManifestLayout["COMPACT"] = "COMPACT";
1294
+ })(MssManifestLayout || (exports.MssManifestLayout = MssManifestLayout = {}));
1295
+ /**
1296
+ * DRM systems available for CMAF encryption.
1297
+ *
1298
+ * CENC supports PlayReady, Widevine, and Irdeto.
1299
+ * CBCS supports PlayReady, Widevine, and FairPlay.
1300
+ */
1301
+ var CmafDrmSystem;
1302
+ (function (CmafDrmSystem) {
1303
+ /**
1304
+ * FairPlay DRM - used with CBCS encryption.
1305
+ */
1306
+ CmafDrmSystem["FAIRPLAY"] = "FAIRPLAY";
1307
+ /**
1308
+ * PlayReady DRM - used with CENC and CBCS encryption.
1309
+ */
1310
+ CmafDrmSystem["PLAYREADY"] = "PLAYREADY";
1311
+ /**
1312
+ * Widevine DRM - used with CENC and CBCS encryption.
1313
+ */
1314
+ CmafDrmSystem["WIDEVINE"] = "WIDEVINE";
1315
+ /**
1316
+ * Irdeto DRM - used with CENC encryption.
1317
+ */
1318
+ CmafDrmSystem["IRDETO"] = "IRDETO";
1319
+ })(CmafDrmSystem || (exports.CmafDrmSystem = CmafDrmSystem = {}));
1320
+ /**
1321
+ * DRM systems available for TS encryption.
1322
+ *
1323
+ * SAMPLE_AES uses FairPlay, AES_128 uses Clear Key AES 128.
1324
+ */
1325
+ var TsDrmSystem;
1326
+ (function (TsDrmSystem) {
1327
+ /**
1328
+ * FairPlay DRM - used with SAMPLE_AES encryption.
1329
+ */
1330
+ TsDrmSystem["FAIRPLAY"] = "FAIRPLAY";
1331
+ /**
1332
+ * Clear Key AES 128 - used with AES_128 encryption.
1333
+ */
1334
+ TsDrmSystem["CLEAR_KEY_AES_128"] = "CLEAR_KEY_AES_128";
1335
+ })(TsDrmSystem || (exports.TsDrmSystem = TsDrmSystem = {}));
1336
+ /**
1337
+ * DRM systems available for ISM encryption.
1338
+ *
1339
+ * ISM only supports PlayReady with CENC.
1340
+ */
1341
+ var IsmDrmSystem;
1342
+ (function (IsmDrmSystem) {
1343
+ /**
1344
+ * PlayReady DRM.
1345
+ */
1346
+ IsmDrmSystem["PLAYREADY"] = "PLAYREADY";
1347
+ })(IsmDrmSystem || (exports.IsmDrmSystem = IsmDrmSystem = {}));
1348
+ /**
1349
+ * Base class for encryption configurations.
1350
+ *
1351
+ * Use `CmafEncryption.speke()`, `TsEncryption.speke()`, or `IsmEncryption.speke()` to create instances.
1352
+ */
1353
+ class EncryptionConfiguration {
1354
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.EncryptionConfiguration", version: "2.247.0-alpha.0" };
1355
+ }
1356
+ exports.EncryptionConfiguration = EncryptionConfiguration;
1357
+ /**
1358
+ * Encryption configuration for CMAF segments.
1359
+ *
1360
+ * Use `CmafEncryption.speke()` to create an instance.
1361
+ */
1362
+ class CmafEncryption extends EncryptionConfiguration {
1363
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.CmafEncryption", version: "2.247.0-alpha.0" };
1364
+ /**
1365
+ * Create a SPEKE-based encryption configuration for CMAF segments.
1366
+ */
1367
+ static speke(props) {
1368
+ try {
1369
+ jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_CmafSpekeEncryptionProps(props);
1370
+ }
1371
+ catch (error) {
1372
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
1373
+ Error.captureStackTrace(error, this.speke);
1374
+ }
1375
+ throw error;
1376
+ }
1377
+ if (!props.url.startsWith('https://')) {
1378
+ throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `SpekeUrlHttpsRequired`, 'SPEKE key provider URL must use HTTPS.');
1379
+ }
1380
+ if (props.method === CmafEncryptionMethod.CENC && props.drmSystems.includes(CmafDrmSystem.FAIRPLAY)) {
1381
+ throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `CencFairPlayIncompatible`, 'CENC encryption method does not support FairPlay. Use CBCS for FairPlay.');
1382
+ }
1383
+ if (props.method === CmafEncryptionMethod.CBCS && props.drmSystems.includes(CmafDrmSystem.IRDETO)) {
1384
+ throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `CbcsIrdetoIncompatible`, 'CBCS encryption method does not support Irdeto. Use CENC for Irdeto.');
1385
+ }
1386
+ return new CmafEncryption(props);
1387
+ }
1388
+ config;
1389
+ constructor(props) {
1390
+ super();
1391
+ this.config = props;
1392
+ }
1393
+ /** @internal */
1394
+ _bind(scope) {
1395
+ const p = this.config;
1396
+ if (p.constantInitializationVector && p.constantInitializationVector.length !== 32) {
1397
+ throw new core_1.ValidationError((0, helpers_internal_1.lit) `ConstantInitVectorLength`, 'Constant Initialization Vector needs to be 32 characters in length.', scope);
1398
+ }
1399
+ if (p.keyRotationInterval && (p.keyRotationInterval.toSeconds() < 300 || p.keyRotationInterval.toSeconds() > 31536000)) {
1400
+ throw new core_1.ValidationError((0, helpers_internal_1.lit) `KeyRotationIntervalRange`, 'Key Rotation Interval needs to be between 300-31536000 seconds.', scope);
1401
+ }
1402
+ return {
1403
+ cmafExcludeSegmentDrmMetadata: p.excludeSegmentDrmMetadata,
1404
+ constantInitializationVector: p.constantInitializationVector,
1405
+ keyRotationIntervalSeconds: p.keyRotationInterval?.toSeconds(),
1406
+ encryptionMethod: { cmafEncryptionMethod: p.method },
1407
+ spekeKeyProvider: {
1408
+ certificateArn: p.certificate?.certificateArn,
1409
+ drmSystems: p.drmSystems,
1410
+ encryptionContractConfiguration: {
1411
+ presetSpeke20Audio: p.audioPreset ?? PresetSpeke20Audio.PRESET_AUDIO_1,
1412
+ presetSpeke20Video: p.videoPreset ?? PresetSpeke20Video.PRESET_VIDEO_1,
1413
+ },
1414
+ url: p.url,
1415
+ resourceId: p.resourceId,
1416
+ roleArn: p.role.roleArn,
1417
+ },
1418
+ };
1419
+ }
1420
+ /** @internal */
1421
+ _getRole() { return this.config.role; }
1422
+ /** @internal */
1423
+ _getCertificate() { return this.config.certificate; }
1424
+ }
1425
+ exports.CmafEncryption = CmafEncryption;
1426
+ /**
1427
+ * Encryption configuration for TS segments.
1428
+ *
1429
+ * Use `TsEncryption.speke()` to create an instance.
1430
+ */
1431
+ class TsEncryption extends EncryptionConfiguration {
1432
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.TsEncryption", version: "2.247.0-alpha.0" };
1433
+ /**
1434
+ * Create a SPEKE-based encryption configuration for TS segments.
1435
+ */
1436
+ static speke(props) {
1437
+ try {
1438
+ jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_TsSpekeEncryptionProps(props);
1439
+ }
1440
+ catch (error) {
1441
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
1442
+ Error.captureStackTrace(error, this.speke);
1443
+ }
1444
+ throw error;
1445
+ }
1446
+ if (!props.url.startsWith('https://')) {
1447
+ throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `SpekeUrlHttpsRequired`, 'SPEKE key provider URL must use HTTPS.');
1448
+ }
1449
+ return new TsEncryption(props);
1450
+ }
1451
+ config;
1452
+ constructor(props) {
1453
+ super();
1454
+ this.config = props;
1455
+ }
1456
+ /** @internal */
1457
+ _bind(scope) {
1458
+ const p = this.config;
1459
+ const defaultDrm = p.method === TsEncryptionMethod.SAMPLE_AES
1460
+ ? [TsDrmSystem.FAIRPLAY] : [TsDrmSystem.CLEAR_KEY_AES_128];
1461
+ if (p.constantInitializationVector && p.constantInitializationVector.length !== 32) {
1462
+ throw new core_1.ValidationError((0, helpers_internal_1.lit) `ConstantInitVectorLength`, 'Constant Initialization Vector needs to be 32 characters in length.', scope);
1463
+ }
1464
+ if (p.keyRotationInterval && (p.keyRotationInterval.toSeconds() < 300 || p.keyRotationInterval.toSeconds() > 31536000)) {
1465
+ throw new core_1.ValidationError((0, helpers_internal_1.lit) `KeyRotationIntervalRange`, 'Key Rotation Interval needs to be between 300-31536000 seconds.', scope);
1466
+ }
1467
+ return {
1468
+ constantInitializationVector: p.constantInitializationVector,
1469
+ keyRotationIntervalSeconds: p.keyRotationInterval?.toSeconds(),
1470
+ encryptionMethod: { tsEncryptionMethod: p.method },
1471
+ spekeKeyProvider: {
1472
+ certificateArn: p.certificate?.certificateArn,
1473
+ drmSystems: (p.drmSystems ?? defaultDrm).map(d => d.toString()),
1474
+ encryptionContractConfiguration: {
1475
+ presetSpeke20Audio: p.audioPreset ?? PresetSpeke20Audio.PRESET_AUDIO_1,
1476
+ presetSpeke20Video: p.videoPreset ?? PresetSpeke20Video.PRESET_VIDEO_1,
1477
+ },
1478
+ url: p.url,
1479
+ resourceId: p.resourceId,
1480
+ roleArn: p.role.roleArn,
1481
+ },
1482
+ };
1483
+ }
1484
+ /** @internal */
1485
+ _getRole() { return this.config.role; }
1486
+ /** @internal */
1487
+ _getCertificate() { return this.config.certificate; }
1488
+ }
1489
+ exports.TsEncryption = TsEncryption;
1490
+ /**
1491
+ * Encryption configuration for ISM (Microsoft Smooth Streaming) segments.
1492
+ *
1493
+ * ISM only supports CENC encryption with PlayReady DRM.
1494
+ * Audio and video presets are always SHARED.
1495
+ *
1496
+ * Use `IsmEncryption.speke()` to create an instance.
1497
+ */
1498
+ class IsmEncryption extends EncryptionConfiguration {
1499
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.IsmEncryption", version: "2.247.0-alpha.0" };
1500
+ /**
1501
+ * Create a SPEKE-based encryption configuration for ISM segments.
1502
+ */
1503
+ static speke(props) {
1504
+ try {
1505
+ jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_IsmSpekeEncryptionProps(props);
1506
+ }
1507
+ catch (error) {
1508
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
1509
+ Error.captureStackTrace(error, this.speke);
1510
+ }
1511
+ throw error;
1512
+ }
1513
+ if (!props.url.startsWith('https://')) {
1514
+ throw new core_1.UnscopedValidationError((0, helpers_internal_1.lit) `SpekeUrlHttpsRequired`, 'SPEKE key provider URL must use HTTPS.');
1515
+ }
1516
+ return new IsmEncryption(props);
1517
+ }
1518
+ config;
1519
+ constructor(props) {
1520
+ super();
1521
+ this.config = props;
1522
+ }
1523
+ /** @internal */
1524
+ _bind(_scope) {
1525
+ const p = this.config;
1526
+ return {
1527
+ encryptionMethod: { ismEncryptionMethod: 'CENC' },
1528
+ spekeKeyProvider: {
1529
+ certificateArn: p.certificate?.certificateArn,
1530
+ drmSystems: (p.drmSystems ?? [IsmDrmSystem.PLAYREADY]).map(d => d.toString()),
1531
+ encryptionContractConfiguration: {
1532
+ presetSpeke20Audio: PresetSpeke20Audio.SHARED,
1533
+ presetSpeke20Video: PresetSpeke20Video.SHARED,
1534
+ },
1535
+ url: p.url,
1536
+ resourceId: p.resourceId,
1537
+ roleArn: p.role.roleArn,
1538
+ },
1539
+ };
1540
+ }
1541
+ /** @internal */
1542
+ _getRole() { return this.config.role; }
1543
+ /** @internal */
1544
+ _getCertificate() { return this.config.certificate; }
1545
+ }
1546
+ exports.IsmEncryption = IsmEncryption;
1547
+ /**
1548
+ * Helper class for creating segment configurations.
1549
+ */
1550
+ class Segment {
1551
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.Segment", version: "2.247.0-alpha.0" };
1552
+ /**
1553
+ * Create a TS (Transport Stream) segment configuration.
1554
+ *
1555
+ * Use this for endpoints with ContainerType.TS.
1556
+ */
1557
+ static ts(props = {}) {
1558
+ try {
1559
+ jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_TsSegmentProps(props);
1560
+ }
1561
+ catch (error) {
1562
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
1563
+ Error.captureStackTrace(error, this.ts);
1564
+ }
1565
+ throw error;
1566
+ }
1567
+ return {
1568
+ containerType: ContainerType.TS,
1569
+ includeIframeOnlyStreams: props.includeIframeOnlyStreams,
1570
+ scteFilter: props.scteFilter,
1571
+ scteInSegments: props.scteInSegments,
1572
+ segmentDuration: props.duration,
1573
+ segmentName: props.name,
1574
+ tsIncludeDvbSubtitles: props.includeDvbSubtitles,
1575
+ tsUseAudioRenditionGroup: props.useAudioRenditionGroup,
1576
+ encryption: props.encryption,
1577
+ };
1578
+ }
1579
+ /**
1580
+ * Create a CMAF segment configuration.
1581
+ *
1582
+ * Use this for endpoints with ContainerType.CMAF.
1583
+ */
1584
+ static cmaf(props = {}) {
1585
+ try {
1586
+ jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_CmafSegmentProps(props);
1587
+ }
1588
+ catch (error) {
1589
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
1590
+ Error.captureStackTrace(error, this.cmaf);
1591
+ }
1592
+ throw error;
1593
+ }
1594
+ return {
1595
+ containerType: ContainerType.CMAF,
1596
+ includeIframeOnlyStreams: props.includeIframeOnlyStreams,
1597
+ scteFilter: props.scteFilter,
1598
+ scteInSegments: props.scteInSegments,
1599
+ segmentDuration: props.duration,
1600
+ segmentName: props.name,
1601
+ encryption: props.encryption,
1602
+ };
1603
+ }
1604
+ /**
1605
+ * Create an ISM (Microsoft Smooth Streaming) segment configuration.
1606
+ *
1607
+ * Use this for endpoints with ContainerType.ISM.
1608
+ */
1609
+ static ism(props = {}) {
1610
+ try {
1611
+ jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_IsmSegmentProps(props);
1612
+ }
1613
+ catch (error) {
1614
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
1615
+ Error.captureStackTrace(error, this.ism);
1616
+ }
1617
+ throw error;
1618
+ }
1619
+ return {
1620
+ containerType: ContainerType.ISM,
1621
+ includeIframeOnlyStreams: props.includeIframeOnlyStreams,
1622
+ segmentDuration: props.duration,
1623
+ segmentName: props.name,
1624
+ encryption: props.encryption,
1625
+ };
1626
+ }
1627
+ }
1628
+ exports.Segment = Segment;
1629
+ class OriginEndpointBase extends aws_cdk_lib_1.Resource {
1630
+ /**
1631
+ * Creates an OriginEndpoint construct that represents an external (imported) Origin Endpoint.
1632
+ */
1633
+ static fromOriginEndpointAttributes(scope, id, attrs) {
1634
+ class Import extends OriginEndpointBase {
1635
+ hlsManifests = [];
1636
+ llHlsManifests = [];
1637
+ dashManifests = [];
1638
+ mssManifests = [];
1639
+ segment;
1640
+ policy = undefined;
1641
+ channelGroupName = attrs.channelGroupName;
1642
+ channelName = attrs.channelName;
1643
+ originEndpointName = attrs.originEndpointName;
1644
+ createdAt = undefined;
1645
+ modifiedAt = undefined;
1646
+ hlsManifestUrls = undefined;
1647
+ lowLatencyHlsManifestUrls = undefined;
1648
+ dashManifestUrls = undefined;
1649
+ mssManifestUrls = undefined;
1650
+ autoCreatePolicy = false;
1651
+ originEndpointArn = aws_cdk_lib_1.Stack.of(this).formatArn({
1652
+ service: 'mediapackagev2',
1653
+ resource: `channelGroup/${attrs.channelGroupName}/channel/${this.channelName}/originEndpoint`,
1654
+ arnFormat: aws_cdk_lib_1.ArnFormat.SLASH_RESOURCE_NAME,
1655
+ resourceName: this.originEndpointName,
1656
+ });
1657
+ }
1658
+ return new Import(scope, id);
1659
+ }
1660
+ /**
1661
+ * A reference to this Origin Endpoint resource.
1662
+ * Required by the auto-generated IOriginEndpointRef interface.
1663
+ */
1664
+ get originEndpointRef() {
1665
+ return {
1666
+ originEndpointArn: this.originEndpointArn,
1667
+ };
1668
+ }
1669
+ /**
1670
+ * CDN authorization configuration to be applied when the policy is created.
1671
+ */
1672
+ cdnAuthConfig;
1673
+ /**
1674
+ * Set CDN auth config. Used by subclass constructors.
1675
+ * @internal
1676
+ */
1677
+ _setCdnAuth(cdnAuth) {
1678
+ if (!this.cdnAuthConfig) {
1679
+ this.cdnAuthConfig = cdnAuth;
1680
+ }
1681
+ }
1682
+ /**
1683
+ * Configure origin endpoint policy.
1684
+ *
1685
+ * You can only add 1 OriginEndpointPolicy to an OriginEndpoint.
1686
+ * If you have already defined one, it will append to the policy already created.
1687
+ *
1688
+ * @param statement - The policy statement to add
1689
+ * @param cdnAuth - Optional CDN authorization configuration. If provided, the policy will be
1690
+ * created with CDN authentication enabled using secrets from AWS Secrets Manager.
1691
+ * If cdnAuth is provided multiple times, only the first configuration is used.
1692
+ */
1693
+ addToResourcePolicy(statement, cdnAuth) {
1694
+ // Store CDN auth config if provided (only if not already set)
1695
+ if (cdnAuth && !this.cdnAuthConfig) {
1696
+ this.cdnAuthConfig = cdnAuth;
1697
+ }
1698
+ if (!this.policy && this.autoCreatePolicy) {
1699
+ this.policy = new origin_endpoint_policy_1.OriginEndpointPolicy(this, 'Policy', {
1700
+ originEndpoint: this,
1701
+ cdnAuth: this.cdnAuthConfig,
1702
+ });
1703
+ }
1704
+ if (this.policy) {
1705
+ this.policy.document.addStatements(statement);
1706
+ return { statementAdded: true, policyDependable: this.policy };
1707
+ }
1708
+ return { statementAdded: false };
1709
+ }
1710
+ /**
1711
+ * Validate and modify Segment configuration for endpoint.
1712
+ */
1713
+ segmentValidation(segmentContainerType, segment) {
1714
+ if (segment?.segmentDuration && (segment.segmentDuration?.toSeconds() < 1 || segment.segmentDuration?.toSeconds() > 30)) {
1715
+ throw new core_1.ValidationError((0, helpers_internal_1.lit) `SegmentDurationRange`, 'Segment Duration needs to be between 1-30 seconds.', this);
1716
+ }
1717
+ if (segmentContainerType != ContainerType.TS && (segment?.tsIncludeDvbSubtitles || segment?.tsUseAudioRenditionGroup)) {
1718
+ throw new core_1.ValidationError((0, helpers_internal_1.lit) `TsOptionsIncompatible`, 'Disable TS Segment options for DvbSubtitles and AudioRenditionGroups when using CMAF.', this);
1719
+ }
1720
+ return {
1721
+ includeIframeOnlyStreams: segment?.includeIframeOnlyStreams,
1722
+ segmentDurationSeconds: segment?.segmentDuration?.toSeconds(),
1723
+ segmentName: segment?.segmentName,
1724
+ tsIncludeDvbSubtitles: segment?.tsIncludeDvbSubtitles,
1725
+ tsUseAudioRenditionGroup: segment?.tsUseAudioRenditionGroup,
1726
+ scte: (segment?.scteFilter || segment?.scteInSegments) ? {
1727
+ scteFilter: segment?.scteFilter,
1728
+ scteInSegments: segment?.scteInSegments,
1729
+ } : undefined,
1730
+ encryption: segment?.encryption?._bind(this),
1731
+ };
1732
+ }
1733
+ /**
1734
+ * Create a CloudWatch metric.
1735
+ *
1736
+ * @param metricName name of the metric.
1737
+ * @param props metric options.
1738
+ */
1739
+ metric(metricName, props) {
1740
+ return new aws_cloudwatch_1.Metric({
1741
+ metricName,
1742
+ namespace: 'AWS/MediaPackage',
1743
+ dimensionsMap: {
1744
+ ChannelGroup: this.channelGroupName,
1745
+ Channel: this.channelName,
1746
+ OriginEndpoint: this.originEndpointName,
1747
+ },
1748
+ ...props,
1749
+ }).attachTo(this);
1750
+ }
1751
+ /**
1752
+ * Returns Metric for Ingress Bytes
1753
+ *
1754
+ * @default - sum over 60 seconds
1755
+ */
1756
+ metricIngressBytes(props) {
1757
+ return this.metric('IngressBytes', {
1758
+ statistic: 'sum',
1759
+ period: aws_cdk_lib_1.Duration.seconds(60),
1760
+ unit: aws_cloudwatch_1.Unit.BYTES,
1761
+ ...props,
1762
+ });
1763
+ }
1764
+ /**
1765
+ * Returns Metric for Egress Bytes
1766
+ *
1767
+ * @default - sum over 60 seconds
1768
+ */
1769
+ metricEgressBytes(props) {
1770
+ return this.metric('EgressBytes', {
1771
+ statistic: 'sum',
1772
+ period: aws_cdk_lib_1.Duration.seconds(60),
1773
+ unit: aws_cloudwatch_1.Unit.BYTES,
1774
+ ...props,
1775
+ });
1776
+ }
1777
+ /**
1778
+ * Returns Metric for Ingress response time
1779
+ *
1780
+ * @default - average over 60 seconds
1781
+ */
1782
+ metricIngressResponseTime(props) {
1783
+ return this.metric('IngressResponseTime', {
1784
+ statistic: 'avg',
1785
+ period: aws_cdk_lib_1.Duration.seconds(60),
1786
+ unit: aws_cloudwatch_1.Unit.MILLISECONDS,
1787
+ ...props,
1788
+ });
1789
+ }
1790
+ /**
1791
+ * Returns Metric for Egress Response time
1792
+ *
1793
+ * @default - average over 60 seconds
1794
+ */
1795
+ metricEgressResponseTime(props) {
1796
+ return this.metric('EgressResponseTime', {
1797
+ statistic: 'avg',
1798
+ period: aws_cdk_lib_1.Duration.seconds(60),
1799
+ unit: aws_cloudwatch_1.Unit.MILLISECONDS,
1800
+ ...props,
1801
+ });
1802
+ }
1803
+ /**
1804
+ * Returns Metric for Egress Request Count
1805
+ *
1806
+ * @default - sum over 60 seconds
1807
+ */
1808
+ metricEgressRequestCount(props) {
1809
+ return this.metric('EgressRequestCount', {
1810
+ statistic: 'sum',
1811
+ period: aws_cdk_lib_1.Duration.seconds(60),
1812
+ unit: aws_cloudwatch_1.Unit.COUNT,
1813
+ ...props,
1814
+ });
1815
+ }
1816
+ /**
1817
+ * Returns Metric for Ingress Request Count
1818
+ *
1819
+ * @default - sum over 60 seconds
1820
+ */
1821
+ metricIngressRequestCount(props) {
1822
+ return this.metric('IngressRequestCount', {
1823
+ statistic: 'sum',
1824
+ period: aws_cdk_lib_1.Duration.seconds(60),
1825
+ unit: aws_cloudwatch_1.Unit.COUNT,
1826
+ ...props,
1827
+ });
1828
+ }
1829
+ }
1830
+ /**
1831
+ * Defines an AWS Elemental MediaPackage V2 Origin Endpoint
1832
+ */
1833
+ let OriginEndpoint = (() => {
1834
+ let _classDecorators = [prop_injectable_1.propertyInjectable];
1835
+ let _classDescriptor;
1836
+ let _classExtraInitializers = [];
1837
+ let _classThis;
1838
+ let _classSuper = OriginEndpointBase;
1839
+ var OriginEndpoint = class extends _classSuper {
1840
+ static { _classThis = this; }
1841
+ static {
1842
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
1843
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
1844
+ OriginEndpoint = _classThis = _classDescriptor.value;
1845
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
1846
+ }
1847
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediapackagev2-alpha.OriginEndpoint", version: "2.247.0-alpha.0" };
1848
+ /** Uniquely identifies this class. */
1849
+ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-mediapackagev2-alpha.OriginEndpoint';
1850
+ channelGroupName;
1851
+ channelName;
1852
+ originEndpointName;
1853
+ originEndpointArn;
1854
+ /**
1855
+ * The timestamp of the creation of the origin endpoint.
1856
+ */
1857
+ createdAt;
1858
+ /**
1859
+ * The timestamp of the modification of the origin endpoint.
1860
+ */
1861
+ modifiedAt;
1862
+ /**
1863
+ * Array containing Low Latency HLS Manifests created by the OriginEndpoint.
1864
+ */
1865
+ lowLatencyHlsManifestUrls;
1866
+ /**
1867
+ * Array containing HLS Manifests created by the OriginEndpoint.
1868
+ */
1869
+ hlsManifestUrls;
1870
+ /**
1871
+ * Array containing DASH Manifests created by the OriginEndpoint.
1872
+ */
1873
+ dashManifestUrls;
1874
+ /**
1875
+ * Array containing MSS Manifests created by the OriginEndpoint.
1876
+ */
1877
+ mssManifestUrls;
1878
+ /**
1879
+ * The resource policy associated with this origin endpoint.
1880
+ *
1881
+ * If `autoCreatePolicy` is true, an `OriginEndpointPolicy` will be created upon the
1882
+ * first call to addToResourcePolicy(s).
1883
+ */
1884
+ policy;
1885
+ autoCreatePolicy = true;
1886
+ hlsManifests = [];
1887
+ llHlsManifests = [];
1888
+ dashManifests = [];
1889
+ mssManifests = [];
1890
+ segment;
1891
+ constructor(scope, id, props) {
1892
+ super(scope, id, {
1893
+ physicalName: props?.originEndpointName ?? aws_cdk_lib_1.Lazy.string({
1894
+ produce: () => aws_cdk_lib_1.Names.uniqueResourceName(this, {
1895
+ maxLength: 256,
1896
+ }),
1897
+ }),
1898
+ });
1899
+ try {
1900
+ jsiiDeprecationWarnings._aws_cdk_aws_mediapackagev2_alpha_OriginEndpointProps(props);
1901
+ }
1902
+ catch (error) {
1903
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
1904
+ Error.captureStackTrace(error, OriginEndpoint);
1905
+ }
1906
+ throw error;
1907
+ }
1908
+ // Enhanced CDK Analytics Telemetry
1909
+ (0, metadata_resource_1.addConstructMetadata)(this, props);
1910
+ // Validate originEndpointName if provided
1911
+ if (props.originEndpointName != null && !aws_cdk_lib_1.Token.isUnresolved(props.originEndpointName)) {
1912
+ if (props.originEndpointName.length < 1 || props.originEndpointName.length > 256) {
1913
+ throw new core_1.ValidationError((0, helpers_internal_1.lit) `OriginEndpointNameLength`, 'Origin endpoint name must be between 1 and 256 characters in length.', this);
1914
+ }
1915
+ if (!props.originEndpointName.match(/^[a-zA-Z0-9_-]+$/)) {
1916
+ throw new core_1.ValidationError((0, helpers_internal_1.lit) `OriginEndpointNamePattern`, 'Origin endpoint name must only contain alphanumeric characters, hyphens, and underscores.', this);
1917
+ }
1918
+ }
1919
+ // Validate description if provided
1920
+ if (props.description && !aws_cdk_lib_1.Token.isUnresolved(props.description) && props.description.length > 1024) {
1921
+ throw new core_1.ValidationError((0, helpers_internal_1.lit) `OriginEndpointDescriptionLength`, 'Origin endpoint description must not exceed 1024 characters.', this);
1922
+ }
1923
+ this.segment = props.segment;
1924
+ // Get container type from segment
1925
+ const containerType = props.segment.containerType;
1926
+ if (props?.startoverWindow && (props.startoverWindow.toSeconds() < 60 || props.startoverWindow.toSeconds() > 1209600)) {
1927
+ throw new core_1.ValidationError((0, helpers_internal_1.lit) `StartoverWindowRange`, 'Startover Window needs to be between 60-1209600 seconds.', this);
1928
+ }
1929
+ props.manifests.forEach(manifest => {
1930
+ manifest._bind({
1931
+ hlsManifests: this.hlsManifests,
1932
+ llHlsManifests: this.llHlsManifests,
1933
+ dashManifests: this.dashManifests,
1934
+ mssManifests: this.mssManifests,
1935
+ segment: props.segment,
1936
+ });
1937
+ });
1938
+ // Validate manifest and container type compatibility
1939
+ if (this.mssManifests.length > 0 && containerType !== ContainerType.ISM) {
1940
+ throw new core_1.ValidationError((0, helpers_internal_1.lit) `MssRequiresIsm`, 'MSS manifests require ISM container type. Use Segment.ism() for MSS manifests.', this);
1941
+ }
1942
+ if (this.dashManifests.length > 0 && containerType !== ContainerType.CMAF) {
1943
+ throw new core_1.ValidationError((0, helpers_internal_1.lit) `DashRequiresCmaf`, 'DASH manifests require CMAF container type. Use Segment.cmaf() for DASH manifests.', this);
1944
+ }
1945
+ if ((this.hlsManifests.length > 0 || this.llHlsManifests.length > 0) && containerType === ContainerType.ISM) {
1946
+ throw new core_1.ValidationError((0, helpers_internal_1.lit) `HlsIncompatibleWithIsm`, 'HLS and Low Latency HLS manifests are not supported with ISM container type. Use Segment.cmaf() or Segment.ts() for HLS manifests.', this);
1947
+ }
1948
+ // Validate DRM signalling requires encryption
1949
+ if (this.dashManifests.some(m => m.drmSignaling) && !props.segment.encryption) {
1950
+ throw new core_1.ValidationError((0, helpers_internal_1.lit) `DrmSignallingRequiresEncryption`, 'DRM signalling requires encryption to be configured on the endpoint.', this);
1951
+ }
1952
+ const origin = new aws_mediapackagev2_1.CfnOriginEndpoint(this, 'Resource', {
1953
+ channelName: props.channel.channelName,
1954
+ channelGroupName: props.channel.channelGroupName,
1955
+ originEndpointName: this.physicalName,
1956
+ description: props.description,
1957
+ tags: props?.tags ? (0, shared_helpers_1.renderTags)(props.tags) : undefined,
1958
+ hlsManifests: aws_cdk_lib_1.Lazy.any({ produce: () => this.hlsManifests }, { omitEmptyArray: true }),
1959
+ lowLatencyHlsManifests: aws_cdk_lib_1.Lazy.any({ produce: () => this.llHlsManifests }, { omitEmptyArray: true }),
1960
+ dashManifests: aws_cdk_lib_1.Lazy.any({ produce: () => this.dashManifests }, { omitEmptyArray: true }),
1961
+ mssManifests: aws_cdk_lib_1.Lazy.any({ produce: () => this.mssManifests }, { omitEmptyArray: true }),
1962
+ containerType: containerType,
1963
+ startoverWindowSeconds: props.startoverWindow?.toSeconds(),
1964
+ segment: this.segmentValidation(containerType, props.segment),
1965
+ forceEndpointErrorConfiguration: props.forceEndpointConfigurationConditions ? {
1966
+ endpointErrorConditions: props.forceEndpointConfigurationConditions,
1967
+ } : undefined,
1968
+ });
1969
+ // The channelName/channelGroupName are rendered as literal strings (not CFN Refs), so
1970
+ // CloudFormation cannot infer the dependency. We add direct CfnResource-level DependsOn
1971
+ // to guarantee deploy ordering without triggering CDK's subtree-level cycle detection.
1972
+ // For imported constructs, defaultChild is undefined (no CFN resource to order against).
1973
+ const encryptionRole = props.segment.encryption?._getRole();
1974
+ if (encryptionRole)
1975
+ origin.node.addDependency(encryptionRole);
1976
+ const encryptionCert = props.segment.encryption?._getCertificate();
1977
+ if (encryptionCert)
1978
+ origin.node.addDependency(encryptionCert);
1979
+ const channelCfn = props.channel.node.defaultChild;
1980
+ if (channelCfn && core_1.CfnResource.isCfnResource(channelCfn)) {
1981
+ origin.addDependency(channelCfn);
1982
+ }
1983
+ const groupCfn = props.channel.channelGroup?.node.defaultChild;
1984
+ if (groupCfn && core_1.CfnResource.isCfnResource(groupCfn)) {
1985
+ origin.addDependency(groupCfn);
1986
+ }
1987
+ this.lowLatencyHlsManifestUrls = this.llHlsManifests.map((_, i) => aws_cdk_lib_1.Fn.select(i, origin.attrLowLatencyHlsManifestUrls));
1988
+ this.hlsManifestUrls = this.hlsManifests.map((_, i) => aws_cdk_lib_1.Fn.select(i, origin.attrHlsManifestUrls));
1989
+ this.dashManifestUrls = this.dashManifests.map((_, i) => aws_cdk_lib_1.Fn.select(i, origin.attrDashManifestUrls));
1990
+ this.mssManifestUrls = this.mssManifests.map((_, i) => aws_cdk_lib_1.Fn.select(i, origin.attrMssManifestUrls));
1991
+ this.createdAt = origin.attrCreatedAt;
1992
+ this.modifiedAt = origin.attrModifiedAt;
1993
+ this.channelGroupName = origin.channelGroupName;
1994
+ this.channelName = origin.channelName;
1995
+ this.originEndpointName = origin.originEndpointName;
1996
+ this.originEndpointArn = origin.attrArn;
1997
+ origin.applyRemovalPolicy(props?.removalPolicy ?? aws_cdk_lib_1.RemovalPolicy.DESTROY);
1998
+ // Pre-set CDN auth config if provided in props
1999
+ if (props.cdnAuth) {
2000
+ this._setCdnAuth(props.cdnAuth);
2001
+ }
2002
+ }
2003
+ static {
2004
+ __runInitializers(_classThis, _classExtraInitializers);
2005
+ }
2006
+ };
2007
+ return OriginEndpoint = _classThis;
2008
+ })();
2009
+ exports.OriginEndpoint = OriginEndpoint;
2010
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5kcG9pbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJlbmRwb2ludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSw2Q0FBMEc7QUFHMUcsK0RBQTBEO0FBRTFELHVFQUFtRTtBQUVuRSwyQ0FBeUY7QUFDekYsNEVBQTREO0FBQzVELDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFJMUUscUVBQWdFO0FBQ2hFLHFEQUFtRTtBQUVuRTs7OztHQUlHO0FBQ0gsSUFBWSxVQVNYO0FBVEQsV0FBWSxVQUFVO0lBQ3BCLHlCQUF5QjtJQUN6QiwyQkFBYSxDQUFBO0lBQ2IseUJBQXlCO0lBQ3pCLDJCQUFhLENBQUE7SUFDYixxREFBcUQ7SUFDckQsMkJBQWEsQ0FBQTtJQUNiLDBEQUEwRDtJQUMxRCwyQkFBYSxDQUFBO0FBQ2YsQ0FBQyxFQVRXLFVBQVUsMEJBQVYsVUFBVSxRQVNyQjtBQUVEOzs7O0dBSUc7QUFDSCxJQUFZLFVBT1g7QUFQRCxXQUFZLFVBQVU7SUFDcEIsZ0JBQWdCO0lBQ2hCLDJCQUFhLENBQUE7SUFDYixpQkFBaUI7SUFDakIsMkJBQWEsQ0FBQTtJQUNiLFVBQVU7SUFDVix5QkFBVyxDQUFBO0FBQ2IsQ0FBQyxFQVBXLFVBQVUsMEJBQVYsVUFBVSxRQU9yQjtBQUVEOzs7O0dBSUc7QUFDSCxJQUFZLGlCQVNYO0FBVEQsV0FBWSxpQkFBaUI7SUFDM0IsbUJBQW1CO0lBQ25CLDhCQUFTLENBQUE7SUFDVCxZQUFZO0lBQ1osb0NBQWUsQ0FBQTtJQUNmLHVCQUF1QjtJQUN2QixnQ0FBVyxDQUFBO0lBQ1gsNkJBQTZCO0lBQzdCLGdDQUFXLENBQUE7QUFDYixDQUFDLEVBVFcsaUJBQWlCLGlDQUFqQixpQkFBaUIsUUFTNUI7QUFFRDs7OztHQUlHO0FBQ0gsSUFBWSxhQU9YO0FBUEQsV0FBWSxhQUFhO0lBQ3ZCLDhCQUE4QjtJQUM5QixrQ0FBaUIsQ0FBQTtJQUNqQiw2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Ozs7OztBQUFkLHdDQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaXRyYXRlLCBJUmVzb3VyY2UgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBSZW1vdmFsUG9saWN5LCBBcm5Gb3JtYXQsIER1cmF0aW9uLCBGbiwgTGF6eSwgTmFtZXMsIFJlc291cmNlLCBTdGFjaywgVG9rZW4gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgdHlwZSB7IElDZXJ0aWZpY2F0ZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXInO1xuaW1wb3J0IHR5cGUgeyBNZXRyaWNPcHRpb25zIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0IHsgTWV0cmljLCBVbml0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0IHR5cGUgeyBJUm9sZSwgUG9saWN5U3RhdGVtZW50LCBBZGRUb1Jlc291cmNlUG9saWN5UmVzdWx0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBDZm5PcmlnaW5FbmRwb2ludCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1tZWRpYXBhY2thZ2V2Mic7XG5pbXBvcnQgdHlwZSB7IElPcmlnaW5FbmRwb2ludFJlZiwgT3JpZ2luRW5kcG9pbnRSZWZlcmVuY2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbWVkaWFwYWNrYWdldjInO1xuaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9yLCBVbnNjb3BlZFZhbGlkYXRpb25FcnJvciwgQ2ZuUmVzb3VyY2UgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IGxpdCB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBwcm9wZXJ0eUluamVjdGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9wcm9wLWluamVjdGFibGUnO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB0eXBlIHsgSUNoYW5uZWwgfSBmcm9tICcuL2NoYW5uZWwnO1xuaW1wb3J0IHR5cGUgeyBDZG5BdXRoQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vb3JpZ2luLWVuZHBvaW50LXBvbGljeSc7XG5pbXBvcnQgeyBPcmlnaW5FbmRwb2ludFBvbGljeSB9IGZyb20gJy4vb3JpZ2luLWVuZHBvaW50LXBvbGljeSc7XG5pbXBvcnQgeyBjb252ZXJ0RGF0ZVRvU3RyaW5nLCByZW5kZXJUYWdzIH0gZnJvbSAnLi9zaGFyZWQtaGVscGVycyc7XG5cbi8qKlxuICogQWNjZXB0ZWQgYXVkaW8gY29kZWMgdmFsdWVzIGZvciBtYW5pZmVzdCBmaWx0ZXJpbmcuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbWVkaWFwYWNrYWdlL2xhdGVzdC91c2VyZ3VpZGUvbWFuaWZlc3QtZmlsdGVyLXF1ZXJ5LXBhcmFtZXRlcnMuaHRtbFxuICovXG5leHBvcnQgZW51bSBBdWRpb0NvZGVjIHtcbiAgLyoqIEFBQy1MQyBhdWRpbyBjb2RlYyAqL1xuICBBQUNMID0gJ0FBQ0wnLFxuICAvKiogSEUtQUFDIGF1ZGlvIGNvZGVjICovXG4gIEFBQ0ggPSAnQUFDSCcsXG4gIC8qKiBEb2xieSBEaWdpdGFsIGF1ZGlvIGNvZGVjIChpbmNsdWRlIHRoZSBoeXBoZW4pICovXG4gIEFDXzMgPSAnQUMtMycsXG4gIC8qKiBEb2xieSBEaWdpdGFsIFBsdXMgYXVkaW8gY29kZWMgKGluY2x1ZGUgdGhlIGh5cGhlbikgKi9cbiAgRUNfMyA9ICdFQy0zJyxcbn1cblxuLyoqXG4gKiBBY2NlcHRlZCB2aWRlbyBjb2RlYyB2YWx1ZXMgZm9yIG1hbmlmZXN0IGZpbHRlcmluZy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYXBhY2thZ2UvbGF0ZXN0L3VzZXJndWlkZS9tYW5pZmVzdC1maWx0ZXItcXVlcnktcGFyYW1ldGVycy5odG1sXG4gKi9cbmV4cG9ydCBlbnVtIFZpZGVvQ29kZWMge1xuICAvKiogSC4yNjQvQVZDICovXG4gIEgyNjQgPSAnSDI2NCcsXG4gIC8qKiBILjI2NS9IRVZDICovXG4gIEgyNjUgPSAnSDI2NScsXG4gIC8qKiBBVjEgKi9cbiAgQVYxID0gJ0FWMScsXG59XG5cbi8qKlxuICogQWNjZXB0ZWQgdmlkZW8gZHluYW1pYyByYW5nZSB2YWx1ZXMgZm9yIG1hbmlmZXN0IGZpbHRlcmluZy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYXBhY2thZ2UvbGF0ZXN0L3VzZXJndWlkZS9tYW5pZmVzdC1maWx0ZXItcXVlcnktcGFyYW1ldGVycy5odG1sXG4gKi9cbmV4cG9ydCBlbnVtIFZpZGVvRHluYW1pY1JhbmdlIHtcbiAgLyoqIERvbGJ5IFZpc2lvbiAqL1xuICBEViA9ICdkdicsXG4gIC8qKiBIRFIxMCAqL1xuICBIRFIxMCA9ICdoZHIxMCcsXG4gIC8qKiBIeWJyaWQgTG9nLUdhbW1hICovXG4gIEhMRyA9ICdobGcnLFxuICAvKiogU3RhbmRhcmQgRHluYW1pYyBSYW5nZSAqL1xuICBTRFIgPSAnc2RyJyxcbn1cblxuLyoqXG4gKiBBY2NlcHRlZCB0cmlja3BsYXkgdHlwZSB2YWx1ZXMgZm9yIG1hbmlmZXN0IGZpbHRlcmluZy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYXBhY2thZ2UvbGF0ZXN0L3VzZXJndWlkZS9tYW5pZmVzdC1maWx0ZXItcXVlcnktcGFyYW1ldGVycy5odG1sXG4gKi9cbmV4cG9ydCBlbnVtIFRyaWNrcGxheVR5cGUge1xuICAvKiogSS1mcmFtZSBvbmx5IHRyaWNrLXBsYXkgKi9cbiAgSUZSQU1FID0gJ2lmcmFtZScsXG4gIC8qKiBJbWFnZS1iYXNlZCB0cmljay1wbGF5ICovXG4gIElNQUdFID0gJ2ltYWdlJyxcbiAgLyoqIE5vIHRyaWNrLXBsYXkgKi9cbiAgTk9ORSA9ICdub25lJyxcbn1cblxuLyoqXG4gKiBOdW1lcmljIG1hbmlmZXN0IGZpbHRlciBrZXlzLlxuICpcbiAqIFVzZSB3aXRoIGBNYW5pZmVzdEZpbHRlci5udW1lcmljKClgLCBgTWFuaWZlc3RGaWx0ZXIubnVtZXJpY0xpc3QoKWAsIGFuZCBgTWFuaWZlc3RGaWx0ZXIubnVtZXJpY1JhbmdlKClgLlxuICpcbiAqIEF1ZGlvIGFuZCB2aWRlbyBiaXRyYXRlIGZpbHRlcnMgYXJlIG5vdCBpbmNsdWRlZCBoZXJlIGJlY2F1c2UgdGhleSB1c2UgdGhlXG4gKiBgQml0cmF0ZWAgY2xhc3MgZGlyZWN0bHkgdmlhIGRlZGljYXRlZCBtZXRob2RzIG9uIGBNYW5pZmVzdEZpbHRlcmAuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbWVkaWFwYWNrYWdlL2xhdGVzdC91c2VyZ3VpZGUvbWFuaWZlc3QtZmlsdGVyLXF1ZXJ5LXBhcmFtZXRlcnMuaHRtbFxuICovXG5leHBvcnQgZW51bSBOdW1lcmljRmlsdGVyS2V5IHtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMuXG4gICAqXG4gICAqIEFjY2VwdGVkIHZhbHVlczogcmFuZ2UgMeKAkzMyNzY3LCBvciBpbmRpdmlkdWFsIGludGVnZXJzLlxuICAgKi9cbiAgQVVESU9fQ0hBTk5FTFM9J2F1ZGlvX2NoYW5uZWxzJyxcbiAgLyoqXG4gICAqIFRoZSBhdWRpbyBzYW1wbGUgcmF0ZSBpbiBIei5cbiAgICpcbiAgICogQWNjZXB0ZWQgdmFsdWVzOiByYW5nZSAw4oCTMjE0NzQ4MzY0Nywgb3IgaW5kaXZpZHVhbCBpbnRlZ2Vycy5cbiAgICovXG4gIEFVRElPX1NBTVBMRV9SQVRFPSdhdWRpb19zYW1wbGVfcmF0ZScsXG4gIC8qKlxuICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSB0cmljay1wbGF5IGltYWdlIGluIHBpeGVscyAoSS1mcmFtZSBhbmQgaW1hZ2UtYmFzZWQgdHJpY2stcGxheSkuXG4gICAqXG4gICAqIElmIHVzaW5nIHdpdGggSS1mcmFtZSBvbmx5IHRyaWNrLXBsYXksIGBUUklDS1BMQVlfSEVJR0hUYCBhbmQgYFZJREVPX0hFSUdIVGBcbiAgICogc2hvdWxkIGhhdmUgc2ltaWxhciB2YWx1ZXMuIElmIHRoZXkgZGlmZmVyLCBJLWZyYW1lIG9ubHkgdHJhY2tzIG1pZ2h0IGJlXG4gICAqIHJlbW92ZWQgZnJvbSB0aGUgbWFuaWZlc3QuXG4gICAqXG4gICAqIEFjY2VwdGVkIHZhbHVlczogcmFuZ2UgMeKAkzIxNDc0ODM2NDcsIG9yIGluZGl2aWR1YWwgaW50ZWdlcnMuXG4gICAqL1xuICBUUklDS1BMQVlfSEVJR0hUPSd0cmlja3BsYXlfaGVpZ2h0JyxcbiAgLyoqXG4gICAqIFRoZSB2aWRlbyBmcmFtZSByYXRlIHJhbmdlIGluIE5UU0MgZm9ybWF0LlxuICAgKlxuICAgKiBXaGVuIGZpbHRlcmluZyBmb3IgYSBzaW5nbGUgdmFsdWUsIE1lZGlhUGFja2FnZSB1c2VzIGFuIGFwcHJveGltYXRlIGVxdWFsc1xuICAgKiBjb21wYXJpc29uIHdpdGggYW4gZXBzaWxvbiB0b2xlcmFuY2Ugb2YgMC4wMDA1LlxuICAgKlxuICAgKiBBY2NlcHRlZCB2YWx1ZXM6IHJhbmdlIDHigJM5OTkuOTk5ICh1cCB0byB0aHJlZSBkZWNpbWFsIHBsYWNlcyksIG9yIGluZGl2aWR1YWwgdmFsdWVzLlxuICAgKi9cbiAgVklERU9fRlJBTUVSQVRFPSd2aWRlb19mcmFtZXJhdGUnLFxuICAvKipcbiAgICogVGhlIGhlaWdodCBvZiB0aGUgdmlkZW8gaW4gcGl4ZWxzLlxuICAgKlxuICAgKiBJZiB1c2luZyB3aXRoIEktZnJhbWUgb25seSB0cmljay1wbGF5LCBgVFJJQ0tQTEFZX0hFSUdIVGAgYW5kIGBWSURFT19IRUlHSFRgXG4gICAqIHNob3VsZCBoYXZlIHNpbWlsYXIgdmFsdWVzLiBJZiB0aGV5IGRpZmZlciwgSS1mcmFtZSBvbmx5IHRyYWNrcyBtaWdodCBiZVxuICAgKiByZW1vdmVkIGZyb20gdGhlIG1hbmlmZXN0LlxuICAgKlxuICAgKiBBY2NlcHRlZCB2YWx1ZXM6IHJhbmdlIDHigJMzMjc2Nywgb3IgaW5kaXZpZHVhbCBpbnRlZ2Vycy5cbiAgICovXG4gIFZJREVPX0hFSUdIVD0ndmlkZW9faGVpZ2h0Jyxcbn1cblxuLyoqXG4gKiBUZXh0IG1hbmlmZXN0IGZpbHRlciBrZXlzIGZvciBmcmVlLWZvcm0gc3RyaW5nIHZhbHVlcy5cbiAqXG4gKiBVc2Ugd2l0aCBgTWFuaWZlc3RGaWx0ZXIudGV4dCgpYCBhbmQgYE1hbmlmZXN0RmlsdGVyLnRleHRMaXN0KClgLlxuICpcbiAqIEZvciBrZXlzIHdpdGggZml4ZWQgYWNjZXB0ZWQgdmFsdWVzLCB1c2UgdGhlIGRlZGljYXRlZCBtZXRob2RzIG9uIGBNYW5pZmVzdEZpbHRlcmAgaW5zdGVhZDpcbiAqIC0gQXVkaW8gY29kZWM6IGBNYW5pZmVzdEZpbHRlci5hdWRpb0NvZGVjKClgIC8gYE1hbmlmZXN0RmlsdGVyLmF1ZGlvQ29kZWNMaXN0KClgXG4gKiAtIFZpZGVvIGNvZGVjOiBgTWFuaWZlc3RGaWx0ZXIudmlkZW9Db2RlYygpYCAvIGBNYW5pZmVzdEZpbHRlci52aWRlb0NvZGVjTGlzdCgpYFxuICogLSBWaWRlbyBkeW5hbWljIHJhbmdlOiBgTWFuaWZlc3RGaWx0ZXIudmlkZW9EeW5hbWljUmFuZ2UoKWAgLyBgTWFuaWZlc3RGaWx0ZXIudmlkZW9EeW5hbWljUmFuZ2VMaXN0KClgXG4gKiAtIFRyaWNrcGxheSB0eXBlOiBgTWFuaWZlc3RGaWx0ZXIudHJpY2twbGF5VHlwZSgpYCAvIGBNYW5pZmVzdEZpbHRlci50cmlja3BsYXlUeXBlTGlzdCgpYFxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21lZGlhcGFja2FnZS9sYXRlc3QvdXNlcmd1aWRlL21hbmlmZXN0LWZpbHRlci1xdWVyeS1wYXJhbWV0ZXJzLmh0bWxcbiAqL1xuZXhwb3J0IGVudW0gVGV4dEZpbHRlcktleSB7XG4gIC8qKlxuICAgKiBBdWRpbyBsYW5ndWFnZXMgb3IgZnVuY3Rpb25hbCBjb2RlcyBkZXJpdmVkIGZyb20gZW5jb2RlciBwYXNzdGhyb3VnaC5cbiAgICpcbiAgICogQWNjZXB0ZWQgdmFsdWVzOiBhcmJpdHJhcnkgc3RyaW5ncyBzdWNoIGFzIElTTy02MzktMSBsYW5ndWFnZSBjb2RlcyAobm90IGNhc2Utc2Vuc2l0aXZlKS5cbiAgICovXG4gIEFVRElPX0xBTkdVQUdFPSdhdWRpb19sYW5ndWFnZScsXG4gIC8qKlxuICAgKiBUaGUgc3VidGl0bGUgbGFuZ3VhZ2Ugb3IgZnVuY3Rpb25hbCBjb2RlcyBkZXJpdmVkIGZyb20gZW5jb2RlciBwYXNzdGhyb3VnaC5cbiAgICpcbiAgICogQWNjZXB0ZWQgdmFsdWVzOiBhcmJpdHJhcnkgc3RyaW5ncyBzdWNoIGFzIElTTy02MzktMSBsYW5ndWFnZSBjb2RlcyAobm90IGNhc2Utc2Vuc2l0aXZlKS5cbiAgICovXG4gIFNVQlRJVExFX0xBTkdVQUdFPSdzdWJ0aXRsZV9sYW5ndWFnZScsXG59XG5cbi8qKlxuICogQml0cmF0ZSBtYW5pZmVzdCBmaWx0ZXIga2V5cy5cbiAqXG4gKiBVc2Ugd2l0aCBgTWFuaWZlc3RGaWx0ZXIuYml0cmF0ZSgpYCBhbmQgYE1hbmlmZXN0RmlsdGVyLmJpdHJhdGVSYW5nZSgpYC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYXBhY2thZ2UvbGF0ZXN0L3VzZXJndWlkZS9tYW5pZmVzdC1maWx0ZXItcXVlcnktcGFyYW1ldGVycy5odG1sXG4gKi9cbmV4cG9ydCBlbnVtIEJpdHJhdGVGaWx0ZXJLZXkge1xuICAvKipcbiAgICogVGhlIGF1ZGlvIGJpdHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kLlxuICAgKlxuICAgKiBBY2NlcHRlZCB2YWx1ZXM6IHJhbmdlIDDigJMyMTQ3NDgzNjQ3LCBvciBpbmRpdmlkdWFsIGludGVnZXJzLlxuICAgKi9cbiAgQVVESU9fQklUUkFURT0nYXVkaW9fYml0cmF0ZScsXG4gIC8qKlxuICAgKiBUaGUgdmlkZW8gYml0cmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQuXG4gICAqXG4gICAqIFdlIHJlY29tbWVuZCB1c2luZyBvbmx5IHRoaXMgZmlsdGVyIHBhcmFtZXRlciB0byBzZXQgdGhlIHZpZGVvIGJpdHJhdGUuXG4gICAqIERvIG5vdCBhbHNvIHNldCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB2aWRlbyBiaXRyYXRlIHZpYSB0aGUgTWVkaWFQYWNrYWdlXG4gICAqIGNvbnNvbGUgb3IgQVdTIENMSSwgYXMgeW91ciBvdXRwdXQgbWlnaHQgYmUgc2tld2VkLlxuICAgKlxuICAgKiBUaGlzIHBhcmFtZXRlciBjYW5ub3QgYmUgdXNlZCB3aXRoIHRyaWNrLXBsYXkgc3RyZWFtcy5cbiAgICpcbiAgICogQWNjZXB0ZWQgdmFsdWVzOiByYW5nZSAw4oCTMjE0NzQ4MzY0Nywgb3IgaW5kaXZpZHVhbCBpbnRlZ2Vycy5cbiAgICovXG4gIFZJREVPX0JJVFJBVEU9J3ZpZGVvX2JpdHJhdGUnLFxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBudW1lcmljIGZpbHRlciBleHByZXNzaW9uIHNlZ21lbnQg4oCUIGVpdGhlciBhIHNpbmdsZSB2YWx1ZSBvciBhIHJhbmdlLlxuICpcbiAqIFVzZSB3aXRoIGBNYW5pZmVzdEZpbHRlci5udW1lcmljQ29tYm8oKWAgdG8gYnVpbGQgZmlsdGVycyB0aGF0IGNvbWJpbmVcbiAqIHJhbmdlcyBhbmQgaW5kaXZpZHVhbCB2YWx1ZXMgKGUuZy4gYHZpZGVvX2hlaWdodDoyNDAtMzYwLDcyMC0xMDgwLDE0NDBgKS5cbiAqL1xuZXhwb3J0IGNsYXNzIE51bWVyaWNFeHByZXNzaW9uIHtcbiAgLyoqXG4gICAqIEEgc2luZ2xlIG51bWVyaWMgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZhbHVlKHY6IG51bWJlcik6IE51bWVyaWNFeHByZXNzaW9uIHtcbiAgICByZXR1cm4gbmV3IE51bWVyaWNFeHByZXNzaW9uKGAke3Z9YCwgW3ZdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBpbmNsdXNpdmUgbnVtZXJpYyByYW5nZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmFuZ2Uoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiBOdW1lcmljRXhwcmVzc2lvbiB7XG4gICAgcmV0dXJuIG5ldyBOdW1lcmljRXhwcmVzc2lvbihgJHtzdGFydH0tJHtlbmR9YCwgW3N0YXJ0LCBlbmRdKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHVibGljIHJlYWRvbmx5IF9leHByZXNzaW9uOiBzdHJpbmcsXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyByZWFkb25seSBfdmFsdWVzOiBudW1iZXJbXSxcbiAgKSB7fVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBiaXRyYXRlIGZpbHRlciBleHByZXNzaW9uIHNlZ21lbnQg4oCUIGVpdGhlciBhIHNpbmdsZSB2YWx1ZSBvciBhIHJhbmdlLlxuICpcbiAqIFVzZSB3aXRoIGBNYW5pZmVzdEZpbHRlci5iaXRyYXRlQ29tYm8oKWAgdG8gYnVpbGQgZmlsdGVycyB0aGF0IGNvbWJpbmVcbiAqIHJhbmdlcyBhbmQgaW5kaXZpZHVhbCBiaXRyYXRlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJpdHJhdGVFeHByZXNzaW9uIHtcbiAgLyoqXG4gICAqIEEgc2luZ2xlIGJpdHJhdGUgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZhbHVlKHY6IEJpdHJhdGUpOiBCaXRyYXRlRXhwcmVzc2lvbiB7XG4gICAgcmV0dXJuIG5ldyBCaXRyYXRlRXhwcmVzc2lvbihgJHt2LnRvQnBzKCl9YCwgW3YudG9CcHMoKV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGluY2x1c2l2ZSBiaXRyYXRlIHJhbmdlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByYW5nZShzdGFydDogQml0cmF0ZSwgZW5kOiBCaXRyYXRlKTogQml0cmF0ZUV4cHJlc3Npb24ge1xuICAgIHJldHVybiBuZXcgQml0cmF0ZUV4cHJlc3Npb24oYCR7c3RhcnQudG9CcHMoKX0tJHtlbmQudG9CcHMoKX1gLCBbc3RhcnQudG9CcHMoKSwgZW5kLnRvQnBzKCldKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHVibGljIHJlYWRvbmx5IF9leHByZXNzaW9uOiBzdHJpbmcsXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyByZWFkb25seSBfdmFsdWVzOiBudW1iZXJbXSxcbiAgKSB7fVxufVxuXG4vKipcbiAqIEVuYWJsZXMgeW91IHRvIGNyZWF0ZSBmaWx0ZXJzIGZvciB5b3VyIE9yaWdpbiBFbmRwb2ludC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYXBhY2thZ2UvbGF0ZXN0L3VzZXJndWlkZS9tYW5pZmVzdC1maWx0ZXJpbmcuaHRtbFxuICovXG5leHBvcnQgY2xhc3MgTWFuaWZlc3RGaWx0ZXIge1xuICAvKipcbiAgICogRmlsdGVyIGJ5IGEgc2luZ2xlIGJpdHJhdGUgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGJpdHJhdGUoa2V5OiBCaXRyYXRlRmlsdGVyS2V5LCB2YWx1ZTogQml0cmF0ZSkge1xuICAgIGNvbnN0IGJwcyA9IHZhbHVlLnRvQnBzKCk7XG4gICAgdmFsaWRhdGVCaXRyYXRlRmlsdGVyVmFsdWUoYnBzLCBrZXkpO1xuICAgIHJldHVybiBuZXcgTWFuaWZlc3RGaWx0ZXIoYCR7a2V5fToke2Jwc31gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgYSBiaXRyYXRlIHJhbmdlIChpbmNsdXNpdmUpLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBiaXRyYXRlUmFuZ2Uoa2V5OiBCaXRyYXRlRmlsdGVyS2V5LCBzdGFydDogQml0cmF0ZSwgZW5kOiBCaXRyYXRlKSB7XG4gICAgY29uc3Qgc3RhcnRCcHMgPSBzdGFydC50b0JwcygpO1xuICAgIGNvbnN0IGVuZEJwcyA9IGVuZC50b0JwcygpO1xuICAgIHZhbGlkYXRlQml0cmF0ZUZpbHRlclZhbHVlKHN0YXJ0QnBzLCBrZXkpO1xuICAgIHZhbGlkYXRlQml0cmF0ZUZpbHRlclZhbHVlKGVuZEJwcywga2V5KTtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGAke2tleX06JHtzdGFydEJwc30tJHtlbmRCcHN9YCk7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmeSBhIHNpbmdsZSBudW1lcmljIGZpbHRlciB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbnVtZXJpYyhrZXk6IE51bWVyaWNGaWx0ZXJLZXksIHZhbHVlOiBudW1iZXIpIHtcbiAgICB2YWxpZGF0ZU51bWVyaWNGaWx0ZXJWYWx1ZSh2YWx1ZSwga2V5KTtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGAke2tleX06JHt2YWx1ZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IG11bHRpcGxlIG51bWVyaWMgZmlsdGVyIHZhbHVlcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbnVtZXJpY0xpc3Qoa2V5OiBOdW1lcmljRmlsdGVyS2V5LCB2YWx1ZXM6IG51bWJlcltdKSB7XG4gICAgdmFsdWVzLmZvckVhY2godiA9PiB2YWxpZGF0ZU51bWVyaWNGaWx0ZXJWYWx1ZSh2LCBrZXkpKTtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGAke2tleX06JHt2YWx1ZXMuam9pbignLCcpfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYSBudW1lcmljIGZpbHRlciByYW5nZSAoaW5jbHVzaXZlKS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbnVtZXJpY1JhbmdlKGtleTogTnVtZXJpY0ZpbHRlcktleSwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpIHtcbiAgICB2YWxpZGF0ZU51bWVyaWNGaWx0ZXJWYWx1ZShzdGFydCwga2V5KTtcbiAgICB2YWxpZGF0ZU51bWVyaWNGaWx0ZXJWYWx1ZShlbmQsIGtleSk7XG4gICAgcmV0dXJuIG5ldyBNYW5pZmVzdEZpbHRlcihgJHtrZXl9OiR7c3RhcnR9LSR7ZW5kfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYSBmcmVlLWZvcm0gdGV4dCBmaWx0ZXIgdmFsdWUgKGZvciBsYW5ndWFnZSBrZXlzKS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdGV4dChrZXk6IFRleHRGaWx0ZXJLZXksIHZhbHVlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGAke2tleX06JHt2YWx1ZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IG11bHRpcGxlIGZyZWUtZm9ybSB0ZXh0IGZpbHRlciB2YWx1ZXMgKGZvciBsYW5ndWFnZSBrZXlzKS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdGV4dExpc3Qoa2V5OiBUZXh0RmlsdGVyS2V5LCB2YWx1ZXM6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIG5ldyBNYW5pZmVzdEZpbHRlcihgJHtrZXl9OiR7dmFsdWVzLmpvaW4oJywnKX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgYSBzaW5nbGUgYXVkaW8gY29kZWMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGF1ZGlvQ29kZWModmFsdWU6IEF1ZGlvQ29kZWMpIHtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGBhdWRpb19jb2RlYzoke3ZhbHVlfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBtdWx0aXBsZSBhdWRpbyBjb2RlY3MuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGF1ZGlvQ29kZWNMaXN0KHZhbHVlczogQXVkaW9Db2RlY1tdKSB7XG4gICAgcmV0dXJuIG5ldyBNYW5pZmVzdEZpbHRlcihgYXVkaW9fY29kZWM6JHt2YWx1ZXMuam9pbignLCcpfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBhIHNpbmdsZSB2aWRlbyBjb2RlYy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmlkZW9Db2RlYyh2YWx1ZTogVmlkZW9Db2RlYykge1xuICAgIHJldHVybiBuZXcgTWFuaWZlc3RGaWx0ZXIoYHZpZGVvX2NvZGVjOiR7dmFsdWV9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIGJ5IG11bHRpcGxlIHZpZGVvIGNvZGVjcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmlkZW9Db2RlY0xpc3QodmFsdWVzOiBWaWRlb0NvZGVjW10pIHtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGB2aWRlb19jb2RlYzoke3ZhbHVlcy5qb2luKCcsJyl9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVyIGJ5IGEgc2luZ2xlIHZpZGVvIGR5bmFtaWMgcmFuZ2UuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZpZGVvRHluYW1pY1JhbmdlKHZhbHVlOiBWaWRlb0R5bmFtaWNSYW5nZSkge1xuICAgIHJldHVybiBuZXcgTWFuaWZlc3RGaWx0ZXIoYHZpZGVvX2R5bmFtaWNfcmFuZ2U6JHt2YWx1ZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgbXVsdGlwbGUgdmlkZW8gZHluYW1pYyByYW5nZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZpZGVvRHluYW1pY1JhbmdlTGlzdCh2YWx1ZXM6IFZpZGVvRHluYW1pY1JhbmdlW10pIHtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGB2aWRlb19keW5hbWljX3JhbmdlOiR7dmFsdWVzLmpvaW4oJywnKX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgYnkgYSBzaW5nbGUgdHJpY2twbGF5IHR5cGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHRyaWNrcGxheVR5cGUodmFsdWU6IFRyaWNrcGxheVR5cGUpIHtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGB0cmlja3BsYXlfdHlwZToke3ZhbHVlfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBtdWx0aXBsZSB0cmlja3BsYXkgdHlwZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHRyaWNrcGxheVR5cGVMaXN0KHZhbHVlczogVHJpY2twbGF5VHlwZVtdKSB7XG4gICAgcmV0dXJuIG5ldyBNYW5pZmVzdEZpbHRlcihgdHJpY2twbGF5X3R5cGU6JHt2YWx1ZXMuam9pbignLCcpfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBhIGNvbWJpbmF0aW9uIG9mIG51bWVyaWMgcmFuZ2VzIGFuZCBpbmRpdmlkdWFsIHZhbHVlcy5cbiAgICpcbiAgICogVXNlIHRoaXMgZm9yIGFkdmFuY2VkIHBhdHRlcm5zIGxpa2UgYHZpZGVvX2hlaWdodDoyNDAtMzYwLDcyMC0xMDgwLDE0NDBgLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBNYW5pZmVzdEZpbHRlci5udW1lcmljQ29tYm8oTnVtZXJpY0ZpbHRlcktleS5WSURFT19IRUlHSFQsIFtcbiAgICogICBOdW1lcmljRXhwcmVzc2lvbi5yYW5nZSgyNDAsIDM2MCksXG4gICAqICAgTnVtZXJpY0V4cHJlc3Npb24ucmFuZ2UoNzIwLCAxMDgwKSxcbiAgICogICBOdW1lcmljRXhwcmVzc2lvbi52YWx1ZSgxNDQwKSxcbiAgICogXSlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbnVtZXJpY0NvbWJvKGtleTogTnVtZXJpY0ZpbHRlcktleSwgZXhwcmVzc2lvbnM6IE51bWVyaWNFeHByZXNzaW9uW10pIHtcbiAgICBleHByZXNzaW9ucy5mb3JFYWNoKGV4cHIgPT4gZXhwci5fdmFsdWVzLmZvckVhY2godiA9PiB2YWxpZGF0ZU51bWVyaWNGaWx0ZXJWYWx1ZSh2LCBrZXkpKSk7XG4gICAgcmV0dXJuIG5ldyBNYW5pZmVzdEZpbHRlcihgJHtrZXl9OiR7ZXhwcmVzc2lvbnMubWFwKGUgPT4gZS5fZXhwcmVzc2lvbikuam9pbignLCcpfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciBieSBhIGNvbWJpbmF0aW9uIG9mIGJpdHJhdGUgcmFuZ2VzIGFuZCBpbmRpdmlkdWFsIHZhbHVlcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogTWFuaWZlc3RGaWx0ZXIuYml0cmF0ZUNvbWJvKEJpdHJhdGVGaWx0ZXJLZXkuVklERU9fQklUUkFURSwgW1xuICAgKiAgIEJpdHJhdGVFeHByZXNzaW9uLnJhbmdlKEJpdHJhdGUubWJwcygxKSwgQml0cmF0ZS5tYnBzKDMpKSxcbiAgICogICBCaXRyYXRlRXhwcmVzc2lvbi52YWx1ZShCaXRyYXRlLm1icHMoNSkpLFxuICAgKiBdKVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBiaXRyYXRlQ29tYm8oa2V5OiBCaXRyYXRlRmlsdGVyS2V5LCBleHByZXNzaW9uczogQml0cmF0ZUV4cHJlc3Npb25bXSkge1xuICAgIGV4cHJlc3Npb25zLmZvckVhY2goZXhwciA9PiBleHByLl92YWx1ZXMuZm9yRWFjaCh2ID0+IHZhbGlkYXRlQml0cmF0ZUZpbHRlclZhbHVlKHYsIGtleSkpKTtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGAke2tleX06JHtleHByZXNzaW9ucy5tYXAoZSA9PiBlLl9leHByZXNzaW9uKS5qb2luKCcsJyl9YCk7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmeSBhIGN1c3RvbSBtYW5pZmVzdCBmaWx0ZXIgc3RyaW5nLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjdXN0b20oY3VzdG9tOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IE1hbmlmZXN0RmlsdGVyKGN1c3RvbSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGZpbHRlclN0cmluZyBOb3JtYWxpc2VkIG1hbmlmZXN0IGZpbHRlciBzdHJpbmdcbiAgICovXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgZmlsdGVyU3RyaW5nOiBzdHJpbmcpIHsgfVxufVxuXG4vKipcbiAqIENvbnRleHQgcGFzc2VkIHRvIE1hbmlmZXN0Ll9iaW5kKCkgbWV0aG9kXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYW5pZmVzdEJpbmRDb250ZXh0IHtcbiAgcmVhZG9ubHkgaGxzTWFuaWZlc3RzOiBDZm5PcmlnaW5FbmRwb2ludC5IbHNNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdO1xuICByZWFkb25seSBsbEhsc01hbmlmZXN0czogQ2ZuT3JpZ2luRW5kcG9pbnQuTG93TGF0ZW5jeUhsc01hbmlmZXN0Q29uZmlndXJhdGlvblByb3BlcnR5W107XG4gIHJlYWRvbmx5IGRhc2hNYW5pZmVzdHM6IENmbk9yaWdpbkVuZHBvaW50LkRhc2hNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdO1xuICByZWFkb25seSBtc3NNYW5pZmVzdHM6IENmbk9yaWdpbkVuZHBvaW50Lk1zc01hbmlmZXN0Q29uZmlndXJhdGlvblByb3BlcnR5W107XG4gIHJlYWRvbmx5IHNlZ21lbnQ/OiBTZWdtZW50Q29uZmlndXJhdGlvbjtcbn1cblxuLyoqXG4gKiBNYW5pZmVzdCB0byBhZGQgdG8gT3JpZ2luIEVuZHBvaW50XG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNYW5pZmVzdCB7XG4gIC8qKlxuICAgKiBTcGVjaWZ5IGEgbWFuaWZlc3QgY29uZmlndXJhdGlvbiBmb3IgTG93IExhdGVuY3kgSExTLlxuICAgKlxuICAgKiAqKk5vdGU6KiogTG93IExhdGVuY3kgSExTIG1hbmlmZXN0cyByZXF1aXJlIFRTIG9yIENNQUYgY29udGFpbmVyIHR5cGUuXG4gICAqIFVzZSB3aXRoIGBTZWdtZW50LnRzKClgIG9yIGBTZWdtZW50LmNtYWYoKWAuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGxvd0xhdGVuY3lITFMobWFuaWZlc3Q6IExvd0xhdGVuY3lIbHNNYW5pZmVzdENvbmZpZ3VyYXRpb24pOiBNYW5pZmVzdCB7XG4gICAgcmV0dXJuIG5ldyBMb3dMYXRlbmN5SGxzTWFuaWZlc3QobWFuaWZlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYSBtYW5pZmVzdCBjb25maWd1cmF0aW9uIGZvciBITFMuXG4gICAqXG4gICAqICoqTm90ZToqKiBITFMgbWFuaWZlc3RzIHJlcXVpcmUgVFMgb3IgQ01BRiBjb250YWluZXIgdHlwZS5cbiAgICogVXNlIHdpdGggYFNlZ21lbnQudHMoKWAgb3IgYFNlZ21lbnQuY21hZigpYC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaGxzKG1hbmlmZXN0OiBIbHNNYW5pZmVzdENvbmZpZ3VyYXRpb24pOiBNYW5pZmVzdCB7XG4gICAgcmV0dXJuIG5ldyBIbHNNYW5pZmVzdChtYW5pZmVzdCk7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmeSBhIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24gZm9yIERBU0guXG4gICAqXG4gICAqICoqTm90ZToqKiBEQVNIIG1hbmlmZXN0cyByZXF1aXJlIENNQUYgY29udGFpbmVyIHR5cGUuXG4gICAqIFVzZSB3aXRoIGBTZWdtZW50LmNtYWYoKWAuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGRhc2gobWFuaWZlc3Q6IERhc2hNYW5pZmVzdENvbmZpZ3VyYXRpb24pOiBNYW5pZmVzdCB7XG4gICAgcmV0dXJuIG5ldyBEYXNoTWFuaWZlc3QobWFuaWZlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgYSBtYW5pZmVzdCBjb25maWd1cmF0aW9uIGZvciBNU1MuXG4gICAqXG4gICAqICoqTm90ZToqKiBNU1MgbWFuaWZlc3RzIHJlcXVpcmUgSVNNIGNvbnRhaW5lciB0eXBlLlxuICAgKiBVc2Ugd2l0aCBgU2VnbWVudC5pc20oKWAuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG1zcyhtYW5pZmVzdDogTXNzTWFuaWZlc3RDb25maWd1cmF0aW9uKTogTWFuaWZlc3Qge1xuICAgIHJldHVybiBuZXcgTXNzTWFuaWZlc3QobWFuaWZlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBtYW5pZmVzdCBpcyBib3VuZCB0byBhbiBPcmlnaW5FbmRwb2ludC5cbiAgICpcbiAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCBtZXRob2QgdXNlZCBieSB0aGUgY29uc3RydWN0IGxpYnJhcnkgYW5kIHNob3VsZCBub3QgYmVcbiAgICogY2FsbGVkIG9yIGltcGxlbWVudGVkIGJ5IGV4dGVybmFsIGNvbnN1bWVycy4gSXQgbWF5IGNoYW5nZSB3aXRob3V0IG5vdGljZS5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgX2JpbmQoY29udGV4dDogTWFuaWZlc3RCaW5kQ29udGV4dCk6IHZvaWQ7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYSBudW1lcmljIGZpbHRlciB2YWx1ZSBpcyBhbiBpbnRlZ2VyIHdpdGhpbiB0aGUgYWNjZXB0ZWQgcmFuZ2UgZm9yIGl0cyBrZXkuXG4gKiBWSURFT19GUkFNRVJBVEUgaXMgZXhjbHVkZWQg4oCUIGl0IHVzZXMgYHZhbGlkYXRlRnJhbWVyYXRlVmFsdWVgIGluc3RlYWQuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVJbnRlZ2VyRmlsdGVyVmFsdWUodmFsdWU6IG51bWJlciwga2V5OiBOdW1lcmljRmlsdGVyS2V5LCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiB2b2lkIHtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgTnVtZXJpY0ZpbHRlck11c3RCZUludGVnZXJgLCBgTnVtZXJpYyBmaWx0ZXIgdmFsdWUgZm9yICcke2tleX0nIG11c3QgYmUgYW4gaW50ZWdlciwgZ290ICR7dmFsdWV9YCk7XG4gIH1cbiAgaWYgKHZhbHVlIDwgbWluIHx8IHZhbHVlID4gbWF4KSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBOdW1lcmljRmlsdGVyT3V0T2ZSYW5nZWAsIGBOdW1lcmljIGZpbHRlciB2YWx1ZSBmb3IgJyR7a2V5fScgbXVzdCBiZSBiZXR3ZWVuICR7bWlufSBhbmQgJHttYXh9LCBnb3QgJHt2YWx1ZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgdmlkZW8gZnJhbWVyYXRlIGZpbHRlciB2YWx1ZSAoMeKAkzk5OS45OTksIHVwIHRvIDMgZGVjaW1hbCBwbGFjZXMpLlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRnJhbWVyYXRlVmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICBpZiAodmFsdWUgPCAxIHx8IHZhbHVlID4gOTk5Ljk5OSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgTnVtZXJpY0ZpbHRlck91dE9mUmFuZ2VgLCBgTnVtZXJpYyBmaWx0ZXIgdmFsdWUgZm9yICd2aWRlb19mcmFtZXJhdGUnIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA5OTkuOTk5LCBnb3QgJHt2YWx1ZX1gKTtcbiAgfVxuICBjb25zdCBkZWNpbWFsUGFydCA9IHZhbHVlLnRvU3RyaW5nKCkuc3BsaXQoJy4nKVsxXTtcbiAgaWYgKGRlY2ltYWxQYXJ0ICYmIGRlY2ltYWxQYXJ0Lmxlbmd0aCA+IDMpIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YE51bWVyaWNGaWx0ZXJNYXhEZWNpbWFsUGxhY2VzYCwgYE51bWVyaWMgZmlsdGVyIHZhbHVlIGZvciAndmlkZW9fZnJhbWVyYXRlJyBhbGxvd3MgdXAgdG8gMyBkZWNpbWFsIHBsYWNlcywgZ290ICR7dmFsdWV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSb3V0ZSBudW1lcmljIHZhbGlkYXRpb24gdG8gdGhlIGNvcnJlY3QgaGVscGVyIGJhc2VkIG9uIGtleS5cbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZU51bWVyaWNGaWx0ZXJWYWx1ZSh2YWx1ZTogbnVtYmVyLCBrZXk6IE51bWVyaWNGaWx0ZXJLZXkpOiB2b2lkIHtcbiAgc3dpdGNoIChrZXkpIHtcbiAgICBjYXNlIE51bWVyaWNGaWx0ZXJLZXkuQVVESU9fQ0hBTk5FTFM6XG4gICAgICByZXR1cm4gdmFsaWRhdGVJbnRlZ2VyRmlsdGVyVmFsdWUodmFsdWUsIGtleSwgMSwgMzJfNzY3KTtcbiAgICBjYXNlIE51bWVyaWNGaWx0ZXJLZXkuQVVESU9fU0FNUExFX1JBVEU6XG4gICAgICByZXR1cm4gdmFsaWRhdGVJbnRlZ2VyRmlsdGVyVmFsdWUodmFsdWUsIGtleSwgMCwgMl8xNDdfNDgzXzY0Nyk7XG4gICAgY2FzZSBOdW1lcmljRmlsdGVyS2V5LlRSSUNLUExBWV9IRUlHSFQ6XG4gICAgICByZXR1cm4gdmFsaWRhdGVJbnRlZ2VyRmlsdGVyVmFsdWUodmFsdWUsIGtleSwgMSwgMl8xNDdfNDgzXzY0Nyk7XG4gICAgY2FzZSBOdW1lcmljRmlsdGVyS2V5LlZJREVPX0ZSQU1FUkFURTpcbiAgICAgIHJldHVybiB2YWxpZGF0ZUZyYW1lcmF0ZVZhbHVlKHZhbHVlKTtcbiAgICBjYXNlIE51bWVyaWNGaWx0ZXJLZXkuVklERU9fSEVJR0hUOlxuICAgICAgcmV0dXJuIHZhbGlkYXRlSW50ZWdlckZpbHRlclZhbHVlKHZhbHVlLCBrZXksIDEsIDMyXzc2Nyk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIGJpdHJhdGUgZmlsdGVyIHZhbHVlIGlzIGFuIGludGVnZXIgd2l0aGluIHRoZSBhY2NlcHRlZCByYW5nZS5cbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUJpdHJhdGVGaWx0ZXJWYWx1ZShicHM6IG51bWJlciwga2V5OiBCaXRyYXRlRmlsdGVyS2V5KTogdm9pZCB7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihicHMpKSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBCaXRyYXRlRmlsdGVyTXVzdEJlSW50ZWdlcmAsIGBCaXRyYXRlIGZpbHRlciB2YWx1ZSBmb3IgJyR7a2V5fScgbXVzdCByZXNvbHZlIHRvIGEgd2hvbGUgbnVtYmVyIG9mIGJpdHMgcGVyIHNlY29uZCwgZ290ICR7YnBzfWApO1xuICB9XG4gIGlmIChicHMgPCAwIHx8IGJwcyA+IDJfMTQ3XzQ4M182NDcpIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YEJpdHJhdGVGaWx0ZXJPdXRPZlJhbmdlYCwgYEJpdHJhdGUgZmlsdGVyIHZhbHVlIGZvciAnJHtrZXl9JyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMjE0NzQ4MzY0NywgZ290ICR7YnBzfWApO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGNvbW1vbiBtYW5pZmVzdCBjb25maWd1cmF0aW9uIHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVNYW5pZmVzdENvbmZpZ3VyYXRpb24oY29uZmlnOiBNYW5pZmVzdENvbmZpZ3VyYXRpb25CYXNlKTogdm9pZCB7XG4gIGlmIChjb25maWcubWFuaWZlc3RXaW5kb3cgJiYgY29uZmlnLm1hbmlmZXN0V2luZG93LnRvU2Vjb25kcygpIDwgMzApIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YE1hbmlmZXN0V2luZG93TWluaW11bWAsICdNYW5pZmVzdCBXaW5kb3cgaGFzIGEgbWluaW11bSB2YWx1ZSBvZiAzMCBzZWNvbmRzJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhbmQgbW9kaWZ5IGZpbHRlciBjb25maWd1cmF0aW9uXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVGaWx0ZXJDb25maWd1cmF0aW9uKGZpbHRlckNvbmZpZz86IEZpbHRlckNvbmZpZ3VyYXRpb24pOiBDZm5PcmlnaW5FbmRwb2ludC5GaWx0ZXJDb25maWd1cmF0aW9uUHJvcGVydHkgfCB1bmRlZmluZWQge1xuICBpZiAoIWZpbHRlckNvbmZpZykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBpZiAoZmlsdGVyQ29uZmlnLmNsaXBTdGFydFRpbWUgJiYgKGZpbHRlckNvbmZpZy5zdGFydCB8fCBmaWx0ZXJDb25maWcuZW5kKSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgQ2xpcFN0YXJ0VGltZUNvbmZsaWN0YCwgJ1lvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIENsaXBTdGFydFRpbWUgd2l0aCBTdGFydCBvciBFbmQgaW4gYSBGaWx0ZXJDb25maWd1cmF0aW9uLicpO1xuICB9XG5cbiAgaWYgKGZpbHRlckNvbmZpZy50aW1lRGVsYXkgJiYgKGZpbHRlckNvbmZpZy50aW1lRGVsYXkudG9TZWNvbmRzKCkgPCAwIHx8IGZpbHRlckNvbmZpZy50aW1lRGVsYXkudG9TZWNvbmRzKCkgPiAxMjA5NjAwKSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgVGltZURlbGF5UmFuZ2VgLCAnVGltZSBEZWxheSBzZXR0aW5nIHNob3VsZCBiZSBkZWZpbmVkIGJldHdlZW4gMC0xMjA5NjAwIHNlY29uZHMuJyk7XG4gIH1cblxuICBpZiAoZmlsdGVyQ29uZmlnLnN0YXJ0ICYmIGZpbHRlckNvbmZpZy5lbmQgJiYgKGZpbHRlckNvbmZpZy5lbmQgPD0gZmlsdGVyQ29uZmlnLnN0YXJ0KSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgRW5kQmVmb3JlU3RhcnRgLCAnVGhlIEVuZCBwYXJhbWV0ZXIgbmVlZHMgdG8gYmUgYWZ0ZXIgdGhlIFN0YXJ0IHBhcmFtZXRlciBpbiBhIEZpbHRlckNvbmZpZ3VyYXRpb24uJyk7XG4gIH1cblxuICBjb25zdCBtYW5pZmVzdEZpbHRlciA9IGZpbHRlckNvbmZpZy5tYW5pZmVzdEZpbHRlciA/IGZpbHRlckNvbmZpZy5tYW5pZmVzdEZpbHRlci5tYXAoZmlsdGVyID0+IGZpbHRlci5maWx0ZXJTdHJpbmcpLmpvaW4oJzsnKSA6IHVuZGVmaW5lZDtcbiAgaWYgKG1hbmlmZXN0RmlsdGVyICE9IHVuZGVmaW5lZCAmJiAobWFuaWZlc3RGaWx0ZXIubGVuZ3RoIDwgMSB8fCBtYW5pZmVzdEZpbHRlci5sZW5ndGggPiAxMDI0KSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgTWFuaWZlc3RGaWx0ZXJMZW5ndGhgLCAnTWFuaWZlc3QgZmlsdGVyIG5lZWRzIHRvIGJlIGJldHdlZW4gMS0xMDI0IGNoYXJhY3RlcnMgaW4gbGVuZ3RoLicpO1xuICB9XG5cbiAgaWYgKGZpbHRlckNvbmZpZy5tYW5pZmVzdEZpbHRlciAmJiBmaWx0ZXJDb25maWcubWFuaWZlc3RGaWx0ZXIubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IGtleXMgPSBmaWx0ZXJDb25maWcubWFuaWZlc3RGaWx0ZXIubWFwKGYgPT4gZi5maWx0ZXJTdHJpbmcuc3BsaXQoJzonKVswXSk7XG4gICAga2V5cy5mb3JFYWNoKChrZXksIGkpID0+IHtcbiAgICAgIGlmIChrZXlzLmluZGV4T2Yoa2V5KSAhPT0gaSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YER1cGxpY2F0ZU1hbmlmZXN0RmlsdGVyS2V5YCwgYER1cGxpY2F0ZSBtYW5pZmVzdCBmaWx0ZXIga2V5ICcke2tleX0nLiBVc2UgYSBzaW5nbGUgZmlsdGVyIHdpdGggY29tbWEtc2VwYXJhdGVkIHZhbHVlcyBpbnN0ZWFkIChlLmcuIE1hbmlmZXN0RmlsdGVyLm51bWVyaWNMaXN0KCkgb3IgTWFuaWZlc3RGaWx0ZXIuY3VzdG9tKCkpLmApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtYW5pZmVzdEZpbHRlcixcbiAgICBkcm1TZXR0aW5nczogZmlsdGVyQ29uZmlnLmRybVNldHRpbmdzID8gZmlsdGVyQ29uZmlnLmRybVNldHRpbmdzLmZpbHRlcigodiwgaSwgYSkgPT4gYS5pbmRleE9mKHYpID09PSBpKS5qb2luKCc7JykgOiB1bmRlZmluZWQsXG4gICAgY2xpcFN0YXJ0VGltZTogZmlsdGVyQ29uZmlnLmNsaXBTdGFydFRpbWUgPyBjb252ZXJ0RGF0ZVRvU3RyaW5nKGZpbHRlckNvbmZpZy5jbGlwU3RhcnRUaW1lKSA6IHVuZGVmaW5lZCxcbiAgICBzdGFydDogZmlsdGVyQ29uZmlnLnN0YXJ0ID8gY29udmVydERhdGVUb1N0cmluZyhmaWx0ZXJDb25maWcuc3RhcnQpIDogdW5kZWZpbmVkLFxuICAgIGVuZDogZmlsdGVyQ29uZmlnLmVuZCA/IGNvbnZlcnREYXRlVG9TdHJpbmcoZmlsdGVyQ29uZmlnLmVuZCkgOiB1bmRlZmluZWQsXG4gICAgdGltZURlbGF5U2Vjb25kczogZmlsdGVyQ29uZmlnLnRpbWVEZWxheT8udG9TZWNvbmRzKCksXG4gIH07XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc3RhcnRUYWcgY29uZmlndXJhdGlvblxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhcnRUYWcoc3RhcnRUYWc6IFN0YXJ0VGFnLCBtYW5pZmVzdFdpbmRvdz86IER1cmF0aW9uLCBzZWdtZW50RHVyYXRpb24/OiBEdXJhdGlvbik6IHZvaWQge1xuICBjb25zdCB0aW1lT2Zmc2V0ID0gc3RhcnRUYWcudGltZU9mZnNldDtcblxuICAvLyBHZXQgc2VnbWVudCBkdXJhdGlvbiAoZGVmYXVsdCBpcyA2IHNlY29uZHMgaWYgbm90IHNwZWNpZmllZClcbiAgY29uc3Qgc2VnbWVudER1cmF0aW9uU2VjID0gc2VnbWVudER1cmF0aW9uPy50b1NlY29uZHMoKSA/PyA2O1xuXG4gIC8vIEdldCBtYW5pZmVzdCBkdXJhdGlvbiAoZGVmYXVsdCBpcyA2MCBzZWNvbmRzIGlmIG5vdCBzcGVjaWZpZWQpXG4gIGNvbnN0IG1hbmlmZXN0RHVyYXRpb25TZWMgPSBtYW5pZmVzdFdpbmRvdz8udG9TZWNvbmRzKCkgPz8gNjA7XG5cbiAgLy8gVmFsaWRhdGUgcG9zaXRpdmUgb2Zmc2V0IChmcm9tIHN0YXJ0KVxuICBpZiAodGltZU9mZnNldCA+IDApIHtcbiAgICBjb25zdCBtYXhQb3NpdGl2ZU9mZnNldCA9IG1hbmlmZXN0RHVyYXRpb25TZWMgLSAoMyAqIHNlZ21lbnREdXJhdGlvblNlYyk7XG4gICAgaWYgKHRpbWVPZmZzZXQgPj0gbWF4UG9zaXRpdmVPZmZzZXQpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgU3RhcnRUYWdQb3NpdGl2ZU9mZnNldEV4Y2VlZGVkYCwgYFN0YXJ0VGFnIHRpbWVPZmZzZXQgKCR7dGltZU9mZnNldH1zKSBtdXN0IGJlIGxlc3MgdGhhbiBtYW5pZmVzdCBkdXJhdGlvbiAoJHttYW5pZmVzdER1cmF0aW9uU2VjfXMpIG1pbnVzIDMgdGltZXMgc2VnbWVudCBkdXJhdGlvbiAoJHtzZWdtZW50RHVyYXRpb25TZWN9cykuIE1heGltdW0gYWxsb3dlZDogJHttYXhQb3NpdGl2ZU9mZnNldH1zYCk7XG4gICAgfVxuICB9XG5cbiAgLy8gVmFsaWRhdGUgbmVnYXRpdmUgb2Zmc2V0IChmcm9tIGxpdmUgZWRnZSlcbiAgaWYgKHRpbWVPZmZzZXQgPCAwKSB7XG4gICAgY29uc3QgYWJzT2Zmc2V0ID0gTWF0aC5hYnModGltZU9mZnNldCk7XG4gICAgY29uc3QgbWluTmVnYXRpdmVPZmZzZXQgPSAzICogc2VnbWVudER1cmF0aW9uU2VjO1xuXG4gICAgaWYgKGFic09mZnNldCA8PSBtaW5OZWdhdGl2ZU9mZnNldCkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBTdGFydFRhZ05lZ2F0aXZlT2Zmc2V0VG9vU21hbGxgLCBgU3RhcnRUYWcgdGltZU9mZnNldCAoJHt0aW1lT2Zmc2V0fXMpIGFic29sdXRlIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDMgdGltZXMgc2VnbWVudCBkdXJhdGlvbiAoJHtzZWdtZW50RHVyYXRpb25TZWN9cykuIE1pbmltdW0gYWxsb3dlZDogLSR7bWluTmVnYXRpdmVPZmZzZXQgKyAwLjAxfXNgKTtcbiAgICB9XG5cbiAgICBpZiAoYWJzT2Zmc2V0ID49IG1hbmlmZXN0RHVyYXRpb25TZWMpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgU3RhcnRUYWdOZWdhdGl2ZU9mZnNldEV4Y2VlZHNNYW5pZmVzdGAsIGBTdGFydFRhZyB0aW1lT2Zmc2V0ICgke3RpbWVPZmZzZXR9cykgYWJzb2x1dGUgdmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gbWFuaWZlc3QgZHVyYXRpb24gKCR7bWFuaWZlc3REdXJhdGlvblNlY31zKWApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkIEhMUyBtYW5pZmVzdCBjb25maWd1cmF0aW9uXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gYnVpbGRIbHNNYW5pZmVzdENvbmZpZ3VyYXRpb24oXG4gIGNvbmZpZzogSGxzTWFuaWZlc3RDb25maWd1cmF0aW9uLFxuICBzZWdtZW50RHVyYXRpb24/OiBEdXJhdGlvbixcbik6IENmbk9yaWdpbkVuZHBvaW50Lkhsc01hbmlmZXN0Q29uZmlndXJhdGlvblByb3BlcnR5IHtcbiAgaWYgKGNvbmZpZy5zdGFydFRhZykge1xuICAgIHZhbGlkYXRlU3RhcnRUYWcoY29uZmlnLnN0YXJ0VGFnLCBjb25maWcubWFuaWZlc3RXaW5kb3csIHNlZ21lbnREdXJhdGlvbik7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1hbmlmZXN0TmFtZTogY29uZmlnLm1hbmlmZXN0TmFtZSxcbiAgICBjaGlsZE1hbmlmZXN0TmFtZTogY29uZmlnLmNoaWxkTWFuaWZlc3ROYW1lLFxuICAgIG1hbmlmZXN0V2luZG93U2Vjb25kczogY29uZmlnLm1hbmlmZXN0V2luZG93Py50b1NlY29uZHMoKSxcbiAgICBwcm9ncmFtRGF0ZVRpbWVJbnRlcnZhbFNlY29uZHM6IGNvbmZpZy5wcm9ncmFtRGF0ZVRpbWVJbnRlcnZhbD8udG9TZWNvbmRzKCksXG4gICAgc2N0ZUhsczogY29uZmlnLnNjdGVBZE1hcmtlckhscyA/IHsgYWRNYXJrZXJIbHM6IGNvbmZpZy5zY3RlQWRNYXJrZXJIbHMgfSA6IHVuZGVmaW5lZCxcbiAgICBzdGFydFRhZzogY29uZmlnLnN0YXJ0VGFnLFxuICAgIHVybEVuY29kZUNoaWxkTWFuaWZlc3Q6IGNvbmZpZy51cmxFbmNvZGVDaGlsZE1hbmlmZXN0LFxuICAgIGZpbHRlckNvbmZpZ3VyYXRpb246IHZhbGlkYXRlRmlsdGVyQ29uZmlndXJhdGlvbihjb25maWcuZmlsdGVyQ29uZmlndXJhdGlvbiksXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgREFTSCBtYW5pZmVzdCBjb25maWd1cmF0aW9uXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gYnVpbGREYXNoTWFuaWZlc3RDb25maWd1cmF0aW9uKFxuICBjb25maWc6IERhc2hNYW5pZmVzdENvbmZpZ3VyYXRpb24sXG4gIHNlZ21lbnQ/OiBTZWdtZW50Q29uZmlndXJhdGlvbixcbik6IENmbk9yaWdpbkVuZHBvaW50LkRhc2hNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eSB7XG4gIGlmIChjb25maWcubWluQnVmZmVyVGltZSAmJiAoY29uZmlnLm1pbkJ1ZmZlclRpbWUudG9TZWNvbmRzKCkgPCAxIHx8IGNvbmZpZy5taW5CdWZmZXJUaW1lLnRvU2Vjb25kcygpID4gMzYwMCkpIHtcbiAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YE1pbkJ1ZmZlclRpbWVSYW5nZWAsICdNaW4gYnVmZmVyIHRpbWUgaGFzIGEgcmFuZ2UgZnJvbSAxIHNlYy4gdG8gMzYwMCBzZWMuJyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5taW5VcGRhdGVQZXJpb2QgJiYgKGNvbmZpZy5taW5VcGRhdGVQZXJpb2QudG9TZWNvbmRzKCkgPCAxIHx8IGNvbmZpZy5taW5VcGRhdGVQZXJpb2QudG9TZWNvbmRzKCkgPiAzNjAwKSkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgTWluVXBkYXRlUGVyaW9kUmFuZ2VgLCAnTWluIHVwZGF0ZSBwZXJpb2Qgb3B0aW9uIGhhcyBhIHJhbmdlIGZyb20gMSBzZWMuIHRvIDM2MDAgc2VjLicpO1xuICB9XG4gIGlmIChjb25maWcuc2N0ZURhc2hBZE1hcmtlciAmJiAoIXNlZ21lbnQ/LnNjdGVGaWx0ZXIgfHwgc2VnbWVudC5zY3RlRmlsdGVyPy5sZW5ndGggPT09IDApKSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBTY3RlRmlsdGVyUmVxdWlyZWRgLCAnU0NURSBGaWx0ZXIgbXVzdCBiZSBjb25maWd1cmVkIHdpdGggRGFzaEFkTWFya2VyIENvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWFuaWZlc3ROYW1lOiBjb25maWcubWFuaWZlc3ROYW1lLFxuICAgIGJhc2VVcmxzOiBjb25maWcuYmFzZVVybHMsXG4gICAgY29tcGFjdG5lc3M6IGNvbmZpZy5jb21wYWN0bmVzcyxcbiAgICBkcm1TaWduYWxpbmc6IGNvbmZpZy5kcm1TaWduYWxsaW5nLFxuICAgIGR2YlNldHRpbmdzOiBjb25maWcuZHZiU2V0dGluZ3MsXG4gICAgcHJvZmlsZXM6IGNvbmZpZy5wcm9maWxlcyxcbiAgICBwcm9ncmFtSW5mb3JtYXRpb246IGNvbmZpZy5wcm9ncmFtSW5mb3JtYXRpb24sXG4gICAgc3VidGl0bGVDb25maWd1cmF0aW9uOiBjb25maWcuc3VidGl0bGVDb25maWd1cmF0aW9uLFxuICAgIG1hbmlmZXN0V2luZG93U2Vjb25kczogY29uZmlnLm1hbmlmZXN0V2luZG93Py50b1NlY29uZHMoKSxcbiAgICBtaW5CdWZmZXJUaW1lU2Vjb25kczogY29uZmlnLm1pbkJ1ZmZlclRpbWU/LnRvU2Vjb25kcygpLFxuICAgIG1pblVwZGF0ZVBlcmlvZFNlY29uZHM6IGNvbmZpZy5taW5VcGRhdGVQZXJpb2Q/LnRvU2Vjb25kcygpLFxuICAgIHN1Z2dlc3RlZFByZXNlbnRhdGlvbkRlbGF5U2Vjb25kczogY29uZmlnLnN1Z2dlc3RlZFByZXNlbnRhdGlvbkRlbGF5Py50b1NlY29uZHMoKSxcbiAgICBzZWdtZW50VGVtcGxhdGVGb3JtYXQ6IGNvbmZpZy5zZWdtZW50VGVtcGxhdGVGb3JtYXQsXG4gICAgcGVyaW9kVHJpZ2dlcnM6IGNvbmZpZy5wZXJpb2RUcmlnZ2VycyxcbiAgICBzY3RlRGFzaDogc2VnbWVudD8uc2N0ZUZpbHRlciA/IHtcbiAgICAgIGFkTWFya2VyRGFzaDogY29uZmlnLnNjdGVEYXNoQWRNYXJrZXIsXG4gICAgfSA6IHVuZGVmaW5lZCxcbiAgICB1dGNUaW1pbmc6IGNvbmZpZy51dGNUaW1pbmdNb2RlIHx8IGNvbmZpZy51dGNUaW1pbmdTb3VyY2UgPyB7XG4gICAgICB0aW1pbmdNb2RlOiBjb25maWcudXRjVGltaW5nTW9kZSxcbiAgICAgIHRpbWluZ1NvdXJjZTogY29uZmlnLnV0Y1RpbWluZ1NvdXJjZSxcbiAgICB9IDogdW5kZWZpbmVkLFxuICAgIGZpbHRlckNvbmZpZ3VyYXRpb246IHZhbGlkYXRlRmlsdGVyQ29uZmlndXJhdGlvbihjb25maWcuZmlsdGVyQ29uZmlndXJhdGlvbiksXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgTVNTIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb25cbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiBidWlsZE1zc01hbmlmZXN0Q29uZmlndXJhdGlvbihjb25maWc6IE1zc01hbmlmZXN0Q29uZmlndXJhdGlvbik6IENmbk9yaWdpbkVuZHBvaW50Lk1zc01hbmlmZXN0Q29uZmlndXJhdGlvblByb3BlcnR5IHtcbiAgcmV0dXJuIHtcbiAgICBtYW5pZmVzdE5hbWU6IGNvbmZpZy5tYW5pZmVzdE5hbWUsXG4gICAgbWFuaWZlc3RMYXlvdXQ6IGNvbmZpZy5tYW5pZmVzdExheW91dCxcbiAgICBtYW5pZmVzdFdpbmRvd1NlY29uZHM6IGNvbmZpZy5tYW5pZmVzdFdpbmRvdz8udG9TZWNvbmRzKCksXG4gICAgZmlsdGVyQ29uZmlndXJhdGlvbjogdmFsaWRhdGVGaWx0ZXJDb25maWd1cmF0aW9uKGNvbmZpZy5maWx0ZXJDb25maWd1cmF0aW9uKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBITFMgTWFuaWZlc3QgaW1wbGVtZW50YXRpb25cbiAqL1xuY2xhc3MgSGxzTWFuaWZlc3QgZXh0ZW5kcyBNYW5pZmVzdCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBIbHNNYW5pZmVzdENvbmZpZ3VyYXRpb24pIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIF9iaW5kKGNvbnRleHQ6IE1hbmlmZXN0QmluZENvbnRleHQpOiB2b2lkIHtcbiAgICB2YWxpZGF0ZU1hbmlmZXN0Q29uZmlndXJhdGlvbih0aGlzLmNvbmZpZyk7XG4gICAgY29udGV4dC5obHNNYW5pZmVzdHMucHVzaChidWlsZEhsc01hbmlmZXN0Q29uZmlndXJhdGlvbih0aGlzLmNvbmZpZywgY29udGV4dC5zZWdtZW50Py5zZWdtZW50RHVyYXRpb24pKTtcbiAgfVxufVxuXG4vKipcbiAqIExvdyBMYXRlbmN5IEhMUyBNYW5pZmVzdCBpbXBsZW1lbnRhdGlvblxuICovXG5jbGFzcyBMb3dMYXRlbmN5SGxzTWFuaWZlc3QgZXh0ZW5kcyBNYW5pZmVzdCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBMb3dMYXRlbmN5SGxzTWFuaWZlc3RDb25maWd1cmF0aW9uKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBfYmluZChjb250ZXh0OiBNYW5pZmVzdEJpbmRDb250ZXh0KTogdm9pZCB7XG4gICAgdmFsaWRhdGVNYW5pZmVzdENvbmZpZ3VyYXRpb24odGhpcy5jb25maWcpO1xuICAgIGNvbnRleHQubGxIbHNNYW5pZmVzdHMucHVzaChidWlsZEhsc01hbmlmZXN0Q29uZmlndXJhdGlvbih0aGlzLmNvbmZpZywgY29udGV4dC5zZWdtZW50Py5zZWdtZW50RHVyYXRpb24pKTtcbiAgfVxufVxuXG4vKipcbiAqIERBU0ggTWFuaWZlc3QgaW1wbGVtZW50YXRpb25cbiAqL1xuY2xhc3MgRGFzaE1hbmlmZXN0IGV4dGVuZHMgTWFuaWZlc3Qge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogRGFzaE1hbmlmZXN0Q29uZmlndXJhdGlvbikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgX2JpbmQoY29udGV4dDogTWFuaWZlc3RCaW5kQ29udGV4dCk6IHZvaWQge1xuICAgIHZhbGlkYXRlTWFuaWZlc3RDb25maWd1cmF0aW9uKHRoaXMuY29uZmlnKTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy51dGNUaW1pbmdNb2RlID09PSBEYXNoVXRjVGltaW5nTW9kZS5VVENfRElSRUNUICYmIHRoaXMuY29uZmlnLnV0Y1RpbWluZ1NvdXJjZSkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBVdGNEaXJlY3RUaW1pbmdTb3VyY2VgLCAnVVRDIERpcmVjdCBjb25maWd1cmVkIHdpdGggYSB0aW1pbmcgc291cmNlLCBlbnN1cmUgdGltaW5nIHNvdXJjZSBpcyB1bmRlZmluZWQgdG8gdXNlIFVUQyBEaXJlY3QuJyk7XG4gICAgfVxuXG4gICAgY29udGV4dC5kYXNoTWFuaWZlc3RzLnB1c2goYnVpbGREYXNoTWFuaWZlc3RDb25maWd1cmF0aW9uKHRoaXMuY29uZmlnLCBjb250ZXh0LnNlZ21lbnQpKTtcbiAgfVxufVxuXG4vKipcbiAqIE1TUyBNYW5pZmVzdCBpbXBsZW1lbnRhdGlvblxuICovXG5jbGFzcyBNc3NNYW5pZmVzdCBleHRlbmRzIE1hbmlmZXN0IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjb25maWc6IE1zc01hbmlmZXN0Q29uZmlndXJhdGlvbikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgX2JpbmQoY29udGV4dDogTWFuaWZlc3RCaW5kQ29udGV4dCk6IHZvaWQge1xuICAgIHZhbGlkYXRlTWFuaWZlc3RDb25maWd1cmF0aW9uKHRoaXMuY29uZmlnKTtcbiAgICBjb250ZXh0Lm1zc01hbmlmZXN0cy5wdXNoKGJ1aWxkTXNzTWFuaWZlc3RDb25maWd1cmF0aW9uKHRoaXMuY29uZmlnKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBjb250YWluZXIgdG8gYXR0YWNoIHRvIHRoaXMgb3JpZ2luIGVuZHBvaW50LlxuICogQSBjb250YWluZXIgdHlwZSBpcyBhIGZpbGUgZm9ybWF0IHRoYXQgZW5jYXBzdWxhdGVzIG9uZSBvciBtb3JlIG1lZGlhIHN0cmVhbXMsIHN1Y2ggYXMgYXVkaW8gYW5kIHZpZGVvLCBpbnRvIGEgc2luZ2xlIGZpbGUuIFlvdSBjYW4ndCBjaGFuZ2UgdGhlIGNvbnRhaW5lciB0eXBlIGFmdGVyIHlvdSBjcmVhdGUgdGhlIGVuZHBvaW50LlxuICovXG5leHBvcnQgZW51bSBDb250YWluZXJUeXBlIHtcbiAgLyoqXG4gICAqIFRTIENvbnRhaW5lciBUeXBlXG4gICAqL1xuICBUUz0nVFMnLFxuICAvKipcbiAgICogQ01BRiBDb250YWluZXIgVHlwZVxuICAgKi9cbiAgQ01BRj0nQ01BRicsXG4gIC8qKlxuICAgKiBJU00gQ29udGFpbmVyIFR5cGUgKE1pY3Jvc29mdCBTbW9vdGggU3RyZWFtaW5nKVxuICAgKi9cbiAgSVNNPSdJU00nLFxufVxuXG4vKipcbiAqIEVuY3J5cHRpb24gbWV0aG9kcyBmb3IgQ01BRiBjb250YWluZXIgdHlwZS5cbiAqL1xuZXhwb3J0IGVudW0gQ21hZkVuY3J5cHRpb25NZXRob2Qge1xuICAvKipcbiAgICogQ29tbW9uIEVuY3J5cHRpb24gU2NoZW1lIChDRU5DKSAtIGNvbXBhdGlibGUgd2l0aCBQbGF5UmVhZHksIFdpZGV2aW5lLCBhbmQgSXJkZXRvIERSTSBzeXN0ZW1zLlxuICAgKi9cbiAgQ0VOQyA9ICdDRU5DJyxcbiAgLyoqXG4gICAqIENvbW1vbiBFbmNyeXB0aW9uIFNjaGVtZSB3aXRoIENCQ1MgbW9kZSAtIGNvbXBhdGlibGUgd2l0aCBQbGF5UmVhZHksIFdpZGV2aW5lLCBhbmQgRmFpclBsYXkgRFJNIHN5c3RlbXMuXG4gICAqL1xuICBDQkNTID0gJ0NCQ1MnLFxufVxuXG4vKipcbiAqIEVuY3J5cHRpb24gbWV0aG9kcyBmb3IgVFMgY29udGFpbmVyIHR5cGUuXG4gKi9cbmV4cG9ydCBlbnVtIFRzRW5jcnlwdGlvbk1ldGhvZCB7XG4gIC8qKlxuICAgKiBBRVMtMTI4IGVuY3J5cHRpb24gLSByZXF1aXJlcyBDbGVhciBLZXkgQUVTIDEyOCBEUk0gc3lzdGVtLlxuICAgKi9cbiAgQUVTXzEyOCA9ICdBRVNfMTI4JyxcbiAgLyoqXG4gICAqIFNhbXBsZS1sZXZlbCBBRVMgZW5jcnlwdGlvbiAtIHJlcXVpcmVzIEZhaXJQbGF5IERSTSBzeXN0ZW0uXG4gICAqL1xuICBTQU1QTEVfQUVTID0gJ1NBTVBMRV9BRVMnLFxufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBhdWRpbyBlbmNyeXB0aW9uIHByZXNldHMuXG4gKi9cbmV4cG9ydCBlbnVtIFByZXNldFNwZWtlMjBBdWRpbyB7XG4gIC8qKlxuICAgKiBVc2Ugb25lIGNvbnRlbnQga2V5IHRvIGVuY3J5cHQgYWxsIG9mIHRoZSBhdWRpbyB0cmFja3MgaW4geW91ciBzdHJlYW0uXG4gICAqL1xuICBQUkVTRVRfQVVESU9fMT0nUFJFU0VUX0FVRElPXzEnLFxuICAvKipcbiAgICogVXNlIG9uZSBjb250ZW50IGtleSB0byBlbmNyeXB0IGFsbCBvZiB0aGUgc3RlcmVvIGF1ZGlvIHRyYWNrcyBhbmQgb25lIGNvbnRlbnQga2V5IHRvIGVuY3J5cHQgYWxsIG9mIHRoZSBtdWx0aWNoYW5uZWwgYXVkaW8gdHJhY2tzLlxuICAgKi9cbiAgUFJFU0VUX0FVRElPXzI9J1BSRVNFVF9BVURJT18yJyxcbiAgLyoqXG4gICAqIFVzZSBvbmUgY29udGVudCBrZXkgdG8gZW5jcnlwdCBhbGwgb2YgdGhlIHN0ZXJlbyBhdWRpbyB0cmFja3MsIG9uZSBjb250ZW50IGtleSB0byBlbmNyeXB0IGFsbCBvZiB0aGUgbXVsdGljaGFubmVsIGF1ZGlvIHRyYWNrcyB3aXRoIDMgdG8gNiBjaGFubmVscyxcbiAgICogYW5kIG9uZSBjb250ZW50IGtleSB0byBlbmNyeXB0IGFsbCBvZiB0aGUgbXVsdGljaGFubmVsIGF1ZGlvIHRyYWNrcyB3aXRoIG1vcmUgdGhhbiA2IGNoYW5uZWxzLlxuICAgKi9cbiAgUFJFU0VUX0FVRElPXzM9J1BSRVNFVF9BVURJT18zJyxcbiAgLyoqXG4gICAqIFVzZSB0aGUgc2FtZSBjb250ZW50IGtleSBmb3IgYWxsIG9mIHRoZSBhdWRpbyBhbmQgdmlkZW8gdHJhY2tzIGluIHlvdXIgc3RyZWFtLlxuICAgKi9cbiAgU0hBUkVEPSdTSEFSRUQnLFxuICAvKipcbiAgICogRG9uJ3QgZW5jcnlwdCBhbnkgb2YgdGhlIGF1ZGlvIHRyYWNrcyBpbiB5b3VyIHN0cmVhbS5cbiAgICovXG4gIFVORU5DUllQVEVEPSdVTkVOQ1JZUFRFRCcsXG59XG5cbi8qKlxuICogVGhlIFNQRUtFIFZlcnNpb24gMi4wIHByZXNldCB2aWRlbyBhc3NvY2lhdGVkIHdpdGggdGhlIGVuY3J5cHRpb24gY29udHJhY3QgY29uZmlndXJhdGlvbiBvZiB0aGUgb3JpZ2luIGVuZHBvaW50LlxuICpcbiAqIEEgY29sbGVjdGlvbiBvZiB2aWRlbyBlbmNyeXB0aW9uIHByZXNldHMuXG4gKi9cbmV4cG9ydCBlbnVtIFByZXNldFNwZWtlMjBWaWRlbyB7XG4gIC8qKlxuICAgKiBVc2Ugb25lIGNvbnRlbnQga2V5IHRvIGVuY3J5cHQgYWxsIG9mIHRoZSB2aWRlbyB0cmFja3MgaW4geW91ciBzdHJlYW0uXG4gICAqL1xuICBQUkVTRVRfVklERU9fMT0nUFJFU0VUX1ZJREVPXzEnLFxuICAvKipcbiAgICogVXNlIG9uZSBjb250ZW50IGtleSB0byBlbmNyeXB0IGFsbCBvZiB0aGUgU0QgdmlkZW8gdHJhY2tzIGFuZCBvbmUgY29udGVudCBrZXkgZm9yIGFsbCBIRCBhbmQgaGlnaGVyIHJlc29sdXRpb25zIHZpZGVvIHRyYWNrcy5cbiAgICovXG4gIFBSRVNFVF9WSURFT18yPSdQUkVTRVRfVklERU9fMicsXG4gIC8qKlxuICAgKiBVc2Ugb25lIGNvbnRlbnQga2V5IHRvIGVuY3J5cHQgYWxsIG9mIHRoZSBTRCB2aWRlbyB0cmFja3MsIG9uZSBjb250ZW50IGtleSBmb3IgSEQgdmlkZW8gdHJhY2tzIGFuZCBvbmUgY29udGVudCBrZXkgZm9yIGFsbCBVSEQgdmlkZW8gdHJhY2tzLlxuICAgKi9cbiAgUFJFU0VUX1ZJREVPXzM9J1BSRVNFVF9WSURFT18zJyxcbiAgLyoqXG4gICAqIFVzZSBvbmUgY29udGVudCBrZXkgdG8gZW5jcnlwdCBhbGwgb2YgdGhlIFNEIHZpZGVvIHRyYWNrcywgb25lIGNvbnRlbnQga2V5IGZvciBIRCB2aWRlbyB0cmFja3MsXG4gICAqIG9uZSBjb250ZW50IGtleSBmb3IgYWxsIFVIRDEgdmlkZW8gdHJhY2tzIGFuZCBvbmUgY29udGVudCBrZXkgZm9yIGFsbCBVSEQyIHZpZGVvIHRyYWNrcy5cbiAgICovXG4gIFBSRVNFVF9WSURFT180PSdQUkVTRVRfVklERU9fNCcsXG4gIC8qKlxuICAgKiBVc2Ugb25lIGNvbnRlbnQga2V5IHRvIGVuY3J5cHQgYWxsIG9mIHRoZSBTRCB2aWRlbyB0cmFja3MsIG9uZSBjb250ZW50IGtleSBmb3IgSEQxIHZpZGVvIHRyYWNrcywgb25lIGNvbnRlbnQga2V5IGZvciBIRDIgdmlkZW8gdHJhY2tzLFxuICAgKiBvbmUgY29udGVudCBrZXkgZm9yIGFsbCBVSEQxIHZpZGVvIHRyYWNrcyBhbmQgb25lIGNvbnRlbnQga2V5IGZvciBhbGwgVUhEMiB2aWRlbyB0cmFja3MuXG4gICAqL1xuICBQUkVTRVRfVklERU9fNT0nUFJFU0VUX1ZJREVPXzUnLFxuICAvKipcbiAgICogVXNlIG9uZSBjb250ZW50IGtleSB0byBlbmNyeXB0IGFsbCBvZiB0aGUgU0QgdmlkZW8gdHJhY2tzLCBvbmUgY29udGVudCBrZXkgZm9yIEhEMSB2aWRlbyB0cmFja3MsIG9uZSBjb250ZW50IGtleSBmb3IgSEQyIHZpZGVvIHRyYWNrc1xuICAgKiBhbmQgb25lIGNvbnRlbnQga2V5IGZvciBhbGwgVUhEIHZpZGVvIHRyYWNrcy5cbiAgICovXG4gIFBSRVNFVF9WSURFT182PSdQUkVTRVRfVklERU9fNicsXG4gIC8qKlxuICAgKiBVc2Ugb25lIGNvbnRlbnQga2V5IHRvIGVuY3J5cHQgYWxsIG9mIHRoZSBTRCtIRDEgdmlkZW8gdHJhY2tzLCBvbmUgY29udGVudCBrZXkgZm9yIEhEMiB2aWRlbyB0cmFja3MgYW5kIG9uZSBjb250ZW50IGtleSBmb3IgYWxsIFVIRCB2aWRlbyB0cmFja3MuXG4gICAqL1xuICBQUkVTRVRfVklERU9fNz0nUFJFU0VUX1ZJREVPXzcnLFxuICAvKipcbiAgICogVXNlIG9uZSBjb250ZW50IGtleSB0byBlbmNyeXB0IGFsbCBvZiB0aGUgU0QrSEQxIHZpZGVvIHRyYWNrcywgb25lIGNvbnRlbnQga2V5IGZvciBIRDIgdmlkZW8gdHJhY2tzLCBvbmUgY29udGVudCBrZXkgZm9yIGFsbCBVSEQxXG4gICAqIHZpZGVvIHRyYWNrcyBhbmQgb25lIGNvbnRlbnQga2V5IGZvciBhbGwgVUhEMiB2aWRlbyB0cmFja3MuXG4gICAqL1xuICBQUkVTRVRfVklERU9fOD0nUFJFU0VUX1ZJREVPXzgnLFxuICAvKipcbiAgICogVXNlIHRoZSBzYW1lIGNvbnRlbnQga2V5IGZvciBhbGwgb2YgdGhlIHZpZGVvIGFuZCBhdWRpbyB0cmFja3MgaW4geW91ciBzdHJlYW0uXG4gICAqL1xuICBTSEFSRUQ9J1NIQVJFRCcsXG4gIC8qKlxuICAgKiBEb24ndCBlbmNyeXB0IGFueSBvZiB0aGUgdmlkZW8gdHJhY2tzIGluIHlvdXIgc3RyZWFtLlxuICAgKi9cbiAgVU5FTkNSWVBURUQ9J1VORU5DUllQVEVEJyxcbn1cblxuLyoqXG4gKiBFbmRwb2ludCBlcnJvciBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBlbnVtIEVuZHBvaW50RXJyb3JDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBtYW5pZmVzdCBzdGFsbGVkIGFuZCB0aGVyZSBhcmUgbm8gbmV3IHNlZ21lbnRzIG9yIHBhcnRzLlxuICAgKi9cbiAgU1RBTEVfTUFOSUZFU1Q9J1NUQUxFX01BTklGRVNUJyxcbiAgLyoqXG4gICAqIFRoZXJlIGlzIGEgZ2FwIGluIHRoZSBtYW5pZmVzdC5cbiAgICovXG4gIElOQ09NUExFVEVfTUFOSUZFU1Q9J0lOQ09NUExFVEVfTUFOSUZFU1QnLFxuICAvKipcbiAgICogS2V5IHJvdGF0aW9uIGlzIGVuYWJsZWQgYnV0IHdlJ3JlIHVuYWJsZSB0byBmZXRjaCB0aGUga2V5IGZvciB0aGUgY3VycmVudCBrZXkgcGVyaW9kLlxuICAgKi9cbiAgTUlTU0lOR19EUk1fS0VZPSdNSVNTSU5HX0RSTV9LRVknLFxuICAvKipcbiAgICogVGhlIHNlZ21lbnRzIHdoaWNoIGNvbnRhaW4gc2xhdGUgY29udGVudCBhcmUgY29uc2lkZXJlZCB0byBiZSBtaXNzaW5nIGNvbnRlbnQuXG4gICAqL1xuICBTTEFURV9JTlBVVD0nU0xBVEVfSU5QVVQnLFxufVxuXG4vKipcbiAqIFNDVEUtMzUgbWVzc2FnZSB0eXBlIG9wdGlvbnMgYXZhaWxhYmxlLlxuICovXG5leHBvcnQgZW51bSBTY3RlTWVzc2FnZVR5cGUge1xuICAvKipcbiAgICogT3B0aW9uIGZvciBTUExJQ0VfSU5TRVJULlxuICAgKi9cbiAgU1BMSUNFX0lOU0VSVD0nU1BMSUNFX0lOU0VSVCcsXG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIEJSRUFLLlxuICAgKi9cbiAgQlJFQUs9J0JSRUFLJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgUFJPVklERVJfQURWRVJUSVNFTUVOVC5cbiAgICovXG4gIFBST1ZJREVSX0FEVkVSVElTRU1FTlQ9J1BST1ZJREVSX0FEVkVSVElTRU1FTlQnLFxuICAvKipcbiAgICogT3B0aW9uIGZvciBESVNUUklCVVRPUl9BRFZFUlRJU0VNRU5ULlxuICAgKi9cbiAgRElTVFJJQlVUT1JfQURWRVJUSVNFTUVOVD0nRElTVFJJQlVUT1JfQURWRVJUSVNFTUVOVCcsXG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIFBST1ZJREVSX1BMQUNFTUVOVF9PUFBPUlRVTklUWS5cbiAgICovXG4gIFBST1ZJREVSX1BMQUNFTUVOVF9PUFBPUlRVTklUWT0nUFJPVklERVJfUExBQ0VNRU5UX09QUE9SVFVOSVRZJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgRElTVFJJQlVUT1JfUExBQ0VNRU5UX09QUE9SVFVOSVRZLlxuICAgKi9cbiAgRElTVFJJQlVUT1JfUExBQ0VNRU5UX09QUE9SVFVOSVRZPSdESVNUUklCVVRPUl9QTEFDRU1FTlRfT1BQT1JUVU5JVFknLFxuICAvKipcbiAgICogT3B0aW9uIGZvciBQUk9WSURFUl9PVkVSTEFZX1BMQUNFTUVOVF9PUFBPUlRVTklUWS5cbiAgICovXG4gIFBST1ZJREVSX09WRVJMQVlfUExBQ0VNRU5UX09QUE9SVFVOSVRZPSdQUk9WSURFUl9PVkVSTEFZX1BMQUNFTUVOVF9PUFBPUlRVTklUWScsXG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIERJU1RSSUJVVE9SX09WRVJMQVlfUExBQ0VNRU5UX09QUE9SVFVOSVRZLlxuICAgKi9cbiAgRElTVFJJQlVUT1JfT1ZFUkxBWV9QTEFDRU1FTlRfT1BQT1JUVU5JVFk9J0RJU1RSSUJVVE9SX09WRVJMQVlfUExBQ0VNRU5UX09QUE9SVFVOSVRZJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgUFJPR1JBTS5cbiAgICovXG4gIFBST0dSQU09J1BST0dSQU0nLFxufVxuXG4vKipcbiAqIENvbnRyb2xzIHdoZXRoZXIgU0NURS0zNSBtZXNzYWdlcyBhcmUgaW5jbHVkZWQgaW4gc2VnbWVudCBmaWxlcy5cbiAqL1xuZXhwb3J0IGVudW0gU2N0ZUluU2VnbWVudHMge1xuICAvKipcbiAgICogU0NURS0zNSBtZXNzYWdlcyBhcmUgbm90IGluY2x1ZGVkIGluIHNlZ21lbnRzLlxuICAgKi9cbiAgTk9ORSA9ICdOT05FJyxcbiAgLyoqXG4gICAqIFNDVEUtMzUgbWVzc2FnZXMgYXJlIGVtYmVkZGVkIGluIHNlZ21lbnQgZGF0YS5cbiAgICpcbiAgICogRm9yIERBU0ggbWFuaWZlc3RzLCB3aGVuIHNldCB0byBBTEwsIGFuIEluYmFuZEV2ZW50U3RyZWFtIHRhZyBzaWduYWxzXG4gICAqIHRoYXQgU0NURSBtZXNzYWdlcyBhcmUgcHJlc2VudCBpbiBzZWdtZW50cy5cbiAgICovXG4gIEFMTCA9ICdBTEwnLFxufVxuXG4vKipcbiAqIE9yaWdpbiBFbmRwb2ludCBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJT3JpZ2luRW5kcG9pbnQgZXh0ZW5kcyBJUmVzb3VyY2UsIElPcmlnaW5FbmRwb2ludFJlZiB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY2hhbm5lbCBncm91cCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbiBlbmRwb2ludCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBjaGFubmVsR3JvdXBOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjaGFubmVsIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGNoYW5uZWxOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBvcmlnaW4gZW5kcG9pbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW4gZW5kcG9pbnQgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luRW5kcG9pbnROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgb3JpZ2luIGVuZHBvaW50LlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5FbmRwb2ludEFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB0aGUgb3JpZ2luIGVuZHBvaW50IHdhcyBjcmVhdGVkLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBjcmVhdGVkQXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRlIGFuZCB0aW1lIHRoZSBvcmlnaW4gZW5kcG9pbnQgd2FzIG1vZGlmaWVkLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBtb2RpZmllZEF0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSExTIG1hbmlmZXN0IFVSTHMgZm9yIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGhsc01hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgTG93IExhdGVuY3kgSExTIG1hbmlmZXN0IFVSTHMgZm9yIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGxvd0xhdGVuY3lIbHNNYW5pZmVzdFVybHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIERBU0ggbWFuaWZlc3QgVVJMcyBmb3IgdGhlIG9yaWdpbiBlbmRwb2ludC5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZGFzaE1hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgTVNTIG1hbmlmZXN0IFVSTHMgZm9yIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IG1zc01hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgb3JpZ2luIGVuZHBvaW50IHBvbGljeS5cbiAgICpcbiAgICogWW91IGNhbiBvbmx5IGFkZCAxIE9yaWdpbkVuZHBvaW50UG9saWN5IHRvIGFuIE9yaWdpbkVuZHBvaW50LlxuICAgKiBJZiB5b3UgaGF2ZSBhbHJlYWR5IGRlZmluZWQgb25lLCBpdCB3aWxsIGFwcGVuZCB0byB0aGUgcG9saWN5IGFscmVhZHkgY3JlYXRlZC5cbiAgICpcbiAgICogQHBhcmFtIHN0YXRlbWVudCAtIFRoZSBwb2xpY3kgc3RhdGVtZW50IHRvIGFkZFxuICAgKiBAcGFyYW0gY2RuQXV0aCAtIE9wdGlvbmFsIENETiBhdXRob3JpemF0aW9uIGNvbmZpZ3VyYXRpb24uIE9ubHkgdGhlIGZpcnN0IENETiBhdXRoIGNvbmZpZ3VyYXRpb24gaXMgdXNlZCBpZiBwcm92aWRlZCBtdWx0aXBsZSB0aW1lcy5cbiAgICovXG4gIGFkZFRvUmVzb3VyY2VQb2xpY3koc3RhdGVtZW50OiBQb2xpY3lTdGF0ZW1lbnQsIGNkbkF1dGg/OiBDZG5BdXRoQ29uZmlndXJhdGlvbik6IEFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIENsb3VkV2F0Y2ggbWV0cmljLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0cmljTmFtZSBuYW1lIG9mIHRoZSBtZXRyaWMuXG4gICAqIEBwYXJhbSBwcm9wcyBtZXRyaWMgb3B0aW9ucy5cbiAgICovXG4gIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJucyBNZXRyaWMgZm9yIEluZ3Jlc3MgQnl0ZXNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBtZXRyaWNJbmdyZXNzQnl0ZXMob3B0aW9ucz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgTWV0cmljIGZvciBFZ3Jlc3MgQnl0ZXNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBtZXRyaWNFZ3Jlc3NCeXRlcyhwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgTWV0cmljIGZvciBJbmdyZXNzIHJlc3BvbnNlIHRpbWVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBhdmVyYWdlIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgbWV0cmljSW5ncmVzc1Jlc3BvbnNlVGltZShwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgTWV0cmljIGZvciBFZ3Jlc3MgUmVzcG9uc2UgdGltZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGF2ZXJhZ2Ugb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBtZXRyaWNFZ3Jlc3NSZXNwb25zZVRpbWUocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIE1ldHJpYyBmb3IgRWdyZXNzIFJlcXVlc3QgQ291bnRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBtZXRyaWNFZ3Jlc3NSZXF1ZXN0Q291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIE1ldHJpYyBmb3IgSW5ncmVzcyBSZXF1ZXN0IENvdW50XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc3VtIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgbWV0cmljSW5ncmVzc1JlcXVlc3RDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG59XG5cbi8qKlxuICogRFJNIHNldHRpbmdzIGtleXMgZm9yIG1hbmlmZXN0IGZpbHRlciBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgZW51bSBEcm1TZXR0aW5nc0tleSB7XG4gIC8qKlxuICAgKiBFeGNsdWRlIEVYVC1YLVNFU1NJT04tS0VZIHRhZ3MgZnJvbSBITFMgYW5kIExMLUhMUyBtdWx0aXZhcmlhbnQgcGxheWxpc3RzLlxuICAgKlxuICAgKiBUaGlzIGNhbiBpbXByb3ZlIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgSExTIGNsaWVudHMgdGhhdCBoYXZlIGlzc3Vlc1xuICAgKiBwcm9jZXNzaW5nIHNlc3Npb24ga2V5cywgb3IgcHJvdmlkZSBtb3JlIGdyYW51bGFyIGFjY2VzcyBjb250cm9sIHdoZW5cbiAgICogdXNpbmcgbWFuaWZlc3QgZmlsdGVyaW5nLlxuICAgKi9cbiAgRVhDTFVERV9TRVNTSU9OX0tFWVMgPSAnZXhjbHVkZV9zZXNzaW9uX2tleXMnLFxufVxuXG4vKipcbiAqIEZpbHRlciBjb25maWd1cmF0aW9uIGluY2x1ZGVzIHNldHRpbmdzIGZvciBtYW5pZmVzdCBmaWx0ZXJpbmcsIHN0YXJ0IGFuZCBlbmQgdGltZXMsIGFuZCB0aW1lIGRlbGF5IHRoYXQgYXBwbHkgdG8gYWxsIG9mIHlvdXIgZWdyZXNzIHJlcXVlc3RzIGZvciB0aGlzIG1hbmlmZXN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogT3B0aW9uYWxseSBzcGVjaWZ5IHRoZSBjbGlwIHN0YXJ0IHRpbWUgZm9yIGFsbCBvZiB5b3VyIG1hbmlmZXN0IGVncmVzcyByZXF1ZXN0cy5cbiAgICogV2hlbiB5b3UgaW5jbHVkZSBjbGlwIHN0YXJ0IHRpbWUsIG5vdGUgdGhhdCB5b3UgY2Fubm90IHVzZSBjbGlwIHN0YXJ0IHRpbWUgcXVlcnkgcGFyYW1ldGVycyBmb3IgdGhpcyBtYW5pZmVzdCdzIGVuZHBvaW50IFVSTC5cbiAgICpcbiAgICogVGhpcyB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIFVUQyB0aW1lc3RhbXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gY2xpcCBzdGFydCB0aW1lXG4gICAqL1xuICByZWFkb25seSBjbGlwU3RhcnRUaW1lPzogRGF0ZTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgZW5kIHRpbWUgZm9yIGFsbCBvZiB5b3VyIG1hbmlmZXN0IGVncmVzcyByZXF1ZXN0cy5cbiAgICogV2hlbiB5b3UgaW5jbHVkZSBlbmQgdGltZSwgbm90ZSB0aGF0IHlvdSBjYW5ub3QgdXNlIGVuZCB0aW1lIHF1ZXJ5IHBhcmFtZXRlcnMgZm9yIHRoaXMgbWFuaWZlc3QncyBlbmRwb2ludCBVUkwuXG4gICAqXG4gICAqIFRoaXMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBVVEMgdGltZXN0YW1wLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGVuZCB0aW1lXG4gICAqL1xuICByZWFkb25seSBlbmQ/OiBEYXRlO1xuICAvKipcbiAgICogT3B0aW9uYWxseSBzcGVjaWZ5IHRoZSBzdGFydCB0aW1lIGZvciBhbGwgb2YgeW91ciBtYW5pZmVzdCBlZ3Jlc3MgcmVxdWVzdHMuXG4gICAqIFdoZW4geW91IGluY2x1ZGUgc3RhcnQgdGltZSwgbm90ZSB0aGF0IHlvdSBjYW5ub3QgdXNlIHN0YXJ0IHRpbWUgcXVlcnkgcGFyYW1ldGVycyBmb3IgdGhpcyBtYW5pZmVzdCdzIGVuZHBvaW50IFVSTC5cbiAgICpcbiAgICogVGhpcyB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIFVUQyB0aW1lc3RhbXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gc3RhcnQgdGltZVxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnQ/OiBEYXRlO1xuICAvKipcbiAgICogT3B0aW9uYWxseSBzcGVjaWZ5IG9uZSBvciBtb3JlIG1hbmlmZXN0IGZpbHRlcnMgZm9yIGFsbCBvZiB5b3VyIG1hbmlmZXN0IGVncmVzcyByZXF1ZXN0cy5cbiAgICogV2hlbiB5b3UgaW5jbHVkZSBhIG1hbmlmZXN0IGZpbHRlciwgbm90ZSB0aGF0IHlvdSBjYW5ub3QgdXNlIGFuIGlkZW50aWNhbCBtYW5pZmVzdCBmaWx0ZXIgcXVlcnkgcGFyYW1ldGVyIGZvciB0aGlzIG1hbmlmZXN0J3MgZW5kcG9pbnQgVVJMLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIG1hbmlmZXN0IGZpbHRlcnNcbiAgICovXG4gIHJlYWRvbmx5IG1hbmlmZXN0RmlsdGVyPzogTWFuaWZlc3RGaWx0ZXJbXTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgdGltZSBkZWxheSBmb3IgYWxsIG9mIHlvdXIgbWFuaWZlc3QgZWdyZXNzIHJlcXVlc3RzLiBFbnRlciBhIHZhbHVlIHRoYXQgaXMgc21hbGxlciB0aGFuIHlvdXIgZW5kcG9pbnQncyBzdGFydG92ZXIgd2luZG93LlxuICAgKiBXaGVuIHlvdSBpbmNsdWRlIHRpbWUgZGVsYXksIG5vdGUgdGhhdCB5b3UgY2Fubm90IHVzZSB0aW1lIGRlbGF5IHF1ZXJ5IHBhcmFtZXRlcnMgZm9yIHRoaXMgbWFuaWZlc3QncyBlbmRwb2ludCBVUkwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gdGltZSBkZWxheVxuICAgKi9cbiAgcmVhZG9ubHkgdGltZURlbGF5PzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBEUk0gc2V0dGluZ3MgZm9yIG1hbmlmZXN0IGVncmVzcyByZXF1ZXN0cy5cbiAgICpcbiAgICogV2hlbiB5b3UgaW5jbHVkZSBhIERSTSBzZXR0aW5nLCBub3RlIHRoYXQgeW91IGNhbm5vdCB1c2UgYW4gaWRlbnRpY2FsXG4gICAqIERSTSBzZXR0aW5nIHF1ZXJ5IHBhcmFtZXRlciBmb3IgdGhpcyBtYW5pZmVzdCdzIGVuZHBvaW50IFVSTC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBEUk0gc2V0dGluZ3NcbiAgICovXG4gIHJlYWRvbmx5IGRybVNldHRpbmdzPzogRHJtU2V0dGluZ3NLZXlbXTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb25maWd1cmluZyBhIFN0YXJ0VGFnLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0VGFnT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTcGVjaWZ5IHRoZSB2YWx1ZSBmb3IgUFJFQ0lTRSB3aXRoaW4geW91ciBFWFQtWC1TVEFSVCB0YWcuXG4gICAqXG4gICAqIExlYXZlIGJsYW5rLCBvciBjaG9vc2UgZmFsc2UsIHRvIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBOTy4gQ2hvb3NlIHRydWUgdG8gdXNlIHRoZSB2YWx1ZSBZRVMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBwcmVjaXNlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBIZWxwZXIgY2xhc3MgZm9yIGNyZWF0aW5nIEVYVC1YLVNUQVJUIHRhZ3MgaW4gSExTIHBsYXlsaXN0cy5cbiAqXG4gKiBUaGUgRVhULVgtU1RBUlQgdGFnIGluZGljYXRlcyBhIHByZWZlcnJlZCBwb2ludCBhdCB3aGljaCB0byBzdGFydCBwbGF5aW5nIGEgcGxheWxpc3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGFydFRhZyB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBzdGFydCB0YWcgd2l0aCBhIHRpbWUgb2Zmc2V0LlxuICAgKlxuICAgKiBAcGFyYW0gdGltZU9mZnNldCBUaGUgdGltZSBvZmZzZXQgaW4gc2Vjb25kcy4gQ2FuIGJlIHBvc2l0aXZlIChmb3J3YXJkIGZyb20gc3RhcnQpIG9yIG5lZ2F0aXZlIChiYWNrIGZyb20gbGl2ZSBlZGdlKS5cbiAgICogICAtIElmIHBvc2l0aXZlOiBtdXN0IGJlIGxlc3MgdGhhbiAobWFuaWZlc3QgZHVyYXRpb24gLSAzIMOXIHNlZ21lbnQgZHVyYXRpb24pXG4gICAqICAgLSBJZiBuZWdhdGl2ZTogYWJzb2x1dGUgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gKDMgw5cgc2VnbWVudCBkdXJhdGlvbikgYW5kIGxlc3MgdGhhbiBtYW5pZmVzdCBkdXJhdGlvblxuICAgKiBAcGFyYW0gb3B0aW9ucyBBZGRpdGlvbmFsIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb2YodGltZU9mZnNldDogbnVtYmVyLCBvcHRpb25zPzogU3RhcnRUYWdPcHRpb25zKTogU3RhcnRUYWcge1xuICAgIHJldHVybiB7XG4gICAgICB0aW1lT2Zmc2V0LFxuICAgICAgcHJlY2lzZTogb3B0aW9ucyAmJiBvcHRpb25zLnByZWNpc2UgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMucHJlY2lzZSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHN0YXJ0IHRhZyB3aXRoIHByZWNpc2UgcG9zaXRpb25pbmcgZW5hYmxlZCAoUFJFQ0lTRT1ZRVMpLlxuICAgKlxuICAgKiBAcGFyYW0gdGltZU9mZnNldCBUaGUgdGltZSBvZmZzZXQgaW4gc2Vjb25kcyAocG9zaXRpdmUgb3IgbmVnYXRpdmUpXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHdpdGhQcmVjaXNlKHRpbWVPZmZzZXQ6IG51bWJlcik6IFN0YXJ0VGFnIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGltZU9mZnNldCxcbiAgICAgIHByZWNpc2U6IHRydWUsXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIEVYVC1YLVNUQVJUIHRhZyBpbiBITFMgcGxheWxpc3RzLlxuICpcbiAqIFVzZSB0aGUgYFN0YXJ0VGFnYCBoZWxwZXIgY2xhc3MgdG8gY3JlYXRlIGluc3RhbmNlcyB3aXRoIHZhbGlkYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRUYWcge1xuICAvKipcbiAgICogU3BlY2lmeSB0aGUgdmFsdWUgZm9yIFBSRUNJU0Ugd2l0aGluIHlvdXIgRVhULVgtU1RBUlQgdGFnLlxuICAgKlxuICAgKiBMZWF2ZSBibGFuaywgb3IgY2hvb3NlIGZhbHNlLCB0byB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgTk8uIENob29zZSB0cnVlIHRvIHVzZSB0aGUgdmFsdWUgWUVTLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlY2lzZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTcGVjaWZ5IHRoZSB2YWx1ZSBmb3IgVElNRS1PRkZTRVQgd2l0aGluIHlvdXIgRVhULVgtU1RBUlQgdGFnLlxuICAgKlxuICAgKiBFbnRlciBhIHNpZ25lZCBmbG9hdGluZyBwb2ludCB2YWx1ZSB3aGljaCwgaWYgcG9zaXRpdmUsIG11c3QgYmUgbGVzcyB0aGFuIHRoZSBjb25maWd1cmVkXG4gICAqIG1hbmlmZXN0IGR1cmF0aW9uIG1pbnVzIHRocmVlIHRpbWVzIHRoZSBjb25maWd1cmVkIHNlZ21lbnQgdGFyZ2V0IGR1cmF0aW9uLiBJZiBuZWdhdGl2ZSxcbiAgICogdGhlIGFic29sdXRlIHZhbHVlIG11c3QgYmUgbGFyZ2VyIHRoYW4gdGhyZWUgdGltZXMgdGhlIGNvbmZpZ3VyZWQgc2VnbWVudCB0YXJnZXQgZHVyYXRpb24sXG4gICAqIGFuZCB0aGUgYWJzb2x1dGUgdmFsdWUgbXVzdCBiZSBzbWFsbGVyIHRoYW4gdGhlIGNvbmZpZ3VyZWQgbWFuaWZlc3QgZHVyYXRpb24uXG4gICAqL1xuICByZWFkb25seSB0aW1lT2Zmc2V0OiBudW1iZXI7XG59XG5cbi8qKlxuICogQmFzZSBtYW5pZmVzdCBjb25maWd1cmF0aW9uLlxuICovXG5pbnRlcmZhY2UgTWFuaWZlc3RDb25maWd1cmF0aW9uQmFzZSB7XG4gIC8qKlxuICAgKiBGaWx0ZXIgY29uZmlndXJhdGlvbiBpbmNsdWRlcyBzZXR0aW5ncyBmb3IgbWFuaWZlc3QgZmlsdGVyaW5nLCBzdGFydCBhbmQgZW5kIHRpbWVzLCBhbmQgdGltZSBkZWxheSB0aGF0IGFwcGx5IHRvIGFsbCBvZiB5b3VyIGVncmVzcyByZXF1ZXN0cyBmb3IgdGhpcyBtYW5pZmVzdC5cbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21lZGlhcGFja2FnZS9sYXRlc3QvdXNlcmd1aWRlL21hbmlmZXN0LWZpbHRlci1xdWVyeS1wYXJhbWV0ZXJzLmh0bWxcbiAgICogQGRlZmF1bHQgLSBObyBmaWx0ZXIgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZmlsdGVyQ29uZmlndXJhdGlvbj86IEZpbHRlckNvbmZpZ3VyYXRpb247XG4gIC8qKlxuICAgKiBUaGUgdG90YWwgZHVyYXRpb24gKGluIHNlY29uZHMpIG9mIHRoZSBtYW5pZmVzdCdzIGNvbnRlbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IDYwXG4gICAqL1xuICByZWFkb25seSBtYW5pZmVzdFdpbmRvdz86IER1cmF0aW9uO1xufVxuXG4vKipcbiAqIENob29zZSBob3cgYWQgbWFya2VycyBhcmUgaW5jbHVkZWQgaW4gdGhlIHBhY2thZ2VkIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBlbnVtIEFkTWFya2VyRGFzaCB7XG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIEJJTkFSWSAtIFRoZSBTQ1RFLTM1IG1hcmtlciBpcyBleHByZXNzZWQgYXMgYSBoZXgtc3RyaW5nIChCYXNlNjQgc3RyaW5nKSByYXRoZXIgdGhhbiBmdWxsIFhNTC5cbiAgICovXG4gIEJJTkFSWT0nQklOQVJZJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgWE1MIC0gVGhlIFNDVEUgbWFya2VyIGlzIGV4cHJlc3NlZCBmdWxseSBpbiBYTUwuXG4gICAqL1xuICBYTUw9J1hNTCcsXG59XG5cbi8qKlxuICogQ2hvb3NlIGhvdyBTQ1RFLTM1IGFkIG1hcmtlcnMgYXJlIGluY2x1ZGVkIGluIEhMUyBhbmQgTEwtSExTIG1hbmlmZXN0cy5cbiAqL1xuZXhwb3J0IGVudW0gQWRNYXJrZXJIbHMge1xuICAvKipcbiAgICogSW5zZXJ0IEVYVC1YLURBVEVSQU5HRSB0YWdzIHRvIHNpZ25hbCBhZCBjb250ZW50LlxuICAgKi9cbiAgREFURVJBTkdFID0gJ0RBVEVSQU5HRScsXG4gIC8qKlxuICAgKiBJbnNlcnQgZW5oYW5jZWQgU0NURS0zNSB0YWdzIGZvciBhZCBjb250ZW50LlxuICAgKi9cbiAgU0NURTM1X0VOSEFOQ0VEID0gJ1NDVEUzNV9FTkhBTkNFRCcsXG59XG5cbi8qKlxuICogVGhlIHR5cGUgb2YgdmFyaWFibGUgdGhhdCBNZWRpYVBhY2thZ2UgdXNlcyBpbiB0aGUgbWVkaWEgYXR0cmlidXRlIG9mIHRoZSBTZWdtZW50VGVtcGxhdGUgdGFnLlxuICovXG5leHBvcnQgZW51bSBTZWdtZW50VGVtcGxhdGVGb3JtYXQge1xuICAvKipcbiAgICogT3B0aW9uIGZvciBudW1iZXIgd2l0aCB0aW1lbGluZS5cbiAgICovXG4gIE5VTUJFUl9XSVRIX1RJTUVMSU5FPSdOVU1CRVJfV0lUSF9USU1FTElORScsXG59XG5cbi8qKlxuICogVGhlIFVUQyB0aW1pbmcgbW9kZSBmb3IgREFTSC5cbiAqL1xuZXhwb3J0IGVudW0gRGFzaFV0Y1RpbWluZ01vZGUge1xuICAvKipcbiAgICogT3B0aW9uIGZvciBIVFRQX0hFQUQuXG4gICAqL1xuICBIVFRQX0hFQUQ9J0hUVFBfSEVBRCcsXG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIEhUVFBfSVNPLlxuICAgKi9cbiAgSFRUUF9JU089J0hUVFBfSVNPJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgSFRUUF9YU0RBVEUuXG4gICAqL1xuICBIVFRQX1hTREFURT0nSFRUUF9YU0RBVEUnLFxuICAvKipcbiAgICogT3B0aW9uIGZvciBVVENfRElSRUNULlxuICAgKi9cbiAgVVRDX0RJUkVDVD0nVVRDX0RJUkVDVCcsXG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdHJpZ2dlcnMgd2hpY2ggY2F1c2UgQVdTIEVsZW1lbnRhbCBNZWRpYVBhY2thZ2UgdG8gY3JlYXRlIG1lZGlhIHByZXNlbnRhdGlvbiBkZXNjcmlwdGlvbiAoTVBEKSBwZXJpb2RzIGluIHRoZSBvdXRwdXQgbWFuaWZlc3QuXG4gKi9cbmV4cG9ydCBlbnVtIERhc2hQZXJpb2RUcmlnZ2VycyB7XG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIEFWQUlMUy5cbiAgICovXG4gIEFWQUlMUz0nQVZBSUxTJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgRFJNX0tFWV9ST1RBVElPTi5cbiAgICovXG4gIERSTV9LRVlfUk9UQVRJT049J0RSTV9LRVlfUk9UQVRJT04nLFxuICAvKipcbiAgICogT3B0aW9uIGZvciBTT1VSQ0VfQ0hBTkdFUy5cbiAgICovXG4gIFNPVVJDRV9DSEFOR0VTPSdTT1VSQ0VfQ0hBTkdFUycsXG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIFNPVVJDRV9ESVNSVVBUSU9OUy5cbiAgICovXG4gIFNPVVJDRV9ESVNSVVBUSU9OUz0nU09VUkNFX0RJU1JVUFRJT05TJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgTk9ORS5cbiAgICovXG4gIE5PTkU9J05PTkUnLFxufVxuXG4vKipcbiAqIERSTSBzaWduYWxpbmcgZGV0ZXJtaW5lcyB0aGUgd2F5IERBU0ggbWFuaWZlc3Qgc2lnbmFscyB0aGUgRFJNIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBlbnVtIERybVNpZ25hbGxpbmcge1xuICAvKipcbiAgICogT3B0aW9uIGZvciBJTkRJVklEVUFMLlxuICAgKi9cbiAgSU5ESVZJRFVBTD0nSU5ESVZJRFVBTCcsXG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIFJFRkVSRU5DRUQuXG4gICAqL1xuICBSRUZFUkVOQ0VEPSdSRUZFUkVOQ0VEJyxcbn1cblxuLyoqXG4gKiBTVEFOREFSRCBpbmRpY2F0ZXMgYSBkZWZhdWx0IG1hbmlmZXN0LCB3aGljaCBpcyBjb21wYWN0ZWQuIE5PTkUgaW5kaWNhdGVzIGEgZnVsbCBtYW5pZmVzdC5cbiAqL1xuZXhwb3J0IGVudW0gRGFzaE1hbmlmZXN0Q29tcGFjdG5lc3Mge1xuICAvKipcbiAgICogU1RBTkRBUkRcbiAgICovXG4gIFNUQU5EQVJEPSdTVEFOREFSRCcsXG4gIC8qKlxuICAgKiBOT05FXG4gICAqL1xuICBOT05FPSdOT05FJyxcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBVUkxzIHRvIHVzZSBmb3IgcmV0cmlldmluZyBzZWdtZW50cy4gWW91IGNhbiBzcGVjaWZ5IG11bHRpcGxlIGxvY2F0aW9ucyBhbmQgaW5kaWNhdGUgdGhlXG4gKiBwcmlvcml0eSBhbmQgd2VpZ2h0IGZvciB3aGVuIGVhY2ggc2hvdWxkIGJlIHVzZWQsIGZvciB1c2UgaW4gbXVsdGktQ0ROIHdvcmtmbG93cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXNoQmFzZVVybFByb3BlcnR5IHtcbiAgLyoqXG4gICAqIEZvciB1c2Ugd2l0aCBEVkItREFTSCBwcm9maWxlcyBvbmx5LiBUaGUgcHJpb3JpdHkgb2YgdGhpcyBsb2NhdGlvbiBmb3Igc2VydmluZyBzZWdtZW50cy4gVGhlIGxvd2VyIHRoZSBudW1iZXIsIHRoZSBoaWdoZXIgdGhlIHByaW9yaXR5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHByaW9yaXR5IHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgZHZiUHJpb3JpdHk/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBGb3IgdXNlIHdpdGggRFZCLURBU0ggcHJvZmlsZXMgb25seS4gVGhlIHdlaWdodGluZyBmb3Igc291cmNlIGxvY2F0aW9ucyB0aGF0IGhhdmUgdGhlIHNhbWUgcHJpb3JpdHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gd2VpZ2h0IHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgZHZiV2VpZ2h0PzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBsb2NhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBzZXJ2aWNlIGxvY2F0aW9uIHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZUxvY2F0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogQSBzb3VyY2UgbG9jYXRpb24gZm9yIHNlZ21lbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRm9yIHVzZSB3aXRoIERWQi1EQVNIIHByb2ZpbGVzIG9ubHkuIFRoZSBzZXR0aW5ncyBmb3IgZXJyb3IgcmVwb3J0aW5nIGZyb20gdGhlIHBsYXliYWNrIGRldmljZVxuICogdGhhdCB5b3Ugd2FudCBBV1MgRWxlbWVudGFsIE1lZGlhUGFja2FnZSB0byBwYXNzIHRocm91Z2ggdG8gdGhlIG1hbmlmZXN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhc2hEdmJNZXRyaWNzUmVwb3J0aW5nIHtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgcGxheWJhY2sgZGV2aWNlcyBwZXIgMTAwMCB0aGF0IHdpbGwgc2VuZCBlcnJvciByZXBvcnRzIHRvIHRoZSByZXBvcnRpbmcgVVJMLlxuICAgKiBUaGlzIHJlcHJlc2VudHMgdGhlIHByb2JhYmlsaXR5IHRoYXQgYSBwbGF5YmFjayBkZXZpY2Ugd2lsbCBiZSBhIHJlcG9ydGluZyBwbGF5ZXIgZm9yIHRoaXMgc2Vzc2lvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwcm9iYWJpbGl0eSBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHByb2JhYmlsaXR5PzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIFVSTCB3aGVyZSBwbGF5YmFjayBkZXZpY2VzIHNlbmQgZXJyb3IgcmVwb3J0cy5cbiAgICovXG4gIHJlYWRvbmx5IHJlcG9ydGluZ1VybDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEZvciB1c2Ugd2l0aCBEVkItREFTSCBwcm9maWxlcyBvbmx5LiBUaGUgc2V0dGluZ3MgZm9yIGZvbnQgZG93bmxvYWRzIHRoYXQgeW91IHdhbnQgQVdTIEVsZW1lbnRhbCBNZWRpYVBhY2thZ2UgdG8gcGFzcyB0aHJvdWdoIHRvIHRoZSBtYW5pZmVzdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXNoRHZiRm9udERvd25sb2FkIHtcbiAgLyoqXG4gICAqIFRoZSBmb250RmFtaWx5IG5hbWUgZm9yIHN1YnRpdGxlcywgYXMgZGVzY3JpYmVkIGluIEVCVS1UVC1EIFN1YnRpdGxpbmcgRGlzdHJpYnV0aW9uIEZvcm1hdC5cbiAgICogQGV4dGVybmFsIGh0dHBzOi8vdGVjaC5lYnUuY2gvcHVibGljYXRpb25zL3RlY2gzMzgwXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZm9udCBmYW1pbHkgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSBmb250RmFtaWx5Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG1pbWVUeXBlIG9mIHRoZSByZXNvdXJjZSB0aGF0J3MgYXQgdGhlIGZvbnQgZG93bmxvYWQgVVJMLlxuICAgKiBGb3IgaW5mb3JtYXRpb24gYWJvdXQgZm9udCBNSU1FIHR5cGVzLCBzZWUgdGhlIE1QRUctREFTSCBQcm9maWxlIGZvciBUcmFuc3BvcnQgb2YgSVNPIEJNRkYgQmFzZWQgRFZCIFNlcnZpY2VzIG92ZXIgSVAgQmFzZWQgTmV0d29ya3MgZG9jdW1lbnQuXG4gICAqXG4gICAqIEBleHRlcm5hbCBodHRwczovL2R2Yi5vcmcvd3AtY29udGVudC91cGxvYWRzLzIwMjEvMDYvQTE2OHI0X01QRUctREFTSC1Qcm9maWxlLWZvci1UcmFuc3BvcnQtb2YtSVNPLUJNRkYtQmFzZWQtRFZCLVNlcnZpY2VzX0RyYWZ0LXRzXzEwMy0yODUtdjE0MF9Ob3ZlbWJlcl8yMDIxLnBkZlxuICAgKiBAZGVmYXVsdCAtIE5vIE1JTUUgdHlwZSBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IG1pbWVUeXBlPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIFVSTCBmb3IgZG93bmxvYWRpbmcgZm9udHMgZm9yIHN1YnRpdGxlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBmb250IGRvd25sb2FkIFVSTCBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHVybD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgZm9udCBkb3dubG9hZCBhbmQgZXJyb3IgcmVwb3J0aW5nIGluZm9ybWF0aW9uIHRoYXQgeW91IHdhbnQgTWVkaWFQYWNrYWdlIHRvIHBhc3MgdGhyb3VnaCB0byB0aGUgbWFuaWZlc3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaER2YlNldHRpbmdzIHtcbiAgLyoqXG4gICAqIFBsYXliYWNrIGRldmljZSBlcnJvciByZXBvcnRpbmcgc2V0dGluZ3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZXJyb3IgbWV0cmljcyBjb25maWd1cmVkXG4gICAqL1xuICByZWFkb25seSBlcnJvck1ldHJpY3M/OiBEYXNoRHZiTWV0cmljc1JlcG9ydGluZ1tdO1xuICAvKipcbiAgICogU3VidGl0bGUgZm9udCBzZXR0aW5ncy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBmb250IGRvd25sb2FkIGNvbmZpZ3VyZWRcbiAgICovXG4gIHJlYWRvbmx5IGZvbnREb3dubG9hZD86IERhc2hEdmJGb250RG93bmxvYWQ7XG59XG5cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgY29udGVudCB0aGF0IHlvdSB3YW50IE1lZGlhUGFja2FnZSB0byBwYXNzIHRocm91Z2ggaW4gdGhlIG1hbmlmZXN0IHRvIHRoZSBwbGF5YmFjayBkZXZpY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaFByb2dyYW1JbmZvcm1hdGlvbiB7XG4gIC8qKlxuICAgKiBBIGNvcHlyaWdodCBzdGF0ZW1lbnQgYWJvdXQgdGhlIGNvbnRlbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gY29weXJpZ2h0IGluZm9ybWF0aW9uXG4gICAqL1xuICByZWFkb25seSBjb3B5cmlnaHQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbGFuZ3VhZ2UgY29kZSBmb3IgdGhpcyBtYW5pZmVzdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBsYW5ndWFnZSBjb2RlIHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgbGFuZ3VhZ2VDb2RlPzogc3RyaW5nO1xuICAvKipcbiAgICogQW4gYWJzb2x1dGUgVVJMIHRoYXQgY29udGFpbnMgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbnRlbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBVUkxcbiAgICovXG4gIHJlYWRvbmx5IG1vcmVJbmZvcm1hdGlvblVybD86IHN0cmluZztcbiAgLyoqXG4gICAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250ZW50IHByb3ZpZGVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHNvdXJjZSBpbmZvcm1hdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRpdGxlIGZvciB0aGUgbWFuaWZlc3QuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gdGl0bGUgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBUVE1MIFByb2ZpbGVcbiAqL1xuZXhwb3J0IGVudW0gVHRtbFByb2ZpbGUge1xuICAvKipcbiAgICogSU1TQ18xXG4gICAqL1xuICBJTVNDXzE9J0lNU0NfMScsXG4gIC8qKlxuICAgKiBFQlVfVFRfRF8xMDFcbiAgICovXG4gIEVCVV9UVF9EXzEwMT0nRUJVX1RUX0RfMTAxJyxcbn1cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgVFRNTCBzdWJ0aXRsZXMgaW4gREFTSCBtYW5pZmVzdHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaFR0bWxDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBwcm9maWxlIHRoYXQgTWVkaWFQYWNrYWdlIHVzZXMgd2hlbiBzaWduYWxpbmcgc3VidGl0bGVzIGluIHRoZSBtYW5pZmVzdC4gSU1TQyBpcyB0aGUgZGVmYXVsdCBwcm9maWxlLiBFQlUtVFQtRCBwcm9kdWNlcyBzdWJ0aXRsZXMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGggdGhlIEVCVS1UVC1EIFRUTUwgcHJvZmlsZS4gTWVkaWFQYWNrYWdlIHBhc3NlcyB0aHJvdWdoIHN1YnRpdGxlIHN0eWxlcyB0byB0aGUgbWFuaWZlc3QuXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IEVCVS1UVC1EIHN1YnRpdGxlcywgc2VlIEVCVS1UVC1EIFN1YnRpdGxpbmcgRGlzdHJpYnV0aW9uIEZvcm1hdC5cbiAgICpcbiAgICogQGV4dGVybmFsIGh0dHBzOi8vdGVjaC5lYnUuY2gvcHVibGljYXRpb25zL3RlY2gzMzgwXG4gICAqL1xuICByZWFkb25seSB0dG1sUHJvZmlsZTogVHRtbFByb2ZpbGU7XG5cbn1cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3Igc3VidGl0bGVzIGluIERBU0ggbWFuaWZlc3RzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhc2hTdWJ0aXRsZUNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogU2V0dGluZ3MgZm9yIFRUTUwgc3VidGl0bGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIFRUTUwgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgdHRtbENvbmZpZ3VyYXRpb24/OiBEYXNoVHRtbENvbmZpZ3VyYXRpb247XG59XG5cbi8qKlxuICogVGhlIGxheW91dCBvZiB0aGUgTVNTIG1hbmlmZXN0LlxuICovXG5leHBvcnQgZW51bSBNc3NNYW5pZmVzdExheW91dCB7XG4gIC8qKlxuICAgKiBGdWxsIG1hbmlmZXN0IGxheW91dC5cbiAgICovXG4gIEZVTEwgPSAnRlVMTCcsXG4gIC8qKlxuICAgKiBDb21wYWN0IG1hbmlmZXN0IGxheW91dC5cbiAgICovXG4gIENPTVBBQ1QgPSAnQ09NUEFDVCcsXG59XG5cbi8qKlxuICogVGhlIE1TUyBtYW5pZmVzdCBjb25maWd1cmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luIGVuZHBvaW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1zc01hbmlmZXN0Q29uZmlndXJhdGlvbiBleHRlbmRzIE1hbmlmZXN0Q29uZmlndXJhdGlvbkJhc2Uge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIG1hbmlmZXN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgTVNTIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBtYW5pZmVzdE5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBsYXlvdXQgb2YgdGhlIE1TUyBtYW5pZmVzdC5cbiAgICpcbiAgICogQGRlZmF1bHQgTXNzTWFuaWZlc3RMYXlvdXQuRlVMTFxuICAgKi9cbiAgcmVhZG9ubHkgbWFuaWZlc3RMYXlvdXQ/OiBNc3NNYW5pZmVzdExheW91dDtcbn1cblxuLyoqXG4gKiBUaGUgREFTSCBtYW5pZmVzdCBjb25maWd1cmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luIGVuZHBvaW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhc2hNYW5pZmVzdENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBNYW5pZmVzdENvbmZpZ3VyYXRpb25CYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBiYXNlIFVSTHMgdG8gdXNlIGZvciByZXRyaWV2aW5nIHNlZ21lbnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGJhc2UgVVJMcyBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IGJhc2VVcmxzPzogRGFzaEJhc2VVcmxQcm9wZXJ0eVtdO1xuICAvKipcbiAgICogVGhlIGxheW91dCBvZiB0aGUgREFTSCBtYW5pZmVzdCB0aGF0IE1lZGlhUGFja2FnZSBwcm9kdWNlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgRGFzaE1hbmlmZXN0Q29tcGFjdG5lc3MuU1RBTkRBUkRcbiAgICovXG4gIHJlYWRvbmx5IGNvbXBhY3RuZXNzPzogRGFzaE1hbmlmZXN0Q29tcGFjdG5lc3M7XG4gIC8qKlxuICAgKiBGb3IgZW5kcG9pbnRzIHRoYXQgdXNlIHRoZSBEVkItREFTSCBwcm9maWxlIG9ubHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gRFZCIHNldHRpbmdzXG4gICAqL1xuICByZWFkb25seSBkdmJTZXR0aW5ncz86IERhc2hEdmJTZXR0aW5ncztcbiAgLyoqXG4gICAqIFRoZSBwcm9maWxlIHRoYXQgdGhlIG91dHB1dCBpcyBjb21wbGlhbnQgd2l0aC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwcm9maWxlcyBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHByb2ZpbGVzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBEZXRhaWxzIGFib3V0IHRoZSBjb250ZW50IHRoYXQgeW91IHdhbnQgTWVkaWFQYWNrYWdlIHRvIHBhc3MgdGhyb3VnaCBpbiB0aGUgbWFuaWZlc3QgdG8gdGhlIHBsYXliYWNrIGRldmljZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwcm9ncmFtIGluZm9ybWF0aW9uXG4gICAqL1xuICByZWFkb25seSBwcm9ncmFtSW5mb3JtYXRpb24/OiBEYXNoUHJvZ3JhbUluZm9ybWF0aW9uO1xuICAvKipcbiAgICogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIERBU0ggc3VidGl0bGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHN1YnRpdGxlIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHN1YnRpdGxlQ29uZmlndXJhdGlvbj86IERhc2hTdWJ0aXRsZUNvbmZpZ3VyYXRpb247XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbWFuaWZlc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBEQVNIIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBtYW5pZmVzdE5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIERSTSBzaWduYWxpbmcgZGV0ZXJtaW5lcyB0aGUgd2F5IERBU0ggbWFuaWZlc3Qgc2lnbmFscyB0aGUgRFJNIGNvbnRlbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gRFJNIHNpZ25hbGluZyBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IGRybVNpZ25hbGxpbmc/OiBEcm1TaWduYWxsaW5nO1xuICAvKipcbiAgICogVGhlIG1pbmltdW0gYW1vdW50IG9mIGNvbnRlbnQgdGhhdCB0aGUgcGxheWVyIG11c3Qga2VlcCBhdmFpbGFibGUgaW4gdGhlIGJ1ZmZlci5cbiAgICpcbiAgICogQGRlZmF1bHQgNVxuICAgKi9cbiAgcmVhZG9ubHkgbWluQnVmZmVyVGltZT86IER1cmF0aW9uO1xuICAvKipcbiAgICogVGhlIG1pbmltdW0gYW1vdW50IG9mIHRpbWUgZm9yIHRoZSBwbGF5ZXIgdG8gd2FpdCBiZWZvcmUgcmVxdWVzdGluZyBhbiB1cGRhdGVkIG1hbmlmZXN0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAyXG4gICAqL1xuICByZWFkb25seSBtaW5VcGRhdGVQZXJpb2Q/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hhdCB0cmlnZ2VycyBjYXVzZSBBV1MgRWxlbWVudGFsIE1lZGlhUGFja2FnZSB0byBjcmVhdGUgbWVkaWEgcHJlc2VudGF0aW9uIGRlc2NyaXB0aW9uIChNUEQpIHBlcmlvZHMgaW4gdGhlIG91dHB1dCBtYW5pZmVzdC5cbiAgICpcbiAgICogQGRlZmF1bHQgW0Rhc2hQZXJpb2RUcmlnZ2Vycy5BVkFJTFMsIERhc2hQZXJpb2RUcmlnZ2Vycy5EUk1fS0VZX1JPVEFUSU9OLCBEYXNoUGVyaW9kVHJpZ2dlcnMuU09VUkNFX0NIQU5HRVMsIERhc2hQZXJpb2RUcmlnZ2Vycy5TT1VSQ0VfRElTUlVQVElPTlNdXG4gICAqL1xuICByZWFkb25seSBwZXJpb2RUcmlnZ2Vycz86IERhc2hQZXJpb2RUcmlnZ2Vyc1tdO1xuICAvKipcbiAgICogQ2hvb3NlIGhvdyBhZCBtYXJrZXJzIGFyZSBpbmNsdWRlZCBpbiB0aGUgcGFja2FnZWQgY29udGVudC4gSWYgeW91IGluY2x1ZGUgYWQgbWFya2VycyBpbiB0aGUgY29udGVudCBzdHJlYW0gaW4geW91ciB1cHN0cmVhbSBlbmNvZGVycyxcbiAgICogdGhlbiB5b3UgbmVlZCB0byBpbmZvcm0gTWVkaWFQYWNrYWdlIHdoYXQgdG8gZG8gd2l0aCB0aGUgYWQgbWFya2VycyBpbiB0aGUgb3V0cHV0LlxuICAgKlxuICAgKiBUbyBjaG9vc2UgdGhpcyBvcHRpb24gU1RDRSBmaWx0ZXJpbmcgbmVlZHMgdG8gYmUgZW5hYmxlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgQWRNYXJrZXJEYXNoLlhNTFxuICAgKi9cbiAgcmVhZG9ubHkgc2N0ZURhc2hBZE1hcmtlcj86IEFkTWFya2VyRGFzaDtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHZhcmlhYmxlIHRoYXQgTWVkaWFQYWNrYWdlIHVzZXMgaW4gdGhlIG1lZGlhIGF0dHJpYnV0ZSBvZiB0aGUgU2VnbWVudFRlbXBsYXRlIHRhZy5cbiAgICpcbiAgICogQGRlZmF1bHQgU2VnbWVudFRlbXBsYXRlRm9ybWF0Lk5VTUJFUl9XSVRIX1RJTUVMSU5FXG4gICAqL1xuICByZWFkb25seSBzZWdtZW50VGVtcGxhdGVGb3JtYXQ/OiBTZWdtZW50VGVtcGxhdGVGb3JtYXQ7XG4gIC8qKlxuICAgKiBUaGUgYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgcGxheWVyIHNob3VsZCBiZSBmcm9tIHRoZSBlbmQgb2YgdGhlIG1hbmlmZXN0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAxMFxuICAgKi9cbiAgcmVhZG9ubHkgc3VnZ2VzdGVkUHJlc2VudGF0aW9uRGVsYXk/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBVVEMgdGltaW5nIG1vZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IERhc2hVdGNUaW1pbmdNb2RlLlVUQ19ESVJFQ1RcbiAgICovXG4gIHJlYWRvbmx5IHV0Y1RpbWluZ01vZGU/OiBEYXNoVXRjVGltaW5nTW9kZTtcbiAgLyoqXG4gICAqIFRoZSBtZXRob2QgdGhhdCB0aGUgcGxheWVyIHVzZXMgdG8gc3luY2hyb25pemUgdG8gY29vcmRpbmF0ZWQgdW5pdmVyc2FsIHRpbWUgKFVUQykgd2FsbCBjbG9jayB0aW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWQgLSBObyB2YWx1ZSBpcyBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHV0Y1RpbWluZ1NvdXJjZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgSExTIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGxzTWFuaWZlc3RDb25maWd1cmF0aW9uIGV4dGVuZHMgTWFuaWZlc3RDb25maWd1cmF0aW9uQmFzZSB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbWFuaWZlc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBITFMgbWFuaWZlc3QgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IG1hbmlmZXN0TmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGNoaWxkIG1hbmlmZXN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgSExTIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gY2hpbGQgbWFuaWZlc3QgbmFtZSBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IGNoaWxkTWFuaWZlc3ROYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogSW5zZXJ0cyBFWFQtWC1QUk9HUkFNLURBVEUtVElNRSB0YWdzIGluIHRoZSBvdXRwdXQgbWFuaWZlc3QgYXQgdGhlIGludGVydmFsIHRoYXQgeW91IHNwZWNpZnkuXG4gICAqIElmIHlvdSBkb24ndCBlbnRlciBhbiBpbnRlcnZhbCwgRVhULVgtUFJPR1JBTS1EQVRFLVRJTUUgdGFncyBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlIG1hbmlmZXN0LlxuICAgKiBUaGUgdGFncyBzeW5jIHRoZSBzdHJlYW0gdG8gdGhlIHdhbGwgY2xvY2sgc28gdGhhdCB2aWV3ZXJzIGNhbiBzZWVrIHRvIGEgc3BlY2lmaWMgdGltZSBpbiB0aGUgcGxheWJhY2sgdGltZWxpbmUgb24gdGhlIHBsYXllci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwcm9ncmFtIGRhdGUgdGltZSBpbnRlcnZhbFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvZ3JhbURhdGVUaW1lSW50ZXJ2YWw/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBTQ1RFLTM1IEhMUyBjb25maWd1cmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSExTIG1hbmlmZXN0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIG9yaWdpbiBlbmRwb2ludC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBTQ1RFIGFkIG1hcmtlciBjb25maWd1cmF0aW9uXG4gICAqL1xuICByZWFkb25seSBzY3RlQWRNYXJrZXJIbHM/OiBBZE1hcmtlckhscztcbiAgLyoqXG4gICAqIEluc2VydCBFWFQtWC1TVEFSVCB0YWcgaW4gdGhlIG1hbmlmZXN0IHdpdGggdGhlIGNvbmZpZ3VyZWQgc2V0dGluZ3NcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBzdGFydCB0YWdcbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0VGFnPzogU3RhcnRUYWc7XG4gIC8qKlxuICAgKiBXaGVuIGVuYWJsZWQsIE1lZGlhUGFja2FnZSBVUkwtZW5jb2RlcyB0aGUgcXVlcnkgc3RyaW5nIGZvciBBUEkgcmVxdWVzdHMgZm9yIEhMUyBjaGlsZCBtYW5pZmVzdHMgdG8gY29tcGx5IHdpdGggQVdTIFNpZ25hdHVyZSBWZXJzaW9uIDQgKFNpZ1Y0KSBzaWduYXR1cmUgc2lnbmluZyBwcm90b2NvbC5cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBBV1MgU2lnbmF0dXJlIFZlcnNpb24gNCBmb3IgQVBJIHJlcXVlc3RzIGluIEFXUyBJZGVudGl0eSBhbmQgQWNjZXNzIE1hbmFnZW1lbnQgVXNlciBHdWlkZS5cbiAgICpcbiAgICogQGV4dGVybmFsIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2Vfc2lndi5odG1sXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSB1cmxFbmNvZGVDaGlsZE1hbmlmZXN0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBTcGVjaWZ5IGEgbG93LWxhdGVuY3kgSFRUUCBsaXZlIHN0cmVhbWluZyAoTEwtSExTKSBtYW5pZmVzdCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvd0xhdGVuY3lIbHNNYW5pZmVzdENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBNYW5pZmVzdENvbmZpZ3VyYXRpb25CYXNlIHtcbiAgLyoqXG4gICAqIEEgc2hvcnQgc3RyaW5nIHRoYXQncyBhcHBlbmRlZCB0byB0aGUgZW5kcG9pbnQgVVJMLiBUaGUgbWFuaWZlc3QgbmFtZSBjcmVhdGVzIGEgdW5pcXVlIHBhdGggdG8gdGhpcyBlbmRwb2ludC5cbiAgICogSWYgeW91IGRvbid0IGVudGVyIGEgdmFsdWUsIE1lZGlhUGFja2FnZSB1c2VzIHRoZSBkZWZhdWx0IG1hbmlmZXN0IG5hbWUsIGluZGV4LiBNZWRpYVBhY2thZ2UgYXV0b21hdGljYWxseSBpbnNlcnRzIHRoZSBmb3JtYXQgZXh0ZW5zaW9uLCBzdWNoIGFzIC5tM3U4LlxuICAgKiBZb3UgY2FuJ3QgdXNlIHRoZSBzYW1lIG1hbmlmZXN0IG5hbWUgaWYgeW91IHVzZSBITFMgbWFuaWZlc3QgYW5kIGxvdy1sYXRlbmN5IEhMUyBtYW5pZmVzdC5cbiAgICogVGhlIG1hbmlmZXN0TmFtZSBvbiB0aGUgSExTTWFuaWZlc3Qgb2JqZWN0IG92ZXJyaWRlcyB0aGUgbWFuaWZlc3ROYW1lIHlvdSBwcm92aWRlZCBvbiB0aGUgb3JpZ2luRW5kcG9pbnQgb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgbWFuaWZlc3ROYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY2hpbGQgbWFuaWZlc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBsb3ctbGF0ZW5jeSBITFMgKExMLUhMUykgbWFuaWZlc3QgY29uZmlndXJhdGlvbiBvZiB0aGUgb3JpZ2luIGVuZHBvaW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIGNoaWxkIG1hbmlmZXN0IG5hbWUgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSBjaGlsZE1hbmlmZXN0TmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIEluc2VydHMgRVhULVgtUFJPR1JBTS1EQVRFLVRJTUUgdGFncyBpbiB0aGUgb3V0cHV0IG1hbmlmZXN0IGF0IHRoZSBpbnRlcnZhbCB0aGF0IHlvdSBzcGVjaWZ5LlxuICAgKiBJZiB5b3UgZG9uJ3QgZW50ZXIgYW4gaW50ZXJ2YWwsIEVYVC1YLVBST0dSQU0tREFURS1USU1FIHRhZ3MgYXJlbid0IGluY2x1ZGVkIGluIHRoZSBtYW5pZmVzdC5cbiAgICogVGhlIHRhZ3Mgc3luYyB0aGUgc3RyZWFtIHRvIHRoZSB3YWxsIGNsb2NrIHNvIHRoYXQgdmlld2VycyBjYW4gc2VlayB0byBhIHNwZWNpZmljIHRpbWUgaW4gdGhlIHBsYXliYWNrIHRpbWVsaW5lIG9uIHRoZSBwbGF5ZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gcHJvZ3JhbSBkYXRlIHRpbWUgaW50ZXJ2YWxcbiAgICovXG4gIHJlYWRvbmx5IHByb2dyYW1EYXRlVGltZUludGVydmFsPzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBUaGUgU0NURS0zNSBITFMgY29uZmlndXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGxvdy1sYXRlbmN5IEhMUyAoTEwtSExTKSBtYW5pZmVzdCBjb25maWd1cmF0aW9uIG9mIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gU0NURSBhZCBtYXJrZXIgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgc2N0ZUFkTWFya2VySGxzPzogQWRNYXJrZXJIbHM7XG4gIC8qKlxuICAgKiBJbnNlcnQgRVhULVgtU1RBUlQgdGFnIGluIHRoZSBtYW5pZmVzdCB3aXRoIHRoZSBjb25maWd1cmVkIHNldHRpbmdzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gc3RhcnQgdGFnXG4gICAqL1xuICByZWFkb25seSBzdGFydFRhZz86IFN0YXJ0VGFnO1xuICAvKipcbiAgICogV2hlbiBlbmFibGVkLCBNZWRpYVBhY2thZ2UgVVJMLWVuY29kZXMgdGhlIHF1ZXJ5IHN0cmluZyBmb3IgQVBJIHJlcXVlc3RzIGZvciBMTC1ITFMgY2hpbGQgbWFuaWZlc3RzIHRvIGNvbXBseSB3aXRoIEFXUyBTaWduYXR1cmUgVmVyc2lvbiA0IChTaWdWNCkgc2lnbmF0dXJlIHNpZ25pbmcgcHJvdG9jb2wuXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgQVdTIFNpZ25hdHVyZSBWZXJzaW9uIDQgZm9yIEFQSSByZXF1ZXN0cyBpbiBBV1MgSWRlbnRpdHkgYW5kIEFjY2VzcyBNYW5hZ2VtZW50IFVzZXIgR3VpZGUuXG4gICAqXG4gICAqIEBleHRlcm5hbCBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3NpZ3YuaHRtbFxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgdXJsRW5jb2RlQ2hpbGRNYW5pZmVzdD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciBhbiBBV1MgRWxlbWVudGFsIE1lZGlhUGFja2FnZSBWMiBPcmlnaW4gRW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3JpZ2luRW5kcG9pbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBvcmlnaW4gZW5kcG9pbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW4gZW5kcG9pbnQgY29uZmlndXJhdGlvbi5cbiAgICogQGRlZmF1bHQgYXV0b2dlbmVyYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luRW5kcG9pbnROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZCAtIE5vIGRlc2NyaXB0aW9uIGlzIGFkZGVkIHRvIE9yaWdpbiBFbmRwb2ludFxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0YWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luIGVuZHBvaW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHRhZ2dpbmdcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBNYW5pZmVzdHMgY29uZmlndXJhdGlvbiBmb3IgSExTLCBMb3cgTGF0ZW5jeSBITFMgYW5kIERBU0guXG4gICAqL1xuICByZWFkb25seSBtYW5pZmVzdHM6IE1hbmlmZXN0W107XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoZSB3aW5kb3cgdG8gc3BlY2lmeSBhIHdpbmRvdyBvZiB0aGUgbGl2ZSBzdHJlYW0gdGhhdCdzIGF2YWlsYWJsZSBmb3Igb24tZGVtYW5kIHZpZXdpbmcuIFZpZXdlcnMgY2FuIHN0YXJ0LW92ZXIgb3IgY2F0Y2gtdXAgb24gY29udGVudCB0aGF0IGZhbGxzIHdpdGhpbiB0aGUgd2luZG93LlxuICAgKlxuICAgKiBAZGVmYXVsdCA5MDBcbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0b3ZlcldpbmRvdz86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VnbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbiBlbmRwb2ludC5cbiAgICpcbiAgICogSW5zaWRlIHRoZSBzZWdtZW50IGNvbmZpZ3VyYXRpb24geW91IGNhbiBkZWZpbmUgb3B0aW9ucyBzdWNoIGFzIGVuY3J5cHRpb24sIFNQRUtFIHBhcmFtZXRlcnMgYW5kIG90aGVyXG4gICAqIGdlbmVyYWwgc2VnbWVudCBjb25maWd1cmF0aW9ucy5cbiAgICpcbiAgICogVXNlIFNlZ21lbnQudHMoKSBvciBTZWdtZW50LmNtYWYoKSB0byBjcmVhdGUgdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBzZWdtZW50OiBTZWdtZW50Q29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIGZhaWxvdmVyIHNldHRpbmdzIGZvciB0aGUgZW5kcG9pbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZCAtIE5vIGZvcmNlIGVuZHBvaW50IGNvbmZpZ3VyYXRpb24gaXMgY29uZmlndXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgZm9yY2VFbmRwb2ludENvbmZpZ3VyYXRpb25Db25kaXRpb25zPzogRW5kcG9pbnRFcnJvckNvbmZpZ3VyYXRpb25bXTtcblxuICAvKipcbiAgICogUHJvdmlkZSBhY2Nlc3MgdG8gTWVkaWFQYWNrYWdlIFYyIE9yaWdpbiBFbmRwb2ludCB2aWEgc2VjcmV0IGhlYWRlci5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkIC0gTm90IGNvbmZpZ3VyZWQgb24gZW5kcG9pbnRcbiAgICovXG4gIHJlYWRvbmx5IGNkbkF1dGg/OiBDZG5BdXRoQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogUG9saWN5IHRvIGFwcGx5IHdoZW4gdGhlIG9yaWdpbiBlbmRwb2ludCBpcyByZW1vdmVkIGZyb20gdGhlIHN0YWNrXG4gICAqXG4gICAqIEV2ZW4gdGhvdWdoIE1lZGlhUGFja2FnZSBDaGFubmVsR3JvdXBzLCBDaGFubmVscyBhbmQgT3JpZ2luRW5kcG9pbnRzIGFyZSB0ZWNobmljYWxseSBzdGF0ZWZ1bCxcbiAgICogdGhlaXIgY29udGVudHMgYXJlIHRyYW5zaWVudCBhbmQgaXQgaXMgY29tbW9uIHRvIGFkZCBhbmQgcmVtb3ZlIHRoZXNlIHdoaWxlIHJlYXJjaGl0ZWN0aW5nIHlvdXIgYXBwbGljYXRpb24uXG4gICAqIFRoZSBkZWZhdWx0IGlzIHRoZXJlZm9yZSBgREVTVFJPWWAuIENoYW5nZSBpdCB0byBgUkVUQUlOYCBpZiB0aGUgY29udGVudCAoaW4gYSBsb29rYmFjayB3aW5kb3cpIGFyZSBzb1xuICAgKiB2YWx1YWJsZSB0aGF0IGFjY2lkZW50YWxseSBsb3NpbmcgaXQgd291bGQgYmUgdW5hY2NlcHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBSZW1vdmFsUG9saWN5LkRFU1RST1lcbiAgICovXG4gIHJlYWRvbmx5IHJlbW92YWxQb2xpY3k/OiBSZW1vdmFsUG9saWN5O1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgdG8gc2V0IG9uIGFuIE9yaWdpbiBFbmRwb2ludC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmlnaW5FbmRwb2ludFByb3BzIGV4dGVuZHMgT3JpZ2luRW5kcG9pbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBjaGFubmVsIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luIGVuZHBvaW50LlxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbm5lbDogSUNoYW5uZWw7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBPcmlnaW4gRW5kcG9pbnQgZGVmaW5lZCBvdXRzaWRlIG9mIHRoaXMgc3RhY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3JpZ2luRW5kcG9pbnRBdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIHRoYXQgZGVzY3JpYmVzIHRoZSBjaGFubmVsIGdyb3VwLiBUaGUgbmFtZSBpcyB0aGUgcHJpbWFyeSBpZGVudGlmaWVyIGZvciB0aGUgY2hhbm5lbCBncm91cC5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbm5lbEdyb3VwTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSB0aGF0IGRlc2NyaWJlcyB0aGUgY2hhbm5lbC4gVGhlIG5hbWUgaXMgdGhlIHByaW1hcnkgaWRlbnRpZmllciBmb3IgdGhlIGNoYW5uZWwuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGNoYW5uZWxOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIHRoYXQgZGVzY3JpYmVzIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbkVuZHBvaW50TmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIERSTSBzeXN0ZW1zIGF2YWlsYWJsZSBmb3IgQ01BRiBlbmNyeXB0aW9uLlxuICpcbiAqIENFTkMgc3VwcG9ydHMgUGxheVJlYWR5LCBXaWRldmluZSwgYW5kIElyZGV0by5cbiAqIENCQ1Mgc3VwcG9ydHMgUGxheVJlYWR5LCBXaWRldmluZSwgYW5kIEZhaXJQbGF5LlxuICovXG5leHBvcnQgZW51bSBDbWFmRHJtU3lzdGVtIHtcbiAgLyoqXG4gICAqIEZhaXJQbGF5IERSTSAtIHVzZWQgd2l0aCBDQkNTIGVuY3J5cHRpb24uXG4gICAqL1xuICBGQUlSUExBWSA9ICdGQUlSUExBWScsXG4gIC8qKlxuICAgKiBQbGF5UmVhZHkgRFJNIC0gdXNlZCB3aXRoIENFTkMgYW5kIENCQ1MgZW5jcnlwdGlvbi5cbiAgICovXG4gIFBMQVlSRUFEWSA9ICdQTEFZUkVBRFknLFxuICAvKipcbiAgICogV2lkZXZpbmUgRFJNIC0gdXNlZCB3aXRoIENFTkMgYW5kIENCQ1MgZW5jcnlwdGlvbi5cbiAgICovXG4gIFdJREVWSU5FID0gJ1dJREVWSU5FJyxcbiAgLyoqXG4gICAqIElyZGV0byBEUk0gLSB1c2VkIHdpdGggQ0VOQyBlbmNyeXB0aW9uLlxuICAgKi9cbiAgSVJERVRPID0gJ0lSREVUTycsXG59XG5cbi8qKlxuICogRFJNIHN5c3RlbXMgYXZhaWxhYmxlIGZvciBUUyBlbmNyeXB0aW9uLlxuICpcbiAqIFNBTVBMRV9BRVMgdXNlcyBGYWlyUGxheSwgQUVTXzEyOCB1c2VzIENsZWFyIEtleSBBRVMgMTI4LlxuICovXG5leHBvcnQgZW51bSBUc0RybVN5c3RlbSB7XG4gIC8qKlxuICAgKiBGYWlyUGxheSBEUk0gLSB1c2VkIHdpdGggU0FNUExFX0FFUyBlbmNyeXB0aW9uLlxuICAgKi9cbiAgRkFJUlBMQVkgPSAnRkFJUlBMQVknLFxuICAvKipcbiAgICogQ2xlYXIgS2V5IEFFUyAxMjggLSB1c2VkIHdpdGggQUVTXzEyOCBlbmNyeXB0aW9uLlxuICAgKi9cbiAgQ0xFQVJfS0VZX0FFU18xMjggPSAnQ0xFQVJfS0VZX0FFU18xMjgnLFxufVxuXG4vKipcbiAqIERSTSBzeXN0ZW1zIGF2YWlsYWJsZSBmb3IgSVNNIGVuY3J5cHRpb24uXG4gKlxuICogSVNNIG9ubHkgc3VwcG9ydHMgUGxheVJlYWR5IHdpdGggQ0VOQy5cbiAqL1xuZXhwb3J0IGVudW0gSXNtRHJtU3lzdGVtIHtcbiAgLyoqXG4gICAqIFBsYXlSZWFkeSBEUk0uXG4gICAqL1xuICBQTEFZUkVBRFkgPSAnUExBWVJFQURZJyxcbn1cblxuLyoqXG4gKiBCYXNlIHByb3BlcnRpZXMgY29tbW9uIHRvIGFsbCBTUEVLRSBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb25zLlxuICovXG5pbnRlcmZhY2UgU3Bla2VFbmNyeXB0aW9uUHJvcHNCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNvbnRlbnQuXG4gICAqXG4gICAqIFRoZSBzZXJ2aWNlIHNlbmRzIHRoaXMgaWRlbnRpZmllciB0byB0aGUga2V5IHNlcnZlciB0byBpZGVudGlmeSB0aGUgY3VycmVudCBlbmRwb2ludC5cbiAgICogSG93IHVuaXF1ZSB5b3UgbWFrZSB0aGlzIGlkZW50aWZpZXIgZGVwZW5kcyBvbiBob3cgZmluZS1ncmFpbmVkIHlvdSB3YW50IGFjY2VzcyBjb250cm9scyB0byBiZS5cbiAgICogVGhlIHNlcnZpY2UgZG9lcyBub3QgcGVybWl0IHlvdSB0byB1c2UgdGhlIHNhbWUgSUQgZm9yIHR3byBzaW11bHRhbmVvdXMgZW5jcnlwdGlvbiBwcm9jZXNzZXMuXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElBTSByb2xlIGZvciBhY2Nlc3NpbmcgdGhlIGtleSBwcm92aWRlciBBUEkuXG4gICAqXG4gICAqIFRoaXMgcm9sZSBtdXN0IGhhdmUgYSB0cnVzdCBwb2xpY3kgdGhhdCBhbGxvd3MgTWVkaWFQYWNrYWdlIHRvIGFzc3VtZSB0aGUgcm9sZSxcbiAgICogYW5kIGl0IG11c3QgaGF2ZSBzdWZmaWNpZW50IHBlcm1pc3Npb25zIHRvIGFjY2VzcyB0aGUga2V5IHJldHJpZXZhbCBVUkwuXG4gICAqL1xuICByZWFkb25seSByb2xlOiBJUm9sZTtcblxuICAvKipcbiAgICogVVJMIG9mIHRoZSBTUEVLRSBrZXkgcHJvdmlkZXIuXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgY2VydGlmaWNhdGUgdGhhdCB5b3UgaW1wb3J0ZWQgdG8gQVdTIENlcnRpZmljYXRlIE1hbmFnZXJcbiAgICogdG8gYWRkIGNvbnRlbnQga2V5IGVuY3J5cHRpb24gdG8gdGhpcyBlbmRwb2ludC5cbiAgICpcbiAgICogRm9yIHRoaXMgZmVhdHVyZSB0byB3b3JrLCB5b3VyIERSTSBrZXkgcHJvdmlkZXIgbXVzdCBzdXBwb3J0IGNvbnRlbnQga2V5IGVuY3J5cHRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY29udGVudCBrZXkgZW5jcnlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgY2VydGlmaWNhdGU/OiBJQ2VydGlmaWNhdGU7XG5cbiAgLyoqXG4gICAqIEF1ZGlvIGVuY3J5cHRpb24gcHJlc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBQcmVzZXRTcGVrZTIwQXVkaW8uUFJFU0VUX0FVRElPXzFcbiAgICovXG4gIHJlYWRvbmx5IGF1ZGlvUHJlc2V0PzogUHJlc2V0U3Bla2UyMEF1ZGlvO1xuXG4gIC8qKlxuICAgKiBWaWRlbyBlbmNyeXB0aW9uIHByZXNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgUHJlc2V0U3Bla2UyMFZpZGVvLlBSRVNFVF9WSURFT18xXG4gICAqL1xuICByZWFkb25seSB2aWRlb1ByZXNldD86IFByZXNldFNwZWtlMjBWaWRlbztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBDTUFGIFNQRUtFIGVuY3J5cHRpb24gY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbWFmU3Bla2VFbmNyeXB0aW9uUHJvcHMgZXh0ZW5kcyBTcGVrZUVuY3J5cHRpb25Qcm9wc0Jhc2Uge1xuICAvKipcbiAgICogVGhlIGVuY3J5cHRpb24gbWV0aG9kIHRvIHVzZS5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGhvZDogQ21hZkVuY3J5cHRpb25NZXRob2Q7XG5cbiAgLyoqXG4gICAqIFRoZSBEUk0gc3lzdGVtcyB0byB1c2UgZm9yIGNvbnRlbnQgcHJvdGVjdGlvbi5cbiAgICpcbiAgICogQ0VOQyBzdXBwb3J0cyBQbGF5UmVhZHksIFdpZGV2aW5lLCBhbmQgSXJkZXRvLlxuICAgKiBDQkNTIHN1cHBvcnRzIFBsYXlSZWFkeSwgV2lkZXZpbmUsIGFuZCBGYWlyUGxheS5cbiAgICovXG4gIHJlYWRvbmx5IGRybVN5c3RlbXM6IENtYWZEcm1TeXN0ZW1bXTtcblxuICAvKipcbiAgICogQ29uc3RhbnQgaW5pdGlhbGl6YXRpb24gdmVjdG9yICgzMi1jaGFyYWN0ZXIgaGV4IHN0cmluZykuXG4gICAqXG4gICAqIEEgMTI4LWJpdCwgMTYtYnl0ZSBoZXggdmFsdWUgcmVwcmVzZW50ZWQgYnkgYSAzMi1jaGFyYWN0ZXIgc3RyaW5nLFxuICAgKiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGtleSBmb3IgZW5jcnlwdGluZyBjb250ZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE1lZGlhUGFja2FnZSBnZW5lcmF0ZXMgdGhlIElWXG4gICAqL1xuICByZWFkb25seSBjb25zdGFudEluaXRpYWxpemF0aW9uVmVjdG9yPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBLZXkgcm90YXRpb24gaW50ZXJ2YWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcm90YXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGtleVJvdGF0aW9uSW50ZXJ2YWw/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogV2hlbiBlbmFibGVkLCBEUk0gbWV0YWRhdGEgaXMgZXhjbHVkZWQgZnJvbSBDTUFGIHNlZ21lbnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZVNlZ21lbnREcm1NZXRhZGF0YT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgVFMgU1BFS0UgZW5jcnlwdGlvbiBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRzU3Bla2VFbmNyeXB0aW9uUHJvcHMgZXh0ZW5kcyBTcGVrZUVuY3J5cHRpb25Qcm9wc0Jhc2Uge1xuICAvKipcbiAgICogVGhlIGVuY3J5cHRpb24gbWV0aG9kIHRvIHVzZS5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGhvZDogVHNFbmNyeXB0aW9uTWV0aG9kO1xuXG4gIC8qKlxuICAgKiBUaGUgRFJNIHN5c3RlbXMgdG8gdXNlIGZvciBjb250ZW50IHByb3RlY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gRmFpclBsYXkgZm9yIFNBTVBMRV9BRVMsIENsZWFyIEtleSBBRVMgMTI4IGZvciBBRVNfMTI4XG4gICAqL1xuICByZWFkb25seSBkcm1TeXN0ZW1zPzogVHNEcm1TeXN0ZW1bXTtcblxuICAvKipcbiAgICogQ29uc3RhbnQgaW5pdGlhbGl6YXRpb24gdmVjdG9yICgzMi1jaGFyYWN0ZXIgaGV4IHN0cmluZykuXG4gICAqXG4gICAqIEEgMTI4LWJpdCwgMTYtYnl0ZSBoZXggdmFsdWUgcmVwcmVzZW50ZWQgYnkgYSAzMi1jaGFyYWN0ZXIgc3RyaW5nLFxuICAgKiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGtleSBmb3IgZW5jcnlwdGluZyBjb250ZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE1lZGlhUGFja2FnZSBnZW5lcmF0ZXMgdGhlIElWXG4gICAqL1xuICByZWFkb25seSBjb25zdGFudEluaXRpYWxpemF0aW9uVmVjdG9yPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBLZXkgcm90YXRpb24gaW50ZXJ2YWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcm90YXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGtleVJvdGF0aW9uSW50ZXJ2YWw/OiBEdXJhdGlvbjtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBJU00gU1BFS0UgZW5jcnlwdGlvbiBjb25maWd1cmF0aW9uLlxuICpcbiAqIElTTSBvbmx5IHN1cHBvcnRzIENFTkMgZW5jcnlwdGlvbiB3aXRoIFBsYXlSZWFkeSBEUk0uXG4gKiBLZXkgcm90YXRpb24gYW5kIGNvbnN0YW50IGluaXRpYWxpemF0aW9uIHZlY3RvcnMgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gKiBBdWRpbyBhbmQgdmlkZW8gcHJlc2V0cyBkZWZhdWx0IHRvIFNIQVJFRC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJc21TcGVrZUVuY3J5cHRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgRFJNIHN5c3RlbXMgdG8gdXNlIGZvciBjb250ZW50IHByb3RlY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gW0lzbURybVN5c3RlbS5QTEFZUkVBRFldXG4gICAqL1xuICByZWFkb25seSBkcm1TeXN0ZW1zPzogSXNtRHJtU3lzdGVtW107XG5cbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNvbnRlbnQuXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElBTSByb2xlIGZvciBhY2Nlc3NpbmcgdGhlIGtleSBwcm92aWRlciBBUEkuXG4gICAqL1xuICByZWFkb25seSByb2xlOiBJUm9sZTtcblxuICAvKipcbiAgICogVVJMIG9mIHRoZSBTUEVLRSBrZXkgcHJvdmlkZXIuXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgY2VydGlmaWNhdGUgdGhhdCB5b3UgaW1wb3J0ZWQgdG8gQVdTIENlcnRpZmljYXRlIE1hbmFnZXJcbiAgICogdG8gYWRkIGNvbnRlbnQga2V5IGVuY3J5cHRpb24gdG8gdGhpcyBlbmRwb2ludC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBjb250ZW50IGtleSBlbmNyeXB0aW9uXG4gICAqL1xuICByZWFkb25seSBjZXJ0aWZpY2F0ZT86IElDZXJ0aWZpY2F0ZTtcbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb25zLlxuICpcbiAqIFVzZSBgQ21hZkVuY3J5cHRpb24uc3Bla2UoKWAsIGBUc0VuY3J5cHRpb24uc3Bla2UoKWAsIG9yIGBJc21FbmNyeXB0aW9uLnNwZWtlKClgIHRvIGNyZWF0ZSBpbnN0YW5jZXMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBFbmNyeXB0aW9uQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBCaW5kcyB0aGUgZW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIHRvIHByb2R1Y2UgdGhlIENsb3VkRm9ybWF0aW9uIHByb3BlcnR5LlxuICAgKlxuICAgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZCB1c2VkIGJ5IHRoZSBjb25zdHJ1Y3QgbGlicmFyeSBhbmQgc2hvdWxkIG5vdCBiZVxuICAgKiBjYWxsZWQgb3IgaW1wbGVtZW50ZWQgYnkgZXh0ZXJuYWwgY29uc3VtZXJzLiBJdCBtYXkgY2hhbmdlIHdpdGhvdXQgbm90aWNlLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBfYmluZChzY29wZTogQ29uc3RydWN0KTogQ2ZuT3JpZ2luRW5kcG9pbnQuRW5jcnlwdGlvblByb3BlcnR5O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBJQU0gcm9sZSB1c2VkIGZvciBlbmNyeXB0aW9uLCBpZiBhbnkuXG4gICAqXG4gICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgbWV0aG9kIHVzZWQgYnkgdGhlIGNvbnN0cnVjdCBsaWJyYXJ5IGFuZCBzaG91bGQgbm90IGJlXG4gICAqIGNhbGxlZCBvciBpbXBsZW1lbnRlZCBieSBleHRlcm5hbCBjb25zdW1lcnMuIEl0IG1heSBjaGFuZ2Ugd2l0aG91dCBub3RpY2UuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IF9nZXRSb2xlKCk6IElSb2xlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBBQ00gY2VydGlmaWNhdGUgdXNlZCBmb3IgY29udGVudCBrZXkgZW5jcnlwdGlvbiwgaWYgYW55LlxuICAgKlxuICAgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZCB1c2VkIGJ5IHRoZSBjb25zdHJ1Y3QgbGlicmFyeSBhbmQgc2hvdWxkIG5vdCBiZVxuICAgKiBjYWxsZWQgb3IgaW1wbGVtZW50ZWQgYnkgZXh0ZXJuYWwgY29uc3VtZXJzLiBJdCBtYXkgY2hhbmdlIHdpdGhvdXQgbm90aWNlLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBfZ2V0Q2VydGlmaWNhdGUoKTogSUNlcnRpZmljYXRlIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEVuY3J5cHRpb24gY29uZmlndXJhdGlvbiBmb3IgQ01BRiBzZWdtZW50cy5cbiAqXG4gKiBVc2UgYENtYWZFbmNyeXB0aW9uLnNwZWtlKClgIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGNsYXNzIENtYWZFbmNyeXB0aW9uIGV4dGVuZHMgRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ3JlYXRlIGEgU1BFS0UtYmFzZWQgZW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIGZvciBDTUFGIHNlZ21lbnRzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzcGVrZShwcm9wczogQ21hZlNwZWtlRW5jcnlwdGlvblByb3BzKTogQ21hZkVuY3J5cHRpb24ge1xuICAgIGlmICghcHJvcHMudXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgU3Bla2VVcmxIdHRwc1JlcXVpcmVkYCwgJ1NQRUtFIGtleSBwcm92aWRlciBVUkwgbXVzdCB1c2UgSFRUUFMuJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5tZXRob2QgPT09IENtYWZFbmNyeXB0aW9uTWV0aG9kLkNFTkMgJiYgcHJvcHMuZHJtU3lzdGVtcy5pbmNsdWRlcyhDbWFmRHJtU3lzdGVtLkZBSVJQTEFZKSkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBDZW5jRmFpclBsYXlJbmNvbXBhdGlibGVgLCAnQ0VOQyBlbmNyeXB0aW9uIG1ldGhvZCBkb2VzIG5vdCBzdXBwb3J0IEZhaXJQbGF5LiBVc2UgQ0JDUyBmb3IgRmFpclBsYXkuJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5tZXRob2QgPT09IENtYWZFbmNyeXB0aW9uTWV0aG9kLkNCQ1MgJiYgcHJvcHMuZHJtU3lzdGVtcy5pbmNsdWRlcyhDbWFmRHJtU3lzdGVtLklSREVUTykpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgQ2Jjc0lyZGV0b0luY29tcGF0aWJsZWAsICdDQkNTIGVuY3J5cHRpb24gbWV0aG9kIGRvZXMgbm90IHN1cHBvcnQgSXJkZXRvLiBVc2UgQ0VOQyBmb3IgSXJkZXRvLicpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IENtYWZFbmNyeXB0aW9uKHByb3BzKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBDbWFmU3Bla2VFbmNyeXB0aW9uUHJvcHM7XG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJvcHM6IENtYWZTcGVrZUVuY3J5cHRpb25Qcm9wcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jb25maWcgPSBwcm9wcztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9iaW5kKHNjb3BlOiBDb25zdHJ1Y3QpOiBDZm5PcmlnaW5FbmRwb2ludC5FbmNyeXB0aW9uUHJvcGVydHkge1xuICAgIGNvbnN0IHAgPSB0aGlzLmNvbmZpZztcbiAgICBpZiAocC5jb25zdGFudEluaXRpYWxpemF0aW9uVmVjdG9yICYmIHAuY29uc3RhbnRJbml0aWFsaXphdGlvblZlY3Rvci5sZW5ndGggIT09IDMyKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBDb25zdGFudEluaXRWZWN0b3JMZW5ndGhgLCAnQ29uc3RhbnQgSW5pdGlhbGl6YXRpb24gVmVjdG9yIG5lZWRzIHRvIGJlIDMyIGNoYXJhY3RlcnMgaW4gbGVuZ3RoLicsIHNjb3BlKTtcbiAgICB9XG4gICAgaWYgKHAua2V5Um90YXRpb25JbnRlcnZhbCAmJiAocC5rZXlSb3RhdGlvbkludGVydmFsLnRvU2Vjb25kcygpIDwgMzAwIHx8IHAua2V5Um90YXRpb25JbnRlcnZhbC50b1NlY29uZHMoKSA+IDMxNTM2MDAwKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgS2V5Um90YXRpb25JbnRlcnZhbFJhbmdlYCwgJ0tleSBSb3RhdGlvbiBJbnRlcnZhbCBuZWVkcyB0byBiZSBiZXR3ZWVuIDMwMC0zMTUzNjAwMCBzZWNvbmRzLicsIHNjb3BlKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGNtYWZFeGNsdWRlU2VnbWVudERybU1ldGFkYXRhOiBwLmV4Y2x1ZGVTZWdtZW50RHJtTWV0YWRhdGEsXG4gICAgICBjb25zdGFudEluaXRpYWxpemF0aW9uVmVjdG9yOiBwLmNvbnN0YW50SW5pdGlhbGl6YXRpb25WZWN0b3IsXG4gICAgICBrZXlSb3RhdGlvbkludGVydmFsU2Vjb25kczogcC5rZXlSb3RhdGlvbkludGVydmFsPy50b1NlY29uZHMoKSxcbiAgICAgIGVuY3J5cHRpb25NZXRob2Q6IHsgY21hZkVuY3J5cHRpb25NZXRob2Q6IHAubWV0aG9kIH0sXG4gICAgICBzcGVrZUtleVByb3ZpZGVyOiB7XG4gICAgICAgIGNlcnRpZmljYXRlQXJuOiBwLmNlcnRpZmljYXRlPy5jZXJ0aWZpY2F0ZUFybixcbiAgICAgICAgZHJtU3lzdGVtczogcC5kcm1TeXN0ZW1zLFxuICAgICAgICBlbmNyeXB0aW9uQ29udHJhY3RDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgcHJlc2V0U3Bla2UyMEF1ZGlvOiBwLmF1ZGlvUHJlc2V0ID8/IFByZXNldFNwZWtlMjBBdWRpby5QUkVTRVRfQVVESU9fMSxcbiAgICAgICAgICBwcmVzZXRTcGVrZTIwVmlkZW86IHAudmlkZW9QcmVzZXQgPz8gUHJlc2V0U3Bla2UyMFZpZGVvLlBSRVNFVF9WSURFT18xLFxuICAgICAgICB9LFxuICAgICAgICB1cmw6IHAudXJsLFxuICAgICAgICByZXNvdXJjZUlkOiBwLnJlc291cmNlSWQsXG4gICAgICAgIHJvbGVBcm46IHAucm9sZS5yb2xlQXJuLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX2dldFJvbGUoKTogSVJvbGUgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5jb25maWcucm9sZTsgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9nZXRDZXJ0aWZpY2F0ZSgpOiBJQ2VydGlmaWNhdGUgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5jb25maWcuY2VydGlmaWNhdGU7IH1cbn1cblxuLyoqXG4gKiBFbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIFRTIHNlZ21lbnRzLlxuICpcbiAqIFVzZSBgVHNFbmNyeXB0aW9uLnNwZWtlKClgIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFRzRW5jcnlwdGlvbiBleHRlbmRzIEVuY3J5cHRpb25Db25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIFNQRUtFLWJhc2VkIGVuY3J5cHRpb24gY29uZmlndXJhdGlvbiBmb3IgVFMgc2VnbWVudHMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNwZWtlKHByb3BzOiBUc1NwZWtlRW5jcnlwdGlvblByb3BzKTogVHNFbmNyeXB0aW9uIHtcbiAgICBpZiAoIXByb3BzLnVybC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YFNwZWtlVXJsSHR0cHNSZXF1aXJlZGAsICdTUEVLRSBrZXkgcHJvdmlkZXIgVVJMIG11c3QgdXNlIEhUVFBTLicpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRzRW5jcnlwdGlvbihwcm9wcyk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogVHNTcGVrZUVuY3J5cHRpb25Qcm9wcztcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcm9wczogVHNTcGVrZUVuY3J5cHRpb25Qcm9wcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jb25maWcgPSBwcm9wcztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9iaW5kKHNjb3BlOiBDb25zdHJ1Y3QpOiBDZm5PcmlnaW5FbmRwb2ludC5FbmNyeXB0aW9uUHJvcGVydHkge1xuICAgIGNvbnN0IHAgPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCBkZWZhdWx0RHJtOiBUc0RybVN5c3RlbVtdID0gcC5tZXRob2QgPT09IFRzRW5jcnlwdGlvbk1ldGhvZC5TQU1QTEVfQUVTXG4gICAgICA/IFtUc0RybVN5c3RlbS5GQUlSUExBWV0gOiBbVHNEcm1TeXN0ZW0uQ0xFQVJfS0VZX0FFU18xMjhdO1xuICAgIGlmIChwLmNvbnN0YW50SW5pdGlhbGl6YXRpb25WZWN0b3IgJiYgcC5jb25zdGFudEluaXRpYWxpemF0aW9uVmVjdG9yLmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YENvbnN0YW50SW5pdFZlY3Rvckxlbmd0aGAsICdDb25zdGFudCBJbml0aWFsaXphdGlvbiBWZWN0b3IgbmVlZHMgdG8gYmUgMzIgY2hhcmFjdGVycyBpbiBsZW5ndGguJywgc2NvcGUpO1xuICAgIH1cbiAgICBpZiAocC5rZXlSb3RhdGlvbkludGVydmFsICYmIChwLmtleVJvdGF0aW9uSW50ZXJ2YWwudG9TZWNvbmRzKCkgPCAzMDAgfHwgcC5rZXlSb3RhdGlvbkludGVydmFsLnRvU2Vjb25kcygpID4gMzE1MzYwMDApKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBLZXlSb3RhdGlvbkludGVydmFsUmFuZ2VgLCAnS2V5IFJvdGF0aW9uIEludGVydmFsIG5lZWRzIHRvIGJlIGJldHdlZW4gMzAwLTMxNTM2MDAwIHNlY29uZHMuJywgc2NvcGUpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY29uc3RhbnRJbml0aWFsaXphdGlvblZlY3RvcjogcC5jb25zdGFudEluaXRpYWxpemF0aW9uVmVjdG9yLFxuICAgICAga2V5Um90YXRpb25JbnRlcnZhbFNlY29uZHM6IHAua2V5Um90YXRpb25JbnRlcnZhbD8udG9TZWNvbmRzKCksXG4gICAgICBlbmNyeXB0aW9uTWV0aG9kOiB7IHRzRW5jcnlwdGlvbk1ldGhvZDogcC5tZXRob2QgfSxcbiAgICAgIHNwZWtlS2V5UHJvdmlkZXI6IHtcbiAgICAgICAgY2VydGlmaWNhdGVBcm46IHAuY2VydGlmaWNhdGU/LmNlcnRpZmljYXRlQXJuLFxuICAgICAgICBkcm1TeXN0ZW1zOiAocC5kcm1TeXN0ZW1zID8/IGRlZmF1bHREcm0pLm1hcChkID0+IGQudG9TdHJpbmcoKSksXG4gICAgICAgIGVuY3J5cHRpb25Db250cmFjdENvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICBwcmVzZXRTcGVrZTIwQXVkaW86IHAuYXVkaW9QcmVzZXQgPz8gUHJlc2V0U3Bla2UyMEF1ZGlvLlBSRVNFVF9BVURJT18xLFxuICAgICAgICAgIHByZXNldFNwZWtlMjBWaWRlbzogcC52aWRlb1ByZXNldCA/PyBQcmVzZXRTcGVrZTIwVmlkZW8uUFJFU0VUX1ZJREVPXzEsXG4gICAgICAgIH0sXG4gICAgICAgIHVybDogcC51cmwsXG4gICAgICAgIHJlc291cmNlSWQ6IHAucmVzb3VyY2VJZCxcbiAgICAgICAgcm9sZUFybjogcC5yb2xlLnJvbGVBcm4sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBfZ2V0Um9sZSgpOiBJUm9sZSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLmNvbmZpZy5yb2xlOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX2dldENlcnRpZmljYXRlKCk6IElDZXJ0aWZpY2F0ZSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLmNvbmZpZy5jZXJ0aWZpY2F0ZTsgfVxufVxuXG4vKipcbiAqIEVuY3J5cHRpb24gY29uZmlndXJhdGlvbiBmb3IgSVNNIChNaWNyb3NvZnQgU21vb3RoIFN0cmVhbWluZykgc2VnbWVudHMuXG4gKlxuICogSVNNIG9ubHkgc3VwcG9ydHMgQ0VOQyBlbmNyeXB0aW9uIHdpdGggUGxheVJlYWR5IERSTS5cbiAqIEF1ZGlvIGFuZCB2aWRlbyBwcmVzZXRzIGFyZSBhbHdheXMgU0hBUkVELlxuICpcbiAqIFVzZSBgSXNtRW5jcnlwdGlvbi5zcGVrZSgpYCB0byBjcmVhdGUgYW4gaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBJc21FbmNyeXB0aW9uIGV4dGVuZHMgRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ3JlYXRlIGEgU1BFS0UtYmFzZWQgZW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIGZvciBJU00gc2VnbWVudHMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNwZWtlKHByb3BzOiBJc21TcGVrZUVuY3J5cHRpb25Qcm9wcyk6IElzbUVuY3J5cHRpb24ge1xuICAgIGlmICghcHJvcHMudXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgU3Bla2VVcmxIdHRwc1JlcXVpcmVkYCwgJ1NQRUtFIGtleSBwcm92aWRlciBVUkwgbXVzdCB1c2UgSFRUUFMuJyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSXNtRW5jcnlwdGlvbihwcm9wcyk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogSXNtU3Bla2VFbmNyeXB0aW9uUHJvcHM7XG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJvcHM6IElzbVNwZWtlRW5jcnlwdGlvblByb3BzKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNvbmZpZyA9IHByb3BzO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX2JpbmQoX3Njb3BlOiBDb25zdHJ1Y3QpOiBDZm5PcmlnaW5FbmRwb2ludC5FbmNyeXB0aW9uUHJvcGVydHkge1xuICAgIGNvbnN0IHAgPSB0aGlzLmNvbmZpZztcbiAgICByZXR1cm4ge1xuICAgICAgZW5jcnlwdGlvbk1ldGhvZDogeyBpc21FbmNyeXB0aW9uTWV0aG9kOiAnQ0VOQycgfSxcbiAgICAgIHNwZWtlS2V5UHJvdmlkZXI6IHtcbiAgICAgICAgY2VydGlmaWNhdGVBcm46IHAuY2VydGlmaWNhdGU/LmNlcnRpZmljYXRlQXJuLFxuICAgICAgICBkcm1TeXN0ZW1zOiAocC5kcm1TeXN0ZW1zID8/IFtJc21Ecm1TeXN0ZW0uUExBWVJFQURZXSkubWFwKGQgPT4gZC50b1N0cmluZygpKSxcbiAgICAgICAgZW5jcnlwdGlvbkNvbnRyYWN0Q29uZmlndXJhdGlvbjoge1xuICAgICAgICAgIHByZXNldFNwZWtlMjBBdWRpbzogUHJlc2V0U3Bla2UyMEF1ZGlvLlNIQVJFRCxcbiAgICAgICAgICBwcmVzZXRTcGVrZTIwVmlkZW86IFByZXNldFNwZWtlMjBWaWRlby5TSEFSRUQsXG4gICAgICAgIH0sXG4gICAgICAgIHVybDogcC51cmwsXG4gICAgICAgIHJlc291cmNlSWQ6IHAucmVzb3VyY2VJZCxcbiAgICAgICAgcm9sZUFybjogcC5yb2xlLnJvbGVBcm4sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBfZ2V0Um9sZSgpOiBJUm9sZSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLmNvbmZpZy5yb2xlOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX2dldENlcnRpZmljYXRlKCk6IElDZXJ0aWZpY2F0ZSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLmNvbmZpZy5jZXJ0aWZpY2F0ZTsgfVxufVxuXG4vKipcbiAqIFRoZSBzZWdtZW50IGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZyB0aGUgc2VnbWVudCBuYW1lLCBkdXJhdGlvbiwgYW5kIG90aGVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlZ21lbnRDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBjb250YWluZXIgdHlwZSBmb3IgdGhpcyBzZWdtZW50IChUUyBvciBDTUFGKVxuICAgKi9cbiAgcmVhZG9ubHkgY29udGFpbmVyVHlwZTogQ29udGFpbmVyVHlwZTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHNlZ21lbnQgaW5jbHVkZXMgSS1mcmFtZS1vbmx5IHN0cmVhbXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZCAtIE5vdCBzcGVjaWZpZWQuXG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlSWZyYW1lT25seVN0cmVhbXM/OiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIFNDVEUtMzUgY29uZmlndXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHNlZ21lbnQuXG4gICAqXG4gICAqIFRoZSBTQ1RFLTM1IG1lc3NhZ2UgdHlwZXMgdGhhdCB5b3Ugd2FudCB0byBiZSB0cmVhdGVkIGFzIGFkIG1hcmtlcnMgaW4gdGhlIG91dHB1dC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBTQ1RFIGZpbHRlcmluZ1xuICAgKi9cbiAgcmVhZG9ubHkgc2N0ZUZpbHRlcj86IFNjdGVNZXNzYWdlVHlwZVtdO1xuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciBTQ1RFLTM1IG1lc3NhZ2VzIGFyZSBpbmNsdWRlZCBpbiBzZWdtZW50IGZpbGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNDVEUtMzUgbWVzc2FnZXMgYXJlIG5vdCBpbmNsdWRlZCBpbiBzZWdtZW50c1xuICAgKi9cbiAgcmVhZG9ubHkgc2N0ZUluU2VnbWVudHM/OiBTY3RlSW5TZWdtZW50cztcbiAgLyoqXG4gICAqIFRoZSBkdXJhdGlvbiBvZiB0aGUgc2VnbWVudHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IDZcbiAgICovXG4gIHJlYWRvbmx5IHNlZ21lbnREdXJhdGlvbj86IER1cmF0aW9uO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHNlZ21lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHNlZ21lbnRcbiAgICovXG4gIHJlYWRvbmx5IHNlZ21lbnROYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgc2VnbWVudCBpbmNsdWRlcyBEVkIgc3VidGl0bGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgdHNJbmNsdWRlRHZiU3VidGl0bGVzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHNlZ21lbnQgaXMgYW4gYXVkaW8gcmVuZGl0aW9uIGdyb3VwLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgdHNVc2VBdWRpb1JlbmRpdGlvbkdyb3VwPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEVuY3J5cHRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIHNlZ21lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZW5jcnlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbj86IEVuY3J5cHRpb25Db25maWd1cmF0aW9uO1xufVxuXG4vKipcbiAqIEJhc2UgcHJvcGVydGllcyBjb21tb24gdG8gYWxsIHNlZ21lbnQgY29uZmlndXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VnbWVudFByb3BzQmFzZSB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgSS1mcmFtZS1vbmx5IHN0cmVhbXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlSWZyYW1lT25seVN0cmVhbXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEdXJhdGlvbiBvZiBlYWNoIHNlZ21lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLnNlY29uZHMoNilcbiAgICovXG4gIHJlYWRvbmx5IGR1cmF0aW9uPzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHNlZ21lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdzZWdtZW50J1xuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBUUyAoVHJhbnNwb3J0IFN0cmVhbSkgc2VnbWVudCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRzU2VnbWVudFByb3BzIGV4dGVuZHMgU2VnbWVudFByb3BzQmFzZSB7XG4gIC8qKlxuICAgKiBTQ1RFLTM1IG1lc3NhZ2UgdHlwZXMgdG8gdHJlYXQgYXMgYWQgbWFya2Vycy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBmaWx0ZXJpbmdcbiAgICovXG4gIHJlYWRvbmx5IHNjdGVGaWx0ZXI/OiBTY3RlTWVzc2FnZVR5cGVbXTtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciBTQ1RFLTM1IG1lc3NhZ2VzIGFyZSBpbmNsdWRlZCBpbiBzZWdtZW50IGZpbGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNDVEUtMzUgbWVzc2FnZXMgYXJlIG5vdCBpbmNsdWRlZCBpbiBzZWdtZW50c1xuICAgKi9cbiAgcmVhZG9ubHkgc2N0ZUluU2VnbWVudHM/OiBTY3RlSW5TZWdtZW50cztcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIERWQiBzdWJ0aXRsZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlRHZiU3VidGl0bGVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1c2UgYXVkaW8gcmVuZGl0aW9uIGdyb3Vwcy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHVzZUF1ZGlvUmVuZGl0aW9uR3JvdXA/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBUUyBzZWdtZW50LlxuICAgKlxuICAgKiBVc2UgYFRzRW5jcnlwdGlvbi5zcGVrZSgpYCB0byBjcmVhdGUgdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZW5jcnlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbj86IFRzRW5jcnlwdGlvbjtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBDTUFGIHNlZ21lbnQgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbWFmU2VnbWVudFByb3BzIGV4dGVuZHMgU2VnbWVudFByb3BzQmFzZSB7XG4gIC8qKlxuICAgKiBTQ1RFLTM1IG1lc3NhZ2UgdHlwZXMgdG8gdHJlYXQgYXMgYWQgbWFya2Vycy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBmaWx0ZXJpbmdcbiAgICovXG4gIHJlYWRvbmx5IHNjdGVGaWx0ZXI/OiBTY3RlTWVzc2FnZVR5cGVbXTtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciBTQ1RFLTM1IG1lc3NhZ2VzIGFyZSBpbmNsdWRlZCBpbiBzZWdtZW50IGZpbGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNDVEUtMzUgbWVzc2FnZXMgYXJlIG5vdCBpbmNsdWRlZCBpbiBzZWdtZW50c1xuICAgKi9cbiAgcmVhZG9ubHkgc2N0ZUluU2VnbWVudHM/OiBTY3RlSW5TZWdtZW50cztcblxuICAvKipcbiAgICogRW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIGZvciB0aGUgQ01BRiBzZWdtZW50LlxuICAgKlxuICAgKiBVc2UgYENtYWZFbmNyeXB0aW9uLnNwZWtlKClgIHRvIGNyZWF0ZSB0aGUgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBlbmNyeXB0aW9uXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uPzogQ21hZkVuY3J5cHRpb247XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgSVNNIChNaWNyb3NvZnQgU21vb3RoIFN0cmVhbWluZykgc2VnbWVudCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElzbVNlZ21lbnRQcm9wcyBleHRlbmRzIFNlZ21lbnRQcm9wc0Jhc2Uge1xuICAvKipcbiAgICogRW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIGZvciB0aGUgSVNNIHNlZ21lbnQuXG4gICAqXG4gICAqIFVzZSBgSXNtRW5jcnlwdGlvbi5zcGVrZSgpYCB0byBjcmVhdGUgdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gZW5jcnlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbj86IElzbUVuY3J5cHRpb247XG59XG5cbi8qKlxuICogSGVscGVyIGNsYXNzIGZvciBjcmVhdGluZyBzZWdtZW50IGNvbmZpZ3VyYXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgU2VnbWVudCB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBUUyAoVHJhbnNwb3J0IFN0cmVhbSkgc2VnbWVudCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBVc2UgdGhpcyBmb3IgZW5kcG9pbnRzIHdpdGggQ29udGFpbmVyVHlwZS5UUy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdHMocHJvcHM6IFRzU2VnbWVudFByb3BzID0ge30pOiBTZWdtZW50Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRhaW5lclR5cGU6IENvbnRhaW5lclR5cGUuVFMsXG4gICAgICBpbmNsdWRlSWZyYW1lT25seVN0cmVhbXM6IHByb3BzLmluY2x1ZGVJZnJhbWVPbmx5U3RyZWFtcyxcbiAgICAgIHNjdGVGaWx0ZXI6IHByb3BzLnNjdGVGaWx0ZXIsXG4gICAgICBzY3RlSW5TZWdtZW50czogcHJvcHMuc2N0ZUluU2VnbWVudHMsXG4gICAgICBzZWdtZW50RHVyYXRpb246IHByb3BzLmR1cmF0aW9uLFxuICAgICAgc2VnbWVudE5hbWU6IHByb3BzLm5hbWUsXG4gICAgICB0c0luY2x1ZGVEdmJTdWJ0aXRsZXM6IHByb3BzLmluY2x1ZGVEdmJTdWJ0aXRsZXMsXG4gICAgICB0c1VzZUF1ZGlvUmVuZGl0aW9uR3JvdXA6IHByb3BzLnVzZUF1ZGlvUmVuZGl0aW9uR3JvdXAsXG4gICAgICBlbmNyeXB0aW9uOiBwcm9wcy5lbmNyeXB0aW9uLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ01BRiBzZWdtZW50IGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIFVzZSB0aGlzIGZvciBlbmRwb2ludHMgd2l0aCBDb250YWluZXJUeXBlLkNNQUYuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNtYWYocHJvcHM6IENtYWZTZWdtZW50UHJvcHMgPSB7fSk6IFNlZ21lbnRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGFpbmVyVHlwZTogQ29udGFpbmVyVHlwZS5DTUFGLFxuICAgICAgaW5jbHVkZUlmcmFtZU9ubHlTdHJlYW1zOiBwcm9wcy5pbmNsdWRlSWZyYW1lT25seVN0cmVhbXMsXG4gICAgICBzY3RlRmlsdGVyOiBwcm9wcy5zY3RlRmlsdGVyLFxuICAgICAgc2N0ZUluU2VnbWVudHM6IHByb3BzLnNjdGVJblNlZ21lbnRzLFxuICAgICAgc2VnbWVudER1cmF0aW9uOiBwcm9wcy5kdXJhdGlvbixcbiAgICAgIHNlZ21lbnROYW1lOiBwcm9wcy5uYW1lLFxuICAgICAgZW5jcnlwdGlvbjogcHJvcHMuZW5jcnlwdGlvbixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBJU00gKE1pY3Jvc29mdCBTbW9vdGggU3RyZWFtaW5nKSBzZWdtZW50IGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIFVzZSB0aGlzIGZvciBlbmRwb2ludHMgd2l0aCBDb250YWluZXJUeXBlLklTTS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNtKHByb3BzOiBJc21TZWdtZW50UHJvcHMgPSB7fSk6IFNlZ21lbnRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGFpbmVyVHlwZTogQ29udGFpbmVyVHlwZS5JU00sXG4gICAgICBpbmNsdWRlSWZyYW1lT25seVN0cmVhbXM6IHByb3BzLmluY2x1ZGVJZnJhbWVPbmx5U3RyZWFtcyxcbiAgICAgIHNlZ21lbnREdXJhdGlvbjogcHJvcHMuZHVyYXRpb24sXG4gICAgICBzZWdtZW50TmFtZTogcHJvcHMubmFtZSxcbiAgICAgIGVuY3J5cHRpb246IHByb3BzLmVuY3J5cHRpb24sXG4gICAgfTtcbiAgfVxufVxuXG5hYnN0cmFjdCBjbGFzcyBPcmlnaW5FbmRwb2ludEJhc2UgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElPcmlnaW5FbmRwb2ludCB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIE9yaWdpbkVuZHBvaW50IGNvbnN0cnVjdCB0aGF0IHJlcHJlc2VudHMgYW4gZXh0ZXJuYWwgKGltcG9ydGVkKSBPcmlnaW4gRW5kcG9pbnQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21PcmlnaW5FbmRwb2ludEF0dHJpYnV0ZXMoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IE9yaWdpbkVuZHBvaW50QXR0cmlidXRlcyk6IElPcmlnaW5FbmRwb2ludCB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgT3JpZ2luRW5kcG9pbnRCYXNlIGltcGxlbWVudHMgSU9yaWdpbkVuZHBvaW50IHtcbiAgICAgIHByb3RlY3RlZCBobHNNYW5pZmVzdHM6IENmbk9yaWdpbkVuZHBvaW50Lkhsc01hbmlmZXN0Q29uZmlndXJhdGlvblByb3BlcnR5W10gPSBbXTtcbiAgICAgIHByb3RlY3RlZCBsbEhsc01hbmlmZXN0czogQ2ZuT3JpZ2luRW5kcG9pbnQuTG93TGF0ZW5jeUhsc01hbmlmZXN0Q29uZmlndXJhdGlvblByb3BlcnR5W10gPSBbXTtcbiAgICAgIHByb3RlY3RlZCBkYXNoTWFuaWZlc3RzOiBDZm5PcmlnaW5FbmRwb2ludC5EYXNoTWFuaWZlc3RDb25maWd1cmF0aW9uUHJvcGVydHlbXSA9IFtdO1xuICAgICAgcHJvdGVjdGVkIG1zc01hbmlmZXN0czogQ2ZuT3JpZ2luRW5kcG9pbnQuTXNzTWFuaWZlc3RDb25maWd1cmF0aW9uUHJvcGVydHlbXSA9IFtdO1xuICAgICAgcHJvdGVjdGVkIHNlZ21lbnQ/OiBTZWdtZW50Q29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBwb2xpY3kgPSB1bmRlZmluZWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgY2hhbm5lbEdyb3VwTmFtZSA9IGF0dHJzLmNoYW5uZWxHcm91cE5hbWU7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgY2hhbm5lbE5hbWUgPSBhdHRycy5jaGFubmVsTmFtZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBvcmlnaW5FbmRwb2ludE5hbWUgPSBhdHRycy5vcmlnaW5FbmRwb2ludE5hbWU7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEF0ID0gdW5kZWZpbmVkO1xuICAgICAgcHVibGljIHJlYWRvbmx5IG1vZGlmaWVkQXQgPSB1bmRlZmluZWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgaGxzTWFuaWZlc3RVcmxzID0gdW5kZWZpbmVkO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGxvd0xhdGVuY3lIbHNNYW5pZmVzdFVybHMgPSB1bmRlZmluZWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZGFzaE1hbmlmZXN0VXJscyA9IHVuZGVmaW5lZDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBtc3NNYW5pZmVzdFVybHMgPSB1bmRlZmluZWQ7XG4gICAgICBwcm90ZWN0ZWQgYXV0b0NyZWF0ZVBvbGljeSA9IGZhbHNlO1xuICAgICAgcHVibGljIHJlYWRvbmx5IG9yaWdpbkVuZHBvaW50QXJuID0gU3RhY2sub2YodGhpcykuZm9ybWF0QXJuKHtcbiAgICAgICAgc2VydmljZTogJ21lZGlhcGFja2FnZXYyJyxcbiAgICAgICAgcmVzb3VyY2U6IGBjaGFubmVsR3JvdXAvJHthdHRycy5jaGFubmVsR3JvdXBOYW1lfS9jaGFubmVsLyR7dGhpcy5jaGFubmVsTmFtZX0vb3JpZ2luRW5kcG9pbnRgLFxuICAgICAgICBhcm5Gb3JtYXQ6IEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FLFxuICAgICAgICByZXNvdXJjZU5hbWU6IHRoaXMub3JpZ2luRW5kcG9pbnROYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBjaGFubmVsR3JvdXBOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBjaGFubmVsTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgb3JpZ2luRW5kcG9pbnROYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBvcmlnaW5FbmRwb2ludEFybjogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgY3JlYXRlZEF0Pzogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgbW9kaWZpZWRBdD86IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGhsc01hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgbG93TGF0ZW5jeUhsc01hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgZGFzaE1hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgbXNzTWFuaWZlc3RVcmxzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgcmVmZXJlbmNlIHRvIHRoaXMgT3JpZ2luIEVuZHBvaW50IHJlc291cmNlLlxuICAgKiBSZXF1aXJlZCBieSB0aGUgYXV0by1nZW5lcmF0ZWQgSU9yaWdpbkVuZHBvaW50UmVmIGludGVyZmFjZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgb3JpZ2luRW5kcG9pbnRSZWYoKTogT3JpZ2luRW5kcG9pbnRSZWZlcmVuY2Uge1xuICAgIHJldHVybiB7XG4gICAgICBvcmlnaW5FbmRwb2ludEFybjogdGhpcy5vcmlnaW5FbmRwb2ludEFybixcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGhsc01hbmlmZXN0czogQ2ZuT3JpZ2luRW5kcG9pbnQuSGxzTWFuaWZlc3RDb25maWd1cmF0aW9uUHJvcGVydHlbXTtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGxsSGxzTWFuaWZlc3RzOiBDZm5PcmlnaW5FbmRwb2ludC5Mb3dMYXRlbmN5SGxzTWFuaWZlc3RDb25maWd1cmF0aW9uUHJvcGVydHlbXTtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGRhc2hNYW5pZmVzdHM6IENmbk9yaWdpbkVuZHBvaW50LkRhc2hNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgbXNzTWFuaWZlc3RzOiBDZm5PcmlnaW5FbmRwb2ludC5Nc3NNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc2VnbWVudD86IFNlZ21lbnRDb25maWd1cmF0aW9uO1xuICAvKipcbiAgICogVGhlIHJlc291cmNlIHBvbGljeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIElmIGBhdXRvQ3JlYXRlUG9saWN5YCBpcyB0cnVlLCBhbiBgT3JpZ2luRW5kcG9pbnRQb2xpY3lgIHdpbGwgYmUgY3JlYXRlZCB1cG9uIHRoZVxuICAgKiBmaXJzdCBjYWxsIHRvIGFkZFRvUmVzb3VyY2VQb2xpY3kocykuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcG9saWN5PzogT3JpZ2luRW5kcG9pbnRQb2xpY3k7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiBhbiBvcmlnaW4gZW5kcG9pbnQgcmVzb3VyY2UgcG9saWN5IHNob3VsZCBhdXRvbWF0aWNhbGx5IGJlIGNyZWF0ZWQgdXBvblxuICAgKiB0aGUgZmlyc3QgY2FsbCB0byBgYWRkVG9SZXNvdXJjZVBvbGljeWAuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYXV0b0NyZWF0ZVBvbGljeTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ0ROIGF1dGhvcml6YXRpb24gY29uZmlndXJhdGlvbiB0byBiZSBhcHBsaWVkIHdoZW4gdGhlIHBvbGljeSBpcyBjcmVhdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBjZG5BdXRoQ29uZmlnPzogQ2RuQXV0aENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFNldCBDRE4gYXV0aCBjb25maWcuIFVzZWQgYnkgc3ViY2xhc3MgY29uc3RydWN0b3JzLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBfc2V0Q2RuQXV0aChjZG5BdXRoOiBDZG5BdXRoQ29uZmlndXJhdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5jZG5BdXRoQ29uZmlnKSB7XG4gICAgICB0aGlzLmNkbkF1dGhDb25maWcgPSBjZG5BdXRoO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgb3JpZ2luIGVuZHBvaW50IHBvbGljeS5cbiAgICpcbiAgICogWW91IGNhbiBvbmx5IGFkZCAxIE9yaWdpbkVuZHBvaW50UG9saWN5IHRvIGFuIE9yaWdpbkVuZHBvaW50LlxuICAgKiBJZiB5b3UgaGF2ZSBhbHJlYWR5IGRlZmluZWQgb25lLCBpdCB3aWxsIGFwcGVuZCB0byB0aGUgcG9saWN5IGFscmVhZHkgY3JlYXRlZC5cbiAgICpcbiAgICogQHBhcmFtIHN0YXRlbWVudCAtIFRoZSBwb2xpY3kgc3RhdGVtZW50IHRvIGFkZFxuICAgKiBAcGFyYW0gY2RuQXV0aCAtIE9wdGlvbmFsIENETiBhdXRob3JpemF0aW9uIGNvbmZpZ3VyYXRpb24uIElmIHByb3ZpZGVkLCB0aGUgcG9saWN5IHdpbGwgYmVcbiAgICogICAgICAgICAgICAgICAgICBjcmVhdGVkIHdpdGggQ0ROIGF1dGhlbnRpY2F0aW9uIGVuYWJsZWQgdXNpbmcgc2VjcmV0cyBmcm9tIEFXUyBTZWNyZXRzIE1hbmFnZXIuXG4gICAqICAgICAgICAgICAgICAgICAgSWYgY2RuQXV0aCBpcyBwcm92aWRlZCBtdWx0aXBsZSB0aW1lcywgb25seSB0aGUgZmlyc3QgY29uZmlndXJhdGlvbiBpcyB1c2VkLlxuICAgKi9cbiAgcHVibGljIGFkZFRvUmVzb3VyY2VQb2xpY3koc3RhdGVtZW50OiBQb2xpY3lTdGF0ZW1lbnQsIGNkbkF1dGg/OiBDZG5BdXRoQ29uZmlndXJhdGlvbik6IEFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQge1xuICAgIC8vIFN0b3JlIENETiBhdXRoIGNvbmZpZyBpZiBwcm92aWRlZCAob25seSBpZiBub3QgYWxyZWFkeSBzZXQpXG4gICAgaWYgKGNkbkF1dGggJiYgIXRoaXMuY2RuQXV0aENvbmZpZykge1xuICAgICAgdGhpcy5jZG5BdXRoQ29uZmlnID0gY2RuQXV0aDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucG9saWN5ICYmIHRoaXMuYXV0b0NyZWF0ZVBvbGljeSkge1xuICAgICAgdGhpcy5wb2xpY3kgPSBuZXcgT3JpZ2luRW5kcG9pbnRQb2xpY3kodGhpcywgJ1BvbGljeScsIHtcbiAgICAgICAgb3JpZ2luRW5kcG9pbnQ6IHRoaXMsXG4gICAgICAgIGNkbkF1dGg6IHRoaXMuY2RuQXV0aENvbmZpZyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBvbGljeSkge1xuICAgICAgdGhpcy5wb2xpY3kuZG9jdW1lbnQuYWRkU3RhdGVtZW50cyhzdGF0ZW1lbnQpO1xuICAgICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IHRydWUsIHBvbGljeURlcGVuZGFibGU6IHRoaXMucG9saWN5IH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IGZhbHNlIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYW5kIG1vZGlmeSBTZWdtZW50IGNvbmZpZ3VyYXRpb24gZm9yIGVuZHBvaW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIHNlZ21lbnRWYWxpZGF0aW9uKHNlZ21lbnRDb250YWluZXJUeXBlOiBDb250YWluZXJUeXBlLCBzZWdtZW50PzogU2VnbWVudENvbmZpZ3VyYXRpb24pOiBDZm5PcmlnaW5FbmRwb2ludC5TZWdtZW50UHJvcGVydHkgfCB1bmRlZmluZWQge1xuICAgIGlmIChzZWdtZW50Py5zZWdtZW50RHVyYXRpb24gJiYgKHNlZ21lbnQuc2VnbWVudER1cmF0aW9uPy50b1NlY29uZHMoKSA8IDEgfHwgc2VnbWVudC5zZWdtZW50RHVyYXRpb24/LnRvU2Vjb25kcygpID4gMzApKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBTZWdtZW50RHVyYXRpb25SYW5nZWAsICdTZWdtZW50IER1cmF0aW9uIG5lZWRzIHRvIGJlIGJldHdlZW4gMS0zMCBzZWNvbmRzLicsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmIChzZWdtZW50Q29udGFpbmVyVHlwZSAhPSBDb250YWluZXJUeXBlLlRTICYmIChzZWdtZW50Py50c0luY2x1ZGVEdmJTdWJ0aXRsZXMgfHwgc2VnbWVudD8udHNVc2VBdWRpb1JlbmRpdGlvbkdyb3VwKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgVHNPcHRpb25zSW5jb21wYXRpYmxlYCwgJ0Rpc2FibGUgVFMgU2VnbWVudCBvcHRpb25zIGZvciBEdmJTdWJ0aXRsZXMgYW5kIEF1ZGlvUmVuZGl0aW9uR3JvdXBzIHdoZW4gdXNpbmcgQ01BRi4nLCB0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaW5jbHVkZUlmcmFtZU9ubHlTdHJlYW1zOiBzZWdtZW50Py5pbmNsdWRlSWZyYW1lT25seVN0cmVhbXMsXG4gICAgICBzZWdtZW50RHVyYXRpb25TZWNvbmRzOiBzZWdtZW50Py5zZWdtZW50RHVyYXRpb24/LnRvU2Vjb25kcygpLFxuICAgICAgc2VnbWVudE5hbWU6IHNlZ21lbnQ/LnNlZ21lbnROYW1lLFxuICAgICAgdHNJbmNsdWRlRHZiU3VidGl0bGVzOiBzZWdtZW50Py50c0luY2x1ZGVEdmJTdWJ0aXRsZXMsXG4gICAgICB0c1VzZUF1ZGlvUmVuZGl0aW9uR3JvdXA6IHNlZ21lbnQ/LnRzVXNlQXVkaW9SZW5kaXRpb25Hcm91cCxcbiAgICAgIHNjdGU6IChzZWdtZW50Py5zY3RlRmlsdGVyIHx8IHNlZ21lbnQ/LnNjdGVJblNlZ21lbnRzKSA/IHtcbiAgICAgICAgc2N0ZUZpbHRlcjogc2VnbWVudD8uc2N0ZUZpbHRlcixcbiAgICAgICAgc2N0ZUluU2VnbWVudHM6IHNlZ21lbnQ/LnNjdGVJblNlZ21lbnRzLFxuICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgIGVuY3J5cHRpb246IHNlZ21lbnQ/LmVuY3J5cHRpb24/Ll9iaW5kKHRoaXMpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBtZXRyaWMuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRyaWNOYW1lIG5hbWUgb2YgdGhlIG1ldHJpYy5cbiAgICogQHBhcmFtIHByb3BzIG1ldHJpYyBvcHRpb25zLlxuICAgKi9cbiAgcHVibGljIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWMoe1xuICAgICAgbWV0cmljTmFtZSxcbiAgICAgIG5hbWVzcGFjZTogJ0FXUy9NZWRpYVBhY2thZ2UnLFxuICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICBDaGFubmVsR3JvdXA6IHRoaXMuY2hhbm5lbEdyb3VwTmFtZSxcbiAgICAgICAgQ2hhbm5lbDogdGhpcy5jaGFubmVsTmFtZSxcbiAgICAgICAgT3JpZ2luRW5kcG9pbnQ6IHRoaXMub3JpZ2luRW5kcG9pbnROYW1lLFxuICAgICAgfSxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pLmF0dGFjaFRvKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgTWV0cmljIGZvciBJbmdyZXNzIEJ5dGVzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc3VtIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY0luZ3Jlc3NCeXRlcyhwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnSW5ncmVzc0J5dGVzJywge1xuICAgICAgc3RhdGlzdGljOiAnc3VtJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICB1bml0OiBVbml0LkJZVEVTLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBNZXRyaWMgZm9yIEVncmVzcyBCeXRlc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIHN1bSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNFZ3Jlc3NCeXRlcyhwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnRWdyZXNzQnl0ZXMnLCB7XG4gICAgICBzdGF0aXN0aWM6ICdzdW0nLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgIHVuaXQ6IFVuaXQuQllURVMsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIE1ldHJpYyBmb3IgSW5ncmVzcyByZXNwb25zZSB0aW1lXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXZlcmFnZSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNJbmdyZXNzUmVzcG9uc2VUaW1lKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdJbmdyZXNzUmVzcG9uc2VUaW1lJywge1xuICAgICAgc3RhdGlzdGljOiAnYXZnJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICB1bml0OiBVbml0Lk1JTExJU0VDT05EUyxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgTWV0cmljIGZvciBFZ3Jlc3MgUmVzcG9uc2UgdGltZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGF2ZXJhZ2Ugb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBwdWJsaWMgbWV0cmljRWdyZXNzUmVzcG9uc2VUaW1lKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdFZ3Jlc3NSZXNwb25zZVRpbWUnLCB7XG4gICAgICBzdGF0aXN0aWM6ICdhdmcnLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgIHVuaXQ6IFVuaXQuTUlMTElTRUNPTkRTLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBNZXRyaWMgZm9yIEVncmVzcyBSZXF1ZXN0IENvdW50XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc3VtIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY0VncmVzc1JlcXVlc3RDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnRWdyZXNzUmVxdWVzdENvdW50Jywge1xuICAgICAgc3RhdGlzdGljOiAnc3VtJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICB1bml0OiBVbml0LkNPVU5ULFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBNZXRyaWMgZm9yIEluZ3Jlc3MgUmVxdWVzdCBDb3VudFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHN1bSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNJbmdyZXNzUmVxdWVzdENvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdJbmdyZXNzUmVxdWVzdENvdW50Jywge1xuICAgICAgc3RhdGlzdGljOiAnc3VtJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICB1bml0OiBVbml0LkNPVU5ULFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWZpbmVzIGFuIEFXUyBFbGVtZW50YWwgTWVkaWFQYWNrYWdlIFYyIE9yaWdpbiBFbmRwb2ludFxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgT3JpZ2luRW5kcG9pbnQgZXh0ZW5kcyBPcmlnaW5FbmRwb2ludEJhc2UgaW1wbGVtZW50cyBJT3JpZ2luRW5kcG9pbnQge1xuICAvKiogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGNsYXNzLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1BFUlRZX0lOSkVDVElPTl9JRDogc3RyaW5nID0gJ0Bhd3MtY2RrLmF3cy1tZWRpYXBhY2thZ2V2Mi1hbHBoYS5PcmlnaW5FbmRwb2ludCc7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNoYW5uZWxHcm91cE5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGNoYW5uZWxOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBvcmlnaW5FbmRwb2ludE5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IG9yaWdpbkVuZHBvaW50QXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGNyZWF0aW9uIG9mIHRoZSBvcmlnaW4gZW5kcG9pbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEF0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdGltZXN0YW1wIG9mIHRoZSBtb2RpZmljYXRpb24gb2YgdGhlIG9yaWdpbiBlbmRwb2ludC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtb2RpZmllZEF0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBcnJheSBjb250YWluaW5nIExvdyBMYXRlbmN5IEhMUyBNYW5pZmVzdHMgY3JlYXRlZCBieSB0aGUgT3JpZ2luRW5kcG9pbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG93TGF0ZW5jeUhsc01hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBcnJheSBjb250YWluaW5nIEhMUyBNYW5pZmVzdHMgY3JlYXRlZCBieSB0aGUgT3JpZ2luRW5kcG9pbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaGxzTWFuaWZlc3RVcmxzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEFycmF5IGNvbnRhaW5pbmcgREFTSCBNYW5pZmVzdHMgY3JlYXRlZCBieSB0aGUgT3JpZ2luRW5kcG9pbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGFzaE1hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogQXJyYXkgY29udGFpbmluZyBNU1MgTWFuaWZlc3RzIGNyZWF0ZWQgYnkgdGhlIE9yaWdpbkVuZHBvaW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1zc01hbmlmZXN0VXJscz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogVGhlIHJlc291cmNlIHBvbGljeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBvcmlnaW4gZW5kcG9pbnQuXG4gICAqXG4gICAqIElmIGBhdXRvQ3JlYXRlUG9saWN5YCBpcyB0cnVlLCBhbiBgT3JpZ2luRW5kcG9pbnRQb2xpY3lgIHdpbGwgYmUgY3JlYXRlZCB1cG9uIHRoZVxuICAgKiBmaXJzdCBjYWxsIHRvIGFkZFRvUmVzb3VyY2VQb2xpY3kocykuXG4gICAqL1xuICBwdWJsaWMgcG9saWN5PzogT3JpZ2luRW5kcG9pbnRQb2xpY3k7XG4gIHByb3RlY3RlZCBhdXRvQ3JlYXRlUG9saWN5ID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIGhsc01hbmlmZXN0czogQ2ZuT3JpZ2luRW5kcG9pbnQuSGxzTWFuaWZlc3RDb25maWd1cmF0aW9uUHJvcGVydHlbXSA9IFtdO1xuICBwcm90ZWN0ZWQgbGxIbHNNYW5pZmVzdHM6IENmbk9yaWdpbkVuZHBvaW50Lkxvd0xhdGVuY3lIbHNNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdID0gW107XG4gIHByb3RlY3RlZCBkYXNoTWFuaWZlc3RzOiBDZm5PcmlnaW5FbmRwb2ludC5EYXNoTWFuaWZlc3RDb25maWd1cmF0aW9uUHJvcGVydHlbXSA9IFtdO1xuICBwcm90ZWN0ZWQgbXNzTWFuaWZlc3RzOiBDZm5PcmlnaW5FbmRwb2ludC5Nc3NNYW5pZmVzdENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVtdID0gW107XG4gIHByb3RlY3RlZCBzZWdtZW50PzogU2VnbWVudENvbmZpZ3VyYXRpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE9yaWdpbkVuZHBvaW50UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcHJvcHM/Lm9yaWdpbkVuZHBvaW50TmFtZSA/PyBMYXp5LnN0cmluZyh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7XG4gICAgICAgICAgbWF4TGVuZ3RoOiAyNTYsXG4gICAgICAgIH0pLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICAvLyBFbmhhbmNlZCBDREsgQW5hbHl0aWNzIFRlbGVtZXRyeVxuICAgIGFkZENvbnN0cnVjdE1ldGFkYXRhKHRoaXMsIHByb3BzKTtcblxuICAgIC8vIFZhbGlkYXRlIG9yaWdpbkVuZHBvaW50TmFtZSBpZiBwcm92aWRlZFxuICAgIGlmIChwcm9wcy5vcmlnaW5FbmRwb2ludE5hbWUgIT0gbnVsbCAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLm9yaWdpbkVuZHBvaW50TmFtZSkpIHtcbiAgICAgIGlmIChwcm9wcy5vcmlnaW5FbmRwb2ludE5hbWUubGVuZ3RoIDwgMSB8fCBwcm9wcy5vcmlnaW5FbmRwb2ludE5hbWUubGVuZ3RoID4gMjU2KSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YE9yaWdpbkVuZHBvaW50TmFtZUxlbmd0aGAsICdPcmlnaW4gZW5kcG9pbnQgbmFtZSBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMjU2IGNoYXJhY3RlcnMgaW4gbGVuZ3RoLicsIHRoaXMpO1xuICAgICAgfVxuICAgICAgaWYgKCFwcm9wcy5vcmlnaW5FbmRwb2ludE5hbWUubWF0Y2goL15bYS16QS1aMC05Xy1dKyQvKSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBPcmlnaW5FbmRwb2ludE5hbWVQYXR0ZXJuYCwgJ09yaWdpbiBlbmRwb2ludCBuYW1lIG11c3Qgb25seSBjb250YWluIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCBoeXBoZW5zLCBhbmQgdW5kZXJzY29yZXMuJywgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZGVzY3JpcHRpb24gaWYgcHJvdmlkZWRcbiAgICBpZiAocHJvcHMuZGVzY3JpcHRpb24gJiYgIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5kZXNjcmlwdGlvbikgJiYgcHJvcHMuZGVzY3JpcHRpb24ubGVuZ3RoID4gMTAyNCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgT3JpZ2luRW5kcG9pbnREZXNjcmlwdGlvbkxlbmd0aGAsICdPcmlnaW4gZW5kcG9pbnQgZGVzY3JpcHRpb24gbXVzdCBub3QgZXhjZWVkIDEwMjQgY2hhcmFjdGVycy4nLCB0aGlzKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlZ21lbnQgPSBwcm9wcy5zZWdtZW50O1xuXG4gICAgLy8gR2V0IGNvbnRhaW5lciB0eXBlIGZyb20gc2VnbWVudFxuICAgIGNvbnN0IGNvbnRhaW5lclR5cGUgPSBwcm9wcy5zZWdtZW50LmNvbnRhaW5lclR5cGU7XG5cbiAgICBpZiAocHJvcHM/LnN0YXJ0b3ZlcldpbmRvdyAmJiAocHJvcHMuc3RhcnRvdmVyV2luZG93LnRvU2Vjb25kcygpIDwgNjAgfHwgcHJvcHMuc3RhcnRvdmVyV2luZG93LnRvU2Vjb25kcygpID4gMTIwOTYwMCkpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YFN0YXJ0b3ZlcldpbmRvd1JhbmdlYCwgJ1N0YXJ0b3ZlciBXaW5kb3cgbmVlZHMgdG8gYmUgYmV0d2VlbiA2MC0xMjA5NjAwIHNlY29uZHMuJywgdGhpcyk7XG4gICAgfVxuXG4gICAgcHJvcHMubWFuaWZlc3RzLmZvckVhY2gobWFuaWZlc3QgPT4ge1xuICAgICAgbWFuaWZlc3QuX2JpbmQoe1xuICAgICAgICBobHNNYW5pZmVzdHM6IHRoaXMuaGxzTWFuaWZlc3RzLFxuICAgICAgICBsbEhsc01hbmlmZXN0czogdGhpcy5sbEhsc01hbmlmZXN0cyxcbiAgICAgICAgZGFzaE1hbmlmZXN0czogdGhpcy5kYXNoTWFuaWZlc3RzLFxuICAgICAgICBtc3NNYW5pZmVzdHM6IHRoaXMubXNzTWFuaWZlc3RzLFxuICAgICAgICBzZWdtZW50OiBwcm9wcy5zZWdtZW50LFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBWYWxpZGF0ZSBtYW5pZmVzdCBhbmQgY29udGFpbmVyIHR5cGUgY29tcGF0aWJpbGl0eVxuICAgIGlmICh0aGlzLm1zc01hbmlmZXN0cy5sZW5ndGggPiAwICYmIGNvbnRhaW5lclR5cGUgIT09IENvbnRhaW5lclR5cGUuSVNNKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBNc3NSZXF1aXJlc0lzbWAsICdNU1MgbWFuaWZlc3RzIHJlcXVpcmUgSVNNIGNvbnRhaW5lciB0eXBlLiBVc2UgU2VnbWVudC5pc20oKSBmb3IgTVNTIG1hbmlmZXN0cy4nLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXNoTWFuaWZlc3RzLmxlbmd0aCA+IDAgJiYgY29udGFpbmVyVHlwZSAhPT0gQ29udGFpbmVyVHlwZS5DTUFGKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBEYXNoUmVxdWlyZXNDbWFmYCwgJ0RBU0ggbWFuaWZlc3RzIHJlcXVpcmUgQ01BRiBjb250YWluZXIgdHlwZS4gVXNlIFNlZ21lbnQuY21hZigpIGZvciBEQVNIIG1hbmlmZXN0cy4nLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAoKHRoaXMuaGxzTWFuaWZlc3RzLmxlbmd0aCA+IDAgfHwgdGhpcy5sbEhsc01hbmlmZXN0cy5sZW5ndGggPiAwKSAmJiBjb250YWluZXJUeXBlID09PSBDb250YWluZXJUeXBlLklTTSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgSGxzSW5jb21wYXRpYmxlV2l0aElzbWAsICdITFMgYW5kIExvdyBMYXRlbmN5IEhMUyBtYW5pZmVzdHMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBJU00gY29udGFpbmVyIHR5cGUuIFVzZSBTZWdtZW50LmNtYWYoKSBvciBTZWdtZW50LnRzKCkgZm9yIEhMUyBtYW5pZmVzdHMuJywgdGhpcyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgRFJNIHNpZ25hbGxpbmcgcmVxdWlyZXMgZW5jcnlwdGlvblxuICAgIGlmICh0aGlzLmRhc2hNYW5pZmVzdHMuc29tZShtID0+IG0uZHJtU2lnbmFsaW5nKSAmJiAhcHJvcHMuc2VnbWVudC5lbmNyeXB0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBEcm1TaWduYWxsaW5nUmVxdWlyZXNFbmNyeXB0aW9uYCwgJ0RSTSBzaWduYWxsaW5nIHJlcXVpcmVzIGVuY3J5cHRpb24gdG8gYmUgY29uZmlndXJlZCBvbiB0aGUgZW5kcG9pbnQuJywgdGhpcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luID0gbmV3IENmbk9yaWdpbkVuZHBvaW50KHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIGNoYW5uZWxOYW1lOiBwcm9wcy5jaGFubmVsLmNoYW5uZWxOYW1lLFxuICAgICAgY2hhbm5lbEdyb3VwTmFtZTogcHJvcHMuY2hhbm5lbC5jaGFubmVsR3JvdXBOYW1lLFxuICAgICAgb3JpZ2luRW5kcG9pbnROYW1lOiB0aGlzLnBoeXNpY2FsTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIHRhZ3M6IHByb3BzPy50YWdzID8gcmVuZGVyVGFncyhwcm9wcy50YWdzKSA6IHVuZGVmaW5lZCxcbiAgICAgIGhsc01hbmlmZXN0czogTGF6eS5hbnkoeyBwcm9kdWNlOiAoKSA9PiB0aGlzLmhsc01hbmlmZXN0cyB9LCB7IG9taXRFbXB0eUFycmF5OiB0cnVlIH0pLFxuICAgICAgbG93TGF0ZW5jeUhsc01hbmlmZXN0czogTGF6eS5hbnkoeyBwcm9kdWNlOiAoKSA9PiB0aGlzLmxsSGxzTWFuaWZlc3RzIH0sIHsgb21pdEVtcHR5QXJyYXk6IHRydWUgfSksXG4gICAgICBkYXNoTWFuaWZlc3RzOiBMYXp5LmFueSh7IHByb2R1Y2U6ICgpID0+IHRoaXMuZGFzaE1hbmlmZXN0cyB9LCB7IG9taXRFbXB0eUFycmF5OiB0cnVlIH0pLFxuICAgICAgbXNzTWFuaWZlc3RzOiBMYXp5LmFueSh7IHByb2R1Y2U6ICgpID0+IHRoaXMubXNzTWFuaWZlc3RzIH0sIHsgb21pdEVtcHR5QXJyYXk6IHRydWUgfSksXG4gICAgICBjb250YWluZXJUeXBlOiBjb250YWluZXJUeXBlLFxuICAgICAgc3RhcnRvdmVyV2luZG93U2Vjb25kczogcHJvcHMuc3RhcnRvdmVyV2luZG93Py50b1NlY29uZHMoKSxcbiAgICAgIHNlZ21lbnQ6IHRoaXMuc2VnbWVudFZhbGlkYXRpb24oY29udGFpbmVyVHlwZSwgcHJvcHMuc2VnbWVudCksXG4gICAgICBmb3JjZUVuZHBvaW50RXJyb3JDb25maWd1cmF0aW9uOiBwcm9wcy5mb3JjZUVuZHBvaW50Q29uZmlndXJhdGlvbkNvbmRpdGlvbnMgPyB7XG4gICAgICAgIGVuZHBvaW50RXJyb3JDb25kaXRpb25zOiBwcm9wcy5mb3JjZUVuZHBvaW50Q29uZmlndXJhdGlvbkNvbmRpdGlvbnMsXG4gICAgICB9OiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICAvLyBUaGUgY2hhbm5lbE5hbWUvY2hhbm5lbEdyb3VwTmFtZSBhcmUgcmVuZGVyZWQgYXMgbGl0ZXJhbCBzdHJpbmdzIChub3QgQ0ZOIFJlZnMpLCBzb1xuICAgIC8vIENsb3VkRm9ybWF0aW9uIGNhbm5vdCBpbmZlciB0aGUgZGVwZW5kZW5jeS4gV2UgYWRkIGRpcmVjdCBDZm5SZXNvdXJjZS1sZXZlbCBEZXBlbmRzT25cbiAgICAvLyB0byBndWFyYW50ZWUgZGVwbG95IG9yZGVyaW5nIHdpdGhvdXQgdHJpZ2dlcmluZyBDREsncyBzdWJ0cmVlLWxldmVsIGN5Y2xlIGRldGVjdGlvbi5cbiAgICAvLyBGb3IgaW1wb3J0ZWQgY29uc3RydWN0cywgZGVmYXVsdENoaWxkIGlzIHVuZGVmaW5lZCAobm8gQ0ZOIHJlc291cmNlIHRvIG9yZGVyIGFnYWluc3QpLlxuICAgIGNvbnN0IGVuY3J5cHRpb25Sb2xlID0gcHJvcHMuc2VnbWVudC5lbmNyeXB0aW9uPy5fZ2V0Um9sZSgpO1xuICAgIGlmIChlbmNyeXB0aW9uUm9sZSkgb3JpZ2luLm5vZGUuYWRkRGVwZW5kZW5jeShlbmNyeXB0aW9uUm9sZSk7XG4gICAgY29uc3QgZW5jcnlwdGlvbkNlcnQgPSBwcm9wcy5zZWdtZW50LmVuY3J5cHRpb24/Ll9nZXRDZXJ0aWZpY2F0ZSgpO1xuICAgIGlmIChlbmNyeXB0aW9uQ2VydCkgb3JpZ2luLm5vZGUuYWRkRGVwZW5kZW5jeShlbmNyeXB0aW9uQ2VydCk7XG4gICAgY29uc3QgY2hhbm5lbENmbiA9IHByb3BzLmNoYW5uZWwubm9kZS5kZWZhdWx0Q2hpbGQgYXMgQ2ZuUmVzb3VyY2UgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGNoYW5uZWxDZm4gJiYgQ2ZuUmVzb3VyY2UuaXNDZm5SZXNvdXJjZShjaGFubmVsQ2ZuKSkge1xuICAgICAgb3JpZ2luLmFkZERlcGVuZGVuY3koY2hhbm5lbENmbik7XG4gICAgfVxuICAgIGNvbnN0IGdyb3VwQ2ZuID0gcHJvcHMuY2hhbm5lbC5jaGFubmVsR3JvdXA/Lm5vZGUuZGVmYXVsdENoaWxkIGFzIENmblJlc291cmNlIHwgdW5kZWZpbmVkO1xuICAgIGlmIChncm91cENmbiAmJiBDZm5SZXNvdXJjZS5pc0NmblJlc291cmNlKGdyb3VwQ2ZuKSkge1xuICAgICAgb3JpZ2luLmFkZERlcGVuZGVuY3koZ3JvdXBDZm4pO1xuICAgIH1cblxuICAgIHRoaXMubG93TGF0ZW5jeUhsc01hbmlmZXN0VXJscyA9IHRoaXMubGxIbHNNYW5pZmVzdHMubWFwKChfLCBpKSA9PiBGbi5zZWxlY3QoaSwgb3JpZ2luLmF0dHJMb3dMYXRlbmN5SGxzTWFuaWZlc3RVcmxzKSk7XG4gICAgdGhpcy5obHNNYW5pZmVzdFVybHMgPSB0aGlzLmhsc01hbmlmZXN0cy5tYXAoKF8sIGkpID0+IEZuLnNlbGVjdChpLCBvcmlnaW4uYXR0ckhsc01hbmlmZXN0VXJscykpO1xuICAgIHRoaXMuZGFzaE1hbmlmZXN0VXJscyA9IHRoaXMuZGFzaE1hbmlmZXN0cy5tYXAoKF8sIGkpID0+IEZuLnNlbGVjdChpLCBvcmlnaW4uYXR0ckRhc2hNYW5pZmVzdFVybHMpKTtcbiAgICB0aGlzLm1zc01hbmlmZXN0VXJscyA9IHRoaXMubXNzTWFuaWZlc3RzLm1hcCgoXywgaSkgPT4gRm4uc2VsZWN0KGksIG9yaWdpbi5hdHRyTXNzTWFuaWZlc3RVcmxzKSk7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBvcmlnaW4uYXR0ckNyZWF0ZWRBdDtcbiAgICB0aGlzLm1vZGlmaWVkQXQgPSBvcmlnaW4uYXR0ck1vZGlmaWVkQXQ7XG4gICAgdGhpcy5jaGFubmVsR3JvdXBOYW1lID0gb3JpZ2luLmNoYW5uZWxHcm91cE5hbWU7XG4gICAgdGhpcy5jaGFubmVsTmFtZSA9IG9yaWdpbi5jaGFubmVsTmFtZTtcbiAgICB0aGlzLm9yaWdpbkVuZHBvaW50TmFtZSA9IG9yaWdpbi5vcmlnaW5FbmRwb2ludE5hbWU7XG4gICAgdGhpcy5vcmlnaW5FbmRwb2ludEFybiA9IG9yaWdpbi5hdHRyQXJuO1xuXG4gICAgb3JpZ2luLmFwcGx5UmVtb3ZhbFBvbGljeShwcm9wcz8ucmVtb3ZhbFBvbGljeSA/PyBSZW1vdmFsUG9saWN5LkRFU1RST1kpO1xuXG4gICAgLy8gUHJlLXNldCBDRE4gYXV0aCBjb25maWcgaWYgcHJvdmlkZWQgaW4gcHJvcHNcbiAgICBpZiAocHJvcHMuY2RuQXV0aCkge1xuICAgICAgdGhpcy5fc2V0Q2RuQXV0aChwcm9wcy5jZG5BdXRoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==