UNPKG

awscdk-construct-live-channel-from-mp4-file

Version:
293 lines 41.7 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.HarvestJobLambda = exports.LiveChannelFromMp4 = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const awscdk_construct_medialive_channel_1 = require("awscdk-construct-medialive-channel"); const constructs_1 = require("constructs"); const HarvestJobLambda_1 = require("./HarvestJobLambda"); const MediaPackageV1_1 = require("./MediaPackageV1"); const MediaPackageV2_1 = require("./MediaPackageV2"); function isEncoderSpec(spec) { return spec.gopLengthInSeconds !== undefined || spec.timecodeBurninPrefix !== undefined || spec.framerateNumerator !== undefined || spec.framerateDenominator !== undefined || spec.scanType !== undefined || spec.width !== undefined || spec.height !== undefined; } function isPackagerSpec(spec) { return spec.segmentDurationSeconds !== undefined || spec.manifestWindowSeconds !== undefined || spec.hlsAdMarkers !== undefined || spec.startoverWindowSeconds !== undefined || spec.separateAudioRendition !== undefined || spec.mediaPackageV2Settings !== undefined; } class LiveChannelFromMp4 extends constructs_1.Construct { constructor(scope, id, { source, channelClass = 'SINGLE_PIPELINE', encoderSpec = { gopLengthInSeconds: 3, }, mediaPackageVersionSpec = 'V1_AND_V2', packagerSpec = { segmentDurationSeconds: 6, manifestWindowSeconds: 60, hlsAdMarkers: 'DATERANGE', startoverWindowSeconds: 60, separateAudioRendition: false, }, autoStart = true, }) { super(scope, id); if (isPackagerSpec(packagerSpec)) { const { segmentDurationSeconds = 6, manifestWindowSeconds = 60, hlsAdMarkers = 'DATERANGE', startoverWindowSeconds = 60, separateAudioRendition = false, mediaPackageV2Settings, } = packagerSpec; if (mediaPackageVersionSpec != 'V2_ONLY') { this.empv1 = new MediaPackageV1_1.MediaPackageV1(this, 'MediaPackageV1', { startoverWindowSeconds, endpointSpec: { segmentDurationSeconds, manifestWindowSeconds, hlsAdMarkers, separateAudioRendition, }, }); } if (mediaPackageVersionSpec != 'V1_ONLY') { this.empv2 = new MediaPackageV2_1.MediaPackageV2(this, 'MediaPackageV2', { channelGroupName: mediaPackageV2Settings?.channelGroupName, inputType: mediaPackageV2Settings?.inputType, startoverWindowSeconds, endpointSpec: { segmentDurationSeconds, manifestWindowSeconds, hlsAdMarkers, separateAudioRendition, omitLlHls: mediaPackageV2Settings?.omitLlHls, }, }); } } else { // packagerSpec is PackagerFullSpec if (mediaPackageVersionSpec === 'V1_ONLY') { this.empv1 = new MediaPackageV1_1.MediaPackageV1(this, 'MediaPackageV1', packagerSpec); } else if (mediaPackageVersionSpec === 'V2_ONLY') { this.empv2 = new MediaPackageV2_1.MediaPackageV2(this, 'MediaPackageV2', packagerSpec); } else { const [v1Spec, v2Spec] = packagerSpec; this.empv1 = new MediaPackageV1_1.MediaPackageV1(this, 'MediaPackageV1', v1Spec); this.empv2 = new MediaPackageV2_1.MediaPackageV2(this, 'MediaPackageV2', v2Spec); } } const sources = createSourceSpecs(source); let destinations; const ingestEndpoints = channelClass === 'STANDARD' ? this.empv2?.ingestEndpoints : this.empv2?.ingestEndpoints.slice(0, 1); switch (mediaPackageVersionSpec) { case 'V1_ONLY': destinations = [{ id: 'MediaPackageV1', mediaPackageSettings: [{ channelId: this.empv1?.channel.ref, }], }]; break; case 'V2_ONLY': destinations = this.empv2?.channel.inputType === 'HLS' ? [{ id: 'MediaPackageV2', settings: ingestEndpoints, }] : [{ id: 'MediaPackageV2', mediaPackageSettings: [{ channelGroup: this.empv2?.channel.channelGroupName, channelName: this.empv2?.channel.channelName, }], }]; break; case 'V1_AND_V2': destinations = this.empv2?.channel.inputType === 'HLS' ? [ { id: 'MediaPackageV1', mediaPackageSettings: [{ channelId: this.empv1?.channel.ref, }], }, { id: 'MediaPackageV2', settings: ingestEndpoints, }, ] : [ { id: 'MediaPackageV1', mediaPackageSettings: [{ channelId: this.empv1?.channel.ref, }], }, { id: 'MediaPackageV2', mediaPackageSettings: [{ channelGroup: this.empv2?.channel.channelGroupName, channelName: this.empv2?.channel.channelName, }], }, ]; break; } let internalEncoderSpec; if (isEncoderSpec(encoderSpec)) { const { gopLengthInSeconds = 3, timecodeBurninPrefix, framerateNumerator = 30, framerateDenominator = 1, scanType = 'PROGRESSIVE', width = 1920, height = 1080, } = encoderSpec; const hlsGroupSettings = { adMarkers: ['ELEMENTAL_SCTE35'], destination: { destinationRefId: 'MediaPackageV2', }, hlsCdnSettings: { hlsWebdavSettings: { httpTransferMode: 'NON_CHUNKED', }, }, indexNSegments: 15, inputLossAction: 'PAUSE_OUTPUT', manifestDurationFormat: 'FLOATING_POINT', programDateTime: 'INCLUDE', programDateTimeClock: 'SYSTEM_CLOCK', programDateTimePeriod: 1, segmentLength: 1, streamInfResolution: 'INCLUDE', }; const hlsOutputSettings = { hlsSettings: { standardHlsSettings: { m3U8Settings: { scte35Behavior: 'PASSTHROUGH', timedMetadataBehavior: 'PASSTHROUGH', }, }, }, }; let outputGroupSettingsList; let outputSettingsList; switch (mediaPackageVersionSpec) { case 'V1_ONLY': outputGroupSettingsList = [{ mediaPackageGroupSettings: { destination: { destinationRefId: 'MediaPackageV1', }, }, }]; outputSettingsList = [{ mediaPackageOutputSettings: {}, }]; break; case 'V2_ONLY': outputGroupSettingsList = this.empv2?.channel.inputType === 'HLS' ? [{ hlsGroupSettings, }] : [{ mediaPackageGroupSettings: { destination: { destinationRefId: 'MediaPackageV2', }, }, }]; outputSettingsList = this.empv2?.channel.inputType === 'HLS' ? [{ hlsOutputSettings, }] : [{ mediaPackageOutputSettings: {}, }]; break; case 'V1_AND_V2': outputGroupSettingsList = [ { mediaPackageGroupSettings: { destination: { destinationRefId: 'MediaPackageV1', }, }, }, this.empv2?.channel.inputType === 'HLS' ? { hlsGroupSettings, } : { mediaPackageGroupSettings: { destination: { destinationRefId: 'MediaPackageV2', }, }, }, ]; outputSettingsList = [ { mediaPackageOutputSettings: {}, }, this.empv2?.channel.inputType === 'HLS' ? { hlsOutputSettings, } : { mediaPackageOutputSettings: {}, }, ]; break; } internalEncoderSpec = { outputGroupSettingsList, outputSettingsList, gopLengthInSeconds: this.empv2?.endpoints.llHls ? 1 : gopLengthInSeconds, timecodeBurninPrefix, framerateNumerator, framerateDenominator, scanType, width, height, }; } else { // encoderSpec is CfnChannel.EncoderSettingsProperty internalEncoderSpec = encoderSpec; } this.eml = new awscdk_construct_medialive_channel_1.MediaLive(this, 'MediaLive', { sources, destinations, channelClass, encoderSpec: internalEncoderSpec, }); if (autoStart) { // Start channel this.channelStartTime = (0, awscdk_construct_medialive_channel_1.startChannel)(this, 'StartMediaLiveChannel', this.eml.channel.ref); } } // Create a Lambda function that stops the channel and schedule a harvest job from the live endpoint. createHarvestJob(props) { // Create a Lambda function to schedule a harvest job return new HarvestJobLambda_1.HarvestJobLambda(this, 'HarvestJob', { channelId: this.eml.channel.ref, endpointId: props.endpoint.id, startTime: props.startTime ?? this.getStartTime(), endTime: props.endTime, destination: props.destination, publish: props.publish, retain: props.retain, }); } getStartTime() { const epocTime = this.channelStartTime ? this.channelStartTime.getTime() : new Date().getTime(); return new Date(epocTime + 30 * 1000); } } exports.LiveChannelFromMp4 = LiveChannelFromMp4; _a = JSII_RTTI_SYMBOL_1; LiveChannelFromMp4[_a] = { fqn: "awscdk-construct-live-channel-from-mp4-file.LiveChannelFromMp4", version: "1.2.27" }; var HarvestJobLambda_2 = require("./HarvestJobLambda"); Object.defineProperty(exports, "HarvestJobLambda", { enumerable: true, get: function () { return HarvestJobLambda_2.HarvestJobLambda; } }); function createSourceSpecs(source) { if (typeof source === 'string') { return createSourceSpecs([{ url: source }]); } return source.map(s => { if (typeof s === 'string') { if (s.startsWith('s3://')) { s = s.replace('s3://', 's3ssl://'); } return { url: s }; } return s; }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGl2ZUNoYW5uZWxGcm9tTXA0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0xpdmVDaGFubmVsRnJvbU1wNC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUVBLDJGQUEwRztBQUMxRywyQ0FBdUM7QUFDdkMseURBQWtGO0FBQ2xGLHFEQUF1RTtBQUN2RSxxREFBdUU7QUFZdkUsU0FBUyxhQUFhLENBQUMsSUFBc0Q7SUFDM0UsT0FBUSxJQUFvQixDQUFDLGtCQUFrQixLQUFLLFNBQVM7V0FDekQsSUFBb0IsQ0FBQyxvQkFBb0IsS0FBSyxTQUFTO1dBQ3ZELElBQW9CLENBQUMsa0JBQWtCLEtBQUssU0FBUztXQUNyRCxJQUFvQixDQUFDLG9CQUFvQixLQUFLLFNBQVM7V0FDdkQsSUFBb0IsQ0FBQyxRQUFRLEtBQUssU0FBUztXQUMzQyxJQUFvQixDQUFDLEtBQUssS0FBSyxTQUFTO1dBQ3hDLElBQW9CLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQztBQUNoRCxDQUFDO0FBbUJELFNBQVMsY0FBYyxDQUFDLElBQXFDO0lBQzNELE9BQVEsSUFBcUIsQ0FBQyxzQkFBc0IsS0FBSyxTQUFTO1dBQzlELElBQXFCLENBQUMscUJBQXFCLEtBQUssU0FBUztXQUN6RCxJQUFxQixDQUFDLFlBQVksS0FBSyxTQUFTO1dBQ2hELElBQXFCLENBQUMsc0JBQXNCLEtBQUssU0FBUztXQUMxRCxJQUFxQixDQUFDLHNCQUFzQixLQUFLLFNBQVM7V0FDMUQsSUFBcUIsQ0FBQyxzQkFBc0IsS0FBSyxTQUFTLENBQUM7QUFDakUsQ0FBQztBQVdELE1BQWEsa0JBQW1CLFNBQVEsc0JBQVM7SUFNL0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxFQUN4QyxNQUFNLEVBQ04sWUFBWSxHQUFHLGlCQUFpQixFQUNoQyxXQUFXLEdBQUc7UUFDWixrQkFBa0IsRUFBRSxDQUFDO0tBQ3RCLEVBQ0QsdUJBQXVCLEdBQUcsV0FBVyxFQUNyQyxZQUFZLEdBQUc7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Q0FBQyxDQUFDLENBQUMsRUFBRTtRQUNwQixJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUMxQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDckMsQ0FBQztZQUNELE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDcEIsQ0FBQztRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuQ2hhbm5lbCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1tZWRpYWxpdmUnO1xuaW1wb3J0IHsgQ2ZuT3JpZ2luRW5kcG9pbnQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbWVkaWFwYWNrYWdlJztcbmltcG9ydCB7IE1lZGlhTGl2ZSwgU291cmNlU3BlYywgRW5jb2RlclNldHRpbmdzLCBzdGFydENoYW5uZWwgfSBmcm9tICdhd3NjZGstY29uc3RydWN0LW1lZGlhbGl2ZS1jaGFubmVsJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgSGFydmVzdEpvYkxhbWJkYSwgSGFydmVzdEpvYkRlc3RpbmF0aW9uUHJvcHMgfSBmcm9tICcuL0hhcnZlc3RKb2JMYW1iZGEnO1xuaW1wb3J0IHsgTWVkaWFQYWNrYWdlVjEsIE1lZGlhUGFrY2FnZVYxUHJvcHMgfSBmcm9tICcuL01lZGlhUGFja2FnZVYxJztcbmltcG9ydCB7IE1lZGlhUGFja2FnZVYyLCBNZWRpYVBha2NhZ2VWMlByb3BzIH0gZnJvbSAnLi9NZWRpYVBhY2thZ2VWMic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW5jb2RlclNwZWMge1xuICByZWFkb25seSBnb3BMZW5ndGhJblNlY29uZHM/OiBudW1iZXI7IC8vIFRoZSBsZW5ndGggb2YgdGhlIEdPUCBpbiBzZWNvbmRzLlxuICByZWFkb25seSB0aW1lY29kZUJ1cm5pblByZWZpeD86IHN0cmluZzsgLy8gVGhlIHByZWZpeCBmb3IgdGhlIHRpbWVjb2RlIGJ1cm4taW4uXG4gIHJlYWRvbmx5IGZyYW1lcmF0ZU51bWVyYXRvcj86IG51bWJlcjsgLy8gVGhlIG51bWVyYXRvciBmb3IgdGhlIGZyYW1lcmF0ZS5cbiAgcmVhZG9ubHkgZnJhbWVyYXRlRGVub21pbmF0b3I/OiBudW1iZXI7IC8vIFRoZSBkZW5vbWluYXRvciBmb3IgdGhlIGZyYW1lcmF0ZS5cbiAgcmVhZG9ubHkgc2NhblR5cGU/OiAnUFJPR1JFU1NJVkUnIHwgJ0lOVEVSTEFDRUQnOyAvLyBUaGUgc2NhbiB0eXBlLlxuICByZWFkb25seSB3aWR0aD86IG51bWJlcjsgLy8gVGhlIHdpZHRoIG9mIHRoZSB2aWRlby5cbiAgcmVhZG9ubHkgaGVpZ2h0PzogbnVtYmVyOyAvLyBUaGUgaGVpZ2h0IG9mIHRoZSB2aWRlby5cbn1cblxuZnVuY3Rpb24gaXNFbmNvZGVyU3BlYyhzcGVjOiBFbmNvZGVyU3BlYyB8IENmbkNoYW5uZWwuRW5jb2RlclNldHRpbmdzUHJvcGVydHkpOiBzcGVjIGlzIEVuY29kZXJTcGVjIHtcbiAgcmV0dXJuIChzcGVjIGFzIEVuY29kZXJTcGVjKS5nb3BMZW5ndGhJblNlY29uZHMgIT09IHVuZGVmaW5lZFxuICB8fCAoc3BlYyBhcyBFbmNvZGVyU3BlYykudGltZWNvZGVCdXJuaW5QcmVmaXggIT09IHVuZGVmaW5lZFxuICB8fCAoc3BlYyBhcyBFbmNvZGVyU3BlYykuZnJhbWVyYXRlTnVtZXJhdG9yICE9PSB1bmRlZmluZWRcbiAgfHwgKHNwZWMgYXMgRW5jb2RlclNwZWMpLmZyYW1lcmF0ZURlbm9taW5hdG9yICE9PSB1bmRlZmluZWRcbiAgfHwgKHNwZWMgYXMgRW5jb2RlclNwZWMpLnNjYW5UeXBlICE9PSB1bmRlZmluZWRcbiAgfHwgKHNwZWMgYXMgRW5jb2RlclNwZWMpLndpZHRoICE9PSB1bmRlZmluZWRcbiAgfHwgKHNwZWMgYXMgRW5jb2RlclNwZWMpLmhlaWdodCAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lZGlhUGFja2FnZVYyU2V0dGluZ3Mge1xuICByZWFkb25seSBjaGFubmVsR3JvdXBOYW1lPzogc3RyaW5nOyAvLyBUaGUgbmFtZSBvZiB0aGUgY2hhbm5lbCBncm91cCB0byBiZSB1c2VkLlxuICByZWFkb25seSBpbnB1dFR5cGU/OiAnSExTJyB8ICdDTUFGJzsgLy8gVGhlIGlucHV0IHR5cGUgZm9yIHRoZSBNZWRpYVBhY2thZ2VWMiBjaGFubmVsLlxuICByZWFkb25seSBvbWl0TGxIbHM/OiBib29sZWFuOyAvLyBXaGV0aGVyIHRvIHNraXAgdGhlIGNyZWF0aW9uIG9mIGEgTG93IExhdGVuY3kgSExTIGVuZHBvaW50LlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VyU3BlYyB7XG4gIHJlYWRvbmx5IHNlZ21lbnREdXJhdGlvblNlY29uZHM/OiBudW1iZXI7IC8vIFRoZSBkdXJhdGlvbiBvZiBlYWNoIHNlZ21lbnQgaW4gc2Vjb25kcy5cbiAgcmVhZG9ubHkgbWFuaWZlc3RXaW5kb3dTZWNvbmRzPzogbnVtYmVyOyAvLyBUaGUgZHVyYXRpb24gb2YgbWFuaWZlc3QgaW4gc2Vjb25kcy5cbiAgcmVhZG9ubHkgaGxzQWRNYXJrZXJzPzogc3RyaW5nOyAvLyBDb250cm9scyBob3cgYWQgbWFya2VycyBhcmUgaW5jbHVkZWQgaW4gdGhlIHBhY2thZ2VkIGVuZHBvaW50LlxuICByZWFkb25seSBzdGFydG92ZXJXaW5kb3dTZWNvbmRzPzogbnVtYmVyOyAvLyBUaGUgZHVyYXRpb24gb2Ygc3RhcnRvdmVyIHdpbmRvdyBpbiBzZWNvbmRzLlxuICByZWFkb25seSBzZXBhcmF0ZUF1ZGlvUmVuZGl0aW9uPzogYm9vbGVhbjsgLy8gV2hldGhlciB0byBzZXBhcmF0ZSBITFMgYXVkaW8gcmVuZGl0aW9uLlxuICByZWFkb25seSBtZWRpYVBhY2thZ2VWMlNldHRpbmdzPzogTWVkaWFQYWNrYWdlVjJTZXR0aW5nczsgLy8gVGhlIHNldHRpbmdzIGZvciBNZWRpYVBhY2thZ2VWMi5cbn1cblxudHlwZSBQYWNrYWdlckZ1bGxTcGVjID0gTWVkaWFQYWtjYWdlVjFQcm9wcyB8IE1lZGlhUGFrY2FnZVYyUHJvcHMgfCAoTWVkaWFQYWtjYWdlVjFQcm9wcyB8IE1lZGlhUGFrY2FnZVYyUHJvcHMpW107XG5cbmZ1bmN0aW9uIGlzUGFja2FnZXJTcGVjKHNwZWM6IFBhY2thZ2VyU3BlYyB8IFBhY2thZ2VyRnVsbFNwZWMpOiBzcGVjIGlzIFBhY2thZ2VyU3BlYyB7XG4gIHJldHVybiAoc3BlYyBhcyBQYWNrYWdlclNwZWMpLnNlZ21lbnREdXJhdGlvblNlY29uZHMgIT09IHVuZGVmaW5lZFxuICB8fCAoc3BlYyBhcyBQYWNrYWdlclNwZWMpLm1hbmlmZXN0V2luZG93U2Vjb25kcyAhPT0gdW5kZWZpbmVkXG4gIHx8IChzcGVjIGFzIFBhY2thZ2VyU3BlYykuaGxzQWRNYXJrZXJzICE9PSB1bmRlZmluZWRcbiAgfHwgKHNwZWMgYXMgUGFja2FnZXJTcGVjKS5zdGFydG92ZXJXaW5kb3dTZWNvbmRzICE9PSB1bmRlZmluZWRcbiAgfHwgKHNwZWMgYXMgUGFja2FnZXJTcGVjKS5zZXBhcmF0ZUF1ZGlvUmVuZGl0aW9uICE9PSB1bmRlZmluZWRcbiAgfHwgKHNwZWMgYXMgUGFja2FnZXJTcGVjKS5tZWRpYVBhY2thZ2VWMlNldHRpbmdzICE9PSB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGl2ZUNoYW5uZWxGcm9tTXA0UHJvcHMge1xuICByZWFkb25seSBzb3VyY2U6IHN0cmluZyB8IHN0cmluZ1tdIHwgU291cmNlU3BlY1tdOyAvLyBUaGUgdXJsKHMpIG9mIHRoZSBNUDQgZmlsZShzKSB1c2VkIGJ5IE1lZGlhTGl2ZSBhcyB0aGUgc291cmNlLlxuICByZWFkb25seSBjaGFubmVsQ2xhc3M/OiAnU1RBTkRBUkQnIHwgJ1NJTkdMRV9QSVBFTElORSc7IC8vIFRoZSBjbGFzcyBvZiB0aGUgY2hhbm5lbC5cbiAgcmVhZG9ubHkgZW5jb2RlclNwZWM/OiBFbmNvZGVyU3BlYyB8IENmbkNoYW5uZWwuRW5jb2RlclNldHRpbmdzUHJvcGVydHk7IC8vIEVuY29kaW5nIHNldHRpbmdzIGZvciB0aGUgY2hhbm5lbC5cbiAgcmVhZG9ubHkgbWVkaWFQYWNrYWdlVmVyc2lvblNwZWM/OiAnVjFfT05MWScgfCAnVjJfT05MWScgfCAnVjFfQU5EX1YyJzsgLy8gV2hldGhlciB0byB1c2UgTWVkaWFQYWNrYWdlVjIuXG4gIHJlYWRvbmx5IHBhY2thZ2VyU3BlYz86IFBhY2thZ2VyU3BlYyB8IFBhY2thZ2VyRnVsbFNwZWM7IC8vIFBhY2thZ2luZyBzZXR0aW5ncyBmb3IgdGhlIGNoYW5uZWwuXG4gIHJlYWRvbmx5IGF1dG9TdGFydD86IGJvb2xlYW47IC8vIFdoZXRoZXIgdG8gc3RhcnQgdGhlIGNoYW5uZWwgYXV0b21hdGljYWxseS5cbn1cblxuZXhwb3J0IGNsYXNzIExpdmVDaGFubmVsRnJvbU1wNCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBlbWw6IE1lZGlhTGl2ZTsgLy8gVGhlIHJlZmVyZW5jZSB0byB0aGUgTWVkaWFMaXZlIGlucHV0L2NoYW5uZWwuXG4gIHB1YmxpYyByZWFkb25seSBlbXB2MT86IE1lZGlhUGFja2FnZVYxOyAvLyBUaGUgcmVmZXJlbmNlIHRvIHRoZSBNZWRpYVBhY2thZ2VWMSBjaGFubmVsL2VuZHBvaW50cy5cbiAgcHVibGljIHJlYWRvbmx5IGVtcHYyPzogTWVkaWFQYWNrYWdlVjI7IC8vIFRoZSByZWZlcmVuY2UgdG8gdGhlIE1lZGlhUGFja2FnZVYyIGNoYW5uZWxHcm91cC9jaGFubmVsL2VuZHBvaW50cy5cbiAgcHVibGljIHJlYWRvbmx5IGNoYW5uZWxTdGFydFRpbWU/OiBEYXRlOyAvLyBUaGUgc3RhcnQgdGltZSBvZiB0aGUgY2hhbm5lbC5cblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCB7XG4gICAgc291cmNlLFxuICAgIGNoYW5uZWxDbGFzcyA9ICdTSU5HTEVfUElQRUxJTkUnLFxuICAgIGVuY29kZXJTcGVjID0ge1xuICAgICAgZ29wTGVuZ3RoSW5TZWNvbmRzOiAzLFxuICAgIH0sXG4gICAgbWVkaWFQYWNrYWdlVmVyc2lvblNwZWMgPSAnVjFfQU5EX1YyJyxcbiAgICBwYWNrYWdlclNwZWMgPSB7XG4gICAgICBzZWdtZW50RHVyYXRpb25TZWNvbmRzOiA2LFxuICAgICAgbWFuaWZlc3RXaW5kb3dTZWNvbmRzOiA2MCxcbiAgICAgIGhsc0FkTWFya2VyczogJ0RBVEVSQU5HRScsXG4gICAgICBzdGFydG92ZXJXaW5kb3dTZWNvbmRzOiA2MCxcbiAgICAgIHNlcGFyYXRlQXVkaW9SZW5kaXRpb246IGZhbHNlLFxuICAgIH0sXG4gICAgYXV0b1N0YXJ0ID0gdHJ1ZSxcbiAgfTogTGl2ZUNoYW5uZWxGcm9tTXA0UHJvcHMpIHtcblxuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBpZiAoaXNQYWNrYWdlclNwZWMocGFja2FnZXJTcGVjKSkge1xuXG4gICAgICBjb25zdCB7XG4gICAgICAgIHNlZ21lbnREdXJhdGlvblNlY29uZHMgPSA2LFxuICAgICAgICBtYW5pZmVzdFdpbmRvd1NlY29uZHMgPSA2MCxcbiAgICAgICAgaGxzQWRNYXJrZXJzID0gJ0RBVEVSQU5HRScsXG4gICAgICAgIHN0YXJ0b3ZlcldpbmRvd1NlY29uZHMgPSA2MCxcbiAgICAgICAgc2VwYXJhdGVBdWRpb1JlbmRpdGlvbiA9IGZhbHNlLFxuICAgICAgICBtZWRpYVBhY2thZ2VWMlNldHRpbmdzLFxuICAgICAgfSA9IHBhY2thZ2VyU3BlYztcblxuICAgICAgaWYgKG1lZGlhUGFja2FnZVZlcnNpb25TcGVjICE9ICdWMl9PTkxZJykge1xuICAgICAgICB0aGlzLmVtcHYxID0gbmV3IE1lZGlhUGFja2FnZVYxKHRoaXMsICdNZWRpYVBhY2thZ2VWMScsIHtcbiAgICAgICAgICBzdGFydG92ZXJXaW5kb3dTZWNvbmRzLFxuICAgICAgICAgIGVuZHBvaW50U3BlYzoge1xuICAgICAgICAgICAgc2VnbWVudER1cmF0aW9uU2Vjb25kcyxcbiAgICAgICAgICAgIG1hbmlmZXN0V2luZG93U2Vjb25kcyxcbiAgICAgICAgICAgIGhsc0FkTWFya2VycyxcbiAgICAgICAgICAgIHNlcGFyYXRlQXVkaW9SZW5kaXRpb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtZWRpYVBhY2thZ2VWZXJzaW9uU3BlYyAhPSAnVjFfT05MWScpIHtcbiAgICAgICAgdGhpcy5lbXB2MiA9IG5ldyBNZWRpYVBhY2thZ2VWMih0aGlzLCAnTWVkaWFQYWNrYWdlVjInLCB7XG4gICAgICAgICAgY2hhbm5lbEdyb3VwTmFtZTogbWVkaWFQYWNrYWdlVjJTZXR0aW5ncz8uY2hhbm5lbEdyb3VwTmFtZSxcbiAgICAgICAgICBpbnB1dFR5cGU6IG1lZGlhUGFja2FnZVYyU2V0dGluZ3M/LmlucHV0VHlwZSxcbiAgICAgICAgICBzdGFydG92ZXJXaW5kb3dTZWNvbmRzLFxuICAgICAgICAgIGVuZHBvaW50U3BlYzoge1xuICAgICAgICAgICAgc2VnbWVudER1cmF0aW9uU2Vjb25kcyxcbiAgICAgICAgICAgIG1hbmlmZXN0V2luZG93U2Vjb25kcyxcbiAgICAgICAgICAgIGhsc0FkTWFya2VycyxcbiAgICAgICAgICAgIHNlcGFyYXRlQXVkaW9SZW5kaXRpb24sXG4gICAgICAgICAgICBvbWl0TGxIbHM6IG1lZGlhUGFja2FnZVYyU2V0dGluZ3M/Lm9taXRMbEhscyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcGFja2FnZXJTcGVjIGlzIFBhY2thZ2VyRnVsbFNwZWNcbiAgICAgIGlmIChtZWRpYVBhY2thZ2VWZXJzaW9uU3BlYyA9PT0gJ1YxX09OTFknKSB7XG4gICAgICAgIHRoaXMuZW1wdjEgPSBuZXcgTWVkaWFQYWNrYWdlVjEodGhpcywgJ01lZGlhUGFja2FnZVYxJywgcGFja2FnZXJTcGVjIGFzIE1lZGlhUGFrY2FnZVYxUHJvcHMpO1xuICAgICAgfSBlbHNlIGlmIChtZWRpYVBhY2thZ2VWZXJzaW9uU3BlYyA9PT0gJ1YyX09OTFknKSB7XG4gICAgICAgIHRoaXMuZW1wdjIgPSBuZXcgTWVkaWFQYWNrYWdlVjIodGhpcywgJ01lZGlhUGFja2FnZVYyJywgcGFja2FnZXJTcGVjIGFzIE1lZGlhUGFrY2FnZVYyUHJvcHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgW3YxU3BlYywgdjJTcGVjXSA9IHBhY2thZ2VyU3BlYyBhcyAoTWVkaWFQYWtjYWdlVjFQcm9wcyB8IE1lZGlhUGFrY2FnZVYyUHJvcHMpW107XG4gICAgICAgIHRoaXMuZW1wdjEgPSBuZXcgTWVkaWFQYWNrYWdlVjEodGhpcywgJ01lZGlhUGFja2FnZVYxJywgdjFTcGVjIGFzIE1lZGlhUGFrY2FnZVYxUHJvcHMpO1xuICAgICAgICB0aGlzLmVtcHYyID0gbmV3IE1lZGlhUGFja2FnZVYyKHRoaXMsICdNZWRpYVBhY2thZ2VWMicsIHYyU3BlYyBhcyBNZWRpYVBha2NhZ2VWMlByb3BzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzb3VyY2VzID0gY3JlYXRlU291cmNlU3BlY3Moc291cmNlKTtcbiAgICBsZXQgZGVzdGluYXRpb25zOiBDZm5DaGFubmVsLk91dHB1dERlc3RpbmF0aW9uUHJvcGVydHlbXTtcbiAgICBjb25zdCBpbmdlc3RFbmRwb2ludHMgPSBjaGFubmVsQ2xhc3MgPT09ICdTVEFOREFSRCcgPyB0aGlzLmVtcHYyPy5pbmdlc3RFbmRwb2ludHMgOiB0aGlzLmVtcHYyPy5pbmdlc3RFbmRwb2ludHMuc2xpY2UoMCwgMSk7XG4gICAgc3dpdGNoIChtZWRpYVBhY2thZ2VWZXJzaW9uU3BlYykge1xuICAgICAgY2FzZSAnVjFfT05MWSc6XG4gICAgICAgIGRlc3RpbmF0aW9ucyA9IFt7XG4gICAgICAgICAgaWQ6ICdNZWRpYVBhY2thZ2VWMScsXG4gICAgICAgICAgbWVkaWFQYWNrYWdlU2V0dGluZ3M6IFt7XG4gICAgICAgICAgICBjaGFubmVsSWQ6IHRoaXMuZW1wdjE/LmNoYW5uZWwucmVmLFxuICAgICAgICAgIH1dLFxuICAgICAgICB9XTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdWMl9PTkxZJzpcbiAgICAgICAgZGVzdGluYXRpb25zID0gdGhpcy5lbXB2Mj8uY2hhbm5lbC5pbnB1dFR5cGUgPT09ICdITFMnID8gW3tcbiAgICAgICAgICBpZDogJ01lZGlhUGFja2FnZVYyJyxcbiAgICAgICAgICBzZXR0aW5nczogaW5nZXN0RW5kcG9pbnRzLFxuICAgICAgICB9XSA6IFt7XG4gICAgICAgICAgaWQ6ICdNZWRpYVBhY2thZ2VWMicsXG4gICAgICAgICAgbWVkaWFQYWNrYWdlU2V0dGluZ3M6IFt7XG4gICAgICAgICAgICBjaGFubmVsR3JvdXA6IHRoaXMuZW1wdjI/LmNoYW5uZWwuY2hhbm5lbEdyb3VwTmFtZSxcbiAgICAgICAgICAgIGNoYW5uZWxOYW1lOiB0aGlzLmVtcHYyPy5jaGFubmVsLmNoYW5uZWxOYW1lLFxuICAgICAgICAgIH1dLFxuICAgICAgICB9XTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdWMV9BTkRfVjInOlxuICAgICAgICBkZXN0aW5hdGlvbnMgPSB0aGlzLmVtcHYyPy5jaGFubmVsLmlucHV0VHlwZSA9PT0gJ0hMUycgPyBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICdNZWRpYVBhY2thZ2VWMScsXG4gICAgICAgICAgICBtZWRpYVBhY2thZ2VTZXR0aW5nczogW3tcbiAgICAgICAgICAgICAgY2hhbm5lbElkOiB0aGlzLmVtcHYxPy5jaGFubmVsLnJlZixcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICdNZWRpYVBhY2thZ2VWMicsXG4gICAgICAgICAgICBzZXR0aW5nczogaW5nZXN0RW5kcG9pbnRzLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0gOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICdNZWRpYVBhY2thZ2VWMScsXG4gICAgICAgICAgICBtZWRpYVBhY2thZ2VTZXR0aW5nczogW3tcbiAgICAgICAgICAgICAgY2hhbm5lbElkOiB0aGlzLmVtcHYxPy5jaGFubmVsLnJlZixcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICdNZWRpYVBhY2thZ2VWMicsXG4gICAgICAgICAgICBtZWRpYVBhY2thZ2VTZXR0aW5nczogW3tcbiAgICAgICAgICAgICAgY2hhbm5lbEdyb3VwOiB0aGlzLmVtcHYyPy5jaGFubmVsLmNoYW5uZWxHcm91cE5hbWUsXG4gICAgICAgICAgICAgIGNoYW5uZWxOYW1lOiB0aGlzLmVtcHYyPy5jaGFubmVsLmNoYW5uZWxOYW1lLFxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgbGV0IGludGVybmFsRW5jb2RlclNwZWM6IEVuY29kZXJTZXR0aW5ncztcblxuICAgIGlmIChpc0VuY29kZXJTcGVjKGVuY29kZXJTcGVjKSkge1xuXG4gICAgICBjb25zdCB7XG4gICAgICAgIGdvcExlbmd0aEluU2Vjb25kcyA9IDMsXG4gICAgICAgIHRpbWVjb2RlQnVybmluUHJlZml4LFxuICAgICAgICBmcmFtZXJhdGVOdW1lcmF0b3IgPSAzMCxcbiAgICAgICAgZnJhbWVyYXRlRGVub21pbmF0b3IgPSAxLFxuICAgICAgICBzY2FuVHlwZSA9ICdQUk9HUkVTU0lWRScsXG4gICAgICAgIHdpZHRoID0gMTkyMCxcbiAgICAgICAgaGVpZ2h0ID0gMTA4MCxcbiAgICAgIH0gPSBlbmNvZGVyU3BlYztcblxuICAgICAgY29uc3QgaGxzR3JvdXBTZXR0aW5ncyA9IHtcbiAgICAgICAgYWRNYXJrZXJzOiBbJ0VMRU1FTlRBTF9TQ1RFMzUnXSxcbiAgICAgICAgZGVzdGluYXRpb246IHtcbiAgICAgICAgICBkZXN0aW5hdGlvblJlZklkOiAnTWVkaWFQYWNrYWdlVjInLFxuICAgICAgICB9LFxuICAgICAgICBobHNDZG5TZXR0aW5nczoge1xuICAgICAgICAgIGhsc1dlYmRhdlNldHRpbmdzOiB7XG4gICAgICAgICAgICBodHRwVHJhbnNmZXJNb2RlOiAnTk9OX0NIVU5LRUQnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGluZGV4TlNlZ21lbnRzOiAxNSxcbiAgICAgICAgaW5wdXRMb3NzQWN0aW9uOiAnUEFVU0VfT1VUUFVUJyxcbiAgICAgICAgbWFuaWZlc3REdXJhdGlvbkZvcm1hdDogJ0ZMT0FUSU5HX1BPSU5UJyxcbiAgICAgICAgcHJvZ3JhbURhdGVUaW1lOiAnSU5DTFVERScsXG4gICAgICAgIHByb2dyYW1EYXRlVGltZUNsb2NrOiAnU1lTVEVNX0NMT0NLJyxcbiAgICAgICAgcHJvZ3JhbURhdGVUaW1lUGVyaW9kOiAxLFxuICAgICAgICBzZWdtZW50TGVuZ3RoOiAxLFxuICAgICAgICBzdHJlYW1JbmZSZXNvbHV0aW9uOiAnSU5DTFVERScsXG4gICAgICB9O1xuICAgICAgY29uc3QgaGxzT3V0cHV0U2V0dGluZ3MgPSB7XG4gICAgICAgIGhsc1NldHRpbmdzOiB7XG4gICAgICAgICAgc3RhbmRhcmRIbHNTZXR0aW5nczoge1xuICAgICAgICAgICAgbTNVOFNldHRpbmdzOiB7XG4gICAgICAgICAgICAgIHNjdGUzNUJlaGF2aW9yOiAnUEFTU1RIUk9VR0gnLFxuICAgICAgICAgICAgICB0aW1lZE1ldGFkYXRhQmVoYXZpb3I6ICdQQVNTVEhST1VHSCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgbGV0IG91dHB1dEdyb3VwU2V0dGluZ3NMaXN0OiBDZm5DaGFubmVsLk91dHB1dEdyb3VwU2V0dGluZ3NQcm9wZXJ0eVtdO1xuICAgICAgbGV0IG91dHB1dFNldHRpbmdzTGlzdDogQ2ZuQ2hhbm5lbC5PdXRwdXRTZXR0aW5nc1Byb3BlcnR5W107XG4gICAgICBzd2l0Y2ggKG1lZGlhUGFja2FnZVZlcnNpb25TcGVjKSB7XG4gICAgICAgIGNhc2UgJ1YxX09OTFknOlxuICAgICAgICAgIG91dHB1dEdyb3VwU2V0dGluZ3NMaXN0ID0gW3tcbiAgICAgICAgICAgIG1lZGlhUGFja2FnZUdyb3VwU2V0dGluZ3M6IHtcbiAgICAgICAgICAgICAgZGVzdGluYXRpb246IHtcbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblJlZklkOiAnTWVkaWFQYWNrYWdlVjEnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XTtcbiAgICAgICAgICBvdXRwdXRTZXR0aW5nc0xpc3QgPSBbe1xuICAgICAgICAgICAgbWVkaWFQYWNrYWdlT3V0cHV0U2V0dGluZ3M6IHt9LFxuICAgICAgICAgIH1dO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdWMl9PTkxZJzpcbiAgICAgICAgICBvdXRwdXRHcm91cFNldHRpbmdzTGlzdCA9IHRoaXMuZW1wdjI/LmNoYW5uZWwuaW5wdXRUeXBlID09PSAnSExTJyA/IFt7XG4gICAgICAgICAgICBobHNHcm91cFNldHRpbmdzLFxuICAgICAgICAgIH1dIDogW3tcbiAgICAgICAgICAgIG1lZGlhUGFja2FnZUdyb3VwU2V0dGluZ3M6IHtcbiAgICAgICAgICAgICAgZGVzdGluYXRpb246IHtcbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblJlZklkOiAnTWVkaWFQYWNrYWdlVjInLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XTtcbiAgICAgICAgICBvdXRwdXRTZXR0aW5nc0xpc3QgPSB0aGlzLmVtcHYyPy5jaGFubmVsLmlucHV0VHlwZSA9PT0gJ0hMUycgPyBbe1xuICAgICAgICAgICAgaGxzT3V0cHV0U2V0dGluZ3MsXG4gICAgICAgICAgfV0gOiBbe1xuICAgICAgICAgICAgbWVkaWFQYWNrYWdlT3V0cHV0U2V0dGluZ3M6IHt9LFxuICAgICAgICAgIH1dO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdWMV9BTkRfVjInOlxuICAgICAgICAgIG91dHB1dEdyb3VwU2V0dGluZ3NMaXN0ID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBtZWRpYVBhY2thZ2VHcm91cFNldHRpbmdzOiB7XG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb246IHtcbiAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uUmVmSWQ6ICdNZWRpYVBhY2thZ2VWMScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLmVtcHYyPy5jaGFubmVsLmlucHV0VHlwZSA9PT0gJ0hMUycgP1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaGxzR3JvdXBTZXR0aW5ncyxcbiAgICAgICAgICAgICAgfSA6IHtcbiAgICAgICAgICAgICAgICBtZWRpYVBhY2thZ2VHcm91cFNldHRpbmdzOiB7XG4gICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblJlZklkOiAnTWVkaWFQYWNrYWdlVjInLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgIF07XG4gICAgICAgICAgb3V0cHV0U2V0dGluZ3NMaXN0ID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBtZWRpYVBhY2thZ2VPdXRwdXRTZXR0aW5nczoge30sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5lbXB2Mj8uY2hhbm5lbC5pbnB1dFR5cGUgPT09ICdITFMnID8ge1xuICAgICAgICAgICAgICBobHNPdXRwdXRTZXR0aW5ncyxcbiAgICAgICAgICAgIH0gOiB7XG4gICAgICAgICAgICAgIG1lZGlhUGFja2FnZU91dHB1dFNldHRpbmdzOiB7fSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaW50ZXJuYWxFbmNvZGVyU3BlYyA9IHtcbiAgICAgICAgb3V0cHV0R3JvdXBTZXR0aW5nc0xpc3QsXG4gICAgICAgIG91dHB1dFNldHRpbmdzTGlzdCxcbiAgICAgICAgZ29wTGVuZ3RoSW5TZWNvbmRzOiB0aGlzLmVtcHYyPy5lbmRwb2ludHMubGxIbHMgPyAxIDogZ29wTGVuZ3RoSW5TZWNvbmRzLFxuICAgICAgICB0aW1lY29kZUJ1cm5pblByZWZpeCxcbiAgICAgICAgZnJhbWVyYXRlTnVtZXJhdG9yLFxuICAgICAgICBmcmFtZXJhdGVEZW5vbWluYXRvcixcbiAgICAgICAgc2NhblR5cGUsXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHQsXG4gICAgICB9O1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGVuY29kZXJTcGVjIGlzIENmbkNoYW5uZWwuRW5jb2RlclNldHRpbmdzUHJvcGVydHlcbiAgICAgIGludGVybmFsRW5jb2RlclNwZWMgPSBlbmNvZGVyU3BlYztcbiAgICB9XG5cbiAgICB0aGlzLmVtbCA9IG5ldyBNZWRpYUxpdmUodGhpcywgJ01lZGlhTGl2ZScsIHtcbiAgICAgIHNvdXJjZXMsXG4gICAgICBkZXN0aW5hdGlvbnMsXG4gICAgICBjaGFubmVsQ2xhc3MsXG4gICAgICBlbmNvZGVyU3BlYzogaW50ZXJuYWxFbmNvZGVyU3BlYyxcbiAgICB9KTtcblxuICAgIGlmIChhdXRvU3RhcnQpIHtcbiAgICAgIC8vIFN0YXJ0IGNoYW5uZWxcbiAgICAgIHRoaXMuY2hhbm5lbFN0YXJ0VGltZSA9IHN0YXJ0Q2hhbm5lbCh0aGlzLCAnU3RhcnRNZWRpYUxpdmVDaGFubmVsJywgdGhpcy5lbWwuY2hhbm5lbC5yZWYpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENyZWF0ZSBhIExhbWJkYSBmdW5jdGlvbiB0aGF0IHN0b3BzIHRoZSBjaGFubmVsIGFuZCBzY2hlZHVsZSBhIGhhcnZlc3Qgam9iIGZyb20gdGhlIGxpdmUgZW5kcG9pbnQuXG4gIHB1YmxpYyBjcmVhdGVIYXJ2ZXN0Sm9iKHByb3BzOiBIYXJ2ZXN0Sm9iUHJvcHMpOiBIYXJ2ZXN0Sm9iTGFtYmRhIHtcbiAgICAvLyBDcmVhdGUgYSBMYW1iZGEgZnVuY3Rpb24gdG8gc2NoZWR1bGUgYSBoYXJ2ZXN0IGpvYlxuICAgIHJldHVybiBuZXcgSGFydmVzdEpvYkxhbWJkYSh0aGlzLCAnSGFydmVzdEpvYicsIHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5lbWwuY2hhbm5lbC5yZWYsXG4gICAgICBlbmRwb2ludElkOiBwcm9wcy5lbmRwb2ludC5pZCxcbiAgICAgIHN0YXJ0VGltZTogcHJvcHMuc3RhcnRUaW1lID8/IHRoaXMuZ2V0U3RhcnRUaW1lKCksXG4gICAgICBlbmRUaW1lOiBwcm9wcy5lbmRUaW1lLFxuICAgICAgZGVzdGluYXRpb246IHByb3BzLmRlc3RpbmF0aW9uLFxuICAgICAgcHVibGlzaDogcHJvcHMucHVibGlzaCxcbiAgICAgIHJldGFpbjogcHJvcHMucmV0YWluLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGFydFRpbWUoKTogRGF0ZSB7XG4gICAgY29uc3QgZXBvY1RpbWUgPSB0aGlzLmNoYW5uZWxTdGFydFRpbWUgPyB0aGlzLmNoYW5uZWxTdGFydFRpbWUuZ2V0VGltZSgpIDogbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGVwb2NUaW1lICsgMzAgKiAxMDAwKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhhcnZlc3RKb2JQcm9wcyB7XG4gIHJlYWRvbmx5IGVuZHBvaW50OiBDZm5PcmlnaW5FbmRwb2ludDsgLy8gVGhlIGxpdmUgZW5kcG9pbnQgdG8gYmUgaGFydmVzdGVkLlxuICByZWFkb25seSBkZXN0aW5hdGlvbj86IEhhcnZlc3RKb2JEZXN0aW5hdGlvblByb3BzOyAvLyBUaGUgZGVzdGluYXRpb24gb2YgdGhlIGhhcnZlc3Qgam9iLiBJZiBub3Qgc3BlY2lmaWVkLCBhIG5ldyBTMyBidWNrZXQgd2lsbCBiZSBjcmVhdGVkLlxuICByZWFkb25seSBzdGFydFRpbWU/OiBEYXRlOyAvLyBUaGUgc3RhcnQgdGltZSBvZiB0aGUgaGFydmVzdCBqb2IuIERlZmF1bHQgaXMgMzAgc2Vjb25kcyBhZnRlciB0aGUgY2hhbm5lbCBzdGFydCB0aW1lLlxuICByZWFkb25seSBlbmRUaW1lPzogRGF0ZTsgLy8gVGhlIGVuZCB0aW1lIG9mIHRoZSBoYXJ2ZXN0IGpvYi4gRGVmYXVsdCBpcyB0aGUgZnVuY3Rpb24gaW52b2NhdGlvbiB0aW1lLlxuICByZWFkb25seSBwdWJsaXNoPzogYm9vbGVhbjsgLy8gV2hldGhlciB0byBwdWJsaXNoIHRoZSBoYXJ2ZXN0ZWQgVk9EIGNvbnRlbnQuXG4gIHJlYWRvbmx5IHJldGFpbj86IGJvb2xlYW47IC8vIFdoZXRoZXIgdG8gcmV0YWluIHRoZSBoYXJ2ZXN0ZWQgVk9EIGNvbnRlbnQgYWZ0ZXIgdGhlIHN0YWNrIGlzIHJlbW92ZWQuXG59XG5cbmV4cG9ydCB7IEhhcnZlc3RKb2JMYW1iZGEsIEhhcnZlc3RKb2JMYW1iZGFQcm9wcywgSGFydmVzdEpvYkRlc3RpbmF0aW9uUHJvcHMgfSBmcm9tICcuL0hhcnZlc3RKb2JMYW1iZGEnO1xuXG5mdW5jdGlvbiBjcmVhdGVTb3VyY2VTcGVjcyhzb3VyY2U6IHN0cmluZyB8IHN0cmluZ1tdIHwgU291cmNlU3BlY1tdKTogU291cmNlU3BlY1tdIHtcbiAgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVNvdXJjZVNwZWNzKFt7IHVybDogc291cmNlIH1dKTtcbiAgfVxuICByZXR1cm4gc291cmNlLm1hcChzID0+IHtcbiAgICBpZiAodHlwZW9mIHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAocy5zdGFydHNXaXRoKCdzMzovLycpKSB7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoJ3MzOi8vJywgJ3Mzc3NsOi8vJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyB1cmw6IHMgfTtcbiAgICB9XG4gICAgcmV0dXJuIHM7XG4gIH0pO1xufVxuIl19