UNPKG

@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
/** * @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