@aws-cdk/aws-ivs-alpha
Version:
The CDK Construct Library for AWS::IVS
277 lines • 34.1 kB
JavaScript
;
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
var _, done = false;
for (var i = decorators.length - 1; i >= 0; i--) {
var context = {};
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
if (kind === "accessor") {
if (result === void 0) continue;
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
if (_ = accept(result.get)) descriptor.get = _;
if (_ = accept(result.set)) descriptor.set = _;
if (_ = accept(result.init)) initializers.unshift(_);
}
else if (_ = accept(result)) {
if (kind === "field") initializers.unshift(_);
else descriptor[key] = _;
}
}
if (target) Object.defineProperty(target, contextIn.name, descriptor);
done = true;
};
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
var useValue = arguments.length > 2;
for (var i = 0; i < initializers.length; i++) {
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
}
return useValue ? value : void 0;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Channel = exports.Policy = exports.MaximumResolution = exports.Preset = exports.ChannelType = exports.LatencyMode = exports.ContainerFormat = void 0;
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const core = require("aws-cdk-lib/core");
const core_1 = require("aws-cdk-lib/core");
const aws_ivs_1 = require("aws-cdk-lib/aws-ivs");
const stream_key_1 = require("./stream-key");
const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
/**
* Reference to a new or existing IVS Channel
*/
class ChannelBase extends core.Resource {
addStreamKey(id) {
return new stream_key_1.StreamKey(this, id, {
channel: this,
});
}
}
/**
* Container Format
*/
var ContainerFormat;
(function (ContainerFormat) {
/**
* Use MPEG-TS.
*/
ContainerFormat["TS"] = "TS";
/**
* Use fMP4.
*/
ContainerFormat["FRAGMENTED_MP4"] = "FRAGMENTED_MP4";
})(ContainerFormat || (exports.ContainerFormat = ContainerFormat = {}));
/**
* Channel latency mode
*/
var LatencyMode;
(function (LatencyMode) {
/**
* Use LOW to minimize broadcaster-to-viewer latency for interactive broadcasts.
*/
LatencyMode["LOW"] = "LOW";
/**
* Use NORMAL for broadcasts that do not require viewer interaction.
*/
LatencyMode["NORMAL"] = "NORMAL";
})(LatencyMode || (exports.LatencyMode = LatencyMode = {}));
/**
* The channel type, which determines the allowable resolution and bitrate.
* If you exceed the allowable resolution or bitrate, the stream probably will disconnect immediately.
*
* @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-channel.html
*/
var ChannelType;
(function (ChannelType) {
/**
* Multiple qualities are generated from the original input, to automatically give viewers the best experience for their devices and network conditions.
* Transcoding allows higher playback quality across a range of download speeds. Resolution can be up to 1080p and bitrate can be up to 8.5 Mbps.
* Audio is transcoded only for renditions 360p and below; above that, audio is passed through.
*/
ChannelType["STANDARD"] = "STANDARD";
/**
* Delivers the original input to viewers. The viewer’s video-quality choice is limited to the original input.
*/
ChannelType["BASIC"] = "BASIC";
/**
* Multiple qualities are generated from the original input, to automatically give viewers the best experience for their devices and network conditions.
* Input resolution can be up to 1080p and bitrate can be up to 8.5 Mbps; output is capped at SD quality (480p).
* Audio for all renditions is transcoded, and an audio-only rendition is available.
*/
ChannelType["ADVANCED_SD"] = "ADVANCED_SD";
/**
* Multiple qualities are generated from the original input, to automatically give viewers the best experience for their devices and network conditions.
* Input resolution can be up to 1080p and bitrate can be up to 8.5 Mbps; output is capped at HD quality (720p).
* Audio for all renditions is transcoded, and an audio-only rendition is available.
*/
ChannelType["ADVANCED_HD"] = "ADVANCED_HD";
})(ChannelType || (exports.ChannelType = ChannelType = {}));
/**
* An optional transcode preset for the channel. This is selectable only for ADVANCED_HD and ADVANCED_SD channel types.
*
* @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-channel.html
*/
var Preset;
(function (Preset) {
/**
* Use a lower bitrate than STANDARD for each quality level. Use it if you have low download bandwidth and/or simple video content (e.g., talking heads).
*/
Preset["CONSTRAINED_BANDWIDTH_DELIVERY"] = "CONSTRAINED_BANDWIDTH_DELIVERY";
/**
* Use a higher bitrate for each quality level. Use it if you have high download bandwidth and/or complex video content (e.g., flashes and quick scene changes).
*/
Preset["HIGHER_BANDWIDTH_DELIVERY"] = "HIGHER_BANDWIDTH_DELIVERY";
})(Preset || (exports.Preset = Preset = {}));
/**
* Maximum resolution for multitrack input.
*/
var MaximumResolution;
(function (MaximumResolution) {
/**
* Full HD (1080p)
*/
MaximumResolution["FULL_HD"] = "FULL_HD";
/**
* HD (720p)
*/
MaximumResolution["HD"] = "HD";
/**
* SD (480p)
*/
MaximumResolution["SD"] = "SD";
})(MaximumResolution || (exports.MaximumResolution = MaximumResolution = {}));
/**
* Whether multitrack input is allowed or required.
*/
var Policy;
(function (Policy) {
/**
* Multitrack input is allowed.
*/
Policy["ALLOW"] = "ALLOW";
/**
* Multitrack input is required.
*/
Policy["REQUIRE"] = "REQUIRE";
})(Policy || (exports.Policy = Policy = {}));
/**
A new IVS channel
*/
let Channel = (() => {
let _classDecorators = [prop_injectable_1.propertyInjectable];
let _classDescriptor;
let _classExtraInitializers = [];
let _classThis;
let _classSuper = ChannelBase;
var Channel = class extends _classSuper {
static { _classThis = this; }
static {
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
Channel = _classThis = _classDescriptor.value;
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
}
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-ivs-alpha.Channel", version: "2.223.0-alpha.0" };
/** Uniquely identifies this class. */
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-ivs-alpha.Channel';
/**
* Import an existing channel
*/
static fromChannelArn(scope, id, channelArn) {
// This will throw an error if the arn cannot be parsed
let arnComponents = core.Arn.split(channelArn, core.ArnFormat.SLASH_RESOURCE_NAME);
if (!core.Token.isUnresolved(arnComponents.service) && arnComponents.service !== 'ivs') {
throw new Error(`Invalid service, expected 'ivs', got '${arnComponents.service}'`);
}
if (!core.Token.isUnresolved(arnComponents.resource) && arnComponents.resource !== 'channel') {
throw new Error(`Invalid resource, expected 'channel', got '${arnComponents.resource}'`);
}
class Import extends ChannelBase {
channelArn = channelArn;
}
return new Import(scope, id);
}
channelArn;
/**
* Channel ingest endpoint, part of the definition of an ingest server, used when you set up streaming software.
* For example: a1b2c3d4e5f6.global-contribute.live-video.net
* @attribute
*/
channelIngestEndpoint;
/**
* Channel playback URL. For example:
* https://a1b2c3d4e5f6.us-west-2.playback.live-video.net/api/video/v1/us-west-2.123456789012.channel.abcdEFGH.m3u8
* @attribute
*/
channelPlaybackUrl;
constructor(scope, id, props = {}) {
super(scope, id, {
physicalName: props.channelName ?? core_1.Lazy.string({
produce: () => core_1.Names.uniqueResourceName(this, { maxLength: 128, allowedSpecialCharacters: '-_' }),
}),
});
try {
jsiiDeprecationWarnings._aws_cdk_aws_ivs_alpha_ChannelProps(props);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, Channel);
}
throw error;
}
// Enhanced CDK Analytics Telemetry
(0, metadata_resource_1.addConstructMetadata)(this, props);
if (this.physicalName && !core.Token.isUnresolved(this.physicalName) && !/^[a-zA-Z0-9-_]*$/.test(this.physicalName)) {
throw new Error(`channelName must contain only numbers, letters, hyphens and underscores, got: '${this.physicalName}'`);
}
let preset;
if (props.type && [ChannelType.STANDARD, ChannelType.BASIC].includes(props.type) && props.preset) {
preset = '';
}
else {
preset = props.preset;
}
if (props.multitrackInputConfiguration !== undefined) {
if (props.type !== undefined && props.type !== ChannelType.STANDARD) {
throw new Error(`\`multitrackInputConfiguration\` is only supported for \`ChannelType.STANDARD\`, got: ${props.type}.`);
}
if (props.containerFormat !== undefined && props.containerFormat !== ContainerFormat.FRAGMENTED_MP4) {
throw new Error(`\`containerFormat\` must be set to \`ContainerFormat.FRAGMENTED_MP4\` when \`multitrackInputConfiguration\` is specified, got: ${props.containerFormat}.`);
}
}
const resource = new aws_ivs_1.CfnChannel(this, 'Resource', {
authorized: props.authorized,
insecureIngest: props.insecureIngest,
latencyMode: props.latencyMode,
name: this.physicalName,
type: props.type,
preset,
recordingConfigurationArn: props.recordingConfiguration?.recordingConfigurationArn,
containerFormat: props.containerFormat ??
(props.multitrackInputConfiguration ? ContainerFormat.FRAGMENTED_MP4 : undefined),
multitrackInputConfiguration: props.multitrackInputConfiguration ?
{
enabled: true,
maximumResolution: props.multitrackInputConfiguration.maximumResolution,
policy: props.multitrackInputConfiguration.policy,
}
: undefined,
});
this.channelArn = resource.attrArn;
this.channelIngestEndpoint = resource.attrIngestEndpoint;
this.channelPlaybackUrl = resource.attrPlaybackUrl;
}
static {
__runInitializers(_classThis, _classExtraInitializers);
}
};
return Channel = _classThis;
})();
exports.Channel = Channel;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNoYW5uZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseUNBQXlDO0FBQ3pDLDJDQUErQztBQUUvQyxpREFBaUQ7QUFDakQsNkNBQXlDO0FBRXpDLDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFvQjFFOztHQUVHO0FBQ0gsTUFBZSxXQUFZLFNBQVEsSUFBSSxDQUFDLFFBQVE7SUFHdkMsWUFBWSxDQUFDLEVBQVU7UUFDNUIsT0FBTyxJQUFJLHNCQUFTLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRTtZQUM3QixPQUFPLEVBQUUsSUFBSTtTQUNkLENBQUMsQ0FBQztLQUNKO0NBQ0Y7QUFFRDs7R0FFRztBQUNILElBQVksZUFVWDtBQVZELFdBQVksZUFBZTtJQUN6Qjs7T0FFRztJQUNILDRCQUFTLENBQUE7SUFFVDs7T0FFRztJQUNILG9EQUFpQyxDQUFBO0FBQ25DLENBQUMsRUFWVyxlQUFlLCtCQUFmLGVBQWUsUUFVMUI7QUFFRDs7R0FFRztBQUNILElBQVksV0FVWDtBQVZELFdBQVksV0FBVztJQUNyQjs7T0FFRztJQUNILDBCQUFXLENBQUE7SUFFWDs7T0FFRztJQUNILGdDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFWVyxXQUFXLDJCQUFYLFdBQVcsUUFVdEI7QUFFRDs7Ozs7R0FLRztBQUNILElBQVksV0EwQlg7QUExQkQsV0FBWSxXQUFXO0lBQ3JCOzs7O09BSUc7SUFDSCxvQ0FBcUIsQ0FBQTtJQUVyQjs7T0FFRztJQUNILDhCQUFlLENBQUE7SUFFZjs7OztPQUlHO0lBQ0gsMENBQTJCLENBQUE7SUFFM0I7Ozs7T0FJRztJQUNILDBDQUEyQixDQUFBO0FBQzdCLENBQUMsRUExQlcsV0FBVywyQkFBWCxXQUFXLFFBMEJ0QjtBQUVEOzs7O0dBSUc7QUFDSCxJQUFZLE1BV1g7QUFYRCxXQUFZLE1BQU07SUFDaEI7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QUNoQixNQUFNO2dCQUNOLHlCQUF5QixFQUFFLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSx5QkFBeUI7Z0JBQ2xGLGVBQWUsRUFBRSxLQUFLLENBQUMsZUFBZTtvQkFDcEMsQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQkFDbkYsNEJBQTRCLEVBQUUsS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7b0JBQ2hFO3dCQUNFLE9BQU8sRUFBRSxJQUFJO3dCQUNiLGlCQUFpQixFQUFFLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxpQkFBaUI7d0JBQ3ZFLE1BQU0sRUFBRSxLQUFLLENBQUMsNEJBQTRCLENBQUMsTUFBTTtxQkFDbEQ7b0JBQ0QsQ0FBQyxDQUFDLFNBQVM7YUFDZCxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDbkMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQztZQUN6RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQztTQUNwRDs7WUEvRlUsdURBQU87Ozs7O0FBQVAsMEJBQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjb3JlIGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgTGF6eSwgTmFtZXMgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQ2ZuQ2hhbm5lbCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pdnMnO1xuaW1wb3J0IHsgU3RyZWFtS2V5IH0gZnJvbSAnLi9zdHJlYW0ta2V5JztcbmltcG9ydCB7IElSZWNvcmRpbmdDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9yZWNvcmRpbmctY29uZmlndXJhdGlvbic7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcbmltcG9ydCB7IHByb3BlcnR5SW5qZWN0YWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL3Byb3AtaW5qZWN0YWJsZSc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBJVlMgQ2hhbm5lbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElDaGFubmVsIGV4dGVuZHMgY29yZS5JUmVzb3VyY2Uge1xuICAvKipcbiAgICogVGhlIGNoYW5uZWwgQVJOLiBGb3IgZXhhbXBsZTogYXJuOmF3czppdnM6dXMtd2VzdC0yOjEyMzQ1Njc4OTAxMjpjaGFubmVsL2FiY2RBQkNEZWZnaFxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBjaGFubmVsQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzdHJlYW0ga2V5IGZvciB0aGlzIElWUyBDaGFubmVsLlxuICAgKiBAcGFyYW0gaWQgY29uc3RydWN0IElEXG4gICAqL1xuICBhZGRTdHJlYW1LZXkoaWQ6IHN0cmluZyk6IFN0cmVhbUtleTtcbn1cblxuLyoqXG4gKiBSZWZlcmVuY2UgdG8gYSBuZXcgb3IgZXhpc3RpbmcgSVZTIENoYW5uZWxcbiAqL1xuYWJzdHJhY3QgY2xhc3MgQ2hhbm5lbEJhc2UgZXh0ZW5kcyBjb3JlLlJlc291cmNlIGltcGxlbWVudHMgSUNoYW5uZWwge1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgY2hhbm5lbEFybjogc3RyaW5nO1xuXG4gIHB1YmxpYyBhZGRTdHJlYW1LZXkoaWQ6IHN0cmluZyk6IFN0cmVhbUtleSB7XG4gICAgcmV0dXJuIG5ldyBTdHJlYW1LZXkodGhpcywgaWQsIHtcbiAgICAgIGNoYW5uZWw6IHRoaXMsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb250YWluZXIgRm9ybWF0XG4gKi9cbmV4cG9ydCBlbnVtIENvbnRhaW5lckZvcm1hdCB7XG4gIC8qKlxuICAgKiBVc2UgTVBFRy1UUy5cbiAgICovXG4gIFRTID0gJ1RTJyxcblxuICAvKipcbiAgICogVXNlIGZNUDQuXG4gICAqL1xuICBGUkFHTUVOVEVEX01QNCA9ICdGUkFHTUVOVEVEX01QNCcsXG59XG5cbi8qKlxuICogQ2hhbm5lbCBsYXRlbmN5IG1vZGVcbiAqL1xuZXhwb3J0IGVudW0gTGF0ZW5jeU1vZGUge1xuICAvKipcbiAgICogVXNlIExPVyB0byBtaW5pbWl6ZSBicm9hZGNhc3Rlci10by12aWV3ZXIgbGF0ZW5jeSBmb3IgaW50ZXJhY3RpdmUgYnJvYWRjYXN0cy5cbiAgICovXG4gIExPVyA9ICdMT1cnLFxuXG4gIC8qKlxuICAgKiBVc2UgTk9STUFMIGZvciBicm9hZGNhc3RzIHRoYXQgZG8gbm90IHJlcXVpcmUgdmlld2VyIGludGVyYWN0aW9uLlxuICAgKi9cbiAgTk9STUFMID0gJ05PUk1BTCcsXG59XG5cbi8qKlxuICogVGhlIGNoYW5uZWwgdHlwZSwgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgYWxsb3dhYmxlIHJlc29sdXRpb24gYW5kIGJpdHJhdGUuXG4gKiBJZiB5b3UgZXhjZWVkIHRoZSBhbGxvd2FibGUgcmVzb2x1dGlvbiBvciBiaXRyYXRlLCB0aGUgc3RyZWFtIHByb2JhYmx5IHdpbGwgZGlzY29ubmVjdCBpbW1lZGlhdGVseS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1pdnMtY2hhbm5lbC5odG1sXG4gKi9cbmV4cG9ydCBlbnVtIENoYW5uZWxUeXBlIHtcbiAgLyoqXG4gICAqIE11bHRpcGxlIHF1YWxpdGllcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIG9yaWdpbmFsIGlucHV0LCB0byBhdXRvbWF0aWNhbGx5IGdpdmUgdmlld2VycyB0aGUgYmVzdCBleHBlcmllbmNlIGZvciB0aGVpciBkZXZpY2VzIGFuZCBuZXR3b3JrIGNvbmRpdGlvbnMuXG4gICAqIFRyYW5zY29kaW5nIGFsbG93cyBoaWdoZXIgcGxheWJhY2sgcXVhbGl0eSBhY3Jvc3MgYSByYW5nZSBvZiBkb3dubG9hZCBzcGVlZHMuIFJlc29sdXRpb24gY2FuIGJlIHVwIHRvIDEwODBwIGFuZCBiaXRyYXRlIGNhbiBiZSB1cCB0byA4LjUgTWJwcy5cbiAgICogQXVkaW8gaXMgdHJhbnNjb2RlZCBvbmx5IGZvciByZW5kaXRpb25zIDM2MHAgYW5kIGJlbG93OyBhYm92ZSB0aGF0LCBhdWRpbyBpcyBwYXNzZWQgdGhyb3VnaC5cbiAgICovXG4gIFNUQU5EQVJEID0gJ1NUQU5EQVJEJyxcblxuICAvKipcbiAgICogRGVsaXZlcnMgdGhlIG9yaWdpbmFsIGlucHV0IHRvIHZpZXdlcnMuIFRoZSB2aWV3ZXLigJlzIHZpZGVvLXF1YWxpdHkgY2hvaWNlIGlzIGxpbWl0ZWQgdG8gdGhlIG9yaWdpbmFsIGlucHV0LlxuICAgKi9cbiAgQkFTSUMgPSAnQkFTSUMnLFxuXG4gIC8qKlxuICAgKiBNdWx0aXBsZSBxdWFsaXRpZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBvcmlnaW5hbCBpbnB1dCwgdG8gYXV0b21hdGljYWxseSBnaXZlIHZpZXdlcnMgdGhlIGJlc3QgZXhwZXJpZW5jZSBmb3IgdGhlaXIgZGV2aWNlcyBhbmQgbmV0d29yayBjb25kaXRpb25zLlxuICAgKiBJbnB1dCByZXNvbHV0aW9uIGNhbiBiZSB1cCB0byAxMDgwcCBhbmQgYml0cmF0ZSBjYW4gYmUgdXAgdG8gOC41IE1icHM7IG91dHB1dCBpcyBjYXBwZWQgYXQgU0QgcXVhbGl0eSAoNDgwcCkuXG4gICAqIEF1ZGlvIGZvciBhbGwgcmVuZGl0aW9ucyBpcyB0cmFuc2NvZGVkLCBhbmQgYW4gYXVkaW8tb25seSByZW5kaXRpb24gaXMgYXZhaWxhYmxlLlxuICAgKi9cbiAgQURWQU5DRURfU0QgPSAnQURWQU5DRURfU0QnLFxuXG4gIC8qKlxuICAgKiBNdWx0aXBsZSBxdWFsaXRpZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBvcmlnaW5hbCBpbnB1dCwgdG8gYXV0b21hdGljYWxseSBnaXZlIHZpZXdlcnMgdGhlIGJlc3QgZXhwZXJpZW5jZSBmb3IgdGhlaXIgZGV2aWNlcyBhbmQgbmV0d29yayBjb25kaXRpb25zLlxuICAgKiBJbnB1dCByZXNvbHV0aW9uIGNhbiBiZSB1cCB0byAxMDgwcCBhbmQgYml0cmF0ZSBjYW4gYmUgdXAgdG8gOC41IE1icHM7IG91dHB1dCBpcyBjYXBwZWQgYXQgSEQgcXVhbGl0eSAoNzIwcCkuXG4gICAqIEF1ZGlvIGZvciBhbGwgcmVuZGl0aW9ucyBpcyB0cmFuc2NvZGVkLCBhbmQgYW4gYXVkaW8tb25seSByZW5kaXRpb24gaXMgYXZhaWxhYmxlLlxuICAgKi9cbiAgQURWQU5DRURfSEQgPSAnQURWQU5DRURfSEQnLFxufVxuXG4vKipcbiAqIEFuIG9wdGlvbmFsIHRyYW5zY29kZSBwcmVzZXQgZm9yIHRoZSBjaGFubmVsLiBUaGlzIGlzIHNlbGVjdGFibGUgb25seSBmb3IgQURWQU5DRURfSEQgYW5kIEFEVkFOQ0VEX1NEIGNoYW5uZWwgdHlwZXMuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcmVzb3VyY2UtaXZzLWNoYW5uZWwuaHRtbFxuICovXG5leHBvcnQgZW51bSBQcmVzZXQge1xuICAvKipcbiAgICogVXNlIGEgbG93ZXIgYml0cmF0ZSB0aGFuIFNUQU5EQVJEIGZvciBlYWNoIHF1YWxpdHkgbGV2ZWwuIFVzZSBpdCBpZiB5b3UgaGF2ZSBsb3cgZG93bmxvYWQgYmFuZHdpZHRoIGFuZC9vciBzaW1wbGUgdmlkZW8gY29udGVudCAoZS5nLiwgdGFsa2luZyBoZWFkcykuXG4gICAqL1xuICBDT05TVFJBSU5FRF9CQU5EV0lEVEhfREVMSVZFUlkgPSAnQ09OU1RSQUlORURfQkFORFdJRFRIX0RFTElWRVJZJyxcblxuICAvKipcbiAgICogVXNlIGEgaGlnaGVyIGJpdHJhdGUgZm9yIGVhY2ggcXVhbGl0eSBsZXZlbC4gVXNlIGl0IGlmIHlvdSBoYXZlIGhpZ2ggZG93bmxvYWQgYmFuZHdpZHRoIGFuZC9vciBjb21wbGV4IHZpZGVvIGNvbnRlbnQgKGUuZy4sIGZsYXNoZXMgYW5kIHF1aWNrIHNjZW5lIGNoYW5nZXMpLlxuICAgKi9cbiAgSElHSEVSX0JBTkRXSURUSF9ERUxJVkVSWSA9ICdISUdIRVJfQkFORFdJRFRIX0RFTElWRVJZJyxcblxufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGNyZWF0aW5nIGEgbmV3IENoYW5uZWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGFubmVsUHJvcHMge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgY2hhbm5lbCBpcyBhdXRob3JpemVkLlxuICAgKlxuICAgKiBJZiB5b3Ugd2lzaCB0byBtYWtlIGFuIGF1dGhvcml6ZWQgY2hhbm5lbCwgeW91IHdpbGwgbmVlZCB0byBlbnN1cmUgdGhhdFxuICAgKiBhIFBsYXliYWNrS2V5UGFpciBoYXMgYmVlbiB1cGxvYWRlZCB0byB5b3VyIGFjY291bnQgYXMgdGhpcyBpcyB1c2VkIHRvXG4gICAqIHZhbGlkYXRlIHRoZSBzaWduZWQgSldUIHRoYXQgaXMgcmVxdWlyZWQgZm9yIGF1dGhvcml6YXRpb25cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGF1dGhvcml6ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hpY2ggY29udGVudC1wYWNrYWdpbmcgZm9ybWF0IGlzIHVzZWQgKE1QRUctVFMgb3IgZk1QNCkuXG4gICAqXG4gICAqIElmIGBtdWx0aXRyYWNrSW5wdXRDb25maWd1cmF0aW9uYCBpcyBzcGVjaWZpZWQsIG9ubHkgZk1QNCBjYW4gYmUgdXNlZC5cbiAgICogT3RoZXJ3aXNlLCBgY29udGFpbmVyRm9ybWF0YCBtYXkgYmUgc2V0IHRvIGBDb250YWluZXJGb3JtYXQuVFNgIG9yIGBDb250YWluZXJGb3JtYXQuRlJBR01FTlRFRF9NUDRgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGBDb250YWluZXJGb3JtYXQuRlJBR01FTlRFRF9NUDRgIGlzIGF1dG9tYXRpY2FsbHkgc2V0IHdoZW4gdGhlIGBtdWx0aXRyYWNrSW5wdXRDb25maWd1cmF0aW9uYCBpcyBzcGVjaWZpZWQuIElmIG5vdCBzcGVjaWZpZWQsIGl0IHJlbWFpbnMgdW5kZWZpbmVkIGFuZCB1c2VzIHRoZSBJVlMgZGVmYXVsdCBzZXR0aW5nIChUUykuXG4gICAqL1xuICByZWFkb25seSBjb250YWluZXJGb3JtYXQ/OiBDb250YWluZXJGb3JtYXQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNoYW5uZWwgYWxsb3dzIGluc2VjdXJlIFJUTVAgaW5nZXN0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5zZWN1cmVJbmdlc3Q/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDaGFubmVsIGxhdGVuY3kgbW9kZS5cbiAgICpcbiAgICogQGRlZmF1bHQgTGF0ZW5jeU1vZGUuTE9XXG4gICAqL1xuICByZWFkb25seSBsYXRlbmN5TW9kZT86IExhdGVuY3lNb2RlO1xuXG4gIC8qKlxuICAgKiBBIG5hbWUgZm9yIHRoZSBjaGFubmVsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBuYW1lXG4gICAqL1xuICByZWFkb25seSBjaGFubmVsTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogT2JqZWN0IHNwZWNpZnlpbmcgbXVsdGl0cmFjayBpbnB1dCBjb25maWd1cmF0aW9uLlxuICAgKiBZb3UgbXVzdCBzcGVjaWZ5IGBtdWx0aXRyYWNrSW5wdXRDb25maWd1cmF0aW9uYCBpZiB5b3Ugd2FudCB0byB1c2UgTXVsdGlUcmFjayBWaWRlby5cbiAgICpcbiAgICogYG11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb25gIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBgQ2hhbm5lbFR5cGUuU1RBTkRBUkRgLlxuICAgKlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWQgLSBJVlMgZGVmYXVsdCBzZXR0aW5nIGlzIG5vdCB1c2UgTXVsdGlUcmFjayBWaWRlby5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vaXZzL2xhdGVzdC9Mb3dMYXRlbmN5VXNlckd1aWRlL211bHRpdHJhY2stdmlkZW8uaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgbXVsdGl0cmFja0lucHV0Q29uZmlndXJhdGlvbj86IE11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBjaGFubmVsIHR5cGUsIHdoaWNoIGRldGVybWluZXMgdGhlIGFsbG93YWJsZSByZXNvbHV0aW9uIGFuZCBiaXRyYXRlLlxuICAgKiBJZiB5b3UgZXhjZWVkIHRoZSBhbGxvd2FibGUgcmVzb2x1dGlvbiBvciBiaXRyYXRlLCB0aGUgc3RyZWFtIHdpbGwgZGlzY29ubmVjdCBpbW1lZGlhdGVseVxuICAgKlxuICAgKiBAZGVmYXVsdCBDaGFubmVsVHlwZS5TVEFOREFSRFxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZT86IENoYW5uZWxUeXBlO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCB0cmFuc2NvZGUgcHJlc2V0IGZvciB0aGUgY2hhbm5lbC4gQ2FuIGJlIHVzZWQgZm9yIEFEVkFOQ0VEX0hEIGFuZCBBRFZBTkNFRF9TRCBjaGFubmVsIHR5cGVzLlxuICAgKiBXaGVuIExPVyBvciBTVEFOREFSRCBpcyB1c2VkLCB0aGUgcHJlc2V0IHdpbGwgYmUgb3ZlcnJpZGRlbiBhbmQgc2V0IHRvIG5vbmUgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgcHJvdmlkZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gUHJlc2V0LkhJR0hFUl9CQU5EV0lEVEhfREVMSVZFUlkgaWYgY2hhbm5lbFR5cGUgaXMgQURWQU5DRURfU0Qgb3IgQURWQU5DRURfSEQsIG5vbmUgb3RoZXJ3aXNlXG4gICAqL1xuICByZWFkb25seSBwcmVzZXQ/OiBQcmVzZXQ7XG5cbiAgLyoqXG4gICAqIEEgcmVjb3JkaW5nIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjaGFubmVsLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHJlY29yZGluZyBpcyBkaXNhYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgcmVjb3JkaW5nQ29uZmlndXJhdGlvbj86IElSZWNvcmRpbmdDb25maWd1cmF0aW9uO1xufVxuXG4vKipcbiAqIE1heGltdW0gcmVzb2x1dGlvbiBmb3IgbXVsdGl0cmFjayBpbnB1dC5cbiAqL1xuZXhwb3J0IGVudW0gTWF4aW11bVJlc29sdXRpb24ge1xuICAvKipcbiAgICogRnVsbCBIRCAoMTA4MHApXG4gICAqL1xuICBGVUxMX0hEID0gJ0ZVTExfSEQnLFxuXG4gIC8qKlxuICAgKiBIRCAoNzIwcClcbiAgICovXG4gIEhEID0gJ0hEJyxcblxuICAvKipcbiAgICogU0QgKDQ4MHApXG4gICAqL1xuICBTRCA9ICdTRCcsXG59XG5cbi8qKlxuICogV2hldGhlciBtdWx0aXRyYWNrIGlucHV0IGlzIGFsbG93ZWQgb3IgcmVxdWlyZWQuXG4gKi9cbmV4cG9ydCBlbnVtIFBvbGljeSB7XG4gIC8qKlxuICAgKiBNdWx0aXRyYWNrIGlucHV0IGlzIGFsbG93ZWQuXG4gICAqL1xuICBBTExPVyA9ICdBTExPVycsXG5cbiAgLyoqXG4gICAqIE11bHRpdHJhY2sgaW5wdXQgaXMgcmVxdWlyZWQuXG4gICAqL1xuICBSRVFVSVJFID0gJ1JFUVVJUkUnLFxufVxuXG4vKipcbiAqIEEgY29tcGxleCB0eXBlIHRoYXQgc3BlY2lmaWVzIG11bHRpdHJhY2sgaW5wdXQgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNdWx0aXRyYWNrSW5wdXRDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIE1heGltdW0gcmVzb2x1dGlvbiBmb3IgbXVsdGl0cmFjayBpbnB1dC5cbiAgICovXG4gIHJlYWRvbmx5IG1heGltdW1SZXNvbHV0aW9uOiBNYXhpbXVtUmVzb2x1dGlvbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgbXVsdGl0cmFjayBpbnB1dCBpcyBhbGxvd2VkIG9yIHJlcXVpcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9saWN5OiBQb2xpY3k7XG59XG5cbi8qKlxuICBBIG5ldyBJVlMgY2hhbm5lbFxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgQ2hhbm5lbCBleHRlbmRzIENoYW5uZWxCYXNlIHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtaXZzLWFscGhhLkNoYW5uZWwnO1xuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZXhpc3RpbmcgY2hhbm5lbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQ2hhbm5lbEFybihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBjaGFubmVsQXJuOiBzdHJpbmcpOiBJQ2hhbm5lbCB7XG4gICAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGVycm9yIGlmIHRoZSBhcm4gY2Fubm90IGJlIHBhcnNlZFxuICAgIGxldCBhcm5Db21wb25lbnRzID0gY29yZS5Bcm4uc3BsaXQoY2hhbm5lbEFybiwgY29yZS5Bcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSk7XG5cbiAgICBpZiAoIWNvcmUuVG9rZW4uaXNVbnJlc29sdmVkKGFybkNvbXBvbmVudHMuc2VydmljZSkgJiYgYXJuQ29tcG9uZW50cy5zZXJ2aWNlICE9PSAnaXZzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNlcnZpY2UsIGV4cGVjdGVkICdpdnMnLCBnb3QgJyR7YXJuQ29tcG9uZW50cy5zZXJ2aWNlfSdgKTtcbiAgICB9XG5cbiAgICBpZiAoIWNvcmUuVG9rZW4uaXNVbnJlc29sdmVkKGFybkNvbXBvbmVudHMucmVzb3VyY2UpICYmIGFybkNvbXBvbmVudHMucmVzb3VyY2UgIT09ICdjaGFubmVsJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlc291cmNlLCBleHBlY3RlZCAnY2hhbm5lbCcsIGdvdCAnJHthcm5Db21wb25lbnRzLnJlc291cmNlfSdgKTtcbiAgICB9XG5cbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBDaGFubmVsQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgY2hhbm5lbEFybiA9IGNoYW5uZWxBcm47XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBjaGFubmVsQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENoYW5uZWwgaW5nZXN0IGVuZHBvaW50LCBwYXJ0IG9mIHRoZSBkZWZpbml0aW9uIG9mIGFuIGluZ2VzdCBzZXJ2ZXIsIHVzZWQgd2hlbiB5b3Ugc2V0IHVwIHN0cmVhbWluZyBzb2Z0d2FyZS5cbiAgICogRm9yIGV4YW1wbGU6IGExYjJjM2Q0ZTVmNi5nbG9iYWwtY29udHJpYnV0ZS5saXZlLXZpZGVvLm5ldFxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2hhbm5lbEluZ2VzdEVuZHBvaW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENoYW5uZWwgcGxheWJhY2sgVVJMLiBGb3IgZXhhbXBsZTpcbiAgICogaHR0cHM6Ly9hMWIyYzNkNGU1ZjYudXMtd2VzdC0yLnBsYXliYWNrLmxpdmUtdmlkZW8ubmV0L2FwaS92aWRlby92MS91cy13ZXN0LTIuMTIzNDU2Nzg5MDEyLmNoYW5uZWwuYWJjZEVGR0gubTN1OFxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2hhbm5lbFBsYXliYWNrVXJsOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IENoYW5uZWxQcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBwaHlzaWNhbE5hbWU6IHByb3BzLmNoYW5uZWxOYW1lID8/IExhenkuc3RyaW5nKHtcbiAgICAgICAgcHJvZHVjZTogKCkgPT4gTmFtZXMudW5pcXVlUmVzb3VyY2VOYW1lKHRoaXMsIHsgbWF4TGVuZ3RoOiAxMjgsIGFsbG93ZWRTcGVjaWFsQ2hhcmFjdGVyczogJy1fJyB9KSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgaWYgKHRoaXMucGh5c2ljYWxOYW1lICYmICFjb3JlLlRva2VuLmlzVW5yZXNvbHZlZCh0aGlzLnBoeXNpY2FsTmFtZSkgJiYgIS9eW2EtekEtWjAtOS1fXSokLy50ZXN0KHRoaXMucGh5c2ljYWxOYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjaGFubmVsTmFtZSBtdXN0IGNvbnRhaW4gb25seSBudW1iZXJzLCBsZXR0ZXJzLCBoeXBoZW5zIGFuZCB1bmRlcnNjb3JlcywgZ290OiAnJHt0aGlzLnBoeXNpY2FsTmFtZX0nYCk7XG4gICAgfVxuXG4gICAgbGV0IHByZXNldDtcblxuICAgIGlmIChwcm9wcy50eXBlICYmIFtDaGFubmVsVHlwZS5TVEFOREFSRCwgQ2hhbm5lbFR5cGUuQkFTSUNdLmluY2x1ZGVzKHByb3BzLnR5cGUpICYmIHByb3BzLnByZXNldCkge1xuICAgICAgcHJlc2V0ID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZXNldCA9IHByb3BzLnByZXNldDtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMubXVsdGl0cmFja0lucHV0Q29uZmlndXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAocHJvcHMudHlwZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLnR5cGUgIT09IENoYW5uZWxUeXBlLlNUQU5EQVJEKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXFxgbXVsdGl0cmFja0lucHV0Q29uZmlndXJhdGlvblxcYCBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgXFxgQ2hhbm5lbFR5cGUuU1RBTkRBUkRcXGAsIGdvdDogJHtwcm9wcy50eXBlfS5gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLmNvbnRhaW5lckZvcm1hdCAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmNvbnRhaW5lckZvcm1hdCAhPT0gQ29udGFpbmVyRm9ybWF0LkZSQUdNRU5URURfTVA0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXFxgY29udGFpbmVyRm9ybWF0XFxgIG11c3QgYmUgc2V0IHRvIFxcYENvbnRhaW5lckZvcm1hdC5GUkFHTUVOVEVEX01QNFxcYCB3aGVuIFxcYG11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb25cXGAgaXMgc3BlY2lmaWVkLCBnb3Q6ICR7cHJvcHMuY29udGFpbmVyRm9ybWF0fS5gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IG5ldyBDZm5DaGFubmVsKHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIGF1dGhvcml6ZWQ6IHByb3BzLmF1dGhvcml6ZWQsXG4gICAgICBpbnNlY3VyZUluZ2VzdDogcHJvcHMuaW5zZWN1cmVJbmdlc3QsXG4gICAgICBsYXRlbmN5TW9kZTogcHJvcHMubGF0ZW5jeU1vZGUsXG4gICAgICBuYW1lOiB0aGlzLnBoeXNpY2FsTmFtZSxcbiAgICAgIHR5cGU6IHByb3BzLnR5cGUsXG4gICAgICBwcmVzZXQsXG4gICAgICByZWNvcmRpbmdDb25maWd1cmF0aW9uQXJuOiBwcm9wcy5yZWNvcmRpbmdDb25maWd1cmF0aW9uPy5yZWNvcmRpbmdDb25maWd1cmF0aW9uQXJuLFxuICAgICAgY29udGFpbmVyRm9ybWF0OiBwcm9wcy5jb250YWluZXJGb3JtYXQgPz9cbiAgICAgICAgKHByb3BzLm11bHRpdHJhY2tJbnB1dENvbmZpZ3VyYXRpb24gPyBDb250YWluZXJGb3JtYXQuRlJBR01FTlRFRF9NUDQgOiB1bmRlZmluZWQpLFxuICAgICAgbXVsdGl0cmFja0lucHV0Q29uZmlndXJhdGlvbjogcHJvcHMubXVsdGl0cmFja0lucHV0Q29uZmlndXJhdGlvbiA/XG4gICAgICAgIHtcbiAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgIG1heGltdW1SZXNvbHV0aW9uOiBwcm9wcy5tdWx0aXRyYWNrSW5wdXRDb25maWd1cmF0aW9uLm1heGltdW1SZXNvbHV0aW9uLFxuICAgICAgICAgIHBvbGljeTogcHJvcHMubXVsdGl0cmFja0lucHV0Q29uZmlndXJhdGlvbi5wb2xpY3ksXG4gICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICB0aGlzLmNoYW5uZWxBcm4gPSByZXNvdXJjZS5hdHRyQXJuO1xuICAgIHRoaXMuY2hhbm5lbEluZ2VzdEVuZHBvaW50ID0gcmVzb3VyY2UuYXR0ckluZ2VzdEVuZHBvaW50O1xuICAgIHRoaXMuY2hhbm5lbFBsYXliYWNrVXJsID0gcmVzb3VyY2UuYXR0clBsYXliYWNrVXJsO1xuICB9XG59XG4iXX0=