UNPKG

dictrigyn-video-player

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

435 lines 48.6 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 { ChangeDetectorRef, Component, EventEmitter, Input, Output, HostListener, ElementRef, ViewChild, Renderer2 } from '@angular/core'; import { ErrorService, errorCode, errorMessage } from '@dicdikshaorg/player-sdk-v9'; import { ViewerService } from './services/viewer.service'; import { SunbirdVideoPlayerService } from './sunbird-video-player.service'; export class SunbirdVideoPlayerComponent { /** * @param {?} videoPlayerService * @param {?} viewerService * @param {?} cdr * @param {?} renderer2 * @param {?} errorService */ constructor(videoPlayerService, viewerService, cdr, renderer2, errorService) { 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 {?} */ () => { /** @type {?} */ const code = errorCode.internetConnectivity; /** @type {?} */ const message = errorMessage.internetConnectivity; /** @type {?} */ const stacktrace = `${code}: ${message}`; this.viewerService.raiseExceptionLog(code, message, stacktrace, this.traceId); }); this.playerEvent = this.viewerService.playerEvent; this.viewerService.playerEvent.subscribe((/** * @param {?} event * @return {?} */ 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 {?} */ let code = errorCode.contentLoadFails; /** @type {?} */ let 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 {?} */ const events = [{ type: 'volumechange', telemetryEvent: 'VOLUME_CHANGE' }, { type: 'seeking', telemetryEvent: 'DRAG' }, { type: 'fullscreen', telemetryEvent: 'FULLSCREEN' }, { type: 'ratechange', telemetryEvent: 'RATE_CHANGE' }]; events.forEach((/** * @param {?} data * @return {?} */ data => { if (event.type === data.type) { this.viewerService.raiseHeartBeatEvent(data.telemetryEvent); } })); })); } /** * @param {?} event * @return {?} */ onTelemetryEvent(event) { this.telemetryEvent.emit(event.detail); } /** * @return {?} */ ngOnInit() { if (typeof this.playerConfig === 'string') { try { this.playerConfig = JSON.parse(this.playerConfig); } catch (error) { console.error('Invalid playerConfig: ', error); } } setInterval((/** * @return {?} */ () => { 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 = Object.assign(Object.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); } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (changes.action) { if (!this.showQumlPlayer) { this.playerAction = this.action; } } } /** * @return {?} */ ngAfterViewInit() { /** @type {?} */ const videoPlayerElement = this.videoPlayerRef.nativeElement; this.unlistenMouseMove = this.renderer2.listen(videoPlayerElement, 'mousemove', (/** * @return {?} */ () => { this.showControls = true; })); this.unlistenTouchStart = this.renderer2.listen(videoPlayerElement, 'touchstart', (/** * @return {?} */ () => { this.showControls = true; })); /** @type {?} */ const contentCompabilityLevel = this.playerConfig.metadata['compatibilityLevel']; if (contentCompabilityLevel) { /** @type {?} */ const 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 {?} */ sideBarEvents(event) { this.playerEvent.emit(event); if (event.type === 'DOWNLOAD') { this.downloadVideo(); } /** @type {?} */ const events = ['SHARE', 'DOWNLOAD_MENU', 'EXIT', 'CLOSE_MENU', 'OPEN_MENU', 'DOWNLOAD_POPUP_CANCEL', 'DOWNLOAD_POPUP_CLOSE']; events.forEach((/** * @param {?} data * @return {?} */ data => { if (event.type === data) { this.viewerService.raiseHeartBeatEvent(data); } if (event.type === 'EXIT') { this.viewerService.sidebarMenuEvent.emit('CLOSE_MENU'); } })); } /** * @param {?} id * @return {?} */ setTelemetryObjectRollup(id) { if (this.QumlPlayerConfig.context) { /** @type {?} */ const hasObjectRollup = this.QumlPlayerConfig && this.QumlPlayerConfig.context && this.QumlPlayerConfig.context.objectRollup; if (!hasObjectRollup) { this.QumlPlayerConfig.context.objectRollup = {}; } /** @type {?} */ const levels = Object.keys(this.QumlPlayerConfig.context.objectRollup); this.QumlPlayerConfig.context.objectRollup[`l${levels.length + 1}`] = id; } } /** * @param {?} event * @return {?} */ playContent(event) { this.viewerService.raiseHeartBeatEvent(event.type); } /** * @param {?} event * @return {?} */ replayContent(event) { this.playerEvent.emit(event); this.viewState = 'player'; this.viewerService.isEndEventRaised = false; this.viewerService.raiseHeartBeatEvent('REPLAY'); } /** * @param {?} event * @return {?} */ exitContent(event) { this.playerEvent.emit(event); this.viewerService.raiseHeartBeatEvent('EXIT'); } /** * @return {?} */ downloadVideo() { /** @type {?} */ const 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 {?} */ qumlPlayerEvents(event) { if (event.eid === 'QUML_SUMMARY') { this.showQumlPlayer = false; /** @type {?} */ const score = parseInt(event.edata.extra.find((/** * @param {?} p * @return {?} */ p => p.id === 'score'))['value'], 10); this.viewerService.interceptionResponses[this.currentInterceptionTime] = { score, isSkipped: false }; /** @type {?} */ const 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 {?} */ (err) => console.error(err))); } } } } /** * @param {?} __0 * @return {?} */ questionSetData({ response, time, 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 {?} */ (err) => 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, // Question set id, type: 'QuestionSet', // Type of interaction interceptedAt: time // Time when the interception happened }); } /** * @param {?} event * @return {?} */ playerInstance(event) { this.videoInstance = event; } /** * @return {?} */ ngOnDestroy() { 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\">\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 = () => [ { type: SunbirdVideoPlayerService }, { type: ViewerService }, { type: ChangeDetectorRef }, { type: Renderer2 }, { type: ErrorService } ]; SunbirdVideoPlayerComponent.propDecorators = { playerConfig: [{ 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',] }] }; if (false) { /** @type {?} */ SunbirdVideoPlayerComponent.prototype.playerConfig; /** @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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VuYmlyZC12aWRlby1wbGF5ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZGljdHJpZ3luLXZpZGVvLXBsYXllci8iLCJzb3VyY2VzIjpbImxpYi9zdW5iaXJkLXZpZGVvLXBsYXllci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSxPQUFPLEVBQ0wsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUNqRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBaUIsU0FBUyxFQUM5RCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFHLFNBQVMsRUFBRyxZQUFZLEVBQWlCLE1BQU0sNkJBQTZCLENBQUM7QUFJckcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBTzNFLE1BQU0sT0FBTywyQkFBMkI7Ozs7Ozs7O0lBNkJ0QyxZQUNTLGtCQUE2QyxFQUM3QyxhQUE0QixFQUM1QixHQUFzQixFQUNyQixTQUFvQixFQUNyQixZQUEwQjtRQUoxQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQTJCO1FBQzdDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3JCLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDckIsaUJBQVksR0FBWixZQUFZLENBQWM7UUE3QnpCLG1CQUFjLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFFdEUsY0FBUyxHQUFHLFFBQVEsQ0FBQztRQUlyQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixtQkFBYyxHQUFHO1lBQ2YsU0FBUyxFQUFFLElBQUk7WUFDZixZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQixRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUM7UUFHRixh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Qyx5QkFBeUIsRUFBRSxDQUFDLFFBQVEsQ0FBQzswQkE2S2xELFlBQVksU0FBQyxxQkFBcUI7Ozs7SUF6UG5DLG1EQUFvQzs7SUFDcEMsNkNBQTBCOztJQUMxQixrREFBNEM7O0lBQzVDLHFEQUFzRTs7SUFDdEUscURBQXVFOztJQUN2RSxnREFBcUI7O0lBQ3JCLDhDQUF1Qjs7SUFDdkIsa0RBQXdCOztJQUN4Qix1REFBMEI7O0lBQzFCLG1EQUFvQjs7SUFDcEIscURBS0U7Ozs7O0lBQ0YseURBQXVDOzs7OztJQUN2Qyx3REFBc0M7O0lBQ3RDLCtDQUFpQjs7SUFDakIscURBQXVCOztJQUN2Qix1REFBMkI7O0lBQzNCLG9EQUFtQjs7SUFDbkIsOERBQXdCOztJQUN4Qiw4REFBd0I7O0lBQ3hCLG1EQUFxQjs7SUFDckIsbURBQXNCOztJQTRGdEIsc0VBS0M7O0lBOUZDLHlEQUFvRDs7SUFDcEQsb0RBQW1DOztJQUNuQywwQ0FBNkI7Ozs7O0lBQzdCLGdEQUE0Qjs7SUFDNUIsbURBQWlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGhyb3dTdG10IH0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXInO1xyXG5pbXBvcnQge1xyXG4gIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsXHJcbiAgSG9zdExpc3RlbmVyLCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQsIEFmdGVyVmlld0luaXQsIFJlbmRlcmVyMiwgT25EZXN0cm95XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEVycm9yU2VydmljZSAsIGVycm9yQ29kZSAsIGVycm9yTWVzc2FnZSwgSVNpZGVCYXJFdmVudCB9IGZyb20gJ0BkaWNkaWtzaGFvcmcvcGxheWVyLXNkay12OSc7XHJcblxyXG5pbXBvcnQgeyBQbGF5ZXJDb25maWcgfSBmcm9tICcuL3BsYXllckludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBJQWN0aW9uIH0gZnJvbSAnLi9wbGF5ZXJJbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgVmlld2VyU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdmlld2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTdW5iaXJkVmlkZW9QbGF5ZXJTZXJ2aWNlIH0gZnJvbSAnLi9zdW5iaXJkLXZpZGVvLXBsYXllci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgZmlsdGVyLCB0YWtlV2hpbGUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc3VuYmlyZC12aWRlby1wbGF5ZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zdW5iaXJkLXZpZGVvLXBsYXllci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc3VuYmlyZC12aWRlby1wbGF5ZXIuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgU3VuYmlyZFZpZGVvUGxheWVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XHJcblxyXG4gIEBJbnB1dCgpIHBsYXllckNvbmZpZzogUGxheWVyQ29uZmlnO1xyXG4gIEBJbnB1dCgpIGFjdGlvbj86IElBY3Rpb247XHJcbiAgQE91dHB1dCgpIHBsYXllckV2ZW50OiBFdmVudEVtaXR0ZXI8b2JqZWN0PjtcclxuICBAT3V0cHV0KCkgdGVsZW1ldHJ5RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQFZpZXdDaGlsZCgndmlkZW9QbGF5ZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSB2aWRlb1BsYXllclJlZjogRWxlbWVudFJlZjtcclxuICB2aWV3U3RhdGUgPSAncGxheWVyJztcclxuICBwdWJsaWMgdHJhY2VJZDogc3RyaW5nO1xyXG4gIHB1YmxpYyBuZXh0Q29udGVudDogYW55O1xyXG4gIHNob3dDb250ZW50RXJyb3I6IGJvb2xlYW47XHJcbiAgc2hvd0NvbnRyb2xzID0gdHJ1ZTtcclxuICBzaWRlTWVudUNvbmZpZyA9IHtcclxuICAgIHNob3dTaGFyZTogdHJ1ZSxcclxuICAgIHNob3dEb3dubG9hZDogdHJ1ZSxcclxuICAgIHNob3dSZXBsYXk6IHRydWUsXHJcbiAgICBzaG93RXhpdDogdHJ1ZVxyXG4gIH07XHJcbiAgcHJpdmF0ZSB1bmxpc3RlblRvdWNoU3RhcnQ6ICgpID0+IHZvaWQ7XHJcbiAgcHJpdmF0ZSB1bmxpc3Rlbk1vdXNlTW92ZTogKCkgPT4gdm9pZDtcclxuICBpc1BhdXNlZCA9IGZhbHNlO1xyXG4gIHNob3dRdW1sUGxheWVyID0gZmFsc2U7XHJcbiAgUXVtbFBsYXllckNvbmZpZzogYW55ID0ge307XHJcbiAgdmlkZW9JbnN0YW5jZTogYW55O1xyXG4gIGN1cnJlbnRJbnRlcmNlcHRpb25UaW1lO1xyXG4gIGN1cnJlbnRJbnRlcmNlcHRpb25VSUlkO1xyXG4gIGlzRnVsbFNjcmVlbiA9IGZhbHNlO1xyXG4gIHBsYXllckFjdGlvbjogSUFjdGlvbjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgdmlkZW9QbGF5ZXJTZXJ2aWNlOiBTdW5iaXJkVmlkZW9QbGF5ZXJTZXJ2aWNlLFxyXG4gICAgcHVibGljIHZpZXdlclNlcnZpY2U6IFZpZXdlclNlcnZpY2UsXHJcbiAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgcmVuZGVyZXIyOiBSZW5kZXJlcjIsXHJcbiAgICBwdWJsaWMgZXJyb3JTZXJ2aWNlOiBFcnJvclNlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMucGxheWVyRXZlbnQgPSB0aGlzLnZpZXdlclNlcnZpY2UucGxheWVyRXZlbnQ7XHJcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucGxheWVyRXZlbnQuc3Vic2NyaWJlKGV2ZW50ID0+IHtcclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdwYXVzZScpIHtcclxuICAgICAgICB0aGlzLmlzUGF1c2VkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNob3dDb250cm9scyA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdwbGF5Jykge1xyXG4gICAgICAgIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2xvYWRzdGFydCcpIHtcclxuICAgICAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VTdGFydEV2ZW50KGV2ZW50KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2VuZGVkJykge1xyXG4gICAgICAgIHRoaXMudmlld2VyU2VydmljZS5lbmRQYWdlU2VlbiA9IHRydWU7XHJcbiAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlRW5kRXZlbnQoKTtcclxuICAgICAgICB0aGlzLnZpZXdTdGF0ZSA9ICdlbmQnO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChldmVudC50eXBlID09PSAnZXJyb3InKSB7XHJcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm9uZS12YXJpYWJsZS1wZXItZGVjbGFyYXRpb25cclxuICAgICAgICBsZXQgY29kZSA9IGVycm9yQ29kZS5jb250ZW50TG9hZEZhaWxzLFxyXG4gICAgICAgICAgbWVzc2FnZSA9IGVycm9yTWVzc2FnZS5jb250ZW50TG9hZEZhaWxzO1xyXG4gICAgICAgIGlmICh0aGlzLnZpZXdlclNlcnZpY2UuaXNBdmFpbGFibGVMb2NhbGx5KSB7XHJcbiAgICAgICAgICAgIGNvZGUgPSBlcnJvckNvZGUuY29udGVudExvYWRGYWlscztcclxuICAgICAgICAgICAgbWVzc2FnZSA9IGVycm9yTWVzc2FnZS5jb250ZW50TG9hZEZhaWxzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29kZSA9PT0gZXJyb3JDb2RlLmNvbnRlbnRMb2FkRmFpbHMpIHtcclxuICAgICAgICAgIHRoaXMuc2hvd0NvbnRlbnRFcnJvciA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUV4Y2VwdGlvbkxvZyhjb2RlLCBtZXNzYWdlLCBldmVudCwgdGhpcy50cmFjZUlkKTtcclxuXHJcbiAgICAgIH1cclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG4gICAgICBjb25zdCBldmVudHMgPSBbeyB0eXBlOiAndm9sdW1lY2hhbmdlJywgdGVsZW1ldHJ5RXZlbnQ6ICdWT0xVTUVfQ0hBTkdFJyB9LCB7IHR5cGU6ICdzZWVraW5nJywgdGVsZW1ldHJ5RXZlbnQ6ICdEUkFHJyB9LCB7IHR5cGU6ICdmdWxsc2NyZWVuJywgdGVsZW1ldHJ5RXZlbnQ6ICdGVUxMU0NSRUVOJyB9LFxyXG4gICAgICB7IHR5cGU6ICdyYXRlY2hhbmdlJywgdGVsZW1ldHJ5RXZlbnQ6ICdSQVRFX0NIQU5HRScgfV07XHJcbiAgICAgIGV2ZW50cy5mb3JFYWNoKGRhdGEgPT4ge1xyXG4gICAgICAgIGlmIChldmVudC50eXBlID09PSBkYXRhLnR5cGUpIHtcclxuICAgICAgICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KGRhdGEudGVsZW1ldHJ5RXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OlRlbGVtZXRyeUV2ZW50JywgWyckZXZlbnQnXSlcclxuICBvblRlbGVtZXRyeUV2ZW50KGV2ZW50KSB7XHJcbiAgICB0aGlzLnRlbGVtZXRyeUV2ZW50LmVtaXQoZXZlbnQuZGV0YWlsKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgaWYgKHR5cGVvZiB0aGlzLnBsYXllckNvbmZpZyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLnBsYXllckNvbmZpZyA9IEpTT04ucGFyc2UodGhpcy5wbGF5ZXJDb25maWcpO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgcGxheWVyQ29uZmlnOiAnLCBlcnJvcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5pc1BhdXNlZCkge1xyXG4gICAgICAgIHRoaXMuc2hvd0NvbnRyb2xzID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0sIDUwMDApO1xyXG5cclxuICAgIC8qIHRzbGludDpkaXNhYmxlOm5vLXN0cmluZy1saXRlcmFsICovXHJcbiAgICB0aGlzLm5leHRDb250ZW50ID0gdGhpcy5wbGF5ZXJDb25maWcuY29uZmlnLm5leHRDb250ZW50O1xyXG4gICAgdGhpcy50cmFjZUlkID0gdGhpcy5wbGF5ZXJDb25maWcuY29uZmlnWyd0cmFjZUlkJ107XHJcbiAgICB0aGlzLnNpZGVNZW51Q29uZmlnID0geyAuLi50aGlzLnNpZGVNZW51Q29uZmlnLCAuLi50aGlzLnBsYXllckNvbmZpZy5jb25maWcuc2lkZU1lbnUgfTtcclxuICAgIHRoaXMudmlkZW9QbGF5ZXJTZXJ2aWNlLmluaXRpYWxpemUodGhpcy5wbGF5ZXJDb25maWcpO1xyXG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLmluaXRpYWxpemUodGhpcy5wbGF5ZXJDb25maWcpO1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29mZmxpbmUnLCB0aGlzLnJhaXNlSW50ZXJuZXREaXNjb25uZWN0aW9uRXJyb3IgLCB0cnVlKTtcclxuICAgIHRoaXMuUXVtbFBsYXllckNvbmZpZy5jb25maWcgPSB0aGlzLnBsYXllckNvbmZpZy5jb25maWc7XHJcbiAgICB0aGlzLlF1bWxQbGF5ZXJDb25maWcuY29uZmlnLnNpZGVNZW51LmVuYWJsZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5RdW1sUGxheWVyQ29uZmlnLmNvbnRleHQgPSB0aGlzLnBsYXllckNvbmZpZy5jb250ZXh0O1xyXG4gICAgdGhpcy5zZXRUZWxlbWV0cnlPYmplY3RSb2xsdXAodGhpcy5wbGF5ZXJDb25maWcubWV0YWRhdGEuaWRlbnRpZmllcik7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlcy5hY3Rpb24pIHtcclxuICAgICAgaWYgKCF0aGlzLnNob3dRdW1sUGxheWVyKSB7XHJcbiAgICAgICAgdGhpcy5wbGF5ZXJBY3Rpb24gPSB0aGlzLmFjdGlvbjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmFpc2VJbnRlcm5ldERpc2Nvbm5lY3Rpb25FcnJvciA9ICgpID0+IHtcclxuICAgIGNvbnN0IGNvZGUgPSBlcnJvckNvZGUuaW50ZXJuZXRDb25uZWN0aXZpdHk7XHJcbiAgICBjb25zdCBtZXNzYWdlID0gZXJyb3JNZXNzYWdlLmludGVybmV0Q29ubmVjdGl2aXR5O1xyXG4gICAgY29uc3Qgc3RhY2t0cmFjZSA9IGAke2NvZGV9OiAke21lc3NhZ2V9YDtcclxuICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUV4Y2VwdGlvbkxvZyhjb2RlLCBtZXNzYWdlLCBzdGFja3RyYWNlLCB0aGlzLnRyYWNlSWQpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgY29uc3QgdmlkZW9QbGF5ZXJFbGVtZW50ID0gdGhpcy52aWRlb1BsYXllclJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy51bmxpc3Rlbk1vdXNlTW92ZSA9IHRoaXMucmVuZGVyZXIyLmxpc3Rlbih2aWRlb1BsYXllckVsZW1lbnQsICdtb3VzZW1vdmUnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd0NvbnRyb2xzID0gdHJ1ZTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMudW5saXN0ZW5Ub3VjaFN0YXJ0ID0gdGhpcy5yZW5kZXJlcjIubGlzdGVuKHZpZGVvUGxheWVyRWxlbWVudCwgJ3RvdWNoc3RhcnQnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd0NvbnRyb2xzID0gdHJ1ZTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGNvbnRlbnRDb21wYWJpbGl0eUxldmVsID0gdGhpcy5wbGF5ZXJDb25maWcubWV0YWRhdGFbJ2NvbXBhdGliaWxpdHlMZXZlbCddO1xyXG4gICAgaWYgKGNvbnRlbnRDb21wYWJpbGl0eUxldmVsKSB7XHJcbiAgICAgIGNvbnN0IGNoZWNrQ29udGVudENvbXBhdGlibGUgPSB0aGlzLmVycm9yU2VydmljZS5jaGVja0NvbnRlbnRDb21wYXRpYmlsaXR5KGNvbnRlbnRDb21wYWJpbGl0eUxldmVsKTtcclxuICAgICAgaWYgKCFjaGVja0NvbnRlbnRDb21wYXRpYmxlWydpc0NvbXBpdGFibGUnXSkge1xyXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgICAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VFeGNlcHRpb25Mb2coZXJyb3JDb2RlLmNvbnRlbnRDb21wYXRpYmlsaXR5LCBlcnJvck1lc3NhZ2UuY29udGVudENvbXBhdGliaWxpdHksIGNoZWNrQ29udGVudENvbXBhdGlibGVbJ2Vycm9yJ11bJ21lc3NhZ2UnXSwgdGhpcy50cmFjZUlkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2lkZUJhckV2ZW50cyhldmVudDogSVNpZGVCYXJFdmVudCkge1xyXG4gICAgdGhpcy5wbGF5ZXJFdmVudC5lbWl0KGV2ZW50KTtcclxuICAgIGlmIChldmVudC50eXBlID09PSAnRE9XTkxPQUQnKSB7XHJcbiAgICAgIHRoaXMuZG93bmxvYWRWaWRlbygpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZXZlbnRzID0gWydTSEFSRScsICdET1dOTE9BRF9NRU5VJywgJ0VYSVQnLCAnQ0xPU0VfTUVOVScsICdPUEVOX01FTlUnLCAnRE9XTkxPQURfUE9QVVBfQ0FOQ0VMJywgJ0RPV05MT0FEX1BPUFVQX0NMT1NFJ107XHJcbiAgICBldmVudHMuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IGRhdGEpIHtcclxuICAgICAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudChkYXRhKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ0VYSVQnKSB7XHJcbiAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnNpZGViYXJNZW51RXZlbnQuZW1pdCgnQ0xPU0VfTUVOVScpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldFRlbGVtZXRyeU9iamVjdFJvbGx1cChpZCkge1xyXG4gICAgaWYgKHRoaXMuUXVtbFBsYXllckNvbmZpZy5jb250ZXh0KSB7XHJcbiAgICAgIGNvbnN0IGhhc09iamVjdFJvbGx1cCA9IHRoaXMuUXVtbFBsYXllckNvbmZpZyAmJiB0aGlzLlF1bWxQbGF5ZXJDb25maWcuY29udGV4dCAmJiB0aGlzLlF1bWxQbGF5ZXJDb25maWcuY29udGV4dC5vYmplY3RSb2xsdXA7XHJcbiAgICAgIGlmICghaGFzT2JqZWN0Um9sbHVwKSB7XHJcbiAgICAgICAgdGhpcy5RdW1sUGxheWVyQ29uZmlnLmNvbnRleHQub2JqZWN0Um9sbHVwID0ge307XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgbGV2ZWxzID0gT2JqZWN0LmtleXModGhpcy5RdW1sUGxheWVyQ29uZmlnLmNvbnRleHQub2JqZWN0Um9sbHVwKTtcclxuICAgICAgdGhpcy5RdW1sUGxheWVyQ29uZmlnLmNvbnRleHQub2JqZWN0Um9sbHVwW2BsJHtsZXZlbHMubGVuZ3RoICsgIDF9YF0gPSBpZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHBsYXlDb250ZW50KGV2ZW50KSB7XHJcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudChldmVudC50eXBlKTtcclxuICB9XHJcblxyXG4gIHJlcGxheUNvbnRlbnQoZXZlbnQpIHtcclxuICAgIHRoaXMucGxheWVyRXZlbnQuZW1pdChldmVudCk7XHJcbiAgICB0aGlzLnZpZXdTdGF0ZSA9ICdwbGF5ZXInO1xyXG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLmlzRW5kRXZlbnRSYWlzZWQgPSBmYWxzZTtcclxuICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KCdSRVBMQVknKTtcclxuICB9XHJcblxyXG4gIGV4aXRDb250ZW50KGV2ZW50KSB7XHJcbiAgICB0aGlzLnBsYXllckV2ZW50LmVtaXQoZXZlbnQpO1xyXG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoJ0VYSVQnKTtcclxuICB9XHJcblxyXG4gIGRvd25sb2FkVmlkZW8oKSB7XHJcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgYS5ocmVmID0gdGhpcy52aWV3ZXJTZXJ2aWNlLmFydGlmYWN0VXJsO1xyXG4gICAgYS5kb3dubG9hZCA9IHRoaXMudmlld2VyU2VydmljZS5jb250ZW50TmFtZTtcclxuICAgIGEudGFyZ2V0ID0gJ19ibGFuayc7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xyXG4gICAgYS5jbGljaygpO1xyXG4gICAgYS5yZW1vdmUoKTtcclxuICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZUhlYXJ0QmVhdEV2ZW50KCdET1dOTE9BRCcpO1xyXG4gIH1cclxuXHJcbiAgcXVtbFBsYXllckV2ZW50cyhldmVudCkge1xyXG4gICAgaWYgKGV2ZW50LmVpZCA9PT0gJ1FVTUxfU1VNTUFSWScpIHtcclxuICAgICAgdGhpcy5zaG93UXVtbFBsYXllciA9IGZhbHNlO1xyXG4gICAgICBjb25zdCBzY29yZSA9IHBhcnNlSW50KGV2ZW50LmVkYXRhLmV4dHJhLmZpbmQocCA9PiBwLmlkID09PSAnc2NvcmUnKVsndmFsdWUnXSwgMTApO1xyXG4gICAgICB0aGlzLnZpZXdlclNlcnZpY2UuaW50ZXJjZXB0aW9uUmVzcG9uc2VzW3RoaXMuY3VycmVudEludGVyY2VwdGlvblRpbWVdID0ge1xyXG4gICAgICAgIHNjb3JlLFxyXG4gICAgICAgIGlzU2tpcHBlZDogZmFsc2VcclxuICAgICAgfTtcclxuICAgICAgY29uc3QgaW50ZXJjZXB0UG9pbnRFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtbWFya2VyLXRpbWU9XCIke3RoaXMuY3VycmVudEludGVyY2VwdGlvblRpbWV9XCJdYCk7XHJcbiAgICAgIGlmIChpbnRlcmNlcHRQb2ludEVsZW1lbnQpIHtcclxuICAgICAgICBpbnRlcmNlcHRQb2ludEVsZW1lbnRbJ3N0eWxlJ10uYmFja2dyb3VuZCA9ICdncmVlbic7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy52aWRlb0luc3RhbmNlLnBsYXkoKTtcclxuICAgICAgdGhpcy52aWRlb0luc3RhbmNlLmNvbnRyb2xzKHRydWUpO1xyXG4gICAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VJbXByZXNzaW9uRXZlbnQoJ3ZpZGVvJyk7XHJcbiAgICAgIC8vIGlmIGN1cnJlbnRseSB2aWRlbyBpcyBub3QgaW4gZnVsbCBzY3JlZW4gYW5kIHdhcyBwcmV2aW91c2x5IGZ1bGwgc2NyZWVuIHRoZW4gc2V0IGl0IGJhY2sgdG8gZnVsbCBzY3JlZW4gYWdhaW5cclxuICAgICAgaWYgKCFkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCAmJiB0aGlzLmlzRnVsbFNjcmVlbikge1xyXG4gICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd2aWRlby1qcycpWzBdKSB7XHJcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd2aWRlby1qcycpWzBdLnJlcXVlc3RGdWxsc2NyZWVuKClcclxuICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLmVycm9yKGVycikpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcXVlc3Rpb25TZXREYXRhKHtyZXNwb25zZSwgdGltZSwgaWRlbnRpZmllcn0pIHtcclxuICAgIHRoaXMuUXVtbFBsYXllckNvbmZpZy5tZXRhZGF0YSA9IHJlc3BvbnNlO1xyXG4gICAgdGhpcy5RdW1sUGxheWVyQ29uZmlnLm1ldGFkYXRhWydzaG93U3RhcnRQYWdlJ10gPSAnTm8nO1xyXG4gICAgdGhpcy5RdW1sUGxheWVyQ29uZmlnLm1ldGFkYXRhWydzaG93RW5kUGFnZSddID0gJ05vJztcclxuICAgIHRoaXMuY3VycmVudEludGVyY2VwdGlvblRpbWUgPSB0aW1lO1xyXG4gICAgdGhpcy5jdXJyZW50SW50ZXJjZXB0aW9uVUlJZCA9IGlkZW50aWZpZXI7XHJcbiAgICBpZiAoZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5pc0Z1bGxTY3JlZW4gPSB0cnVlO1xyXG4gICAgICBkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpXHJcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLmVycm9yKGVycikpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pc0Z1bGxTY3JlZW4gPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuc2hvd1F1bWxQbGF5ZXIgPSB0cnVlO1xyXG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSW1wcmVzc2lvbkV2ZW50KCdpbnRlcmFjdGl2ZS1xdWVzdGlvbi1zZXQnLCB7IGlkOiBpZGVudGlmaWVyLCB0eXBlOiAnUXVlc3Rpb25TZXQnIH0pO1xyXG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoJ1ZJREVPX01BUktFUl9TRUxFQ1RFRCcsIHtcclxuICAgICAgaWRlbnRpZmllciwgLy8gUXVlc3Rpb24gc2V0IGlkLFxyXG4gICAgICB0eXBlOiAnUXVlc3Rpb25TZXQnLCAvLyBUeXBlIG9mIGludGVyYWN0aW9uXHJcbiAgICAgIGludGVyY2VwdGVkQXQ6IHRpbWUgLy8gVGltZSB3aGVuIHRoZSBpbnRlcmNlcHRpb24gaGFwcGVuZWRcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcGxheWVySW5zdGFuY2UoZXZlbnQpIHtcclxuICAgIHRoaXMudmlkZW9JbnN0YW5jZSA9IGV2ZW50O1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmJlZm9yZXVubG9hZCcpXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VFbmRFdmVudCgpO1xyXG4gICAgdGhpcy51bmxpc3RlblRvdWNoU3RhcnQoKTtcclxuICAgIHRoaXMudW5saXN0ZW5Nb3VzZU1vdmUoKTtcclxuICAgIHRoaXMudmlld2VyU2VydmljZS5pc0VuZEV2ZW50UmFpc2VkID0gZmFsc2U7XHJcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignb2ZmbGluZScsIHRoaXMucmFpc2VJbnRlcm5ldERpc2Nvbm5lY3Rpb25FcnJvciAsIHRydWUpO1xyXG4gIH1cclxufVxyXG4iXX0=