videogular2
Version:
Videogular is a video application framework for desktop and mobile powered by Angular 2.0
223 lines • 35.9 kB
JavaScript
"use strict";
///<reference path='./google.ima.ts'/>
var core_1 = require('@angular/core');
var vg_api_1 = require('../core/services/vg-api');
var vg_events_1 = require('../core/events/vg-events');
var vg_fullscreen_api_1 = require('../core/services/vg-fullscreen-api');
var VgImaAds = (function () {
function VgImaAds(ref, API, fsAPI) {
this.API = API;
this.fsAPI = fsAPI;
this.isFullscreen = false;
this.subscriptions = [];
this.displayState = 'none';
this.elem = ref.nativeElement;
this.onContentEnded = this.onContentEnded.bind(this);
}
VgImaAds.prototype.ngOnInit = function () {
var _this = this;
if (this.API.isPlayerReady) {
this.onPlayerReady();
}
else {
this.subscriptions.push(this.API.playerReadyEvent.subscribe(function () { return _this.onPlayerReady(); }));
}
};
VgImaAds.prototype.onPlayerReady = function () {
if (typeof google === "undefined") {
this.onMissingGoogleImaLoader();
return;
}
this.target = this.API.getMediaById(this.vgFor);
this.initializations();
this.subscriptions.push(this.target.subscriptions.ended.subscribe(this.onContentEnded.bind(this)));
this.subscriptions.push(this.target.subscriptions.play.subscribe(this.onUpdateState.bind(this)));
this.subscriptions.push(this.fsAPI.onChangeFullscreen.subscribe(this.onChangeFullscreen.bind(this)));
this.ima.adsLoader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, this.onAdsManagerLoaded.bind(this), false);
this.ima.adsLoader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, this.onAdError.bind(this), false);
this.loadAds();
};
VgImaAds.prototype.initializations = function () {
var _this = this;
this.ima = new Ima(this.elem);
if (this.vgSkipButton) {
this.skipButton = document.querySelector(this.vgSkipButton);
this.skipButton.style.display = 'none';
this.skipButton.addEventListener('click', this.onClickSkip.bind(this));
this.elem.insertBefore(this.skipButton, this.elem.firstChild);
}
window.addEventListener('resize', function () {
var w = _this.API.videogularElement.offsetWidth;
var h = _this.API.videogularElement.offsetHeight;
if (_this.ima.adsManager) {
if (_this.isFullscreen) {
_this.ima.adsManager.resize(w, h, google.ima.ViewMode.FULLSCREEN);
}
else {
_this.ima.adsManager.resize(w, h, google.ima.ViewMode.NORMAL);
}
}
});
};
VgImaAds.prototype.loadAds = function () {
var _this = this;
if (this.vgCompanion) {
googletag.cmd.push(function () {
var adUnitPath = '/' + _this.vgNetwork + '/' + _this.vgUnitPath;
var slot = googletag.defineSlot(adUnitPath, _this.vgCompanionSize, _this.vgCompanion);
if (slot) {
slot.addService(googletag.companionAds());
slot.addService(googletag.pubads());
googletag
.companionAds()
.setRefreshUnfilledSlots(true);
googletag
.pubads()
.enableVideoAds();
googletag.enableServices();
}
});
}
};
VgImaAds.prototype.onUpdateState = function (event) {
switch (event.type) {
case vg_events_1.VgEvents.VG_PLAY:
if (!this.ima.adsLoaded) {
this.API.pause();
this.ima.adDisplayContainer.initialize();
this.requestAds(this.vgAdTagUrl);
this.ima.adsLoaded = true;
}
break;
}
};
VgImaAds.prototype.requestAds = function (adTagUrl) {
// Show only to get computed style in pixels
this.show();
var adsRequest = new google.ima.AdsRequest();
var computedStyle = window.getComputedStyle(this.elem);
adsRequest.adTagUrl = adTagUrl;
adsRequest.linearAdSlotWidth = parseInt(computedStyle.width, 10);
adsRequest.linearAdSlotHeight = parseInt(computedStyle.height, 10);
adsRequest.nonLinearAdSlotWidth = parseInt(computedStyle.width, 10);
adsRequest.nonLinearAdSlotHeight = parseInt(computedStyle.height, 10);
this.ima.adsLoader.requestAds(adsRequest);
};
VgImaAds.prototype.onAdsManagerLoaded = function (evt) {
this.show();
this.ima.adsManager = evt.getAdsManager(this.target);
this.processAdsManager(this.ima.adsManager);
};
VgImaAds.prototype.processAdsManager = function (adsManager) {
var w = this.API.videogularElement.offsetWidth;
var h = this.API.videogularElement.offsetHeight;
// Attach the pause/resume events.
this.ima.adsManager.addEventListener(google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, this.onContentPauseRequested.bind(this), false);
this.ima.adsManager.addEventListener(google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, this.onContentResumeRequested.bind(this), false);
this.ima.adsManager.addEventListener(google.ima.AdEvent.Type.SKIPPABLE_STATE_CHANGED, this.onSkippableStateChanged.bind(this), false);
this.ima.adsManager.addEventListener(google.ima.AdEvent.Type.ALL_ADS_COMPLETED, this.onAllAdsComplete.bind(this), false);
this.ima.adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, this.onAdComplete.bind(this), false);
this.ima.adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, this.onAdError.bind(this), false);
this.ima.adsManager.init(w, h, google.ima.ViewMode.NORMAL);
this.ima.adsManager.start();
};
VgImaAds.prototype.onSkippableStateChanged = function () {
var isSkippable = this.ima.adsManager.getAdSkippableState();
if (isSkippable) {
this.skipButton.style.display = 'block';
}
else {
this.skipButton.style.display = 'none';
}
};
VgImaAds.prototype.onClickSkip = function () {
this.ima.adsManager.skip();
};
VgImaAds.prototype.onContentPauseRequested = function () {
this.show();
this.API.pause();
};
VgImaAds.prototype.onContentResumeRequested = function () {
this.API.play();
this.hide();
};
VgImaAds.prototype.onAdError = function (evt) {
if (this.ima.adsManager) {
this.ima.adsManager.destroy();
}
this.hide();
this.API.play();
};
VgImaAds.prototype.onAllAdsComplete = function () {
this.hide();
// The last ad was a post-roll
if (this.ima.adsManager.getCuePoints().join().indexOf('-1') >= 0) {
this.API.pause(); // it was stop() in Videogular v1
}
};
VgImaAds.prototype.onAdComplete = function () {
// TODO: Update view with current ad count
this.ima.currentAd++;
};
VgImaAds.prototype.show = function () {
window.dispatchEvent(new CustomEvent(vg_events_1.VgEvents.VG_START_ADS));
this.displayState = 'block';
};
VgImaAds.prototype.hide = function () {
window.dispatchEvent(new CustomEvent(vg_events_1.VgEvents.VG_END_ADS));
this.displayState = 'none';
};
VgImaAds.prototype.onContentEnded = function () {
this.ima.adsLoader.contentComplete();
};
VgImaAds.prototype.onChangeFullscreen = function (fsState) {
if (!this.fsAPI.nativeFullscreen) {
this.isFullscreen = fsState;
}
};
VgImaAds.prototype.onMissingGoogleImaLoader = function () {
this.hide();
this.API.play();
};
VgImaAds.prototype.ngOnDestroy = function () {
this.subscriptions.forEach(function (s) { return s.unsubscribe(); });
};
VgImaAds.decorators = [
{ type: core_1.Component, args: [{
selector: 'vg-ima-ads',
encapsulation: core_1.ViewEncapsulation.None,
template: "<div class=\"vg-ima-ads\"></div>",
styles: ["\n vg-ima-ads {\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: 300;\n }\n vg-ima-ads .vg-ima-ads {\n position: absolute;\n width: 100%;\n height: 100%;\n pointer-events: none;\n }\n "]
},] },
];
/** @nocollapse */
VgImaAds.ctorParameters = [
{ type: core_1.ElementRef, },
{ type: vg_api_1.VgAPI, },
{ type: vg_fullscreen_api_1.VgFullscreenAPI, },
];
VgImaAds.propDecorators = {
'vgFor': [{ type: core_1.Input },],
'vgNetwork': [{ type: core_1.Input },],
'vgUnitPath': [{ type: core_1.Input },],
'vgCompanion': [{ type: core_1.Input },],
'vgCompanionSize': [{ type: core_1.Input },],
'vgAdTagUrl': [{ type: core_1.Input },],
'vgSkipButton': [{ type: core_1.Input },],
'displayState': [{ type: core_1.HostBinding, args: ['style.display',] },],
};
return VgImaAds;
}());
exports.VgImaAds = VgImaAds;
var Ima = (function () {
function Ima(imaAdsElement) {
this.adDisplayContainer = new google.ima.AdDisplayContainer(imaAdsElement);
this.adsLoader = new google.ima.AdsLoader(this.adDisplayContainer);
this.adsManager = null;
this.adsLoaded = false;
this.currentAd = 0;
}
return Ima;
}());
exports.Ima = Ima;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmctaW1hLWFkcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInZnLWltYS1hZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHNDQUFzQztBQUN0QyxxQkFBZ0csZUFBZSxDQUFDLENBQUE7QUFFaEgsdUJBQXNCLHlCQUF5QixDQUFDLENBQUE7QUFDaEQsMEJBQXlCLDBCQUEwQixDQUFDLENBQUE7QUFDcEQsa0NBQWdDLG9DQUFvQyxDQUFDLENBQUE7QUFJckU7SUFtQkksa0JBQVksR0FBZSxFQUFTLEdBQVUsRUFBUyxLQUFzQjtRQUF6QyxRQUFHLEdBQUgsR0FBRyxDQUFPO1FBQVMsVUFBSyxHQUFMLEtBQUssQ0FBaUI7UUFQN0UsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFHOUIsa0JBQWEsR0FBbUIsRUFBRSxDQUFDO1FBRWxDLGlCQUFZLEdBQVcsTUFBTSxDQUFDO1FBRzNCLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQztRQUM5QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCwyQkFBUSxHQUFSO1FBQUEsaUJBT0M7UUFORyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDekIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pCLENBQUM7UUFDRCxJQUFJLENBQUMsQ0FBQztZQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGNBQU0sT0FBQSxLQUFJLENBQUMsYUFBYSxFQUFFLEVBQXBCLENBQW9CLENBQUMsQ0FBQyxDQUFDO1FBQzdGLENBQUM7SUFDTCxDQUFDO0lBRUQsZ0NBQWEsR0FBYjtRQUNJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sTUFBTSxLQUFLLFdBQVcs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QUFDLGtCQUFrQixDQUFDLENBQUM7UUFFbkUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUNMLFVBQUM7QUFBRCxDQUFDLEFBZkQsSUFlQztBQWZZLFdBQUcsTUFlZixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8vPHJlZmVyZW5jZSBwYXRoPScuL2dvb2dsZS5pbWEudHMnLz5cbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIEhvc3RCaW5kaW5nLCBWaWV3RW5jYXBzdWxhdGlvbiwgT25Jbml0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElQbGF5YWJsZSB9IGZyb20gJy4uL2NvcmUvdmctbWVkaWEvaS1wbGF5YWJsZSc7XG5pbXBvcnQgeyBWZ0FQSSB9IGZyb20gJy4uL2NvcmUvc2VydmljZXMvdmctYXBpJztcbmltcG9ydCB7IFZnRXZlbnRzIH0gZnJvbSAnLi4vY29yZS9ldmVudHMvdmctZXZlbnRzJztcbmltcG9ydCB7IFZnRnVsbHNjcmVlbkFQSSB9IGZyb20gJy4uL2NvcmUvc2VydmljZXMvdmctZnVsbHNjcmVlbi1hcGknO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcy9TdWJzY3JpcHRpb24nO1xuXG5cbmV4cG9ydCBjbGFzcyBWZ0ltYUFkcyBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICAgdmdGb3I6IHN0cmluZztcbiAgICAgdmdOZXR3b3JrOiBzdHJpbmc7XG4gICAgIHZnVW5pdFBhdGg6IHN0cmluZztcbiAgICAgdmdDb21wYW5pb246IHN0cmluZztcbiAgICAgdmdDb21wYW5pb25TaXplOiBBcnJheTxOdW1iZXI+O1xuICAgICB2Z0FkVGFnVXJsOiBzdHJpbmc7XG4gICAgIHZnU2tpcEJ1dHRvbjogc3RyaW5nO1xuXG4gICAgZWxlbTogSFRNTEVsZW1lbnQ7XG4gICAgdGFyZ2V0OiBJUGxheWFibGU7XG4gICAgaW1hOiBJbWE7XG4gICAgaXNGdWxsc2NyZWVuOiBib29sZWFuID0gZmFsc2U7XG4gICAgc2tpcEJ1dHRvbjogSFRNTEVsZW1lbnQ7XG5cbiAgICBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gICAgIGRpc3BsYXlTdGF0ZTogc3RyaW5nID0gJ25vbmUnO1xuXG4gICAgY29uc3RydWN0b3IocmVmOiBFbGVtZW50UmVmLCBwdWJsaWMgQVBJOiBWZ0FQSSwgcHVibGljIGZzQVBJOiBWZ0Z1bGxzY3JlZW5BUEkpIHtcbiAgICAgICAgdGhpcy5lbGVtID0gcmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMub25Db250ZW50RW5kZWQgPSB0aGlzLm9uQ29udGVudEVuZGVkLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLkFQSS5pc1BsYXllclJlYWR5KSB7XG4gICAgICAgICAgICB0aGlzLm9uUGxheWVyUmVhZHkoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMuQVBJLnBsYXllclJlYWR5RXZlbnQuc3Vic2NyaWJlKCgpID0+IHRoaXMub25QbGF5ZXJSZWFkeSgpKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblBsYXllclJlYWR5KCkge1xuICAgICAgICBpZiAodHlwZW9mIGdvb2dsZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgdGhpcy5vbk1pc3NpbmdHb29nbGVJbWFMb2FkZXIoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGhpcy5BUEkuZ2V0TWVkaWFCeUlkKHRoaXMudmdGb3IpO1xuXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6YXRpb25zKCk7XG5cbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy50YXJnZXQuc3Vic2NyaXB0aW9ucy5lbmRlZC5zdWJzY3JpYmUodGhpcy5vbkNvbnRlbnRFbmRlZC5iaW5kKHRoaXMpKSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMudGFyZ2V0LnN1YnNjcmlwdGlvbnMucGxheS5zdWJzY3JpYmUodGhpcy5vblVwZGF0ZVN0YXRlLmJpbmQodGhpcykpKTtcblxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmZzQVBJLm9uQ2hhbmdlRnVsbHNjcmVlbi5zdWJzY3JpYmUodGhpcy5vbkNoYW5nZUZ1bGxzY3JlZW4uYmluZCh0aGlzKSkpO1xuXG4gICAgICAgIHRoaXMuaW1hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQsXG4gICAgICAgICAgICB0aGlzLm9uQWRzTWFuYWdlckxvYWRlZC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5pbWEuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICBnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLFxuICAgICAgICAgICAgdGhpcy5vbkFkRXJyb3IuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5sb2FkQWRzKCk7XG4gICAgfVxuXG4gICAgaW5pdGlhbGl6YXRpb25zKCkge1xuICAgICAgICB0aGlzLmltYSA9IG5ldyBJbWEodGhpcy5lbGVtKTtcblxuICAgICAgICBpZiAodGhpcy52Z1NraXBCdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuc2tpcEJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy52Z1NraXBCdXR0b24pIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgdGhpcy5za2lwQnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICB0aGlzLnNraXBCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uQ2xpY2tTa2lwLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgdGhpcy5lbGVtLmluc2VydEJlZm9yZSh0aGlzLnNraXBCdXR0b24sIHRoaXMuZWxlbS5maXJzdENoaWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB3ID0gdGhpcy5BUEkudmlkZW9ndWxhckVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgICBjb25zdCBoID0gdGhpcy5BUEkudmlkZW9ndWxhckVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pbWEuYWRzTWFuYWdlcikge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzRnVsbHNjcmVlbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmltYS5hZHNNYW5hZ2VyLnJlc2l6ZSh3LCBoLCBnb29nbGUuaW1hLlZpZXdNb2RlLkZVTExTQ1JFRU4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbWEuYWRzTWFuYWdlci5yZXNpemUodywgaCwgZ29vZ2xlLmltYS5WaWV3TW9kZS5OT1JNQUwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbG9hZEFkcygpIHtcbiAgICAgICAgaWYgKHRoaXMudmdDb21wYW5pb24pIHtcbiAgICAgICAgICAgIGdvb2dsZXRhZy5jbWQucHVzaChcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFkVW5pdFBhdGg6IHN0cmluZyA9ICcvJyArIHRoaXMudmdOZXR3b3JrICsgJy8nICsgdGhpcy52Z1VuaXRQYXRoO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzbG90OiBnb29nbGV0YWcuU2xvdCA9IGdvb2dsZXRhZy5kZWZpbmVTbG90KGFkVW5pdFBhdGgsIHRoaXMudmdDb21wYW5pb25TaXplLCB0aGlzLnZnQ29tcGFuaW9uKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2xvdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2xvdC5hZGRTZXJ2aWNlKGdvb2dsZXRhZy5jb21wYW5pb25BZHMoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzbG90LmFkZFNlcnZpY2UoZ29vZ2xldGFnLnB1YmFkcygpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZ29vZ2xldGFnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBhbmlvbkFkcygpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFJlZnJlc2hVbmZpbGxlZFNsb3RzKHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBnb29nbGV0YWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHViYWRzKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZW5hYmxlVmlkZW9BZHMoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZ29vZ2xldGFnLmVuYWJsZVNlcnZpY2VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25VcGRhdGVTdGF0ZShldmVudDogYW55KSB7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBWZ0V2ZW50cy5WR19QTEFZOlxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbWEuYWRzTG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuQVBJLnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW1hLmFkRGlzcGxheUNvbnRhaW5lci5pbml0aWFsaXplKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdEFkcyh0aGlzLnZnQWRUYWdVcmwpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmltYS5hZHNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlcXVlc3RBZHMoYWRUYWdVcmw6IHN0cmluZykge1xuICAgICAgICAvLyBTaG93IG9ubHkgdG8gZ2V0IGNvbXB1dGVkIHN0eWxlIGluIHBpeGVsc1xuICAgICAgICB0aGlzLnNob3coKTtcblxuICAgICAgICBjb25zdCBhZHNSZXF1ZXN0ID0gbmV3IGdvb2dsZS5pbWEuQWRzUmVxdWVzdCgpO1xuICAgICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5lbGVtKTtcbiAgICAgICAgYWRzUmVxdWVzdC5hZFRhZ1VybCA9IGFkVGFnVXJsO1xuXG4gICAgICAgIGFkc1JlcXVlc3QubGluZWFyQWRTbG90V2lkdGggPSBwYXJzZUludChjb21wdXRlZFN0eWxlLndpZHRoLCAxMCk7XG4gICAgICAgIGFkc1JlcXVlc3QubGluZWFyQWRTbG90SGVpZ2h0ID0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5oZWlnaHQsIDEwKTtcbiAgICAgICAgYWRzUmVxdWVzdC5ub25MaW5lYXJBZFNsb3RXaWR0aCA9IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUud2lkdGgsIDEwKTtcbiAgICAgICAgYWRzUmVxdWVzdC5ub25MaW5lYXJBZFNsb3RIZWlnaHQgPSBwYXJzZUludChjb21wdXRlZFN0eWxlLmhlaWdodCwgMTApO1xuXG4gICAgICAgIHRoaXMuaW1hLmFkc0xvYWRlci5yZXF1ZXN0QWRzKGFkc1JlcXVlc3QpO1xuICAgIH1cblxuICAgIG9uQWRzTWFuYWdlckxvYWRlZChldnQ6IGdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50KSB7XG4gICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgICB0aGlzLmltYS5hZHNNYW5hZ2VyID0gZXZ0LmdldEFkc01hbmFnZXIodGhpcy50YXJnZXQpO1xuICAgICAgICB0aGlzLnByb2Nlc3NBZHNNYW5hZ2VyKHRoaXMuaW1hLmFkc01hbmFnZXIpO1xuICAgIH1cblxuICAgIHByb2Nlc3NBZHNNYW5hZ2VyKGFkc01hbmFnZXI6IGdvb2dsZS5pbWEuQWRzTWFuYWdlcikge1xuICAgICAgICBjb25zdCB3ID0gdGhpcy5BUEkudmlkZW9ndWxhckVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgIGNvbnN0IGggPSB0aGlzLkFQSS52aWRlb2d1bGFyRWxlbWVudC5vZmZzZXRIZWlnaHQ7XG5cbiAgICAgICAgLy8gQXR0YWNoIHRoZSBwYXVzZS9yZXN1bWUgZXZlbnRzLlxuICAgICAgICB0aGlzLmltYS5hZHNNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICBnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5DT05URU5UX1BBVVNFX1JFUVVFU1RFRCxcbiAgICAgICAgICAgIHRoaXMub25Db250ZW50UGF1c2VSZXF1ZXN0ZWQuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaW1hLmFkc01hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgIGdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkNPTlRFTlRfUkVTVU1FX1JFUVVFU1RFRCxcbiAgICAgICAgICAgIHRoaXMub25Db250ZW50UmVzdW1lUmVxdWVzdGVkLmJpbmQodGhpcyksXG4gICAgICAgICAgICBmYWxzZVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmltYS5hZHNNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICBnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5TS0lQUEFCTEVfU1RBVEVfQ0hBTkdFRCxcbiAgICAgICAgICAgIHRoaXMub25Ta2lwcGFibGVTdGF0ZUNoYW5nZWQuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaW1hLmFkc01hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgIGdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkFMTF9BRFNfQ09NUExFVEVELFxuICAgICAgICAgICAgdGhpcy5vbkFsbEFkc0NvbXBsZXRlLmJpbmQodGhpcyksXG4gICAgICAgICAgICBmYWxzZVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmltYS5hZHNNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICBnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5DT01QTEVURSxcbiAgICAgICAgICAgIHRoaXMub25BZENvbXBsZXRlLmJpbmQodGhpcyksXG4gICAgICAgICAgICBmYWxzZVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmltYS5hZHNNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICBnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLFxuICAgICAgICAgICAgdGhpcy5vbkFkRXJyb3IuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5pbWEuYWRzTWFuYWdlci5pbml0KHcsIGgsIGdvb2dsZS5pbWEuVmlld01vZGUuTk9STUFMKTtcbiAgICAgICAgdGhpcy5pbWEuYWRzTWFuYWdlci5zdGFydCgpO1xuICAgIH1cblxuICAgIG9uU2tpcHBhYmxlU3RhdGVDaGFuZ2VkKCkge1xuICAgICAgICBjb25zdCBpc1NraXBwYWJsZSA9IHRoaXMuaW1hLmFkc01hbmFnZXIuZ2V0QWRTa2lwcGFibGVTdGF0ZSgpO1xuXG4gICAgICAgIGlmIChpc1NraXBwYWJsZSkge1xuICAgICAgICAgICAgdGhpcy5za2lwQnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5za2lwQnV0dG9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkNsaWNrU2tpcCgpIHtcbiAgICAgICAgdGhpcy5pbWEuYWRzTWFuYWdlci5za2lwKCk7XG4gICAgfVxuXG4gICAgb25Db250ZW50UGF1c2VSZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgICB0aGlzLkFQSS5wYXVzZSgpO1xuICAgIH1cblxuICAgIG9uQ29udGVudFJlc3VtZVJlcXVlc3RlZCgpIHtcbiAgICAgICAgdGhpcy5BUEkucGxheSgpO1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICB9XG5cbiAgICBvbkFkRXJyb3IoZXZ0KSB7XG4gICAgICAgIGlmICh0aGlzLmltYS5hZHNNYW5hZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLmltYS5hZHNNYW5hZ2VyLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgdGhpcy5BUEkucGxheSgpO1xuICAgIH1cblxuICAgIG9uQWxsQWRzQ29tcGxldGUoKSB7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAvLyBUaGUgbGFzdCBhZCB3YXMgYSBwb3N0LXJvbGxcbiAgICAgICAgaWYgKHRoaXMuaW1hLmFkc01hbmFnZXIuZ2V0Q3VlUG9pbnRzKCkuam9pbigpLmluZGV4T2YoJy0xJykgPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5BUEkucGF1c2UoKTsgLy8gaXQgd2FzIHN0b3AoKSBpbiBWaWRlb2d1bGFyIHYxXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkFkQ29tcGxldGUoKSB7XG4gICAgICAgIC8vIFRPRE86IFVwZGF0ZSB2aWV3IHdpdGggY3VycmVudCBhZCBjb3VudFxuICAgICAgICB0aGlzLmltYS5jdXJyZW50QWQrKztcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoVmdFdmVudHMuVkdfU1RBUlRfQURTKSk7XG4gICAgICAgIHRoaXMuZGlzcGxheVN0YXRlID0gJ2Jsb2NrJztcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoVmdFdmVudHMuVkdfRU5EX0FEUykpO1xuICAgICAgICB0aGlzLmRpc3BsYXlTdGF0ZSA9ICdub25lJztcbiAgICB9XG5cbiAgICBvbkNvbnRlbnRFbmRlZCgpIHtcbiAgICAgICAgdGhpcy5pbWEuYWRzTG9hZGVyLmNvbnRlbnRDb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIG9uQ2hhbmdlRnVsbHNjcmVlbihmc1N0YXRlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICghdGhpcy5mc0FQSS5uYXRpdmVGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICB0aGlzLmlzRnVsbHNjcmVlbiA9IGZzU3RhdGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uTWlzc2luZ0dvb2dsZUltYUxvYWRlcigpIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIHRoaXMuQVBJLnBsYXkoKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgIH1cbnN0YXRpYyBkZWNvcmF0b3JzOiBEZWNvcmF0b3JJbnZvY2F0aW9uW10gPSBbXG57IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3tcbiAgICBzZWxlY3RvcjogJ3ZnLWltYS1hZHMnLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwidmctaW1hLWFkc1wiPjwvZGl2PmAsXG4gICAgc3R5bGVzOiBbIGBcbiAgICAgICAgdmctaW1hLWFkcyB7XG4gICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICAgIHotaW5kZXg6IDMwMDtcbiAgICAgICAgfVxuICAgICAgICB2Zy1pbWEtYWRzIC52Zy1pbWEtYWRzIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIH1cbiAgICBgIF1cbn0sIF0gfSxcbl07XG4vKiogQG5vY29sbGFwc2UgKi9cbnN0YXRpYyBjdG9yUGFyYW1ldGVyczogKHt0eXBlOiBhbnksIGRlY29yYXRvcnM/OiBEZWNvcmF0b3JJbnZvY2F0aW9uW119fG51bGwpW10gPSBbXG57dHlwZTogRWxlbWVudFJlZiwgfSxcbnt0eXBlOiBWZ0FQSSwgfSxcbnt0eXBlOiBWZ0Z1bGxzY3JlZW5BUEksIH0sXG5dO1xuc3RhdGljIHByb3BEZWNvcmF0b3JzOiB7W2tleTogc3RyaW5nXTogRGVjb3JhdG9ySW52b2NhdGlvbltdfSA9IHtcbid2Z0Zvcic6IFt7IHR5cGU6IElucHV0IH0sXSxcbid2Z05ldHdvcmsnOiBbeyB0eXBlOiBJbnB1dCB9LF0sXG4ndmdVbml0UGF0aCc6IFt7IHR5cGU6IElucHV0IH0sXSxcbid2Z0NvbXBhbmlvbic6IFt7IHR5cGU6IElucHV0IH0sXSxcbid2Z0NvbXBhbmlvblNpemUnOiBbeyB0eXBlOiBJbnB1dCB9LF0sXG4ndmdBZFRhZ1VybCc6IFt7IHR5cGU6IElucHV0IH0sXSxcbid2Z1NraXBCdXR0b24nOiBbeyB0eXBlOiBJbnB1dCB9LF0sXG4nZGlzcGxheVN0YXRlJzogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnc3R5bGUuZGlzcGxheScsIF0gfSxdLFxufTtcbn1cblxuXG5leHBvcnQgY2xhc3MgSW1hIHtcbiAgICBhZERpc3BsYXlDb250YWluZXI6IGdvb2dsZS5pbWEuQWREaXNwbGF5Q29udGFpbmVyO1xuICAgIGFkc0xvYWRlcjogZ29vZ2xlLmltYS5BZHNMb2FkZXI7XG4gICAgYWRzTWFuYWdlcjogZ29vZ2xlLmltYS5BZHNNYW5hZ2VyO1xuICAgIGFkc0xvYWRlZDogYm9vbGVhbjtcbiAgICBjdXJyZW50QWQ6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKGltYUFkc0VsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuYWREaXNwbGF5Q29udGFpbmVyID0gbmV3IGdvb2dsZS5pbWEuQWREaXNwbGF5Q29udGFpbmVyKGltYUFkc0VsZW1lbnQpO1xuICAgICAgICB0aGlzLmFkc0xvYWRlciA9IG5ldyBnb29nbGUuaW1hLkFkc0xvYWRlcih0aGlzLmFkRGlzcGxheUNvbnRhaW5lcik7XG5cbiAgICAgICAgdGhpcy5hZHNNYW5hZ2VyID0gbnVsbDtcbiAgICAgICAgdGhpcy5hZHNMb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jdXJyZW50QWQgPSAwO1xuICAgIH1cbn1cblxuaW50ZXJmYWNlIERlY29yYXRvckludm9jYXRpb24ge1xuICB0eXBlOiBGdW5jdGlvbjtcbiAgYXJncz86IGFueVtdO1xufVxuIl19