@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.
@@ -0,0 +1,153 @@
1
+ import type { IResource } from 'aws-cdk-lib';
2
+ import type { ISecurityGroup, ISubnet } from 'aws-cdk-lib/aws-ec2';
3
+ import type { IRouterNetworkInterfaceRef } from 'aws-cdk-lib/aws-mediaconnect';
4
+ import type { Construct } from 'constructs';
5
+ /**
6
+ * Interface for Router Network Interface
7
+ */
8
+ export interface IRouterNetworkInterface extends IResource, IRouterNetworkInterfaceRef {
9
+ /**
10
+ * The Amazon Resource Name (ARN) of the router network interface.
11
+ *
12
+ * @attribute
13
+ */
14
+ readonly routerNetworkInterfaceArn: string;
15
+ /**
16
+ * The unique identifier of the router network interface.
17
+ *
18
+ * @attribute
19
+ */
20
+ readonly routerNetworkInterfaceId: string;
21
+ /**
22
+ * The date and time the router network interface was created.
23
+ *
24
+ * @attribute
25
+ */
26
+ readonly createdAt?: string;
27
+ /**
28
+ * The date and time the router network interface was last updated.
29
+ *
30
+ * @attribute
31
+ */
32
+ readonly updatedAt?: string;
33
+ }
34
+ /**
35
+ * Properties for Router Network Interface
36
+ */
37
+ export interface RouterNetworkInterfaceProps {
38
+ /**
39
+ * The name of the router network interface.
40
+ * @default - Generated automatically
41
+ */
42
+ readonly routerNetworkInterfaceName?: string;
43
+ /**
44
+ * Network configuration for the router network interface.
45
+ */
46
+ readonly configuration: RouterNetworkConfiguration;
47
+ /**
48
+ * The AWS Region where the router network interface will be created.
49
+ *
50
+ * @default - Same region as the stack
51
+ */
52
+ readonly regionName?: string;
53
+ /**
54
+ * Tags to add to the network interface
55
+ *
56
+ * @default - No tagging
57
+ */
58
+ readonly tags?: {
59
+ [key: string]: string;
60
+ };
61
+ }
62
+ /**
63
+ * Attributes for importing an existing Router Network Interface.
64
+ */
65
+ export interface RouterNetworkInterfaceAttributes {
66
+ /**
67
+ * The Amazon Resource Name (ARN) of the router network interface.
68
+ */
69
+ readonly routerNetworkInterfaceArn: string;
70
+ /**
71
+ * The unique identifier of the router network interface.
72
+ *
73
+ * @default - accessing `routerNetworkInterfaceId` on the imported interface throws; only provide when available.
74
+ */
75
+ readonly routerNetworkInterfaceId?: string;
76
+ }
77
+ /**
78
+ * Properties for public network configuration
79
+ */
80
+ export interface PublicNetworkConfigurationProps {
81
+ /** CIDR blocks allowed to access the network interface */
82
+ readonly cidr: string[];
83
+ }
84
+ /**
85
+ * Properties for VPC network configuration
86
+ */
87
+ export interface VpcNetworkConfigurationProps {
88
+ /** Security groups to associate with the network interface */
89
+ readonly securityGroups: ISecurityGroup[];
90
+ /** Subnet where the network interface will be created */
91
+ readonly subnet: ISubnet;
92
+ }
93
+ /**
94
+ * Factory class for creating Router Network configurations
95
+ */
96
+ export declare class RouterNetworkConfiguration {
97
+ /**
98
+ * Create a public network configuration
99
+ * @param props Public network configuration properties
100
+ * @returns RouterNetworkConfiguration instance for public setup
101
+ */
102
+ static publicNetwork(props: PublicNetworkConfigurationProps): RouterNetworkConfiguration;
103
+ /**
104
+ * Create a VPC network configuration
105
+ * @param props VPC network configuration properties
106
+ * @returns RouterNetworkConfiguration instance for VPC setup
107
+ */
108
+ static vpc(props: VpcNetworkConfigurationProps): RouterNetworkConfiguration;
109
+ private readonly _config;
110
+ private readonly _publicCidrs?;
111
+ private constructor();
112
+ }
113
+ /**
114
+ * Defines a AWS Elemental MediaConnect Router Network Interface
115
+ */
116
+ export declare class RouterNetworkInterface extends RouterNetworkInterfaceBase {
117
+ /** Uniquely identifies this class. */
118
+ static readonly PROPERTY_INJECTION_ID: string;
119
+ /**
120
+ * Import an existing Router Network Interface from its ARN.
121
+ *
122
+ * @param scope The parent construct
123
+ * @param id The construct id
124
+ * @param routerNetworkInterfaceArn The ARN of the Router Network Interface
125
+ * @returns A Router Network Interface construct
126
+ */
127
+ static fromRouterNetworkInterfaceArn(scope: Construct, id: string, routerNetworkInterfaceArn: string): IRouterNetworkInterface;
128
+ /**
129
+ * Import an existing Router Network Interface from its attributes.
130
+ *
131
+ * Provide `routerNetworkInterfaceId` when importing an interface that was deployed
132
+ * externally — otherwise accessing it on the imported construct will throw.
133
+ *
134
+ * @param scope The parent construct
135
+ * @param id The construct id
136
+ * @param attrs The Router Network Interface attributes
137
+ * @returns A Router Network Interface construct
138
+ */
139
+ static fromRouterNetworkInterfaceAttributes(scope: Construct, id: string, attrs: RouterNetworkInterfaceAttributes): IRouterNetworkInterface;
140
+ readonly routerNetworkInterfaceArn: string;
141
+ readonly routerNetworkInterfaceId: string;
142
+ /**
143
+ * The date and time the router network interface was created.
144
+ * @attribute
145
+ */
146
+ readonly createdAt?: string;
147
+ /**
148
+ * The date and time the router network interface was last updated.
149
+ * @attribute
150
+ */
151
+ readonly updatedAt?: string;
152
+ constructor(scope: Construct, id: string, props: RouterNetworkInterfaceProps);
153
+ }
@@ -0,0 +1,245 @@
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.RouterNetworkInterface = exports.RouterNetworkConfiguration = 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 shared_1 = require("./shared");
46
+ /**
47
+ * Factory class for creating Router Network configurations
48
+ */
49
+ class RouterNetworkConfiguration {
50
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.RouterNetworkConfiguration", version: "2.263.0-alpha.0" };
51
+ /**
52
+ * Create a public network configuration
53
+ * @param props Public network configuration properties
54
+ * @returns RouterNetworkConfiguration instance for public setup
55
+ */
56
+ static publicNetwork(props) {
57
+ try {
58
+ jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_PublicNetworkConfigurationProps(props);
59
+ }
60
+ catch (error) {
61
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
62
+ Error.captureStackTrace(error, this.publicNetwork);
63
+ }
64
+ throw error;
65
+ }
66
+ return new RouterNetworkConfiguration({
67
+ public: {
68
+ allowRules: props.cidr.map(ip => {
69
+ return {
70
+ cidr: ip,
71
+ };
72
+ }),
73
+ },
74
+ }, props.cidr);
75
+ }
76
+ /**
77
+ * Create a VPC network configuration
78
+ * @param props VPC network configuration properties
79
+ * @returns RouterNetworkConfiguration instance for VPC setup
80
+ */
81
+ static vpc(props) {
82
+ try {
83
+ jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_VpcNetworkConfigurationProps(props);
84
+ }
85
+ catch (error) {
86
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
87
+ Error.captureStackTrace(error, this.vpc);
88
+ }
89
+ throw error;
90
+ }
91
+ return new RouterNetworkConfiguration({
92
+ vpc: {
93
+ securityGroupIds: props.securityGroups.map(sg => { return sg.securityGroupId; }),
94
+ subnetId: props.subnet.subnetId,
95
+ },
96
+ });
97
+ }
98
+ _config;
99
+ _publicCidrs;
100
+ constructor(config, publicCidrs) {
101
+ this._config = config;
102
+ this._publicCidrs = publicCidrs;
103
+ }
104
+ /**
105
+ * Called when the network configuration is bound to a RouterNetworkInterface.
106
+ * @internal
107
+ */
108
+ _bind(scope) {
109
+ if (this._publicCidrs !== undefined && !aws_cdk_lib_1.Token.isUnresolved(this._publicCidrs)) {
110
+ for (const cidr of this._publicCidrs) {
111
+ if (!aws_cdk_lib_1.Token.isUnresolved(cidr) && (0, shared_1.isOpenCidr)(cidr)) {
112
+ aws_cdk_lib_1.Annotations.of(scope).addWarningV2('@aws-cdk/aws-mediaconnect-alpha:openRouterNetworkCidr', `Router network interface public CIDR '${cidr}' allows traffic from any IP. Restrict to the narrowest range your senders/receivers need.`);
113
+ }
114
+ }
115
+ }
116
+ return { ...this._config };
117
+ }
118
+ }
119
+ exports.RouterNetworkConfiguration = RouterNetworkConfiguration;
120
+ /**
121
+ * Shared base for both real and imported router network interfaces.
122
+ * @internal
123
+ */
124
+ class RouterNetworkInterfaceBase extends aws_cdk_lib_1.Resource {
125
+ get routerNetworkInterfaceRef() {
126
+ return { routerNetworkInterfaceArn: this.routerNetworkInterfaceArn };
127
+ }
128
+ }
129
+ /**
130
+ * Defines a AWS Elemental MediaConnect Router Network Interface
131
+ */
132
+ let RouterNetworkInterface = (() => {
133
+ let _classDecorators = [prop_injectable_1.propertyInjectable];
134
+ let _classDescriptor;
135
+ let _classExtraInitializers = [];
136
+ let _classThis;
137
+ let _classSuper = RouterNetworkInterfaceBase;
138
+ var RouterNetworkInterface = class extends _classSuper {
139
+ static { _classThis = this; }
140
+ static {
141
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
142
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
143
+ RouterNetworkInterface = _classThis = _classDescriptor.value;
144
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
145
+ }
146
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.RouterNetworkInterface", version: "2.263.0-alpha.0" };
147
+ /** Uniquely identifies this class. */
148
+ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-mediaconnect-alpha.RouterNetworkInterface';
149
+ /**
150
+ * Import an existing Router Network Interface from its ARN.
151
+ *
152
+ * @param scope The parent construct
153
+ * @param id The construct id
154
+ * @param routerNetworkInterfaceArn The ARN of the Router Network Interface
155
+ * @returns A Router Network Interface construct
156
+ */
157
+ static fromRouterNetworkInterfaceArn(scope, id, routerNetworkInterfaceArn) {
158
+ return RouterNetworkInterface.fromRouterNetworkInterfaceAttributes(scope, id, { routerNetworkInterfaceArn });
159
+ }
160
+ /**
161
+ * Import an existing Router Network Interface from its attributes.
162
+ *
163
+ * Provide `routerNetworkInterfaceId` when importing an interface that was deployed
164
+ * externally — otherwise accessing it on the imported construct will throw.
165
+ *
166
+ * @param scope The parent construct
167
+ * @param id The construct id
168
+ * @param attrs The Router Network Interface attributes
169
+ * @returns A Router Network Interface construct
170
+ */
171
+ static fromRouterNetworkInterfaceAttributes(scope, id, attrs) {
172
+ try {
173
+ jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_RouterNetworkInterfaceAttributes(attrs);
174
+ }
175
+ catch (error) {
176
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
177
+ Error.captureStackTrace(error, this.fromRouterNetworkInterfaceAttributes);
178
+ }
179
+ throw error;
180
+ }
181
+ class Import extends RouterNetworkInterfaceBase {
182
+ routerNetworkInterfaceArn = attrs.routerNetworkInterfaceArn;
183
+ get routerNetworkInterfaceId() {
184
+ if (attrs.routerNetworkInterfaceId)
185
+ return attrs.routerNetworkInterfaceId;
186
+ throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `RouterNetworkInterfaceIdNotProvided`, `'routerNetworkInterfaceId' is not available on imported RouterNetworkInterface ${this.node.path}; pass it via fromRouterNetworkInterfaceAttributes`, this);
187
+ }
188
+ }
189
+ return new Import(scope, id);
190
+ }
191
+ routerNetworkInterfaceArn;
192
+ routerNetworkInterfaceId;
193
+ /**
194
+ * The date and time the router network interface was created.
195
+ * @attribute
196
+ */
197
+ createdAt;
198
+ /**
199
+ * The date and time the router network interface was last updated.
200
+ * @attribute
201
+ */
202
+ updatedAt;
203
+ constructor(scope, id, props) {
204
+ super(scope, id, {
205
+ physicalName: props.routerNetworkInterfaceName ?? aws_cdk_lib_1.Lazy.string({ produce: () => aws_cdk_lib_1.Names.uniqueResourceName(this, { maxLength: 128 }) }),
206
+ });
207
+ try {
208
+ jsiiDeprecationWarnings._aws_cdk_aws_mediaconnect_alpha_RouterNetworkInterfaceProps(props);
209
+ }
210
+ catch (error) {
211
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
212
+ Error.captureStackTrace(error, RouterNetworkInterface);
213
+ }
214
+ throw error;
215
+ }
216
+ // Validate router network interface name if provided
217
+ if (props.routerNetworkInterfaceName != null && props.routerNetworkInterfaceName !== '' && !aws_cdk_lib_1.Token.isUnresolved(props.routerNetworkInterfaceName)) {
218
+ if (props.routerNetworkInterfaceName.length > 128) {
219
+ throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `RouterNetworkInterfaceNameLength`, `Router network interface name must be between 1 and 128 characters, got ${props.routerNetworkInterfaceName.length}`, this);
220
+ }
221
+ if (!/^[a-zA-Z0-9-]+$/.test(props.routerNetworkInterfaceName)) {
222
+ throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `RouterNetworkInterfaceNameFormat`, `Router network interface name must contain only alphanumeric characters and hyphens, got '${props.routerNetworkInterfaceName}'`, this);
223
+ }
224
+ }
225
+ // Enhanced CDK Analytics Telemetry
226
+ (0, metadata_resource_1.addConstructMetadata)(this, props);
227
+ const routerNetworkInterface = new aws_mediaconnect_1.CfnRouterNetworkInterface(this, 'Resource', {
228
+ name: this.physicalName,
229
+ configuration: props.configuration._bind(this),
230
+ regionName: props.regionName,
231
+ tags: props.tags ? (0, shared_1.renderTags)(props.tags) : undefined,
232
+ });
233
+ this.routerNetworkInterfaceArn = routerNetworkInterface.attrArn;
234
+ this.routerNetworkInterfaceId = routerNetworkInterface.attrId;
235
+ this.createdAt = routerNetworkInterface.attrCreatedAt;
236
+ this.updatedAt = routerNetworkInterface.attrUpdatedAt;
237
+ }
238
+ static {
239
+ __runInitializers(_classThis, _classExtraInitializers);
240
+ }
241
+ };
242
+ return RouterNetworkInterface = _classThis;
243
+ })();
244
+ exports.RouterNetworkInterface = RouterNetworkInterface;
245
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLW5ldHdvcmstaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicm91dGVyLW5ldHdvcmstaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLDZDQUF5RjtBQUV6RixtRUFBeUU7QUFFekUsNEVBQTREO0FBQzVELDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFFMUUscUNBQWtEO0FBb0dsRDs7R0FFRztBQUNILE1BQWEsMEJBQTBCOztJQUNyQzs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFzQzs7Ozs7Ozs7OztRQUNoRSxPQUFPLElBQUksMEJBQTBCLENBQUM7WUFDcEMsTUFBTSxFQUFFO2dCQUNOLFVBQVUsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRTtvQkFDOUIsT0FBTzt3QkFDTCxJQUFJLEVBQUUsRUFBRTtxQkFDVCxDQUFDO2dCQUNKLENBQUMsQ0FBQzthQUNIO1NBQ0YsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDaEI7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFtQzs7Ozs7Ozs7OztRQUNuRCxPQUFPLElBQUksMEJBQTBCLENBQUM7WUFDcEMsR0FBRyxFQUFFO2dCQUNILGdCQUFnQixFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoRixRQUFRLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRO2FBQ2hDO1NBQ0YsQ0FBQyxDQUFDO0tBQ0o7SUFFZ0IsT0FBTyxDQUF3RTtJQUMvRSxZQUFZLENBQVk7SUFFekMsWUFDRSxNQUE2RSxFQUM3RSxXQUFzQjtRQUV0QixJQUFJLENBQUMsT0FBTyxH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QUFHLHNCQUFzQixDQUFDLE1BQU0sQ0FBQztZQUM5RCxJQUFJLENBQUMsU0FBUyxHQUFHLHNCQUFzQixDQUFDLGFBQWEsQ0FBQztZQUN0RCxJQUFJLENBQUMsU0FBUyxHQUFHLHNCQUFzQixDQUFDLGFBQWEsQ0FBQztTQUN2RDs7WUF6RlUsdURBQXNCOzs7OztBQUF0Qix3REFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IElSZXNvdXJjZSB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEFubm90YXRpb25zLCBMYXp5LCBOYW1lcywgUmVzb3VyY2UsIFRva2VuLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgdHlwZSB7IElTZWN1cml0eUdyb3VwLCBJU3VibmV0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgeyBDZm5Sb3V0ZXJOZXR3b3JrSW50ZXJmYWNlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLW1lZGlhY29ubmVjdCc7XG5pbXBvcnQgdHlwZSB7IElSb3V0ZXJOZXR3b3JrSW50ZXJmYWNlUmVmLCBSb3V0ZXJOZXR3b3JrSW50ZXJmYWNlUmVmZXJlbmNlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLW1lZGlhY29ubmVjdCc7XG5pbXBvcnQgeyBsaXQgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9oZWxwZXJzLWludGVybmFsJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuaW1wb3J0IHsgcHJvcGVydHlJbmplY3RhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvcHJvcC1pbmplY3RhYmxlJztcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBpc09wZW5DaWRyLCByZW5kZXJUYWdzIH0gZnJvbSAnLi9zaGFyZWQnO1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgUm91dGVyIE5ldHdvcmsgSW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVJvdXRlck5ldHdvcmtJbnRlcmZhY2UgZXh0ZW5kcyBJUmVzb3VyY2UsIElSb3V0ZXJOZXR3b3JrSW50ZXJmYWNlUmVmIHtcbiAgLyoqXG4gICAqIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgcm91dGVyIG5ldHdvcmsgaW50ZXJmYWNlLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSByb3V0ZXJOZXR3b3JrSW50ZXJmYWNlQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcm91dGVyIG5ldHdvcmsgaW50ZXJmYWNlLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSByb3V0ZXJOZXR3b3JrSW50ZXJmYWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRhdGUgYW5kIHRpbWUgdGhlIHJvdXRlciBuZXR3b3JrIGludGVyZmFjZSB3YXMgY3JlYXRlZC5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgY3JlYXRlZEF0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB0aGUgcm91dGVyIG5ldHdvcmsgaW50ZXJmYWNlIHdhcyBsYXN0IHVwZGF0ZWQuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHVwZGF0ZWRBdD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBSb3V0ZXIgTmV0d29yayBJbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb3V0ZXJOZXR3b3JrSW50ZXJmYWNlUHJvcHMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHJvdXRlciBuZXR3b3JrIGludGVyZmFjZS5cbiAgICogQGRlZmF1bHQgLSBHZW5lcmF0ZWQgYXV0b21hdGljYWxseVxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVyTmV0d29ya0ludGVyZmFjZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5ldHdvcmsgY29uZmlndXJhdGlvbiBmb3IgdGhlIHJvdXRlciBuZXR3b3JrIGludGVyZmFjZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZ3VyYXRpb246IFJvdXRlck5ldHdvcmtDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgQVdTIFJlZ2lvbiB3aGVyZSB0aGUgcm91dGVyIG5ldHdvcmsgaW50ZXJmYWNlIHdpbGwgYmUgY3JlYXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBTYW1lIHJlZ2lvbiBhcyB0aGUgc3RhY2tcbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRhZ3MgdG8gYWRkIHRvIHRoZSBuZXR3b3JrIGludGVyZmFjZVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHRhZ2dpbmdcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIEF0dHJpYnV0ZXMgZm9yIGltcG9ydGluZyBhbiBleGlzdGluZyBSb3V0ZXIgTmV0d29yayBJbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVyTmV0d29ya0ludGVyZmFjZUF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogVGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSByb3V0ZXIgbmV0d29yayBpbnRlcmZhY2UuXG4gICAqL1xuICByZWFkb25seSByb3V0ZXJOZXR3b3JrSW50ZXJmYWNlQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcm91dGVyIG5ldHdvcmsgaW50ZXJmYWNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFjY2Vzc2luZyBgcm91dGVyTmV0d29ya0ludGVyZmFjZUlkYCBvbiB0aGUgaW1wb3J0ZWQgaW50ZXJmYWNlIHRocm93czsgb25seSBwcm92aWRlIHdoZW4gYXZhaWxhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgcm91dGVyTmV0d29ya0ludGVyZmFjZUlkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIHB1YmxpYyBuZXR3b3JrIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQdWJsaWNOZXR3b3JrQ29uZmlndXJhdGlvblByb3BzIHtcbiAgLyoqIENJRFIgYmxvY2tzIGFsbG93ZWQgdG8gYWNjZXNzIHRoZSBuZXR3b3JrIGludGVyZmFjZSAqL1xuICByZWFkb25seSBjaWRyOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBWUEMgbmV0d29yayBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVnBjTmV0d29ya0NvbmZpZ3VyYXRpb25Qcm9wcyB7XG4gIC8qKiBTZWN1cml0eSBncm91cHMgdG8gYXNzb2NpYXRlIHdpdGggdGhlIG5ldHdvcmsgaW50ZXJmYWNlICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXBzOiBJU2VjdXJpdHlHcm91cFtdO1xuICAvKiogU3VibmV0IHdoZXJlIHRoZSBuZXR3b3JrIGludGVyZmFjZSB3aWxsIGJlIGNyZWF0ZWQgKi9cbiAgcmVhZG9ubHkgc3VibmV0OiBJU3VibmV0O1xufVxuXG4vKipcbiAqIEZhY3RvcnkgY2xhc3MgZm9yIGNyZWF0aW5nIFJvdXRlciBOZXR3b3JrIGNvbmZpZ3VyYXRpb25zXG4gKi9cbmV4cG9ydCBjbGFzcyBSb3V0ZXJOZXR3b3JrQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBwdWJsaWMgbmV0d29yayBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSBwcm9wcyBQdWJsaWMgbmV0d29yayBjb25maWd1cmF0aW9uIHByb3BlcnRpZXNcbiAgICogQHJldHVybnMgUm91dGVyTmV0d29ya0NvbmZpZ3VyYXRpb24gaW5zdGFuY2UgZm9yIHB1YmxpYyBzZXR1cFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBwdWJsaWNOZXR3b3JrKHByb3BzOiBQdWJsaWNOZXR3b3JrQ29uZmlndXJhdGlvblByb3BzKTogUm91dGVyTmV0d29ya0NvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiBuZXcgUm91dGVyTmV0d29ya0NvbmZpZ3VyYXRpb24oe1xuICAgICAgcHVibGljOiB7XG4gICAgICAgIGFsbG93UnVsZXM6IHByb3BzLmNpZHIubWFwKGlwID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2lkcjogaXAsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0sIHByb3BzLmNpZHIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIFZQQyBuZXR3b3JrIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIHByb3BzIFZQQyBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyBSb3V0ZXJOZXR3b3JrQ29uZmlndXJhdGlvbiBpbnN0YW5jZSBmb3IgVlBDIHNldHVwXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZwYyhwcm9wczogVnBjTmV0d29ya0NvbmZpZ3VyYXRpb25Qcm9wcyk6IFJvdXRlck5ldHdvcmtDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IFJvdXRlck5ldHdvcmtDb25maWd1cmF0aW9uKHtcbiAgICAgIHZwYzoge1xuICAgICAgICBzZWN1cml0eUdyb3VwSWRzOiBwcm9wcy5zZWN1cml0eUdyb3Vwcy5tYXAoc2cgPT4geyByZXR1cm4gc2cuc2VjdXJpdHlHcm91cElkOyB9KSxcbiAgICAgICAgc3VibmV0SWQ6IHByb3BzLnN1Ym5ldC5zdWJuZXRJZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9jb25maWc6IENmblJvdXRlck5ldHdvcmtJbnRlcmZhY2UuUm91dGVyTmV0d29ya0ludGVyZmFjZUNvbmZpZ3VyYXRpb25Qcm9wZXJ0eTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcHVibGljQ2lkcnM/OiBzdHJpbmdbXTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIGNvbmZpZzogQ2ZuUm91dGVyTmV0d29ya0ludGVyZmFjZS5Sb3V0ZXJOZXR3b3JrSW50ZXJmYWNlQ29uZmlndXJhdGlvblByb3BlcnR5LFxuICAgIHB1YmxpY0NpZHJzPzogc3RyaW5nW10sXG4gICkge1xuICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLl9wdWJsaWNDaWRycyA9IHB1YmxpY0NpZHJzO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gaXMgYm91bmQgdG8gYSBSb3V0ZXJOZXR3b3JrSW50ZXJmYWNlLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfYmluZChzY29wZTogQ29uc3RydWN0KTogQ2ZuUm91dGVyTmV0d29ya0ludGVyZmFjZS5Sb3V0ZXJOZXR3b3JrSW50ZXJmYWNlQ29uZmlndXJhdGlvblByb3BlcnR5IHtcbiAgICBpZiAodGhpcy5fcHVibGljQ2lkcnMgIT09IHVuZGVmaW5lZCAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKHRoaXMuX3B1YmxpY0NpZHJzKSkge1xuICAgICAgZm9yIChjb25zdCBjaWRyIG9mIHRoaXMuX3B1YmxpY0NpZHJzKSB7XG4gICAgICAgIGlmICghVG9rZW4uaXNVbnJlc29sdmVkKGNpZHIpICYmIGlzT3BlbkNpZHIoY2lkcikpIHtcbiAgICAgICAgICBBbm5vdGF0aW9ucy5vZihzY29wZSkuYWRkV2FybmluZ1YyKFxuICAgICAgICAgICAgJ0Bhd3MtY2RrL2F3cy1tZWRpYWNvbm5lY3QtYWxwaGE6b3BlblJvdXRlck5ldHdvcmtDaWRyJyxcbiAgICAgICAgICAgIGBSb3V0ZXIgbmV0d29yayBpbnRlcmZhY2UgcHVibGljIENJRFIgJyR7Y2lkcn0nIGFsbG93cyB0cmFmZmljIGZyb20gYW55IElQLiBSZXN0cmljdCB0byB0aGUgbmFycm93ZXN0IHJhbmdlIHlvdXIgc2VuZGVycy9yZWNlaXZlcnMgbmVlZC5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgLi4udGhpcy5fY29uZmlnIH07XG4gIH1cbn1cblxuLyoqXG4gKiBTaGFyZWQgYmFzZSBmb3IgYm90aCByZWFsIGFuZCBpbXBvcnRlZCByb3V0ZXIgbmV0d29yayBpbnRlcmZhY2VzLlxuICogQGludGVybmFsXG4gKi9cbmFic3RyYWN0IGNsYXNzIFJvdXRlck5ldHdvcmtJbnRlcmZhY2VCYXNlIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJUm91dGVyTmV0d29ya0ludGVyZmFjZSB7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSByb3V0ZXJOZXR3b3JrSW50ZXJmYWNlQXJuOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSByb3V0ZXJOZXR3b3JrSW50ZXJmYWNlSWQ6IHN0cmluZztcblxuICBwdWJsaWMgZ2V0IHJvdXRlck5ldHdvcmtJbnRlcmZhY2VSZWYoKTogUm91dGVyTmV0d29ya0ludGVyZmFjZVJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIHsgcm91dGVyTmV0d29ya0ludGVyZmFjZUFybjogdGhpcy5yb3V0ZXJOZXR3b3JrSW50ZXJmYWNlQXJuIH07XG4gIH1cbn1cblxuLyoqXG4gKiBEZWZpbmVzIGEgQVdTIEVsZW1lbnRhbCBNZWRpYUNvbm5lY3QgUm91dGVyIE5ldHdvcmsgSW50ZXJmYWNlXG4gKi9cbkBwcm9wZXJ0eUluamVjdGFibGVcbmV4cG9ydCBjbGFzcyBSb3V0ZXJOZXR3b3JrSW50ZXJmYWNlIGV4dGVuZHMgUm91dGVyTmV0d29ya0ludGVyZmFjZUJhc2Uge1xuICAvKiogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGNsYXNzLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1BFUlRZX0lOSkVDVElPTl9JRDogc3RyaW5nID0gJ0Bhd3MtY2RrLmF3cy1tZWRpYWNvbm5lY3QtYWxwaGEuUm91dGVyTmV0d29ya0ludGVyZmFjZSc7XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyBSb3V0ZXIgTmV0d29yayBJbnRlcmZhY2UgZnJvbSBpdHMgQVJOLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIHBhcmVudCBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIGlkIFRoZSBjb25zdHJ1Y3QgaWRcbiAgICogQHBhcmFtIHJvdXRlck5ldHdvcmtJbnRlcmZhY2VBcm4gVGhlIEFSTiBvZiB0aGUgUm91dGVyIE5ldHdvcmsgSW50ZXJmYWNlXG4gICAqIEByZXR1cm5zIEEgUm91dGVyIE5ldHdvcmsgSW50ZXJmYWNlIGNvbnN0cnVjdFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tUm91dGVyTmV0d29ya0ludGVyZmFjZUFybihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCByb3V0ZXJOZXR3b3JrSW50ZXJmYWNlQXJuOiBzdHJpbmcpOiBJUm91dGVyTmV0d29ya0ludGVyZmFjZSB7XG4gICAgcmV0dXJuIFJvdXRlck5ldHdvcmtJbnRlcmZhY2UuZnJvbVJvdXRlck5ldHdvcmtJbnRlcmZhY2VBdHRyaWJ1dGVzKHNjb3BlLCBpZCwgeyByb3V0ZXJOZXR3b3JrSW50ZXJmYWNlQXJuIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyBSb3V0ZXIgTmV0d29yayBJbnRlcmZhY2UgZnJvbSBpdHMgYXR0cmlidXRlcy5cbiAgICpcbiAgICogUHJvdmlkZSBgcm91dGVyTmV0d29ya0ludGVyZmFjZUlkYCB3aGVuIGltcG9ydGluZyBhbiBpbnRlcmZhY2UgdGhhdCB3YXMgZGVwbG95ZWRcbiAgICogZXh0ZXJuYWxseSDigJQgb3RoZXJ3aXNlIGFjY2Vzc2luZyBpdCBvbiB0aGUgaW1wb3J0ZWQgY29uc3RydWN0IHdpbGwgdGhyb3cuXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgcGFyZW50IGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gaWQgVGhlIGNvbnN0cnVjdCBpZFxuICAgKiBAcGFyYW0gYXR0cnMgVGhlIFJvdXRlciBOZXR3b3JrIEludGVyZmFjZSBhdHRyaWJ1dGVzXG4gICAqIEByZXR1cm5zIEEgUm91dGVyIE5ldHdvcmsgSW50ZXJmYWNlIGNvbnN0cnVjdFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tUm91dGVyTmV0d29ya0ludGVyZmFjZUF0dHJpYnV0ZXMoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIGF0dHJzOiBSb3V0ZXJOZXR3b3JrSW50ZXJmYWNlQXR0cmlidXRlcyxcbiAgKTogSVJvdXRlck5ldHdvcmtJbnRlcmZhY2Uge1xuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIFJvdXRlck5ldHdvcmtJbnRlcmZhY2VCYXNlIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSByb3V0ZXJOZXR3b3JrSW50ZXJmYWNlQXJuID0gYXR0cnMucm91dGVyTmV0d29ya0ludGVyZmFjZUFybjtcblxuICAgICAgcHVibGljIGdldCByb3V0ZXJOZXR3b3JrSW50ZXJmYWNlSWQoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGF0dHJzLnJvdXRlck5ldHdvcmtJbnRlcmZhY2VJZCkgcmV0dXJuIGF0dHJzLnJvdXRlck5ldHdvcmtJbnRlcmZhY2VJZDtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgUm91dGVyTmV0d29ya0ludGVyZmFjZUlkTm90UHJvdmlkZWRgLFxuICAgICAgICAgIGAncm91dGVyTmV0d29ya0ludGVyZmFjZUlkJyBpcyBub3QgYXZhaWxhYmxlIG9uIGltcG9ydGVkIFJvdXRlck5ldHdvcmtJbnRlcmZhY2UgJHt0aGlzLm5vZGUucGF0aH07IHBhc3MgaXQgdmlhIGZyb21Sb3V0ZXJOZXR3b3JrSW50ZXJmYWNlQXR0cmlidXRlc2AsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSByb3V0ZXJOZXR3b3JrSW50ZXJmYWNlQXJuOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSByb3V0ZXJOZXR3b3JrSW50ZXJmYWNlSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBkYXRlIGFuZCB0aW1lIHRoZSByb3V0ZXIgbmV0d29yayBpbnRlcmZhY2Ugd2FzIGNyZWF0ZWQuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB0aGUgcm91dGVyIG5ldHdvcmsgaW50ZXJmYWNlIHdhcyBsYXN0IHVwZGF0ZWQuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1cGRhdGVkQXQ/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJvdXRlck5ldHdvcmtJbnRlcmZhY2VQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgcGh5c2ljYWxOYW1lOiBwcm9wcy5yb3V0ZXJOZXR3b3JrSW50ZXJmYWNlTmFtZSA/PyBMYXp5LnN0cmluZyh7IHByb2R1Y2U6ICgpID0+IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7IG1heExlbmd0aDogMTI4IH0pIH0pLFxuICAgIH0pO1xuXG4gICAgLy8gVmFsaWRhdGUgcm91dGVyIG5ldHdvcmsgaW50ZXJmYWNlIG5hbWUgaWYgcHJvdmlkZWRcbiAgICBpZiAocHJvcHMucm91dGVyTmV0d29ya0ludGVyZmFjZU5hbWUgIT0gbnVsbCAmJiBwcm9wcy5yb3V0ZXJOZXR3b3JrSW50ZXJmYWNlTmFtZSAhPT0gJycgJiYgIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5yb3V0ZXJOZXR3b3JrSW50ZXJmYWNlTmFtZSkpIHtcbiAgICAgIGlmIChwcm9wcy5yb3V0ZXJOZXR3b3JrSW50ZXJmYWNlTmFtZS5sZW5ndGggPiAxMjgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgUm91dGVyTmV0d29ya0ludGVyZmFjZU5hbWVMZW5ndGhgLCBgUm91dGVyIG5ldHdvcmsgaW50ZXJmYWNlIG5hbWUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEyOCBjaGFyYWN0ZXJzLCBnb3QgJHtwcm9wcy5yb3V0ZXJOZXR3b3JrSW50ZXJmYWNlTmFtZS5sZW5ndGh9YCwgdGhpcyk7XG4gICAgICB9XG4gICAgICBpZiAoIS9eW2EtekEtWjAtOS1dKyQvLnRlc3QocHJvcHMucm91dGVyTmV0d29ya0ludGVyZmFjZU5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YFJvdXRlck5ldHdvcmtJbnRlcmZhY2VOYW1lRm9ybWF0YCwgYFJvdXRlciBuZXR3b3JrIGludGVyZmFjZSBuYW1lIG11c3QgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGFuZCBoeXBoZW5zLCBnb3QgJyR7cHJvcHMucm91dGVyTmV0d29ya0ludGVyZmFjZU5hbWV9J2AsIHRoaXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgY29uc3Qgcm91dGVyTmV0d29ya0ludGVyZmFjZSA9IG5ldyBDZm5Sb3V0ZXJOZXR3b3JrSW50ZXJmYWNlKHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIG5hbWU6IHRoaXMucGh5c2ljYWxOYW1lLFxuICAgICAgY29uZmlndXJhdGlvbjogcHJvcHMuY29uZmlndXJhdGlvbi5fYmluZCh0aGlzKSxcbiAgICAgIHJlZ2lvbk5hbWU6IHByb3BzLnJlZ2lvbk5hbWUsXG4gICAgICB0YWdzOiBwcm9wcy50YWdzID8gcmVuZGVyVGFncyhwcm9wcy50YWdzKSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIHRoaXMucm91dGVyTmV0d29ya0ludGVyZmFjZUFybiA9IHJvdXRlck5ldHdvcmtJbnRlcmZhY2UuYXR0ckFybjtcbiAgICB0aGlzLnJvdXRlck5ldHdvcmtJbnRlcmZhY2VJZCA9IHJvdXRlck5ldHdvcmtJbnRlcmZhY2UuYXR0cklkO1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gcm91dGVyTmV0d29ya0ludGVyZmFjZS5hdHRyQ3JlYXRlZEF0O1xuICAgIHRoaXMudXBkYXRlZEF0ID0gcm91dGVyTmV0d29ya0ludGVyZmFjZS5hdHRyVXBkYXRlZEF0O1xuICB9XG59XG4iXX0=