@dicdikshaorg/video-player-v9
Version:
Contains Video player library components powered by angular. These components are designed to be used in sunbird consumption platforms *(mobile app, web portal, offline desktop app)* to drive reusability, maintainability hence reducing the redundant devel
497 lines • 51.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/sunbird-video-player.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { __assign } from "tslib";
import { ChangeDetectorRef, Component, EventEmitter, Input, Output, HostListener, ElementRef, ViewChild, Renderer2 } from '@angular/core';
import { ErrorService, errorCode, errorMessage } from '@project-sunbird/sunbird-player-sdk-v9';
import { ViewerService } from './services/viewer.service';
import { SunbirdVideoPlayerService } from './sunbird-video-player.service';
var SunbirdVideoPlayerComponent = /** @class */ (function () {
function SunbirdVideoPlayerComponent(videoPlayerService, viewerService, cdr, renderer2, errorService) {
var _this = this;
this.videoPlayerService = videoPlayerService;
this.viewerService = viewerService;
this.cdr = cdr;
this.renderer2 = renderer2;
this.errorService = errorService;
this.telemetryEvent = new EventEmitter();
this.viewState = 'player';
this.showControls = true;
this.sideMenuConfig = {
showShare: true,
showDownload: true,
showReplay: true,
showExit: true
};
this.isPaused = false;
this.showQumlPlayer = false;
this.QumlPlayerConfig = {};
this.isFullScreen = false;
this.raiseInternetDisconnectionError = (/**
* @return {?}
*/
function () {
/** @type {?} */
var code = errorCode.internetConnectivity;
/** @type {?} */
var message = errorMessage.internetConnectivity;
/** @type {?} */
var stacktrace = code + ": " + message;
_this.viewerService.raiseExceptionLog(code, message, stacktrace, _this.traceId);
});
this.playerEvent = this.viewerService.playerEvent;
this.viewerService.playerEvent.subscribe((/**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.type === 'pause') {
_this.isPaused = true;
_this.showControls = true;
}
if (event.type === 'play') {
_this.isPaused = false;
}
if (event.type === 'loadstart') {
_this.viewerService.raiseStartEvent(event);
}
if (event.type === 'ended') {
_this.viewerService.endPageSeen = true;
_this.viewerService.raiseEndEvent();
_this.viewState = 'end';
}
if (event.type === 'error') {
// tslint:disable-next-line:one-variable-per-declaration
/** @type {?} */
var code = errorCode.contentLoadFails;
/** @type {?} */
var message = errorMessage.contentLoadFails;
if (_this.viewerService.isAvailableLocally) {
code = errorCode.contentLoadFails;
message = errorMessage.contentLoadFails;
}
if (code === errorCode.contentLoadFails) {
_this.showContentError = true;
}
_this.viewerService.raiseExceptionLog(code, message, event, _this.traceId);
}
// tslint:disable-next-line:max-line-length
/** @type {?} */
var events = [{ type: 'volumechange', telemetryEvent: 'VOLUME_CHANGE' }, { type: 'seeking', telemetryEvent: 'DRAG' }, { type: 'fullscreen', telemetryEvent: 'FULLSCREEN' },
{ type: 'ratechange', telemetryEvent: 'RATE_CHANGE' }];
events.forEach((/**
* @param {?} data
* @return {?}
*/
function (data) {
if (event.type === data.type) {
_this.viewerService.raiseHeartBeatEvent(data.telemetryEvent);
}
}));
}));
console.log(this.playVideoFromTimestamp, 'this is playvideotime');
}
/**
* @param {?} event
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.onTelemetryEvent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.telemetryEvent.emit(event.detail);
};
/**
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
console.log('sunbird-video-player.component=====');
if (typeof this.playerConfig === 'string') {
try {
this.playerConfig = JSON.parse(this.playerConfig);
}
catch (error) {
console.error('Invalid playerConfig: ', error);
}
}
setInterval((/**
* @return {?}
*/
function () {
if (!_this.isPaused) {
_this.showControls = false;
}
}), 5000);
/* tslint:disable:no-string-literal */
this.nextContent = this.playerConfig.config.nextContent;
this.traceId = this.playerConfig.config['traceId'];
this.sideMenuConfig = __assign(__assign({}, this.sideMenuConfig), this.playerConfig.config.sideMenu);
this.videoPlayerService.initialize(this.playerConfig);
this.viewerService.initialize(this.playerConfig);
window.addEventListener('offline', this.raiseInternetDisconnectionError, true);
this.QumlPlayerConfig.config = this.playerConfig.config;
this.QumlPlayerConfig.config.sideMenu.enable = false;
this.QumlPlayerConfig.context = this.playerConfig.context;
this.setTelemetryObjectRollup(this.playerConfig.metadata.identifier);
// setTimeout(() => {
// console.log('sunbird-video-player.component=====setTimeout')
// this.playVideoFromTimestamp = 300;
// }, 5000);
};
/**
* @param {?} changes
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes.action) {
if (!this.showQumlPlayer) {
this.playerAction = this.action;
}
}
};
/**
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var videoPlayerElement = this.videoPlayerRef.nativeElement;
this.unlistenMouseMove = this.renderer2.listen(videoPlayerElement, 'mousemove', (/**
* @return {?}
*/
function () {
_this.showControls = true;
}));
this.unlistenTouchStart = this.renderer2.listen(videoPlayerElement, 'touchstart', (/**
* @return {?}
*/
function () {
_this.showControls = true;
}));
/** @type {?} */
var contentCompabilityLevel = this.playerConfig.metadata['compatibilityLevel'];
if (contentCompabilityLevel) {
/** @type {?} */
var checkContentCompatible = this.errorService.checkContentCompatibility(contentCompabilityLevel);
if (!checkContentCompatible['isCompitable']) {
// tslint:disable-next-line:max-line-length
this.viewerService.raiseExceptionLog(errorCode.contentCompatibility, errorMessage.contentCompatibility, checkContentCompatible['error']['message'], this.traceId);
}
}
};
/**
* @param {?} event
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.sideBarEvents = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
this.playerEvent.emit(event);
if (event.type === 'DOWNLOAD') {
this.downloadVideo();
}
/** @type {?} */
var events = ['SHARE', 'DOWNLOAD_MENU', 'EXIT', 'CLOSE_MENU', 'OPEN_MENU', 'DOWNLOAD_POPUP_CANCEL', 'DOWNLOAD_POPUP_CLOSE'];
events.forEach((/**
* @param {?} data
* @return {?}
*/
function (data) {
if (event.type === data) {
_this.viewerService.raiseHeartBeatEvent(data);
}
if (event.type === 'EXIT') {
_this.viewerService.sidebarMenuEvent.emit('CLOSE_MENU');
}
}));
};
/**
* @param {?} id
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.setTelemetryObjectRollup = /**
* @param {?} id
* @return {?}
*/
function (id) {
if (this.QumlPlayerConfig.context) {
/** @type {?} */
var hasObjectRollup = this.QumlPlayerConfig && this.QumlPlayerConfig.context && this.QumlPlayerConfig.context.objectRollup;
if (!hasObjectRollup) {
this.QumlPlayerConfig.context.objectRollup = {};
}
/** @type {?} */
var levels = Object.keys(this.QumlPlayerConfig.context.objectRollup);
this.QumlPlayerConfig.context.objectRollup["l" + (levels.length + 1)] = id;
}
};
/**
* @param {?} event
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.playContent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.viewerService.raiseHeartBeatEvent(event.type);
};
/**
* @param {?} event
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.replayContent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.playerEvent.emit(event);
this.viewState = 'player';
this.viewerService.isEndEventRaised = false;
this.viewerService.raiseHeartBeatEvent('REPLAY');
};
/**
* @param {?} event
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.exitContent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.playerEvent.emit(event);
this.viewerService.raiseHeartBeatEvent('EXIT');
};
/**
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.downloadVideo = /**
* @return {?}
*/
function () {
/** @type {?} */
var a = document.createElement('a');
a.href = this.viewerService.artifactUrl;
a.download = this.viewerService.contentName;
a.target = '_blank';
document.body.appendChild(a);
a.click();
a.remove();
this.viewerService.raiseHeartBeatEvent('DOWNLOAD');
};
/**
* @param {?} event
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.qumlPlayerEvents = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.eid === 'QUML_SUMMARY') {
this.showQumlPlayer = false;
/** @type {?} */
var score = parseInt(event.edata.extra.find((/**
* @param {?} p
* @return {?}
*/
function (p) { return p.id === 'score'; }))['value'], 10);
this.viewerService.interceptionResponses[this.currentInterceptionTime] = {
score: score,
isSkipped: false
};
/** @type {?} */
var interceptPointElement = document.querySelector("[data-marker-time=\"" + this.currentInterceptionTime + "\"]");
if (interceptPointElement) {
interceptPointElement['style'].background = 'green';
}
this.videoInstance.play();
this.videoInstance.controls(true);
this.viewerService.raiseImpressionEvent('video');
// if currently video is not in full screen and was previously full screen then set it back to full screen again
if (!document.fullscreenElement && this.isFullScreen) {
if (document.getElementsByClassName('video-js')[0]) {
document.getElementsByClassName('video-js')[0].requestFullscreen()
.catch((/**
* @param {?} err
* @return {?}
*/
function (err) { return console.error(err); }));
}
}
}
};
/**
* @param {?} __0
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.questionSetData = /**
* @param {?} __0
* @return {?}
*/
function (_a) {
var response = _a.response, time = _a.time, identifier = _a.identifier;
this.QumlPlayerConfig.metadata = response;
this.QumlPlayerConfig.metadata['showStartPage'] = 'No';
this.QumlPlayerConfig.metadata['showEndPage'] = 'No';
this.currentInterceptionTime = time;
this.currentInterceptionUIId = identifier;
if (document.fullscreenElement) {
this.isFullScreen = true;
document.exitFullscreen()
.catch((/**
* @param {?} err
* @return {?}
*/
function (err) { return console.error(err); }));
}
else {
this.isFullScreen = false;
}
this.showQumlPlayer = true;
this.viewerService.raiseImpressionEvent('interactive-question-set', { id: identifier, type: 'QuestionSet' });
this.viewerService.raiseHeartBeatEvent('VIDEO_MARKER_SELECTED', {
identifier: identifier,
// Question set id,
type: 'QuestionSet',
// Type of interaction
interceptedAt: time // Time when the interception happened
});
};
/**
* @param {?} event
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.playerInstance = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.videoInstance = event;
};
/**
* @return {?}
*/
SunbirdVideoPlayerComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.viewerService.raiseEndEvent();
this.unlistenTouchStart();
this.unlistenMouseMove();
this.viewerService.isEndEventRaised = false;
window.removeEventListener('offline', this.raiseInternetDisconnectionError, true);
};
SunbirdVideoPlayerComponent.decorators = [
{ type: Component, args: [{
selector: 'sunbird-video-player',
template: "<div class=\"sunbird-video-player-container\" #videoPlayer [ngClass]=\"showQumlPlayer ? 'videoPlayerHide': 'videoPlayerShow'\">\r\n <sb-player-side-menu-icon class=\"sb-player-side-menu-icon notVisible\" tabindex=\"0\" (sidebarMenuEvent)=\"sideBarEvents($event)\"\r\n\r\n *ngIf=\"viewState ==='player'\" [ngClass]=\"{'isVisible': showControls}\"></sb-player-side-menu-icon>\r\n <video-player *ngIf=\"viewState === 'player'\" (questionSetData)=\"questionSetData($event)\" (playerInstance)=\"playerInstance($event)\" [config]=\"playerConfig.config\" [action]=\"playerAction\" [playVideoFromTimestamp]=\"playVideoFromTimestamp\">\r\n </video-player>\r\n <sb-player-sidebar *ngIf=\"viewState ==='player'\"\r\n [title]=\"viewerService.contentName\"\r\n (sidebarEvent)=\"sideBarEvents($event)\" [config]=\"sideMenuConfig\"></sb-player-sidebar>\r\n <sb-player-end-page \r\n [contentName]=\"viewerService.contentName\" \r\n [outcomeLabel]=\"viewerService.showScore ? 'Score: ': ''\" \r\n [outcome]=\"viewerService.showScore ? viewerService.scoreObtained + ((viewerService.maxScore && viewerService.maxScore > 0) ? '/' + viewerService.maxScore : '') : ''\"\r\n [nextContent]=\"nextContent\" [userName]=\"viewerService.userName\" \r\n [showExit]=\"sideMenuConfig.showExit\"\r\n [timeSpentLabel]=\"viewerService.timeSpent\" tabindex=\"0\" (playNextContent)=\"playContent($event)\" \r\n (exitContent)=\"exitContent($event)\" (replayContent)=\"replayContent($event)\"\r\n *ngIf=\"viewState === 'end'\"></sb-player-end-page>\r\n <sb-player-contenterror *ngIf=\"showContentError\"></sb-player-contenterror>\r\n</div>\r\n\r\n<div class=\"sunbird-video-player-container\" *ngIf=\"showQumlPlayer\" #qumlPlayer>\r\n <quml-main-player [playerConfig]=\"QumlPlayerConfig\" (playerEvent)=\"qumlPlayerEvents($event)\"></quml-main-player>\r\n</div>",
styles: [".sunbird-video-player-container{width:100%;height:100%;overflow:hidden;position:relative}.videoPlayerHide{display:none}.videoPlayerShow{display:block}pdf-menu{position:absolute;top:0;left:0;z-index:99}.BtmNotVisible,.notVisible{transition:1s ease-in-out;position:absolute;width:100%}.notVisible{top:-10rem}.notVisible.isVisible{top:0}.BtmNotVisible{bottom:-10rem}.BtmNotVisible.isVisible{bottom:0}::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button span{background:0 0!important}::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button span:after,::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button span:before,::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button:hover span:after,::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon input[type=checkbox]:checked~#overlay-button:hover span:before{background-color:rgba(255,255,255,.7)!important}::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon label{background:rgba(51,51,51,.5)}::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon label span,::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon label span:after,::ng-deep .sunbird-video-player-container .sb-player-side-menu-icon label span:before{background-color:rgba(255,255,255,.7)!important}::ng-deep .sunbird-pdf-player{overflow:hidden}::ng-deep .pdfViewer .page{background:0 0!important;-o-border-image:none!important;border-image:none!important;border:0!important}::ng-deep #toolbarContainer{background:0 0!important;height:auto!important}::ng-deep #viewerContainer{position:relative!important;height:calc(100% - 3rem)}::ng-deep .body,::ng-deep .html,::ng-deep .pdf-viewer button,::ng-deep .pdf-viewer input,::ng-deep .pdf-viewer select{font-size:inherit!important}::ng-deep .findbar,::ng-deep .secondaryToolbar,::ng-deep html[dir=ltr] #toolbarContainer,::ng-deep html[dir=rtl] #toolbarContainer{box-shadow:none!important}::ng-deep .zoom{min-height:inherit!important}::ng-deep html[dir=rtl] .sb-pdf-reading-status{left:auto;right:1rem}.sb-pdf-reading-status{color:var(--gray-800);font-size:.75rem;position:absolute;left:1rem;bottom:1rem;display:flex;align-items:center;background:var(--white);border-radius:.5rem;padding:.25em .5rem;z-index:5;line-height:normal}.sb-pdf-reading-status span{background:var(--gray-800);width:.25rem;height:.25rem;display:block;margin:0 .5rem;border-radius:50%}.sbt-pdf-footer{background:var(--white);position:absolute;bottom:0;width:100%;height:3rem;display:flex;align-items:center;justify-content:flex-end;padding:.75rem .5rem}@media all and (orientation:landscape){::ng-deep .visible-only-potrait{display:none}}@media all and (orientation:portrait){::ng-deep #viewerContainer{height:calc(100% - 6rem)!important}::ng-deep .visible-only-landscape{display:none}::ng-deep .visible-only-potrait{display:block}::ng-deep .file-download__popup{height:15.125rem}::ng-deep .pdf-endpage{display:block!important;position:relative}::ng-deep .pdf-endpage__left-panel{margin-top:6rem}::ng-deep .pdf-endpage__right-panel .title-section{position:absolute;top:0;left:0;right:0}}@media all and (max-width:640px){.visible-only-landscape{display:none}.visible-only-potrait{display:block}}@media all and (min-width:640px){.visible-only-landscape{display:block}.visible-only-potrait{display:none}}"]
}] }
];
/** @nocollapse */
SunbirdVideoPlayerComponent.ctorParameters = function () { return [
{ type: SunbirdVideoPlayerService },
{ type: ViewerService },
{ type: ChangeDetectorRef },
{ type: Renderer2 },
{ type: ErrorService }
]; };
SunbirdVideoPlayerComponent.propDecorators = {
playerConfig: [{ type: Input }],
playVideoFromTimestamp: [{ type: Input }],
action: [{ type: Input }],
playerEvent: [{ type: Output }],
telemetryEvent: [{ type: Output }],
videoPlayerRef: [{ type: ViewChild, args: ['videoPlayer', { static: true },] }],
onTelemetryEvent: [{ type: HostListener, args: ['document:TelemetryEvent', ['$event'],] }],
ngOnDestroy: [{ type: HostListener, args: ['window:beforeunload',] }]
};
return SunbirdVideoPlayerComponent;
}());
export { SunbirdVideoPlayerComponent };
if (false) {
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.playerConfig;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.playVideoFromTimestamp;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.action;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.playerEvent;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.telemetryEvent;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.videoPlayerRef;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.viewState;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.traceId;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.nextContent;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.showContentError;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.showControls;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.sideMenuConfig;
/**
* @type {?}
* @private
*/
SunbirdVideoPlayerComponent.prototype.unlistenTouchStart;
/**
* @type {?}
* @private
*/
SunbirdVideoPlayerComponent.prototype.unlistenMouseMove;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.isPaused;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.showQumlPlayer;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.QumlPlayerConfig;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.videoInstance;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.currentInterceptionTime;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.currentInterceptionUIId;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.isFullScreen;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.playerAction;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.raiseInternetDisconnectionError;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.videoPlayerService;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.viewerService;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.cdr;
/**
* @type {?}
* @private
*/
SunbirdVideoPlayerComponent.prototype.renderer2;
/** @type {?} */
SunbirdVideoPlayerComponent.prototype.errorService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VuYmlyZC12aWRlby1wbGF5ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGRpY2Rpa3NoYW9yZy92aWRlby1wbGF5ZXItdjkvIiwic291cmNlcyI6WyJsaWIvc3VuYmlyZC12aWRlby1wbGF5ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLE9BQU8sRUFDTCxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQ2pFLFlBQVksRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFpQixTQUFTLEVBQzlELE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUcsU0FBUyxFQUFHLFlBQVksRUFBaUIsTUFBTSx3Q0FBd0MsQ0FBQztBQUloSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDM0U7SUFtQ0UscUNBQ1Msa0JBQTZDLEVBQzdDLGFBQTRCLEVBQzVCLEdBQXNCLEVBQ3JCLFNBQW9CLEVBQ3JCLFlBQTBCO1FBTG5DLGlCQWdEQztRQS9DUSx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQTJCO1FBQzdDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3JCLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDckIsaUJBQVksR0FBWixZQUFZLENBQWM7UUE3QnpCLG1CQUFjLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFFdEUsY0FBUyxHQUFHLFFBQVEsQ0FBQztRQUlyQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixtQkFBYyxHQUFHO1lBQ2YsU0FBUyxFQUFFLElBQUk7WUFDZixZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQixRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUM7UUFHRixhQUFR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LEVBQUUsSUFBSSxDQUFDLCtCQUErQixFQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3JGLENBQUM7O2dCQS9RRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLHNCQUFzQjtvQkFDaEMsaTZEQUFvRDs7aUJBRXJEOzs7O2dCQUxRLHlCQUF5QjtnQkFEekIsYUFBYTtnQkFQcEIsaUJBQWlCO2dCQUNtQyxTQUFTO2dCQUV0RCxZQUFZOzs7K0JBYWxCLEtBQUs7eUNBQ0wsS0FBSzt5QkFDTCxLQUFLOzhCQUNMLE1BQU07aUNBQ04sTUFBTTtpQ0FDTixTQUFTLFNBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTttQ0F5RXpDLFlBQVksU0FBQyx5QkFBeUIsRUFBRSxDQUFDLFFBQVEsQ0FBQzs4QkFtTGxELFlBQVksU0FBQyxxQkFBcUI7O0lBUXJDLGtDQUFDO0NBQUEsQUFoUkQsSUFnUkM7U0EzUVksMkJBQTJCOzs7SUFFdEMsbURBQW9DOztJQUNwQyw2REFBeUM7O0lBQ3pDLDZDQUEwQjs7SUFDMUIsa0RBQTRDOztJQUM1QyxxREFBc0U7O0lBQ3RFLHFEQUF1RTs7SUFDdkUsZ0RBQXFCOztJQUNyQiw4Q0FBdUI7O0lBQ3ZCLGtEQUF3Qjs7SUFDeEIsdURBQTBCOztJQUMxQixtREFBb0I7O0lBQ3BCLHFEQUtFOzs7OztJQUNGLHlEQUF1Qzs7Ozs7SUFDdkMsd0RBQXNDOztJQUN0QywrQ0FBaUI7O0lBQ2pCLHFEQUF1Qjs7SUFDdkIsdURBQTJCOztJQUMzQixvREFBbUI7O0lBQ25CLDhEQUF3Qjs7SUFDeEIsOERBQXdCOztJQUN4QixtREFBcUI7O0lBQ3JCLG1EQUFzQjs7SUFtR3RCLHNFQUtDOztJQXJHQyx5REFBb0Q7O0lBQ3BELG9EQUFtQzs7SUFDbkMsMENBQTZCOzs7OztJQUM3QixnREFBNEI7O0lBQzVCLG1EQUFpQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRocm93U3RtdCB9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyJztcclxuaW1wb3J0IHtcclxuICBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLFxyXG4gIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBBZnRlclZpZXdJbml0LCBSZW5kZXJlcjIsIE9uRGVzdHJveVxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBFcnJvclNlcnZpY2UgLCBlcnJvckNvZGUgLCBlcnJvck1lc3NhZ2UsIElTaWRlQmFyRXZlbnQgfSBmcm9tICdAcHJvamVjdC1zdW5iaXJkL3N1bmJpcmQtcGxheWVyLXNkay12OSc7XHJcblxyXG5pbXBvcnQgeyBQbGF5ZXJDb25maWcgfSBmcm9tICcuL3BsYXllckludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBJQWN0aW9uIH0gZnJvbSAnLi9wbGF5ZXJJbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgVmlld2VyU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdmlld2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTdW5iaXJkVmlkZW9QbGF5ZXJTZXJ2aWNlIH0gZnJvbSAnLi9zdW5iaXJkLXZpZGVvLXBsYXllci5zZXJ2aWNlJztcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzdW5iaXJkLXZpZGVvLXBsYXllcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3N1bmJpcmQtdmlkZW8tcGxheWVyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9zdW5iaXJkLXZpZGVvLXBsYXllci5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTdW5iaXJkVmlkZW9QbGF5ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcclxuXHJcbiAgQElucHV0KCkgcGxheWVyQ29uZmlnOiBQbGF5ZXJDb25maWc7XHJcbiAgQElucHV0KCkgcGxheVZpZGVvRnJvbVRpbWVzdGFtcDogbnVtYmVyIDtcclxuICBASW5wdXQoKSBhY3Rpb24/OiBJQWN0aW9uO1xyXG4gIEBPdXRwdXQoKSBwbGF5ZXJFdmVudDogRXZlbnRFbWl0dGVyPG9iamVjdD47XHJcbiAgQE91dHB1dCgpIHRlbGVtZXRyeUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBWaWV3Q2hpbGQoJ3ZpZGVvUGxheWVyJywgeyBzdGF0aWM6IHRydWUgfSkgdmlkZW9QbGF5ZXJSZWY6IEVsZW1lbnRSZWY7XHJcbiAgdmlld1N0YXRlID0gJ3BsYXllcic7XHJcbiAgcHVibGljIHRyYWNlSWQ6IHN0cmluZztcclxuICBwdWJsaWMgbmV4dENvbnRlbnQ6IGFueTtcclxuICBzaG93Q29udGVudEVycm9yOiBib29sZWFuO1xyXG4gIHNob3dDb250cm9scyA9IHRydWU7XHJcbiAgc2lkZU1lbnVDb25maWcgPSB7XHJcbiAgICBzaG93U2hhcmU6IHRydWUsXHJcbiAgICBzaG93RG93bmxvYWQ6IHRydWUsXHJcbiAgICBzaG93UmVwbGF5OiB0cnVlLFxyXG4gICAgc2hvd0V4aXQ6IHRydWVcclxuICB9O1xyXG4gIHByaXZhdGUgdW5saXN0ZW5Ub3VjaFN0YXJ0OiAoKSA9PiB2b2lkO1xyXG4gIHByaXZhdGUgdW5saXN0ZW5Nb3VzZU1vdmU6ICgpID0+IHZvaWQ7XHJcbiAgaXNQYXVzZWQgPSBmYWxzZTtcclxuICBzaG93UXVtbFBsYXllciA9IGZhbHNlO1xyXG4gIFF1bWxQbGF5ZXJDb25maWc6IGFueSA9IHt9O1xyXG4gIHZpZGVvSW5zdGFuY2U6IGFueTtcclxuICBjdXJyZW50SW50ZXJjZXB0aW9uVGltZTtcclxuICBjdXJyZW50SW50ZXJjZXB0aW9uVUlJZDtcclxuICBpc0Z1bGxTY3JlZW4gPSBmYWxzZTtcclxuICBwbGF5ZXJBY3Rpb246IElBY3Rpb247XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIHZpZGVvUGxheWVyU2VydmljZTogU3VuYmlyZFZpZGVvUGxheWVyU2VydmljZSxcclxuICAgIHB1YmxpYyB2aWV3ZXJTZXJ2aWNlOiBWaWV3ZXJTZXJ2aWNlLFxyXG4gICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyMjogUmVuZGVyZXIyLFxyXG4gICAgcHVibGljIGVycm9yU2VydmljZTogRXJyb3JTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLnBsYXllckV2ZW50ID0gdGhpcy52aWV3ZXJTZXJ2aWNlLnBsYXllckV2ZW50O1xyXG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnBsYXllckV2ZW50LnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgIGlmIChldmVudC50eXBlID09PSAncGF1c2UnKSB7XHJcbiAgICAgICAgdGhpcy5pc1BhdXNlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zaG93Q29udHJvbHMgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChldmVudC50eXBlID09PSAncGxheScpIHtcclxuICAgICAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdsb2Fkc3RhcnQnKSB7XHJcbiAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlU3RhcnRFdmVudChldmVudCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdlbmRlZCcpIHtcclxuICAgICAgICB0aGlzLnZpZXdlclNlcnZpY2UuZW5kUGFnZVNlZW4gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUVuZEV2ZW50KCk7XHJcbiAgICAgICAgdGhpcy52aWV3U3RhdGUgPSAnZW5kJztcclxuICAgICAgfVxyXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2Vycm9yJykge1xyXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpvbmUtdmFyaWFibGUtcGVyLWRlY2xhcmF0aW9uXHJcbiAgICAgICAgbGV0IGNvZGUgPSBlcnJvckNvZGUuY29udGVudExvYWRGYWlscyxcclxuICAgICAgICAgIG1lc3NhZ2UgPSBlcnJvck1lc3NhZ2UuY29udGVudExvYWRGYWlscztcclxuICAgICAgICBpZiAodGhpcy52aWV3ZXJTZXJ2aWNlLmlzQXZhaWxhYmxlTG9jYWxseSkge1xyXG4gICAgICAgICAgICBjb2RlID0gZXJyb3JDb2RlLmNvbnRlbnRMb2FkRmFpbHM7XHJcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBlcnJvck1lc3NhZ2UuY29udGVudExvYWRGYWlscztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvZGUgPT09IGVycm9yQ29kZS5jb250ZW50TG9hZEZhaWxzKSB7XHJcbiAgICAgICAgICB0aGlzLnNob3dDb250ZW50RXJyb3IgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VFeGNlcHRpb25Mb2coY29kZSwgbWVzc2FnZSwgZXZlbnQsIHRoaXMudHJhY2VJZCk7XHJcblxyXG4gICAgICB9XHJcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgICAgY29uc3QgZXZlbnRzID0gW3sgdHlwZTogJ3ZvbHVtZWNoYW5nZScsIHRlbGVtZXRyeUV2ZW50OiAnVk9MVU1FX0NIQU5HRScgfSwgeyB0eXBlOiAnc2Vla2luZycsIHRlbGVtZXRyeUV2ZW50OiAnRFJBRycgfSwgeyB0eXBlOiAnZnVsbHNjcmVlbicsIHRlbGVtZXRyeUV2ZW50OiAnRlVMTFNDUkVFTicgfSxcclxuICAgICAgeyB0eXBlOiAncmF0ZWNoYW5nZScsIHRlbGVtZXRyeUV2ZW50OiAnUkFURV9DSEFOR0UnIH1dO1xyXG4gICAgICBldmVudHMuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gZGF0YS50eXBlKSB7XHJcbiAgICAgICAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudChkYXRhLnRlbGVtZXRyeUV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLnBsYXlWaWRlb0Zyb21UaW1lc3RhbXAsJ3RoaXMgaXMgcGxheXZpZGVvdGltZScpXHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpUZWxlbWV0cnlFdmVudCcsIFsnJGV2ZW50J10pXHJcbiAgb25UZWxlbWV0cnlFdmVudChldmVudCkge1xyXG4gICAgdGhpcy50ZWxlbWV0cnlFdmVudC5lbWl0KGV2ZW50LmRldGFpbCk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGNvbnNvbGUubG9nKCdzdW5iaXJkLXZpZGVvLXBsYXllci5jb21wb25lbnQ9PT09PScpXHJcbiAgICBpZiAodHlwZW9mIHRoaXMucGxheWVyQ29uZmlnID09PSAnc3RyaW5nJykge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMucGxheWVyQ29uZmlnID0gSlNPTi5wYXJzZSh0aGlzLnBsYXllckNvbmZpZyk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBwbGF5ZXJDb25maWc6ICcsIGVycm9yKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLmlzUGF1c2VkKSB7XHJcbiAgICAgICAgdGhpcy5zaG93Q29udHJvbHMgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSwgNTAwMCk7XHJcblxyXG4gICAgLyogdHNsaW50OmRpc2FibGU6bm8tc3RyaW5nLWxpdGVyYWwgKi9cclxuICAgIHRoaXMubmV4dENvbnRlbnQgPSB0aGlzLnBsYXllckNvbmZpZy5jb25maWcubmV4dENvbnRlbnQ7XHJcbiAgICB0aGlzLnRyYWNlSWQgPSB0aGlzLnBsYXllckNvbmZpZy5jb25maWdbJ3RyYWNlSWQnXTtcclxuICAgIHRoaXMuc2lkZU1lbnVDb25maWcgPSB7IC4uLnRoaXMuc2lkZU1lbnVDb25maWcsIC4uLnRoaXMucGxheWVyQ29uZmlnLmNvbmZpZy5zaWRlTWVudSB9O1xyXG4gICAgdGhpcy52aWRlb1BsYXllclNlcnZpY2UuaW5pdGlhbGl6ZSh0aGlzLnBsYXllckNvbmZpZyk7XHJcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UuaW5pdGlhbGl6ZSh0aGlzLnBsYXllckNvbmZpZyk7XHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignb2ZmbGluZScsIHRoaXMucmFpc2VJbnRlcm5ldERpc2Nvbm5lY3Rpb25FcnJvciAsIHRydWUpO1xyXG4gICAgdGhpcy5RdW1sUGxheWVyQ29uZmlnLmNvbmZpZyA9IHRoaXMucGxheWVyQ29uZmlnLmNvbmZpZztcclxuICAgIHRoaXMuUXVtbFBsYXllckNvbmZpZy5jb25maWcuc2lkZU1lbnUuZW5hYmxlID0gZmFsc2U7XHJcbiAgICB0aGlzLlF1bWxQbGF5ZXJDb25maWcuY29udGV4dCA9IHRoaXMucGxheWVyQ29uZmlnLmNvbnRleHQ7XHJcbiAgICB0aGlzLnNldFRlbGVtZXRyeU9iamVjdFJvbGx1cCh0aGlzLnBsYXllckNvbmZpZy5tZXRhZGF0YS5pZGVudGlmaWVyKTtcclxuXHJcbiAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgIC8vICAgY29uc29sZS5sb2coJ3N1bmJpcmQtdmlkZW8tcGxheWVyLmNvbXBvbmVudD09PT09c2V0VGltZW91dCcpXHJcbiAgICAvLyAgIHRoaXMucGxheVZpZGVvRnJvbVRpbWVzdGFtcCA9IDMwMDtcclxuICAgIC8vIH0sIDUwMDApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXMuYWN0aW9uKSB7XHJcbiAgICAgIGlmICghdGhpcy5zaG93UXVtbFBsYXllcikge1xyXG4gICAgICAgIHRoaXMucGxheWVyQWN0aW9uID0gdGhpcy5hY3Rpb247XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJhaXNlSW50ZXJuZXREaXNjb25uZWN0aW9uRXJyb3IgPSAoKSA9PiB7XHJcbiAgICBjb25zdCBjb2RlID0gZXJyb3JDb2RlLmludGVybmV0Q29ubmVjdGl2aXR5O1xyXG4gICAgY29uc3QgbWVzc2FnZSA9IGVycm9yTWVzc2FnZS5pbnRlcm5ldENvbm5lY3Rpdml0eTtcclxuICAgIGNvbnN0IHN0YWNrdHJhY2UgPSBgJHtjb2RlfTogJHttZXNzYWdlfWA7XHJcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VFeGNlcHRpb25Mb2coY29kZSwgbWVzc2FnZSwgc3RhY2t0cmFjZSwgdGhpcy50cmFjZUlkKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGNvbnN0IHZpZGVvUGxheWVyRWxlbWVudCA9IHRoaXMudmlkZW9QbGF5ZXJSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMudW5saXN0ZW5Nb3VzZU1vdmUgPSB0aGlzLnJlbmRlcmVyMi5saXN0ZW4odmlkZW9QbGF5ZXJFbGVtZW50LCAnbW91c2Vtb3ZlJywgKCkgPT4ge1xyXG4gICAgICB0aGlzLnNob3dDb250cm9scyA9IHRydWU7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnVubGlzdGVuVG91Y2hTdGFydCA9IHRoaXMucmVuZGVyZXIyLmxpc3Rlbih2aWRlb1BsYXllckVsZW1lbnQsICd0b3VjaHN0YXJ0JywgKCkgPT4ge1xyXG4gICAgICB0aGlzLnNob3dDb250cm9scyA9IHRydWU7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBjb250ZW50Q29tcGFiaWxpdHlMZXZlbCA9IHRoaXMucGxheWVyQ29uZmlnLm1ldGFkYXRhWydjb21wYXRpYmlsaXR5TGV2ZWwnXTtcclxuICAgIGlmIChjb250ZW50Q29tcGFiaWxpdHlMZXZlbCkge1xyXG4gICAgICBjb25zdCBjaGVja0NvbnRlbnRDb21wYXRpYmxlID0gdGhpcy5lcnJvclNlcnZpY2UuY2hlY2tDb250ZW50Q29tcGF0aWJpbGl0eShjb250ZW50Q29tcGFiaWxpdHlMZXZlbCk7XHJcbiAgICAgIGlmICghY2hlY2tDb250ZW50Q29tcGF0aWJsZVsnaXNDb21waXRhYmxlJ10pIHtcclxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlRXhjZXB0aW9uTG9nKGVycm9yQ29kZS5jb250ZW50Q29tcGF0aWJpbGl0eSwgZXJyb3JNZXNzYWdlLmNvbnRlbnRDb21wYXRpYmlsaXR5LCBjaGVja0NvbnRlbnRDb21wYXRpYmxlWydlcnJvciddWydtZXNzYWdlJ10sIHRoaXMudHJhY2VJZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNpZGVCYXJFdmVudHMoZXZlbnQ6IElTaWRlQmFyRXZlbnQpIHtcclxuICAgIHRoaXMucGxheWVyRXZlbnQuZW1pdChldmVudCk7XHJcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ0RPV05MT0FEJykge1xyXG4gICAgICB0aGlzLmRvd25sb2FkVmlkZW8oKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGV2ZW50cyA9IFsnU0hBUkUnLCAnRE9XTkxPQURfTUVOVScsICdFWElUJywgJ0NMT1NFX01FTlUnLCAnT1BFTl9NRU5VJywgJ0RPV05MT0FEX1BPUFVQX0NBTkNFTCcsICdET1dOTE9BRF9QT1BVUF9DTE9TRSddO1xyXG4gICAgZXZlbnRzLmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgIGlmIChldmVudC50eXBlID09PSBkYXRhKSB7XHJcbiAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoZGF0YSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdFWElUJykge1xyXG4gICAgICAgIHRoaXMudmlld2VyU2VydmljZS5zaWRlYmFyTWVudUV2ZW50LmVtaXQoJ0NMT1NFX01FTlUnKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRUZWxlbWV0cnlPYmplY3RSb2xsdXAoaWQpIHtcclxuICAgIGlmICh0aGlzLlF1bWxQbGF5ZXJDb25maWcuY29udGV4dCkge1xyXG4gICAgICBjb25zdCBoYXNPYmplY3RSb2xsdXAgPSB0aGlzLlF1bWxQbGF5ZXJDb25maWcgJiYgdGhpcy5RdW1sUGxheWVyQ29uZmlnLmNvbnRleHQgJiYgdGhpcy5RdW1sUGxheWVyQ29uZmlnLmNvbnRleHQub2JqZWN0Um9sbHVwO1xyXG4gICAgICBpZiAoIWhhc09iamVjdFJvbGx1cCkge1xyXG4gICAgICAgIHRoaXMuUXVtbFBsYXllckNvbmZpZy5jb250ZXh0Lm9iamVjdFJvbGx1cCA9IHt9O1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGxldmVscyA9IE9iamVjdC5rZXlzKHRoaXMuUXVtbFBsYXllckNvbmZpZy5jb250ZXh0Lm9iamVjdFJvbGx1cCk7XHJcbiAgICAgIHRoaXMuUXVtbFBsYXllckNvbmZpZy5jb250ZXh0Lm9iamVjdFJvbGx1cFtgbCR7bGV2ZWxzLmxlbmd0aCArICAxfWBdID0gaWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwbGF5Q29udGVudChldmVudCkge1xyXG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoZXZlbnQudHlwZSk7XHJcbiAgfVxyXG5cclxuICByZXBsYXlDb250ZW50KGV2ZW50KSB7XHJcbiAgICB0aGlzLnBsYXllckV2ZW50LmVtaXQoZXZlbnQpO1xyXG4gICAgdGhpcy52aWV3U3RhdGUgPSAncGxheWVyJztcclxuICAgIHRoaXMudmlld2VyU2VydmljZS5pc0VuZEV2ZW50UmFpc2VkID0gZmFsc2U7XHJcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudCgnUkVQTEFZJyk7XHJcbiAgfVxyXG5cclxuICBleGl0Q29udGVudChldmVudCkge1xyXG4gICAgdGhpcy5wbGF5ZXJFdmVudC5lbWl0KGV2ZW50KTtcclxuICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KCdFWElUJyk7XHJcbiAgfVxyXG5cclxuICBkb3dubG9hZFZpZGVvKCkge1xyXG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGEuaHJlZiA9IHRoaXMudmlld2VyU2VydmljZS5hcnRpZmFjdFVybDtcclxuICAgIGEuZG93bmxvYWQgPSB0aGlzLnZpZXdlclNlcnZpY2UuY29udGVudE5hbWU7XHJcbiAgICBhLnRhcmdldCA9ICdfYmxhbmsnO1xyXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcclxuICAgIGEuY2xpY2soKTtcclxuICAgIGEucmVtb3ZlKCk7XHJcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudCgnRE9XTkxPQUQnKTtcclxuICB9XHJcblxyXG4gIHF1bWxQbGF5ZXJFdmVudHMoZXZlbnQpIHtcclxuICAgIGlmIChldmVudC5laWQgPT09ICdRVU1MX1NVTU1BUlknKSB7XHJcbiAgICAgIHRoaXMuc2hvd1F1bWxQbGF5ZXIgPSBmYWxzZTtcclxuICAgICAgY29uc3Qgc2NvcmUgPSBwYXJzZUludChldmVudC5lZGF0YS5leHRyYS5maW5kKHAgPT4gcC5pZCA9PT0gJ3Njb3JlJylbJ3ZhbHVlJ10sIDEwKTtcclxuICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLmludGVyY2VwdGlvblJlc3BvbnNlc1t0aGlzLmN1cnJlbnRJbnRlcmNlcHRpb25UaW1lXSA9IHtcclxuICAgICAgICBzY29yZSxcclxuICAgICAgICBpc1NraXBwZWQ6IGZhbHNlXHJcbiAgICAgIH07XHJcbiAgICAgIGNvbnN0IGludGVyY2VwdFBvaW50RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLW1hcmtlci10aW1lPVwiJHt0aGlzLmN1cnJlbnRJbnRlcmNlcHRpb25UaW1lfVwiXWApO1xyXG4gICAgICBpZiAoaW50ZXJjZXB0UG9pbnRFbGVtZW50KSB7XHJcbiAgICAgICAgaW50ZXJjZXB0UG9pbnRFbGVtZW50WydzdHlsZSddLmJhY2tncm91bmQgPSAnZ3JlZW4nO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudmlkZW9JbnN0YW5jZS5wbGF5KCk7XHJcbiAgICAgIHRoaXMudmlkZW9JbnN0YW5jZS5jb250cm9scyh0cnVlKTtcclxuICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSW1wcmVzc2lvbkV2ZW50KCd2aWRlbycpO1xyXG4gICAgICAvLyBpZiBjdXJyZW50bHkgdmlkZW8gaXMgbm90IGluIGZ1bGwgc2NyZWVuIGFuZCB3YXMgcHJldmlvdXNseSBmdWxsIHNjcmVlbiB0aGVuIHNldCBpdCBiYWNrIHRvIGZ1bGwgc2NyZWVuIGFnYWluXHJcbiAgICAgIGlmICghZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgJiYgdGhpcy5pc0Z1bGxTY3JlZW4pIHtcclxuICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndmlkZW8tanMnKVswXSkge1xyXG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndmlkZW8tanMnKVswXS5yZXF1ZXN0RnVsbHNjcmVlbigpXHJcbiAgICAgICAgICAuY2F0Y2goKGVycikgPT4gY29uc29sZS5lcnJvcihlcnIpKTtcclxuICAgICAgICB9XHJcbiAgIC