@aws-cdk/aws-mediaconnect-alpha 2.263.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +28415 -0
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +592 -0
- package/LICENSE +201 -0
- package/NOTICE +2 -0
- package/README.md +1280 -0
- package/awslint.json +50 -0
- package/grants.json +42 -0
- package/lib/bridge-output.d.ts +54 -0
- package/lib/bridge-output.js +122 -0
- package/lib/bridge-source.d.ts +79 -0
- package/lib/bridge-source.js +217 -0
- package/lib/bridge.d.ts +419 -0
- package/lib/bridge.js +490 -0
- package/lib/flow-entitlement.d.ts +86 -0
- package/lib/flow-entitlement.js +152 -0
- package/lib/flow-output.d.ts +329 -0
- package/lib/flow-output.js +415 -0
- package/lib/flow-source-configuration.d.ts +558 -0
- package/lib/flow-source-configuration.js +595 -0
- package/lib/flow-source.d.ts +116 -0
- package/lib/flow-source.js +190 -0
- package/lib/flow.d.ts +975 -0
- package/lib/flow.js +1065 -0
- package/lib/gateway.d.ts +142 -0
- package/lib/gateway.js +236 -0
- package/lib/index.d.ts +14 -0
- package/lib/index.js +31 -0
- package/lib/mediaconnect-grants.generated.d.ts +53 -0
- package/lib/mediaconnect-grants.generated.js +136 -0
- package/lib/router-input.d.ts +686 -0
- package/lib/router-input.js +1095 -0
- package/lib/router-network-interface.d.ts +153 -0
- package/lib/router-network-interface.js +245 -0
- package/lib/router-output.d.ts +557 -0
- package/lib/router-output.js +789 -0
- package/lib/shared.d.ts +548 -0
- package/lib/shared.js +668 -0
- package/package.json +118 -0
- package/rosetta/_generated.ts-fixture +6 -0
- package/rosetta/default.ts-fixture +68 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import type { IResource } from 'aws-cdk-lib';
|
|
2
|
+
import type { IFlowSourceRef } from 'aws-cdk-lib/aws-mediaconnect';
|
|
3
|
+
import type { Construct } from 'constructs';
|
|
4
|
+
import type { IFlow } from './flow';
|
|
5
|
+
import type { SourceConfiguration } from './flow-source-configuration';
|
|
6
|
+
/**
|
|
7
|
+
* Interface for Flow Source
|
|
8
|
+
*/
|
|
9
|
+
export interface IFlowSource extends IResource, IFlowSourceRef {
|
|
10
|
+
/**
|
|
11
|
+
* The Amazon Resource Name (ARN) of the flow source.
|
|
12
|
+
*
|
|
13
|
+
* @attribute
|
|
14
|
+
*/
|
|
15
|
+
readonly flowSourceArn: string;
|
|
16
|
+
/**
|
|
17
|
+
* The name of the flow source.
|
|
18
|
+
*
|
|
19
|
+
* @attribute
|
|
20
|
+
*/
|
|
21
|
+
readonly flowSourceName: string;
|
|
22
|
+
/**
|
|
23
|
+
* The IP address that the flow will be listening on for incoming content.
|
|
24
|
+
*
|
|
25
|
+
* @attribute
|
|
26
|
+
*/
|
|
27
|
+
readonly ingestIp: string;
|
|
28
|
+
/**
|
|
29
|
+
* The port that the flow will be listening on for incoming content.
|
|
30
|
+
*
|
|
31
|
+
* @attribute
|
|
32
|
+
*/
|
|
33
|
+
readonly sourceIngestPort: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Properties for the flow source
|
|
37
|
+
*/
|
|
38
|
+
export interface FlowSourceProps {
|
|
39
|
+
/**
|
|
40
|
+
* Additional Source Configuration.
|
|
41
|
+
*
|
|
42
|
+
* Set the source's name via `name` on the configuration (e.g. `SourceConfiguration.rtp({ name })`).
|
|
43
|
+
* When no name is set there, one is generated from construct naming.
|
|
44
|
+
*/
|
|
45
|
+
readonly source: SourceConfiguration;
|
|
46
|
+
/**
|
|
47
|
+
* The flow this source is connected to. The flow must have Failover enabled to add an additional source.
|
|
48
|
+
*/
|
|
49
|
+
readonly flow: IFlow;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Attributes for importing an existing Flow Source.
|
|
53
|
+
*/
|
|
54
|
+
export interface FlowSourceAttributes {
|
|
55
|
+
/**
|
|
56
|
+
* The Amazon Resource Name (ARN) of the flow source.
|
|
57
|
+
*/
|
|
58
|
+
readonly flowSourceArn: string;
|
|
59
|
+
/**
|
|
60
|
+
* The name of the flow source.
|
|
61
|
+
*
|
|
62
|
+
* @default - accessing `flowSourceName` on the imported source throws; only provide when available.
|
|
63
|
+
*/
|
|
64
|
+
readonly flowSourceName?: string;
|
|
65
|
+
/**
|
|
66
|
+
* The IP address that the flow will be listening on for incoming content.
|
|
67
|
+
*
|
|
68
|
+
* @default - accessing `ingestIp` on the imported source throws; only provide when available.
|
|
69
|
+
*/
|
|
70
|
+
readonly ingestIp?: string;
|
|
71
|
+
/**
|
|
72
|
+
* The port that the flow will be listening on for incoming content.
|
|
73
|
+
*
|
|
74
|
+
* @default - accessing `sourceIngestPort` on the imported source throws; only provide when available.
|
|
75
|
+
*/
|
|
76
|
+
readonly sourceIngestPort?: string;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Adds source to an existing flow.
|
|
80
|
+
*
|
|
81
|
+
* Adding an additional source requires Failover to be enabled. When you enable Failover,
|
|
82
|
+
* the additional source must use the same protocol as the existing source. A source is
|
|
83
|
+
* the external video content that includes configuration information (encryption and source type)
|
|
84
|
+
* and a network address. Each flow has at least one source. A standard source comes from a source
|
|
85
|
+
* other than another AWS Elemental MediaConnect flow, such as an on-premises encoder.
|
|
86
|
+
*/
|
|
87
|
+
export declare class FlowSource extends FlowSourceBase {
|
|
88
|
+
/** Uniquely identifies this class. */
|
|
89
|
+
static readonly PROPERTY_INJECTION_ID: string;
|
|
90
|
+
/**
|
|
91
|
+
* Import an existing Flow Source from its ARN.
|
|
92
|
+
*
|
|
93
|
+
* @param scope The parent construct
|
|
94
|
+
* @param id The construct id
|
|
95
|
+
* @param flowSourceArn The ARN of the Flow Source
|
|
96
|
+
* @returns A Flow Source construct
|
|
97
|
+
*/
|
|
98
|
+
static fromFlowSourceArn(scope: Construct, id: string, flowSourceArn: string): IFlowSource;
|
|
99
|
+
/**
|
|
100
|
+
* Import an existing Flow Source from its attributes.
|
|
101
|
+
*
|
|
102
|
+
* Provide `ingestIp` and/or `sourceIngestPort` when importing a source that was deployed
|
|
103
|
+
* externally — otherwise accessing those properties on the imported construct will throw.
|
|
104
|
+
*
|
|
105
|
+
* @param scope The parent construct
|
|
106
|
+
* @param id The construct id
|
|
107
|
+
* @param attrs The Flow Source attributes
|
|
108
|
+
* @returns A Flow Source construct
|
|
109
|
+
*/
|
|
110
|
+
static fromFlowSourceAttributes(scope: Construct, id: string, attrs: FlowSourceAttributes): IFlowSource;
|
|
111
|
+
readonly flowSourceArn: string;
|
|
112
|
+
readonly flowSourceName: string;
|
|
113
|
+
readonly ingestIp: string;
|
|
114
|
+
readonly sourceIngestPort: string;
|
|
115
|
+
constructor(scope: Construct, id: string, props: FlowSourceProps);
|
|
116
|
+
}
|
|
@@ -0,0 +1,190 @@
|
|
|
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.FlowSource = 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_mediaconnect_1 = require("aws-cdk-lib/aws-mediaconnect");
|
|
42
|
+
const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
|
|
43
|
+
const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
|
|
44
|
+
const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
|
|
45
|
+
const flow_source_configuration_1 = require("./flow-source-configuration");
|
|
46
|
+
/**
|
|
47
|
+
* Shared base for both real and imported flow sources.
|
|
48
|
+
* @internal
|
|
49
|
+
*/
|
|
50
|
+
class FlowSourceBase extends aws_cdk_lib_1.Resource {
|
|
51
|
+
get flowSourceRef() {
|
|
52
|
+
return { sourceArn: this.flowSourceArn };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Adds source to an existing flow.
|
|
57
|
+
*
|
|
58
|
+
* Adding an additional source requires Failover to be enabled. When you enable Failover,
|
|
59
|
+
* the additional source must use the same protocol as the existing source. A source is
|
|
60
|
+
* the external video content that includes configuration information (encryption and source type)
|
|
61
|
+
* and a network address. Each flow has at least one source. A standard source comes from a source
|
|
62
|
+
* other than another AWS Elemental MediaConnect flow, such as an on-premises encoder.
|
|
63
|
+
*/
|
|
64
|
+
let FlowSource = (() => {
|
|
65
|
+
let _classDecorators = [prop_injectable_1.propertyInjectable];
|
|
66
|
+
let _classDescriptor;
|
|
67
|
+
let _classExtraInitializers = [];
|
|
68
|
+
let _classThis;
|
|
69
|
+
let _classSuper = FlowSourceBase;
|
|
70
|
+
var FlowSource = class extends _classSuper {
|
|
71
|
+
static { _classThis = this; }
|
|
72
|
+
static {
|
|
73
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
74
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
75
|
+
FlowSource = _classThis = _classDescriptor.value;
|
|
76
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
77
|
+
}
|
|
78
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.FlowSource", version: "2.263.0-alpha.0" };
|
|
79
|
+
/** Uniquely identifies this class. */
|
|
80
|
+
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-mediaconnect-alpha.FlowSource';
|
|
81
|
+
/**
|
|
82
|
+
* Import an existing Flow Source from its ARN.
|
|
83
|
+
*
|
|
84
|
+
* @param scope The parent construct
|
|
85
|
+
* @param id The construct id
|
|
86
|
+
* @param flowSourceArn The ARN of the Flow Source
|
|
87
|
+
* @returns A Flow Source construct
|
|
88
|
+
*/
|
|
89
|
+
static fromFlowSourceArn(scope, id, flowSourceArn) {
|
|
90
|
+
return FlowSource.fromFlowSourceAttributes(scope, id, { flowSourceArn });
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Import an existing Flow Source from its attributes.
|
|
94
|
+
*
|
|
95
|
+
* Provide `ingestIp` and/or `sourceIngestPort` when importing a source that was deployed
|
|
96
|
+
* externally — otherwise accessing those properties on the imported construct will throw.
|
|
97
|
+
*
|
|
98
|
+
* @param scope The parent construct
|
|
99
|
+
* @param id The construct id
|
|
100
|
+
* @param attrs The Flow Source attributes
|
|
101
|
+
* @returns A Flow Source construct
|
|
102
|
+
*/
|
|
103
|
+
static fromFlowSourceAttributes(scope, id, attrs) {
|
|
104
|
+
try {
|
|
105
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_FlowSourceAttributes(attrs);
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
109
|
+
Error.captureStackTrace(error, this.fromFlowSourceAttributes);
|
|
110
|
+
}
|
|
111
|
+
throw error;
|
|
112
|
+
}
|
|
113
|
+
class Import extends FlowSourceBase {
|
|
114
|
+
flowSourceArn = attrs.flowSourceArn;
|
|
115
|
+
get flowSourceName() {
|
|
116
|
+
if (attrs.flowSourceName)
|
|
117
|
+
return attrs.flowSourceName;
|
|
118
|
+
throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `FlowSourceNameNotProvided`, `'flowSourceName' is not available on imported FlowSource ${this.node.path}; pass it via fromFlowSourceAttributes`, this);
|
|
119
|
+
}
|
|
120
|
+
get ingestIp() {
|
|
121
|
+
if (attrs.ingestIp)
|
|
122
|
+
return attrs.ingestIp;
|
|
123
|
+
throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `FlowSourceIngestIpNotProvided`, `'ingestIp' is not available on imported FlowSource ${this.node.path}; pass it via fromFlowSourceAttributes`, this);
|
|
124
|
+
}
|
|
125
|
+
get sourceIngestPort() {
|
|
126
|
+
if (attrs.sourceIngestPort)
|
|
127
|
+
return attrs.sourceIngestPort;
|
|
128
|
+
throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `FlowSourceIngestPortNotProvided`, `'sourceIngestPort' is not available on imported FlowSource ${this.node.path}; pass it via fromFlowSourceAttributes`, this);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return new Import(scope, id);
|
|
132
|
+
}
|
|
133
|
+
flowSourceArn;
|
|
134
|
+
flowSourceName;
|
|
135
|
+
ingestIp;
|
|
136
|
+
sourceIngestPort;
|
|
137
|
+
constructor(scope, id, props) {
|
|
138
|
+
super(scope, id, {
|
|
139
|
+
// The source name comes from the `source` configuration; fall back to a
|
|
140
|
+
// construct-derived name when it sets none.
|
|
141
|
+
physicalName: props.source.flowSourceName ?? aws_cdk_lib_1.Lazy.string({ produce: () => aws_cdk_lib_1.Names.uniqueResourceName(this, { maxLength: 64 }) }),
|
|
142
|
+
});
|
|
143
|
+
try {
|
|
144
|
+
jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_FlowSourceProps(props);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
148
|
+
Error.captureStackTrace(error, FlowSource);
|
|
149
|
+
}
|
|
150
|
+
throw error;
|
|
151
|
+
}
|
|
152
|
+
// Validate the source name when one is set on the configuration.
|
|
153
|
+
if (props.source.flowSourceName != null && props.source.flowSourceName !== '' && !aws_cdk_lib_1.Token.isUnresolved(props.source.flowSourceName)) {
|
|
154
|
+
if (props.source.flowSourceName.length > 64) {
|
|
155
|
+
throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `FlowSourceNameLength`, `Flow source name must be between 1 and 64 characters, got ${props.source.flowSourceName.length}`, this);
|
|
156
|
+
}
|
|
157
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(props.source.flowSourceName)) {
|
|
158
|
+
throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `FlowSourceNameFormat`, `Flow source name must contain only alphanumeric characters, hyphens, and underscores, got '${props.source.flowSourceName}'`, this);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// Enhanced CDK Analytics Telemetry
|
|
162
|
+
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
163
|
+
const sourceConfig = props.source._bind(this);
|
|
164
|
+
if (sourceConfig.protocol === flow_source_configuration_1.SourceProtocol.CDI.value || sourceConfig.protocol === flow_source_configuration_1.SourceProtocol.JPEGXS.value) {
|
|
165
|
+
throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `FlowSourceProtocolNotSupported`, 'CDI or JPEGXS can only be configured on the main Flow construct', this);
|
|
166
|
+
}
|
|
167
|
+
if (!props.flow.isFailoverEnabled) {
|
|
168
|
+
throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `FlowSourceFailoverRequired`, 'Failover configuration needs to be configured and enabled to add an additional Flow source. ' +
|
|
169
|
+
'If the Flow is imported via fromFlowAttributes(), set isFailoverEnabled: true', this);
|
|
170
|
+
}
|
|
171
|
+
const { name: _sourceName, ...restSourceConfig } = sourceConfig;
|
|
172
|
+
const resource = new aws_mediaconnect_1.CfnFlowSource(this, 'Resource', {
|
|
173
|
+
...restSourceConfig,
|
|
174
|
+
flowArn: props.flow.flowArn,
|
|
175
|
+
name: this.physicalName,
|
|
176
|
+
description: sourceConfig.description ?? this.physicalName,
|
|
177
|
+
});
|
|
178
|
+
this.flowSourceArn = resource.flowSourceRef.sourceArn;
|
|
179
|
+
this.flowSourceName = this.physicalName;
|
|
180
|
+
this.ingestIp = resource.attrIngestIp;
|
|
181
|
+
this.sourceIngestPort = resource.attrSourceIngestPort;
|
|
182
|
+
}
|
|
183
|
+
static {
|
|
184
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
return FlowSource = _classThis;
|
|
188
|
+
})();
|
|
189
|
+
exports.FlowSource = FlowSource;
|
|
190
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvdy1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmbG93LXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSw2Q0FBNEU7QUFDNUUsbUVBQTZEO0FBRTdELDRFQUE0RDtBQUM1RCw4RUFBOEU7QUFDOUUsMEVBQTBFO0FBSTFFLDJFQUE2RDtBQW9GN0Q7OztHQUdHO0FBQ0gsTUFBZSxjQUFlLFNBQVEsc0JBQVE7SUFNNUMsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0tBQzFDO0NBQ0Y7QUFFRDs7Ozs7Ozs7R0FRRztJQUVVLFVBQVU7NEJBRHRCLG9DQUFrQjs7OztzQkFDYSxjQUFjOzBCQUF0QixTQUFRLFdBQWM7Ozs7WUFBOUMsNktBbUhDOzs7OztRQWxIQyxzQ0FBc0M7UUFDL0IsTUFBTSxDQUFVLHFCQUFxQixHQUFXLDRDQUE0QyxDQUFDO1FBRXBHOzs7Ozs7O1dBT0c7UUFDSSxNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsYUFBcUI7WUFDakYsT0FBTyxVQUFVLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7U0FDMUU7UUFFRDs7Ozs7Ozs7OztXQVVHO1FBQ0ksTUFBTSxDQUFDLHdCQUF3QixDQUFDLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTJCOzs7Ozs7Ozs7O1lBQzlGLE1BQU0sTUFBTyxTQUFRLGNBQWM7Z0JBQ2pCLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO2dCQUVwRCxJQUFXLGNBQWM7b0JBQ3ZCLElBQUksS0FBSyxDQUFDLGNBQWM7d0JBQUUsT0FBTyxLQUFLLENBQUMsY0FBYyxDQUFDO29CQUN0RCxNQUFNLElBQUksNkJBQWUsQ0FDdkIsSUFBQSxzQkFBRyxF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QUcsRUFBQSxnQ0FBZ0MsRUFBRSxpRUFBaUUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMxSSxDQUFDO1lBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDbEMsTUFBTSxJQUFJLDZCQUFlLENBQ3ZCLElBQUEsc0JBQUcsRUFBQSw0QkFBNEIsRUFDL0IsOEZBQThGO29CQUM5RiwrRUFBK0UsRUFDL0UsSUFBSSxDQUNMLENBQUM7WUFDSixDQUFDO1lBRUQsTUFBTSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsR0FBRyxnQkFBZ0IsRUFBRSxHQUFHLFlBQVksQ0FBQztZQUVoRSxNQUFNLFFBQVEsR0FBRyxJQUFJLGdDQUFhLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFDbkQsR0FBRyxnQkFBZ0I7Z0JBQ25CLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU87Z0JBQzNCLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWTtnQkFDdkIsV0FBVyxFQUFFLFlBQVksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFlBQVk7YUFDM0QsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQztZQUN0RCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7WUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsb0JBQW9CLENBQUM7U0FDdkQ7O1lBbEhVLHVEQUFVOzs7OztBQUFWLGdDQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUmVzb3VyY2UgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBSZXNvdXJjZSwgTGF6eSwgTmFtZXMsIFRva2VuLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDZm5GbG93U291cmNlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLW1lZGlhY29ubmVjdCc7XG5pbXBvcnQgdHlwZSB7IElGbG93U291cmNlUmVmLCBGbG93U291cmNlUmVmZXJlbmNlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLW1lZGlhY29ubmVjdCc7XG5pbXBvcnQgeyBsaXQgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9oZWxwZXJzLWludGVybmFsJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuaW1wb3J0IHsgcHJvcGVydHlJbmplY3RhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvcHJvcC1pbmplY3RhYmxlJztcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgdHlwZSB7IElGbG93IH0gZnJvbSAnLi9mbG93JztcbmltcG9ydCB0eXBlIHsgU291cmNlQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vZmxvdy1zb3VyY2UtY29uZmlndXJhdGlvbic7XG5pbXBvcnQgeyBTb3VyY2VQcm90b2NvbCB9IGZyb20gJy4vZmxvdy1zb3VyY2UtY29uZmlndXJhdGlvbic7XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBGbG93IFNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElGbG93U291cmNlIGV4dGVuZHMgSVJlc291cmNlLCBJRmxvd1NvdXJjZVJlZiB7XG4gIC8qKlxuICAgKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIGZsb3cgc291cmNlLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBmbG93U291cmNlQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmbG93IHNvdXJjZS5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZmxvd1NvdXJjZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElQIGFkZHJlc3MgdGhhdCB0aGUgZmxvdyB3aWxsIGJlIGxpc3RlbmluZyBvbiBmb3IgaW5jb21pbmcgY29udGVudC5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5nZXN0SXA6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBvcnQgdGhhdCB0aGUgZmxvdyB3aWxsIGJlIGxpc3RlbmluZyBvbiBmb3IgaW5jb21pbmcgY29udGVudC5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlSW5nZXN0UG9ydDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIHRoZSBmbG93IHNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dTb3VyY2VQcm9wcyB7XG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIFNvdXJjZSBDb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBTZXQgdGhlIHNvdXJjZSdzIG5hbWUgdmlhIGBuYW1lYCBvbiB0aGUgY29uZmlndXJhdGlvbiAoZS5nLiBgU291cmNlQ29uZmlndXJhdGlvbi5ydHAoeyBuYW1lIH0pYCkuXG4gICAqIFdoZW4gbm8gbmFtZSBpcyBzZXQgdGhlcmUsIG9uZSBpcyBnZW5lcmF0ZWQgZnJvbSBjb25zdHJ1Y3QgbmFtaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlOiBTb3VyY2VDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgZmxvdyB0aGlzIHNvdXJjZSBpcyBjb25uZWN0ZWQgdG8uIFRoZSBmbG93IG11c3QgaGF2ZSBGYWlsb3ZlciBlbmFibGVkIHRvIGFkZCBhbiBhZGRpdGlvbmFsIHNvdXJjZS5cbiAgICovXG4gIHJlYWRvbmx5IGZsb3c6IElGbG93O1xufVxuXG4vKipcbiAqIEF0dHJpYnV0ZXMgZm9yIGltcG9ydGluZyBhbiBleGlzdGluZyBGbG93IFNvdXJjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbG93U291cmNlQXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIGZsb3cgc291cmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgZmxvd1NvdXJjZUFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZmxvdyBzb3VyY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYWNjZXNzaW5nIGBmbG93U291cmNlTmFtZWAgb24gdGhlIGltcG9ydGVkIHNvdXJjZSB0aHJvd3M7IG9ubHkgcHJvdmlkZSB3aGVuIGF2YWlsYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IGZsb3dTb3VyY2VOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSVAgYWRkcmVzcyB0aGF0IHRoZSBmbG93IHdpbGwgYmUgbGlzdGVuaW5nIG9uIGZvciBpbmNvbWluZyBjb250ZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFjY2Vzc2luZyBgaW5nZXN0SXBgIG9uIHRoZSBpbXBvcnRlZCBzb3VyY2UgdGhyb3dzOyBvbmx5IHByb3ZpZGUgd2hlbiBhdmFpbGFibGUuXG4gICAqL1xuICByZWFkb25seSBpbmdlc3RJcD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBvcnQgdGhhdCB0aGUgZmxvdyB3aWxsIGJlIGxpc3RlbmluZyBvbiBmb3IgaW5jb21pbmcgY29udGVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhY2Nlc3NpbmcgYHNvdXJjZUluZ2VzdFBvcnRgIG9uIHRoZSBpbXBvcnRlZCBzb3VyY2UgdGhyb3dzOyBvbmx5IHByb3ZpZGUgd2hlbiBhdmFpbGFibGUuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VJbmdlc3RQb3J0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNoYXJlZCBiYXNlIGZvciBib3RoIHJlYWwgYW5kIGltcG9ydGVkIGZsb3cgc291cmNlcy5cbiAqIEBpbnRlcm5hbFxuICovXG5hYnN0cmFjdCBjbGFzcyBGbG93U291cmNlQmFzZSBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSUZsb3dTb3VyY2Uge1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgZmxvd1NvdXJjZUFybjogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgZmxvd1NvdXJjZU5hbWU6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGluZ2VzdElwOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBzb3VyY2VJbmdlc3RQb3J0OiBzdHJpbmc7XG5cbiAgcHVibGljIGdldCBmbG93U291cmNlUmVmKCk6IEZsb3dTb3VyY2VSZWZlcmVuY2Uge1xuICAgIHJldHVybiB7IHNvdXJjZUFybjogdGhpcy5mbG93U291cmNlQXJuIH07XG4gIH1cbn1cblxuLyoqXG4gKiBBZGRzIHNvdXJjZSB0byBhbiBleGlzdGluZyBmbG93LlxuICpcbiAqIEFkZGluZyBhbiBhZGRpdGlvbmFsIHNvdXJjZSByZXF1aXJlcyBGYWlsb3ZlciB0byBiZSBlbmFibGVkLiBXaGVuIHlvdSBlbmFibGUgRmFpbG92ZXIsXG4gKiB0aGUgYWRkaXRpb25hbCBzb3VyY2UgbXVzdCB1c2UgdGhlIHNhbWUgcHJvdG9jb2wgYXMgdGhlIGV4aXN0aW5nIHNvdXJjZS4gQSBzb3VyY2UgaXNcbiAqIHRoZSBleHRlcm5hbCB2aWRlbyBjb250ZW50IHRoYXQgaW5jbHVkZXMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiAoZW5jcnlwdGlvbiBhbmQgc291cmNlIHR5cGUpXG4gKiBhbmQgYSBuZXR3b3JrIGFkZHJlc3MuIEVhY2ggZmxvdyBoYXMgYXQgbGVhc3Qgb25lIHNvdXJjZS4gQSBzdGFuZGFyZCBzb3VyY2UgY29tZXMgZnJvbSBhIHNvdXJjZVxuICogb3RoZXIgdGhhbiBhbm90aGVyIEFXUyBFbGVtZW50YWwgTWVkaWFDb25uZWN0IGZsb3csIHN1Y2ggYXMgYW4gb24tcHJlbWlzZXMgZW5jb2Rlci5cbiAqL1xuQHByb3BlcnR5SW5qZWN0YWJsZVxuZXhwb3J0IGNsYXNzIEZsb3dTb3VyY2UgZXh0ZW5kcyBGbG93U291cmNlQmFzZSB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLW1lZGlhY29ubmVjdC1hbHBoYS5GbG93U291cmNlJztcblxuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIEZsb3cgU291cmNlIGZyb20gaXRzIEFSTi5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY29uc3RydWN0XG4gICAqIEBwYXJhbSBpZCBUaGUgY29uc3RydWN0IGlkXG4gICAqIEBwYXJhbSBmbG93U291cmNlQXJuIFRoZSBBUk4gb2YgdGhlIEZsb3cgU291cmNlXG4gICAqIEByZXR1cm5zIEEgRmxvdyBTb3VyY2UgY29uc3RydWN0XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21GbG93U291cmNlQXJuKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGZsb3dTb3VyY2VBcm46IHN0cmluZyk6IElGbG93U291cmNlIHtcbiAgICByZXR1cm4gRmxvd1NvdXJjZS5mcm9tRmxvd1NvdXJjZUF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7IGZsb3dTb3VyY2VBcm4gfSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIEZsb3cgU291cmNlIGZyb20gaXRzIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIFByb3ZpZGUgYGluZ2VzdElwYCBhbmQvb3IgYHNvdXJjZUluZ2VzdFBvcnRgIHdoZW4gaW1wb3J0aW5nIGEgc291cmNlIHRoYXQgd2FzIGRlcGxveWVkXG4gICAqIGV4dGVybmFsbHkg4oCUIG90aGVyd2lzZSBhY2Nlc3NpbmcgdGhvc2UgcHJvcGVydGllcyBvbiB0aGUgaW1wb3J0ZWQgY29uc3RydWN0IHdpbGwgdGhyb3cuXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgcGFyZW50IGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gaWQgVGhlIGNvbnN0cnVjdCBpZFxuICAgKiBAcGFyYW0gYXR0cnMgVGhlIEZsb3cgU291cmNlIGF0dHJpYnV0ZXNcbiAgICogQHJldHVybnMgQSBGbG93IFNvdXJjZSBjb25zdHJ1Y3RcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUZsb3dTb3VyY2VBdHRyaWJ1dGVzKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGF0dHJzOiBGbG93U291cmNlQXR0cmlidXRlcyk6IElGbG93U291cmNlIHtcbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBGbG93U291cmNlQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZmxvd1NvdXJjZUFybiA9IGF0dHJzLmZsb3dTb3VyY2VBcm47XG5cbiAgICAgIHB1YmxpYyBnZXQgZmxvd1NvdXJjZU5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGF0dHJzLmZsb3dTb3VyY2VOYW1lKSByZXR1cm4gYXR0cnMuZmxvd1NvdXJjZU5hbWU7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YEZsb3dTb3VyY2VOYW1lTm90UHJvdmlkZWRgLFxuICAgICAgICAgIGAnZmxvd1NvdXJjZU5hbWUnIGlzIG5vdCBhdmFpbGFibGUgb24gaW1wb3J0ZWQgRmxvd1NvdXJjZSAke3RoaXMubm9kZS5wYXRofTsgcGFzcyBpdCB2aWEgZnJvbUZsb3dTb3VyY2VBdHRyaWJ1dGVzYCxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgZ2V0IGluZ2VzdElwKCk6IHN0cmluZyB7XG4gICAgICAgIGlmIChhdHRycy5pbmdlc3RJcCkgcmV0dXJuIGF0dHJzLmluZ2VzdElwO1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBGbG93U291cmNlSW5nZXN0SXBOb3RQcm92aWRlZGAsXG4gICAgICAgICAgYCdpbmdlc3RJcCcgaXMgbm90IGF2YWlsYWJsZSBvbiBpbXBvcnRlZCBGbG93U291cmNlICR7dGhpcy5ub2RlLnBhdGh9OyBwYXNzIGl0IHZpYSBmcm9tRmxvd1NvdXJjZUF0dHJpYnV0ZXNgLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBnZXQgc291cmNlSW5nZXN0UG9ydCgpOiBzdHJpbmcge1xuICAgICAgICBpZiAoYXR0cnMuc291cmNlSW5nZXN0UG9ydCkgcmV0dXJuIGF0dHJzLnNvdXJjZUluZ2VzdFBvcnQ7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YEZsb3dTb3VyY2VJbmdlc3RQb3J0Tm90UHJvdmlkZWRgLFxuICAgICAgICAgIGAnc291cmNlSW5nZXN0UG9ydCcgaXMgbm90IGF2YWlsYWJsZSBvbiBpbXBvcnRlZCBGbG93U291cmNlICR7dGhpcy5ub2RlLnBhdGh9OyBwYXNzIGl0IHZpYSBmcm9tRmxvd1NvdXJjZUF0dHJpYnV0ZXNgLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICByZWFkb25seSBmbG93U291cmNlQXJuOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGZsb3dTb3VyY2VOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGluZ2VzdElwOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNvdXJjZUluZ2VzdFBvcnQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRmxvd1NvdXJjZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICAvLyBUaGUgc291cmNlIG5hbWUgY29tZXMgZnJvbSB0aGUgYHNvdXJjZWAgY29uZmlndXJhdGlvbjsgZmFsbCBiYWNrIHRvIGFcbiAgICAgIC8vIGNvbnN0cnVjdC1kZXJpdmVkIG5hbWUgd2hlbiBpdCBzZXRzIG5vbmUuXG4gICAgICBwaHlzaWNhbE5hbWU6IHByb3BzLnNvdXJjZS5mbG93U291cmNlTmFtZSA/PyBMYXp5LnN0cmluZyh7IHByb2R1Y2U6ICgpID0+IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7IG1heExlbmd0aDogNjQgfSkgfSksXG4gICAgfSk7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgc291cmNlIG5hbWUgd2hlbiBvbmUgaXMgc2V0IG9uIHRoZSBjb25maWd1cmF0aW9uLlxuICAgIGlmIChwcm9wcy5zb3VyY2UuZmxvd1NvdXJjZU5hbWUgIT0gbnVsbCAmJiBwcm9wcy5zb3VyY2UuZmxvd1NvdXJjZU5hbWUgIT09ICcnICYmICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMuc291cmNlLmZsb3dTb3VyY2VOYW1lKSkge1xuICAgICAgaWYgKHByb3BzLnNvdXJjZS5mbG93U291cmNlTmFtZS5sZW5ndGggPiA2NCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBGbG93U291cmNlTmFtZUxlbmd0aGAsIGBGbG93IHNvdXJjZSBuYW1lIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA2NCBjaGFyYWN0ZXJzLCBnb3QgJHtwcm9wcy5zb3VyY2UuZmxvd1NvdXJjZU5hbWUubGVuZ3RofWAsIHRoaXMpO1xuICAgICAgfVxuICAgICAgaWYgKCEvXlthLXpBLVowLTlfLV0rJC8udGVzdChwcm9wcy5zb3VyY2UuZmxvd1NvdXJjZU5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YEZsb3dTb3VyY2VOYW1lRm9ybWF0YCwgYEZsb3cgc291cmNlIG5hbWUgbXVzdCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3JlcywgZ290ICcke3Byb3BzLnNvdXJjZS5mbG93U291cmNlTmFtZX0nYCwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICBjb25zdCBzb3VyY2VDb25maWcgPSBwcm9wcy5zb3VyY2UuX2JpbmQodGhpcyk7XG5cbiAgICBpZiAoc291cmNlQ29uZmlnLnByb3RvY29sID09PSBTb3VyY2VQcm90b2NvbC5DREkudmFsdWUgfHwgc291cmNlQ29uZmlnLnByb3RvY29sID09PSBTb3VyY2VQcm90b2NvbC5KUEVHWFMudmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YEZsb3dTb3VyY2VQcm90b2NvbE5vdFN1cHBvcnRlZGAsICdDREkgb3IgSlBFR1hTIGNhbiBvbmx5IGJlIGNvbmZpZ3VyZWQgb24gdGhlIG1haW4gRmxvdyBjb25zdHJ1Y3QnLCB0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAoIXByb3BzLmZsb3cuaXNGYWlsb3ZlckVuYWJsZWQpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBGbG93U291cmNlRmFpbG92ZXJSZXF1aXJlZGAsXG4gICAgICAgICdGYWlsb3ZlciBjb25maWd1cmF0aW9uIG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgYW5kIGVuYWJsZWQgdG8gYWRkIGFuIGFkZGl0aW9uYWwgRmxvdyBzb3VyY2UuICcgK1xuICAgICAgICAnSWYgdGhlIEZsb3cgaXMgaW1wb3J0ZWQgdmlhIGZyb21GbG93QXR0cmlidXRlcygpLCBzZXQgaXNGYWlsb3ZlckVuYWJsZWQ6IHRydWUnLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IG5hbWU6IF9zb3VyY2VOYW1lLCAuLi5yZXN0U291cmNlQ29uZmlnIH0gPSBzb3VyY2VDb25maWc7XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IG5ldyBDZm5GbG93U291cmNlKHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIC4uLnJlc3RTb3VyY2VDb25maWcsXG4gICAgICBmbG93QXJuOiBwcm9wcy5mbG93LmZsb3dBcm4sXG4gICAgICBuYW1lOiB0aGlzLnBoeXNpY2FsTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBzb3VyY2VDb25maWcuZGVzY3JpcHRpb24gPz8gdGhpcy5waHlzaWNhbE5hbWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLmZsb3dTb3VyY2VBcm4gPSByZXNvdXJjZS5mbG93U291cmNlUmVmLnNvdXJjZUFybjtcbiAgICB0aGlzLmZsb3dTb3VyY2VOYW1lID0gdGhpcy5waHlzaWNhbE5hbWU7XG4gICAgdGhpcy5pbmdlc3RJcCA9IHJlc291cmNlLmF0dHJJbmdlc3RJcDtcbiAgICB0aGlzLnNvdXJjZUluZ2VzdFBvcnQgPSByZXNvdXJjZS5hdHRyU291cmNlSW5nZXN0UG9ydDtcbiAgfVxufVxuIl19
|